//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// #include #include #include "tier1/strtools.h" #include "ifaceposerworkspace.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CWorkspaceFiles : public IWorkspaceFiles { public: CWorkspaceFiles( void ); ~CWorkspaceFiles( void ); virtual void Init( char const *pchShortName ); // Restore int GetNumStoredFiles( int type ); const char *GetStoredFile( int type, int number ); // Save void StartStoringFiles( int type ); void FinishStoringFiles( int type ); void StoreFile( int type, const char *filename ); private: static const char *NameForType( int type ); static int TypeForName( const char *name ); LONG CreateWorkspaceKey( char const *pchGameName, PHKEY phKey ); bool ReadInt( const char *szSubKey, int *value ); bool WriteInt( const char *szSubKey, int value ); bool ReadString( const char *szSubKey, char *value, int bufferlen ); bool WriteString( const char *szSubKey, const char *value ); HKEY m_hKeyMain; int m_nStoredFiles[ NUM_FILE_TYPES ]; }; static CWorkspaceFiles g_WorkspaceFiles; IWorkspaceFiles *workspacefiles = ( IWorkspaceFiles * )&g_WorkspaceFiles; CWorkspaceFiles::CWorkspaceFiles( void ) : m_hKeyMain( (HKEY)0 ) { memset( m_nStoredFiles, 0, sizeof( m_nStoredFiles ) ); } CWorkspaceFiles::~CWorkspaceFiles( void ) { if ( (HKEY)0 != m_hKeyMain ) { RegCloseKey( m_hKeyMain ); } } void CWorkspaceFiles::Init( char const *pchShortName ) { CreateWorkspaceKey( pchShortName, &m_hKeyMain ); } const char *CWorkspaceFiles::NameForType( int type ) { switch ( type ) { case EXPRESSION: return "expressionfiles"; case CHOREODATA: return "choreodatafiles"; case MODELDATA: return "modelfiles"; default: break; } return "unknown"; } int CWorkspaceFiles::TypeForName( const char *name ) { if ( !Q_stricmp( name, "expressionfiles" ) ) { return EXPRESSION; } else if ( !Q_stricmp( name, "choreodatafiles" ) ) { return CHOREODATA; } else if ( !Q_stricmp( name, "modelfiles" ) ) { return MODELDATA; } return -1; } int CWorkspaceFiles::GetNumStoredFiles( int type ) { char szKeyName[ 256 ]; Q_snprintf( szKeyName, sizeof( szKeyName ), "%s\\total", NameForType( type ) ); int num = 0; ReadInt( szKeyName, &num ); return num; } const char *CWorkspaceFiles::GetStoredFile( int type, int number ) { char szKeyName[ 256 ]; sprintf( szKeyName, "%s\\%04i", NameForType( type ), number ); static char filename[ 256 ]; filename[ 0 ] = 0; ReadString( szKeyName, filename, 256 ); return filename; } void CWorkspaceFiles::StartStoringFiles( int type ) { m_nStoredFiles[ type ] = 0; } void CWorkspaceFiles::FinishStoringFiles( int type ) { char szKeyName[ 256 ]; sprintf( szKeyName, "%s\\total", NameForType( type ) ); WriteInt( szKeyName, m_nStoredFiles[ type ] ); } void CWorkspaceFiles::StoreFile( int type, const char *filename ) { char szKeyName[ 256 ]; sprintf( szKeyName, "%s\\%04i", NameForType( type ), m_nStoredFiles[ type ]++ ); WriteString( szKeyName, filename ); } LONG CWorkspaceFiles::CreateWorkspaceKey( char const *pchGameName, PHKEY phKey ) { DWORD disp; char sz[ 512 ]; Q_snprintf( sz, sizeof( sz ), "Software\\Valve\\faceposer\\workspace\\%s", pchGameName ); return RegCreateKeyEx( HKEY_CURRENT_USER, // handle of open key sz, // address of name of subkey to open 0, // DWORD ulOptions, // reserved NULL, // Type of value REG_OPTION_NON_VOLATILE, // Store permanently in reg. KEY_ALL_ACCESS, // REGSAM samDesired, // security access mask NULL, phKey, // Key we are creating &disp ); // Type of creation } bool CWorkspaceFiles::ReadInt( const char *szSubKey, int *value ) { LONG lResult; // Registry function result code DWORD dwType; // Type of key DWORD dwSize; // Size of element data dwSize = sizeof( DWORD ); lResult = RegQueryValueEx( m_hKeyMain, // handle to key szSubKey, // value name 0, // reserved &dwType, // type buffer (LPBYTE)value, // data buffer &dwSize ); // size of data buffer if (lResult != ERROR_SUCCESS) // Failure return false; if (dwType != REG_DWORD) return false; return true; } bool CWorkspaceFiles::WriteInt( const char *szSubKey, int value ) { LONG lResult; // Registry function result code DWORD dwSize; // Size of element data dwSize = sizeof( DWORD ); lResult = RegSetValueEx( m_hKeyMain, // handle to key szSubKey, // value name 0, // reserved REG_DWORD, // type buffer (LPBYTE)&value, // data buffer dwSize ); // size of data buffer if (lResult != ERROR_SUCCESS) // Failure return false; return true; } bool CWorkspaceFiles::ReadString( const char *szSubKey, char *value, int buffersize ) { LONG lResult; // Registry function result code DWORD dwType; // Type of key DWORD dwSize; // Size of element data dwSize = buffersize; lResult = RegQueryValueEx( m_hKeyMain, // handle to key szSubKey, // value name 0, // reserved &dwType, // type buffer (LPBYTE)value, // data buffer &dwSize ); // size of data buffer if (lResult != ERROR_SUCCESS) // Failure return false; if (dwType != REG_SZ) return false; return true; } bool CWorkspaceFiles::WriteString( const char *szSubKey, const char *value ) { LONG lResult; // Registry function result code DWORD dwSize; // Size of element data dwSize = strlen( value ) + 1; lResult = RegSetValueEx( m_hKeyMain, // handle to key szSubKey, // value name 0, // reserved REG_SZ, // type buffer (LPBYTE)value, // data buffer dwSize ); // size of data buffer if (lResult != ERROR_SUCCESS) // Failure return false; return true; }