<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Class: ProtocolStack</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" /> <script type="text/javascript"> // <![CDATA[ function popupCode( url ) { window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400") } function toggleCode( id ) { if ( document.getElementById ) elem = document.getElementById( id ); else if ( document.all ) elem = eval( "document.all." + id ); else return false; elemStyle = elem.style; if ( elemStyle.display != "block" ) { elemStyle.display = "block" } else { elemStyle.display = "none" } return true; } // Make codeblocks hidden by default document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" ) // ]]> </script> </head> <body> <div id="classHeader"> <table class="header-table"> <tr class="top-aligned-row"> <td><strong>Class</strong></td> <td class="class-name-in-header">ProtocolStack</td> </tr> <tr class="top-aligned-row"> <td><strong>In:</strong></td> <td> <a href="../files/lib/network/protocol/protocolstack_rb.html"> lib/network/protocol/protocolstack.rb </a> <br /> </td> </tr> <tr class="top-aligned-row"> <td><strong>Parent:</strong></td> <td> Object </td> </tr> </table> </div> <!-- banner header --> <div id="bodyContent"> <div id="contextContent"> <div id="diagram"> <map id="map" name="map"> <area shape="rect" coords="5,5,109,53" href="ProtocolStack.html" alt="ProtocolStack " /> </map> <img src="../dot/f_34.png" usemap="#map" border="0" alt="dot/f_34.png"> </div> <div id="description"> <p> The <a href="ProtocolStack.html">ProtocolStack</a> class implements a stack of input and output filters. It also maintains some interesting state variables that are shared amongst filters. </p> <table> <tr><td valign="top">Remarks:</td><td>This should have its own configuration file. </td></tr> </table> </div> </div> <div id="method-list"> <h3 class="section-bar">Methods</h3> <div class="name-list"> <a href="#M000238">filter_call</a> <a href="#M000237">new</a> <a href="#M000239">query</a> <a href="#M000240">set</a> </div> </div> </div> <!-- if includes --> <div id="section"> <div id="attribute-list"> <h3 class="section-bar">Attributes</h3> <div class="name-list"> <table> <tr class="top-aligned-row context-row"> <td class="context-item-name">binary_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">color_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">conn</td> <td class="context-item-value"> [R] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">echo_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">eorec_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">hide_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">terminal</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">theight</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">twidth</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">urgent_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> <tr class="top-aligned-row context-row"> <td class="context-item-name">zmp_on</td> <td class="context-item-value"> [RW] </td> <td class="context-item-desc"></td> </tr> </table> </div> </div> <!-- if method_list --> <div id="methods"> <h3 class="section-bar">Public Class methods</h3> <div id="method-M000237" class="method-detail"> <a name="M000237"></a> <div class="method-heading"> <a href="#M000237" class="method-signature"> <span class="method-name">new</span><span class="method-args">(conn)</span> </a> </div> <div class="method-description"> <p> Construct a <a href="ProtocolStack.html">ProtocolStack</a> </p> <dl> <dt><tt>conn</tt></dt><dd>The connection associated with this filter </dd> </dl> <p><a class="source-toggle" href="#" onclick="toggleCode('M000237-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000237-source"> <pre> <span class="ruby-comment cmt"># File lib/network/protocol/protocolstack.rb, line 38</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">conn</span>) <span class="ruby-ivar">@conn</span> = <span class="ruby-identifier">conn</span> <span class="ruby-ivar">@server</span> = <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">server</span> <span class="ruby-ivar">@filters</span> = [] <span class="ruby-comment cmt"># Filter order is critical as lowest level protocol is first.</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:debugfilter</span> <span class="ruby-ivar">@filters</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">DebugFilter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:telnetfilter</span> <span class="ruby-ivar">@filters</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">TelnetFilter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>,<span class="ruby-ivar">@server</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:terminalfilter</span> <span class="ruby-ivar">@filters</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">TerminalFilter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:colorfilter</span> <span class="ruby-ivar">@filters</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">ColorFilter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:filter</span> <span class="ruby-ivar">@filters</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">Filter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-keyword kw">self</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-comment cmt"># Shared variables to facilitate inter-filter communication.</span> <span class="ruby-ivar">@sga_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@echo_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@binary_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@zmp_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@eorec_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@color_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@urgent_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@hide_on</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-ivar">@terminal</span> = <span class="ruby-keyword kw">nil</span> <span class="ruby-ivar">@twidth</span> = <span class="ruby-value">80</span> <span class="ruby-ivar">@theight</span> = <span class="ruby-value">23</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <h3 class="section-bar">Public Instance methods</h3> <div id="method-M000238" class="method-detail"> <a name="M000238"></a> <div class="method-heading"> <a href="#M000238" class="method-signature"> <span class="method-name">filter_call</span><span class="method-args">(method, args)</span> </a> </div> <div class="method-description"> <p> A method is called on each filter in the stack in order. </p> <p> [<tt>method</tt>] [<tt>args</tt>] </p> <p><a class="source-toggle" href="#" onclick="toggleCode('M000238-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000238-source"> <pre> <span class="ruby-comment cmt"># File lib/network/protocol/protocolstack.rb, line 76</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">filter_call</span>(<span class="ruby-identifier">method</span>, <span class="ruby-identifier">args</span>) <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">method</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:filter_in</span>, <span class="ruby-identifier">:init</span> <span class="ruby-identifier">retval</span> = <span class="ruby-identifier">args</span> <span class="ruby-ivar">@filters</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">retval</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">method</span>,<span class="ruby-identifier">retval</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:filter_out</span> <span class="ruby-identifier">retval</span> = <span class="ruby-identifier">args</span> <span class="ruby-ivar">@filters</span>.<span class="ruby-identifier">reverse_each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">retval</span> = <span class="ruby-identifier">v</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">method</span>,<span class="ruby-identifier">retval</span>) <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">"(#{self.object_id}) ProtocolStack#filter_call unknown method '#{method}',a:#{args.inspect},r:#{retval.inspect}"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">retval</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000239" class="method-detail"> <a name="M000239"></a> <div class="method-heading"> <a href="#M000239" class="method-signature"> <span class="method-name">query</span><span class="method-args">(attr)</span> </a> </div> <div class="method-description"> <p> The filter_query method returns state information for the filter. </p> <dl> <dt><tt>attr</tt></dt><dd>A symbol representing the attribute being queried. </dd> <dt><tt>return</tt></dt><dd>An attr/value pair or false if not defined in this filter </dd> </dl> <p><a class="source-toggle" href="#" onclick="toggleCode('M000239-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000239-source"> <pre> <span class="ruby-comment cmt"># File lib/network/protocol/protocolstack.rb, line 97</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query</span>(<span class="ruby-identifier">attr</span>) <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">attr</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:terminal</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@terminal</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:termsize</span> <span class="ruby-identifier">retval</span> = [<span class="ruby-ivar">@twidth</span>, <span class="ruby-ivar">@theight</span>] <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:color</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@color_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:zmp</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@zmp_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:echo</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@echo_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:binary</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@binary_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:eorec</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@eorec_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:urgent</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@urgent_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:hide</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@hide_on</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:ip</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">addr</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:host</span> <span class="ruby-identifier">retval</span> = <span class="ruby-ivar">@conn</span>.<span class="ruby-identifier">host</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">"(#{self.object_id}) ProtocolStack#query unknown setting '#{pair.inspect}'"</span> <span class="ruby-identifier">retval</span> = <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span> <span class="ruby-node">"(#{self.object_id}) ProtocolStack#query called '#{attr}',r:#{retval.inspect}"</span> <span class="ruby-identifier">retval</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> <div id="method-M000240" class="method-detail"> <a name="M000240"></a> <div class="method-heading"> <a href="#M000240" class="method-signature"> <span class="method-name">set</span><span class="method-args">(attr, value)</span> </a> </div> <div class="method-description"> <p> The filter_set method sets state information on the filter. </p> <dl> <dt><tt>pair</tt></dt><dd>An attr/value pair [:symbol, value] </dd> <dt><tt>return</tt></dt><dd>true if attr not defined in this filter, false if not </dd> </dl> <p><a class="source-toggle" href="#" onclick="toggleCode('M000240-source');return false;">[Source]</a></p> <div class="method-source-code" id="M000240-source"> <pre> <span class="ruby-comment cmt"># File lib/network/protocol/protocolstack.rb, line 132</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">set</span>(<span class="ruby-identifier">attr</span>, <span class="ruby-identifier">value</span>) <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">attr</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:color</span> <span class="ruby-ivar">@color_on</span> = <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:urgent</span> <span class="ruby-ivar">@urgent_on</span> = <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:hide</span> <span class="ruby-ivar">@hide_on</span> = <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:terminal</span> <span class="ruby-ivar">@terminal</span> = <span class="ruby-identifier">value</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:termsize</span> <span class="ruby-ivar">@twidth</span> = <span class="ruby-identifier">value</span>[<span class="ruby-value">0</span>] <span class="ruby-ivar">@theight</span> = <span class="ruby-identifier">value</span>[<span class="ruby-value">1</span>] <span class="ruby-comment cmt"># telnet filter always first except when debugfilter on</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:telnetfilter</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:debugfilter</span> <span class="ruby-ivar">@filters</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">send_naws</span> <span class="ruby-keyword kw">else</span> <span class="ruby-ivar">@filters</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">send_naws</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">:init_subneg</span> <span class="ruby-comment cmt"># telnet filter always first except when debugfilter on</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:telnetfilter</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@server</span>.<span class="ruby-identifier">service_filters</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">:debugfilter</span> <span class="ruby-ivar">@filters</span>[<span class="ruby-value">1</span>].<span class="ruby-identifier">init_subneg</span> <span class="ruby-keyword kw">else</span> <span class="ruby-ivar">@filters</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">init_subneg</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">end</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">error</span> <span class="ruby-node">"(#{self.object_id}) ProtocolStack#set unknown setting '#{attr}=#{value}'"</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">log</span>.<span class="ruby-identifier">debug</span> <span class="ruby-node">"(#{self.object_id}) ProtocolStack#set called '#{attr}=#{value}'"</span> <span class="ruby-keyword kw">end</span> </pre> </div> </div> </div> </div> </div> <div id="validator-badges"> <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> </div> </body> </html>