Sophie

Sophie

distrib > Fedora > 18 > x86_64 > by-pkgid > b3a1f4d91c26f535919e39e25606614a > files > 473

wt-doc-3.2.3-1.fc18.noarch.rpm

<!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">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Wt examples: SimpleChatServer Class Reference</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />



</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">Wt examples
   &#160;<span id="projectnumber">3.2.3</span>
   </div>
   
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.5.1 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
      <li><a href="inherits.html"><span>Class&#160;Hierarchy</span></a></li>
      <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#pub-types">Public Types</a> &#124;
<a href="#pub-methods">Public Member Functions</a> &#124;
<a href="#pri-types">Private Types</a> &#124;
<a href="#pri-methods">Private Member Functions</a> &#124;
<a href="#pri-attribs">Private Attributes</a>  </div>
  <div class="headertitle">
<div class="title">SimpleChatServer Class Reference<div class="ingroups"><a class="el" href="group__chatexample.html">Chat example</a></div></div>  </div>
</div>
<div class="contents">
<!-- doxytag: class="SimpleChatServer" -->
<p>A simple chat server.  
 <a href="classSimpleChatServer.html#details">More...</a></p>

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

<p><a href="classSimpleChatServer-members.html">List of all members.</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer_1_1Client.html">Client</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structSimpleChatServer_1_1ClientInfo.html">ClientInfo</a></td></tr>
<tr><td colspan="2"><h2><a name="pub-types"></a>
Public Types</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef std::set&lt; <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">UserSet</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Typedef for a collection of user names.  <a href="#a911329f24472ca7ed245ab18611488d4"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a2cf35cb3b79c6a3d3815df92b25b713e">SimpleChatServer</a> (<a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WServer.html">Wt::WServer</a> &amp;server)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new chat server.  <a href="#a2cf35cb3b79c6a3d3815df92b25b713e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a916cec08c2aeb2d2ccf413e9c9a45036">connect</a> (<a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> *client, const <a class="el" href="group__chatexample.html#ga0b33bac2811bf39b0ea9412e91c3d4e7">ChatEventCallback</a> &amp;handleEvent)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Connects to the chat server.  <a href="#a916cec08c2aeb2d2ccf413e9c9a45036"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a070e07e1a2a5ec5ecc4e944a761256c9">disconnect</a> (<a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> *client)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Disconnect from the chat server.  <a href="#a070e07e1a2a5ec5ecc4e944a761256c9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#ada0ab17464e1711ca15f30b381ede57c">login</a> (const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;user)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Try to login with given user name.  <a href="#ada0ab17464e1711ca15f30b381ede57c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a5d376e3ff441f24843be648dd420e027">logout</a> (const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;user)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Logout from the server.  <a href="#a5d376e3ff441f24843be648dd420e027"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">bool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a0154462f2176611e8c44d93efe306283">changeName</a> (const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;user, const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;newUser)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes the name.  <a href="#a0154462f2176611e8c44d93efe306283"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#abf692567706118193111c2b2589c8d3f">suggestGuest</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a suggestion for a guest user name.  <a href="#abf692567706118193111c2b2589c8d3f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#aab42074f7904397b3547a6df89c16d9d">sendMessage</a> (const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;user, const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;message)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Send a message on behalve of a user.  <a href="#aab42074f7904397b3547a6df89c16d9d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">UserSet</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a40f5c6465b1edb44278be93c97a29a39">users</a> ()</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the users currently logged in.  <a href="#a40f5c6465b1edb44278be93c97a29a39"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="pri-types"></a>
Private Types</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef std::map&lt; <a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> <br class="typebreak"/>
*, <a class="el" href="structSimpleChatServer_1_1ClientInfo.html">ClientInfo</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a2a3c1f56445447ee41294bd2b339a8ed">ClientMap</a></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">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a5038714fb4463072bd795fea419e6f09">postChatEvent</a> (const <a class="el" href="classChatEvent.html">ChatEvent</a> &amp;event)</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="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WServer.html">Wt::WServer</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#ab63a496e6fdfebbb2ca3ab9dfaace70b">server_</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">boost::recursive_mutex&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classSimpleChatServer.html#a2a3c1f56445447ee41294bd2b339a8ed">ClientMap</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">UserSet</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>A simple chat server. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00085">85</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>
</div><hr/><h2>Member Typedef Documentation</h2>
<a class="anchor" id="a2a3c1f56445447ee41294bd2b339a8ed"></a><!-- doxytag: member="SimpleChatServer::ClientMap" ref="a2a3c1f56445447ee41294bd2b339a8ed" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef std::map&lt;<a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> *, <a class="el" href="structSimpleChatServer_1_1ClientInfo.html">ClientInfo</a>&gt; <a class="el" href="classSimpleChatServer.html#a2a3c1f56445447ee41294bd2b339a8ed">SimpleChatServer::ClientMap</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00152">152</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<a class="anchor" id="a911329f24472ca7ed245ab18611488d4"></a><!-- doxytag: member="SimpleChatServer::UserSet" ref="a911329f24472ca7ed245ab18611488d4" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef std::set&lt;<a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a>&gt; <a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">SimpleChatServer::UserSet</a></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Typedef for a collection of user names. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00140">140</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<hr/><h2>Constructor &amp; Destructor Documentation</h2>
<a class="anchor" id="a2cf35cb3b79c6a3d3815df92b25b713e"></a><!-- doxytag: member="SimpleChatServer::SimpleChatServer" ref="a2cf35cb3b79c6a3d3815df92b25b713e" args="(Wt::WServer &amp;server)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">SimpleChatServer::SimpleChatServer </td>
          <td>(</td>
          <td class="paramtype"><a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WServer.html">Wt::WServer</a> &amp;&#160;</td>
          <td class="paramname"><em>server</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Create a new chat server. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00057">57</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">  : <a class="code" href="classSimpleChatServer.html#ab63a496e6fdfebbb2ca3ab9dfaace70b">server_</a>(server)
{ }
</pre></div>
</div>
</div>
<hr/><h2>Member Function Documentation</h2>
<a class="anchor" id="a0154462f2176611e8c44d93efe306283"></a><!-- doxytag: member="SimpleChatServer::changeName" ref="a0154462f2176611e8c44d93efe306283" args="(const Wt::WString &amp;user, const Wt::WString &amp;newUser)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool SimpleChatServer::changeName </td>
          <td>(</td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>user</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>newUser</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Changes the name. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00113">113</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  <span class="keywordflow">if</span> (user == newUser)
    <span class="keywordflow">return</span> <span class="keyword">true</span>;

  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);
  
  UserSet::iterator i = <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.find(user);

  <span class="keywordflow">if</span> (i != <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.end()) {
    <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.count(newUser) == 0) {
      <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.erase(i);
      <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.insert(newUser);

      <a class="code" href="classSimpleChatServer.html#a5038714fb4463072bd795fea419e6f09">postChatEvent</a>(<a class="code" href="classChatEvent.html" title="Encapsulate a chat event.">ChatEvent</a>(<a class="code" href="classChatEvent.html#afa84446dae17c08fe15cf932fc0b7d61ab168d89affa0c72ba9a37d2881479ed8">ChatEvent::Rename</a>, user, newUser));

      <span class="keywordflow">return</span> <span class="keyword">true</span>;
    } <span class="keywordflow">else</span>
      <span class="keywordflow">return</span> <span class="keyword">false</span>;
  } <span class="keywordflow">else</span>
    <span class="keywordflow">return</span> <span class="keyword">false</span>;
}
</pre></div>
</div>
</div>
<a class="anchor" id="a916cec08c2aeb2d2ccf413e9c9a45036"></a><!-- doxytag: member="SimpleChatServer::connect" ref="a916cec08c2aeb2d2ccf413e9c9a45036" args="(Client *client, const ChatEventCallback &amp;handleEvent)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool SimpleChatServer::connect </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> *&#160;</td>
          <td class="paramname"><em>client</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="el" href="group__chatexample.html#ga0b33bac2811bf39b0ea9412e91c3d4e7">ChatEventCallback</a> &amp;&#160;</td>
          <td class="paramname"><em>handleEvent</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Connects to the chat server. </p>
