summaryrefslogtreecommitdiffstats
path: root/shell/inc/zipfile.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'shell/inc/zipfile.hxx')
-rw-r--r--shell/inc/zipfile.hxx152
1 files changed, 152 insertions, 0 deletions
diff --git a/shell/inc/zipfile.hxx b/shell/inc/zipfile.hxx
new file mode 100644
index 000000000..1b4a27706
--- /dev/null
+++ b/shell/inc/zipfile.hxx
@@ -0,0 +1,152 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_SHELL_INC_INTERNAL_ZIPFILE_HXX
+#define INCLUDED_SHELL_INC_INTERNAL_ZIPFILE_HXX
+
+#include <zlib.h>
+
+#include <string>
+#include <vector>
+#include <memory>
+#include "filepath.hxx"
+
+class StreamInterface;
+
+/** A simple zip content provider based on the zlib
+*/
+
+class ZipFile
+{
+public:
+ typedef std::vector<std::string> Directory_t;
+ typedef std::unique_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 Filepath_t &FileName);
+
+ static bool IsZipFile(void *stream);
+
+
+ /** Returns whether 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 Filepath_t &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 Filepath_t &FileName);
+
+ ZipFile(StreamInterface *stream);
+
+
+ /** 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 a 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;
+
+ /** Convenience 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 a zip error occurs
+ */
+ long GetFileLongestFileNameLength() const;
+
+private:
+ StreamInterface *m_pStream;
+ bool m_bShouldFree;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */