Files
commandergenius/project/jni/application/enigma/src/file_zip.cpp
2010-10-13 17:30:44 +03:00

82 lines
2.6 KiB
C++

/*
* Copyright (C) 2006 Ronald Lamprecht
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// Whoever knows how to integrate this code into file.cc should do it!
// The problem to solve is the clashing macro definitions in "zipios-config.h"
// and "config.h"
// The static var "zip" should be a private ivar of GameFS
#include "file.hh"
#include "zipios++/zipfile.h"
#include "zipios++/zipoutputstream.h"
#include "zipios++/zipoutputstreambuf.h"
#include "zipios++/zipinputstreambuf.h"
#include <istream>
#include <ostream>
#include <ctime>
using namespace enigma;
using namespace std;
using namespace zipios;
static std::auto_ptr<zipios::ZipFile> zip;
static std::string lastZipPath;
bool enigma::findInZip(std::string zipPath, std::string zippedFilename1,
std::string zippedFilename2, string &dest,
std::auto_ptr<std::istream> &isresult) {
// reuse last opened zip if possible
if (lastZipPath != zipPath) {
zip.reset (new zipios::ZipFile (zipPath));
lastZipPath = zipPath;
}
std::auto_ptr<istream> isptr (zip->getInputStream (zippedFilename2));
if(isptr.get() != 0) {
isresult = isptr;
dest = zippedFilename2;
return true;
}
isptr.reset(zip->getInputStream (zippedFilename1));
if(isptr.get() != 0) {
isresult = isptr;
dest = zippedFilename1;
return true;
}
return false;
}
bool enigma::writeToZip(std::ostream &zipStream, std::string filename, unsigned size, std::istream &contents) {
ZipOutputStreambuf zos(zipStream.rdbuf());
ZipCDirEntry ze(filename);
ze.setSize(size);
ze.setTime(time(NULL)); // seems not to be implemented in zipios !
zos.putNextEntry(ze);
std::ostream ozs( &zos );
ozs << contents.rdbuf();
return true;
}
bool enigma::readFromZipStream(std::istream &zipFile, std::ostream &contents) {
ZipInputStreambuf zis(zipFile.rdbuf());
std::istream is( &zis );
contents << is.rdbuf();
return true;
}