| Index: remoting/client/plugin/compression.cc
|
| ===================================================================
|
| --- remoting/client/plugin/compression.cc (revision 0)
|
| +++ remoting/client/plugin/compression.cc (revision 0)
|
| @@ -0,0 +1,114 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "remoting/client/plugin/compression.h"
|
| +
|
| +#include <assert.h>
|
| +
|
| +namespace remoting {
|
| +
|
| +static const int kZLIB_CHUNK = 256 * 1024;
|
| +
|
| +ZCompressor::ZCompressor() {
|
| + stream_.zalloc = Z_NULL;
|
| + stream_.zfree = Z_NULL;
|
| + stream_.opaque = Z_NULL;
|
| +
|
| + deflateInit(&stream_, Z_BEST_SPEED);
|
| +}
|
| +
|
| +void ZCompressor::WriteInternal(char* buffer, int size, int flush) {
|
| + stream_.avail_in = size;
|
| + stream_.next_in = reinterpret_cast<Bytef*>(buffer);
|
| +
|
| + // Expand the internal buffer.
|
| + while (true) {
|
| + int last_size = buffer_.size();
|
| + buffer_.resize(last_size + kZLIB_CHUNK);
|
| + stream_.avail_out = kZLIB_CHUNK;
|
| + stream_.next_out = reinterpret_cast<Bytef*>(&buffer_[last_size]);
|
| + int ret = deflate(&stream_, flush);
|
| + assert(ret != Z_STREAM_ERROR);
|
| +
|
| + // Shrink the size of the vector. It doesn't alter the capacity.
|
| + int compressed = kZLIB_CHUNK - stream_.avail_out;
|
| + buffer_.resize(last_size + compressed);
|
| + if (!compressed)
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void ZCompressor::Write(char* buffer, int size) {
|
| + WriteInternal(buffer, size, Z_NO_FLUSH);
|
| +}
|
| +
|
| +void ZCompressor::Flush() {
|
| + WriteInternal(NULL, 0, Z_FINISH);
|
| + deflateEnd(&stream_);
|
| +}
|
| +
|
| +int ZCompressor::GetCompressedSize() {
|
| + return buffer_.size();
|
| +}
|
| +
|
| +char* ZCompressor::GetCompressedData() {
|
| + return &buffer_[0];
|
| +}
|
| +
|
| +int ZCompressor::GetRawSize() {
|
| + // I don't care about this.
|
| + return 0;
|
| +}
|
| +
|
| +ZDecompressor::ZDecompressor() {
|
| + stream_.zalloc = Z_NULL;
|
| + stream_.zfree = Z_NULL;
|
| + stream_.opaque = Z_NULL;
|
| + stream_.avail_in = 0;
|
| + stream_.next_in = Z_NULL;
|
| +
|
| + inflateInit(&stream_);
|
| +}
|
| +
|
| +void ZDecompressor::WriteInternal(char* buffer, int size, int flush) {
|
| + stream_.avail_in = size;
|
| + stream_.next_in = reinterpret_cast<Bytef*>(buffer);
|
| +
|
| + while (true) {
|
| + int last_size = buffer_.size();
|
| + buffer_.resize(last_size + kZLIB_CHUNK);
|
| + stream_.avail_out = kZLIB_CHUNK;
|
| + stream_.next_out = reinterpret_cast<Bytef*>(&buffer_[last_size]);
|
| + int ret = inflate(&stream_, flush);
|
| + assert(ret != Z_STREAM_ERROR);
|
| +
|
| + // Shrink the size of the vector. It doesn't alter the capacity.
|
| + int decompressed = kZLIB_CHUNK - stream_.avail_out;
|
| + buffer_.resize(last_size + decompressed);
|
| + if (!decompressed)
|
| + break;
|
| + }
|
| +}
|
| +
|
| +void ZDecompressor::Write(char* buffer, int size) {
|
| + WriteInternal(buffer, size, Z_NO_FLUSH);
|
| +}
|
| +
|
| +void ZDecompressor::Flush() {
|
| + inflateEnd(&stream_);
|
| +}
|
| +
|
| +char* ZDecompressor::GetRawData() {
|
| + return &buffer_[0];
|
| +}
|
| +
|
| +int ZDecompressor::GetRawSize() {
|
| + return buffer_.size();
|
| +}
|
| +
|
| +int ZDecompressor::GetCompressedSize() {
|
| + // I don't care.
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|
| Property changes on: remoting/client/plugin/compression.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|