diff options
Diffstat (limited to 'vdr-vdrmanager/helpers.cpp')
-rw-r--r-- | vdr-vdrmanager/helpers.cpp | 84 |
1 files changed, 80 insertions, 4 deletions
diff --git a/vdr-vdrmanager/helpers.cpp b/vdr-vdrmanager/helpers.cpp index 7dcef54..80721f3 100644 --- a/vdr-vdrmanager/helpers.cpp +++ b/vdr-vdrmanager/helpers.cpp @@ -709,10 +709,6 @@ string cHelpers::ToText(cRecording * recording) { } } - result += ":"; - //Feature #1319 - result += recording->Name(); - result += "\r\n"; return result; } @@ -1070,6 +1066,86 @@ int cHelpers::RecordingLengthInSeconds(cRecording* recording) { return Duration(recording) * 60; } +/** Compress a STL string using zlib with given compression level and return + * the binary data. */ +string cHelpers::compress_string(const string& str, int compressionlevel) { + z_stream zs; // z_stream is zlib's control structure + memset(&zs, 0, sizeof(zs)); + + if (deflateInit(&zs, compressionlevel) != Z_OK) + throw(runtime_error("deflateInit failed while compressing.")); + + zs.next_in = (Bytef*) str.data(); + zs.avail_in = str.size(); // set the z_stream's input + + int ret; + char outbuffer[32768]; + string outstring; + +// retrieve the compressed bytes blockwise + do { + zs.next_out = reinterpret_cast<Bytef*>(outbuffer); + zs.avail_out = sizeof(outbuffer); + + ret = deflate(&zs, Z_FINISH); + + if (outstring.size() < zs.total_out) { + // append the block to the output string + outstring.append(outbuffer, zs.total_out - outstring.size()); + } + } while (ret == Z_OK); + + deflateEnd(&zs); + + if (ret != Z_STREAM_END) { // an error occurred that was not EOF + ostringstream oss; + oss << "Exception during zlib compression: (" << ret << ") " << zs.msg; + throw(runtime_error(oss.str())); + } + + return outstring; +} + +/** Decompress an STL string using zlib and return the original data. */ +string cHelpers::decompress_string(const string& str) { + z_stream zs; // z_stream is zlib's control structure + memset(&zs, 0, sizeof(zs)); + + if (inflateInit(&zs) != Z_OK) + throw(runtime_error("inflateInit failed while decompressing.")); + + zs.next_in = (Bytef*) str.data(); + zs.avail_in = str.size(); + + int ret; + char outbuffer[32768]; + string outstring; + +// get the decompressed bytes blockwise using repeated calls to inflate + do { + zs.next_out = reinterpret_cast<Bytef*>(outbuffer); + zs.avail_out = sizeof(outbuffer); + + ret = inflate(&zs, 0); + + if (outstring.size() < zs.total_out) { + outstring.append(outbuffer, zs.total_out - outstring.size()); + } + + } while (ret == Z_OK); + + inflateEnd(&zs); + + if (ret != Z_STREAM_END) { // an error occurred that was not EOF + ostringstream oss; + oss << "Exception during zlib decompression: (" << ret << ") " + << zs.msg; + throw(runtime_error(oss.str())); + } + + return outstring; +} + //These three methodes were stolen from vdr-restfulapi project. Thanks! std::queue<int> cHelpers::ConvertToBinary(int v) { int b; |