diff options
-rw-r--r-- | src/network/network_content.cpp | 83 | ||||
-rw-r--r-- | src/network/network_content.h | 3 |
2 files changed, 51 insertions, 35 deletions
diff --git a/src/network/network_content.cpp b/src/network/network_content.cpp index 64acd86e0..576d5ad30 100644 --- a/src/network/network_content.cpp +++ b/src/network/network_content.cpp @@ -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,34 +396,62 @@ 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 * @param sin the IP/port of the server diff --git a/src/network/network_content.h b/src/network/network_content.h index ea2df4e39..0be0a80cf 100644 --- a/src/network/network_content.h +++ b/src/network/network_content.h @@ -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; |