You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.9 KiB
258 lines
5.9 KiB
//========= 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; |
|
} |