mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-06 01:21:55 +00:00
- only use standard types in WriteZip's API.
This commit is contained in:
parent
825f92b274
commit
2671394961
5 changed files with 22 additions and 19 deletions
src
|
@ -747,6 +747,7 @@ FCompressedBuffer FSerializer::GetCompressedOutput()
|
||||||
FCompressedBuffer buff;
|
FCompressedBuffer buff;
|
||||||
WriteObjects();
|
WriteObjects();
|
||||||
EndObject();
|
EndObject();
|
||||||
|
buff.filename = nullptr;
|
||||||
buff.mSize = (unsigned)w->mOutString.GetSize();
|
buff.mSize = (unsigned)w->mOutString.GetSize();
|
||||||
buff.mZipFlags = 0;
|
buff.mZipFlags = 0;
|
||||||
buff.mCRC32 = crc32(0, (const Bytef*)w->mOutString.GetString(), buff.mSize);
|
buff.mCRC32 = crc32(0, (const Bytef*)w->mOutString.GetString(), buff.mSize);
|
||||||
|
|
|
@ -593,7 +593,7 @@ static std::pair<uint16_t, uint16_t> time_to_dos(struct tm *time)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int AppendToZip(FileWriter *zip_file, const char *filename, FCompressedBuffer &content, std::pair<uint16_t, uint16_t> &dostime)
|
static int AppendToZip(FileWriter *zip_file, const FCompressedBuffer &content, std::pair<uint16_t, uint16_t> &dostime)
|
||||||
{
|
{
|
||||||
FZipLocalFileHeader local;
|
FZipLocalFileHeader local;
|
||||||
int position;
|
int position;
|
||||||
|
@ -608,7 +608,7 @@ int AppendToZip(FileWriter *zip_file, const char *filename, FCompressedBuffer &c
|
||||||
local.CRC32 = content.mCRC32;
|
local.CRC32 = content.mCRC32;
|
||||||
local.UncompressedSize = LittleLong(content.mSize);
|
local.UncompressedSize = LittleLong(content.mSize);
|
||||||
local.CompressedSize = LittleLong(content.mCompressedSize);
|
local.CompressedSize = LittleLong(content.mCompressedSize);
|
||||||
local.NameLength = LittleShort((unsigned short)strlen(filename));
|
local.NameLength = LittleShort((unsigned short)strlen(content.filename));
|
||||||
local.ExtraLength = 0;
|
local.ExtraLength = 0;
|
||||||
|
|
||||||
// Fill in local directory header.
|
// Fill in local directory header.
|
||||||
|
@ -617,7 +617,7 @@ int AppendToZip(FileWriter *zip_file, const char *filename, FCompressedBuffer &c
|
||||||
|
|
||||||
// Write out the header, file name, and file data.
|
// Write out the header, file name, and file data.
|
||||||
if (zip_file->Write(&local, sizeof(local)) != sizeof(local) ||
|
if (zip_file->Write(&local, sizeof(local)) != sizeof(local) ||
|
||||||
zip_file->Write(filename, strlen(filename)) != strlen(filename) ||
|
zip_file->Write(content.filename, strlen(content.filename)) != strlen(content.filename) ||
|
||||||
zip_file->Write(content.mBuffer, content.mCompressedSize) != content.mCompressedSize)
|
zip_file->Write(content.mBuffer, content.mCompressedSize) != content.mCompressedSize)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -634,7 +634,7 @@ int AppendToZip(FileWriter *zip_file, const char *filename, FCompressedBuffer &c
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int AppendCentralDirectory(FileWriter *zip_file, const char *filename, FCompressedBuffer &content, std::pair<uint16_t, uint16_t> &dostime, int position)
|
int AppendCentralDirectory(FileWriter *zip_file, const FCompressedBuffer &content, std::pair<uint16_t, uint16_t> &dostime, int position)
|
||||||
{
|
{
|
||||||
FZipCentralDirectoryInfo dir;
|
FZipCentralDirectoryInfo dir;
|
||||||
|
|
||||||
|
@ -650,23 +650,23 @@ int AppendCentralDirectory(FileWriter *zip_file, const char *filename, FCompress
|
||||||
dir.CRC32 = content.mCRC32;
|
dir.CRC32 = content.mCRC32;
|
||||||
dir.CompressedSize32 = LittleLong(content.mCompressedSize);
|
dir.CompressedSize32 = LittleLong(content.mCompressedSize);
|
||||||
dir.UncompressedSize32 = LittleLong(content.mSize);
|
dir.UncompressedSize32 = LittleLong(content.mSize);
|
||||||
dir.NameLength = LittleShort((unsigned short)strlen(filename));
|
dir.NameLength = LittleShort((unsigned short)strlen(content.filename));
|
||||||
dir.ExtraLength = 0;
|
dir.ExtraLength = 0;
|
||||||
dir.CommentLength = 0;
|
dir.CommentLength = 0;
|
||||||
dir.StartingDiskNumber = 0;
|
dir.StartingDiskNumber = 0;
|
||||||
dir.InternalAttributes = 0;
|
dir.InternalAttributes = 0;
|
||||||
dir.ExternalAttributes = 0;
|
dir.ExternalAttributes = 0;
|
||||||
dir.LocalHeaderOffset32 = LittleLong(position);
|
dir.LocalHeaderOffset32 = LittleLong((unsigned)position);
|
||||||
|
|
||||||
if (zip_file->Write(&dir, sizeof(dir)) != sizeof(dir) ||
|
if (zip_file->Write(&dir, sizeof(dir)) != sizeof(dir) ||
|
||||||
zip_file->Write(filename, strlen(filename)) != strlen(filename))
|
zip_file->Write(content.filename, strlen(content.filename)) != strlen(content.filename))
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompressedBuffer> &content)
|
bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t contentcount)
|
||||||
{
|
{
|
||||||
// try to determine local time
|
// try to determine local time
|
||||||
struct tm *ltime;
|
struct tm *ltime;
|
||||||
|
@ -677,14 +677,12 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
|
||||||
|
|
||||||
TArray<int> positions;
|
TArray<int> positions;
|
||||||
|
|
||||||
if (filenames.Size() != content.Size()) return false;
|
|
||||||
|
|
||||||
auto f = FileWriter::Open(filename);
|
auto f = FileWriter::Open(filename);
|
||||||
if (f != nullptr)
|
if (f != nullptr)
|
||||||
{
|
{
|
||||||
for (unsigned i = 0; i < filenames.Size(); i++)
|
for (size_t i = 0; i < contentcount; i++)
|
||||||
{
|
{
|
||||||
int pos = AppendToZip(f, filenames[i], content[i], dostime);
|
int pos = AppendToZip(f, content[i], dostime);
|
||||||
if (pos == -1)
|
if (pos == -1)
|
||||||
{
|
{
|
||||||
delete f;
|
delete f;
|
||||||
|
@ -695,9 +693,9 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
|
||||||
}
|
}
|
||||||
|
|
||||||
int dirofs = (int)f->Tell();
|
int dirofs = (int)f->Tell();
|
||||||
for (unsigned i = 0; i < filenames.Size(); i++)
|
for (size_t i = 0; i < contentcount; i++)
|
||||||
{
|
{
|
||||||
if (AppendCentralDirectory(f, filenames[i], content[i], dostime, positions[i]) < 0)
|
if (AppendCentralDirectory(f, content[i], dostime, positions[i]) < 0)
|
||||||
{
|
{
|
||||||
delete f;
|
delete f;
|
||||||
remove(filename);
|
remove(filename);
|
||||||
|
@ -710,8 +708,8 @@ bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompress
|
||||||
dirend.Magic = ZIP_ENDOFDIR;
|
dirend.Magic = ZIP_ENDOFDIR;
|
||||||
dirend.DiskNumber = 0;
|
dirend.DiskNumber = 0;
|
||||||
dirend.FirstDisk = 0;
|
dirend.FirstDisk = 0;
|
||||||
dirend.NumEntriesOnAllDisks = dirend.NumEntries = LittleShort((uint16_t)filenames.Size());
|
dirend.NumEntriesOnAllDisks = dirend.NumEntries = LittleShort((uint16_t)contentcount);
|
||||||
dirend.DirectoryOffset = LittleLong(dirofs);
|
dirend.DirectoryOffset = LittleLong((unsigned)dirofs);
|
||||||
dirend.DirectorySize = LittleLong((uint32_t)(f->Tell() - dirofs));
|
dirend.DirectorySize = LittleLong((uint32_t)(f->Tell() - dirofs));
|
||||||
dirend.ZipCommentLength = 0;
|
dirend.ZipCommentLength = 0;
|
||||||
if (f->Write(&dirend, sizeof(dirend)) != sizeof(dirend))
|
if (f->Write(&dirend, sizeof(dirend)) != sizeof(dirend))
|
||||||
|
|
|
@ -19,7 +19,9 @@ struct FileListEntry
|
||||||
|
|
||||||
using FileList = std::vector<FileListEntry>;
|
using FileList = std::vector<FileListEntry>;
|
||||||
|
|
||||||
|
struct FCompressedBuffer;
|
||||||
bool ScanDirectory(std::vector<FileListEntry>& list, const char* dirpath, const char* match, bool nosubdir = false, bool readhidden = false);
|
bool ScanDirectory(std::vector<FileListEntry>& list, const char* dirpath, const char* match, bool nosubdir = false, bool readhidden = false);
|
||||||
|
bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t contentcount);
|
||||||
|
|
||||||
inline void FixPathSeparator(char* path)
|
inline void FixPathSeparator(char* path)
|
||||||
{
|
{
|
||||||
|
|
|
@ -91,6 +91,7 @@ struct FCompressedBuffer
|
||||||
int mZipFlags;
|
int mZipFlags;
|
||||||
unsigned mCRC32;
|
unsigned mCRC32;
|
||||||
char *mBuffer;
|
char *mBuffer;
|
||||||
|
const char* filename;
|
||||||
|
|
||||||
bool Decompress(char *destbuffer);
|
bool Decompress(char *destbuffer);
|
||||||
void Clean()
|
void Clean()
|
||||||
|
|
|
@ -90,6 +90,7 @@
|
||||||
#include "doommenu.h"
|
#include "doommenu.h"
|
||||||
#include "screenjob.h"
|
#include "screenjob.h"
|
||||||
#include "i_interface.h"
|
#include "i_interface.h"
|
||||||
|
#include "fs_findfile.h"
|
||||||
|
|
||||||
|
|
||||||
static FRandom pr_dmspawn ("DMSpawn");
|
static FRandom pr_dmspawn ("DMSpawn");
|
||||||
|
@ -111,7 +112,6 @@ void G_DoAutoSave ();
|
||||||
void G_DoQuickSave ();
|
void G_DoQuickSave ();
|
||||||
|
|
||||||
void STAT_Serialize(FSerializer &file);
|
void STAT_Serialize(FSerializer &file);
|
||||||
bool WriteZip(const char *filename, TArray<FString> &filenames, TArray<FCompressedBuffer> &content);
|
|
||||||
|
|
||||||
CVARD_NAMED(Int, gameskill, skill, 2, CVAR_SERVERINFO|CVAR_LATCH, "sets the skill for the next newly started game")
|
CVARD_NAMED(Int, gameskill, skill, 2, CVAR_SERVERINFO|CVAR_LATCH, "sets the skill for the next newly started game")
|
||||||
CVAR(Bool, save_formatted, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // use formatted JSON for saves (more readable but a larger files and a bit slower.
|
CVAR(Bool, save_formatted, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // use formatted JSON for saves (more readable but a larger files and a bit slower.
|
||||||
|
@ -2416,13 +2416,14 @@ void G_DoSaveGame (bool okForQuicksave, bool forceQuicksave, FString filename, c
|
||||||
savegame_filenames.Push("info.json");
|
savegame_filenames.Push("info.json");
|
||||||
savegame_content.Push(savegameglobals.GetCompressedOutput());
|
savegame_content.Push(savegameglobals.GetCompressedOutput());
|
||||||
savegame_filenames.Push("globals.json");
|
savegame_filenames.Push("globals.json");
|
||||||
|
|
||||||
G_WriteSnapshots (savegame_filenames, savegame_content);
|
G_WriteSnapshots (savegame_filenames, savegame_content);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < savegame_content.Size(); i++)
|
||||||
|
savegame_content[i].filename = savegame_filenames[i].GetChars();
|
||||||
|
|
||||||
bool succeeded = false;
|
bool succeeded = false;
|
||||||
|
|
||||||
if (WriteZip(filename, savegame_filenames, savegame_content))
|
if (WriteZip(filename, savegame_content.Data(), savegame_content.Size()))
|
||||||
{
|
{
|
||||||
// Check whether the file is ok by trying to open it.
|
// Check whether the file is ok by trying to open it.
|
||||||
FResourceFile *test = FResourceFile::OpenResourceFile(filename, true);
|
FResourceFile *test = FResourceFile::OpenResourceFile(filename, true);
|
||||||
|
|
Loading…
Reference in a new issue