misc/quazip/qioapi.cpp
author Vatten
Tue, 30 Oct 2012 14:40:40 -0400
branch0.9.18
changeset 7893 50e8f6714b22
parent 7890 7f3881b14a3f
permissions -rw-r--r--
new script specialising in altering weapon behaviour
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7890
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     1
/* ioapi.c -- IO base function header for compress/uncompress .zip
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     2
   files using zlib + zip or unzip API
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     3
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     4
   Version 1.01e, February 12th, 2005
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     5
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     6
   Copyright (C) 1998-2005 Gilles Vollant
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     7
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     8
   Modified by Sergey A. Tachenov to integrate with Qt.
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
     9
*/
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    10
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    11
#include <stdio.h>
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    12
#include <stdlib.h>
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    13
#include <string.h>
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    14
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    15
#include "zlib.h"
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    16
#include "ioapi.h"
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    17
#include "quazip_global.h"
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    18
#include <QIODevice>
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    19
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    20
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    21
/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    22
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    23
#ifndef SEEK_CUR
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    24
#define SEEK_CUR    1
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    25
#endif
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    26
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    27
#ifndef SEEK_END
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    28
#define SEEK_END    2
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    29
#endif
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    30
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    31
#ifndef SEEK_SET
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    32
#define SEEK_SET    0
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    33
#endif
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    34
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    35
voidpf ZCALLBACK qiodevice_open_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    36
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    37
   voidpf file,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    38
   int mode)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    39
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    40
    QIODevice *iodevice = reinterpret_cast<QIODevice*>(file);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    41
    if(iodevice->isSequential())
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    42
        return NULL;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    43
    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    44
        iodevice->open(QIODevice::ReadOnly);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    45
    else
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    46
    if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    47
        iodevice->open(QIODevice::ReadWrite);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    48
    else
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    49
    if (mode & ZLIB_FILEFUNC_MODE_CREATE)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    50
        iodevice->open(QIODevice::WriteOnly);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    51
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    52
    if(iodevice->isOpen())
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    53
        return iodevice;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    54
    else
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    55
        return NULL;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    56
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    57
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    58
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    59
uLong ZCALLBACK qiodevice_read_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    60
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    61
   voidpf stream,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    62
   void* buf,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    63
   uLong size)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    64
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    65
    uLong ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    66
    ret = (uLong)((QIODevice*)stream)->read((char*)buf,size);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    67
    return ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    68
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    69
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    70
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    71
uLong ZCALLBACK qiodevice_write_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    72
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    73
   voidpf stream,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    74
   const void* buf,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    75
   uLong size)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    76
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    77
    uLong ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    78
    ret = (uLong)((QIODevice*)stream)->write((char*)buf,size);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    79
    return ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    80
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    81
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    82
uLong ZCALLBACK qiodevice_tell_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    83
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    84
   voidpf stream)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    85
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    86
    uLong ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    87
    ret = ((QIODevice*)stream)->pos();
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    88
    return ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    89
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    90
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    91
int ZCALLBACK qiodevice_seek_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    92
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    93
   voidpf stream,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    94
   uLong offset,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    95
   int origin)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    96
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    97
    uLong qiodevice_seek_result=0;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    98
    int ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
    99
    switch (origin)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   100
    {
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   101
    case ZLIB_FILEFUNC_SEEK_CUR :
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   102
        qiodevice_seek_result = ((QIODevice*)stream)->pos() + offset;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   103
        break;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   104
    case ZLIB_FILEFUNC_SEEK_END :
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   105
        qiodevice_seek_result = ((QIODevice*)stream)->size() - offset;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   106
        break;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   107
    case ZLIB_FILEFUNC_SEEK_SET :
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   108
        qiodevice_seek_result = offset;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   109
        break;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   110
    default: return -1;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   111
    }
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   112
    ret = !((QIODevice*)stream)->seek(qiodevice_seek_result);
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   113
    return ret;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   114
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   115
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   116
int ZCALLBACK qiodevice_close_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   117
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   118
   voidpf stream)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   119
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   120
    ((QIODevice*)stream)->close();
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   121
    return 0;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   122
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   123
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   124
int ZCALLBACK qiodevice_error_file_func (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   125
   voidpf opaque UNUSED,
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   126
   voidpf stream)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   127
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   128
    return !((QIODevice*)stream)->errorString().isEmpty();
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   129
}
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   130
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   131
void fill_qiodevice_filefunc (
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   132
  zlib_filefunc_def* pzlib_filefunc_def)
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   133
{
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   134
    pzlib_filefunc_def->zopen_file = qiodevice_open_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   135
    pzlib_filefunc_def->zread_file = qiodevice_read_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   136
    pzlib_filefunc_def->zwrite_file = qiodevice_write_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   137
    pzlib_filefunc_def->ztell_file = qiodevice_tell_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   138
    pzlib_filefunc_def->zseek_file = qiodevice_seek_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   139
    pzlib_filefunc_def->zclose_file = qiodevice_close_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   140
    pzlib_filefunc_def->zerror_file = qiodevice_error_file_func;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   141
    pzlib_filefunc_def->opaque = NULL;
7f3881b14a3f consistent line endings
nemo
parents: 5752
diff changeset
   142
}