mmsharing/mmshavailability/src/musavaconnectionmonitor.cpp
changeset 22 496ad160a278
parent 0 f0cf47e981f9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavaconnectionmonitor.cpp	Fri Jun 11 13:36:18 2010 +0300
@@ -0,0 +1,345 @@
+/*
+* Copyright (c) 2005-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:   Provide interface for the client requestin availability class.
+*
+*/
+
+
+
+#include "musavaconnectionmonitor.h"
+#include "musavasettingsimp.h"
+#include "musavanetworkavailability.h"
+#include "musavaobserver.h"
+#include "musavaavailability.h"
+#include "musavasharedobject.h"
+#include "musavaconnectionmonitorobserver.h"
+#include "musavasip.h"
+#include "muslogger.h"
+
+#include <e32base.h>
+#include <sipprofile.h>
+#include <mmtsy_names.h>
+
+// -------------------------------------------------------------------------
+//  Two-phased constructor.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionMonitor* CMusAvaConnectionMonitor::NewL( 
+                                        CMusAvaSharedObject& aSharedObject )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::NewL()" )
+    CMusAvaConnectionMonitor* self = 
+        new( ELeave ) CMusAvaConnectionMonitor( aSharedObject );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::NewL()" )
+    return self;
+    }
+
+
+// -------------------------------------------------------------------------
+//  Destructor.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionMonitor::~CMusAvaConnectionMonitor()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::\
+        ~CMusAvaConnectionMonitor()" )
+    iConnectionMonitorObserver.Reset();
+    iConnectionMonitorObserver.Close();
+    // Close the monitor when event notifications are no longer required
+    iConnectionMonitor.Close();
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::\
+        ~CMusAvaConnectionMonitor()" )
+    }
+
+// -------------------------------------------------------------------------
+//  Constructor function.
+// -------------------------------------------------------------------------
+//
+void CMusAvaConnectionMonitor::EventL(const CConnMonEventBase& aConnMonEvent)
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::EventL()" )
+    TUint connectionId = aConnMonEvent.ConnectionId();
+    TInt eventType = aConnMonEvent.EventType();
+    MUS_LOG1( "Connection ID = %d", connectionId )
+    MUS_LOG1( "Event type = %d", eventType )
+
+    for( TInt i=0; i<iConnectionMonitorObserver.Count(); i++ )
+        {
+        iConnectionMonitorObserver[i]->EventL( aConnMonEvent );
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::EventL()" )
+    }
+
+
+// -------------------------------------------------------------------------
+//  Constructor function.
+// -------------------------------------------------------------------------
+//
+CMusAvaConnectionMonitor::CMusAvaConnectionMonitor( 
+                                        CMusAvaSharedObject& aSharedObject ):
+iSharedObj( &aSharedObject )
+    {
+    }
+
+// -------------------------------------------------------------------------
+//  Second phase constructor.
+// -------------------------------------------------------------------------
+//
+void CMusAvaConnectionMonitor::ConstructL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::ConstructL()" )
+    User::LeaveIfError( iConnectionMonitor.ConnectL() );
+
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::ConstructL()" )
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaConnectionMonitor::AddAdapterL( 
+                                    MMusAvaConnectionMonitorObserver& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::\
+             AddAdapterL( MMusAvaConnectionMonitorObserver& aAdapter )" )
+    iConnectionMonitorObserver.AppendL( &aAdapter );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             AddAdapterL( MMusAvaConnectionMonitorObserver& aAdapter )" )
+    }
+
+// -------------------------------------------------------------------------
+// Created connection ID for multimedia sharing is returned
+// -------------------------------------------------------------------------
+//
+TUint CMusAvaConnectionMonitor::CreatedConnectionID()
+    {
+    return iConnectionID;
+    }
+
+// -------------------------------------------------------------------------
+// Connection ID is stored
+// -------------------------------------------------------------------------
+//
+void CMusAvaConnectionMonitor::SetConnectionID( TUint aConnectionID )
+    {
+    iConnectionID = aConnectionID;
+    }
+// -------------------------------------------------------------------------
+// Active connection ID for multimedia sharing is returned
+// -------------------------------------------------------------------------
+//
+TUint CMusAvaConnectionMonitor::ConnectionIDL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::ConnectionIDL()" )
+    TUint iap =  0; //Internet acces point
+    TUint sipIap =  0;  //SIP acces point
+    TUint count = 0;    //Number of connections
+    TUint id = 0;   //Connection ID
+    TUint activeIapID = 0;   //Connection ID for active SIP IAP
+    TUint subId = 0;    //SubconnectionID
+    TUint subCount; //Subconnectioncount
+    TRequestStatus status;
+
+    //Fetch number of connections to count
+    count = ConnectionCount();
+    if ( count == 0 )
+        {
+        MUS_LOG( "mus: [MUSAVA] Non connections" )
+        }
+    else
+        {
+        MUS_LOG1( "mus: [MUSAVA] Fetch number of connections: %d", count )
+
+        //Fetch internet access point to iap
+        sipIap =  MultimediaSharingAccessPointID();
+        if ( sipIap == 0 )
+            {
+            MUS_LOG( "mus: [MUSAVA] Non Access Point ID's for app" )
+            }
+        else
+            {
+            MUS_LOG1( "mus: [MUSAVA] Internet access point for sip: %d", 
+                                                                sipIap )
+    
+            TBool goOn = ETrue;
+            for ( TUint i = 1; i <= count && goOn; i++ )
+                {
+                //Fetch connectionId to id
+                User::LeaveIfError(iConnectionMonitor.GetConnectionInfo( 
+                                                            i, id, subCount ));
+                MUS_LOG1( "mus: [MUSAVA] Connection ID = %d", id )
+    
+                //Fetch internet access point to iap
+                iConnectionMonitor.GetUintAttribute( id, subId, KIAPId, 
+                                                iap, status );
+                #ifndef UNIT_TESTING
+                User::WaitForRequest( status );
+                #endif
+                MUS_LOG1( "mus: [MUSAVA] Internet access point %d ", iap )
+    
+                // when correct Iap found ...
+                if( iap == sipIap )
+                    {
+                    MUS_LOG( "mus: [MUSAVA]  Connection ID found" )
+                    activeIapID = id;
+                    goOn = EFalse;
+                    }
+                }
+            
+            }
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::ConnectionIDL()" )
+    return activeIapID;
+    }
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+TBool CMusAvaConnectionMonitor::KillPdpContext()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::KillPdpContext" )
+
+    TUint connId = 0;
+    TUint subConnectionCount = 0;
+    TRequestStatus requestStatus;
+    TUint count = ConnectionCount();
+    TInt ret = 0;
+    TBool retval = EFalse;
+    
+    for ( TUint i = 1; i <= count && !retval; i++ )
+        {
+        TInt bearerType = 0;
+        iConnectionMonitor.GetIntAttribute( connId,
+                                     subConnectionCount,
+                                     KBearer,
+                                     bearerType,
+                                     requestStatus );
+        User::WaitForRequest( requestStatus );
+        if ( bearerType == EBearerCSD      ||
+             bearerType == EBearerHSCSD    ||
+             bearerType == EBearerGPRS     ||
+             bearerType == EBearerEdgeGPRS ||
+             bearerType == EBearerWCDMA    ||
+             bearerType == EBearerWcdmaCSD )
+            {
+            MUS_LOG1( "mus: [MUSAVA] now killing connection whose connId \
+                == <%d>", connId )
+            ret = iConnectionMonitor.GetConnectionInfo( i, connId, 
+                                                    subConnectionCount );
+            if ( ret == KErrNone )
+                {
+                ret = iConnectionMonitor.SetBoolAttribute( connId, 0, 
+                                                    KConnectionStop, ETrue );
+                if ( ret == KErrNone )
+                    {
+                    retval = ETrue;
+                    }
+                }
+            }
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::KillPdpContext" )
+    return retval;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaConnectionMonitor::RemoveAdapter( 
+                                    MMusAvaConnectionMonitorObserver& aAdapter )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::\
+             RemoveAdapter( MMusAvaConnectionMonitorObserver& aAdapter )" )
+    TInt index = iConnectionMonitorObserver.Find( &aAdapter );
+
+    if( index != KErrNotFound )
+        {
+        iConnectionMonitorObserver.Remove( index );
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaSip::\
+             RemoveAdapter( MMusAvaConnectionMonitorObserver& aAdapter )" )
+    }
+    
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaConnectionMonitor::NotifyEventL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::NotifyEventL()" )
+    iConnectionMonitor.NotifyEventL( *this );
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::NotifyEventL()" )
+    }
+
+// -------------------------------------------------------------------------
+//  Active connection count for multimedia sharing is returned
+// -------------------------------------------------------------------------
+//
+TUint CMusAvaConnectionMonitor::ConnectionCount()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::ConnectionCount()" )
+    TUint          count = (TUint) KErrNotFound;
+    TRequestStatus status;
+
+    iConnectionMonitor.GetConnectionCount( count, status );
+    #ifndef UNIT_TESTING
+    User::WaitForRequest( status );
+    #endif
+    if ( status.Int() != KErrNone )
+        {
+        MUS_LOG( "mus: [MUSAVA]  Phone doesn't have any active connections" )
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::ConnectionCount()" )
+    return count;
+    }
+
+// -------------------------------------------------------------------------
+// Active Internet Access Point ID for multimedia sharing is returned
+// -------------------------------------------------------------------------
+//
+TUint CMusAvaConnectionMonitor::MultimediaSharingAccessPointID()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaConnectionMonitor::\
+        MultimediaSharingAccessPointID()" )
+    TUint retval = KErrNone;
+    TBool profileCreated = EFalse;
+    TRAPD( err, profileCreated = iSharedObj->MusAvaSip().CreateProfileL() );
+    if ( err || !profileCreated )
+        {
+        retval = (TUint)KErrNotFound;
+        }
+	else
+		{
+        CSIPProfile* profile = iSharedObj->MusAvaSip().Profile();
+        // Get IAP ID
+        MUS_LOG( "mus: [MUSAVA]  Get IAP ID" )
+    
+        TInt ret = profile->GetParameter( KSIPAccessPointId, iProfileId );
+        if( ret )
+            {
+            MUS_LOG( "mus: [MUSAVA]  IAP ID is not found" )
+            MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::\
+            MultimediaSharingAccessPointID()" )
+            retval = (TUint)ret;
+            }
+		else
+			{
+	        MUS_LOG1( "mus: [MUSAVA]     IAP ID = %d", iProfileId )
+			retval = iProfileId;
+			}        
+        }
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaConnectionMonitor::\
+        MultimediaSharingAccessPointID()" )
+    return retval;
+    }