diff -r 000000000000 -r ba25891c3a9e ncdengine/engine/transport/src/catalogstransportimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/engine/transport/src/catalogstransportimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,253 @@ +/* +* 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: +* +*/ + + +#include "catalogstransportimpl.h" + +#include "catalogstransporttypes.h" +#include "catalogssmssessionimpl.h" +#include "catalogshttpsessionimpl.h" +#include "catalogshttpsessionmanagerimpl.h" + +#include "catalogsdebug.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CCatalogsTransport* CCatalogsTransport::NewL( CDocumentHandler& aDocHandler ) + { + CCatalogsTransport* self = new( ELeave ) CCatalogsTransport(); + CleanupStack::PushL( self ); + self->ConstructL( aDocHandler ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCatalogsTransport::~CCatalogsTransport() + { + iRemovingAll = ETrue; + + DLTRACEIN(( KNullDesC() )); + // Release SMS sessions if the clients haven't done it yet + for ( TInt i = 0; i < iSmsSessions.Count(); ++i ) + { + while ( iSmsSessions[i]->Release() ) + { + } + } + + + DLTRACE( ( _L("Releasing HTTP sessions") ) ); + // Release HTTP sessions if the clients haven't done it yet + for ( TInt i = 0; i < iHttpSessions.Count(); ++i ) + { + /* + while ( iHttpSessions[i]->Release() ) + { + } + */ + // Ensure sessions don't try to access Transport anymore + static_cast(iHttpSessions[i])->SetOwner( NULL ); + } + DLTRACE( ( _L("HTTP sessions released") ) ); + + // Should the sessions be deleted? + iSmsSessions.Close(); + iHttpSessions.Close(); + //delete iHttpSessionManager; + if ( iHttpSessionManager ) + { + iHttpSessionManager->Release(); + } + DLTRACEOUT(( KNullDesC() )); + } + + +// --------------------------------------------------------------------------- +// Queries an interface from Transport +// --------------------------------------------------------------------------- +// +MCatalogsTransportSession* CCatalogsTransport::QueryInterfaceL( + TInt32 aSessionId, + TInt aInterfaceId, + TBool aCleanupSession ) + { + DLTRACEIN(("this=%X,session=%d,interface=%d",this, aSessionId,aInterfaceId)); + MCatalogsTransportSession* interface = NULL; + + // Instantiate the correct interface + switch( aInterfaceId ) + { + case KCatalogsTransportSmsInterface: + { + // Check if the interface has been already instantiated with + // the same session id + interface = FindSession( aSessionId, iSmsSessions ); + + if ( !interface ) + { + interface = CCatalogsSmsSession::NewL( aSessionId, *this ); + + TInt err = iSmsSessions.Append( interface ); + if ( err != KErrNone ) + { + interface->Release(); + User::Leave( err ); + } + } + else + { + // Increase reference count + interface->AddRef(); + } + break; + } + + + case KCatalogsTransportHttpInterface: + { + // Check if the interface has been already instantiated with + // the same session id + interface = FindSession( aSessionId, iHttpSessions ); + + if( !interface ) + { + interface = CCatalogsHttpSession::NewL( + aSessionId, + *this, + *iHttpSessionManager, + aCleanupSession ); + + TInt err = iHttpSessions.Append( interface ); + if ( err != KErrNone ) + { + interface->Release(); + User::Leave( err ); + } + } + else + { + interface->AddRef(); + } + break; + } + + + default: + { + // Invalid interface ID + User::Leave( KErrArgument ); + } + } + + DLTRACEOUT(("")); + return interface; + } + + +// --------------------------------------------------------------------------- +// Searches for the session +// --------------------------------------------------------------------------- +// +MCatalogsTransportSession* CCatalogsTransport::FindSession( + TInt32 aSessionId, RCatalogsSessionArray& aSessions ) const + { + for( TInt i = 0; i < aSessions.Count(); ++i ) + { + if( aSessions[i]->SessionId() == aSessionId ) + { + return aSessions[i]; + } + } + return NULL; + } + + +// --------------------------------------------------------------------------- +// Removes the session from Transport +// --------------------------------------------------------------------------- +// +void CCatalogsTransport::RemoveSession( MCatalogsTransportSession* aSession ) + { + DLTRACEIN( ( "aSession: %x", reinterpret_cast( aSession ) ) ); + + if( iRemovingAll ) + { + return; + } + + DASSERT( aSession ); + RCatalogsSessionArray* sessions = NULL; + + // Choose the correct array according to the session type + switch( aSession->SessionType() ) + { + case KCatalogsTransportSmsInterface: + { + sessions = &iSmsSessions; + break; + } + + case KCatalogsTransportHttpInterface: + { + sessions = &iHttpSessions; + break; + } + + default: + { + DASSERT( 0 ); + } + } + + TInt index = sessions->Find( aSession ); + + // There must not be a situation where a session is not found from + // Transport + //DASSERT( index != KErrNotFound ); + + if ( index != KErrNotFound ) + { + // Remove the session + sessions->Remove( index ); + } + else + { + DLERROR(("Session was not found")); + } + } + + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CCatalogsTransport::ConstructL( CDocumentHandler& aDocHandler ) + { + DLTRACEIN( ( "" ) ); + iHttpSessionManager = CCatalogsHttpSessionManager::NewL( aDocHandler ); + DLTRACEOUT( ( "" ) ); + }