wlanutilities/wlansniffer/engine/server/src/wsfengine.cpp
branchRCL_3
changeset 25 f28ada11abbf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlansniffer/engine/server/src/wsfengine.cpp	Wed Sep 01 12:20:32 2010 +0100
@@ -0,0 +1,749 @@
+/*
+* Copyright (c) 2007-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:  Implementation of CWsfEngine
+*
+*/
+
+
+
+//  EXTERNAL INCLUDES
+#include <commsdattypesv1_1.h>
+#include <commsdat.h>
+#include <cmconnectionmethodext.h>
+#include <cmpluginwlandef.h>
+
+//  CLASS HEADER
+#include "wsfengine.h"
+
+
+//  INTERNAL INCLUDES
+#include "wsfwlanscanner.h"
+#include "wsfwlansettingsaccessor.h"
+#include "wsfwlanbearerconnectionmonitor.h"
+#include "wsfengineobserver.h"
+#include "wsfservercloseradapter.h"
+#include "wsfactivewaiter.h"
+
+#include "wsflogger.h"
+
+
+
+//  LOCAL DEFINITIONS
+using namespace CommsDat;
+
+
+/**
+* Maximum number of retries when trying to delete a temporary IAP but
+* the connection is locking it
+*/
+static const TInt KMaxIapDeletionRetries = 10;
+
+
+/**
+* Time to wait betweed two IAP deletion retries, in microseconds
+*/
+static const TUint KDelayBetweenDeletionRetries = 500 * 1000;
+
+
+
+
+
+//  CONSTRUCTION AND DESTRUCTION
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::NewL
+// ----------------------------------------------------------------------------
+//
+CWsfEngine* CWsfEngine::NewL( MWsfServerCloserAdapter& aServerCloser )
+    {
+    CWsfEngine* self = CWsfEngine::NewLC( aServerCloser );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::NewLC
+// ----------------------------------------------------------------------------
+//
+CWsfEngine* CWsfEngine::NewLC( MWsfServerCloserAdapter& aServerCloser )
+    {
+    CWsfEngine* self = new ( ELeave ) CWsfEngine( aServerCloser );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::~CWsfEngine
+// ----------------------------------------------------------------------------
+//
+CWsfEngine::~CWsfEngine()
+    {
+    LOG_ENTERFN( "CWsfEngine::~CWsfEngine" );
+    
+    delete iWlanBearerMonitor;
+    delete iScanner;
+    delete iDbSession;
+    iObservers.Reset();
+    
+    if ( iMonitoredIap && 
+         ( iIapPersistence == EIapExpireOnDisconnect ||
+           iIapPersistence == EIapNestedExpireOnDisconnect ||
+           iIapPersistence == EIapExpireOnBrowserExit ||
+           iIapPersistence == EIapExpireOnShutdown ) )
+        {
+        TRAP_IGNORE( DeleteIapL( iMonitoredIap ) );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::CWsfEngine
+// ----------------------------------------------------------------------------
+//
+CWsfEngine::CWsfEngine( MWsfServerCloserAdapter& aServerCloser ):
+    iServerCloser( aServerCloser ),
+    iEnableScanning( 0 ),
+    iIapPersistence( EIapDeleted )
+    {
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::ConstructL()
+    {
+    LOG_CREATE;
+    LOG_ENTERFN( "CWsfEngine::ConstructL" );
+    iDbSession = CMDBSession::NewL( CMDBSession::LatestVersion() );
+    iScanner = CWsfWlanScanner::NewL( *iDbSession );
+ 
+    iScanner->SetObserver( *this );
+
+    iWlanBearerMonitor = CWsfWlanBearerConnectionMonitor::NewL( iServerCloser );
+    iScanner->SetConnectionDetailProvider( *iWlanBearerMonitor );
+
+    iWlanBearerMonitor->StartMonitoringL( this );
+
+    if ( iWlanBearerMonitor->GetWlanBearerNameL() != KNullDesC() )
+        {
+        HBufC* name = ConnectedWlanSsidL();
+        CleanupStack::PushL( name );
+        iScanner->ConnectionEstablishedL( *name );
+        CleanupStack::PopAndDestroy( name );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::AttachL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::AttachL( MWsfEngineObserver* aObserver )
+    {
+    LOG_ENTERFN( "CWsfEngine::AttachL" );
+    
+    iObservers.AppendL( aObserver );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::Detach
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::Detach( MWsfEngineObserver* aObserver )
+    {
+    LOG_ENTERFN( "CWsfEngine::Detach" );
+    TInt index = iObservers.Find( aObserver );
+    if ( index != KErrNotFound )
+        {
+        iObservers.Remove( index );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::GetScanResults
+// ----------------------------------------------------------------------------
+//
+HBufC8* CWsfEngine::GetScanResults()
+    {
+    LOG_ENTERFN( "CWsfEngine::GetScanResults" );
+    return iScanner->ScanResults();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::EnableScanningL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::EnableScanningL()
+    {
+    LOG_ENTERFN( "CWsfEngine::EnableScanningL" );
+
+    iEnableScanning++;
+    LOG_WRITEF( "++iEnableScanning = %d", iEnableScanning );
+    
+    if ( iEnableScanning == 1 )
+        {
+        LOG_WRITE( "CWsfEngine::EnableScanningL - start scanner" );
+        if ( !iScanner->IsActive() )
+            {
+            iScanner->StartScanningL();
+            }
+        LOG_WRITE( "CWsfEngine::EnableScanningL start scanner done" );
+        for ( TInt i( 0 ); i< iObservers.Count(); ++i )
+            {
+            (iObservers[i])->ScanEnabledL();
+            }
+        }
+    else 
+        {
+        // the scanning is already active - stop and reactivate to complete the
+        // new monitor in sensible time        
+        if ( iScanner->IsActive() )
+            {
+            iScanner->StopScanning();
+            }
+        iScanner->StartScanningL();
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::IsScanning
+// ----------------------------------------------------------------------------
+//
+TBool CWsfEngine::IsScanning()
+    {
+    return iEnableScanning;
+    }
+    
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::RefreshScanResults
+// ----------------------------------------------------------------------------
+//
+TBool CWsfEngine::RefreshScanResults()
+    {
+    LOG_ENTERFN( "CWsfEngine::RefreshScanResults" );
+    return iScanner->RestartScanning();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::MonitorAccessPointL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::MonitorAccessPointL( TUint32 aIapId )
+    {
+    LOG_ENTERFN( "CWsfEngine::MonitorAccessPointL" );
+    
+    iMonitoredIap = aIapId;
+
+    if ( iIapPersistence == EIapExpireOnShutdown )
+        {
+        // web browsing with a temporary IAP
+        LOG_WRITE( "EIapExpireOnShutdown => EIapExpireOnBrowserExit" );
+        SetIapPersistenceL( EIapExpireOnBrowserExit );
+        iServerCloser.WaitForBrowserExit( ETrue );
+        
+        // semaphore to keep the order of calls
+        iSuppressIapDeletion = ETrue;  
+        }
+    else if ( iIapPersistence == EIapExpireOnDisconnect )
+        {
+        LOG_WRITE( "EIapExpireOnDisconnect => EIapNestedExpireOnDisconnect" );
+        SetIapPersistenceL( EIapNestedExpireOnDisconnect );
+        }
+ 
+    
+    LOG_WRITEF( "iMonitoredIap = %d", iMonitoredIap );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::DisableScanningL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::DisableScanningL()
+    {
+    LOG_ENTERFN( "CWsfEngine::DisableScanningL" );
+
+    iEnableScanning--;
+    LOG_WRITEF( "--iEnableScanning = %d", iEnableScanning );
+
+    if ( !iEnableScanning )
+        {
+        LOG_WRITE( "CWsfEngine::DisableScanning stop scanner" );
+
+        iScanner->StopScanning();
+        LOG_WRITE( "CWsfEngine::DisableScanning stopped scanner" );
+
+        for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+            {
+            (iObservers[i])->ScanDisabledL();
+            }
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectedWlanSsidL
+// ----------------------------------------------------------------------------
+//
+HBufC* CWsfEngine::ConnectedWlanSsidL()
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectedWlanIapNameL" );
+    return iWlanBearerMonitor->GetWlanBearerNameL().AllocL();
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectedWlanConnectionDetailsL
+// ----------------------------------------------------------------------------
+//
+TBool CWsfEngine::ConnectedWlanConnectionDetailsL( TWsfWlanInfo& aWlanInfo )
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectedWlanConnectionDetailsL" );
+    return iWlanBearerMonitor->ConnectedWlanConnectionDetailsL( &aWlanInfo );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::WlanScanCompleteL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::WlanScanCompleteL()
+    {
+    LOG_ENTERFN( "CWsfEngine::WlanScanCompleteL" );
+
+    for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+        {
+        (iObservers[i])->WlanListChangedL();
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::WlanScanStarted
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::WlanScanStarted()
+    {
+    LOG_ENTERFN( "CWsfEngine::WlanScanStarted" );
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::NotifyError
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::NotifyError( TInt aError )
+    {
+    LOG_ENTERFN( "CWsfEngine::NotifyError" );
+
+    for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+        {
+        TRAP_IGNORE( (iObservers)[i]->NotifyErrorL( aError ) );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectionEstablishedL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::ConnectionEstablishedL( const TDesC& aConnectionName )
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectionEstablishedL" );
+    // set the scanner to check connected accounts
+    iScanner->ConnectionEstablishedL( aConnectionName );
+    
+    iScanner->RestartScanning();
+
+    // notify the observers
+    for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+        {
+        (iObservers)[i]->ConnectedL();
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectionLostL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::ConnectionLostL()
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectionLostL" );
+
+    // check temporarity here as well since it is not guaranteed that 
+    // the connection was owned and ConnectedIapReleasedL was called
+    if ( iSuppressIapDeletion )
+        {
+        // web browsing with a temporary IAP
+        LOG_WRITE( "IAP deletion suppressed" );
+        iSuppressIapDeletion = EFalse;
+        }
+    else if ( iMonitoredIap )
+        {
+        if ( iIapPersistence == EIapExpireOnDisconnect ||
+             iIapPersistence == EIapExpireOnBrowserExit )
+            {
+            DeleteIapL( iMonitoredIap );
+            iIapPersistence = EIapDeleted;
+            iMonitoredIap = 0;        
+            }
+        else if ( iIapPersistence == EIapNestedExpireOnDisconnect )
+            {
+            iIapPersistence = EIapExpireOnBrowserExit;
+            }
+        }
+
+    iScanner->ConnectionLostL();
+    iScanner->RestartScanning();
+
+    // notify the observers
+    for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+        {
+        (iObservers)[i]->DisconnectedL();
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectingFailedL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::ConnectingFailedL( TInt aError )
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectingFailedL" );
+
+    for ( TInt i( 0 ); i < iObservers.Count(); ++i )
+        {
+        (iObservers)[i]->ConnectingFailedL( aError );
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectedIapReleasedL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::ConnectedIapReleasedL()
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectedIapReleasedL" );
+    
+    // deleting temporary IAP if necessary
+    if ( !iSuppressIapDeletion && iMonitoredIap )
+        {
+        if ( iIapPersistence == EIapExpireOnDisconnect ||
+             iIapPersistence == EIapExpireOnBrowserExit )
+            {
+            DeleteIapL( iMonitoredIap );
+            iIapPersistence = EIapDeleted;
+            iMonitoredIap = 0;        
+            }
+        else if ( iIapPersistence == EIapNestedExpireOnDisconnect )
+            {
+            iIapPersistence = EIapExpireOnBrowserExit;
+            iSuppressIapDeletion = ETrue;
+            }
+        }
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::DeleteIapL
+// ----------------------------------------------------------------------------
+//
+void CWsfEngine::DeleteIapL( TUint32 aIapId )
+    {
+    LOG_ENTERFN( "CWsfEngine::DeleteIapL" );
+
+    LOG_WRITEF( "deleting temporary IAP id = %d", aIapId );
+    RCmManagerExt cmMgr;
+    cmMgr.OpenLC();
+    
+    RArray<TUint32> cmIds;
+    CleanupClosePushL( cmIds );
+    cmMgr.ConnectionMethodL( cmIds, ETrue, ETrue, EFalse );
+    TBool foundFromUncategorized = EFalse;
+    
+    for ( TInt k = 0; k < cmIds.Count(); k++ )
+        {
+        RCmConnectionMethodExt cm;
+        TRAPD( error, cm = cmMgr.ConnectionMethodL( cmIds[k] ) );
+        if ( KErrNone == error )
+            {
+            CleanupClosePushL( cm );
+
+            TUint iapId = cm.GetIntAttributeL( CMManager::ECmIapId );
+            if ( iapId == aIapId )
+                {
+                LOG_WRITE( "IAP is uncategorized" );
+                foundFromUncategorized = ETrue;
+                }
+            CleanupStack::PopAndDestroy( &cm );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &cmIds );
+    
+    if ( !foundFromUncategorized )
+        {
+        LOG_WRITE( "Not deleting IAP since it is in SNAP" );
+        CleanupStack::PopAndDestroy( &cmMgr );
+        return;
+        }
+    
+    RCmConnectionMethodExt ictCm = cmMgr.ConnectionMethodL( aIapId );
+    CleanupClosePushL( ictCm );
+
+    CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewLC();
+
+    RTimer timer;
+    timer.CreateLocal();
+
+    // trying to delete the temporary IAP
+    // sometimes the RConnection is still locking the IAP when 
+    // we want to delete it, so we might have to try a couple of times
+    TInt counter( KMaxIapDeletionRetries );
+    TInt err( KErrNone );
+    
+    while ( counter )
+        {
+        LOG_WRITEF( "trying to delete (#%d)", 
+                    KMaxIapDeletionRetries - counter );
+                    
+        TRAP( err, ictCm.DeleteL() );
+
+        if ( !err || err == KErrNotFound )
+            {
+            // if success or the IAP was not found (strange but happens), break
+            break;
+            }
+
+        --counter;
+        if ( err && counter )
+            {
+            LOG_WRITEF( "deletion failed with error = %d", err );
+            LOG_WRITE( "RConnection is still locking the IAP, waiting..." );
+            
+            timer.After( waiter->iStatus, TTimeIntervalMicroSeconds32( 
+                                      KDelayBetweenDeletionRetries ) );
+            waiter->WaitForRequest();
+            }
+        }
+    
+
+    timer.Close();
+    CleanupStack::PopAndDestroy( waiter );
+    
+    if ( !err )
+        {
+        LOG_WRITE( "IAP deleted." );
+        }
+    else
+        {
+        LOG_WRITE( "IAP couldn't be deleted!" );
+        }
+        
+    CleanupStack::PopAndDestroy( &ictCm );
+    CleanupStack::PopAndDestroy( &cmMgr );    
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::ConnectWlanL
+// ----------------------------------------------------------------------------
+//
+TInt CWsfEngine::ConnectWlanL( TUint32 aIapId,
+                               TBool aConnectOnly,
+                               TWsfIapPersistence aPersistence )
+    {
+    LOG_ENTERFN( "CWsfEngine::ConnectWlanL" );
+    LOG_WRITEF( "iapId = %d, persistence = %d", aIapId, aPersistence );
+    
+    // if we have already been monitoring an IAP (different from the 
+    // new one), clean that one up properly
+    if ( iMonitoredIap && iIapPersistence == EIapExpireOnBrowserExit )
+        {
+        // user switched back from browser to sniffer and issued connect
+        if ( iMonitoredIap != aIapId )
+            {
+            // selected network is different, so we must clean up the old one
+            DeleteIapL( iMonitoredIap );
+            iIapPersistence = EIapDeleted;
+            iMonitoredIap = 0;        
+            }
+        else if ( iMonitoredIap == aIapId )
+            {
+            // selected networks are the same
+            aPersistence = EIapNestedExpireOnDisconnect;
+            }
+        iSuppressIapDeletion = EFalse;
+        }
+
+    TInt ret = iWlanBearerMonitor->ConnectBearer( aIapId, 
+                                                  aConnectOnly,
+                                                  aPersistence != EIapPersistent );
+    
+    if ( !ret )
+        {
+        // successfully initiated connection
+        LOG_WRITE( "connection init succeded" );
+        iMonitoredIap = aIapId;
+        SetIapPersistenceL( aPersistence );
+        }
+    
+    return ret;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::DisconnectWlan
+// ----------------------------------------------------------------------------
+//
+TBool CWsfEngine::DisconnectWlan()
+    {
+    LOG_ENTERFN( "CWsfEngine::DisconnectWlan" );
+    return iWlanBearerMonitor->DisconnectBearer();
+    }
+    
+
+// ----------------------------------------------------------------------------
+// CWsfEngine::IsConnected
+// ----------------------------------------------------------------------------
+//
+TBool CWsfEngine::IsConnected()
+    {
+    return iWlanBearerMonitor->IsConnected();
+    } 
+
+
+// ---------------------------------------------------------------------------
+// CWsfEngine::AbortConnectingL
+// ---------------------------------------------------------------------------
+//
+void CWsfEngine::AbortConnectingL()
+    {
+    LOG_ENTERFN("CWsfEngine::AbortConnectingL");
+
+    TInt result = iWlanBearerMonitor->AbortConnecting();
+    
+    LOG_WRITEF( "abort connection result = %d", result );
+    
+    if ( result == KErrNone && iMonitoredIap )
+        {
+        if ( iIapPersistence == EIapExpireOnDisconnect )
+            {
+            LOG_WRITE( "EIapNestedExpireOnDisconnect => EIapDeleted" );
+            DeleteIapL( iMonitoredIap );
+            iIapPersistence = EIapDeleted;
+            iMonitoredIap = 0;        
+            }
+        else if ( iIapPersistence == EIapNestedExpireOnDisconnect )
+            {
+            LOG_WRITE( "EIapNestedExpireOnDisconnect => "
+                       L"EIapExpireOnBrowserExit" );
+            iIapPersistence = EIapExpireOnBrowserExit;
+            }
+        }
+    else if ( result != KErrNone )
+        {
+        LOG_WRITE( "abort connection did not stopped connection" );
+        // Try to disconnect via normal disconnect if engine is  
+        // connected and and there is connection id
+        DisconnectWlan();
+        }
+    }
+    
+
+// ---------------------------------------------------------------------------
+// CWsfEngine::AbortScanning
+// ---------------------------------------------------------------------------
+//
+void CWsfEngine::AbortScanning()
+    {
+    LOG_ENTERFN("CWsfEngine::AbortScanning");    
+    
+    iScanner->AbortScanning();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CWsfEngine::SetIapPersistenceL
+// ---------------------------------------------------------------------------
+//
+TBool CWsfEngine::SetIapPersistenceL( TWsfIapPersistence aPersistence )
+    {
+    LOG_ENTERFN("CWsfEngine::SetIapPersistenceL");
+    if ( aPersistence == EIapForcedExpiry )
+        {
+        if ( iMonitoredIap && 
+             ( iIapPersistence == EIapExpireOnBrowserExit ||
+               iIapPersistence == EIapExpireOnShutdown ) )
+            {
+            LOG_WRITE( "forced IAP expiry" );
+            DeleteIapL( iMonitoredIap );
+            iIapPersistence = EIapDeleted;
+            iMonitoredIap = 0;
+            }
+        else if ( iIapPersistence == EIapNestedExpireOnDisconnect )
+            {
+            LOG_WRITE( "reverting to EIapExpireOnDisconnect" );
+            iIapPersistence = EIapExpireOnDisconnect;
+            }
+
+        iServerCloser.WaitForBrowserExit( EFalse );
+        }
+    else 
+        {
+        LOG_WRITEF( "persistence = %d", aPersistence );
+        iIapPersistence = aPersistence;
+        }        
+    
+    return ( iMonitoredIap );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CWsfEngine::ControlDisconnectTimer
+// ---------------------------------------------------------------------------
+//
+TBool CWsfEngine::ControlDisconnectTimer( TUint aAdcCommand )
+    {
+    LOG_ENTERFN("CWsfEngine::ControlDisconnectTimer");    
+    
+    return iWlanBearerMonitor->ControlDisconnectTimer( aAdcCommand );
+    }
+
+// ---------------------------------------------------------------------------
+// CWsfEngine::ResetSuppressIapDeletion
+// ---------------------------------------------------------------------------
+//
+void CWsfEngine::ResetSuppressIapDeletion()
+    {
+    LOG_ENTERFN( "CWsfEngine::ResetSuppresIapDeletion" );
+    
+    iSuppressIapDeletion = EFalse;
+    }
+
+// End of file