idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp
branchRCL_3
changeset 9 f966699dea19
parent 2 08c6ee43b396
child 15 ff572dfe6d86
--- a/idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp	Tue Feb 02 00:04:13 2010 +0200
+++ b/idlehomescreen/hscontentcontrol/src/hscontentcontrolfactory.cpp	Fri Feb 19 22:42:37 2010 +0200
@@ -18,8 +18,10 @@
 // System include files
 #include <ecom/ecom.h>
 #include <ecom/implementationinformation.h>
+#include <aknview.h>
 
 // User include files
+#include "xnappuiadapter.h"
 #include "hscontentcontrolfactory.h"
 #include "hscontentcontrolecomlistener.h"
 #include "hscontentcontroluninstallmonitor.h"
@@ -60,9 +62,11 @@
 // CHsContentControlFactory::NewL()
 // ----------------------------------------------------------------------------
 //
-EXPORT_C CHsContentControlFactory* CHsContentControlFactory::NewL()
+EXPORT_C CHsContentControlFactory* CHsContentControlFactory::NewL( 
+        CXnAppUiAdapter& aAdapter )
     {
-    CHsContentControlFactory* self = new ( ELeave ) CHsContentControlFactory();
+    CHsContentControlFactory* self = 
+            new ( ELeave ) CHsContentControlFactory( aAdapter );
     CleanupStack::PushL( self );
     self->ConstructL();
     CleanupStack::Pop( self );
@@ -88,7 +92,8 @@
 // CHsContentControlFactory::CHsContentControlFactory()
 // ----------------------------------------------------------------------------
 //
-CHsContentControlFactory::CHsContentControlFactory()
+CHsContentControlFactory::CHsContentControlFactory( CXnAppUiAdapter& aAdapter )
+    :iAdapter( aAdapter ) 
     {
     }
 
@@ -100,6 +105,16 @@
     {
     iImplArray.ResetAndDestroy();
     iImplArray.Close();
+    
+    if ( iHsContentControlUis.Count() > 0 )
+        {
+        for( TInt index( iHsContentControlUis.Count() - 1 ); index >= 0; --index )
+            {
+            CHsContentControlUi* cc( iHsContentControlUis[ index ] );
+            ReleaseHsCcUi( cc );
+            }
+        }
+
     iHsContentControlUis.ResetAndDestroy();
     
 	delete iHsContentControlEComListener;
@@ -200,6 +215,7 @@
             // ImplUid of plugin must match Sis pkg uid
             if ( cc && cc->ImplUid() == aPkgUid )
                 {
+                ReleaseHsCcUi( cc );
                 iHsContentControlUis.Remove( index );
                 delete cc;
                 cc = NULL;
@@ -245,6 +261,7 @@
                 CHsContentControlUi* cc( iHsContentControlUis[ innerIndex ] );
                 if ( cc && cc->ImplUid() == uid )
                     {
+                    ReleaseHsCcUi( cc );
                     iHsContentControlUis.Remove( innerIndex );
                     delete cc;
                     cc = NULL;
@@ -310,6 +327,7 @@
                     CHsContentControlUi* cc( iHsContentControlUis[ innerIndex ] );
                     if ( cc && cc->ImplUid() == uid )
                         {
+                        ReleaseHsCcUi( cc );
                         iHsContentControlUis.Remove( innerIndex );
                         delete cc;
                         cc = NULL;
@@ -323,4 +341,34 @@
     return EFalse;
     }
 
+// ----------------------------------------------------------------------------
+// CHsContentControlFactory::ReleaseHsCcUi
+// ----------------------------------------------------------------------------
+//
+void CHsContentControlFactory::ReleaseHsCcUi( 
+        CHsContentControlUi* aHsContentControlUi )
+    {
+    if ( &iAdapter && aHsContentControlUi )
+        {
+        RPointerArray<CAknView> views;
+
+        // notify plugin about deactivation
+        aHsContentControlUi->DeActivate();
+        
+        // get all views from HsContentControlUi
+        aHsContentControlUi->Views( views );
+
+        for ( TInt i=0; i<views.Count(); i++ )
+            {
+            CAknView* view = views[ i ];
+            views.Remove( i );
+            // remove/deregister/delete all views from appui
+            TRAP_IGNORE( iAdapter.RemoveViewL( *view ) );
+            }
+
+        // reset views array
+        views.Reset();
+        }
+    }
+
 // End of file