1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
<html xmlns="http://www.w3.org/1999/xhtml">
4
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
6
<title>tesseract: SVNetwork Class Reference</title>
8
<link href="tabs.css" rel="stylesheet" type="text/css"/>
9
<link href="doxygen.css" rel="stylesheet" type="text/css" />
10
<link href="navtree.css" rel="stylesheet" type="text/css"/>
11
<script type="text/javascript" src="jquery.js"></script>
12
<script type="text/javascript" src="resize.js"></script>
13
<script type="text/javascript" src="navtree.js"></script>
14
<script type="text/javascript">
15
$(document).ready(initResizable);
17
<link href="search/search.css" rel="stylesheet" type="text/css"/>
18
<script type="text/javascript" src="search/search.js"></script>
19
<script type="text/javascript">
20
$(document).ready(function() { searchBox.OnSelectItem(0); });
25
<div id="top"><!-- do not remove this div! -->
29
<table cellspacing="0" cellpadding="0">
31
<tr style="height: 56px;">
34
<td style="padding-left: 0.5em;">
35
<div id="projectname">tesseract
36
 <span id="projectnumber">3.03</span>
48
<!-- Generated by Doxygen 1.7.6.1 -->
49
<script type="text/javascript">
50
var searchBox = new SearchBox("searchBox", "search",false,'Search');
52
<div id="navrow1" class="tabs">
54
<li><a href="index.html"><span>Main Page</span></a></li>
55
<li><a href="pages.html"><span>Related Pages</span></a></li>
56
<li><a href="modules.html"><span>Modules</span></a></li>
57
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
58
<li class="current"><a href="annotated.html"><span>Classes</span></a></li>
59
<li><a href="files.html"><span>Files</span></a></li>
61
<div id="MSearchBox" class="MSearchBoxInactive">
63
<img id="MSearchSelect" src="search/mag_sel.png"
64
onmouseover="return searchBox.OnSearchSelectShow()"
65
onmouseout="return searchBox.OnSearchSelectHide()"
67
<input type="text" id="MSearchField" value="Search" accesskey="S"
68
onfocus="searchBox.OnSearchFieldFocus(true)"
69
onblur="searchBox.OnSearchFieldFocus(false)"
70
onkeyup="searchBox.OnSearchFieldChange(event)"/>
71
</span><span class="right">
72
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
78
<div id="navrow2" class="tabs2">
80
<li><a href="annotated.html"><span>Class List</span></a></li>
81
<li><a href="hierarchy.html"><span>Class Hierarchy</span></a></li>
82
<li><a href="functions.html"><span>Class Members</span></a></li>
86
<div id="side-nav" class="ui-resizable side-nav-resizable">
88
<div id="nav-tree-contents">
91
<div id="splitbar" style="-moz-user-select:none;"
92
class="ui-resizable-handle">
95
<script type="text/javascript">
96
initNavTree('a00576.html','');
98
<div id="doc-content">
100
<div class="summary">
101
<a href="#pub-methods">Public Member Functions</a> </div>
102
<div class="headertitle">
103
<div class="title">SVNetwork Class Reference</div> </div>
105
<div class="contents">
106
<!-- doxytag: class="SVNetwork" -->
107
<p><code>#include <<a class="el" href="a01208_source.html">svutil.h</a>></code></p>
109
<p><a href="a01670.html">List of all members.</a></p>
110
<table class="memberdecls">
111
<tr><td colspan="2"><h2><a name="pub-methods"></a>
112
Public Member Functions</h2></td></tr>
113
<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#a72f0c73a7d3a610035043d10f552d462">SVNetwork</a> (const char *hostname, int port)</td></tr>
114
<tr><td class="mdescLeft"> </td><td class="mdescRight">Set up a connection to hostname on port. <a href="#a72f0c73a7d3a610035043d10f552d462"></a><br/></td></tr>
115
<tr><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#a85f11ef0f1e673319ec4cdd740eddbfa">~SVNetwork</a> ()</td></tr>
116
<tr><td class="mdescLeft"> </td><td class="mdescRight">Destructor. <a href="#a85f11ef0f1e673319ec4cdd740eddbfa"></a><br/></td></tr>
117
<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#a2de9fb634926d1ffc46b617e87d129f6">Send</a> (const char *msg)</td></tr>
118
<tr><td class="mdescLeft"> </td><td class="mdescRight">Put a message in the messagebuffer to the server and try to send it. <a href="#a2de9fb634926d1ffc46b617e87d129f6"></a><br/></td></tr>
119
<tr><td class="memItemLeft" align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#a6cf1cd38c287bdce0ed8594ed9076c2d">Receive</a> ()</td></tr>
120
<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#ac42718fcb9311770b737210a5ab14b27">Close</a> ()</td></tr>
121
<tr><td class="mdescLeft"> </td><td class="mdescRight">Close the connection to the server. <a href="#ac42718fcb9311770b737210a5ab14b27"></a><br/></td></tr>
122
<tr><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="a00576.html#ad89f207ad0f1b7fa764e2edb37c0e2c0">Flush</a> ()</td></tr>
123
<tr><td class="mdescLeft"> </td><td class="mdescRight">Flush the buffer. <a href="#ad89f207ad0f1b7fa764e2edb37c0e2c0"></a><br/></td></tr>
125
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
126
<div class="textblock"><p>The <a class="el" href="a00576.html">SVNetwork</a> class takes care of the remote connection for <a class="el" href="a00532.html">ScrollView</a> This means setting up and maintaining a remote connection, sending and receiving messages and closing the connection. It is designed to work on both Linux and Windows. </p>
128
<p>Definition at line <a class="el" href="a01208_source.html#l00107">107</a> of file <a class="el" href="a01208_source.html">svutil.h</a>.</p>
129
</div><hr/><h2>Constructor & Destructor Documentation</h2>
130
<a class="anchor" id="a72f0c73a7d3a610035043d10f552d462"></a><!-- doxytag: member="SVNetwork::SVNetwork" ref="a72f0c73a7d3a610035043d10f552d462" args="(const char *hostname, int port)" -->
131
<div class="memitem">
132
<div class="memproto">
133
<table class="memname">
135
<td class="memname"><a class="el" href="a00576.html#a72f0c73a7d3a610035043d10f552d462">SVNetwork::SVNetwork</a> </td>
137
<td class="paramtype">const char * </td>
138
<td class="paramname"><em>hostname</em>, </td>
141
<td class="paramkey"></td>
143
<td class="paramtype">int </td>
144
<td class="paramname"><em>port</em> </td>
155
<p>Set up a connection to hostname on port. </p>
157
<p>Definition at line <a class="el" href="a01207_source.html#l00386">386</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
158
<div class="fragment"><pre class="fragment"> {
159
mutex_send_ = <span class="keyword">new</span> <a class="code" href="a00575.html">SVMutex</a>();
160
msg_buffer_in_ = <span class="keyword">new</span> <span class="keywordtype">char</span>[<a class="code" href="a01202.html#a4a4ce82f9687ca37d149b0a62c5ed379">kMaxMsgSize</a> + 1];
161
msg_buffer_in_[0] = <span class="charliteral">'\0'</span>;
163
has_content = <span class="keyword">false</span>;
166
<span class="keyword">struct </span>addrinfo *addr_info = NULL;
168
<span class="keywordflow">if</span> (GetAddrInfo(hostname, port, &addr_info) != 0) {
169
std::cerr << <span class="stringliteral">"Error resolving name for ScrollView host "</span>
170
<< std::string(hostname) << <span class="stringliteral">":"</span> << port << std::endl;
173
stream_ = socket(addr_info->ai_family, addr_info->ai_socktype,
174
addr_info->ai_protocol);
176
<span class="comment">// If server is not there, we will start a new server as local child process.</span>
177
<span class="keywordflow">if</span> (connect(stream_, addr_info->ai_addr, addr_info->ai_addrlen) < 0) {
178
<span class="keyword">const</span> <span class="keywordtype">char</span>* scrollview_path = getenv(<span class="stringliteral">"SCROLLVIEW_PATH"</span>);
179
<span class="keywordflow">if</span> (scrollview_path == NULL) {
180
<span class="preprocessor">#ifdef SCROLLVIEW_PATH</span>
181
<span class="preprocessor"></span><span class="preprocessor">#define _STR(a) #a</span>
182
<span class="preprocessor"></span><span class="preprocessor">#define _XSTR(a) _STR(a)</span>
183
<span class="preprocessor"></span> scrollview_path = _XSTR(SCROLLVIEW_PATH);
184
<span class="preprocessor">#undef _XSTR</span>
185
<span class="preprocessor"></span><span class="preprocessor">#undef _STR</span>
186
<span class="preprocessor"></span><span class="preprocessor">#else</span>
187
<span class="preprocessor"></span> scrollview_path = <span class="stringliteral">"."</span>;
188
<span class="preprocessor">#endif</span>
189
<span class="preprocessor"></span> }
190
<span class="keyword">const</span> <span class="keywordtype">char</span> *prog = ScrollViewProg();
191
std::string command = ScrollViewCommand(scrollview_path);
192
<a class="code" href="a00582.html#aea4f2c7847c7c165fba1a60aadec3e05" title="Starts a new process.">SVSync::StartProcess</a>(prog, command.c_str());
194
<span class="comment">// Wait for server to show up.</span>
195
<span class="comment">// Note: There is no exception handling in case the server never turns up.</span>
197
stream_ = socket(addr_info->ai_family, addr_info->ai_socktype,
198
addr_info->ai_protocol);
200
<span class="keywordflow">while</span> (connect(stream_, addr_info->ai_addr,
201
addr_info->ai_addrlen) < 0) {
202
std::cout << <span class="stringliteral">"ScrollView: Waiting for server...\n"</span>;
203
<span class="preprocessor">#ifdef _WIN32</span>
204
<span class="preprocessor"></span> Sleep(1000);
205
<span class="preprocessor">#else</span>
206
<span class="preprocessor"></span> sleep(1);
207
<span class="preprocessor">#endif</span>
208
<span class="preprocessor"></span>
209
stream_ = socket(addr_info->ai_family, addr_info->ai_socktype,
210
addr_info->ai_protocol);
213
FreeAddrInfo(addr_info);
218
<a class="anchor" id="a85f11ef0f1e673319ec4cdd740eddbfa"></a><!-- doxytag: member="SVNetwork::~SVNetwork" ref="a85f11ef0f1e673319ec4cdd740eddbfa" args="()" -->
219
<div class="memitem">
220
<div class="memproto">
221
<table class="memname">
223
<td class="memname"><a class="el" href="a00576.html#a85f11ef0f1e673319ec4cdd740eddbfa">SVNetwork::~SVNetwork</a> </td>
225
<td class="paramname"></td><td>)</td>
234
<p>Definition at line <a class="el" href="a01207_source.html#l00444">444</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
235
<div class="fragment"><pre class="fragment"> {
236
<span class="keyword">delete</span>[] msg_buffer_in_;
237
<span class="keyword">delete</span> mutex_send_;
242
<hr/><h2>Member Function Documentation</h2>
243
<a class="anchor" id="ac42718fcb9311770b737210a5ab14b27"></a><!-- doxytag: member="SVNetwork::Close" ref="ac42718fcb9311770b737210a5ab14b27" args="()" -->
244
<div class="memitem">
245
<div class="memproto">
246
<table class="memname">
248
<td class="memname">void <a class="el" href="a00576.html#ac42718fcb9311770b737210a5ab14b27">SVNetwork::Close</a> </td>
250
<td class="paramname"></td><td>)</td>
257
<p>Close the connection to the server. </p>
259
<p>Definition at line <a class="el" href="a01207_source.html#l00271">271</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
260
<div class="fragment"><pre class="fragment"> {
261
<span class="preprocessor">#ifdef _WIN32</span>
262
<span class="preprocessor"></span> closesocket(stream_);
263
<span class="preprocessor">#else</span>
264
<span class="preprocessor"></span> close(stream_);
265
<span class="preprocessor">#endif</span>
266
<span class="preprocessor"></span>}
270
<a class="anchor" id="ad89f207ad0f1b7fa764e2edb37c0e2c0"></a><!-- doxytag: member="SVNetwork::Flush" ref="ad89f207ad0f1b7fa764e2edb37c0e2c0" args="()" -->
271
<div class="memitem">
272
<div class="memproto">
273
<table class="memname">
275
<td class="memname">void <a class="el" href="a00576.html#ad89f207ad0f1b7fa764e2edb37c0e2c0">SVNetwork::Flush</a> </td>
277
<td class="paramname"></td><td>)</td>
284
<p>Flush the buffer. </p>
286
<p>Definition at line <a class="el" href="a01207_source.html#l00212">212</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
287
<div class="fragment"><pre class="fragment"> {
288
mutex_send_-><a class="code" href="a00575.html#ac2a19e2b7ce47e75ee1f72870574e41f" title="Locks on a mutex.">Lock</a>();
289
<span class="keywordflow">while</span> (msg_buffer_out_.size() > 0) {
290
<span class="keywordtype">int</span> i = send(stream_, msg_buffer_out_.c_str(), msg_buffer_out_.length(), 0);
291
msg_buffer_out_.erase(0, i);
293
mutex_send_-><a class="code" href="a00575.html#aa70f2446491c0de56b69eba6dd877f31" title="Unlocks on a mutex.">Unlock</a>();
298
<a class="anchor" id="a6cf1cd38c287bdce0ed8594ed9076c2d"></a><!-- doxytag: member="SVNetwork::Receive" ref="a6cf1cd38c287bdce0ed8594ed9076c2d" args="()" -->
299
<div class="memitem">
300
<div class="memproto">
301
<table class="memname">
303
<td class="memname">char * <a class="el" href="a00576.html#a6cf1cd38c287bdce0ed8594ed9076c2d">SVNetwork::Receive</a> </td>
305
<td class="paramname"></td><td>)</td>
311
<p>Receive a message from the server. This will always return one line of char* (denoted by <br/>
314
<p>Definition at line <a class="el" href="a01207_source.html#l00223">223</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
315
<div class="fragment"><pre class="fragment"> {
316
<span class="keywordtype">char</span>* result = NULL;
317
<span class="preprocessor">#ifdef _WIN32</span>
318
<span class="preprocessor"></span> <span class="keywordflow">if</span> (has_content) { result = strtok (NULL, <span class="stringliteral">"\n"</span>); }
319
<span class="preprocessor">#else</span>
320
<span class="preprocessor"></span> <span class="keywordflow">if</span> (buffer_ptr_ != NULL) { result = <a class="code" href="a01216.html#ada6f0d1c8962c7543f073d258efdb1bf">strtok_r</a>(NULL, <span class="stringliteral">"\n"</span>, &buffer_ptr_); }
321
<span class="preprocessor">#endif</span>
322
<span class="preprocessor"></span>
323
<span class="comment">// This means there is something left in the buffer and we return it.</span>
324
<span class="keywordflow">if</span> (result != NULL) { <span class="keywordflow">return</span> result;
325
<span class="comment">// Otherwise, we read from the stream_.</span>
326
} <span class="keywordflow">else</span> {
328
has_content = <span class="keyword">false</span>;
330
<span class="comment">// The timeout length is not really important since we are looping anyway</span>
331
<span class="comment">// until a new message is delivered.</span>
332
<span class="keyword">struct </span>timeval tv;
336
<span class="comment">// Set the flags to return when the stream_ is ready to be read.</span>
338
FD_ZERO(&readfds);
339
FD_SET(stream_, &readfds);
341
<span class="keywordtype">int</span> i = select(stream_+1, &readfds, NULL, NULL, &tv);
343
<span class="comment">// The stream_ died.</span>
344
<span class="keywordflow">if</span> (i == 0) { <span class="keywordflow">return</span> NULL; }
346
<span class="comment">// Read the message buffer.</span>
347
i = recv(stream_, msg_buffer_in_, <a class="code" href="a01202.html#a4a4ce82f9687ca37d149b0a62c5ed379">kMaxMsgSize</a>, 0);
349
<span class="comment">// Server quit (0) or error (-1).</span>
350
<span class="keywordflow">if</span> (i <= 0) { <span class="keywordflow">return</span> NULL; }
351
msg_buffer_in_[i] = <span class="charliteral">'\0'</span>;
352
has_content = <span class="keyword">true</span>;
353
<span class="preprocessor">#ifdef _WIN32</span>
354
<span class="preprocessor"></span> <span class="keywordflow">return</span> strtok(msg_buffer_in_, <span class="stringliteral">"\n"</span>);
355
<span class="preprocessor">#else</span>
356
<span class="preprocessor"></span> <span class="comment">// Setup a new string tokenizer.</span>
357
<span class="keywordflow">return</span> <a class="code" href="a01216.html#ada6f0d1c8962c7543f073d258efdb1bf">strtok_r</a>(msg_buffer_in_, <span class="stringliteral">"\n"</span>, &buffer_ptr_);
358
<span class="preprocessor">#endif</span>
359
<span class="preprocessor"></span> }
364
<a class="anchor" id="a2de9fb634926d1ffc46b617e87d129f6"></a><!-- doxytag: member="SVNetwork::Send" ref="a2de9fb634926d1ffc46b617e87d129f6" args="(const char *msg)" -->
365
<div class="memitem">
366
<div class="memproto">
367
<table class="memname">
369
<td class="memname">void <a class="el" href="a00576.html#a2de9fb634926d1ffc46b617e87d129f6">SVNetwork::Send</a> </td>
371
<td class="paramtype">const char * </td>
372
<td class="paramname"><em>msg</em></td><td>)</td>
379
<p>Put a message in the messagebuffer to the server and try to send it. </p>
381
<p>Definition at line <a class="el" href="a01207_source.html#l00205">205</a> of file <a class="el" href="a01207_source.html">svutil.cpp</a>.</p>
382
<div class="fragment"><pre class="fragment"> {
383
mutex_send_-><a class="code" href="a00575.html#ac2a19e2b7ce47e75ee1f72870574e41f" title="Locks on a mutex.">Lock</a>();
384
msg_buffer_out_.append(msg);
385
mutex_send_-><a class="code" href="a00575.html#aa70f2446491c0de56b69eba6dd877f31" title="Unlocks on a mutex.">Unlock</a>();
390
<hr/>The documentation for this class was generated from the following files:<ul>
391
<li>/usr/local/google/home/jbreiden/tesseract-ocr-read-only/viewer/<a class="el" href="a01208_source.html">svutil.h</a></li>
392
<li>/usr/local/google/home/jbreiden/tesseract-ocr-read-only/viewer/<a class="el" href="a01207_source.html">svutil.cpp</a></li>
394
</div><!-- contents -->
396
<!-- window showing the filter options -->
397
<div id="MSearchSelectWindow"
398
onmouseover="return searchBox.OnSearchSelectShow()"
399
onmouseout="return searchBox.OnSearchSelectHide()"
400
onkeydown="return searchBox.OnSearchSelectKey(event)">
401
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(9)"><span class="SelectionMark"> </span>Friends</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(10)"><span class="SelectionMark"> </span>Defines</a></div>
403
<!-- iframe showing the search results (closed by default) -->
404
<div id="MSearchResultsWindow">
405
<iframe src="javascript:void(0)" frameborder="0"
406
name="MSearchResults" id="MSearchResults">
410
<div id="nav-path" class="navpath">
412
<li class="navelem"><a class="el" href="a00576.html">SVNetwork</a> </li>
414
<li class="footer">Generated on Mon Feb 3 2014 10:59:17 for tesseract by
415
<a href="http://www.doxygen.org/index.html">
416
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.6.1 </li>