Index: native_client_sdk/src/examples/tutorial/filesystem_passing/filesystem_passing.cc |
diff --git a/native_client_sdk/src/examples/tutorial/filesystem_passing/filesystem_passing.cc b/native_client_sdk/src/examples/tutorial/filesystem_passing/filesystem_passing.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..24908a0d66bd3286df9f3dfdd3ed5414d329537b |
--- /dev/null |
+++ b/native_client_sdk/src/examples/tutorial/filesystem_passing/filesystem_passing.cc |
@@ -0,0 +1,114 @@ |
+// Copyright (c) 2014 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 <string> |
+ |
+#include "ppapi/c/pp_errors.h" |
+#include "ppapi/c/ppb_file_io.h" |
+#include "ppapi/cpp/file_io.h" |
+#include "ppapi/cpp/file_ref.h" |
+#include "ppapi/cpp/file_system.h" |
+#include "ppapi/cpp/instance.h" |
+#include "ppapi/cpp/module.h" |
+#include "ppapi/cpp/var.h" |
+#include "ppapi/cpp/var_dictionary.h" |
+#include "ppapi/utility/completion_callback_factory.h" |
+#include "ppapi/utility/threading/simple_thread.h" |
+ |
+#ifdef WIN32 |
+#undef PostMessage |
+// Allow 'this' in initializer list |
+#pragma warning(disable : 4355) |
+#endif |
+ |
+class Instance : public pp::Instance { |
+ public: |
+ explicit Instance(PP_Instance instance) |
+ : pp::Instance(instance), |
+ callback_factory_(this), |
+ thread_(this) {} |
+ |
+ private: |
+ virtual bool Init(uint32_t /*argc*/, |
+ const char* /*argn*/ [], |
+ const char* /*argv*/ []) { |
+ thread_.Start(); |
+ return true; |
+ } |
+ |
+ virtual void HandleMessage(const pp::Var& var_message) { |
+ // Got a message from JavaScript. We're assuming it is a dictionary with |
+ // two elements: |
+ // { |
+ // filesystem: <A Filesystem var>, |
+ // fullPath: <A string> |
+ // } |
+ pp::VarDictionary var_dict(var_message); |
+ pp::Resource filesystem_resource = var_dict.Get("filesystem").AsResource(); |
+ pp::FileSystem filesystem(filesystem_resource); |
+ std::string full_path = var_dict.Get("fullPath").AsString(); |
+ |
+ std::string save_path = full_path + "/hello_from_nacl.txt"; |
+ std::string contents = "Hello, from Native Client!\n"; |
+ |
+ thread_.message_loop().PostWork(callback_factory_.NewCallback( |
+ &Instance::WriteFile, filesystem, save_path, contents)); |
+ } |
+ |
+ void WriteFile(int32_t /* result */, |
+ const pp::FileSystem& filesystem, |
+ const std::string& path, |
+ const std::string& contents) { |
+ pp::FileRef ref(filesystem, path.c_str()); |
+ pp::FileIO file(this); |
+ |
+ int32_t open_result = |
+ file.Open(ref, PP_FILEOPENFLAG_WRITE | PP_FILEOPENFLAG_CREATE | |
+ PP_FILEOPENFLAG_TRUNCATE, |
+ pp::BlockUntilComplete()); |
+ if (open_result != PP_OK) { |
+ PostMessage("Failed to open file."); |
+ return; |
+ } |
+ |
+ int64_t offset = 0; |
+ int32_t bytes_written = 0; |
+ do { |
+ bytes_written = file.Write(offset, contents.data() + offset, |
+ contents.length(), pp::BlockUntilComplete()); |
+ if (bytes_written > 0) { |
+ offset += bytes_written; |
+ } else { |
+ PostMessage("Failed to write file."); |
+ return; |
+ } |
+ } while (bytes_written < static_cast<int64_t>(contents.length())); |
+ |
+ // All bytes have been written, flush the write buffer to complete |
+ int32_t flush_result = file.Flush(pp::BlockUntilComplete()); |
+ if (flush_result != PP_OK) { |
+ PostMessage("Failed to flush file."); |
+ return; |
+ } |
+ PostMessage(std::string("Wrote file ") + path + "."); |
+ } |
+ |
+ private: |
+ pp::CompletionCallbackFactory<Instance> callback_factory_; |
+ pp::SimpleThread thread_; |
+}; |
+ |
+class Module : public pp::Module { |
+ public: |
+ Module() : pp::Module() {} |
+ virtual ~Module() {} |
+ |
+ virtual pp::Instance* CreateInstance(PP_Instance instance) { |
+ return new Instance(instance); |
+ } |
+}; |
+ |
+namespace pp { |
+Module* CreateModule() { return new ::Module(); } |
+} // namespace pp |