ppb_file_io_thunk.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/c/pp_completion_callback.h"
6#include "ppapi/c/pp_errors.h"
7#include "ppapi/shared_impl/tracked_callback.h"
8#include "ppapi/thunk/enter.h"
9#include "ppapi/thunk/thunk.h"
10#include "ppapi/thunk/ppb_file_io_api.h"
11#include "ppapi/thunk/resource_creation_api.h"
12
13namespace ppapi {
14namespace thunk {
15
16namespace {
17
18typedef EnterResource<PPB_FileIO_API> EnterFileIO;
19
20PP_Resource Create(PP_Instance instance) {
21  EnterResourceCreation enter(instance);
22  if (enter.failed())
23    return 0;
24  return enter.functions()->CreateFileIO(instance);
25}
26
27PP_Bool IsFileIO(PP_Resource resource) {
28  EnterFileIO enter(resource, false);
29  return PP_FromBool(enter.succeeded());
30}
31
32int32_t Open(PP_Resource file_io,
33             PP_Resource file_ref,
34             int32_t open_flags,
35             PP_CompletionCallback callback) {
36  EnterFileIO enter(file_io, callback, true);
37  if (enter.failed())
38    return enter.retval();
39  return enter.SetResult(enter.object()->Open(file_ref, open_flags,
40                         enter.callback()));
41}
42
43int32_t Query(PP_Resource file_io,
44              PP_FileInfo* info,
45              PP_CompletionCallback callback) {
46  EnterFileIO enter(file_io, callback, true);
47  if (enter.failed())
48    return enter.retval();
49  return enter.SetResult(enter.object()->Query(info, enter.callback()));
50}
51
52int32_t Touch(PP_Resource file_io,
53              PP_Time last_access_time,
54              PP_Time last_modified_time,
55              PP_CompletionCallback callback) {
56  EnterFileIO enter(file_io, callback, true);
57  if (enter.failed())
58    return enter.retval();
59  return enter.SetResult(enter.object()->Touch(
60      last_access_time, last_modified_time, enter.callback()));
61}
62
63int32_t Read(PP_Resource file_io,
64             int64_t offset,
65             char* buffer,
66             int32_t bytes_to_read,
67             PP_CompletionCallback callback) {
68  EnterFileIO enter(file_io, callback, true);
69  if (enter.failed())
70    return enter.retval();
71  return enter.SetResult(enter.object()->Read(offset, buffer, bytes_to_read,
72                                              enter.callback()));
73}
74
75int32_t Write(PP_Resource file_io,
76              int64_t offset,
77              const char* buffer,
78              int32_t bytes_to_write,
79              PP_CompletionCallback callback) {
80  EnterFileIO enter(file_io, callback, true);
81  if (enter.failed())
82    return enter.retval();
83  return enter.SetResult(enter.object()->Write(offset, buffer, bytes_to_write,
84                                               enter.callback()));
85}
86
87int32_t SetLength(PP_Resource file_io,
88                  int64_t length,
89                  PP_CompletionCallback callback) {
90  EnterFileIO enter(file_io, callback, true);
91  if (enter.failed())
92    return enter.retval();
93  return enter.SetResult(enter.object()->SetLength(length, enter.callback()));
94}
95
96int32_t Flush(PP_Resource file_io,
97              PP_CompletionCallback callback) {
98  EnterFileIO enter(file_io, callback, true);
99  if (enter.failed())
100    return enter.retval();
101  return enter.SetResult(enter.object()->Flush(enter.callback()));
102}
103
104void Close(PP_Resource file_io) {
105  EnterFileIO enter(file_io, true);
106  if (enter.succeeded())
107    enter.object()->Close();
108}
109
110const PPB_FileIO g_ppb_file_io_thunk = {
111  &Create,
112  &IsFileIO,
113  &Open,
114  &Query,
115  &Touch,
116  &Read,
117  &Write,
118  &SetLength,
119  &Flush,
120  &Close
121};
122
123}  // namespace
124
125const PPB_FileIO_1_0* GetPPB_FileIO_1_0_Thunk() {
126  return &g_ppb_file_io_thunk;
127}
128
129}  // namespace thunk
130}  // namespace ppapi
131