int WorkUser(int firstTime) { int first=0; if(firstTime) { AddToStatus(STATUS_MESSAGE,TranslateT("Processing user data")); if(!SignatureValid(dbhdr.ofsUser,DBCONTACT_SIGNATURE)) { AddToStatus(STATUS_ERROR,TranslateT("User corrupted, this could cause major problems")); return ERROR_NO_MORE_ITEMS; } if(ReadSegment(dbhdr.ofsUser,&user,sizeof(DBContact))!=ERROR_SUCCESS) return ERROR_NO_MORE_ITEMS; if(user.ofsNext) { AddToStatus(STATUS_WARNING,TranslateT("More than one user contact: keeping only first")); user.ofsNext=0; } if((ofsUser=WriteSegment(WSOFS_END,&user,sizeof(DBContact)))==WS_ERROR) return ERROR_HANDLE_DISK_FULL; dbhdr.ofsUser=ofsUser; phase=0; first=1; } switch(phase) { int ret; case 0: ret=WorkSettingsChain(ofsUser,&user,first); if(ret==ERROR_NO_MORE_ITEMS) { phase++; first=1; } else if(ret) return ret; else break; case 1: ret=WorkEventChain(ofsUser,&user,first); if(ret==ERROR_NO_MORE_ITEMS) { if(WriteSegment(ofsUser,&user,sizeof(DBContact))==WS_ERROR) return ERROR_HANDLE_DISK_FULL; return ERROR_NO_MORE_ITEMS; } else if(ret) return ret; break; } return ERROR_SUCCESS; }
int CDb3Mmap::WorkContactChain(int firstTime) { int first = 0; int ret; if (firstTime) { cb->pfnAddLogMessage(STATUS_MESSAGE, TranslateT("Processing contact chain")); ofsDestPrevContact = 0; ofsThisContact = m_dbHeader.ofsFirstContact; contactCount = 0; m_dbHeader.ofsFirstContact = 0; phase = 0; } switch (phase) { case 0: if (ofsThisContact == 0) { LBL_FinishUp: if (contactCount != m_dbHeader.contactCount) cb->pfnAddLogMessage(STATUS_WARNING, TranslateT("Contact count marked wrongly: correcting")); m_dbHeader.contactCount = contactCount; return ERROR_NO_MORE_ITEMS; } if (!SignatureValid(ofsThisContact, DBCONTACT_SIGNATURE)) { cb->pfnAddLogMessage(STATUS_ERROR, TranslateT("Contact chain corrupted, further entries ignored")); goto LBL_FinishUp; } if (ReadSegment(ofsThisContact, &dbc, sizeof(dbc)) != ERROR_SUCCESS) goto LBL_FinishUp; ofsNextContact = dbc.ofsNext; dbc.ofsNext = 0; if (!cb->bCheckOnly) { if ((ofsDestThis = WriteSegment(WSOFS_END, &dbc, sizeof(dbc))) == WS_ERROR) return ERROR_HANDLE_DISK_FULL; if (ofsDestPrevContact) WriteSegment(ofsDestPrevContact + offsetof(DBContact, ofsNext), &ofsDestThis, sizeof(DWORD)); else m_dbHeader.ofsFirstContact = ofsDestThis; } else ofsDestThis = ofsThisContact; // needed in event chain worker contactCount++; phase++; first = 1; // fall thru case 1: ret = WorkSettingsChain(ofsDestThis, &dbc, first); if (ret == ERROR_NO_MORE_ITEMS) { phase++; first = 1; } else if (ret) return ret; else break; // fall thru case 2: ret = WorkEventChain(ofsDestThis, &dbc, first); if (ret == ERROR_NO_MORE_ITEMS) { phase++; first = 1; } else if (ret) return ret; else break; // fall thru case 3: if (WriteSegment(ofsDestThis, &dbc, sizeof(DBContact)) == WS_ERROR) return ERROR_HANDLE_DISK_FULL; ofsDestPrevContact = ofsDestThis; ofsThisContact = ofsNextContact; phase = 0; break; } return ERROR_SUCCESS; }
int WorkContactChain(int firstTime) { int first=0; if(firstTime) { AddToStatus(STATUS_MESSAGE,TranslateT("Processing contact chain")); ofsDestPrevContact=0; ofsThisContact=dbhdr.ofsFirstContact; contactCount=0; dbhdr.ofsFirstContact=0; phase=0; } switch(phase) { int ret; case 0: if(ofsThisContact==0) { FinishUp(); return ERROR_NO_MORE_ITEMS; } if(!SignatureValid(ofsThisContact,DBCONTACT_SIGNATURE)) { AddToStatus(STATUS_ERROR,TranslateT("Contact chain corrupted, further entries ignored")); FinishUp(); return ERROR_NO_MORE_ITEMS; } if(ReadSegment(ofsThisContact,&dbc,sizeof(dbc))!=ERROR_SUCCESS) { FinishUp(); return ERROR_NO_MORE_ITEMS; } ofsNextContact=dbc.ofsNext; dbc.ofsNext=0; if (!opts.bCheckOnly) { if((ofsDestThis=WriteSegment(WSOFS_END,&dbc,sizeof(dbc)))==WS_ERROR) return ERROR_HANDLE_DISK_FULL; if(ofsDestPrevContact) WriteSegment(ofsDestPrevContact+offsetof(DBContact,ofsNext),&ofsDestThis,sizeof(DWORD)); else dbhdr.ofsFirstContact=ofsDestThis; } else ofsDestThis = ofsThisContact; // needed in event chain worker contactCount++; phase++; first=1; //fall thru case 1: ret=WorkSettingsChain(ofsDestThis,&dbc,first); if(ret==ERROR_NO_MORE_ITEMS) { phase++; first=1; } else if(ret) return ret; else break; //fall thru case 2: ret=WorkEventChain(ofsDestThis,&dbc,first); if(ret==ERROR_NO_MORE_ITEMS) { phase++; first=1; } else if(ret) return ret; else break; //fall thru case 3: if(WriteSegment(ofsDestThis,&dbc,sizeof(DBContact))==WS_ERROR) return ERROR_HANDLE_DISK_FULL; ofsDestPrevContact=ofsDestThis; ofsThisContact=ofsNextContact; phase=0; break; } return ERROR_SUCCESS; }