tmud-3.0.0/benchmark/
tmud-3.0.0/cmd/
tmud-3.0.0/cmd/objects/
tmud-3.0.0/cmd/tiny/
tmud-3.0.0/doc/SQLite/
tmud-3.0.0/doc/SQLite3/
tmud-3.0.0/doc/TernaryTrie/
tmud-3.0.0/farts/
tmud-3.0.0/lib/
tmud-3.0.0/lib/engine/
tmud-3.0.0/lib/farts/
tmud-3.0.0/logs/
<!DOCTYPE html>

<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">

<title>class Connection - TeensyMUD 3.0.0 Mud Server</title>

<link type="text/css" media="screen" href="./rdoc.css" rel="stylesheet">

<script type="text/javascript">
  var rdoc_rel_prefix = "./";
</script>

<script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="./js/navigation.js"></script>
<script type="text/javascript" charset="utf-8" src="./js/search_index.js"></script>
<script type="text/javascript" charset="utf-8" src="./js/search.js"></script>
<script type="text/javascript" charset="utf-8" src="./js/searcher.js"></script>
<script type="text/javascript" charset="utf-8" src="./js/darkfish.js"></script>


<body id="top" class="class">
<nav id="metadata">
  <nav id="home-section" class="section">
  <h3 class="section-header">
    <a href="./index.html">Home</a>
    <a href="./table_of_contents.html#classes">Classes</a>
    <a href="./table_of_contents.html#methods">Methods</a>
  </h3>
</nav>


  <nav id="search-section" class="section project-section" class="initially-hidden">
  <form action="#" method="get" accept-charset="utf-8">
    <h3 class="section-header">
      <input type="text" name="search" placeholder="Search" id="search-field"
             title="Type to search, Up and Down to navigate, Enter to load">
    </h3>
  </form>

  <ul id="search-results" class="initially-hidden"></ul>
</nav>


  <div id="file-metadata">
    <nav id="file-list-section" class="section">
  <h3 class="section-header">Defined In</h3>
  <ul>
    <li>lib/network/connection.rb
  </ul>
</nav>

    
  </div>

  <div id="class-metadata">
    
    <nav id="parent-class-section" class="section">
  <h3 class="section-header">Parent</h3>
  
  <p class="link"><a href="Session.html">Session</a>
  
</nav>

    
    <!-- Method Quickref -->
<nav id="method-list-section" class="section">
  <h3 class="section-header">Methods</h3>

  <ul class="link-list">
    
    <li><a href="#method-c-new">::new</a>
    
    <li><a href="#method-i-handle_close">#handle_close</a>
    
    <li><a href="#method-i-handle_input">#handle_input</a>
    
    <li><a href="#method-i-handle_oob">#handle_oob</a>
    
    <li><a href="#method-i-handle_output">#handle_output</a>
    
    <li><a href="#method-i-init">#init</a>
    
    <li><a href="#method-i-query">#query</a>
    
    <li><a href="#method-i-sendmsg">#sendmsg</a>
    
    <li><a href="#method-i-set">#set</a>
    
    <li><a href="#method-i-set_initdone">#set_initdone</a>
    
    <li><a href="#method-i-update">#update</a>
    
  </ul>
</nav>

  </div>

  <div id="project-metadata">
    <nav id="fileindex-section" class="section project-section">
  <h3 class="section-header">Pages</h3>

  <ul>
  
    <li class="file"><a href="./README.html">README</a>
  
    <li class="file"><a href="./TML.html">TML</a>
  
  </ul>
