522 lines
17 KiB
C++
522 lines
17 KiB
C++
/*
|
|
=======================================================================================
|
|
Name :IniData.cpp
|
|
|
|
Author : VL Date :16/07/97
|
|
|
|
Description :function to get ini data, check this data, write them ...
|
|
=======================================================================================
|
|
Modification -> Author : Date :
|
|
Description :
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#include "stdafx.h"
|
|
|
|
#include <io.h>
|
|
#include <sys/stat.H>
|
|
|
|
#include "constant.h"
|
|
#include "IniData.h"
|
|
#include "Tree_Fct.h"
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
|
|
tdstWindowsPref g_stWinPref;
|
|
tdstIniData g_stIniData; // data in ini file
|
|
tdstIniData g_stDefaultData = // default value for data
|
|
{
|
|
"X:\\CPA\\Exe\\Main\\Gamedata",
|
|
"X:\\CPA\\Exe\\Main\\",
|
|
0,
|
|
"chkData.log",
|
|
"SectType.txt",
|
|
0,
|
|
{ "CheckFileList", -1, "NoFileListConfig", "", 0, NULL },
|
|
{
|
|
"GameData\\World\\Graphics\\Textures",
|
|
"GameData",
|
|
"GameData\\World",
|
|
"GameData\\World\\Levels",
|
|
"GameData\\World\\Levels\\_Common\\Families",
|
|
"GameData\\World\\Levels",
|
|
"GameData\\World\\Graphics\\Anims",
|
|
"GameData\\World\\Graphics\\Objects\\Classes",
|
|
"GameData\\World\\Graphics\\Objects\\Banks",
|
|
"GameData\\World\\Libraries\\Mechanics",
|
|
"GameData\\World\\Sound",
|
|
"GameData\\World\\Graphics\\Visuals",
|
|
"GameData\\World\\Libraries\\Materials",
|
|
"GameData\\World\\Libraries\\Environment",
|
|
"GameData\\SaveGame",
|
|
"GameData\\Vignette",
|
|
"GameData\\Options",
|
|
"GameData\\World\\Levels"
|
|
},
|
|
18,
|
|
{
|
|
{g_stIniData.stAvailablePaths.szGraphicsBanks, "GraphicsBanks"},
|
|
{g_stIniData.stAvailablePaths.szLevels, "Levels"},
|
|
{g_stIniData.stAvailablePaths.szFamilies, "Families"},
|
|
{g_stIniData.stAvailablePaths.szTexture, "Texture" } ,
|
|
{g_stIniData.stAvailablePaths.szGameData, "GameData"} ,
|
|
{g_stIniData.stAvailablePaths.szWorld, "World"},
|
|
{g_stIniData.stAvailablePaths.szCharacters, "Characters"},
|
|
{g_stIniData.stAvailablePaths.szAnimations, "Animations"},
|
|
{g_stIniData.stAvailablePaths.szGraphicsClasses, "GraphicsClasses"},
|
|
{g_stIniData.stAvailablePaths.szMechanics, "Mechanics"},
|
|
{g_stIniData.stAvailablePaths.szSound, "Sound"},
|
|
{g_stIniData.stAvailablePaths.szVisuals, "Visuals"},
|
|
{g_stIniData.stAvailablePaths.szMaterials, "Materials"},
|
|
{g_stIniData.stAvailablePaths.szEnvironment, "Environment"},
|
|
{g_stIniData.stAvailablePaths.szSaveGame, "SaveGame"},
|
|
{g_stIniData.stAvailablePaths.szVignettes, "Vignettes"},
|
|
{g_stIniData.stAvailablePaths.szOptions, "Options"},
|
|
{g_stIniData.stAvailablePaths.szZdx, "Zdx"}
|
|
}
|
|
};
|
|
|
|
char g_szIniFile[MAX_PATH];
|
|
|
|
/*
|
|
=======================================================================================
|
|
Macros
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
* Macro to bound size of a rect
|
|
*/
|
|
#define M_vCheckRectSize( _p_stRect, _iMinWidth, _iMinHeight )\
|
|
{\
|
|
if (_p_stRect->right - _p_stRect->left + 1 < _iMinWidth )\
|
|
_p_stRect->right = _p_stRect->left + _iMinWidth ;\
|
|
if (_p_stRect->bottom - _p_stRect->top + 1 < _iMinHeight )\
|
|
_p_stRect->bottom = _p_stRect->top + _iMinHeight;\
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions to manage file list
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : free fileList in Init Data structure
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vFreeFileList( tdstFileListConfig *_p_stFileList )
|
|
{
|
|
int iFile;
|
|
|
|
if ( _p_stFileList == NULL)
|
|
return;
|
|
|
|
if (_p_stFileList->lNumberOfFiles != 0)
|
|
{
|
|
for (iFile = 0; iFile < _p_stFileList->lNumberOfFiles; iFile++)
|
|
free ( _p_stFileList->d_szFile[iFile] );
|
|
free ( _p_stFileList->d_szFile );
|
|
_p_stFileList->lNumberOfFiles = 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : write file list config in ini file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vWriteFileList( tdstFileListConfig *_p_stFileList )
|
|
{
|
|
int iOldFileNumber;
|
|
int iFile;
|
|
char szString[40];
|
|
|
|
|
|
if (_p_stFileList == NULL)
|
|
return;
|
|
|
|
/* set ini file in RW mode if in ReadOnly mode */
|
|
if (_access( g_szIniFile, 2) == -1)
|
|
_chmod ( g_szIniFile, _S_IWRITE );
|
|
|
|
iOldFileNumber = GetPrivateProfileInt( _p_stFileList->szId, "Number", 0, g_szIniFile );
|
|
if ( iOldFileNumber == 0 ) // new config
|
|
g_stIniData.cNumberOfConfigs++;
|
|
|
|
WritePrivateProfileString( "Vss", _p_stFileList->szKey, _p_stFileList->szId, g_szIniFile );
|
|
WritePrivateProfileString( _p_stFileList->szId, "Name", _p_stFileList->szName, g_szIniFile );
|
|
WritePrivateProfileString( _p_stFileList->szId, "Number", itoa( _p_stFileList->lNumberOfFiles, szString, 10 ), g_szIniFile );
|
|
|
|
for ( iFile = 0; iFile < _p_stFileList->lNumberOfFiles; iFile ++)
|
|
{
|
|
sprintf( szString, "File%04d", iFile );
|
|
WritePrivateProfileString( _p_stFileList->szId, szString, _p_stFileList->d_szFile[iFile], g_szIniFile );
|
|
}
|
|
for ( ;iFile < iOldFileNumber; iFile ++)
|
|
{
|
|
sprintf( szString, "File%04d", iFile );
|
|
WritePrivateProfileString( _p_stFileList->szId, szString, NULL, g_szIniFile );
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get file list config from ini file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_IniD_bGetFileList( tdstFileListConfig *_p_stFileList, char _cConfig )
|
|
{
|
|
long lNbFiles;
|
|
int iFile;
|
|
int iDeleteFile;
|
|
char szKey[10];
|
|
char **d_szFileName;
|
|
|
|
if (_p_stFileList == NULL)
|
|
return FALSE;
|
|
|
|
if ( (_cConfig < 0) || (_cConfig >= g_stIniData.cNumberOfConfigs) )
|
|
return FALSE;
|
|
|
|
sprintf( _p_stFileList->szId, "FileList-Config%02d", _cConfig );
|
|
|
|
/* get config name */
|
|
GetPrivateProfileString( _p_stFileList->szId, "Name", "No name", _p_stFileList->szName, 40, g_szIniFile);
|
|
/* get number of file */
|
|
lNbFiles = GetPrivateProfileInt( _p_stFileList->szId, "Number", 0, g_szIniFile);
|
|
if (lNbFiles == 0)
|
|
return FALSE;
|
|
|
|
/* allocate memory for pointer to file names */
|
|
d_szFileName = (char **) malloc ( lNbFiles * sizeof( char *) );
|
|
/* get each file name */
|
|
for (iFile = 0; iFile < lNbFiles; iFile ++)
|
|
{
|
|
d_szFileName[iFile] = (char *) malloc( _MAX_PATH );
|
|
sprintf( szKey, "File%04d", iFile );
|
|
GetPrivateProfileString( _p_stFileList->szId, szKey, "Error", d_szFileName[iFile], MAX_PATH, g_szIniFile );
|
|
if (strcmp( d_szFileName[iFile], "Error") == 0)
|
|
{
|
|
for (iDeleteFile = 0; iDeleteFile <= iFile; iDeleteFile ++)
|
|
free ( d_szFileName[iDeleteFile] );
|
|
free (d_szFileName);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* update ini data */
|
|
fn_IniD_vFreeFileList( _p_stFileList );
|
|
_p_stFileList->lNumberOfFiles = lNbFiles;
|
|
_p_stFileList->d_szFile = d_szFileName;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Set file list to default value
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vSetSingleFileList( tdstFileListConfig *_p_stFileList, char *_szFileName )
|
|
{
|
|
if ( _p_stFileList == NULL )
|
|
return;
|
|
|
|
fn_IniD_vFreeFileList( _p_stFileList );
|
|
_p_stFileList->lNumberOfFiles = 1;
|
|
_p_stFileList->d_szFile = (char **) malloc( sizeof( char *) );
|
|
_p_stFileList->d_szFile[0] = (char *) malloc( MAX_PATH );
|
|
sprintf( _p_stFileList->d_szFile[0], "-R %s", _szFileName );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get index of a config from id of the config
|
|
_szId -> string id of config
|
|
Returns (char ) index of config (-1 if not a valid string id
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char fn_IniD_cGetIndexFromId( char *_szId )
|
|
{
|
|
if ( strlen( _szId ) != 17 )
|
|
return -1;
|
|
|
|
if ( strncmp( _szId, "FileList-Config", 15 ) != 0)
|
|
return -1;
|
|
|
|
if ( !isdigit( _szId[15] ) || !isdigit( _szId[16] ) )
|
|
return -1;
|
|
|
|
return (_szId[15] - '0') * 10 + (_szId[16] - '0');
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
get number of file list config
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
char fn_IniD_cGetNumberOfConfig( void )
|
|
{
|
|
return g_stIniData.cNumberOfConfigs;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
get name of a config
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vGetConfigName( char _cConfig, char *_szName )
|
|
{
|
|
char szConfigId[20];
|
|
sprintf( szConfigId, "FileList-Config%02d", _cConfig );
|
|
GetPrivateProfileString( szConfigId, "Name", "Error", _szName, 40, g_szIniFile );
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
function to get/set single initial data
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Get extensions status
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
BOOL fn_IniD_bGetFileTypeConsiderStatus( char *_szExt )
|
|
{
|
|
int iResult;
|
|
|
|
iResult = GetPrivateProfileInt( "FileType", _szExt, 1, g_szIniFile );
|
|
return (iResult == 1);
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Set extensions status
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vSetFileTypeConsiderStatus( char *_szExt, BOOL _bConsider )
|
|
{
|
|
/* set ini file in RW mode if in ReadOnly mode */
|
|
if (_access( g_szIniFile, 2) == -1)
|
|
_chmod ( g_szIniFile, _S_IWRITE );
|
|
|
|
WritePrivateProfileString( "FileType", _szExt, _bConsider ? "1" : "0", g_szIniFile );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
set local path in ini file
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vSetLocalPath( char *_szPath )
|
|
{
|
|
/* set ini file in RW mode if in ReadOnly mode */
|
|
if (_access( g_szIniFile, 2) == -1)
|
|
_chmod ( g_szIniFile, _S_IWRITE );
|
|
|
|
WritePrivateProfileString( "Local", "DataRootPath", _szPath, g_szIniFile );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
set result file name
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vSetModifListFile( char *_szFileName )
|
|
{
|
|
/* set ini file in RW mode if in ReadOnly mode */
|
|
if (_access( g_szIniFile, 2) == -1)
|
|
_chmod ( g_szIniFile, _S_IWRITE );
|
|
|
|
WritePrivateProfileString( "Result", "File", _szFileName, g_szIniFile );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Analyse string that describe a rect
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vAnalyseRectData( char *_szString, RECT *_p_stRect )
|
|
{
|
|
char *p_szValue[5], *p_szEnd;
|
|
char cVal;
|
|
|
|
memset( _p_stRect, 0, sizeof( RECT ) );
|
|
|
|
if ( (p_szValue[0] = strchr(_szString, '(' )) == NULL)
|
|
return;
|
|
|
|
if ( (p_szValue[1] = strchr (++p_szValue[0], ',')) == NULL)
|
|
return;
|
|
if ( (p_szValue[2] = strchr (++p_szValue[1], ',')) == NULL)
|
|
return;
|
|
if ( (p_szValue[3] = strchr (++p_szValue[2], ',')) == NULL)
|
|
return;
|
|
p_szValue[3] ++;
|
|
|
|
p_szValue[4] = _szString + strlen( _szString );
|
|
|
|
for (cVal = 0; cVal < 4; cVal ++)
|
|
{
|
|
while ( !isdigit(*p_szValue[cVal]) )
|
|
{
|
|
if (p_szValue[cVal] == p_szValue[cVal+1])
|
|
return;
|
|
p_szValue[cVal]++;
|
|
}
|
|
p_szEnd = p_szValue[cVal] + 1;
|
|
while ( isdigit(*p_szEnd))
|
|
{
|
|
if (p_szEnd == p_szValue[cVal+1])
|
|
return;
|
|
p_szEnd++;
|
|
}
|
|
*p_szEnd = 0;
|
|
}
|
|
|
|
_p_stRect->left = atoi( p_szValue[0] );
|
|
_p_stRect->top = atoi( p_szValue[1] );
|
|
_p_stRect->right = atoi( p_szValue[2] );
|
|
_p_stRect->bottom = atoi( p_szValue[3] );
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
function for windows preference data
|
|
=======================================================================================
|
|
*/
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get position and size of windows
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vGetWindowPreference( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
char szString[100];
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/* main window */
|
|
GetPrivateProfileString( "WinPref", "Main", "", szString, 100, g_szIniFile );
|
|
fn_IniD_vAnalyseRectData( szString, &g_stWinPref.stMainPos );
|
|
M_vCheckRectSize( (&g_stWinPref.stMainPos), C_iMainMinWidth, C_iMainMinHeight );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : write position and size of windows
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vWriteWindowPreference( void )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
char szValue[50];
|
|
RECT *p_stRect;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/* set ini file in RW mode if in ReadOnly mode */
|
|
if (_access( g_szIniFile, 2) == -1)
|
|
_chmod ( g_szIniFile, _S_IWRITE );
|
|
|
|
/* main window */
|
|
p_stRect = &g_stWinPref.stMainPos;
|
|
sprintf( szValue, "(%4d,%4d,%4d,%4d)", p_stRect->left, p_stRect->top, p_stRect->right, p_stRect->bottom );
|
|
WritePrivateProfileString( "WinPref", "Main ", szValue, g_szIniFile );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
*=======================================================================================
|
|
* function for all initial data
|
|
*=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
transform ini file to keep file compatible
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vTransformIniFileToBeCompatible( void )
|
|
{
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : read ini data to fill inidata structure
|
|
and set additional ini data
|
|
_bFirst -> indicate that it's the first initialisation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void fn_IniD_vGetAllFromIniFile( BOOL _bFirst )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
char szConfigId[20];
|
|
char szConfigName[40];
|
|
tdstFileListConfig *p_stConfig;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
if (_bFirst)
|
|
{
|
|
/*
|
|
* transform eventually ini file
|
|
*/
|
|
fn_IniD_vTransformIniFileToBeCompatible();
|
|
/*
|
|
* Build ini file
|
|
*/
|
|
GetCurrentDirectory( MAX_PATH, g_szIniFile );
|
|
if (g_szIniFile[strlen(g_szIniFile) - 1] != '\\')
|
|
strcat( g_szIniFile, "\\");
|
|
strcat( g_szIniFile, C_szIniFile );
|
|
|
|
memcpy ( &g_stIniData, &g_stDefaultData, sizeof( tdstIniData ) );
|
|
memset ( &g_stWinPref, 0, sizeof( tdstWindowsPref ) );
|
|
|
|
fn_IniD_vGetWindowPreference();
|
|
|
|
/* retrieve number of config */
|
|
g_stIniData.cNumberOfConfigs = 0;
|
|
while (1)
|
|
{
|
|
sprintf( szConfigId, "FileList-Config%02d", g_stIniData.cNumberOfConfigs);
|
|
GetPrivateProfileString( szConfigId, "Name", "Error", szConfigName, 40, g_szIniFile );
|
|
if (strcmp(szConfigName, "Error") == 0)
|
|
break;
|
|
g_stIniData.cNumberOfConfigs++;
|
|
}
|
|
|
|
}
|
|
|
|
GetPrivateProfileString( "Local", "DataRootPath", g_stDefaultData.szLocalPath, g_stIniData.szLocalPath, MAX_PATH, g_szIniFile );
|
|
GetPrivateProfileString( "Local", "RootForSection", g_stDefaultData.szRootForSection, g_stIniData.szRootForSection, MAX_PATH, g_szIniFile );
|
|
g_stIniData.lRootForSectionLength = strlen( g_stIniData.szRootForSection );
|
|
GetPrivateProfileString( "Result", "File", g_stDefaultData.szResultFile, g_stIniData.szResultFile, MAX_PATH, g_szIniFile );
|
|
|
|
/*
|
|
* get check file list Id
|
|
*/
|
|
p_stConfig = &g_stIniData.stCheckConfig;
|
|
GetPrivateProfileString( "Vss", p_stConfig->szKey, g_stDefaultData.stCheckConfig.szId, p_stConfig->szId, 20, g_szIniFile );
|
|
p_stConfig->cIndex = fn_IniD_cGetIndexFromId( p_stConfig->szId );
|
|
if (p_stConfig->cIndex != -1)
|
|
fn_IniD_bGetFileList( p_stConfig, p_stConfig->cIndex );
|
|
else
|
|
fn_IniD_vSetSingleFileList( p_stConfig, g_stIniData.szLocalPath + g_stIniData.lRootForSectionLength );
|
|
}
|