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