blob: d60f629c5909ed1f172ff61d8da2c1e0db754fd5 [file] [log] [blame]
<!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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Qpid Proton C++ API: server_direct.cpp</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
$(document).ready(function() { init_search(); });
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Qpid Proton C++ API
&#160;<span id="projectnumber">0.25.0</span>
</div>
</td>
<td> <div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.png"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('server_direct_8cpp-example.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="headertitle">
<div class="title">server_direct.cpp</div> </div>
</div><!--header-->
<div class="contents">
<p>A variant of the server part of a request-response example that accepts incoming connections and does not need an intermediary. Much like the original server, it receives incoming requests, converts the body to uppercase and sends the result back to the indicated reply address. Can be used in conjunction with any of the client alternatives.</p>
<div class="fragment"><div class="line"><span class="comment">/*</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * Licensed to the Apache Software Foundation (ASF) under one</span></div><div class="line"><span class="comment"> * or more contributor license agreements. See the NOTICE file</span></div><div class="line"><span class="comment"> * distributed with this work for additional information</span></div><div class="line"><span class="comment"> * regarding copyright ownership. The ASF licenses this file</span></div><div class="line"><span class="comment"> * to you under the Apache License, Version 2.0 (the</span></div><div class="line"><span class="comment"> * &quot;License&quot;); you may not use this file except in compliance</span></div><div class="line"><span class="comment"> * with the License. You may obtain a copy of the License at</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * http://www.apache.org/licenses/LICENSE-2.0</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> * Unless required by applicable law or agreed to in writing,</span></div><div class="line"><span class="comment"> * software distributed under the License is distributed on an</span></div><div class="line"><span class="comment"> * &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></div><div class="line"><span class="comment"> * KIND, either express or implied. See the License for the</span></div><div class="line"><span class="comment"> * specific language governing permissions and limitations</span></div><div class="line"><span class="comment"> * under the License.</span></div><div class="line"><span class="comment"> *</span></div><div class="line"><span class="comment"> */</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;options.hpp&quot;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="container_8hpp.html">proton/container.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="listen__handler_8hpp.html">proton/listen_handler.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="listener_8hpp.html">proton/listener.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="message_8hpp.html">proton/message.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="message__id_8hpp.html">proton/message_id.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="messaging__handler_8hpp.html">proton/messaging_handler.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="sender_8hpp.html">proton/sender.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="sender__options_8hpp.html">proton/sender_options.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="source__options_8hpp.html">proton/source_options.hpp</a>&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;<a class="code" href="tracker_8hpp.html">proton/tracker.hpp</a>&gt;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;map&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;string&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><span class="preprocessor">#include &lt;cctype&gt;</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include &quot;fake_cpp11.hpp&quot;</span></div><div class="line"></div><div class="line"><span class="keyword">class </span>server : <span class="keyword">public</span> <a name="_a0"></a><a class="code" href="classproton_1_1messaging__handler.html">proton::messaging_handler</a> {</div><div class="line"> <span class="keyword">private</span>:</div><div class="line"> <span class="keyword">class </span>listener_ready_handler : <span class="keyword">public</span> <a name="_a1"></a><a class="code" href="classproton_1_1listen__handler.html">proton::listen_handler</a> {</div><div class="line"> <span class="keywordtype">void</span> on_open(<a name="_a2"></a><a class="code" href="classproton_1_1listener.html">proton::listener</a>&amp; l) OVERRIDE {</div><div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;listening on &quot;</span> &lt;&lt; l.<a name="a3"></a><a class="code" href="classproton_1_1listener.html#a0a3b88007d7cb5fa8d890376c5a8b102">port</a>() &lt;&lt; std::endl;</div><div class="line"> }</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">typedef</span> std::map&lt;std::string, proton::sender&gt; sender_map;</div><div class="line"> listener_ready_handler listen_handler;</div><div class="line"> std::string url;</div><div class="line"> sender_map senders;</div><div class="line"> <span class="keywordtype">int</span> address_counter;</div><div class="line"></div><div class="line"> <span class="keyword">public</span>:</div><div class="line"> server(<span class="keyword">const</span> std::string &amp;u) : url(u), address_counter(0) {}</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> on_container_start(<a name="_a4"></a><a class="code" href="classproton_1_1container.html">proton::container</a> &amp;c) OVERRIDE {</div><div class="line"> c.<a name="a5"></a><a class="code" href="classproton_1_1container.html#a9e138b28e9589583915cf5c5e0e7a524">listen</a>(url, listen_handler);</div><div class="line"> }</div><div class="line"></div><div class="line"> std::string to_upper(<span class="keyword">const</span> std::string &amp;s) {</div><div class="line"> std::string uc(s);</div><div class="line"> <span class="keywordtype">size_t</span> l = uc.size();</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;l; i++)</div><div class="line"> uc[i] = static_cast&lt;char&gt;(std::toupper(uc[i]));</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> uc;</div><div class="line"> }</div><div class="line"></div><div class="line"> std::string generate_address() {</div><div class="line"> std::ostringstream addr;</div><div class="line"> addr &lt;&lt; <span class="stringliteral">&quot;server&quot;</span> &lt;&lt; address_counter++;</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> addr.str();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> on_sender_open(<a name="_a6"></a><a class="code" href="classproton_1_1sender.html">proton::sender</a> &amp;sender) OVERRIDE {</div><div class="line"> <span class="keywordflow">if</span> (sender.<a name="a7"></a><a class="code" href="classproton_1_1sender.html#a91a9e8a9445b29d83dd0514cd76503ae">source</a>().<a name="a8"></a><a class="code" href="classproton_1_1terminus.html#adcc4ef24adb8478230018c519aa636ec">dynamic</a>()) {</div><div class="line"> std::string addr = generate_address();</div><div class="line"> sender.<a name="a9"></a><a class="code" href="classproton_1_1sender.html#a9e8555112049fc2b4945120b3c45f8ab">open</a>(<a name="_a10"></a><a class="code" href="classproton_1_1sender__options.html">proton::sender_options</a>().source(<a name="_a11"></a><a class="code" href="classproton_1_1source__options.html">proton::source_options</a>().address(addr)));</div><div class="line"> senders[addr] = sender;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> on_message(<a name="_a12"></a><a class="code" href="classproton_1_1delivery.html">proton::delivery</a> &amp;, <a name="_a13"></a><a class="code" href="classproton_1_1message.html">proton::message</a> &amp;m) OVERRIDE {</div><div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;Received &quot;</span> &lt;&lt; m.<a name="a14"></a><a class="code" href="classproton_1_1message.html#ae9af642f154a68ec0eb8e715ecaf95ae">body</a>() &lt;&lt; std::endl;</div><div class="line"></div><div class="line"> std::string reply_to = m.<a name="a15"></a><a class="code" href="classproton_1_1message.html#a4032b495d721bd6d29bfa33ebb8ac5fe">reply_to</a>();</div><div class="line"> sender_map::iterator it = senders.find(reply_to);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (it == senders.end()) {</div><div class="line"> std::cout &lt;&lt; <span class="stringliteral">&quot;No link for reply_to: &quot;</span> &lt;&lt; reply_to &lt;&lt; std::endl;</div><div class="line"> } <span class="keywordflow">else</span> {</div><div class="line"> <a class="code" href="classproton_1_1sender.html">proton::sender</a> sender = it-&gt;second;</div><div class="line"> <a class="code" href="classproton_1_1message.html">proton::message</a> reply;</div><div class="line"></div><div class="line"> reply.<a name="a16"></a><a class="code" href="classproton_1_1message.html#a2fda6a98616365e06f1d4a627d1a58ac">to</a>(reply_to);</div><div class="line"> reply.<a class="code" href="classproton_1_1message.html#ae9af642f154a68ec0eb8e715ecaf95ae">body</a>(to_upper(proton::get&lt;std::string&gt;(m.<a class="code" href="classproton_1_1message.html#ae9af642f154a68ec0eb8e715ecaf95ae">body</a>())));</div><div class="line"> reply.<a name="a17"></a><a class="code" href="classproton_1_1message.html#ad159656f1742235cd22a9c6aaabf9d2d">correlation_id</a>(m.<a class="code" href="classproton_1_1message.html#ad159656f1742235cd22a9c6aaabf9d2d">correlation_id</a>());</div><div class="line"></div><div class="line"> sender.<a name="a18"></a><a class="code" href="classproton_1_1sender.html#a214eb30b24e6831d016a47b9dddda830">send</a>(reply);</div><div class="line"> }</div><div class="line"> }</div><div class="line">};</div><div class="line"></div><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div><div class="line"> std::string address(<span class="stringliteral">&quot;amqp://127.0.0.1:5672/examples&quot;</span>);</div><div class="line"> example::options opts(argc, argv);</div><div class="line"></div><div class="line"> opts.add_value(address, <span class="charliteral">&#39;a&#39;</span>, <span class="stringliteral">&quot;address&quot;</span>, <span class="stringliteral">&quot;listen on URL&quot;</span>, <span class="stringliteral">&quot;URL&quot;</span>);</div><div class="line"></div><div class="line"> <span class="keywordflow">try</span> {</div><div class="line"> opts.parse();</div><div class="line"></div><div class="line"> server srv(address);</div><div class="line"> <a class="code" href="classproton_1_1container.html">proton::container</a>(srv).<a name="a19"></a><a class="code" href="classproton_1_1container.html#a13a43e6d814de94978c515cb084873b1">run</a>();</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> example::bad_option&amp; e) {</div><div class="line"> std::cout &lt;&lt; opts &lt;&lt; std::endl &lt;&lt; e.what() &lt;&lt; std::endl;</div><div class="line"> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception&amp; e) {</div><div class="line"> std::cerr &lt;&lt; e.what() &lt;&lt; std::endl;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> 1;</div><div class="line">}</div></div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="footer">Generated by
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
</ul>
</div>
</body>
</html>