xbmc
xbmc
filesystem
ZipManager.h
1
/*
2
* Copyright (C) 2005-2018 Team Kodi
3
* This file is part of Kodi - https://kodi.tv
4
*
5
* SPDX-License-Identifier: GPL-2.0-or-later
6
* See LICENSES/README.md for more information.
7
*/
8
9
#pragma once
10
11
// See http://www.pkware.com/documents/casestudies/APPNOTE.TXT
12
#define ZIP_LOCAL_HEADER 0x04034b50
13
#define ZIP_DATA_RECORD_HEADER 0x08074b50
14
#define ZIP_CENTRAL_HEADER 0x02014b50
15
#define ZIP_END_CENTRAL_HEADER 0x06054b50
16
#define ZIP_SPLIT_ARCHIVE_HEADER 0x30304b50
17
#define LHDR_SIZE 30
18
#define DREC_SIZE 16
19
#define CHDR_SIZE 46
20
#define ECDREC_SIZE 22
21
22
#include <cstring>
23
#include <map>
24
#include <string>
25
#include <vector>
26
27
class
CURL
;
28
29
static
const
std::string PATH_TRAVERSAL(R
"_((^|\/|\\)\.{2}($|\/|\\))_");
30
31
struct
SZipEntry
{
32
unsigned
int
header = 0;
33
unsigned
short
version = 0;
34
unsigned
short
flags = 0;
35
unsigned
short
method = 0;
36
unsigned
short
mod_time = 0;
37
unsigned
short
mod_date = 0;
38
unsigned
int
crc32 = 0;
39
unsigned
int
csize = 0;
// compressed size
40
unsigned
int
usize = 0;
// uncompressed size
41
unsigned
short
flength = 0;
// filename length
42
unsigned
short
elength = 0;
// extra field length (local file header)
43
unsigned
short
eclength = 0;
// extra field length (central file header)
44
unsigned
short
clength = 0;
// file comment length (central file header)
45
unsigned
int
lhdrOffset = 0;
// Relative offset of local header
46
int64_t offset = 0;
// offset in file to compressed data
47
char
name[255];
48
49
SZipEntry
()
50
{
51
name[0] =
'\0'
;
52
}
53
};
54
55
class
CZipManager
56
{
57
public
:
58
CZipManager
();
59
~
CZipManager
();
60
61
bool
GetZipList(
const
CURL
& url, std::vector<SZipEntry>& items);
62
bool
GetZipEntry(
const
CURL
& url,
SZipEntry
& item);
63
bool
ExtractArchive(
const
std::string& strArchive,
const
std::string& strPath);
64
bool
ExtractArchive(
const
CURL
& archive,
const
std::string& strPath);
65
void
release(
const
std::string& strPath);
// release resources used by list zip
66
static
void
readHeader(
const
char
* buffer,
SZipEntry
& info);
67
static
void
readCHeader(
const
char
* buffer,
SZipEntry
& info);
68
private
:
69
std::map<std::string,std::vector<SZipEntry> > mZipMap;
70
std::map<std::string,int64_t> mZipDate;
71
72
template
<
typename
T>
73
static
T ReadUnaligned(
const
void
* mem)
74
{
75
T var;
76
std::memcpy(&var, mem,
sizeof
(T));
77
return
var;
78
}
79
};
80
81
extern
CZipManager
g_ZipManager;
82
CURL
Definition:
URL.h:20
CZipManager
Definition:
ZipManager.h:55
SZipEntry
Definition:
ZipManager.h:31
Generated by
1.8.13