diff -r 8ee96d21d9bf -r 7e0eff37aedb gssettingsuis/Gs/GSApplication/Src/GSUi.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gssettingsuis/Gs/GSApplication/Src/GSUi.cpp Wed Sep 01 12:20:44 2010 +0100 @@ -0,0 +1,438 @@ +/* +* Copyright (c) 2005-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: General Settings User Interface +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // For determining skin change +#include +#include +#include +#include +#include +#include +#include +#include // For HlpLauncher +#include +#include // Embedding CC in GS +#include // Embedding CC in GS +#include // Embedding CC in GS +#include +#include // The USER class +#include +#include + +#include +#include +#include + +#include +#include "GsLogger.h" +#include "GSUi.h" +#include +#include "GSDocument.h" +#include "gssettingid.h" +#include + +// System Includes +#include +#include +using namespace conn; + +//CONSTANTS + +const TInt KGSPhoneAppID = 0x100058b3; + + +// ================= MEMBER FUNCTIONS ======================= + + +// ---------------------------------------------------- +// CGSUi::CGSUi() +// +// Default constructor. +// ---------------------------------------------------- +CGSUi::CGSUi() + { + } + + +// ---------------------------------------------------- +// CGSUi::~CGSUi() +// destructor +// +// ---------------------------------------------------- +CGSUi::~CGSUi() + { + GSDocument().PrepareForUIDestruction(); + + FeatureManager::UnInitializeLib(); + + //Embedding - removing created document + if ( iEmbedded ) + { + iEikonEnv->Process()->DestroyDocument( iEmbedded ); + } + if( iEComNotifier ) + { + delete iEComNotifier; + } + } + + +// ---------------------------------------------------- +// CGSUi::ConstructL() +// +// Symbian OS two-phased constructor +// ---------------------------------------------------- +void CGSUi::ConstructL() + { + __GSLOGSTRING( "[CGSUi] ConstructL()" ); + FeatureManager::InitializeLibL(); + BaseConstructL( EAknEnableSkin | EAknEnableMSK |EAknSingleClickCompatible ); + TInt backupInfo = 0; + const TInt error = RProperty::Get( TUid::Uid( KUidSystemCategoryValue ), + KUidBackupRestoreKey, + backupInfo ); + // We check if the backup/restore process is underway + if ( error == KErrNone ) + { + // Work out what kind of operation is underway: + if ( ( backupInfo & KBURPartTypeMask ) == EBURNormal || + ( backupInfo & KBURPartTypeMask ) == EBURUnset ) + { + ConstructViewsL(); + //Activate the main view to be the first view when + // application is opened. + SetDefaultViewL( *iMainView ); + } + else + { + if ( ( backupInfo & KBURPartTypeMask) == EBURBackupFull || + ( backupInfo & KBURPartTypeMask) == EBURBackupPartial ) + { + // Backup In Progress.. show a Note and Dont Launch GS + ShowNoteGsNotOpenedDuringBackupRestoreL(); + } + else if ( ( backupInfo & KBURPartTypeMask) == EBURRestoreFull || + ( backupInfo & KBURPartTypeMask) == EBURRestorePartial ) + { + // Restore In Progress.. show a Note and Dont Launch GS + ShowNoteGsNotOpenedDuringBackupRestoreL(); + } + } + } + + GSDocument().PreparePluginCacheL( *this ); + + // This will observe plugin install events. + iEComNotifier = CGSEComNotifier::NewL( this, GSDocument().GetImplInfo() ); + } + + +// ---------------------------------------------------- +// CGSUi::ConstructViewsL() +// +// ---------------------------------------------------- +void CGSUi::ConstructViewsL() + { + __GSLOGSTRING( "[CGSUi] Constructing views..." ); + + iMainView = CGSMainView::NewL(); + AddViewL( iMainView ); // transfer ownership to CAknViewAppUi + + __GSLOGSTRING( "[CGSUi] Constructing views done." ); + } + + +// ---------------------------------------------------- +// CGSUi::HandleCommandL(TInt aCommand) +// +// +// ---------------------------------------------------- +void CGSUi::HandleCommandL( TInt aCommand ) + { + __GSLOGSTRING1( "[CGSUi] HandleCommandL(%d)", aCommand ); + switch ( aCommand ) + { + case EEikCmdExit: + case EAknCmdExit: + case EAknSoftkeyExit: + #ifdef GS_ENABLE_WATCH_DOG + GSDocument().WatchDog()->ReportCleanExitL(); + #endif + Exit(); + break; + default: + break; + } + } + + +// ---------------------------------------------------- +// CGSUi::HandleResourceChangeL() +// +// +// ---------------------------------------------------- +// +void CGSUi::HandleResourceChangeL( TInt aType ) + { + CAknViewAppUi::HandleResourceChangeL( aType ); + } + + +// ---------------------------------------------------- +// CGSUi::HandleKeyEventL() +// +// +// ---------------------------------------------------- +TKeyResponse CGSUi::HandleKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + __GSLOGSTRING1( "[CGSUi] HandleKeyEventL(code:%d)", aKeyEvent.iCode ); + + CAknNavigationControlContainer* naviContainer = + static_cast + ( StatusPane()->ControlL( TUid::Uid(EEikStatusPaneUidNavi ) ) ); + + TKeyResponse response = EKeyWasNotConsumed; + + if( naviContainer ) + { + CAknNavigationDecorator* naviDec = naviContainer->Top(); + if( naviDec ) + { + CCoeControl* decControl = naviDec->DecoratedControl(); + if( decControl) + { + response = decControl->OfferKeyEventL( aKeyEvent, aType ); + } + } + } + + return response; + } + + +// ---------------------------------------------------- +// CGSUi::PhoneIdle() +// +// +// ---------------------------------------------------- +// +void CGSUi::PhoneIdle() + { + TRAP_IGNORE( CreateActivateViewEventL( TVwsViewId( TUid::Uid( KGSPhoneAppID ), + TUid::Uid( KGSPhoneAppID ) ), KNullUid, KNullDesC8() ) ); + } + + +// --------------------------------------------------------------------------- +// CGSUi::EmbedAppL() +// +// Launches application as embedded. +// --------------------------------------------------------------------------- +// +void CGSUi::EmbedAppL( const TAppInfo& aApp ) + { + if ( iEmbedded ) + { + iEikonEnv->Process()->DestroyDocument( iEmbedded ); + iEmbedded = NULL; + } + CAknLocalScreenClearer* clearer = CAknLocalScreenClearer::NewLC(); + CEikProcess* process = iEikonEnv->Process(); + TApaApplicationFactory apaAppFactory( aApp.iUid ); + iEmbedded = process->AddNewDocumentL( apaAppFactory ); + TApaDocCleanupItem cleanup( process, iEmbedded ); + CleanupStack::PushL( cleanup ); + iEmbedded->NewDocumentL(); + CleanupStack::Pop(); + iEmbedded->EditL( NULL ); + CleanupStack::PopAndDestroy( clearer ); + } + + +// --------------------------------------------------------------------------- +// CGSUi::Document() +// +// +// --------------------------------------------------------------------------- +// +CGSDocument& CGSUi::GSDocument() const + { + CGSDocument* doc = static_cast< CGSDocument* >( Document() ); + return *doc; + } + + +// --------------------------------------------------------------------------- +// CGSUi::ShowNoteGsNotOpenedDuringBackupRestoreL() +// +// +// --------------------------------------------------------------------------- +// +void CGSUi::ShowNoteGsNotOpenedDuringBackupRestoreL() + { + HBufC* prompt = + StringLoader::LoadL( R_CONFIRM_NOTE_GS_EXIT_BACKUP_RESTORE_STRING ); + CleanupStack::PushL( prompt ); + CAknInformationNote* note = + new( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *prompt ); + CleanupStack::PopAndDestroy( prompt ); +#ifdef GS_ENABLE_WATCH_DOG + GSDocument().WatchDog()->ReportCleanExitL(); +#endif + Exit(); + } + + +// --------------------------------------------------------------------------- +// CGSUi::HandleMessageL +// Handles messages sent from gslauncher +// +// --------------------------------------------------------------------------- +// +MCoeMessageObserver::TMessageResponse CGSUi::HandleMessageL( + TUint32 /*aClientHandleOfTargetWindowGroup*/, + TUid /*aMessageUid*/, + const TDesC8 &aMessageParameters ) + { + const TUint8* ptr = aMessageParameters.Ptr(); + __GSLOGSTRING1( "[CGSUi::HandleMessageL] aMessageParameters: %S", &aMessageParameters ); + + FindAndKillEmbeddedAppL(); + + TUid viewUid; + TUid uid2; + + RDesReadStream str; + str.Open(aMessageParameters); + str >> viewUid; + str >> uid2; + HBufC8* msg8 = HBufC8::NewLC(str, 1024); + str.Close(); + + __GSLOGSTRING1( "[CGSUi::HandleMessageL] Launching view 0x%x ", viewUid.iUid ); + TVwsViewId id( KUidGS , viewUid ); + if ( !View(viewUid) ) + { + GSDocument().CreateShimmedViewL(viewUid); + } + ActivateViewL( id, uid2, *msg8 ); + CleanupStack::PopAndDestroy( msg8 ); + return MCoeMessageObserver::EMessageNotHandled; + } + + +// --------------------------------------------------------------------------- +// CGSUi::FindAndKillEmbeddedAppL() +// Find possiple child app of GS, and kill it. +// +// --------------------------------------------------------------------------- +// +TInt CGSUi::FindAndKillEmbeddedAppL() + { + RWsSession ws = CEikonEnv::Static()->WsSession(); + TApaTaskList taskList( ws ); + TApaTask gstask = taskList.FindApp( KUidGS ); // Find GS + + if ( gstask.Exists() ) // Task should exist + { + TInt gswgid = gstask.WgId(); + RArray wgrp; + ws.WindowGroupList( &wgrp ); + TInt i = 0; + + // Loop window groups, find GS's child app + for ( i=0; i < wgrp.Count() ; ++i ) + { + TBuf<100> name; + ws.GetWindowGroupNameFromIdentifier( wgrp[i].iId , name ); + RWsSession::TWindowGroupChainInfo wginfo = wgrp[i]; + __GSLOGSTRING3( "[CGSUi] wginfo %d (%d) '%S'", wginfo.iId, wginfo.iParentId, &( name.Left( 20 ) ) ); + if ( wginfo.iParentId == gswgid ) // Child of GS found + { + CApaWindowGroupName* windowName1 = CApaWindowGroupName::NewLC( ws, wginfo.iId ); + TUid embeddeeuid; + embeddeeuid = windowName1->AppUid(); + TApaTask embeddee = taskList.FindApp( embeddeeuid ); + + // Kill the child app + if ( embeddee.Exists() ) + { + __GSLOGSTRING2( "[CGSUi] Embeddee: 0x%x Embeddee thread=0x%x", + embeddeeuid.iUid, + embeddee.ThreadId() ); + embeddee.KillTask(); + } + CleanupStack::PopAndDestroy( windowName1 ); //windowName1 + } + } + wgrp.Close(); + } + return KErrNone; + } + + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CGSUi::HandleEComEvent( TEComEvent aEvent ) + { + /** + * Quietly close GS if GS-plugin is uninstalled. This is a precaution for + * scenario where GS-plugin is uninstalled and GS tries to access the + * plugin even though plugin's resources do not exist anymore. + * + * More sophisticated solution would have been to update whole GS plugin + * structure but this would have been overkill for this very rare use + * scenario and rather impossible due to BC requirements. + */ + __GSLOGSTRING1( "[CGSUi::HandleEComEvent] aEvent:%d", aEvent ); + + switch( aEvent ) + { + case MGSEComObserver::EPluginRemoved: + __GSLOGSTRING( "[CGSUi::HandleAppListEvent] Closing GS..." ); + #ifdef GS_ENABLE_WATCH_DOG + TRAP_IGNORE( GSDocument().WatchDog()->ReportCleanExitL() ); + #endif + Exit(); + break; + default: + break; + } + + } + + + + +//End of File