taskswitcher/server/src/tswindowgroupsmonitorimp.cpp
changeset 127 7b66bc3c6dc9
parent 125 26079c1bb561
--- a/taskswitcher/server/src/tswindowgroupsmonitorimp.cpp	Wed Oct 13 12:59:22 2010 +0300
+++ b/taskswitcher/server/src/tswindowgroupsmonitorimp.cpp	Mon Oct 18 10:44:15 2010 +0300
@@ -19,7 +19,7 @@
 #include "tswindowgroupsmonitorimp.h"
 #include "tsrunningappstorageimp.h"
 #include "tsresourcemanager.h"
-
+#include "tsvisibilitymsg.h"
 
 const int KOrdinalPositionNoZOrder(-1);
 // -----------------------------------------------------------------------------
@@ -68,6 +68,9 @@
     
     // Window group change event
     User::LeaveIfError (iWg.EnableGroupListChangeEvents());
+    
+    iCache = CTsRunningAppStorage::NewL();
+    RefreshCacheL();
     Subscribe();
 }
 
@@ -76,32 +79,78 @@
 // -----------------------------------------------------------------------------
 //
 CTsWindowGroupsMonitor::~CTsWindowGroupsMonitor()
-{
+    {
     CActive::Cancel();
     iWg.Close();
-}
+    }
 
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
 void CTsWindowGroupsMonitor::SubscribeL(MTsWindowGroupsObserver &observer)
-{
-    const TInt offset(iObservers.Find(&observer));
-    KErrNotFound == offset ? iObservers.InsertL(&observer, 0) : 
-                             User::Leave(KErrAlreadyExists);
-}
+    {
+    if(KErrNotFound != iObservers.Find(&observer))
+        {
+        User::Leave(KErrAlreadyExists);
+        }
+    iObservers.InsertL(&observer, 0);
+    observer.HandleWindowGroupChanged(iResources, *iCache);
+    }
 
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
 void CTsWindowGroupsMonitor::Cancel(MTsWindowGroupsObserver & observer)
-{
+    {
     const TInt offset(iObservers.Find(&observer));
-    if (KErrNotFound != offset) {
+    if(KErrNotFound != offset)
+        {
         iObservers.Remove(offset);
+        }
     }
+
+// -----------------------------------------------------------------------------
+/**
+ * @see MTsWindowGroupsMonitor::Storage
+ */
+const MTsRunningApplicationStorage& CTsWindowGroupsMonitor::Storage() const
+    {
+    return *iCache;
+    }
+// -----------------------------------------------------------------------------
+TBool CTsWindowGroupsMonitor::IsSupported(TInt aFunction) const
+    {
+    return ( VisibilityChange == aFunction );
+    }
+
+// -----------------------------------------------------------------------------
+void CTsWindowGroupsMonitor::HandleDataL(TInt aFunction, RReadStream& aDataStream)
+{
+    if(VisibilityChange == aFunction)
+        {
+        CTsVisibilitMsg* msg = CTsVisibilitMsg::NewLC(aDataStream);
+        const TBool hide (Invisible == msg->visibility());
+        bool changed = false;
+        for(TInt offset(0); offset < iCache->Count(); ++offset)
+            {
+            if( msg->windowGroupId() == (*iCache)[offset].WindowGroupId() )
+                {
+                (*iCache)[offset].SetHidden(hide);
+                offset = iCache->Count();
+                changed = true;
+                }
+            }
+        if(changed)
+            {
+            for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
+                {
+                iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache );
+                }
+            }
+        CleanupStack::PopAndDestroy(msg);
+        }
 }
 
 // -----------------------------------------------------------------------------
@@ -149,34 +198,32 @@
 }
 
 // -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-//
 void CTsWindowGroupsMonitor::ProvideEventL()
-{
+    {
     TWsEvent wsEvent;
     iResources.WsSession().GetEvent(wsEvent);
     if( EEventWindowGroupListChanged == wsEvent.Type() )
         {
-        
-        CTsRunningAppStorage *storage = CTsRunningAppStorage::NewLC();
-        
-        RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo;
-        CleanupClosePushL(filteredWgInfo);
-        CleanupClosePushL(fullWgInfo);
-        User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo));
-        User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo));
-        storage->HandleWindowGroupChanged(iResources, 
-                                          fullWgInfo.Array(), 
-                                          filteredWgInfo.Array());
-        CleanupStack::PopAndDestroy( &fullWgInfo );
-        CleanupStack::PopAndDestroy( &filteredWgInfo );
-                
-        for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
-            {
-            iObservers[iter]->HandleWindowGroupChanged( iResources, *storage );
-            }
-        CleanupStack::PopAndDestroy( storage );
-        
+        RefreshCacheL();
         }
-}
+    }
+
+// -----------------------------------------------------------------------------
+void CTsWindowGroupsMonitor::RefreshCacheL()
+    {
+    RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo;
+    CleanupClosePushL(filteredWgInfo);
+    CleanupClosePushL(fullWgInfo);
+    User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo));
+    User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo));
+    iCache->HandleWindowGroupChanged(iResources, 
+                                     fullWgInfo.Array(), 
+                                     filteredWgInfo.Array());
+    CleanupStack::PopAndDestroy( &fullWgInfo );
+    CleanupStack::PopAndDestroy( &filteredWgInfo );
+            
+    for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
+        {
+        iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache );
+        }
+    }