--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sipvoipprovider/src/svpemergencyconnection.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,239 @@
+/*
+* 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: Provides connection for emergency call when necessary
+*
+*/
+
+
+
+#include <nifman.h> // For global variables
+
+#include "svpemergencyconnection.h"
+#include "svplogger.h" // For logging
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSVPEmergencyConnection
+// ---------------------------------------------------------------------------
+//
+CSVPEmergencyConnection::CSVPEmergencyConnection(
+ TPriority aPriority, MSVPEmergencyConnectionObserver& aObserver )
+ : CActive( aPriority ),
+ iObserver( aObserver )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSVPEmergencyConnection::ConstructL()
+ {
+ SVPDEBUG1("CSVPEmergencyConnection::ConstructL()")
+
+ User::LeaveIfError( iSocketServer.Connect() );
+ User::LeaveIfError( iConnection.Open( iSocketServer ) );
+ }
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CSVPEmergencyConnection* CSVPEmergencyConnection::NewL(
+ TPriority aPriority, MSVPEmergencyConnectionObserver& aObserver )
+ {
+ CSVPEmergencyConnection* self = CSVPEmergencyConnection::NewLC(
+ aPriority, aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// NewLC
+// ---------------------------------------------------------------------------
+//
+CSVPEmergencyConnection* CSVPEmergencyConnection::NewLC(
+ TPriority aPriority, MSVPEmergencyConnectionObserver& aObserver )
+ {
+ CSVPEmergencyConnection* self =
+ new( ELeave ) CSVPEmergencyConnection( aPriority, aObserver );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CSVPEmergencyConnection::~CSVPEmergencyConnection()
+ {
+ SVPDEBUG1("CSVPEmergencyConnection::~CSVPEmergencyConnection()")
+
+ Cancel();
+
+ iConnection.Close();
+ iSocketServer.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// Connects asynchronically with SNAP ID
+// ---------------------------------------------------------------------------
+//
+void CSVPEmergencyConnection::ConnectWithSnapIdL( TUint32 aSnapId )
+ {
+ SVPDEBUG2("CSVPEmergencyConnection::ConnectWithSnapIdL, ID: %d", aSnapId)
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // Start connection
+ iRequestType = ESVPSnapConnect;
+ iSnapConnPref.SetSnap( aSnapId );
+ iConnection.Start( iSnapConnPref, iStatus );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// Returns the used IAP ID of SNAP connection
+// ---------------------------------------------------------------------------
+//
+TInt CSVPEmergencyConnection::IapId( TUint32& aIapId )
+ {
+ SVPDEBUG1("CSVPEmergencyConnection::IapIdL()")
+
+ _LIT( KIapId, "IAP\\Id" );
+ TRAPD( error, iConnection.GetIntSetting( KIapId, aIapId ) )
+ return error;
+ }
+
+// ---------------------------------------------------------------------------
+// Connects with IAP ID
+// ---------------------------------------------------------------------------
+//
+void CSVPEmergencyConnection::ConnectL( TUint32 aIapId )
+ {
+ SVPDEBUG2("CSVPEmergencyConnection::ConnectL(), IAP ID: %d", aIapId)
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // Start connection
+ iRequestType = ESVPConnect;
+ iConnPref.SetIapId( aIapId );
+ iConnPref.SetDialogPreference( ECommDbDialogPrefDoNotPrompt );
+ iConnection.Start( iConnPref, iStatus );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// Requests for SIP proxy address
+// ---------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CSVPEmergencyConnection::RequestSipProxyAddressL( TUint32 aIapId )
+#else
+void CSVPEmergencyConnection::RequestSipProxyAddressL( TUint32 /*aIapId*/ )
+#endif // __DEBUG
+ {
+ SVPDEBUG2("CSVPEmergencyConnection::RequestSipProxyAddressL(),\
+ IAP ID: %d", aIapId)
+
+ if ( IsActive() )
+ {
+ User::Leave( KErrInUse );
+ }
+
+ // Request SIP proxy address
+ iRequestType = ESVPSipProxyAddress;
+ iSipServerAddrBuf().index = 0;
+ iConnection.Ioctl(
+ KCOLConfiguration,
+ KConnGetSipServerAddr, // DHCP option 120
+ iStatus,
+ &iSipServerAddrBuf );
+ SetActive();
+ }
+
+// ---------------------------------------------------------------------------
+// From class CSVPEmergencyConnection.
+// DoCancel
+// ---------------------------------------------------------------------------
+//
+void CSVPEmergencyConnection::DoCancel()
+ {
+ SVPDEBUG1("CSVPEmergencyConnection::DoCancel()")
+
+ iRequestType = ESVPNone;
+ iConnection.CancelIoctl();
+ iConnection.Close();
+ }
+
+// ---------------------------------------------------------------------------
+// From class CActive.
+// RunL
+// ---------------------------------------------------------------------------
+//
+void CSVPEmergencyConnection::RunL()
+ {
+ TInt error = iStatus.Int();
+ SVPDEBUG2("CSVPEmergencyConnection::RunL(), error: %d", error)
+
+ if ( error )
+ {
+ iRequestType = ESVPNone;
+ iObserver.ConnectionError( error );
+ return;
+ }
+
+ switch ( iRequestType )
+ {
+ case ESVPSnapConnect:
+ iRequestType = ESVPNone;
+ iObserver.SnapConnected();
+ break;
+
+ case ESVPConnect:
+ iRequestType = ESVPNone;
+ iObserver.Connected();
+ break;
+
+ case ESVPSipProxyAddress:
+ {
+ iRequestType = ESVPNone;
+
+ // Copy SIP proxy address in dotted-decimal notation
+ HBufC16* sipProxyAddrBuf = HBufC16::NewLC( 39 ); // CS:1
+ TPtr16 sipProxyAddrPtr = sipProxyAddrBuf->Des();
+ iSipServerAddrBuf().address.Output( sipProxyAddrPtr );
+
+ // Call observer
+ iObserver.SipProxyAddressReady( *sipProxyAddrBuf );
+ CleanupStack::PopAndDestroy( sipProxyAddrBuf ); // CS:0
+ break;
+ }
+
+ default:
+ iRequestType = ESVPNone;
+ iObserver.ConnectionError( KErrGeneral );
+ break;
+ }
+ }