1 // Copyright (c) 2013 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/truetype_font_resource.h" 6 7 #include "base/bind.h" 8 #include "ipc/ipc_message.h" 9 #include "ppapi/c/pp_errors.h" 10 #include "ppapi/proxy/ppapi_messages.h" 11 #include "ppapi/shared_impl/array_writer.h" 12 #include "ppapi/shared_impl/ppapi_globals.h" 13 #include "ppapi/shared_impl/resource_tracker.h" 14 #include "ppapi/shared_impl/var.h" 15 #include "ppapi/thunk/enter.h" 16 17 using ppapi::thunk::EnterResourceNoLock; 18 using ppapi::thunk::PPB_TrueTypeFont_API; 19 20 namespace { 21 22 } // namespace 23 24 namespace ppapi { 25 namespace proxy { 26 27 TrueTypeFontResource::TrueTypeFontResource( 28 Connection connection, 29 PP_Instance instance, 30 const PP_TrueTypeFontDesc_Dev& desc) 31 : PluginResource(connection, instance) { 32 SerializedTrueTypeFontDesc serialized_desc; 33 serialized_desc.SetFromPPTrueTypeFontDesc(desc); 34 SendCreate(RENDERER, PpapiHostMsg_TrueTypeFont_Create(serialized_desc)); 35 } 36 37 TrueTypeFontResource::~TrueTypeFontResource() { 38 } 39 40 PPB_TrueTypeFont_API* TrueTypeFontResource::AsPPB_TrueTypeFont_API() { 41 return this; 42 } 43 44 int32_t TrueTypeFontResource::Describe( 45 PP_TrueTypeFontDesc_Dev* desc, 46 scoped_refptr<TrackedCallback> callback) { 47 Call<PpapiPluginMsg_TrueTypeFont_DescribeReply>(RENDERER, 48 PpapiHostMsg_TrueTypeFont_Describe(), 49 base::Bind(&TrueTypeFontResource::OnPluginMsgDescribeComplete, this, 50 callback, desc)); 51 return PP_OK_COMPLETIONPENDING; 52 } 53 54 int32_t TrueTypeFontResource::GetTableTags( 55 const PP_ArrayOutput& output, 56 scoped_refptr<TrackedCallback> callback) { 57 Call<PpapiPluginMsg_TrueTypeFont_GetTableTagsReply>(RENDERER, 58 PpapiHostMsg_TrueTypeFont_GetTableTags(), 59 base::Bind(&TrueTypeFontResource::OnPluginMsgGetTableTagsComplete, this, 60 callback, output)); 61 return PP_OK_COMPLETIONPENDING; 62 } 63 64 int32_t TrueTypeFontResource::GetTable( 65 uint32_t table, 66 int32_t offset, 67 int32_t max_data_length, 68 const PP_ArrayOutput& output, 69 scoped_refptr<TrackedCallback> callback) { 70 Call<PpapiPluginMsg_TrueTypeFont_GetTableReply>(RENDERER, 71 PpapiHostMsg_TrueTypeFont_GetTable(table, offset, max_data_length), 72 base::Bind(&TrueTypeFontResource::OnPluginMsgGetTableComplete, this, 73 callback, output)); 74 return PP_OK_COMPLETIONPENDING; 75 } 76 77 void TrueTypeFontResource::OnPluginMsgDescribeComplete( 78 scoped_refptr<TrackedCallback> callback, 79 PP_TrueTypeFontDesc_Dev* pp_desc, 80 const ResourceMessageReplyParams& params, 81 const ppapi::proxy::SerializedTrueTypeFontDesc& desc) { 82 int32_t result = params.result(); 83 if (result == PP_OK) 84 desc.CopyToPPTrueTypeFontDesc(pp_desc); 85 86 callback->Run(result); 87 } 88 89 void TrueTypeFontResource::OnPluginMsgGetTableTagsComplete( 90 scoped_refptr<TrackedCallback> callback, 91 PP_ArrayOutput array_output, 92 const ResourceMessageReplyParams& params, 93 const std::vector<uint32_t>& tag_array) { 94 // The result code should contain the data size if it's positive. 95 int32_t result = params.result(); 96 DCHECK((result < 0 && tag_array.size() == 0) || 97 result == static_cast<int32_t>(tag_array.size())); 98 99 ArrayWriter output; 100 output.set_pp_array_output(array_output); 101 if (output.is_valid()) 102 output.StoreArray(&tag_array[0], std::max(0, result)); 103 else 104 result = PP_ERROR_FAILED; 105 106 callback->Run(result); 107 } 108 109 void TrueTypeFontResource::OnPluginMsgGetTableComplete( 110 scoped_refptr<TrackedCallback> callback, 111 PP_ArrayOutput array_output, 112 const ResourceMessageReplyParams& params, 113 const std::string& data) { 114 // The result code should contain the data size if it's positive. 115 int32_t result = params.result(); 116 DCHECK((result < 0 && data.size() == 0) || 117 result == static_cast<int32_t>(data.size())); 118 119 ArrayWriter output; 120 output.set_pp_array_output(array_output); 121 if (output.is_valid()) 122 output.StoreArray(data.data(), std::max(0, result)); 123 else 124 result = PP_ERROR_FAILED; 125 126 callback->Run(result); 127 } 128 129 } // namespace proxy 130 } // namespace ppapi 131