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
135
136
137
138
|
#include "CondFormats/Common/interface/FileBlob.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <fstream>
#include <iostream>
#include <memory>
#include <string>
#include <zlib.h>
FileBlob::FileBlob(const std::string& fname, bool zip) : isize(0) {
compressed = zip;
/*
std::cout << "isize = " << isize
<< " zip = " << (zip? "true" : "false")
<< std::endl;
*/
if (isize == 0)
isize = computeFileSize(fname);
// std::cout << "isize = " << isize << std::endl;
blob.reserve(isize);
read(fname);
}
FileBlob::FileBlob(std::istream& is, bool zip) : isize(0) {
compressed = zip;
if (isize == 0)
isize = computeStreamSize(is);
blob.reserve(isize);
read(is);
}
void FileBlob::read(std::istream& is) {
if (compressed) {
std::vector<unsigned char> in;
in.reserve(isize);
char c;
while (is.get(c))
in.push_back((unsigned char)c);
/*
for(int i=0;i<in.size();i++){
std::cout<<in[i];
}
std::cout<<std::endl;
*/
uLongf destLen = compressBound(in.size());
blob.resize(destLen);
int zerr = compress2(&*blob.begin(), &destLen, &*in.begin(), in.size(), 9);
if (zerr != 0)
edm::LogError("FileBlob") << "Compression error " << zerr;
blob.resize(destLen);
} else {
//std::cout << "reading uncompressed" << std::endl;
char c;
while (is.get(c))
blob.push_back((unsigned char)c);
blob.resize(blob.size());
isize = blob.size();
}
}
void FileBlob::write(std::ostream& os) const {
if (compressed) {
std::vector<unsigned char> out(isize);
uLongf destLen = out.size();
int zerr = uncompress(&*out.begin(), &destLen, &*blob.begin(), blob.size());
if (zerr != 0 || out.size() != destLen)
edm::LogError("FileBlob") << "uncompressing error " << zerr << " original size was " << isize << " new size is "
<< destLen;
os.write(reinterpret_cast<const char*>(&*out.begin()), out.size());
} else {
os.write(reinterpret_cast<const char*>(&*blob.begin()), blob.size());
}
}
std::unique_ptr<std::vector<unsigned char>> FileBlob::getUncompressedBlob() const {
std::unique_ptr<std::vector<unsigned char>> newblob;
if (compressed) {
newblob = std::make_unique<std::vector<unsigned char>>(isize);
uLongf destLen = newblob->size();
// std::cout<<"Store isize = "<<isize<<"; newblob->size() = "<<newblob->size()<<"; destLen = "<<destLen<<std::endl;
int zerr = uncompress(&*(newblob->begin()), &destLen, &*blob.begin(), blob.size());
if (zerr != 0 || newblob->size() != destLen)
edm::LogError("FileBlob") << "uncompressing error " << zerr << " original size was " << isize << " new size is "
<< destLen;
} else {
newblob = std::make_unique<std::vector<unsigned char>>(blob);
}
return newblob;
}
void FileBlob::getUncompressedBlob(std::vector<unsigned char>& myblobcopy) const {
if (compressed) {
myblobcopy.reserve(isize);
uLongf destLen = isize;
int zerr = uncompress(&*myblobcopy.begin(), &destLen, &*blob.begin(), blob.size());
if (zerr != 0 || myblobcopy.size() != destLen)
edm::LogError("FileBlob") << "uncompressing error " << zerr << " original size was " << isize << " new size is "
<< destLen;
} else {
myblobcopy = blob;
}
}
void FileBlob::read(const std::string& fname) {
std::ifstream ifile(fname.c_str());
if (!ifile) {
edm::LogError("FileBlob") << "file " << fname << " does not exist...";
} else
read(ifile);
ifile.close();
}
void FileBlob::write(const std::string& fname) const {
std::ofstream ofile(fname.c_str());
write(ofile);
ofile.close();
}
unsigned int FileBlob::computeFileSize(const std::string& fname) {
unsigned int is = 0;
std::ifstream ifile(fname.c_str());
if (!ifile) {
edm::LogError("FileBlob") << "file " << fname << " does not exist...";
} else
is = computeStreamSize(ifile);
ifile.close();
return is;
}
unsigned int FileBlob::computeStreamSize(std::istream& is) {
unsigned int rs = 0;
char c;
while (is.get(c))
rs++;
is.clear();
is.seekg(0);
return rs;
}
|