diff -r 77cb48a03620 -r d9861ae9169c simpledatamodeladapter/src/presenceplugin.cpp --- a/simpledatamodeladapter/src/presenceplugin.cpp Thu Jul 01 14:09:06 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,372 +0,0 @@ -/* -* 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: IETF SIMPLE Protocol implementation for XIMP Framework -* -*/ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "presenceplugin.h" -#include "presenceplugindef.h" -#include "presencepluginconnection.h" -#include "presenceplugincommon.h" -#include "presenceplugin_resource.hrh" -#include "presenceconnectioninfo.h" - -#include -#include -#include -#include - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// Key value pair table to identify correct constructor -// function for the requested interface. -// --------------------------------------------------------------------------- -// -const TImplementationProxy ImplementationTable[] = - { - //Warning in Lint 611 - IMPLEMENTATION_PROXY_ENTRY( PRESENCEPLUGIN_1_IMPLEMENTATION_UID, - CPresencePlugin::NewL ) - }; - -// --------------------------------------------------------------------------- -// Exported function to return the implementation proxy table -// --------------------------------------------------------------------------- -// -EXPORT_C const TImplementationProxy* ImplementationGroupProxy( - TInt& aTableCount ) - { - aTableCount = sizeof( ImplementationTable ) / - sizeof( TImplementationProxy ); - return ImplementationTable; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::CPresencePlugin() -// --------------------------------------------------------------------------- -// -CPresencePlugin::CPresencePlugin() - { - //empty - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::NewLC() -// --------------------------------------------------------------------------- -// -CPresencePlugin* CPresencePlugin::NewLC() - { - CPresencePlugin* self = new( ELeave ) CPresencePlugin(); - CleanupStack::PushL( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::NewL() -// --------------------------------------------------------------------------- -// -CPresencePlugin* CPresencePlugin::NewL() - { - CPresencePlugin* self = CPresencePlugin::NewLC(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::~CPresencePlugin() -// --------------------------------------------------------------------------- -// -CPresencePlugin::~CPresencePlugin() - { - DP_SDA("CPresencePlugin::~CPresencePlugin"); - iConnections.ResetAndDestroy(); - iConnectionArray.ResetAndDestroy(); - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::~CPresencePlugin() -// --------------------------------------------------------------------------- -// -void CPresencePlugin::PrimeHost( MXIMPProtocolPluginHost& aHost ) - { - DP_SDA("CPresencePlugin::PrimeHost"); - iHost = &aHost; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::AcquireConnectionL() -// --------------------------------------------------------------------------- -// -MXIMPProtocolConnection& CPresencePlugin::AcquireConnectionL( - const MXIMPServiceInfo& aServiceInfo, - const MXIMPContextClientInfo& aContextClient ) - { - DP_SDA("CPresencePlugin::AcquireConnectionL"); - MXIMPProtocolConnection* tmp = NULL; - CPresenceConnectionInfo* connectionArray = NULL; - TBool connected = EFalse; - - //Check if presence is allready connected to id - //!!!! IN this adapter that IapID is service id ID!!!! - - DP_SDA2("CPresencePlugin::AcquireConnectionL - service id: %d", - aServiceInfo.IapId() ); - - TInt presenceId = KErrNotFound; - CSPSettings* spSettings = CSPSettings::NewL(); - CleanupStack::PushL( spSettings ); - - CSPProperty* property = CSPProperty::NewLC(); - spSettings->FindPropertyL( aServiceInfo.IapId(), - ESubPropertyPresenceSettingsId, - *property ); - if ( property ) - { - property->GetValue( presenceId ); - } - CleanupStack::PopAndDestroy( property ); - CleanupStack::PopAndDestroy( spSettings ); - - DP_SDA2(" -> presence settings id: %d",presenceId ); - __ASSERT_ALWAYS( presenceId > 0, User::Leave( KErrArgument ) ); - - TInt connectionsCount = iConnections.Count(); - DP_SDA2("AcquireConnectionL : connectionsCount =%d ", connectionsCount ); - - for( TInt i( connectionsCount - 1 ); i >= 0; i-- ) - { - DP_SDA2("AcquireConnectionL connection count %d", connectionsCount); - if( iConnections[i]->GetPresenceSetId() == presenceId ) - { - DP_SDA2("AcquireConnectionL RETURN OLD CONNECTION : i = %d " , i ); - //Check connection status - tmp = iConnections[i]; - connectionArray = iConnections[i]->GetConnectionArray(); - - //Check connection status from connectionArray - CPresencePluginConnection::TConnectionStatus status = - connectionArray->GetConnectionStatus(); - - if( CPresencePluginConnection::ENotActive == status ) - { - DP_SDA("AcquireConnectionL ENotActive "); - DP_SDA("AcquireConnectionL Del old inactive connection"); - //Call session CLOSE here!!!!! - //Ensure there is no any client to bind this connect - //Release this failed connection - DeleteConnection(i); - } - else if ( CPresencePluginConnection::ETerminated == status ) - { - DP_SDA("AcquireConnectionL ETerminated CREATE NEW CONNECTION "); - //Roamning try use lates ETag - //Delete old terminaded connection and create new with old ETag - CPresencePluginConnection* connection = - CPresencePluginConnection::NewL( - aServiceInfo, aContextClient, - *iConnectionArray[i]->GetConnectionEtag() ); - CleanupStack::PushL( connection ); - - DeleteConnection( i ); - - //Add this new connection to connectionArray - CPresenceConnectionInfo* connectionInfo = - CPresenceConnectionInfo::NewL( connection ); - iConnectionArray.Append( connectionInfo ); - connection->SetConnectionArray( connectionInfo ); - iConnections.AppendL( connection ); - CleanupStack::Pop( connection ); - tmp = connection; - connected = ETrue; - } - else if ( CPresencePluginConnection::EActive == status ) - { - DP_SDA("AcquireConnectionL EActive"); - // NOTE: Incase there is no reply from XIMP before client is - // shutdown , then closeconnection wouldnt be called, reopening - // client will increase clientCount which is wrong. ClientCount - // should be checked for validity before increasing? - // If already connected - iConnectionArray[i]->IncreaseClientCount(); - connected = ETrue; - tmp = iConnections[i]; - DP_SDA("AcquireConnectionL RETURN OLD CONNECTION done"); - } - break; - } - } - if( !connected ) - { - DP_SDA("CPresencePlugin::AcquireConnectionL CREATE NEW CONNECTION"); - // If not already connected - CPresencePluginConnection* connection = CPresencePluginConnection::NewL( - aServiceInfo, aContextClient ); - CleanupStack::PushL( connection ); - - //Add this new connection to connectionArray - CPresenceConnectionInfo* connectionInfo = - CPresenceConnectionInfo::NewL( connection ); - iConnectionArray.Append( connectionInfo ); - connection->SetConnectionArray( connectionInfo ); - //Add on binded client - connectionInfo->IncreaseClientCount(); - - iConnections.AppendL( connection ); - CleanupStack::Pop( connection ); - tmp = connection; - DP_SDA("AcquireConnectionL CREATE NEW CONNECTION DONE"); - } - DP_SDA("CPresencePlugin::AcquireConnectionL ret"); - return *tmp; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::ReleaseConnection() -// --------------------------------------------------------------------------- -// -void CPresencePlugin::ReleaseConnection( MXIMPProtocolConnection& aConnection ) - { - DP_SDA("CPresencePlugin::ReleaseConnection"); - TInt connectionsCount = iConnections.Count(); - - DP_SDA2("ReleaseConnection : connectionsCount =%d ", connectionsCount ); - - for ( TInt i=0; i < connectionsCount; i++ ) - { - DP_SDA("CPresencePlugin::ReleaseConnection for start"); - if ( iConnectionArray[i]->GetConnection() == &aConnection ) - { - //Check how many client is using this connection - TInt clientCount = iConnectionArray[i]->ClientCount(); - - DP_SDA2("ReleaseConnection : clientCount = %d ", clientCount ); - DP_SDA2("CPresencePlugin::ReleaseConnection : i = %d", i ); - - if ( connectionsCount == 1 && clientCount <= 0 ) - { - DP_SDA("CPresencePlugin::ReleaseConnection Lets start to check"); - DP_SDA2("CPresencePlugin::ReleaseConnection connect status %d,", iConnections[i]->GetSessionStatus()); - //Check this connection status - if( !(CPresencePluginConnection::ENotActive == - iConnectionArray[i]->GetConnectionStatus() )) - { - DP_SDA("CPresencePlugin::ReleaseConnection not have clients"); - DeleteConnection(i); - break; - } - DP_SDA("connectionsCount == 1 && i == 0 && clientCount == 0 "); - DP_SDA("ReleaseConnection : Don't delete this connection "); - break; //don't delete first connection - } - DP_SDA("CPresencePlugin::ReleaseConnection for end"); - } - } - DP_SDA("CPresencePlugin::ReleaseConnection end"); - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::GetInterface() -// --------------------------------------------------------------------------- -// -TAny* CPresencePlugin::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) - { - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - return this; - } - if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( KPluginName, KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::GetInterface() -// --------------------------------------------------------------------------- -// -const TAny* CPresencePlugin::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) const - { - DP_SDA("CPresencePlugin::GetInterface"); - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - return const_cast(this); - } - if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( KPluginName, KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::GetInterfaceId() -// --------------------------------------------------------------------------- -// -TInt32 CPresencePlugin::GetInterfaceId() const - { - return MXIMPProtocolPlugin::KInterfaceId; - } - -// --------------------------------------------------------------------------- -// CPresencePlugin::DeleteConnection() -// --------------------------------------------------------------------------- -// -void CPresencePlugin::DeleteConnection( TInt aIndex ) - { - //First delete connectionArray where connection is same at connection - DP_SDA("CPresencePlugin::DeleteConnection"); - - TInt connectionArrayCount = iConnectionArray.Count(); - - for ( TInt i=0; i < connectionArrayCount; i++ ) - { - DP_SDA2("CPresencePlugin::DeleteConnection FINDING, con status %d", iConnectionArray[i]->GetConnectionStatus() ); - if( (iConnections[aIndex] == iConnectionArray[i]->GetConnection()) && - !(CPresencePluginConnection::EActive == - iConnectionArray[i]->GetConnectionStatus() ) ) - { - DP_SDA("CPresencePlugin::DeleteConnection connection Match"); - delete iConnectionArray[i]; - iConnectionArray.Remove( i ); - iConnectionArray.Compress(); - break; - } - } - delete iConnections[aIndex]; - iConnections.Remove( aIndex ); - iConnections.Compress(); - DP_SDA("CPresencePlugin::DeleteConnection end"); - } - -// End of file