| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef ZIPFILE_HXX_INCLUDED |
| #define ZIPFILE_HXX_INCLUDED |
| |
| #ifndef _WINDOWS |
| #define _WINDOWS |
| #endif |
| |
| |
| #include <external/zlib/unzip.h> |
| |
| |
| #include <string> |
| #include <vector> |
| #include <memory> |
| |
| /** A simple zip content provider based on the zlib |
| */ |
| |
| class ZipFile |
| { |
| public: |
| |
| typedef std::vector<std::string> Directory_t; |
| typedef std::auto_ptr<Directory_t> DirectoryPtr_t; |
| typedef std::vector<char> ZipContentBuffer_t; |
| |
| public: |
| |
| /** 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 |
| */ |
| static bool IsZipFile(const std::string& FileName); |
| |
| static bool IsZipFile(void* stream); |
| |
| |
| /** 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 |
| */ |
| static bool IsValidZipFileVersionNumber(const std::string& FileName); |
| |
| static bool IsValidZipFileVersionNumber(void* stream); |
| |
| public: |
| |
| /** 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(const std::string& FileName); |
| |
| ZipFile(void* stream, zlib_filefunc_def* fa); |
| |
| |
| /** Destroys a zip file |
| */ |
| ~ZipFile(); |
| |
| /** Provides an interface to read the uncompressed data of a content of the zip file |
| |
| @param ContentName |
| The name of the content in the zip file |
| |
| @param ppstm |
| Pointer to pointer, will receive an interface pointer |
| to IUnknown on success |
| |
| @precond The specified content must exist in this file |
| ppstm must not be NULL |
| |
| @throws std::bad_alloc if the necessary buffer could not be |
| allocated |
| ZipException if an zip error occurs |
| ZipContentMissException if the specified zip content |
| does not exist in this zip file |
| */ |
| void GetUncompressedContent(const std::string& ContentName, /*inout*/ ZipContentBuffer_t& ContentBuffer); |
| |
| /** Returns a list with the content names contained within this file |
| |
| @throws ZipException if an error in the zlib happens |
| */ |
| DirectoryPtr_t GetDirectory() const; |
| |
| /** Convinience query function may even realized with |
| iterating over a ZipFileDirectory returned by |
| GetDirectory |
| */ |
| bool HasContent(const std::string& ContentName) const; |
| |
| private: |
| |
| /** Returns the length of the longest file name |
| in the current zip file |
| |
| @throws ZipException if an zip error occurs |
| */ |
| long GetFileLongestFileNameLength() const; |
| |
| private: |
| unzFile m_uzFile; |
| }; |
| |
| #endif |
| |