pkzip.cpp revision 96e8e3254d9f53263d49e275e71bbd028481ebc3
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * IPRT - PKZIP archive I/O.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Copyright (C) 2014 Oracle Corporation
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * available from http://www.virtualbox.org. This file is free software;
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * you can redistribute it and/or modify it under the terms of the GNU
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * General Public License (GPL) as published by the Free Software
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * The contents of this file may alternatively be used under the terms
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * of the Common Development and Distribution License Version 1.0
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * VirtualBox OSE distribution, in which case the provisions of the
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * CDDL are applicable instead of those of the GPL.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * You may elect to license modified versions of this file under the
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * terms and conditions of either the GPL or the CDDL or both.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync/******************************************************************************
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Header Files *
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync ******************************************************************************/
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync/*******************************************************************************
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync* Structures and Typedefs *
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync*******************************************************************************/
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Memory stream private data.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsynctypedef struct MEMIOSTREAM
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync /** Size of the memory buffer. */
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync /** Pointer to the memory buffer. */
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync /** Current offset. */
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsync * @interface_method_impl{RTVFSOBJOPS,pfnClose}
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsyncstatic DECLCALLBACK(int) memFssIos_Close(void *pvThis)
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * @interface_method_impl{RTVFSOBJOPS,pfnQueryInfo}
7b7908c296ee464d45619cc2969413a934cfacc9vboxsyncstatic DECLCALLBACK(int) memFssIos_QueryInfo(void *pvThis, PRTFSOBJINFO pObjInfo, RTFSOBJATTRADD enmAddAttr)
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * @interface_method_impl{RTVFSIOSTREAMOPS,pfnRead}
7b7908c296ee464d45619cc2969413a934cfacc9vboxsyncstatic DECLCALLBACK(int) memFssIos_Read(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbRead)
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync memcpy(pSgBuf->paSegs[0].pvSeg, pThis->pu8Buf + off, cbToRead);
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsync * @interface_method_impl{RTVFSIOSTREAMOPS,pfnWrite}
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsyncstatic DECLCALLBACK(int) memFssIos_Write(void *pvThis, RTFOFF off, PCRTSGBUF pSgBuf, bool fBlocking, size_t *pcbWritten)
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsync * @interface_method_impl{RTVFSIOSTREAMOPS,pfnFlush}
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsyncstatic DECLCALLBACK(int) memFssIos_Flush(void *pvThis)
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsync * @interface_method_impl{RTVFSIOSTREAMOPS,pfnPollOne}
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsyncstatic DECLCALLBACK(int) memFssIos_PollOne(void *pvThis, uint32_t fEvents, RTMSINTERVAL cMillies, bool fIntr, uint32_t *pfRetEvents)
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsync * @interface_method_impl{RTVFSIOSTREAMOPS,pfnTell}
96e8e3254d9f53263d49e275e71bbd028481ebc3vboxsyncstatic DECLCALLBACK(int) memFssIos_Tell(void *pvThis, PRTFOFF poffActual)
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Memory I/O object stream operations.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync { /* Obj */
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync "MemFsStream::IoStream",
feea0c2d3825b3d2c170987ccb14e8c2c8ae865dvboxsyncRTDECL(int) RTZipPkzipMemDecompress(void **ppvDst, size_t *pcbDst, const void *pvSrc, size_t cbSrc, const char *pszObject)
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync RTFILE_O_READ | RTFILE_O_DENY_WRITE | RTFILE_O_OPEN,
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync rc = RTZipPkzipFsStreamFromIoStream(hVfsIos, 0 /*fFlags*/, &hVfsFss);
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * Loop through all objects. Actually this wouldn't be required
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync * for .zip files but we opened it as I/O stream.
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync rc = RTVfsFsStrmNext(hVfsFss, &pszName, NULL /*penmType*/, &hVfsObj);
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync rc = RTVfsObjQueryInfo(hVfsObj, &UnixInfo, RTFSOBJATTRADD_UNIX);
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync RTVFSIOSTREAM hVfsIosObj = RTVfsObjToIoStream(hVfsObj);
7b7908c296ee464d45619cc2969413a934cfacc9vboxsync rc = RTVfsIoStrmRead(hVfsIosObj, pv, cb, true /*fBlocking*/, NULL);