extensions/updater/Updater.cpp
changeset 2573 9e715ee7389e
parent 2562 af4b3f9a8168
child 2575 8d1896d809f1
     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 +}