Index: ppapi/proxy/ppb_flash_file_proxy.cc |
diff --git a/ppapi/proxy/ppb_flash_file_proxy.cc b/ppapi/proxy/ppb_flash_file_proxy.cc |
deleted file mode 100644 |
index 08490535e2474069ee114122f5fdd40e44ee2d8f..0000000000000000000000000000000000000000 |
--- a/ppapi/proxy/ppb_flash_file_proxy.cc |
+++ /dev/null |
@@ -1,728 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ppapi/proxy/ppb_flash_file_proxy.h" |
- |
-#include <map> |
-#include <set> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/logging.h" |
-#include "base/message_loop_proxy.h" |
-#include "base/synchronization/lock.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "build/build_config.h" |
-#include "ipc/ipc_channel_proxy.h" |
-#include "ipc/ipc_message.h" |
-#include "ipc/ipc_sync_message.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "ppapi/c/pp_file_info.h" |
-#include "ppapi/c/private/ppb_flash_file.h" |
-#include "ppapi/proxy/plugin_dispatcher.h" |
-#include "ppapi/proxy/ppapi_messages.h" |
-#include "ppapi/shared_impl/ppapi_globals.h" |
-#include "ppapi/shared_impl/resource.h" |
-#include "ppapi/shared_impl/resource_tracker.h" |
- |
-namespace ppapi { |
-namespace proxy { |
- |
-namespace { |
- |
-// Given an error code and a handle result from a Pepper API call, converts to a |
-// PlatformFileForTransit by sharing with the other side, closing the original |
-// handle, possibly also updating the error value if an error occurred. |
-IPC::PlatformFileForTransit PlatformFileToPlatformFileForTransit( |
- Dispatcher* dispatcher, |
- int32_t* error, |
- base::PlatformFile file) { |
- if (*error != PP_OK) |
- return IPC::InvalidPlatformFileForTransit(); |
- IPC::PlatformFileForTransit out_handle = |
- dispatcher->ShareHandleWithRemote(file, true); |
- if (out_handle == IPC::InvalidPlatformFileForTransit()) |
- *error = PP_ERROR_NOACCESS; |
- return out_handle; |
-} |
- |
-void FreeDirContents(PP_Instance /* instance */, |
- PP_DirContents_Dev* contents) { |
- for (int32_t i = 0; i < contents->count; ++i) |
- delete[] contents->entries[i].name; |
- delete[] contents->entries; |
- delete contents; |
-} |
- |
-} // namespace |
- |
-// ModuleLocalThreadAdapter ---------------------------------------------------- |
-// TODO(yzshen): Refactor to use IPC::SyncMessageFilter. |
-class ModuleLocalThreadAdapter |
- : public base::RefCountedThreadSafe<ModuleLocalThreadAdapter> { |
- class Filter; |
- public: |
- ModuleLocalThreadAdapter(); |
- |
- void AddInstanceRouting(PP_Instance instance, Dispatcher* dispatcher); |
- void ClearInstanceRouting(PP_Instance instance); |
- void ClearFilter(Dispatcher* dispatcher, Filter* filter); |
- |
- bool OnModuleLocalMessageReceived(const IPC::Message& msg); |
- |
- // Called on the I/O thread when the channel is being destroyed and the |
- // given message will never be issued a reply. |
- void OnModuleLocalMessageFailed(int message_id); |
- |
- bool Send(PP_Instance instance, IPC::Message* msg); |
- |
- private: |
- class Filter : public IPC::ChannelProxy::MessageFilter { |
- public: |
- explicit Filter(Dispatcher* dispatcher); |
- ~Filter(); |
- |
- void Send(IPC::Message* msg); |
- |
- virtual void OnFilterAdded(IPC::Channel* channel); |
- virtual void OnFilterRemoved(); |
- virtual bool OnMessageReceived(const IPC::Message& message); |
- |
- private: |
- // DO NOT DEREFERENCE! This is used only for tracking. |
- Dispatcher* dispatcher_; |
- |
- IPC::Channel* channel_; |
- |
- // Holds the IPC messages that were sent before the channel was connected. |
- // These will be sent ASAP. |
- std::vector<IPC::Message*> pre_connect_pending_messages_; |
- |
- // Holds the IDs of the sync messages we're currently waiting on for this |
- // channel. This tracking allows us to cancel those requests if the |
- // remote process crashes and we're cleaning up this filter (without just |
- // deadlocking the waiting thread(s). |
- std::set<int> pending_requests_for_filter_; |
- }; |
- |
- void SendFromIOThread(Dispatcher* dispatcher, IPC::Message* msg); |
- |
- // Internal version of OnModuleLocalMessageFailed which assumes the lock |
- // is already held. |
- void OnModuleLocalMessageFailedLocked(int message_id); |
- |
- base::Lock lock_; |
- |
- scoped_refptr<base::MessageLoopProxy> main_thread_; |
- |
- // Will be NULL before an instance routing is added. |
- scoped_refptr<base::MessageLoopProxy> io_thread_; |
- |
- typedef std::map<PP_Instance, Dispatcher*> InstanceToDispatcher; |
- InstanceToDispatcher instance_to_dispatcher_; |
- |
- // The filters are owned by the channel. |
- typedef std::map<Dispatcher*, Filter*> DispatcherToFilter; |
- DispatcherToFilter dispatcher_to_filter_; |
- |
- // Tracks all messages with currently waiting threads. This does not own |
- // the pointer, the pointer lifetime is managed by Send(). |
- typedef std::map<int, IPC::PendingSyncMsg*> SyncRequestMap; |
- SyncRequestMap pending_sync_requests_; |
-}; |
- |
-ModuleLocalThreadAdapter* g_module_local_thread_adapter = NULL; |
- |
-ModuleLocalThreadAdapter::Filter::Filter(Dispatcher* dispatcher) |
- : dispatcher_(dispatcher), channel_(NULL) { |
-} |
- |
-ModuleLocalThreadAdapter::Filter::~Filter() { |
-} |
- |
-void ModuleLocalThreadAdapter::Filter::Send(IPC::Message* msg) { |
- if (channel_) { |
- int message_id = IPC::SyncMessage::GetMessageId(*msg); |
- if (channel_->Send(msg)) |
- pending_requests_for_filter_.insert(message_id); |
- else // Message lost, notify adapter so it can unblock. |
- g_module_local_thread_adapter->OnModuleLocalMessageFailed(message_id); |
- } else { |
- // No channel, save this message for when it's connected. |
- pre_connect_pending_messages_.push_back(msg); |
- } |
-} |
- |
-void ModuleLocalThreadAdapter::Filter::OnFilterAdded(IPC::Channel* channel) { |
- DCHECK(!channel_); |
- channel_ = channel; |
- |
- // Now that we have a channel, process all pending messages. |
- for (size_t i = 0; i < pre_connect_pending_messages_.size(); i++) |
- Send(pre_connect_pending_messages_[i]); |
- pre_connect_pending_messages_.clear(); |
-} |
- |
-void ModuleLocalThreadAdapter::Filter::OnFilterRemoved() { |
- DCHECK(channel_); |
- channel_ = NULL; |
- g_module_local_thread_adapter->ClearFilter(dispatcher_, this); |
- |
- for (std::set<int>::iterator i = pending_requests_for_filter_.begin(); |
- i != pending_requests_for_filter_.end(); ++i) { |
- g_module_local_thread_adapter->OnModuleLocalMessageFailed(*i); |
- } |
-} |
- |
-bool ModuleLocalThreadAdapter::Filter::OnMessageReceived( |
- const IPC::Message& message) { |
- if (!message.is_reply() || |
- message.routing_id() != API_ID_PPB_FLASH_FILE_MODULELOCAL) |
- return false; |
- |
- if (g_module_local_thread_adapter->OnModuleLocalMessageReceived(message)) { |
- // The message was consumed, this means we can remove the message ID from |
- // the list of messages this channel is waiting on. |
- pending_requests_for_filter_.erase(IPC::SyncMessage::GetMessageId(message)); |
- return true; |
- } |
- return false; |
-} |
- |
-ModuleLocalThreadAdapter::ModuleLocalThreadAdapter() |
- : main_thread_(base::MessageLoopProxy::current()) { |
-} |
- |
-void ModuleLocalThreadAdapter::AddInstanceRouting(PP_Instance instance, |
- Dispatcher* dispatcher) { |
- base::AutoLock lock(lock_); |
- |
- // Now that we've had contact with a dispatcher, we can set up the IO thread. |
- DCHECK(main_thread_->BelongsToCurrentThread()); |
- if (!io_thread_.get()) |
- io_thread_ = dispatcher->GetIPCMessageLoop(); |
- |
- // Set up the instance -> dispatcher routing. |
- DCHECK(instance_to_dispatcher_.find(instance) == |
- instance_to_dispatcher_.end()); |
- instance_to_dispatcher_[instance] = dispatcher; |
- |
- DispatcherToFilter::iterator found_filter = |
- dispatcher_to_filter_.find(dispatcher); |
- if (found_filter == dispatcher_to_filter_.end()) { |
- // Need to set up a filter for this dispatcher to intercept the messages. |
- Filter* filter = new Filter(dispatcher); |
- dispatcher_to_filter_[dispatcher] = filter; |
- dispatcher->AddIOThreadMessageFilter(filter); |
- } |
-} |
- |
-void ModuleLocalThreadAdapter::ClearInstanceRouting(PP_Instance instance) { |
- // The dispatcher->filter mapping is cleaned up by ClearFilter which is |
- // initiated by the channel. |
- instance_to_dispatcher_.erase(instance); |
-} |
- |
-void ModuleLocalThreadAdapter::ClearFilter(Dispatcher* dispatcher, |
- Filter* filter) { |
- // DANGER! Don't dereference the dispatcher, it's just used to identify |
- // which filter to remove. The dispatcher may not even exist any more. |
- // |
- // Since the dispatcher may be gone, there's a potential for ambiguity if |
- // another one is created on the main thread before this code runs on the |
- // I/O thread. So we check that the filter matches to avoid this rare case. |
- base::AutoLock lock(lock_); |
- if (dispatcher_to_filter_[dispatcher] == filter) |
- dispatcher_to_filter_.erase(dispatcher); |
-} |
- |
-bool ModuleLocalThreadAdapter::OnModuleLocalMessageReceived( |
- const IPC::Message& msg) { |
- base::AutoLock lock(lock_); |
- |
- int message_id = IPC::SyncMessage::GetMessageId(msg); |
- SyncRequestMap::iterator found = pending_sync_requests_.find(message_id); |
- if (found == pending_sync_requests_.end()) { |
- // Not waiting for this event. This will happen for sync messages to the |
- // main thread which use the "regular" sync channel code path. |
- return false; |
- } |
- |
- IPC::PendingSyncMsg& info = *found->second; |
- |
- if (!msg.is_reply_error()) |
- info.deserializer->SerializeOutputParameters(msg); |
- info.done_event->Signal(); |
- return true; |
-} |
- |
-void ModuleLocalThreadAdapter::OnModuleLocalMessageFailed(int message_id) { |
- base::AutoLock lock(lock_); |
- OnModuleLocalMessageFailedLocked(message_id); |
-} |
- |
-bool ModuleLocalThreadAdapter::Send(PP_Instance instance, IPC::Message* msg) { |
- // Compute the dispatcher corresponding to this message. |
- Dispatcher* dispatcher = NULL; |
- { |
- base::AutoLock lock(lock_); |
- InstanceToDispatcher::iterator found = |
- instance_to_dispatcher_.find(instance); |
- if (found == instance_to_dispatcher_.end()) { |
- NOTREACHED(); |
- delete msg; |
- return false; |
- } |
- dispatcher = found->second; |
- } |
- |
- if (main_thread_->BelongsToCurrentThread()) { |
- // Easy case: We're on the same thread as the dispatcher, so we don't need |
- // a lock to access it, and we can just use the normal sync channel stuff |
- // to handle the message. Actually, we MUST use the normal sync channel |
- // stuff since there may be incoming sync messages that need processing. |
- // The code below doesn't handle any nested message loops. |
- return dispatcher->Send(msg); |
- } |
- |
- // Background thread case |
- // ---------------------- |
- // 1. Generate tracking info, stick in pending_sync_messages_map. |
- // 2. Kick off the request. This is done on the I/O thread. |
- // 3. Filter on the I/O thread notices reply, writes the reply data and |
- // signals the event. We block on the event while this is happening. |
- // 4. Remove tracking info. |
- |
- // Generate the tracking info. and copied |
- IPC::SyncMessage* sync_msg = static_cast<IPC::SyncMessage*>(msg); |
- int message_id = IPC::SyncMessage::GetMessageId(*sync_msg); |
- base::WaitableEvent event(true, false); |
- scoped_ptr<IPC::MessageReplyDeserializer> deserializer( |
- sync_msg->GetReplyDeserializer()); // We own this pointer once retrieved. |
- IPC::PendingSyncMsg info(message_id, deserializer.get(), &event); |
- |
- // Add the tracking information to our map. |
- { |
- base::AutoLock lock(lock_); |
- pending_sync_requests_[message_id] = &info; |
- } |
- |
- // This is a bit dangerous. We use the dispatcher pointer as the routing |
- // ID for this message. While we don't dereference it, there is an |
- // exceedingly remote possibility that while this is going to the background |
- // thread the connection will be shut down and a new one will be created with |
- // a dispatcher at the same address. It could potentially get sent to a |
- // random place, but it should actually still work (since the Flash file |
- // operations are global). |
- io_thread_->PostTask(FROM_HERE, |
- base::Bind(&ModuleLocalThreadAdapter::SendFromIOThread, this, |
- dispatcher, msg)); |
- |
- // Now we block the current thread waiting for the reply. |
- event.Wait(); |
- |
- { |
- // Clear our tracking info for this message now that we're done. |
- base::AutoLock lock(lock_); |
- DCHECK(pending_sync_requests_.find(message_id) != |
- pending_sync_requests_.end()); |
- pending_sync_requests_.erase(message_id); |
- } |
- |
- return true; |
-} |
- |
-void ModuleLocalThreadAdapter::SendFromIOThread(Dispatcher* dispatcher, |
- IPC::Message* msg) { |
- // DO NOT DEREFERENCE DISPATCHER. Used as a lookup only. |
- base::AutoLock lock(lock_); |
- DispatcherToFilter::iterator found = dispatcher_to_filter_.find(dispatcher); |
- |
- // The dispatcher could have been destroyed by the time we got here since |
- // we're on another thread. Need to unblock the caller. |
- if (found == dispatcher_to_filter_.end()) { |
- OnModuleLocalMessageFailedLocked(IPC::SyncMessage::GetMessageId(*msg)); |
- delete msg; |
- return; |
- } |
- |
- // Takes ownership of pointer. |
- found->second->Send(msg); |
-} |
- |
-void ModuleLocalThreadAdapter::OnModuleLocalMessageFailedLocked( |
- int message_id) { |
- lock_.AssertAcquired(); |
- |
- // Unblock the thread waiting for the message that will never come. |
- SyncRequestMap::iterator found = pending_sync_requests_.find(message_id); |
- if (found == pending_sync_requests_.end()) { |
- NOTREACHED(); |
- return; |
- } |
- found->second->done_event->Signal(); |
-} |
- |
-// PPB_Flash_File_ModuleLocal -------------------------------------------------- |
- |
-namespace { |
- |
-bool CreateThreadAdapterForInstance(PP_Instance instance) { |
- if (!g_module_local_thread_adapter) { |
- g_module_local_thread_adapter = new ModuleLocalThreadAdapter(); |
- g_module_local_thread_adapter->AddRef(); // Leaked, this object is global. |
- } |
- |
- PluginDispatcher* dispatcher = PluginDispatcher::GetForInstance(instance); |
- if (!dispatcher) { |
- NOTREACHED(); |
- return false; |
- } |
- g_module_local_thread_adapter->AddInstanceRouting(instance, dispatcher); |
- return true; |
-} |
- |
-void ClearThreadAdapterForInstance(PP_Instance instance) { |
- if (g_module_local_thread_adapter) |
- g_module_local_thread_adapter->ClearInstanceRouting(instance); |
-} |
- |
-int32_t OpenModuleLocalFile(PP_Instance instance, |
- const char* path, |
- int32_t mode, |
- PP_FileHandle* file) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- IPC::PlatformFileForTransit transit; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_OpenFile( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, |
- instance, path, mode, &transit, &result)); |
- *file = IPC::PlatformFileForTransitToPlatformFile(transit); |
- return result; |
-} |
- |
-int32_t RenameModuleLocalFile(PP_Instance instance, |
- const char* from_path, |
- const char* to_path) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_RenameFile( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, |
- instance, from_path, to_path, &result)); |
- return result; |
-} |
- |
-int32_t DeleteModuleLocalFileOrDir(PP_Instance instance, |
- const char* path, |
- PP_Bool recursive) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_DeleteFileOrDir( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, |
- instance, path, recursive, &result)); |
- return result; |
-} |
- |
-int32_t CreateModuleLocalDir(PP_Instance instance, const char* path) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_CreateDir( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, instance, path, &result)); |
- return result; |
-} |
- |
-int32_t QueryModuleLocalFile(PP_Instance instance, |
- const char* path, |
- PP_FileInfo* info) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_QueryFile( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, instance, path, |
- info, &result)); |
- return result; |
-} |
- |
-int32_t GetModuleLocalDirContents(PP_Instance instance, |
- const char* path, |
- PP_DirContents_Dev** contents) { |
- if (!g_module_local_thread_adapter) |
- return PP_ERROR_FAILED; |
- |
- int32_t result = PP_ERROR_FAILED; |
- std::vector<SerializedDirEntry> entries; |
- g_module_local_thread_adapter->Send(instance, |
- new PpapiHostMsg_PPBFlashFile_ModuleLocal_GetDirContents( |
- API_ID_PPB_FLASH_FILE_MODULELOCAL, |
- instance, path, &entries, &result)); |
- |
- if (result != PP_OK) |
- return result; |
- |
- // Copy the serialized dir entries to the output struct. |
- *contents = new PP_DirContents_Dev; |
- (*contents)->count = static_cast<int32_t>(entries.size()); |
- (*contents)->entries = new PP_DirEntry_Dev[entries.size()]; |
- for (size_t i = 0; i < entries.size(); i++) { |
- const SerializedDirEntry& source = entries[i]; |
- PP_DirEntry_Dev* dest = &(*contents)->entries[i]; |
- |
- char* name_copy = new char[source.name.size() + 1]; |
- memcpy(name_copy, source.name.c_str(), source.name.size() + 1); |
- dest->name = name_copy; |
- dest->is_dir = PP_FromBool(source.is_dir); |
- } |
- |
- return result; |
-} |
- |
-const PPB_Flash_File_ModuleLocal flash_file_modulelocal_interface = { |
- &CreateThreadAdapterForInstance, |
- &ClearThreadAdapterForInstance, |
- &OpenModuleLocalFile, |
- &RenameModuleLocalFile, |
- &DeleteModuleLocalFileOrDir, |
- &CreateModuleLocalDir, |
- &QueryModuleLocalFile, |
- &GetModuleLocalDirContents, |
- &FreeDirContents, |
-}; |
- |
-InterfaceProxy* CreateFlashFileModuleLocalProxy(Dispatcher* dispatcher) { |
- return new PPB_Flash_File_ModuleLocal_Proxy(dispatcher); |
-} |
- |
-} // namespace |
- |
-PPB_Flash_File_ModuleLocal_Proxy::PPB_Flash_File_ModuleLocal_Proxy( |
- Dispatcher* dispatcher) |
- : InterfaceProxy(dispatcher), |
- ppb_flash_file_module_local_impl_(NULL) { |
- if (!dispatcher->IsPlugin()) { |
- ppb_flash_file_module_local_impl_ = |
- static_cast<const PPB_Flash_File_ModuleLocal*>( |
- dispatcher->local_get_interface()( |
- PPB_FLASH_FILE_MODULELOCAL_INTERFACE)); |
- } |
-} |
- |
-PPB_Flash_File_ModuleLocal_Proxy::~PPB_Flash_File_ModuleLocal_Proxy() { |
-} |
- |
-// static |
-const PPB_Flash_File_ModuleLocal* |
-PPB_Flash_File_ModuleLocal_Proxy::GetInterface() { |
- return &flash_file_modulelocal_interface; |
-} |
- |
-bool PPB_Flash_File_ModuleLocal_Proxy::OnMessageReceived( |
- const IPC::Message& msg) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(PPB_Flash_File_ModuleLocal_Proxy, msg) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_OpenFile, |
- OnMsgOpenFile) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_RenameFile, |
- OnMsgRenameFile) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_DeleteFileOrDir, |
- OnMsgDeleteFileOrDir) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_CreateDir, |
- OnMsgCreateDir) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_QueryFile, |
- OnMsgQueryFile) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_ModuleLocal_GetDirContents, |
- OnMsgGetDirContents) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- // TODO(brettw) handle bad messages! |
- return handled; |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgOpenFile( |
- PP_Instance instance, |
- const std::string& path, |
- int32_t mode, |
- IPC::PlatformFileForTransit* file_handle, |
- int32_t* result) { |
- base::PlatformFile file; |
- *result = ppb_flash_file_module_local_impl_->OpenFile( |
- instance, path.c_str(), mode, &file); |
- *file_handle = PlatformFileToPlatformFileForTransit( |
- dispatcher(), result, file); |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgRenameFile( |
- PP_Instance instance, |
- const std::string& from_path, |
- const std::string& to_path, |
- int32_t* result) { |
- *result = ppb_flash_file_module_local_impl_->RenameFile( |
- instance, from_path.c_str(), to_path.c_str()); |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgDeleteFileOrDir( |
- PP_Instance instance, |
- const std::string& path, |
- PP_Bool recursive, |
- int32_t* result) { |
- *result = ppb_flash_file_module_local_impl_->DeleteFileOrDir( |
- instance, path.c_str(), recursive); |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgCreateDir(PP_Instance instance, |
- const std::string& path, |
- int32_t* result) { |
- *result = ppb_flash_file_module_local_impl_->CreateDir( |
- instance, path.c_str()); |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgQueryFile(PP_Instance instance, |
- const std::string& path, |
- PP_FileInfo* info, |
- int32_t* result) { |
- *result = ppb_flash_file_module_local_impl_->QueryFile( |
- instance, path.c_str(), info); |
-} |
- |
-void PPB_Flash_File_ModuleLocal_Proxy::OnMsgGetDirContents( |
- PP_Instance instance, |
- const std::string& path, |
- std::vector<SerializedDirEntry>* entries, |
- int32_t* result) { |
- PP_DirContents_Dev* contents = NULL; |
- *result = ppb_flash_file_module_local_impl_->GetDirContents( |
- instance, path.c_str(), &contents); |
- if (*result != PP_OK) |
- return; |
- |
- // Convert the list of entries to the serialized version. |
- entries->resize(contents->count); |
- for (int32_t i = 0; i < contents->count; i++) { |
- (*entries)[i].name.assign(contents->entries[i].name); |
- (*entries)[i].is_dir = PP_ToBool(contents->entries[i].is_dir); |
- } |
- ppb_flash_file_module_local_impl_->FreeDirContents(instance, contents); |
-} |
- |
-// PPB_Flash_File_FileRef ------------------------------------------------------ |
- |
-namespace { |
- |
-int32_t OpenFileRefFile(PP_Resource file_ref_id, |
- int32_t mode, |
- PP_FileHandle* file) { |
- Resource* file_ref = |
- PpapiGlobals::Get()->GetResourceTracker()->GetResource(file_ref_id); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(file_ref); |
- if (!dispatcher) |
- return PP_ERROR_BADARGUMENT; |
- |
- int32_t result = PP_ERROR_FAILED; |
- IPC::PlatformFileForTransit transit; |
- dispatcher->Send(new PpapiHostMsg_PPBFlashFile_FileRef_OpenFile( |
- API_ID_PPB_FLASH_FILE_FILEREF, |
- file_ref->host_resource(), mode, &transit, &result)); |
- *file = IPC::PlatformFileForTransitToPlatformFile(transit); |
- return result; |
-} |
- |
-int32_t QueryFileRefFile(PP_Resource file_ref_id, |
- PP_FileInfo* info) { |
- Resource* file_ref = |
- PpapiGlobals::Get()->GetResourceTracker()->GetResource(file_ref_id); |
- if (!file_ref) |
- return PP_ERROR_BADRESOURCE; |
- |
- PluginDispatcher* dispatcher = PluginDispatcher::GetForResource(file_ref); |
- if (!dispatcher) |
- return PP_ERROR_BADARGUMENT; |
- |
- int32_t result = PP_ERROR_FAILED; |
- dispatcher->Send(new PpapiHostMsg_PPBFlashFile_FileRef_QueryFile( |
- API_ID_PPB_FLASH_FILE_FILEREF, |
- file_ref->host_resource(), info, &result)); |
- return result; |
-} |
- |
-const PPB_Flash_File_FileRef flash_file_fileref_interface = { |
- &OpenFileRefFile, |
- &QueryFileRefFile, |
-}; |
- |
-InterfaceProxy* CreateFlashFileFileRefProxy(Dispatcher* dispatcher) { |
- return new PPB_Flash_File_FileRef_Proxy(dispatcher); |
-} |
- |
-} // namespace |
- |
-PPB_Flash_File_FileRef_Proxy::PPB_Flash_File_FileRef_Proxy( |
- Dispatcher* dispatcher) |
- : InterfaceProxy(dispatcher), |
- ppb_flash_file_fileref_impl_(NULL) { |
- if (!dispatcher->IsPlugin()) { |
- ppb_flash_file_fileref_impl_ = static_cast<const PPB_Flash_File_FileRef*>( |
- dispatcher->local_get_interface()(PPB_FLASH_FILE_FILEREF_INTERFACE)); |
- } |
-} |
- |
-PPB_Flash_File_FileRef_Proxy::~PPB_Flash_File_FileRef_Proxy() { |
-} |
- |
-// static |
-const PPB_Flash_File_FileRef* PPB_Flash_File_FileRef_Proxy::GetInterface() { |
- return &flash_file_fileref_interface; |
-} |
- |
-bool PPB_Flash_File_FileRef_Proxy::OnMessageReceived( |
- const IPC::Message& msg) { |
- bool handled = true; |
- IPC_BEGIN_MESSAGE_MAP(PPB_Flash_File_FileRef_Proxy, msg) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_FileRef_OpenFile, |
- OnMsgOpenFile) |
- IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlashFile_FileRef_QueryFile, |
- OnMsgQueryFile) |
- IPC_MESSAGE_UNHANDLED(handled = false) |
- IPC_END_MESSAGE_MAP() |
- // TODO(brettw) handle bad messages! |
- return handled; |
-} |
- |
-void PPB_Flash_File_FileRef_Proxy::OnMsgOpenFile( |
- const HostResource& host_resource, |
- int32_t mode, |
- IPC::PlatformFileForTransit* file_handle, |
- int32_t* result) { |
- base::PlatformFile file; |
- *result = ppb_flash_file_fileref_impl_->OpenFile( |
- host_resource.host_resource(), mode, &file); |
- *file_handle = PlatformFileToPlatformFileForTransit( |
- dispatcher(), result, file); |
-} |
- |
-void PPB_Flash_File_FileRef_Proxy::OnMsgQueryFile( |
- const HostResource& host_resource, |
- PP_FileInfo* info, |
- int32_t* result) { |
- *result = ppb_flash_file_fileref_impl_->QueryFile( |
- host_resource.host_resource(), info); |
-} |
- |
-} // namespace proxy |
-} // namespace ppapi |