videoscheduler/SchedulerServer/src/CCseSchedulerServerEngine.cpp
changeset 50 557e19da7faf
parent 43 0a57f2fb63b1
child 52 0c0f95df01f4
equal deleted inserted replaced
43:0a57f2fb63b1 50:557e19da7faf
     1 /*
       
     2 * Copyright (c) 2006 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 the License "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:    Actual intelligence of scheduler server*
       
    15 */
       
    16 
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 // INCLUDE FILES
       
    22 #include <s32mem.h>
       
    23 #include <e32def.h>
       
    24 #include <e32const.h>
       
    25 #include "CCseSchedulerServerEngine.h"      // Common methods for server
       
    26 #include <ipvideo/CseSchedulerClientServerCommon.h> // Common defines for client and server
       
    27 #include <ipvideo/CCseScheduledProgram.h>           // Represent one schedule in database
       
    28 #include "CseDebug.h"                       // Debug macros
       
    29 #include "CCseScheduleDB.h"                 // Schedule database
       
    30 #include "CCseSchedulerTimer.h"             // Schedule timer for determining schedule times
       
    31 #include <ipvideo/CCseSchedulerPluginIF.h>          // Scheduler plugin interface
       
    32 #include "CCseSchedulerUniPluginController.h"
       
    33 #include "CCseSchedulerMultiPluginController.h"
       
    34 #include "CCseSchedulerServer.h"
       
    35 
       
    36 
       
    37 // EXTERNAL DATA STRUCTURES
       
    38 // None.
       
    39 
       
    40 // EXTERNAL FUNCTION PROTOTYPES  
       
    41 // None.
       
    42 
       
    43 // CONSTANTS
       
    44 // None
       
    45 
       
    46 // MACROS
       
    47 // None.
       
    48 
       
    49 // LOCAL CONSTANTS AND MACROS
       
    50 // None.
       
    51 
       
    52 // MODULE DATA STRUCTURES
       
    53 // None.
       
    54 
       
    55 // LOCAL FUNCTION PROTOTYPES
       
    56 // None.
       
    57 
       
    58 // ============================ MEMBER FUNCTIONS ===============================
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CCseSchedulerServerEngine::CCseSchedulerServerEngine
       
    62 // C++ default constructor can NOT contain any code, that might leave.
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 CCseSchedulerServerEngine::CCseSchedulerServerEngine( CCseSchedulerServer& aServer ) :
       
    66     iServer( aServer )
       
    67     {
       
    68     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CCseSchedulerServerEngine");
       
    69         
       
    70     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CCseSchedulerServerEngine");
       
    71     }
       
    72 
       
    73 // -----------------------------------------------------------------------------
       
    74 // CCseSchedulerServerEngine::NewL
       
    75 // Two-phased constructor.
       
    76 // -----------------------------------------------------------------------------
       
    77 //
       
    78 CCseSchedulerServerEngine* CCseSchedulerServerEngine::NewL( CCseSchedulerServer& aServer ) 
       
    79     {
       
    80     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::NewL");
       
    81     
       
    82     CCseSchedulerServerEngine* self = new( ELeave ) CCseSchedulerServerEngine( aServer );
       
    83     CleanupStack::PushL( self );
       
    84     self->ConstructL();
       
    85     CleanupStack::Pop( self );
       
    86     
       
    87     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::NewL");
       
    88     return self;
       
    89     }
       
    90 
       
    91 // -----------------------------------------------------------------------------
       
    92 // CCseSchedulerServerEngine::ConstructL
       
    93 // Symbian 2nd phase constructor can leave.
       
    94 // -----------------------------------------------------------------------------
       
    95 //
       
    96 void CCseSchedulerServerEngine::ConstructL()
       
    97     {
       
    98     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::ConstructL");
       
    99         
       
   100     iDb = CCseScheduleDB::NewL();
       
   101     iCompletitionBreaker = CIdle::NewL( CActive::EPriorityLow );
       
   102     
       
   103 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ConstructL");
       
   104     }
       
   105 
       
   106 // -----------------------------------------------------------------------------
       
   107 // CCseSchedulerServerEngine::~CCseSchedulerServerEngine
       
   108 // Destructor.
       
   109 // -----------------------------------------------------------------------------
       
   110 //
       
   111 CCseSchedulerServerEngine::~CCseSchedulerServerEngine()
       
   112     {
       
   113     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::~CCseSchedulerServerEngine");
       
   114     
       
   115     delete iDb;
       
   116     	
       
   117 	iPluginControllerArray.ResetAndDestroy();
       
   118 	iPluginControllerArray.Close();
       
   119     delete iCompletitionBreaker;    
       
   120 		
       
   121     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::~CCseSchedulerServerEngine");
       
   122     }
       
   123 
       
   124 
       
   125 // -----------------------------------------------------------------------------
       
   126 // CCseSchedulerServerEngine::GeneralServiceL
       
   127 //
       
   128 // Schedule operations
       
   129 // -----------------------------------------------------------------------------
       
   130 //
       
   131 void CCseSchedulerServerEngine::GeneralServiceL( const RMessage2& aMessage )
       
   132 	{
       
   133 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GeneralService");
       
   134 	
       
   135 	switch( aMessage.Function() )
       
   136 		{
       
   137 		case ECseAddSchedule:
       
   138 			{
       
   139 			AddScheduleL( aMessage );
       
   140 			break; 		
       
   141 			}
       
   142 		case ECseRemoveSchedule:
       
   143 			{
       
   144 			RemoveScheduleL( aMessage );
       
   145 			break;
       
   146 			}
       
   147 		case ECseGetSchedules:
       
   148 			{
       
   149 			GetSchedulesL( aMessage );	
       
   150 			break;
       
   151 			}
       
   152 		case ECseGetSchedule:
       
   153 			{
       
   154 			GetScheduleL( aMessage );
       
   155 			break;
       
   156 			}
       
   157 		case ECseGetScheduleLength:
       
   158 			{
       
   159 			GetScheduleLengthL( aMessage );
       
   160 			break;
       
   161 			}
       
   162 		case ECseGetSchedulesByAppUid:
       
   163 			{
       
   164 			GetSchedulesByAppUidL( aMessage );
       
   165 			break;
       
   166 			}
       
   167 		case ECseGetScheduleArrayLengthByAppUid:
       
   168 			{
       
   169 			GetScheduleArrayLengthByAppUidL( aMessage );
       
   170 			break;
       
   171 			}
       
   172 		case ECseGetOverlappingSchedulesLength:
       
   173 			{
       
   174 			GetOverlappingSchedulesLengthL( aMessage );
       
   175 			break;
       
   176 			}
       
   177 		case ECseGetOverlappingSchedules:
       
   178 			{
       
   179 			GetOverlappingSchedulesL( aMessage );
       
   180 			break;
       
   181 			}			
       
   182 		case ECseGetScheduleArrayLengthByPluginUid:
       
   183 			{
       
   184 			GetScheduleArrayLengthByPluginUidL( aMessage );
       
   185 			break;
       
   186 			}
       
   187 		case ECseGetSchedulesByPluginUid:
       
   188 			{
       
   189 			GetSchedulesByPluginUidL( aMessage );
       
   190 			break;
       
   191 			}
       
   192 		case ECseGetScheduleArrayLengthByType:
       
   193 			{
       
   194 			GetScheduleArrayLengthByTypeL( aMessage );
       
   195 			break;
       
   196 			}
       
   197 		case ECseGetSchedulesByType:
       
   198 			{
       
   199 			GetSchedulesByTypeL( aMessage );
       
   200 			break;
       
   201 			}
       
   202 		case ECseGetScheduleArrayLengthByTimeframe:		     
       
   203 			{
       
   204 			GetScheduleArrayLengthByTimeframeL( aMessage );
       
   205 			break;
       
   206 			}
       
   207 		case ECseGetSchedulesByTimeframe:
       
   208 			{
       
   209 			GetSchedulesByTimeframeL( aMessage );
       
   210 			break;
       
   211 			}
       
   212 			
       
   213 		default:
       
   214 			{
       
   215 			aMessage.Complete( KErrNotSupported ); 
       
   216 		    break; 
       
   217 			}
       
   218 		}
       
   219 	
       
   220 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GeneralService");
       
   221 	}
       
   222 
       
   223 	
       
   224 // -----------------------------------------------------------------------------
       
   225 // CCseSchedulerServerEngine::PanicClient
       
   226 //
       
   227 // -----------------------------------------------------------------------------
       
   228 //
       
   229 void CCseSchedulerServerEngine::PanicClient( TCseSchedulerServPanic aPanic,
       
   230 											 const RMessage2& aMessage ) const
       
   231     {    
       
   232     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::PanicClient");
       
   233     
       
   234     // Panic the client on server side
       
   235     _LIT( KTxtClientFault, "CseSchedulerServer" );
       
   236     aMessage.Panic( KTxtClientFault, aPanic );
       
   237     
       
   238     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::PanicClient");
       
   239     }
       
   240 
       
   241 // -----------------------------------------------------------------------------
       
   242 // CCseSchedulerServerEngine::AddScheduleL
       
   243 //
       
   244 // -----------------------------------------------------------------------------
       
   245 //
       
   246 void CCseSchedulerServerEngine::AddScheduleL( const RMessage2& aMessage )
       
   247 	{
       
   248 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::AddScheduleL");
       
   249 	TInt ret( KErrNone );
       
   250 	TBuf8<4> id;
       
   251 	
       
   252 	// Initialize buffers...
       
   253 	CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
       
   254 	CleanupStack::PushL( schedule );
       
   255 	HBufC8* msg = HBufC8::NewL( aMessage.GetDesLengthL( 0 ) );
       
   256 	CleanupStack::PushL( msg );
       
   257 	TPtr8 ptr( msg->Des() );
       
   258 	
       
   259 	// Read schedule as a stream format to buffer
       
   260 	aMessage.ReadL( 0, ptr, 0 );
       
   261 			
       
   262 	RDesReadStream readStream;
       
   263 	CleanupClosePushL( readStream );
       
   264 	readStream.Open( ptr );
       
   265 	
       
   266 	// Change stream formatted schedule to "CseScheduledProgram"-format
       
   267 	schedule->InternalizeL( readStream );
       
   268 	
       
   269 	CleanupStack::PopAndDestroy( &readStream );
       
   270 	
       
   271 	// Add it to DB	
       
   272 	iDb->AddScheduleL( *schedule );
       
   273 	
       
   274 	// Make the completition value
       
   275 	id.FillZ();
       
   276 	RDesWriteStream writeStream;
       
   277 	CleanupClosePushL( writeStream );
       
   278 	writeStream.Open( id );
       
   279 	writeStream.WriteUint32L( schedule->DbIdentifier() );
       
   280 	writeStream.CommitL();
       
   281 	CleanupStack::PopAndDestroy( &writeStream );
       
   282 	
       
   283 	aMessage.WriteL( 1, id, 0 );
       
   284 
       
   285     RescheduleByPluginL( schedule->PluginUid() );
       
   286 
       
   287 	CleanupStack::PopAndDestroy( msg );
       
   288 	CleanupStack::PopAndDestroy( schedule );
       
   289 
       
   290     aMessage.Complete( ret );    
       
   291     CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::AddScheduleL, ret=%d", ret);
       
   292 	}
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CCseSchedulerServerEngine::RemoveScheduleL
       
   296 //
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 void CCseSchedulerServerEngine::RemoveScheduleL( const RMessage2& aMessage )
       
   300 	{
       
   301 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::RemoveScheduleL");
       
   302 	
       
   303 	TUint32 dbIdentifier( 0 );
       
   304 	TBuf8<4> idBuff;
       
   305 	TInt32 pluginUid( 0 );
       
   306 	
       
   307 	idBuff.FillZ();
       
   308 	
       
   309 	// Read db identifier from aMessager
       
   310 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   311 	
       
   312 	RDesReadStream readStream;
       
   313 	CleanupClosePushL( readStream );
       
   314 	readStream.Open( idBuff );
       
   315 	dbIdentifier = readStream.ReadUint32L();
       
   316 	CleanupStack::PopAndDestroy( &readStream );
       
   317 	
       
   318 	// Remove schedule
       
   319 	// First check the plugin UID of removed schedule
       
   320 	CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
       
   321 	CleanupStack::PushL( prog );
       
   322 	iDb->GetScheduleByDbIdentifierL( dbIdentifier, prog );
       
   323 	pluginUid = prog->PluginUid( );
       
   324 	// Now remove it from DB
       
   325 	iDb->RemoveScheduleL( dbIdentifier );	
       
   326 	RescheduleByPluginL( pluginUid );
       
   327 	
       
   328 	// Use completition callback to remove those controllers that aren't needed anymore
       
   329 	if( !iCompletitionBreaker->IsActive() )
       
   330         {            
       
   331         iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
       
   332         }
       
   333     else
       
   334         {
       
   335         CSELOGSTRING_HIGH_LEVEL(
       
   336             "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - Breaker already active");
       
   337         }	
       
   338 	
       
   339 	CleanupStack::PopAndDestroy( prog );
       
   340 	aMessage.Complete( KErrNone );	
       
   341 	
       
   342 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RemoveScheduleL");
       
   343 	}
       
   344 
       
   345 // -----------------------------------------------------------------------------
       
   346 // CCseSchedulerServerEngine::GetScheduleL
       
   347 //
       
   348 // -----------------------------------------------------------------------------
       
   349 //
       
   350 void CCseSchedulerServerEngine::GetScheduleL( const RMessage2& aMessage )
       
   351 	{
       
   352 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleL");
       
   353 	TUint32 dbIdentifier( 0 );
       
   354 	TBuf8<4> idBuff;
       
   355 	
       
   356 	idBuff.FillZ();
       
   357 	
       
   358 	// Read db identifier from aMessage
       
   359 	TInt err( aMessage.Read( 0, idBuff ) );
       
   360 		
       
   361 	if ( err == KErrNone )
       
   362 		{
       
   363 		// Create new db identifier to be passed to client
       
   364 		CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
       
   365 		CleanupStack::PushL( prog );
       
   366 
       
   367 		RDesReadStream readStream;
       
   368 		CleanupClosePushL( readStream );
       
   369 		readStream.Open( idBuff );
       
   370 		dbIdentifier = readStream.ReadUint32L();
       
   371 		CleanupStack::PopAndDestroy( &readStream );
       
   372 		
       
   373 		// Get schedule
       
   374 		iDb->GetScheduleByDbIdentifierL( dbIdentifier, prog );
       
   375 		
       
   376 		TInt length( prog->ExternalizeLength() );
       
   377 		
       
   378 		// Externalize schedule to stream format
       
   379 		HBufC8* retBuff = HBufC8::NewL( length );
       
   380 		CleanupStack::PushL( retBuff );
       
   381 		TPtr8 retPtr( retBuff->Des() );
       
   382 		RDesWriteStream writeStream;
       
   383 		CleanupClosePushL( writeStream );
       
   384 		writeStream.Open( retPtr );
       
   385 		prog->ExternalizeL( writeStream );
       
   386 		writeStream.CommitL();
       
   387 		CleanupStack::PopAndDestroy( &writeStream );
       
   388 		
       
   389 		User::LeaveIfError( aMessage.Write( 1, retPtr ) );
       
   390 		CleanupStack::PopAndDestroy( retBuff );
       
   391 		CleanupStack::PopAndDestroy( prog );
       
   392 		}
       
   393 	
       
   394 	aMessage.Complete( err );
       
   395 	CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RemoveScheduleL, err=%d", err);
       
   396 	}
       
   397 	
       
   398 // -----------------------------------------------------------------------------
       
   399 // CCseSchedulerServerEngine::GetScheduleLengthL
       
   400 //
       
   401 // -----------------------------------------------------------------------------
       
   402 //
       
   403 void CCseSchedulerServerEngine::GetScheduleLengthL( const RMessage2& aMessage )
       
   404 	{
       
   405 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleLengthL");
       
   406 	TUint32 dbIdentifier( 0 );
       
   407 	TBuf8<4> idBuff;
       
   408 	TBuf8<4> lenBuff;
       
   409 	TInt length( 0 );
       
   410 	CCseScheduledProgram* schedule = CCseScheduledProgram::NewL();
       
   411 	CleanupStack::PushL( schedule );
       
   412 	idBuff.FillZ();
       
   413 	
       
   414 	// Read db identifier from aMessage
       
   415 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   416 	
       
   417 	RDesReadStream readStream;
       
   418 	CleanupClosePushL( readStream );
       
   419 	readStream.Open( idBuff );
       
   420 	dbIdentifier = readStream.ReadUint32L();
       
   421 	CleanupStack::PopAndDestroy( &readStream );
       
   422 	
       
   423 	// Get schedule
       
   424 	iDb->GetScheduleByDbIdentifierL( dbIdentifier, schedule );
       
   425 	
       
   426 	// Get schedule length
       
   427 	length = schedule->ExternalizeLength();
       
   428 	
       
   429 	lenBuff.FillZ();
       
   430 	
       
   431 	// Write length in stream so we can pass it to client
       
   432 	RDesWriteStream writeStream;
       
   433 	CleanupClosePushL( writeStream );
       
   434 	writeStream.Open( lenBuff );
       
   435     writeStream.WriteInt32L( length );
       
   436 	writeStream.CommitL();
       
   437     CleanupStack::PopAndDestroy( &writeStream );
       
   438     
       
   439     User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
       
   440     
       
   441     CleanupStack::PopAndDestroy( schedule );
       
   442 	
       
   443 	aMessage.Complete( KErrNone );
       
   444 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleLengthL");
       
   445 	}
       
   446 	
       
   447 // -----------------------------------------------------------------------------
       
   448 // CCseSchedulerServerEngine::GetScheduleLengthL
       
   449 //
       
   450 // -----------------------------------------------------------------------------
       
   451 //
       
   452 void CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL( 
       
   453 											const RMessage2& aMessage )
       
   454 	{
       
   455 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL");
       
   456 	TInt32 appUid( 0 );
       
   457 	TBuf8<4> idBuff;
       
   458 	TBuf8<4> lenBuff;
       
   459 	TInt length( 0 );
       
   460 	idBuff.FillZ();
       
   461 	
       
   462 	// Read application uid from aMessage
       
   463 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   464 	
       
   465 	RDesReadStream readStream;
       
   466 	CleanupClosePushL( readStream );
       
   467 	readStream.Open( idBuff );
       
   468 	appUid = readStream.ReadInt32L();
       
   469 	CleanupStack::PopAndDestroy( &readStream );
       
   470 
       
   471     // Get schedules from database
       
   472 	RPointerArray<CCseScheduledProgram> progArray;
       
   473 	CleanupResetAndDestroyPushL( progArray );
       
   474 	iDb->GetApplicationSchedulesL( appUid, progArray );
       
   475 	
       
   476 	// Calculate total length
       
   477 	// Number of items in array
       
   478 	length = length + 4; // Size of TInt32
       
   479 	// Data from array
       
   480 	for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
   481 		{
       
   482 		length = length + progArray[i]->ExternalizeLength();
       
   483 		}
       
   484 	CleanupStack::PopAndDestroy( &progArray ); // closes progArray
       
   485 	
       
   486 	lenBuff.FillZ();
       
   487 	
       
   488 	// Change length value to stream so that we can send it back to client.
       
   489 	RDesWriteStream writeStream;
       
   490 	CleanupClosePushL( writeStream );
       
   491 	writeStream.Open( lenBuff );
       
   492     writeStream.WriteInt32L( length );
       
   493     CleanupStack::PopAndDestroy( &writeStream );
       
   494     
       
   495     User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
       
   496     
       
   497   	aMessage.Complete( KErrNone );	
       
   498 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByAppUidL");
       
   499 	}
       
   500 
       
   501 // -----------------------------------------------------------------------------
       
   502 // CCseSchedulerServerEngine::GetSchedulesByAppUidL
       
   503 //
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 void CCseSchedulerServerEngine::GetSchedulesByAppUidL( const RMessage2& aMessage )
       
   507 	{
       
   508 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByAppUidL");
       
   509 	TInt32 appUid( 0 );
       
   510 	TBuf8<4> idBuff;
       
   511 	idBuff.FillZ();
       
   512 	TInt32 numberOfElems( 0 );
       
   513 	TInt length( 0 );
       
   514 	
       
   515 	// Read application UID from aMessage
       
   516 	TInt err( aMessage.Read( 0, idBuff ) );
       
   517 		
       
   518 	if ( err == KErrNone )
       
   519 		{
       
   520 		RPointerArray<CCseScheduledProgram> progArray;
       
   521 		CleanupResetAndDestroyPushL( progArray );
       
   522 		RDesReadStream readStream;
       
   523 		CleanupClosePushL( readStream );
       
   524 		readStream.Open( idBuff );
       
   525 		appUid = readStream.ReadInt32L();
       
   526 		CleanupStack::PopAndDestroy( &readStream );
       
   527 		
       
   528 		// Get schedules from database
       
   529 		iDb->GetApplicationSchedulesL( appUid, progArray );
       
   530 		
       
   531 		// Calculate total length
       
   532 		// Number of items in array
       
   533 		length = length + 4; // Size of TInt32
       
   534 		// Data from array
       
   535 		for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
   536 			{		
       
   537 			length += progArray[i]->ExternalizeLength();
       
   538 			}
       
   539 		
       
   540 		// Allocate write stream
       
   541 		HBufC8* retBuff = HBufC8::NewL( length );
       
   542 		CleanupStack::PushL( retBuff );
       
   543 		TPtr8 retPtr( retBuff->Des() );
       
   544 		RDesWriteStream writeStream;
       
   545 		CleanupClosePushL( writeStream );
       
   546 		writeStream.Open( retPtr );
       
   547 		
       
   548 		// Fill stream
       
   549 		// Write number elems
       
   550 		numberOfElems = progArray.Count();
       
   551 		writeStream.WriteInt32L( numberOfElems );		
       
   552 		// Add elems one by one
       
   553 		for ( TInt i = 0; i < progArray.Count(); i++ )
       
   554 			{
       
   555 			progArray[i]->ExternalizeL( writeStream );
       
   556 			}
       
   557 		writeStream.CommitL();
       
   558 		
       
   559 		CleanupStack::PopAndDestroy( &writeStream );
       
   560 		
       
   561 		User::LeaveIfError( aMessage.Write( 1, retPtr ) );	
       
   562 		
       
   563 		CleanupStack::PopAndDestroy( retBuff );
       
   564 		CleanupStack::PopAndDestroy( &progArray );
       
   565 		}
       
   566 
       
   567 	aMessage.Complete( err );
       
   568 	CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByAppUidL", err);
       
   569 	}
       
   570 
       
   571 // -----------------------------------------------------------------------------
       
   572 // CCseSchedulerServerEngine::GetSchedulesL
       
   573 //
       
   574 // -----------------------------------------------------------------------------
       
   575 //
       
   576 void CCseSchedulerServerEngine::GetSchedulesL( const RMessage2& aMessage )
       
   577 	{
       
   578 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesL");
       
   579 	aMessage.Complete( KErrNotSupported );
       
   580 	}
       
   581     
       
   582 // -----------------------------------------------------------------------------
       
   583 // CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL
       
   584 //
       
   585 // -----------------------------------------------------------------------------
       
   586 //
       
   587 void CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL( 
       
   588 											const RMessage2& aMessage )
       
   589 	{
       
   590 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL");
       
   591 	TInt32 scheduleType( 0 );
       
   592 	TBuf8<20> idBuff;
       
   593 	TBuf8<sizeof( TUint32 )> retBuf; // contains length
       
   594 	
       
   595 	TUint32 length( 0 );
       
   596 	
       
   597 	idBuff.FillZ();
       
   598 	
       
   599 	// Read schedule type from aMessage
       
   600 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   601 	
       
   602 	RDesReadStream readStream;
       
   603 	CleanupClosePushL( readStream );
       
   604 	readStream.Open( idBuff );
       
   605 	scheduleType = readStream.ReadInt32L();
       
   606 
       
   607 	TUint32 lower( 0 );
       
   608 	TUint32 upper( 0 );
       
   609 	
       
   610 	// Read start time from the aMessage
       
   611     lower = readStream.ReadUint32L();
       
   612     upper = readStream.ReadUint32L();
       
   613     TInt64 time( 0 );
       
   614     time = (TInt64) lower;    
       
   615     TInt64 longUpper = (TInt64) upper;
       
   616     longUpper = longUpper << 32;
       
   617     longUpper &= (0xFFFFFFFF00000000ULL);    
       
   618     time |= longUpper;
       
   619     TInt64 startTime = time;  
       
   620         
       
   621 	// Read end time from the aMessage
       
   622 	lower = readStream.ReadUint32L();
       
   623     upper = readStream.ReadUint32L();
       
   624     time = (TInt64) lower;    
       
   625     longUpper = (TInt64) upper;
       
   626     longUpper = longUpper << 32;
       
   627     longUpper &= (0xFFFFFFFF00000000ULL);    
       
   628     time |= longUpper;
       
   629     TInt64 endTime = time;  
       
   630 
       
   631 	CleanupStack::PopAndDestroy( &readStream );
       
   632 
       
   633 	RPointerArray<CCseScheduledProgram> schedules;
       
   634 	CleanupResetAndDestroyPushL( schedules );
       
   635 	
       
   636 	// Get overlapping schedules
       
   637 	iDb->GetOverlappingSchedulesL( scheduleType, startTime, endTime, schedules );
       
   638 	
       
   639 	// Count length one by one
       
   640 	for ( TInt i = 0; i < schedules.Count(); i++ )
       
   641 		{
       
   642 		length += schedules[i]->ExternalizeLength();
       
   643 		}
       
   644 	
       
   645 	CleanupStack::PopAndDestroy( &schedules );	
       
   646 
       
   647 	retBuf.FillZ();
       
   648 	
       
   649 	
       
   650 	// Write length to stream so we can pass it to client
       
   651 	RDesWriteStream writeStream;
       
   652 	CleanupClosePushL( writeStream );
       
   653 	writeStream.Open( retBuf );
       
   654     writeStream.WriteInt32L( length );
       
   655 	writeStream.CommitL();
       
   656     CleanupStack::PopAndDestroy( &writeStream );
       
   657     
       
   658     User::LeaveIfError( aMessage.Write( 1, retBuf ) );
       
   659 
       
   660 	aMessage.Complete( KErrNone );
       
   661 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetOverlappingSchedulesLengthL");
       
   662 	}
       
   663 
       
   664 
       
   665 // -----------------------------------------------------------------------------
       
   666 // CCseSchedulerServerEngine::GetOverlappingSchedulesL
       
   667 //
       
   668 // -----------------------------------------------------------------------------
       
   669 //
       
   670 void CCseSchedulerServerEngine::GetOverlappingSchedulesL( 
       
   671 											const RMessage2& aMessage )
       
   672 	{
       
   673 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetOverlappingSchedulesL");
       
   674 	TInt32 scheduleType( 0 );
       
   675 	TBuf8<20> idBuff;
       
   676 	
       
   677 	idBuff.FillZ();
       
   678 	
       
   679 	// Read schedule type from aMessage
       
   680 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   681 	
       
   682 	RDesReadStream readStream;
       
   683 	CleanupClosePushL( readStream );
       
   684 	readStream.Open( idBuff );
       
   685 	scheduleType = readStream.ReadInt32L();
       
   686 
       
   687 	TUint32 lower( 0 );
       
   688 	TUint32 upper( 0 );
       
   689 	
       
   690 	// Read start time from aMessage
       
   691     lower = readStream.ReadUint32L();
       
   692     upper = readStream.ReadUint32L();
       
   693     TInt64 time( 0 );
       
   694     time = (TInt64) lower;    
       
   695     TInt64 longUpper = (TInt64) upper;
       
   696     longUpper = longUpper << 32;
       
   697     longUpper &= (0xFFFFFFFF00000000ULL);    
       
   698     time |= longUpper;
       
   699     TInt64 startTime = time;  
       
   700         
       
   701 	//Read end time from aMessage
       
   702 	lower = readStream.ReadUint32L();
       
   703     upper = readStream.ReadUint32L();
       
   704     time = (TInt64) lower;    
       
   705     longUpper = (TInt64) upper;
       
   706     longUpper = longUpper << 32;
       
   707     longUpper &= (0xFFFFFFFF00000000ULL);    
       
   708     time |= longUpper;
       
   709     TInt64 endTime = time;  
       
   710 
       
   711 	CleanupStack::PopAndDestroy( &readStream );
       
   712 
       
   713 	RPointerArray<CCseScheduledProgram> schedules;
       
   714 	CleanupResetAndDestroyPushL( schedules );
       
   715 	
       
   716 	// Get overlapping schedules from database
       
   717 	iDb->GetOverlappingSchedulesL( scheduleType, startTime, endTime, schedules );
       
   718 	
       
   719 	TUint32 length( 0 );
       
   720 
       
   721 	length += sizeof( TInt32 ); // item count added to buffer first
       
   722 	
       
   723 	// Length of the schedules needed for transfer stream
       
   724 	for ( TInt i = 0; i < schedules.Count(); i++ )
       
   725 		{
       
   726 		length += schedules[i]->ExternalizeLength();
       
   727 		}
       
   728 	
       
   729 	HBufC8* retBuf = HBufC8::NewLC( length );
       
   730 	TPtr8 retBufPtr( retBuf->Des() );
       
   731 
       
   732 	RDesWriteStream writeStream;
       
   733 	CleanupClosePushL( writeStream );
       
   734 	writeStream.Open( retBufPtr );
       
   735 	// write item count to buffer
       
   736     writeStream.WriteInt32L( schedules.Count() );
       
   737 	
       
   738 	// write all items to buffer
       
   739 	for ( TInt j = 0; j < schedules.Count(); j++ )
       
   740 		{
       
   741 		schedules[j]->ExternalizeL( writeStream );
       
   742 		}
       
   743 	writeStream.CommitL();
       
   744     CleanupStack::PopAndDestroy( &writeStream );
       
   745 
       
   746 	User::LeaveIfError( aMessage.Write( 1, retBufPtr ) );
       
   747 
       
   748     CleanupStack::PopAndDestroy( retBuf );
       
   749 	CleanupStack::PopAndDestroy( &schedules );	
       
   750 
       
   751 	aMessage.Complete( KErrNone );
       
   752 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetOverlappingSchedulesL");
       
   753 	}
       
   754 
       
   755 
       
   756 
       
   757 // -----------------------------------------------------------------------------
       
   758 // CCseSchedulerServerEngine::RescheduleL
       
   759 //
       
   760 // -----------------------------------------------------------------------------
       
   761 //
       
   762 void CCseSchedulerServerEngine::RescheduleL()
       
   763 	{
       
   764 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::Reschedule");
       
   765 			
       
   766 	RArray<TInt32> uidArray;
       
   767 	
       
   768 	iDb->GetPluginsL( uidArray );
       
   769 	
       
   770 	if( uidArray.Count() > 0 )
       
   771 	    {
       
   772 	    for(TInt i = 0; i < uidArray.Count(); i++)
       
   773 	        {
       
   774 	        TTime runTime( iDb->GetNextScheduleTimeByPluginL( uidArray[i] ) );
       
   775 	        
       
   776 	        // Search for existing plugin controller for this schedule
       
   777 	        RPointerArray<CCseScheduledProgram> schedules;
       
   778 	        CleanupResetAndDestroyPushL( schedules ); 	        
       
   779 	        iDb->GetSchedulesByTimeAndPluginL( runTime, uidArray[i], schedules );
       
   780 	        
       
   781 	        if( schedules.Count() > 0 )
       
   782 	            {	        
       
   783     	        TBool controllerFound( EFalse );
       
   784     	        
       
   785     	        // Plugin controller might existCheck if the plugin controller already exists.
       
   786     	        for( TInt ii = 0; ii < iPluginControllerArray.Count(); ii++ )
       
   787     	            {
       
   788     	            if( schedules[0]->PluginUid() == iPluginControllerArray[ii]->PluginUid() )
       
   789     	                {
       
   790     	                iPluginControllerArray[ii]->SetSchedulesL( schedules );
       
   791     	                controllerFound = ETrue;
       
   792     	                break;	                
       
   793     	                }	                
       
   794     	            }
       
   795     	        
       
   796     	        // It didn't so we create new one
       
   797     	        if( controllerFound == EFalse )
       
   798     	            {                            
       
   799                     if( schedules[0]->PluginType() == CCseScheduledProgram::ECseUniPlugin )
       
   800                         {
       
   801                         CSELOGSTRING_HIGH_LEVEL(
       
   802                             "CCseSchedulerServerEngine::Reschedule: Create new uniplugin controller");
       
   803                         // Create new PluginController
       
   804                         iPluginControllerArray.AppendL( CCseSchedulerUniPluginController::NewL( *this, schedules[0]->PluginUid() ) );
       
   805                         // Add schedules to just created controller
       
   806                         iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
       
   807                         }
       
   808                     else if ( schedules[0]->PluginType() == CCseScheduledProgram::ECseMultiPlugin )
       
   809                         {
       
   810                         CSELOGSTRING_HIGH_LEVEL(
       
   811                         "CCseSchedulerServerEngine::Reschedule: Create new multiplugin controller");
       
   812                         // Create new PluginController
       
   813                         iPluginControllerArray.AppendL( CCseSchedulerMultiPluginController::NewL( *this, schedules[0]->PluginUid() ) );
       
   814                         // Add schedules to just created controller
       
   815                         iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
       
   816                         }
       
   817                     else
       
   818                         {
       
   819                         // WTF?!?!
       
   820                         CSELOGSTRING_HIGH_LEVEL(
       
   821                             "CCseSchedulerServerEngine::Reschedule: Plugin something completely different");
       
   822                         }
       
   823     	            }
       
   824 	            }
       
   825 	        // Delete schedule array.
       
   826 	        CleanupStack::PopAndDestroy( &schedules );
       
   827 	        }
       
   828 	    }
       
   829 	    
       
   830 	uidArray.Reset();
       
   831 	uidArray.Close();
       
   832 	
       
   833     // Stop server if we dont have any clients and there is no more
       
   834 	// reason for us to live (no schedules active).
       
   835 	iServer.StopServer();
       
   836 	
       
   837 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::Reschedule out");
       
   838 	}
       
   839 
       
   840 // -----------------------------------------------------------------------------
       
   841 // CCseSchedulerServerEngine::IsSchedulerActive()
       
   842 //
       
   843 // -----------------------------------------------------------------------------
       
   844 //
       
   845 TBool CCseSchedulerServerEngine::IsSchedulerActive() const
       
   846     {
       
   847 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::IsSchedulerActive");
       
   848 	
       
   849 	TBool ret(EFalse);
       
   850 	
       
   851 	if( iPluginControllerArray.Count() > 0 )
       
   852         {
       
   853         ret = ETrue;
       
   854         }
       
   855 	
       
   856     CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IsSchedulerActive: %d", ret);
       
   857 	return ret;
       
   858 	}
       
   859 	
       
   860 // -----------------------------------------------------------------------------
       
   861 // CCseSchedulerServerEngine::Close()
       
   862 //
       
   863 // -----------------------------------------------------------------------------
       
   864 //
       
   865 void CCseSchedulerServerEngine::Close()
       
   866 	{
       
   867 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::IsSchedulerActive");
       
   868 	
       
   869     while( AccessCount() >= 1 )
       
   870         {
       
   871         Dec();
       
   872         }
       
   873 	
       
   874 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IsSchedulerActive");
       
   875 	}
       
   876 
       
   877 	
       
   878 // -----------------------------------------------------------------------------
       
   879 // CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL
       
   880 //
       
   881 // -----------------------------------------------------------------------------
       
   882 //
       
   883 void CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL( const RMessage2& aMessage )
       
   884     {
       
   885     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL");
       
   886 	TInt32 pluginUid( 0 );
       
   887 	TBuf8<4> idBuff;
       
   888 	TBuf8<4> lenBuff;
       
   889 	TInt length( 0 );
       
   890 	idBuff.FillZ();
       
   891 	
       
   892 	// Read application uid from aMessage
       
   893 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
   894 	
       
   895 	RDesReadStream readStream;
       
   896 	CleanupClosePushL( readStream );
       
   897 	readStream.Open( idBuff );
       
   898 	pluginUid = readStream.ReadInt32L();
       
   899 	CleanupStack::PopAndDestroy( &readStream );
       
   900 
       
   901     // Get schedules from database
       
   902 	RPointerArray<CCseScheduledProgram> progArray;
       
   903 	CleanupResetAndDestroyPushL( progArray );	
       
   904 	iDb->GetSchedulesByPluginL( pluginUid, progArray);
       
   905 	
       
   906 	// Calculate total length
       
   907 	// Number of items in array
       
   908 	length = length + 4; // Size of TInt32
       
   909 	// Data from array
       
   910 	for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
   911 		{
       
   912 		length = length + progArray[i]->ExternalizeLength();
       
   913 		}
       
   914 	CleanupStack::PopAndDestroy( &progArray ); // closes progArray
       
   915 	
       
   916 	lenBuff.FillZ();
       
   917 	
       
   918 	// Change length value to stream so that we can send it back to client.
       
   919 	RDesWriteStream writeStream;
       
   920 	CleanupClosePushL( writeStream );
       
   921 	writeStream.Open( lenBuff );
       
   922     writeStream.WriteInt32L( length );
       
   923     CleanupStack::PopAndDestroy( &writeStream );
       
   924     
       
   925     User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
       
   926     
       
   927   	aMessage.Complete( KErrNone );	
       
   928 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByPluginUidL");
       
   929     }
       
   930     
       
   931 // -----------------------------------------------------------------------------
       
   932 // CCseSchedulerServerEngine::GetSchedulesByPluginUidL
       
   933 //
       
   934 // -----------------------------------------------------------------------------
       
   935 //
       
   936 void CCseSchedulerServerEngine::GetSchedulesByPluginUidL( const RMessage2& aMessage )
       
   937     {
       
   938     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByPluginUidL");
       
   939 	TInt32 pluginUid( 0 );
       
   940 	TBuf8<4> idBuff;
       
   941 	idBuff.FillZ();
       
   942 	TInt32 numberOfElems( 0 );
       
   943 	TInt length( 0 );
       
   944 	
       
   945 	// Read application UID from aMessage
       
   946 	TInt err( aMessage.Read( 0, idBuff ) );
       
   947 		
       
   948 	if ( err == KErrNone )
       
   949 		{
       
   950 		RPointerArray<CCseScheduledProgram> progArray;
       
   951 		CleanupResetAndDestroyPushL( progArray );
       
   952 		RDesReadStream readStream;
       
   953 		CleanupClosePushL( readStream );
       
   954 		readStream.Open( idBuff );
       
   955 		pluginUid = readStream.ReadInt32L();
       
   956 		CleanupStack::PopAndDestroy( &readStream );
       
   957 		
       
   958 		// Get schedules from database
       
   959 		iDb->GetSchedulesByPluginL( pluginUid, progArray );
       
   960 		
       
   961 		// Calculate total length
       
   962 		// Number of items in array
       
   963 		length = length + 4; // Size of TInt32
       
   964 		// Data from array
       
   965 		for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
   966 			{		
       
   967 			length += progArray[i]->ExternalizeLength();
       
   968 			}
       
   969 		
       
   970 		// Allocate write stream
       
   971 		HBufC8* retBuff = HBufC8::NewL( length );
       
   972 		CleanupStack::PushL( retBuff );
       
   973 		TPtr8 retPtr( retBuff->Des() );
       
   974 		RDesWriteStream writeStream;
       
   975 		CleanupClosePushL( writeStream );
       
   976 		writeStream.Open( retPtr );
       
   977 		
       
   978 		// Fill stream
       
   979 		// Write number elems
       
   980 		numberOfElems = progArray.Count();
       
   981 		writeStream.WriteInt32L( numberOfElems );		
       
   982 		// Add elems one by one
       
   983 		for ( TInt i = 0; i < progArray.Count(); i++ )
       
   984 			{
       
   985 			progArray[i]->ExternalizeL( writeStream );
       
   986 			}
       
   987 		writeStream.CommitL();
       
   988 		
       
   989 		CleanupStack::PopAndDestroy( &writeStream );
       
   990 		
       
   991 		User::LeaveIfError( aMessage.Write( 1, retPtr ) );	
       
   992 		
       
   993 		CleanupStack::PopAndDestroy( retBuff );
       
   994 		CleanupStack::PopAndDestroy( &progArray );
       
   995 		}
       
   996 
       
   997 	aMessage.Complete( err );
       
   998 	CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByPluginUidL", err);
       
   999     }
       
  1000     
       
  1001 // -----------------------------------------------------------------------------
       
  1002 // CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL
       
  1003 //
       
  1004 // -----------------------------------------------------------------------------
       
  1005 //
       
  1006 void CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL( const RMessage2& aMessage )
       
  1007     {
       
  1008     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL");
       
  1009 	TInt32 type( 0 );
       
  1010 	TBuf8<4> idBuff;
       
  1011 	TBuf8<4> lenBuff;
       
  1012 	TInt length( 0 );
       
  1013 	idBuff.FillZ();
       
  1014 	
       
  1015 	// Read application uid from aMessage
       
  1016 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
  1017 	
       
  1018 	RDesReadStream readStream;
       
  1019 	CleanupClosePushL( readStream );
       
  1020 	readStream.Open( idBuff );
       
  1021 	type = readStream.ReadInt32L();
       
  1022 	CleanupStack::PopAndDestroy( &readStream );
       
  1023 
       
  1024     // Get schedules from database
       
  1025 	RPointerArray<CCseScheduledProgram> progArray;
       
  1026 	CleanupResetAndDestroyPushL( progArray );	
       
  1027 	iDb->GetSchedulesByTypeL( type, progArray);
       
  1028 	
       
  1029 	// Calculate total length
       
  1030 	// Number of items in array
       
  1031 	length = length + 4; // Size of TInt32
       
  1032 	// Data from array
       
  1033 	for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
  1034 		{
       
  1035 		length = length + progArray[i]->ExternalizeLength();
       
  1036 		}
       
  1037 	CleanupStack::PopAndDestroy( &progArray ); // closes progArray
       
  1038 	
       
  1039 	lenBuff.FillZ();
       
  1040 	
       
  1041 	// Change length value to stream so that we can send it back to client.
       
  1042 	RDesWriteStream writeStream;
       
  1043 	CleanupClosePushL( writeStream );
       
  1044 	writeStream.Open( lenBuff );
       
  1045     writeStream.WriteInt32L( length );
       
  1046     CleanupStack::PopAndDestroy( &writeStream );
       
  1047     
       
  1048     User::LeaveIfError( aMessage.Write( 1, lenBuff ) );
       
  1049     
       
  1050   	aMessage.Complete( KErrNone );	
       
  1051 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByTypeL");
       
  1052     }
       
  1053 
       
  1054 // -----------------------------------------------------------------------------
       
  1055 // CCseSchedulerServerEngine::GetSchedulesByTypeL
       
  1056 //
       
  1057 // -----------------------------------------------------------------------------
       
  1058 //
       
  1059 void CCseSchedulerServerEngine::GetSchedulesByTypeL( const RMessage2& aMessage )
       
  1060     {
       
  1061     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByTypeL");
       
  1062 	TInt32 type( 0 );
       
  1063 	TBuf8<4> idBuff;
       
  1064 	idBuff.FillZ();
       
  1065 	TInt32 numberOfElems( 0 );
       
  1066 	TInt length( 0 );
       
  1067 	
       
  1068 	// Read application UID from aMessage
       
  1069 	TInt err( aMessage.Read( 0, idBuff ) );
       
  1070 		
       
  1071 	if ( err == KErrNone )
       
  1072 		{
       
  1073 		RPointerArray<CCseScheduledProgram> progArray;
       
  1074 		CleanupResetAndDestroyPushL( progArray );
       
  1075 		RDesReadStream readStream;
       
  1076 		CleanupClosePushL( readStream );
       
  1077 		readStream.Open( idBuff );
       
  1078 		type = readStream.ReadInt32L();
       
  1079 		CleanupStack::PopAndDestroy( &readStream );
       
  1080 		
       
  1081 		// Get schedules from database
       
  1082 		iDb->GetSchedulesByTypeL( type, progArray );
       
  1083 		
       
  1084 		// Calculate total length
       
  1085 		// Number of items in array
       
  1086 		length = length + 4; // Size of TInt32
       
  1087 		// Data from array
       
  1088 		for ( TInt i = 0 ; i < progArray.Count(); i++ )
       
  1089 			{		
       
  1090 			length += progArray[i]->ExternalizeLength();
       
  1091 			}
       
  1092 		
       
  1093 		// Allocate write stream
       
  1094 		HBufC8* retBuff = HBufC8::NewL( length );
       
  1095 		CleanupStack::PushL( retBuff );
       
  1096 		TPtr8 retPtr( retBuff->Des() );
       
  1097 		RDesWriteStream writeStream;
       
  1098 		CleanupClosePushL( writeStream );
       
  1099 		writeStream.Open( retPtr );
       
  1100 		
       
  1101 		// Fill stream
       
  1102 		// Write number elems
       
  1103 		numberOfElems = progArray.Count();
       
  1104 		writeStream.WriteInt32L( numberOfElems );		
       
  1105 		// Add elems one by one
       
  1106 		for ( TInt i = 0; i < progArray.Count(); i++ )
       
  1107 			{
       
  1108 			progArray[i]->ExternalizeL( writeStream );
       
  1109 			}
       
  1110 		writeStream.CommitL();
       
  1111 		
       
  1112 		CleanupStack::PopAndDestroy( &writeStream );
       
  1113 		
       
  1114 		User::LeaveIfError( aMessage.Write( 1, retPtr ) );	
       
  1115 		
       
  1116 		CleanupStack::PopAndDestroy( retBuff );
       
  1117 		CleanupStack::PopAndDestroy( &progArray );
       
  1118 		}
       
  1119 
       
  1120 	aMessage.Complete( err );
       
  1121 	CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByTypeL", err);
       
  1122     }
       
  1123 
       
  1124 // -----------------------------------------------------------------------------
       
  1125 // CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL
       
  1126 //
       
  1127 // -----------------------------------------------------------------------------
       
  1128 //
       
  1129 void CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL( const RMessage2& aMessage )
       
  1130     {
       
  1131     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL");	
       
  1132 	TBuf8<20> idBuff;
       
  1133 	TBuf8<sizeof( TUint32 )> retBuf; // contains length
       
  1134 	
       
  1135 	TUint32 length( 0 );
       
  1136 	
       
  1137 	idBuff.FillZ();
       
  1138 	
       
  1139 	// Read schedule type from aMessage
       
  1140 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
  1141 	
       
  1142 	RDesReadStream readStream;
       
  1143 	CleanupClosePushL( readStream );
       
  1144 	readStream.Open( idBuff );
       
  1145 
       
  1146 	TUint32 lower( 0 );
       
  1147 	TUint32 upper( 0 );
       
  1148 	
       
  1149 	// Read start time from the aMessage
       
  1150     lower = readStream.ReadUint32L();
       
  1151     upper = readStream.ReadUint32L();
       
  1152     TInt64 time( 0 );
       
  1153     time = (TInt64) lower;    
       
  1154     TInt64 longUpper = (TInt64) upper;
       
  1155     longUpper = longUpper << 32;
       
  1156     longUpper &= (0xFFFFFFFF00000000ULL);    
       
  1157     time |= longUpper;
       
  1158     TInt64 beginning = time;  
       
  1159         
       
  1160 	// Read end time from the aMessage
       
  1161 	lower = readStream.ReadUint32L();
       
  1162     upper = readStream.ReadUint32L();
       
  1163     time = (TInt64) lower;    
       
  1164     longUpper = (TInt64) upper;
       
  1165     longUpper = longUpper << 32;
       
  1166     longUpper &= (0xFFFFFFFF00000000ULL);    
       
  1167     time |= longUpper;
       
  1168     TInt64 end = time;  
       
  1169 
       
  1170 	CleanupStack::PopAndDestroy( &readStream );
       
  1171 
       
  1172 	RPointerArray<CCseScheduledProgram> schedules;
       
  1173 	CleanupResetAndDestroyPushL( schedules );
       
  1174 	
       
  1175 	// Get overlapping schedules
       
  1176 	iDb->GetSchedulesByTimeframeL( beginning, end, schedules );
       
  1177 	
       
  1178 	// Count length one by one
       
  1179 	for ( TInt i = 0; i < schedules.Count(); i++ )
       
  1180 		{
       
  1181 		length += schedules[i]->ExternalizeLength();
       
  1182 		}
       
  1183 	
       
  1184 	CleanupStack::PopAndDestroy( &schedules );	
       
  1185 
       
  1186 	retBuf.FillZ();
       
  1187 	
       
  1188 	
       
  1189 	// Write length to stream so we can pass it to client
       
  1190 	RDesWriteStream writeStream;
       
  1191 	CleanupClosePushL( writeStream );
       
  1192 	writeStream.Open( retBuf );
       
  1193     writeStream.WriteInt32L( length );
       
  1194 	writeStream.CommitL();
       
  1195     CleanupStack::PopAndDestroy( &writeStream );
       
  1196     
       
  1197     User::LeaveIfError( aMessage.Write( 1, retBuf ) );
       
  1198 
       
  1199 	aMessage.Complete( KErrNone );
       
  1200 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetScheduleArrayLengthByTimeframeL");	
       
  1201     }
       
  1202     
       
  1203 // -----------------------------------------------------------------------------
       
  1204 // CCseSchedulerServerEngine::GetSchedulesByTimeframeL
       
  1205 //
       
  1206 // -----------------------------------------------------------------------------
       
  1207 //
       
  1208 void CCseSchedulerServerEngine::GetSchedulesByTimeframeL( const RMessage2& aMessage )
       
  1209     {
       
  1210     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::GetSchedulesByTimeframeL");
       
  1211 	TBuf8<20> idBuff;
       
  1212 	
       
  1213 	idBuff.FillZ();
       
  1214 	
       
  1215 	// Read schedule type from aMessage
       
  1216 	User::LeaveIfError( aMessage.Read( 0, idBuff ) );
       
  1217 	
       
  1218 	RDesReadStream readStream;
       
  1219 	CleanupClosePushL( readStream );
       
  1220 	readStream.Open( idBuff );
       
  1221 
       
  1222 	TUint32 lower( 0 );
       
  1223 	TUint32 upper( 0 );
       
  1224 	
       
  1225 	// Read start time from aMessage
       
  1226     lower = readStream.ReadUint32L();
       
  1227     upper = readStream.ReadUint32L();
       
  1228     TInt64 time( 0 );
       
  1229     time = (TInt64) lower;    
       
  1230     TInt64 longUpper = (TInt64) upper;
       
  1231     longUpper = longUpper << 32;
       
  1232     longUpper &= (0xFFFFFFFF00000000ULL);    
       
  1233     time |= longUpper;
       
  1234     TInt64 beginning = time;  
       
  1235         
       
  1236 	//Read end time from aMessage
       
  1237 	lower = readStream.ReadUint32L();
       
  1238     upper = readStream.ReadUint32L();
       
  1239     time = (TInt64) lower;    
       
  1240     longUpper = (TInt64) upper;
       
  1241     longUpper = longUpper << 32;
       
  1242     longUpper &= (0xFFFFFFFF00000000ULL);    
       
  1243     time |= longUpper;
       
  1244     TInt64 end = time;  
       
  1245 
       
  1246 	CleanupStack::PopAndDestroy( &readStream );
       
  1247 
       
  1248 	RPointerArray<CCseScheduledProgram> schedules;
       
  1249 	CleanupResetAndDestroyPushL( schedules );
       
  1250 	
       
  1251 	// Get overlapping schedules from database
       
  1252 	iDb->GetSchedulesByTimeframeL( beginning, end, schedules );
       
  1253 	
       
  1254 	TUint32 length( 0 );
       
  1255 
       
  1256 	length += sizeof( TInt32 ); // item count added to buffer first
       
  1257 	
       
  1258 	// Length of the schedules needed for transfer stream
       
  1259 	for ( TInt i = 0; i < schedules.Count(); i++ )
       
  1260 		{
       
  1261 		length += schedules[i]->ExternalizeLength();
       
  1262 		}
       
  1263 	
       
  1264 	HBufC8* retBuf = HBufC8::NewLC( length );
       
  1265 	TPtr8 retBufPtr( retBuf->Des() );
       
  1266 
       
  1267 	RDesWriteStream writeStream;
       
  1268 	CleanupClosePushL( writeStream );
       
  1269 	writeStream.Open( retBufPtr );
       
  1270 	// write item count to buffer
       
  1271     writeStream.WriteInt32L( schedules.Count() );
       
  1272 	
       
  1273 	// write all items to buffer
       
  1274 	for ( TInt j = 0; j < schedules.Count(); j++ )
       
  1275 		{
       
  1276 		schedules[j]->ExternalizeL( writeStream );
       
  1277 		}
       
  1278 	writeStream.CommitL();
       
  1279     CleanupStack::PopAndDestroy( &writeStream );
       
  1280 
       
  1281 	User::LeaveIfError( aMessage.Write( 1, retBufPtr ) );
       
  1282 
       
  1283     CleanupStack::PopAndDestroy( retBuf );
       
  1284 	CleanupStack::PopAndDestroy( &schedules );	
       
  1285 
       
  1286 	aMessage.Complete( KErrNone );
       
  1287 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::GetSchedulesByTimeframeL");
       
  1288     }
       
  1289 
       
  1290 // -----------------------------------------------------------------------------
       
  1291 // CCseSchedulerServerEngine::ScheduleCompletedSuccesfullyL()
       
  1292 //
       
  1293 // -----------------------------------------------------------------------------
       
  1294 //
       
  1295 void CCseSchedulerServerEngine::ScheduleCompletedSuccesfullyL( TUint32 aDbIdentifier )
       
  1296 	{		
       
  1297 	CSELOGSTRING2_HIGH_LEVEL(
       
  1298 	    ">>>CCseSchedulerServerEngine::ScheduleCompletedSuccesfully: aDbIdentifier: %d",
       
  1299 	    aDbIdentifier);
       
  1300 	    
       
  1301     TInt32 pluginUid( 0 );    
       
  1302     
       
  1303     // First get the plugin UID of removed schedule
       
  1304 	CCseScheduledProgram* prog = CCseScheduledProgram::NewL() ;
       
  1305 	CleanupStack::PushL( prog );
       
  1306 	iDb->GetScheduleByDbIdentifierL( aDbIdentifier, prog );
       
  1307 	pluginUid = prog->PluginUid( );		
       
  1308 	CleanupStack::PopAndDestroy( prog );
       
  1309 
       
  1310     // Remove completed schedule from DB
       
  1311     TRAPD( err, iDb->RemoveScheduleL( aDbIdentifier ) );
       
  1312     if ( err != KErrNone )
       
  1313     	{
       
  1314     	CSELOGSTRING2_HIGH_LEVEL(
       
  1315     	    "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - iDb->RemoveScheduleL() LEAVED: %d",
       
  1316     	     err);
       
  1317     	}
       
  1318 
       
  1319     // Reschedule completed plugin    	
       
  1320     if( pluginUid != 0 )
       
  1321         {
       
  1322         // We have plugin Uid, reschedule that controller
       
  1323         RescheduleByPluginL( pluginUid );
       
  1324         }
       
  1325     else
       
  1326         {
       
  1327         // No plugin uid found, reschedule all.
       
  1328         RescheduleL();
       
  1329         }
       
  1330 
       
  1331     if( !iCompletitionBreaker->IsActive() )
       
  1332         {            
       
  1333         iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
       
  1334         }
       
  1335     else
       
  1336         {
       
  1337         CSELOGSTRING_HIGH_LEVEL(
       
  1338             "CCseSchedulerServerEngine::ScheduleCompletedSuccesfully - Breaker already active");
       
  1339         }
       
  1340    
       
  1341 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ScheduleCompletedSuccesfully");
       
  1342 	}
       
  1343 	
       
  1344 // -----------------------------------------------------------------------------
       
  1345 // CCseSchedulerServerEngine::ScheduleCompletedWithError()
       
  1346 //
       
  1347 // -----------------------------------------------------------------------------
       
  1348 //
       
  1349 void CCseSchedulerServerEngine::ScheduleCompletedWithErrorL( 
       
  1350     TUint32 aDbIdentifier,
       
  1351     TUint32 aErrorCode )
       
  1352     {	
       
  1353 	CSELOGSTRING3_HIGH_LEVEL(
       
  1354 	    ">>>CCseSchedulerServerEngine::ScheduleCompletedWithError: aDbIdentifier: %d, aError %d",
       
  1355 	    aDbIdentifier,
       
  1356 	    aErrorCode);
       
  1357 	TInt32 pluginUid( 0 );
       
  1358 	    
       
  1359     // First get the plugin UID of removed schedule
       
  1360 	CCseScheduledProgram* prog = CCseScheduledProgram::NewL();
       
  1361 	CleanupStack::PushL( prog );
       
  1362 	iDb->GetScheduleByDbIdentifierL( aDbIdentifier, prog );
       
  1363 	pluginUid = prog->PluginUid( );		
       
  1364 	CleanupStack::PopAndDestroy( prog );	
       
  1365  
       
  1366 	// Something strange happened while executing schedule. Remove it from database.	
       
  1367 	TRAPD( err, iDb->RemoveScheduleL( aDbIdentifier ) );
       
  1368 	if ( err != KErrNone )
       
  1369 		{
       
  1370 		CSELOGSTRING2_HIGH_LEVEL(
       
  1371 		    ">>>CCseSchedulerServerEngine::ScheduleCompletedWithError: iDb->RemoveScheduleL Leaved: %d",
       
  1372 		    err);
       
  1373 		}
       
  1374 
       
  1375 	// Reschedule completed plugin    	
       
  1376     if( pluginUid == 0 )
       
  1377         {
       
  1378         // We have plugin Uid, reschedule that controller
       
  1379         RescheduleByPluginL( pluginUid );
       
  1380         }
       
  1381     else
       
  1382         {
       
  1383         // No plugin uid found, reschedule all.
       
  1384         RescheduleL();
       
  1385         }
       
  1386 
       
  1387 #if CSE_LOGGING_METHOD == 0 
       
  1388     ( void )aErrorCode;
       
  1389 #endif
       
  1390     
       
  1391 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ScheduleCompletedWithError");
       
  1392 	}
       
  1393 	
       
  1394 // -----------------------------------------------------------------------------
       
  1395 // CCseSchedulerServerEngine::IncreaseScheduleRunCount( )
       
  1396 //
       
  1397 // -----------------------------------------------------------------------------
       
  1398 //
       
  1399 void CCseSchedulerServerEngine::IncreaseScheduleRunCountL( TUint32 aDbIdentifier )
       
  1400 	{	
       
  1401 	CSELOGSTRING2_HIGH_LEVEL(
       
  1402 	    ">>>CCseSchedulerServerEngine::IncreaseScheduleRunCountL: aDbIdentifier: %d",
       
  1403 	    aDbIdentifier );
       
  1404  
       
  1405     TRAPD( err, iDb->IncreaseRunCountL( aDbIdentifier ) );
       
  1406     
       
  1407     if (err != KErrNone )
       
  1408         {
       
  1409         CSELOGSTRING2_HIGH_LEVEL(
       
  1410             "CCseSchedulerServerEngine::IncreaseScheduleRunCount - IncreaseRunCount failed: %d. Removing from DB", err);
       
  1411         
       
  1412         // IncreaseRunCount leaved. It is crucial for us that IncreaseRunCount passes.
       
  1413         // We use it to prevent scheduling engine to run certain malicious software.
       
  1414         iDb->RemoveScheduleL( aDbIdentifier );
       
  1415         }
       
  1416             
       
  1417     
       
  1418 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::IncreaseScheduleRunCountL");
       
  1419 	}
       
  1420 	    
       
  1421 // -----------------------------------------------------------------------------
       
  1422 // CCseSchedulerServerEngine::IsAllowedToRun( )
       
  1423 //
       
  1424 // -----------------------------------------------------------------------------
       
  1425 //
       
  1426 TBool CCseSchedulerServerEngine::IsAllowedToRun( TUint32 aDbIdentifier )
       
  1427 	{	
       
  1428 	CSELOGSTRING2_HIGH_LEVEL(
       
  1429 	    ">>>CCseSchedulerServerEngine::IsAllowedToRun: aDbIdentifier: %d",
       
  1430 	    aDbIdentifier );
       
  1431  
       
  1432     TBool ret( EFalse );
       
  1433     TInt32 runCount( 0 );
       
  1434  
       
  1435     TRAPD( err, runCount = iDb->GetRunCountL( aDbIdentifier ) );
       
  1436     
       
  1437     if ( err == KErrNone && runCount < 3 )
       
  1438         {
       
  1439         // Set true if check went ok and there is only less than three tries to run schedule        
       
  1440         ret = ETrue;
       
  1441         }
       
  1442                 
       
  1443 	CSELOGSTRING2_HIGH_LEVEL(
       
  1444 	    "<<<CCseSchedulerServerEngine::IsAllowedToRun: %d", ret);
       
  1445 	return ret;
       
  1446 	}
       
  1447 
       
  1448 // -----------------------------------------------------------------------------
       
  1449 // CCseSchedulerServerEngine::ScheduleNotValid( )
       
  1450 //
       
  1451 // -----------------------------------------------------------------------------
       
  1452 //
       
  1453 void CCseSchedulerServerEngine::ScheduleNotValid( TUint32 aDbIdentifier )
       
  1454 	{	
       
  1455 	CSELOGSTRING2_HIGH_LEVEL(
       
  1456 	    ">>>CCseSchedulerServerEngine::ScheduleNotValid: aDbIdentifier: %d",
       
  1457 	    aDbIdentifier );
       
  1458 
       
  1459     TRAP_IGNORE( iDb->RemoveScheduleL( aDbIdentifier ) );    
       
  1460 
       
  1461 	CSELOGSTRING_HIGH_LEVEL(
       
  1462 	    "<<<CCseSchedulerServerEngine::ScheduleNotValid");	
       
  1463 	}
       
  1464 	
       
  1465 // -----------------------------------------------------------------------------
       
  1466 // CCseSchedulerServerEngine::CompletitionCallback
       
  1467 // -----------------------------------------------------------------------------
       
  1468 //
       
  1469 TInt CCseSchedulerServerEngine::CompletitionCallback( TAny* aPtr )
       
  1470 	{
       
  1471 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CompletitionCallback");
       
  1472 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CompletitionCallback");
       
  1473 	return static_cast<CCseSchedulerServerEngine*>( aPtr )->HandleCompletitionCallback();
       
  1474 	}
       
  1475 
       
  1476 // -----------------------------------------------------------------------------
       
  1477 // CCseSchedulerServerEngine::HandleCompletitionCallback
       
  1478 // -----------------------------------------------------------------------------
       
  1479 //
       
  1480 TInt CCseSchedulerServerEngine::HandleCompletitionCallback() 
       
  1481 	{
       
  1482 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::HandleCompletitionCallback ");
       
  1483 	    
       
  1484     // Reschedule has been made to relevant plugin controllers.
       
  1485     // Go through controllers and remove obsolote ones
       
  1486     for( TInt i = 0; i < iPluginControllerArray.Count(); i++ )
       
  1487         {
       
  1488         // Do cleanup on controller
       
  1489         iPluginControllerArray[i]->DoCleanUp( );
       
  1490         
       
  1491         if( iPluginControllerArray[i]->IsObsolete() )
       
  1492             {
       
  1493             // Delete it and remove from controller array
       
  1494             delete iPluginControllerArray[i];
       
  1495             iPluginControllerArray.Remove(i);            
       
  1496             }
       
  1497         }
       
  1498         
       
  1499     iServer.StopServer();        
       
  1500 	
       
  1501 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::HandleCompletitionCallback ");
       
  1502 	return EFalse;
       
  1503 	}
       
  1504 	
       
  1505 // -----------------------------------------------------------------------------
       
  1506 // CCseSchedulerServerEngine::RequestReschedule
       
  1507 // -----------------------------------------------------------------------------
       
  1508 //
       
  1509 void CCseSchedulerServerEngine::RequestReschedule( ) 
       
  1510 	{
       
  1511 	CSELOGSTRING_HIGH_LEVEL(">>>RequestReschedule::HandleCompletitionCallback ");
       
  1512 
       
  1513     TRAP_IGNORE( RescheduleL() );
       
  1514 
       
  1515 	CSELOGSTRING_HIGH_LEVEL("<<<RequestReschedule::HandleCompletitionCallback ");	
       
  1516 	}
       
  1517 
       
  1518 // -----------------------------------------------------------------------------
       
  1519 // CCseSchedulerServerEngine::RescheduleByPluginL
       
  1520 //
       
  1521 // -----------------------------------------------------------------------------
       
  1522 //
       
  1523 void CCseSchedulerServerEngine::RescheduleByPluginL( TInt32 aPluginUid )
       
  1524 	{
       
  1525 	CSELOGSTRING2_HIGH_LEVEL(
       
  1526 	    ">>>CCseSchedulerServerEngine::RescheduleByPluginL - Plugin Uid: %d", aPluginUid);
       
  1527 
       
  1528     TTime runTime( iDb->GetNextScheduleTimeByPluginL( aPluginUid ) );
       
  1529     TBool controllerFound( EFalse );
       
  1530     
       
  1531     // Search for existing plugin controller for this schedule
       
  1532     RPointerArray<CCseScheduledProgram> schedules;
       
  1533     CleanupResetAndDestroyPushL( schedules );
       
  1534     iDb->GetSchedulesByTimeAndPluginL( runTime, aPluginUid, schedules );
       
  1535     
       
  1536     // Search plugin controller that needs rescheduling
       
  1537     for( TInt i = 0; i < iPluginControllerArray.Count(); i++ )
       
  1538         {
       
  1539         if( aPluginUid == iPluginControllerArray[i]->PluginUid() )
       
  1540             {
       
  1541             if( schedules.Count() > 0 )
       
  1542                 {                    
       
  1543                 iPluginControllerArray[i]->SetSchedulesL( schedules );
       
  1544                 }
       
  1545             else
       
  1546                 {
       
  1547                  // Remove controller if controller found but
       
  1548                  // there are no schedules for it
       
  1549                 
       
  1550                 // Check if controller can be removed right away or should it be done
       
  1551                 // after callstack breaker
       
  1552                 if( iPluginControllerArray[i]->IsControllerActive() )
       
  1553                     {
       
  1554                     CSELOGSTRING_HIGH_LEVEL(
       
  1555                         "CCseSchedulerServerEngine::RescheduleByPluginL - Plugin found but no schedules, set controller to be removed");
       
  1556                     iPluginControllerArray[i]->SetToBeCleared( ETrue );
       
  1557                     iCompletitionBreaker->Start(TCallBack( CleanerCallback, this ));
       
  1558                     }
       
  1559                 else
       
  1560                     {
       
  1561                     CSELOGSTRING_HIGH_LEVEL(
       
  1562                         "CCseSchedulerServerEngine::RescheduleByPluginL - Plugin found but no schedules, remove controller");
       
  1563                     delete iPluginControllerArray[i];
       
  1564                     iPluginControllerArray.Remove( i );
       
  1565                     }
       
  1566                 }
       
  1567                 
       
  1568             controllerFound = ETrue;
       
  1569             break;
       
  1570             }        
       
  1571         }
       
  1572         
       
  1573     if( controllerFound == EFalse )
       
  1574         {
       
  1575         // Create new controller if schedules found
       
  1576         if( schedules.Count() > 0 )
       
  1577             {                    
       
  1578             if( schedules[0]->PluginType() == CCseScheduledProgram::ECseUniPlugin )
       
  1579                 {
       
  1580                 CSELOGSTRING_HIGH_LEVEL(
       
  1581                     "CCseSchedulerServerEngine::RescheduleByPluginL: Create new uniplugin controller");
       
  1582                 // Create new PluginController
       
  1583                 iPluginControllerArray.AppendL( CCseSchedulerUniPluginController::NewL( *this, schedules[0]->PluginUid() ) );
       
  1584                 // Add schedules to just created controller
       
  1585                 iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
       
  1586                 }
       
  1587             else if ( schedules[0]->PluginType() == CCseScheduledProgram::ECseMultiPlugin )
       
  1588                 {
       
  1589                 CSELOGSTRING_HIGH_LEVEL(
       
  1590                 "CCseSchedulerServerEngine::RescheduleByPluginL: Create new multiplugin controller");
       
  1591                 // Create new PluginController
       
  1592                 iPluginControllerArray.AppendL( CCseSchedulerMultiPluginController::NewL( *this, schedules[0]->PluginUid() ) );
       
  1593                 // Add schedules to just created controller
       
  1594                 iPluginControllerArray[iPluginControllerArray.Count()-1]->SetSchedulesL(schedules);
       
  1595                 }
       
  1596             else
       
  1597                 {
       
  1598                 // WTF?!?!
       
  1599                 CSELOGSTRING_HIGH_LEVEL(
       
  1600                     "CCseSchedulerServerEngine::RescheduleByPluginL: Plugin something completely different");
       
  1601                 }
       
  1602             }
       
  1603         }    
       
  1604         
       
  1605     // Delete schedule array.
       
  1606     CleanupStack::PopAndDestroy( &schedules );
       
  1607     
       
  1608     // Stop server if we dont have any clients and there is no more
       
  1609 	// reason for us to live (no schedules active).
       
  1610 	iServer.StopServer();
       
  1611 	
       
  1612 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::RescheduleByPluginL out");
       
  1613 	}
       
  1614 	
       
  1615 // -----------------------------------------------------------------------------
       
  1616 // CCseSchedulerServerEngine::ClearingDone()
       
  1617 // -----------------------------------------------------------------------------
       
  1618 //
       
  1619 void CCseSchedulerServerEngine::ClearingDone()
       
  1620     {
       
  1621     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::ClearingDone");
       
  1622 
       
  1623     // Use completition callback to remove those controllers that aren't needed anymore
       
  1624 	if( !iCompletitionBreaker->IsActive() )
       
  1625         {            
       
  1626         iCompletitionBreaker->Start(TCallBack( CompletitionCallback, this ));
       
  1627         }
       
  1628     else
       
  1629         {
       
  1630         CSELOGSTRING_HIGH_LEVEL(
       
  1631             "CCseSchedulerServerEngine::ClearingDone - Breaker already active");
       
  1632         }	
       
  1633         
       
  1634 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::ClearingDone");
       
  1635     }
       
  1636     
       
  1637 // -----------------------------------------------------------------------------
       
  1638 // CCseSchedulerServerEngine::CleanerCallback
       
  1639 // -----------------------------------------------------------------------------
       
  1640 //
       
  1641 TInt CCseSchedulerServerEngine::CleanerCallback( TAny* aPtr )
       
  1642 	{
       
  1643 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::CleanerCallback");
       
  1644 	static_cast<CCseSchedulerServerEngine*>( aPtr )->HandleCleanerCallback();
       
  1645 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::CleanerCallback");
       
  1646 	return EFalse;
       
  1647 	}
       
  1648 
       
  1649 // -----------------------------------------------------------------------------
       
  1650 // CCseSchedulerServerEngine::HandleCompletitionCallback
       
  1651 // -----------------------------------------------------------------------------
       
  1652 //
       
  1653 TInt CCseSchedulerServerEngine::HandleCleanerCallback() 
       
  1654 	{
       
  1655 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerEngine::HandleCleanerCallback ");
       
  1656 	
       
  1657     // go through plugins and clear
       
  1658     for( TInt i = iPluginControllerArray.Count(); i > 0 ; i--)
       
  1659         {
       
  1660         if( iPluginControllerArray[i-1]->IsToBeCleared() )
       
  1661             {
       
  1662             // If ClearControllerL -call leaves it means that we couldn't signal
       
  1663             // plugin to take himself down. In such cases we leak memory, but we
       
  1664             // still need to keep going so we do not screw all the rest schedules.
       
  1665             TRAP_IGNORE( iPluginControllerArray[i-1]->ClearControllerL());
       
  1666             delete iPluginControllerArray[i-1];
       
  1667             iPluginControllerArray.Remove(i-1);            
       
  1668             }
       
  1669         }
       
  1670 
       
  1671     iServer.StopServer();    
       
  1672 	
       
  1673 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerEngine::HandleCleanerCallback ");
       
  1674 	return EFalse;
       
  1675 	}
       
  1676