1.1 --- a/extensions/updater/Updater.cpp Tue Feb 17 14:03:20 2009 -0500
1.2 +++ b/extensions/updater/Updater.cpp Tue Feb 17 15:59:51 2009 -0500
1.3 @@ -43,7 +43,7 @@
1.4
1.5 using namespace SourceMod;
1.6
1.7 -UpdateReader::UpdateReader()
1.8 +UpdateReader::UpdateReader() : partFirst(NULL), partLast(NULL)
1.9 {
1.10 }
1.11
1.12 @@ -174,6 +174,21 @@
1.13 return SMCResult_Continue;
1.14 }
1.15
1.16 +void UpdateReader::LinkPart(UpdatePart *part)
1.17 +{
1.18 + part->next = NULL;
1.19 + if (partFirst == NULL)
1.20 + {
1.21 + partFirst = part;
1.22 + partLast = part;
1.23 + }
1.24 + else
1.25 + {
1.26 + partLast->next = part;
1.27 + partLast = part;
1.28 + }
1.29 +}
1.30 +
1.31 void UpdateReader::HandleFile()
1.32 {
1.33 MD5 md5;
1.34 @@ -192,6 +207,12 @@
1.35 md5.finalize();
1.36 md5.hex_digest(real_checksum);
1.37
1.38 + if (mdl.GetSize() == 0)
1.39 + {
1.40 + AddUpdateError("Zero-length file returned for \"%s\"", curfile.c_str());
1.41 + return;
1.42 + }
1.43 +
1.44 if (strcasecmp(checksum, real_checksum) != 0)
1.45 {
1.46 AddUpdateError("Checksums for file \"%s\" do not match:", curfile.c_str());
1.47 @@ -199,45 +220,20 @@
1.48 return;
1.49 }
1.50
1.51 - char path[PLATFORM_MAX_PATH];
1.52 - smutils->BuildPath(Path_SM, path, sizeof(path), "gamedata/%s", curfile.c_str());
1.53 -
1.54 - gameconfs->AcquireLock();
1.55 -
1.56 - FILE *fp = fopen(path, "wt");
1.57 - if (fp == NULL)
1.58 - {
1.59 - gameconfs->ReleaseLock();
1.60 - AddUpdateError("Could not open %s for writing", path);
1.61 - return;
1.62 - }
1.63 -
1.64 - fwrite(mdl.GetBuffer(), 1, mdl.GetSize(), fp);
1.65 - fclose(fp);
1.66 -
1.67 - gameconfs->ReleaseLock();
1.68 -
1.69 - AddUpdateMessage("Successfully updated gamedata file \"%s\"", curfile.c_str());
1.70 + UpdatePart *part = new UpdatePart;
1.71 + part->data = (char*)malloc(mdl.GetSize());
1.72 + part->file = strdup(curfile.c_str());
1.73 + part->length = mdl.GetSize();
1.74 + LinkPart(part);
1.75 }
1.76
1.77 void UpdateReader::HandleFolder(const char *folder)
1.78 {
1.79 - char path[PLATFORM_MAX_PATH];
1.80 -
1.81 - smutils->BuildPath(Path_SM, path, sizeof(path), "gamedata/%s", folder);
1.82 - if (libsys->IsPathDirectory(path))
1.83 - {
1.84 - return;
1.85 - }
1.86 -
1.87 - if (!libsys->CreateFolder(path))
1.88 - {
1.89 - AddUpdateError("Could not create folder: %s", path);
1.90 - }
1.91 - else
1.92 - {
1.93 - AddUpdateMessage("Created folder \"%s\" from updater", folder);
1.94 - }
1.95 + UpdatePart *part = new UpdatePart;
1.96 + part->data = NULL;
1.97 + part->length = 0;
1.98 + part->file = strdup(folder);
1.99 + LinkPart(part);
1.100 }
1.101
1.102 static bool md5_file(const char *file, char checksum[33])
1.103 @@ -381,3 +377,14 @@
1.104 delete xfer;
1.105 delete form;
1.106 }
1.107 +
1.108 +UpdatePart *UpdateReader::DetachParts()
1.109 +{
1.110 + UpdatePart *first;
1.111 +
1.112 + first = partFirst;
1.113 + partFirst = NULL;
1.114 + partLast = NULL;
1.115 +
1.116 + return first;
1.117 +}