realtimenetprots/sipfw/ProfileAgent/ProxyResolver/src/CProxyResolveActor.cpp
changeset 0 307788aac0a8
--- /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 <nifman.h>
+
+
+// -----------------------------------------------------------------------------
+// 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() );
+    }