diff -r 000000000000 -r c8caa15ef882 simpleengine/engine/src/simpleconnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpleengine/engine/src/simpleconnection.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,308 @@ +/* +* Copyright (c) 2006 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: Simple Engine +* +*/ + + + + +// INCLUDE FILES + +#include + +// own simple +#include "simplesipconnection.h" +#include "simplecommon.h" +#include "simpleenginerequest.h" +#include "msimpleconnectionobserver.h" +#include "simpleconnection.h" +#include "simpleengineutils.h" +#include "msimpleenginerequest.h" + +#ifdef _DEBUG +#include "simpledebugutils.h" +#endif + + +// ================= MEMBER FUNCTIONS ======================= +// + +// ---------------------------------------------------------- +// CSimpleConnection::CSimpleConnection +// ---------------------------------------------------------- +// +CSimpleConnection::CSimpleConnection( MSimpleConnectionObserver& aObserver ) +: iState( EInactive ), + iObserver( aObserver ), + iOpId(0), + iRequestList( CSimpleEngineRequest::LinkOffset()) + { + } + +// ---------------------------------------------------------- +// CSimpleConnection::~CSimpleConnection +// ---------------------------------------------------------- +// +CSimpleConnection::~CSimpleConnection() + { + delete iConnection; + DeleteRequests(); + } + +// ---------------------------------------------------------- +// CSimpleConnection::ConstructL +// ---------------------------------------------------------- +// +void CSimpleConnection::ConstructL( TInt32 aServiceId ) + { + // Create CSimpleSipConnection entity in simplesiputils.dll + iConnection = CSimpleSipConnection::NewL(); + // Set operation id ranges + iLimitLowerValue = TSimpleEngineUtils::OpIdRange(); + iLimitUpperValue = iLimitLowerValue + KRangeSize; + iOpId = iLimitLowerValue; + + // start to listen to status events + IncreaseOpId(); + CSimpleEngineRequest* req = CSimpleEngineRequest::NewL( + *this, MSimpleEngineRequest::EListenEvents, iOpId ); + CleanupStack::PushL( req ); + if ( aServiceId ) + { + iConnection->SetServiceId( aServiceId ); + } + iConnection->DispatchReqL( *req ); + iRequestList.AddLast( *req ); + CleanupStack::Pop( req ); + } + +// ---------------------------------------------------------- +// CSimpleConnection::NewL +// ---------------------------------------------------------- +// +CSimpleConnection* CSimpleConnection::NewL( + MSimpleConnectionObserver& aObserver ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: NewL" )); +#endif + CSimpleConnection* self = new (ELeave) CSimpleConnection( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( NULL ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CSimpleConnection::NewL +// ---------------------------------------------------------- +// +CSimpleConnection* CSimpleConnection::NewL( + MSimpleConnectionObserver& aObserver, TInt32 aServiceId ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: NewL" )); +#endif + CSimpleConnection* self = new (ELeave) CSimpleConnection( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL( aServiceId ); + CleanupStack::Pop( self ); + return self; + } + +// ---------------------------------------------------------- +// CSimpleConnection::Connection +// ---------------------------------------------------------- +// +CSimpleSipConnection* CSimpleConnection::Connection() + { + return iConnection; + } + +// ---------------------------------------------------------- +// CSimpleConnection::Close +// ---------------------------------------------------------- +// +void CSimpleConnection::Close( ) + { + delete this; + } + +// ---------------------------------------------------------- +// CSimpleConnection::LoginL +// ---------------------------------------------------------- +// +TInt CSimpleConnection::LoginL( ) + { + return LoginL( 0 ); + } + +// ---------------------------------------------------------- +// CSimpleConnection::LoginL +// ---------------------------------------------------------- +// +TInt CSimpleConnection::LoginL( TInt aId ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: LoginL aId=%d" ), aId); +#endif + // check state + if ( iState != EInactive ) + { + User::Leave(KErrNotReady); + } + + IncreaseOpId(); + + CSimpleEngineRequest* req = CSimpleEngineRequest::NewL( + *this, MSimpleEngineRequest::ERegister, iOpId ); + req->SetAux( aId ); + CleanupStack::PushL( req ); + iConnection->DispatchReqL( *req ); + iRequestList.AddLast( *req ); + CleanupStack::Pop( req ); + SetConnectionStatus( EIdle ); + return iOpId; + } + +// ---------------------------------------------------------- +// CSimpleConnection::ConnectionStatus +// ---------------------------------------------------------- +// +MSimpleConnection::TSimpleState CSimpleConnection::ConnectionStatus() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: ConnectionStatus returns %d" ), iState); +#endif + return iState; + } + +// ---------------------------------------------------------- +// CSimpleConnection::CurrentSIPIdentityL +// ---------------------------------------------------------- +// +TPtrC8 CSimpleConnection::CurrentSIPIdentityL() + { + return iConnection->CurrentSIPIdentityL(); + } + +// ---------------------------------------------------------- +// CSimpleConnection::Complete +// ---------------------------------------------------------- +// +void CSimpleConnection::Complete( + TInt aOpId, TInt aStatus, MSimpleEngineRequest& aReq ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: Complete opid=%d status=%d" ), + aOpId, aStatus ); +#endif + // check the SIP state from another DLL + TSimpleSipState st = iConnection->SIPState(); + MSimpleConnection::TSimpleState oldState = ConnectionStatus(); + MSimpleConnection::TSimpleState newState = ConvertState( st ); + SetConnectionStatus( newState ); + + if ( aReq.RequestType() != MSimpleEngineRequest::EListenEvents ) + { + // delete corresponding request from another DLL too. + aReq.ModifyType( MSimpleEngineRequest::EDestroy ); + TRAP_IGNORE( iConnection->DispatchReqL( aReq )); + // delete request from this DLL. + aReq.Destroy(); +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: call RequestCompleteL opid=%d status=%d" ), + aOpId, aStatus ); +#endif + TRAP_IGNORE( iObserver.RequestCompleteL( aOpId, aStatus ) ); + } + else + { + // This is status event + if ( oldState != newState ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: call ConnectionStatusL state=%d" ), + newState ); +#endif + TRAP_IGNORE( iObserver.ConnectionStatusL( newState ) ); + } + } + } + +// ----------------------------------------------------------------------------- +// CSimpleConnection::DeleteRequests +// ----------------------------------------------------------------------------- +void CSimpleConnection::DeleteRequests() + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: DeleteRequests" )); +#endif + // Delete all buffered transaction requests + TDblQueIter rIter( iRequestList ); + rIter.SetToFirst(); + + while ( rIter ) + { + CSimpleEngineRequest* req = rIter; + rIter++; //lint !e1757 + req->Destroy(); + } + } + +// ---------------------------------------------------------------------------- +// CSimpleConnection::IncreaseOpId +// ---------------------------------------------------------------------------- +void CSimpleConnection::IncreaseOpId( ) + { + iOpId++; + if( iOpId >= iLimitUpperValue ) + { + iOpId = iLimitLowerValue; + } + } + +// ---------------------------------------------------------------------------- +// CSimpleConnection::ConvertState +// ---------------------------------------------------------------------------- +MSimpleConnection::TSimpleState CSimpleConnection::ConvertState( TSimpleSipState aState ) + { + switch( aState ) + { + case ESimpleSipIdle: + return MSimpleConnection::EIdle; + case ESimpleSipActive: + return MSimpleConnection::EActive; + case ESimpleSipSuspend: + return ESuspend; + case ESimpleSipInactive: + return EInactive; + case ESimpleSipUnavailable: + default: + return EUnavailable; + }; //lint !e960 + } + +// ---------------------------------------------------------------------------- +// CSimpleConnection::SetConnectionStatus +// ---------------------------------------------------------------------------- +void CSimpleConnection::SetConnectionStatus( TSimpleState aState ) + { +#ifdef _DEBUG + TSimpleLogger::Log(_L("SimpleConnection: SetConnectionStatus %d" ), aState ); +#endif + iState = aState; + } +