/* * 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 #include #include /** * 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 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__