<p>The passed callback method is posted to when a new chat event is received.</p>
<p>Returns whether the client has been connected (or false if the client was already connected). </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00061">61</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a>.count(client) == 0) {
    ClientInfo clientInfo;
  
    clientInfo.sessionId = WApplication::instance()-&gt;sessionId();
    clientInfo.eventCallback = handleEvent;

    <a class="code" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a>[client] = clientInfo;

    <span class="keywordflow">return</span> <span class="keyword">true</span>;
  } <span class="keywordflow">else</span>
    <span class="keywordflow">return</span> <span class="keyword">false</span>;
}
</pre></div>
</div>
</div>
<a class="anchor" id="a070e07e1a2a5ec5ecc4e944a761256c9"></a><!-- doxytag: member="SimpleChatServer::disconnect" ref="a070e07e1a2a5ec5ecc4e944a761256c9" args="(Client *client)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool SimpleChatServer::disconnect </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="classSimpleChatServer_1_1Client.html">Client</a> *&#160;</td>
          <td class="paramname"><em>client</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Disconnect from the chat server. </p>
<p>Returns whether the client has been disconnected (or false if the client was not connected). </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00079">79</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  <span class="keywordflow">return</span> <a class="code" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a>.erase(client) == 1;
}
</pre></div>
</div>
</div>
<a class="anchor" id="ada0ab17464e1711ca15f30b381ede57c"></a><!-- doxytag: member="SimpleChatServer::login" ref="ada0ab17464e1711ca15f30b381ede57c" args="(const Wt::WString &amp;user)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">bool SimpleChatServer::login </td>
          <td>(</td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>user</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Try to login with given user name. </p>
<p>Returns false if the login was not successful. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00086">86</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);
  
  <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.find(user) == <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.end()) {
    <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.insert(user);

    <a class="code" href="classSimpleChatServer.html#a5038714fb4463072bd795fea419e6f09">postChatEvent</a>(<a class="code" href="classChatEvent.html" title="Encapsulate a chat event.">ChatEvent</a>(<a class="code" href="classChatEvent.html#afa84446dae17c08fe15cf932fc0b7d61a5173cb4baa818f95af4604d7a01e3ae6">ChatEvent::Login</a>, user));

    <span class="keywordflow">return</span> <span class="keyword">true</span>;
  } <span class="keywordflow">else</span>
    <span class="keywordflow">return</span> <span class="keyword">false</span>;
}
</pre></div>
</div>
</div>
<a class="anchor" id="a5d376e3ff441f24843be648dd420e027"></a><!-- doxytag: member="SimpleChatServer::logout" ref="a5d376e3ff441f24843be648dd420e027" args="(const Wt::WString &amp;user)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void SimpleChatServer::logout </td>
          <td>(</td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>user</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Logout from the server. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00100">100</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  UserSet::iterator i = <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.find(user);

  <span class="keywordflow">if</span> (i != <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.end()) {
    <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.erase(i);

    <a class="code" href="classSimpleChatServer.html#a5038714fb4463072bd795fea419e6f09">postChatEvent</a>(<a class="code" href="classChatEvent.html" title="Encapsulate a chat event.">ChatEvent</a>(<a class="code" href="classChatEvent.html#afa84446dae17c08fe15cf932fc0b7d61aa8b11c1512738c200b2cfe1facd1c171">ChatEvent::Logout</a>, user));
  }
}
</pre></div>
</div>
</div>
<a class="anchor" id="a5038714fb4463072bd795fea419e6f09"></a><!-- doxytag: member="SimpleChatServer::postChatEvent" ref="a5038714fb4463072bd795fea419e6f09" args="(const ChatEvent &amp;event)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void SimpleChatServer::postChatEvent </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="classChatEvent.html">ChatEvent</a> &amp;&#160;</td>
          <td class="paramname"><em>event</em></td><td>)</td>
          <td><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00154">154</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  <a class="codeRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WApplication.html">WApplication</a> *app = WApplication::instance();

  <span class="keywordflow">for</span> (ClientMap::const_iterator i = <a class="code" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a>.begin(); i != <a class="code" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">clients_</a>.end();
       ++i) {
    <span class="comment">/*</span>
<span class="comment">     * If the user corresponds to the current application, we directly</span>
<span class="comment">     * call the call back method. This avoids an unnecessary delay for</span>
<span class="comment">     * the update to the user causing the event.</span>
<span class="comment">     *</span>
<span class="comment">     * For other uses, we post it to their session. By posting the</span>
<span class="comment">     * event, we avoid dead-lock scenarios, race conditions, and</span>
<span class="comment">     * delivering the event to a session that is just about to be</span>
<span class="comment">     * terminated.</span>
<span class="comment">     */</span>
    <span class="keywordflow">if</span> (app &amp;&amp; app-&gt;<a class="codeRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WApplication.html#ab55c625a3197fec416544be8ad1529af">sessionId</a>() == i-&gt;second.sessionId)
      i-&gt;second.eventCallback(event);
    <span class="keywordflow">else</span>
      <a class="code" href="classSimpleChatServer.html#ab63a496e6fdfebbb2ca3ab9dfaace70b">server_</a>.<a class="codeRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WServer.html#a6115cc9ad6ec28e55fb85e32a045df88">post</a>(i-&gt;second.sessionId,
                   boost::bind(i-&gt;second.eventCallback, event));
  }
}
</pre></div>
</div>
</div>
<a class="anchor" id="aab42074f7904397b3547a6df89c16d9d"></a><!-- doxytag: member="SimpleChatServer::sendMessage" ref="aab42074f7904397b3547a6df89c16d9d" args="(const Wt::WString &amp;user, const Wt::WString &amp;message)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">void SimpleChatServer::sendMessage </td>
          <td>(</td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>user</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">const <a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">Wt::WString</a> &amp;&#160;</td>
          <td class="paramname"><em>message</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Send a message on behalve of a user. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00149">149</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  <a class="code" href="classSimpleChatServer.html#a5038714fb4463072bd795fea419e6f09">postChatEvent</a>(<a class="code" href="classChatEvent.html" title="Encapsulate a chat event.">ChatEvent</a>(user, message));
}
</pre></div>
</div>
</div>
<a class="anchor" id="abf692567706118193111c2b2589c8d3f"></a><!-- doxytag: member="SimpleChatServer::suggestGuest" ref="abf692567706118193111c2b2589c8d3f" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">WString</a> SimpleChatServer::suggestGuest </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Get a suggestion for a guest user name. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00136">136</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1;; ++i) {
    std::string s = <span class="stringliteral">&quot;guest &quot;</span> + boost::lexical_cast&lt;std::string&gt;(i);
    <a class="codeRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WString.html">WString</a> ss = s;

    <span class="keywordflow">if</span> (<a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.find(ss) == <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>.end())
      <span class="keywordflow">return</span> ss;
  }
}
</pre></div>
</div>
</div>
<a class="anchor" id="a40f5c6465b1edb44278be93c97a29a39"></a><!-- doxytag: member="SimpleChatServer::users" ref="a40f5c6465b1edb44278be93c97a29a39" args="()" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">SimpleChatServer::UserSet</a> SimpleChatServer::users </td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Get the users currently logged in. </p>