</nav>

    <nav id="classindex-section" class="section project-section">
  <h3 class="section-header">Class and Module Index</h3>

  <ul class="link-list">
  
    <li><a href="./Farts.html">Farts</a>
  
    <li><a href="./Farts/AttributeSyntaxNode.html">Farts::AttributeSyntaxNode</a>
  
    <li><a href="./Farts/CallSyntaxNode.html">Farts::CallSyntaxNode</a>
  
    <li><a href="./Farts/CommandSyntaxNode.html">Farts::CommandSyntaxNode</a>
  
    <li><a href="./Farts/CommentSyntaxNode.html">Farts::CommentSyntaxNode</a>
  
    <li><a href="./Farts/EndSyntaxNode.html">Farts::EndSyntaxNode</a>
  
    <li><a href="./Farts/IfSyntaxNode.html">Farts::IfSyntaxNode</a>
  
    <li><a href="./Farts/Interpreter.html">Farts::Interpreter</a>
  
    <li><a href="./Farts/Lexer.html">Farts::Lexer</a>
  
    <li><a href="./Farts/Lib.html">Farts::Lib</a>
  
    <li><a href="./Farts/LiteralSyntaxNode.html">Farts::LiteralSyntaxNode</a>
  
    <li><a href="./Farts/LocalVarSyntaxNode.html">Farts::LocalVarSyntaxNode</a>
  
    <li><a href="./Farts/Parser.html">Farts::Parser</a>
  
    <li><a href="./Farts/ProgramSyntaxNode.html">Farts::ProgramSyntaxNode</a>
  
    <li><a href="./Farts/SyntaxNode.html">Farts::SyntaxNode</a>
  
    <li><a href="./SQLite.html">SQLite</a>
  
    <li><a href="./SQLite3.html">SQLite3</a>
  
    <li><a href="./SQLite3/Database.html">SQLite3::Database</a>
  
    <li><a href="./SQLite/Database.html">SQLite::Database</a>
  
    <li><a href="./TernaryTrie.html">TernaryTrie</a>
  
    <li><a href="./TernaryTrie/TNode.html">TernaryTrie::TNode</a>
  
    <li><a href="./ASCIICodes.html">ASCIICodes</a>
  
    <li><a href="./Acceptor.html">Acceptor</a>
  
    <li><a href="./Account.html">Account</a>
  
    <li><a href="./BoolExpParser.html">BoolExpParser</a>
  
    <li><a href="./CacheEntry.html">CacheEntry</a>
  
    <li><a href="./CacheManager.html">CacheManager</a>
  
    <li><a href="./CacheStats.html">CacheStats</a>
  
    <li><a href="./Character.html">Character</a>
  
    <li><a href="./Client.html">Client</a>
  
    <li><a href="./Cmd.html">Cmd</a>
  
    <li><a href="./ColorFilter.html">ColorFilter</a>
  
    <li><a href="./Command.html">Command</a>
  
    <li><a href="./Configuration.html">Configuration</a>
  
    <li><a href="./Connection.html">Connection</a>
  
    <li><a href="./Connector.html">Connector</a>
  
    <li><a href="./ConsoleClient.html">ConsoleClient</a>
  
    <li><a href="./CursesClient.html">CursesClient</a>
  
    <li><a href="./DbmStore.html">DbmStore</a>
  
    <li><a href="./DebugFilter.html">DebugFilter</a>
  
    <li><a href="./Dumper.html">Dumper</a>
  
    <li><a href="./Engine.html">Engine</a>
  
    <li><a href="./Event.html">Event</a>
  
    <li><a href="./EventManager.html">EventManager</a>
  
    <li><a href="./Exit.html">Exit</a>
  
    <li><a href="./Filter.html">Filter</a>
  
    <li><a href="./GameObject.html">GameObject</a>
  
    <li><a href="./GdbmStore.html">GdbmStore</a>
  
    <li><a href="./LineIO.html">LineIO</a>
  
    <li><a href="./Loader.html">Loader</a>
  
    <li><a href="./Log.html">Log</a>
  
    <li><a href="./Module.html">Module</a>
  
    <li><a href="./Obj.html">Obj</a>
  
    <li><a href="./ObjCmd.html">ObjCmd</a>
  
    <li><a href="./Object.html">Object</a>
  
    <li><a href="./PacketIO.html">PacketIO</a>
  
    <li><a href="./ProtocolStack.html">ProtocolStack</a>
  
    <li><a href="./Publisher.html">Publisher</a>
  
    <li><a href="./Reactor.html">Reactor</a>
  
    <li><a href="./Room.html">Room</a>
  
    <li><a href="./Root.html">Root</a>
  
    <li><a href="./Script.html">Script</a>
  
    <li><a href="./SdbmStore.html">SdbmStore</a>
  
    <li><a href="./Session.html">Session</a>
  
    <li><a href="./SockIO.html">SockIO</a>
  
    <li><a href="./Sqlite3Store.html">Sqlite3Store</a>
  
    <li><a href="./SqliteStore.html">SqliteStore</a>
  
    <li><a href="./Store.html">Store</a>
  
    <li><a href="./String.html">String</a>
  
    <li><a href="./TelnetCodes.html">TelnetCodes</a>
  
    <li><a href="./TelnetFilter.html">TelnetFilter</a>
  
    <li><a href="./TerminalFilter.html">TerminalFilter</a>
  
    <li><a href="./Timer.html">Timer</a>
  
    <li><a href="./Utility.html">Utility</a>
  
    <li><a href="./VT100Codes.html">VT100Codes</a>
  
    <li><a href="./World.html">World</a>
  
    <li><a href="./XmlStore.html">XmlStore</a>
  
    <li><a href="./YamlStore.html">YamlStore</a>
  
  </ul>
