commsconfig/cscsipvoipcleanupplugin/src/cscsvcpluginhandler.cpp
changeset 0 a4daefaec16c
child 11 6134b5029079
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscsipvoipcleanupplugin/src/cscsvcpluginhandler.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,282 @@
+/*
+* Copyright (c) 2007-2007 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:  
+*
+*/
+
+
+#include <spproperty.h>
+#include <spsettings.h>
+#include <cmmanagerext.h>
+#include <XdmSettingsApi.h>
+#include <pressettingsapi.h>
+#include <cmpluginwlandef.h>
+#include <cmdestinationext.h>
+#include <XdmSettingsCollection.h>
+
+#include "cscsvcpluginlogger.h"
+#include "cscsvcpluginhandler.h"
+#include "cscsvcpluginsiphandler.h"
+#include "cscsvcpluginrcsehandler.h"
+#include "cscsvcplugincenrephandler.h"
+
+// At-character in SIP profile public username.
+_LIT8( KSvcPluginAtCharacter, "@" );
+
+// Maximum lengths of the setting values.
+const TInt KSvcPluginSettingLength = 256;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCSvcPluginHandler::CCSCSvcPluginHandler()
+    {    
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CCSCSvcPluginHandler::ConstructL()
+    {
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::ConstructL - begin");
+        
+    iRcseHandler = CCSCSvcPluginRcseHandler::NewL();
+    iSipHandler = CCSCSvcPluginSipHandler::NewL();
+    iCenRepHandler = CCSCSvcPluginCenrepHandler::NewL();
+    
+    // Create descriptor array for domain names.
+    iDomainNames = new ( ELeave ) CDesC8ArrayFlat( 1 );
+    
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::ConstructL - end");
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCSvcPluginHandler* CCSCSvcPluginHandler::NewL()
+    {
+    CCSCSvcPluginHandler* self = new (ELeave) CCSCSvcPluginHandler;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCSvcPluginHandler::~CCSCSvcPluginHandler()
+    {
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::~CCSCSvcPluginHandler - begin");
+    
+    iIapIds.Close();
+    iSipProfileIds.Close();
+
+    if ( iDomainNames )
+        {
+        iDomainNames->Reset();
+        }
+    delete iDomainNames;
+    delete iRcseHandler;
+    delete iSipHandler;
+    delete iCenRepHandler;
+    
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::~CCSCSvcPluginHandler - end");
+    }
+
+
+// ---------------------------------------------------------------------------
+// For settings removation.
+// ---------------------------------------------------------------------------
+//
+void CCSCSvcPluginHandler::RemoveSettingsL( TUint32 aServiceId )
+    {
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::RemoveSettingsL - begin");
+    
+    // Search data based on service id
+    SearchSettingsDataL( aServiceId );
+        
+    // Unregister. (SIP profiles are set to when needed mode.)
+    for ( TInt i = 0; i < iSipProfileIds.Count(); i++ )
+        {
+        iSipHandler->SetRegistrationModeL( iSipProfileIds[ i ], EFalse );
+        }
+    
+    // Remove all profiles/settings.
+    RemoveProfilesL( aServiceId );
+    
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::RemoveSettingsL - end");
+    }
+
+// ---------------------------------------------------------------------------
+// Searches all settings data from databases. 
+// ---------------------------------------------------------------------------
+//
+void CCSCSvcPluginHandler::SearchSettingsDataL( TUint32 aServiceId )
+    {
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::SearchSettingsDataL - begin");
+    
+    // Reset member variables to default values.
+    iVoIPProfileId = KErrNone;
+    iSNAPId = KErrNone;
+    iPresenceId = KErrNone;
+    iSipProfileIds.Reset();
+    iIapIds.Reset();
+    iDomainNames->Reset();
+       
+    // Get SNAP ID from service table
+    CSPSettings* spSettings = CSPSettings::NewLC();
+    CSPProperty* property = CSPProperty::NewLC();
+    
+    TInt err =  spSettings->FindPropertyL( 
+        aServiceId, ESubPropertyVoIPPreferredSNAPId, *property );
+    
+    if ( !err )
+        {
+        property->GetValue( iSNAPId );
+        }
+    
+    TInt err2( KErrNone );
+    err2 =  spSettings->FindPropertyL( 
+        aServiceId, ESubPropertyPresenceSettingsId, *property );
+    
+    if ( !err2 )
+        {
+        property->GetValue( iPresenceId );
+        }
+        
+    CleanupStack::PopAndDestroy( property );
+    CleanupStack::PopAndDestroy( spSettings );
+        
+    // Get VoIP profile id and SIP reference ids from RCSE handler.
+    iRcseHandler->GetProfileIdsL( 
+        aServiceId,
+        iVoIPProfileId,
+        iSipProfileIds );
+    
+    for ( TInt i = 0; i < iSipProfileIds.Count(); i++ )
+        {
+        // Get Access Point Id from SIP profile and append it to id array.
+        TUint32 accessPointId = 0;
+        iSipHandler->GetApIdL( iSipProfileIds[ i ], accessPointId );
+        
+        if ( accessPointId )
+            {
+            iIapIds.Append( ( TUint32 ) accessPointId );
+            }
+            
+        // Get Domain name from SIP profile and append it to desc array.
+        TBuf8<KSvcPluginSettingLength> publicUsername( KNullDesC8 );
+        iSipHandler->GetUserAorL( iSipProfileIds[ i ], publicUsername );
+
+        TInt location = publicUsername.Find( KSvcPluginAtCharacter );
+        
+        if ( KErrNotFound != location )
+            {
+            iDomainNames->AppendL( publicUsername.Mid( location + 1 ) );
+            }
+        }
+    
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::SearchSettingsDataL - end");
+    }
+    
+// ---------------------------------------------------------------------------
+// Removes settings.
+// ---------------------------------------------------------------------------
+//
+void CCSCSvcPluginHandler::RemoveProfilesL( TUint32 aServiceId )
+    {
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::RemoveProfilesL - begin");
+        
+    // Destroy VoIP profile from RCSE. 
+    iRcseHandler->RemoveProfileL( iVoIPProfileId );
+    
+    // Remove entry from service table
+    CSPSettings* spSettings = CSPSettings::NewLC();
+    spSettings->DeleteEntryL( aServiceId );
+    CleanupStack::PopAndDestroy( spSettings );
+          
+    // Destroy SIP profiles from SIP Stack.
+    for ( TInt i = 0; i < iSipProfileIds.Count(); i++ )
+        {
+        iSipHandler->RemoveProfileL( iSipProfileIds[ i ] );
+        }
+    
+    // Destroy IAP specific NAT/FW settings.
+    for ( TInt i = 0; i < iIapIds.Count(); i++ )
+        {
+        // Trapped, because function leaves 
+        // if iap spesific keys wasn't found from repostiory.
+        TRAP_IGNORE( iCenRepHandler->RemoveIapSpecificNatfwSettingsL( 
+            iIapIds[ i ] ) );
+        }
+      
+    // Destroy Domain specific NAT/FW settings.
+    for ( TInt i = 0; i < iDomainNames->Count(); i++ )
+        {
+        // Trapped, because function leaves 
+        // if domain spesific keys wasn't found from repostiory.
+        TRAP_IGNORE( iCenRepHandler->RemoveDomainSpecificNatfwSettingsL( 
+            iDomainNames->MdcaPoint( i ) ) );
+        }
+    
+     // Delete SNAP
+    if ( iSNAPId )
+        {
+        RCmManagerExt manager;
+        CleanupClosePushL( manager );
+        manager.OpenL();     
+        RCmDestinationExt dest;
+        CleanupClosePushL( dest );
+        dest = manager.DestinationL ( iSNAPId );
+        
+        // Delete SNAP only if itīs not Internet SNAP.
+        TUint32 internetSnapId( KErrNone );
+        internetSnapId = dest.MetadataL( CMManager::ESnapMetadataInternet );
+        if( internetSnapId == KErrNone )
+            {
+            dest.DeleteLD();
+            }
+        
+        CleanupStack::PopAndDestroy( &dest );        
+        CleanupStack::PopAndDestroy( &manager );
+        
+        CSCSVCPLUGINDEBUG( 
+            "CEgpSettingsController::RemoveProfilesL SNAP deleted" );
+        }
+    
+     // Delete presence and xdm settings
+    if ( iPresenceId )
+        {
+        TPresSettingsSet presSettingSet;
+                
+        // Delete xmd settings
+        PresSettingsApi::SettingsSetL( iPresenceId, presSettingSet );        
+        TXdmSettingsApi::RemoveCollectionL( presSettingSet.iXDMSetting );
+              
+        // Delete presence settings
+        TInt err = PresSettingsApi::RemoveSetL( iPresenceId );
+        
+        CSCSVCPLUGINDEBUG2( 
+         "CCSCSvcPluginHandler::RemoveProfilesL presence and xdm deleted, ERR=%d", err );
+        }
+    
+    CSCSVCPLUGINDEBUG("CCSCSvcPluginHandler::RemoveProfilesL - begin");
+    }