| Index: remoting/client/chromoting_view.cc
|
| ===================================================================
|
| --- remoting/client/chromoting_view.cc (revision 0)
|
| +++ remoting/client/chromoting_view.cc (revision 0)
|
| @@ -0,0 +1,103 @@
|
| +// 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/chromoting_view.h"
|
| +
|
| +#include "remoting/base/decoder_verbatim.h"
|
| +#include "remoting/base/decoder_zlib.h"
|
| +
|
| +namespace remoting {
|
| +
|
| +ChromotingView::ChromotingView()
|
| + : frame_width_(0),
|
| + frame_height_(0) {
|
| +}
|
| +
|
| +bool ChromotingView::SetupDecoder(UpdateStreamEncoding encoding) {
|
| + if (encoding == EncodingInvalid) {
|
| + LOG(ERROR) << "Cannot create encoder for EncodingInvalid";
|
| + return false;
|
| + }
|
| +
|
| + // If we're in the middle of decoding a stream, then we need to make sure
|
| + // that that all packets in that stream match the encoding of the first
|
| + // packet.
|
| + //
|
| + // If we decide to relax this constraint in the future, we'll need to
|
| + // update this to keep a set of decoders around.
|
| + if (decoder_.get() && decoder_->IsStarted()) {
|
| + // Verify that the encoding matches the decoder. Once we've started
|
| + // decoding, we can't switch to another decoder.
|
| + if (decoder_->Encoding() != encoding) {
|
| + LOG(ERROR) << "Encoding mismatch: Set up to handle "
|
| + << "UpdateStreamEncoding=" << decoder_->Encoding()
|
| + << " but received request for "
|
| + << encoding;
|
| + return false;
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + // Lazily initialize a new decoder.
|
| + // We create a new decoder if we don't currently have a decoder or if the
|
| + // decoder doesn't match the desired encoding.
|
| + if (!decoder_.get() || decoder_->Encoding() != encoding) {
|
| + // Initialize a new decoder based on this message encoding.
|
| + if (encoding == EncodingNone) {
|
| + decoder_.reset(new DecoderVerbatim());
|
| + } else if (encoding == EncodingZlib) {
|
| + decoder_.reset(new DecoderZlib());
|
| + }
|
| + // Make sure we successfully allocated a decoder of the correct type.
|
| + DCHECK(decoder_.get());
|
| + DCHECK(decoder_->Encoding() == encoding);
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool ChromotingView::BeginDecoding(Task* partial_decode_done,
|
| + Task* decode_done) {
|
| + if (decoder_->IsStarted()) {
|
| + LOG(ERROR) << "BeginDecoding called without ending previous decode.";
|
| + return false;
|
| + }
|
| +
|
| + decoder_->BeginDecode(frame_, &update_rects_,
|
| + partial_decode_done, decode_done);
|
| +
|
| + if (!decoder_->IsStarted()) {
|
| + LOG(ERROR) << "Unable to start decoding.";
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool ChromotingView::Decode(HostMessage* msg) {
|
| + if (!decoder_->IsStarted()) {
|
| + LOG(ERROR) << "Attempt to decode payload before calling BeginDecode.";
|
| + return false;
|
| + }
|
| +
|
| + return decoder_->PartialDecode(msg);
|
| +}
|
| +
|
| +bool ChromotingView::EndDecoding() {
|
| + if (!decoder_->IsStarted()) {
|
| + LOG(ERROR) << "Attempt to end decode when none has been started.";
|
| + return false;
|
| + }
|
| +
|
| + decoder_->EndDecode();
|
| +
|
| + if (decoder_->IsStarted()) {
|
| + LOG(ERROR) << "Unable to properly end decoding.\n";
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +} // namespace remoting
|
|
|
| Property changes on: remoting/client/chromoting_view.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|