</nav>

  </div>
</nav>

<div id="documentation">
  <h1 class="class">class Connection</h1>

  <div id="description" class="description">
    
<p>The connection class maintains a socket connection with a reactor and
handles all events dispatched by the reactor.</p>

  </div><!-- description -->

  
  
  
  <section id="5Buntitled-5D" class="documentation-section">
    

    

    

    
    <!-- Attributes -->
    <section id="attribute-method-details" class="method-section section">
      <h3 class="section-header">Attributes</h3>

      
      <div id="attribute-i-addr" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">addr</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-host" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">host</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-inbuffer" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">inbuffer</span><span
            class="attribute-access-type">[RW]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-initdone" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">initdone</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-outbuffer" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">outbuffer</span><span
            class="attribute-access-type">[RW]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-pstack" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">pstack</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-server" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">server</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
      <div id="attribute-i-sockio" class="method-detail">
        <div class="method-heading attribute-method-heading">
          <span class="method-name">sockio</span><span
            class="attribute-access-type">[R]</span>
        </div>

        <div class="method-description">
        
        
        
        </div>
      </div>
      
    </section><!-- attribute-method-details -->
    

    <!-- Methods -->
    
     <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
      <h3 class="section-header">Public Class Methods</h3>

    
      <div id="method-c-new" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">new</span><span
            class="method-args">(server, sock)</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p>Create a new connection object</p>
<dl class="rdoc-list label-list"><dt><code>server</code>
<dd>
<p>The reactor this connection is associated with.</p>
</dd><dt><code>sock</code>
<dd>
<p>The socket for this connection.</p>
</dd><dt><code>returns</code>
<dd>
<p>A connection object.</p>
</dd></dl>
          

          
          <div class="method-source-code" id="new-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 34</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">server</span>, <span class="ruby-identifier">sock</span>)
  <span class="ruby-keyword">super</span>(<span class="ruby-identifier">server</span>, <span class="ruby-identifier">sock</span>)
  <span class="ruby-keyword">case</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_io</span>
  <span class="ruby-keyword">when</span> <span class="ruby-value">:lineio</span>
    <span class="ruby-ivar">@sockio</span> = <span class="ruby-constant">LineIO</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@sock</span>)
  <span class="ruby-keyword">when</span> <span class="ruby-value">:packetio</span>
    <span class="ruby-ivar">@sockio</span> = <span class="ruby-constant">PacketIO</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@sock</span>)
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@sockio</span> = <span class="ruby-constant">SockIO</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@sock</span>)
  <span class="ruby-keyword">end</span>
  <span class="ruby-ivar">@inbuffer</span> = <span class="ruby-string">&quot;&quot;</span>              <span class="ruby-comment"># buffer lines waiting to be processed</span>
  <span class="ruby-ivar">@outbuffer</span> = <span class="ruby-string">&quot;&quot;</span>             <span class="ruby-comment"># buffer lines waiting to be output</span>
  <span class="ruby-keyword">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-value">:telnetfilter</span>
    <span class="ruby-ivar">@initdone</span> = <span class="ruby-keyword">false</span>           <span class="ruby-comment"># keeps silent until we're done with negotiations</span>
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@initdone</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-keyword">end</span>
  <span class="ruby-ivar">@pstack</span> = <span class="ruby-constant">ProtocolStack</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword">self</span>)
