file_system_resource.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
1// Copyright (c) 2013 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/proxy/file_system_resource.h"
6
7#include "base/bind.h"
8#include "ipc/ipc_message.h"
9#include "ppapi/c/pp_errors.h"
10#include "ppapi/proxy/ppapi_messages.h"
11#include "ppapi/shared_impl/tracked_callback.h"
12
13using ppapi::thunk::PPB_FileSystem_API;
14
15namespace ppapi {
16namespace proxy {
17
18FileSystemResource::FileSystemResource(Connection connection,
19                                       PP_Instance instance,
20                                       PP_FileSystemType type)
21    : PluginResource(connection, instance),
22      type_(type),
23      called_open_(false),
24      callback_count_(0) {
25  DCHECK(type_ != PP_FILESYSTEMTYPE_INVALID);
26  // TODO(teravest): Temporarily create hosts in both the browser and renderer
27  // while we move file related hosts to the browser.
28  SendCreate(RENDERER, PpapiHostMsg_FileSystem_Create(type_));
29  SendCreate(BROWSER, PpapiHostMsg_FileSystem_Create(type_));
30}
31
32FileSystemResource::~FileSystemResource() {
33}
34
35PPB_FileSystem_API* FileSystemResource::AsPPB_FileSystem_API() {
36  return this;
37}
38
39int32_t FileSystemResource::Open(int64_t expected_size,
40                                 scoped_refptr<TrackedCallback> callback) {
41  DCHECK(type_ != PP_FILESYSTEMTYPE_ISOLATED);
42  if (called_open_)
43    return PP_ERROR_FAILED;
44  called_open_ = true;
45
46  Call<PpapiPluginMsg_FileSystem_OpenReply>(RENDERER,
47      PpapiHostMsg_FileSystem_Open(expected_size),
48      base::Bind(&FileSystemResource::OpenComplete,
49                 this,
50                 callback));
51  Call<PpapiPluginMsg_FileSystem_OpenReply>(BROWSER,
52      PpapiHostMsg_FileSystem_Open(expected_size),
53      base::Bind(&FileSystemResource::OpenComplete,
54                 this,
55                 callback));
56  return PP_OK_COMPLETIONPENDING;
57}
58
59PP_FileSystemType FileSystemResource::GetType() {
60  return type_;
61}
62
63int32_t FileSystemResource::InitIsolatedFileSystem(
64    const std::string& fsid,
65    const base::Callback<void(int32_t)>& callback) {
66  // This call is mutually exclusive with Open() above, so we can reuse the
67  // called_open state.
68  DCHECK(type_ == PP_FILESYSTEMTYPE_ISOLATED);
69  if (called_open_)
70    return PP_ERROR_FAILED;
71  called_open_ = true;
72
73  Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(RENDERER,
74      PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid),
75      base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete,
76      this,
77      callback));
78  Call<PpapiPluginMsg_FileSystem_InitIsolatedFileSystemReply>(BROWSER,
79      PpapiHostMsg_FileSystem_InitIsolatedFileSystem(fsid),
80      base::Bind(&FileSystemResource::InitIsolatedFileSystemComplete,
81      this,
82      callback));
83  return PP_OK_COMPLETIONPENDING;
84}
85
86void FileSystemResource::OpenComplete(
87    scoped_refptr<TrackedCallback> callback,
88    const ResourceMessageReplyParams& params) {
89  ++callback_count_;
90  // Received callback from browser and renderer.
91  if (callback_count_ == 2)
92    callback->Run(params.result());
93}
94
95void FileSystemResource::InitIsolatedFileSystemComplete(
96    const base::Callback<void(int32_t)>& callback,
97    const ResourceMessageReplyParams& params) {
98  ++callback_count_;
99  // Received callback from browser and renderer.
100  if (callback_count_ == 2)
101    callback.Run(params.result());
102}
103
104}  // namespace proxy
105}  // namespace ppapi
106