mirror of https://github.com/OpenTTD/OpenTTD
(svn r18992) -Codechange: move the file opening/closing out of the content download function
parent
589aee0cee
commit
e437362c7b
|
@ -369,6 +369,7 @@ exit:
|
||||||
DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_CONTENT)
|
DEF_CONTENT_RECEIVE_COMMAND(Client, PACKET_CONTENT_SERVER_CONTENT)
|
||||||
{
|
{
|
||||||
if (this->curFile == NULL) {
|
if (this->curFile == NULL) {
|
||||||
|
delete this->curInfo;
|
||||||
/* When we haven't opened a file this must be our first packet with metadata. */
|
/* When we haven't opened a file this must be our first packet with metadata. */
|
||||||
this->curInfo = new ContentInfo;
|
this->curInfo = new ContentInfo;
|
||||||
this->curInfo->type = (ContentType)p->Recv_uint8();
|
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();
|
this->curInfo->filesize = p->Recv_uint32();
|
||||||
p->Recv_string(this->curInfo->filename, lengthof(this->curInfo->filename));
|
p->Recv_string(this->curInfo->filename, lengthof(this->curInfo->filename));
|
||||||
|
|
||||||
if (!this->curInfo->IsValid()) {
|
if (!this->BeforeDownload()) {
|
||||||
delete this->curInfo;
|
|
||||||
this->curInfo = NULL;
|
|
||||||
this->Close();
|
this->Close();
|
||||||
return false;
|
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 {
|
} else {
|
||||||
/* We have a file opened, thus are downloading internal content */
|
/* We have a file opened, thus are downloading internal content */
|
||||||
size_t toRead = (size_t)(p->size - p->pos);
|
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);
|
this->OnDownloadProgress(this->curInfo, (uint)toRead);
|
||||||
|
|
||||||
if (toRead == 0) {
|
if (toRead == 0) this->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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We ended this file, so clean up the mess */
|
|
||||||
if (this->curFile == NULL) {
|
|
||||||
delete this->curInfo;
|
|
||||||
this->curInfo = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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.
|
* Create a socket handler with the given socket and (server) address.
|
||||||
* @param s the socket to communicate over
|
* @param s the socket to communicate over
|
||||||
|
|
|
@ -88,6 +88,9 @@ protected:
|
||||||
void OnReceiveContentInfo(const ContentInfo *ci);
|
void OnReceiveContentInfo(const ContentInfo *ci);
|
||||||
void OnDownloadProgress(const ContentInfo *ci, uint bytes);
|
void OnDownloadProgress(const ContentInfo *ci, uint bytes);
|
||||||
void OnDownloadComplete(ContentID cid);
|
void OnDownloadComplete(ContentID cid);
|
||||||
|
|
||||||
|
bool BeforeDownload();
|
||||||
|
void AfterDownload();
|
||||||
public:
|
public:
|
||||||
/** The idle timeout; when to close the connection because it's idle. */
|
/** The idle timeout; when to close the connection because it's idle. */
|
||||||
static const int IDLE_TIMEOUT = 60 * 1000;
|
static const int IDLE_TIMEOUT = 60 * 1000;
|
||||||
|
|
Loading…
Reference in New Issue