1f8e2c85aSAndrew Rist /**************************************************************
2*5da75f43Smseidel  *
3f8e2c85aSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4f8e2c85aSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5f8e2c85aSAndrew Rist  * distributed with this work for additional information
6f8e2c85aSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7f8e2c85aSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8f8e2c85aSAndrew Rist  * "License"); you may not use this file except in compliance
9f8e2c85aSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5da75f43Smseidel  *
11f8e2c85aSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5da75f43Smseidel  *
13f8e2c85aSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14f8e2c85aSAndrew Rist  * software distributed under the License is distributed on an
15f8e2c85aSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f8e2c85aSAndrew Rist  * KIND, either express or implied.  See the License for the
17f8e2c85aSAndrew Rist  * specific language governing permissions and limitations
18f8e2c85aSAndrew Rist  * under the License.
19*5da75f43Smseidel  *
20f8e2c85aSAndrew Rist  *************************************************************/
21f8e2c85aSAndrew Rist 
22f8e2c85aSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_shell.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #if defined _MSC_VER
28cdf0e10cSrcweir #pragma warning(push, 1)
29cdf0e10cSrcweir #endif
30cdf0e10cSrcweir #include <windows.h>
31cdf0e10cSrcweir #if defined _MSC_VER
32cdf0e10cSrcweir #pragma warning(pop)
33*5da75f43Smseidel #endif
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <stdio.h>
36cdf0e10cSrcweir #include <objidl.h>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir /*#include <string.h>
39cdf0e10cSrcweir #include <filter.h>
40cdf0e10cSrcweir #include <filterr.h>
41cdf0e10cSrcweir #include <ntquery.h>
42cdf0e10cSrcweir #include "assert.h"
43cdf0e10cSrcweir #include "propspec.hxx"
44cdf0e10cSrcweir #ifdef __MINGW32__
45cdf0e10cSrcweir #include <algorithm>
46cdf0e10cSrcweir using ::std::min;
47cdf0e10cSrcweir #endif
48cdf0e10cSrcweir */
49cdf0e10cSrcweir 
50cdf0e10cSrcweir #include "internal/stream_helper.hxx"
51cdf0e10cSrcweir 
52cdf0e10cSrcweir extern "C" {
53cdf0e10cSrcweir 	voidpf ZCALLBACK cb_sopen OF((voidpf opaque, const char * filename, int mode));
54cdf0e10cSrcweir 	uLong ZCALLBACK cb_sread OF((voidpf opaque, voidpf stream, void* vuf, uLong size));
55cdf0e10cSrcweir 	uLong ZCALLBACK cb_swrite OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
56cdf0e10cSrcweir 	long ZCALLBACK cb_stell OF((voidpf opaque, voidpf stream));
57cdf0e10cSrcweir 	long ZCALLBACK cb_sseek OF((voidpf opaque, voidpf stream, uLong offset, int origin));
58cdf0e10cSrcweir 	int ZCALLBACK cb_sclose OF((voidpf opaque, voidpf stream));
59cdf0e10cSrcweir 	int ZCALLBACK cb_serror OF((voidpf opaque, voidpf stream));
60cdf0e10cSrcweir 
61cdf0e10cSrcweir 	void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def);
62cdf0e10cSrcweir }
63cdf0e10cSrcweir 
64cdf0e10cSrcweir //-----------------------------
PrepareIStream(IStream * pStream,zlib_filefunc_def & zFileFunc)65cdf0e10cSrcweir IStream* PrepareIStream( IStream* pStream, zlib_filefunc_def &zFileFunc )
66cdf0e10cSrcweir {
67*5da75f43Smseidel 	// These next few lines work around the "Seek pointer" bug found on Vista.
68*5da75f43Smseidel 	char cBuf[20];
69*5da75f43Smseidel 	unsigned long nCount;
70*5da75f43Smseidel 	HRESULT hr;
71*5da75f43Smseidel 	ULARGE_INTEGER nNewPosition;
72*5da75f43Smseidel 	LARGE_INTEGER nMove;
73*5da75f43Smseidel 	nMove.QuadPart = 0;
74*5da75f43Smseidel 	hr = pStream->Seek( nMove, STREAM_SEEK_SET, &nNewPosition );
75*5da75f43Smseidel 	hr = pStream->Read( cBuf, 20, &nCount );
76*5da75f43Smseidel 
77*5da75f43Smseidel 	fill_stream_filefunc( &zFileFunc );
78*5da75f43Smseidel 	zFileFunc.opaque = (void*)pStream;
79*5da75f43Smseidel 
80*5da75f43Smseidel 	return pStream;
81cdf0e10cSrcweir }
82cdf0e10cSrcweir 
83cdf0e10cSrcweir extern "C" {
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	// IStream callback
cb_sopen(voidpf opaque,const char *,int)86*5da75f43Smseidel 	voidpf ZCALLBACK cb_sopen (voidpf opaque, const char* /*filename*/, int /*mode*/) {
87cdf0e10cSrcweir 		return opaque;
88cdf0e10cSrcweir 	}
89cdf0e10cSrcweir 
cb_sread(voidpf,voidpf stream,void * buf,uLong size)90cdf0e10cSrcweir 	uLong ZCALLBACK cb_sread (voidpf /*opaque*/, voidpf stream, void* buf, uLong size) {
91cdf0e10cSrcweir 		unsigned long newsize;
92cdf0e10cSrcweir 		HRESULT hr;
93*5da75f43Smseidel 
94cdf0e10cSrcweir 		hr = ((IStream *)stream)->Read (buf, size, &newsize);
95cdf0e10cSrcweir 		if (hr == S_OK){
96cdf0e10cSrcweir 			return (unsigned long)newsize;
97cdf0e10cSrcweir 		}
98*5da75f43Smseidel 		else {
99cdf0e10cSrcweir 			return (uLong)0;
100cdf0e10cSrcweir 		}
101cdf0e10cSrcweir 	}
102cdf0e10cSrcweir 
cb_sseek(voidpf,voidpf stream,uLong offset,int origin)103cdf0e10cSrcweir 	long ZCALLBACK cb_sseek (voidpf /*opaque*/, voidpf stream, uLong offset, int origin) {
104cdf0e10cSrcweir 		// IStream::Seek parameters
105cdf0e10cSrcweir 		HRESULT hr;
106cdf0e10cSrcweir 		LARGE_INTEGER Move;
107*5da75f43Smseidel 		DWORD dwOrigin;
108*5da75f43Smseidel 		Move.QuadPart = (__int64)offset;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 		switch (origin) {
111cdf0e10cSrcweir 			case SEEK_CUR:
112cdf0e10cSrcweir 				dwOrigin = STREAM_SEEK_CUR;
113cdf0e10cSrcweir 				break;
114cdf0e10cSrcweir 			case SEEK_END:
115cdf0e10cSrcweir 				dwOrigin = STREAM_SEEK_END;
116cdf0e10cSrcweir 				break;
117cdf0e10cSrcweir 			case SEEK_SET:
118cdf0e10cSrcweir 				dwOrigin = STREAM_SEEK_SET;
119cdf0e10cSrcweir 				break;
120cdf0e10cSrcweir 			default:
121cdf0e10cSrcweir 				return -1;
122cdf0e10cSrcweir 		}
123*5da75f43Smseidel 
124cdf0e10cSrcweir 		hr = ((IStream*)stream)->Seek (Move, dwOrigin, NULL);
125*5da75f43Smseidel 		if (hr == S_OK){
126cdf0e10cSrcweir 			return 0;
127cdf0e10cSrcweir 		}
128*5da75f43Smseidel 		else {
129cdf0e10cSrcweir 			return -1;
130cdf0e10cSrcweir 		}
131cdf0e10cSrcweir 	}
132cdf0e10cSrcweir 
cb_stell(voidpf,voidpf stream)133cdf0e10cSrcweir 	long ZCALLBACK cb_stell (voidpf /*opaque*/, voidpf stream) {
134cdf0e10cSrcweir 		// IStream::Seek parameters
135cdf0e10cSrcweir 		HRESULT hr;
136cdf0e10cSrcweir 		LARGE_INTEGER Move;
137cdf0e10cSrcweir 		ULARGE_INTEGER NewPosition;
138cdf0e10cSrcweir 		Move.QuadPart = 0;
139cdf0e10cSrcweir 		NewPosition.QuadPart = 0;
140*5da75f43Smseidel 
141cdf0e10cSrcweir 		hr = ((IStream*)stream)->Seek (Move, STREAM_SEEK_CUR, &NewPosition);
142*5da75f43Smseidel 		if (hr == S_OK){
143cdf0e10cSrcweir 			return (long) NewPosition.QuadPart;
144cdf0e10cSrcweir 		}
145cdf0e10cSrcweir 		else {
146cdf0e10cSrcweir 			return -1;
147cdf0e10cSrcweir 		}
148cdf0e10cSrcweir 	}
149cdf0e10cSrcweir 
cb_sclose(voidpf,voidpf)150cdf0e10cSrcweir 	int ZCALLBACK cb_sclose (voidpf /*opaque*/, voidpf /*stream*/) {
151cdf0e10cSrcweir 		return 0;
152cdf0e10cSrcweir 	}
153cdf0e10cSrcweir 
cb_serror(voidpf,voidpf)154cdf0e10cSrcweir 	int ZCALLBACK cb_serror (voidpf /*opaque*/, voidpf /*stream*/) {
155*5da75f43Smseidel 		return 0; // RJK - for now
156cdf0e10cSrcweir 	}
157cdf0e10cSrcweir 
cb_swrite(voidpf,voidpf stream,const void * buf,uLong size)158cdf0e10cSrcweir 	uLong ZCALLBACK cb_swrite (voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) {
159cdf0e10cSrcweir 		HRESULT hr;
160cdf0e10cSrcweir 		unsigned long writecount;
161cdf0e10cSrcweir 		hr = ((IStream*)stream)->Write (buf, size, &writecount);
162cdf0e10cSrcweir 		if (hr == S_OK)
163cdf0e10cSrcweir 			return (unsigned int)writecount;
164cdf0e10cSrcweir 		else
165cdf0e10cSrcweir 			return (uLong)0;
166cdf0e10cSrcweir 	}
167cdf0e10cSrcweir 
fill_stream_filefunc(zlib_filefunc_def * pzlib_filefunc_def)168cdf0e10cSrcweir 	void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def) {
169cdf0e10cSrcweir 		pzlib_filefunc_def->zopen_file = cb_sopen;
170cdf0e10cSrcweir 		pzlib_filefunc_def->zread_file = cb_sread;
171cdf0e10cSrcweir 		pzlib_filefunc_def->zwrite_file = cb_swrite;
172cdf0e10cSrcweir 		pzlib_filefunc_def->ztell_file = cb_stell;
173cdf0e10cSrcweir 		pzlib_filefunc_def->zseek_file = cb_sseek;
174cdf0e10cSrcweir 		pzlib_filefunc_def->zclose_file = cb_sclose;
175*5da75f43Smseidel 		pzlib_filefunc_def->zerror_file = cb_serror;
176cdf0e10cSrcweir 	}
177cdf0e10cSrcweir }
178*5da75f43Smseidel 
179*5da75f43Smseidel /* vim: set noet sw=4 ts=4: */
180