diff -r 000000000000 -r 094583676ce7 wvuing/wvuiave/AppSrc/CCAAppSettingsSAPExt.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include + +// ============================ 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