mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-06-26 15:09:59 +01:00
(svn r18992) -Codechange: move the file opening/closing out of the content download function
This commit is contained in:
parent
589aee0cee
commit
e437362c7b
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 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
|
||||
|
@ -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…
Reference in New Issue
Block a user