taskswitcher/server/src/tswindowgroupsmonitorimp.cpp
changeset 127 7b66bc3c6dc9
parent 125 26079c1bb561
equal deleted inserted replaced
126:efda7c0771b9 127:7b66bc3c6dc9
    17 #include <apgwgnam.h>
    17 #include <apgwgnam.h>
    18 
    18 
    19 #include "tswindowgroupsmonitorimp.h"
    19 #include "tswindowgroupsmonitorimp.h"
    20 #include "tsrunningappstorageimp.h"
    20 #include "tsrunningappstorageimp.h"
    21 #include "tsresourcemanager.h"
    21 #include "tsresourcemanager.h"
    22 
    22 #include "tsvisibilitymsg.h"
    23 
    23 
    24 const int KOrdinalPositionNoZOrder(-1);
    24 const int KOrdinalPositionNoZOrder(-1);
    25 // -----------------------------------------------------------------------------
    25 // -----------------------------------------------------------------------------
    26 //
    26 //
    27 // -----------------------------------------------------------------------------
    27 // -----------------------------------------------------------------------------
    66     wn->SetWindowGroupName (iWg);
    66     wn->SetWindowGroupName (iWg);
    67     CleanupStack::PopAndDestroy (wn);
    67     CleanupStack::PopAndDestroy (wn);
    68     
    68     
    69     // Window group change event
    69     // Window group change event
    70     User::LeaveIfError (iWg.EnableGroupListChangeEvents());
    70     User::LeaveIfError (iWg.EnableGroupListChangeEvents());
       
    71     
       
    72     iCache = CTsRunningAppStorage::NewL();
       
    73     RefreshCacheL();
    71     Subscribe();
    74     Subscribe();
    72 }
    75 }
    73 
    76 
    74 // -----------------------------------------------------------------------------
    77 // -----------------------------------------------------------------------------
    75 //
    78 //
    76 // -----------------------------------------------------------------------------
    79 // -----------------------------------------------------------------------------
    77 //
    80 //
    78 CTsWindowGroupsMonitor::~CTsWindowGroupsMonitor()
    81 CTsWindowGroupsMonitor::~CTsWindowGroupsMonitor()
    79 {
    82     {
    80     CActive::Cancel();
    83     CActive::Cancel();
    81     iWg.Close();
    84     iWg.Close();
    82 }
    85     }
    83 
    86 
    84 // -----------------------------------------------------------------------------
    87 // -----------------------------------------------------------------------------
    85 //
    88 //
    86 // -----------------------------------------------------------------------------
    89 // -----------------------------------------------------------------------------
    87 //
    90 //
    88 void CTsWindowGroupsMonitor::SubscribeL(MTsWindowGroupsObserver &observer)
    91 void CTsWindowGroupsMonitor::SubscribeL(MTsWindowGroupsObserver &observer)
    89 {
    92     {
       
    93     if(KErrNotFound != iObservers.Find(&observer))
       
    94         {
       
    95         User::Leave(KErrAlreadyExists);
       
    96         }
       
    97     iObservers.InsertL(&observer, 0);
       
    98     observer.HandleWindowGroupChanged(iResources, *iCache);
       
    99     }
       
   100 
       
   101 // -----------------------------------------------------------------------------
       
   102 //
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 void CTsWindowGroupsMonitor::Cancel(MTsWindowGroupsObserver & observer)
       
   106     {
    90     const TInt offset(iObservers.Find(&observer));
   107     const TInt offset(iObservers.Find(&observer));
    91     KErrNotFound == offset ? iObservers.InsertL(&observer, 0) : 
   108     if(KErrNotFound != offset)
    92                              User::Leave(KErrAlreadyExists);
   109         {
    93 }
       
    94 
       
    95 // -----------------------------------------------------------------------------
       
    96 //
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 void CTsWindowGroupsMonitor::Cancel(MTsWindowGroupsObserver & observer)
       
   100 {
       
   101     const TInt offset(iObservers.Find(&observer));
       
   102     if (KErrNotFound != offset) {
       
   103         iObservers.Remove(offset);
   110         iObservers.Remove(offset);
   104     }
   111         }
       
   112     }
       
   113 
       
   114 // -----------------------------------------------------------------------------
       
   115 /**
       
   116  * @see MTsWindowGroupsMonitor::Storage
       
   117  */
       
   118 const MTsRunningApplicationStorage& CTsWindowGroupsMonitor::Storage() const
       
   119     {
       
   120     return *iCache;
       
   121     }
       
   122 // -----------------------------------------------------------------------------
       
   123 TBool CTsWindowGroupsMonitor::IsSupported(TInt aFunction) const
       
   124     {
       
   125     return ( VisibilityChange == aFunction );
       
   126     }
       
   127 
       
   128 // -----------------------------------------------------------------------------
       
   129 void CTsWindowGroupsMonitor::HandleDataL(TInt aFunction, RReadStream& aDataStream)
       
   130 {
       
   131     if(VisibilityChange == aFunction)
       
   132         {
       
   133         CTsVisibilitMsg* msg = CTsVisibilitMsg::NewLC(aDataStream);
       
   134         const TBool hide (Invisible == msg->visibility());
       
   135         bool changed = false;
       
   136         for(TInt offset(0); offset < iCache->Count(); ++offset)
       
   137             {
       
   138             if( msg->windowGroupId() == (*iCache)[offset].WindowGroupId() )
       
   139                 {
       
   140                 (*iCache)[offset].SetHidden(hide);
       
   141                 offset = iCache->Count();
       
   142                 changed = true;
       
   143                 }
       
   144             }
       
   145         if(changed)
       
   146             {
       
   147             for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
       
   148                 {
       
   149                 iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache );
       
   150                 }
       
   151             }
       
   152         CleanupStack::PopAndDestroy(msg);
       
   153         }
   105 }
   154 }
   106 
   155 
   107 // -----------------------------------------------------------------------------
   156 // -----------------------------------------------------------------------------
   108 //
   157 //
   109 // -----------------------------------------------------------------------------
   158 // -----------------------------------------------------------------------------
   147     iResources.WsSession().EventReady( &iStatus );
   196     iResources.WsSession().EventReady( &iStatus );
   148     SetActive();
   197     SetActive();
   149 }
   198 }
   150 
   199 
   151 // -----------------------------------------------------------------------------
   200 // -----------------------------------------------------------------------------
   152 //
       
   153 // -----------------------------------------------------------------------------
       
   154 //
       
   155 void CTsWindowGroupsMonitor::ProvideEventL()
   201 void CTsWindowGroupsMonitor::ProvideEventL()
   156 {
   202     {
   157     TWsEvent wsEvent;
   203     TWsEvent wsEvent;
   158     iResources.WsSession().GetEvent(wsEvent);
   204     iResources.WsSession().GetEvent(wsEvent);
   159     if( EEventWindowGroupListChanged == wsEvent.Type() )
   205     if( EEventWindowGroupListChanged == wsEvent.Type() )
   160         {
   206         {
   161         
   207         RefreshCacheL();
   162         CTsRunningAppStorage *storage = CTsRunningAppStorage::NewLC();
   208         }
   163         
   209     }
   164         RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo;
   210 
   165         CleanupClosePushL(filteredWgInfo);
   211 // -----------------------------------------------------------------------------
   166         CleanupClosePushL(fullWgInfo);
   212 void CTsWindowGroupsMonitor::RefreshCacheL()
   167         User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo));
   213     {
   168         User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo));
   214     RArray<RWsSession::TWindowGroupChainInfo> filteredWgInfo, fullWgInfo;
   169         storage->HandleWindowGroupChanged(iResources, 
   215     CleanupClosePushL(filteredWgInfo);
   170                                           fullWgInfo.Array(), 
   216     CleanupClosePushL(fullWgInfo);
   171                                           filteredWgInfo.Array());
   217     User::LeaveIfError(iResources.WsSession().WindowGroupList(0, &filteredWgInfo));
   172         CleanupStack::PopAndDestroy( &fullWgInfo );
   218     User::LeaveIfError(iResources.WsSession().WindowGroupList(&fullWgInfo));
   173         CleanupStack::PopAndDestroy( &filteredWgInfo );
   219     iCache->HandleWindowGroupChanged(iResources, 
   174                 
   220                                      fullWgInfo.Array(), 
   175         for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
   221                                      filteredWgInfo.Array());
   176             {
   222     CleanupStack::PopAndDestroy( &fullWgInfo );
   177             iObservers[iter]->HandleWindowGroupChanged( iResources, *storage );
   223     CleanupStack::PopAndDestroy( &filteredWgInfo );
   178             }
   224             
   179         CleanupStack::PopAndDestroy( storage );
   225     for( TInt iter(0); iter < iObservers.Count(); ++iter ) 
   180         
   226         {
   181         }
   227         iObservers[iter]->HandleWindowGroupChanged( iResources, *iCache );
   182 }
   228         }
       
   229     }