Home | History | Annotate | Download | only in pairing
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef COMPONENTS_PAIRING_PROTO_DECODER_H_
      6 #define COMPONENTS_PAIRING_PROTO_DECODER_H_
      7 
      8 #include <deque>
      9 
     10 #include "base/logging.h"
     11 #include "base/macros.h"
     12 #include "base/memory/ref_counted.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "components/pairing/message_buffer.h"
     15 
     16 namespace net {
     17 class IOBuffer;
     18 }
     19 
     20 namespace pairing_api {
     21 class CompleteSetup;
     22 class ConfigureHost;
     23 class Error;
     24 class HostStatus;
     25 class PairDevices;
     26 }  // namespace pairing_api
     27 
     28 namespace pairing_chromeos {
     29 
     30 // A ProtoDecoder collects data from a series of IOBuffers and decodes Proto
     31 // buffers from the data.  The decoded messages are then forwarded to an
     32 // observer.
     33 class ProtoDecoder {
     34  public:
     35   typedef scoped_refptr<net::IOBuffer> IOBufferRefPtr;
     36   class Observer {
     37    public:
     38     virtual ~Observer() {}
     39 
     40     virtual void OnHostStatusMessage(
     41         const pairing_api::HostStatus& message) = 0;
     42     virtual void OnConfigureHostMessage(
     43         const pairing_api::ConfigureHost& message) = 0;
     44     virtual void OnPairDevicesMessage(
     45         const pairing_api::PairDevices& message) = 0;
     46     virtual void OnCompleteSetupMessage(
     47         const pairing_api::CompleteSetup& message) = 0;
     48     virtual void OnErrorMessage(
     49         const pairing_api::Error& message) = 0;
     50 
     51    protected:
     52     Observer() {}
     53 
     54    private:
     55     DISALLOW_COPY_AND_ASSIGN(Observer);
     56   };
     57 
     58   explicit ProtoDecoder(Observer* observer);
     59   ~ProtoDecoder();
     60 
     61   // Decodes the data from an io_buffer, and sends out events for any complete
     62   // messages.
     63   bool DecodeIOBuffer(int size, IOBufferRefPtr io_buffer);
     64 
     65   // Convenience functions for serializing messages into an IOBuffer.
     66   static IOBufferRefPtr SendHostStatus(const pairing_api::HostStatus& message,
     67                                        int* size);
     68   static IOBufferRefPtr SendConfigureHost(
     69       const pairing_api::ConfigureHost& message, int* size);
     70   static IOBufferRefPtr SendPairDevices(const pairing_api::PairDevices& message,
     71                                         int* size);
     72   static IOBufferRefPtr SendCompleteSetup(
     73       const pairing_api::CompleteSetup& message, int* size);
     74   static IOBufferRefPtr SendError(const pairing_api::Error& message, int* size);
     75 
     76  private:
     77   static IOBufferRefPtr SendMessage(uint8_t message_type,
     78                                     const std::string& message,
     79                                     int* size);
     80 
     81   Observer* observer_;
     82   MessageBuffer message_buffer_;
     83   int next_message_type_;
     84   int next_message_size_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(ProtoDecoder);
     87 };
     88 
     89 }  // namespace pairing_chromeos
     90 
     91 #endif  // COMPONENTS_PAIRING_PROTO_DECODER_H_
     92