Pepper/Flapper: Implement proxy for clipboard stuff.

BUG=none
TEST=none

Review URL: http://codereview.chromium.org/6650029

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@77491 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/ppapi/ppapi_shared_proxy.gypi b/ppapi/ppapi_shared_proxy.gypi
index c4ff61c..0c8b1ce0 100644
--- a/ppapi/ppapi_shared_proxy.gypi
+++ b/ppapi/ppapi_shared_proxy.gypi
@@ -91,6 +91,8 @@
         'proxy/ppb_file_ref_proxy.h',
         'proxy/ppb_file_system_proxy.cc',
         'proxy/ppb_file_system_proxy.h',
+        'proxy/ppb_flash_clipboard_proxy.cc',
+        'proxy/ppb_flash_clipboard_proxy.h',
         'proxy/ppb_flash_file_proxy.cc',
         'proxy/ppb_flash_file_proxy.h',
         'proxy/ppb_flash_proxy.cc',
diff --git a/ppapi/proxy/dispatcher.cc b/ppapi/proxy/dispatcher.cc
index 2051588..dd4167c 100644
--- a/ppapi/proxy/dispatcher.cc
+++ b/ppapi/proxy/dispatcher.cc
@@ -37,6 +37,7 @@
 #include "ppapi/c/ppb_url_response_info.h"
 #include "ppapi/c/ppp_instance.h"
 #include "ppapi/c/private/ppb_flash.h"
+#include "ppapi/c/private/ppb_flash_clipboard.h"
 #include "ppapi/c/private/ppb_flash_file.h"
 #include "ppapi/c/private/ppb_flash_menu.h"
 #include "ppapi/c/private/ppb_pdf.h"
@@ -52,6 +53,7 @@
 #include "ppapi/proxy/ppb_file_chooser_proxy.h"
 #include "ppapi/proxy/ppb_file_ref_proxy.h"
 #include "ppapi/proxy/ppb_file_system_proxy.h"
+#include "ppapi/proxy/ppb_flash_clipboard_proxy.h"
 #include "ppapi/proxy/ppb_flash_file_proxy.h"
 #include "ppapi/proxy/ppb_flash_proxy.h"
 #include "ppapi/proxy/ppb_flash_menu_proxy.h"
@@ -109,6 +111,7 @@
   AddPPB(PPB_FileChooser_Proxy::GetInfo());
   AddPPB(PPB_FileRef_Proxy::GetInfo());
   AddPPB(PPB_FileSystem_Proxy::GetInfo());
+  AddPPB(PPB_Flash_Clipboard_Proxy::GetInfo());
   AddPPB(PPB_Flash_File_FileRef_Proxy::GetInfo());
   AddPPB(PPB_Flash_File_ModuleLocal_Proxy::GetInfo());
   AddPPB(PPB_Flash_Proxy::GetInfo());
diff --git a/ppapi/proxy/interface_id.h b/ppapi/proxy/interface_id.h
index 191f990..5cf4ac3 100644
--- a/ppapi/proxy/interface_id.h
+++ b/ppapi/proxy/interface_id.h
@@ -24,6 +24,7 @@
   INTERFACE_ID_PPB_FILE_REF,
   INTERFACE_ID_PPB_FILE_SYSTEM,
   INTERFACE_ID_PPB_FLASH,
+  INTERFACE_ID_PPB_FLASH_CLIPBOARD,
   INTERFACE_ID_PPB_FLASH_FILE_FILEREF,
   INTERFACE_ID_PPB_FLASH_FILE_MODULELOCAL,
   INTERFACE_ID_PPB_FLASH_MENU,
diff --git a/ppapi/proxy/ppapi_messages_internal.h b/ppapi/proxy/ppapi_messages_internal.h
index 129502a6..e37f65b 100644
--- a/ppapi/proxy/ppapi_messages_internal.h
+++ b/ppapi/proxy/ppapi_messages_internal.h
@@ -356,6 +356,16 @@
 IPC_SYNC_MESSAGE_ROUTED1_0(PpapiHostMsg_PPBFlash_QuitMessageLoop,
                            PP_Instance /* instance */)
 
