csgo-2018-source/movieobjects/dmeusersettings.cpp

266 lines
7.7 KiB
C++
Raw Normal View History

2021-07-25 12:11:47 +08:00
//============ Copyright (c) Valve Corporation, All rights reserved. ============
#include "movieobjects/dmeusersettings.h"
#include "datamodel/dmelementfactoryhelper.h"
#include "datamodel/dmattributevar.h"
#if !defined( _X360 )
#define WIN32_LEAN_AND_MEAN
#define OEMRESOURCE
#include <windows.h>
#endif
#include "tier0/memdbgon.h" // memdbgon must be the last include file in a .cpp file!!!
//-----------------------------------------------------------------------------
IMPLEMENT_ELEMENT_FACTORY( DmeUserSettings, CDmeUserSettings);
static CUtlMap< const char *, CDmAttribute * >s_RegistryPathToAttribute( DefLessFunc( const char * ) );
CUtlVector< IDmeUserSettingsChangedListener * > CDmeUserSettings::s_UserSettingsChangedListeners;
//-----------------------------------------------------------------------------
CDmeUserSettings *CDmeUserSettings::SharedUserSettings()
{
static CDmeUserSettings *s_UserSettings;
if( !s_UserSettings )
{
s_UserSettings = CreateElement< CDmeUserSettings >( "userSettings", DMFILEID_INVALID );
}
return s_UserSettings;
}
//-----------------------------------------------------------------------------
void CDmeUserSettings::OnConstruction()
{
}
void CDmeUserSettings::OnDestruction()
{
}
//-----------------------------------------------------------------------------
void CDmeUserSettings::AddUserSettingsChangedListener( IDmeUserSettingsChangedListener *pListener )
{
s_UserSettingsChangedListeners.AddToTail( pListener );
}
//-----------------------------------------------------------------------------
void CDmeUserSettings::OnAttributeChanged( CDmAttribute *pAttribute )
{
BaseClass::OnAttributeChanged( pAttribute );
const char *pRegistryPath = FindRegistryPathForAttribute( pAttribute );
if( pRegistryPath )
{
SetRegistryFromAttribute( pAttribute, pRegistryPath );
KeyValues *pMessage = new KeyValues( "OnUserSettingsChanged", NameKey, pAttribute->GetName() );
pMessage->SetPtr( AttributeKey, pAttribute );
pMessage->SetString( RegistryPathKey, pRegistryPath );
int nListenerCount = s_UserSettingsChangedListeners.Count();
for( int i=nListenerCount - 1; i>=0 ; i-- )
{
s_UserSettingsChangedListeners[ i ]->OnUserSettingsChanged( pMessage );
}
}
}
//-----------------------------------------------------------------------------
void CDmeUserSettings::SetAttributeForRegistryPathInDatabase( CDmAttribute *pAttribute, const char *pRegistryPath )
{
s_RegistryPathToAttribute.InsertOrReplace( pRegistryPath, pAttribute );
}
CDmAttribute *CDmeUserSettings::FindAttributeForRegistryPath( const char *pRegistryPath )
{
int nIndex = s_RegistryPathToAttribute.Find( pRegistryPath );
if( s_RegistryPathToAttribute.IsValidIndex( nIndex ) )
{
return s_RegistryPathToAttribute.Element( nIndex );
}
else
{
return NULL;
}
}
const char *CDmeUserSettings::FindRegistryPathForAttribute( CDmAttribute *pAttribute )
{
const char *pReturnValue = NULL;
for ( int i = s_RegistryPathToAttribute.FirstInorder(); i != s_RegistryPathToAttribute.InvalidIndex(); i = s_RegistryPathToAttribute.NextInorder( i ) )
{
CDmAttribute *pCurrentAttribute = s_RegistryPathToAttribute[i];
if( pCurrentAttribute == pAttribute )
{
pReturnValue = s_RegistryPathToAttribute.Key( i );
break;
}
}
return pReturnValue;
}
//-----------------------------------------------------------------------------
void CDmeUserSettings::GetAttributeNameFromRegistryPath( const char *pRegistryPath, char *pAttributeName, int nAttributeNameLength )
{
CUtlVector<char*, CUtlMemory<char*, int> > attributeStrings;
V_SplitString( pRegistryPath, "\\", attributeStrings );
Q_snprintf( pAttributeName, nAttributeNameLength, "%s", attributeStrings.Tail());
attributeStrings.PurgeAndDeleteElements();
}
CDmeUserSettings *CDmeUserSettings::GetUserSettingsForRegistryPath( const char *pRegistryPath )
{
CDmeUserSettings *pReturnSettings = this;
CDmeUserSettings *pCurrentSettings = this;
CUtlVector<char*, CUtlMemory<char*, int> > attributeStrings;
V_SplitString( pRegistryPath, "\\", attributeStrings );
if( attributeStrings.Count() > 1 )
{
for( int i = 0; i < attributeStrings.Count() - 1; i++ )
{
const char *currentName = attributeStrings[i];
pCurrentSettings = pReturnSettings->GetValueElement< CDmeUserSettings >(currentName );
if( !pCurrentSettings )
{
pCurrentSettings = CreateElement< CDmeUserSettings >( currentName, pReturnSettings->GetFileId() );
pReturnSettings->SetValue( currentName, pCurrentSettings, true );
}
pReturnSettings = pCurrentSettings;
}
}
attributeStrings.PurgeAndDeleteElements();
return pReturnSettings;
}
//-----------------------------------------------------------------------------
bool CDmeUserSettings::RegistryPathHasValue( const char *pRegistryPath )
{
char pValueString[1024] = "";
bool bKeyIsAvailable = GetRegistryString( pRegistryPath, pValueString, sizeof( pValueString ) );
return bKeyIsAvailable;
}
void CDmeUserSettings::SetAttributeFromRegistry( CDmAttribute *pAttribute, const char *pRegistryPath )
{
char pValueString[1024];
GetRegistryString( pRegistryPath, pValueString, sizeof( pValueString ) );
pAttribute->SetValueFromString( pValueString );
}
void CDmeUserSettings::SetRegistryFromAttribute( CDmAttribute *pAttribute, const char *pRegistryPath )
{
char pValueString[1024];
pAttribute->GetValueAsString( pValueString, sizeof( pValueString ) );
SetRegistryString( pRegistryPath, pValueString );
}
//-----------------------------------------------------------------------------
// [10/23/2009 Stefan] Replace the following methods by something in tierX when it is available
void CDmeUserSettings::CreateRegistryEntryAndValueKey( const char *pRegistryPath, char *pEntryKey, int nEntryKeyLength, char *pValueKey, int nValueKeyLength )
{
char pFullPath[1024];
V_snprintf(
pFullPath,
sizeof(pFullPath),
"Software\\Valve\\SourceFilmMaker\\%s",
pRegistryPath );
int nFullPathLength = V_strlen( pFullPath );
int nSplitPosition = -1;
for( int i = nFullPathLength - 1; i >= 0; i-- )
{
if( pFullPath[i]=='\\')
{
nSplitPosition = i + 1;
break;
}
}
if( nSplitPosition >= 0 && nSplitPosition < nFullPathLength )
{
V_StrRight( pFullPath, nFullPathLength - nSplitPosition, pValueKey, nValueKeyLength );
V_StrLeft( pFullPath, nSplitPosition, pEntryKey, nEntryKeyLength );
}
else
{
V_snprintf( pEntryKey, nEntryKeyLength, "%s", pFullPath );
V_snprintf( pValueKey, nValueKeyLength, "" );
}
}
bool CDmeUserSettings::SetRegistryString(const char *pRegistryPath, const char *pStringValue)
{
#ifndef _X360
HKEY hKey;
HKEY hSlot = HKEY_CURRENT_USER;
char pEntryKey[1024];
char pValueKey[1024];
CreateRegistryEntryAndValueKey( pRegistryPath, pEntryKey, sizeof( pEntryKey), pValueKey, sizeof( pValueKey ) );
if ( RegCreateKeyEx( hSlot, pEntryKey ,NULL, NULL, REG_OPTION_NON_VOLATILE, pStringValue ? KEY_WRITE : KEY_ALL_ACCESS, NULL, &hKey , NULL) != ERROR_SUCCESS )
{
return false;
}
if ( RegSetValueEx( hKey, pValueKey, NULL, REG_SZ, (unsigned char *)pStringValue, strlen(pStringValue) + 1 ) == ERROR_SUCCESS )
{
RegCloseKey(hKey);
return true;
}
RegCloseKey(hKey);
#endif
return false;
}
bool CDmeUserSettings::GetRegistryString(const char *pRegistryPath, char *pStringValue, int nStringValueLen)
{
#ifndef _X360
pStringValue[0] = 0;
HKEY hKey;
HKEY hSlot = HKEY_CURRENT_USER;
char pEntryKey[1024];
char pValueKey[1024];
CreateRegistryEntryAndValueKey( pRegistryPath, pEntryKey, sizeof( pEntryKey), pValueKey, sizeof( pValueKey ) );
if ( RegOpenKeyEx( hSlot, pEntryKey, NULL, KEY_READ, &hKey ) != ERROR_SUCCESS )
{
return false;
}
unsigned long len = nStringValueLen;
if ( RegQueryValueEx( hKey, pValueKey, NULL, NULL, (unsigned char *)pStringValue, &len ) == ERROR_SUCCESS )
{
RegCloseKey(hKey);
return true;
}
RegCloseKey(hKey);
#endif
return false;
}