<span class="ruby-keyword">end</span></pre>
          </div><!-- new-source -->
          
        </div>

        

        
      </div><!-- new-method -->

    
    </section><!-- public-class-method-details -->
  
     <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
      <h3 class="section-header">Public Instance Methods</h3>

    
      <div id="method-i-handle_close" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">handle_close</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p><a href="Connection.html#method-i-handle_close">#handle_close</a> is called
to when an close event occurs for this session.</p>
          

          
          <div class="method-source-code" id="handle_close-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 131</span>
  <span class="ruby-keyword">def</span> <span class="ruby-identifier">handle_close</span>
    <span class="ruby-ivar">@connected</span> = <span class="ruby-keyword">false</span>
    <span class="ruby-identifier">publish</span>(<span class="ruby-value">:disconnected</span>)
    <span class="ruby-identifier">unsubscribe_all</span>
    <span class="ruby-identifier">log</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection '#{@host}(#{@addr})' closing&quot;</span>
    <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-keyword">self</span>)
<span class="ruby-comment">#    @sock.shutdown   # odd errors thrown with this</span>
    <span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">close</span>
  <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
    <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#handle_close closing&quot;</span>
    <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
  <span class="ruby-keyword">end</span></pre>
          </div><!-- handle_close-source -->
          
        </div>

        

        
      </div><!-- handle_close-method -->

    
      <div id="method-i-handle_input" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">handle_input</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p><a href="Connection.html#method-i-handle_input">#handle_input</a> is called
to order a connection to process any input waiting on its socket.  Input is
parsed into lines based on the occurance of the CRLF terminator and pushed
into a buffer which is a list of lines.  The buffer expands dynamically as
input is processed.  Input that has yet to see a CRLF terminator is left in
the connection's inbuffer.</p>
          

          
          <div class="method-source-code" id="handle_input-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 75</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">handle_input</span>
  <span class="ruby-identifier">buf</span> = <span class="ruby-ivar">@sockio</span>.<span class="ruby-identifier">read</span>
  <span class="ruby-identifier">raise</span>(<span class="ruby-constant">EOFError</span>) <span class="ruby-keyword">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">buf</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">buf</span>.<span class="ruby-identifier">empty?</span>
  <span class="ruby-identifier">buf</span> = <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">filter_call</span>(<span class="ruby-value">:filter_in</span>,<span class="ruby-identifier">buf</span>)
  <span class="ruby-keyword">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_io</span> <span class="ruby-operator">==</span> <span class="ruby-value">:packetio</span> <span class="ruby-operator">||</span>
     <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_type</span> <span class="ruby-operator">==</span> <span class="ruby-value">:client</span>
    <span class="ruby-identifier">publish</span>(<span class="ruby-identifier">buf</span>)
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@inbuffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">buf</span>
    <span class="ruby-keyword">if</span> <span class="ruby-ivar">@initdone</span>  <span class="ruby-comment"># Just let buffer fill until we indicate we're done</span>
                  <span class="ruby-comment"># negotiating.  Set by calling initdone from TelnetFilter</span>
      <span class="ruby-keyword">while</span> <span class="ruby-identifier">p</span> = <span class="ruby-ivar">@inbuffer</span>.<span class="ruby-identifier">index</span>(<span class="ruby-string">&quot;\n&quot;</span>)
        <span class="ruby-identifier">ln</span> = <span class="ruby-ivar">@inbuffer</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-identifier">p</span>).<span class="ruby-identifier">chop</span>
        <span class="ruby-identifier">publish</span>(<span class="ruby-identifier">ln</span>)
      <span class="ruby-keyword">end</span>
    <span class="ruby-keyword">end</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">EOFError</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNABORTED</span>
  <span class="ruby-ivar">@closing</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-identifier">publish</span>(<span class="ruby-value">:disconnected</span>)
  <span class="ruby-identifier">unsubscribe_all</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection '#{@host}(#{@addr})' disconnecting&quot;</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
  <span class="ruby-ivar">@closing</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-identifier">publish</span>(<span class="ruby-value">:disconnected</span>)
  <span class="ruby-identifier">unsubscribe_all</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#handle_input disconnecting&quot;</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- handle_input-source -->
          
        </div>

        

        
      </div><!-- handle_input-method -->

    
      <div id="method-i-handle_oob" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">handle_oob</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p><a href="Connection.html#method-i-handle_oob">#handle_oob</a> is called
