idlehomescreen/xmluicontroller/src/aieventhandler.cpp
changeset 0 f72a12da539e
child 1 5315654608de
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlehomescreen/xmluicontroller/src/aieventhandler.cpp	Thu Dec 17 08:40:49 2009 +0200
@@ -0,0 +1,322 @@
+/*
+* Copyright (c) 2009 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:  Used for handling system events (events with EventHandler-prefix).
+*
+*/
+
+#include <LiwServiceHandler.h>
+#include <LiwVariant.h>
+#include <LiwCommon.h>
+#include <UikonInternalPSKeys.h>
+#include <e32property.h>
+
+#include "aieventhandler.h"
+#include "aixmluiconstants.h"
+#include "xmluicontroller.h"
+#include "appui.h"
+#include "xndomnode.h"
+#include "xnuiengineappif.h"
+#include "xnnodeappif.h"
+#include "aistrcnv.h"
+
+#include <csxhelp/hmsc.hlp.hrh>
+#include <hlplch.h>
+
+using namespace AiXmlUiController;
+
+// Action Handler LIW commands
+_LIT8( KAHInterface, "IDataAction");
+_LIT8( KAHService, "Service.ActionHandler");
+
+_LIT( KLaunchApplication, "launch_application" );
+_LIT( KViewActivation, "view_activation" );
+_LIT( KCmdLine, "cmd_line");
+
+_LIT8( KType, "type" );
+_LIT8( KLaunchMethod, "launch_method" );
+_LIT8( KApplicationUid, "application_uid" );
+_LIT8( KViewId, "view_id" );
+_LIT8( KViewAppUid, "view_app_uid" );
+_LIT8( KMessageUid, "message_uid" );
+_LIT8( KAdditionalData, "additional_data" );
+_LIT8( KPluginId, "plugin_id" );
+_LIT8( KData, "data");
+_LIT8( KExecute, "Execute" );
+
+const TInt32 KCASpaAppLauncherPlugin = {0x10282E5F};
+const TUid KVoiceCallUidViewId = { 0x10282D81 };
+const TUid KVideoCallUid = { 0x101F8681 };
+
+// ======== LOCAL FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// Shows the Homescreen specific help item
+// ----------------------------------------------------------------------------
+//
+static void ShowHelpL( const TDesC& aHelpString )
+    {
+    TUid fwUid = TUid::Uid( AI_UID3_AIFW_COMMON );
+    TCoeContextName helpString;
+    helpString.Copy( aHelpString );
+    
+    CArrayFixFlat<TCoeHelpContext>* array = 
+    new (ELeave) CArrayFixFlat<TCoeHelpContext>(1);
+    CleanupStack::PushL( array );
+    
+    array->AppendL( TCoeHelpContext( fwUid, helpString ) );
+    
+    HlpLauncher::LaunchHelpApplicationL( 
+    CCoeEnv::Static()->WsSession(), array );
+    
+    CleanupStack::Pop( array );
+    }
+
+// ---------------------------------------------------------------------------
+// Activates Phone application either in video call or normal view
+// ---------------------------------------------------------------------------
+//
+static void ActivatePhoneViewL( CXmlUiController& aUiController )
+    {
+    TInt topMostAppId = 0;
+    RProperty::Get( KPSUidUikon, KUikVideoCallTopApp, topMostAppId );
+    TUid appId(TUid::Uid(topMostAppId));
+    if( appId == KVideoCallUid)
+        {
+        const TVwsViewId viewId(appId, appId);
+        aUiController.AppUi()->ActivateViewL( viewId, KNullUid, KNullDesC8());  
+        }
+    else
+        {
+        const TVwsViewId viewId(appId, KVoiceCallUidViewId);
+        aUiController.AppUi()->ActivateViewL( viewId, KVoiceCallUidViewId, KNullDesC8());
+        }
+    }
+// ======== MEMBER FUNCTIONS ========
+// ----------------------------------------------------------------------------
+// CAIXuikonEventHandler::CAIXuikonEventHandler()
+// ----------------------------------------------------------------------------
+//
+CAIEventHandler::CAIEventHandler( CXmlUiController& aUiController )
+    : iUiController( aUiController ) 
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CAISystemEventHandler::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CAIEventHandler::ConstructL()
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CAISystemEventHandler::NewL()
+// ----------------------------------------------------------------------------
+//
+CAIEventHandler* CAIEventHandler::NewL( CXmlUiController& aUiController )
+    {
+    CAIEventHandler* self =
+        new ( ELeave ) CAIEventHandler( aUiController );
+    CleanupStack::PushL( self );    
+    self->ConstructL();    
+    CleanupStack::Pop( self );    
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CAISystemEventHandler::~CAISystemEventHandler()
+// ----------------------------------------------------------------------------
+//
+CAIEventHandler::~CAIEventHandler()
+    {
+    if( iServiceHandler )
+        {
+        iServiceHandler->Reset();
+        }
+    delete iServiceHandler;
+    }
+
+// ----------------------------------------------------------------------------
+// Handles the restricted ( can be triggered only from view) events and forwards 
+// the rest into appropriate functions.
+// ----------------------------------------------------------------------------
+//
+void CAIEventHandler::HandleEventL( const TDesC8& aEventText, CXnDomNode& aEvent )
+    {
+    const TDesC8& prefix( AiUiDef::xml::event::KEventHandlerPrefix );
+    const TDesC8& event( aEventText.Mid( prefix.Length() ) );
+    const TDesC8& ns( iUiController.UiEngineL()->ActiveView()->Namespace() );
+    // These events can be excuted from view only
+    if( aEvent.Namespace() == ns)
+        {
+        if ( event == AiUiDef::xml::event::KEventSetOnline )
+            {
+            iUiController.AppUi()->SetOnlineStateL( ETrue );
+            }
+        else if ( event == AiUiDef::xml::event::KEventSetOffline )
+            {
+            iUiController.AppUi()->SetOnlineStateL( EFalse );
+            }    
+        else if ( event == AiUiDef::xml::event::KEventShowHelp )
+            {
+            if( iUiController.UiEngineL()->IsEditMode() )
+                {
+                ShowHelpL( KSET_HLP_HOME_SCREEN_EDIT );
+                }
+            else
+                {
+                ShowHelpL( KSET_HLP_HOME_SCREEN );
+                }
+            }
+        else if ( event == AiUiDef::xml::event::KEventActivatePhoneView )
+            {
+            ActivatePhoneViewL( iUiController );
+            }
+        }
+
+    if( event == AiUiDef::xml::event::KEventLaunchApp )
+        {
+        LaunchAppL( aEvent );
+        }
+    else if( event == AiUiDef::xml::event::KEventActivateView )
+        {
+        ActivateViewL( aEvent );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Launches app using Action Handler
+// ----------------------------------------------------------------------------
+//
+void CAIEventHandler::LaunchAppL( CXnDomNode& aEventNode )
+    { 
+    const TDesC8& uidStr( aEventNode.AttributeValue( AiUiDef::xml::property::KUid ));
+    TInt32 uid( 0 );
+    User::LeaveIfError( AiUtility::ParseInt( uid, uidStr ) );
+    
+    CLiwDefaultMap* map = CLiwDefaultMap::NewL(); 
+    map->PushL();
+    map->InsertL( KType, TLiwVariant( KLaunchApplication ));
+    map->InsertL( KLaunchMethod, TLiwVariant( KCmdLine ));
+    map->InsertL( KApplicationUid, TLiwVariant( uid ));
+
+    ExecuteAppLauncherL( *map );
+
+    CleanupStack::PopAndDestroy( map );
+    }
+
+// ----------------------------------------------------------------------------
+// Activates view using Action Handler
+// ----------------------------------------------------------------------------
+//
+void CAIEventHandler::ActivateViewL( CXnDomNode& aEventNode )
+    {
+    const TDesC8& uidStr( aEventNode.AttributeValue( AiUiDef::xml::property::KUid ));
+    const TDesC8& viewIdStr( aEventNode.AttributeValue( AiUiDef::xml::property::KViewId ));
+    const TDesC8& messageIdStr( aEventNode.AttributeValue( AiUiDef::xml::property::KMessageId ));
+    const TDesC8& messageStr( aEventNode.AttributeValue( AiUiDef::xml::property::KMessage ));
+
+    CLiwDefaultMap* map = CLiwDefaultMap :: NewL(); 
+    map->PushL();
+    map->InsertL( KType, TLiwVariant( KViewActivation ));
+    TInt32 uid( 0 );    
+    User::LeaveIfError( AiUtility::ParseInt( uid, uidStr ) );
+    map->InsertL( KViewAppUid, TLiwVariant( uid ));
+    
+    TInt32 viewId( 0 );
+    User::LeaveIfError( AiUtility::ParseInt( viewId, viewIdStr ) );
+    map->InsertL( KViewId, TLiwVariant( viewId ));
+    
+    if( messageIdStr.Length() != 0 )
+        {
+        TInt32 messageId( 0 );
+        User::LeaveIfError( AiUtility::ParseInt( messageId, messageIdStr ) );
+        map->InsertL( KMessageUid, TLiwVariant( messageId ));
+        
+        map->InsertL( KAdditionalData, TLiwVariant( messageStr ));
+        }
+
+    ExecuteAppLauncherL( *map );
+
+    CleanupStack::PopAndDestroy( map );
+    }
+
+// ----------------------------------------------------------------------------
+// Calls the actual LIW interface
+// ----------------------------------------------------------------------------
+//
+void CAIEventHandler::ExecuteAppLauncherL( CLiwDefaultMap& aMap )
+    {
+    MLiwInterface* msgInterface = ActionHandlerInterfaceL( );
+    if( msgInterface && iServiceHandler )
+        {
+        CLiwGenericParamList& inparam = iServiceHandler->InParamListL();
+        CLiwGenericParamList& outparam = iServiceHandler->OutParamListL();
+        
+        TLiwGenericParam pluginUid( KPluginId, TLiwVariant( TUid::Uid( KCASpaAppLauncherPlugin )));
+        inparam.AppendL( pluginUid );
+
+        TLiwGenericParam data( KData, TLiwVariant( &aMap ));
+        inparam.AppendL( data );
+
+        TRAPD(err, msgInterface ->ExecuteCmdL(KExecute, inparam, outparam));
+        msgInterface->Close();
+        
+        outparam.Reset();
+        inparam.Reset();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// Gets the Action Handler interface
+// ----------------------------------------------------------------------------
+//
+MLiwInterface* CAIEventHandler::ActionHandlerInterfaceL( )
+    {
+    if( !iServiceHandler )
+        {
+        iServiceHandler = CLiwServiceHandler::NewL();
+        }
+    CLiwGenericParamList& inParam = iServiceHandler->InParamListL();
+    CLiwGenericParamList& outParam = iServiceHandler->OutParamListL();
+
+    CLiwCriteriaItem* crit = CLiwCriteriaItem::NewL( KLiwCmdAsStr, KAHInterface, KAHService);
+
+    CleanupStack::PushL( crit );
+    crit->SetServiceClass( TUid::Uid( KLiwClassBase ));
+    
+    RCriteriaArray a;
+    a.AppendL(crit);    
+    
+    iServiceHandler->AttachL(a);
+    iServiceHandler->ExecuteServiceCmdL( *crit, inParam, outParam ); 
+    
+    CleanupStack::PopAndDestroy( crit );
+    a.Reset();
+    
+    // find service interface
+    TInt pos = 0;
+    MLiwInterface* msgInterface = NULL;
+    outParam.FindFirst( pos, KAHInterface );
+    if ( pos != KErrNotFound ) 
+        {
+        msgInterface = (outParam)[pos].Value().AsInterface(); 
+        }
+    
+    outParam.Reset();
+    inParam.Reset();
+
+    return msgInterface;
+    }
+
+// End of file