Пример #1
0
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;
}