- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / proxy / truetype_font_resource.cc
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