blob: 4fd081af966e22e9adaf389b6c70a64f4d3cd3f7 [file] [log] [blame]
/*
* Copyright 2008 Netallied Systems GmbH.
*
* Licensed under the MIT Open Source License, for details please see license.txt or the website
* http://www.opensource.org/licenses/mit-license.php
*
*/
#ifndef __DAE_ZAE_UNCOMPRESS_HANDLER_H__
#define __DAE_ZAE_UNCOMPRESS_HANDLER_H__
#include <unzip.h>
#include <libxml/xmlreader.h>
#include <dae/daeURI.h>
/**
* Takes an URI to a ZAE file and extracts it to a temporary directory.
* Use obtainRootFilePath() to accomplish this.
*
* The whole ZAE archive gets extracted because it is not specified
* how an URL pointing inside a ZAE archive should look like.
* By extracting the whole archive we can use the 'file' scheme.
*/
class DLLSPEC daeZAEUncompressHandler
{
private:
// zip file this object operates on.
unzFile mZipFile;
// URI th zip file this object operates on.
const daeURI& mZipFileURI;
// indicates if the passed URI is a valid zip file.
bool mValidZipFile;
// path to root file in archive this object handles.
std::string mRootFilePath;
// tmp dir where this archive is extracted.
std::string mTmpDir;
// disable copy c-tor and assignment operator.
daeZAEUncompressHandler(const daeZAEUncompressHandler& copy);
daeZAEUncompressHandler& operator=(const daeZAEUncompressHandler& copy);
public:
// Name of manifest file inside ZAE.
static const std::string MANIFEST_FILE_NAME;
// Root xml element inside manifest file.
static const std::string MANIFEST_FILE_ROOT_ELEMENT_NAME;
// Case insensitivity constant from minizip.
static const int CASE_INSENSITIVE;
// Buffer size for extracting files from zip archive.
static const int BUFFER_SIZE;
// Empty string to be returned in case of error.
static const std::string EMPTY_STRING;
/**
* C-Tor.
* @param zaeFile URI to the ZAE file to open.
*/
daeZAEUncompressHandler(const daeURI& zaeFile);
/**
* D-Tor.
*/
virtual ~daeZAEUncompressHandler();
/**
* Returns true if this object has been initialized
* with a zip file.
*/
bool isZipFile() {return mValidZipFile;}
/**
* Extracts ZAE file and returns resulting path to the root DAE file.
*/
const std::string& obtainRootFilePath();
/**
* Returns currently known path to root DAE of ZAE file.
* Only valid after obtainRootFilePath() has been called.
*/
const std::string& getRootFilePath() {return mRootFilePath;}
/**
* Returns used temp dir.
*/
const std::string& getTmpDir() {return mTmpDir;}
private:
/**
* Tries to open manifest.xml inside tmpDir. On success
* it parses the XML file to find URI of root DAE.
*/
bool retrieveRootURIFromManifest(const std::string& tmpDir);
/**
* Iterates over zip archive and extracts each file.
*/
bool extractArchive(unzFile zipFile, const std::string& destDir);
/**
* Extracts the current file inside zip archive.
*/
bool extractFile(unzFile zipFile, const std::string& destDir);
/**
* Finds <dae_root> element in manifest.xml. Used by retrieveRootURIFromManifest().
*/
bool findManifestRootElement(xmlTextReaderPtr xmlReader);
/**
* Checks if an extracted file is a zip archive itself and extracts it.
*/
bool checkAndExtractInternalArchive(const std::string& filePath);
};
#endif //__DAE_ZAE_UNCOMPRESS_HANDLER_H__