Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(907)

Side by Side Diff: ppapi/proxy/flash_clipboard_resource.cc

Issue 11225021: Move flash clipboard to the new proxy and add custom format support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 #include "ppapi/proxy/flash_clipboard_resource.h"
6
7 #include "ipc/ipc_message.h"
8 #include "ppapi/c/pp_errors.h"
9 #include "ppapi/proxy/dispatch_reply_message.h"
yzshen1 2012/10/29 16:55:46 Do you need this?
raymes 2012/10/29 18:44:58 Done.
10 #include "ppapi/proxy/ppapi_messages.h"
11 #include "ppapi/shared_impl/array_writer.h"
yzshen1 2012/10/29 16:55:46 I don't think you need it.
raymes 2012/10/29 18:44:58 Done.
12 #include "ppapi/shared_impl/var.h"
13 #include "ppapi/shared_impl/var_tracker.h"
14 #include "ppapi/thunk/enter.h"
yzshen1 2012/10/29 16:55:46 Do you need this?
raymes 2012/10/29 18:44:58 Done.
15
16 namespace ppapi {
17 namespace proxy {
18
19 namespace {
20 // Convert a PP_Var to/from a string which is transmitted to the pepper host.
21 // These functions assume the format is valid.
22 bool PP_VarToClipboardString(int32_t format,
yzshen1 2012/10/29 16:55:46 nit: better to follow the style of "StringVar::Fro
raymes 2012/10/29 18:44:58 Done.
23 const PP_Var& var,
24 std::string* string_out) {
25 if (format == PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT ||
26 format == PP_FLASH_CLIPBOARD_FORMAT_HTML) {
27 StringVar* string_var = StringVar::FromPPVar(var);
28 if (!string_var)
29 return false;
30 *string_out = string_var->value();
31 return true;
32 } else {
33 // All other formats are expected to be array buffers.
34 ArrayBufferVar* array_buffer_var = ArrayBufferVar::FromPPVar(var);
35 if (!array_buffer_var)
36 return false;
37 *string_out = std::string(static_cast<const char*>(array_buffer_var->Map()),
38 array_buffer_var->ByteLength());
39 return true;
40 }
41 }
42
43 PP_Var ClipboardStringToPP_Var(int32_t format,
44 const std::string& string) {
45 if (format == PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT ||
46 format == PP_FLASH_CLIPBOARD_FORMAT_HTML) {
47 return StringVar::StringToPPVar(string);
48 } else {
49 // All other formats are expected to be array buffers.
50 return PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
51 string.size(), string.data());
52 }
53 }
54 } // namespace
55
56 FlashClipboardResource::FlashClipboardResource(
57 Connection connection, PP_Instance instance)
58 : PluginResource(connection, instance) {
59 SendCreate(RENDERER, PpapiHostMsg_FlashClipboard_Create());
60 }
61
62 FlashClipboardResource::~FlashClipboardResource() {
63 }
64
65 thunk::PPB_Flash_Clipboard_API*
66 FlashClipboardResource::AsPPB_Flash_Clipboard_API() {
67 return this;
68 }
69
70 uint32_t FlashClipboardResource::RegisterCustomFormat(
71 PP_Instance instance,
72 const char* format_name) {
73 // Check to see if the format has already been registered.
74 uint32_t format = clipboard_formats_.GetFormatID(format_name);
75 if (format != PP_FLASH_CLIPBOARD_FORMAT_INVALID)
76 return format;
77 int32_t result =
78 SyncCall<PpapiPluginMsg_FlashClipboard_RegisterCustomFormatReply>(
79 RENDERER,
80 PpapiHostMsg_FlashClipboard_RegisterCustomFormat(format_name),
81 &format);
82 if (result != PP_OK || format == PP_FLASH_CLIPBOARD_FORMAT_INVALID)
83 return PP_FLASH_CLIPBOARD_FORMAT_INVALID;
84 clipboard_formats_.SetRegisteredFormat(format_name, format);
85 return format;
86 }
87
88 PP_Bool FlashClipboardResource::IsFormatAvailable(
89 PP_Instance instance,
90 PP_Flash_Clipboard_Type clipboard_type,
91 uint32_t format) {
92 if (FlashClipboardFormatRegistry::IsValidClipboardType(clipboard_type) &&
93 (FlashClipboardFormatRegistry::IsValidPredefinedFormat(format) ||
94 clipboard_formats_.IsFormatRegistered(format))) {
95 int32_t result = SyncCall<IPC::Message>(RENDERER,
96 PpapiHostMsg_FlashClipboard_IsFormatAvailable(clipboard_type, format));
97 return result == PP_OK ? PP_TRUE : PP_FALSE;
98 }
99 return PP_FALSE;
100 }
101
102 PP_Var FlashClipboardResource::ReadData(
103 PP_Instance instance,
104 PP_Flash_Clipboard_Type clipboard_type,
105 uint32_t format) {
106 std::string value;
107 int32_t result =
108 SyncCall<PpapiPluginMsg_FlashClipboard_ReadDataReply>(
109 RENDERER,
110 PpapiHostMsg_FlashClipboard_ReadData(clipboard_type, format),
111 &value);
112 if (result != PP_OK)
113 return PP_MakeUndefined();
114
115 return ClipboardStringToPP_Var(format, value);
116 }
117
118 int32_t FlashClipboardResource::WriteData(
119 PP_Instance instance,
120 PP_Flash_Clipboard_Type clipboard_type,
121 uint32_t data_item_count,
122 const uint32_t formats[],
123 const PP_Var data_items[]) {
124 if (!FlashClipboardFormatRegistry::IsValidClipboardType(clipboard_type))
125 return PP_ERROR_BADARGUMENT;
126 std::vector<uint32_t> formats_vector;
127 std::vector<std::string> data_items_vector;
128 for (size_t i = 0; i < data_item_count; ++i) {
129 if (!clipboard_formats_.IsFormatRegistered(formats[i]) &&
130 !FlashClipboardFormatRegistry::IsValidPredefinedFormat(formats[i])) {
131 return PP_ERROR_BADARGUMENT;
132 }
133 formats_vector.push_back(formats[i]);
134 std::string string;
135 if (!PP_VarToClipboardString(formats[i], data_items[i], &string))
136 return PP_ERROR_BADARGUMENT;
137 data_items_vector.push_back(string);
138 }
139
140 Post(RENDERER,
141 PpapiHostMsg_FlashClipboard_WriteData(
142 static_cast<uint32_t>(clipboard_type),
143 formats_vector,
144 data_items_vector));
145
146 // Assume success, since it allows us to avoid a sync IPC.
147 return PP_OK;
148 }
149
150 } // namespace proxy
151 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698