Go to the documentation of this file.00001 #include "CondFormats/Common/interface/FileBlob.h"
00002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00003
00004 #include <iostream>
00005 #include <fstream>
00006 #include <string>
00007 #include <zlib.h>
00008
00009 FileBlob::FileBlob(const std::string & fname, bool zip):isize(0){
00010 compressed = zip;
00011
00012
00013
00014
00015
00016 if (isize==0) isize= computeFileSize(fname);
00017
00018 blob.reserve(isize);
00019 read(fname);
00020 }
00021 FileBlob::FileBlob(std::istream& is, bool zip):isize(0) {
00022 compressed = zip;
00023 if (isize==0) isize= computeStreamSize(is);
00024 blob.reserve(isize);
00025 read(is);
00026 }
00027
00028 void FileBlob::read(std::istream & is) {
00029 if(compressed){
00030 std::vector<unsigned char> in;
00031 in.reserve(isize);
00032 char c;
00033 while (is.get(c))
00034 in.push_back((unsigned char)c);
00035
00036
00037
00038
00039
00040
00041 blob.resize(isize);
00042 uLongf destLen = compressBound(in.size());
00043 int zerr = compress2(&*blob.begin(), &destLen,
00044 &*in.begin(), in.size(),
00045 9);
00046 if (zerr!=0) edm::LogError("FileBlob")<< "Compression error " << zerr;
00047 blob.resize(destLen);
00048 }else{
00049
00050 char c;
00051 while (is.get(c))
00052 blob.push_back( (unsigned char)c);
00053 blob.resize(blob.size());
00054 isize=blob.size();
00055 }
00056 }
00057
00058 void FileBlob::write(std::ostream & os) const {
00059 if(compressed){
00060 std::vector<unsigned char> out(isize);
00061 uLongf destLen = out.size();
00062 int zerr = uncompress(&*out.begin(), &destLen,
00063 &*blob.begin(), blob.size());
00064 if (zerr!=0 || out.size()!=destLen)
00065 edm::LogError("FileBlob")<< "uncompressing error " << zerr
00066 << " original size was " << isize
00067 << " new size is " << destLen;
00068 os.write((const char *)(&*out.begin()),out.size());
00069 }else{
00070 os.write((char *)&*blob.begin(),blob.size());
00071 }
00072 }
00073
00074 std::vector<unsigned char>* FileBlob::getUncompressedBlob() const {
00075 std::vector<unsigned char>* newblob;
00076 if(compressed)
00077 {
00078 newblob = new std::vector<unsigned char>(isize);
00079 uLongf destLen = newblob->size();
00080
00081 int zerr = uncompress(&*(newblob->begin()), &destLen,
00082 &*blob.begin(), blob.size());
00083 if (zerr!=0 || newblob->size()!=destLen)
00084 edm::LogError("FileBlob")<< "uncompressing error " << zerr
00085 << " original size was " << isize
00086 << " new size is " << destLen;
00087 }else{
00088 newblob = new std::vector<unsigned char>(blob);
00089 }
00090 return newblob;
00091 }
00092
00093 void FileBlob::getUncompressedBlob( std::vector<unsigned char>& myblobcopy ) const {
00094 if(compressed)
00095 {
00096 myblobcopy.reserve(isize);
00097 uLongf destLen = isize;
00098 int zerr = uncompress(&*myblobcopy.begin(), &destLen,
00099 &*blob.begin(), blob.size());
00100 if (zerr!=0 || myblobcopy.size()!=destLen)
00101 edm::LogError("FileBlob")<< "uncompressing error " << zerr
00102 << " original size was " << isize
00103 << " new size is " << destLen;
00104 }else{
00105 myblobcopy = blob;
00106 }
00107
00108 }
00109
00110 void FileBlob::read(const std::string & fname) {
00111 std::ifstream ifile(fname.c_str());
00112 if (!ifile) { edm::LogError("FileBlob")<< "file " << fname << " does not exist...";}
00113 else read(ifile);
00114 ifile.close();
00115 }
00116
00117 void FileBlob::write(const std::string & fname) const {
00118 std::ofstream ofile(fname.c_str());
00119 write(ofile);
00120 ofile.close();
00121 }
00122
00123 unsigned int FileBlob::computeFileSize(const std::string & fname) {
00124 unsigned int is=0;
00125 std::ifstream ifile(fname.c_str());
00126 if (!ifile) { edm::LogError("FileBlob")<< "file " << fname << " does not exist...";}
00127 else is = computeStreamSize(ifile);
00128 ifile.close();
00129 return is;
00130 }
00131
00132 unsigned int FileBlob::computeStreamSize(std::istream & is) {
00133 unsigned int rs=0;
00134 char c;
00135 while (is.get(c)) rs++;
00136 is.clear();
00137 is.seekg(0);
00138 return rs;
00139 }