taskswitcher/server/src/tsscreenshotprovider.cpp
changeset 124 e36b2f4799c0
parent 121 0b3699f6c654
child 125 26079c1bb561
--- a/taskswitcher/server/src/tsscreenshotprovider.cpp	Fri Sep 17 08:32:18 2010 +0300
+++ b/taskswitcher/server/src/tsscreenshotprovider.cpp	Mon Oct 04 00:38:31 2010 +0300
@@ -19,46 +19,104 @@
 #include "tsscreenshotprovider.h"
 #include "tstaskmonitorglobals.h"
 #include "tsscreenshotmsg.h"
+#include "tsidlist.h"
 
 
 const TUid KPluginUID = {0x200267AE};
+const TInt KSkippedApp [] = {0x20022F35 /* <-- hsapplication */};
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
-CTsScreenshotProvider* CTsScreenshotProvider::NewL( MTsDataStorage& aStorage )
+CTsScreenshotProvider* CTsScreenshotProvider::NewL( MTsDataStorage& aStorage,
+                                                    MTsWindowGroupsMonitor& aMonitor)
     {
-    CTsScreenshotProvider *self = new (ELeave)CTsScreenshotProvider( aStorage );
+    CTsScreenshotProvider *self = new (ELeave)CTsScreenshotProvider(aStorage, aMonitor);
     CleanupStack::PushL( self );
     self->BaseConstructL(KPluginUID, KNullDesC8);
+    aMonitor.SubscribeL(*self);
     CleanupStack::Pop( self );
     return self;
     }
 
 // -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-//
-CTsScreenshotProvider::CTsScreenshotProvider( MTsDataStorage& aStorage )
+CTsScreenshotProvider::CTsScreenshotProvider( MTsDataStorage& aStorage,
+                                              MTsWindowGroupsMonitor& aMonitor)
 :
-    iStorage(aStorage)
+    iStorage(aStorage),
+    iMonitor(aMonitor)
     {
     //No implementation required
     }
 
+CTsScreenshotProvider::~CTsScreenshotProvider()
+    {
+    iMonitor.Cancel(*this);
+    }
+
 // -----------------------------------------------------------------------------
-//
+void CTsScreenshotProvider::HandleWindowGroupChanged(
+                                  MTsResourceManager &aResources, 
+                                  const MTsRunningApplicationStorage& aStorage)
+    {
+    TRAP_IGNORE(HandleWindowGroupChangedL(aResources, aStorage);)
+    }
+
 // -----------------------------------------------------------------------------
-//
+/**
+ * Retrieve list of applications that shouldn't be displayed in taskswitcher 
+ * and send it to module responsible for screenshot taking.  
+ * Interface implementation.
+ * @see MTsWindowGroupsObserver::HandleWindowGroupChangedL
+ */
+void CTsScreenshotProvider::HandleWindowGroupChangedL(
+                                   MTsResourceManager& /*aResources*/, 
+                                   const MTsRunningApplicationStorage& aStorage)
+    {
+    const TInt count(sizeof( KSkippedApp ) / sizeof(TInt));
+    CTsIdList* list = CTsIdList::NewLC();
+    list->AppendL(aStorage.BlockedWindowGroups());//filtered servers
+    for( TInt iter(0); iter < aStorage.Count(); ++iter )
+        {
+        if(aStorage[iter].IsHiddenL())
+            {
+            list->AppendL(aStorage[iter].WindowGroupId());
+            }
+        else
+            {
+            for(TInt blocked(0); blocked < count; ++blocked)
+                {
+                if(aStorage[iter].UidL().iUid == KSkippedApp[blocked])
+                    {
+                    list->AppendL(aStorage[iter].WindowGroupId());
+                    }
+                }
+            }
+        }
+    
+    RBuf8 message;
+    CleanupClosePushL(message);
+    message.CreateL(list->Size() + sizeof(TInt));
+    
+    RDesWriteStream stream;
+    CleanupClosePushL(stream);
+    stream.Open(message);
+    stream.WriteInt32L(IgnoreWindowGroups);
+    stream << (*list);
+    CleanupStack::PopAndDestroy(&stream);
+    
+    SendMessage(message);
+    CleanupStack::PopAndDestroy(&message);
+    CleanupStack::PopAndDestroy(list);
+    }
+
+// -----------------------------------------------------------------------------
 void CTsScreenshotProvider::HandleMessage( const TDesC8& aMsg )
     {
     TRAP_IGNORE( HandleMessageL( aMsg ) );
     }
 
 // -----------------------------------------------------------------------------
-//
-// -----------------------------------------------------------------------------
-//
 void CTsScreenshotProvider::HandleMessageL( const TDesC8& aMsg )
     {
     RDesReadStream msgStream( aMsg );
@@ -78,7 +136,7 @@
             //forward stream to storage
             iStorage.HandleDataL(msgStream.ReadInt32L(), msgStream);
             
-            CleanupStack::PopAndDestroy(screenshotMsg);            
+            CleanupStack::PopAndDestroy(screenshotMsg);
             break;
             }
             
@@ -93,9 +151,8 @@
             break;
             }
             
-        default: User::Leave(KErrNotSupported);        
+        default: User::Leave(KErrNotSupported);
         }
-
     CleanupStack::PopAndDestroy(&msgStream);
     }