diff -r 000000000000 -r dd21522fd290 webengine/wrtharvester/src/wrtharvester.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/wrtharvester/src/wrtharvester.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,459 @@ +/* +* Copyright (c) 2007, 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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 FILES +#include "wrtharvester.h" +#include "wrtharvesterregistryaccess.h" +#include "wrtharvesterpsnotifier.h" +#include "wrtharvesterpublisherobserver.h" + +#include "wrtharvesterconst.h" +#include + +#include + +#include +#include +#include +#include //Publish & Subscribe +#include +#include +#include +#include + + +// TODO Check these types, should they be definedin sapidatapluginconst.h? +_LIT( KTemplatedWidget, "ai3templatedwidget"); +_LIT8( KMySelected, "selected"); +_LIT8( KMyActionMap, "action_map" ); +_LIT8( KMyItem, "item" ); +_LIT8( KMyAdd, "Add" ); +_LIT8( KMyDelete, "Delete" ); +_LIT8( KMyItemId, "item_id" ); +_LIT8( KMyImage, "image" ); +_LIT( KMyContType, "wideimage" ); +_LIT8( KMyResultName,"mydata" ); +_LIT( KMyActionName, "data" ); +// ============================= LOCAL FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// ta +// ---------------------------------------------------------------------------- +// +static HBufC* GetAppNameLC( RApaLsSession& aSession, const TUid& aUid ) + { + TApaAppInfo info; + User::LeaveIfError( aSession.GetAppInfo( info, aUid ) ); + + return info.iFullName.AllocLC(); + } + + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +static void HandleWidgetCommandL( + RApaLsSession& aSession, + const TDesC& aWidget, + const TUid& aUid, + TUint32 aOperation ) + { + const TInt size( 2* aWidget.Length() + 3*sizeof( TUint32 ) ); + + // Message format is + CApaCommandLine* cmd( CApaCommandLine::NewLC() ); + HBufC8* opaque( HBufC8::NewLC( size ) ); + + RDesWriteStream stream; + TPtr8 des( opaque->Des() ); + + stream.Open( des ); + CleanupClosePushL( stream ); + + // Generate the command. + stream.WriteUint32L( aUid.iUid ); + stream.WriteUint32L( aWidget.Length() ); + stream.WriteL( reinterpret_cast< const TUint8* >( aWidget.Ptr() ), + aWidget.Size() ); + + stream.WriteInt32L( aOperation ); + + CleanupStack::PopAndDestroy( &stream ); + + // Generate command. + cmd->SetCommandL( EApaCommandBackgroundAndWithoutViews ); + cmd->SetOpaqueDataL( *opaque ); + + CleanupStack::PopAndDestroy( opaque ); + + cmd->SetExecutableNameL( KLauncherApp ); + + User::LeaveIfError( aSession.StartApp( *cmd ) ); + CleanupStack::PopAndDestroy( cmd ); + } + +// Map the interface UIDs to implementation factory functions +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY( 0xA12345FE, CWrtHarvester::NewL ) + }; + +// ---------------------------------------------------------------------------- +// Exported proxy for instantiation method resolution +// ---------------------------------------------------------------------------- +// +EXPORT_C const TImplementationProxy* ImplementationGroupProxy( + TInt& aTableCount ) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + return ImplementationTable; + } + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// Constructor +// ---------------------------------------------------------------------------- +// +CWrtHarvester::CWrtHarvester( MLiwInterface* aCPSInterface ): + iCPSInterface( aCPSInterface ) + { + } + +// ---------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::ConstructL() + { + User::LeaveIfError( iApaSession.Connect() ); + iWidgetUIListener = CWrtHarvesterPSNotifier::NewL( this, EWidgetUIState ); + iWidgetRegListener = CWrtHarvesterPSNotifier::NewL( this, EWidgetRegAltered ); + iWidgetMMCListener = CWrtHarvesterPSNotifier::NewL( this, EWidgetMMCAltered ); + } + +// ---------------------------------------------------------------------------- +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +CWrtHarvester* CWrtHarvester::NewL( MLiwInterface* aCPSInterface ) + { + CWrtHarvester* self = new ( ELeave ) CWrtHarvester( aCPSInterface ); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CWrtHarvester::~CWrtHarvester() + { + iObservers.ResetAll(); + delete iWidgetUIListener; + delete iWidgetRegListener; + delete iWidgetMMCListener; + iWidgetUids.Close(); + iApaSession.Close(); + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::UpdateL() + { + UpdatePublishersL(); + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::HandlePublisherNotificationL( const TDesC& aContentId, const TDesC8& aTrigger ) + { + TUid uid( iRegistryAccess.WidgetUid( aContentId ) ); + if( aTrigger == KActive() ) + { + StartWidgetL( uid ); + } + else + { + TWidgetOperations operation( Uninitialized ); + if ( aTrigger == KDeActive ) + { + operation = Deactivate; + } + else if( aTrigger == KSuspend ) + { + operation = WidgetSuspend; + } + else if( aTrigger == KResume ) + { + operation = WidgetResume; + } + else if( aTrigger == KMySelected ) + { + operation = WidgetSelect; + } + LaunchWidgetL( operation, uid ); + } + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::UpdatePublishersL() + { + RPointerArray< HBufC > bundleNames; + + // The array contain references. + CleanupClosePushL( bundleNames ); + + iRegistryAccess.WidgetBundleNamesL( bundleNames ); + + // Remove observer and CPS registry entry of uninstalled widget + for( TInt i = 0; i < iObservers.Count(); i++ ) + { + TBool found( EFalse ); + for( TInt j = 0; j < bundleNames.Count(); j++ ) + { + if( iObservers[i]->Name() == bundleNames[j] ) + { + found = ETrue; + break; + } + } + if( found == EFalse ) + { + RemovePublisherL( KTemplatedWidget, iObservers[i]->Name(), KMyContType ); + delete iObservers[i]; + iObservers.Remove( i ); + } + } + + for( TInt i = bundleNames.Count() - 1; i >= 0; --i ) + { + TInt id = RegisterPublisherL( + KTemplatedWidget, + *( bundleNames[ i ] ), + KMyContType, + KMyImage ); + + if( id != KErrNotFound ) + { + RequestForNotificationL( KTemplatedWidget, *( bundleNames[ i ] ), KMyContType ); + } + } + + CleanupStack::PopAndDestroy( &bundleNames ); + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +TInt CWrtHarvester::RegisterPublisherL( + const TDesC& aPublisherId, + const TDesC& aContentId, + const TDesC& aContentType, + const TDesC8& aResultType ) + { + TInt id( KErrNotFound ); + if( iCPSInterface ) + { + CLiwGenericParamList* inparam( CLiwGenericParamList::NewLC() ); + CLiwGenericParamList* outparam( CLiwGenericParamList::NewLC() ); + + TLiwGenericParam type( KType, TLiwVariant( KPubData )); + inparam->AppendL( type ); + CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC(); + CLiwDefaultMap* datamap = CLiwDefaultMap::NewLC(); + CLiwDefaultMap* actionmap( NULL ); + + // Create the data map for publisher registry + cpdatamap->InsertL( KContentType, TLiwVariant( aContentType )); + cpdatamap->InsertL( KContentId, TLiwVariant( aContentId )); + cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId )); + datamap->InsertL( KMyResultName, TLiwVariant( aResultType )); + + cpdatamap->InsertL( KDataMap, TLiwVariant(datamap) ); + + // Create the action map for publisher registry + actionmap = CLiwDefaultMap::NewLC(); + actionmap->InsertL(KActive, TLiwVariant( KMyActionName )); + actionmap->InsertL(KDeActive, TLiwVariant( KMyActionName )); + actionmap->InsertL(KSuspend, TLiwVariant( KMyActionName )); + actionmap->InsertL(KResume, TLiwVariant( KMyActionName )); + actionmap->InsertL(KMySelected, TLiwVariant( KMyActionName )); + + cpdatamap->InsertL( KMyActionMap, TLiwVariant(actionmap)); + CleanupStack::PopAndDestroy( actionmap ); + + TLiwGenericParam item( KMyItem, TLiwVariant( cpdatamap )); + inparam->AppendL( item ); + + iCPSInterface->ExecuteCmdL( KMyAdd , *inparam, *outparam); + id = ExtractItemId(*outparam); + + CleanupStack::PopAndDestroy( datamap ); + CleanupStack::PopAndDestroy( cpdatamap ); + item.Reset(); + type.Reset(); + CleanupStack::PopAndDestroy(outparam); + CleanupStack::PopAndDestroy(inparam); + } + return id; + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::RemovePublisherL( const TDesC& aPublisherId, const TDesC& aContentId, + const TDesC& aContentType ) + { + if( iCPSInterface ) + { + CLiwGenericParamList* inparam = CLiwGenericParamList::NewLC(); + CLiwGenericParamList* outparam = CLiwGenericParamList::NewLC(); + TLiwGenericParam type( KType, TLiwVariant( KPubData )); + inparam->AppendL( type ); + CLiwDefaultMap* cpdatamap = CLiwDefaultMap::NewLC(); + CLiwDefaultMap* datamap = CLiwDefaultMap::NewLC(); + + // Create data map + cpdatamap->InsertL( KContentType, TLiwVariant( aContentType )); + cpdatamap->InsertL( KContentId, TLiwVariant( aContentId )); + cpdatamap->InsertL( KPublisherId, TLiwVariant( aPublisherId )); + + cpdatamap->InsertL( KDataMap, TLiwVariant(datamap) ); + + TLiwGenericParam item( KMyItem, TLiwVariant( cpdatamap )); + inparam->AppendL( item ); + iCPSInterface->ExecuteCmdL( KMyDelete , *inparam, *outparam); + + CleanupStack::PopAndDestroy( datamap ); + CleanupStack::PopAndDestroy( cpdatamap ); + item.Reset(); + type.Reset(); + CleanupStack::PopAndDestroy(outparam); + CleanupStack::PopAndDestroy(inparam); + } + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::RequestForNotificationL( const TDesC& aPublisherId, const TDesC& aContentId, + const TDesC& aContentType ) + { + // Preventing duplicate entries. + for( TInt i = 0; i < iObservers.Count(); i++ ) + { + if( iObservers[i]->Name() == aContentId ) + { + return; + } + } + + CWrtHarvesterPublisherObserver* observer( NULL ); + CLiwDefaultMap* filter = CLiwDefaultMap::NewLC(); + + filter->InsertL( KPublisherId, TLiwVariant( aPublisherId ) ); + filter->InsertL( KContentId, TLiwVariant( aContentId ) ); + filter->InsertL( KContentType, TLiwVariant( aContentType ) ); + filter->InsertL( KOperation, TLiwVariant( KExecute )); + + observer = CWrtHarvesterPublisherObserver::NewLC( aContentId, this ); + observer->RegisterL(filter); + + iObservers.AppendL( observer ); + + CleanupStack::Pop( observer ); + + CleanupStack::PopAndDestroy(filter); + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::StartWidgetL( TUid aUid ) + { + iWidgetUids.Append( aUid ); + TryLaunchNextWidgetL(); + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::TryLaunchNextWidgetL() + { + TInt value = KErrNone; + TInt error = iWidgetUIListener->GetValue(value); + if( error == KErrNone && value == 1 && iWidgetUids.Count() != 0 ) + { + // Set value to 0 so that next widget is not launched before Widget App sets value to 1. + iWidgetUIListener->SetValue( 0 ); + //Always launch the first widget + LaunchWidgetL( LaunchMiniview, iWidgetUids[0] ); + iWidgetUids.Remove( 0 ); + } + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +TInt CWrtHarvester::ExtractItemId( const CLiwGenericParamList& aInParamList ) + { + TInt result ( KErrNotFound ); + TInt pos( 0 ); + aInParamList.FindFirst( pos, KMyItemId ); + if( pos != KErrNotFound ) + { + // item id present - extract and return + TUint uResult = 0; + if ( aInParamList[pos].Value().Get( uResult ) ) + { + result = uResult; + } + } + return result; + } + +// ---------------------------------------------------------------------------- +// +// ---------------------------------------------------------------------------- +// +void CWrtHarvester::LaunchWidgetL( TWidgetOperations aOperation, TUid aUid ) + { + HBufC* widgetName( GetAppNameLC( iApaSession, aUid) ); + HandleWidgetCommandL( iApaSession, *widgetName, aUid, aOperation ); + CleanupStack::PopAndDestroy( widgetName ); + } + + // End of File +