15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/flash_font_file_resource.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_font_dev.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FlashFontFileResource::FlashFontFileResource( 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Connection connection, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_BrowserFont_Trusted_Description* description, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrivateFontCharset charset) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : PluginResource(connection, instance), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) charset_(charset) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description_.SetFromPPBrowserFontDescription(*description); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FlashFontFileResource::~FlashFontFileResource() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)thunk::PPB_Flash_FontFile_API* 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlashFontFileResource::AsPPB_Flash_FontFile_API() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool FlashFontFileResource::GetFontTable(uint32_t table, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* output, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t* output_length) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!output_length) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sent_create_to_renderer()) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendCreate( 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RENDERER, PpapiHostMsg_FlashFontFile_Create(description_, charset_)); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* contents = GetFontTable(table); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string out_contents; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t result = SyncCall<PpapiPluginMsg_FlashFontFile_GetFontTableReply>( 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RENDERER, PpapiHostMsg_FlashFontFile_GetFontTable(table), 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &out_contents); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != PP_OK) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents = AddFontTable(table, out_contents); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we are going to copy the data into |output|, it must be big enough. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output && *output_length < contents->size()) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *output_length = static_cast<uint32_t>(contents->size()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (output) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(output, contents->c_str(), *output_length); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string* FlashFontFileResource::GetFontTable(uint32_t table) const { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FontTableMap::const_iterator found = font_tables_.find(table); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (found == font_tables_.end()) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found->second.get(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string* FlashFontFileResource::AddFontTable(uint32_t table, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& contents) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) linked_ptr<std::string> heap_string(new std::string(contents)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) font_tables_[table] = heap_string; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return heap_string.get(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 83