diff -r 7d48bed6ce0c -r 987c9837762f satui/satapp/SATShellControllerSrc/CSatShellController.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/satui/satapp/SATShellControllerSrc/CSatShellController.cpp Wed Sep 01 12:15:03 2010 +0100 @@ -0,0 +1,515 @@ +/* +* Copyright (c) 2003-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: +* This file contains the SAT Shell Controller class that is responsible +* for the actual implementation of the following functionality: +* - add SAT UI application to Desk (or similar) +* - remove SAT UI application from Desk (or similar) +* - bring SAT UI application to foreground if it already is up +* and running +* - launching the SAT UI application +* - launching the Browser +* - resolving default access point +* - bring Browser to the foreground +* +* +*/ + + +// INCLUDE FILES +#include // RWsSession +#include // TApaAppInfo +#include // CApaCommandLine +#include // RApaLsSession +#include // TApaTaskList +#include // CApaWindowGroupName +#include // CMenuSATInterface +#include // KWmlcHandler +#include "CSatShellController.h" + +// Browser Cen Rep Keys. +#ifdef __SERIES60_NATIVE_BROWSER + #include + #include +#endif // __SERIES60_NATIVE_BROWSER +#include "tflogger.h" + +// CONSTANTS +const TUid KUidSatUi = { 0x101f4ce0 }; +_LIT( KFour, "4" ); // Browser parameter. +_LIT( KFive, "5" ); // Browser parameter. +_LIT( KSpace, " " ); // Used as Browser parameter. +static const TUid KEmptyUid = { KErrNotFound }; +static const TUid KUidBrowser = { KWmlcHandler }; +const TInt KTimerTime( 2000000 ); // 2 seconds. +const TInt KBrowserParamAndTwoSpaces( 3 ); +#ifndef __SERIES60_NATIVE_BROWSER + const TUid KCRUidBrowser = { 0x10008D39 }; + const TUint32 KBrowserDefaultAccessPoint( 0x0000000E ); +#endif // __SERIES60_NATIVE_BROWSER + +// ================= MEMBER FUNCTIONS ======================================= + +// C++ default constructor can NOT contain any code that +// might leave. +// +CSatShellController::CSatShellController(): + iUidWmlBrowser( TUid::Uid( KWmlcHandler )) + { + TFLOGSTRING( "CSatShellController::CSatShellController called-exit" ) + } + +// Symbian OS constructor +void CSatShellController::ConstructL() + { + TFLOGSTRING( "CSatShellController::ConstructL called" ) + + // Timer is used to get the Browser application to the foreground. + iTimer = CPeriodic::NewL( EPriorityNormal ); + + TFLOGSTRING( "CSatShellController::ConstructL exit" ) + } + +// Two-phased constructor. +CSatShellController* CSatShellController::NewL() + { + TFLOGSTRING( "CSatShellController::NewL called" ) + + CSatShellController* self = new ( ELeave ) CSatShellController; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + TFLOGSTRING( "CSatShellController::NewL exit" ) + return self; + } + + +// Destructor +CSatShellController::~CSatShellController() + { + TFLOGSTRING( "CSatShellController::~CSatShellController called" ) + + // Frees resources. + if ( iTimer ) + { + iTimer->Cancel(); + } + delete iTimer; + + TFLOGSTRING( "CSatShellController::~CSatShellController exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::AddSatUiL +// Adds SAT UI Client application to phone's +// Application Shell (or similar). +// --------------------------------------------------------- +// +void CSatShellController::AddSatUiL( + TDesC& aName ) + { + TFLOGSTRING( "CSatShellController::AddSatUiL(name) called" ) + + iSimAppName = aName; + + CMenuSATInterface* menu = new ( ELeave ) CMenuSATInterface; + menu->MakeSatUiVisible( ETrue, aName ); + delete menu; + + TFLOGSTRING( "CSatShellController::AddSatUiL exit" ) + } + +//------------------------------------------------------------ +// CSatShellController::AddSatUiL +// Adds SAT UI Client application to phone's +// Application Shell (or similar). +// --------------------------------------------------------- +// +void CSatShellController::AddSatUiL( + TDesC& aName, TUint8 aIconId ) + { + TFLOGSTRING( "CSatShellController::AddSatUiL(name,icon) called" ) + + iSimAppName = aName; + + CMenuSATInterface* menu = new ( ELeave ) CMenuSATInterface; + menu->MakeSatUiVisible( ETrue, aName, aIconId ); + delete menu; + + TFLOGSTRING( "CSatShellController::AddSatUiL exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::RemoveSatUiL +// Removes SAT UI Client application from phone's +// Application Shell (or similar). +// --------------------------------------------------------- +// + +void CSatShellController::RemoveSatUiL() + { + TFLOGSTRING( "CSatShellController::RemoveSatUiL called" ) + + CMenuSATInterface* menu = new ( ELeave ) CMenuSATInterface; + menu->MakeSatUiVisible( EFalse, iSimAppName ); + delete menu; + + TFLOGSTRING( "CSatShellController::RemoveSatUiL exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::LaunchSatUiL +// Launches SAT UI Client application. +// --------------------------------------------------------- +// +void CSatShellController::LaunchSatUiL() + { + TFLOGSTRING( "CSatShellController::LaunchSatUiL called" ) + + RApaLsSession rapaLsSession; + User::LeaveIfError( rapaLsSession.Connect() ); + CleanupClosePushL( rapaLsSession ); + TThreadId id( static_cast( 0 ) ); + TApaAppInfo appInfo; + + User::LeaveIfError( rapaLsSession.GetAppInfo( appInfo, KUidSatUi ) ); + CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); + cmdLine->SetExecutableNameL( appInfo.iFullName ); + cmdLine->SetCommandL( EApaCommandOpen ); + rapaLsSession.StartApp( *cmdLine, id ); + + CleanupStack::PopAndDestroy( cmdLine ); + CleanupStack::PopAndDestroy( &rapaLsSession ); + + TFLOGSTRING( "CSatShellController::LaunchSatUiL exit" ) + } + + +// --------------------------------------------------------- +// CSatShellController::BringBrowserToForeground +// Brings the Browser to foreground. +// --------------------------------------------------------- +// +void CSatShellController::BringBrowserToForeground() const + { + TFLOGSTRING( "CSatShellController::BringBrowserToForeground called" ) + + BringApplicationToForeground( iUidWmlBrowser ); + + TFLOGSTRING( "CSatShellController::BringBrowserToForeground exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::BringBrowserToForegroundAfterPeriod +// Brings the Browser to foreground after time has passed. +// --------------------------------------------------------- +// +void CSatShellController::BringBrowserToForegroundAfterPeriod() + { + TFLOGSTRING( + "CSatShellController::BringBrowserToForegroundAfterPeriod called" ) + + if ( !iTimer->IsActive() ) + { + TFLOGSTRING( + "CSatShellController::BringBrowserToForegroundAfterPeriod \ + start iTimer" ) + iTimer->Start( KTimerTime, + KTimerTime, + TCallBack( TimerCompleted, this ) ); + } + + TFLOGSTRING( + "CSatShellController::BringBrowserToForegroundAfterPeriod exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::BringSatUiToForeground +// Brings the SAT UI application to foreground. +// --------------------------------------------------------- +// +void CSatShellController::BringSatUiToForeground() + { + TFLOGSTRING( "CSatShellController::BringSatUiToForeground called" ) + + CheckSatUiStatus(); + BringApplicationToForeground( KUidSatUi ); + + TFLOGSTRING( "CSatShellController::BringSatUiToForeground exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::BringApplicationToForeground +// Brings the SAT UI application to foreground. +// --------------------------------------------------------- +// +void CSatShellController::BringApplicationToForeground( + const TUid& aAppUid ) const + { + TFLOGSTRING( "CSatShellController::BringApplicationToForeground called" ) + + RWsSession wsSession; + // Open the WS server session. + if ( KErrNone == wsSession.Connect() ) + { + TFLOGSTRING( "CSatShellController::BringApplicationToForeground \ + open WS server session" ) + TApaTaskList tasklist( wsSession ); + // Find the task with uid + TApaTask task = tasklist.FindApp( aAppUid ); + task.BringToForeground(); + wsSession.Close(); + } + + TFLOGSTRING( "CSatShellController::BringApplicationToForeground exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::SetSatUiToBackground +// Sets SAT UI Application to background if needed. +// --------------------------------------------------------- +// +void CSatShellController::SetSatUiToBackground() const + { + TFLOGSTRING( "CSatShellController::SetSatUiToBackground called" ) + + if ( iSetSatUiToBackground ) + { + RWsSession wsSession; + // Open the WS server session. + if ( KErrNone == wsSession.Connect() ) + { + TFLOGSTRING( "CSatShellController::SetSatUiToBackground \ + open WS server session" ) + TApaTaskList tasklist( wsSession ); + // Find the task with uid + TApaTask task = tasklist.FindApp( KUidSatUi ); + task.SendToBackground(); + wsSession.Close(); + } + } + + TFLOGSTRING( "CSatShellController::SetSatUiToBackground exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::CycleSatUiBackwards +// Brings the SAT UI application to foreground. +// --------------------------------------------------------- +// +void CSatShellController::CycleSatUiBackwards() + { + TFLOGSTRING( "CSatShellController::BringSatUiToForeground called" ) + + RWsSession wsSession; + // Open the WS server session. + if ( KErrNone == wsSession.Connect() ) + { + TFLOGSTRING( "CSatShellController::CycleSatUiBackwards \ + open WS server session" ) + TApaTaskList taskList( wsSession ); + // Finds topmost application. + TApaTask task = taskList.FindByPos(0); + iTimer->Cancel(); + + CApaWindowGroupName* name = 0; + TRAPD( err, + name = CApaWindowGroupName::NewL( wsSession, task.WgId() ) ); + + if ( name ) + { + // Check is that Browser is foremost application. + if ( !err && ( name->AppUid() == KUidBrowser ) ) + { + TFLOGSTRING( + "CSatShellController::BSUTF Browser is in foreground" ) + } + else + { + TFLOGSTRING( + "CSatShellController::BSUTF Browser isn't in foreground" ) + TApaTask browserTask = taskList.FindApp( KUidBrowser ); + browserTask.BringToForeground(); + iTimer->Start( + KTimerTime, KTimerTime, TCallBack( TimerCompleted, this ) ); + } + + delete name; + } + + wsSession.Close(); + } + + TFLOGSTRING( "CSatShellController::BringSatUiToForeground exit" ) + } + +// --------------------------------------------------------- +// CSatShellController::TimerCompleted +// Callback function. Completes after predefined +// time has passed +// --------------------------------------------------------- +// +TInt CSatShellController::TimerCompleted( TAny* aObject ) + { + TFLOGSTRING( "CSatShellController::TimerCompleted called" ) + + if ( aObject ) + { + STATIC_CAST( CSatShellController*, aObject )->CycleSatUiBackwards(); + } + + TFLOGSTRING( "CSatShellController::TimerCompleted exit" ) + return KErrNone; + } + +// --------------------------------------------------------- +// CSatShellController::LaunchBrowserL +// Launch XHTML-browser +// Browser launched with parameter +// "4" + "" + "" + "" + "" or "5" +// More information see Browser API Specification Document +// --------------------------------------------------------- +// +TInt CSatShellController::LaunchBrowserL( const TDesC& aUrl, + TUid aAccessPointUid ) + { + TFLOGSTRING( "CSatShellController::LaunchBrowserL called" ) + + TInt errorCode( KErrNone ); + HBufC* param = HBufC::NewLC( aUrl.Length() + KMaxUidName + + KBrowserParamAndTwoSpaces ); + + TFLOGSTRING2( "CSatShellController::LaunchBrowserL length of aUrl: %d", \ + aUrl.Length() ) + if ( aUrl.Length() > 0 ) + { + param->Des().Copy( KFour ); + param->Des().Append( KSpace ); + param->Des().Append( aUrl ); + TFLOGSTRING2( "CSatShellController::LaunchBrowserL \ + aAccessPointUid: %d", aAccessPointUid ) + // Create script for Browser if not empty accesspoint UID. + if ( aAccessPointUid != KEmptyUid ) + { + TFLOGSTRING( "CSatShellController::LaunchBrowserL not empty \ + accesspoint" ) + // Uid is in decimal format + param->Des().Append( KSpace ); + param->Des().AppendNum( aAccessPointUid.iUid ); + } + + } + else + { + param->Des().Copy( KFive ); + } + + User::LeaveIfError( iWsSession.Connect() ); + + TFLOGSTRING2( "CSatShellController::LaunchBrowserL \ + param string: %S", param ) + TApaTaskList taskList( iWsSession ); + TApaTask task = taskList.FindApp( iUidWmlBrowser ); + + // If browser already open. + if ( task.Exists() ) + { + TFLOGSTRING( "CSatShellController::LaunchBrowserL browser open" ) + HBufC8* param8 = HBufC8::NewLC( param->Length() ); + param8->Des().Append( *param ); + errorCode = task.SendMessage( TUid::Uid( 0 ), param8->Des() ); + CleanupStack::PopAndDestroy( param8 ); + } + else + { + TFLOGSTRING( "CSatShellController::LaunchBrowserL launch browser" ) + // Launch the Browser. + TThreadId id( static_cast( 0 ) ); + RApaLsSession rapaLsSession; + User::LeaveIfError( rapaLsSession.Connect() ); + errorCode = rapaLsSession.StartDocument( *param, iUidWmlBrowser, id ); + rapaLsSession.Close(); + } + + BringBrowserToForeground(); + + iWsSession.Close(); + CleanupStack::PopAndDestroy( param ); + + TFLOGSTRING2( "CSatShellController::LaunchBrowserL exit %d", errorCode ) + return errorCode; + } + +// ----------------------------------------------------------------------------- +// CSatShellController::CheckSatUiStatus +// Check if SatUi is needed to set to background. +// ----------------------------------------------------------------------------- +// +void CSatShellController::CheckSatUiStatus() + { + TFLOGSTRING( "CSatShellController::CheckSatUiStatus called" ) + + // if SatUi task is found and SatUi is not in foreground flag is set ETrue + iSetSatUiToBackground = EFalse; + + RWsSession wsSession; + // Open the WS server session. + if ( KErrNone == wsSession.Connect() ) + { + TFLOGSTRING( "CSatShellController::CheckSatUiStatus \ + open WS server session" ) + TApaTaskList tasklist( wsSession ); + TApaTask satUiTask = tasklist.FindApp( KUidSatUi ); + + if ( satUiTask.Exists() ) + { + TFLOGSTRING( + "CSatShellController::CheckSatUiStatus task exists" ) + TApaTask topMostTask = tasklist.FindByPos( 0 ); + + if ( topMostTask.ThreadId() != satUiTask.ThreadId() ) + { + TFLOGSTRING( + "CSatShellController::CheckSatUiStatus set SatUI to BG" ) + iSetSatUiToBackground = ETrue; + } + } + + wsSession.Close(); + } + + TFLOGSTRING( "CSatShellController::CheckSatUiStatus exit" ) + } + +// ================= OTHER EXPORTED FUNCTIONS =============================== + +EXPORT_C MSatShellController* NewSatController() + { + TFLOGSTRING( "CSatShellController::NewSatController called" ) + + MSatShellController* satController = NULL; + TRAPD( err, satController = CSatShellController::NewL() ) + if ( KErrNone != err ) + { + TFLOGSTRING2( " CSatShellController::NewSatController \ + failed: %d", err ) + satController = NULL; + } + + TFLOGSTRING( "CSatShellController::NewSatController exit" ) + return satController; + } + +// End of File