Sophie

Sophie

distrib > Fedora > 14 > x86_64 > media > updates > by-pkgid > 727fa15453fcace956b835e2377d4269 > files > 184

player-doc-3.0.2-5.fc14.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html>
<!-- $Id: header.html 8799 2010-06-28 04:12:42Z jpgr87 $ -->

<HEAD>


<meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=utf-8">
<meta name="keywords" content="stage, robot, simulation, player, player/stage">
<link href="doxygen.css" rel="stylesheet" type="text/css">

<style type="text/css">

.floatright { float: right; margin: 0 0 1em 1em; }

body {
  font-family: sans-serif;
  #font-family: Geneva, Verdana, Helvetica, Arial, sans-serif;
  background-color: #FFF;
  color:#000;
}


a:link { 
	color: #A00;
}

a:visited { 
	color: #800;
}

a { text-decoration: none; }
a:hover { text-decoration: underline; }


.timestamp { text-align:right; background-color: #DDD; font-size:75%;}

h1 { 
  font-size:160%; 
}

h2 {
  font-size:110%;
  #color: #FFF;
  #background-color: #666;
  #padding:3px;
}

h3 { text-align:left; }

img {
  border: 0;
}

ul.menu { 
    position:relative;
    left:-2.5em;
    margin-bottom:0px;
    margin-top:0px;
}

ul.menu1 { 
    position:relative;
    left:-2.1em;
    margin-bottom:0px;
    margin-top:0px;
}

li.menu { 
    list-style-type: none;
    position:relative;
    #left:-0.5em;
}


#sidebar { position: absolute; left:0px; padding:2em; top:0em; width:12em;}

#content { position: absolute; left:12em; top:0em; padding-left:3em; padding-right:3em; padding-bottom:2em; margin-top:1em; margin-right:2em; }

div.box { background-color:#EEE; border: 1px solid #000; padding: 0.5ex 0.4em 0.5ex 0.6em; margin:1em;  }
div.title { font-weight:bold; background-color:#eee; margin-bottom:2px;}

div.topbar { position: absolute; top:0px; left:9em; margin:1em; }

</style>

<TITLE>Player Manual</TITLE>

</HEAD>

<body>

<div id="sidebar"> 

<h2 style="text-align:center;">
<a href="index.html">
<img width=140 src="http://playerstage.sourceforge.net/images/player_button_v3.png" alt="Player logo"><br></a>
</h2>



<div class="box">
<div class=title>Player</div>

<ul class=menu>
<li class=menu><a href="index.html">Frontpage</a>
<li class=menu><a href="modules.html">Contents</a>
</ul>
</div>

<div class="box">
<div class=title>User</div>

<ul class=menu>
<li class=menu><a href="install.html">Installation</a>
<li class=menu><a href="start.html">Quick start</a>
<li class=menu><a href="supported_hardware.html">Supported&nbsp;devices</a>
<li class=menu><a href="group__tutorials.html">Tutorials</a>
<li class=menu><a href="group__utils.html">Utilities</a>
<li class=menu><a href="group__clientlibs.html">Client&nbsp;libraries</a>
<li class=menu><a href="http://playerstage.sourceforge.net/wiki/Basic_FAQ">FAQ</a>
<li class=menu><a href="help.html">Help</a>

</ul>
</div>

<div class=box>
<div class="title">Developer</div>
<ul class=menu>
<li class=menu><a href="architecture.html">Architecture</a>
<li class=menu><a href="group__libplayercore.html">libplayercore</a>
<ul class=menu1>
<li class=menu><a href="group__interfaces.html">interfaces</a></li>
</ul>
<li class=menu><a href="group__libplayerdrivers.html">libplayerdrivers</a>
<ul class=menu1>
<li class=menu><a href="group__drivers.html">drivers</a></li>
</ul>
<li class=menu><a href="group__libplayercommon.html">libplayercommon</a>
<li class=menu><a href="group__libplayerutils.html">libplayerutils</a>
<li class=menu><a href="group__libplayersd.html">libplayersd</a>
<li class=menu><a href="group__libplayertcp.html">libplayertcp</a>
<li class=menu><a href="group__libplayerxdr.html">libplayerxdr</a>
<li class=menu><a href="todo.html">TODO</a>
</ul>
</div>

<div class=box>
<!-- <a href="http://sourceforge.net"><img border=0 src="http://sourceforge.net/sflogo.php?group_id=42445&type=1"></a> -->
<div class="title">Online</div>
<a href="http://playerstage.sourceforge.net">Homepage</a><br>
<a href="http://sourceforge.net/project/showfiles.php?group_id=42445">Download</a><br>
<a href="http://sourceforge.net/projects/playerstage">Project</a><br>
<a href="http://sourceforge.net/tracker/?group_id=42445">Bugs</a><br>
<a href="http://sourceforge.net/mail/?group_id=42445">Help</a>
</div>


</div>

<div id="content" >
<!-- Generated by Doxygen 1.7.1 -->
<div class="header">
  <div class="summary">
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a>  </div>
  <div class="headertitle">
<h1>MessageQueue Class Reference</h1>  </div>
</div>
<div class="contents">
<!-- doxytag: class="MessageQueue" -->
<p>A doubly-linked queue of messages.  
<a href="#_details">More...</a></p>

<p><code>#include &lt;<a class="el" href="message_8h_source.html">message.h</a>&gt;</code></p>

<p><a href="classMessageQueue-members.html">List of all members.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad435770e922427df2e28ce27e72c5d52"></a><!-- doxytag: member="MessageQueue::MessageQueue" ref="ad435770e922427df2e28ce27e72c5d52" args="(bool _Replace, size_t _Maxlen)" -->
&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ad435770e922427df2e28ce27e72c5d52">MessageQueue</a> (bool _Replace, size_t _Maxlen)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Create an empty message queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a3640a8a6140801f1e127a41e60c014dd"></a><!-- doxytag: member="MessageQueue::~MessageQueue" ref="a3640a8a6140801f1e127a41e60c014dd" args="()" -->
&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a3640a8a6140801f1e127a41e60c014dd">~MessageQueue</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Destroy a message queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8746df2213e0bb5e8c86cc5fb99717c2"></a><!-- doxytag: member="MessageQueue::Empty" ref="a8746df2213e0bb5e8c86cc5fb99717c2" args="()" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a8746df2213e0bb5e8c86cc5fb99717c2">Empty</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check whether a queue is empty. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#aa822b249c98b420752ae8fd20c62e8a9">Push</a> (<a class="el" href="classMessage.html">Message</a> &amp;msg)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Push a message onto the queue.  <a href="#aa822b249c98b420752ae8fd20c62e8a9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#af3e84d3fce4e2fe9ca38e16015b4b916">PushFront</a> (<a class="el" href="classMessage.html">Message</a> &amp;msg, bool haveLock)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Put it at the front of the queue, without checking replacement rules or size limits.  <a href="#af3e84d3fce4e2fe9ca38e16015b4b916"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a1e8ef9e59b8976a93c99080a8fddf4a7">PushBack</a> (<a class="el" href="classMessage.html">Message</a> &amp;msg, bool haveLock)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Push a message at the back of the queue, without checking replacement rules or size limits.  <a href="#a1e8ef9e59b8976a93c99080a8fddf4a7"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classMessage.html">Message</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a4a35916cdeaec3db74d9f9aa4e8284e4">Pop</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Pop a message off the queue.  <a href="#a4a35916cdeaec3db74d9f9aa4e8284e4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a785d982d955cbe025ecc68d3b1348aa8">SetReplace</a> (bool _Replace)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the <code>Replace</code> flag, which governs whether data and command messages of the same subtype from the same device are replaced in the queue.  <a href="#a785d982d955cbe025ecc68d3b1348aa8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ae667f444b1e0f52732959db854b031b0">AddReplaceRule</a> (int _host, int _robot, int _interf, int _index, int _type, int _subtype, int _replace)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a replacement rule to the list.  <a href="#ae667f444b1e0f52732959db854b031b0"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a406b7f38e6d0b5a3e90e9645577317c9">AddReplaceRule</a> (const <a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> &amp;device, int _type, int _subtype, int _replace)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a replacement rule to the list.  <a href="#a406b7f38e6d0b5a3e90e9645577317c9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#aeed98bb303df8f1e6c03762c45d51556">CheckReplace</a> (<a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *hdr)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check whether a message with the given header should replace any existing message of the same signature, be ignored or accepted.  <a href="#aeed98bb303df8f1e6c03762c45d51556"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a48a9363776ffb400aba779ea55a84c94">Wait</a> (double TimeOut=0.0)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Wait on this queue.  <a href="#a48a9363776ffb400aba779ea55a84c94"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ae63b393753350241fc7aef35ca3a9c63">DataAvailable</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Signal that new data is available.  <a href="#ae63b393753350241fc7aef35ca3a9c63"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a457f02d540b39a4fa1edcf351acbea18"></a><!-- doxytag: member="MessageQueue::Filter" ref="a457f02d540b39a4fa1edcf351acbea18" args="(Message &amp;msg)" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a457f02d540b39a4fa1edcf351acbea18">Filter</a> (<a class="el" href="classMessage.html">Message</a> &amp;msg)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Check whether a message passes the current filter. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a12549bcfc89a87bf1259c4c96b7d635e"></a><!-- doxytag: member="MessageQueue::ClearFilter" ref="a12549bcfc89a87bf1259c4c96b7d635e" args="(void)" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a12549bcfc89a87bf1259c4c96b7d635e">ClearFilter</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Clear (i.e., turn off) message filter. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a01513b2cbe603b0c435d7b525a9e170f"></a><!-- doxytag: member="MessageQueue::SetFilter" ref="a01513b2cbe603b0c435d7b525a9e170f" args="(int host, int robot, int interf, int index, int type, int subtype)" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a01513b2cbe603b0c435d7b525a9e170f">SetFilter</a> (int host, int robot, int interf, int index, int type, int subtype)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set filter values. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ac481e113aae4391d8d74e25e241269b0"></a><!-- doxytag: member="MessageQueue::SetPull" ref="ac481e113aae4391d8d74e25e241269b0" args="(bool _pull)" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ac481e113aae4391d8d74e25e241269b0">SetPull</a> (bool _pull)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the <code>pull</code> flag. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a11f5a1c526ad75f2cf097011a1c8471b"></a><!-- doxytag: member="MessageQueue::GetLength" ref="a11f5a1c526ad75f2cf097011a1c8471b" args="(void)" -->
size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a11f5a1c526ad75f2cf097011a1c8471b">GetLength</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Get current length of queue, in elements. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7346327fc893aa7c590b9886294f6570"></a><!-- doxytag: member="MessageQueue::SetDataRequested" ref="a7346327fc893aa7c590b9886294f6570" args="(bool d, bool haveLock)" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a7346327fc893aa7c590b9886294f6570">SetDataRequested</a> (bool d, bool haveLock)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set the data_requested flag. <br/></td></tr>
<tr><td colspan="2"><h2><a name="pri-methods"></a>
Private Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a93197b9bd74d7e9fa5e71939eceb62e8"></a><!-- doxytag: member="MessageQueue::Lock" ref="a93197b9bd74d7e9fa5e71939eceb62e8" args="()" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a93197b9bd74d7e9fa5e71939eceb62e8">Lock</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Lock the mutex associated with this queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a90ef77759dd90d9811dbbdcf73778b98"></a><!-- doxytag: member="MessageQueue::Unlock" ref="a90ef77759dd90d9811dbbdcf73778b98" args="()" -->
void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a90ef77759dd90d9811dbbdcf73778b98">Unlock</a> ()</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Unlock the mutex associated with this queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ae51d84aa9141368e565f2b482b86b96d">Remove</a> (<a class="el" href="classMessageQueueElement.html">MessageQueueElement</a> *el)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Remove element <code>el</code> from the queue, and rearrange pointers appropriately.  <a href="#ae51d84aa9141368e565f2b482b86b96d"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pri-attribs"></a>
Private Attributes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2ec72e814490a8974c9f6d21eb5b7663"></a><!-- doxytag: member="MessageQueue::head" ref="a2ec72e814490a8974c9f6d21eb5b7663" args="" -->
<a class="el" href="classMessageQueueElement.html">MessageQueueElement</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a2ec72e814490a8974c9f6d21eb5b7663">head</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Head of the queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a5a7e0e994a2457ee73b7283efa54583c"></a><!-- doxytag: member="MessageQueue::tail" ref="a5a7e0e994a2457ee73b7283efa54583c" args="" -->
<a class="el" href="classMessageQueueElement.html">MessageQueueElement</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a5a7e0e994a2457ee73b7283efa54583c">tail</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Tail of the queue. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a85231d6ff82ddbda5ff09ff3a5ce162f"></a><!-- doxytag: member="MessageQueue::lock" ref="a85231d6ff82ddbda5ff09ff3a5ce162f" args="" -->
pthread_mutex_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a85231d6ff82ddbda5ff09ff3a5ce162f">lock</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mutex to control access to the queue, via <a class="el" href="classMessageQueue.html#a93197b9bd74d7e9fa5e71939eceb62e8" title="Lock the mutex associated with this queue.">Lock()</a> and <a class="el" href="classMessageQueue.html#a90ef77759dd90d9811dbbdcf73778b98" title="Unlock the mutex associated with this queue.">Unlock()</a>. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2389db3ab46ceb5c4e718ae35271904a"></a><!-- doxytag: member="MessageQueue::Maxlen" ref="a2389db3ab46ceb5c4e718ae35271904a" args="" -->
size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a2389db3ab46ceb5c4e718ae35271904a">Maxlen</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Maximum length of queue in elements. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6b4e1ca9827f50ff13c80aed3011631c"></a><!-- doxytag: member="MessageQueue::replaceRules" ref="a6b4e1ca9827f50ff13c80aed3011631c" args="" -->
<a class="el" href="classMessageReplaceRule.html">MessageReplaceRule</a> *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a6b4e1ca9827f50ff13c80aed3011631c">replaceRules</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Singly-linked list of replacement rules. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad69ab7d8969fc437d7cfa40be01b8fc2"></a><!-- doxytag: member="MessageQueue::Replace" ref="ad69ab7d8969fc437d7cfa40be01b8fc2" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ad69ab7d8969fc437d7cfa40be01b8fc2">Replace</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">When a (data or command) message doesn't match a rule in replaceRules, should we replace it? <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="af1b304b73cebe7980479a3a1cd85f2ea"></a><!-- doxytag: member="MessageQueue::Length" ref="af1b304b73cebe7980479a3a1cd85f2ea" args="" -->
size_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#af1b304b73cebe7980479a3a1cd85f2ea">Length</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Current length of queue, in elements. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">pthread_cond_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a926c7aa691bfa676fc95c7bac068db1c">cond</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A condition variable that can be used to signal, via <a class="el" href="classMessageQueue.html#ae63b393753350241fc7aef35ca3a9c63" title="Signal that new data is available.">DataAvailable()</a>, other threads that are <a class="el" href="classMessageQueue.html#a48a9363776ffb400aba779ea55a84c94" title="Wait on this queue.">Wait()</a>ing on this queue.  <a href="#a926c7aa691bfa676fc95c7bac068db1c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="adbdac9cbde00e9c91233177a9f24e10b"></a><!-- doxytag: member="MessageQueue::condMutex" ref="adbdac9cbde00e9c91233177a9f24e10b" args="" -->
pthread_mutex_t&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#adbdac9cbde00e9c91233177a9f24e10b">condMutex</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mutex to go with condition variable cond. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="ad0ed11d0d4a5f7392be539058e352f7d"></a><!-- doxytag: member="MessageQueue::filter_on" ref="ad0ed11d0d4a5f7392be539058e352f7d" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#ad0ed11d0d4a5f7392be539058e352f7d">filter_on</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Current filter values. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a1ff7767205a5ad67a8327e91cfe354a7"></a><!-- doxytag: member="MessageQueue::filter_host" ref="a1ff7767205a5ad67a8327e91cfe354a7" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_host</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a7adca58ec8504eacb7f5e9c6732db7ad"></a><!-- doxytag: member="MessageQueue::filter_robot" ref="a7adca58ec8504eacb7f5e9c6732db7ad" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_robot</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa8675f5105f9977ade6960e324654ee9"></a><!-- doxytag: member="MessageQueue::filter_interf" ref="aa8675f5105f9977ade6960e324654ee9" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_interf</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a8da42c5af7df4623c55ba24d0693ffa7"></a><!-- doxytag: member="MessageQueue::filter_index" ref="a8da42c5af7df4623c55ba24d0693ffa7" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_index</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a71f8563e0b8fcfa05843dc7d75636d51"></a><!-- doxytag: member="MessageQueue::filter_type" ref="a71f8563e0b8fcfa05843dc7d75636d51" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_type</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="aa14508d21966441c1e1bc64dae151357"></a><!-- doxytag: member="MessageQueue::filter_subtype" ref="aa14508d21966441c1e1bc64dae151357" args="" -->
int&nbsp;</td><td class="memItemRight" valign="bottom"><b>filter_subtype</b></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a17bdbcec1c31748e1fa1b77e9a2ac576">pull</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Flag for if in pull mode.  <a href="#a17bdbcec1c31748e1fa1b77e9a2ac576"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="acfa7b736cfe1791f6f618a178ed211bb"></a><!-- doxytag: member="MessageQueue::data_requested" ref="acfa7b736cfe1791f6f618a178ed211bb" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#acfa7b736cfe1791f6f618a178ed211bb">data_requested</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Flag for data was requested (in PULL mode), but none has yet been delivered. <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a2262d819a55d5a20c3e2e7dcff31b7e0"></a><!-- doxytag: member="MessageQueue::data_delivered" ref="a2262d819a55d5a20c3e2e7dcff31b7e0" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a2262d819a55d5a20c3e2e7dcff31b7e0">data_delivered</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Flag that data was sent (in PULL mode). <br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="anchor" id="a6f01c62f001b1cb8a2980a783317f74f"></a><!-- doxytag: member="MessageQueue::drop_count" ref="a6f01c62f001b1cb8a2980a783317f74f" args="" -->
bool&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="classMessageQueue.html#a6f01c62f001b1cb8a2980a783317f74f">drop_count</a></td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Count of the number of messages discarded due to queue overflow. <br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>A doubly-linked queue of messages. </p>
<p>Player <a class="el" href="classMessage.html" title="Reference-counted message objects.">Message</a> objects are delivered by being pushed on and popped off queues of this type. Importantly, every driver has one, <a class="el" href="classDriver.html#a125eab00b72ad55885162aef7024e09b" title="Queue for all incoming messages for this driver.">Driver::InQueue</a>. All messages sent to the driver arrive on this queue. However, the driver rarely pops messages off its queue directly; instead the driver calls <a class="el" href="classDriver.html#a24f15e0e5b8931805f734862f5bc8a7d" title="Process pending messages.">Driver::ProcessMessages</a>, which hands off each incoming message to <a class="el" href="classDriver.html#ab05d0e8502a494a83d0442a48095a35c" title="Message handler.">Driver::ProcessMessage</a> (which the driver has presumably re-implemented).</p>
<p>Every queue has a maximum length that is determined when it is created; for drivers this happens in the constructor <a class="el" href="classDriver.html#ad232705313cf9168f763b1d70ee60235" title="Constructor for single-interface drivers.">Driver::Driver</a>. This length determines the maximum number of messages that can be pushed onto the queue. Since messages vary greatly in size, there is not a direct correspondence between the length of a queue and the memory that it occupies. Furthermore, since messages are reference counted and may be shared across multiple queues, it is not necessarily meaningful to consider how much memory a given queue "occupies."</p>
<p>The queue supports configurable message replacement. This functionality is useful when, for example, a driver wants new incoming commands to overwrite old ones, rather than to have them queue up. To decide whether an incoming message should replace an existing message that has the same address (host:robot:interface:index), type, and subtype, the following logic is applied:</p>
<ul>
<li>If a matching replacement rule was set via <a class="el" href="classMessageQueue.html#ae667f444b1e0f52732959db854b031b0" title="Add a replacement rule to the list.">AddReplaceRule()</a>, that rule is followed.</li>
<li>Else:<ul>
<li>If the message type is PLAYER_MSGTYPE_REQ, PLAYER_MSGTYPE_RESP_ACK, or PLAYER_MSGTYPE_RESP_NACK, the message is not replaced.</li>
<li>Else:<ul>
<li>If <a class="el" href="classMessageQueue.html#ad69ab7d8969fc437d7cfa40be01b8fc2" title="When a (data or command) message doesn&#39;t match a rule in replaceRules, should we replace it...">MessageQueue::Replace</a> is false (it is set in the constructor and can be changed via <a class="el" href="classMessageQueue.html#a785d982d955cbe025ecc68d3b1348aa8" title="Set the Replace flag, which governs whether data and command messages of the same subtype from the sa...">SetReplace()</a>), the message is not replaced.</li>
<li>Else:<ul>
<li>The message is replaced.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Most drivers can simply choose true or false in their constructors (this setting is passed on to the <a class="el" href="classMessageQueue.html" title="A doubly-linked queue of messages.">MessageQueue</a> constructor). However, drivers that support multiple interfaces may use <a class="el" href="classMessageQueue.html#ae667f444b1e0f52732959db854b031b0" title="Add a replacement rule to the list.">AddReplaceRule()</a> to establish different replacement rules for messages that arrive for different interfaces. For example, the <a class="el" href="group__driver__p2os.html">p2os</a> driver has incoming commands to the wheelmotors overwrite each other, but queues up commands to the manipulator arm.</p>
<p>The queue also supports filtering based on device address. After <a class="el" href="classMessageQueue.html#a01513b2cbe603b0c435d7b525a9e170f" title="Set filter values.">SetFilter()</a> is called, <a class="el" href="classMessageQueue.html#a4a35916cdeaec3db74d9f9aa4e8284e4" title="Pop a message off the queue.">Pop()</a> will only return messages that match the given filter. Use <a class="el" href="classMessageQueue.html#a12549bcfc89a87bf1259c4c96b7d635e" title="Clear (i.e., turn off) message filter.">ClearFilter()</a> to return to normal operation. This filter is not usually manipulated directly in driver code; it's main use inside <a class="el" href="classDevice.html#aeafd1418afc82da4603310b6e35ff3dc" title="Make a request of another device.">Device::Request</a>. </p>
<hr/><h2>Member Function Documentation</h2>
<a class="anchor" id="ae667f444b1e0f52732959db854b031b0"></a><!-- doxytag: member="MessageQueue::AddReplaceRule" ref="ae667f444b1e0f52732959db854b031b0" args="(int _host, int _robot, int _interf, int _index, int _type, int _subtype, int _replace)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::AddReplaceRule </td>
          <td>(</td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_host</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_robot</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_interf</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_index</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_subtype</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_replace</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Add a replacement rule to the list. </p>
<p>The first 6 arguments determine the signature that a message will have to match in order for this rule to be applied. If an incoming message matches this signature, the last argument determines whether replacement will occur. Set any of the first 6 arguments to -1 to indicate don't care. </p>

</div>
</div>
<a class="anchor" id="a406b7f38e6d0b5a3e90e9645577317c9"></a><!-- doxytag: member="MessageQueue::AddReplaceRule" ref="a406b7f38e6d0b5a3e90e9645577317c9" args="(const player_devaddr_t &amp;device, int _type, int _subtype, int _replace)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::AddReplaceRule </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structplayer__devaddr.html">player_devaddr_t</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>device</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_subtype</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>_replace</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Add a replacement rule to the list. </p>
<p>Use this version if you already have the device address assembled in a player_devaddr_t structure. The tradeoff is that you cannot use -1 to indicate don't care for those values (the fields in that structure are unsigned). </p>

</div>
</div>
<a class="anchor" id="aeed98bb303df8f1e6c03762c45d51556"></a><!-- doxytag: member="MessageQueue::CheckReplace" ref="aeed98bb303df8f1e6c03762c45d51556" args="(player_msghdr_t *hdr)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int MessageQueue::CheckReplace </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structplayer__msghdr.html">player_msghdr_t</a> *&nbsp;</td>
          <td class="paramname"> <em>hdr</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Check whether a message with the given header should replace any existing message of the same signature, be ignored or accepted. </p>

</div>
</div>
<a class="anchor" id="ae63b393753350241fc7aef35ca3a9c63"></a><!-- doxytag: member="MessageQueue::DataAvailable" ref="ae63b393753350241fc7aef35ca3a9c63" args="(void)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::DataAvailable </td>
          <td>(</td>
          <td class="paramtype">void&nbsp;</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Signal that new data is available. </p>
<p>Calling this method will release any threads currently waiting on this queue. </p>

</div>
</div>
<a class="anchor" id="a4a35916cdeaec3db74d9f9aa4e8284e4"></a><!-- doxytag: member="MessageQueue::Pop" ref="a4a35916cdeaec3db74d9f9aa4e8284e4" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classMessage.html">Message</a>* MessageQueue::Pop </td>
          <td>(</td>
          <td class="paramname"></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Pop a message off the queue. </p>
<p>Pop the head (i.e., the first-inserted) message from the queue. Returns pointer to said message, or NULL if the queue is empty </p>

</div>
</div>
<a class="anchor" id="aa822b249c98b420752ae8fd20c62e8a9"></a><!-- doxytag: member="MessageQueue::Push" ref="aa822b249c98b420752ae8fd20c62e8a9" args="(Message &amp;msg)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool MessageQueue::Push </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classMessage.html">Message</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>msg</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Push a message onto the queue. </p>
<p>Returns the success state of the Push operation (true if successful, false otherwise). </p>

</div>
</div>
<a class="anchor" id="a1e8ef9e59b8976a93c99080a8fddf4a7"></a><!-- doxytag: member="MessageQueue::PushBack" ref="a1e8ef9e59b8976a93c99080a8fddf4a7" args="(Message &amp;msg, bool haveLock)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::PushBack </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classMessage.html">Message</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>msg</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>haveLock</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Push a message at the back of the queue, without checking replacement rules or size limits. </p>
<p>This method is used internally to insert most messages. The caller may have already called <a class="el" href="classMessageQueue.html#a93197b9bd74d7e9fa5e71939eceb62e8" title="Lock the mutex associated with this queue.">Lock()</a> on this queue </p>

</div>
</div>
<a class="anchor" id="af3e84d3fce4e2fe9ca38e16015b4b916"></a><!-- doxytag: member="MessageQueue::PushFront" ref="af3e84d3fce4e2fe9ca38e16015b4b916" args="(Message &amp;msg, bool haveLock)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::PushFront </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classMessage.html">Message</a> &amp;&nbsp;</td>
          <td class="paramname"> <em>msg</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>haveLock</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Put it at the front of the queue, without checking replacement rules or size limits. </p>
<p>This method is used to insert responses to requests for data. The caller may have already called <a class="el" href="classMessageQueue.html#a93197b9bd74d7e9fa5e71939eceb62e8" title="Lock the mutex associated with this queue.">Lock()</a> on this queue </p>

</div>
</div>
<a class="anchor" id="ae51d84aa9141368e565f2b482b86b96d"></a><!-- doxytag: member="MessageQueue::Remove" ref="ae51d84aa9141368e565f2b482b86b96d" args="(MessageQueueElement *el)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::Remove </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classMessageQueueElement.html">MessageQueueElement</a> *&nbsp;</td>
          <td class="paramname"> <em>el</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Remove element <code>el</code> from the queue, and rearrange pointers appropriately. </p>

</div>
</div>
<a class="anchor" id="a785d982d955cbe025ecc68d3b1348aa8"></a><!-- doxytag: member="MessageQueue::SetReplace" ref="a785d982d955cbe025ecc68d3b1348aa8" args="(bool _Replace)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void MessageQueue::SetReplace </td>
          <td>(</td>
          <td class="paramtype">bool&nbsp;</td>
          <td class="paramname"> <em>_Replace</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td><code> [inline]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Set the <code>Replace</code> flag, which governs whether data and command messages of the same subtype from the same device are replaced in the queue. </p>

</div>
</div>
<a class="anchor" id="a48a9363776ffb400aba779ea55a84c94"></a><!-- doxytag: member="MessageQueue::Wait" ref="a48a9363776ffb400aba779ea55a84c94" args="(double TimeOut=0.0)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool MessageQueue::Wait </td>
          <td>(</td>
          <td class="paramtype">double&nbsp;</td>
          <td class="paramname"> <em>TimeOut</em> = <code>0.0</code></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Wait on this queue. </p>
<p>This method blocks until new data is available (as indicated by a call to <a class="el" href="classMessageQueue.html#ae63b393753350241fc7aef35ca3a9c63" title="Signal that new data is available.">DataAvailable()</a>).</p>
<p>If TimeOut is set to a positive value this method will return false if the timeout occurs before and update is recieved. </p>

</div>
</div>
<hr/><h2>Member Data Documentation</h2>
<a class="anchor" id="a926c7aa691bfa676fc95c7bac068db1c"></a><!-- doxytag: member="MessageQueue::cond" ref="a926c7aa691bfa676fc95c7bac068db1c" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">pthread_cond_t <a class="el" href="classMessageQueue.html#a926c7aa691bfa676fc95c7bac068db1c">MessageQueue::cond</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>A condition variable that can be used to signal, via <a class="el" href="classMessageQueue.html#ae63b393753350241fc7aef35ca3a9c63" title="Signal that new data is available.">DataAvailable()</a>, other threads that are <a class="el" href="classMessageQueue.html#a48a9363776ffb400aba779ea55a84c94" title="Wait on this queue.">Wait()</a>ing on this queue. </p>

</div>
</div>
<a class="anchor" id="a17bdbcec1c31748e1fa1b77e9a2ac576"></a><!-- doxytag: member="MessageQueue::pull" ref="a17bdbcec1c31748e1fa1b77e9a2ac576" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool <a class="el" href="classMessageQueue.html#a17bdbcec1c31748e1fa1b77e9a2ac576">MessageQueue::pull</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Flag for if in pull mode. </p>
<p>If false, push mode. Push is default mode, but pull is the recommended method to avoid getting delays in data on the client. </p>

</div>
</div>
<hr/>The documentation for this class was generated from the following file:<ul>
<li><a class="el" href="message_8h_source.html">message.h</a></li>
</ul>
</div>
<!-- render the modification time of the source file -->


<div class="timestamp">
<hr>

<table style="width:100%;">
<tr>
<td style="text-align:left;">
Last updated 12 September 2005 21:38:45
<!--
<td style="text-align:right;">
<a href="http://validator.w3.org/check/referer"><img style="vertical-align:middle;border:0;width:88px;height:31px"
          src="http://www.w3.org/Icons/valid-html401"
          alt="Valid HTML 4.01!"></a>

 <a href="http://jigsaw.w3.org/css-validator/">
  <img style="vertical-align:middle;border:0;width:88px;height:31px"
       src="http://jigsaw.w3.org/css-validator/images/vcss"
       alt="Valid CSS!">
 </a>
-->
</tr>
</table>
</div>


</tr>
</table>

</BODY>
</HTML>