(svn r18992) -Codechange: move the file opening/closing out of the content download function

pull/155/head
rubidium 15 years ago
parent 6a4726020f
commit b795af486d

@ -369,6 +369,7 @@ exit:
DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_CONTENT)
{
if (this->curFile == NULL) {
delete this->curInfo;
/* When we haven't opened a file this must be our first packet with metadata. */
this->curInfo = new ContentInfo;
this->curInfo->type = (ContentType)p->Recv_uint8();
@ -376,26 +377,10 @@ DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_CONTENT)
this->curInfo->filesize = p->Recv_uint32();
p->Recv_string(this->curInfo->filename, lengthof(this->curInfo->filename));
if (!this->curInfo->IsValid()) {
delete this->curInfo;
this->curInfo = NULL;
if (!this->BeforeDownload()) {
this->Close();
return false;
}
if (this->curInfo->filesize != 0) {
/* The filesize is > 0, so we are going to download it */
const char *filename = GetFullFilename(this->curInfo, true);
if (filename == NULL) {
/* Unless that fails ofcourse... */
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, 0, 0);
this->Close();
return false;
}
this->curFile = fopen(filename, "wb");
}
} else {
/* We have a file opened, thus are downloading internal content */
size_t toRead = (size_t)(p->size - p->pos);
@ -411,33 +396,61 @@ DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_CONTENT)
this->OnDownloadProgress(this->curInfo, (uint)toRead);
if (toRead == 0) {
/* We read nothing; that's our marker for end-of-stream.
* Now gunzip the tar and make it known. */
fclose(this->curFile);
this->curFile = NULL;
if (GunzipFile(this->curInfo)) {
unlink(GetFullFilename(this->curInfo, true));
TarListAddFile(GetFullFilename(this->curInfo, false));
this->OnDownloadComplete(this->curInfo->id);
} else {
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_EXTRACT, INVALID_STRING_ID, 0, 0);
}
}
if (toRead == 0) this->AfterDownload();
}
/* We ended this file, so clean up the mess */
if (this->curFile == NULL) {
return true;
}
/**
* Handle the opening of the file before downloading.
* @return false on any error.
*/
bool ClientNetworkContentSocketHandler::BeforeDownload()
{
if (!this->curInfo->IsValid()) {
delete this->curInfo;
this->curInfo = NULL;
return false;
}
if (this->curInfo->filesize != 0) {
/* The filesize is > 0, so we are going to download it */
const char *filename = GetFullFilename(this->curInfo, true);
if (filename == NULL) {
/* Unless that fails ofcourse... */
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD_FILE_NOT_WRITABLE, STR_CONTENT_ERROR_COULD_NOT_DOWNLOAD, 0, 0);
return false;
}
this->curFile = fopen(filename, "wb");
}
return true;
}
/**
* Handle the closing and extracting of a file after
* downloading it has been done.
*/
void ClientNetworkContentSocketHandler::AfterDownload()
{
/* We read nothing; that's our marker for end-of-stream.
* Now gunzip the tar and make it known. */
fclose(this->curFile);
this->curFile = NULL;
if (GunzipFile(this->curInfo)) {
unlink(GetFullFilename(this->curInfo, true));
TarListAddFile(GetFullFilename(this->curInfo, false));
this->OnDownloadComplete(this->curInfo->id);
} else {
ShowErrorMessage(STR_CONTENT_ERROR_COULD_NOT_EXTRACT, INVALID_STRING_ID, 0, 0);
}
}
/**
* Create a socket handler with the given socket and (server) address.
* @param s the socket to communicate over

@ -88,6 +88,9 @@ protected:
void OnReceiveContentInfo(const ContentInfo *ci);
void OnDownloadProgress(const ContentInfo *ci, uint bytes);
void OnDownloadComplete(ContentID cid);
bool BeforeDownload();
void AfterDownload();
public:
/** The idle timeout; when to close the connection because it's idle. */
static const int IDLE_TIMEOUT = 60 * 1000;

Loading…
Cancel
Save