Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
ZipOutputStreamBuffer.cc
Go to the documentation of this file.
1// Copyright FreeHEP, 2005.
2
3#include <iostream>
4#include <ctime>
5#include <vector>
6
9#include "cheprep/ZipEntry.h"
10
11/**
12 * @author Mark Donszelmann
13 * @version $Id: ZipOutputStreamBuffer.cc,v 1.9 2005-06-02 21:28:45 duns Exp $
14 */
15namespace cheprep {
16
18 : DeflateOutputStreamBuffer(aBuffer),
19 comment("") {
20
21 closed = false;
22 entry = NULL;
23
24 entries = new std::vector<ZipEntry*>();
25 }
26
29 }
30
32 if (closed) return;
33 if (entry == NULL) return;
34
35 finish();
36
37 entry->crc = getCRC();
38 // NOTE: pos()::operator- is ambiguous on gcc 4.0, so convert to long first
39 entry->csize = (long)pos() - entry->data;
40 entry->size = getSize();
41 putUI(EXTSIG);
42 putUI(entry->crc); // crc
43 putUI(entry->csize); // compressed size
44 putUI(entry->size); // uncompressed size
45 entry = NULL;
46 }
47
48
50 if (closed) return;
51 closeEntry();
52
53 long dirStart = pos();
54 for (std::vector<ZipEntry*>::iterator i=entries->begin(); i != entries->end(); i++) {
55 entry = *i;
56 putUI(CENSIG);
57 putUS(VERSIONMADE); // made by version
58 putUS(VERSIONEXTRACT); // extraction version
59 putUS(GENFLAG); // general purpose bit flag
60 putUS(entry->method); // compression method
61 putUS(entry->time); // time
62 putUS(entry->date); // date
63 putUI(entry->crc); // crc
64 putUI(entry->csize); // compressed size
65 putUI(entry->size); // uncompressed size
66 putUS(entry->name.length()); // file name length
67 putUS(0); // extra field length
68 putUS(0); // file comment length
69 putUS(0); // disk number start
70 putUS(0); // internal file attributes
71 putUI(0); // external file attributes
72 putUI(entry->offset); // relative offset of local file header
73 putS(entry->name); // file name
74
75 // delete entry
76 delete entry;
77 entry = NULL;
78 }
79 // NOTE: pos()::operator- is ambiguous on gcc 4.0, so convert to long first
80 long dirSize = (long)pos() - dirStart;
81 putUI(ENDSIG);
82 putUS(0); // number of this disk
83 putUS(0); // number of the disk with the start of central directory
84 putUS(entries->size()); // total number of entries in the central directory of this disk
85 putUS(entries->size()); // total number of entries in the central directory
86 putUI(dirSize); // size of the central directory
87 putUI(dirStart); // offset of the start of central directory with respect to the starting disk number
88 putUS(comment.length()); // .ZIP file comment length
89 putS(comment); // .ZIP file comment
90
91 delete entries;
92 entries = NULL;
93 closed = true;
94 }
95
96 void ZipOutputStreamBuffer::putNextEntry(const std::string& name, bool compress) {
97 if (closed) return;
98
99 closeEntry();
100
101#ifdef CHEPREP_NO_ZLIB
102 compress = false;
103#endif
104 init(compress);
105
106 entry = new ZipEntry();
107 entries->push_back(entry);
108
109 entry->name = name;
110 entry->method = compress ? 8 : 0;
111
112 time_t ltime;
113 time( &ltime );
114 struct tm *utc = gmtime( &ltime );
115 entry->date = (utc->tm_year - 80) << 9 | (utc->tm_mon + 1) << 5 | utc->tm_mday;
116 entry->time = utc->tm_hour << 11 | utc->tm_min << 5 | utc->tm_sec >> 1;
117
118 entry->offset = (long)pos();
119 putUI(LOCSIG); // signature
120 putUS(VERSIONEXTRACT); // extraction version
121 putUS(GENFLAG); // general purpose bit flag
122 putUS(entry->method); // compression method
123 putUS(entry->time); // time
124 putUS(entry->date); // date
125 putUI(0x00000000); // crc ATEND
126 putUI(0x00000000); // compressed size ATEND
127 putUI(0x00000000); // uncompressed size ATEND
128 putUS(entry->name.length()); // file name length
129 putUS(0); // extra field length
130 putS(entry->name); // file name
131 entry->data = (long)pos();
132 entry->crc = 0;
133 }
134
135 void ZipOutputStreamBuffer::setComment(const std::string& c) {
136 if (closed) return;
137 comment = c;
138 }
139
141 close();
142 }
143
144} // cheprep
std::string name
Definition: ZipEntry.h:18
unsigned int csize
Definition: ZipEntry.h:24
unsigned int size
Definition: ZipEntry.h:23
unsigned int crc
Definition: ZipEntry.h:22
void setComment(const std::string &comment)
ZipOutputStreamBuffer(std::streambuf *buffer)
void putNextEntry(const std::string &name, bool compress)
int ZEXPORT compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
Definition: compress.cc:57