00001 "-//W3C//DTD HTML 4.0 Transitional//EN"> 00002 00003 00004 00005 "Content-Type" content="text/html;charset=iso-8859-1"> 00006timeserver.cpp Source File 00007 "style.css" rel="stylesheet" type="text/css"> 00008 00009 00010
"100%" height="1">"2" color="#000000" face="Arial, Helvetica, sans-serif">
00012 S60 5th Edition SDK Example Applications Guide |
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
"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 |
00341 "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"> |