12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/truetype_font_singleton_resource.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/serialized_structs.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/array_writer.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_globals.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ppapi { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace proxy { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontSingletonResource::TrueTypeFontSingletonResource( 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Connection connection, 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PluginResource(connection, instance) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCreate(BROWSER, PpapiHostMsg_TrueTypeFontSingleton_Create()); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontSingletonResource::~TrueTypeFontSingletonResource() { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)thunk::PPB_TrueTypeFont_Singleton_API* 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrueTypeFontSingletonResource::AsPPB_TrueTypeFont_Singleton_API() { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t TrueTypeFontSingletonResource::GetFontFamilies( 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_ArrayOutput& output, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<TrackedCallback>& callback) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Call<PpapiPluginMsg_TrueTypeFontSingleton_GetFontFamiliesReply>(BROWSER, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_TrueTypeFontSingleton_GetFontFamilies(), 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Bind( 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &TrueTypeFontSingletonResource::OnPluginMsgGetFontFamiliesComplete, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, callback, output)); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int32_t TrueTypeFontSingletonResource::GetFontsInFamily( 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_Instance instance, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_Var family, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const PP_ArrayOutput& output, 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<TrackedCallback>& callback) { 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<StringVar> family_var = StringVar::FromPPVar(family); 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const uint32_t kMaxFamilySizeInBytes = 1024; 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!family_var.get() || family_var->value().size() > kMaxFamilySizeInBytes) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_ERROR_BADARGUMENT; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Call<PpapiPluginMsg_TrueTypeFontSingleton_GetFontsInFamilyReply>(BROWSER, 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PpapiHostMsg_TrueTypeFontSingleton_GetFontsInFamily(family_var->value()), 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind( 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &TrueTypeFontSingletonResource::OnPluginMsgGetFontsInFamilyComplete, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this, callback, output)); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrueTypeFontSingletonResource::OnPluginMsgGetFontFamiliesComplete( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_ArrayOutput array_output, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ResourceMessageReplyParams& params, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& font_families) { 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TrackedCallback::IsPending(callback)) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The result code should contain the data size if it's positive. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = params.result(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK((result < 0 && font_families.size() == 0) || 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result == static_cast<int32_t>(font_families.size())); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ArrayWriter output; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output.set_pp_array_output(array_output); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (output.is_valid()) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector< scoped_refptr<Var> > font_family_vars; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < font_families.size(); i++) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) font_family_vars.push_back( 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Var>(new StringVar(font_families[i]))); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output.StoreVarVector(font_family_vars); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result = PP_ERROR_FAILED; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback->Run(result); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TrueTypeFontSingletonResource::OnPluginMsgGetFontsInFamilyComplete( 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<TrackedCallback> callback, 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_ArrayOutput array_output, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const ResourceMessageReplyParams& params, 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::vector<SerializedTrueTypeFontDesc>& fonts) { 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!TrackedCallback::IsPending(callback)) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The result code should contain the data size if it's positive. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int32_t result = params.result(); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK((result < 0 && fonts.size() == 0) || 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result == static_cast<int32_t>(fonts.size())); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ArrayWriter output; 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) output.set_pp_array_output(array_output); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (output.is_valid()) { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Convert the message data to an array of PP_TrueTypeFontDesc_Dev structs. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Each desc has an embedded PP_Var containing the family name. 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<PP_TrueTypeFontDesc_Dev> pp_fonts(fonts.size()); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < fonts.size(); i++) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fonts[i].CopyToPPTrueTypeFontDesc(&pp_fonts[i]); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!output.StoreVector(pp_fonts)) { 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < pp_fonts.size(); i++) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(pp_fonts[i].family); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result = PP_ERROR_FAILED; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback->Run(result); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace proxy 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ppapi 123