tge/tools/zipCleanser/zipCleanser.cc
2017-04-17 06:17:10 -06:00

205 lines
5.0 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "engine/platform/platform.h"
#include "engine/platform/platformAssert.h"
#include "engine/dgl/gBitmap.h"
#include "engine/dgl/gPalette.h"
#include "engine/platform/event.h"
#include "engine/core/fileStream.h"
#include "tools/texmunge/svector.h"
#include "engine/sim/frameAllocator.h"
#include "engine/dgl/gTexManager.h"
#include "engine/console/console.h"
#include "engine/core/resManager.h"
#include "engine/core/zipAggregate.h"
//------------------------------------------------------------------------------
#include "engine/platform/gameInterface.h"
class ZipCleanserGame : public GameInterface
{
public:
S32 main(S32 argc, const char **argv);
} GameObject;
// FOR SILLY LINK DEPENDANCY
bool gEditingMission = false;
void GameHandleNotify(NetConnectionId, bool)
{
}
#if defined(TORQUE_DEBUG)
const char * const gProgramVersion = "0.1d";
#else
const char * const gProgramVersion = "0.1r";
#endif
//------------------------------------------------------------------------------
static bool initLibraries()
{
// asserts should be created FIRST
PlatformAssert::create();
FrameAllocator::init(2 << 20);
_StringTable::create();
// Register known file types here
ResManager::create();
ResourceManager->registerExtension(".png", constructBitmapPNG);
Con::init();
Math::init();
Platform::init(); // platform specific initialization
return(true);
}
//------------------------------------------------------------------------------
static void shutdownLibraries()
{
// shut down
Platform::shutdown();
Con::shutdown();
ResManager::destroy();
_StringTable::destroy();
FrameAllocator::destroy();
// asserts should be destroyed LAST
PlatformAssert::destroy();
}
bool cleanseMem(U8* mem, U32 size)
{
U32 currPos = 0;
while (currPos < size)
{
U32 sig = *((U32*)&mem[currPos]);
if (sig == 0x04034b50)
{
// Local file header
// bitflag located at offset 6
// file name length located at offset 26
// extra field length located at offset 28
U16 bitflag = *((U16*)&mem[currPos + 6]);
U32 compressedsize = *((U32*)&mem[currPos + 18]);
U16 filenamelength = *((U16*)&mem[currPos + 26]);
U16 extrafieldlength = *((U16*)&mem[currPos + 28]);
currPos += 30 + filenamelength;
dMemset(&mem[currPos], 0, extrafieldlength);
currPos += extrafieldlength;
currPos += compressedsize;
if (bitflag & 1 << 3)
{
// get past optional data descriptor
currPos += 24;
}
}
else if (sig == 0x02014b50)
{
U16 filenamelength = *((U16*)&mem[currPos + 28]);
U16 extrafieldlength = *((U16*)&mem[currPos + 30]);
U16 filecommentlength = *((U16*)&mem[currPos + 32]);
currPos += 46 + filenamelength;
dMemset(&mem[currPos], 0, extrafieldlength + filecommentlength);
currPos += extrafieldlength + filecommentlength;
}
else if (sig == 0x06054b50)
{
return true;
}
else if (sig == 0x05054b50)
{
U16 datalength = *((U16*)&mem[currPos + 4]);
currPos += 6 + datalength;
}
else
{
AssertFatal(false, avar("bad record!: %x", sig));
return false;
}
}
AssertFatal(false, "missing eocd record");
return false;
}
int ZipCleanserGame::main(S32 argc, const char** argv)
{
if(!initLibraries())
return 0;
// const char* argvfake[] = { "asdf", "test.vl2" };
// argc = 2;
// argv = argvfake;
// info
if(argc < 2)
{
dPrintf("\nZipCleanser - Torque zip cleaner-upper\n"
" Copyright (C) GarageGames.com, Inc.\n"
" Program version: %s\n"
" Brought to you by: Dave Moore\n"
" Built: %s at %s\n", gProgramVersion, __DATE__, __TIME__);
dPrintf("\n Usage: zipCleanser input.<zip|vl2|...>\n");
shutdownLibraries();
return 0;
}
FileStream frs;
if (frs.open(argv[1], FileStream::Read) == false)
{
dPrintf("Could not open: %s\n", argv[1]);
return 1;
}
U32 size = frs.getStreamSize();
U8* pMem = new U8[size];
frs.read(size, pMem);
frs.close();
if (cleanseMem(pMem, size) == false)
{
dPrintf("Couldn't cleanse %s, not a zipfile?\n", argv[1]);
return 1;
}
FileStream fws;
fws.open("tmp.tmp", FileStream::Write);
fws.write(size, pMem);
fws.close();
shutdownLibraries();
return 0;
}
void GameReactivate()
{
}
void GameDeactivate( bool )
{
}