1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2010 by Sun Microsystems, Inc. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_shell.hxx" 30 31 #if defined _MSC_VER 32 #pragma warning(push, 1) 33 #endif 34 #include <windows.h> 35 #if defined _MSC_VER 36 #pragma warning(pop) 37 #endif 38 39 #include <stdio.h> 40 #include <objidl.h> 41 42 /*#include <string.h> 43 #include <filter.h> 44 #include <filterr.h> 45 #include <ntquery.h> 46 #include "assert.h" 47 #include "propspec.hxx" 48 #ifdef __MINGW32__ 49 #include <algorithm> 50 using ::std::min; 51 #endif 52 */ 53 54 #include "internal/stream_helper.hxx" 55 56 extern "C" { 57 voidpf ZCALLBACK cb_sopen OF((voidpf opaque, const char * filename, int mode)); 58 uLong ZCALLBACK cb_sread OF((voidpf opaque, voidpf stream, void* vuf, uLong size)); 59 uLong ZCALLBACK cb_swrite OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); 60 long ZCALLBACK cb_stell OF((voidpf opaque, voidpf stream)); 61 long ZCALLBACK cb_sseek OF((voidpf opaque, voidpf stream, uLong offset, int origin)); 62 int ZCALLBACK cb_sclose OF((voidpf opaque, voidpf stream)); 63 int ZCALLBACK cb_serror OF((voidpf opaque, voidpf stream)); 64 65 void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def); 66 } 67 68 //----------------------------- 69 IStream* PrepareIStream( IStream* pStream, zlib_filefunc_def &zFileFunc ) 70 { 71 // These next few lines work around the "Seek pointer" bug found on Vista. 72 char cBuf[20]; 73 unsigned long nCount; 74 HRESULT hr; 75 ULARGE_INTEGER nNewPosition; 76 LARGE_INTEGER nMove; 77 nMove.QuadPart = 0; 78 hr = pStream->Seek( nMove, STREAM_SEEK_SET, &nNewPosition ); 79 hr = pStream->Read( cBuf, 20, &nCount ); 80 81 fill_stream_filefunc( &zFileFunc ); 82 zFileFunc.opaque = (void*)pStream; 83 84 return pStream; 85 } 86 87 extern "C" { 88 89 // IStream callback 90 voidpf ZCALLBACK cb_sopen (voidpf opaque, const char* /*filename*/, int /*mode*/) { 91 return opaque; 92 } 93 94 uLong ZCALLBACK cb_sread (voidpf /*opaque*/, voidpf stream, void* buf, uLong size) { 95 unsigned long newsize; 96 HRESULT hr; 97 98 hr = ((IStream *)stream)->Read (buf, size, &newsize); 99 if (hr == S_OK){ 100 return (unsigned long)newsize; 101 } 102 else { 103 return (uLong)0; 104 } 105 } 106 107 long ZCALLBACK cb_sseek (voidpf /*opaque*/, voidpf stream, uLong offset, int origin) { 108 // IStream::Seek parameters 109 HRESULT hr; 110 LARGE_INTEGER Move; 111 DWORD dwOrigin; 112 Move.QuadPart = (__int64)offset; 113 114 switch (origin) { 115 case SEEK_CUR: 116 dwOrigin = STREAM_SEEK_CUR; 117 break; 118 case SEEK_END: 119 dwOrigin = STREAM_SEEK_END; 120 break; 121 case SEEK_SET: 122 dwOrigin = STREAM_SEEK_SET; 123 break; 124 default: 125 return -1; 126 } 127 128 hr = ((IStream*)stream)->Seek (Move, dwOrigin, NULL); 129 if (hr == S_OK){ 130 return 0; 131 } 132 else { 133 return -1; 134 } 135 } 136 137 long ZCALLBACK cb_stell (voidpf /*opaque*/, voidpf stream) { 138 // IStream::Seek parameters 139 HRESULT hr; 140 LARGE_INTEGER Move; 141 ULARGE_INTEGER NewPosition; 142 Move.QuadPart = 0; 143 NewPosition.QuadPart = 0; 144 145 hr = ((IStream*)stream)->Seek (Move, STREAM_SEEK_CUR, &NewPosition); 146 if (hr == S_OK){ 147 return (long) NewPosition.QuadPart; 148 } 149 else { 150 return -1; 151 } 152 } 153 154 int ZCALLBACK cb_sclose (voidpf /*opaque*/, voidpf /*stream*/) { 155 return 0; 156 } 157 158 int ZCALLBACK cb_serror (voidpf /*opaque*/, voidpf /*stream*/) { 159 return 0; //RJK - for now 160 } 161 162 uLong ZCALLBACK cb_swrite (voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) { 163 HRESULT hr; 164 unsigned long writecount; 165 hr = ((IStream*)stream)->Write (buf, size, &writecount); 166 if (hr == S_OK) 167 return (unsigned int)writecount; 168 else 169 return (uLong)0; 170 } 171 172 void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def) { 173 pzlib_filefunc_def->zopen_file = cb_sopen; 174 pzlib_filefunc_def->zread_file = cb_sread; 175 pzlib_filefunc_def->zwrite_file = cb_swrite; 176 pzlib_filefunc_def->ztell_file = cb_stell; 177 pzlib_filefunc_def->zseek_file = cb_sseek; 178 pzlib_filefunc_def->zclose_file = cb_sclose; 179 pzlib_filefunc_def->zerror_file = cb_serror; 180 } 181 } 182