BOOL C4UpdatePackage::DoUpdate(C4Group *pGrpFrom, C4GroupEx *pGrpTo, const char *strFileName) { // group file? C4Group ItemGroupFrom; if (ItemGroupFrom.OpenAsChild(pGrpFrom, strFileName)) { // try to open target group C4GroupEx ItemGroupTo; char strTempGroup[_MAX_PATH + 1]; strTempGroup[0] = 0; if (!ItemGroupTo.OpenAsChild(pGrpTo, strFileName)) { // create (emtpy) temp dir // SCopy(GetCfg()->AtExePath("~tmp"), strTempGroup, //_MAX_PATH); MakeTempFilename(strTempGroup); // open/create it if (!ItemGroupTo.Open(strTempGroup, TRUE)) return FALSE; } // update children char ItemFileName[_MAX_PATH]; ItemGroupFrom.ResetSearch(); while (ItemGroupFrom.FindNextEntry("*", ItemFileName)) if (!SEqual(ItemFileName, C4CFN_UpdateCore) && !SEqual(ItemFileName, C4CFN_UpdateEntries)) DoUpdate(&ItemGroupFrom, &ItemGroupTo, ItemFileName); // set maker (always) ItemGroupTo.SetMaker(ItemGroupFrom.GetMaker()); if (GrpUpdate) { DoGrpUpdate(&ItemGroupFrom, &ItemGroupTo); // write group (do not change any headers set by DoGrpUpdate!) ItemGroupTo.Close(FALSE); // temporary group? if (strTempGroup[0]) if (!pGrpTo->Move(strTempGroup, strFileName)) return FALSE; // set core (C4Group::Save overwrites it) pGrpTo->SaveEntryCore(*pGrpFrom, strFileName); pGrpTo->SetSavedEntryCore(strFileName); // flag as no-resort pGrpTo->SetNoSort(strFileName); } else { // write group ItemGroupTo.Close(TRUE); // temporary group? if (strTempGroup[0]) if (!pGrpTo->Move(strTempGroup, strFileName)) return FALSE; } } else { char strMsg[1024]; sprintf(strMsg, "updating %s\\%s\n", pGrpTo->GetFullName().getData(), strFileName); #ifdef _MSC_VER OutputDebugString(strMsg); #elif _DEBUG puts(strMsg); #endif if (!C4Group_CopyEntry(pGrpFrom, pGrpTo, strFileName)) return FALSE; // set core pGrpTo->SaveEntryCore(*pGrpFrom, strFileName); pGrpTo->SetSavedEntryCore(strFileName); } // ok return TRUE; }