idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp
branchRCL_3
changeset 18 bd874ee5e5e2
parent 9 d0529222e3f0
child 19 502e5d91ad42
--- a/idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp	Fri Feb 19 23:07:29 2010 +0200
+++ b/idlefw/plugins/mcsplugin/publisher/src/mcsplugindata.cpp	Fri Mar 12 15:43:54 2010 +0200
@@ -18,13 +18,14 @@
 #include <mcsmenufilter.h>
 #include <itemmap.h>
 #include <aistrcnv.h>
+#include <favouritesdbobserver.h>
+#include <favouritesdb.h>        
 
 #include "mcsplugindata.h"
 #include "mcspluginengine.h"
 
 using namespace HSPluginSettingsIf;
 
-_LIT8( KAppUid, "271012080" );
 _LIT( KMenuAttrParam, "param" );
 _LIT( KMenuAttrLocked, "locked" );
 _LIT8( KProperNameType, "type" );
@@ -35,6 +36,15 @@
 _LIT8( KProperValueBookmark, "bookmark" );
 _LIT8( KProperValueAppl, "application" );
 
+_LIT( KUrl, "url" );
+_LIT( KMenuIconFile, "aimcsplugin.mif" );
+_LIT( KMenuIconId, "16386" );
+_LIT( KMenuMaskId, "16387" );
+_LIT( KInitialRefCount, "1" );
+_LIT( KMenuAttrRefcount, "ref_count" );
+_LIT( KMyMenuData, "matrixmenudata" );
+
+
 // ======== LOCAL FUNCTIONS ========
 
 static void ItemMapArrayCleanupFunc( TAny* aPointerArray )
@@ -95,10 +105,17 @@
 //
 void CMCSPluginData::ConstructL()
     {
-     // AILaunch uid in decimal format
-    iPluginSettings = CHomescreenSettings::NewL( KAppUid,
-                                                 iInstanceUid,
-                                                 this );
+    iPluginSettings = CHomescreenSettings::Instance();
+    if( iPluginSettings == NULL )
+        {
+        User::Leave( KErrUnknown );
+        }
+    iPluginSettings->AddObserverL( this );
+
+    iSaveWatcher = CMCSPluginWatcher::NewL( CMCSPluginWatcher::EOperation );
+
+    iMenu.OpenL( KMyMenuData );
+
     UpdateDataL();
     }
 
@@ -107,9 +124,16 @@
 // ---------------------------------------------------------------------------
 //
 CMCSPluginData::~CMCSPluginData()
-    {   
+    {
+    if( iPluginSettings )
+        {
+        iPluginSettings->RemoveObserver( this );
+        }
+
     iData.Close();
-    delete iPluginSettings;
+    iMenu.Close();
+
+    delete iSaveWatcher;
     }
 
 // ---------------------------------------------------------------------------
@@ -167,11 +191,13 @@
 // 
 // ---------------------------------------------------------------------------
 //
-TInt CMCSPluginData::SettingsChangedL( const TDesC8& /*aEvent*/,  const TDesC8& /*aPluginName*/,
-                           const TDesC8& /*aPluginUid*/, const TDesC8& /*aPluginId*/ )
+void CMCSPluginData::SettingsChangedL( const TDesC8& /*aEvent*/,  const TDesC8& /*aPluginName*/,
+                           const TDesC8& /*aPluginUid*/, const TDesC8& aPluginId )
     {
-    UpdateDataL();
-    return KErrNone;
+    if( aPluginId.CompareF( iInstanceUid ) == 0 )
+        {
+        UpdateDataL();
+        }   
     }
 
 // ---------------------------------------------------------------------------
@@ -363,8 +389,152 @@
                 }
             }
         }
-		// ETrue tells that changes are stored also to plugin reference 
+    // ETrue tells that changes are stored also to plugin reference 
     iPluginSettings->SetSettingsL( iInstanceUid, settingItems, ETrue );
     CleanupStack::PopAndDestroy( &settingItems );
     }
 
