diff -r f56ec6ce2732 -r 6f9f6e99a23e mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp --- a/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp Tue May 11 16:40:32 2010 +0300 +++ b/mmappcomponents/mmmtpdataprovider/src/cmmmtpdpaccesssingleton.cpp Tue May 25 13:14:13 2010 +0300 @@ -21,6 +21,7 @@ #include "cmmmtpdpaccesssingleton.h" #include "cmmmtpdpmetadataaccesswrapper.h" #include "mmmtpdplogger.h" +#include "mmmtpdputility.h" // ----------------------------------------------------------------------------- // CMmMtpDpAccessSingleton::~CMmMtpDpAccessSingleton @@ -30,6 +31,12 @@ CMmMtpDpAccessSingleton::~CMmMtpDpAccessSingleton() { delete iWrapper; + + if (iDelayStatusChanger) + { + iDelayStatusChanger->Cancel(); + delete iDelayStatusChanger; + } } // ----------------------------------------------------------------------------- @@ -151,7 +158,73 @@ void CMmMtpDpAccessSingleton::ConstructL( MMTPDataProviderFramework& aFramework ) { iWrapper = CMmMtpDpMetadataAccessWrapper::NewL( aFramework ); + iDelayStatusChanger = CIdle::NewL(CActive::EPriorityIdle); + } + +// ----------------------------------------------------------------------------- +// CMmMtpDpAccessSingleton::ActiveToIdleStatusChange +// Issue ActiveToIdle Status Change (ActiveObject) +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMmMtpDpAccessSingleton::ActiveToIdleStatusChange() + { + PRINT( _L( "CMmMtpDpAccessSingleton::ActiveToIdleStatusChange" ) ); + CMmMtpDpAccessSingleton* self = CMmMtpDpAccessSingleton::Instance(); + + if (self != NULL) + { + CMmMtpDpAccessSingleton::CancelActiveToIdleStatusChange(); + + if (self->DelayStatusChanger() != NULL) + self->DelayStatusChanger()->Start(TCallBack(DoActiveToIdleStatusChange, self)); + } } +// ----------------------------------------------------------------------------- +// CMmMtpDpAccessSingleton::CancelActiveToIdleChange +// Cancel Outstanding ActiveToIdle Status Change +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMmMtpDpAccessSingleton::CancelActiveToIdleStatusChange() + { + CMmMtpDpAccessSingleton* self = CMmMtpDpAccessSingleton::Instance(); + + if ((self != NULL) && (self->DelayStatusChanger() != NULL)) + { + if (self->DelayStatusChanger()->IsActive()) + { + PRINT( _L( "CMmMtpDpAccessSingleton::CancelActiveToIdleStatusChange, cancel outstanding request" ) ); + self->DelayStatusChanger()->Cancel(); + } + } + } + +// ----------------------------------------------------------------------------- +// CMmMtpDpAccessSingleton::DelayStatusChanger +// get DelayStatusChanger instance, internal use only +// ----------------------------------------------------------------------------- +// +CIdle* CMmMtpDpAccessSingleton::DelayStatusChanger() + { + CIdle* delayStatusChanger = NULL; + CMmMtpDpAccessSingleton* self = CMmMtpDpAccessSingleton::Instance(); + + if (self != NULL) + delayStatusChanger = self->iDelayStatusChanger; + + return delayStatusChanger; + } + +// ----------------------------------------------------------------------------- +// CMmMtpDpAccessSingleton::DoActiveToIdleChange +// Perform actural ActiveToIdle Status Change after active object callback +// ----------------------------------------------------------------------------- +// +TInt CMmMtpDpAccessSingleton::DoActiveToIdleStatusChange(TAny* /*Any*/) + { + PRINT( _L( "CMmMtpDpAccessSingleton::DoActiveToIdleStatusChange ") ); + MmMtpDpUtility::DoSetPSStatus(EMtpPSStatusReadyToSync); + return KErrNone; + } // end of file