// Copyright (c) 2012 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.

#ifndef REMOTING_PROTOCOL_CLIPBOARD_ECHO_FILTER_H_
#define REMOTING_PROTOCOL_CLIPBOARD_ECHO_FILTER_H_

#include <map>
#include <string>

#include "base/compiler_specific.h"
#include "base/macros.h"
#include "remoting/protocol/clipboard_stub.h"

namespace remoting {
namespace protocol {

// ClipboardEchoFilter stops the host sending a clipboard item to the
// client, if that item was the latest item received from the client.
class ClipboardEchoFilter {
 public:
  ClipboardEchoFilter();
  ~ClipboardEchoFilter();

  // Sets the ClipboardStub that sends events to the client.
  void set_client_stub(ClipboardStub* client_stub);

  // Sets the ClipboardStub that sends events to the host.
  void set_host_stub(ClipboardStub* host_stub);

  // Gets the ClipboardStub that sends events through this filter and on to the
  // client.
  ClipboardStub* client_filter();

  // Gets the ClipboardStub that sends events through this filter and on to the
  // host.
  ClipboardStub* host_filter();

 private:
  class ClientFilter : public ClipboardStub {
   public:
    ClientFilter(ClipboardEchoFilter* filter);
    void InjectClipboardEvent(const ClipboardEvent& event) override;

   private:
    ClipboardEchoFilter* filter_;
  };

  class HostFilter : public ClipboardStub {
   public:
    HostFilter(ClipboardEchoFilter* filter);
    void InjectClipboardEvent(const ClipboardEvent& event) override;

   private:
    ClipboardEchoFilter* filter_;
  };

  void InjectClipboardEventToHost(const ClipboardEvent& event);
  void InjectClipboardEventToClient(const ClipboardEvent& event);

  ClipboardStub* host_stub_;
  ClipboardStub* client_stub_;
  ClientFilter client_filter_;
  HostFilter host_filter_;

  // The latest item received from the client.
  std::string client_latest_mime_type_;
  std::string client_latest_data_;

  DISALLOW_COPY_AND_ASSIGN(ClipboardEchoFilter);
};

}  // namespace protocol
}  // namespace remoting

#endif  // REMOTING_PROTOCOL_CLIPBOARD_ECHO_FILTER_H_
