examples/S60CppExamples/ClientServerAsync/doc/timeserver_8cpp-source.html

00001 "-//W3C//DTD HTML 4.0 Transitional//EN">
00002 
00003 
00004 
00005 "Content-Type" content="text/html;charset=iso-8859-1">
00006 timeserver.cpp Source File
00007 "style.css" rel="stylesheet" type="text/css">
00008 
00009 
00010 "0" width="100%" height="8" bgcolor="#eeeeee">
00011 
"100%" height="1">"2" color="#000000" face="Arial, Helvetica, sans-serif"> 00012 S60 5th Edition SDK
Example Applications Guide
00013 00014
class="tabs"> 00015
00020

timeserver.cpp

class="fragment">
class="fragment">"l00001">00001 class="comment">/*
00021 00002 * ==============================================================================
00022 00003 *  Name        : timeserver.cpp
00023 00004 *  Part of     : CSAsync
00024 00005 *  Interface   :
00025 00006 *  Description :
00026 00007 *  Version     :
00027 00008 *
00028 00009 *  Copyright (c) 2004-2006 Nokia Corporation.
00029 00010 *  This material, including documentation and any related
00030 00011 *  computer programs, is protected by copyright controlled by
00031 00012 *  Nokia Corporation.
00032 00013 * ==============================================================================
00033 00014 */
00034 "l00015">00015 
00035 "l00016">00016 
00036 "l00017">00017 class="comment">// INCLUDE FILES
00037 "l00018">00018 class="preprocessor">#include <e32svr.h>
00038 "l00019">00019 class="preprocessor">#include <e32math.h>
00039 "l00020">00020 
00040 "l00021">00021 class="preprocessor">#include "TimeServer.h"
00041 "l00022">00022 class="preprocessor">#include "ClientServerCommon.h"
00042 "l00023">00023 class="preprocessor">#include "TimeSession.h"
00043 "l00024">00024 
00044 "l00025">00025 class="comment">// ========================= MEMBER FUNCTIONS ==================================
00045 "l00026">00026 
00046 "l00027">00027 class="comment">// -----------------------------------------------------------------------------
00047 "l00028">00028 class="comment">// CTimeServer::NewL()
00048 "l00029">00029 class="comment">// Two-phased constructor.
00049 "l00030">00030 class="comment">// -----------------------------------------------------------------------------
00050 "l00031">00031 class="comment">//
00051 "l00032">class="code" href="class_c_time_server.html#990716240ccf3341f7fdbf289ec927ad">00032 class="code" href="class_c_time_server.html">CTimeServer* class="code" href="class_c_time_server.html#990716240ccf3341f7fdbf289ec927ad">CTimeServer::NewL()
00052 "l00033">00033     {
00053 "l00034">00034     class="code" href="class_c_time_server.html">CTimeServer* timeServer = class="code" href="class_c_time_server.html#94389c6729b439332fc74a54ac683740">CTimeServer::NewLC();
00054 "l00035">00035     CleanupStack::Pop( timeServer );
00055 "l00036">00036     class="keywordflow">return timeServer;
00056 "l00037">00037     }
00057 "l00038">00038 
00058 "l00039">00039 class="comment">// -----------------------------------------------------------------------------
00059 "l00040">00040 class="comment">// CTimeServer::NewLC()
00060 "l00041">00041 class="comment">// Two-phased constructor.
00061 "l00042">00042 class="comment">// -----------------------------------------------------------------------------
00062 "l00043">00043 class="comment">//
00063 "l00044">class="code" href="class_c_time_server.html#94389c6729b439332fc74a54ac683740">00044 class="code" href="class_c_time_server.html">CTimeServer* class="code" href="class_c_time_server.html#94389c6729b439332fc74a54ac683740">CTimeServer::NewLC()
00064 "l00045">00045     {
00065 "l00046">00046     class="code" href="class_c_time_server.html">CTimeServer* timeServer = class="keyword">new ( ELeave ) class="code" href="class_c_time_server.html#95423dd47aaf3240e1e4b42baa280c39">CTimeServer( EPriorityNormal );
00066 "l00047">00047     CleanupStack::PushL( timeServer );
00067 "l00048">00048     timeServer->class="code" href="class_c_time_server.html#9ce34ba0b947863222da3c63d0481044">ConstructL();
00068 "l00049">00049     class="keywordflow">return timeServer;
00069 "l00050">00050     }
00070 "l00051">00051 
00071 "l00052">00052 class="comment">// -----------------------------------------------------------------------------
00072 "l00053">00053 class="comment">// CTimeServer::ConstructL()
00073 "l00054">00054 class="comment">// Symbian 2nd phase constructor can leave.
00074 "l00055">00055 class="comment">// -----------------------------------------------------------------------------
00075 "l00056">00056 class="comment">//
00076 "l00057">class="code" href="class_c_time_server.html#9ce34ba0b947863222da3c63d0481044">00057 class="keywordtype">void class="code" href="class_c_time_server.html#9ce34ba0b947863222da3c63d0481044">CTimeServer::ConstructL()
00077 "l00058">00058     {
00078 "l00059">00059     StartL( KTimeServerName );
00079 "l00060">00060     }
00080 "l00061">00061 
00081 "l00062">00062 class="comment">// -----------------------------------------------------------------------------
00082 "l00063">00063 class="comment">// CTimeServer::CTimeServer()
00083 "l00064">00064 class="comment">// C++ default constructor can NOT contain any code, that might leave.
00084 "l00065">00065 class="comment">// -----------------------------------------------------------------------------
00085 "l00066">00066 class="comment">//
00086 "l00067">class="code" href="class_c_time_server.html#95423dd47aaf3240e1e4b42baa280c39">00067 class="code" href="class_c_time_server.html#95423dd47aaf3240e1e4b42baa280c39">CTimeServer::CTimeServer( TInt aPriority )
00087 "l00068">00068 : CServer2( aPriority )
00088 "l00069">00069     {
00089 "l00070">00070     class="comment">// Implementation not required
00090 "l00071">00071     }
00091 "l00072">00072 
00092 "l00073">00073 class="comment">// -----------------------------------------------------------------------------
00093 "l00074">00074 class="comment">// CTimeServer::~CTimeServer()
00094 "l00075">00075 class="comment">// Destructor.
00095 "l00076">00076 class="comment">// -----------------------------------------------------------------------------
00096 "l00077">00077 class="comment">//
00097 "l00078">class="code" href="class_c_time_server.html#ab523c20e96ddd5e1413d525bad59fdd">00078 class="code" href="class_c_time_server.html#ab523c20e96ddd5e1413d525bad59fdd">CTimeServer::~CTimeServer()
00098 "l00079">00079     {
00099 "l00080">00080     class="keyword">delete class="code" href="class_c_time_server.html#bd20aae428bf045cb28f7958102a14e1">iHeartbeat;
00100 "l00081">00081     class="code" href="class_c_time_server.html#bd20aae428bf045cb28f7958102a14e1">iHeartbeat = NULL;
00101 "l00082">00082     }
00102 "l00083">00083 
00103 "l00084">00084 class="comment">// -----------------------------------------------------------------------------
00104 "l00085">00085 class="comment">// CTimeServer::NewSessionL()
00105 "l00086">00086 class="comment">// Creates a time server session.
00106 "l00087">00087 class="comment">// -----------------------------------------------------------------------------
00107 "l00088">00088 class="comment">//
00108 "l00089">class="code" href="class_c_time_server.html#e8cc7a175c8a6ec0a2b0ee8bf27badb9">00089 CSession2* class="code" href="class_c_time_server.html#e8cc7a175c8a6ec0a2b0ee8bf27badb9">CTimeServer::NewSessionL( class="keyword">const TVersion& aVersion,
00109 "l00090">00090                                      class="keyword">const RMessage2& class="comment">/*aMessage*/ )class="keyword"> const
00110 "l00091">00091 class="keyword">    {
00111 "l00092">00092     class="comment">// Check we are the right version
00112 "l00093">00093     class="keywordflow">if ( !User::QueryVersionSupported( TVersion( KTimeServMajorVersionNumber,
00113 "l00094">00094                                                  KTimeServMinorVersionNumber,
00114 "l00095">00095                                                  KTimeServBuildVersionNumber ),
00115 "l00096">00096                                        aVersion ) )
00116 "l00097">00097         {
00117 "l00098">00098         User::Leave( KErrNotSupported );
00118 "l00099">00099         }
00119 "l00100">00100 
00120 "l00101">00101     class="comment">// Make new session
00121 "l00102">00102     class="comment">//RThread client = Message().Client();
00122 "l00103">00103     class="keywordflow">return class="code" href="class_c_time_server_session.html#73d44aed371951fd548af4329b779411">CTimeServerSession::NewL( *const_cast<CTimeServer*> ( class="keyword">this ) );
00123 "l00104">00104     }
00124 "l00105">00105 
00125 "l00106">00106 class="comment">// -----------------------------------------------------------------------------
00126 "l00107">00107 class="comment">// CTimeServer::IncrementSessions()
00127 "l00108">00108 class="comment">// Increments the count of the active sessions for this server.
00128 "l00109">00109 class="comment">// -----------------------------------------------------------------------------
00129 "l00110">00110 class="comment">//
00130 "l00111">class="code" href="class_c_time_server.html#a3afdfcfbf3d8aa45b7f96b5a1c7119e">00111 class="keywordtype">void class="code" href="class_c_time_server.html#a3afdfcfbf3d8aa45b7f96b5a1c7119e">CTimeServer::IncrementSessions()
00131 "l00112">00112     {
00132 "l00113">00113     class="code" href="class_c_time_server.html#40ac9219e4400c125719d767d564fc3e">iSessionCount++;
00133 "l00114">00114     }
00134 "l00115">00115 
00135 "l00116">00116 class="comment">// -----------------------------------------------------------------------------
00136 "l00117">00117 class="comment">// CTimeServer::DecrementSessions()
00137 "l00118">00118 class="comment">// Decrements the count of the active sessions for this server.
00138 "l00119">00119 class="comment">// -----------------------------------------------------------------------------
00139 "l00120">00120 class="comment">//
00140 "l00121">class="code" href="class_c_time_server.html#982e65810ad50ce20759fd26fad488dc">00121 class="keywordtype">void class="code" href="class_c_time_server.html#982e65810ad50ce20759fd26fad488dc">CTimeServer::DecrementSessions()
00141 "l00122">00122     {
00142 "l00123">00123     class="code" href="class_c_time_server.html#40ac9219e4400c125719d767d564fc3e">iSessionCount--;
00143 "l00124">00124     class="keywordflow">if ( class="code" href="class_c_time_server.html#40ac9219e4400c125719d767d564fc3e">iSessionCount <= 0 )
00144 "l00125">00125         {
00145 "l00126">00126         CActiveScheduler::Stop();
00146 "l00127">00127         }
00147 "l00128">00128     }
00148 "l00129">00129 
00149 "l00130">00130 class="comment">// -----------------------------------------------------------------------------
00150 "l00131">00131 class="comment">// CTimeServer::RunError()
00151 "l00132">00132 class="comment">// Processes any errors.
00152 "l00133">00133 class="comment">// -----------------------------------------------------------------------------
00153 "l00134">00134 class="comment">//
00154 "l00135">class="code" href="class_c_time_server.html#0f788de08f5d216c674e6eaeaea1c67a">00135 TInt class="code" href="class_c_time_server.html#0f788de08f5d216c674e6eaeaea1c67a">CTimeServer::RunError( TInt aError )
00155 "l00136">00136     {
00156 "l00137">00137     class="keywordflow">if ( aError == KErrBadDescriptor )
00157 "l00138">00138         {
00158 "l00139">00139         class="comment">// A bad descriptor error implies a badly programmed client,
00159 "l00140">00140         class="comment">// so panic it; otherwise report the error to the client
00160 "l00141">00141         class="code" href="class_c_time_server.html#5486029c4d68e3db4b0cbbbd2c4c711e">PanicClient( Message(), EBadDescriptor );
00161 "l00142">00142         }
00162 "l00143">00143     class="keywordflow">else
00163 "l00144">00144         {
00164 "l00145">00145         Message().Complete( aError );
00165 "l00146">00146         }
00166 "l00147">00147 
00167 "l00148">00148     class="comment">// The leave will result in an early return from CServer::RunL(), skipping
00168 "l00149">00149     class="comment">// the call to request another message. So do that now in order to keep the
00169 "l00150">00150     class="comment">// server running.
00170 "l00151">00151     ReStart();
00171 "l00152">00152 
00172 "l00153">00153     class="keywordflow">return KErrNone;    class="comment">// Handled the error fully
00173 "l00154">00154     }
00174 "l00155">00155 
00175 "l00156">00156 class="comment">// -----------------------------------------------------------------------------
00176 "l00157">00157 class="comment">// CTimeServer::PanicClient()
00177 "l00158">00158 class="comment">// Panics the client.
00178 "l00159">00159 class="comment">// -----------------------------------------------------------------------------
00179 "l00160">00160 class="comment">//
00180 "l00161">class="code" href="class_c_time_server.html#5486029c4d68e3db4b0cbbbd2c4c711e">00161 class="keywordtype">void class="code" href="class_c_time_server.html#5486029c4d68e3db4b0cbbbd2c4c711e">CTimeServer::PanicClient( class="keyword">const RMessage2& aMessage, TTimeServPanic aPanic )
00181 "l00162">00162     {
00182 "l00163">00163     aMessage.Panic( KCSAsyncServer, aPanic );
00183 "l00164">00164     }
00184 "l00165">00165 
00185 "l00166">00166 class="comment">// -----------------------------------------------------------------------------
00186 "l00167">00167 class="comment">// CTimeServer::PanicServer()
00187 "l00168">00168 class="comment">// Panics the server.
00188 "l00169">00169 class="comment">// -----------------------------------------------------------------------------
00189 "l00170">00170 class="comment">//
00190 "l00171">class="code" href="class_c_time_server.html#57317bfd7bbf407064d8f0b845a16d46">00171 class="keywordtype">void class="code" href="class_c_time_server.html#57317bfd7bbf407064d8f0b845a16d46">CTimeServer::PanicServer( TTimeServPanic aPanic )
00191 "l00172">00172     {
00192 "l00173">00173     User::Panic( KCSAsyncServer, aPanic );
00193 "l00174">00174     }
00194 "l00175">00175 
00195 "l00176">00176 class="comment">// -----------------------------------------------------------------------------
00196 "l00177">00177 class="comment">// CTimeServer::WaitForTickL()
00197 "l00178">00178 class="comment">// Activates the heartbeat.
00198 "l00179">00179 class="comment">// -----------------------------------------------------------------------------
00199 "l00180">00180 class="comment">//
00200 "l00181">class="code" href="class_c_time_server.html#a8205372b5d379fa4b803e98b0726473">00181 class="keywordtype">void class="code" href="class_c_time_server.html#a8205372b5d379fa4b803e98b0726473">CTimeServer::WaitForTickL()
00201 "l00182">00182     {
00202 "l00183">00183     class="keywordflow">if ( !class="code" href="class_c_time_server.html#bd20aae428bf045cb28f7958102a14e1">iHeartbeat )
00203 "l00184">00184         {
00204 "l00185">00185         class="code" href="class_c_time_server.html#bd20aae428bf045cb28f7958102a14e1">iHeartbeat = CHeartbeat::NewL( EPriorityHigh );
00205 "l00186">00186         class="code" href="class_c_time_server.html#bd20aae428bf045cb28f7958102a14e1">iHeartbeat->Start( ETwelveOClock, class="keyword">this );
00206 "l00187">00187         }
00207 "l00188">00188     }
00208 "l00189">00189 
00209 "l00190">00190 class="comment">// -----------------------------------------------------------------------------
00210 "l00191">00191 class="comment">// CTimeServer::Beat()
00211 "l00192">00192 class="comment">// A clock tick has occured.
00212 "l00193">00193 class="comment">// -----------------------------------------------------------------------------
00213 "l00194">00194 class="comment">//
00214 "l00195">class="code" href="class_c_time_server.html#8bc39d8613772fe04fa5d6a845ede8cd">00195 class="keywordtype">void class="code" href="class_c_time_server.html#8bc39d8613772fe04fa5d6a845ede8cd">CTimeServer::Beat()
00215 "l00196">00196     {
00216 "l00197">00197     class="code" href="class_c_time_server.html#993249bd000d59f1d0437eea0ab25fc3">SendTimeToSessions();
00217 "l00198">00198     }
00218 "l00199">00199 
00219 "l00200">00200 class="comment">// -----------------------------------------------------------------------------
00220 "l00201">00201 class="comment">// CTimeServer::Synchronize()
00221 "l00202">00202 class="comment">// Several clock ticks have occured.
00222 "l00203">00203 class="comment">// -----------------------------------------------------------------------------
00223 "l00204">00204 class="comment">//
00224 "l00205">class="code" href="class_c_time_server.html#a6043d9cad7048bb64b0d0d125ddc875">00205 class="keywordtype">void class="code" href="class_c_time_server.html#a6043d9cad7048bb64b0d0d125ddc875">CTimeServer::Synchronize()
00225 "l00206">00206     {
00226 "l00207">00207     class="code" href="class_c_time_server.html#993249bd000d59f1d0437eea0ab25fc3">SendTimeToSessions();
00227 "l00208">00208     }
00228 "l00209">00209 
00229 "l00210">00210 class="comment">// -----------------------------------------------------------------------------
00230 "l00211">00211 class="comment">// CTimeServer::SendTimeToSessions()
00231 "l00212">00212 class="comment">// Informs all the clients that a time change has occured.
00232 "l00213">00213 class="comment">// -----------------------------------------------------------------------------
00233 "l00214">00214 class="comment">//
00234 "l00215">class="code" href="class_c_time_server.html#993249bd000d59f1d0437eea0ab25fc3">00215 class="keywordtype">void class="code" href="class_c_time_server.html#993249bd000d59f1d0437eea0ab25fc3">CTimeServer::SendTimeToSessions()
00235 "l00216">00216     {
00236 "l00217">00217     iSessionIter.SetToFirst();
00237 "l00218">00218     class="code" href="class_c_time_server_session.html">CTimeServerSession* session;
00238 "l00219">00219     session = reinterpret_cast<CTimeServerSession*>( iSessionIter++ );
00239 "l00220">00220     class="keywordflow">while ( session )
00240 "l00221">00221         {
00241 "l00222">00222         session->class="code" href="class_c_time_server_session.html#ecff8e289d914777ae0c503db937cf33">SendTimeToClient();
00242 "l00223">00223         session = reinterpret_cast<CTimeServerSession*>( iSessionIter++ );
00243 "l00224">00224         }
00244 "l00225">00225     }
00245 "l00226">00226 
00246 "l00227">00227 class="comment">// -----------------------------------------------------------------------------
00247 "l00228">00228 class="comment">// CTimeServer::ThreadFunctionL()
00248 "l00229">00229 class="comment">// Second stage startup for the server thread.
00249 "l00230">00230 class="comment">// -----------------------------------------------------------------------------
00250 "l00231">00231 class="comment">//
00251 "l00232">class="code" href="class_c_time_server.html#be5e4a4628587739b7c76951f9577e8e">00232 class="keywordtype">void class="code" href="class_c_time_server.html#be5e4a4628587739b7c76951f9577e8e">CTimeServer::ThreadFunctionL()
00252 "l00233">00233     {
00253 "l00234">00234     class="comment">// Construct active scheduler
00254 "l00235">00235     CActiveScheduler* activeScheduler = class="keyword">new ( ELeave ) CActiveScheduler;
00255 "l00236">00236     CleanupStack::PushL( activeScheduler );
00256 "l00237">00237 
00257 "l00238">00238     class="comment">// Install active scheduler
00258 "l00239">00239     class="comment">// We don't need to check whether an active scheduler is already installed
00259 "l00240">00240     class="comment">// as this is a new thread, so there won't be one
00260 "l00241">00241     CActiveScheduler::Install( activeScheduler );
00261 "l00242">00242 
00262 "l00243">00243     class="comment">// Construct our server
00263 "l00244">00244     class="code" href="class_c_time_server.html#94389c6729b439332fc74a54ac683740">CTimeServer::NewLC();    class="comment">// Anonymous
00264 "l00245">00245 
00265 "l00246">00246     RSemaphore semaphore;
00266 "l00247">00247     User::LeaveIfError( semaphore.OpenGlobal( KTimeServerSemaphoreName ) );
00267 "l00248">00248 
00268 "l00249">00249     class="comment">// Semaphore opened ok
00269 "l00250">00250     semaphore.Signal();
00270 "l00251">00251     semaphore.Close();
00271 "l00252">00252 
00272 "l00253">00253     class="comment">// Start handling requests
00273 "l00254">00254     CActiveScheduler::Start();
00274 "l00255">00255 
00275 "l00256">00256     CleanupStack::PopAndDestroy( 2, activeScheduler ); class="comment">//Anonymous CTimeServer
00276 "l00257">00257     }
00277 "l00258">00258 
00278 "l00259">00259 class="comment">// -----------------------------------------------------------------------------
00279 "l00260">00260 class="comment">// CTimeServer::ThreadFunction()
00280 "l00261">00261 class="comment">// Main function for the server thread.
00281 "l00262">00262 class="comment">// -----------------------------------------------------------------------------
00282 "l00263">00263 class="comment">//
00283 "l00264">class="code" href="class_c_time_server.html#61b4b595801bf9fedbb0df14ed44332c">00264 TInt class="code" href="class_c_time_server.html#61b4b595801bf9fedbb0df14ed44332c">CTimeServer::ThreadFunction( TAny* class="comment">/*aNone*/ )
00284 "l00265">00265     {
00285 "l00266">00266     CTrapCleanup* cleanupStack = CTrapCleanup::New();
00286 "l00267">00267     class="keywordflow">if ( !( cleanupStack ) )
00287 "l00268">00268         {
00288 "l00269">00269         class="code" href="class_c_time_server.html#57317bfd7bbf407064d8f0b845a16d46">PanicServer( ECreateTrapCleanup );
00289 "l00270">00270         }
00290 "l00271">00271 
00291 "l00272">00272     TRAPD( err, class="code" href="class_c_time_server.html#be5e4a4628587739b7c76951f9577e8e">ThreadFunctionL() );
00292 "l00273">00273     class="keywordflow">if ( err != KErrNone )
00293 "l00274">00274         {
00294 "l00275">00275         class="code" href="class_c_time_server.html#57317bfd7bbf407064d8f0b845a16d46">PanicServer( ESrvCreateServer );
00295 "l00276">00276         }
00296 "l00277">00277 
00297 "l00278">00278     class="keyword">delete cleanupStack;
00298 "l00279">00279     cleanupStack = NULL;
00299 "l00280">00280 
00300 "l00281">00281     class="keywordflow">return KErrNone;
00301 "l00282">00282     }
00302 "l00283">00283 
00303 "l00284">00284 
00304 "l00285">00285 class="comment">// -----------------------------------------------------------------------------
00305 "l00286">00286 class="comment">// E32Main()
00306 "l00287">00287 class="comment">// Provides the API for the operating system to start the executable.
00307 "l00288">00288 class="comment">// Returns the address of the function to be called.
00308 "l00289">00289 class="comment">// -----------------------------------------------------------------------------
00309 "l00290">00290 class="comment">//
00310 "l00291">00291 TInt E32Main()
00311 "l00292">00292     {
00312 "l00293">00293     class="keywordflow">return class="code" href="class_c_time_server.html#61b4b595801bf9fedbb0df14ed44332c">CTimeServer::ThreadFunction( NULL );
00313 "l00294">00294     }
00314 "l00295">00295 
00315 "l00296">00296 
00316 "l00297">00297 
00317 "l00298">00298 class="comment">// End of File
00318 

