--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuiave/AppSrc/CCAAppSettingsSAPExt.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,387 @@
+/*
+* 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 "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: Application settings SAP settings extension
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CCAAppSettingsSAPExt.h"
+#include "ChatDefinitions.h"
+#include "ChatDebugPrint.h"
+
+#include <cimpspresenceconnectionuing.h>
+#include <CIMPSSAPSettingsStore.h>
+#include <CIMPSSAPSettings.h>
+#include <CIMPSSAPSettingsList.h>
+#include <CPEngNWSessionSlotID2.h>
+#include <PathInfo.h>
+#include <bautils.h>
+#include <eikenv.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+//Removed the ownership of iConnUI from this file and made it a reference
+//APPUI owns this connection UI instance and shares the same with this component.
+
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::CCAAppSettingsSAPExt
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCAAppSettingsSAPExt::CCAAppSettingsSAPExt( CIMPSPresenceConnectionUi& aConnUi,
+ TBool aPreserveSessionIdInExit )
+ : iConnUI( aConnUi ),
+ iPreserveSessionIdInExit( aPreserveSessionIdInExit )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCAAppSettingsSAPExt::ConstructL( CIMPSSAPSettings* aSap )
+ {
+ iSapSettings = CIMPSSAPSettingsStore::NewL();
+ iSap = aSap;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAAppSettingsSAPExt* CCAAppSettingsSAPExt::NewL( CIMPSPresenceConnectionUi& aConnUi,
+ TBool aPreserveSessionIdInExit /* = EFalse */,
+ CIMPSSAPSettings* aSap /* = NULL */ )
+
+ {
+ CCAAppSettingsSAPExt* self = CCAAppSettingsSAPExt::NewLC( aConnUi,
+ aPreserveSessionIdInExit, aSap );
+
+ CleanupStack::Pop();
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAAppSettingsSAPExt* CCAAppSettingsSAPExt::NewLC( CIMPSPresenceConnectionUi& aConnUi,
+ TBool aPreserveSessionIdInExit /* = EFalse */,
+ CIMPSSAPSettings* aSap /* = NULL */ )
+ {
+ CCAAppSettingsSAPExt* self = new( ELeave ) CCAAppSettingsSAPExt( aConnUi,
+ aPreserveSessionIdInExit );
+ CleanupStack::PushL( self );
+ self->ConstructL( aSap );
+ return self;
+ }
+
+
+// Destructor
+// CodeScanner warning ignored because HandleApplicationExitL
+// needs to be called to keep connection alive.
+// Otherwise destroying iConnUI would close the connection.
+CCAAppSettingsSAPExt::~CCAAppSettingsSAPExt() // CSI: 23 # See comment above
+ {
+ if ( iPreserveSessionIdInExit )
+ {
+ TRAPD( err,
+ {
+ // this class was invoked from IM Launcher call chain,
+ // when Always Online is active. now make sure the IMPSCUI
+ // Session Id is given to an instance existing in Always Online
+ // (otherwise it'll be deleted and logout will happen)
+ CPEngNWSessionSlotID2* sessionSlotID =
+ iConnUI.GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+ CleanupStack::PushL( sessionSlotID );
+ iConnUI.HandleApplicationExitL( EIMPSConnClientIM,
+ EIMPSLeaveSessionOpenExit,
+ *sessionSlotID );
+ CleanupStack::PopAndDestroy( sessionSlotID );
+ } ); // TRAPD
+
+ if ( err != KErrNone )
+ {
+ CActiveScheduler::Current()->Error( err );
+ }
+ // now it's safe to exit even in Always Online case
+ }
+
+ delete iSapSettings;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::SetIntValueL
+// Sets int value to SAP settings
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppSettingsSAPExt::SetIntValueL( const TDesC& aKey, TInt aValue )
+ {
+ CHAT_DP_TXT( "CCAAppSettingsSAPExt::SetIntValueL" );
+ CIMPSSAPSettings* sap = NULL;
+ if ( !iSap )
+ {
+ sap = StoredSAPLC();
+ }
+ else
+ {
+ sap = iSap;
+ }
+ if ( sap )
+ {
+ TInt id( sap->Uid() );
+ CHAT_DP( D_CHAT_LIT( "found sap (%d), setting value %d" ), id, aValue );
+ sap->SetOpaqueInt( aKey, aValue );
+
+ // update sap
+ iSapSettings->UpdateOldSAPL( sap, id );
+ if ( !iSap )
+ {
+ CleanupStack::PopAndDestroy( sap );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::IntValueL
+// Gets int value from SAP settings
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAAppSettingsSAPExt::IntValueL( const TDesC& aKey )
+ {
+ CHAT_DP_TXT( "CCAAppSettingsSAPExt::IntValueL" );
+ TInt ret( KErrNotFound );
+ CIMPSSAPSettings* sap = NULL;
+ if ( !iSap )
+ {
+ sap = StoredSAPLC();
+ }
+ else
+ {
+ sap = iSap;
+ }
+ if ( sap )
+ {
+#ifdef _DEBUG
+ TInt id( sap->Uid() );
+ CHAT_DP( D_CHAT_LIT( "found sap (%d), getting value.." ), id );
+#endif//_DEBUG
+ sap->GetOpaqueInt( aKey, ret );
+ if ( !iSap )
+ {
+ CleanupStack::PopAndDestroy( sap );
+ }
+ }
+ CHAT_DP( D_CHAT_LIT( "value %d" ), ret );
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::SetToneFileNameL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppSettingsSAPExt::SetToneFileNameL( const TDesC& aToneFileName )
+ {
+ CIMPSSAPSettings* sap = NULL;
+ if ( !iSap )
+ {
+ sap = StoredSAPLC();
+ }
+ else
+ {
+ sap = iSap;
+ }
+
+ // populate the list of sapsettings
+ CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+ iSapSettings->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup );
+
+ // and find our sap.. because logged in SAP has UID of zero, we must
+ // find the correct UID manually from list
+ TInt index( KErrNotFound );
+ sapList->FindNameL( sap->SAPName(), index );
+
+ if ( index != KErrNotFound )
+ {
+ // found it, update the correct sap
+ CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC();
+
+ TUint32 sapUid = sapList->UidForIndex( index );
+ iSapSettings->GetSAPL( sapUid, storedSap );
+ storedSap->SetOpaqueDesC16( KIMAlertTonePath(), aToneFileName );
+ iSapSettings->UpdateOldSAPL( storedSap, sapUid );
+ CleanupStack::PopAndDestroy( storedSap );
+ }
+ if ( !iSap )
+ {
+ CleanupStack::PopAndDestroy( 2, sap );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( sapList );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::GetToneFileNameL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAAppSettingsSAPExt::GetToneFileNameL( TDes& aToneFileName )
+ {
+ CIMPSSAPSettings* sap = NULL;
+ if ( !iSap )
+ {
+ sap = StoredSAPLC();
+ }
+ else
+ {
+ sap = iSap;
+ }
+
+ // populate the list of sapsettings
+ CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+ iSapSettings->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup );
+
+ // and find our sap.. because logged in SAP has UID of zero, we must
+ // find the correct UID manually from list
+ TInt index( KErrNotFound );
+ sapList->FindNameL( sap->SAPName(), index );
+
+ if ( index != KErrNotFound )
+ {
+ // found it, update the correct sap
+ CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC();
+ iSapSettings->GetSAPL( sapList->UidForIndex( index ), storedSap );
+
+ TPtrC audioPath;
+ storedSap->GetOpaqueDesC16( KIMAlertTonePath(), audioPath );
+ aToneFileName.Copy( audioPath.Left( aToneFileName.MaxLength() ) );
+ CleanupStack::PopAndDestroy( storedSap );
+ }
+ else
+ {
+ aToneFileName.Copy( KNullDesC() );
+ }
+
+ if ( !iSap )
+ {
+ CleanupStack::PopAndDestroy( 2, sap );
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy( sapList );
+ }
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::StoredSAPLC
+// Gets editable stored SAP
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CIMPSSAPSettings* CCAAppSettingsSAPExt::StoredSAPLC()
+ {
+ CIMPSSAPSettings* sap = CIMPSSAPSettings::NewLC();
+
+ TBool isLoggedIn( EFalse );
+
+ TInt err;
+ TRAP( err, isLoggedIn = iConnUI.LoggedInL( EIMPSConnClientIM ) );
+
+ if ( isLoggedIn )
+ {
+ CPEngNWSessionSlotID2* sessionSlotId =
+ iConnUI.GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+ CleanupStack::PushL( sessionSlotId );
+ iConnUI.GetLoggedInSapL( *sessionSlotId, *sap );
+
+ // populate the list of sapsettings
+ CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+ iSapSettings->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup );
+
+ // and find our sap.. because logged in SAP has UID of zero, we must
+ // find the correct UID manually from list
+ TInt index( KErrNotFound );
+ TPtrC name( sap->SAPName() );
+ CHAT_DP( D_CHAT_LIT( "logged to to %S, trying to find sap" ), &name );
+ sapList->FindNameL( name, index );
+
+ if ( index != KErrNotFound )
+ {
+ CHAT_DP( D_CHAT_LIT( "found it in index %d" ), index );
+ // found it, update the correct sap
+ CIMPSSAPSettings* storedSap = CIMPSSAPSettings::NewLC();
+ iSapSettings->GetSAPL( sapList->UidForIndex( index ), storedSap );
+ CleanupStack::Pop( storedSap );
+ CleanupStack::PopAndDestroy( 3, sap ); // sapList, sessionslot, sap
+ CleanupStack::PushL( storedSap );
+ sap = storedSap;
+ }
+ else
+ {
+ CHAT_DP( D_CHAT_LIT( "not found" ) );
+ CleanupStack::PopAndDestroy( 3, sap ); // sapList, sessionSlotId, sap
+ return NULL;
+ }
+ }
+ else if ( iSapSettings )
+ {
+ iSapSettings->GetDefaultL( sap, EIMPSIMAccessGroup );
+ }
+
+ return sap;
+ }
+
+// -----------------------------------------------------------------------------
+// CCAAppSettingsSAPExt::CurrentSAPLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CIMPSSAPSettings* CCAAppSettingsSAPExt::CurrentSAPLC()
+ {
+ CIMPSSAPSettings* sap = CIMPSSAPSettings::NewLC();
+
+ TBool isLoggedIn( EFalse );
+ TInt err;
+ TRAP( err, isLoggedIn = iConnUI.LoggedInL( EIMPSConnClientIM ) );
+
+ if ( isLoggedIn )
+ {
+ CPEngNWSessionSlotID2* sessionSlotId = iConnUI.GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+ CleanupStack::PushL( sessionSlotId );
+ iConnUI.GetLoggedInSapL( *sessionSlotId, *sap );
+ CleanupStack::PopAndDestroy( sessionSlotId );
+ }
+ else
+ {
+ iSapSettings->GetDefaultL( sap, EIMPSIMAccessGroup );
+ }
+ return sap;
+ }
+
+// End of File