webengine/wrtharvester/src/wrtharvester.cpp
changeset 0 dd21522fd290
child 16 a359256acfc6
--- /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 <widgetregistryconstants.h>
+
+#include <implementationproxy.h>
+
+#include <LiwServiceHandler.h>
+#include <LiwVariant.h>
+#include <LiwGenericParam.h>
+#include <e32property.h>    //Publish & Subscribe
+#include <AknTaskList.h>
+#include <apaid.h>
+#include <apacmdln.h>
+#include <s32mem.h>
+
+
+// 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 <filenameLength><unicode_filename><someintegervalue>
+    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
+