idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugindata.cpp
branchRCL_3
changeset 102 ba63c83f4716
parent 93 b01126ce0bec
child 103 966d119a7e67
--- a/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugindata.cpp	Wed Sep 15 12:00:00 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,580 +0,0 @@
-/*
-* Copyright (c) 2009 - 2010 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  
-*
-*/
-#include <mcsmenuitem.h>
-#include <mcsmenufilter.h>
-#include <itemmap.h>
-#include <aistrcnv.h>
-
-#include "carouselplugindata.h"
-#include "carouselpluginengine.h"
-
-using namespace HSPluginSettingsIf;
-
-_LIT( KMenuAttrParam, "param" );
-_LIT( KMenuAttrLocked, "locked" );
-_LIT8( KProperNameType, "type" );
-_LIT8( KProperNameParam, "param" );
-_LIT8( KProperNameUid, "uid" );
-_LIT8( KProperNameView, "view" );
-_LIT8( KProperNameLocked, "locked" );
-_LIT8( KProperValueFolder, "folder" );
-_LIT8( KProperValueBookmark, "bookmark" );
-_LIT8( KProperValueAppl, "application" );
-_LIT8( KProperValueMailbox, "mailbox" );
-_LIT8( KMenuAttrUndefUid, "0x99999991" );
-
-_LIT( KMyMenuData, "matrixmenudata" );
-_LIT( KMenuTypeMailbox, "menu:mailbox" );
-
-
-#define KMCSCmailMtmUidValue 0x2001F406
-
-// ======== LOCAL FUNCTIONS ========
-
-// ----------------------------------------------------------------------------
-// CleanupResetAndDestroy()
-// ----------------------------------------------------------------------------
-//
-template<class T>
-static void CleanupResetAndDestroy( TAny* aObj )
-    {
-    if( aObj )
-        {
-        static_cast<T*>( aObj )->ResetAndDestroy();
-        }
-    }
-
-// ----------------------------------------------------------------------------
-// CleanupResetAndDestroyPushL
-// ----------------------------------------------------------------------------
-//
-template<class T>
-static void CleanupResetAndDestroyPushL(T& aArray)
-    {
-    CleanupStack::PushL( TCleanupItem( &CleanupResetAndDestroy<T>, &aArray ) );
-    }
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// Default constructor
-// ---------------------------------------------------------------------------
-//
-CCarouselData::CCarouselData()
-    :iDirty( ETrue )
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CCarouselData::~CCarouselData()
-    {
-    delete iName;
-    delete iValue;
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-void CCarouselData::SetMenuItem( TMenuItem& aMenuItem )
-    {
-    iMenuItem = aMenuItem;
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-TMenuItem& CCarouselData::MenuItem()
-    {
-    return iMenuItem;
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-TDesC& CCarouselData::Name()
-    {
-    return *iName;
-    }
-    
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-void CCarouselData::SetNameL( const TDesC& aName )
-    {
-	delete iName;
-	iName = NULL;
-    iName = aName.AllocL();
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-TDesC& CCarouselData::Value()
-    {
-    return *iValue;
-    }
-    
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-void CCarouselData::SetValueL( const TDesC& aValue )
-    {
-	delete iValue;
-	iValue = NULL;
-    iValue = aValue.AllocL();
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-void CCarouselData::SetDirty( TBool aDirty )
-    {
-    iDirty = aDirty;
-    }
-
-// ---------------------------------------------------------------------------
-// 
-// ---------------------------------------------------------------------------
-//
-TBool CCarouselData::IsDirty() const
-    {
-    return iDirty;
-    }
-    
-
-// ---------------------------------------------------------------------------
-// Symbian 2nd phase constructor can leave
-// ---------------------------------------------------------------------------
-//
-CCarouselPluginData* CCarouselPluginData::NewL( CCarouselPluginEngine& aEngine, const TDesC8& aInstanceUid )
-    {
-    CCarouselPluginData* self = new (ELeave) CCarouselPluginData( aEngine, aInstanceUid );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
- 
-    return self;
-    }
-    
-// ---------------------------------------------------------------------------
-// Default constructor
-// ---------------------------------------------------------------------------
-//
-CCarouselPluginData::CCarouselPluginData( CCarouselPluginEngine& aEngine, const TDesC8& aInstanceUid )
-    : iEngine( aEngine ), iInstanceUid( aInstanceUid )
-    {
-    }
-    
-// ---------------------------------------------------------------------------
-// Symbian 2nd phase constructor can leave
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::ConstructL()
-    {
-    iPluginSettings = CHomescreenSettings::Instance();
-    if( iPluginSettings == NULL )
-        {
-        User::Leave( KErrUnknown );
-        }
-    iPluginSettings->AddObserverL( this );
-
-    iMenu.OpenL( KMyMenuData );
-
-    UpdateDataL();
-    }
-
-// ---------------------------------------------------------------------------
-// Destructor
-// ---------------------------------------------------------------------------
-//
-CCarouselPluginData::~CCarouselPluginData()
-    {
-    if( iPluginSettings )
-        {
-        iPluginSettings->RemoveObserver( this );
-        }
-    iData.ResetAndDestroy();
-    iMenu.Close();
-    }
-
-// ---------------------------------------------------------------------------
-// Gets the instance specific settings from HSPS and creates data items
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::UpdateDataL()
-    {
-    RPointerArray<CItemMap> settings;
-    CleanupResetAndDestroyPushL( settings );
-
-    User::LeaveIfError( iPluginSettings->GetSettingsL( iInstanceUid, settings ) );
-    if ( settings.Count() <= 0 )
-        {
-        User::Leave( KErrNotFound );
-        }
-
-    TBool wasEmpty = !iData.Count();
-    
-    for ( TInt i = 0; i < settings.Count(); i++ )
-       {
-        CItemMap* itemMap = settings[ i ];
-        
-        // get properties
-        RPointerArray<HSPluginSettingsIf::CPropertyMap>& properties
-            = itemMap->Properties();
-        
-        CCarouselData* data = GetMenuDataL( properties );
-        CleanupStack::PushL( data );
-        if ( wasEmpty )
-            {
-            // list of shortcut slot was empty
-            // we append the shortcut data slots one-by-one to the list            
-            data->SetDirty( ETrue );
-            iData.AppendL( data );
-            CleanupStack::Pop( data );
-            }
-        else 
-            {
-            // check for updates in existing shortcut data slot
-            // if menuitem id has changed, replace the item and 
-            // set as dirty
-            TInt id( iData[ i ]->MenuItem().Id() );
-            
-            // id of all bookmarks is zero so name has to be check
-            // in case of bookmark has changed
-            if ( id >= 0 && ( data->MenuItem().Id() != id ||
-                    ( id == 0 && data->Name().CompareF(
-                            iData[ i ]->Name() ) != 0 ) ) )
-                {
-                data->SetDirty( ETrue );
-                CCarouselData* oldData = iData[i];
-                iData.Remove( i );
-                delete oldData;
-                
-                iData.InsertL( data, i );
-                CleanupStack::Pop( data );
-                }
-            else
-                {
-                CleanupStack::PopAndDestroy( data );
-                }
-            }
-        }
-    
-    // Leave if there isn't any data filled into array as there isn't
-    // anything shortcut to publish on homescreen.
-    if ( iData.Count() <= 0 ) 
-        {
-        User::Leave( KErrNotFound );
-        }
-    
-    // Cleanup.
-    CleanupStack::PopAndDestroy(); // settings
-    }
-
-// ---------------------------------------------------------------------------
-// Removes obsolete data and saves 'Undefined' item to HSPS
-// Used when active mailbox is deleted from system.
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::RemoveDataL( TInt aId )
-    {
-    TInt count = iData.Count();
-    for( TInt i = 0; i < count; i++ )
-        {
-        CCarouselData* data = iData[i];
-        if( data->MenuItem().Type() == KMenuTypeMailbox &&
-            data->MenuItem().Id() == aId )
-            {
-            iData[i]->MenuItem().SetId( KErrNotFound );
-            iData[i]->SetDirty( ETrue );
-            SaveUndefinedItemL( i );
-            }
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// Call back from Homescreen settings
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::SettingsChangedL( const TDesC8& /*aEvent*/,  const TDesC8& /*aPluginName*/,
-                           const TDesC8& /*aPluginUid*/, const TDesC8& aPluginId )
-    {
-    if( aPluginId.CompareF( iInstanceUid ) == 0 )
-        {
-        UpdateDataL();
-        }   
-    }
-
-// ---------------------------------------------------------------------------
-// Gets the menu item from engine using the setting properties as filter
-// ---------------------------------------------------------------------------
-//
-CCarouselData* CCarouselPluginData::GetMenuDataL( 
-        RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties )
-    {
-    if ( aProperties.Count() <= 0 )
-		{
-		User::Leave( KErrArgument );
-		}
-
-    TPtrC8 type;
-	TPtrC8 uid;
-	TPtrC8 view;
-	TPtrC8 param;
-    
-    // first we need to check the item type
-    for ( TInt i = 0; i < aProperties.Count(); i++ )
-        {
-        if ( aProperties[i]->Name() == KProperNameType )
-            {
-            type.Set( aProperties[i]->Value());
-            }
-        else if( aProperties[i]->Name() == KProperNameUid)
-            {
-            uid.Set( aProperties[i]->Value());
-            }
-        else if( aProperties[i]->Name() == KProperNameView)
-            {
-            view.Set( aProperties[i]->Value());
-            }
-        else if( aProperties[i]->Name() == KProperNameParam )
-            {
-            param.Set( aProperties[i]->Value());
-            }
-        }
-    CCarouselData* data = new ( ELeave ) CCarouselData();
-    CleanupStack::PushL( data );
-    if( type == KProperValueBookmark )
-        {
-        GetBkmDataL( uid, view, param, *data );
-        }
-    else if( type == KProperValueFolder )
-        {
-        GetFolderData( param, *data );
-        }
-    else if( type == KProperValueMailbox )
-        {
-        GetMailboxDataL( uid, param, *data );
-        }
-    else
-        {
-        GetMCSDataL( aProperties, *data );
-        }
-    CleanupStack::Pop( data );
-    return data;
-    }
-
-// ---------------------------------------------------------------------------
-// Creates bookmark data item.
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::GetBkmDataL( const TDesC8& aUid, const TDesC8& aView, const TDesC8& aParam, CCarouselData& aData )
-    {
-    TMenuItem item;
-        
-    if( aUid.Length() > 0 )
-        {
-        CMenuFilter* filter = CMenuFilter::NewLC();
-        HBufC* name( NULL );
-        HBufC* value( NULL );
-        name = AiUtility::CopyToBufferL( name, KProperNameUid );
-        CleanupStack::PushL( name );
-        value = AiUtility::CopyToBufferL( value, aUid );
-        CleanupStack::PushL( value );
-        filter->HaveAttributeL( *name, *value );  
-        CleanupStack::PopAndDestroy( value );
-        CleanupStack::PopAndDestroy( name );
-        item = iEngine.FindMenuItemL( *filter );
-        CleanupStack::PopAndDestroy( filter );    
-        }
-    
-    item.SetType( KMenuTypeUrl );
-    aData.SetMenuItem( item );
-
-    HBufC* view( NULL );
-    view = AiUtility::CopyToBufferL( view, aView );
-    CleanupStack::PushL( view );
-    aData.SetValueL( *view );
-    CleanupStack::PopAndDestroy( view );
-    
-    HBufC* param( NULL );
-    param = AiUtility::CopyToBufferL( param, aParam );
-    CleanupStack::PushL( param );
-    aData.SetNameL( *param );
-    CleanupStack::PopAndDestroy( param );
-    }
-    
-// ---------------------------------------------------------------------------
-// Creates folder data item.
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::GetFolderData( const TDesC8& aParam, CCarouselData& aData )
-    {
-    // In folder case, we have to extract id from 
-    // param attribute and return item with this id
-    // convert id to integer
-    TInt id;
-    TLex8 lextmp( aParam);
-    lextmp.Val( id );
-    
-    TMenuItem item;
-    item.SetType( KMenuTypeFolder );
-    item.SetId( id );
-    aData.SetMenuItem( item );
-    }
-
-// ---------------------------------------------------------------------------
-// Creates mailbox data item.
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::GetMailboxDataL( const TDesC8& aUid, const TDesC8& aParam, CCarouselData& aData )
-    {
-    TInt id( KErrNotFound );
-    TLex8 lextmp( aUid);
-    lextmp.Val( id );
-    
-    TMenuItem item;
-    item.SetType( KMenuTypeMailbox );
-    item.SetId( id );
-    aData.SetMenuItem( item );
-    
-    HBufC* param( NULL );
-    param = AiUtility::CopyToBufferL( param, aParam );
-    CleanupStack::PushL( param );
-    
-    aData.SetNameL( *param );
-    
-    CleanupStack::PopAndDestroy( param );
-    }
-    
-// ---------------------------------------------------------------------------
-// Gets data item from MCS
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::GetMCSDataL( RPointerArray<HSPluginSettingsIf::CPropertyMap>& aProperties,
-        CCarouselData& aData)
-    {
-    CMenuFilter* filter = CMenuFilter::NewLC();
-
-    // Exclude 'view' and 'param' attributes from search criteria by default
-    // Criterias will be added to filter if setting defines them
-    filter->DoNotHaveAttributeL( KMenuAttrView );
-    filter->DoNotHaveAttributeL( KMenuAttrParam );
-    
-    // then add all property/value pairs to the filter
-    for ( TInt i = 0; i < aProperties.Count(); i++ )
-        {
-        // skip the type property
-        if( aProperties[i]->Name() == KProperNameType )
-            {
-            continue;
-            }
-
-        HBufC* name( NULL );
-        HBufC* value( NULL );
-        name = AiUtility::CopyToBufferL( name, aProperties[i]->Name() );
-        CleanupStack::PushL( name );
-        value = AiUtility::CopyToBufferL( value, aProperties[i]->Value() );
-        CleanupStack::PushL( value );
-
-        if ( value->Length() != 0 )
-            {
-            filter->HaveAttributeL( *name, *value );  
-            }
-        CleanupStack::PopAndDestroy( value );
-        CleanupStack::PopAndDestroy( name );
-        }
-    
-    // locked property excluded from search pattern 
-    filter->DoNotHaveAttributeL( KMenuAttrLocked );
-    
-    TMenuItem item = iEngine.FindMenuItemL( *filter );
-    CleanupStack::PopAndDestroy( filter );
-    aData.SetMenuItem( item );
-    }
-
-// ---------------------------------------------------------------------------
-// Returns menu item for given index
-// ---------------------------------------------------------------------------
-//
-CCarouselData& CCarouselPluginData::DataItemL( TInt aIndex )
-    {
-    if( aIndex < 0 || aIndex >= iData.Count())
-        {
-        User::Leave( KErrArgument ); 
-        }
-    return *iData[aIndex];
-    }
-
-// ---------------------------------------------------------------------------
-// Save the undefined item.
-// ---------------------------------------------------------------------------
-//
-void CCarouselPluginData::SaveUndefinedItemL( const TInt& aIndex )
-    {
-    RPointerArray<CItemMap> settingItems;
-    CleanupResetAndDestroyPushL( settingItems );
-    
-    iPluginSettings->GetSettingsL( iInstanceUid, settingItems );
-    if ( aIndex >= 0 && aIndex < settingItems.Count() )
-        {
-        CItemMap* itemMap = settingItems[ aIndex ];
-        
-        // get properties
-        RPointerArray<HSPluginSettingsIf::CPropertyMap>& properties
-            = itemMap->Properties();
-
-        for ( TInt i = 0; i < properties.Count(); i++ )
-            {
-            if ( properties[ i ]->Name() == KProperNameType )
-                {
-                properties[ i ]->SetValueL( KProperValueAppl );
-                }
-            else if ( properties[ i ]->Name() == KProperNameUid )
-                {
-                properties[ i ]->SetValueL( KMenuAttrUndefUid );
-                }
-            else if ( properties[ i ]->Name() == KProperNameView )
-                {
-                properties[ i ]->SetValueL( KNullDesC8 );
-                }
-            else if ( properties[ i ]->Name() == KProperNameParam )
-                {
-                properties[ i ]->SetValueL( KNullDesC8 );
-                }
-            else if ( properties[ i ]->Name() == KProperNameLocked )
-                {
-                properties[i]->SetValueL( KNullDesC8 );
-                }
-            }
-        }
-    // ETrue tells that modified settings are stored also to plugin reference
-    iPluginSettings->SetSettingsL( iInstanceUid, settingItems, ETrue );
-    CleanupStack::PopAndDestroy(); // settingItems
-    }
-
-// End of file