|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: This module contains implementation of CSettingServer |
|
15 * class member functions. |
|
16 * |
|
17 */ |
|
18 |
|
19 // INCLUDE FILES |
|
20 #include <e32std.h> |
|
21 #include <e32svr.h> |
|
22 |
|
23 #include "SettingServerClient.h" |
|
24 #include "SettingServer.h" |
|
25 |
|
26 #include <StifLogger.h> |
|
27 #include "Logging.h" |
|
28 |
|
29 // EXTERNAL DATA STRUCTURES |
|
30 |
|
31 // EXTERNAL FUNCTION PROTOTYPES |
|
32 |
|
33 // CONSTANTS |
|
34 |
|
35 // MACROS |
|
36 |
|
37 // LOCAL CONSTANTS AND MACROS |
|
38 |
|
39 // MODULE DATA STRUCTURES |
|
40 |
|
41 // Struct to pass parameters to server thread |
|
42 struct TThreadStartSetting |
|
43 { |
|
44 TFileName iName; // Server name |
|
45 RThread iServerThread; // The server thread |
|
46 RSemaphore iStarted; // Startup syncronisation semaphore |
|
47 TInt iStartupResult;// Start-up result |
|
48 }; |
|
49 |
|
50 // LOCAL FUNCTION PROTOTYPES |
|
51 |
|
52 // FORWARD DECLARATIONS |
|
53 |
|
54 // ==================== LOCAL FUNCTIONS ======================================= |
|
55 // None |
|
56 |
|
57 #undef LOGGER |
|
58 #define LOGGER iSettingServerLogger |
|
59 |
|
60 // ================= MEMBER FUNCTIONS ========================================= |
|
61 |
|
62 /* |
|
63 ------------------------------------------------------------------------------- |
|
64 |
|
65 Class: CSettingServer |
|
66 |
|
67 Method: PanicServer |
|
68 |
|
69 Description: Panics the server. |
|
70 |
|
71 Parameters: const TSettingServerPanic aPanic :in: Panic code |
|
72 |
|
73 Return Values: None |
|
74 |
|
75 Errors/Exceptions: None |
|
76 |
|
77 Status: Proposal |
|
78 |
|
79 ------------------------------------------------------------------------------- |
|
80 */ |
|
81 void CSettingServer::PanicServer( const TSettingServerPanic aPanic ) |
|
82 { |
|
83 |
|
84 /*#ifdef USE_LOGGER |
|
85 // Check if logger is available, if so, use it. |
|
86 CStifLogger* log = (CStifLogger*) Dll::Tls(); |
|
87 if (log) |
|
88 { |
|
89 log->Log(_L("SettingServer.DLL Panic %d"), aPanic); |
|
90 } |
|
91 #endif |
|
92 */ |
|
93 RDebug::Print( _L( "CSettingServer::PanicServer" ) ); |
|
94 _LIT( KTxtServer,"CSettingServer" ); |
|
95 User::Panic( KTxtServer,aPanic ); |
|
96 |
|
97 } |
|
98 |
|
99 /* |
|
100 ------------------------------------------------------------------------------- |
|
101 |
|
102 Class: CSettingServer |
|
103 |
|
104 Method: NewL |
|
105 |
|
106 Description: Returns new CSettingServer object |
|
107 |
|
108 Parameters: const TName& aName: in: Server name |
|
109 |
|
110 Return Values: None |
|
111 |
|
112 Errors/Exceptions: Leaves if memory allocation, ConstructL or StartL |
|
113 leaves. |
|
114 |
|
115 Status: Proposal |
|
116 |
|
117 ------------------------------------------------------------------------------- |
|
118 */ |
|
119 CSettingServer* CSettingServer::NewL( const TName& aName ) |
|
120 |
|
121 { |
|
122 CSettingServer* self = new( ELeave ) CSettingServer(); |
|
123 CleanupStack::PushL( self ); |
|
124 |
|
125 // Construct the server |
|
126 self->ConstructL(); |
|
127 |
|
128 // Start the server |
|
129 self->StartL( aName ); |
|
130 |
|
131 CleanupStack::Pop( self ); |
|
132 |
|
133 return self; |
|
134 |
|
135 } |
|
136 |
|
137 /* |
|
138 ------------------------------------------------------------------------------- |
|
139 |
|
140 Class: CSettingServer |
|
141 |
|
142 Method: ConstructL |
|
143 |
|
144 Description: Second level constructor. |
|
145 |
|
146 Parameters: None |
|
147 |
|
148 Return Values: None |
|
149 |
|
150 Errors/Exceptions: None |
|
151 |
|
152 Status: Proposal |
|
153 |
|
154 ------------------------------------------------------------------------------- |
|
155 */ |
|
156 void CSettingServer::ConstructL() |
|
157 { |
|
158 // Create logger, in Wins use HTML in HW default logger |
|
159 TLoggerSettings loggerSettings; |
|
160 // Directory must create by hand if test engine log wanted |
|
161 loggerSettings.iCreateLogDirectories = EFalse; |
|
162 loggerSettings.iOverwrite = ETrue; |
|
163 loggerSettings.iTimeStamp = ETrue; |
|
164 loggerSettings.iLineBreak = ETrue; |
|
165 loggerSettings.iEventRanking = EFalse; |
|
166 loggerSettings.iThreadId = EFalse; |
|
167 loggerSettings.iHardwareFormat = CStifLogger::ETxt; |
|
168 #ifndef FORCE_STIF_INTERNAL_LOGGING_TO_RDEBUG |
|
169 loggerSettings.iEmulatorFormat = CStifLogger::EHtml; |
|
170 loggerSettings.iHardwareOutput = CStifLogger::EFile; |
|
171 loggerSettings.iEmulatorOutput = CStifLogger::EFile; |
|
172 #else |
|
173 RDebug::Print( _L( "STIF SettingServer logging forced to RDebug" ) ); |
|
174 loggerSettings.iEmulatorFormat = CStifLogger::ETxt; |
|
175 loggerSettings.iHardwareOutput = CStifLogger::ERDebug; |
|
176 loggerSettings.iEmulatorOutput = CStifLogger::ERDebug; |
|
177 #endif |
|
178 loggerSettings.iUnicode = EFalse; |
|
179 loggerSettings.iAddTestCaseTitle = EFalse; |
|
180 iSettingServerLogger = CStifLogger::NewL( |
|
181 _L( "C:\\logs\\testframework\\testengine\\"), |
|
182 _L( "SettingServer" ), |
|
183 loggerSettings ); |
|
184 |
|
185 // iLoggerSettings initializations to indicate is setting in use |
|
186 iLoggerSettings.iIsDefined.iCreateLogDir = EFalse; |
|
187 iLoggerSettings.iEmulatorPath.Copy( _L( "" ) ); |
|
188 iLoggerSettings.iEmulatorFormat = CStifLogger::ETxt; |
|
189 iLoggerSettings.iEmulatorOutput = CStifLogger::EFile; |
|
190 iLoggerSettings.iHardwarePath.Copy( _L( "" ) ); |
|
191 iLoggerSettings.iHardwareFormat = CStifLogger::ETxt; |
|
192 iLoggerSettings.iHardwareOutput = CStifLogger::EFile; |
|
193 iLoggerSettings.iOverwrite = ETrue; |
|
194 iLoggerSettings.iTimeStamp = ETrue; |
|
195 iLoggerSettings.iLineBreak = ETrue; |
|
196 iLoggerSettings.iEventRanking = EFalse; |
|
197 iLoggerSettings.iThreadId = EFalse; |
|
198 iLoggerSettings.iUnicode = EFalse; |
|
199 iLoggerSettings.iAddTestCaseTitle = EFalse; |
|
200 |
|
201 iLoggerSettings.iIsDefined.iPath = EFalse; |
|
202 iLoggerSettings.iIsDefined.iHwPath = EFalse; |
|
203 iLoggerSettings.iIsDefined.iFormat = EFalse; |
|
204 iLoggerSettings.iIsDefined.iHwFormat = EFalse; |
|
205 iLoggerSettings.iIsDefined.iOutput = EFalse; |
|
206 iLoggerSettings.iIsDefined.iHwOutput = EFalse; |
|
207 iLoggerSettings.iIsDefined.iOverwrite = EFalse; |
|
208 iLoggerSettings.iIsDefined.iLineBreak = EFalse; |
|
209 iLoggerSettings.iIsDefined.iTimeStamp = EFalse; |
|
210 iLoggerSettings.iIsDefined.iEventRanking = EFalse; |
|
211 iLoggerSettings.iIsDefined.iThreadId = EFalse; |
|
212 iLoggerSettings.iIsDefined.iUnicode = EFalse; |
|
213 iLoggerSettings.iIsDefined.iAddTestCaseTitle = EFalse; |
|
214 |
|
215 __TRACE( KInit,( _L( "-.-.-.-.-.-.-.-.-.- SettingServer log starts -.-.-.-.-.-.-.-.-.-" ) ) ); |
|
216 __TRACE( KInit,( _L( "CSettingServer::ConstructL()" ) ) ); |
|
217 |
|
218 } |
|
219 |
|
220 /* |
|
221 ------------------------------------------------------------------------------- |
|
222 |
|
223 Class: CSettingServer |
|
224 |
|
225 Method: CSettingServer |
|
226 |
|
227 Description: Constructor. |
|
228 |
|
229 Initialises non-zero member variables and base class with correct |
|
230 priority. |
|
231 |
|
232 Parameters: None |
|
233 |
|
234 Return Values: None |
|
235 |
|
236 Errors/Exceptions: None |
|
237 |
|
238 Status: Proposal |
|
239 |
|
240 ------------------------------------------------------------------------------- |
|
241 */ |
|
242 CSettingServer::CSettingServer() : |
|
243 CServer2( CSettingServer::ESettingServerSchedulerPriority ) |
|
244 { |
|
245 |
|
246 } |
|
247 |
|
248 /* |
|
249 ------------------------------------------------------------------------------- |
|
250 |
|
251 Class: CSettingServer |
|
252 |
|
253 Method: ~CSettingServer |
|
254 |
|
255 Description: Destructor. |
|
256 |
|
257 Parameters: None |
|
258 |
|
259 Return Values: None |
|
260 |
|
261 Errors/Exceptions: None |
|
262 |
|
263 Status: Proposal |
|
264 |
|
265 ------------------------------------------------------------------------------- |
|
266 */ |
|
267 CSettingServer::~CSettingServer() |
|
268 { |
|
269 delete iSettingServerLogger; |
|
270 |
|
271 } |
|
272 |
|
273 /* |
|
274 ------------------------------------------------------------------------------- |
|
275 |
|
276 Class: CSettingServer |
|
277 |
|
278 Method: NewSessionL |
|
279 |
|
280 Description: Returns new session. |
|
281 |
|
282 Parameters: const TVersion &aVersion:in :Version required |
|
283 |
|
284 Return Values: CSharableSession* New session |
|
285 |
|
286 Errors/Exceptions: Leaves if invalid version |
|
287 Leaves if CSettingServer construction leaves |
|
288 |
|
289 Status: Proposal |
|
290 |
|
291 ------------------------------------------------------------------------------- |
|
292 */ |
|
293 CSession2* CSettingServer::NewSessionL( const TVersion& aVersion, |
|
294 const RMessage2& /*aMessage*/ ) const |
|
295 |
|
296 { |
|
297 // check version is ok |
|
298 TVersion v( KSettingServerMajorVersionNumber, |
|
299 KSettingServerMinorVersionNumber, |
|
300 KSettingServerVersionNumber |
|
301 ); |
|
302 |
|
303 if( !User::QueryVersionSupported( v, aVersion ) ) |
|
304 { |
|
305 User::Leave( KErrNotSupported ); |
|
306 } |
|
307 |
|
308 return CLoggerSetting::NewL( ( CSettingServer* ) this ); |
|
309 } |
|
310 /* |
|
311 ------------------------------------------------------------------------------- |
|
312 |
|
313 Class: CSettingServer |
|
314 |
|
315 Method: OpenSession |
|
316 |
|
317 Description: Opens session. Session calls calls this when session is |
|
318 properly constructed. |
|
319 |
|
320 Parameters: None |
|
321 |
|
322 Return Values: None |
|
323 |
|
324 Errors/Exceptions: None |
|
325 |
|
326 Status: Proposal |
|
327 |
|
328 ------------------------------------------------------------------------------- |
|
329 */ |
|
330 void CSettingServer::OpenSession() |
|
331 { |
|
332 iSessions++; |
|
333 |
|
334 } |
|
335 |
|
336 /* |
|
337 ------------------------------------------------------------------------------- |
|
338 |
|
339 Class: CSettingServer |
|
340 |
|
341 Method: Logger |
|
342 |
|
343 Description: Return pointer to the Logger(iSettingServerLogger) |
|
344 |
|
345 Parameters: None |
|
346 |
|
347 Return Values: CStifLogger*: Pointer to Logger |
|
348 |
|
349 Errors/Exceptions: None |
|
350 |
|
351 Status: Proposal |
|
352 |
|
353 ------------------------------------------------------------------------------- |
|
354 */ |
|
355 CStifLogger* CSettingServer::Logger() |
|
356 { |
|
357 return iSettingServerLogger; |
|
358 |
|
359 } |
|
360 |
|
361 /* |
|
362 ------------------------------------------------------------------------------- |
|
363 |
|
364 Class: CSettingServer |
|
365 |
|
366 Method: CloseSession |
|
367 |
|
368 Description: Closes session. CLoggerSetting::CloseSession calls this |
|
369 to inform server class. |
|
370 |
|
371 If there are not any active sessions, then stop active scheduler and |
|
372 close whole server. |
|
373 |
|
374 Parameters: None |
|
375 |
|
376 Return Values: None |
|
377 |
|
378 Errors/Exceptions: Function panics if OpenSessions() and CloseSessions() |
|
379 does not match. |
|
380 |
|
381 Status: Proposal |
|
382 |
|
383 ------------------------------------------------------------------------------- |
|
384 */ |
|
385 void CSettingServer::CloseSession() |
|
386 { |
|
387 __ASSERT_ALWAYS ( iSessions > 0, CSettingServer::PanicServer(ETooManyCloseSessions)); |
|
388 iSessions--; |
|
389 |
|
390 if ( iSessions == 0 ) |
|
391 { |
|
392 // Stop the active scheduler if no-one is using server anymore |
|
393 CActiveScheduler::Stop(); |
|
394 } |
|
395 |
|
396 } |
|
397 |
|
398 /* |
|
399 ------------------------------------------------------------------------------- |
|
400 |
|
401 Class: CSettingServer |
|
402 |
|
403 Method: ThreadFunction |
|
404 |
|
405 Description: The thread function, where Setting Server lives in |
|
406 |
|
407 Parameters: TAny* aStartInfo aName: in: Start-up information |
|
408 |
|
409 Return Values: TInt: Result from server start |
|
410 |
|
411 Errors/Exceptions: Panics current thread if: |
|
412 Invalid start-up information |
|
413 Clean-up stack can't be created |
|
414 Setting Server can't be started |
|
415 |
|
416 Status: Proposal |
|
417 |
|
418 ------------------------------------------------------------------------------- |
|
419 */ |
|
420 TInt CSettingServer::ThreadFunction( TAny* aStarted ) |
|
421 { |
|
422 __UHEAP_MARK; |
|
423 |
|
424 // Get start-up information |
|
425 TThreadStartSetting* startInfo = ( TThreadStartSetting* ) aStarted; |
|
426 __ASSERT_ALWAYS( startInfo,PanicServer( ENoStartupInformation ) ); |
|
427 |
|
428 // Create clean-up stack |
|
429 CTrapCleanup* tc = CTrapCleanup::New(); |
|
430 __ASSERT_ALWAYS( tc, PanicServer(ECreateTrapCleanup)); |
|
431 |
|
432 // Construct and install active scheduler |
|
433 CActiveScheduler* scheduler = new CActiveScheduler; |
|
434 __ASSERT_ALWAYS( scheduler, PanicServer( EMainSchedulerError ) ); |
|
435 CActiveScheduler::Install( scheduler ); |
|
436 |
|
437 // Construct server |
|
438 CSettingServer* server = NULL; |
|
439 RDebug::Print( startInfo->iName ); |
|
440 TRAPD( err, server = CSettingServer::NewL( startInfo->iName ) ); |
|
441 __ASSERT_ALWAYS( !err, PanicServer( ESvrCreateServer ) ); |
|
442 |
|
443 // Inform that we are up and running |
|
444 startInfo->iStartupResult = KErrNone; |
|
445 startInfo->iStarted.Signal(); |
|
446 |
|
447 // Start handling requests |
|
448 CActiveScheduler::Start(); |
|
449 |
|
450 // Execution continues from here after CActiveScheduler::Stop |
|
451 |
|
452 // Delete the server. This should be deleted before scheduler, |
|
453 // if server still has any active objects |
|
454 delete server; |
|
455 server = NULL; |
|
456 |
|
457 // Delete scheduler. |
|
458 delete scheduler; |
|
459 scheduler = NULL; |
|
460 |
|
461 // Delete clean-up stack |
|
462 delete tc; |
|
463 tc = NULL; |
|
464 |
|
465 __UHEAP_MARKEND; |
|
466 |
|
467 return KErrNone; |
|
468 |
|
469 } |
|
470 |
|
471 // ================= OTHER EXPORTED FUNCTIONS ================================= |
|
472 |
|
473 /* |
|
474 ------------------------------------------------------------------------------- |
|
475 |
|
476 Class: - |
|
477 |
|
478 Method: StartNewServer |
|
479 |
|
480 Description: Starts a new server. Server will be running its own |
|
481 thread and this functions returns when server is up and running or |
|
482 server start-up fails. |
|
483 |
|
484 Parameters: TName& aServerName: inout: The name of the server |
|
485 |
|
486 Return Values: TInt: Symbian error code |
|
487 |
|
488 Errors/Exceptions: None |
|
489 |
|
490 Status: Proposal |
|
491 |
|
492 ------------------------------------------------------------------------------- |
|
493 */ |
|
494 EXPORT_C TInt StartNewServer( TName& aServerName ) |
|
495 { |
|
496 __UHEAP_MARK; |
|
497 |
|
498 _LIT(KServerName, "SettingServer"); |
|
499 |
|
500 //Ccheck server not already started |
|
501 TFindServer findServer( KServerName ); |
|
502 TFullName name; |
|
503 if( findServer.Next( name ) == KErrNone ) |
|
504 { |
|
505 // Server already started, nothing to do |
|
506 aServerName = KServerName; |
|
507 __UHEAP_MARKEND; |
|
508 return KErrAlreadyExists; |
|
509 } |
|
510 |
|
511 // Construct start-up information object |
|
512 TThreadStartSetting* startInfo = new TThreadStartSetting(); |
|
513 if( startInfo == NULL ) |
|
514 { |
|
515 __UHEAP_MARKEND; |
|
516 return KErrNoMemory; |
|
517 } |
|
518 |
|
519 // Fill the start-up information |
|
520 startInfo->iName = KServerName; |
|
521 startInfo->iStartupResult = KErrNone; |
|
522 startInfo->iStarted.CreateLocal( 0 ); |
|
523 |
|
524 // Create thread |
|
525 TInt res = startInfo->iServerThread.Create( |
|
526 startInfo->iName , // Name of thread |
|
527 CSettingServer::ThreadFunction, // Thread function |
|
528 KDefaultStackSize, // Stack size |
|
529 KDefaultHeapSize, // Heap initial size |
|
530 KMaxHeapSize, // Heap start max size |
|
531 startInfo // Parameter to thread function |
|
532 ); |
|
533 |
|
534 // If thread creation failed |
|
535 if( res != KErrNone ) |
|
536 { |
|
537 startInfo->iStarted.Close(); // Close semaphore |
|
538 delete startInfo; |
|
539 startInfo = NULL; |
|
540 __UHEAP_MARKEND; |
|
541 return res; |
|
542 } |
|
543 |
|
544 // Now start thread |
|
545 startInfo->iServerThread.SetPriority( EPriorityMuchMore ); |
|
546 startInfo->iServerThread.Resume(); |
|
547 |
|
548 // Wait until the thread is started |
|
549 startInfo->iStarted.Wait(); |
|
550 |
|
551 // Server is started( or it has returned error ) |
|
552 |
|
553 |
|
554 // Set server name |
|
555 aServerName = KServerName; |
|
556 |
|
557 // Free memory |
|
558 TInt r = startInfo->iStartupResult; |
|
559 startInfo->iServerThread.Close(); |
|
560 startInfo->iStarted.Close(); |
|
561 delete startInfo; |
|
562 startInfo = NULL; |
|
563 |
|
564 __UHEAP_MARKEND; |
|
565 |
|
566 // Return start-up result. |
|
567 return r; |
|
568 |
|
569 } |
|
570 |
|
571 // End of File |