convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifier.cpp
changeset 0 a4daefaec16c
child 10 ed1e38b404e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchclientapi/cchuinotif/src/cchuinotifier.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,454 @@
+/*
+* Copyright (c) 2008-2009 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:  Implements base class for notifier implementations
+*
+*/
+
+
+#include <eikenv.h>
+#include <bautils.h>
+#include <featmgr.h>
+#include <spentry.h> 
+#include <spsettings.h>
+#include <spproperty.h>
+#include <cchuinotif.rsg>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <centralrepository.h>
+#include <cenrepnotifyhandler.h>
+#include <CoreApplicationUIsSDKCRKeys.h> // KCRUidCoreApplicationUIs, 
+                                         // KCoreAppUIsNetworkConnectionAllowed
+#include "cchuilogger.h"
+#include "cchuinotifier.h"
+#include "cchuinotifconnectionhandler.h"
+
+_LIT( KResourceDir, "\\resource\\apps\\" );
+_LIT( KResourceFileName, "cchuinotif.r??" );
+
+// SCP-plugin uid for Sip VoIP
+const TInt32 KSipVoIPSubServicePlugId = 0x1027545A;
+
+// ======== MEMBER FUNCTIONS ========
+
+CCCHUiNotifierBase::CCCHUiNotifierBase(): CActive(EPriorityStandard)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+void CCCHUiNotifierBase::ConstructL()
+    {      
+    CCHUIDEBUG( "CCCHUiNotifierBase::ConstructL - IN" );
+    
+    iEikEnv = CEikonEnv::Static();
+
+    // load the resource file
+    CCHUIDEBUG( "ConstructL - load resource");
+   
+    HBufC* resourceFile = ScanFileL( iEikEnv->FsSession(), 
+        TFileName( KResourceFileName ), TFileName( KResourceDir ) );
+    
+    if ( resourceFile )
+        {
+        CCHUIDEBUG( "ConstructL - resource ready, adding");   
+        
+        CleanupStack::PushL( resourceFile );
+        iResourceFileFlag = iEikEnv->AddResourceFileL(
+            *resourceFile );    
+        CleanupStack::PopAndDestroy( resourceFile );
+        
+        CCHUIDEBUG( "ConstructL - resource added");    
+        }
+    
+    iSettings = CSPSettings::NewL();
+    
+    CCHUIDEBUG( "CCCHUiNotifierBase::ConstructL - OUT" );
+    }
+
+CCCHUiNotifierBase::~CCCHUiNotifierBase()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::~CCCHUiNotifierBase - IN" );
+    Cancel();    
+    
+    delete iSettings;
+    CompleteMessage( KErrDied );  
+    iEikEnv->DeleteResourceFile( iResourceFileFlag );
+    
+    CCHUIDEBUG( "CCCHUiNotifierBase::~CCCHUiNotifierBase - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// CompleteMessage.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::CompleteMessage( TInt aErr )
+    {      
+    CCHUIDEBUG2( "CCCHUiNotifierBase::CompleteMessage - err: %d", aErr );
+    
+    if( !iMessage.IsNull() )
+        {
+        CCHUIDEBUG( "CompleteMessage - do complete");
+        iMessage.Complete( aErr );
+        }
+    
+    iReplySlot = NULL;                    
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Cancelling method.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::Cancel()
+    {   
+    CCHUIDEBUG( "CCCHUiNotifierBase::Cancel - IN" );
+        
+    // Complete with KErrCancel
+    CompleteMessage(KErrCancel);        
+    CActive::Cancel();
+    
+    CCHUIDEBUG( "CCCHUiNotifierBase::Cancel - OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// RunL
+// From CActive.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::RunL(  )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::RunL" );
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Release itself. Call to destructor.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::Release()
+    { 
+    CCHUIDEBUG( "CCCHUiNotifierBase::Release");
+    delete this;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Return registered information.
+// ---------------------------------------------------------------------------
+//
+CCCHUiNotifierBase::TNotifierInfo CCCHUiNotifierBase::Info() const
+    {      
+    CCHUIDEBUG( "CCCHUiNotifierBase::Info");
+    return iInfo;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Synchronic notifier launch. Does nothing here.
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CCCHUiNotifierBase::StartL( const TDesC8& /*aBuffer*/ )
+    {    
+    CCHUIDEBUG( "CCCHUiNotifierBase::StartL");
+    TPtrC8 ret( KNullDesC8 );
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Asynchronic notifier launch.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::StartL( 
+    const TDesC8& aBuffer, 
+    TInt aReplySlot, 
+    const RMessagePtr2& aMessage )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::StartL2 - IN");
+    iMessage = aMessage;
+    iReplySlot = aReplySlot;
+    
+    SetActive();
+    
+    iStatus = KRequestPending;
+    TRequestStatus* stat = &iStatus;
+    User::RequestComplete(stat, KErrNone);
+
+    CCHUIDEBUG( "CCCHUiNotifierBase::StartL2 - OUT");
+    }
+
+// ---------------------------------------------------------------------------
+// From class MEikSrvNotifierBase2.
+// Notifier update. Not supported.
+// ---------------------------------------------------------------------------
+//
+TPtrC8 CCCHUiNotifierBase::UpdateL( const TDesC8& /*aBuffer*/ )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::UpdateL");
+    TPtrC8 ret( KNullDesC8 );
+    return ret;
+    }
+    
+// ----------------------------------------------------------
+// CCCHUiNotifierBase::DoCancel
+// This method will be called by framework (CActive)
+// if active object is still active.
+// Does nothing here.
+// ----------------------------------------------------------
+//
+void CCCHUiNotifierBase::DoCancel()
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::DoCancel - IN");
+    
+    // Complete request when active object is still active
+    TRequestStatus* stat = &iStatus;
+    if (iStatus != KErrCancel)
+        {
+        User::RequestComplete(stat, KErrNone);
+        }
+        
+    CCHUIDEBUG( "CCCHUiNotifierBase::DoCancel - OUT");
+    }
+
+// -----------------------------------------------------------------------------
+// Scan resource file.
+// -----------------------------------------------------------------------------
+//
+HBufC* CCCHUiNotifierBase::ScanFileL( 
+    RFs& aSession, 
+    const TDesC& aFileName, 
+    const TDesC& aFilePath )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::ScanFileL");     
+    
+    TFindFile search( aSession ); 
+    CDir* dirlist; 
+    HBufC* fullName = NULL;
+    TFileName filename( aFileName );
+    TInt err = search.FindWildByDir( filename, aFilePath, dirlist ); 
+    
+    CCHUIDEBUG2( "ScanFileL - FindWildByDir err: %d", err );    
+    
+    if ( err == KErrNone )
+        {
+        CCHUIDEBUG2( "ScanFileL - dir list count: %d", dirlist->Count() );      
+        
+        if ( 0 < dirlist->Count() )
+            {
+            CCHUIDEBUG( "ScanFileL - Parsing full entry" );
+            
+            TParse fullentry;
+            fullentry.Set( (*dirlist)[0].iName, &search.File(), NULL ); 
+            TFileName nearestFile( fullentry.FullName() );
+            BaflUtils::NearestLanguageFile( aSession, nearestFile );   
+            fullName = HBufC::NewL( nearestFile.Length() );
+            fullName->Des().Copy( nearestFile );  
+            }
+        delete dirlist; 
+        
+        CCHUIDEBUG2( "ScanFileL - full name: %S", fullName );             
+        }     
+    
+    return fullName;
+    }  
+
+// ---------------------------------------------------------------------------
+// Resolves service name.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::GetServiceNameL( 
+    TUint aServiceId, TDes& aServiceName )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::GetServiceNameL" );	
+	CSPEntry* entry = CSPEntry::NewLC();
+	TRAPD( err, iSettings->FindEntryL( aServiceId, *entry ) );
+	if ( !err )
+	    {
+	    aServiceName = entry->GetServiceName();
+	    }
+	CleanupStack::PopAndDestroy( entry );    
+    CCHUIDEBUG( "CCCHUiNotifierBase::GetServiceNameL OUT" );
+    }
+
+// ---------------------------------------------------------------------------
+// Resolves current connection name.
+// ---------------------------------------------------------------------------
+//
+void CCCHUiNotifierBase::CurrentConnectionNameL( 
+    TUint aServiceId, TUint aIapId, RBuf& aIapName )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::CurrentConnectionNameL - IN" );    
+   
+    CCchUiNotifConnectionHandler* connHandler = 
+            CCchUiNotifConnectionHandler::NewLC();
+    
+    RBuf serviceName;
+    CleanupClosePushL( serviceName );
+    serviceName.CreateL( KServiceNameLength );
+    GetServiceNameL( aServiceId, serviceName );
+    
+    // get connection name
+    connHandler->ConnectionNameL( aIapId, serviceName, aIapName );
+    
+    CleanupStack::PopAndDestroy( &serviceName );
+    CleanupStack::PopAndDestroy( connHandler );
+    
+    CCHUIDEBUG( "CCCHUiNotifierBase::CurrentConnectionNameL - OUT" );
+    }
+    
+// ---------------------------------------------------------------------------
+// Resolves if service is SIP/VoIP.
+// ---------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierBase::IsSIPVoIPL( TUint aServiceId )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::IsSIPVoIPL" );
+    
+    TInt uid( 0 );
+    TBool sipVoIP( EFalse );
+       
+    CSPProperty* property = CSPProperty::NewLC();
+       
+    User::LeaveIfError( iSettings->FindPropertyL( 
+            aServiceId, EPropertyVoIPSubServicePluginId , *property ) );
+       
+    User::LeaveIfError( property->GetValue( uid ) );
+       
+    if ( KSipVoIPSubServicePlugId == uid )
+        {
+        sipVoIP = ETrue;
+        }
+       
+    CleanupStack::PopAndDestroy( property );
+       
+    CCHUIDEBUG2( "CCCHUiNotifierBase::IsSIPVoIPL: %d", sipVoIP );
+    
+    return sipVoIP;
+    }
+    
+// -----------------------------------------------------------------------------
+// Checks if phone is in offline mode.
+// -----------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierBase::IsPhoneOfflineL() const
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::IsPhoneOfflineL" );	
+    
+    if ( FeatureManager::FeatureSupported( KFeatureIdOfflineMode ) )
+        {
+        CRepository* repository = CRepository::NewLC(KCRUidCoreApplicationUIs);
+        TInt connAllowed = ECoreAppUIsNetworkConnectionAllowed;
+        repository->Get( KCoreAppUIsNetworkConnectionAllowed, connAllowed );
+        CleanupStack::PopAndDestroy( repository ); 
+        if ( !connAllowed )
+            {
+            CCHUIDEBUG( "IsPhoneOfflineL - phone is in offline" );	        
+            return ETrue;
+            }
+        }
+    
+    CCHUIDEBUG( "IsPhoneOfflineL - phone is not in offline" );	
+    return EFalse;
+    }    
+
+// -----------------------------------------------------------------------------
+// Checks if there are GPRS IAPs available in Internet SNAP.
+// -----------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierBase::IsGprsIapsAvailableL() const
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::IsGprsIapsAvailableL" );   
+    
+    TBool available( EFalse );
+    
+    CCchUiNotifConnectionHandler* connHandler = 
+        CCchUiNotifConnectionHandler::NewLC();
+    
+    RArray<TUint32> gprsIapIds;
+    CleanupClosePushL( gprsIapIds );
+    
+    // Array for iap names. No use here, we need just iap count.
+    CDesCArray* iapNames = new (ELeave) CDesCArrayFlat( 3 );
+    CleanupStack::PushL( iapNames );            
+    
+    TRAPD( err, connHandler->GetGprsAccessPointsL( *iapNames, gprsIapIds ) );
+    
+    if ( gprsIapIds.Count() && !err )
+        {     
+        CCHUIDEBUG( "IsGprsIapsAvailableL - gprs iaps available" );      
+        available = ETrue;
+        }
+    
+    CleanupStack::PopAndDestroy( iapNames );
+    CleanupStack::PopAndDestroy( &gprsIapIds );
+    CleanupStack::PopAndDestroy( connHandler );
+    
+    CCHUIDEBUG( "IsGprsIapsAvailableL gprs iaps not available" );
+    return available;
+    }
+
+// -----------------------------------------------------------------------------
+// Checks if connection is used by other services.
+// -----------------------------------------------------------------------------
+//
+TBool CCCHUiNotifierBase::ConnectionUsedByOthersL( 
+    TUint aServiceId, TInt aIapId )
+    {
+    CCHUIDEBUG( "CCCHUiNotifierBase::ConnectionUsedByOthersL" );
+    
+    TBool usedByOthers( EFalse );
+    
+    RArray<TUint32> destIds;
+    CleanupClosePushL( destIds );
+     
+    CCchUiNotifConnectionHandler* connHandler = 
+            CCchUiNotifConnectionHandler::NewLC();
+    
+    RBuf serviceName;
+    CleanupClosePushL( serviceName );
+    serviceName.CreateL( KServiceNameLength );
+    GetServiceNameL( aServiceId, serviceName );
+    
+    CCHUIDEBUG( "ConnectionUsedByOthersL - get destinations" );
+    
+    // Get all but our services destinations.
+    connHandler->GetDestinationsL( serviceName, destIds );
+    
+    CleanupStack::PopAndDestroy( &serviceName );
+    
+    for ( TInt i( 0 ) ; i < destIds.Count() ; i++ )
+        {
+        RArray<TUint32> iapIds;
+        CleanupClosePushL( iapIds );
+     
+        connHandler->GetAccessPointsFromSnapL( iapIds, destIds[ i ] );
+        
+        TInt index = iapIds.Find( aIapId );
+        
+        if ( KErrNotFound != index  )
+            {
+            CCHUIDEBUG( 
+            "ConnectionUsedByOthersL - iap is used by other service(s)" );
+            
+            usedByOthers = ETrue;
+            }
+        
+        CleanupStack::PopAndDestroy( &iapIds );
+        }
+     
+    CleanupStack::PopAndDestroy( connHandler );
+    CleanupStack::PopAndDestroy( &destIds );
+    
+    return usedByOthers;
+    }
+