diff -r 30342f40acbf -r e1bea15f9a39 widgets/widgetapp/src/WidgetUiPSNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/widgetapp/src/WidgetUiPSNotifier.cpp Thu Aug 19 10:58:56 2010 +0300 @@ -0,0 +1,165 @@ +/* +* Copyright (c) 2007 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: +* +*/ + +#include "WidgetUiPSNotifier.h" +#include "WidgetUiWindowManager.h" +#include +#include "WidgetUiWindow.h" +#include "WidgetAppDefs.rh" +#include +CWidgetUiPSNotifier::CWidgetUiPSNotifier(CWidgetUiWindowManager& aWindowManager, TPropertyKeyValues aKey) :iWindowManager(aWindowManager), iKey(aKey), CActive( EPriorityNormal ) + { + } +CWidgetUiPSNotifier::~CWidgetUiPSNotifier() + { + Cancel(); + iProperty.Close(); + } + +CWidgetUiPSNotifier* CWidgetUiPSNotifier::NewL(CWidgetUiWindowManager& aWindowManager, TPropertyKeyValues aKey ) + { + CWidgetUiPSNotifier* self = new (ELeave) CWidgetUiPSNotifier(aWindowManager, aKey); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +void CWidgetUiPSNotifier::ConstructL() + { + CActiveScheduler::Add(this); + TInt r(KErrNone); + + if ( iKey != EWidgetRegAltered) + { + r = RProperty::Define( KPropertyWidgetUI, iKey, RProperty::EInt ); + if ( r != KErrAlreadyExists && r != KErrNone ) + { + User::LeaveIfError( r ); + } + User::LeaveIfError( iProperty.Attach( KPropertyWidgetUI,iKey)); + } + // Attach the key + + if ( iKey == EWidgetRegAltered ) + User::LeaveIfError( iProperty.Attach( KMyPropertyCat,iKey)); + // initial subscription + iProperty.Subscribe( iStatus ); + SetActive(); + } + + +// --------------------------------------------------------------------------- +// CWrtHarvesterPSNotifier::DoCancel +// --------------------------------------------------------------------------- +// +void CWidgetUiPSNotifier::DoCancel() + { + iProperty.Cancel(); + } + +// --------------------------------------------------------------------------- +// CWidgetUiPSNotifier::RunL() +// --------------------------------------------------------------------------- +// +void CWidgetUiPSNotifier::RunL() + { + + // resubscribe before processing new value to prevent missing updates + iProperty.Subscribe( iStatus ); + SetActive(); + + if (iKey == EWidgetRegAltered) + { + UpdateWindowList(); + } + else if( iKey == ESapiPrompt || iKey == ESapiPromptCleared) + { + UpdateSapiPromptState(); + } + + } +// --------------------------------------------------------------------------- +// CWrtHarvesterPSNotifier::UpdateSapiPromptState +// --------------------------------------------------------------------------- +// +void CWidgetUiPSNotifier::UpdateSapiPromptState() + { + TInt value( 0 ); + iProperty.Get( value ); + + if( value != 0) + { + RPointerArray windowList; + iWindowManager.WindowList( windowList ); + for(TInt i=windowList.Count()-1;i>=0;i--) + { + if( value == windowList[i]->Uid().iUid) + { + if(iKey == ESapiPrompt ) + { + if( !windowList[i]->getSapiPromptCleared() ) + windowList[i]->setNeedToIgnoreSapiClearNtfn(EIncrement); + else if( windowList[i]->getNeedToIgnoreSapiNtfn() == 0) + windowList[i]->setSapiPromptCleared(EFalse); + else if(windowList[i]->getNeedToIgnoreSapiNtfn() > 0 ) + windowList[i]->setNeedToIgnoreSapiNtfn(EDecrement); + + } + else if(iKey == ESapiPromptCleared ) + { + if( windowList[i]->getSapiPromptCleared() ) + windowList[i]->setNeedToIgnoreSapiNtfn(EIncrement); + else if ( windowList[i]->getNeedToIgnoreSapiClearNtfn() == 0) + windowList[i]->setSapiPromptCleared(ETrue); + else if(windowList[i]->getNeedToIgnoreSapiClearNtfn() > 0) + windowList[i]->setNeedToIgnoreSapiClearNtfn(EDecrement); + } + break; + } + } + } + + } +// --------------------------------------------------------------------------- +// CWrtHarvesterPSNotifier::UpdateWindowList +// --------------------------------------------------------------------------- +// +void CWidgetUiPSNotifier::UpdateWindowList() + { + RPointerArray iWindowList; + RWidgetRegistryClientSession iClientSession; + RPointerArray iWidgetInfoArray; + + iWindowManager.WindowList( iWindowList ); + User::LeaveIfError( iClientSession.Connect()); + iClientSession.InstalledWidgetsL(iWidgetInfoArray); + TInt j=0; + for(TInt i=iWindowList.Count()-1;i>=0;i--){ + for(j=0;jUid().iUid == iWidgetInfoArray[j]->iUid.iUid ) + { + break; + } + } + //present.... so break, go to the next element in iWindowList array + if (j == iWidgetInfoArray.Count()) + iWindowManager.HandleWidgetCommandL(iWindowList[i]->Uid(), Deactivate); + + } + } +