wvuing/wvcommandutils/Src/CCACommandSettingSapExtCmd.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvcommandutils/Src/CCACommandSettingSapExtCmd.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,426 @@
+/*
+* Copyright (c) 2006 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:   Implementation for Settings Interface for getting/setting tonefilename etc
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include <PathInfo.h>
+#include <bautils.h>
+#include <eikenv.h>
+#include <cimpspresenceconnectionuing.h>
+#include <CIMPSSAPSettingsStore.h>
+#include <CIMPSSAPSettings.h>
+#include <CIMPSSAPSettingsList.h>
+#include <CPEngNWSessionSlotID2.h>
+
+
+#include "ChatDefinitions.h"
+#include "ChatDebugPrint.h"
+#include "CCACommandSettingSapExtCmd.h"
+
+
+
+//----------------------------------------------------------------------------
+// .CCACommandSettingSapExtCmd::NewLC
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+CCACommandSettingSapExtCmd* CCACommandSettingSapExtCmd::NewLC(
+    MCASettingsPC* aSettingsPC,
+    TBool aPreserveSessionIdInExit,/*= EFalse*/
+    CIMPSSAPSettings* aSAPSettings /*= NULL*/ )
+    {
+    CCACommandSettingSapExtCmd* self = new( ELeave ) CCACommandSettingSapExtCmd(
+        aPreserveSessionIdInExit,
+        aSettingsPC );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSAPSettings );
+    return self;
+    }
+
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::NewL()
+// Two-phased constructor.
+//----------------------------------------------------------------------------
+
+CCACommandSettingSapExtCmd* CCACommandSettingSapExtCmd::NewL(
+    MCASettingsPC* aSettingsPC,
+    TBool aPreserveSessionIdInExit,/*= EFalse*/
+    CIMPSSAPSettings* aSAPSettings /*= NULL*/ )
+    {
+    CCACommandSettingSapExtCmd* self =
+        CCACommandSettingSapExtCmd::NewLC( aSettingsPC,
+                                           aPreserveSessionIdInExit,
+                                           aSAPSettings );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::ConstructL()
+// Symbian 2nd phase constructor can leave.
+//----------------------------------------------------------------------------
+
+void CCACommandSettingSapExtCmd::ConstructL( CIMPSSAPSettings* aSAPSettings )
+    {
+    iSAPSettings = aSAPSettings;
+    iConnectionUI = CIMPSPresenceConnectionUi::NewL( EIMPSConnClientIM );
+    iSAPSettingsStore = CIMPSSAPSettingsStore::NewL();
+
+    }
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::CCACommandSettingSapExtCmd
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//----------------------------------------------------------------------------
+
+
+CCACommandSettingSapExtCmd::CCACommandSettingSapExtCmd(
+    TBool aPreserveSessionIdInExit,
+    MCASettingsPC* aSettingsPC )
+        : iSettingsPC( aSettingsPC ),
+        iPreserveSessionIdInExit( aPreserveSessionIdInExit )
+    {
+
+    }
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::~CCACommandSettingSapExtCmd
+// Destructor
+//----------------------------------------------------------------------------
+
+CCACommandSettingSapExtCmd::~CCACommandSettingSapExtCmd()
+    {
+    if ( iPreserveSessionIdInExit && iConnectionUI )
+        {
+        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 =
+            iConnectionUI->GetActiveNWSessionSlotIDL(
+                EIMPSConnClientIM );
+            CleanupStack::PushL( sessionSlotID );
+            iConnectionUI->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
+        }
+    if ( iConnectionUI )
+        {
+        delete iConnectionUI;
+        }
+
+    if ( iSAPSettingsStore )
+        {
+        delete iSAPSettingsStore;
+        }
+
+
+    }
+
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::SetIntValueL
+// Sets int value to SAP settings
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+void CCACommandSettingSapExtCmd::SetIntValueL( const TDesC& aKey,
+                                               TInt aValue )
+    {
+    CHAT_DP_TXT( "CCAAppSettingsSAPExt::SetIntValueL" );
+    CIMPSSAPSettings* sapSettings = NULL;
+    if ( !iSAPSettings )
+        {
+        sapSettings = StoredSAPLC();
+        }
+    else
+        {
+        sapSettings = iSAPSettings;
+        }
+    if ( sapSettings )
+        {
+        TInt id( sapSettings->Uid() );
+        CHAT_DP( D_CHAT_LIT( "found sap (%d), setting value %d" ), id, aValue );
+        sapSettings->SetOpaqueInt( aKey, aValue );
+
+        // update sapSettings
+        iSAPSettingsStore->UpdateOldSAPL( sapSettings, id );
+        if ( !iSAPSettings )
+            {
+            CleanupStack::PopAndDestroy( sapSettings );
+            }
+        }
+    }
+
+//----------------------------------------------------------------------------
+//  CCACommandSettingSapExtCmd::IntValueL
+// Gets int value from SAP settings
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+TInt CCACommandSettingSapExtCmd::IntValueL( const TDesC& aKey )
+    {
+    CHAT_DP_TXT( "CCAAppSettingsSAPExt::IntValueL" );
+    TInt returnCode( KErrNotFound );
+    CIMPSSAPSettings* sapSettings = NULL;
+    if ( !iSAPSettings )
+        {
+        sapSettings = StoredSAPLC();
+        }
+    else
+        {
+        sapSettings = iSAPSettings;
+        }
+    if ( sapSettings )
+        {
+#ifdef _DEBUG
+        TInt id( sapSettings->Uid() );
+        CHAT_DP( D_CHAT_LIT( "found sap (%d), getting value.." ), id );
+#endif//_DEBUG 
+        sapSettings->GetOpaqueInt( aKey, returnCode );
+        if ( !iSAPSettings )
+            {
+            CleanupStack::PopAndDestroy( sapSettings );
+            }
+        }
+    CHAT_DP( D_CHAT_LIT( "value %d" ), returnCode );
+    return returnCode;
+    }
+
+
+//----------------------------------------------------------------------------
+//  CCACommandSettingSapExtCmd::SetToneFileNameL
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+void CCACommandSettingSapExtCmd::SetToneFileNameL( const TDesC& aToneFileName )
+    {
+    CIMPSSAPSettings* sapSettings = NULL;
+    if ( !iSAPSettings )
+        {
+        sapSettings = StoredSAPLC();
+        }
+    else
+        {
+        sapSettings = iSAPSettings;
+        }
+
+    // populate the list of sapSettings
+    CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+    iSAPSettingsStore->PopulateSAPSettingsListL( *sapList, EIMPSIMAccessGroup );
+
+    // and find our sapSettings.. because logged in SAP has UID of zero, we must
+    // find the correct UID manually from list
+    TInt index( KErrNotFound );
+    sapList->FindNameL( sapSettings->SAPName(), index );
+
+    if ( index != KErrNotFound )
+        {
+        // found it, update the correct sap
+        CIMPSSAPSettings* storedSAPSettings = CIMPSSAPSettings::NewLC();
+
+        TUint32 sapUid = sapList->UidForIndex( index );
+        iSAPSettingsStore->GetSAPL( sapUid, storedSAPSettings );
+        storedSAPSettings->SetOpaqueDesC16( KIMAlertTonePath(), aToneFileName );
+        iSAPSettingsStore->UpdateOldSAPL( storedSAPSettings, sapUid );
+        CleanupStack::PopAndDestroy( storedSAPSettings );
+        }
+    if ( !iSAPSettings )
+        {
+        CleanupStack::PopAndDestroy( 2, sapSettings );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( sapList );
+        }
+    }
+
+
+//----------------------------------------------------------------------------
+//  CCACommandSettingSapExtCmd::GetToneFileNameL
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+void CCACommandSettingSapExtCmd::GetToneFileNameL( TDes& aToneFileName )
+    {
+    CIMPSSAPSettings* sapSettings = NULL;
+    if ( !iSAPSettings )
+        {
+        sapSettings = StoredSAPLC();
+        }
+    else
+        {
+        sapSettings = iSAPSettings;
+        }
+
+    // populate the list of sapsettings
+    CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+    iSAPSettingsStore->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( sapSettings->SAPName(), index );
+
+    if ( index != KErrNotFound )
+        {
+        // found it, update the correct sap
+        CIMPSSAPSettings* storedSAPSettings = CIMPSSAPSettings::NewLC();
+        iSAPSettingsStore->GetSAPL( sapList->UidForIndex( index ),
+                                    storedSAPSettings );
+
+        TPtrC audioPath;
+        storedSAPSettings->GetOpaqueDesC16( KIMAlertTonePath(),
+                                            audioPath );
+        
+        if ( BaflUtils::FileExists( CEikonEnv::Static()->FsSession(), audioPath ) )
+        	{
+        aToneFileName.Copy( audioPath );
+        	}
+        else
+        	{
+        	aToneFileName.Copy( KNullDesC() );
+        	}
+        
+        CleanupStack::PopAndDestroy( storedSAPSettings );
+        }
+    else
+        {
+        aToneFileName.Copy( KNullDesC() );
+        }
+
+    if ( !iSAPSettings )
+        {
+        CleanupStack::PopAndDestroy( 2, sapSettings );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( sapList );
+        }
+    }
+
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::StoredSAPLC
+// Gets editable stored SAP
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+CIMPSSAPSettings* CCACommandSettingSapExtCmd::StoredSAPLC()
+    {
+    CIMPSSAPSettings* sapSettings = CIMPSSAPSettings::NewLC();
+
+    TBool isLoggedIn( EFalse );
+    if ( iConnectionUI )
+        {
+        TInt err;
+        TRAP( err, isLoggedIn = iConnectionUI->LoggedInL( EIMPSConnClientIM ) );
+        }
+
+    if ( isLoggedIn )
+        {
+        CPEngNWSessionSlotID2* sessionSlotId =
+            iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+        CleanupStack::PushL( sessionSlotId );
+        iConnectionUI->GetLoggedInSapL( *sessionSlotId, *sapSettings );
+
+        // populate the list of sapsettings
+        CIMPSSAPSettingsList* sapList = CIMPSSAPSettingsList::NewLC();
+        iSAPSettingsStore->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( sapSettings->SAPName() );
+        CHAT_DP( D_CHAT_LIT( "logged to to %S, trying to find sapSettings" ),
+                 &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* storedSAPSettings = CIMPSSAPSettings::NewLC();
+            iSAPSettingsStore->GetSAPL( sapList->UidForIndex( index ),
+                                        storedSAPSettings );
+            CleanupStack::Pop( storedSAPSettings );
+            CleanupStack::PopAndDestroy( 3, sapSettings );
+            // sapList, sessionslot, sapSettings
+            CleanupStack::PushL( storedSAPSettings );
+            sapSettings = storedSAPSettings;
+            }
+        else
+            {
+            CHAT_DP( D_CHAT_LIT( "not found" ) );
+            CleanupStack::PopAndDestroy( 3, sapSettings );
+            // sapList, sessionSlotId, sapSettings
+            return NULL;
+            }
+        }
+    else if ( iSAPSettingsStore )
+        {
+        iSAPSettingsStore->GetDefaultL( sapSettings, EIMPSIMAccessGroup );
+        }
+
+    return sapSettings;
+    }
+
+
+//----------------------------------------------------------------------------
+// CCACommandSettingSapExtCmd::CurrentSAPLC
+// (other items were commented in a header).
+//----------------------------------------------------------------------------
+
+CIMPSSAPSettings* CCACommandSettingSapExtCmd::CurrentSAPLC()
+    {
+    CIMPSSAPSettings* sapSettings = CIMPSSAPSettings::NewLC();
+
+    TBool isLoggedIn( EFalse );
+    TInt err;
+    TRAP( err, isLoggedIn = iConnectionUI->LoggedInL( EIMPSConnClientIM ) );
+
+    if ( isLoggedIn )
+        {
+        CPEngNWSessionSlotID2* sessionSlotId =
+            iConnectionUI->GetActiveNWSessionSlotIDL( EIMPSConnClientIM );
+        CleanupStack::PushL( sessionSlotId );
+        iConnectionUI->GetLoggedInSapL( *sessionSlotId, *sapSettings );
+        CleanupStack::PopAndDestroy( sessionSlotId );
+        }
+    else
+        {
+        iSAPSettingsStore->GetDefaultL( sapSettings, EIMPSIMAccessGroup );
+        }
+    return sapSettings;
+    }
+