diff -r 000000000000 -r a4daefaec16c sipvoipprovider/src/svpemergencyconnection.cpp --- /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 // 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; + } + }