Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: native_client_sdk/src/examples/tutorial/filesystem_passing/filesystem_passing.cc

Issue 690403002: [NaCl SDK] Add filesystem passing example. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix verify Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698