wez             Mon Sep 23 18:40:20 2002 EDT

  Modified files:              
    /phpdoc/en/reference/filesystem/functions   file-register-wrapper.xml 
  Log:
  Flesh out the docs for user streams.
  
  
Index: phpdoc/en/reference/filesystem/functions/file-register-wrapper.xml
diff -u phpdoc/en/reference/filesystem/functions/file-register-wrapper.xml:1.3 
phpdoc/en/reference/filesystem/functions/file-register-wrapper.xml:1.4
--- phpdoc/en/reference/filesystem/functions/file-register-wrapper.xml:1.3      Thu 
Sep 19 21:02:59 2002
+++ phpdoc/en/reference/filesystem/functions/file-register-wrapper.xml  Mon Sep 23 
+18:40:20 2002
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="iso-8859-1"?>
-<!-- $Revision: 1.3 $ -->
+<!-- $Revision: 1.4 $ -->
 <!-- splitted from ./en/functions/filesystem.xml, last change in rev 1.141 -->
   <refentry id="function.file-register-wrapper">
    <refnamediv>
@@ -14,75 +14,289 @@
      <methodparam><type>string</type><parameter>classname</parameter></methodparam>
     </methodsynopsis>
     <para>
-     This function is currently only documented by the example below:
+     <function>file_register_wrapper</function> allows you to implement
+     your own protocol handlers and streams for use with all the other
+     filesystem functions (such as <function>fopen</function>,
+     <function>fread</function> etc.).
+    </para>
+    <para>
+     To implement a wrapper, you need to define a class with a number of
+     member functions, as defined below. When someone fopens your stream,
+     PHP will create an instance of <parameter>classname</parameter> and
+     then call methods on that instance.  You must implement the methods
+     exactly as described below - doing otherwise will lead to undefined
+     behaviour.
+    </para>
+    <para>
+     <function>file_register_wrapper</function> will return &false; if the
+     <parameter>protocol</parameter> already has a handler.
+    </para>
+
+    <methodsynopsis>
+     <type>boolean</type><methodname>stream_open</methodname>
+     <methodparam><type>string</type><parameter>path</parameter></methodparam>
+     <methodparam><type>string</type><parameter>mode</parameter></methodparam>
+     <methodparam><type>int</type><parameter>options</parameter></methodparam>
+     <methodparam><type>string</type><parameter>opened_path</parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called immediately after your stream object is
+     created.  <parameter>path</parameter> specifies the URL that was
+     passed to <function>fopen</function> and that this object is
+     expected to retrieve.  You can use <function>parse_url</function>
+     to break it apart.
+    </para>
+    <para>
+     <parameter>mode</parameter> is the mode used to open the file,
+     as detailed for <function>fopen</function>.  You are responsible
+     for checking that <parameter>mode</parameter> is valid for the
+     <parameter>path</parameter> requested.
+    </para>
+    <para>
+     <parameter>options</parameter> holds additional flags set
+     by the streams API. It can hold one or more of the following
+     values OR'd together.
+     <informaltable>
+      <tgroup cols="2">
+       <thead>
+        <row>
+         <entry>Flag</entry>
+         <entry>Description</entry>
+        </row>
+       </thead>
+       <tbody>
+        <row>
+         <entry>STREAM_USE_PATH</entry>
+         <entry>If <parameter>path</parameter> is relative, search
+          for the resource using the include_path.
+         </entry>
+        </row>
+        <row>
+         <entry>STREAM_REPORT_ERRORS</entry>
+         <entry>If this flag is set, you are responsible for raising
+          errors using <function>trigger_error</function> during
+          opening of the stream.  If this flag is not set, you
+          should not raise any errors.
+         </entry>
+        </row>
+       </tbody>
+      </tgroup>
+     </informaltable>
+    </para>
+    <para>
+     If the <parameter>path</parameter> is opened successfully,
+     and STREAM_USE_PATH is set in <parameter>options</parameter>,
+     you should set <parameter>opened_path</parameter> to the full
+     path of the file/resource that was actually opened.
+    </para>
+    <para>
+     If the requested resource was opened successfully, you should
+     return &true;, otherwise you should return &false;
+    </para>
+
+    <methodsynopsis>
+     <type>void</type><methodname>stream_close</methodname>
+     <methodparam><type>void</type><parameter></parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called when the stream is closed, using
+     <function>fclose</function>.  You must release any resources
+     that were locked or allocated by the stream.
+    </para>
+
+    <methodsynopsis>
+     <type>string</type><methodname>stream_read</methodname>
+     <methodparam><type>int</type><parameter>count</parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>fread</function>
+     and <function>fgets</function> calls on the stream.  You
+     must return up-to <parameter>count</parameter> bytes of data
+     from the current read/write position as a string.
+     If there are less than <parameter>count</parameter>
+     bytes available, return as many as are available.  If no
+     more data is available, return either &false; or an
+     empty string.
+     You must also update the read/write position of the stream
+     by the number of bytes that were successfully read.
+    </para>
+
+    <methodsynopsis>
+     <type>int</type><methodname>stream_write</methodname>
+     <methodparam><type>string</type><parameter>data</parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>fwrite</function>
+     calls on the stream.  You should store <parameter>data</parameter>
+     into the underlying storage used by your stream.  If there is not
+     enough room, try to store as many bytes as possible.
+     You should return the number of bytes that were successfully
+     stored in the stream, or 0 if none could be stored.
+     You must also update the read/write position of the stream
+     by the number of bytes that were successfully written.
+    </para>
+   
+    <methodsynopsis>
+     <type>boolean</type><methodname>stream_eof</methodname>
+     <methodparam><type>void</type><parameter></parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>feof</function>
+     calls on the stream.  You should return &true; if the read/write
+     position is at the end of the stream and if no more data is available
+     to be read, or &false; otherwise.
+    </para>
+
+    <methodsynopsis>
+     <type>int</type><methodname>stream_tell</methodname>
+     <methodparam><type>void</type><parameter></parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>ftell</function>
+     calls on the stream.  You should return the current read/write
+     position of the stream.
+    </para>
+
+    <methodsynopsis>
+     <type>boolean</type><methodname>stream_seek</methodname>
+     <methodparam><type>int</type><parameter>offset</parameter></methodparam>
+     <methodparam><type>int</type><parameter>whence</parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>fseek</function>
+     calls on the stream.  You should update the read/write position
+     of the stream according to <parameter>offset</parameter> and
+     <parameter>whence</parameter>.  See <function>fseek</function>
+     for more information about these parameters.
+     Return &true; if the position was updated, &false; otherwise.
+    </para>
+
+    <methodsynopsis>
+     <type>boolean</type><methodname>stream_flush</methodname>
+     <methodparam><type>void</type><parameter></parameter></methodparam>
+    </methodsynopsis>
+    <para>
+     This method is called in response to <function>fflush</function>
+     calls on the stream.  If you have cached data in your stream
+     but not yet stored it into the underlying storage, you should
+     do so now.
+     Return &true; if the cached data was successfully stored (or
+     if there was no data to store), or &false; if the data could
+     not be stored.
+    </para>
+
+    <para>
+     The example below implements a var:// protocol handler that
+     allows read/write access to a named global variable using
+     standard filesystem stream functions such as <function>fread</function>.
+     The var:// protocol implemented below, given the url
+     "var://foo" will read/write data to/from $GLOBALS["foo"].
+
      <example> 
