diff -r 5456b4e8b3a8 -r 3321d3e205b6 idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/idlehomescreen/examples/carouselwidgetexample/publisher/src/carouselplugin.cpp Tue Sep 14 20:58:58 2010 +0300 @@ -0,0 +1,502 @@ +/* +* 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: MCS plugin publisher +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include +#include +#include +#include +#include "carouselpluginuids.hrh" +#include "carouselplugin.h" +#include "carouselplugindata.h" +#include "carouselpluginengine.h" + +// Constants +const TUint KPluginNameSeprator = '/'; + +const TInt KImplUidMCSPlugin = AI_UID_ECOM_IMPLEMENTATION_CONTENTPUBLISHER_CAROUSELPLUGIN; + +_LIT( KEventNameLaunchByIndex, "LaunchByIndex" ); +_LIT( KEventNameShowSettings, "ShowSettings" ); +_LIT( KContentItemTypeText, "text" ); +_LIT( KContentItemTypeImage, "image" ); +_LIT( KContentItemTypeData, "data" ); + +const TImplementationProxy KImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( KImplUidMCSPlugin, CCarouselPlugin::NewL ) + }; + +class CPublishItem : public CBase + { +public: + ~CPublishItem(); + CPublishItem(); + + CGulIcon* icon; + HBufC* text; + TBool last; + }; + +CPublishItem::CPublishItem() + { + + } + +CPublishItem::~CPublishItem() + { + delete text; + } + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// CMCSPlugin::NewL +// +// ---------------------------------------------------------------------------- +// +CCarouselPlugin* CCarouselPlugin::NewL() + { + CCarouselPlugin* self = new ( ELeave ) CCarouselPlugin; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::CMCSPlugin +// +// ---------------------------------------------------------------------------- +// +CCarouselPlugin::CCarouselPlugin() + { + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::ConstructL +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::ConstructL() + { + } + +// ---------------------------------------------------------------------------- +// Destructor +// Deletes all data created to heap +// ---------------------------------------------------------------------------- +// +CCarouselPlugin::~CCarouselPlugin() + { + Release( iContent ); + + delete iEngine; + iObservers.Close(); + + DeleteContentModel(); + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::PublishL +// Publishes the all the items +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::PublishL() + { + TInt err( KErrNone ); + TInt observers( iObservers.Count() ); + TInt transactionId( reinterpret_cast( this ) ); + TInt menuItems ( iEngine->MenuItemCount() ); + + for ( TInt i = 0; i < observers; i++ ) + { + MAiContentObserver* observer( iObservers[ i ] ); + err = observer->StartTransaction( transactionId ); + + if ( err == KErrNotSupported ) + { + return; + } + + // Publish content to all items + for ( TInt j = 0; j < menuItems; j++ ) + { + // Index has to start from 1 ( j + 1 ) + PublishLItemL( *observer, iEngine->MenuDataL( j ), ( j + 1 ) ); + }// shortcut count + + if ( err == KErrNone ) + { + err = observer->Commit( transactionId ); + + if ( err == KErrNotSupported ) + { + return; + } + } + }//observers + + // Set all items not dirty. + for ( TInt j = 0; j < menuItems; j++ ) + { + iEngine->MenuDataL( j ).SetDirty( EFalse ); + } + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::PublishLItemL +// Publishes one item to given index +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::PublishLItemL( MAiContentObserver& aObserver, + CCarouselData& aData, TInt aIndex ) + { + if( !aData.IsDirty() ) + { + return; + } + + CMenuItem* item = iEngine->FetchMenuItemL( aData ); + CleanupStack::PushL( item ); + + if ( iContentModel[0].type == KAiContentTypeData ) + { + if(TPtrC16( ( const TText16* ) iContentModel[ 0 ].cid ) == _L("widget") ) + { + CGulIcon* icon( iEngine->ItemIconL( item, _L("icon"))); + icon->SetBitmapsOwnedExternally( ETrue ); + aObserver.Publish( *this, 0, TPckgC( icon ), aIndex - 1 ); + } + } + CleanupStack::PopAndDestroy( item ); + } + +// ---------------------------------------------------------------------------- +// PublishEditorItemsL +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::PublishEditorItemsL() + {/* + RArray items = iEngine->MenuItemsL(); + CleanupClosePushL( items ); + + TInt count( items.Count()); + for( TInt i = 0; i < count; i++ ) + { + CMenuItem* item( iEngine->FetchMenuItemL( items[i])); + CleanupStack::PushL( item ); + CGulIcon* icon( iEngine->ItemIconL( *item, _L("icon"))); + TPtrC name( iEngine->ItemTextL( *item, _L("long_name") )); + CPublishItem* pItem = new CPublishItem; + pItem->icon = icon; + pItem->text = name.AllocL(); + if( i < count - 1 ) + { + pItem->last = EFalse; + } + else + { + pItem->last = ETrue; + } + iObservers[0]->Publish( *this, 0, TPckgC( pItem), i ); + delete pItem; + CleanupStack::PopAndDestroy( item ); + } + CleanupStack::PopAndDestroy( &items ); + */ + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::Start +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::Start( TStartReason /*aReason*/ ) + { + + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::Stop +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::Stop( TStopReason /*aReason*/ ) + { + + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::Resume +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::Resume( TResumeReason aReason ) + { + if ( aReason == EForeground ) + { + iEngine->SetBackupRestore( EFalse ); + + if ( PublishRequired() ) + { + TRAP_IGNORE( PublishL() ); + } + } + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::Suspend +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::Suspend( TSuspendReason aReason ) + { + if ( aReason == EGeneralThemeChange ) + { + TInt dataCount( iEngine->MenuItemCount() ); + + for ( TInt i = 0; i < dataCount; i++ ) + { + TRAP_IGNORE( iEngine->MenuDataL( i ).SetDirty( ETrue ) ); + } + } + else if ( aReason == EBackupRestore ) + { + // Prevent item launching during backup / restore + iEngine->SetBackupRestore( ETrue ); + } + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::SubscribeL +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::SubscribeL( MAiContentObserver& aObserver ) + { + iObservers.AppendL( &aObserver ); + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::ConfigureL +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::ConfigureL( RAiSettingsItemArray& aSettings ) + { + iEngine = CCarouselPluginEngine::NewL( *this, PublisherInfo().Namespace() ); + + TLinearOrder sortMethod( CCarouselPlugin::CompareItems ); + RAiSettingsItemArray contentItemsArr; + + TInt count( aSettings.Count() ); + + for ( TInt i = 0; i < count; i++ ) + { + MAiPluginSettings* setting( aSettings[ i ] ); + + if( setting->AiPluginItemType() == EAiPluginContentItem ) + { + MAiPluginContentItem& contItem( setting->AiPluginContentItem() ); + TPtrC name( contItem.Name() ); + TPtrC type( contItem.Type() ); + + contentItemsArr.InsertInOrder( setting, sortMethod ); + } + } + + iDataCount = contentItemsArr.Count(); + + if ( iDataCount > 0 ) + { + // Create the dynamic content Model + DeleteContentModel(); + + iContentModel = new ( ELeave ) TAiContentItem[ iDataCount ]; + + for ( TInt i = 0; i < iDataCount; i++ ) + { + iContentModel[i].id = i; + + MAiPluginContentItem& contentItem( + contentItemsArr[ i ]->AiPluginContentItem() ); + + if( contentItem.Type() == KContentItemTypeText ) + { + // text + iContentModel[i].type = KAiContentTypeText; + } + if( contentItem.Type() == KContentItemTypeImage ) + { + // image + iContentModel[i].type = KAiContentTypeBitmap; + } + else if(contentItem.Type() == KContentItemTypeData ) + { + // data + iContentModel[i].type = KAiContentTypeData; + } + + TInt pos( contentItem.Name().Locate( KPluginNameSeprator ) ); + + HBufC* contentId = HBufC::NewL( contentItem.Name().Length() ); + CleanupStack::PushL( contentId ); + + TPtr ptr( contentId->Des() ); + ptr = contentItem.Name().Mid( pos + 1 ); + + TInt sizeOfContentId( ptr.Size() + sizeof( wchar_t ) ); + + iContentModel[i].cid = + static_cast( User::AllocL( sizeOfContentId ) ); + + Mem::Copy( ( TAny* )iContentModel[i].cid, + ptr.PtrZ(), sizeOfContentId ); + + CleanupStack::PopAndDestroy( contentId ); + } + + iContent = AiUtility::CreateContentItemArrayIteratorL( + iContentModel, iDataCount ); + } + + contentItemsArr.Reset(); + // We own the array so destroy it + aSettings.ResetAndDestroy(); + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::GetProperty +// +// ---------------------------------------------------------------------------- +// +TAny* CCarouselPlugin::GetProperty( TProperty aProperty ) + { + if( aProperty == EPublisherContent ) + { + return static_cast< MAiContentItemIterator* >( iContent ); + } + + return NULL; + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::HandleEvent +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::HandleEvent( const TDesC& aEventName, const TDesC& aParam ) + { + if( aEventName == KEventNameLaunchByIndex ) + { + TInt32 index; + AiUtility::ParseInt( index, aParam ); + + TRAP_IGNORE( iEngine->LaunchItemL( index - 1 ) ); + } + else if( aEventName == KEventNameShowSettings ) + { + TRAP_IGNORE( iEngine->ShowSettingsL() ); + } + else if( aEventName == _L("ShowEditor")) + { + TRAP_IGNORE( PublishEditorItemsL() ); + } + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::CompareItems +// +// ---------------------------------------------------------------------------- +// +TInt CCarouselPlugin::CompareItems( const MAiPluginSettings& aFirst, + const MAiPluginSettings& aSecond ) + { + MAiPluginSettings& first = const_cast(aFirst); + MAiPluginSettings& second = const_cast(aSecond); + return first.AiPluginContentItem().Name().CompareC(second.AiPluginContentItem().Name()); + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::DeleteContentModel +// +// ---------------------------------------------------------------------------- +// +void CCarouselPlugin::DeleteContentModel() + { + if( iContentModel ) + { + for ( TInt i = 0; i < iDataCount; i++ ) + { + if( iContentModel[i].cid ) + { + TAny* cell = static_cast( const_cast( iContentModel[i].cid ) ); + User::Free( cell ); // Originally allocated with User::Alloc, so delete + // with correlating method. + iContentModel[i].cid = NULL; + } + } + + delete iContentModel; + iContentModel = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CMCSPlugin::PublishRequired +// +// ---------------------------------------------------------------------------- +// +TBool CCarouselPlugin::PublishRequired() const + { + TInt count( iEngine->MenuItemCount() ); + + TBool retval( EFalse ); + + for ( TInt i = 0; !retval && i < count; i++ ) + { + TRAP_IGNORE( retval = iEngine->MenuDataL( i ).IsDirty() ); + } + + + return retval; + } + +// ======== GLOBAL FUNCTIONS ======== +// ---------------------------------------------------------------------------- +// Constructs and returns an application object. +// ---------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof( KImplementationTable ) / + sizeof( TImplementationProxy ); + return KImplementationTable; + } + +// End of file