ppb_url_loader_thunk.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// From ppb_url_loader.idl modified Wed Apr 17 11:16:00 2013. 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string.h> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_completion_callback.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/c/ppb_url_loader.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/thunk/ppb_instance_api.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_url_loader_api.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/thunk/thunk.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace thunk { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource Create(PP_Instance instance) { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::Create()"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceCreation enter(instance); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.functions()->CreateURLLoader(instance); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsURLLoader(PP_Resource resource) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::IsURLLoader()"; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(resource, false); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(enter.succeeded()); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Open(PP_Resource loader, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PP_Resource request_info, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct PP_CompletionCallback callback) { 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::Open()"; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, callback, true); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.SetResult(enter.object()->Open(request_info, enter.callback())); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FollowRedirect(PP_Resource loader, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct PP_CompletionCallback callback) { 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::FollowRedirect()"; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, callback, true); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.SetResult(enter.object()->FollowRedirect(enter.callback())); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetUploadProgress(PP_Resource loader, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* bytes_sent, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* total_bytes_to_be_sent) { 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::GetUploadProgress()"; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, true); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) { 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memset(bytes_sent, 0, sizeof(*bytes_sent)); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memset(total_bytes_to_be_sent, 0, sizeof(*total_bytes_to_be_sent)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.object()->GetUploadProgress(bytes_sent, total_bytes_to_be_sent); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetDownloadProgress(PP_Resource loader, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* bytes_received, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64_t* total_bytes_to_be_received) { 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::GetDownloadProgress()"; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, true); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) { 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memset(bytes_received, 0, sizeof(*bytes_received)); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) memset(total_bytes_to_be_received, 0, sizeof(*total_bytes_to_be_received)); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->GetDownloadProgress(bytes_received, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) total_bytes_to_be_received); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResponseInfo(PP_Resource loader) { 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::GetResponseInfo()"; 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, true); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.object()->GetResponseInfo(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t ReadResponseBody(PP_Resource loader, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* buffer, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int32_t bytes_to_read, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct PP_CompletionCallback callback) { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::ReadResponseBody()"; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, callback, true); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.SetResult(enter.object()->ReadResponseBody(buffer, 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bytes_to_read, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enter.callback())); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FinishStreamingToFile(PP_Resource loader, 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct PP_CompletionCallback callback) { 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::FinishStreamingToFile()"; 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, callback, true); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return enter.retval(); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return enter.SetResult(enter.object()->FinishStreamingToFile( 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.callback())); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Close(PP_Resource loader) { 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(4) << "PPB_URLLoader::Close()"; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EnterResource<PPB_URLLoader_API> enter(loader, true); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (enter.failed()) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) enter.object()->Close(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PPB_URLLoader_1_0 g_ppb_urlloader_thunk_1_0 = { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Create, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &IsURLLoader, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Open, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FollowRedirect, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetUploadProgress, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetDownloadProgress, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &GetResponseInfo, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ReadResponseBody, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &FinishStreamingToFile, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &Close 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_URLLoader_1_0* GetPPB_URLLoader_1_0_Thunk() { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return &g_ppb_urlloader_thunk_1_0; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace thunk 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 144