diff options
Diffstat (limited to '')
-rw-r--r-- | docs/doxygen/nel/service_8cpp-source.html | 1616 |
1 files changed, 1616 insertions, 0 deletions
diff --git a/docs/doxygen/nel/service_8cpp-source.html b/docs/doxygen/nel/service_8cpp-source.html new file mode 100644 index 00000000..f1ca647d --- /dev/null +++ b/docs/doxygen/nel/service_8cpp-source.html @@ -0,0 +1,1616 @@ +<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> + <TITLE>nevrax.org : docs</TITLE> + <LINK REL=stylesheet TYPE="text/css" HREF="http://www.nevrax.org/inc/css/nevrax.css"> + <link href="doxygen.css" rel="stylesheet" type="text/css"> +</HEAD> +<BODY MARGINHEIGHT="0" MARGINWIDTH="0"> + +<!-- uplinks --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.org><b>Home</B></FONT></A> </TD> + <TD><IMG width=6 height=14 SRC="http://www.nevrax.org/inc/img/reddots.gif" ALT="#" VSPACE=2 HSPACE=2 BORDER=0 ></TD><TD VALIGN=middle> <A CLASS=uplinks HREF=http://www.nevrax.com><b>nevrax.com</B></FONT></A> </TD> + </TR> +</TABLE> + +<!-- banner Nevrax --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100%> + <TR><TD BGCOLOR="#000000" BACKGROUND="http://www.nevrax.org/inc/img/black_banner.jpg"><A HREF="http://www.nevrax.org"><IMG SRC="http://www.nevrax.org/inc/img/nevrax.gif" WIDTH="170" HEIGHT="45" BORDER=0 ALT="Nevrax" ></A></TD></TR> +</TABLE> + +<!-- main table --> +<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 height=100%> + <TR> + <TD WIDTH=16><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="10" BORDER=0 ALT=""></TD> + <TD WIDTH=140 BGCOLOR=#dddddd VALIGN=TOP ALIGN=middle><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + + <!------ Begin Box ------> + <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=black><TR><TD><TABLE border=0 cellspacing=2 cellpadding=0 width=120><tr><TD ALIGN=middle bgcolor=black> + <FONT COLOR=white FACE="sans-serif"><B>Nevrax.org</B></FONT></TD></TR><tr><td colspan=2 bgcolor=#FFFFFF> + <TABLE cellspacing=0 cellpadding=1 border=0> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="Rubrique news"><img width=13 height=15 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-news.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/news/" TITLE="News">News</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Rubrique mail"><img width=15 height=11 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-mail.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/mail/" TITLE="Mailing list archive">Mailing-list</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Rubrique docs"><img width=14 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-docs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/docs/" TITLE="Documentation">Documentation</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="Rubrique cvs"><img width=13 height=17 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-cvs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/cvs/" TITLE="CVS Web">CVS</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Rubrique bugs"><img width=20 height=16 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-bugs.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/bugs/" TITLE="Bugtracking">Bugs</a></td></tr> + <tr><td ALIGN=middle><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="Rubrique license"><img width=18 height=12 hspace=5 border=0 src=http://www.nevrax.org/inc/img/picto-gpl.gif ALT=#></A></td><td><a class='linkbox' href="http://www.nevrax.org/GPL.php3" TITLE="License">License</a></td></tr> + </TABLE> + </TD></TR></TABLE></TD></TR></TABLE> + <!------ End Box ------> + + </TD> + <TD WIDTH=15><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="16" HEIGHT="16" BORDER=0 ALT=""></TD> + <TD ALIGN=left valign=top><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="140" HEIGHT="10" BORDER=0 ALT=""> + +<!-- title --> +<TABLE background="http://www.nevrax.org/inc/img/redline.gif" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td> +<A HREF="http://www.nevrax.org/docs/"><img src="http://www.nevrax.org/inc/img/t_docs.gif" ALT="Docs" HEIGHT=20 BORDER=0></A> +</td><td><IMG SRC="http://www.nevrax.org/inc/img/pixel.gif" WIDTH="1" HEIGHT="1" BORDER=0 ALT=""> +</td></tr></table> + + +<!-- block --> +<TABLE bgcolor="#dddddd" CELLSPACING=0 CELLPADDING=0 BORDER=0 width=100%><tr><td width=1% valign=middle><img width=6 height=14 hspace=2 vspace=2 src="http://www.nevrax.org/inc/img/reddots.gif"></TD> + <TD><B>Documentation</B></TD> + <TD ALIGN=RIGHT> </td> +</tr></table> +<!-- Generated by Doxygen 1.2.14 --> +<center> +<a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="namespaces.html">Namespace List</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="classes.html">Alphabetical List</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="namespacemembers.html">Namespace Members</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> <a class="qindexRef" doxygen="_cgi:http://www.nevrax.org/cgi-bin/nel-search.cgi" href="http://www.nevrax.org/cgi-bin/nel-search.cgi">Search</a> </center> +<hr><h1>service.cpp</h1><a href="service_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 +00009 <font class="comment">/* Copyright, 2001 Nevrax Ltd.</font> +00010 <font class="comment"> *</font> +00011 <font class="comment"> * This file is part of NEVRAX NEL.</font> +00012 <font class="comment"> * NEVRAX NEL is free software; you can redistribute it and/or modify</font> +00013 <font class="comment"> * it under the terms of the GNU General Public License as published by</font> +00014 <font class="comment"> * the Free Software Foundation; either version 2, or (at your option)</font> +00015 <font class="comment"> * any later version.</font> +00016 <font class="comment"> *</font> +00017 <font class="comment"> * NEVRAX NEL is distributed in the hope that it will be useful, but</font> +00018 <font class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</font> +00019 <font class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</font> +00020 <font class="comment"> * General Public License for more details.</font> +00021 <font class="comment"> *</font> +00022 <font class="comment"> * You should have received a copy of the GNU General Public License</font> +00023 <font class="comment"> * along with NEVRAX NEL; see the file COPYING. If not, write to the</font> +00024 <font class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,</font> +00025 <font class="comment"> * MA 02111-1307, USA.</font> +00026 <font class="comment"> */</font> +00027 +00028 <font class="preprocessor">#include "<a class="code" href="stdnet_8h.html">stdnet.h</a>"</font> +00029 +00030 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +00031 <font class="preprocessor"></font> +00032 <font class="comment">//</font> +00033 <font class="comment">// Includes</font> +00034 <font class="comment">//</font> +00035 +00036 <font class="comment">// these defines is for IsDebuggerPresent(). it'll not compile on windows 95</font> +00037 <font class="comment">// just comment this and the IsDebuggerPresent to compile on windows 95</font> +00038 <font class="preprocessor"># define _WIN32_WINDOWS 0x0410</font> +00039 <font class="preprocessor"></font><font class="preprocessor"># define WINVER 0x0400</font> +00040 <font class="preprocessor"></font><font class="preprocessor"># include <windows.h></font> +00041 <font class="preprocessor"># include <direct.h></font> +00042 +00043 <font class="preprocessor">#elif defined NL_OS_UNIX</font> +00044 <font class="preprocessor"></font> +00045 <font class="preprocessor"># include <<a class="code" href="unistd_8h.html">unistd.h</a>></font> +00046 +00047 <font class="preprocessor">#endif</font> +00048 <font class="preprocessor"></font> +00049 <font class="preprocessor">#include <stdlib.h></font> +00050 <font class="preprocessor">#include <signal.h></font> +00051 +00052 <font class="preprocessor">#include "<a class="code" href="config__file_8h.html">nel/misc/config_file.h</a>"</font> +00053 <font class="preprocessor">#include "<a class="code" href="displayer_8h.html">nel/misc/displayer.h</a>"</font> +00054 <font class="preprocessor">#include "<a class="code" href="mutex_8h.html">nel/misc/mutex.h</a>"</font> +00055 <font class="preprocessor">#include "<a class="code" href="window__displayer_8h.html">nel/misc/window_displayer.h</a>"</font> +00056 <font class="preprocessor">#include "<a class="code" href="gtk__displayer_8h.html">nel/misc/gtk_displayer.h</a>"</font> +00057 <font class="preprocessor">#include "<a class="code" href="win__displayer_8h.html">nel/misc/win_displayer.h</a>"</font> +00058 <font class="preprocessor">#include "<a class="code" href="path_8h.html">nel/misc/path.h</a>"</font> +00059 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00060 <font class="preprocessor">#include "<a class="code" href="report_8h.html">nel/misc/report.h</a>"</font> +00061 +00062 <font class="preprocessor">#include "<a class="code" href="naming__client_8h.html">nel/net/naming_client.h</a>"</font> +00063 <font class="preprocessor">#include "<a class="code" href="service_8h.html">nel/net/service.h</a>"</font> +00064 <font class="preprocessor">#include "<a class="code" href="unified__network_8h.html">nel/net/unified_network.h</a>"</font> +00065 <font class="preprocessor">#include "<a class="code" href="net__manager_8h.html">nel/net/net_manager.h</a>"</font> +00066 <font class="preprocessor">#include "<a class="code" href="net__displayer_8h.html">nel/net/net_displayer.h</a>"</font> +00067 <font class="preprocessor">#include "<a class="code" href="email_8h.html">nel/net/email.h</a>"</font> +00068 <font class="preprocessor">#include "<a class="code" href="varpath_8h.html">nel/net/varpath.h</a>"</font> +00069 +00070 <font class="preprocessor">#include "<a class="code" href="hierarchical__timer_8h.html">nel/misc/hierarchical_timer.h</a>"</font> +00071 +00072 +00073 <font class="comment">//</font> +00074 <font class="comment">// Namespace</font> +00075 <font class="comment">//</font> +00076 +00077 <font class="keyword">using</font> <font class="keyword">namespace </font>std; +00078 <font class="keyword">using</font> <font class="keyword">namespace </font>NLMISC; +00079 +00080 +00081 <font class="keyword">namespace </font>NLNET +00082 { +00083 +00084 +00085 <font class="comment">//</font> +00086 <font class="comment">// Constants</font> +00087 <font class="comment">//</font> +00088 +00089 <font class="keyword">static</font> <font class="keyword">const</font> sint <a class="code" href="namespaceNLNET.html#a54">Signal</a>[] = { +00090 SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM +00091 }; +00092 +00093 <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font> *<a class="code" href="namespaceNLNET.html#a55">SignalName</a>[]= +00094 { +00095 <font class="stringliteral">"SIGABRT"</font>, <font class="stringliteral">"SIGFPE"</font>, <font class="stringliteral">"SIGILL"</font>, <font class="stringliteral">"SIGINT"</font>, <font class="stringliteral">"SIGSEGV"</font>, <font class="stringliteral">"SIGTERM"</font> +00096 }; +00097 +00098 +00099 <font class="comment">//</font> +00100 <font class="comment">// Variables</font> +00101 <font class="comment">//</font> +00102 +00103 +00104 <font class="comment">// class static member</font> +<a name="l00105"></a><a class="code" href="classNLNET_1_1IService.html#z354_20">00105</a> IService *IService::_Instance = NULL; +00106 +00107 <font class="keyword">static</font> sint <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = 0; +00108 +00109 <font class="comment">// services stat</font> +00110 <font class="keyword">static</font> sint32 <a class="code" href="namespaceNLNET.html#a57">NetSpeedLoop</a>, <a class="code" href="namespaceNLNET.html#a58">UserSpeedLoop</a>; +00111 +00112 <font class="comment">// this is the thread that initialized the signal redirection</font> +00113 <font class="comment">// we ll ignore other thread signals</font> +00114 <font class="keyword">static</font> uint <a class="code" href="namespaceNLNET.html#a59">SignalisedThread</a>; +00115 +00116 <font class="keyword">static</font> CFileDisplayer fd; +00117 <font class="keyword">static</font> CNetDisplayer <a class="code" href="namespaceNLNET.html#a116">commandDisplayer</a>(<font class="keyword">false</font>); +00118 <font class="keyword">static</font> CLog <a class="code" href="namespaceNLNET.html#a61">commandLog</a>; +00119 +00120 +00121 <font class="comment">//</font> +00122 <font class="comment">// Callback managing</font> +00123 <font class="comment">//</font> +00124 +00125 <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a117">serviceGetView</a> (uint32 rid, <font class="keyword">const</font> string &rawvarpath, vector<string> &vara, vector<string> &vala) +00126 { +00127 string str; +00128 CLog logDisplayVars; +00129 CMemDisplayer mdDisplayVars; +00130 logDisplayVars.addDisplayer (&mdDisplayVars); +00131 +00132 <a class="code" href="classCVarPath.html">CVarPath</a> varpath(rawvarpath); +00133 +00134 <font class="comment">// add default row</font> +00135 vara.push_back (<font class="stringliteral">"service"</font>); +00136 +00137 vala.push_back (IService::getInstance ()->getServiceUnifiedName()); +00138 +00139 <font class="keywordflow">for</font> (uint j = 0; j < varpath.<a class="code" href="classCVarPath.html#m0">Destination</a>.size (); j++) +00140 { +00141 string cmd = varpath.<a class="code" href="classCVarPath.html#m0">Destination</a>[j].first; +00142 +00143 <font class="comment">// replace = with space to execute the command</font> +00144 uint pos = cmd.find(<font class="stringliteral">"="</font>); +00145 <font class="keywordflow">if</font> (pos != string::npos) +00146 cmd[pos] = <font class="charliteral">' '</font>; +00147 +00148 mdDisplayVars.clear (); +00149 ICommand::execute(cmd, logDisplayVars, <font class="keyword">true</font>); +00150 <font class="keyword">const</font> std::deque<std::string> &strs = mdDisplayVars.lockStrings(); +00151 <font class="keywordflow">if</font> (strs.size()>0) +00152 { +00153 string s_ = strs[0]; +00154 +00155 uint32 pos = strs[0].find(<font class="stringliteral">"="</font>); +00156 <font class="keywordflow">if</font>(pos != string::npos && pos + 2 < strs[0].size()) +00157 { +00158 uint32 pos2 = string::npos; +00159 <font class="keywordflow">if</font>(strs[0][strs[0].size()-1] == <font class="charliteral">'\n'</font>) +00160 pos2 = strs[0].size() - pos - 2 - 1; +00161 +00162 str = strs[0].substr (pos+2, pos2); +00163 } +00164 <font class="keywordflow">else</font> +00165 { +00166 str = <font class="stringliteral">"???"</font>; +00167 } +00168 } +00169 <font class="keywordflow">else</font> +00170 { +00171 str = <font class="stringliteral">"???"</font>; +00172 } +00173 mdDisplayVars.unlockStrings(); +00174 +00175 <font class="keywordflow">if</font> (pos != string::npos) +00176 vara.push_back(cmd.substr(0, pos)); +00177 <font class="keywordflow">else</font> +00178 vara.push_back(cmd); +00179 +00180 vala.push_back (str); +00181 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Add to result view '%s' = '%s'"</font>, varpath.<a class="code" href="classCVarPath.html#m0">Destination</a>[j].first.c_str(), str.c_str()); +00182 } +00183 +00184 } +00185 +00186 <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a118">servcbGetView</a> (CMessage &msgin, <font class="keyword">const</font> std::string &serviceName, uint16 sid) +00187 { +00188 uint32 rid; +00189 string rawvarpath; +00190 +00191 msgin.serial (rid); +00192 msgin.serial (rawvarpath); +00193 +00194 vector<string> vara; +00195 vector<string> vala; +00196 +00197 <a class="code" href="namespaceNLNET.html#a117">serviceGetView</a> (rid, rawvarpath, vara, vala); +00198 +00199 CMessage msgout(<font class="stringliteral">"VIEW"</font>); +00200 msgout.serial(rid); +00201 +00202 msgout.serialCont (vara); +00203 msgout.serialCont (vala); +00204 +00205 CUnifiedNetwork::getInstance ()->send (sid, msgout); +00206 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Sent result view to service '%s-%hu'"</font>, serviceName.c_str(), sid); +00207 } +00208 +00209 <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a119">AESConnection</a> (<font class="keyword">const</font> string &serviceName, uint16 sid, <font class="keywordtype">void</font> *arg) +00210 { +00211 <font class="comment">// established a connection to the AES, identify myself</font> +00212 +00213 <font class="comment">//</font> +00214 <font class="comment">// Sends the identification message with the name of the service and all commands available on this service</font> +00215 <font class="comment">//</font> +00216 +00217 CMessage msgout (<font class="stringliteral">"SID"</font>); +00218 uint32 pid = getpid (); +00219 msgout.serial (IService::getInstance()->_AliasName, IService::getInstance()->_LongName, pid); +00220 ICommand::serialCommands (msgout); +00221 CUnifiedNetwork::getInstance()->send(<font class="stringliteral">"AES"</font>, msgout); +00222 +00223 <font class="keywordflow">if</font> (IService::getInstance()->_Initialized) +00224 { +00225 CMessage msgout2 (<font class="stringliteral">"SR"</font>); +00226 CUnifiedNetwork::getInstance()->send(<font class="stringliteral">"AES"</font>, msgout2); +00227 } +00228 +00229 <font class="comment">// add the displayer to the standard logger</font> +00230 <font class="comment">// TSockId hid;</font> +00231 <font class="comment">// CCallbackClient *client = dynamic_cast<CCallbackClient *>(CUnifiedNetwork::getInstance()->getNetBase("AES", hid));</font> +00232 <font class="comment">// commandDisplayer.setLogServer (client);</font> +00233 <font class="comment">// commandLog.addDisplayer (&commandDisplayer);</font> +00234 } +00235 +00236 +00237 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a120">AESDisconnection</a> (<font class="keyword">const</font> std::string &serviceName, uint16 sid, <font class="keywordtype">void</font> *arg) +00238 { +00239 <font class="comment">// commandLog.removeDisplayer (&commandDisplayer);</font> +00240 } +00241 +00242 +00243 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a121">cbExecCommand</a> (CMessage &msgin, <font class="keyword">const</font> std::string &serviceName, uint16 sid) +00244 { +00245 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"AES: Deprecated function call cbExecCommand"</font>); +00246 +00247 <font class="comment">/* string command;</font> +00248 <font class="comment"> msgin.serial (command);</font> +00249 <font class="comment"></font> +00250 <font class="comment"> ICommand::execute (command, commandLog);</font> +00251 <font class="comment">*/</font>} +00252 +00253 +00254 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a122">cbStopService</a> (CMessage &msgin, <font class="keyword">const</font> std::string &serviceName, uint16 sid) +00255 { +00256 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Receive a stop from service %s-%d, need to quit"</font>, serviceName.c_str(), sid); +00257 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = 0xFFFF; +00258 } +00259 +00260 +00261 +00262 <font class="comment">// layer 5</font> +00263 <font class="keyword">static</font> TUnifiedCallbackItem <a class="code" href="namespaceNLNET.html#a62">AESCallbackArray</a>[] = +00264 { +00265 { <font class="stringliteral">"STOPS"</font>, <a class="code" href="namespaceNLNET.html#a122">cbStopService</a> }, +00266 { <font class="stringliteral">"EXEC_COMMAND"</font>, <a class="code" href="namespaceNLNET.html#a121">cbExecCommand</a> }, +00267 { <font class="stringliteral">"GET_VIEW"</font>, <a class="code" href="namespaceNLNET.html#a118">servcbGetView</a> }, +00268 }; +00269 +00270 <font class="comment">//</font> +00271 <font class="comment">// Signals managing</font> +00272 <font class="comment">//</font> +00273 +00274 <font class="comment">// This function is called when a signal comes</font> +00275 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a123">sigHandler</a>(<font class="keywordtype">int</font> Sig) +00276 { +00277 <font class="comment">// redirect the signal for the next time</font> +00278 signal(Sig, <a class="code" href="namespaceNLNET.html#a123">sigHandler</a>); +00279 +00280 <font class="comment">// find the signal</font> +00281 <font class="keywordflow">for</font> (<font class="keywordtype">int</font> i = 0; i < (int)(<font class="keyword">sizeof</font>(Signal)/<font class="keyword">sizeof</font>(<a class="code" href="namespaceNLNET.html#a54">Signal</a>[0])); i++) +00282 { +00283 <font class="keywordflow">if</font> (Sig == <a class="code" href="namespaceNLNET.html#a54">Signal</a>[i]) +00284 { +00285 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLMISC.html#a237">getThreadId</a> () != <a class="code" href="namespaceNLNET.html#a59">SignalisedThread</a>) +00286 { +00287 <a class="code" href="debug_8h.html#a0">nldebug</a> (<font class="stringliteral">"Not the main thread received the signal (%s, %d), ignore it"</font>, <a class="code" href="namespaceNLNET.html#a55">SignalName</a>[i],Sig); +00288 <font class="keywordflow">return</font>; +00289 } +00290 <font class="keywordflow">else</font> +00291 { +00292 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Signal %s (%d) received"</font>, <a class="code" href="namespaceNLNET.html#a55">SignalName</a>[i], Sig); +00293 <font class="keywordflow">switch</font> (Sig) +00294 { +00295 <font class="keywordflow">case</font> SIGABRT : +00296 <font class="keywordflow">case</font> SIGILL : +00297 <font class="keywordflow">case</font> SIGINT : +00298 <font class="keywordflow">case</font> SIGSEGV : +00299 <font class="keywordflow">case</font> SIGTERM : +00300 <font class="comment">// you should not call a function and system function like printf in a SigHandle because</font> +00301 <font class="comment">// signal-handler routines are usually called asynchronously when an interrupt occurs.</font> +00302 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> == 0) +00303 { +00304 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Receive a signal that said that i must exit"</font>); +00305 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = Sig; +00306 <font class="keywordflow">return</font>; +00307 } +00308 <font class="keywordflow">else</font> +00309 { +00310 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Signal already received, launch the brutal exit"</font>); +00311 exit (EXIT_FAILURE); +00312 } +00313 <font class="keywordflow">break</font>; +00314 } +00315 } +00316 } +00317 } +00318 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Unknown signal received (%d)"</font>, Sig); +00319 } +00320 +00321 <font class="comment">// Initialise the signal redirection</font> +00322 <font class="keyword">static</font> <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a124">initSignal</a>() +00323 { +00324 <a class="code" href="namespaceNLNET.html#a59">SignalisedThread</a> = <a class="code" href="namespaceNLMISC.html#a237">getThreadId</a> (); +00325 <font class="preprocessor">#ifdef NL_DEBUG</font> +00326 <font class="preprocessor"></font> <font class="comment">// in debug mode, we only trap the SIGINT signal</font> +00327 signal(<a class="code" href="namespaceNLNET.html#a54">Signal</a>[3], <a class="code" href="namespaceNLNET.html#a123">sigHandler</a>); +00328 <font class="comment">//nldebug("Signal : %s (%d) trapped", SignalName[3], Signal[3]);</font> +00329 <font class="preprocessor">#else</font> +00330 <font class="preprocessor"></font> <font class="comment">// in release, redirect all signals</font> +00331 <font class="comment">/* don't redirect now because to hard to debug...</font> +00332 <font class="comment"> for (int i = 0; i < (int)(sizeof(Signal)/sizeof(Signal[0])); i++)</font> +00333 <font class="comment"> {</font> +00334 <font class="comment"> signal(Signal[i], sigHandler);</font> +00335 <font class="comment"> nldebug("Signal %s (%d) trapped", SignalName[i], Signal[i]);</font> +00336 <font class="comment"> }</font> +00337 <font class="comment">*/</font> +00338 <font class="preprocessor">#endif</font> +00339 <font class="preprocessor"></font>} +00340 +00341 <font class="comment">//</font> +00342 <font class="comment">// Class implementation</font> +00343 <font class="comment">//</font> +00344 +00345 <font class="comment">// Ctor</font> +<a name="l00346"></a><a class="code" href="classNLNET_1_1IService.html#z352_5">00346</a> IService::IService() : +00347 WindowDisplayer(NULL), +00348 _Port(0), +00349 _RecordingState(CCallbackNetBase::Off), +00350 _UpdateTimeout(100), +00351 _SId(0), +00352 _Status(0), +00353 _Initialized(false), +00354 _ResetMeasures(false) +00355 { +00356 <font class="comment">// Singleton</font> +00357 <a class="code" href="debug_8h.html#a6">nlassert</a>( <a class="code" href="classNLNET_1_1IService.html#z354_20">_Instance</a> == NULL ); +00358 +00359 <a class="code" href="classNLNET_1_1IService.html#z354_20">_Instance</a> = <font class="keyword">this</font>; +00360 } +00361 +00362 +00363 +<a name="l00364"></a><a class="code" href="classNLNET_1_1IService.html#z350_7">00364</a> <font class="keywordtype">bool</font> IService::haveArg (<font class="keywordtype">char</font> argName) +00365 { +00366 <font class="keywordflow">for</font> (uint32 i = 0; i < <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>.size(); i++) +00367 { +00368 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i].size() >= 2 && <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i][0] == <font class="charliteral">'-'</font>) +00369 { +00370 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i][1] == argName) +00371 { +00372 <font class="keywordflow">return</font> <font class="keyword">true</font>; +00373 } +00374 } +00375 } +00376 <font class="keywordflow">return</font> <font class="keyword">false</font>; +00377 } +00378 +<a name="l00379"></a><a class="code" href="classNLNET_1_1IService.html#z350_8">00379</a> string IService::getArg (<font class="keywordtype">char</font> argName) +00380 { +00381 <font class="keywordflow">for</font> (uint32 i = 0; i < <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>.size(); i++) +00382 { +00383 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i].size() >= 2 && <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i][0] == <font class="charliteral">'-'</font>) +00384 { +00385 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i][1] == argName) +00386 { +00387 <font class="keywordflow">return</font> <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>[i].substr(2); +00388 } +00389 } +00390 } +00391 <font class="keywordflow">throw</font> Exception (<font class="stringliteral">"Parameter '-%c' is not found in command line"</font>, argName); +00392 } +00393 +00394 +<a name="l00395"></a><a class="code" href="classNLNET_1_1IService.html#z352_2">00395</a> <font class="keywordtype">void</font> IService::setArgs (<font class="keyword">const</font> <font class="keywordtype">char</font> *args) +00396 { +00397 <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>.push_back (<font class="stringliteral">"<ProgramName>"</font>); +00398 +00399 string sargs (args); +00400 uint32 pos1 = 0, pos2 = 0; +00401 +00402 <font class="keywordflow">do</font> +00403 { +00404 pos1 = sargs.find_first_not_of (<font class="stringliteral">" "</font>, pos2); +00405 <font class="keywordflow">if</font> (pos1 == string::npos) <font class="keywordflow">break</font>; +00406 pos2 = sargs.find_first_of (<font class="stringliteral">" "</font>, pos1); +00407 <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>.push_back (sargs.substr (pos1, pos2-pos1)); +00408 } +00409 <font class="keywordflow">while</font> (pos2 != string::npos); +00410 } +00411 +<a name="l00412"></a><a class="code" href="classNLNET_1_1IService.html#z352_1">00412</a> <font class="keywordtype">void</font> IService::setArgs (<font class="keywordtype">int</font> argc, <font class="keyword">const</font> <font class="keywordtype">char</font> **argv) +00413 { +00414 <font class="keywordflow">for</font> (sint i = 0; i < argc; i++) +00415 { +00416 <a class="code" href="classNLNET_1_1IService.html#z354_0">_Args</a>.push_back (argv[i]); +00417 } +00418 } +00419 +00420 <font class="comment">/*</font> +00421 <font class="comment"> * Returns a pointer to the CCallbackServer object</font> +00422 <font class="comment"> */</font> +<a name="l00423"></a><a class="code" href="classNLNET_1_1IService.html#z350_10">00423</a> CCallbackServer *IService::getServer() +00424 { +00425 <font class="keywordflow">return</font> NULL; +00426 } +00427 +00428 +00429 +00430 <font class="keywordtype">void</font> <a class="code" href="namespaceNLNET.html#a125">cbLogFilter</a> (CConfigFile::CVar &var) +00431 { +00432 CLog *log = NULL; +00433 <font class="keywordflow">if</font> (var.Name == <font class="stringliteral">"NegFiltersDebug"</font>) +00434 { +00435 log = <a class="code" href="namespaceNLMISC.html#a11">DebugLog</a>; +00436 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Updating negative filter on debug from config file"</font>); +00437 } +00438 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (var.Name == <font class="stringliteral">"NegFiltersInfo"</font>) +00439 { +00440 log = <a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>; +00441 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Updating negative filter on info from config file"</font>); +00442 } +00443 <font class="keywordflow">else</font> +00444 { +00445 <a class="code" href="debug_8h.html#a12">nlstop</a>; +00446 } +00447 +00448 <font class="comment">// remove all old filter from configfile</font> +00449 CConfigFile::CVar &oldvar = IService::getInstance()->ConfigFile.getVar (var.Name); +00450 <font class="keywordflow">for</font> (sint j = 0; j < oldvar.size(); j++) +00451 { +00452 log->removeFilter (oldvar.asString(j).c_str()); +00453 } +00454 +00455 <font class="comment">// add all new filter from configfile</font> +00456 <font class="keywordflow">for</font> (sint i = 0; i < var.size(); i++) +00457 { +00458 log->addNegativeFilter (var.asString(i).c_str()); +00459 } +00460 } +00461 +00462 +00463 +00464 +00465 +00466 +00467 +00468 +00469 <font class="comment">//</font> +00470 <font class="comment">// The main function of the service</font> +00471 <font class="comment">//</font> +00472 +<a name="l00473"></a><a class="code" href="classNLNET_1_1IService.html#z352_0">00473</a> sint IService::main (<font class="keyword">const</font> <font class="keywordtype">char</font> *serviceShortName, <font class="keyword">const</font> <font class="keywordtype">char</font> *serviceLongName, uint16 servicePort, <font class="keyword">const</font> <font class="keywordtype">char</font> *configDir, <font class="keyword">const</font> <font class="keywordtype">char</font> *logDir) +00474 { +00475 <font class="keywordtype">bool</font> userInitCalled = <font class="keyword">false</font>; +00476 <font class="keywordtype">bool</font> resyncEvenly = <font class="keyword">false</font>; +00477 CConfigFile::CVar *var = NULL; +00478 +00479 <font class="comment">// a short name service can't be a number</font> +00480 <a class="code" href="debug_8h.html#a6">nlassert</a> (atoi(serviceShortName) == 0); +00481 +00482 <font class="keywordflow">try</font> +00483 { +00484 <font class="comment">//</font> +00485 <font class="comment">// Init parameters</font> +00486 <font class="comment">//</font> +00487 +00488 <a class="code" href="classNLNET_1_1IService.html#z354_11">_ConfigDir</a> = CPath::standardizePath(configDir); +00489 <a class="code" href="classNLNET_1_1IService.html#z354_12">_LogDir</a> = CPath::standardizePath(logDir); +00490 <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a> = serviceShortName; +00491 <a class="code" href="classNLNET_1_1IService.html#z354_4">_LongName</a> = serviceLongName; +00492 +00493 <font class="comment">// Set the process name</font> +00494 CLog::setProcessName (<a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>); +00495 +00496 <a class="code" href="namespaceNLMISC.html#a275">setReportEmailFunction</a> ((<font class="keywordtype">void</font>*)sendEmail); +00497 <a class="code" href="namespaceNLNET.html#a79">setDefaultEmailParams</a> (<font class="stringliteral">"gw.nevrax.com"</font>, <font class="stringliteral">""</font>, <font class="stringliteral">"lecroart@nevrax.com"</font>); +00498 +00499 <font class="comment">// get the path where to run the service if any in the command line</font> +00500 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'A'</font>)) +00501 { +00502 <a class="code" href="classNLNET_1_1IService.html#z354_13">_RunningPath</a> = CPath::standardizePath(<a class="code" href="classNLNET_1_1IService.html#z350_8">getArg</a>(<font class="charliteral">'A'</font>)); +00503 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +00504 <font class="preprocessor"></font> _chdir (<a class="code" href="classNLNET_1_1IService.html#z354_13">_RunningPath</a>.c_str()); +00505 <font class="preprocessor">#else</font> +00506 <font class="preprocessor"></font> chdir (<a class="code" href="classNLNET_1_1IService.html#z354_13">_RunningPath</a>.c_str()); +00507 <font class="preprocessor">#endif</font> +00508 <font class="preprocessor"></font> } +00509 +00510 <font class="comment">//</font> +00511 <font class="comment">// Init debug/log stuffs (must be first things otherwise we can't log if errors)</font> +00512 <font class="comment">//</font> +00513 +00514 <font class="comment">// get the log dir if any in the command line</font> +00515 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'L'</font>)) +00516 <a class="code" href="classNLNET_1_1IService.html#z354_12">_LogDir</a> = CPath::standardizePath(<a class="code" href="classNLNET_1_1IService.html#z350_8">getArg</a>(<font class="charliteral">'L'</font>)); +00517 +00518 <font class="comment">// get the config file dir if any in the command line</font> +00519 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'C'</font>)) +00520 <a class="code" href="classNLNET_1_1IService.html#z354_11">_ConfigDir</a> = CPath::standardizePath(<a class="code" href="classNLNET_1_1IService.html#z350_8">getArg</a>(<font class="charliteral">'C'</font>)); +00521 +00522 <a class="code" href="namespaceNLMISC.html#a247">createDebug</a> (<a class="code" href="classNLNET_1_1IService.html#z354_12">_LogDir</a>.c_str(), <font class="keyword">false</font>); +00523 +00524 <font class="comment">//DebugLog->addNegativeFilter ("NETL");</font> +00525 +00526 <font class="comment">// we create the log with service name filename ("test_service.log" for example)</font> +00527 fd.setParam (<a class="code" href="classNLNET_1_1IService.html#z354_12">_LogDir</a> + <a class="code" href="classNLNET_1_1IService.html#z354_4">_LongName</a> + <font class="stringliteral">".log"</font>, <font class="keyword">false</font>); +00528 +00529 <a class="code" href="namespaceNLMISC.html#a11">DebugLog</a>->addDisplayer (&fd); +00530 <a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>->addDisplayer (&fd); +00531 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->addDisplayer (&fd); +00532 <a class="code" href="namespaceNLMISC.html#a12">AssertLog</a>->addDisplayer (&fd); +00533 <a class="code" href="namespaceNLMISC.html#a8">ErrorLog</a>->addDisplayer (&fd); +00534 +00535 +00536 <font class="comment">//</font> +00537 <font class="comment">// Init the hierarchical timer</font> +00538 <font class="comment">//</font> +00539 +00540 CHTimer::startBench(<font class="keyword">false</font>, <font class="keyword">true</font>); +00541 +00542 +00543 <font class="comment">//</font> +00544 <font class="comment">// Load the config file</font> +00545 <font class="comment">//</font> +00546 +00547 <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a5">load</a> (<a class="code" href="classNLNET_1_1IService.html#z354_11">_ConfigDir</a> + <a class="code" href="classNLNET_1_1IService.html#z354_4">_LongName</a> + <font class="stringliteral">".cfg"</font>); +00548 +00549 +00550 <font class="comment">//</font> +00551 <font class="comment">// Set the negatif filter from the config file</font> +00552 <font class="comment">//</font> +00553 +00554 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"NegFiltersDebug"</font>)) != NULL) +00555 { +00556 <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a11">setCallback</a> (<font class="stringliteral">"NegFiltersDebug"</font>, <a class="code" href="namespaceNLNET.html#a125">cbLogFilter</a>); +00557 <font class="keywordflow">for</font> (sint i = 0; i < var->size(); i++) +00558 { +00559 <a class="code" href="namespaceNLMISC.html#a11">DebugLog</a>->addNegativeFilter (var->asString(i).c_str()); +00560 } +00561 } +00562 +00563 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"NegFiltersInfo"</font>)) != NULL) +00564 { +00565 <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a11">setCallback</a> (<font class="stringliteral">"NegFiltersInfo"</font>, <a class="code" href="namespaceNLNET.html#a125">cbLogFilter</a>); +00566 <font class="keywordflow">for</font> (sint i = 0; i < var->size(); i++) +00567 { +00568 <a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>->addNegativeFilter (var->asString(i).c_str()); +00569 } +00570 } +00571 +00572 +00573 <font class="comment">//</font> +00574 <font class="comment">// Create the window if neeeded</font> +00575 <font class="comment">//</font> +00576 +00577 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"WindowStyle"</font>)) != NULL) +00578 { +00579 string disp = var->asString (); +00580 <font class="preprocessor">#ifdef NL_USE_GTK</font> +00581 <font class="preprocessor"></font> <font class="keywordflow">if</font> (disp == <font class="stringliteral">"GTK"</font>) +00582 { +00583 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> = <font class="keyword">new</font> CGtkDisplayer (<font class="stringliteral">"DEFAULT_WD"</font>); +00584 } +00585 <font class="preprocessor">#endif // NL_USE_GTK</font> +00586 <font class="preprocessor"></font> +00587 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +00588 <font class="preprocessor"></font> <font class="keywordflow">if</font> (disp == <font class="stringliteral">"WIN"</font>) +00589 { +00590 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> = <font class="keyword">new</font> CWinDisplayer (<font class="stringliteral">"DEFAULT_WD"</font>); +00591 } +00592 <font class="preprocessor">#endif // NL_OS_WINDOWS</font> +00593 <font class="preprocessor"></font> +00594 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> == NULL && disp != <font class="stringliteral">"NONE"</font>) +00595 { +00596 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Unknown value for the WindowStyle (should be GTK, WIN or NONE), use no window displayer"</font>); +00597 } +00598 } +00599 +00600 vector <pair<string,uint> > displayedVariables; +00601 <font class="comment">//uint speedNetLabel, speedUsrLabel, rcvLabel, sndLabel, rcvQLabel, sndQLabel, scrollLabel;</font> +00602 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> != NULL) +00603 { +00604 <font class="comment">//</font> +00605 <font class="comment">// Init window param if necessary</font> +00606 <font class="comment">//</font> +00607 +00608 sint <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>=-1, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>=-1, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>=-1, h=-1, fs=10; +00609 <font class="keywordtype">bool</font> iconified = <font class="keyword">false</font>, ww = <font class="keyword">false</font>; +00610 string fn; +00611 +00612 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"XWinParam"</font>)) != NULL) <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a> = var->asInt(); +00613 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"YWinParam"</font>)) != NULL) <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a> = var->asInt(); +00614 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"WWinParam"</font>)) != NULL) <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a> = var->asInt(); +00615 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"HWinParam"</font>)) != NULL) h = var->asInt(); +00616 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"HWinParam"</font>)) != NULL) iconified = var->asInt() == 1; +00617 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"FontSize"</font>)) != NULL) fs = var->asInt(); +00618 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"FontName"</font>)) != NULL) fn = var->asString(); +00619 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"WordWrap"</font>)) != NULL) ww = var->asInt() == 1; +00620 +00621 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'I'</font>)) iconified = <font class="keyword">true</font>; +00622 +00623 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a2">create</a> (string(<font class="stringliteral">"*INIT* "</font>) + <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a> + <font class="stringliteral">" "</font> + <a class="code" href="classNLNET_1_1IService.html#z354_4">_LongName</a>, iconified, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>, h, -1, fs, fn, ww); +00624 +00625 <a class="code" href="namespaceNLMISC.html#a11">DebugLog</a>->addDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +00626 <a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>->addDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +00627 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->addDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +00628 <a class="code" href="namespaceNLMISC.html#a8">ErrorLog</a>->addDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +00629 <a class="code" href="namespaceNLMISC.html#a12">AssertLog</a>->addDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +00630 +00631 <font class="comment">// adding default displayed variables</font> +00632 displayedVariables.push_back(make_pair(string(<font class="stringliteral">"NetLop|NetSpeedLoop"</font>), <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a3">createLabel</a> (<font class="stringliteral">"NetLop"</font>))); +00633 displayedVariables.push_back(make_pair(string(<font class="stringliteral">"UsrLop|UserSpeedLoop"</font>), <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a3">createLabel</a> (<font class="stringliteral">"UsrLop"</font>))); +00634 <font class="comment">// displayedVariables.push_back(make_pair(string("Rcv|ReceivedBytes"), WindowDisplayer->createLabel ("Rcv")));</font> +00635 <font class="comment">// displayedVariables.push_back(make_pair(string("Snd|SentBytes"), WindowDisplayer->createLabel ("Snd")));</font> +00636 <font class="comment">// displayedVariables.push_back(make_pair(string("RcvQ|ReceivedQueueSize"), WindowDisplayer->createLabel ("RcvQ")));</font> +00637 <font class="comment">// displayedVariables.push_back(make_pair(string("SndQ|SentQueueSize"), WindowDisplayer->createLabel ("SndQ")));</font> +00638 displayedVariables.push_back(make_pair(string(<font class="stringliteral">"|Scroller"</font>), <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a3">createLabel</a> (<font class="stringliteral">"NeL Rulez"</font>))); +00639 +00640 CConfigFile::CVar *<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a> = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"DisplayedVariables"</font>); +00641 <font class="keywordflow">if</font> (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a> != NULL) +00642 { +00643 <font class="keywordflow">for</font> (sint i = 0; i < <a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>->size(); i++) +00644 { +00645 displayedVariables.push_back(make_pair(<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>->asString(i), <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a3">createLabel</a> (<a class="code" href="driver__opengl__extension__def_8h.html#a368">v</a>->asString(i).c_str()))); +00646 } +00647 } +00648 } +00649 +00650 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Starting Service '%s' using NeL ("</font>__DATE__<font class="stringliteral">" "</font>__TIME__<font class="stringliteral">")"</font>, <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>.c_str()); +00651 +00652 <a class="code" href="classNLNET_1_1IService.html#z351_0">setStatus</a> (EXIT_SUCCESS); +00653 +00654 <font class="comment">//</font> +00655 <font class="comment">// Redirect signal if needed (in release mode only)</font> +00656 <font class="comment">//</font> +00657 +00658 <font class="preprocessor">#ifdef NL_OS_WINDOWS</font> +00659 <font class="preprocessor"></font><font class="preprocessor">#ifdef NL_RELEASE</font> +00660 <font class="preprocessor"></font> <a class="code" href="namespaceNLNET.html#a124">initSignal</a>(); +00661 <font class="preprocessor">#else</font> +00662 <font class="preprocessor"></font> <font class="comment">// don't install signal is the application is started in debug mode</font> +00663 <font class="keywordflow">if</font> (<a class="code" href="displayer_8cpp.html#a0">IsDebuggerPresent</a> ()) +00664 { +00665 <font class="comment">//nlinfo("Running with the debugger, don't redirect signals");</font> +00666 <a class="code" href="namespaceNLNET.html#a124">initSignal</a>(); +00667 } +00668 <font class="keywordflow">else</font> +00669 { +00670 <font class="comment">//nlinfo("Running without the debugger, redirect SIGINT signal");</font> +00671 <a class="code" href="namespaceNLNET.html#a124">initSignal</a>(); +00672 } +00673 <font class="preprocessor">#endif</font> +00674 <font class="preprocessor"></font><font class="preprocessor">#else // NL_OS_UNIX</font> +00675 <font class="preprocessor"></font> <a class="code" href="namespaceNLNET.html#a124">initSignal</a>(); +00676 <font class="preprocessor">#endif</font> +00677 <font class="preprocessor"></font> +00678 +00679 <font class="comment">//</font> +00680 <font class="comment">// Ignore SIGPIPE (broken pipe) on unix system</font> +00681 <font class="comment">//</font> +00682 +00683 <font class="preprocessor">#ifdef NL_OS_UNIX</font> +00684 <font class="preprocessor"></font> <font class="comment">// Ignore the SIGPIPE signal</font> +00685 sigset_t SigList; +00686 <font class="keywordtype">bool</font> IgnoredPipe = <font class="keyword">true</font>; +00687 <font class="keywordflow">if</font> (sigemptyset (&SigList) == -1) +00688 { +00689 perror(<font class="stringliteral">"sigemptyset()"</font>); +00690 IgnoredPipe = <font class="keyword">false</font>; +00691 } +00692 +00693 <font class="keywordflow">if</font> (sigaddset (&SigList, SIGPIPE) == -1) +00694 { +00695 perror(<font class="stringliteral">"sigaddset()"</font>); +00696 IgnoredPipe = <font class="keyword">false</font>; +00697 } +00698 +00699 <font class="keywordflow">if</font> (sigprocmask (SIG_BLOCK, &SigList, NULL) == -1) +00700 { +00701 perror(<font class="stringliteral">"sigprocmask()"</font>); +00702 IgnoredPipe = <font class="keyword">false</font>; +00703 } +00704 <a class="code" href="debug_8h.html#a0">nldebug</a> (<font class="stringliteral">"SIGPIPE %s"</font>, IgnoredPipe?<font class="stringliteral">"Ignored"</font>:<font class="stringliteral">"Not Ignored"</font>); +00705 <font class="preprocessor">#endif // NL_OS_UNIX</font> +00706 <font class="preprocessor"></font> +00707 +00708 <font class="comment">//</font> +00709 <font class="comment">// Initialize the network system</font> +00710 <font class="comment">//</font> +00711 +00712 string localhost; +00713 <font class="keywordflow">try</font> +00714 { +00715 <font class="comment">// Initialize WSAStartup and network stuffs</font> +00716 CSock::initNetwork(); +00717 +00718 <font class="comment">// Get the localhost name</font> +00719 localhost = CInetAddress::localHost().hostName(); +00720 } +00721 <font class="keywordflow">catch</font> (<a class="code" href="structNLNET_1_1ESocket.html">NLNET::ESocket</a> &) +00722 { +00723 localhost = <font class="stringliteral">"<UnknownHost>"</font>; +00724 } +00725 +00726 <font class="comment">// Set the localhost name and service name to the logger</font> +00727 CLog::setProcessName (localhost+<font class="stringliteral">"/"</font>+<a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>); +00728 +00729 <font class="comment">//</font> +00730 <font class="comment">// Initialize server parameters</font> +00731 <font class="comment">//</font> +00732 +00733 <font class="comment">// Get the port from config file or in the macro (overload the port set by the user init())</font> +00734 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a>(<font class="stringliteral">"Port"</font>)) != NULL) +00735 { +00736 <font class="comment">// set the listen port with the value in the config file if any</font> +00737 <a class="code" href="classNLNET_1_1IService.html#z354_1">_Port</a> = var->asInt(); +00738 } +00739 <font class="keywordflow">else</font> +00740 { +00741 <font class="comment">// set the listen port with the value in the NLNET_SERVICE_MAIN macro</font> +00742 <a class="code" href="classNLNET_1_1IService.html#z354_1">_Port</a> = servicePort; +00743 } +00744 +00745 <font class="comment">// set the listen port if there are a port arg in the command line</font> +00746 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'P'</font>)) +00747 { +00748 <a class="code" href="classNLNET_1_1IService.html#z354_1">_Port</a> = atoi(<a class="code" href="classNLNET_1_1IService.html#z350_8">getArg</a>(<font class="charliteral">'P'</font>).c_str()); +00749 } +00750 +00751 <font class="comment">// set the aliasname if is present in the command line</font> +00752 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z350_7">haveArg</a>(<font class="charliteral">'N'</font>)) +00753 { +00754 <a class="code" href="classNLNET_1_1IService.html#z354_5">_AliasName</a> = <a class="code" href="classNLNET_1_1IService.html#z350_8">getArg</a>(<font class="charliteral">'N'</font>); +00755 } +00756 +00757 <font class="comment">// Load the recording state from the config file</font> +00758 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"Rec"</font>)) != NULL) +00759 { +00760 string srecstate = var->asString(); +00761 strupr( srecstate ); +00762 <font class="keywordflow">if</font> ( srecstate == <font class="stringliteral">"RECORD"</font> ) +00763 { +00764 <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a> = CCallbackNetBase::Record; +00765 <a class="code" href="debug_8h.html#a1">nlinfo</a>( <font class="stringliteral">"Service recording messages"</font> ); +00766 } +00767 <font class="keywordflow">else</font> <font class="keywordflow">if</font> ( srecstate == <font class="stringliteral">"REPLAY"</font> ) +00768 { +00769 <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a> = CCallbackNetBase::Replay; +00770 <a class="code" href="debug_8h.html#a1">nlinfo</a>( <font class="stringliteral">"Service replaying messages"</font> ); +00771 } +00772 <font class="keywordflow">else</font> +00773 { +00774 <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a> = CCallbackNetBase::Off; +00775 } +00776 } +00777 <font class="keywordflow">else</font> +00778 { +00779 <font class="comment">// Not found</font> +00780 <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a> = CCallbackNetBase::Off; +00781 } +00782 +00783 <font class="comment">// Load the default stream format</font> +00784 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"StringMsgFormat"</font>)) != NULL) +00785 { +00786 CMessage::setDefaultStringMode( var->asInt() == 1 ); +00787 } +00788 <font class="keywordflow">else</font> +00789 { +00790 <font class="comment">// Not found => binary</font> +00791 CMessage::setDefaultStringMode( <font class="keyword">false</font> ); +00792 } +00793 +00794 <font class="comment">/*</font> +00795 <font class="comment"> //</font> +00796 <font class="comment"> // Layer4 Startup (Connect to the Naming Service (except for the NS itself and Login Service))</font> +00797 <font class="comment"> //</font> +00798 <font class="comment"></font> +00799 <font class="comment"> if (IService::_ShortName != "NS" && IService::_ShortName != "LS" && IService::_ShortName != "AES" && IService::_ShortName != "AS")</font> +00800 <font class="comment"> {</font> +00801 <font class="comment"> bool ok = false;</font> +00802 <font class="comment"> while (!ok)</font> +00803 <font class="comment"> {</font> +00804 <font class="comment"> // read the naming service address from the config file</font> +00805 <font class="comment"> CInetAddress loc(ConfigFile.getVar("NSHost").asString(), ConfigFile.getVar("NSPort").asInt());</font> +00806 <font class="comment"> try</font> +00807 <font class="comment"> {</font> +00808 <font class="comment"> CNetManager::init( &loc, _RecordingState );</font> +00809 <font class="comment"> ok = true;</font> +00810 <font class="comment"> }</font> +00811 <font class="comment"> catch (ESocketConnectionFailed &)</font> +00812 <font class="comment"> {</font> +00813 <font class="comment"> nlwarning ("Could not connect to the Naming Service (%s). Retrying in a few seconds...", loc.asString().c_str());</font> +00814 <font class="comment"> nlSleep (5000);</font> +00815 <font class="comment"> }</font> +00816 <font class="comment"> }</font> +00817 <font class="comment"> }</font> +00818 <font class="comment"> else</font> +00819 <font class="comment"> {</font> +00820 <font class="comment"> CNetManager::init( NULL, _RecordingState );</font> +00821 <font class="comment"> }</font> +00822 <font class="comment">*/</font> +00823 +00827 +00828 <font class="comment">// get the sid</font> +00829 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"SId"</font>)) != NULL) +00830 { +00831 sint32 sid = var->asInt(); +00832 <font class="keywordflow">if</font> (sid<=0 || sid>255) +00833 { +00834 <a class="code" href="debug_8h.html#a2">nlwarning</a>(<font class="stringliteral">"Bad SId value in the config file, %d is not in [0;255] range"</font>, sid); +00835 <a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a> = 0; +00836 } +00837 <font class="keywordflow">else</font> +00838 { +00839 <a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a> = (uint8) sid; +00840 } +00841 } +00842 <font class="keywordflow">else</font> +00843 { +00844 <font class="comment">// ok, SId not found, use dynamic sid</font> +00845 <a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a> = 0; +00846 } +00847 +00848 +00849 <font class="comment">// look if we don't want to use NS</font> +00850 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"DontUseNS"</font>)) != NULL) +00851 { +00852 <font class="comment">// if we set the value in the config file, get it</font> +00853 <a class="code" href="classNLNET_1_1IService.html#z354_17">_DontUseNS</a> = (var->asInt() == 1); +00854 } +00855 <font class="keywordflow">else</font> +00856 { +00857 <font class="comment">// if not, we use ns only if service is not ns, ls, aes, as</font> +00858 <a class="code" href="classNLNET_1_1IService.html#z354_17">_DontUseNS</a> = <font class="keyword">false</font>; +00859 } +00860 +00861 <font class="comment">//</font> +00862 <font class="comment">// Register all network associations (must be before the CUnifiedNetwork::getInstance()->init)</font> +00863 <font class="comment">//</font> +00864 +00865 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"Networks"</font>)) != NULL) +00866 { +00867 <font class="keywordflow">for</font> (uint8 i = 0; i < var->size (); i++) +00868 CUnifiedNetwork::getInstance()->addNetworkAssociation (var->asString(i), i); +00869 } +00870 +00871 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"DefaultNetworks"</font>)) != NULL) +00872 { +00873 <font class="keywordflow">for</font> (uint8 i = 0; i < var->size (); i++) +00874 CUnifiedNetwork::getInstance()->addDefaultNetwork(var->asString(i)); +00875 } +00876 +00877 <font class="comment">// normal setup for the common services</font> +00878 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#z354_17">_DontUseNS</a>) +00879 { +00880 <font class="keywordtype">bool</font> ok = <font class="keyword">false</font>; +00881 <font class="keywordflow">while</font> (!ok) +00882 { +00883 <font class="comment">// read the naming service address from the config file</font> +00884 string LSAddr = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a2">getVar</a> (<font class="stringliteral">"NSHost"</font>).asString(); +00885 +00886 <font class="comment">// if there's no port to the NS, use the default one 50000</font> +00887 <font class="keywordflow">if</font> (LSAddr.find(<font class="stringliteral">":"</font>) == string::npos) +00888 LSAddr += <font class="stringliteral">":50000"</font>; +00889 +00890 CInetAddress loc(LSAddr); +00891 <font class="keywordflow">try</font> +00892 { +00893 CUnifiedNetwork::getInstance()->init (&loc, <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a>, <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>, <a class="code" href="classNLNET_1_1IService.html#z354_1">_Port</a>, <a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a>); +00894 +00895 ok = <font class="keyword">true</font>; +00896 } +00897 <font class="keywordflow">catch</font> (ESocketConnectionFailed &) +00898 { +00899 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Could not connect to the Naming Service (%s). Retrying in a few seconds..."</font>, loc.asString().c_str()); +00900 <a class="code" href="namespaceNLMISC.html#a236">nlSleep</a> (5000); +00901 } +00902 } +00903 } +00904 <font class="keywordflow">else</font> +00905 { +00906 CUnifiedNetwork::getInstance()->init(NULL, <a class="code" href="classNLNET_1_1IService.html#z354_2">_RecordingState</a>, <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>, <a class="code" href="classNLNET_1_1IService.html#z354_1">_Port</a>, <a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a>); +00907 } +00908 +00909 <font class="comment">// At this point, the _SId must be ok if we use the naming service.</font> +00910 <font class="comment">// If it's 0, it means that we don't use NS and we left the other side server to find a sid for your connection</font> +00911 +00912 <font class="keywordflow">if</font>(!<a class="code" href="classNLNET_1_1IService.html#z354_17">_DontUseNS</a>) +00913 { +00914 <a class="code" href="debug_8h.html#a6">nlassert</a> (<a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a> != 0); +00915 } +00916 +00917 <font class="comment">//</font> +00918 <font class="comment">// Connect to the local AES and send identification</font> +00919 <font class="comment">//</font> +00920 +00921 <font class="comment">// look if we don't want to use NS</font> +00922 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"DontUseAES"</font>)) != NULL) +00923 { +00924 <font class="comment">// if we set the value in the config file, get it</font> +00925 <a class="code" href="classNLNET_1_1IService.html#z354_18">_DontUseAES</a> = var->asInt() == 1; +00926 } +00927 <font class="keywordflow">else</font> +00928 { +00929 <font class="comment">// if not, we use aes only if service is not aes or as</font> +00930 <a class="code" href="classNLNET_1_1IService.html#z354_18">_DontUseAES</a> = <font class="keyword">false</font>; +00931 } +00932 +00933 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#z354_18">_DontUseAES</a>) +00934 { +00935 CUnifiedNetwork::getInstance()->setServiceUpCallback (<font class="stringliteral">"AES"</font>, <a class="code" href="classNLNET_1_1IService.html#l3">AESConnection</a>, NULL); +00936 CUnifiedNetwork::getInstance()->setServiceDownCallback (<font class="stringliteral">"AES"</font>, <a class="code" href="namespaceNLNET.html#a120">AESDisconnection</a>, NULL); +00937 CUnifiedNetwork::getInstance()->addCallbackArray (<a class="code" href="namespaceNLNET.html#a62">AESCallbackArray</a>, <font class="keyword">sizeof</font>(<a class="code" href="namespaceNLNET.html#a62">AESCallbackArray</a>)/<font class="keyword">sizeof</font>(<a class="code" href="namespaceNLNET.html#a62">AESCallbackArray</a>[0])); +00938 CUnifiedNetwork::getInstance()->addService (<font class="stringliteral">"AES"</font>, CInetAddress(<font class="stringliteral">"localhost:49997"</font>)); +00939 } +00940 +00941 +00942 <font class="comment">//</font> +00943 <font class="comment">// Add callback array</font> +00944 <font class="comment">//</font> +00945 +00946 <font class="comment">// add callback set in the NLNET_SERVICE_MAIN macro</font> +00947 <a class="code" href="classNLNET_1_1CUnifiedNetwork.html#d0">NLNET::CUnifiedNetwork::getInstance</a>()->addCallbackArray(<a class="code" href="classNLNET_1_1IService.html#z354_15">_CallbackArray</a>, <a class="code" href="classNLNET_1_1IService.html#z354_16">_CallbackArraySize</a>); +00948 +00949 <font class="comment">//</font> +00950 <font class="comment">// Now we have the service id, we can set the entites id generator</font> +00951 <font class="comment">//</font> +00952 +00953 <a class="code" href="classNLNET_1_1IService.html#z354_10">_NextEntityId</a>.<a class="code" href="structNLMISC_1_1CEntityId.html#a15">setServiceId</a>(<a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a>); +00954 +00955 <font class="comment">// Set the localhost name and service name and the sid</font> +00956 CLog::setProcessName (localhost+<font class="stringliteral">"/"</font>+<a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>+<font class="stringliteral">"-"</font>+toString((uint16)<a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a>)); +00957 +00958 +00959 <font class="comment">//</font> +00960 <font class="comment">// Add default pathes</font> +00961 <font class="comment">//</font> +00962 +00963 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"Paths"</font>)) != NULL) +00964 { +00965 <font class="keywordflow">for</font> (sint i = 0; i < var->size(); i++) +00966 { +00967 CPath::addSearchPath (var->asString(i), <font class="keyword">true</font>, <font class="keyword">false</font>); +00968 } +00969 } +00970 +00971 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"PathsNoRecurse"</font>)) != NULL) +00972 { +00973 <font class="keywordflow">for</font> (sint i = 0; i < var->size(); i++) +00974 { +00975 CPath::addSearchPath (var->asString(i), <font class="keyword">false</font>, <font class="keyword">false</font>); +00976 } +00977 } +00978 +00979 +00980 <font class="comment">// if we can, try to setup where to write files</font> +00981 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"WriteFilesDirectory"</font>)) != NULL) +00982 { +00983 <a class="code" href="classNLNET_1_1IService.html#m1">WriteFilesDirectory</a> = CPath::standardizePath(var->asString()); +00984 } +00985 +00986 +00987 <font class="comment">//</font> +00988 <font class="comment">// Call the user service init</font> +00989 <font class="comment">//</font> +00990 +00991 userInitCalled = <font class="keyword">true</font>; <font class="comment">// the bool must be put *before* the call to init()</font> +00992 <a class="code" href="classNLNET_1_1IService.html#z349_0">init</a> (); +00993 +00994 +00995 <font class="comment">//</font> +00996 <font class="comment">// Connects to the present services</font> +00997 <font class="comment">// WARNING: only after the user init() was called because the</font> +00998 <font class="comment">// addService may call up service callbacks.</font> +00999 <font class="comment">//</font> +01000 +01001 CUnifiedNetwork::getInstance()->connect(); +01002 +01003 +01004 <font class="comment">//</font> +01005 <font class="comment">// Say to the AES that the service is ready</font> +01006 <font class="comment">//</font> +01007 +01008 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#z354_18">_DontUseAES</a>) +01009 { +01010 <font class="comment">// send the ready message (service init finished)</font> +01011 CMessage msgout (<font class="stringliteral">"SR"</font>); +01012 CUnifiedNetwork::getInstance()->send(<font class="stringliteral">"AES"</font>, msgout); +01013 } +01014 +01015 +01016 <a class="code" href="classNLNET_1_1IService.html#z354_9">_Initialized</a> = <font class="keyword">true</font>; +01017 +01018 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Service initialised, executing StartCommands"</font>); +01019 +01020 <font class="comment">//</font> +01021 <font class="comment">// Call the user command from the config file if any</font> +01022 <font class="comment">//</font> +01023 +01024 <font class="keywordflow">if</font> ((var = <a class="code" href="classNLNET_1_1IService.html#z351_3">ConfigFile</a>.<a class="code" href="classNLMISC_1_1CConfigFile.html#a3">getVarPtr</a> (<font class="stringliteral">"StartCommands"</font>)) != NULL) +01025 { +01026 <font class="keywordflow">for</font> (sint i = 0; i < var->size(); i++) +01027 { +01028 ICommand::execute (var->asString(i), *<a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>); +01029 } +01030 } +01031 +01032 string str; +01033 CLog logDisplayVars; +01034 CMemDisplayer mdDisplayVars; +01035 logDisplayVars.addDisplayer (&mdDisplayVars); +01036 +01037 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Service ready"</font>); +01038 +01039 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> != NULL) +01040 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a6">setTitleBar</a> (<a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a> + <font class="stringliteral">" "</font> + <a class="code" href="classNLNET_1_1IService.html#z354_4">_LongName</a> + <font class="stringliteral">" "</font> + <a class="code" href="classNLNET_1_1IService.html#z354_14">_Version</a>); +01041 +01042 <font class="comment">//</font> +01043 <font class="comment">// Call the user service update each loop and check files and network activity</font> +01044 <font class="comment">//</font> +01045 +01046 <font class="keywordflow">do</font> +01047 { +01048 <font class="comment">//H_BEFORE(NLNETServiceLoop); // Not tick-wise</font> +01049 <font class="comment">// count the amount of time to manage internal system</font> +01050 <a class="code" href="namespaceNLMISC.html#a183">TTime</a> bbefore = CTime::getLocalTime (); +01051 +01052 <font class="comment">// call the user update and exit if the user update asks it</font> +01053 <font class="comment">//H_BEFORE(NLNETServiceUpdate);</font> +01054 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#z349_1">update</a> ()) +01055 { +01056 <font class="comment">//H_AFTER(NLNETServiceLoop); // Not tick-wise</font> +01057 <font class="comment">//H_AFTER(NLNETServiceUpdate);</font> +01058 <font class="keywordflow">break</font>; +01059 } +01060 <font class="comment">//H_AFTER(NLNETServiceUpdate);</font> +01061 +01062 <font class="comment">// count the amount of time to manage internal system</font> +01063 <a class="code" href="namespaceNLMISC.html#a183">TTime</a> before = CTime::getLocalTime (); +01064 +01065 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> != NULL) +01066 { +01067 <font class="comment">// update the window displayer and quit if asked</font> +01068 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a5">update</a> ()) +01069 { +01070 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"The window displayer was closed by user, need to quit"</font>); +01071 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = 1; +01072 } +01073 } +01074 +01075 <font class="comment">// stop the loop if the exit signal asked</font> +01076 <font class="keywordflow">if</font> (<a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> > 0) +01077 { +01078 <font class="comment">//H_AFTER(NLNETServiceLoop) // Not tick-wise</font> +01079 <font class="keywordflow">break</font>; +01080 } +01081 +01082 CConfigFile::checkConfigFiles (); +01083 +01084 CFile::checkFileChange(); +01085 +01086 <font class="comment">//H_BEFORE(NLNETManageMessages); // Not tick-wise</font> +01087 <font class="comment">// get and manage layer 5 messages</font> +01088 CUnifiedNetwork::getInstance()->update (<a class="code" href="classNLNET_1_1IService.html#z354_6">_UpdateTimeout</a>); +01089 <font class="comment">//H_AFTER(NLNETManageMessages); // Not tick-wise</font> +01090 +01091 <font class="comment">// resync the clock every hours</font> +01092 <font class="keywordflow">if</font> (resyncEvenly) +01093 { +01094 <font class="keyword">static</font> <a class="code" href="namespaceNLMISC.html#a183">TTime</a> LastSyncTime = CTime::getLocalTime (); +01095 +01096 <font class="comment">//---------------------------------------</font> +01097 <font class="comment">// To simulate Ctrl-C in the debugger... Exit after 1 min !</font> +01098 <font class="comment">/*if (CTime::getLocalTime () - LastSyncTime > 60 * 1000 )</font> +01099 <font class="comment"> {</font> +01100 <font class="comment"> ExitSignalAsked = 1;</font> +01101 <font class="comment"> }*/</font> +01102 <font class="comment">//---------------------------------------</font> +01103 <font class="comment">/*</font> +01104 <font class="comment"> if (CTime::getLocalTime () - LastSyncTime > 60*60*1000)</font> +01105 <font class="comment"> {</font> +01106 <font class="comment"> CUniTime::syncUniTimeFromService ( _RecordingState );</font> +01107 <font class="comment"> LastSyncTime = CTime::getLocalTime ();</font> +01108 <font class="comment"> }</font> +01109 <font class="comment">*/</font> +01110 } +01111 +01112 <a class="code" href="namespaceNLNET.html#a57">NetSpeedLoop</a> = (sint32) (CTime::getLocalTime () - before); +01113 <a class="code" href="namespaceNLNET.html#a58">UserSpeedLoop</a> = (sint32) (before - bbefore); +01114 +01115 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> != NULL) +01116 { +01117 uint64 rcv, snd, rcvq, sndq; +01118 rcv = CUnifiedNetwork::getInstance()->getBytesReceived (); +01119 snd = CUnifiedNetwork::getInstance()->getBytesSent (); +01120 rcvq = CUnifiedNetwork::getInstance()->getReceiveQueueSize (); +01121 sndq = CUnifiedNetwork::getInstance()->getSendQueueSize (); +01122 +01123 <font class="keywordflow">for</font> (uint i = 0; i < displayedVariables.size(); i++) +01124 { +01125 <font class="comment">// it s a separator, do nothing</font> +01126 <font class="keywordflow">if</font> (displayedVariables[i].first.empty()) +01127 <font class="keywordflow">continue</font>; +01128 +01129 <font class="comment">// it s a command, do nothing</font> +01130 <font class="keywordflow">if</font> (displayedVariables[i].first[0] == <font class="charliteral">'@'</font>) +01131 <font class="keywordflow">continue</font>; +01132 +01133 string dispName = displayedVariables[i].first; +01134 string varName = dispName; +01135 uint32 pos = dispName.find(<font class="stringliteral">"|"</font>); +01136 <font class="keywordflow">if</font> (pos != string::npos) +01137 { +01138 varName = displayedVariables[i].first.substr(pos+1); +01139 dispName = displayedVariables[i].first.substr(0, pos); +01140 } +01141 +01142 <font class="keywordflow">if</font> (dispName.empty()) +01143 str = <font class="stringliteral">""</font>; +01144 <font class="keywordflow">else</font> +01145 str = dispName + <font class="stringliteral">": "</font>; +01146 +01147 mdDisplayVars.clear (); +01148 ICommand::execute(varName, logDisplayVars, <font class="keyword">true</font>); +01149 <font class="keyword">const</font> std::deque<std::string> &strs = mdDisplayVars.lockStrings(); +01150 <font class="keywordflow">if</font> (strs.size()>0) +01151 { +01152 +01153 string s_ = strs[0]; +01154 +01155 uint32 pos = strs[0].find(<font class="stringliteral">"="</font>); +01156 <font class="keywordflow">if</font>(pos != string::npos && pos + 2 < strs[0].size()) +01157 { +01158 uint32 pos2 = string::npos; +01159 <font class="keywordflow">if</font>(strs[0][strs[0].size()-1] == <font class="charliteral">'\n'</font>) +01160 pos2 = strs[0].size() - pos - 2 - 1; +01161 +01162 str += strs[0].substr (pos+2, pos2); +01163 } +01164 <font class="keywordflow">else</font> +01165 { +01166 str += <font class="stringliteral">"???"</font>; +01167 } +01168 } +01169 <font class="keywordflow">else</font> +01170 { +01171 str += <font class="stringliteral">"???"</font>; +01172 } +01173 mdDisplayVars.unlockStrings(); +01174 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>-><a class="code" href="classNLMISC_1_1CWindowDisplayer.html#a4">setLabel</a> (displayedVariables[i].second, str); +01175 } +01176 +01177 } +01178 +01179 <font class="comment">// nldebug ("SYNC: updatetimeout must be %d and is %d, sleep the rest of the time", _UpdateTimeout, delta);</font> +01180 <font class="comment">//H_AFTER(NLNETServiceLoop); // Not tick-wise</font> +01181 +01182 <font class="comment">// Resetting the hierarchical timer must be done outside the top-level timer</font> +01183 <font class="keywordflow">if</font> ( _ResetMeasures ) +01184 { +01185 CHTimer::clear(); +01186 <a class="code" href="classNLNET_1_1IService.html#z354_19">_ResetMeasures</a> = <font class="keyword">false</font>; +01187 } +01188 <font class="comment">//H_AFTER(NLNETServiceLoop);</font> +01189 } +01190 <font class="keywordflow">while</font> (true); +01191 } +01192 <font class="comment">/* catch (ETrapDebug &)</font> +01193 <font class="comment"> {</font> +01194 <font class="comment"> // we have to do that if we want to trap unhandled exception with the report message box</font> +01195 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01196 <font class="comment"> }</font> +01197 <font class="comment">*/</font> <font class="keywordflow">catch</font> (EFatalError &) +01198 { +01199 <font class="comment">// Somebody call nlerror, so we have to quit now, the message already display</font> +01200 <font class="comment">// so we don't have to to anything</font> +01201 <a class="code" href="classNLNET_1_1IService.html#z351_0">setStatus</a> (EXIT_FAILURE); +01202 } +01203 <font class="keywordflow">catch</font> ( uint ) <font class="comment">// SEH exceptions</font> +01204 { +01205 <a class="code" href="namespaceNLMISC.html#a8">ErrorLog</a>->displayNL( <font class="stringliteral">"System exception"</font> ); +01206 } +01207 +01208 <font class="preprocessor">#ifdef NL_RELEASE</font> +01209 <font class="preprocessor"></font><font class="comment">/* // in release mode, we catch everything to handle clean release.</font> +01210 <font class="comment"> catch (Exception &e)</font> +01211 <font class="comment"> {</font> +01212 <font class="comment"> // Catch NeL exception to release the system cleanly</font> +01213 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01214 <font class="comment"> nlinfo ("ERROR: NeL Exception: Error running the service \"%s\": %s", _ShortName.c_str(), e.what());</font> +01215 <font class="comment"> }</font> +01216 <font class="comment"> catch (...)</font> +01217 <font class="comment"> {</font> +01218 <font class="comment"> // Catch anything we can to release the system cleanly</font> +01219 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01220 <font class="comment"> nlinfo ("ERROR: Unknown external exception");</font> +01221 <font class="comment"> }</font> +01222 <font class="comment">*/</font> +01223 <font class="preprocessor">#endif</font> +01224 <font class="preprocessor"></font> +01225 <font class="keywordflow">try</font> +01226 { +01227 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Service starts releasing"</font>); +01228 +01229 <font class="comment">//</font> +01230 <font class="comment">// Call the user service release() if the init() was called</font> +01231 <font class="comment">//</font> +01232 +01233 <font class="keywordflow">if</font> (userInitCalled) +01234 <a class="code" href="classNLNET_1_1IService.html#z349_2">release</a> (); +01235 +01236 <font class="comment">//</font> +01237 <font class="comment">// Delete all network connection (naming client also)</font> +01238 <font class="comment">//</font> +01239 +01240 CUnifiedNetwork::getInstance()->release (); +01241 +01242 CSock::releaseNetwork (); +01243 +01244 <font class="comment">//</font> +01245 <font class="comment">// Remove the window displayer</font> +01246 <font class="comment">//</font> +01247 +01248 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> != NULL) +01249 { +01250 <a class="code" href="namespaceNLMISC.html#a11">DebugLog</a>->removeDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +01251 <a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>->removeDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +01252 <a class="code" href="namespaceNLMISC.html#a9">WarningLog</a>->removeDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +01253 <a class="code" href="namespaceNLMISC.html#a8">ErrorLog</a>->removeDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +01254 <a class="code" href="namespaceNLMISC.html#a12">AssertLog</a>->removeDisplayer (<a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>); +01255 +01256 <font class="keyword">delete</font> <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a>; +01257 <a class="code" href="classNLNET_1_1IService.html#m0">WindowDisplayer</a> = NULL; +01258 } +01259 +01260 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Service released succesfuly"</font>); +01261 } +01262 <font class="comment">/* catch (ETrapDebug &)</font> +01263 <font class="comment"> {</font> +01264 <font class="comment"> // we have to do that if we want to trap unhandled exception with the report message box</font> +01265 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01266 <font class="comment"> }</font> +01267 <font class="comment">*/</font> <font class="keywordflow">catch</font> (EFatalError &) +01268 { +01269 <font class="comment">// Somebody call nlerror, so we have to quit now, the message already display</font> +01270 <font class="comment">// so we don't have to to anything</font> +01271 <a class="code" href="classNLNET_1_1IService.html#z351_0">setStatus</a> (EXIT_FAILURE); +01272 } +01273 +01274 <font class="preprocessor">#ifdef NL_RELEASE</font> +01275 <font class="preprocessor"></font><font class="comment">/* // in release mode, we catch everything to handle clean release.</font> +01276 <font class="comment"> catch (Exception &e)</font> +01277 <font class="comment"> {</font> +01278 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01279 <font class="comment"> nlinfo ("ERROR: NeL Exception: Error releasing the service \"%s\": %s", _ShortName.c_str(), e.what());</font> +01280 <font class="comment"> }</font> +01281 <font class="comment"> catch (...)</font> +01282 <font class="comment"> {</font> +01283 <font class="comment"> // Catch anything we can to release the system cleanly</font> +01284 <font class="comment"> setStatus (EXIT_FAILURE);</font> +01285 <font class="comment"> nlinfo ("ERROR: Unknown external exception");</font> +01286 <font class="comment"> }</font> +01287 <font class="comment">*/</font> +01288 <font class="preprocessor">#endif</font> +01289 <font class="preprocessor"></font> +01290 CHTimer::endBench(); +01291 CHTimer::display(); +01292 CHTimer::displayByExecutionPath (); +01293 CHTimer::displayHierarchical(<a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>, <font class="keyword">true</font>, 64); +01294 CHTimer::displayHierarchicalByExecutionPathSorted (<a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>, CHTimer::TotalTime, <font class="keyword">true</font>, 64); +01295 +01296 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Service ends"</font>); +01297 +01298 <font class="keywordflow">return</font> <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a>?100+<a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a>:<a class="code" href="classNLNET_1_1IService.html#z350_5">getStatus</a> (); +01299 } +01300 +<a name="l01301"></a><a class="code" href="classNLNET_1_1IService.html#z351_1">01301</a> <font class="keywordtype">void</font> IService::exit (sint code) +01302 { +01303 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"somebody called IService::exit(), I have to quit"</font>); +01304 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = code; +01305 } +01306 +01307 <font class="comment">/*</font> +01308 <font class="comment"> * Require to reset the hierarchical timer</font> +01309 <font class="comment"> */</font> +<a name="l01310"></a><a class="code" href="classNLNET_1_1IService.html#z352_4">01310</a> <font class="keywordtype">void</font> IService::requireResetMeasures() +01311 { +01312 <a class="code" href="classNLNET_1_1IService.html#z354_19">_ResetMeasures</a> = <font class="keyword">true</font>; +01313 } +01314 +01315 +<a name="l01316"></a><a class="code" href="classNLNET_1_1IService.html#z350_3">01316</a> std::string IService::getServiceUnifiedName ()<font class="keyword"> const</font> +01317 <font class="keyword"></font>{ +01318 <a class="code" href="debug_8h.html#a6">nlassert</a> (!<a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>.empty()) +01319 string <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>; +01320 <font class="keywordflow">if</font> (!<a class="code" href="classNLNET_1_1IService.html#z354_5">_AliasName</a>.empty()) +01321 { +01322 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> = <a class="code" href="classNLNET_1_1IService.html#z354_5">_AliasName</a>+<font class="stringliteral">"/"</font>; +01323 } +01324 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> += <a class="code" href="classNLNET_1_1IService.html#z354_3">_ShortName</a>; +01325 <font class="keywordflow">if</font> (<a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a> != 0) +01326 { +01327 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> += <font class="stringliteral">"-"</font>; +01328 <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a> += toString (<a class="code" href="classNLNET_1_1IService.html#z354_7">_SId</a>); +01329 } +01330 <font class="keywordflow">return</font> <a class="code" href="driver__opengl__extension__def_8h.html#a400">res</a>; +01331 } +01332 +01333 +01334 +01335 <font class="comment">//</font> +01336 <font class="comment">// Commands and Variables for controling all services</font> +01337 <font class="comment">//</font> +01338 +01339 <a class="code" href="namespaceNLNET.html#a126">NLMISC_VARIABLE</a>(sint32, <a class="code" href="namespaceNLNET.html#a57">NetSpeedLoop</a>, <font class="stringliteral">"duration of the last network loop (in ms)"</font>); +01340 <a class="code" href="namespaceNLNET.html#a126">NLMISC_VARIABLE</a>(sint32, <a class="code" href="namespaceNLNET.html#a58">UserSpeedLoop</a>, <font class="stringliteral">"duration of the last user loop (in ms)"</font>); +01341 +01342 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(uint64, ReceivedBytes, <font class="stringliteral">"total of bytes received by this service"</font>) +01343 { +01344 <font class="comment">// we can only read the value</font> +01345 <font class="keywordflow">if</font> (get) +01346 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = CUnifiedNetwork::getInstance()->getBytesReceived (); +01347 } +01348 +01349 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(uint64, SentBytes, <font class="stringliteral">"total of bytes sent by this service"</font>) +01350 { +01351 <font class="comment">// we can only read the value</font> +01352 <font class="keywordflow">if</font> (get) +01353 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = CUnifiedNetwork::getInstance()->getBytesSent (); +01354 } +01355 +01356 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(uint64, ReceivedQueueSize, <font class="stringliteral">"current size in bytes of the received queue size"</font>) +01357 { +01358 <font class="comment">// we can only read the value</font> +01359 <font class="keywordflow">if</font> (get) +01360 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = CUnifiedNetwork::getInstance()->getReceiveQueueSize (); +01361 } +01362 +01363 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(uint64, SentQueueSize, <font class="stringliteral">"current size in bytes of the sent queue size"</font>) +01364 { +01365 <font class="comment">// we can only read the value</font> +01366 <font class="keywordflow">if</font> (get) +01367 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = CUnifiedNetwork::getInstance()->getSendQueueSize (); +01368 } +01369 +01370 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(string, Scroller, <font class="stringliteral">"current size in bytes of the sent queue size"</font>) +01371 { +01372 <font class="keywordflow">if</font> (get) +01373 { +01374 <font class="comment">// display the scroll text</font> +01375 <font class="keyword">static</font> string foo = <font class="stringliteral">"Welcome to NeL Service! This scroll is used to see the update frequency of the main function and to see if the service is frozen or not. Have a nice day and hope you'll like NeL!!! "</font> +01376 <font class="stringliteral">"Welcome to NeL Service! This scroll is used to see the update frequency of the main function and to see if the service is frozen or not. Have a nice day and hope you'll like NeL!!! "</font>; +01377 <font class="keyword">static</font> <font class="keywordtype">int</font> pos = 0; +01378 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = foo.substr ((pos++)%(foo.size()/2), 10); +01379 } +01380 } +01381 +01382 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a> (quit, <font class="stringliteral">"exit the service"</font>, <font class="stringliteral">""</font>) +01383 { +01384 <font class="keywordflow">if</font>(args.size() != 0) <font class="keywordflow">return</font> <font class="keyword">false</font>; +01385 +01386 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"User ask me with a command to quit"</font>); +01387 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = 0xFFFF; +01388 +01389 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01390 } +01391 +01392 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a> (brutalQuit, <font class="stringliteral">"exit the service brutally"</font>, <font class="stringliteral">""</font>) +01393 { +01394 <font class="keywordflow">if</font>(args.size() != 0) <font class="keywordflow">return</font> <font class="keyword">false</font>; +01395 +01396 ::exit (0xFFFFFFFF); +01397 +01398 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01399 } +01400 +01401 +01402 <font class="preprocessor">#ifdef MUTEX_DEBUG</font> +01403 <font class="preprocessor"></font><a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a> (mutex, <font class="stringliteral">"display mutex values"</font>, <font class="stringliteral">""</font>) +01404 { +01405 <font class="keywordflow">if</font>(args.size() != 0) <font class="keywordflow">return</font> <font class="keyword">false</font>; +01406 +01407 map<CFairMutex*,TMutexLocks> acquiretimes = getNewAcquireTimes(); +01408 +01409 map<CFairMutex*,TMutexLocks>::iterator im; +01410 <font class="keywordflow">for</font> ( im=acquiretimes.begin(); im!=acquiretimes.end(); ++im ) +01411 { +01412 <a class="code" href="debug_8h.html#a1">nlinfo</a>( <font class="stringliteral">"%d %p %s: %.0f %.0f, called %u times th(%d, %d wait)%s"</font>, (*im).second.MutexNum, (*im).first, (*im).second.MutexName.c_str(), +01413 CTime::cpuCycleToSecond((*im).second.TimeToEnter)*1000.0, CTime::cpuCycleToSecond((*im).second.TimeInMutex)*1000.0, +01414 (*im).second.Nb, (*im).second.ThreadHavingTheMutex, (*im).second.WaitingMutex, +01415 (*im).second.Dead?<font class="stringliteral">" DEAD"</font>:<font class="stringliteral">""</font>); +01416 } +01417 +01418 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01419 } +01420 <font class="preprocessor">#endif // MUTEX_DEBUG</font> +01421 <font class="preprocessor"></font> +01422 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a> (serviceInfo, <font class="stringliteral">"display information about this service"</font>, <font class="stringliteral">""</font>) +01423 { +01424 <font class="keywordflow">if</font>(args.size() != 0) <font class="keywordflow">return</font> <font class="keyword">false</font>; +01425 +01426 log.displayNL (<font class="stringliteral">"Service %s '%s' using NeL ("</font>__DATE__<font class="stringliteral">" "</font>__TIME__<font class="stringliteral">")"</font>, IService::getInstance()->getServiceLongName().c_str(), IService::getInstance()->getServiceUnifiedName().c_str()); +01427 log.displayNL (<font class="stringliteral">"Service listening port: %d"</font>, IService::getInstance()->_Port); +01428 log.displayNL (<font class="stringliteral">"Service running directory: '%s'"</font>, IService::getInstance()->_RunningPath.c_str()); +01429 log.displayNL (<font class="stringliteral">"Service log directory: '%s'"</font>, IService::getInstance()->_LogDir.c_str()); +01430 log.displayNL (<font class="stringliteral">"Service config directory: '%s' config filename: '%s.cfg'"</font>, IService::getInstance()->_ConfigDir.c_str(), IService::getInstance()->_LongName.c_str()); +01431 log.displayNL (<font class="stringliteral">"Service id: %d"</font>, IService::getInstance()->_SId); +01432 log.displayNL (<font class="stringliteral">"Service update timeout: %dms"</font>, IService::getInstance()->_UpdateTimeout); +01433 log.displayNL (<font class="stringliteral">"Service %suse naming service"</font>, IService::getInstance()->_DontUseNS?<font class="stringliteral">"don't "</font>:<font class="stringliteral">""</font>); +01434 log.displayNL (<font class="stringliteral">"Service %suse admin executor service"</font>, IService::getInstance()->_DontUseAES?<font class="stringliteral">"don't "</font>:<font class="stringliteral">""</font>); +01435 <font class="preprocessor">#ifdef NL_RELEASE_DEBUG</font> +01436 <font class="preprocessor"></font> string mode = <font class="stringliteral">"NL_RELEASE_DEBUG"</font>; +01437 <font class="preprocessor">#elif defined(NL_DEBUG_FAST)</font> +01438 <font class="preprocessor"></font> string mode = <font class="stringliteral">"NL_DEBUG_FAST"</font>; +01439 <font class="preprocessor">#elif defined(NL_DEBUG)</font> +01440 <font class="preprocessor"></font> string mode = <font class="stringliteral">"NL_DEBUG"</font>; +01441 <font class="preprocessor">#elif defined(NL_RELEASE)</font> +01442 <font class="preprocessor"></font> string mode = <font class="stringliteral">"NL_RELEASE"</font>; +01443 <font class="preprocessor">#else</font> +01444 <font class="preprocessor"></font> string mode = <font class="stringliteral">"???"</font>; +01445 <font class="preprocessor">#endif</font> +01446 <font class="preprocessor"></font> log.displayNL (<font class="stringliteral">"NeL is compiled in %s mode"</font>, mode.c_str()); +01447 +01448 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"Services arguments: %d args"</font>, IService::getInstance()->_Args.size ()); +01449 <font class="keywordflow">for</font> (uint i = 0; i < IService::getInstance()->_Args.size (); i++) +01450 { +01451 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">" argv[%d] = '%s'"</font>, i, IService::getInstance()->_Args[i].c_str ()); +01452 } +01453 +01454 log.displayNL (<font class="stringliteral">"Naming service info: %s"</font>, CNamingClient::info().c_str()); +01455 +01456 ICommand::execute (<font class="stringliteral">"services"</font>, log); +01457 +01458 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01459 } +01460 +01461 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a>(resetMeasures, <font class="stringliteral">"reset hierarchical timer"</font>, <font class="stringliteral">""</font>) +01462 { +01463 IService::getInstance()->requireResetMeasures(); +01464 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01465 } +01466 +01467 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a>(displayMeasures, <font class="stringliteral">"display hierarchical timer"</font>, <font class="stringliteral">""</font>) +01468 { +01469 CHTimer::display(); +01470 CHTimer::displayHierarchicalByExecutionPathSorted (<a class="code" href="namespaceNLMISC.html#a10">InfoLog</a>, CHTimer::TotalTime, <font class="keyword">true</font>, 64); +01471 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01472 } +01473 +01474 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a>(getWinDisplayerInfo, <font class="stringliteral">"display the info about the pos and size of the window displayer"</font>, <font class="stringliteral">""</font>) +01475 { +01476 uint32 <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>,h; +01477 IService::getInstance()->WindowDisplayer->getWindowPos (<a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>,<a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>,h); +01478 log.displayNL (<font class="stringliteral">"Window Displayer : XWinParam = %d; YWinParam = %d; WWinParam = %d; HWinParam = %d;"</font>, <a class="code" href="driver__opengl__extension__def_8h.html#a364">x</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a365">y</a>, <a class="code" href="driver__opengl__extension__def_8h.html#a367">w</a>, h); +01479 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01480 } +01481 +01482 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a>(printConfigFile, <font class="stringliteral">"display the variables of the default configfile"</font>, <font class="stringliteral">""</font>) +01483 { +01484 IService::getInstance()->ConfigFile.print(&log); +01485 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01486 } +01487 +01488 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a>(getUnknownConfigFileVariables, <font class="stringliteral">"display the variables from config file that are called but not present"</font>, <font class="stringliteral">""</font>) +01489 { +01490 log.displayNL (<font class="stringliteral">"%d Variables not found in the configfile '%s'"</font>, IService::getInstance()->ConfigFile.UnknownVariables.size(), IService::getInstance()->ConfigFile.getFilename().c_str() ); +01491 <font class="keywordflow">for</font> (uint i = 0; i < IService::getInstance()->ConfigFile.UnknownVariables.size(); i++) +01492 { +01493 log.displayNL (<font class="stringliteral">" %s"</font>, IService::getInstance()->ConfigFile.UnknownVariables[i].c_str()); +01494 } +01495 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01496 } +01497 +01498 <a class="code" href="namespaceNLNET.html#a111">NLMISC_COMMAND</a> (freeze, <font class="stringliteral">"Freeze the service for N seconds (for debug purpose)"</font>, <font class="stringliteral">"<N>"</font>) +01499 { +01500 <font class="keywordflow">if</font>(args.size() != 1) <font class="keywordflow">return</font> <font class="keyword">false</font>; +01501 +01502 sint32 n = atoi (args[0].c_str()); +01503 +01504 log.displayNL (<font class="stringliteral">"Freezing %d seconds"</font>, n); +01505 +01506 <a class="code" href="namespaceNLMISC.html#a236">nlSleep</a>(n * 1000); +01507 <font class="keywordflow">return</font> <font class="keyword">true</font>; +01508 } +01509 +01510 uint32 foo = 7777, <a class="code" href="namespaceNLNET.html#a63">bar</a> = 6666; +01511 +01512 <a class="code" href="namespaceNLNET.html#a126">NLMISC_VARIABLE</a>(uint32, foo, <font class="stringliteral">"test the get view system"</font>); +01513 <a class="code" href="namespaceNLNET.html#a126">NLMISC_VARIABLE</a>(uint32, <a class="code" href="namespaceNLNET.html#a63">bar</a>, <font class="stringliteral">"test the get view system"</font>); +01514 +01515 +01516 <font class="comment">// -1 = service is quitting</font> +01517 <font class="comment">// 0 = service is not connected</font> +01518 <font class="comment">// 1 = service is running</font> +01519 <font class="comment">// 2 = service is launching</font> +01520 <font class="comment">// 3 = service failed launching</font> +01521 +01522 <a class="code" href="namespaceNLNET.html#a128">NLMISC_DYNVARIABLE</a>(string, State, <font class="stringliteral">"Set this value to 0 to shutdown the service and 1 to start the service"</font>) +01523 { +01524 <font class="keyword">static</font> string running = <font class="stringliteral">"Online"</font>; +01525 +01526 <font class="comment">// read or write the variable</font> +01527 <font class="keywordflow">if</font> (get) +01528 { +01529 *<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> = running; +01530 } +01531 <font class="keywordflow">else</font> +01532 { +01533 <font class="keywordflow">if</font> (IService::getInstance()->getServiceShortName() == <font class="stringliteral">"AES"</font> || IService::getInstance()->getServiceShortName() == <font class="stringliteral">"AS"</font>) +01534 { +01535 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"I can't set State=0 because I'm the admin and I should never quit"</font>); +01536 } +01537 <font class="keywordflow">else</font> <font class="keywordflow">if</font> (*<a class="code" href="driver__opengl__extension__def_8h.html#a362">pointer</a> == <font class="stringliteral">"0"</font>) +01538 { +01539 <font class="comment">// ok, we want to set the value to false, just quit</font> +01540 <a class="code" href="debug_8h.html#a1">nlinfo</a> (<font class="stringliteral">"User ask me with a command to quit using the State variable"</font>); +01541 <a class="code" href="namespaceNLNET.html#a56">ExitSignalAsked</a> = 0xFFFE; +01542 running = <font class="stringliteral">"Quitting"</font>; +01543 } +01544 <font class="keywordflow">else</font> +01545 { +01546 <a class="code" href="debug_8h.html#a2">nlwarning</a> (<font class="stringliteral">"Unknown value for State '%s'"</font>, (*pointer).c_str()); +01547 } +01548 } +01549 } +01550 +01551 +01552 } <font class="comment">//NLNET</font> +</pre></div> + +<!-- footer --> +<BR><FONT Size=+5> </FONT> +</TD> +<TD WIDTH=15><IMG SRC=http://www.nevrax.org/inc/img/pixel.gif WIDTH=15 HEIGHT=15 BORDER=0 ALT=""></TD> +</TR> +</TABLE> +</BODY> +</HTML> |