diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/ProxyResolver/src/CProxyResolveActor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/ProxyResolver/src/CProxyResolveActor.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,289 @@ +// Copyright (c) 2004-2009 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: +// Name : CProxyResolveActor.cpp +// Part of : ProxyResolver +// Version : SIP/4.0 +// + + + +#include "CProxyResolveActor.h" +#include "CProxyResolvingQueue.h" +#include "CProxyQuery.h" +#include + + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::NewL +// ----------------------------------------------------------------------------- +// +CProxyResolveActor* CProxyResolveActor::NewL() + { + CProxyResolveActor* self = CProxyResolveActor::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::NewLC +// ----------------------------------------------------------------------------- +// +CProxyResolveActor* CProxyResolveActor::NewLC() + { + CProxyResolveActor* self = new( ELeave )CProxyResolveActor(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::~CProxyResolveActor +// ----------------------------------------------------------------------------- +// +CProxyResolveActor::~CProxyResolveActor() + { + Cancel(); + if ( iCurrentQuery ) + { + delete iCurrentQuery; + } + delete iRequestQueue; + // close socket server + iServer.Close(); + + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::ConstructL +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::ConstructL () + { + iRequestQueue = CProxyResolvingQueue::NewL(); + // connect the socket server + User::LeaveIfError( iServer.Connect() ); + } + + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::CProxyResolveActor +// ----------------------------------------------------------------------------- +// +CProxyResolveActor::CProxyResolveActor() + : CActive( EPriorityStandard ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::ResolveProxyL +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::ResolveProxyL( TUint& aRequestId, + TUint32 aIapId, + MSIPProxyResolverObserver& aObserver ) + { + CProxyQuery* query = CProxyQuery::NewL( iRequestQueue->NextRequestId(), + aIapId, aObserver, *this, + iServer ); + + // add the query to the queue + iRequestQueue->AddQuery( *query ); + + // and return the ID to the user + aRequestId = query->RequestId(); + } + + +// ----------------------------------------------------------------------------- +// void CProxyResolveActor::ConnectionReady(CProxyQuery* aQuery) +// +// Callback from CProxyQuery, indicating that opening RConnection for +// this query is successful and completed +// +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::ConnectionReady( CProxyQuery* aQuery ) + { + if( !IsActive() ) + { + iCurrentQuery = aQuery; + // detach this query from the queue (but do not delete) + iRequestQueue->DetachByRequestId( aQuery->RequestId() ); + // perform the actual query + PerformDHCPQuery(); + } + } + +// ----------------------------------------------------------------------------- +// void CProxyResolveActor::PerformDHCPQuery() +// +// Perform the actual DHCP query using RConnection API call (Ioctl) +// +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::PerformDHCPQuery() + { + if ( iCurrentQuery && !IsActive() ) + { + //Make sure that the connection has been opened for this Query object + if (iCurrentQuery->ConnectionOpened()) + { + iCurrentQuery->Connection().Ioctl( KCOLConfiguration, + iCurrentQuery->CurrentQueryType(), + iStatus, + iCurrentQuery->GetBuf() ); + SetActive(); + } + } + } + + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::RunL +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::RunL() + { + TInt err = iStatus.Int(); + + switch( err ) + { + case KErrNone: + { + // store results of this query + iCurrentQuery->AddResultsL(); + //make a new query (SIP addresses or domain names) + iCurrentQuery->SetNextIndex(); + PerformDHCPQuery(); + return; + } + + case KErrCancel: // ignore the cancel error code + break; + + default: + { + if ( iCurrentQuery->CurrentQueryType() == KConnGetSipServerDomain ) + { + // Completed domain names. Now try IP addresses. + // Note: index is already 0. + iCurrentQuery->SetQueryType( KConnGetSipServerAddr ); + PerformDHCPQuery(); + return; + } + else + { + // No more data available, send results to the owner + iCurrentQuery->ResolvingRequestComplete(); + } + } + break; + } + + // Finally, delete this CProxyQuery and process the next one + delete iCurrentQuery; + iCurrentQuery = NULL; + ResolveNext(); + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::ResolveNext +// Delete the current query and process the next one with opened RConnection +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::ResolveNext() + { + if(!IsActive()) + { + if ( iCurrentQuery ) + { + delete iCurrentQuery; + iCurrentQuery = NULL; + } + + // get next CProxyQuery object, whose RConnection is opened + iCurrentQuery = iRequestQueue->NextReadyQuery(); + PerformDHCPQuery(); + } + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::RunError +// ----------------------------------------------------------------------------- +// +TInt CProxyResolveActor::RunError( TInt aError ) + { + TInt err = KErrNone; + // delete the query, as RunL leaved with aError. + if ( iCurrentQuery ) + { + iCurrentQuery->ResolvingRequestFailed( aError ); + delete iCurrentQuery ; + iCurrentQuery = NULL; + } + if( aError == KErrNoMemory ) + { + err = aError; + } + ResolveNext(); + return err; + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::CancelById +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::CancelById( TUint aRequestId ) + { + if ( iCurrentQuery && iCurrentQuery->RequestId() == aRequestId ) + { + Cancel(); + iRequestQueue->DetachByRequestId( aRequestId ); + delete iCurrentQuery; + iCurrentQuery = NULL; + ResolveNext(); + } + else + { + iRequestQueue->DeleteByRequestId( aRequestId ); + } + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::DoCancel +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::DoCancel() + { + // if iCurrentQuery is not null, request has been issued for + // the iCurrentQuery, do the cancel action + if ( iCurrentQuery ) + { + iCurrentQuery->Connection().CancelIoctl(); + } + } + +// ----------------------------------------------------------------------------- +// CProxyResolveActor::ErrorOccured +// Callback from CProxyQuery, indicating that opening RConnection failed +// +// ----------------------------------------------------------------------------- +// +void CProxyResolveActor::ErrorOccured( TInt aError, CProxyQuery* aQuery ) + { + aQuery->ResolvingRequestFailed( aError ); + iRequestQueue->DeleteByRequestId( aQuery->RequestId() ); + }