<p>Definition at line <a class="el" href="SimpleChatServer_8C_source.html#l00180">180</a> of file <a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a>.</p>
<div class="fragment"><pre class="fragment">{
  boost::recursive_mutex::scoped_lock lock(<a class="code" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">mutex_</a>);

  <a class="code" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4" title="Typedef for a collection of user names.">UserSet</a> result = <a class="code" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">users_</a>;

  <span class="keywordflow">return</span> result;
}
</pre></div>
</div>
</div>
<hr/><h2>Member Data Documentation</h2>
<a class="anchor" id="ae04169217cc74765f5d08fff55e8ee26"></a><!-- doxytag: member="SimpleChatServer::clients_" ref="ae04169217cc74765f5d08fff55e8ee26" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classSimpleChatServer.html#a2a3c1f56445447ee41294bd2b339a8ed">ClientMap</a> <a class="el" href="classSimpleChatServer.html#ae04169217cc74765f5d08fff55e8ee26">SimpleChatServer::clients_</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00156">156</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<a class="anchor" id="a91a994a5f6fb9879646dfd29f0b47556"></a><!-- doxytag: member="SimpleChatServer::mutex_" ref="a91a994a5f6fb9879646dfd29f0b47556" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">boost::recursive_mutex <a class="el" href="classSimpleChatServer.html#a91a994a5f6fb9879646dfd29f0b47556">SimpleChatServer::mutex_</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00155">155</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<a class="anchor" id="ab63a496e6fdfebbb2ca3ab9dfaace70b"></a><!-- doxytag: member="SimpleChatServer::server_" ref="ab63a496e6fdfebbb2ca3ab9dfaace70b" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="elRef" doxygen="wt.tags:../../reference/html" href="../../reference/html/classWt_1_1WServer.html">Wt::WServer</a>&amp; <a class="el" href="classSimpleChatServer.html#ab63a496e6fdfebbb2ca3ab9dfaace70b">SimpleChatServer::server_</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00154">154</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<a class="anchor" id="ae6712308cbb1f6b1ff4024630ea1d20c"></a><!-- doxytag: member="SimpleChatServer::users_" ref="ae6712308cbb1f6b1ff4024630ea1d20c" args="" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="classSimpleChatServer.html#a911329f24472ca7ed245ab18611488d4">UserSet</a> <a class="el" href="classSimpleChatServer.html#ae6712308cbb1f6b1ff4024630ea1d20c">SimpleChatServer::users_</a><code> [private]</code></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Definition at line <a class="el" href="SimpleChatServer_8h_source.html#l00157">157</a> of file <a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a>.</p>

</div>
</div>
<hr/>The documentation for this class was generated from the following files:<ul>
<li>/home/koen/project/wt/public-git/wt/examples/simplechat/<a class="el" href="SimpleChatServer_8h_source.html">SimpleChatServer.h</a></li>
<li>/home/koen/project/wt/public-git/wt/examples/simplechat/<a class="el" href="SimpleChatServer_8C_source.html">SimpleChatServer.C</a></li>
</ul>
</div>
<hr size="1"><address style="text-align: right; margin: 3px"><small>
Generated on Thu Nov 1 2012 for <a href="http://www.webtoolkit.eu/wt">the
C++ Web Toolkit (Wt)</a> by&nbsp;<a
href="http://www.doxygen.org/index.html"><img src="doxygen.png"
alt="doxygen" border="0" style="vertical-align: middle; display:
inline-block; height: 2em"></a> 1.7.5.1</small></address>
</body>
</html>