-      <title>Implementing a base64 encoding protocol</title>
+      <title>A Stream for reading/writing global variables</title>
       <programlisting role="php">
 <![CDATA[
-class Base64EncodingStream {
-    var $fp = null;
-
+class VariableStream {
+    var $position;
+    var $varname;
+   
     function stream_open($path, $mode, $options, &$opened_path)
     {
-        $this->fp = fopen($path, $mode);
-        return is_resource($this->fp);
-    }
-    function stream_close()
-    {
-        fclose($this->fp);
+        $url = parse_url($path);
+        $this->varname = $split["host"];
+        $this->position = 0;
+        
+        return true;
     }
+
     function stream_read($count)
     {
-        return false; // We only allow writing
+        $ret = substr($GLOBALS[$this->varname], $this->position, $count);
+        $this->position += strlen($ret);
+        return $ret;
     }
+
     function stream_write($data)
     {
-        return fwrite($this->fp, base64_encode($data));
-    }
-    function stream_flush()
-    {
-        fflush($this->fp);
-        return true;
-    }
-    function stream_seek($offset, $whence)
-    {
-        return false;
-    }
-    function stream_gets()
-    {
-        return false;
+        $left = substr($GLOBALS[$this->varname], 0, $this->position);
+        $right = substr($GLOBALS[$this->varname], $this->position + strlen($data));
+        $GLOBALS[$this->varname] = $left . $data . $right;
+        $this->position += strlen($data);
+        return strlen($data);
     }
+
     function stream_tell()
     {
-        return false;
+        return $this->position;
     }
+
     function stream_eof()
     {
-        return false;
+        return $this->position >= strlen($GLOBALS[$this->varname]);
+    }
+
+    function stream_seek($offset, $whence)
+    {
+        switch($whence) {
+            case SEEK_SET:
+                if ($offset < strlen($GLOBALS[$this->varname]) && $offset >= 0) {
+                     $this->position = $offset;
+                     return true;
+                } else {
+                     return false;
+                }
+                break;
+                
+            case SEEK_CUR:
+                if ($offset >= 0) {
+                     $this->position += $offset;
+                     return true;
+                } else {
+                     return false;
+                }
+                break;
+                
+            case SEEK_END:
+                if (strlen($GLOBALS[$this->varname]) + $offset >= 0) {
+                     $this->position = strlen($GLOBALS[$this->varname]) + $offset;
+                     return true;
+                } else {
+                     return false;
+                }
+                break;
+                
+            default:
+                return false;
+        }
     }
 }
-file_register_wrapper("base64", "Base64EncodingStream")
+
+file_register_wrapper("var", "VariableStream")
     or die("Failed to register protocol");
 
-copy("/tmp/inputfile.txt", "base64:///tmp/outputfile.txt");
-readfile("/tmp/outputfile");
+$myvar = "";
+    
+$fp = fopen("var://myvar", "r+");
+
+fwrite($fp, "line1\n");
+fwrite($fp, "line2\n");
+fwrite($fp, "line3\n");
+
+rewind($fp);
+while(!feof($fp)) {
+    echo fgets($fp)
+}
+fclose($fp);
+var_dump($myvar);
+
 ]]>
       </programlisting>
      </example>
-
     </para>
-    <para>
-     <function>file_register_wrapper</function> will return &false; if the
-     <parameter>protocol</parameter> already has a handler, or if "fopen
-     wrappers" are disabled.
-    </para>
-    <note>
-     <para>
-      This function was introduced in PHP 4.3.0.
-     </para>
-    </note>
+  
    </refsect1>
   </refentry>
+
 
 <!-- Keep this comment at the end of the file
 Local variables:

-- 
PHP Documentation Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to