diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/faceposerworkspace.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'utils/hlfaceposer/faceposerworkspace.cpp')
| -rw-r--r-- | utils/hlfaceposer/faceposerworkspace.cpp | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/utils/hlfaceposer/faceposerworkspace.cpp b/utils/hlfaceposer/faceposerworkspace.cpp new file mode 100644 index 0000000..75b8137 --- /dev/null +++ b/utils/hlfaceposer/faceposerworkspace.cpp @@ -0,0 +1,258 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +#include <windows.h> +#include <stdio.h> +#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; +}
\ No newline at end of file |