diff -r 000000000000 -r 96612d01cf9f videofeeds/scheduleddlplugin/src/iptvscheduleddownloadlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/scheduleddlplugin/src/iptvscheduleddownloadlugin.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,201 @@ +/* +* Copyright (c) 2007-2008 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: Implementation of the scheduled download plugin* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include "IptvDebug.h" +#include "iptvscheduleddownloadlugin.h" +#include "vcnsscheduleddownloadpluginengine.h" + +// CONSTANTS +const TInt KIptvRescheduleInterval( 15 ); + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CIptvSchedulerPlugin::NewL +// +// ----------------------------------------------------------------------------- +// +CIptvScheduledDownloadPlugin* CIptvScheduledDownloadPlugin::NewL() + { + CIptvScheduledDownloadPlugin* self = + new (ELeave) CIptvScheduledDownloadPlugin(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CIptvScheduledDownloadPlugin::CIptvScheduledDownloadPlugin +// +// ----------------------------------------------------------------------------- +// +CIptvScheduledDownloadPlugin::CIptvScheduledDownloadPlugin() + { + } + +// ----------------------------------------------------------------------------- +// CIptvScheduledDownloadPlugin::~CIptvScheduledDownloadPlugin +// +// ----------------------------------------------------------------------------- +// +CIptvScheduledDownloadPlugin::~CIptvScheduledDownloadPlugin() + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvScheduledDownloadPlugin::~CIptvScheduledDownloadPlugin"); + + if ( iIsDead ) + { + *iIsDead = ETrue; + } + delete iEngine; + iEngine = NULL; + + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvScheduledDownloadPlugin::~CIptvScheduledDownloadPlugin"); + } + +// ----------------------------------------------------------------------------- +// CIptvScheduledDownloadPlugin::RunTaskL +// +// ----------------------------------------------------------------------------- +// +void CIptvScheduledDownloadPlugin::RunTaskL( CCseScheduledProgram& aProg, + MCsePluginObserver* aObserver ) + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvScheduledDownloadPlugin::RunTaskL"); + + TBool isDead( EFalse ); + + iIsDead = &isDead; + + // Is there already a download going on + if (iEngine) + { + IPTVLOGSTRING_HIGH_LEVEL("CIptvScheduledDownloadPlugin::RunTaskL rescheduling"); + + // Yes, reschedule this for later time + TRAP_IGNORE( RescheduleL( + aObserver, + aProg, + TTimeIntervalMinutes( KIptvRescheduleInterval ) ) ); + + IPTVLOGSTRING_HIGH_LEVEL("CIptvScheduledDownloadPlugin::RunTaskL rescheduled"); + return ; + } + + // Create always new engine, we are not deleted because we might be reused + // Engine has callbacks which should not be left on when not needed + iEngine = CIptvScheduledDownloadPluginEngine::NewL( *aObserver ); + + // Pass it through to engine. + TInt engineReturnValue = 0; + TRAPD( err, iEngine->RunTaskL( aProg, engineReturnValue ) ); + + // When we come out from RunTaskL it might be that the operation was cancelled + // by deleting ScheduledDownloadPlugin. In such case we are now running "dead code" + // which means the class is already destroyed, but the stack is still around. We need + // to get out from here as soon as possible and avoid changing class internal variables. + if( isDead ) + { + IPTVLOGSTRING_HIGH_LEVEL("CIptvScheduledDownloadPlugin::RunTaskL - RunTaskL aborted, GTFO from here"); + return; + } + + if (err) + { + IPTVLOGSTRING2_HIGH_LEVEL("CIptvScheduledDownloadPlugin::RunTaskL engine finished with error %d ", err); + + aObserver->PluginCompleted( err ); + } + + // Did the plugin ask for reschedule + if ( engineReturnValue == CIptvScheduledDownloadPluginEngine::EReschedule) + { + // Yes, reschedule this for later time + aObserver->PluginCompleted( KErrNone ); + RescheduleL( + aObserver, aProg, TTimeIntervalMinutes( KIptvRescheduleInterval ) ); + } + else if ( engineReturnValue == CIptvScheduledDownloadPluginEngine::EDontReschedule ) + { + // Reschedule is no more possible + IPTVLOGSTRING_HIGH_LEVEL( + "CIptvScheduledDownloadPlugin::RunTaskL Plugin completed without reschedule" ); + + aObserver->PluginCompleted( KErrNone ); + } + else + { + if (engineReturnValue < KErrNone) + { + aObserver->PluginCompleted( engineReturnValue ); + } + } + + delete iEngine; + iEngine = NULL; + + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvScheduledDownloadPlugin::RunTaskL"); + } + +// ----------------------------------------------------------------------------- +// CIptvScheduledDownloadPlugin::RescheduleL +// +// ----------------------------------------------------------------------------- +// +void CIptvScheduledDownloadPlugin::RescheduleL( + MCsePluginObserver* /*aObserver*/, + CCseScheduledProgram& aProg, + TTimeIntervalMinutes aDelay ) + { + IPTVLOGSTRING_HIGH_LEVEL(">>> CIptvScheduledDownloadPlugin::RescheduleL"); + + TTime start; + start.UniversalTime(); + start += aDelay; + + // Only reschedule if it fits the slot + if (start < aProg.EndTime()) + { + CCseSchedulerApi* scheduler = CCseSchedulerApi::NewL(); + CleanupStack::PushL( scheduler ); + + CCseScheduledProgram* newSchedule = CCseScheduledProgram::NewL(); + CleanupStack::PushL( newSchedule ); + + newSchedule->SetStartTime( start ); + newSchedule->SetEndTime( aProg.EndTime() ); + newSchedule->SetAppUid( aProg.AppUid() ); + newSchedule->SetPluginUid( aProg.PluginUid() ); + newSchedule->SetScheduleType( aProg.ScheduleType() ); + newSchedule->SetApplicationDataL( aProg.ApplicationData() ); + + User::LeaveIfError( scheduler->AddSchedule( *newSchedule ) ); + + IPTVLOGSTRING_HIGH_LEVEL("CIptvScheduledDownloadPlugin::RescheduleL Rescheduling done"); + + CleanupStack::PopAndDestroy( newSchedule ); + + CleanupStack::PopAndDestroy( scheduler ); + } + + IPTVLOGSTRING_HIGH_LEVEL("<<< CIptvScheduledDownloadPlugin::RescheduleL"); + } +// End of File