Index: native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/nacl_io.html |
diff --git a/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/nacl_io.html b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/nacl_io.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca10522ceef00bbbc9ea4817f89092ca566f5665 |
--- /dev/null |
+++ b/native_client_sdk/src/doc/_developer.chrome.com_generated/devguide/coding/nacl_io.html |
@@ -0,0 +1,225 @@ |
+{{+bindTo:partials.standard_nacl_article}} |
+ |
+<section id="the-nacl-io-library"> |
+<span id="nacl-io"></span><h1 id="the-nacl-io-library"><span id="nacl-io"></span>The nacl_io Library</h1> |
+<div class="contents local topic" id="contents"> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#introduction" id="id1">Introduction</a></li> |
+<li><a class="reference internal" href="#using-nacl-io" id="id2">Using nacl_io</a></li> |
+<li><p class="first"><a class="reference internal" href="#the-nacl-io-demo" id="id3">The nacl_io demo</a></p> |
+<ul class="small-gap"> |
+<li><a class="reference internal" href="#building-and-running-the-demo" id="id4">Building and running the demo</a></li> |
+<li><a class="reference internal" href="#a-look-at-the-code" id="id5">A look at the code</a></li> |
+</ul> |
+</li> |
+<li><a class="reference internal" href="#reference-information" id="id6">Reference information</a></li> |
+</ul> |
+</div> |
+<section id="introduction"> |
+<h2 id="introduction">Introduction</h2> |
+<p><code>nacl_io</code> is a utility library that provides implementations of standard |
+C APIs such as POSIX I/O (<code>stdio.h</code>) and BSD sockets (<code>sys/socket.h</code>). |
+Its primary function is to allow code that uses these standard APIs to be |
+compiled and used in a Native Client module. The library is included as part |
+of Native Client SDK and is implemented in on top of Pepper API.</p> |
+<p>Since Native Client modules cannot access the host machine’s file system |
+directly, nacl_io provides several alternative filesystem types which |
+can be used by the application. For example, the Chrome browser supports the |
+<a class="reference external" href="http://www.html5rocks.com/en/tutorials/file/filesystem/">HTML5 File System API</a> which provides |
+access to a protected area of the local file system. This filesystem can |
+be accessed by an HTML page using JavaScript commands, and also by a Native |
+Client module using the Pepper <a class="reference internal" href="/native-client/devguide/coding/file-io.html"><em>File IO API</em></a>. With nacl_io |
+a Native Client application can mount an HTML5 filesystem and access it via |
+standard POSIX I/O function such as <code>fopen</code>, <code>fseek</code>, <code>fread</code>, |
+<code>fwrite</code>, and <code>fclose</code>, or their low level UNIX counterparts <code>open</code>, |
+<code>lseek</code>, <code>read</code>, <code>write</code> and <code>close</code>.</p> |
+<p>As well as the HTML5 file system, nacl_io provides several other file system |
+types which are described in the table below:</p> |
+<table border="1" class="docutils"> |
+<colgroup> |
+</colgroup> |
+<thead valign="bottom"> |
+<tr class="row-odd"><th class="head">File System</th> |
+<th class="head">Description</th> |
+</tr> |
+</thead> |
+<tbody valign="top"> |
+<tr class="row-even"><td>memfs</td> |
+<td>An in-memory file system</td> |
+</tr> |
+<tr class="row-odd"><td>html5fs</td> |
+<td>An HTML5 local file system, which can be persistent or temporary</td> |
+</tr> |
+<tr class="row-even"><td>http</td> |
+<td>Maps files on a remote webserver into the local filesystem.</td> |
+</tr> |
+<tr class="row-odd"><td>dev</td> |
+<td>A file system containing special files (e.g.: <code>/dev/null</code>)</td> |
+</tr> |
+</tbody> |
+</table> |
+</section><section id="using-nacl-io"> |
+<h2 id="using-nacl-io">Using nacl_io</h2> |
+<p>Using nacl_io is mostly just a matter of using the standard POSIX C library |
+functions. However, there are some steps required to initialize the library |
+and setup the filesystem mounts. In general the following steps will be needed |
+to use nacl_io in a NaCl application:</p> |
+<ol class="arabic simple"> |
+<li>Link the application with the nacl_io library (<code>-lnacl_io</code>)</li> |
+<li>Initialize nacl_io at startup using the <code>nacl_io_init_ppapi</code> or |
+<code>nacl_io_init</code> functions.</li> |
+<li>Mount any desired filesystems using the <code>mount</code> function. The arguments |
+to <code>mount</code> for the different filesystem types are detailed in |
+<code>include/nacl_io/nacl_io.h</code>.</li> |
+<li>If you are going to mount an HTML5 file system, be sure to allocate space |
+for it. You can either set the <code>unlimitedStorage</code> permission in the app’s |
+Web Store manifest file, or call the HTML5 QuotaManagement API. These |
+options are explained in the <a class="reference internal" href="/native-client/devguide/coding/file-io.html#quota-management"><em>File IO documentation</em></a>.</li> |
+<li>Make sure that file and socket API calls are all made from the background |
+thread. This is because the main Pepper thread does not support the blocking |
+behavior needed by the POSIX I/O operations.</li> |
+</ol> |
+</section><section id="the-nacl-io-demo"> |
+<h2 id="the-nacl-io-demo">The nacl_io demo</h2> |
+<section id="building-and-running-the-demo"> |
+<h3 id="building-and-running-the-demo">Building and running the demo</h3> |
+<p>The demo application launches a Native Client module that mounts three file |
+systems and displays a set of controls that let you work with them:</p> |
+<img alt="/native-client/images/nacl_io1.png" src="/native-client/images/nacl_io1.png" /> |
+<p>Follow these steps to build and run the demo:</p> |
+<ul class="small-gap"> |
+<li><p class="first">Open a terminal in the demo directory:</p> |
+<pre class="prettyprint"> |
+$ cd $NACL_SDK_ROOT/examples/demo/nacl_io |
+</pre> |
+</li> |
+<li><p class="first">run the demo:</p> |
+<pre class="prettyprint"> |
+$ make run |
+</pre> |
+</li> |
+</ul> |
+<p>Once the demo is running, try these operations:</p> |
+<ol class="arabic simple"> |
+<li>select the fopen command (when you select a command the fields in the line |
+below will change according to the command)</li> |
+<li>type in the filename <code>/persistent/test</code></li> |
+<li>check the write checkbox and press the fopen button</li> |
+<li>select the fwrite command and select the file <code>/persistent/test</code> in the |
+menu that appears below on the left</li> |
+<li>enter some data and press the fwrite button</li> |
+<li>select the fclose command, be sure the file <code>/persistent/test</code> is selected |
+in the menu, and press the fclose button</li> |
+<li>select the fopen command</li> |
+<li>type in the filename <code>/persistent/test</code></li> |
+<li>check the fread checkbox and press the fopen button</li> |
+<li>select the fread command, be sure the file /persistent/test is selected in |
+the menu, enter a byte count, and press the fread button</li> |
+</ol> |
+</section><section id="a-look-at-the-code"> |
+<h3 id="a-look-at-the-code">A look at the code</h3> |
+<p>The demo is written C and comprises three files.</p> |
+<section id="nacl-io-demo-c"> |
+<h4 id="nacl-io-demo-c">nacl_io_demo.c</h4> |
+<p>This is the demo’s main file. The code here creates and initializes the Native |
+Client module instance. The Pepper function <code>Instance_DidCreate</code> initializes |
+nacl_io and mounts an HTML5 filesystem at <code>/persistent</code>.</p> |
+<pre class="prettyprint"> |
+static PP_Bool Instance_DidCreate(PP_Instance instance, |
+ uint32_t argc, |
+ const char* argn[], |
+ const char* argv[]) { |
+ g_instance = instance; |
+ nacl_io_init_ppapi(instance, get_browser_interface); |
+ mount( |
+ "", /* source */ |
+ "/persistent", /* target */ |
+ "html5fs", /* filesystemtype */ |
+ 0, /* mountflags */ |
+ "type=PERSISTENT,expected_size=1048576"); /* data specific to the html5fs type */ |
+ |
+ pthread_create(&g_handle_message_thread, NULL, &HandleMessageThread, NULL); |
+ InitializeMessageQueue(); |
+ |
+ return PP_TRUE; |
+} |
+</pre> |
+<p>Space is allocated to the <code>/persistent</code> file system after the module is |
+initialized. This is accomplished by the <code>domContentLoaded</code> function in |
+the file <code>example.js</code>. This script is included in the module’s html page (see |
+<code>examples/demo/index.html</code>):</p> |
+<pre class="prettyprint"> |
+function domContentLoaded(name, tc, config, width, height) { |
+ navigator.webkitPersistentStorage.requestQuota(window.PERSISTENT, 1024 * 1024, |
+ function(bytes) { |
+ common.updateStatus( |
+ 'Allocated ' + bytes + ' bytes of persistant storage.'); |
+ common.createNaClModule(name, tc, config, width, height); |
+ common.attachDefaultListeners(); |
+ }, |
+ function(e) { alert('Failed to allocate space') }); |
+} |
+</pre> |
+<p>The <code>Instance_DidCreate</code> function also creates a worker thread that receives |
+messages sent from the html page and performs the specified file system |
+operations. The logic for the worker thread is encoded in the other two files, |
+described below.</p> |
+</section><section id="queue-c"> |
+<h4 id="queue-c">queue.c</h4> |
+<p>This file implements a circular queue that is used to receive messages from the |
+browser UI to the Native Client module. The file system commands in the |
+enqueued messages are executed on the worker thread. This keeps blocking calls |
+(like fread) off the main Native Client thread, which is a good thing. The |
+queue is initialized in nacl_io_demo.c <code>Instance_DidCreate</code>.</p> |
+</section><section id="handlers-c"> |
+<h4 id="handlers-c">handlers.c</h4> |
+<p>This file implements the stdio calls associated with the commands sent from the |
+browser. There is a separate <code>Handle*</code> function for each command: fopen, |
+fclose, fseek, fread, fwrite. The handlers are called from the |
+<code>HandleMessage</code> function in nacl_io_demo.c, which runs in the worker |
+thread managing the message queue. The code for the <code>fwrite</code> handler appears |
+below. Notice that it does not contain any PPAPI calls and looks like |
+“ordinary” C code.</p> |
+<pre class="prettyprint"> |
+int HandleFwrite(int num_params, char** params, char** output) { |
+ FILE* file; |
+ const char* file_index_string; |
+ const char* data; |
+ size_t data_len; |
+ size_t bytes_written; |
+ |
+ if (num_params != 2) { |
+ *output = PrintfToNewString("Error: fwrite takes 2 parameters."); |
+ return 1; |
+ } |
+ |
+ file_index_string = params[0]; |
+ file = GetFileFromIndexString(file_index_string, NULL); |
+ data = params[1]; |
+ data_len = strlen(data); |
+ |
+ if (!file) { |
+ *output = PrintfToNewString("Error: Unknown file handle %s.", |
+ file_index_string); |
+ return 2; |
+ } |
+ |
+ bytes_written = fwrite(data, 1, data_len, file); |
+ |
+ *output = PrintfToNewString("fwrite\1%s\1%d", file_index_string, |
+ bytes_written); |
+ return 0; |
+} |
+</pre> |
+</section></section></section><section id="reference-information"> |
+<h2 id="reference-information">Reference information</h2> |
+<p>The example discussed here is included in the SDK in the directory |
+<code>examples/demo/nacl_io</code>.</p> |
+<p>The nacl_io library is included in the SDK toolchain and is not a part of the |
+Pepper API. For reference information related to the nacl_io interface see |
+its header file in the SDK directory, located at |
+<code>include/nacl_io/nacl_io.h</code>.</p> |
+<p>For more about the HTML5 file system read the <a class="reference external" href="http://dev.w3.org/2009/dap/file-system/pub/FileSystem/">specification</a>.</p> |
+</section></section> |
+ |
+{{/partials.standard_nacl_article}} |