| Index: ppapi/proxy/flash_clipboard_resource.cc
|
| diff --git a/ppapi/proxy/flash_clipboard_resource.cc b/ppapi/proxy/flash_clipboard_resource.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1ef90e2a6079af55b9d39877990137e13624bd05
|
| --- /dev/null
|
| +++ b/ppapi/proxy/flash_clipboard_resource.cc
|
| @@ -0,0 +1,156 @@
|
| +// 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.
|
| +
|
| +#include "ppapi/proxy/flash_clipboard_resource.h"
|
| +
|
| +#include "ipc/ipc_message.h"
|
| +#include "ppapi/c/pp_errors.h"
|
| +#include "ppapi/proxy/ppapi_messages.h"
|
| +#include "ppapi/shared_impl/ppapi_globals.h"
|
| +#include "ppapi/shared_impl/var.h"
|
| +#include "ppapi/shared_impl/var_tracker.h"
|
| +
|
| +namespace ppapi {
|
| +namespace proxy {
|
| +
|
| +namespace {
|
| +
|
| +// Returns whether the given clipboard type is valid.
|
| +bool IsValidClipboardType(PP_Flash_Clipboard_Type type) {
|
| + return type == PP_FLASH_CLIPBOARD_TYPE_STANDARD ||
|
| + type == PP_FLASH_CLIPBOARD_TYPE_SELECTION;
|
| +}
|
| +
|
| +// Convert a PP_Var to/from a string which is transmitted to the pepper host.
|
| +// These functions assume the format is valid.
|
| +bool PPVarToClipboardString(int32_t format,
|
| + const PP_Var& var,
|
| + std::string* string_out) {
|
| + if (format == PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT ||
|
| + format == PP_FLASH_CLIPBOARD_FORMAT_HTML) {
|
| + StringVar* string_var = StringVar::FromPPVar(var);
|
| + if (!string_var)
|
| + return false;
|
| + *string_out = string_var->value();
|
| + return true;
|
| + } else {
|
| + // All other formats are expected to be array buffers.
|
| + ArrayBufferVar* array_buffer_var = ArrayBufferVar::FromPPVar(var);
|
| + if (!array_buffer_var)
|
| + return false;
|
| + *string_out = std::string(static_cast<const char*>(array_buffer_var->Map()),
|
| + array_buffer_var->ByteLength());
|
| + return true;
|
| + }
|
| +}
|
| +
|
| +PP_Var ClipboardStringToPPVar(int32_t format,
|
| + const std::string& string) {
|
| + if (format == PP_FLASH_CLIPBOARD_FORMAT_PLAINTEXT ||
|
| + format == PP_FLASH_CLIPBOARD_FORMAT_HTML) {
|
| + return StringVar::StringToPPVar(string);
|
| + } else {
|
| + // All other formats are expected to be array buffers.
|
| + return PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar(
|
| + string.size(), string.data());
|
| + }
|
| +}
|
| +} // namespace
|
| +
|
| +FlashClipboardResource::FlashClipboardResource(
|
| + Connection connection, PP_Instance instance)
|
| + : PluginResource(connection, instance) {
|
| + SendCreate(RENDERER, PpapiHostMsg_FlashClipboard_Create());
|
| +}
|
| +
|
| +FlashClipboardResource::~FlashClipboardResource() {
|
| +}
|
| +
|
| +thunk::PPB_Flash_Clipboard_API*
|
| +FlashClipboardResource::AsPPB_Flash_Clipboard_API() {
|
| + return this;
|
| +}
|
| +
|
| +uint32_t FlashClipboardResource::RegisterCustomFormat(
|
| + PP_Instance instance,
|
| + const char* format_name) {
|
| + // Check to see if the format has already been registered.
|
| + uint32_t format = clipboard_formats_.GetFormatID(format_name);
|
| + if (format != PP_FLASH_CLIPBOARD_FORMAT_INVALID)
|
| + return format;
|
| + int32_t result =
|
| + SyncCall<PpapiPluginMsg_FlashClipboard_RegisterCustomFormatReply>(
|
| + RENDERER,
|
| + PpapiHostMsg_FlashClipboard_RegisterCustomFormat(format_name),
|
| + &format);
|
| + if (result != PP_OK || format == PP_FLASH_CLIPBOARD_FORMAT_INVALID)
|
| + return PP_FLASH_CLIPBOARD_FORMAT_INVALID;
|
| + clipboard_formats_.SetRegisteredFormat(format_name, format);
|
| + return format;
|
| +}
|
| +
|
| +PP_Bool FlashClipboardResource::IsFormatAvailable(
|
| + PP_Instance instance,
|
| + PP_Flash_Clipboard_Type clipboard_type,
|
| + uint32_t format) {
|
| + if (IsValidClipboardType(clipboard_type) &&
|
| + (FlashClipboardFormatRegistry::IsValidPredefinedFormat(format) ||
|
| + clipboard_formats_.IsFormatRegistered(format))) {
|
| + int32_t result = SyncCall<IPC::Message>(RENDERER,
|
| + PpapiHostMsg_FlashClipboard_IsFormatAvailable(clipboard_type, format));
|
| + return result == PP_OK ? PP_TRUE : PP_FALSE;
|
| + }
|
| + return PP_FALSE;
|
| +}
|
| +
|
| +PP_Var FlashClipboardResource::ReadData(
|
| + PP_Instance instance,
|
| + PP_Flash_Clipboard_Type clipboard_type,
|
| + uint32_t format) {
|
| + std::string value;
|
| + int32_t result =
|
| + SyncCall<PpapiPluginMsg_FlashClipboard_ReadDataReply>(
|
| + RENDERER,
|
| + PpapiHostMsg_FlashClipboard_ReadData(clipboard_type, format),
|
| + &value);
|
| + if (result != PP_OK)
|
| + return PP_MakeUndefined();
|
| +
|
| + return ClipboardStringToPPVar(format, value);
|
| +}
|
| +
|
| +int32_t FlashClipboardResource::WriteData(
|
| + PP_Instance instance,
|
| + PP_Flash_Clipboard_Type clipboard_type,
|
| + uint32_t data_item_count,
|
| + const uint32_t formats[],
|
| + const PP_Var data_items[]) {
|
| + if (!IsValidClipboardType(clipboard_type))
|
| + return PP_ERROR_BADARGUMENT;
|
| + std::vector<uint32_t> formats_vector;
|
| + std::vector<std::string> data_items_vector;
|
| + for (size_t i = 0; i < data_item_count; ++i) {
|
| + if (!clipboard_formats_.IsFormatRegistered(formats[i]) &&
|
| + !FlashClipboardFormatRegistry::IsValidPredefinedFormat(formats[i])) {
|
| + return PP_ERROR_BADARGUMENT;
|
| + }
|
| + formats_vector.push_back(formats[i]);
|
| + std::string string;
|
| + if (!PPVarToClipboardString(formats[i], data_items[i], &string))
|
| + return PP_ERROR_BADARGUMENT;
|
| + data_items_vector.push_back(string);
|
| + }
|
| +
|
| + Post(RENDERER,
|
| + PpapiHostMsg_FlashClipboard_WriteData(
|
| + static_cast<uint32_t>(clipboard_type),
|
| + formats_vector,
|
| + data_items_vector));
|
| +
|
| + // Assume success, since it allows us to avoid a sync IPC.
|
| + return PP_OK;
|
| +}
|
| +
|
| +} // namespace proxy
|
| +} // namespace ppapi
|
|
|