--- a/idlehomescreen/widgetmanager/src/wmwidgetdata.cpp Fri Mar 12 15:41:49 2010 +0200
+++ b/idlehomescreen/widgetmanager/src/wmwidgetdata.cpp Mon Mar 15 12:39:47 2010 +0200
@@ -85,11 +85,13 @@
iWidgetType = CWmWidgetData::EUnknown;
iPublisherUid = KNullUid;
iLogoSize = aLogoSize;
- iPeriodic = NULL;
+ iAnimationTimer = NULL;
+ iTimeoutTimer = NULL;
iAnimationIndex = 0;
iAsyncUninstalling = EFalse;
iFireLogoChanged = EFalse;
iMdcaPoint = NULL;
+ iWidgetName = NULL;
}
// ---------------------------------------------------------
@@ -100,13 +102,14 @@
CHsContentInfo* aHsContentInfo,
RWidgetRegistryClientSession* aRegistryClientSession )
{
- InitL( aHsContentInfo, aRegistryClientSession );
-
// start decoding the icon
iImageConverter = CWmImageConverter::NewL( this );
iWait = new (ELeave) CActiveSchedulerWait();
- iPeriodic = CPeriodic::NewL( CActive::EPriorityStandard );
+ iAnimationTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+ iTimeoutTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+ InitL( aHsContentInfo, aRegistryClientSession );
+
// start logo handling
iImageConverter->SetLogoSize( iLogoSize );
HandleIconString( HsContentInfo().IconPath() );
@@ -130,16 +133,18 @@
iWidgetType = CWmWidgetData::ENative;
}
- // take ownership of the content info
- iHsContentInfo = aHsContentInfo;
+ // get publisher uid from widget registry
+ FetchPublisherUidL( aHsContentInfo->PublisherId(),
+ aRegistryClientSession );
// create iMdcaPoint for listbox
_LIT( KFormatStr, "0\t%S");
iMdcaPoint = HBufC::NewL(
- iHsContentInfo->Name().Length() + KFormatStr().Length() );
- iMdcaPoint->Des().Format( KFormatStr(), &iHsContentInfo->Name() );
- // get publisher uid from widget registry
- FetchPublisherUidL( aRegistryClientSession );
+ aHsContentInfo->Name().Length() + KFormatStr().Length() );
+ iMdcaPoint->Des().Format( KFormatStr(), &aHsContentInfo->Name() );
+
+ // take ownership of the content info
+ iHsContentInfo = aHsContentInfo;
}
// ---------------------------------------------------------
@@ -148,6 +153,14 @@
//
CWmWidgetData::~CWmWidgetData()
{
+ if ( iTimeoutTimer &&
+ iTimeoutTimer->IsActive() )
+ {
+ iTimeoutTimer->Cancel();
+ }
+ delete iTimeoutTimer;
+
+ delete iWidgetName;
if ( iWait && iWait->IsStarted() )
{
iWait->AsyncStop();
@@ -155,7 +168,7 @@
delete iWait;
SetObserver( NULL );
DestroyAnimData();
- delete iPeriodic;
+ delete iAnimationTimer;
delete iLogoImage;
delete iLogoImageMask;
delete iImageConverter;
@@ -254,7 +267,7 @@
if ( iFireLogoChanged )
{
iFireLogoChanged = EFalse;
- FireDataChanged();
+ FireDataChanged();
}
}
}
@@ -299,8 +312,12 @@
// handle result
if ( KErrNone == err && iWait &&
- IsPrepairingLogo() )
+ IsPrepairingLogo() && iTimeoutTimer )
{
+ iTimeoutTimer->Cancel();
+ const TInt tickInterval = 200000;
+ iTimeoutTimer->Start(
+ tickInterval,tickInterval,TCallBack(TimeoutTick, this));
iWait->Start();
}
else if ( KErrNone != err && iFireLogoChanged )
@@ -356,14 +373,15 @@
// ----------------------------------------------------
//
void CWmWidgetData::FetchPublisherUidL(
+ const TDesC& aPublisherId,
RWidgetRegistryClientSession* aRegistryClientSession )
{
if ( iPublisherUid == KNullUid &&
- PublisherId() != KNullDesC &&
+ aPublisherId != KNullDesC &&
iWidgetType != CWmWidgetData::ENative &&
aRegistryClientSession )
{
- TInt widgetUid = aRegistryClientSession->GetWidgetUidL( PublisherId() );
+ TInt widgetUid = aRegistryClientSession->GetWidgetUidL( aPublisherId );
if ( widgetUid != 0 )
{
// WRT widget
@@ -414,10 +432,10 @@
}
// ---------------------------------------------------------
-// CWmWidgetData::ReplaceContentInfoL
+// CWmWidgetData::ReplaceContentInfo
// ---------------------------------------------------------
//
-TBool CWmWidgetData::ReplaceContentInfoL(
+TBool CWmWidgetData::ReplaceContentInfo(
CHsContentInfo* aHsContentInfo )
{
TBool sameAppearance = (
@@ -430,10 +448,15 @@
// delete the old content info
delete iHsContentInfo;
iHsContentInfo = NULL;
-
- // re-init the object
- InitL( aHsContentInfo, NULL );
-
+
+ // re-init the object, take care about leave.
+ TRAPD( err, InitL( aHsContentInfo, NULL ); );
+ if ( KErrNone != err )
+ {
+ delete aHsContentInfo;
+ aHsContentInfo = NULL;
+ }
+
if ( !sameAppearance )
{
// fire change event -> widget redrawn
@@ -473,12 +496,19 @@
DestroyAnimData();
PrepairAnimL();
- iHsContentInfo->SetNameL( iWmResourceLoader.Uninstalling() );
+ // set copy of widget name for uninstallation error case.
+ if ( iHsContentInfo->Name().Compare( iWmResourceLoader.Uninstalling() ) !=
+ KErrNone )
+ {
+ iWidgetName = iHsContentInfo->Name().AllocL();
+ iHsContentInfo->SetNameL( iWmResourceLoader.Uninstalling() );
+ }
+
iAsyncUninstalling = ETrue;
iAnimationIndex = 0;
const TInt tickInterval = 400000;
- iPeriodic->Start(
- tickInterval,tickInterval,TCallBack(Tick, this));
+ iAnimationTimer->Start(
+ tickInterval,tickInterval,TCallBack(AnimationTick, this));
}
// ---------------------------------------------------------
@@ -521,9 +551,9 @@
//
void CWmWidgetData::DestroyAnimData()
{
- if ( iPeriodic && iPeriodic->IsActive() )
+ if ( iAnimationTimer && iAnimationTimer->IsActive() )
{
- iPeriodic->Cancel();
+ iAnimationTimer->Cancel();
}
for( TInt i=0; i < iUninstallAnimIcons.Count(); i++ )
@@ -535,10 +565,10 @@
}
// ---------------------------------------------------------
-// CWmWidgetData::Tick
+// CWmWidgetData::AnimationTick
// ---------------------------------------------------------
//
-TInt CWmWidgetData::Tick( TAny* aPtr )
+TInt CWmWidgetData::AnimationTick( TAny* aPtr )
{
CWmWidgetData* self = static_cast< CWmWidgetData* >( aPtr );
self->iAnimationIndex += 2;
@@ -551,6 +581,21 @@
}
// ---------------------------------------------------------
+// CWmWidgetData::TimeoutTick
+// ---------------------------------------------------------
+//
+TInt CWmWidgetData::TimeoutTick( TAny* aPtr )
+ {
+ CWmWidgetData* self = static_cast< CWmWidgetData* >( aPtr );
+ self->iTimeoutTimer->Cancel();
+ if ( self->iWait && self->iWait->IsStarted() )
+ {
+ self->iWait->AsyncStop();
+ }
+ return 1;
+ }
+
+// ---------------------------------------------------------
// CWmWidgetData::AnimationBitmap
// ---------------------------------------------------------
//
@@ -619,5 +664,24 @@
return KNullDesC;
}
+// ---------------------------------------------------------
+// CWmWidgetData::StopUninstallAnimation
+// ---------------------------------------------------------
+//
+void CWmWidgetData::StopUninstallAnimationL()
+ {
+ DestroyAnimData();
+ // restore widget name
+ if ( iWidgetName )
+ {
+ iHsContentInfo->SetNameL( iWidgetName->Des() );
+ delete iWidgetName;
+ iWidgetName = NULL;
+ }
+
+ FireDataChanged(); //redraw
+ iAsyncUninstalling = EFalse;
+ }
+
// End of file