blob: 983b313bef75fbff94bab995033d1903b3936aab [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_shell.hxx"
#if defined _MSC_VER
#pragma warning(push, 1)
#endif
#include <windows.h>
#if defined _MSC_VER
#pragma warning(pop)
#endif
#include <stdio.h>
#include <objidl.h>
/*#include <string.h>
#include <filter.h>
#include <filterr.h>
#include <ntquery.h>
#include "assert.h"
#include "propspec.hxx"
#ifdef __MINGW32__
#include <algorithm>
using ::std::min;
#endif
*/
#include "internal/stream_helper.hxx"
extern "C" {
voidpf ZCALLBACK cb_sopen OF((voidpf opaque, const char * filename, int mode));
uLong ZCALLBACK cb_sread OF((voidpf opaque, voidpf stream, void* vuf, uLong size));
uLong ZCALLBACK cb_swrite OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
long ZCALLBACK cb_stell OF((voidpf opaque, voidpf stream));
long ZCALLBACK cb_sseek OF((voidpf opaque, voidpf stream, uLong offset, int origin));
int ZCALLBACK cb_sclose OF((voidpf opaque, voidpf stream));
int ZCALLBACK cb_serror OF((voidpf opaque, voidpf stream));
void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def);
}
//-----------------------------
IStream* PrepareIStream( IStream* pStream, zlib_filefunc_def &zFileFunc )
{
// These next few lines work around the "Seek pointer" bug found on Vista.
char cBuf[20];
unsigned long nCount;
HRESULT hr;
ULARGE_INTEGER nNewPosition;
LARGE_INTEGER nMove;
nMove.QuadPart = 0;
hr = pStream->Seek( nMove, STREAM_SEEK_SET, &nNewPosition );
hr = pStream->Read( cBuf, 20, &nCount );
fill_stream_filefunc( &zFileFunc );
zFileFunc.opaque = (void*)pStream;
return pStream;
}
extern "C" {
// IStream callback
voidpf ZCALLBACK cb_sopen (voidpf opaque, const char* /*filename*/, int /*mode*/) {
return opaque;
}
uLong ZCALLBACK cb_sread (voidpf /*opaque*/, voidpf stream, void* buf, uLong size) {
unsigned long newsize;
HRESULT hr;
hr = ((IStream *)stream)->Read (buf, size, &newsize);
if (hr == S_OK){
return (unsigned long)newsize;
}
else {
return (uLong)0;
}
}
long ZCALLBACK cb_sseek (voidpf /*opaque*/, voidpf stream, uLong offset, int origin) {
// IStream::Seek parameters
HRESULT hr;
LARGE_INTEGER Move;
DWORD dwOrigin;
Move.QuadPart = (__int64)offset;
switch (origin) {
case SEEK_CUR:
dwOrigin = STREAM_SEEK_CUR;
break;
case SEEK_END:
dwOrigin = STREAM_SEEK_END;
break;
case SEEK_SET:
dwOrigin = STREAM_SEEK_SET;
break;
default:
return -1;
}
hr = ((IStream*)stream)->Seek (Move, dwOrigin, NULL);
if (hr == S_OK){
return 0;
}
else {
return -1;
}
}
long ZCALLBACK cb_stell (voidpf /*opaque*/, voidpf stream) {
// IStream::Seek parameters
HRESULT hr;
LARGE_INTEGER Move;
ULARGE_INTEGER NewPosition;
Move.QuadPart = 0;
NewPosition.QuadPart = 0;
hr = ((IStream*)stream)->Seek (Move, STREAM_SEEK_CUR, &NewPosition);
if (hr == S_OK){
return (long) NewPosition.QuadPart;
}
else {
return -1;
}
}
int ZCALLBACK cb_sclose (voidpf /*opaque*/, voidpf /*stream*/) {
return 0;
}
int ZCALLBACK cb_serror (voidpf /*opaque*/, voidpf /*stream*/) {
return 0; //RJK - for now
}
uLong ZCALLBACK cb_swrite (voidpf /*opaque*/, voidpf stream, const void* buf, uLong size) {
HRESULT hr;
unsigned long writecount;
hr = ((IStream*)stream)->Write (buf, size, &writecount);
if (hr == S_OK)
return (unsigned int)writecount;
else
return (uLong)0;
}
void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def) {
pzlib_filefunc_def->zopen_file = cb_sopen;
pzlib_filefunc_def->zread_file = cb_sread;
pzlib_filefunc_def->zwrite_file = cb_swrite;
pzlib_filefunc_def->ztell_file = cb_stell;
pzlib_filefunc_def->zseek_file = cb_sseek;
pzlib_filefunc_def->zclose_file = cb_sclose;
pzlib_filefunc_def->zerror_file = cb_serror;
}
}