Index: ppapi/nacl_irt/manifest_service.cc |
diff --git a/ppapi/nacl_irt/manifest_service.cc b/ppapi/nacl_irt/manifest_service.cc |
index ed7c4ebf969ffe9d337780ad426831abfcb3f4a0..0afa217e2897a142a1dfefe555384a3c02565fec 100644 |
--- a/ppapi/nacl_irt/manifest_service.cc |
+++ b/ppapi/nacl_irt/manifest_service.cc |
@@ -8,10 +8,15 @@ |
#include "ipc/ipc_channel_handle.h" |
#include "ipc/ipc_channel_proxy.h" |
#include "ipc/ipc_sync_message_filter.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/errno.h" |
+#include "ppapi/nacl_irt/irt_manifest.h" |
+#include "ppapi/nacl_irt/plugin_startup.h" |
#include "ppapi/proxy/ppapi_messages.h" |
namespace ppapi { |
+const char kFilePrefix[] = "files/"; |
+ |
ManifestService::ManifestService( |
const IPC::ChannelHandle& handle, |
scoped_refptr<base::MessageLoopProxy> io_message_loop, |
@@ -19,7 +24,7 @@ ManifestService::ManifestService( |
filter_ = new IPC::SyncMessageFilter(shutdown_event); |
channel_.reset(new IPC::ChannelProxy(handle, |
IPC::Channel::MODE_SERVER, |
- NULL, // Listener |
+ NULL, // Listener |
io_message_loop)); |
channel_->AddFilter(filter_.get()); |
} |
@@ -31,4 +36,34 @@ void ManifestService::StartupInitializationComplete() { |
filter_->Send(new PpapiHostMsg_StartupInitializationComplete); |
} |
+bool ManifestService::OpenResource(const char* file, int* fd) { |
+ // OpenResource will return INVALID SerializedHandle, if it is not supported. |
+ // Specifically, PNaCl doesn't support open resource. |
+ ppapi::proxy::SerializedHandle ipc_fd; |
+ if (!filter_->Send(new PpapiHostMsg_OpenResource( |
+ std::string(kFilePrefix) + file, &ipc_fd)) || |
+ !ipc_fd.is_file()) { |
+ LOG(ERROR) << "ManifestService::OpenResource failed:" << file; |
+ *fd = -1; |
+ return false; |
+ } |
+ |
+ *fd = ipc_fd.descriptor().fd; |
+ return true; |
+} |
+ |
+int IrtOpenResource(const char* file, int* fd) { |
+ // Remove leading '/' character. |
+ if (file[0] == '/') |
+ ++file; |
+ |
+ ManifestService* manifest_service = GetManifestService(); |
+ if (manifest_service == NULL || |
+ !manifest_service->OpenResource(file, fd)) { |
+ return NACL_ABI_EIO; |
+ } |
+ |
+ return (*fd == -1) ? NACL_ABI_ENOENT : 0; |
+} |
+ |
} // namespace ppapi |