--- /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 <bldvariant.hrh>
+#include <eikapp.h>
+#include <avkon.hrh>
+#include <akncontext.h>
+#include <aknnotewrappers.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <akntitle.h>
+#include <AknUtils.h>
+#include <AknsConstants.h> // For determining skin change
+#include <barsread.h>
+#include <StringLoader.h>
+#include <gsapp.rsg>
+#include <eikenv.h>
+#include <ConeResLoader.h>
+#include <apgcli.h>
+#include <f32file.h>
+#include <hlplch.h> // For HlpLauncher
+#include <w32std.h>
+#include <eikproc.h> // Embedding CC in GS
+#include <aknclearer.h> // Embedding CC in GS
+#include <apacln.h> // Embedding CC in GS
+#include <PSVariables.h>
+#include <e32std.h> // The USER class
+#include <featmgr.h>
+#include <s32mem.h>
+
+#include <gsplugininterface.h>
+#include <gsbaseview.h>
+#include <gsfwviewuids.h>
+
+#include <apgwgnam.h>
+#include "GsLogger.h"
+#include "GSUi.h"
+#include <gsmainview.h>
+#include "GSDocument.h"
+#include "gssettingid.h"
+#include <mgswatchdog.h>
+
+// System Includes
+#include <e32property.h>
+#include <sbdefs.h>
+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<CAknNavigationControlContainer*>
+ ( 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<RWsSession::TWindowGroupChainInfo> 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