
/*
* 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.
*/

/* ioapi.h -- IO base function header for compress/uncompress .zip
   files using zlib + zip or unzip API

   Version 1.01e, February 12th, 2005

   Copyright (C) 1998-2005 Gilles Vollant
*/

#ifndef _ZLIBIOAPI_H
#define _ZLIBIOAPI_H

#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
#define ZLIB_FILEFUNC_SEEK_SET (0)

#define ZLIB_FILEFUNC_MODE_READ      (1)
#define ZLIB_FILEFUNC_MODE_WRITE     (2)
#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)

#define ZLIB_FILEFUNC_MODE_EXISTING (4)
#define ZLIB_FILEFUNC_MODE_CREATE   (8)

#ifndef ZCALLBACK

#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
#define ZCALLBACK CALLBACK
#else
#define ZCALLBACK
#endif
#endif

#ifdef __cplusplus
extern "C"
{
#endif

    typedef voidpf(
        ZCALLBACK * open_file_func) OF(
            (voidpf opaque,
                    const char *filename,
                    int mode));
    typedef uLong(
        ZCALLBACK * read_file_func) OF(
            (voidpf opaque,
                    voidpf stream,
                    void *buf,
                    uLong size));
    typedef uLong(
        ZCALLBACK * write_file_func) OF(
            (voidpf opaque,
                    voidpf stream,
                    const void *buf,
                    uLong size));
    typedef long(
        ZCALLBACK * tell_file_func) OF(
            (voidpf opaque,
                    voidpf stream));
    typedef long(
        ZCALLBACK * seek_file_func) OF(
            (voidpf opaque,
                    voidpf stream,
                    uLong offset,
                    int origin));
    typedef int(
        ZCALLBACK * close_file_func) OF(
            (voidpf opaque,
                    voidpf stream));
    typedef int(
        ZCALLBACK * testerror_file_func) OF(
            (voidpf opaque,
                    voidpf stream));

    typedef struct zlib_filefunc_def_s
    {
        open_file_func zopen_file;
        read_file_func zread_file;
        write_file_func zwrite_file;
        tell_file_func ztell_file;
        seek_file_func zseek_file;
        close_file_func zclose_file;
        testerror_file_func zerror_file;
        voidpf opaque;
    }
    zlib_filefunc_def;

    void fill_fopen_filefunc OF(
        (zlib_filefunc_def * pzlib_filefunc_def));

#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size))
#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size))
#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream))
#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode))
#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream))
#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream))

#ifdef __cplusplus
}
#endif

#endif
