ppb_url_loader_thunk.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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/c/pp_completion_callback.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_url_loader_api.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/resource_creation_api.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace thunk {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef EnterResource<PPB_URLLoader_API> EnterURLLoader;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource Create(PP_Instance instance) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterResourceCreation enter(instance);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.functions()->CreateURLLoader(instance);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsURLLoader(PP_Resource resource) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(resource, false);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FromBool(enter.succeeded());
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Open(PP_Resource loader,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_Resource request_id,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_CompletionCallback callback) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, callback, true);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Open(request_id, enter.callback()));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FollowRedirect(PP_Resource loader,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       PP_CompletionCallback callback) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, callback, true);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->FollowRedirect(enter.callback()));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetUploadProgress(PP_Resource loader,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int64_t* bytes_sent,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int64_t* total_bytes_to_be_sent) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *bytes_sent = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *total_bytes_to_be_sent = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->GetUploadProgress(bytes_sent,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           total_bytes_to_be_sent);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetDownloadProgress(PP_Resource loader,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64_t* bytes_received,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64_t* total_bytes_to_be_received) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *bytes_received = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *total_bytes_to_be_received = 0;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->GetDownloadProgress(bytes_received,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             total_bytes_to_be_received);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResponseInfo(PP_Resource loader) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->GetResponseInfo();
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t ReadResponseBody(PP_Resource loader,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         void* buffer,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int32_t bytes_to_read,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PP_CompletionCallback callback) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, callback, true);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->ReadResponseBody(buffer, bytes_to_read,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          enter.callback()));
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FinishStreamingToFile(PP_Resource loader,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              PP_CompletionCallback callback) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, callback, true);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enter.object()->FinishStreamingToFile(enter.callback()));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Close(PP_Resource loader) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->Close();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GrantUniversalAccess(PP_Resource loader) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->GrantUniversalAccess();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetStatusCallback(PP_Resource loader,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       PP_URLLoaderTrusted_StatusCallback cb) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterURLLoader enter(loader, true);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->SetStatusCallback(cb);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_URLLoader g_ppb_urlloader_thunk = {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Create,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &IsURLLoader,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Open,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &FollowRedirect,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetUploadProgress,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetDownloadProgress,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GetResponseInfo,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &ReadResponseBody,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &FinishStreamingToFile,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Close
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_URLLoaderTrusted g_ppb_urlloader_trusted_thunk = {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &GrantUniversalAccess,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &SetStatusCallback
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_URLLoader_1_0* GetPPB_URLLoader_1_0_Thunk() {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &g_ppb_urlloader_thunk;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_URLLoaderTrusted_0_3* GetPPB_URLLoaderTrusted_0_3_Thunk() {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &g_ppb_urlloader_trusted_thunk;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace thunk
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
151