+// PPB_Flash_Clipboard.
+IPC_SYNC_MESSAGE_ROUTED2_1(PpapiHostMsg_PPBFlashClipboard_ReadPlainText,
+                           PP_Instance /* instance */,
+                           int /* clipboard_type */,
+                           pp::proxy::SerializedVar /* result */)
+IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBFlashClipboard_WritePlainText,
+                    PP_Instance /* instance */,
+                    int /* clipboard_type */,
+                    pp::proxy::SerializedVar /* text */)
+
 // PPB_Flash_File_FileRef.
 IPC_SYNC_MESSAGE_ROUTED2_2(PpapiHostMsg_PPBFlashFile_FileRef_OpenFile,
                            pp::proxy::HostResource /* file_ref */,
diff --git a/ppapi/proxy/ppb_flash_clipboard_proxy.cc b/ppapi/proxy/ppb_flash_clipboard_proxy.cc
new file mode 100644
index 0000000..a849071
--- /dev/null
+++ b/ppapi/proxy/ppb_flash_clipboard_proxy.cc
@@ -0,0 +1,125 @@
+// Copyright (c) 2011 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 "ppapi/proxy/ppb_flash_clipboard_proxy.h"
+
+#include "ppapi/c/pp_errors.h"
+#include "ppapi/c/private/ppb_flash_clipboard.h"
+#include "ppapi/proxy/plugin_dispatcher.h"
+#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/proxy/serialized_var.h"
+
+namespace pp {
+namespace proxy {
+
+namespace {
+
+bool IsValidClipboardType(PP_Flash_Clipboard_Type clipboard_type) {
+  return clipboard_type == PP_FLASH_CLIPBOARD_TYPE_STANDARD ||
+         clipboard_type == PP_FLASH_CLIPBOARD_TYPE_SELECTION ||
+         clipboard_type == PP_FLASH_CLIPBOARD_TYPE_DRAG;
+}
+
+PP_Var ReadPlainText(PP_Instance instance_id,
+                     PP_Flash_Clipboard_Type clipboard_type) {
+  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
+  if (!dispatcher)
+    return PP_MakeUndefined();
+
+  if (!IsValidClipboardType(clipboard_type))
+    return PP_MakeUndefined();
+
+  ReceiveSerializedVarReturnValue result;
+  dispatcher->Send(new PpapiHostMsg_PPBFlashClipboard_ReadPlainText(
+      INTERFACE_ID_PPB_FLASH_CLIPBOARD, instance_id,
+      static_cast<int>(clipboard_type), &result));
+  return result.Return(dispatcher);
+}
+
+int32_t WritePlainText(PP_Instance instance_id,
+                       PP_Flash_Clipboard_Type clipboard_type,
+                       PP_Var text) {
+  PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance_id);
+  if (!dispatcher)
+    return PP_ERROR_BADARGUMENT;
+
+  if (!IsValidClipboardType(clipboard_type))
+    return PP_ERROR_BADARGUMENT;
+
+  dispatcher->Send(new PpapiHostMsg_PPBFlashClipboard_WritePlainText(
+      INTERFACE_ID_PPB_FLASH_CLIPBOARD,
+      instance_id,
+      static_cast<int>(clipboard_type),
+      SerializedVarSendInput(dispatcher, text)));
+  // Assume success, since it allows us to avoid a sync IPC.
+  return PP_OK;
+}
+
+const PPB_Flash_Clipboard flash_clipboard_interface = {
+  &ReadPlainText,
+  &WritePlainText
+};
+
+InterfaceProxy* CreateFlashClipboardProxy(Dispatcher* dispatcher,
+                                          const void* target_interface) {
+  return new PPB_Flash_Clipboard_Proxy(dispatcher, target_interface);
+}
+
+}  // namespace
+
+PPB_Flash_Clipboard_Proxy::PPB_Flash_Clipboard_Proxy(
+    Dispatcher* dispatcher, const void* target_interface)
+    : InterfaceProxy(dispatcher, target_interface) {
+}
+
+PPB_Flash_Clipboard_Proxy::~PPB_Flash_Clipboard_Proxy() {
+}
+
+// static
+const InterfaceProxy::Info* PPB_Flash_Clipboard_Proxy::GetInfo() {
+  static const Info info = {
+    &flash_clipboard_interface,
+    PPB_FLASH_CLIPBOARD_INTERFACE,
+    INTERFACE_ID_PPB_FLASH_CLIPBOARD,
+    false,
+    &CreateFlashClipboardProxy
+  };
+  return &info;
+}
+
+bool PPB_Flash_Clipboard_Proxy::OnMessageReceived(const IPC::Message& msg) {
+  bool handled = true;
+  IPC_BEGIN_MESSAGE_MAP(PPB_Flash_Clipboard_Proxy, msg)
+    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashClipboard_ReadPlainText,
+                        OnMsgReadPlainText)
+    IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashClipboard_WritePlainText,
+                        OnMsgWritePlainText)
+    IPC_MESSAGE_UNHANDLED(handled = false)
+  IPC_END_MESSAGE_MAP()
+  return handled;
+}
+
+void PPB_Flash_Clipboard_Proxy::OnMsgReadPlainText(
+    PP_Instance instance_id,
+    int clipboard_type,
+    SerializedVarReturnValue result) {
+  result.Return(dispatcher(),
+                ppb_flash_clipboard_target()->ReadPlainText(
+                    instance_id,
+                    static_cast<PP_Flash_Clipboard_Type>(clipboard_type)));
+}
+
+void PPB_Flash_Clipboard_Proxy::OnMsgWritePlainText(
+    PP_Instance instance_id,
+    int clipboard_type,
+    SerializedVarReceiveInput text) {
+  int32_t result = ppb_flash_clipboard_target()->WritePlainText(
+      instance_id,
+      static_cast<PP_Flash_Clipboard_Type>(clipboard_type),
+      text.Get(dispatcher()));
+  LOG_IF(WARNING, result != PP_OK) << "Write to clipboard failed unexpectedly.";
+}
+
+}  // namespace proxy
+}  // namespace pp
diff --git a/ppapi/proxy/ppb_flash_clipboard_proxy.h b/ppapi/proxy/ppb_flash_clipboard_proxy.h
new file mode 100644
index 0000000..2d68183
--- /dev/null
+++ b/ppapi/proxy/ppb_flash_clipboard_proxy.h
@@ -0,0 +1,47 @@
+// Copyright (c) 2011 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 PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_
+#define PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_
+
+#include "ppapi/c/pp_instance.h"
+#include "ppapi/proxy/interface_proxy.h"
+
+struct PPB_Flash_Clipboard;
+
+namespace pp {
+namespace proxy {
+
+class SerializedVarReceiveInput;
+class SerializedVarReturnValue;
+
+class PPB_Flash_Clipboard_Proxy : public InterfaceProxy {
+ public:
+  PPB_Flash_Clipboard_Proxy(Dispatcher* dispatcher,
+                            const void* target_interface);
+  virtual ~PPB_Flash_Clipboard_Proxy();
+
+  static const Info* GetInfo();
+
+  const PPB_Flash_Clipboard* ppb_flash_clipboard_target() const {
+    return reinterpret_cast<const PPB_Flash_Clipboard*>(target_interface());
+  }
+
+  // InterfaceProxy implementation.
+  virtual bool OnMessageReceived(const IPC::Message& msg);
+
+ private:
+  // Message handlers.
+  void OnMsgReadPlainText(PP_Instance instance_id,
+                          int clipboard_type,
+                          SerializedVarReturnValue result);
+  void OnMsgWritePlainText(PP_Instance instance_id,
+                           int clipboard_type,
+                           SerializedVarReceiveInput text);
+};
+
+}  // namespace proxy
+}  // namespace pp
+
+#endif  // PPAPI_PROXY_PPB_FLASH_CLIPBOARD_PROXY_H_