widgets/widgetapp/src/WidgetUiPSNotifier.cpp
branchRCL_3
changeset 92 e1bea15f9a39
--- /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 <widgetregistryclient.h>
+#include "WidgetUiWindow.h"
+#include "WidgetAppDefs.rh"
+#include <e32debug.h>
+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<CWidgetUiWindow>      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<CWidgetUiWindow>      iWindowList;
+    RWidgetRegistryClientSession        iClientSession;
+    RPointerArray<CWidgetInfo>          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;j<iWidgetInfoArray.Count();j++) {
+            if( iWindowList[i]->Uid().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);
+                                               
+        }
+    }
+