reman3/Rayman_X/cpa/Appli/MngData5/Src/MajData.cpp

962 lines
27 KiB
C++

/*
=======================================================================================
Name :MajData.cpp
Author :vincent lhullie Date :21/07/97
Description : High level functions to update Vss data base
=======================================================================================
Modification -> Author : Date :
Description :
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "stdafx.h"
#include "majdata.h"
#include "error.h"
#include "inidata.h"
#include "DlgConfl.h"
#include "DlgUpdOp.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
Globals
=======================================================================================
*/
char g_szVssFileName[ MAX_PATH ]; // info on checked out file
tdstFileInfo g_stTarget; // info on target (vss) section
tdstFileInfo g_stSource; // info on source (local) section
char g_cDeleteSectionModif;
char g_cAddModifiedFile;
/*
=======================================================================================
Functions to create semaphore file
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
Description : function that create the InUpdate semaphore file
---------------------------------------------------------------------------------------
*/
void fn_vCreateInUpdateSemFile( char *szName )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
FILE *hpFile;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
hpFile = fopen( szName, "wt" );
fprintf( hpFile, "*******************************************\n");
fprintf( hpFile, "* >>>>>>>>>>>>> WARNING <<<<<<<<<<<<<<< *\n");
fprintf( hpFile, "*******************************************\n");
fprintf( hpFile, "* This file is used to know if someone is *\n");
fprintf( hpFile, "* updating the data base. If this file is *\n");
fprintf( hpFile, "* extract it's the case and nobody else *\n");
fprintf( hpFile, "* can update or obtain data *\n");
fprintf( hpFile, "*******************************************\n");
fclose( hpFile );
}
/*
---------------------------------------------------------------------------------------
Description : function that create the InObtain semaphore file
---------------------------------------------------------------------------------------
*/
void fn_vCreateInObtainFile( char *szName )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
FILE *hpFile;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
hpFile = fopen( szName, "wt" );
fprintf( hpFile, "*******************************************\n");
fprintf( hpFile, "* >>>>>>>>>>>>> WARNING <<<<<<<<<<<<<<< *\n");
fprintf( hpFile, "*******************************************\n");
fprintf( hpFile, "* This file is used to know if someone is *\n");
fprintf( hpFile, "* obtaining the data base. If this file is*\n");
fprintf( hpFile, "* extract it's the case and no one can *\n");
fprintf( hpFile, "* update. Because there can be more than *\n");
fprintf( hpFile, "* one obtaning at the same time, this file*\n");
fprintf( hpFile, "* can be in multiple extraction *\n");
fprintf( hpFile, "*******************************************\n");
fclose( hpFile );
}
/*
=======================================================================================
function to manage section : read, build, save
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
Description : read desired section and section des
---------------------------------------------------------------------------------------
*/
BOOL fn_bGetSection( tdstFileInfo *p_stFI, char *p_szSectionName )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szFullSectionName[MAX_PATH];
char *p_cCur, *szEndLine;
BOOL bDate;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get section desc for file info and section name
*/
sprintf( szFullSectionName, "%s^%s", p_stFI->szFullName, p_szSectionName );
p_stFI->p_stSection = fnp_st_Anl_SearchSectionDes( p_stFI->p_stFile, szFullSectionName, 0);
p_stFI->oTime.SetDate( 100, 1, 1 );
if (p_stFI->p_stSection == NULL)
return FALSE;
/*
* get entire source section
*/
p_stFI->lSize = p_stFI->p_stSection->stEndPosition.lAfterSeekInFile - p_stFI->p_stSection->stBeginPosition.lAfterSeekInFile;
p_stFI->p_cBuffer = (char *) malloc (p_stFI->lSize + 1);
SCR_M_File_Seek( &p_stFI->p_stFile->stFile, p_stFI->p_stSection->stBeginPosition.lAfterSeekInFile, SEEK_SET );
p_stFI->lSize = SCR_M_fread( p_stFI->p_cBuffer, 1, p_stFI->lSize, &p_stFI->p_stFile->stFile);
p_stFI->p_cBuffer[p_stFI->lSize] = 0;
/*
* retrieve section date
*/
bDate = FALSE;
p_cCur = strchr(p_stFI->p_cBuffer, ';');
if (p_cCur != NULL)
{
p_cCur++;
if ( (szEndLine = strchr( p_cCur, 0x0D)) != NULL )
*szEndLine = 0;
if ( strlen( p_cCur ) >= 16 )
{
if (p_cCur[ 16 ] == 0)
{
bDate = p_stFI->oTime.ParseDateTime( p_cCur );
strcpy( p_stFI->szLastUserName, "Unknow" );
}
else if (p_cCur[ 16 ] == ' ')
{
p_cCur[16] = 0;
bDate = p_stFI->oTime.ParseDateTime( p_cCur );
strcpy( p_stFI->szLastUserName, p_cCur + 17 );
p_cCur[16] = ' ';
}
}
if (szEndLine !=NULL)
*szEndLine = 0x0D;
}
if ( !bDate )
{
p_stFI->oTime.SetDate( 100, 1, 1 );
strcpy( p_stFI->szLastUserName, "Unknow" );
}
return TRUE;
}
/*
---------------------------------------------------------------------------------------
Description : Check if parent section of a section exist
---------------------------------------------------------------------------------------
*/
BOOL fn_bCheckParentSection( tdstFileInfo *p_stFI, char *p_szSectionName )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szParentSectionName[MAX_PATH];
char *p_cCur;
SCR_tdst_Anl_SectionDes *p_stParentSection;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get section desc for file info and section name
*/
if ( (p_cCur = strrchr( p_szSectionName, '^' )) == NULL )
return TRUE;
*p_cCur = 0;
sprintf( szParentSectionName, "%s^%s", p_stFI->szFullName, p_szSectionName );
*p_cCur = '^';
p_stParentSection = fnp_st_Anl_SearchSectionDes( p_stFI->p_stFile, szParentSectionName, 0);
return (p_stParentSection != NULL);
}
/*
---------------------------------------------------------------------------------------
Description : read a comment line in script file
---------------------------------------------------------------------------------------
*/
BOOL fn_bGetCommentLine( SCR_tdst_File_Description *p_stFile, char *szLine )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int iRead;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
SCR_M_Pars_GetNextNonSpaceChar(p_stFile, iRead);
if ((iRead == SCR_CC_c_Cfg_CommentMark) || (iRead == SCR_CC_c_Cfg_CommentMark1))
{
while((iRead != '\n') && (iRead != EOF))
{
if (szLine != NULL)
*szLine++ = (char) iRead;
SCR_M_Pars_ReadChar(p_stFile, iRead);
}
return TRUE;
}
return FALSE;
}
/*
---------------------------------------------------------------------------------------
Description : save a section
---------------------------------------------------------------------------------------
*/
void fn_vSaveSection(SCR_tdst_File_Description *p_stFile, char *szSectionName, void *p_vData, SCR_tde_Ntfy_Action eAction)
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *p_cSection = (char *)p_vData;
char *p_cCur = p_cSection;
SCR_tdst_Anl_SectionDes *p_stSection;
SCR_tdst_File_Open *p_stOpenFile;
char szCommentLine[SCR_CV_ui_Cfg_MaxLenLine];
char szIndent[100];
BOOL bAlreadyADate;
struct tm stTime;
char *p_cSectionSeparation;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* If it's a new section or subsection file pointer is on father section beginning
* we deplace file pointer to the end of section
* if father section isn't the file we must go one line back to set file pointer
* before the end of section (before the '}' character )
*/
if (eAction == SCR_EA_Ntfy_AddSection)
{
SCR_fn_v_SvL1_ToEndSection( p_stFile );
p_cSectionSeparation = strchr( szSectionName, '^' );
if (p_cSectionSeparation != NULL)
{
p_cSectionSeparation = strchr( p_cSectionSeparation + 1, '^' );
if (p_cSectionSeparation != NULL)
{
SCR_fn_v_SvL1_ToPrevLine( p_stFile );
}
}
}
/*
* write section (or sub-section)
*/
while (*p_cCur != 0)
{
if (*p_cCur != '\r')
fn_v_SvL0_fputc( p_stFile, *p_cCur );
p_cCur ++;
}
fn_v_SvL0_fputc( p_stFile, '\n' );
free( p_cSection );
/*
* if parent section exist save updating time for parent section too
*/
memset ( szIndent, '\t', 100 );
p_stOpenFile = SCR_fnp_st_RdL0_GetOpenFile( p_stFile->a_szFileName );
*strrchr( szSectionName, '^' ) = 0;
p_stSection = fnp_st_Anl_SearchSectionDes( p_stOpenFile, szSectionName, 0);
while( p_stSection != NULL)
{
szIndent[p_stSection->stBeginPosition.uiLevel - 1] = 0;
SCR_M_File_Seek( p_stFile, p_stSection->stBeginPosition.lAfterSeekInFile, SEEK_SET );
/*
* look if there's already a date in section beginning, if so delete line
*/
bAlreadyADate = FALSE;
if (fn_bGetCommentLine( p_stFile, szCommentLine ) )
bAlreadyADate = fn_bReadDate( szCommentLine + 1, &stTime );
SCR_M_File_Seek( p_stFile, p_stSection->stBeginPosition.lAfterSeekInFile, SEEK_SET );
if (bAlreadyADate)
SCR_fn_v_SvL1_DeleteLine( p_stFile );
/*
* save date for parent section
*/
SCR_fn_v_SvL0_SaveWord( p_stFile, SCR_CC_C_Cfg_NoChar, szIndent ,SCR_CC_C_Cfg_NoChar );
//SCR_fn_v_SvL0_SaveWord( p_stFile, SCR_CC_c_Cfg_CommentMark, g_szUpdateTimeString ,SCR_CC_C_Cfg_EOL );
SCR_fn_v_SvL0_SaveWord( p_stFile, SCR_CC_c_Cfg_CommentMark, g_szUpdateTimeString ,' ' );
SCR_fn_v_SvL0_SaveWord( p_stFile, SCR_CC_C_Cfg_NoChar, g_stIniData.szVssUserName ,SCR_CC_C_Cfg_EOL );
p_stSection = p_stSection->p_stParentSection;
}
}
/*
---------------------------------------------------------------------------------------
Description build a section from a SectionDes
---------------------------------------------------------------------------------------
*/
char *fn_p_cBuildSection( tdstFileInfo *p_stFI, BOOL _bCurrentTime )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lSize;
char *p_cBuf;
char *p_cCur;
char *p_szParam;
SCR_tdst_Cxt_DynBuffers *p_stBuf = &p_stFI->p_stSection->stBuffers;
SCR_tdst_Anl_SectionDes *p_stParentSection = p_stFI->p_stSection->p_stParentSection;
char szIndent[SCR_CV_ui_Cfg_MaxLenLine];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* compute indent string
*/
*szIndent = 0;
while ( p_stParentSection != NULL)
{
strcat( szIndent, "\t" );
p_stParentSection = p_stParentSection->p_stParentSection;
}
/*
*allocate memory for section content
*/
lSize = p_stFI->lSize + 2 * SCR_CV_ui_Cfg_MaxLenLine;
p_cCur = p_cBuf = (char *) malloc (lSize);
/*
* write begin section line
*/
p_cCur += sprintf( p_cCur, "\r\n%s{%s:%s", szIndent, p_stBuf->p_szBufferName, p_stBuf->p_szBufferNameExt );
if (*p_stBuf->a_szBufferFormat)
p_cCur += sprintf( p_cCur, "[%s]", p_stBuf->a_szBufferFormat );
if (*p_stBuf->a_szBufferParams)
{
p_cCur += sprintf( p_cCur, "(" );
p_szParam = p_stBuf->a_szBufferParams;
while ( *p_szParam )
{
p_cCur += sprintf( p_cCur, "%s,", p_szParam );
p_szParam += strlen( p_szParam ) + 1;
}
p_cCur--;
p_cCur += sprintf( p_cCur, ")" );
}
p_cCur += sprintf( p_cCur, "\r\n" );
p_szParam = p_stFI->p_cBuffer;
if ( _bCurrentTime )
{
/*
* write time
*/
p_cCur += sprintf( p_cCur, "%s;%s %s\r\n", szIndent, g_szUpdateTimeString, g_stIniData.szVssUserName );
/*
* swap old date line
*/
if ( (p_stFI->oTime.GetYear() != 1899) && (p_stFI->oTime.GetYear() != 100) )
{
p_szParam = strchr( p_stFI->p_cBuffer, ';' );
while (*p_szParam++ != '\n');
}
}
/*
* write other's line of section in buffer
*/
strcpy(p_cCur, p_szParam );
return p_cBuf;
}
/*
=======================================================================================
Algorithm functions
=======================================================================================
*/
/*
---------------------------------------------------------------------------------------
function that watch if semaphore file is extract or not
---------------------------------------------------------------------------------------
*/
BOOL fn_bSomeoneUpdate( BOOL bCreateFile, BOOL _bMessage )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char cStatus;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get status of InUpdate.Sem file
*/
cStatus = OLE_fn_cGetVssFileStatus( g_stIniData.szVssInUpdate );
/*
* if file is extract by current user, display problem
*/
if (cStatus == VSSFILE_CHECKEDOUT_ME)
{
if (
(!_bMessage)
||
(
AfxMessageBox
(
"There's a problem, base status indicate\r\nthat you currently update base\r\nWould you correct problem ?",
MB_ICONEXCLAMATION | MB_YESNO
) == IDYES
)
)
{
/*
* try to correct problem by undoing checkout
*/
OLE_fn_bUndoCheckoutFile( g_stIniData.szVssInUpdate, g_stIniData.szLocalInUpdate, 0 );
cStatus = OLE_fn_cGetVssFileStatus( g_stIniData.szVssInUpdate );
/*
* if still extract by current user, display error
*/
if (cStatus == VSSFILE_CHECKEDOUT_ME)
{
if (_bMessage)
AfxMessageBox( "Can't correct problem, contact administraton", MB_ICONSTOP );
return TRUE;
}
}
else
{
return TRUE;
}
}
/*
* if file is extract, someone update, stop
*/
if (cStatus == VSSFILE_CHECKEDOUT)
return TRUE;
/*
* if file does'nt exist, create it and add it in VSS
*/
if ((cStatus == VSSFILE_NOTFOUND) && bCreateFile)
{
fn_vCreateInUpdateSemFile(g_stIniData.szLocalInUpdate);
OLE_fn_bAddFile( g_stIniData.szVssPath, g_stIniData.szLocalInUpdate );
}
return FALSE;
}
/*
----------------------------------------------------------------------------------------
Description : return update status of base (TRUE) if someone update and write in
_p_szMsg variable a status string
Returns (BOOL ) TRUE if someone update, otherwise FALSE
----------------------------------------------------------------------------------------
*/
BOOL fn_bGetUpdateStatus( char *_p_szMsg )
{
BOOL bResult;
bResult = fn_bSomeoneUpdate(FALSE, TRUE);
if (_p_szMsg != NULL )
{
if (bResult)
sprintf( _p_szMsg, "%s is updating", g_a_szUserName[0] );
else
sprintf( _p_szMsg, "Nobody is being updating");
}
return bResult;
}
/*
---------------------------------------------------------------------------------------
begin updating
---------------------------------------------------------------------------------------
*/
BOOL fn_bBeginUpdating( void )
{
//return OLE_fn_bCheckoutFile( g_stIniData.szVssInUpdate, g_stIniData.szLocalInUpdate, VSSFLAG_GETNO );
return OLE_fn_bCheckoutFile( g_stIniData.szVssInUpdate, g_stIniData.szLocalInUpdate, VSSFLAG_GETYES | VSSFLAG_REPREPLACE );
}
/*
---------------------------------------------------------------------------------------
end obtaining data
---------------------------------------------------------------------------------------
*/
BOOL fn_bEndUpdating( void )
{
FILE *hpFile;
if ( (hpFile = fopen( g_stIniData.szLocalInUpdate, "at")) != NULL)
{
fprintf( hpFile, "%s %s\n", g_szUpdateTimeString, g_stIniData.szVssUserName );
fclose (hpFile );
}
return OLE_fn_bCheckinFile( g_stIniData.szVssInUpdate, g_stIniData.szLocalInUpdate, VSSFLAG_DELYES );
//return OLE_fn_bUndoCheckoutFile( g_stIniData.szVssInUpdate, g_stIniData.szLocalInUpdate, VSSFLAG_DELYES );
}
/*
---------------------------------------------------------------------------------------
doing a modification
---------------------------------------------------------------------------------------
*/
BOOL fn_bDoModif( tdstModif *p_stModif )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char *p_szSectionName = strchr( p_stModif->szName, '^' );
char szNotifiedSection[MAX_PATH];
SCR_tde_Ntfy_Action eNotifyAction;
BOOL bSource;
BOOL bTarget;
BOOL bError = FALSE;
BOOL bContinue = TRUE;
char *szVssSection;
char *szLocalSection = NULL;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* check section
*/
if (p_szSectionName == NULL)
return FALSE;
sprintf( szNotifiedSection, "%s%s", g_stTarget.szFullName, p_szSectionName );
p_szSectionName++;
/*
* get target and source section
*/
bTarget = fn_bGetSection( &g_stTarget, p_szSectionName );
bSource = fn_bGetSection( &g_stSource, p_szSectionName );
if (!bSource && !bTarget)
{
/*
* none of source or target section exist
*/
Error_fn_vSet( Error_eSectionNotFound, "Section Not Found neither in Vss nor in local disk" );
return FALSE;
}
else
{
/*
* compute notify action
*/
if (!bSource)
eNotifyAction = SCR_EA_Ntfy_DeleteSection;
else
{
if (!bTarget)
eNotifyAction = SCR_EA_Ntfy_AddSection;
else
{
if (p_stModif->cType == C_ModifType_cAdd)
{
int cChoice;
if (g_cDeleteSectionModif == 0)
{
CYesNoAllDlg oQuestion;
char szMessage[1024], *p_szMessage = szMessage;
p_szMessage += sprintf( p_szMessage, "Warning : %s section\n", p_stModif->szName );
p_szMessage += sprintf( p_szMessage, "was created in your local directory but already exist in vss data\n");
p_szMessage += sprintf( p_szMessage, "-------------------------------------\n" );
p_szMessage += sprintf( p_szMessage, "Do you want I delete this section modification and \n");
p_szMessage += sprintf( p_szMessage, "take care of sub section modification ?");
oQuestion.fn_vSetMessage( szMessage );
oQuestion.DoModal();
cChoice = oQuestion.fn_cGetChoice();
switch( cChoice )
{
case C_CHOICE_cYesAll:
g_cDeleteSectionModif = cChoice;
cChoice = C_CHOICE_cYes;
break;
case C_CHOICE_cNoAll:
g_cDeleteSectionModif = cChoice;
cChoice = C_CHOICE_cNo;
break;
}
}
else
{
cChoice = (g_cDeleteSectionModif == C_CHOICE_cYesAll) ? C_CHOICE_cYes : C_CHOICE_cNo;
}
if (cChoice == C_CHOICE_cNo)
{
Error_fn_vSet( Error_eVssSectionAlreadyCreated, "Created local section already exist" );
bError = TRUE;
}
else
{
fn_vRestoreSubModif( p_stModif );
}
bContinue = FALSE;
}
eNotifyAction = SCR_EA_Ntfy_RebuildSection;
}
}
}
/*
* watch if time are ok
*/
if (bContinue)
{
if ( g_stTarget.oTime > *g_stIniData.p_oObtainingTime)
{
if (stricmp( g_stIniData.szVssUserName, g_stTarget.szLastUserName) != 0)
{
BOOL bForce = FALSE;
if ( g_stWinPref.lUpdateFlags & C_UpdateOption_lForce )
{
bForce = TRUE;
if (g_stWinPref.lUpdateFlags & C_UpdateOption_lConfirmForce )
{
CConflictDlg oConflictDlg;
szVssSection = fn_p_cBuildSection( &g_stTarget, FALSE );
if ( bSource )
szLocalSection = fn_p_cBuildSection( &g_stSource, TRUE );
oConflictDlg.m_fn_vSetSectionName( p_stModif->szName );
//oConflictDlg.m_fn_vSetUserName( g_a_szUserName[0] );
oConflictDlg.m_fn_vSetUserName( g_stTarget.szLastUserName );
oConflictDlg.m_fn_vSetVssSection( szVssSection );
oConflictDlg.m_fn_vSetLocalSection( szLocalSection );
bForce = oConflictDlg.DoModal() == IDOK;
free( szVssSection );
}
}
if ( !bForce )
{
if (szLocalSection != NULL)
free( szLocalSection );
Error_fn_vSetFmt( Error_eVssSectionNewer, "Vss Section is newer (last update was done by %s)", g_stTarget.szLastUserName );
bError = TRUE;
bContinue = FALSE;
}
}
}
}
/*
* check parent section in target file if we add a section
*/
if (eNotifyAction == SCR_EA_Ntfy_AddSection)
{
if (!fn_bCheckParentSection( &g_stTarget, p_szSectionName ) )
{
Error_fn_vSet( Error_eVssParentSectionInexistent, "Parent Section doesn't exist" );
bError = TRUE;
bContinue = FALSE;
}
}
/*
* notify section
*/
if (bContinue)
{
if (eNotifyAction != SCR_EA_Ntfy_DeleteSection)
{
if (szLocalSection == NULL)
szLocalSection = fn_p_cBuildSection( &g_stSource, TRUE );
SCR_fn_v_SvL1_RegisterNotify(szNotifiedSection, fn_vSaveSection, szLocalSection, eNotifyAction );
}
else
SCR_fn_v_SvL1_RegisterNotify(szNotifiedSection, NULL, NULL, eNotifyAction );
}
/*
* free memory
*/
if (bTarget)
free( g_stTarget.p_cBuffer );
if (bSource)
free( g_stSource.p_cBuffer );
return (!bError);
}
/*
----------------------------------------------------------------------------------------
Description : watch if someone is obtaining base
Returns (BOOL ) TRUE if someone obtain
----------------------------------------------------------------------------------------
*/
BOOL fn_bSomeoneObtain( BOOL _bMessage )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char cStatus;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get In obtain sem file status
*/
cStatus = OLE_fn_cGetVssFileStatus( g_stIniData.szVssInObtain );
/*
* if file is extract by current user, display problem
*/
if (cStatus == VSSFILE_CHECKEDOUT_ME)
{
if (
(!_bMessage)
||
(
AfxMessageBox
(
"There's a problem, base status indicate\r\nthat you currently obtain base\r\nWould you correct problem ?",
MB_ICONEXCLAMATION | MB_YESNO
) == IDYES
)
)
{
/*
* try to correct problem by undoing checkout
*/
OLE_fn_bUndoCheckoutFile( g_stIniData.szVssInObtain, g_stIniData.szLocalInObtain, 0 );
cStatus = OLE_fn_cGetVssFileStatus( g_stIniData.szVssInObtain );
/*
* if still extract by current user, display error
*/
if (cStatus == VSSFILE_CHECKEDOUT_ME)
{
if (_bMessage)
AfxMessageBox( "Can't correct problem, contact administraton", MB_ICONSTOP );
return TRUE;
}
}
else
{
return TRUE;
}
}
return (cStatus == VSSFILE_CHECKEDOUT);
}
/*
----------------------------------------------------------------------------------------
Description : return obtain statusx of base (TRUE if someone obtain. And write in
_p_szMsg variable a status string
Returns (BOOL )TRUE if someone obtain, otherwise FALSE
----------------------------------------------------------------------------------------
*/
BOOL fn_bGetObtainStatus( char *_p_szMsg )
{
BOOL bResult;
bResult = fn_bSomeoneObtain( TRUE );
if (_p_szMsg != NULL)
{
if (bResult)
{
if (g_cNbUsers == 1)
sprintf( _p_szMsg , "%s is obtaining", g_a_szUserName[0] );
else
{
char cUser;
_p_szMsg += sprintf(_p_szMsg , "%d persons are obtaining ( ", g_cNbUsers );
for (cUser = 0; cUser < g_cNbUsers; cUser ++)
_p_szMsg += sprintf( _p_szMsg , "%s, ", g_a_szUserName[ cUser ] );
strcpy (_p_szMsg - 2, " )");
}
}
else
sprintf( _p_szMsg , "Nobody is being obtaining" );
}
return bResult;
}
/*
----------------------------------------------------------------------------------------
begin obtaining (extract InObtain semaphore file )
Returns (BOOL ) TRUE if operation is successfull
----------------------------------------------------------------------------------------
*/
BOOL fn_bBeginObtaining( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char cStatus;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* get file status for creating it if it's necessary
*/
cStatus = OLE_fn_cGetVssFileStatus( g_stIniData.szVssInObtain );
/*
* if already checked by user, return TRUE
*/
if (cStatus == VSSFILE_CHECKEDOUT_ME)
return TRUE;
/*
* if file not found, add it
*/
if (cStatus == VSSFILE_NOTFOUND)
{
fn_vCreateInObtainFile( g_stIniData.szLocalInObtain );
OLE_fn_bAddFile( g_stIniData.szVssPath, g_stIniData.szLocalInObtain );
}
return OLE_fn_bCheckoutFile( g_stIniData.szVssInObtain, g_stIniData.szLocalInObtain, VSSFLAG_GETNO);
}
/*
----------------------------------------------------------------------------------------
end obtaining data
----------------------------------------------------------------------------------------
*/
BOOL fn_bEndObtaining( void )
{
return OLE_fn_bUndoCheckoutFile( g_stIniData.szVssInObtain, g_stIniData.szLocalInObtain, VSSFLAG_DELYES );
}
/*
----------------------------------------------------------------------------------------
obtaining data (a unique folder or recursive)
----------------------------------------------------------------------------------------
*/
BOOL fn_bObtainFile( char *szFileName, BOOL *_bObtain )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szLocalPath[MAX_PATH];
char *szVssName;
int iFlags;
char *p_cSeparation;
BOOL bFile;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
* Init
*/
szVssName = szFileName;
iFlags = 0;
bFile = FALSE;
/*
* type of file to obtain
*/
if (*szFileName == '-')
{
switch ( *(szFileName + 1) )
{
case 'R':
iFlags |= VSSFLAG_RECURSYES;
break;
case 'F':
bFile = TRUE;
break;
}
szVssName += 3;
}
/*
* Get Local path
*/
sprintf( szLocalPath, "%s%s", g_stIniData.szLocalPath, szVssName + strlen( g_stIniData.szVssPath) );
if ( bFile )
{
p_cSeparation = strrchr( szLocalPath, '\\');
if (p_cSeparation == NULL)
return FALSE;
*p_cSeparation = 0;
}
/*
* Create local directory if it does'nt exist
*/
if ( (!CreateDirectory( szLocalPath, NULL )) && (GetLastError() != ERROR_ALREADY_EXISTS) )
{
char *p_szCur = szLocalPath;
/*
* swap first \ character
*/
while ( *p_szCur == '\\' )
p_szCur ++;
/*
* search first \ or second if this is a drive letter before the \\ character
*/
p_szCur = strchr( p_szCur, '\\');
if (*(p_szCur - 1) == ':')
p_szCur = strchr( p_szCur + 1, '\\');
/*
* create recursively each sub directory
*/
while (p_szCur != NULL)
{
*p_szCur = 0;
if ((!CreateDirectory (szLocalPath, NULL)) && (GetLastError() != ERROR_ALREADY_EXISTS) )
{
Error_fn_vSetFmt( Error_eCantCreateLocalPath, "Can't create local path %s", szLocalPath );
Error_fn_vDisplay( TRUE );
return FALSE;
}
*p_szCur++ = '\\';
p_szCur = strchr( p_szCur, '\\');
};
if ((!CreateDirectory (szLocalPath, NULL)) && (GetLastError() != ERROR_ALREADY_EXISTS) )
{
Error_fn_vSetFmt( Error_eCantCreateLocalPath, "Can't create local path %s", szLocalPath );
Error_fn_vDisplay( TRUE );
return FALSE;
}
}
if (bFile)
*p_cSeparation = '\\';
return OLE_fn_bGetFile( szVssName, szLocalPath, iFlags, bFile, _bObtain );
}
/*
----------------------------------------------------------------------------------------
update a file
----------------------------------------------------------------------------------------
*/
char fn_cUpdateFile( char *_szLocalFileName )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char szVssPath[MAX_PATH];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
sprintf( szVssPath, "%s%s", g_stIniData.szVssPath, _szLocalFileName+ strlen( g_stIniData.szLocalPath ) );
return OLE_fn_cUpdateFile( szVssPath, _szLocalFileName );
}