- use FileWriter for writing zip files (i.e. savegames.)

This commit is contained in:
Christoph Oelckers 2017-12-02 12:46:25 +01:00
parent 14af7818b8
commit e15b23f132

View file

@ -542,7 +542,7 @@ static void time_to_dos(struct tm *time, unsigned short *dosdate, unsigned short
// //
//========================================================================== //==========================================================================
int AppendToZip(FILE *zip_file, const char *filename, FCompressedBuffer &content, uint16_t date, uint16_t time) int AppendToZip(FileWriter *zip_file, const char *filename, FCompressedBuffer &content, uint16_t date, uint16_t time)
{ {
FZipLocalFileHeader local; FZipLocalFileHeader local;
int position; int position;
@ -562,12 +562,12 @@ int AppendToZip(FILE *zip_file, const char *filename, FCompressedBuffer &content
// Fill in local directory header. // Fill in local directory header.
position = (int)ftell(zip_file); position = (int)zip_file->Tell();
// Write out the header, file name, and file data. // Write out the header, file name, and file data.
if (fwrite(&local, sizeof(local), 1, zip_file) != 1 || if (zip_file->Write(&local, sizeof(local)) != sizeof(local) ||
fwrite(filename, strlen(filename), 1, zip_file) != 1 || zip_file->Write(filename, strlen(filename)) != strlen(filename) ||
fwrite(content.mBuffer, 1, content.mCompressedSize, zip_file) != content.mCompressedSize) zip_file->Write(content.mBuffer, content.mCompressedSize) != content.mCompressedSize)
{ {
return -1; return -1;
} }
@ -583,7 +583,7 @@ int AppendToZip(FILE *zip_file, const char *filename, FCompressedBuffer &content
// //
//========================================================================== //==========================================================================
int AppendCentralDirectory(FILE *zip_file, const char *filename, FCompressedBuffer &content, uint16_t date, uint16_t time, int position) int AppendCentralDirectory(FileWriter *zip_file, const char *filename, FCompressedBuffer &content, uint16_t date, uint16_t time, int position)
{ {
FZipCentralDirectoryInfo dir; FZipCentralDirectoryInfo dir;
@ -607,8 +607,8 @@ int AppendCentralDirectory(FILE *zip_file, const char *filename, FCompressedBuff
dir.ExternalAttributes = 0; dir.ExternalAttributes = 0;
dir.LocalHeaderOffset = LittleLong(position); dir.LocalHeaderOffset = LittleLong(position);
if (fwrite(&dir, sizeof(dir), 1, zip_file) != 1 || if (zip_file->Write(&dir, sizeof(dir)) != sizeof(dir) ||
fwrite(filename, strlen(filename), 1, zip_file) != 1) zip_file->Write(filename, strlen(filename)) != strlen(filename))
{ {
return -1; return -1;
} }
@ -629,7 +629,7 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
if (filenames.Size() != content.Size()) return false; if (filenames.Size() != content.Size()) return false;
FILE *f = fopen(filename, "wb"); auto f = FileWriter::Open(filename);
if (f != nullptr) if (f != nullptr)
{ {
for (unsigned i = 0; i < filenames.Size(); i++) for (unsigned i = 0; i < filenames.Size(); i++)
@ -637,19 +637,19 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
int pos = AppendToZip(f, filenames[i], content[i], mydate, mytime); int pos = AppendToZip(f, filenames[i], content[i], mydate, mytime);
if (pos == -1) if (pos == -1)
{ {
fclose(f); delete f;
remove(filename); remove(filename);
return false; return false;
} }
positions.Push(pos); positions.Push(pos);
} }
int dirofs = (int)ftell(f); int dirofs = (int)f->Tell();
for (unsigned i = 0; i < filenames.Size(); i++) for (unsigned i = 0; i < filenames.Size(); i++)
{ {
if (AppendCentralDirectory(f, filenames[i], content[i], mydate, mytime, positions[i]) < 0) if (AppendCentralDirectory(f, filenames[i], content[i], mydate, mytime, positions[i]) < 0)
{ {
fclose(f); delete f;
remove(filename); remove(filename);
return false; return false;
} }
@ -662,15 +662,15 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
dirend.FirstDisk = 0; dirend.FirstDisk = 0;
dirend.NumEntriesOnAllDisks = dirend.NumEntries = LittleShort(filenames.Size()); dirend.NumEntriesOnAllDisks = dirend.NumEntries = LittleShort(filenames.Size());
dirend.DirectoryOffset = LittleLong(dirofs); dirend.DirectoryOffset = LittleLong(dirofs);
dirend.DirectorySize = LittleLong(ftell(f) - dirofs); dirend.DirectorySize = LittleLong(f->Tell() - dirofs);
dirend.ZipCommentLength = 0; dirend.ZipCommentLength = 0;
if (fwrite(&dirend, sizeof(dirend), 1, f) != 1) if (f->Write(&dirend, sizeof(dirend)) != sizeof(dirend))
{ {
fclose(f); delete f;
remove(filename); remove(filename);
return false; return false;
} }
fclose(f); delete f;
return true; return true;
} }
return false; return false;