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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "zlib.h"
#include "axis2_ioapi.h"

/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */

#ifndef SEEK_CUR
#define SEEK_CUR    1
#endif

#ifndef SEEK_END
#define SEEK_END    2
#endif

#ifndef SEEK_SET
#define SEEK_SET    0
#endif

voidpf ZCALLBACK fopen_file_func OF(
     (voidpf opaque,
      const char *filename,
      int mode));

uLong ZCALLBACK fread_file_func OF(
     (voidpf opaque,
      voidpf stream,
      void *buf,
      uLong size));

uLong ZCALLBACK fwrite_file_func OF(
     (voidpf opaque,
      voidpf stream,
      const void *buf,
      uLong size));

long ZCALLBACK ftell_file_func OF(
     (voidpf opaque,
      voidpf stream));

long ZCALLBACK fseek_file_func OF(
     (voidpf opaque,
      voidpf stream,
      uLong offset,
      int origin));

int ZCALLBACK fclose_file_func OF(
     (voidpf opaque,
      voidpf stream));

int ZCALLBACK ferror_file_func OF(
     (voidpf opaque,
      voidpf stream));

voidpf ZCALLBACK
fopen_file_func(
    voidpf opaque,
    const char *filename,
    int mode)
{
    FILE *file = NULL;
    const char *mode_fopen = NULL;
    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER) == ZLIB_FILEFUNC_MODE_READ)
        mode_fopen = "rb";
    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
        mode_fopen = "r+b";
    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
        mode_fopen = "wb";

    if ((filename) && (mode_fopen != NULL))
        file = fopen(filename, mode_fopen);
    return file;
}

uLong ZCALLBACK
fread_file_func(
    voidpf opaque,
    voidpf stream,
    void *buf,
    uLong size)
{
    uLong ret;
    ret = (uLong) fread(buf, 1, (size_t) size, (FILE *) stream);
    return ret;
}

uLong ZCALLBACK
fwrite_file_func(
    voidpf opaque,
    voidpf stream,
    const void *buf,
    uLong size)
{
    uLong ret;
    ret = (uLong) fwrite(buf, 1, (size_t) size, (FILE *) stream);
    return ret;
}

long ZCALLBACK
ftell_file_func(
    voidpf opaque,
    voidpf stream)
{
    long ret;
    ret = ftell((FILE *) stream);
    return ret;
}

long ZCALLBACK
fseek_file_func(
    voidpf opaque,
    voidpf stream,
    uLong offset,
    int origin)
{
    int fseek_origin = 0;
    long ret;
    switch (origin)
    {
    case ZLIB_FILEFUNC_SEEK_CUR:
        fseek_origin = SEEK_CUR;
        break;
    case ZLIB_FILEFUNC_SEEK_END:
        fseek_origin = SEEK_END;
        break;
    case ZLIB_FILEFUNC_SEEK_SET:
        fseek_origin = SEEK_SET;
        break;
    default:
        return -1;
    }
    ret = 0;
    fseek((FILE *) stream, offset, fseek_origin);
    return ret;
}

int ZCALLBACK
fclose_file_func(
    voidpf opaque,
    voidpf stream)
{
    int ret;
    ret = fclose((FILE *) stream);
    return ret;
}

int ZCALLBACK
ferror_file_func(
    voidpf opaque,
    voidpf stream)
{
    int ret;
    ret = ferror((FILE *) stream);
    return ret;
}

void
fill_fopen_filefunc(
    zlib_filefunc_def *pzlib_filefunc_def)
{
    pzlib_filefunc_def->zopen_file = fopen_file_func;
    pzlib_filefunc_def->zread_file = fread_file_func;
    pzlib_filefunc_def->zwrite_file = fwrite_file_func;
    pzlib_filefunc_def->ztell_file = ftell_file_func;
    pzlib_filefunc_def->zseek_file = fseek_file_func;
    pzlib_filefunc_def->zclose_file = fclose_file_func;
    pzlib_filefunc_def->zerror_file = ferror_file_func;
    pzlib_filefunc_def->opaque = NULL;
}
