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)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// From ppb_url_loader.idl modified Tue Aug 20 08:13:36 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"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/thunk/ppapi_thunk_export.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_url_loader_api.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace thunk {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource Create(PP_Instance instance) {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::Create()";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterResourceCreation enter(instance);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.functions()->CreateURLLoader(instance);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsURLLoader(PP_Resource resource) {
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::IsURLLoader()";
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(resource, false);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FromBool(enter.succeeded());
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Open(PP_Resource loader,
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             PP_Resource request_info,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             struct PP_CompletionCallback callback) {
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::Open()";
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, callback, true);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return enter.SetResult(enter.object()->Open(request_info, enter.callback()));
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FollowRedirect(PP_Resource loader,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       struct PP_CompletionCallback callback) {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::FollowRedirect()";
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, callback, true);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->FollowRedirect(enter.callback()));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetUploadProgress(PP_Resource loader,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int64_t* bytes_sent,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          int64_t* total_bytes_to_be_sent) {
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::GetUploadProgress()";
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, true);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(bytes_sent, 0, sizeof(*bytes_sent));
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(total_bytes_to_be_sent, 0, sizeof(*total_bytes_to_be_sent));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return enter.object()->GetUploadProgress(bytes_sent, total_bytes_to_be_sent);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool GetDownloadProgress(PP_Resource loader,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64_t* bytes_received,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            int64_t* total_bytes_to_be_received) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::GetDownloadProgress()";
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, true);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed()) {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(bytes_received, 0, sizeof(*bytes_received));
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    memset(total_bytes_to_be_received, 0, sizeof(*total_bytes_to_be_received));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->GetDownloadProgress(bytes_received,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             total_bytes_to_be_received);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Resource GetResponseInfo(PP_Resource loader) {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::GetResponseInfo()";
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, true);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.object()->GetResponseInfo();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t ReadResponseBody(PP_Resource loader,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         void* buffer,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int32_t bytes_to_read,
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                         struct PP_CompletionCallback callback) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::ReadResponseBody()";
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, callback, true);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return enter.SetResult(enter.object()->ReadResponseBody(buffer,
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                          bytes_to_read,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                          enter.callback()));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t FinishStreamingToFile(PP_Resource loader,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              struct PP_CompletionCallback callback) {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::FinishStreamingToFile()";
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, callback, true);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return enter.SetResult(enter.object()->FinishStreamingToFile(
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      enter.callback()));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Close(PP_Resource loader) {
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  VLOG(4) << "PPB_URLLoader::Close()";
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EnterResource<PPB_URLLoader_API> enter(loader, true);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (enter.failed())
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enter.object()->Close();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const PPB_URLLoader_1_0 g_ppb_urlloader_thunk_1_0 = {
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)}  // namespace
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)PPAPI_THUNK_EXPORT const PPB_URLLoader_1_0* GetPPB_URLLoader_1_0_Thunk() {
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return &g_ppb_urlloader_thunk_1_0;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace thunk
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
142