when an out of band data event occurs for this session.</p>
          

          
          <div class="method-source-code" id="handle_oob-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 146</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">handle_oob</span>
  <span class="ruby-identifier">buf</span> = <span class="ruby-ivar">@sockio</span>.<span class="ruby-identifier">read_urgent</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection urgent data received - '#{buf[0]}'&quot;</span>
  <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">set</span>(<span class="ruby-value">:urgent</span>, <span class="ruby-keyword">true</span>)
  <span class="ruby-identifier">buf</span> = <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">filter_call</span>(<span class="ruby-value">:filter_in</span>,<span class="ruby-identifier">buf</span>)
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#handle_oob&quot;</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- handle_oob-source -->
          
        </div>

        

        
      </div><!-- handle_oob-method -->

    
      <div id="method-i-handle_output" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">handle_output</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p><a href="Connection.html#method-i-handle_output">#handle_output</a> is
called to order a connection to process any output waiting on its socket.</p>
          

          
          <div class="method-source-code" id="handle_output-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 108</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">handle_output</span>
  <span class="ruby-ivar">@outbuffer</span> = <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">filter_call</span>(<span class="ruby-value">:filter_out</span>,<span class="ruby-ivar">@outbuffer</span>)
  <span class="ruby-identifier">done</span> = <span class="ruby-ivar">@sockio</span>.<span class="ruby-identifier">write</span>(<span class="ruby-ivar">@outbuffer</span>)
  <span class="ruby-ivar">@outbuffer</span> = <span class="ruby-string">&quot;&quot;</span>
  <span class="ruby-keyword">if</span> <span class="ruby-identifier">done</span>
    <span class="ruby-ivar">@write_blocked</span> = <span class="ruby-keyword">false</span>
  <span class="ruby-keyword">else</span>
    <span class="ruby-ivar">@write_blocked</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">EOFError</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNABORTED</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">ECONNRESET</span>
  <span class="ruby-ivar">@closing</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-identifier">publish</span>(<span class="ruby-value">:disconnected</span>)
  <span class="ruby-identifier">unsubscribe_all</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection '#{@host}(#{@addr})' disconnecting&quot;</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
  <span class="ruby-ivar">@closing</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-identifier">publish</span>(<span class="ruby-value">:disconnected</span>)
  <span class="ruby-identifier">unsubscribe_all</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#handle_output disconnecting&quot;</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- handle_output-source -->
          
        </div>

        

        
      </div><!-- handle_output-method -->

    
      <div id="method-i-init" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">init</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p>init is called before using the connection.</p>
