File: cpl_minizip_ioapi.cpp

package info (click to toggle)
gdal 2.4.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 106,060 kB
  • sloc: cpp: 1,034,177; ansic: 177,878; python: 23,590; perl: 7,420; sh: 6,285; java: 5,382; xml: 3,100; cs: 2,343; yacc: 1,198; makefile: 518; sql: 112
file content (134 lines) | stat: -rw-r--r-- 3,772 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/* Modified version by Even Rouault. :
      - change fill_fopen_filefunc to cpl_fill_fopen_filefunc
      - port to VSIL*L API
      - Remove old C style function prototypes
      - Add support for ZIP64

 * Copyright (c) 2008-2010, Even Rouault <even dot rouault at mines-paris dot org>

   Original licence available in port/LICENCE_minizip
*/

/* 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 "cpl_port.h"
#include "cpl_minizip_ioapi.h"

#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#if HAVE_FCNTL_H
#include <fcntl.h>
#endif

#include "cpl_minizip_ioapi.h"
#include "cpl_vsi.h"
#include "zconf.h"
#include "zlib.h"

CPL_CVSID("$Id: cpl_minizip_ioapi.cpp 0f654dda9faabf9d86a44293f0f89903a8e97dd7 2018-04-15 20:18:32 +0200 Even Rouault $")

static
voidpf ZCALLBACK fopen_file_func ( voidpf /* opaque */ ,
                                   const char* filename, int mode )
{
    VSILFILE* file = nullptr;
    const char* mode_fopen = nullptr;
    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 != nullptr )
            return VSIFOpenExL(filename, mode_fopen, true);
    }

    if ((filename!=nullptr) && (mode_fopen != nullptr))
        file = VSIFOpenL(filename, mode_fopen);
    return file;
}

static
uLong ZCALLBACK fread_file_func ( voidpf /* opaque */, voidpf stream,
                                  void* buf, uLong size )
{
    uLong ret =
        static_cast<uLong>(VSIFReadL(buf, 1, static_cast<size_t>(size),
                                     static_cast<VSILFILE *>(stream)));
    return ret;
}

static
uLong ZCALLBACK fwrite_file_func ( voidpf /* opaque */, voidpf stream,
                                   const void* buf, uLong size )
{
    uLong ret =
        static_cast<uLong>(VSIFWriteL(buf, 1, static_cast<size_t>(size),
                                      static_cast<VSILFILE *>(stream)));
    return ret;
}

static
uLong64 ZCALLBACK ftell_file_func ( voidpf /* opaque */, voidpf stream )
{
    uLong64 ret;
    ret = VSIFTellL(reinterpret_cast<VSILFILE*>(stream));
    return ret;
}

static
long ZCALLBACK fseek_file_func ( voidpf /* opaque */, voidpf stream,
                                 uLong64 offset, int origin )
{
    int fseek_origin=0;
    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;
    }
    return VSIFSeekL(reinterpret_cast<VSILFILE*>(stream), offset, fseek_origin);
}

static
int ZCALLBACK fclose_file_func ( voidpf /* opaque */, voidpf stream )
{
    return VSIFCloseL(reinterpret_cast<VSILFILE*>(stream));
}

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

void cpl_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 = nullptr;
}