962 lines
27 KiB
C++
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 );
|
|
}
|