nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2008, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: #include "AssimpPCH.h" nuclear@0: nuclear@0: #ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER nuclear@0: nuclear@0: #include "Q3BSPZipArchive.h" nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: namespace Assimp nuclear@0: { nuclear@0: namespace Q3BSP nuclear@0: { nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Constructor. nuclear@0: Q3BSPZipArchive::Q3BSPZipArchive( const std::string& rFile ) : nuclear@0: m_ZipFileHandle( NULL ), nuclear@0: m_FileList(), nuclear@0: m_bDirty( true ) nuclear@0: { nuclear@0: if ( !rFile.empty() ) nuclear@0: { nuclear@0: m_ZipFileHandle = unzOpen( rFile.c_str() ); nuclear@0: if ( NULL != m_ZipFileHandle ) nuclear@0: { nuclear@0: mapArchive(); nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Destructor. nuclear@0: Q3BSPZipArchive::~Q3BSPZipArchive() nuclear@0: { nuclear@0: if ( NULL != m_ZipFileHandle ) nuclear@0: { nuclear@0: unzClose( m_ZipFileHandle ); nuclear@0: } nuclear@0: m_ZipFileHandle = NULL; nuclear@0: m_FileList.clear(); nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Returns true, if the archive is already open. nuclear@0: bool Q3BSPZipArchive::isOpen() const nuclear@0: { nuclear@0: return ( NULL != m_ZipFileHandle ); nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Returns true, if the filename is part of the archive. nuclear@0: bool Q3BSPZipArchive::Exists( const char* pFile ) const nuclear@0: { nuclear@0: ai_assert( NULL != pFile ); nuclear@0: if ( NULL == pFile ) nuclear@0: { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: std::string rFile( pFile ); nuclear@0: std::vector::const_iterator it = std::find( m_FileList.begin(), m_FileList.end(), rFile ); nuclear@0: if ( m_FileList.end() == it ) nuclear@0: { nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Returns the separator delimiter. nuclear@0: char Q3BSPZipArchive::getOsSeparator() const nuclear@0: { nuclear@0: return '/'; nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Opens a file, which is part of the archive. nuclear@0: IOStream *Q3BSPZipArchive::Open( const char* pFile, const char* /*pMode*/ ) nuclear@0: { nuclear@0: ai_assert( NULL != pFile ); nuclear@0: nuclear@0: std::string rItem( pFile ); nuclear@0: std::vector::iterator it = std::find( m_FileList.begin(), m_FileList.end(), rItem ); nuclear@0: if ( m_FileList.end() == it ) nuclear@0: return NULL; nuclear@0: nuclear@0: ZipFile *pZipFile = new ZipFile( *it, m_ZipFileHandle ); nuclear@0: m_ArchiveMap[ rItem ] = pZipFile; nuclear@0: nuclear@0: return pZipFile; nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Close a filestream. nuclear@0: void Q3BSPZipArchive::Close( IOStream *pFile ) nuclear@0: { nuclear@0: ai_assert( NULL != pFile ); nuclear@0: nuclear@0: std::map::iterator it; nuclear@0: for ( it = m_ArchiveMap.begin(); it != m_ArchiveMap.end(); ++it ) nuclear@0: { nuclear@0: if ( (*it).second == pFile ) nuclear@0: { nuclear@0: ZipFile *pZipFile = reinterpret_cast( (*it).second ); nuclear@0: delete pZipFile; nuclear@0: m_ArchiveMap.erase( it ); nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: } nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Returns the file-list of the archive. nuclear@0: void Q3BSPZipArchive::getFileList( std::vector &rFileList ) nuclear@0: { nuclear@0: rFileList = m_FileList; nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: // Maps the archive content. nuclear@0: bool Q3BSPZipArchive::mapArchive() nuclear@0: { nuclear@0: if ( NULL == m_ZipFileHandle ) nuclear@0: return false; nuclear@0: nuclear@0: if ( !m_bDirty ) nuclear@0: return true; nuclear@0: nuclear@0: if ( !m_FileList.empty() ) nuclear@0: m_FileList.resize( 0 ); nuclear@0: nuclear@0: // At first ensure file is already open nuclear@0: if ( UNZ_OK == unzGoToFirstFile( m_ZipFileHandle ) ) nuclear@0: { nuclear@0: char filename[ FileNameSize ]; nuclear@0: unzGetCurrentFileInfo( m_ZipFileHandle, NULL, filename, FileNameSize, NULL, 0, NULL, 0 ); nuclear@0: m_FileList.push_back( filename ); nuclear@0: unzCloseCurrentFile( m_ZipFileHandle ); nuclear@0: nuclear@0: // Loop over all files nuclear@0: while ( unzGoToNextFile( m_ZipFileHandle ) != UNZ_END_OF_LIST_OF_FILE ) nuclear@0: { nuclear@0: char filename[ FileNameSize ]; nuclear@0: unzGetCurrentFileInfo( m_ZipFileHandle, NULL, filename, FileNameSize, NULL, 0, NULL, 0 ); nuclear@0: m_FileList.push_back( filename ); nuclear@0: unzCloseCurrentFile( m_ZipFileHandle ); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: std::sort( m_FileList.begin(), m_FileList.end() ); nuclear@0: m_bDirty = false; nuclear@0: nuclear@0: return true; nuclear@0: } nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: nuclear@0: } // Namespace Q3BSP nuclear@0: } // Namespace Assimp nuclear@0: nuclear@0: #endif // ASSIMP_BUILD_NO_Q3BSP_IMPORTER