| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/proxy/ppb_file_chooser_proxy.h" | 5 #include "ppapi/proxy/ppb_file_chooser_proxy.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 | 8 |
| 9 #include "ppapi/c/dev/ppb_file_chooser_dev.h" | 9 #include "ppapi/c/dev/ppb_file_chooser_dev.h" |
| 10 #include "ppapi/c/pp_errors.h" | 10 #include "ppapi/c/pp_errors.h" |
| 11 #include "ppapi/c/private/ppb_proxy_private.h" | 11 #include "ppapi/c/private/ppb_proxy_private.h" |
| 12 #include "ppapi/proxy/enter_proxy.h" | 12 #include "ppapi/proxy/enter_proxy.h" |
| 13 #include "ppapi/proxy/host_dispatcher.h" | 13 #include "ppapi/proxy/host_dispatcher.h" |
| 14 #include "ppapi/proxy/plugin_dispatcher.h" | 14 #include "ppapi/proxy/plugin_dispatcher.h" |
| 15 #include "ppapi/proxy/ppapi_messages.h" | 15 #include "ppapi/proxy/ppapi_messages.h" |
| 16 #include "ppapi/proxy/ppb_file_ref_proxy.h" | 16 #include "ppapi/proxy/ppb_file_ref_proxy.h" |
| 17 #include "ppapi/proxy/serialized_var.h" | 17 #include "ppapi/proxy/serialized_var.h" |
| 18 #include "ppapi/shared_impl/var.h" | 18 #include "ppapi/shared_impl/var.h" |
| 19 #include "ppapi/thunk/resource_creation_api.h" |
| 19 #include "ppapi/thunk/thunk.h" | 20 #include "ppapi/thunk/thunk.h" |
| 20 | 21 |
| 21 using ppapi::thunk::PPB_FileChooser_API; | 22 using ppapi::thunk::PPB_FileChooser_API; |
| 22 | 23 |
| 23 namespace ppapi { | 24 namespace ppapi { |
| 24 namespace proxy { | 25 namespace proxy { |
| 25 | 26 |
| 26 class FileChooser : public Resource, | 27 class FileChooser : public Resource, |
| 27 public PPB_FileChooser_API { | 28 public PPB_FileChooser_API { |
| 28 public: | 29 public: |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 // by the FileChooser object until they're passed to the plugin. | 112 // by the FileChooser object until they're passed to the plugin. |
| 112 DCHECK(file_queue_.empty()); | 113 DCHECK(file_queue_.empty()); |
| 113 for (size_t i = 0; i < chosen_files.size(); i++) | 114 for (size_t i = 0; i < chosen_files.size(); i++) |
| 114 file_queue_.push(PPB_FileRef_Proxy::DeserializeFileRef(chosen_files[i])); | 115 file_queue_.push(PPB_FileRef_Proxy::DeserializeFileRef(chosen_files[i])); |
| 115 | 116 |
| 116 // Notify the plugin of the new data. | 117 // Notify the plugin of the new data. |
| 117 PP_RunAndClearCompletionCallback(¤t_show_callback_, result_code); | 118 PP_RunAndClearCompletionCallback(¤t_show_callback_, result_code); |
| 118 // DANGER: May delete |this|! | 119 // DANGER: May delete |this|! |
| 119 } | 120 } |
| 120 | 121 |
| 121 namespace { | 122 PPB_FileChooser_Proxy::PPB_FileChooser_Proxy(Dispatcher* dispatcher) |
| 122 | 123 : InterfaceProxy(dispatcher), |
| 123 PP_Resource Create0_4(PP_Instance instance, | |
| 124 const PP_FileChooserOptions_0_4_Dev* options) { | |
| 125 PP_Var accept_var = PP_MakeUndefined(); | |
| 126 if (options->accept_mime_types) | |
| 127 accept_var = StringVar::StringToPPVar(0, options->accept_mime_types); | |
| 128 PP_Resource result = thunk::GetPPB_FileChooser_Thunk()->Create( | |
| 129 instance, options->mode, accept_var); | |
| 130 if (accept_var.type == PP_VARTYPE_STRING) | |
| 131 PluginResourceTracker::GetInstance()->var_tracker().ReleaseVar(accept_var); | |
| 132 return result; | |
| 133 } | |
| 134 | |
| 135 PP_Bool IsFileChooser0_4(PP_Resource resource) { | |
| 136 return thunk::GetPPB_FileChooser_Thunk()->IsFileChooser(resource); | |
| 137 } | |
| 138 | |
| 139 int32_t Show0_4(PP_Resource chooser, PP_CompletionCallback callback) { | |
| 140 return thunk::GetPPB_FileChooser_Thunk()->Show(chooser, callback); | |
| 141 } | |
| 142 | |
| 143 PP_Resource GetNextChosenFile0_4(PP_Resource chooser) { | |
| 144 return thunk::GetPPB_FileChooser_Thunk()->GetNextChosenFile(chooser); | |
| 145 } | |
| 146 | |
| 147 PPB_FileChooser_0_4_Dev file_chooser_0_4_interface = { | |
| 148 &Create0_4, | |
| 149 &IsFileChooser0_4, | |
| 150 &Show0_4, | |
| 151 &GetNextChosenFile0_4 | |
| 152 }; | |
| 153 | |
| 154 InterfaceProxy* CreateFileChooserProxy(Dispatcher* dispatcher, | |
| 155 const void* target_interface) { | |
| 156 return new PPB_FileChooser_Proxy(dispatcher, target_interface); | |
| 157 } | |
| 158 | |
| 159 } // namespace | |
| 160 | |
| 161 PPB_FileChooser_Proxy::PPB_FileChooser_Proxy(Dispatcher* dispatcher, | |
| 162 const void* target_interface) | |
| 163 : InterfaceProxy(dispatcher, target_interface), | |
| 164 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 124 callback_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| 165 } | 125 } |
| 166 | 126 |
| 167 PPB_FileChooser_Proxy::~PPB_FileChooser_Proxy() { | 127 PPB_FileChooser_Proxy::~PPB_FileChooser_Proxy() { |
| 168 } | 128 } |
| 169 | 129 |
| 170 const InterfaceProxy::Info* PPB_FileChooser_Proxy::GetInfo() { | |
| 171 static const Info info = { | |
| 172 thunk::GetPPB_FileChooser_Thunk(), | |
| 173 PPB_FILECHOOSER_DEV_INTERFACE, | |
| 174 INTERFACE_ID_PPB_FILE_CHOOSER, | |
| 175 false, | |
| 176 &CreateFileChooserProxy, | |
| 177 }; | |
| 178 return &info; | |
| 179 } | |
| 180 | |
| 181 const InterfaceProxy::Info* PPB_FileChooser_Proxy::GetInfo0_4() { | |
| 182 static const Info info = { | |
| 183 &file_chooser_0_4_interface, | |
| 184 PPB_FILECHOOSER_DEV_INTERFACE_0_4, | |
| 185 INTERFACE_ID_NONE, | |
| 186 false, | |
| 187 &CreateFileChooserProxy, | |
| 188 }; | |
| 189 return &info; | |
| 190 } | |
| 191 | |
| 192 // static | 130 // static |
| 193 PP_Resource PPB_FileChooser_Proxy::CreateProxyResource( | 131 PP_Resource PPB_FileChooser_Proxy::CreateProxyResource( |
| 194 PP_Instance instance, | 132 PP_Instance instance, |
| 195 PP_FileChooserMode_Dev mode, | 133 PP_FileChooserMode_Dev mode, |
| 196 const PP_Var& accept_mime_types) { | 134 const PP_Var& accept_mime_types) { |
| 197 Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); | 135 Dispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
| 198 if (!dispatcher) | 136 if (!dispatcher) |
| 199 return 0; | 137 return 0; |
| 200 | 138 |
| 201 HostResource result; | 139 HostResource result; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 222 IPC_MESSAGE_UNHANDLED(handled = false) | 160 IPC_MESSAGE_UNHANDLED(handled = false) |
| 223 IPC_END_MESSAGE_MAP() | 161 IPC_END_MESSAGE_MAP() |
| 224 return handled; | 162 return handled; |
| 225 } | 163 } |
| 226 | 164 |
| 227 void PPB_FileChooser_Proxy::OnMsgCreate( | 165 void PPB_FileChooser_Proxy::OnMsgCreate( |
| 228 PP_Instance instance, | 166 PP_Instance instance, |
| 229 int mode, | 167 int mode, |
| 230 SerializedVarReceiveInput accept_mime_types, | 168 SerializedVarReceiveInput accept_mime_types, |
| 231 HostResource* result) { | 169 HostResource* result) { |
| 232 result->SetHostResource(instance, ppb_file_chooser_target()->Create( | 170 thunk::EnterResourceCreation enter(instance); |
| 233 instance, static_cast<PP_FileChooserMode_Dev>(mode), | 171 if (enter.succeeded()) { |
| 234 accept_mime_types.Get(dispatcher()))); | 172 result->SetHostResource(instance, enter.functions()->CreateFileChooser( |
| 173 instance, static_cast<PP_FileChooserMode_Dev>(mode), |
| 174 accept_mime_types.Get(dispatcher()))); |
| 175 } |
| 235 } | 176 } |
| 236 | 177 |
| 237 void PPB_FileChooser_Proxy::OnMsgShow(const HostResource& chooser) { | 178 void PPB_FileChooser_Proxy::OnMsgShow(const HostResource& chooser) { |
| 238 EnterHostFromHostResourceForceCallback<PPB_FileChooser_API> enter( | 179 EnterHostFromHostResourceForceCallback<PPB_FileChooser_API> enter( |
| 239 chooser, callback_factory_, &PPB_FileChooser_Proxy::OnShowCallback, | 180 chooser, callback_factory_, &PPB_FileChooser_Proxy::OnShowCallback, |
| 240 chooser); | 181 chooser); |
| 241 if (enter.succeeded()) | 182 if (enter.succeeded()) |
| 242 enter.SetResult(enter.object()->Show(enter.callback())); | 183 enter.SetResult(enter.object()->Show(enter.callback())); |
| 243 } | 184 } |
| 244 | 185 |
| 245 void PPB_FileChooser_Proxy::OnMsgChooseComplete( | 186 void PPB_FileChooser_Proxy::OnMsgChooseComplete( |
| 246 const HostResource& chooser, | 187 const HostResource& chooser, |
| 247 int32_t result_code, | 188 int32_t result_code, |
| 248 const std::vector<PPB_FileRef_CreateInfo>& chosen_files) { | 189 const std::vector<PPB_FileRef_CreateInfo>& chosen_files) { |
| 249 EnterPluginFromHostResource<PPB_FileChooser_API> enter(chooser); | 190 EnterPluginFromHostResource<PPB_FileChooser_API> enter(chooser); |
| 250 if (enter.succeeded()) { | 191 if (enter.succeeded()) { |
| 251 static_cast<FileChooser*>(enter.object())->ChooseComplete( | 192 static_cast<FileChooser*>(enter.object())->ChooseComplete( |
| 252 result_code, chosen_files); | 193 result_code, chosen_files); |
| 253 } | 194 } |
| 254 } | 195 } |
| 255 | 196 |
| 256 void PPB_FileChooser_Proxy::OnShowCallback(int32_t result, | 197 void PPB_FileChooser_Proxy::OnShowCallback(int32_t result, |
| 257 const HostResource& chooser) { | 198 const HostResource& chooser) { |
| 199 EnterHostFromHostResource<PPB_FileChooser_API> enter(chooser); |
| 200 |
| 258 std::vector<PPB_FileRef_CreateInfo> files; | 201 std::vector<PPB_FileRef_CreateInfo> files; |
| 259 if (result == PP_OK) { | 202 if (enter.succeeded() && result == PP_OK) { |
| 260 // Jump through some hoops to get the FileRef proxy. Since we know we're | |
| 261 // in the host at this point, we can ask the host dispatcher for it. | |
| 262 DCHECK(!dispatcher()->IsPlugin()); | |
| 263 HostDispatcher* host_disp = static_cast<HostDispatcher*>(dispatcher()); | |
| 264 PPB_FileRef_Proxy* file_ref_proxy = static_cast<PPB_FileRef_Proxy*>( | 203 PPB_FileRef_Proxy* file_ref_proxy = static_cast<PPB_FileRef_Proxy*>( |
| 265 host_disp->GetOrCreatePPBInterfaceProxy(INTERFACE_ID_PPB_FILE_REF)); | 204 dispatcher()->GetInterfaceProxy(INTERFACE_ID_PPB_FILE_REF)); |
| 266 | 205 |
| 267 // Convert the returned files to the serialized info. | 206 // Convert the returned files to the serialized info. |
| 268 while (PP_Resource cur_file_resource = | 207 while (PP_Resource cur_file_resource = |
| 269 ppb_file_chooser_target()->GetNextChosenFile( | 208 enter.object()->GetNextChosenFile()) { |
| 270 chooser.host_resource())) { | |
| 271 PPB_FileRef_CreateInfo cur_create_info; | 209 PPB_FileRef_CreateInfo cur_create_info; |
| 272 file_ref_proxy->SerializeFileRef(cur_file_resource, &cur_create_info); | 210 file_ref_proxy->SerializeFileRef(cur_file_resource, &cur_create_info); |
| 273 files.push_back(cur_create_info); | 211 files.push_back(cur_create_info); |
| 274 } | 212 } |
| 275 } | 213 } |
| 276 | 214 |
| 277 dispatcher()->Send(new PpapiMsg_PPBFileChooser_ChooseComplete( | 215 dispatcher()->Send(new PpapiMsg_PPBFileChooser_ChooseComplete( |
| 278 INTERFACE_ID_PPB_FILE_CHOOSER, chooser, result, files)); | 216 INTERFACE_ID_PPB_FILE_CHOOSER, chooser, result, files)); |
| 279 } | 217 } |
| 280 | 218 |
| 281 } // namespace proxy | 219 } // namespace proxy |
| 282 } // namespace ppapi | 220 } // namespace ppapi |
| OLD | NEW |