00319 00320 00321 style="x-cell-content-align: top;00322 width: 100%;00323 border-spacing: 0px;00324 border-spacing: 0px;"00325 cellspacing=0 00326 width=100%> 00327 "width: 50%;"> 00328 "width: 50%;"> 00329 00330 "x-cell-content-align: top;"00331 valign=top> 00332 00341 00363
"width: 50%; 00333 padding-right: 10px; 00334 padding-left: 10px; 00335 border-right-style: None; 00336 border-left-style: None; 00337 border-top-style: None; 00338 border-bottom-style: None;" 00339 width=50%> 00340

"font-family: Arial;">"font-size: smaller;"> Nokia 2009

"width: 50%; 00342 padding-right: 10px; 00343 padding-left: 10px; 00344 border-top-style: None; 00345 border-bottom-style: None; 00346 border-right-style: None;" 00347 width=50%> 00348

"text-align: right; margin-right: -4px;" 00349 align=right>"font-weight: bold;">"#Top" 00350 title="Back to top">00351 src="top.gif" 00352 x-maintain-ratio=TRUE 00353 alt="Back to top" 00354 style="border: none; 00355 width: 18px; 00356 height: 15px; 00357 float: none; 00358 border-style: none; 00359 border-style: none;" 00360 width=18 00361 height=15 00362 border=0>

00364 00365 00366

Generated by  doxygen 1.6.2