diff -r 826cea16efd9 -r 13a33d82ad98 videoscheduler/SchedulerServer/src/CCseSchedulerLandLord.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videoscheduler/SchedulerServer/src/CCseSchedulerLandLord.cpp Wed Sep 01 12:20:37 2010 +0100 @@ -0,0 +1,377 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Timer for the notifier* +*/ + + + + +#include "CCseSchedulerLandLord.h" +#include "CCseSchedulerPluginStarter.h" +#include +#include "CCseSchedulerThreadPacket.h" +#include // Observer for informing engine +#include +#include "CseDebug.h" // Debug macros +#include "CCseSemaphoreController.h" + +_LIT( KCseUniThreadName, "CseThread" ); +_LIT( KCseLine, "-" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// --------------------------------------------------------------------------- +// CCseSchedulerTimer::CCseSchedulerTimer() +// +// --------------------------------------------------------------------------- +CCseSchedulerLandLord::CCseSchedulerLandLord( MCseScheduleObserver* aObserver ) : + CActive( CActive::EPriorityStandard ), + iThreadRunning( EFalse ), + iTakedownRequested( EFalse ) + + { + CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::CCseSchedulerLandLord"); + + // C++ default constructor + iObserver = aObserver; + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::~CCseSchedulerLandLord"); + + Cancel(); + + delete iShutdownCompleteMonitor; + iShutdownCompleteMonitor = NULL; + delete iActiveSchedulerWait; + iActiveSchedulerWait = NULL; + iObserver = NULL; + delete iThreadPacket; + iThreadPacket = NULL; + delete iThreadName; + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::NewL"); + + // Symbian C++ constructor + CCseSchedulerLandLord* self = new ( ELeave ) CCseSchedulerLandLord( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::ConstructL"); + + iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait; + CActiveScheduler::Add( this ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::DoCancel" ); + + if ( iThreadRunning ) + { + CSELOGSTRING_HIGH_LEVEL( + "CCseSchedulerLandLord::DoCancel Canceling thread" ); + + // Signal thread to die away! + iPluginShutdownSemaphore.Signal(); + + iThreadRunning = EFalse; + + // Complete schedule with KErrAbort + TRAP_IGNORE( iObserver->ScheduleCompletedL( + iThreadPacket->Schedule( )->DbIdentifier(), KErrAbort ) ); + } + + CSELOGSTRING_HIGH_LEVEL( "<<>>CCseSchedulerLandLord::RunL"); + + iThreadRunning = EFalse; + + // In case we have not cancelled operation, complete schedule with result code. + // If we have cancelled it, we're not interested about the result as the + // schedule has already been removed from the DB + if( !iTakedownRequested ) + { + iObserver->ScheduleCompletedL( iThreadPacket->Schedule( )->DbIdentifier(), + iThreadPacket->ResultCode( ) ); + } + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::SetSchedule"); + + delete iThreadPacket; + iThreadPacket = NULL; + iThreadPacket = CCseSchedulerThreadPacket::NewL(); + iThreadPacket->SetScheduleL( aData ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::Schedule"); + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::RunError"); + // ATM there isn't leaving code in RunL so we just cancel timer if it is active. + Cancel(); + // Return KErrNone to avoid crash. + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CCseSchedulerLandLord::GenerateThreadName +// Generates "unique" name for thread +// ----------------------------------------------------------------------------- +// +void CCseSchedulerLandLord::GenerateThreadNameL( ) + { + CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::GenerateThreadName"); + + delete iThreadName; + iThreadName = NULL; + iThreadName = KCseUniThreadName().AllocL(); + iThreadName = iThreadName->ReAllocL( + iThreadName->Size() + // Length of original name. + sizeof( TUint32 ) * 2 + // Space for Plugin Uid and DbIdentifier + 2 ); // Two "-" as a separator between + // Uid and identifier + + // Separator + iThreadName->Des( ).Append( KCseLine ); + + // Plugin uid + iThreadName->Des( ).AppendNum( iThreadPacket->Schedule()->PluginUid() ); + + // Separator + iThreadName->Des( ).Append( KCseLine ); + + // Finally schedule identifier to make thread name unique + iThreadName->Des( ).AppendNum( iThreadPacket->Schedule()->DbIdentifier() ); + + CSELOGSTRING_HIGH_LEVEL("<<SetShutdownSemaphore( iPluginShutdownSemaphore ); + + iPluginShutdownCompleteSemaphore.CreateLocal( 0 ); + iThreadPacket->SetShutdownCompleteSemaphore( iPluginShutdownCompleteSemaphore ); + } + +// ----------------------------------------------------------------------------- +// CCseSchedulerLandLord::RunPluginL +// From CActive, called when RunL leaves. +// ----------------------------------------------------------------------------- +// +void CCseSchedulerLandLord::RunPluginL( ) + { + CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::RunPluginL"); + TInt error( KErrNone ); + + // Create semaphores for shutdown signalling + GenerateSemaphoresL(); + + // First we create unique thread name + GenerateThreadNameL( ); + + // Create thread where to run schedule + error = iThread.Create( *iThreadName, + CCseSchedulerPluginStarter::StartThread, + KDefaultStackSize, + NULL, // uses caller thread's heap + iThreadPacket, // Schedule + EOwnerThread ); + + if( error == KErrNone ) + { + // Creation succesfull, start running it and logon on it. + CSELOGSTRING_HIGH_LEVEL( + "CCseSchedulerLandLord::RunPluginL - Thread creation succesfull"); + iThread.Resume(); + iThread.Logon( iStatus ); + SetActive(); + iThreadRunning = ETrue; + } + else + { + CSELOGSTRING2_HIGH_LEVEL( + "CCseSchedulerLandLord::RunPluginL - Thread creation FAILED: %d", + error); + } + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::ActiveWait()"); + if (aStart) + { + if(!iActiveSchedulerWait->IsStarted()) + { + CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ActiveWait - Wait start"); + iActiveSchedulerWait->Start(); + } + } + else + { + if(iActiveSchedulerWait->IsStarted()) + { + CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ActiveWait - Wait stop"); + iActiveSchedulerWait->AsyncStop(); + } + } + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::ShutdownPlugin()"); + + ActiveWait( EFalse ); + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::ClearL"); + + if( iThreadRunning ) + { + // Flag the takedown. We're cancelling the operation, so we have + // no interest about result code as the schedule has already + // been removed from the DB. + iTakedownRequested = ETrue; + + // Signal thread to die away! + iPluginShutdownSemaphore.Signal(); + + if( !iShutdownCompleteMonitor ) + { + CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ClearL - New semaphore monitor" ); + iShutdownCompleteMonitor = CCseSemaphoreController::NewL( iPluginShutdownCompleteSemaphore, *this ); + } + + CSELOGSTRING_HIGH_LEVEL("CCseSchedulerLandLord::ClearL - StartMonitor" ); + iShutdownCompleteMonitor->Start(); + + ActiveWait( ETrue ); + + iThreadRunning = EFalse; + } + + CSELOGSTRING_HIGH_LEVEL("<<>>CCseSchedulerLandLord::IsWorking()"); + + CSELOGSTRING2_HIGH_LEVEL("<<