123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /*
- * 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__
|