--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/videoscheduler/SchedulerServer/src/CCseSchedulerLandLord.cpp Thu Dec 17 09:14:38 2009 +0200
@@ -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 <ipvideo/CCseScheduledProgram.h>
+#include "CCseSchedulerThreadPacket.h"
+#include <ipvideo/MCseScheduleObserver.h> // Observer for informing engine
+#include <e32std.h>
+#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");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::~CCseSchedulerLandLord()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerLandLord::~CCseSchedulerLandLord()
+ {
+ 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::~CCseSchedulerLandLord");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::NewL()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerLandLord* CCseSchedulerLandLord::NewL(
+ MCseScheduleObserver* aObserver )
+ {
+ 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::NewL");
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::ConstructL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::ConstructL()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ConstructL");
+
+ iActiveSchedulerWait = new (ELeave) CActiveSchedulerWait;
+ CActiveScheduler::Add( this );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ConstructL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::DoCancel()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::DoCancel()
+ {
+ 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::DoCancel" );
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::RunL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::RunL()
+ {
+ 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::RunL");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::SetScheduleL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::SetScheduleL( CCseScheduledProgram& aData )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::SetSchedule");
+
+ delete iThreadPacket;
+ iThreadPacket = NULL;
+ iThreadPacket = CCseSchedulerThreadPacket::NewL();
+ iThreadPacket->SetScheduleL( aData );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::SetSchedule");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerTimer::ThreadPacket()
+//
+// ---------------------------------------------------------------------------
+CCseSchedulerThreadPacket* CCseSchedulerLandLord::ThreadPacket( )
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::Schedule");
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::Schedule");
+
+ return iThreadPacket;
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::RunError
+// From CActive, called when RunL leaves.
+// -----------------------------------------------------------------------------
+//
+TInt CCseSchedulerLandLord::RunError( TInt /*aError*/ )
+ {
+ 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("<<<CCseSchedulerLandLord::GenerateThreadName");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::GenerateSemahoresL
+// Generates semaphores for shutdown signalling
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::GenerateSemaphoresL( )
+ {
+ iPluginShutdownSemaphore.CreateLocal( 0 );
+ iThreadPacket->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::RunPluginL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::ActiveWait( TBool aStart )
+ {
+ 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::ActiveWait()");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+void CCseSchedulerLandLord::SemaphoreSignalled()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::ShutdownPlugin()");
+
+ ActiveWait( EFalse );
+
+ CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerLandLord::ShutdownPlugin()");
+ }
+
+// ---------------------------------------------------------------------------
+// CCseSchedulerLandLord::ClearL()
+//
+// ---------------------------------------------------------------------------
+void CCseSchedulerLandLord::ClearL()
+ {
+ 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::ClearL");
+ }
+
+// -----------------------------------------------------------------------------
+// CCseSchedulerLandLord::ActiveWait
+//
+// -----------------------------------------------------------------------------
+//
+TBool CCseSchedulerLandLord::IsWorking()
+ {
+ CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerLandLord::IsWorking()");
+
+ CSELOGSTRING2_HIGH_LEVEL("<<<CCseSchedulerLandLord::IsWorking(): %d", iThreadRunning);
+
+ return iThreadRunning;
+ }
+
+// End of file