ncdengine/engine/transport/src/catalogshttptransactionmanagerimpl.cpp
changeset 0 ba25891c3a9e
child 25 7333d7932ef7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/engine/transport/src/catalogshttptransactionmanagerimpl.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,529 @@
+/*
+* Copyright (c) 2006-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:  
+*
+*/
+
+
+#include "catalogshttptransactionmanagerimpl.h"
+
+#include "catalogshttpoperation.h"
+#include "catalogsutils.h"
+#include "catalogshttptransaction.h"
+#include "catalogshttpconfigimpl.h"
+#include "catalogshttpsessionmanager.h"
+#include "catalogshttpstack.h"
+#include "catalogshttpconnectionmanager.h"
+#include "catalogshttpsessionimpl.h"
+
+#include "catalogsdebug.h"
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Creator
+// ---------------------------------------------------------------------------
+//
+CCatalogsHttpTransactionManager* CCatalogsHttpTransactionManager::NewL( 
+    MCatalogsHttpSessionManager& aSessionManager, 
+    CCatalogsHttpSession& aSession,
+    CCatalogsHttpConnectionManager& aConnectionManager, 
+    TInt32 aSessionId )
+    {
+    CCatalogsHttpTransactionManager* self = new ( ELeave ) 
+        CCatalogsHttpTransactionManager( 
+            aSessionManager,
+            aSession, 
+            aConnectionManager, 
+            aSessionId );
+        
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCatalogsHttpTransactionManager::~CCatalogsHttpTransactionManager()
+    {
+    iCancellingAll = ETrue;
+    // Release transactions
+    for( TInt i = 0; i < iTransactions.Count(); ++i ) 
+        {
+        while( iTransactions[i]->Release() )
+            {
+            }
+        }
+    
+    iHttpStacks.ResetAndDestroy();
+    
+    iTransactions.Reset();    
+    delete iDefaultConfig;
+    iManager.Release();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Transaction creator
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpOperation* CCatalogsHttpTransactionManager::CreateTransactionL( 
+    const TDesC16& aUrl, MCatalogsHttpObserver* aObserver )
+    {
+    HBufC8* buf = ConvertUnicodeToUtf8L( aUrl );
+    CleanupStack::PushL( buf );
+    MCatalogsHttpOperation* operation = CreateTransactionL( *buf, aObserver );
+    CleanupStack::PopAndDestroy( buf );
+    return operation;
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Transaction creator
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpOperation* CCatalogsHttpTransactionManager::CreateTransactionL( 
+    const TDesC8& aUrl, MCatalogsHttpObserver* aObserver )
+    {
+   
+    // Create a new transaction
+    CCatalogsHttpTransaction* transaction = CCatalogsHttpTransaction::NewL( 
+        *this, *iDefaultConfig, 
+        TCatalogsTransportOperationId( iSessionId, NextOperationId() ) );
+    
+    // If the given observer != NULL, set it as the observer for the download
+    if ( aObserver ) 
+        {        
+        transaction->Config().SetObserver( aObserver );        
+        }
+        
+    CleanupStack::PushL( transaction );
+
+    // Set the URI for the transaction
+    transaction->SetUriL( aUrl );
+
+    // Insert the transaction in id order
+    TLinearOrder<MCatalogsHttpOperation> order( 
+        &CCatalogsHttpTransactionManager::CompareTransactions );
+    
+    // Insert the download to the list of downloads    
+    User::LeaveIfError( iTransactions.InsertInOrder( transaction, order ) );
+    
+    CleanupStack::Pop( transaction );
+    
+    return transaction;        
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Creates a download transaction
+// ---------------------------------------------------------------------------
+//        
+MCatalogsHttpOperation* CCatalogsHttpTransactionManager::CreateDlTransactionL( 
+    const TDesC8& aUrl, MCatalogsHttpObserver& aObserver,
+    const CCatalogsHttpConfig& aConfig )
+    {    
+    // Create a new transaction
+    CCatalogsHttpTransaction* transaction = CCatalogsHttpTransaction::NewL( 
+        *this, aConfig, 
+        TCatalogsTransportOperationId( iSessionId, NextOperationId() ), 
+        ECatalogsHttpTransactionDownload );
+    
+    // If the given observer != NULL, set it as the observer for the download
+    transaction->Config().SetObserver( &aObserver );        
+
+        
+    CleanupStack::PushL( transaction );
+
+    // Set the URI for the transaction
+    transaction->SetUriL( aUrl );
+
+    // Insert the transaction in id order
+    TLinearOrder<MCatalogsHttpOperation> order( 
+        &CCatalogsHttpTransactionManager::CompareTransactions );
+    
+    // Insert the download to the list of downloads    
+    User::LeaveIfError( iTransactions.InsertInOrder( transaction, order ) );
+    
+    CleanupStack::Pop( transaction );
+    
+    return transaction;            
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Transaction getter
+// ---------------------------------------------------------------------------
+//    
+MCatalogsHttpOperation* CCatalogsHttpTransactionManager::Transaction( 
+    const TCatalogsTransportOperationId& aId ) const
+    {
+    TInt count = iTransactions.Count();
+    for ( TInt i = 0; i < count; ++i ) 
+        {
+        if ( iTransactions[i]->OperationId() == aId ) 
+            {
+            return iTransactions[i];
+            }
+        }
+    return NULL;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Current transactions getter
+// ---------------------------------------------------------------------------
+//    
+const RCatalogsHttpOperationArray& 
+    CCatalogsHttpTransactionManager::CurrentTransactions() const
+    {
+    return iTransactions;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Cancels all transactions
+// ---------------------------------------------------------------------------
+//
+void CCatalogsHttpTransactionManager::CancelAll()
+    {
+    iCancellingAll = ETrue;
+        
+    for ( TInt i = iTransactions.Count() - 1; i >= 0; --i ) 
+        {
+        iTransactions[i]->Cancel();
+        }
+         
+    iTransactions.Reset();
+
+    iCancellingAll = EFalse;            
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//
+void CCatalogsHttpTransactionManager::NotifyCancelAll()
+    {
+    for ( TInt i = iTransactions.Count() - 1; i >= 0; --i ) 
+        {
+        iTransactions[i]->NotifyCancel();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns the default configuration for transactions
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpConfig& CCatalogsHttpTransactionManager::DefaultConfig() const
+    {
+    return *iDefaultConfig;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Removes the transaction from the manager
+// ---------------------------------------------------------------------------
+//
+void CCatalogsHttpTransactionManager::RemoveOperation( 
+    MCatalogsHttpOperation* aOperation )
+    {
+    DLTRACEIN((""));
+    TInt index = KErrNotFound;
+    
+    // If cancelling all, we don't want to remove them separately 
+    // from the list
+    if ( !iCancellingAll ) 
+        {        
+        // Search from transactions
+        index = FindTransaction( iTransactions, aOperation );
+        
+        if ( index != KErrNotFound ) 
+            {
+            DLTRACE( ( _L("Removing tr: %i"), 
+                aOperation->OperationId().Id() ) );
+            iTransactions.Remove( index );            
+            }
+#ifdef _DEBUG
+        else 
+            {
+            DLTRACE( ( _L("Couldn't find tr: %i"), 
+                aOperation->OperationId().Id() ) );
+            }
+#endif            
+        }
+    DLTRACEOUT( ( _L("Total TRs: %i"), iTransactions.Count() ) );
+    }
+
+
+
+// ---------------------------------------------------------------------------
+// HTTP stack getter
+// ---------------------------------------------------------------------------
+//
+CCatalogsHttpStack* CCatalogsHttpTransactionManager::HttpStackL(
+    MCatalogsHttpStackObserver& aObserver )
+    {
+    DLTRACEIN((""));
+    CCatalogsHttpStack* stack = NULL;
+    if ( iHttpStacks.Count() ) 
+        {
+        DLTRACE(("Returning an existing stack"));
+        #ifdef CATALOGS_BUILD_CONFIG_DEBUG
+        for (TInt i = 0 ; i < iHttpStacks.Count() ; i++ )
+            {
+            DLINFO(("http stack: %x, index: %d, ap: %d", iHttpStacks[i], i, iHttpStacks[i]->AccessPointID()))
+            }
+        #endif
+        TInt index = iHttpStacks.Count() - 1;
+        stack = iHttpStacks[index];
+        iHttpStacks.Remove( index );
+        stack->SetObserver( &aObserver );
+        }
+    else 
+        {
+        DLTRACE(("Creating a new stack"));
+        /*
+        stack = CCatalogsHttpStack::NewL( &aObserver,
+            iManager.ConnectionCreatorL() );
+            */
+        }
+    return stack;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Release HTTP stack
+// ---------------------------------------------------------------------------
+//
+void CCatalogsHttpTransactionManager::ReleaseHttpStackL( 
+    CCatalogsHttpStack* aStack )
+    {
+    DLTRACEIN(( "Stack-ptr: %x", aStack ));
+    iHttpStacks.AppendL( aStack );
+    aStack->SetObserver( NULL );
+    #ifdef CATALOGS_BUILD_CONFIG_DEBUG
+        for (TInt i = 0 ; i < iHttpStacks.Count() ; i++ )
+            {
+            DLINFO(("http stack: %x, index: %d, ap: %d", iHttpStacks[i], i, iHttpStacks[i]->AccessPointID()))
+            }
+    #endif
+    }
+
+
+// ---------------------------------------------------------------------------
+// Compares two transactions
+// ---------------------------------------------------------------------------
+//
+TInt CCatalogsHttpTransactionManager::CompareTransactions( 
+    const MCatalogsHttpOperation& aFirst, 
+    const MCatalogsHttpOperation& aSecond )
+    {    
+    return aFirst.OperationId().Id() - aSecond.OperationId().Id();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Identity relation
+// ---------------------------------------------------------------------------
+//
+TBool CCatalogsHttpTransactionManager::AreTransactionsEqual( 
+    const MCatalogsHttpOperation& aFirst, 
+    const MCatalogsHttpOperation& aSecond )
+    {    
+    return aFirst.OperationId().Id() == aSecond.OperationId().Id();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Add a reference
+// ---------------------------------------------------------------------------
+//
+void CCatalogsHttpTransactionManager::AddRef()
+    {
+    iRefCount++;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// Release a reference
+// ---------------------------------------------------------------------------
+//
+TInt CCatalogsHttpTransactionManager::Release()
+    {
+    DLTRACEIN(( "" ));
+    iRefCount--;
+    if ( !iRefCount ) 
+        {
+        delete this;
+        return 0;
+        }
+    return iRefCount;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns the session id
+// ---------------------------------------------------------------------------
+//
+TInt32 CCatalogsHttpTransactionManager::SessionId() const
+    {
+    return iSessionId;
+    }    
+    
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CCatalogsHttpTransactionManager::CCatalogsHttpTransactionManager( 
+    MCatalogsHttpSessionManager& aSessionManager,
+    CCatalogsHttpSession& aSession,
+    CCatalogsHttpConnectionManager& aConnectionManager,
+    TInt32 aSessionId ) : 
+    iManager( aSessionManager ), 
+    iSession( aSession ),
+    iConnectionManager( aConnectionManager ), 
+    iSessionId( aSessionId ),
+    iCancellingAll( EFalse ), 
+    iRefCount( 1 )
+    {
+    iManager.AddRef();
+    }
+
+
+// ---------------------------------------------------------------------------
+// 2nd phase constructor
+// ---------------------------------------------------------------------------
+//    
+void CCatalogsHttpTransactionManager::ConstructL()
+    {     
+    DLTRACEIN((""));
+    iDefaultConfig = CCatalogsHttpConfig::NewL();    
+    DLTRACEOUT((""));
+    }
+    
+
+// ---------------------------------------------------------------------------
+// Finds the index for the given transaction in the given array
+// ---------------------------------------------------------------------------
+//            
+TInt CCatalogsHttpTransactionManager::FindTransaction( 
+    const RCatalogsHttpOperationArray& aArray,
+    MCatalogsHttpOperation* aTransaction ) const
+    {
+    DASSERT( aTransaction );
+    
+    if ( &aArray == &iTransactions ) 
+        {       
+        // Search for the download
+        TLinearOrder<MCatalogsHttpOperation> order( 
+            &CCatalogsHttpTransactionManager::CompareTransactions );
+        
+        TInt index = aArray.FindInOrder( aTransaction, order );    
+
+        return index;
+        }
+    else
+        {
+        // Search for the download
+        TIdentityRelation<MCatalogsHttpOperation> order( 
+            &CCatalogsHttpTransactionManager::AreTransactionsEqual );
+        
+        TInt index = aArray.Find( aTransaction, order );    
+
+        return index;        
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// Decides whether the download can start or not
+// ---------------------------------------------------------------------------
+//            
+TInt CCatalogsHttpTransactionManager::StartOperation( 
+    MCatalogsHttpOperation* aOperation )
+    {        
+    return iManager.StartOperation( aOperation );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Complete the download and resume a transaction from the queue if any
+// ---------------------------------------------------------------------------
+//            
+TInt CCatalogsHttpTransactionManager::CompleteOperation( 
+    MCatalogsHttpOperation* aOperation )
+    {    
+    DLTRACE(( "Total TRs: %i", iTransactions.Count() ));    
+    return iManager.CompleteOperation( aOperation );
+    }
+    
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//            
+void CCatalogsHttpTransactionManager::ReportConnectionStatus( TBool aActive )
+    {
+    iSession.ReportConnectionStatus( aActive );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Handles priority change
+// ---------------------------------------------------------------------------
+//            
+TInt CCatalogsHttpTransactionManager::OperationPriorityChanged( 
+    MCatalogsHttpOperation* aOperation )
+    {
+    return iManager.OperationPriorityChanged( aOperation );
+    }
+
+
+// -----------------------------------------------------    ----------------------
+// 
+// ---------------------------------------------------------------------------
+//            
+CCatalogsHttpConnectionCreator& 
+    CCatalogsHttpTransactionManager::ConnectionCreatorL()
+    {
+    return iManager.ConnectionCreatorL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//            
+CCatalogsHttpConnectionManager& CCatalogsHttpTransactionManager::ConnectionManager()
+    {
+    return iConnectionManager;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns the id for the next operation
+// ---------------------------------------------------------------------------
+//                
+TInt CCatalogsHttpTransactionManager::NextOperationId()
+    {
+    return iOperationId++;
+    }
+