browserui/browser/Launcher2/src/BrowserLauncherExtension.cpp
branchRCL_3
changeset 65 8e6fa1719340
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/Launcher2/src/BrowserLauncherExtension.cpp	Wed Sep 01 12:31:04 2010 +0100
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2002-2004 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:  BrowserLauncherExtension
+*
+*/
+
+// INCLUDE FILES
+#include <browserlauncher.h>
+#include "BrowserLauncherExtension.h"
+#include "logger.h"
+#include <downloadedcontenthandler.h>
+#include <favouriteslimits.h> // Context Id:s
+
+#include <eikenv.h>
+#include <AiwGenericParam.h>
+#include <s32mem.h>
+#include <coecntrl.h>
+#include <eikappui.h>
+
+NONSHARABLE_CLASS( CLauncherCommandAbsorbingControl ) : public CCoeControl
+    {
+    public:
+        /**
+        * Two-phased constructor.
+        */
+        static CLauncherCommandAbsorbingControl* NewL( CActiveSchedulerWait& aWaiter, TInt& aExitCode );
+
+        /**
+        * Destructor.
+        */
+        ~CLauncherCommandAbsorbingControl();
+        
+        /**
+        * Set enabled/disabled status
+        */
+        inline void SetEnabled( TBool aEnabled ) { iEnabled = aEnabled; }
+
+    private:
+        /**
+        * From CCoeControl
+        */
+        virtual TKeyResponse OfferKeyEventL( const TKeyEvent& /*aKeyEvent*/,TEventCode /*aType*/ );
+
+    private:
+        /**
+        * C++ default constructor.
+        */
+        CLauncherCommandAbsorbingControl( CActiveSchedulerWait& aWaiter, TInt& aExitCode );
+
+        /**
+        * Symbian OS constructor.
+        */
+        void ConstructL();
+
+    private: // Data
+        CEikAppUi* iAppUi;
+        CActiveSchedulerWait& iWaiter;
+        TBool iEnabled;
+        TInt& iExitCode;
+    };
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// ---------------------------------------------------------
+// CLauncherCommandAbsorbingControl::CLauncherCommandAbsorbingControl
+//
+// ---------------------------------------------------------
+//
+CLauncherCommandAbsorbingControl::CLauncherCommandAbsorbingControl( CActiveSchedulerWait& aWaiter, TInt& aExitCode )
+:   iWaiter( aWaiter ), iExitCode( aExitCode )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CLauncherCommandAbsorbingControl::~CLauncherCommandAbsorbingControl
+//
+// ---------------------------------------------------------
+//
+CLauncherCommandAbsorbingControl::~CLauncherCommandAbsorbingControl()
+    {
+    if ( iCoeEnv && iAppUi )
+        {
+        iAppUi->RemoveFromStack( this );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CLauncherCommandAbsorbingControl::NewLC
+//
+// ---------------------------------------------------------
+//
+CLauncherCommandAbsorbingControl* CLauncherCommandAbsorbingControl::NewL( CActiveSchedulerWait& aWaiter, TInt& aExitCode )
+    {
+    CLauncherCommandAbsorbingControl* self = new( ELeave ) CLauncherCommandAbsorbingControl( aWaiter, aExitCode );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+
+// ---------------------------------------------------------
+// CLauncherCommandAbsorbingControl::ConstructL
+//
+// ---------------------------------------------------------
+//
+void CLauncherCommandAbsorbingControl::ConstructL()
+    {
+    iAppUi = iEikonEnv->EikAppUi();
+    //
+    CreateWindowL();
+    SetExtent( TPoint( 0,0 ), TSize( 0,0 ) );
+    ActivateL();
+    SetPointerCapture( ETrue );
+    ClaimPointerGrab( ETrue );
+    //
+    iAppUi->AddToStackL( this, ECoeStackPriorityDialog );
+    }
+
+
+// ---------------------------------------------------------
+// CLauncherCommandAbsorbingControl::OfferKeyEventL
+//
+// ---------------------------------------------------------
+//
+TKeyResponse CLauncherCommandAbsorbingControl::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TKeyResponse response = EKeyWasNotConsumed;
+    //  
+    if ( iEnabled )
+        {
+        if ( aKeyEvent.iCode == EKeyEscape && aType == EEventKey )
+            {
+            if ( iWaiter.IsStarted() )
+                {
+                iExitCode = KErrCancel;
+                iWaiter.AsyncStop();
+                }
+            }
+
+        response = EKeyWasConsumed;
+        }
+    //
+    return response;
+    }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::CBrowserLauncherExtension
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CBrowserLauncherExtension::CBrowserLauncherExtension
+    ( CBrowserLauncher& aLauncher )
+:   CActive( CActive::EPriorityStandard ), iLauncher( aLauncher ), iBufferSizeP( iBufferSize )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::ConstructL()
+    {
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CBrowserLauncherExtension* CBrowserLauncherExtension::NewL( CBrowserLauncher& aLauncher )
+    {
+    LOG_ENTERFN( "CBrowserLauncherExtension::NewL" );
+    CBrowserLauncherExtension* self = new (ELeave) CBrowserLauncherExtension( aLauncher );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+CBrowserLauncherExtension::~CBrowserLauncherExtension()
+    {
+    LOG_ENTERFN( "CBrowserLauncherExtension::~CBrowserLauncherExtension" );
+    Cancel();
+    iLauncherClientService.Close();
+    delete iReceiveBuffer;
+    delete iPackedLauncherData;
+    delete iCommandAbsorber;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::WaitBrowserToFinish
+// -----------------------------------------------------------------------------
+//
+TInt CBrowserLauncherExtension::WaitBrowserToFinish()
+    {
+    LOG_ENTERFN( "CBrowserLauncherExtension::WaitBrowserToFinish" );
+	if( !iCommandAbsorber )
+	  {
+	  iCommandAbsorber = CLauncherCommandAbsorbingControl::NewL( iWait, iExitCode );
+	  }
+    iCommandAbsorber->SetEnabled( ETrue );
+    iWait.Start();
+    iCommandAbsorber->SetEnabled( EFalse );
+
+    // This class will complete us as an MAknServerAppExitObserver.
+    return iExitCode;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::SetPackedLauncherData
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::SetPackedLauncherData( HBufC8* aBuf )
+    {
+    delete iPackedLauncherData;
+    iPackedLauncherData = aBuf;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::DoCancel()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::RunL
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::RunL()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CBrowserLauncherExtension::RunError( TInt aError )
+    {
+    return aError;
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::HandleServerAppExit
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::HandleServerAppExit( TInt aReason )
+    {
+    LOG_ENTERFN( "CBrowserLauncherExtension::HandleServerAppExit" );
+    if ( iWait.IsStarted() )
+        {
+        /* If the Launcher was started synchronously, then 
+           iBrowserLauncherClientExitObserver cannot be set => 
+           no need to call iBrowserLauncherClientExitObserver->HandleServerAppExit() */
+
+        // Note down the exit reason
+        iExitCode = aReason;
+        iWait.AsyncStop();
+        iCommandAbsorber->SetEnabled( EFalse );
+        }
+    else if ( iBrowserLauncherClientExitObserver )
+        {
+        // Forward the exit event
+        iBrowserLauncherClientExitObserver->HandleServerAppExit( aReason );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CBrowserLauncherExtension::HandleReceivedDataL
+// -----------------------------------------------------------------------------
+//
+void CBrowserLauncherExtension::HandleReceivedDataL( TRequestStatus aStatus )
+    {
+    LOG_ENTERFN( "CBrowserLauncherExtension::HandleReceivedDataL" );
+    
+    LOG_WRITE_FORMAT(" aStatus.Int(): %d", aStatus.Int());
+    User::LeaveIfError( aStatus.Int() );
+    
+    //--------------------create buffer for server-----
+    // Create buffer to hold data, sent by Browser application.
+    // iBufferSize was defined by the server by now...
+    delete iReceiveBuffer;
+    iReceiveBuffer = 0;
+    iReceiveBuffer = HBufC8::NewL( iBufferSize );
+    TPtr8 tempRecBuf ( iReceiveBuffer->Des() );
+    // Send the allocated descriptor to server, who fills it.
+    User::LeaveIfError( iLauncherClientService.SendSyncBuffer( tempRecBuf ) );
+    // OK, buffer has been filled.
+
+    //--------------------internalize stream-----------
+    // Create Stream object.
+    RDesReadStream readStream( tempRecBuf );
+    CleanupClosePushL( readStream );
+    // Create param list object
+    CAiwGenericParamList* paramList = CAiwGenericParamList::NewL( readStream );
+    LOG_WRITE(" paramList OK");
+    CleanupStack::PopAndDestroy( &readStream );
+    CleanupStack::PushL( paramList );
+    //--------------------eof internalize stream-------
+
+    TBool clientWantsToContinue( EFalse );
+    TBool wasContentHandled = EFalse;
+
+    // If the embedding application handles the downloaded content.
+    if ( iDownloadedContentHandler )
+        {
+        LOG_WRITE_FORMAT(" iDownloadedContentHandler: 0x%x", iDownloadedContentHandler);
+        // Extract the file name from the generic paam list
+        TInt index(0);
+        const TAiwGenericParam* paramFileName = 
+            paramList->FindFirst( index, EGenericParamFile, EVariantTypeDesC );
+        TPtrC fileName;
+        if ( index == KErrNotFound )
+            {
+            fileName.Set( KNullDesC );
+            }
+        else
+            {
+            fileName.Set( paramFileName->Value().AsDes() );
+            }
+
+        // Call the embedding app with these parameters, to handle the downloaded
+        // content
+        TRAPD( handlerLeave, wasContentHandled = 
+                                            iDownloadedContentHandler->HandleContentL( 
+                                                                        fileName, 
+                                                                        *paramList, 
+                                                                        clientWantsToContinue ) );
+        ++handlerLeave; // To avoid warnings. Used for logging.
+        LOG_WRITE_FORMAT(" handlerLeave: %d", handlerLeave);
+        }
+        
+    // Tell the server app the output parameters
+    User::LeaveIfError( iLauncherClientService.SendSyncBools
+                                 ( clientWantsToContinue, wasContentHandled ) );
+    
+    // This async request completed, reinitialize it
+    iLauncherClientService.SendAsync(iBufferSizeP);
+    
+    CleanupStack::PopAndDestroy( paramList ); // paramList
+    }
+
+// End of file