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_singleton_resource.h"
6
7 #include "base/bind.h"
8 #include "ppapi/proxy/ppapi_messages.h"
9 #include "ppapi/proxy/serialized_structs.h"
10 #include "ppapi/shared_impl/array_writer.h"
11 #include "ppapi/shared_impl/ppapi_globals.h"
12 #include "ppapi/shared_impl/tracked_callback.h"
13 #include "ppapi/shared_impl/var.h"
14 #include "ppapi/shared_impl/var_tracker.h"
15
16 namespace ppapi {
17 namespace proxy {
18
TrueTypeFontSingletonResource(Connection connection,PP_Instance instance)19 TrueTypeFontSingletonResource::TrueTypeFontSingletonResource(
20 Connection connection,
21 PP_Instance instance)
22 : PluginResource(connection, instance) {
23 SendCreate(BROWSER, PpapiHostMsg_TrueTypeFontSingleton_Create());
24 }
25
~TrueTypeFontSingletonResource()26 TrueTypeFontSingletonResource::~TrueTypeFontSingletonResource() {
27 }
28
29 thunk::PPB_TrueTypeFont_Singleton_API*
AsPPB_TrueTypeFont_Singleton_API()30 TrueTypeFontSingletonResource::AsPPB_TrueTypeFont_Singleton_API() {
31 return this;
32 }
33
GetFontFamilies(PP_Instance instance,const PP_ArrayOutput & output,const scoped_refptr<TrackedCallback> & callback)34 int32_t TrueTypeFontSingletonResource::GetFontFamilies(
35 PP_Instance instance,
36 const PP_ArrayOutput& output,
37 const scoped_refptr<TrackedCallback>& callback) {
38 Call<PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply>(BROWSER,
39 PpapiHostMsg_TrueTypeFontSingleton_GetFontFamilies(),
40 base::Bind(
41 &TrueTypeFontSingletonResource::OnPluginMsgGetFontFamiliesComplete,
42 this, callback, output));
43 return PP_OK_COMPLETIONPENDING;
44 }
45
GetFontsInFamily(PP_Instance instance,PP_Var family,const PP_ArrayOutput & output,const scoped_refptr<TrackedCallback> & callback)46 int32_t TrueTypeFontSingletonResource::GetFontsInFamily(
47 PP_Instance instance,
48 PP_Var family,
49 const PP_ArrayOutput& output,
50 const scoped_refptr<TrackedCallback>& callback) {
51 scoped_refptr<StringVar> family_var = StringVar::FromPPVar(family);
52 const uint32_t kMaxFamilySizeInBytes = 1024;
53 if (!family_var.get() || family_var->value().size() > kMaxFamilySizeInBytes)
54 return PP_ERROR_BADARGUMENT;
55 Call<PpapiPluginMsg_TrueTypeFontSingleton_GetFontsInFamilyReply>(BROWSER,
56 PpapiHostMsg_TrueTypeFontSingleton_GetFontsInFamily(family_var->value()),
57 base::Bind(
58 &TrueTypeFontSingletonResource::OnPluginMsgGetFontsInFamilyComplete,
59 this, callback, output));
60 return PP_OK_COMPLETIONPENDING;
61 }
62
OnPluginMsgGetFontFamiliesComplete(scoped_refptr<TrackedCallback> callback,PP_ArrayOutput array_output,const ResourceMessageReplyParams & params,const std::vector<std::string> & font_families)63 void TrueTypeFontSingletonResource::OnPluginMsgGetFontFamiliesComplete(
64 scoped_refptr<TrackedCallback> callback,
65 PP_ArrayOutput array_output,
66 const ResourceMessageReplyParams& params,
67 const std::vector<std::string>& font_families) {
68 if (!TrackedCallback::IsPending(callback))
69 return;
70 // The result code should contain the data size if it's positive.
71 int32_t result = params.result();
72 DCHECK((result < 0 && font_families.size() == 0) ||
73 result == static_cast<int32_t>(font_families.size()));
74
75 ArrayWriter output;
76 output.set_pp_array_output(array_output);
77 if (output.is_valid()) {
78 std::vector< scoped_refptr<Var> > font_family_vars;
79 for (size_t i = 0; i < font_families.size(); i++)
80 font_family_vars.push_back(
81 scoped_refptr<Var>(new StringVar(font_families[i])));
82 output.StoreVarVector(font_family_vars);
83 } else {
84 result = PP_ERROR_FAILED;
85 }
86
87 callback->Run(result);
88 }
89
OnPluginMsgGetFontsInFamilyComplete(scoped_refptr<TrackedCallback> callback,PP_ArrayOutput array_output,const ResourceMessageReplyParams & params,const std::vector<SerializedTrueTypeFontDesc> & fonts)90 void TrueTypeFontSingletonResource::OnPluginMsgGetFontsInFamilyComplete(
91 scoped_refptr<TrackedCallback> callback,
92 PP_ArrayOutput array_output,
93 const ResourceMessageReplyParams& params,
94 const std::vector<SerializedTrueTypeFontDesc>& fonts) {
95 if (!TrackedCallback::IsPending(callback))
96 return;
97 // The result code should contain the data size if it's positive.
98 int32_t result = params.result();
99 DCHECK((result < 0 && fonts.size() == 0) ||
100 result == static_cast<int32_t>(fonts.size()));
101 ArrayWriter output;
102 output.set_pp_array_output(array_output);
103 if (output.is_valid()) {
104 // Convert the message data to an array of PP_TrueTypeFontDesc_Dev structs.
105 // Each desc has an embedded PP_Var containing the family name.
106 std::vector<PP_TrueTypeFontDesc_Dev> pp_fonts(fonts.size());
107 for (size_t i = 0; i < fonts.size(); i++)
108 fonts[i].CopyToPPTrueTypeFontDesc(&pp_fonts[i]);
109
110 if (!output.StoreVector(pp_fonts)) {
111 for (size_t i = 0; i < pp_fonts.size(); i++)
112 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(pp_fonts[i].family);
113 }
114 } else {
115 result = PP_ERROR_FAILED;
116 }
117
118 callback->Run(result);
119 }
120
121 } // namespace proxy
122 } // namespace ppapi
123