videoplayerapp/lwplayer/src/lwplayerappui.cpp
changeset 0 96612d01cf9f
child 10 ce5ada96ab30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/videoplayerapp/lwplayer/src/lwplayerappui.cpp	Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,528 @@
+/*
+* 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 "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:  Implementation of CLWPLayerAppUi
+ *
+*/
+
+// Version : %version: 7 %
+
+
+#include <DocumentHandler.h>
+#include <s32mem.h>
+#include <AiwGenericParam.h>
+#include <apgwgnam.h>
+#include <lwplayer.rsg>
+#include <aknappui.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <videoplayeractivationmessage.h>
+
+#include "lwplayerappui.h"
+#include "lwpuids.hrh"
+#include "mpxvideo_debug.h"
+
+const TInt KEVENTBLOCKTIMEOUT = 1000000;
+
+// -----------------------------------------------------------------------------
+//  CLWPlayerAppUi::ConstructL
+//  Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::ConstructL()
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::ConstructL()"));
+
+    BaseConstructL( EAknEnableSkin );
+
+    iEmbeddedMPCreated = EFalse;
+
+    iAllowEvents = ETrue;
+
+    iCloseAO = CIdle::NewL( CActive::EPriorityStandard );
+
+    iBlockEventsTimer = CPeriodic::NewL( CActive::EPriorityStandard );
+}
+
+// -----------------------------------------------------------------------------
+//  CLWPlayerAppUi::~CLWPlayerAppUi()
+//  Destructor
+//  Frees reserved resources
+// -----------------------------------------------------------------------------
+//
+CLWPlayerAppUi::~CLWPlayerAppUi()
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::~CLWPlayerAppUi()"));
+
+    delete iDocHandler;
+
+    if ( iCloseAO )
+    {
+        delete iCloseAO;
+        iCloseAO = NULL;
+    }
+
+    if ( iBlockEventsTimer )
+    {
+        iBlockEventsTimer->Cancel();
+        delete iBlockEventsTimer;
+        iBlockEventsTimer = NULL;
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CLWPlayerAppUi::HandleCommandL
+// -----------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::HandleCommandL(TInt aCommand)
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::HandleCommandL(%d)"), aCommand);
+
+    switch ( aCommand )
+    {
+        case EAknSoftkeyBack:
+        case EEikCmdExit:
+            Exit();
+            break;
+        default:
+            break;
+    }
+}
+
+// -----------------------------------------------------------------------------
+//  New Methods added for Progressive Download
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+//  CLWPlayerAppUi::ProcessCommandParametersL
+//
+//  When Prog Download is started, RApaLsSession creates
+//  this Document and calls ProcessCommandParametersL.
+// -----------------------------------------------------------------------------
+//
+TBool CLWPlayerAppUi::ProcessCommandParametersL( CApaCommandLine& aCommandLine )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::ProcessCommandParametersL()"));
+
+    //
+    //  Since download manager can send multiple events with the same data
+    //  Block events from Download Manager for a short time
+    //
+    BlockEvents();
+
+    //
+    //  Convert aFilename to 8-bit and convert to generic params
+    //
+    TPtrC param = aCommandLine.DocumentName();
+
+    if ( param.Length() )
+    {
+        HBufC8* param8 = HBufC8::NewLC( param.Length() );
+        param8->Des().Copy( param );
+        ExtractGenericParamsL( *param8 );
+        CleanupStack::PopAndDestroy( param8 );
+    }
+
+    return ETrue;
+}
+
+// -----------------------------------------------------------------------------
+// CLWPlayerAppUi::HandleMessageL
+// -----------------------------------------------------------------------------
+//
+MCoeMessageObserver::TMessageResponse
+CLWPlayerAppUi::HandleMessageL( TUint32 aClientHandleOfTWG,
+                                TUid aMessageUid,
+                                const TDesC8& aMessageParameters )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::HandleMessageL()"));
+
+    if ( iAllowEvents && iEmbeddedMPCreated )
+    {
+        //
+        //  pass the message to Media Player
+        //
+        SendMessageL( aMessageParameters );
+
+        //
+        //  Since download manager can send multiple events with the same data
+        //  Block events from Download Manager for a short time
+        //
+        BlockEvents();
+    }
+
+    return CAknAppUi::HandleMessageL( aClientHandleOfTWG,
+                                      aMessageUid,
+                                      aMessageParameters );
+}
+
+// -----------------------------------------------------------------------------
+// CLWPlayerAppUi::ExtractGenericParamsL
+// -----------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::ExtractGenericParamsL( const TDesC8& aParams )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::ExtractGenericParamsL()"));
+
+    CBufFlat* paramBuf = CBufFlat::NewL( /*anExpandSize*/1 );
+    CleanupStack::PushL( paramBuf );
+    paramBuf->InsertL( 0, aParams );
+    RBufReadStream readStream( *paramBuf );
+
+    CAiwGenericParamList* genParList = CAiwGenericParamList::NewLC(readStream);
+
+    TInt index = 0;
+
+    //
+    //  Unpack fileName
+    //
+    const TAiwGenericParam* paramFileName =
+        genParList->FindFirst( index, EGenericParamFile, EVariantTypeDesC );
+
+    TPtrC fileName;
+
+    //
+    //  If the parameter was not found, KErrNotFound is returned
+    //
+    if ( index == KErrNotFound )
+    {
+        //
+        //  Invalid parameter listing.  Set error so message will
+        //  be displayed and LWP will exit
+        //
+        HandleErrorL( KErrArgument );
+    }
+    else
+    {
+        fileName.Set( paramFileName->Value().AsDes() );
+
+        MPX_DEBUG(_L("    filename = %S"), &fileName);
+
+        if ( !iEmbeddedMPCreated )
+        {
+            //
+            //  Launch the Media Player for ProgDL playback
+            //  Ignore the errors since the Media Player is
+            //  responsible for all error messages once launched.
+            //
+            TRAPD( err, LaunchMediaPlayerL( fileName, genParList ) );
+
+            if ( err != KErrNone )
+            {
+                ActivateClosePlayerActiveObject();
+            }
+        }
+    }
+
+    CleanupStack::PopAndDestroy( genParList );
+    CleanupStack::PopAndDestroy( paramBuf );
+}
+
+TInt
+CLWPlayerAppUi::LaunchMediaPlayerL( const TDesC& afilename,
+                                    const CAiwGenericParamList* aparamList )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::LaunchMediaPlayerL(%S)"), &afilename);
+
+
+    //
+    //  The download manager has already performed recognition on the file
+    //  using the cenrep keys.  The LW Player should always launch the MP in
+    //  embedded mode.  Using the MP UID to ensure that it is used.
+    //
+    TDataType datatype( KFUSIONPLAYERUID );
+
+    CDocumentHandler& handler = DocumentHandlerL();
+
+    RFile file;
+
+    //
+    //  Call the document handler to open the file
+    //  It will leave if the filename is not present
+    //
+    TRAPD( err, handler.OpenTempFileL( afilename, file ));
+
+    if ( err == KErrNotFound )
+    {
+        HandleErrorL( err );
+    }
+    else if ( err != KErrNone )
+    {
+        User::Leave( err );
+    }
+    else
+    {
+        CleanupClosePushL( file );
+
+        TRAPD( err, handler.OpenFileEmbeddedL( file, datatype, *aparamList ) );
+
+        //
+        //  ignore some document handler errors
+        //
+        if ( err == KErrServerTerminated )
+        {
+            //
+            //  Document handler leaves with -15 if end key is pressed when
+            //  embedded application is not fully started or embedded
+            //  application panics in start up.  So we can only close the
+            //  App in this point and hope that user is press end key
+            //
+            ActivateClosePlayerActiveObject();
+        }
+        else if ( err != KErrNone )
+        {
+            //  Reset error since it was handled here and
+            //  the program will exit
+            //
+            User::Leave( err );
+        }
+
+        iEmbeddedMPCreated = ETrue;
+
+        CleanupStack::PopAndDestroy( &file ); // file.Close()
+    }
+
+    return KErrNone;
+}
+
+CDocumentHandler& CLWPlayerAppUi::DocumentHandlerL()
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::DocumentHandlerL()"));
+
+    if ( !iDocHandler )
+    {
+        iDocHandler = CDocumentHandler::NewL();
+    }
+
+    iDocHandler->SetExitObserver( this );
+
+    return *iDocHandler;
+}
+
+// -----------------------------------------------------------------------------
+// CLWPlayerAppUi::NotifyExit
+// Called when user exits
+// -----------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::HandleServerAppExit(TInt aReason)
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::HandleServerAppExit(%d)"), aReason);
+
+    //
+    //  should exit here - MP terminated, if MP BACK it will bring up Browser
+    //
+    ActivateClosePlayerActiveObject();
+}
+
+// -----------------------------------------------------------------------------
+// CLWPlayerAppUi::SendMessageL
+// -----------------------------------------------------------------------------
+//
+TInt CLWPlayerAppUi::SendMessageL(const TDesC8& aMessageParameters)
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::SendMessageL()"));
+
+    TInt ret = KErrNone;
+
+    //
+    //  find the task number of the Media Player which is playing
+    //  the ProgDL
+    //
+    RArray<RWsSession::TWindowGroupChainInfo> wgs;
+    User::LeaveIfError(iCoeEnv->WsSession().WindowGroupList(0, &wgs));
+    TBool progDLWindowGroup = EFalse;
+    TInt count = wgs.Count();
+    TInt LWPwgId=0;
+
+    CApaWindowGroupName::FindByAppUid( KLWPLAYERUID ,
+                                       iCoeEnv->WsSession(),
+                                       LWPwgId );
+
+    TApaTask task( iCoeEnv->WsSession() );
+
+    //
+    //  initialise task to non-existant task
+    //
+    task.SetWgId( 0 );
+
+    //
+    //  wgId = 0 tells FindAppByUid to start looking for apps
+    //
+    TInt wgId = 0;
+
+    while ( ( wgId != KErrNotFound ) && ! progDLWindowGroup )
+    {
+        CApaWindowGroupName::FindByAppUid( KFUSIONPLAYERUID,
+                                           iCoeEnv->WsSession(),
+                                           wgId );
+
+        for ( TInt i=0 ; i<count ; i++ )
+        {
+            const RWsSession::TWindowGroupChainInfo& info = wgs[i];
+
+            // find the window group id and check that it's parent id is LWP
+            if ( info.iId == wgId && info.iParentId == LWPwgId )
+            {
+                progDLWindowGroup = ETrue;
+                break;
+            }
+        }
+    };
+
+    wgs.Close();
+
+    if ( progDLWindowGroup )
+    {
+        task.SetWgId(wgId);
+    }
+
+    if ( task.Exists() )
+    {
+        task.BringToForeground();
+
+        //
+        //  8-bit buffer is required.
+        //  Uid is not used
+        //
+        ret = task.SendMessage( TUid::Uid( KVideoPlayerStartPDlPlayer ), aMessageParameters );
+    }
+
+    return ret;
+}
+
+// -----------------------------------------------------------------------------
+//  CLWPlayerAppUi::HandleErrorL
+// -----------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::HandleErrorL( TInt aError )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::HandleErrorL(%d)"), aError);
+
+    HBufC* text;
+
+    switch ( aError )
+    {
+        case KErrNotFound:
+        {
+            text = StringLoader::LoadLC( R_LWP_CLIP_MISSING );
+            break;
+        }
+        case KErrArgument:
+        default:
+        {
+            text = StringLoader::LoadLC( R_LWP_INVALID_CLIP );
+            break;
+        }
+    }
+
+    CAknInformationNote* dlg = new (ELeave) CAknInformationNote(ETrue);
+    dlg->ExecuteLD( text->Des() );
+    CleanupStack::PopAndDestroy(text);
+
+    //
+    //  After the error message, Exit the Light Weight Player
+    //
+    ActivateClosePlayerActiveObject();
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CLWPlayerAppUi::ActivateClosePlayerActiveObject
+// -------------------------------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::ActivateClosePlayerActiveObject()
+{
+    MPX_ENTER_EXIT(_L("CLWPlayerAppUi::ActivateClosePlayerActiveObject()"));
+
+    if ( ! iCloseAO->IsActive() )
+    {
+        iCloseAO->Start( TCallBack( CLWPlayerAppUi::CloseLWPlayerL, this ) );
+    }
+}
+
+// -----------------------------------------------------------------------------
+//   CLWPlayerAppUi::ClosePlayerL
+// -----------------------------------------------------------------------------
+//
+TInt CLWPlayerAppUi::CloseLWPlayerL( TAny* aPtr )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::ClosePlayerL()"));
+
+    static_cast<CLWPlayerAppUi*>(aPtr)->DoCloseLWPlayerL();
+    return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CLWPlayerAppUi::DoClosePlayerL
+// -------------------------------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::DoCloseLWPlayerL()
+{
+    MPX_ENTER_EXIT(_L("CLWPlayerAppUi::DoClosePlayerL()"));
+
+    HandleCommandL( EEikCmdExit );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CLWPlayerAppUi::HandleBlockEventsTimeout
+// -------------------------------------------------------------------------------------------------
+//
+TInt CLWPlayerAppUi::HandleBlockEventsTimeout( TAny* aPtr )
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::HandleEventBlockTimeout()"));
+
+    static_cast<CLWPlayerAppUi*>(aPtr)->UnblockEvents();
+
+    return KErrNone;
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CLWPlayerAppUi::BlockEvents
+// -------------------------------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::BlockEvents()
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::BlockEvents()"));
+
+    //
+    //  Message received from Browser
+    //  Block other messages for 1 second to prevent double click errors
+    //
+    iAllowEvents = EFalse;
+
+    if ( iBlockEventsTimer->IsActive() )
+    {
+        iBlockEventsTimer->Cancel();
+    }
+
+    iBlockEventsTimer->Start( KEVENTBLOCKTIMEOUT,
+                              0,
+                              TCallBack( CLWPlayerAppUi::HandleBlockEventsTimeout, this ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+//   CLWPlayerAppUi::UnblockEvents
+// -------------------------------------------------------------------------------------------------
+//
+void CLWPlayerAppUi::UnblockEvents()
+{
+    MPX_DEBUG(_L("CLWPlayerAppUi::UnblockEvents()"));
+
+    iAllowEvents = ETrue;
+
+    if ( iBlockEventsTimer->IsActive() )
+    {
+        iBlockEventsTimer->Cancel();
+    }
+}
+
+// End of File