+// ---------------------------------------------------------------------------
+// Gets MCS Plugin folder ID. This hidden folder in matrixmenudata.xml is used 
+// for storing run-time generated menuitems
+// ---------------------------------------------------------------------------
+//
+TInt CMCSPluginData::GetMCSPluginFolderIdL()
+    {
+    TInt folderId;
+    
+    _LIT( KMCSFolder, "mcsplugin_folder" );
+
+    CMenuItem* item( NULL );
+    CMenuFilter* filter = CMenuFilter::NewL();
+    CleanupStack::PushL( filter );
+    filter->SetType( KMenuTypeFolder );
+    filter->HaveAttributeL( KMenuAttrLongName, KMCSFolder );
+
+    const TInt rootId = iMenu.RootFolderL();
+    RArray<TMenuItem> itemArray;
+    CleanupClosePushL( itemArray );
+    iMenu.GetItemsL( itemArray, rootId, filter, ETrue );
+    if ( itemArray.Count() > 0 )
+        {
+        item = CMenuItem::OpenL( iMenu, itemArray[0] );
+        folderId = item->Id();
+        }
+    else 
+        {
+        folderId = iMenu.RootFolderL();
+        }
+    CleanupStack::PopAndDestroy( &itemArray );
+    CleanupStack::PopAndDestroy( filter ); 
+
+    delete item; 
+
+    return folderId;
+    }
+
+// ---------------------------------------------------------------------------
+// Creates bookmark menu item if it does not exist
+// ---------------------------------------------------------------------------
+//
+void CMCSPluginData::CreateBkmMenuItemsL()
+    {
+    RPointerArray<CItemMap> settings;
+    TCleanupItem settingsCleanupItem( ItemMapArrayCleanupFunc, &settings );
+    CleanupStack::PushL( settingsCleanupItem );
+    iPluginSettings->GetSettingsL( iInstanceUid, settings );
+
+    RFavouritesSession bookmarkSess;
+    RFavouritesDb bookmarkDb;
+
+    User::LeaveIfError( bookmarkSess.Connect() );
+    User::LeaveIfError( bookmarkDb.Open( bookmarkSess, KBrowserBookmarks ));
+
+    TInt count = settings.Count();
+    for( TInt i = 0; i < count; i++ )
+       {
+        CItemMap* itemMap = settings[i];
+        RPointerArray<HSPluginSettingsIf::CPropertyMap>& properties
+            = itemMap->Properties();
+
+        TPtrC8 uid8, type;
+
+        for( TInt j = 0; j < properties.Count(); j++ )
+            {
+
+            if( properties[j]->Name() == KProperNameType )
+                {
+                type.Set( properties[j]->Value() );
+                }
+            else if ( properties[j]->Name() == KProperNameUid )
+                {
+                uid8.Set( properties[j]->Value() );
+                }
+            }
+
+        if( type == KProperValueBookmark )
+            {
+            TMenuItem menuItem = CreateMenuItemL( properties );
+
+            CActiveSchedulerWait* wait = 
+                            new ( ELeave ) CActiveSchedulerWait;
+            CleanupStack::PushL( wait );
+            
+            if( menuItem.Id() == 0 )
+                {
+                TLex8 uidLex( uid8.Mid( 1, uid8.Length() - 2 ) );
+                TUint32 id;
+                uidLex.Val(id, EHex);
+
+                CFavouritesItem* bkmItem = CFavouritesItem::NewLC();
+                TInt bcount = bookmarkDb.Get( TInt32( id ), *bkmItem );
+
+                HBufC *uid( NULL );
+                uid = AiUtility::CopyToBufferL( uid, uid8 );
+                CleanupStack::PushL( uid );
+
+                CMenuItem* newItem = CMenuItem::CreateL( iMenu, 
+                                                         KMenuTypeUrl, 
+                                                         GetMCSPluginFolderIdL(),
+                                                         0 );
+                CleanupStack::PushL( newItem );
+
+                newItem->SetAttributeL( KMenuAttrUid, *uid );
+                newItem->SetAttributeL( KMenuAttrLongName, bkmItem->Name() );
+                newItem->SetAttributeL( KMenuAttrIconFile, KMenuIconFile );
+                newItem->SetAttributeL( KMenuAttrIconId, KMenuIconId );
+                newItem->SetAttributeL( KMenuAttrMaskId, KMenuMaskId );
+                newItem->SetAttributeL( KMenuAttrRefcount, KInitialRefCount );
+                newItem->SetAttributeL( KUrl , bkmItem->Url() );
+
+                CMenuOperation* op = newItem->SaveL( iSaveWatcher->iStatus );
+                TInt newId = newItem->Id();
+                iData[i].MenuItem().SetId( newId );
+
+                iSaveWatcher->StopAndWatch( op, wait );
+
+                // Start the nested scheduler loop.
+                wait->Start();
+
+                CleanupStack::Pop( newItem );
+                CleanupStack::PopAndDestroy( uid );
+                CleanupStack::PopAndDestroy( bkmItem );
+                }
+            else
+                {
+                CMenuItem* item = CMenuItem::OpenL( iMenu, menuItem );
+
+                if( iEngine.UpdateMenuItemsRefCountL( item, 1 ) > 0 )
+                    {
+                    CMenuOperation* op = item->SaveL( iSaveWatcher->iStatus );
+                    iSaveWatcher->StopAndWatch( op, wait );
+                    // Start the nested scheduler loop.
+                    wait->Start();
+                    }
+                }
+
+            CleanupStack::PopAndDestroy( wait );
+            wait = NULL;
+            }
+        }
+    CleanupStack::PopAndDestroy(); // settingsCleanupItem
+    }