ppb_file_io_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_file_io_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_FileIO_API> EnterFileIO;
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()->CreateFileIO(instance);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool IsFileIO(PP_Resource resource) {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO 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 file_io,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_Resource file_ref,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int32_t open_flags,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_CompletionCallback callback) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Open(file_ref, open_flags,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         enter.callback()));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Query(PP_Resource file_io,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_FileInfo* info,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_CompletionCallback callback) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Query(info, enter.callback()));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Touch(PP_Resource file_io,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_Time last_access_time,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_Time last_modified_time,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_CompletionCallback callback) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Touch(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_access_time, last_modified_time, enter.callback()));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Read(PP_Resource file_io,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int64_t offset,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             char* buffer,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int32_t bytes_to_read,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             PP_CompletionCallback callback) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Read(offset, buffer, bytes_to_read,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              enter.callback()));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Write(PP_Resource file_io,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              int64_t offset,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              const char* buffer,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              int32_t bytes_to_write,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_CompletionCallback callback) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Write(offset, buffer, bytes_to_write,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               enter.callback()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t SetLength(PP_Resource file_io,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  int64_t length,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  PP_CompletionCallback callback) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->SetLength(length, enter.callback()));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int32_t Flush(PP_Resource file_io,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_CompletionCallback callback) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, callback, true);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.failed())
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return enter.retval();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return enter.SetResult(enter.object()->Flush(enter.callback()));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Close(PP_Resource file_io) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterFileIO enter(file_io, true);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (enter.succeeded())
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enter.object()->Close();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_FileIO g_ppb_file_io_thunk = {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Create,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &IsFileIO,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Open,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Query,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Touch,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Read,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Write,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &SetLength,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Flush,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  &Close
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PPB_FileIO_1_0* GetPPB_FileIO_1_0_Thunk() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &g_ppb_file_io_thunk;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace thunk
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
131