19 #include "C4Version.h"
34 char *pData;
size_t iSize;
37 if (!pTo->
Add(strItemName, pData,
iSize,
false,
true))
48 HANDLE ParentProcess = OpenProcess(SYNCHRONIZE, FALSE, ParentProcessID);
55 printf(
"Waiting for parent process to terminate...");
56 DWORD res = WaitForSingleObject(ParentProcess, 10000);
57 if(res == WAIT_TIMEOUT)
58 fprintf(stderr,
"Parent process did not terminate after 10 seconds. Continuing...");
68 if (Upd.
Load(&hGroup))
71 int iRes = Upd.
Check(&hGroup);
80 fprintf(stderr,
"Target %s for update %s not found. Ignoring.\n", Upd.
DestPath, Upd.
Name);
84 fprintf(stderr,
"Target %s incorrect version for update %s. Ignoring.\n", Upd.
DestPath, Upd.
Name);
88 fprintf(stderr,
"Target %s already up-to-date at %s.\n", Upd.
DestPath, Upd.
Name);
108 fprintf(stderr,
"Unknown error while updating.\n");
120 printf(
"Updating binaries...\n");
126 { strList += strEntry; strList +=
";"; }
134 printf(
"Exploding: %s\n", strEntry);
153 if (!ok)
return false;
188 intptr_t iGroup = (intptr_t) &rByGrp;
218 if (pEntry) pEntry->
NoSort =
true;
250 CompileFromBuf<StdCompilerINIRead>(
mkNamingAdapt(*
this,
"Update"), Source);
266 char *stupid_buffer =
new char[Core.
getLength() + 1];
289 CompileFromBuf<StdCompilerINIRead>(
mkNamingAdapt(*
this,
"Update"), Source);
309 char *p = strTarget, *lp = strTarget;
310 while ((p = strchr(p + 1,
'\\')))
313 if (!*(p + 1))
break;
316 if (TargetGrp.
Open(strTarget))
319 bool fPacked = TargetGrp.
IsPacked();
321 TargetGrp.
Close(
true);
334 *p =
'\\'; lp = p + 1;
367 DoUpdate(pGroup, &TargetGrp, ItemFileName);
374 TargetGrp.
Close(
false);
385 char *pData;
int iSize;
387 MyFile.
Create(
"DiesesDingIstMist.txt",
false);
403 if (!TargetGrp.
Open(strTarget))
409 TargetGrp.
Close(
false);
418 Optimize(pGroup, &TargetGrp, ItemFileName);
425 TargetGrp.
Close(
false);
476 if (ItemGroupFrom.
OpenAsChild(pGrpFrom, strFileName))
481 if (!ItemGroupTo.
OpenAsChild(pGrpTo, strFileName,
false,
true))
488 DoUpdate(&ItemGroupFrom, &ItemGroupTo, ItemFileName);
493 ItemGroupTo.
Close(
false);
503 ItemGroupTo.
Close(
true);
506 if (!pGrpTo->
Move(strTempGroup, strFileName))
514 #elif defined(_DEBUG)
542 char *pSep = strchr(strItemName2,
'=');
543 if (pSep) *pSep =
'\0';
545 if (
SEqual(strItemName, strItemName2))
552 char strSortList[32767] =
"";
556 char *pTime = strchr(strItemName,
'=');
557 if (pTime) *pTime =
'\0';
559 SAppend(strItemName, strSortList);
563 pGrpTo->
Sort(strSortList);
576 if (!ItemGroupFrom.
OpenAsChild(pGrpFrom, strFileName))
586 Optimize(&ItemGroupFrom, &ItemGroupTo, ItemFileName);
589 ItemGroupTo.
SetHead(ItemGroupFrom);
591 ItemGroupTo.
Close(
false);
603 char *pData;
int iSize;
605 MyFile.
Create(
"SoIstRichtig.txt",
false);
609 MyFile.
Create(
"UndSoAuch.txt",
false);
619 WriteLog(
"Source: %s\nTarget: %s\nOutput: %s\n\n", strFile1, strFile2, strUpdateFile);
623 if (!Group1.
Open(strFile1)) {
WriteLog(
"Error: could not open %s!\n", strFile1);
return false; }
624 if (!Group2.
Open(strFile2)) {
WriteLog(
"Error: could not open %s!\n", strFile2);
return false; }
627 if (!Group1.
IsPacked()) {
WriteLog(
"Error: source group %s not packed!\n", strFile1);
return false; }
628 if (!Group2.
IsPacked()) {
WriteLog(
"Error: target group %s not packed!\n", strFile2);
return false; }
629 if (Group1.
HasPackedMother()) {
WriteLog(
"Error: source group %s must not have a packed mother group!\n", strFile1);
return false; }
630 if (Group2.
HasPackedMother()) {
WriteLog(
"Error: target group %s must not have a packed mother group!\n", strFile2);
return false; }
634 if (!UpGroup.
Open(strUpdateFile,
true)) {
WriteLog(
"Error: could not open %s!\n", strUpdateFile);
return false; }
651 {
WriteLog(
"Error: could not calc checksum for %s!\n", strFile1);
return false; }
653 {
WriteLog(
"Error: could not calc checksum for %s!\n", strFile2);
return false; }
659 {
WriteLog(
"Error: could not add to update package - target groups don't match (checksum error)\n");
return false; }
666 {
WriteLog(
"This update already supports the version of the source file.\n");
return false; }
673 {
WriteLog(
"Could not save update package core!\n");
return false; }
676 bool fModified =
false;
677 bool fSuccess =
MkUp(&Group1, &Group2, &UpGroup, &fModified);
679 UpGroup.
Close(
false);
683 WriteLog(
"Update package not created.\n");
688 WriteLog(
"Update package created.\n");
706 strItemName[0] = strItemName2[0] = 0;
708 int iChangedEntries = 0;
709 while (pGrp2->
FindNextEntry(
"*", strItemName,
nullptr, !! strItemName[0]))
717 if (!pGrp1->
FindNextEntry(
"*", strItemName2,
nullptr, !! strItemName2[0]))
719 else if (!
SEqual(strItemName, strItemName2))
731 if (!pGrp1 || !pChildGrp1->
OpenAsChild(pGrp1, strItemName))
732 {
delete pChildGrp1; pChildGrp1 =
nullptr; }
735 strTempGroupName[0] = 0;
742 if (!UpdGroup.
Open(strTempGroupName,
true)) {
delete pChildGrp1;
WriteLog(
"Error: could not create temp group\n");
return false; }
745 bool Modified =
false;
746 bool fSuccess =
MkUp(pChildGrp1, &ChildGrp2, &UpdGroup, &Modified);
750 UpdGroup.
Close(
false);
755 if (fSuccess && Modified)
757 if (strTempGroupName[0])
758 if (!pUpGrp->
Move(strTempGroupName, strItemName))
760 WriteLog(
"Error: could not add modified group\n");
772 if (strTempGroupName[0])
774 {
WriteLog(
"Error: could not delete temporary directory\n");
return false; }
784 bool fCopied =
false;
796 WriteLog(
"Error: could not add changed entry to update group\n");
814 WriteLog(
"Error: could not save entry list!");
818 if (iChangedEntries > 0)
827 va_list arglist; va_start(arglist, strMsg);
829 vsprintf(strOutp, strMsg, arglist);
830 Log.
Write(strOutp, strlen(strOutp));
#define C4CFN_UpdateEntries
bool C4Group_ExplodeDirectory(const char *filename)
bool C4Group_UnpackDirectory(const char *filename)
const char ** C4Group_SortList
bool C4Group_IsGroup(const char *filename)
bool C4Group_ApplyUpdate(C4Group &hGroup, unsigned long ParentProcessID)
char C4Group_TempPath[_MAX_PATH_LEN]
bool C4Group_CopyEntry(C4Group *pFrom, C4Group *pTo, const char *strItemName)
void MemScramble(BYTE *, int)
#define C4UPD_CHK_NO_SOURCE
#define C4UPD_CHK_BAD_VERSION
#define C4UPD_CHK_ALREADY_UPDATED
#define C4UPD_CHK_BAD_SOURCE
bool GetFileCRC(const char *szFilename, uint32_t *pCRC32)
bool SEqual2(const char *szStr1, const char *szStr2)
bool SCopySegment(const char *szString, int iSegment, char *sTarget, char cSeparator, int iMaxL, bool fSkipWhitespace)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
bool SGetModule(const char *szList, int iIndex, char *sTarget, int iSize)
void SAppendChar(char cChar, char *szStr)
void SAppend(const char *szSource, char *szTarget, int iMaxL)
bool SEqual(const char *szStr1, const char *szStr2)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
#define toC4CStr(szString)
StdStrBuf FormatString(const char *szFmt,...)
bool EraseItem(const char *szItemName)
bool WildcardMatch(const char *szWildcard, const char *szString)
void MakeTempFilename(char *szFilename)
char * GetFilename(char *szPath)
bool CreatePath(const std::string &path)
void SetSavedEntryCore(const char *szEntry)
void SetNoSort(const char *szEntry)
void SetHead(C4Group &rByGrp)
void SaveEntryCore(C4Group &rByGrp, const char *szEntry)
C4GroupEntryCore SavedCore
bool HeadIdentical(C4Group &rByGrp, bool fLax)
bool Close(bool fHeaderUpdate)
bool FindNextEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr, bool start_at_filename=false)
bool DeleteEntry(const char *filename, bool do_recycle=false)
bool HasPackedMother() const
size_t EntrySize(const char *wildcard=nullptr)
bool Extract(const char *files, const char *destination=nullptr, const char *exclude=nullptr)
const char * GetName() const
int EntryCount(const char *wildcard=nullptr)
StdStrBuf GetFullName() const
bool Add(const char *filename, const char *entry_name)
unsigned int EntryCRC32(const char *wildcard=nullptr)
bool LoadEntry(const char *entry_name, char **buffer, size_t *size_info=nullptr, int zeros_to_append=0)
bool OpenAsChild(C4Group *mother, const char *entry_name, bool is_exclusive=false, bool do_create=false)
C4GroupEntry * GetEntry(const char *entry_name)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
bool Sort(const char *list)
void ResetSearch(bool reload_contents=false)
bool Move(const char *filename, const char *entry_name)
bool SortByList(const char **list, const char *filename=nullptr)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
bool Open(const char *group_name, bool do_create=false)
int32_t RequireVersion[4]
bool Load(C4Group &hGroup)
bool Save(C4Group &hGroup)
char DestPath[_MAX_PATH_LEN]
void CompileFunc(StdCompiler *pComp)
uint32_t GrpChks1[C4UP_MaxUpGrpCnt]
int Check(C4Group *pGroup)
bool Load(C4Group *pGroup)
bool DoUpdate(C4Group *pGrpFrom, class C4GroupEx *pGrpTo, const char *strFileName)
bool MakeUpdate(const char *strFile1, const char *strFile2, const char *strUpdateFile, const char *strName=nullptr)
static bool Optimize(C4Group *pGrpFrom, const char *strTarget)
bool Execute(C4Group *pGroup)
bool DoGrpUpdate(C4Group *pUpdateData, class C4GroupEx *pGrpTo)
bool MkUp(C4Group *pGrp1, C4Group *pGrp2, C4GroupEx *pUpGr, bool *fModified)
void WriteLog(const char *strMsg,...) GNUC_FORMAT_ATTRIBUTE_O
bool Close(StdBuf **ppMemory=nullptr)
bool Create(const char *szFileName, bool fCompressed=false, bool fExecutable=false, bool fMemory=false)
bool Write(const void *pBuffer, int iSize)
void Value(const T &rStruct)
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
const char * getData() const
void AppendChar(char cChar)