<dl class="rdoc-list label-list"><dt><code>returns</code>
<dd>
<p>true is connection is properly initialized</p>
</dd></dl>
          

          
          <div class="method-source-code" id="init-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 56</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">init</span>
  <span class="ruby-ivar">@host</span>, <span class="ruby-ivar">@addr</span> = <span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">peeraddr</span>.<span class="ruby-identifier">slice</span>(<span class="ruby-value">2</span><span class="ruby-operator">..</span><span class="ruby-value">3</span>)
  <span class="ruby-ivar">@connected</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">register</span>(<span class="ruby-keyword">self</span>)
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;(#{self.object_id}) New Connection on '#{@host}(#{@addr})'&quot;</span>
  <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">filter_call</span>(<span class="ruby-value">:init</span>,<span class="ruby-keyword">nil</span>)
  <span class="ruby-keyword">true</span>
<span class="ruby-keyword">rescue</span> <span class="ruby-constant">Exception</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#init&quot;</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
  <span class="ruby-keyword">false</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- init-source -->
          
        </div>

        

        
      </div><!-- init-method -->

    
      <div id="method-i-query" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">query</span><span
            class="method-args">(attrib)</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <dl class="rdoc-list label-list"><dt><code>attrib</code>
<dd><ul><li>
<p>A Symbol not handled here is assumed to be a query and</p>
</li></ul>
</dd></dl>

<pre>  its handling is delegated to the ProtocolStack, the result
  of which is a pair immediately sent back to as a message
  to the client.

&lt;pre&gt;
client -&gt; us
    :echo
us     -&gt; ProtocolStack
    query(:echo)
ProtocolStack -&gt; us
    [:echo, true]
us -&gt; client
    [:echo, true]
&lt;/pre&gt;</pre>
          

          
          <div class="method-source-code" id="query-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 216</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">query</span>(<span class="ruby-identifier">attrib</span>)
  <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">query</span>(<span class="ruby-identifier">attrib</span>)
<span class="ruby-keyword">end</span></pre>
          </div><!-- query-source -->
          
        </div>

        

        
      </div><!-- query-method -->

    
      <div id="method-i-sendmsg" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">sendmsg</span><span
            class="method-args">(msg)</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p>sendmsg places a message on the Connection’s output buffer.</p>
<dl class="rdoc-list label-list"><dt><code>msg</code>
<dd>
<p>The message, a reference to a buffer</p>
</dd></dl>
          

          
          <div class="method-source-code" id="sendmsg-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 237</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">sendmsg</span>(<span class="ruby-identifier">msg</span>)
  <span class="ruby-ivar">@outbuffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">msg</span>
  <span class="ruby-ivar">@write_blocked</span> = <span class="ruby-keyword">true</span>  <span class="ruby-comment"># change status to write_blocked</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- sendmsg-source -->
          
        </div>

        

        
      </div><!-- sendmsg-method -->

    
      <div id="method-i-set" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">set</span><span
            class="method-args">(attrib, val)</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <dl class="rdoc-list label-list"><dt>+attrib,val+
<dd><ul><li>
<p>An Array not handled here is assumed to be a set command and</p>
</li></ul>
</dd></dl>

<pre>  its handling is delegated to the ProtocolStack.

&lt;pre&gt;
client -&gt; us
    [:color, true]
us     -&gt; ProtocolStack
    set(:color, true)
&lt;/pre&gt;</pre>
          

          
          <div class="method-source-code" id="set-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 230</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">set</span>(<span class="ruby-identifier">attrib</span>, <span class="ruby-identifier">val</span>)
  <span class="ruby-ivar">@pstack</span>.<span class="ruby-identifier">set</span>(<span class="ruby-identifier">attrib</span>, <span class="ruby-identifier">val</span>)
<span class="ruby-keyword">end</span></pre>
          </div><!-- set-source -->
          
        </div>

        

        
      </div><!-- set-method -->

    
      <div id="method-i-set_initdone" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">set_initdone</span><span
            class="method-args">()</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p>This is called from <a href="TelnetFilter.html">TelnetFilter</a> when we
are done with negotiations. The event :initdone wakens observer to begin
user activity</p>
          

          
          <div class="method-source-code" id="set_initdone-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 158</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">set_initdone</span>
  <span class="ruby-ivar">@initdone</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-identifier">publish</span>(<span class="ruby-value">:initdone</span>)
<span class="ruby-keyword">end</span></pre>
          </div><!-- set_initdone-source -->
          
        </div>

        

        
      </div><!-- set_initdone-method -->

    
      <div id="method-i-update" class="method-detail ">
        
        <div class="method-heading">
          <span class="method-name">update</span><span
            class="method-args">(msg)</span>
          <span class="method-click-advice">click to toggle source</span>
        </div>
        

        <div class="method-description">
          
          <p>Update will be called when the object the connection is observing wants to
notify us of a change in state or new message. When a new connection is
accepted in acceptor that connection is passed to the observer of the
acceptor which allows the client to attach an observer to the connection
and make the connection an observer of that object.  We need to keep both
sides interest in each other limited to a narrow but flexible interface to
prevent tight coupling.</p>

<p>This supports the following:</p>
<dl class="rdoc-list label-list"><dt>:quit
<dd><ul><li>
<p>This symbol message from the client is a request to</p>

<pre>close the Connection.  It is handled here.</pre>
</li></ul>
</dd><dt><a href="String.html">String</a>
<dd><ul><li>
<p>A <a href="String.html">String</a> is assumed to be output and placed in
our @outbuffer.</p>
</li></ul>
</dd></dl>
          

          
          <div class="method-source-code" id="update-source">
            <pre><span class="ruby-comment"># File lib/network/connection.rb, line 178</span>
<span class="ruby-keyword">def</span> <span class="ruby-identifier">update</span>(<span class="ruby-identifier">msg</span>)
  <span class="ruby-keyword">case</span> <span class="ruby-identifier">msg</span>
  <span class="ruby-keyword">when</span> <span class="ruby-value">:quit</span>
    <span class="ruby-identifier">handle_output</span>
    <span class="ruby-ivar">@closing</span> = <span class="ruby-keyword">true</span>
  <span class="ruby-keyword">when</span> <span class="ruby-value">:reconnecting</span>
    <span class="ruby-identifier">unsubscribe_all</span>
    <span class="ruby-identifier">log</span>.<span class="ruby-identifier">info</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection '#{@host}(#{@addr})' closing for reconnection&quot;</span>
    <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">unregister</span>(<span class="ruby-keyword">self</span>)
<span class="ruby-comment">#    @sock.shutdown   # odd errors thrown with this</span>
    <span class="ruby-ivar">@sock</span>.<span class="ruby-identifier">close</span>
  <span class="ruby-keyword">when</span> <span class="ruby-constant">String</span>
    <span class="ruby-identifier">sendmsg</span>(<span class="ruby-identifier">msg</span>)
  <span class="ruby-keyword">else</span>
    <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">&quot;(#{self.object_id}) Connection#update - unknown message '#{@msg.inspect}'&quot;</span>
  <span class="ruby-keyword">end</span>
<span class="ruby-keyword">rescue</span>
  <span class="ruby-comment"># We squash and print out all exceptions here.  There is no reason to</span>
  <span class="ruby-comment"># throw these back at out subscribers.</span>
  <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-identifier">$!</span>
<span class="ruby-keyword">end</span></pre>
          </div><!-- update-source -->
          
        </div>

        

        
      </div><!-- update-method -->

    
    </section><!-- public-instance-method-details -->
  
  </section><!-- 5Buntitled-5D -->

</div><!-- documentation -->


<footer id="validator-badges">
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
  <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
</footer>