homescreenplugins/videoahlplugin/src/videoactionhandler.cpp
changeset 0 96612d01cf9f
child 1 6711b85517b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenplugins/videoahlplugin/src/videoactionhandler.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,461 @@
+/*
+* Copyright (c) 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:  interface class definition for action handler plugin*
+*/
+
+
+// Version : %version: 19 %
+
+#include <e32def.h>
+#include <e32uid.h>
+#include <apgcli.h>
+#include <apacmdln.h>
+#include <apgtask.h>
+#include <eikenv.h>
+#include <vwsdef.h>
+#include <coeaui.h>
+#include <avkon.rsg>
+#include <AknGlobalNote.h>
+#include <MediatorEventProvider.h>
+#include <centralrepository.h>
+#include <LiwVariant.h>
+#include <videoplayeractivationmessage.h>
+#include <vcxmyvideosdefs.h>
+#include <ErrorUI.h>
+
+#include "videoahpluginconstants.h"
+#include "videoactionhandler.h"
+#include "videoplayerpskeys.h"
+#include "iptvlastwatcheddata.h"
+#include "iptvlastwatchedapi.h"
+#include "vcxhgvodtelephonyclient.h"
+
+// CONSTANTS
+const TUid KUidMPXVideoPlayerApp = { 0x200159B2 };
+const TUid KUidMediaSettingsApp  = { 0x10005A3F };
+
+_LIT8( KKeyMessage,     "message" );
+_LIT8( KKeyMessageData, "message_data" );
+
+//  Constants for wg name. Used to identify if wg is actually ours.
+_LIT( KVideoPlayerWgName, "*200159b2*");
+const TUint KVideoPlayerWgNameSize = 50;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// CVideoActionHandler::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CVideoActionHandler::ConstructL()
+    {   
+    iMediatorEventProvider = CMediatorEventProvider::NewL();
+    }
+
+// ----------------------------------------------------------------------------
+// CVideoActionHandler::NewL
+// ----------------------------------------------------------------------------
+//
+CVideoActionHandler* CVideoActionHandler::NewL()
+    {
+    CVideoActionHandler* self = CVideoActionHandler::NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CVideoActionHandler::NewLC
+// ----------------------------------------------------------------------------
+//
+CVideoActionHandler* CVideoActionHandler::NewLC()
+    {
+    CVideoActionHandler* self = new( ELeave ) CVideoActionHandler;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::~CVideoActionHandler
+// ---------------------------------------------------------------------------
+CVideoActionHandler::~CVideoActionHandler()
+	{  
+	delete iMediatorEventProvider;
+	}
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::ExecuteActionL
+// Executes provided action
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::ExecuteActionL( const CLiwMap* aMap )
+    {    
+    TInt errCode( KErrNotFound );   
+    
+    TVideoPlayerActivationMessage*  activationMsg = new( ELeave ) TVideoPlayerActivationMessage;
+    CleanupStack::PushL( activationMsg );
+    
+    errCode = PrepareMessageL( aMap, *activationMsg );
+    if( KErrNone == errCode )
+        {
+        errCode = StartAppL( *activationMsg );
+        }
+    CleanupStack::PopAndDestroy( activationMsg );
+    
+    return errCode;
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::PrepareMessageL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::PrepareMessageL( const CLiwMap* aMap, 
+                                           TVideoPlayerActivationMessage& aActivationMsg )
+    {
+    TInt err( KErrNone );
+
+    TLiwVariant variant; 
+    variant.PushL();
+    err = ExtractVariant( aMap, variant, KKeyMessage );
+    
+    if( err != KErrNone )    
+	    {
+	    CleanupStack::PopAndDestroy( &variant );     
+	    return err;
+	    }
+	    
+    TPtrC message = variant.AsDes();
+       
+
+    aActivationMsg.iServiceId = 0;
+    aActivationMsg.iFileId    = 0;
+    aActivationMsg.iDrive     = 0;            	
+    aActivationMsg.iMsgSender = TVideoPlayerActivationMessage::EMatrixMenu;         
+       
+    if ( !message.CompareF( KVcxNsExtLaunchVideoCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::ELaunchVideoToPlayer;
+        TLiwVariant variantData;
+        variantData.PushL();
+        err = ExtractVariant( aMap, variantData, KKeyMessageData );
+
+        if( err == KErrNone )
+            {
+            TPtrC data = variantData.AsDes();
+            aActivationMsg.iFullPath = data;
+            }
+        else if( err == KErrNotFound )
+            {
+            err = KErrNone;
+            }
+        CleanupStack::PopAndDestroy( &variantData );
+        }
+    else if ( !message.CompareF( KVcxNsExtLaunchLastWatchedCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::ELaunchVideoToPlayer;
+        LoadLwDataL( aActivationMsg );
+        }
+    else if ( !message.CompareF( KVcxNsExtOpenStorageCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::EOpenVideoStorage;    
+        }
+    else if ( !message.CompareF( KVcxNsExtInternetVideoCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::EOpenInternetVideos;
+        }
+    else if ( !message.CompareF( KVcxNsExtServiceCatalCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::EOpenServiceCatalogue;
+        }
+    else if ( !message.CompareF( KVcxNsExtVideoShopCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::EOpenVideoShop;
+        }
+    else if ( !message.CompareF( KVcxNsExtLaunchVCSettingsCmd ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::EOpenVCSettings;
+        }
+    else if ( !message.CompareF( KVcxNsExtOpenLiveTVCmd ) )
+		{
+		aActivationMsg.iMsgType = TVideoPlayerActivationMessage::ELiveTVMessage;
+		}
+    else if( !message.CompareF( KVcxNsExtLaunchLiveTVLastWatch ) )
+        {
+        aActivationMsg.iMsgType = TVideoPlayerActivationMessage::ELiveTVMessageLastWatched;
+        }
+    else if( !message.CompareF( KVcxNsExtLoadTvVideoSuite ) )
+        {
+        // If the player app is running 
+        // in background, switch to that
+        TryBringVideoPlayerToForegroundL();
+
+        SendMediatorEvent( KVcxNsAhEventSuiteLoaded ); 
+        // This needs cleaner way to not to execute the cmd.
+        err = KErrNotSupported;
+        }
+    else if ( !message.CompareF( KVcxNsExtUnloadTvVideoSuite ) )
+        {
+        SendMediatorEvent( KVcxNsAhEventSuiteUnloaded ); 
+        // This needs cleaner way to not to execute the cmd.
+        err = KErrNotSupported;
+        }
+    else
+        {
+        err = KErrNotSupported;
+        }
+    CleanupStack::PopAndDestroy( &variant );
+    
+    return err;
+	}
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::StartAppL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::StartAppL( TVideoPlayerActivationMessage& aMessage )
+    {
+    TInt err(KErrNone);    
+    
+    // If settings are requested launch them, otherwise launch my videos
+    if (aMessage.iMsgType == TVideoPlayerActivationMessage::EOpenVCSettings)
+        {
+        err = LaunchMediaSettingsL( aMessage );
+        }
+    else
+        {
+        err = LaunchMyVideosL( aMessage );
+        }
+    
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::ExtractVariant
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::ExtractVariant( const CLiwMap* aMap,
+								          TLiwVariant& aVariant,
+								          const TDesC8& aKeyName )
+   
+    {
+    TInt errCode( KErrNone );
+	TBool found( EFalse );
+    TRAP( errCode, found = aMap->FindL( aKeyName, aVariant ) );
+    
+    if ( errCode == KErrNone && !found )
+       	{
+       	errCode = KErrNotFound;
+    	}
+	
+	return errCode;
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::SendMediatorEvent
+// ---------------------------------------------------------------------------
+//
+void CVideoActionHandler::SendMediatorEvent( TInt aEvent )
+    {
+    iMediatorEventProvider->RaiseEvent( 
+                                    TUid::Uid( KVcxNsAhMediatorDomain ),
+                                    TUid::Uid( KVcxNsAhMediatorCategory ), 
+                                    aEvent,
+                                    TVersion( KVcxNsAhEventVersion, 0, 0 ),
+                                    KNullDesC8() );
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::LaunchMediaSettingsL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::LaunchMediaSettingsL( TVideoPlayerActivationMessage& aMessage )
+    {
+    // KIptvVodStartPlayer is not currently used. Any case we need it?    
+    return LaunchMatrixTaskL( aMessage, KUidMediaSettingsApp, KVideoPlayerVodStartPlayer );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::LaunchMyVideosL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::LaunchMyVideosL( TVideoPlayerActivationMessage& aMessage )
+    {
+    // KIptvVodStartPlayer is not currently used. Any case we need it?    
+    return LaunchMatrixTaskL( aMessage, KUidMPXVideoPlayerApp, KVideoPlayerVodStartPlayer );    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::LaunchMatrixTaskL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::LaunchMatrixTaskL( TVideoPlayerActivationMessage& aMessage, TUid appUID, TInt aActivationMessage )
+    {
+
+    TInt err(KErrNone);
+
+    TPckg<TVideoPlayerActivationMessage> message(aMessage);
+
+    RWsSession session;
+    User::LeaveIfError(session.Connect());
+
+    // check if there is existing stand alone running
+    TInt ourWgId( 0 );
+    TInt ret( 0 );
+
+    // No need to check wgId if we are lauching Media Settings
+    if ( appUID != KUidMediaSettingsApp )
+        {
+        ret = RProperty::Get( KVideoPlayerRPropertyCategory, KVideoPlayerRPropertyWGIdKey, ourWgId );
+        }
+        
+    if( !ret )
+        {
+        // check if the wgId is really one of our own
+        TBuf<KVideoPlayerWgNameSize> wgName;
+        session.GetWindowGroupNameFromIdentifier(ourWgId, wgName );        
+        if( wgName.MatchF( KVideoPlayerWgName ) == KErrNotFound )
+            {
+            // Clear wg id, it is not ours anymore
+            ourWgId = 0;
+            }
+        }
+        
+    if( ourWgId != 0 )
+        {
+        // Send message to our wg id            
+        TUid play = TUid::Uid(aActivationMessage);        
+        session.SetWindowGroupOrdinalPosition( ourWgId, 0 );
+        err = session.SendMessageToWindowGroup( ourWgId, play, message );             
+        }        
+    else
+        {
+        // No stand alone available, create new one
+        RApaLsSession lsSession;
+        err = lsSession.Connect();
+        TApaAppInfo appInfo;
+
+        if (lsSession.GetAppInfo(appInfo, appUID) == KErrNone)
+            {
+            CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
+            cmdLine->SetExecutableNameL(appInfo.iFullName);
+            cmdLine->SetTailEndL(message);
+            User::LeaveIfError(lsSession.StartApp(*cmdLine));
+            CleanupStack::PopAndDestroy(cmdLine);
+            }
+        else
+            {
+            err = KErrNotFound;
+            }
+
+        lsSession.Close();   
+        }    
+    
+    session.Close();
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::LoadLwDataL
+// ---------------------------------------------------------------------------
+//
+void CVideoActionHandler::LoadLwDataL( TVideoPlayerActivationMessage& aMessage )
+    {
+    CIptvLastWatchedData* data = CIptvLastWatchedData::NewL();
+    CleanupStack::PushL( data );
+    
+    CIptvLastWatchedApi* lwApi = CIptvLastWatchedApi::NewL();
+    CleanupStack::PushL( lwApi );
+    
+    lwApi->GetLastWatchedDataL( *data );
+    
+    if ( data->ParentalControl() != KVcxMyvideosCenRepParentControlKeyOff )
+        {
+        TInt parentControlSetting( KVcxMyvideosCenRepParentControlKeyDefault );
+        CRepository* rep = NULL;
+        TInt error;
+        TRAP( error, rep = CRepository::NewL( TUid::Uid( KVcxMyVideosCenRepUid ) ) )
+
+        if ( error == KErrNone )
+            {
+            CleanupStack::PushL( rep );
+            
+            error = rep->Get( KVcxMyvideosCenRepParentControlKey, parentControlSetting );
+            
+            if ( error == KErrNone && parentControlSetting != KVcxMyvideosCenRepParentControlKeyOff )
+                {
+                if ( static_cast<TInt>( data->ParentalControl() ) >= parentControlSetting )
+                    {
+                    CVcxHgVodTelephonyClient* tc = new( ELeave ) CVcxHgVodTelephonyClient();
+                    CleanupStack::PushL(tc);
+                    
+                    if ( !tc->CheckLockCodeL() )
+                        {
+                        CErrorUI* eu = CErrorUI::NewLC();
+                        eu->ShowGlobalErrorNoteL( KErrPermissionDenied );
+                        CleanupStack::PopAndDestroy( eu );
+                        User::Leave( KErrPermissionDenied );
+                        }
+                    
+                    CleanupStack::PopAndDestroy( tc );
+                    }
+                }
+            CleanupStack::PopAndDestroy( rep );
+            }
+        }
+
+    if( data->MpxId() != KIdUndefined )
+        {
+        aMessage.iServiceId = data->MpxId();
+		aMessage.iFullPath  = data->Uri();
+        }
+    else
+        {
+		aMessage.iServiceId = 0;
+		aMessage.iFullPath = data->Uri();
+        }
+    
+    CleanupStack::PopAndDestroy( lwApi );
+    CleanupStack::PopAndDestroy( data );
+    }
+
+// ---------------------------------------------------------------------------
+// CVideoActionHandler::TryBringVideoPlayerToForegroundL
+// ---------------------------------------------------------------------------
+//
+TInt CVideoActionHandler::TryBringVideoPlayerToForegroundL()
+    {
+    TInt ret ( KErrNotFound );
+    RWsSession session;
+    User::LeaveIfError( session.Connect() );
+	CleanupClosePushL( session );
+
+    TInt ourWgId( 0 );
+    TInt error = RProperty::Get( KVideoPlayerRPropertyCategory, KVideoPlayerRPropertyWGIdKey, ourWgId );
+        
+    if( error == KErrNone && ourWgId != 0 )
+        {
+        TBuf<KVideoPlayerWgNameSize> wgName;
+        session.GetWindowGroupNameFromIdentifier(ourWgId, wgName );
+        
+        if( wgName.MatchF( KVideoPlayerWgName ) != KErrNotFound )
+            {
+            ret = session.SetWindowGroupOrdinalPosition( ourWgId, 0 );
+            }
+        }
+
+	CleanupStack::PopAndDestroy( &session );
+    return ret;
+    }