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
5 years ago
|
//========= 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;
|
||
|
}
|