diff -r 000000000000 -r 5a93021fdf25 alwayson_net_plugin/pdpcontextmanager2/src/caoconnectionimplstub.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alwayson_net_plugin/pdpcontextmanager2/src/caoconnectionimplstub.cpp Thu Dec 17 08:55:21 2009 +0200 @@ -0,0 +1,624 @@ +/* +* Copyright (c) 2004,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: Implements the CAOConnectionImpl class +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include "caoconnectionimplstub.h" +#include "logger.h" +#include "maoconnectionobserver.h" +#include "pdpcontextmanagerinternalpskeys.h" +#include "caoasyncwrapper.h" + +// UNNAMED NAMESPACE FOR LOCAL DEFINITIONS +namespace + { + // CONSTANTS + _LIT( KPanicCat, "ConnImplStub" ); + const TInt KDelay = 2000000; // 2 seconds + + // DATA TYPES + enum TPanicReason + { + EAlreadyConnected, + ENotActive, + EInvalidState + }; + + // LOCAL FUNCTIONS + LOCAL_C void Panic( TPanicReason aReason ) + { + User::Panic( KPanicCat, aReason ); + } + } + +// METHODS + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CAOConnectionImpl* CAOConnectionImpl::NewL( + MAOConnectionObserver& aObserver, + MAOSettings& aSettings, + RSocketServ* aSocketServ ) + { + LOG_1( _L("CAOConnectionImpl::NewL") ); + + CAOConnectionImpl* self = new( ELeave ) CAOConnectionImpl( + aObserver, + aSettings, + aSocketServ ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); // self + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CAOConnectionImpl::~CAOConnectionImpl() + { + LOG_1( _L("CAOConnectionImpl::~CAOConnectionImpl") ); + + Cancel(); + delete iConnectionTimer; + + delete iPDPContextActivationSubscriber; + iPDPContextActivationProperty.Delete( + KConnectionCat, + KPDPContextActivation ); + iPDPContextActivationProperty.Close(); + + delete iPDPContextDisconnectionSubscriber; + iPDPContextDisconnectionProperty.Delete( + KConnectionCat, + KPDPContextDisconnection ); + iPDPContextDisconnectionProperty.Close(); + } + + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::ActivateConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::ActivateConnection() + { + LOG_1( _L("CAOConnectionImpl::ActivateConnection") ); + + __ASSERT_DEBUG( !IsActive() && iState == EDisconnected, + Panic( EAlreadyConnected ) ); + + // Change state -> EOpeningLink + ChangeState( EOpeningLink ); + + // Activate connection + DoActivateConnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::AttachToExistingConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::AttachToExistingConnection( TUint /*aConnectionId*/ ) + { + LOG_1( _L("CAOConnectionImpl::AttachToExistingConnection") ); + + __ASSERT_DEBUG( !IsActive() && iState == EDisconnected, + Panic( EAlreadyConnected ) ); + + // Change state -> EAttachingExistingConnection + ChangeState( EAttachingExistingConnection ); + + // Activate connection + DoActivateConnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::CancelConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::CancelConnection() + { + LOG_1( _L("CAOConnectionImpl::CancelConnection") ); + + Cancel(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::IsConnectedToDefaultIAP +// --------------------------------------------------------------------------- +// +TBool CAOConnectionImpl::IsConnectedToDefaultIAP() + { + LOG_1( _L("CAOConnectionImpl::IsConnectedToDefaultIAP") ); + + return iState != EDisconnected; + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::NumberOfConnections +// --------------------------------------------------------------------------- +// +TInt CAOConnectionImpl::NumberOfConnections() + { + LOG_1( _L("CAOConnectionImpl::NumberOfConnections") ); + + return 0; + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CAOConnectionImpl::CAOConnectionImpl( + MAOConnectionObserver& aObserver, + MAOSettings& aSettings, + RSocketServ* aSocketServ ): + CActive( CActive::EPriorityStandard ), + iObserver( aObserver ), + iSettings( aSettings ), + iSocketServ( aSocketServ ) + { + LOG_1( _L("CAOConnectionImpl::CAOConnectionImpl") ); + + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Symbian 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::ConstructL() + { + LOG_1( _L("CAOConnectionImpl::ConstructL") ); + + iConnectionTimer = CPeriodic::NewL( CActive::EPriorityStandard ); + + // Define PDP context activation property + User::LeaveIfError( iPDPContextActivationProperty.Define( + KConnectionCat, + KPDPContextActivation, + RProperty::EInt ) ); + User::LeaveIfError( iPDPContextActivationProperty.Attach( + KConnectionCat, + KPDPContextActivation ) ); + iPDPContextActivationSubscriber = + CAOAsyncWrapper::NewL( + this, + PDPContextActivationIssueRequest, + PDPContextActivationRunL, + PDPContextActivationDoCancel, + NULL ); + SubscribePDPContextActivation(); + + // Define PDP context activation property + User::LeaveIfError( iPDPContextDisconnectionProperty.Define( + KConnectionCat, + KPDPContextDisconnection, + RProperty::EInt ) ); + User::LeaveIfError( iPDPContextDisconnectionProperty.Attach( + KConnectionCat, + KPDPContextDisconnection ) ); + iPDPContextDisconnectionSubscriber = + CAOAsyncWrapper::NewL( + this, + PDPContextDisconnectionIssueRequest, + PDPContextDisconnectionRunL, + PDPContextDisconnectionDoCancel, + NULL ); + SubscribePDPContextDisconnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::ChangeState +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::ChangeState( TInternalState aNewState ) + { + TInternalState old = iState; + iState = aNewState; + LOG_3( _L("CAOConnectionImpl::ChangeState >> Changing state %d -> %d"), + old, iState ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::CompleteSelf +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::CompleteSelf( TRequestStatus& aStatus, TInt aReason ) + { + LOG_2( _L("CAOConnectionImpl::CompleteSelf: aReason: %d"), aReason ); + + __ASSERT_DEBUG( IsActive(), Panic( ENotActive ) ); + + aStatus = KRequestPending; + TRequestStatus* status = &aStatus; + User::RequestComplete( status, aReason ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::ConnectionCallBack +// --------------------------------------------------------------------------- +// +TInt CAOConnectionImpl::ConnectionCallBack( TAny* aSelf ) + { + LOG_1( _L("CAOConnectionImpl::ConnectionCallBack") ); + + CAOConnectionImpl* self = static_cast( aSelf ); + TRAPD( err, self->HandleConnectionCallBackL() ); + + return err; + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::HandleConnectionCallBackL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::HandleConnectionCallBackL() + { + LOG_1( _L("CAOConnectionImpl::HandleConnectionCallBackL") ); + + iConnectionTimer->Cancel(); + CompleteSelf( iStatus, iActivationError ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::DoActivateConnection +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::DoActivateConnection() + { + LOG_1( _L("CAOConnectionImpl::DoActivateConnection") ); + + TCallBack cb( ConnectionCallBack, this ); + iConnectionTimer->Start( KDelay, KDelay, cb ); + iStatus = KRequestPending; + SetActive(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::HandleOpeningLinkL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::HandleOpeningLinkL( TInt aStatus ) + { + LOG_2( _L("CAOConnectionImpl::HandleOpeningLinkL: aStatus: %d"), + aStatus ); + + if ( aStatus == KErrNone ) + { + // Everything ok - Link opened + BroadcastPDPContextActivatedL(); + } + else + { + // Report error + BroadcastPDPContextActivationFailureL( aStatus ); + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::FailureReason +// --------------------------------------------------------------------------- +// +MAOConnectionManager::TFailureReason CAOConnectionImpl::FailureReason( + TInt aError ) + { + LOG_2( _L("CAOConnectionImpl::FailureReason: aError: %d"), aError ); + + // Determine error cause + MAOConnectionManager::TFailureReason reason = + MAOConnectionManager::EPermanent; + switch ( aError ) + { + // Temporary cause + case KErrGprsUserAuthenticationFailure: + case KErrGprsActivationRejectedByGGSN: + case KErrGprsActivationRejected: + case KErrGprsServiceOptionTemporarilyOutOfOrder: + { + reason = MAOConnectionManager::ETemporary; + break; + } + // Permanent cause + default: + { + reason = MAOConnectionManager::EPermanent; + break; + } + } + + LOG_2( _L("CAOConnectionImpl::FailureReason: Reason: %d"), reason ); + + return reason; + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::HandleListeningAccessPointL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::HandleListeningAccessPointL( TInt aStatus ) + { + LOG_2( _L("CAOConnectionImpl::HandleListeningAccessPointL: aStatus: %d"), + aStatus ); + + if ( aStatus == KErrNone ) + { + // Everything ok - Continue listening + iStatus = KRequestPending; + SetActive(); + } + else + { + // Report error + BroadcastPDPContextDisconnectionL( aStatus ); + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::BroadcastPDPContextActivationFailureL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::BroadcastPDPContextActivationFailureL( TInt aError ) + { + LOG_2( _L("CAOConnectionImpl::BroadcastPDPContextActivationFailureL: \ + aError: %d"), aError ); + + ChangeState( EDisconnected ); + iObserver.HandlePDPContextActivationFailedL( + FailureReason( aError ) ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::BroadcastPDPContextActivationFailureL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::BroadcastPDPContextDisconnectionL( TInt aError ) + { + LOG_2( _L("CAOConnectionImpl::BroadcastPDPContextDisconnectionL: \ + aError: %d"), aError ); + + ChangeState( EDisconnected ); + iObserver.HandlePDPContextDisconnectedL( + MAOConnectionManager::ETemporary ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::HandleAttachingExistingConnectionL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::HandleAttachingExistingConnectionL( TInt aStatus ) + { + LOG_2( _L("CAOConnectionImpl::HandleAttachingExistingConnectionL:\ + aStatus: %d"), aStatus ); + + if ( aStatus == KErrNone ) + { + // Broadcast PDP context activated + BroadcastPDPContextActivatedL(); + } + else + { + // Report error + BroadcastPDPContextActivationFailureL( aStatus ); + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::SubscribePDPContextActivation +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::SubscribePDPContextActivation() + { + LOG_1( _L("CAOConnectionImpl::SubscribePDPContextActivation") ); + + iPDPContextActivationSubscriber->IssueRequest(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextActivationIssueRequest +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextActivationIssueRequest( + TRequestStatus& aStatus ) + { + LOG_1( _L("CAOConnectionImpl::PDPContextActivationIssueRequest") ); + + iPDPContextActivationProperty.Subscribe( aStatus ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextActivationRunL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextActivationRunL( TInt aStatus ) + { + LOG_1( _L("CAOConnectionImpl::PDPContextActivationIssueRequest") ); + + if ( aStatus == KErrNone ) + { + TInt value = 0; + TInt err = iPDPContextActivationProperty.Get( value ); + if ( err == KErrNone ) + { + iActivationError = value; + if ( IsActive() && + ( iState == EOpeningLink || + iState == EAttachingExistingConnection ) ) + { + CompleteSelf( iStatus, iActivationError ); + } + } + } + SubscribePDPContextActivation(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextActivationDoCancel +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextActivationDoCancel() + { + LOG_1( _L("CAOConnectionImpl::PDPContextActivationDoCancel") ); + + iPDPContextActivationProperty.Cancel(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::SubscribePDPContextDisconnection +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::SubscribePDPContextDisconnection() + { + LOG_1( _L("CAOConnectionImpl::SubscribePDPContextDisconnection") ); + + iPDPContextDisconnectionSubscriber->IssueRequest(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextDisconnectionIssueRequest +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextDisconnectionIssueRequest( + TRequestStatus& aStatus ) + { + LOG_1( _L("CAOConnectionImpl::PDPContextDisconnectionIssueRequest") ); + + iPDPContextDisconnectionProperty.Subscribe( aStatus ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextDisconnectionRunL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextDisconnectionRunL( TInt aStatus ) + { + LOG_2( _L("CAOConnectionImpl::PDPContextDisconnectionRunL: aStatus: %d"), + aStatus ); + + if ( aStatus == KErrNone ) + { + TInt value = 0; + TInt err = iPDPContextDisconnectionProperty.Get( value ); + if ( err == KErrNone ) + { + iDisconnectionError = value; + if ( IsActive() && iState == EListeningAccessPoint ) + { + CompleteSelf( iStatus, iDisconnectionError ); + } + } + } + SubscribePDPContextDisconnection(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::PDPContextDisconnectionDoCancel +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::PDPContextDisconnectionDoCancel() + { + LOG_1( _L("CAOConnectionImpl::PDPContextDisconnectionIssueRequest") ); + + iPDPContextDisconnectionProperty.Cancel(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::BroadcastPDPContextActivatedL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::BroadcastPDPContextActivatedL() + { + LOG_1( _L("CAOConnectionImpl::BroadcastPDPContextActivatedL") ); + + ChangeState( EListeningAccessPoint ); + iStatus = KRequestPending; + SetActive(); + iObserver.HandlePDPContextActivatedL(); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::RunL +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::RunL() + { + LOG_2( _L("CAOConnectionImpl::RunL: iStatus: %d"), iStatus.Int() ); + + TInt status = iStatus.Int(); + switch ( iState ) + { + case EDisconnected: + { + // Nothing to do + break; + } + case EOpeningLink: + { + HandleOpeningLinkL( status ); + break; + } + case EListeningAccessPoint: + { + HandleListeningAccessPointL( status ); + break; + } + case EAttachingExistingConnection: + { + HandleAttachingExistingConnectionL( status ); + break; + } + default: + { + // Should not be here + Panic( EInvalidState ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::DoCancel +// --------------------------------------------------------------------------- +// +void CAOConnectionImpl::DoCancel() + { + LOG_1( _L("CAOConnectionImpl::DoCancel") ); + + ChangeState( EDisconnected ); + CompleteSelf( iStatus, KErrCancel ); + } + +// --------------------------------------------------------------------------- +// CAOConnectionImpl::RunError +// --------------------------------------------------------------------------- +// +TInt CAOConnectionImpl::RunError( TInt aError ) + { + LOG_1( _L("CAOConnectionImpl::RunError") ); + + return aError; + } +