changeset 14435:b7d4b37e625b draft

(svn r18992) -Codechange: move the file opening/closing out of the content download function
author rubidium <rubidium@openttd.org>
date Wed, 03 Feb 2010 17:15:35 +0000
parents f5a4807b200c
children ce2db37fe0f4
files src/network/network_content.cpp src/network/network_content.h
diffstat 2 files changed, 55 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/src/network/network_content.cpp
+++ b/src/network/network_content.cpp
@@ -369,6 +369,7 @@
 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 @@
 		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 @@
 
 		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);
-			}
-		}
-	}
-
-	/* We ended this file, so clean up the mess */
-	if (this->curFile == NULL) {
-		delete this->curInfo;
-		this->curInfo = NULL;
+		if (toRead == 0) this->AfterDownload();
 	}
 
 	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
--- a/src/network/network_content.h
+++ b/src/network/network_content.h
@@ -88,6 +88,9 @@
 	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;