diff options
author | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-04-07 09:58:16 +0000 |
---|---|---|
committer | Jens-Heiner Rechtien <hr@openoffice.org> | 2004-04-07 09:58:16 +0000 |
commit | 55e55fd860fff7d15388c60213e8e4d8f2fe6578 (patch) | |
tree | 7cd0002bed9cf8c00e9ad26a69d8b91e6d5a3488 /shell/source/all/zipfile/zipfile.cxx | |
parent | INTEGRATION: CWS desktintgr01 (1.1.2); FILE ADDED (diff) | |
download | core-55e55fd860fff7d15388c60213e8e4d8f2fe6578.tar.gz core-55e55fd860fff7d15388c60213e8e4d8f2fe6578.zip |
INTEGRATION: CWS desktintgr01 (1.1.2); FILE ADDED
2004/02/26 13:30:11 deuce 1.1.2.1: Issue number: 97686, 115531, 108219 restructure shxthdl module
Submitted by: Gorden Lin/gorden.lin@sun.com
Reviewed by: Tino Rachui/tino.rachui@sun.com
Diffstat (limited to 'shell/source/all/zipfile/zipfile.cxx')
-rw-r--r-- | shell/source/all/zipfile/zipfile.cxx | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/shell/source/all/zipfile/zipfile.cxx b/shell/source/all/zipfile/zipfile.cxx new file mode 100644 index 000000000000..f327611b394d --- /dev/null +++ b/shell/source/all/zipfile/zipfile.cxx @@ -0,0 +1,242 @@ +/************************************************************************* + * + * $RCSfile: zipfile.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: hr $ $Date: 2004-04-07 10:58:16 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef ZIPEXCPTN_HXX_INCLUDED +#include "zipexcptn.hxx" +#endif + +#ifndef ZIPFILE_HXX_INCLUDED +#include "internal/zipfile.hxx" +#endif + +#ifndef GLOBAL_HXX_INCLUDED +#include "internal/global.hxx" +#endif + +#include <malloc.h> +#include <algorithm> + +/** Checks whether a file is a zip file or not + + @precond The given parameter must be a string with length > 0 + The file must exist + The file must be readable for the current user + + @returns true if the file is a zip file + false if the file is not a zip file + + @throws ParameterException if the given file name is empty + IOException if the specified file doesn't exist + AccessViolationException if read access to the file is denied +*/ +bool ZipFile::IsZipFile(const std::string& FileName) +{ + return true; +} + +/** Returns wheter the version of the specified zip file may be uncompressed with the + currently used zlib version or not + + @precond The given parameter must be a string with length > 0 + The file must exist + The file must be readable for the current user + The file must be a valid zip file + + @returns true if the file may be uncompressed with the currently used zlib + false if the file may not be uncompressed with the currently used zlib + + @throws ParameterException if the given file name is empty + IOException if the specified file doesn't exist or is no zip file + AccessViolationException if read access to the file is denied +*/ +bool ZipFile::IsValidZipFileVersionNumber(const std::string& FileName) +{ + return true; +} + +/** Constructs a zip file from a zip file + + @precond The given parameter must be a string with length > 0 + The file must exist + The file must be readable for the current user + + @throws ParameterException if the given file name is empty + IOException if the specified file doesn't exist or is no valid zip file + AccessViolationException if read access to the file is denied + WrongZipVersionException if the zip file cannot be uncompressed + with the used zlib version +*/ +ZipFile::ZipFile(const std::string& FileName) +{ + m_uzFile = unzOpen(FileName.c_str()); + + if (0 == m_uzFile) + throw IOException(-1); +} + +/** Destroys a zip file +*/ +ZipFile::~ZipFile() +{ + unzClose(m_uzFile); +} + +/** Provides an interface to read the uncompressed data of a content of the zip file + + @precond The specified content must exist in this file + ppstm must not be NULL +*/ +void ZipFile::GetUncompressedContent( + const std::string& ContentName, /*inout*/ ZipContentBuffer_t& ContentBuffer) +{ + int rc = unzLocateFile(m_uzFile, ContentName.c_str(), 0); + + if (UNZ_END_OF_LIST_OF_FILE == rc) + throw ZipContentMissException(rc); + + unz_file_info finfo; + unzGetCurrentFileInfo(m_uzFile, &finfo, 0, 0, 0, 0, 0, 0); + + ContentBuffer.resize(finfo.uncompressed_size); + + rc = unzOpenCurrentFile(m_uzFile); + + if (UNZ_OK != rc) + throw ZipException(rc); + + rc = unzReadCurrentFile(m_uzFile, &ContentBuffer[0], finfo.uncompressed_size); + + if (rc < 0) + throw ZipException(rc); + + rc = unzCloseCurrentFile(m_uzFile); + + if (rc < 0) + throw ZipException(rc); +} + +/** Returns a list with the content names contained within this file + +*/ +ZipFile::DirectoryPtr_t ZipFile::GetDirectory() const +{ + DirectoryPtr_t dir(new Directory_t()); + + long lmax = GetFileLongestFileNameLength(); + char* szFileName = reinterpret_cast<char*>(_alloca(lmax)); + + if (!szFileName) + throw ZipException(ERROR_NOT_ENOUGH_MEMORY); + + int rc = unzGoToFirstFile(m_uzFile); + + while (UNZ_OK == rc && UNZ_END_OF_LIST_OF_FILE != rc) + { + unzGetCurrentFileInfo( + m_uzFile, 0, szFileName, lmax, 0, 0, 0, 0); + + dir->push_back(szFileName); + + rc = unzGoToNextFile(m_uzFile); + } + + if (UNZ_OK != rc && UNZ_END_OF_LIST_OF_FILE != rc) + throw ZipException(rc); + + return dir; +} + +/** Convinience query function may even realized with + iterating over a ZipFileDirectory returned by + GetDirectory +*/ +bool ZipFile::HasContent(const std::string& ContentName) const +{ + DirectoryPtr_t dir = GetDirectory(); + Directory_t::iterator iter = std::find( + dir->begin(), dir->end(), ContentName); + + return (iter != dir->end()); +} + + +/** Returns the length of the longest file name + in the current zip file +*/ +long ZipFile::GetFileLongestFileNameLength() const +{ + long lmax = 0; + unz_file_info finfo; + + int rc = unzGoToFirstFile(m_uzFile); + + while (UNZ_OK == rc && UNZ_END_OF_LIST_OF_FILE != rc) + { + unzGetCurrentFileInfo(m_uzFile, &finfo, 0, 0, 0, 0, 0, 0); + lmax = std::max<long>(lmax, finfo.size_filename); + rc = unzGoToNextFile(m_uzFile); + } + + if (UNZ_OK != rc && UNZ_END_OF_LIST_OF_FILE != rc) + throw ZipException(rc); + + return lmax; +} + |