simpledatamodeladapter/src/presencepluginconnection.cpp
branchRCL_3
changeset 18 fbd2e7cec7ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simpledatamodeladapter/src/presencepluginconnection.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,981 @@
+/*
+* Copyright (c) 2006-2010 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 <badesca.h>
+#include <ximpbase.h>
+#include <ximpserviceinfo.h>
+#include <protocolpresencefeatures.h>
+#include <cprotocolimfeatures.h>
+#include <protocolpresencedatahost.h>
+#include <presenceobjectfactory.h>  
+
+#include <ximpcontextclientinfo.h>		
+#include <protocolpresenceauthorization.h>  
+#include <ximpprotocolconnectionhost.h>			   
+#include <ximpfeatureinfo.h> //for etc. KPublish
+#include <msimpleconnection.h> //Part of Registration API from SIMPLE engine
+#include <msimpleconnectionobserver.h>//Connection callback methods
+#include <presenceinfo.h>
+
+#include "presencepluginconnection.h"
+#include "presencepluginsession.h" 
+#include "mpresencepluginconnectionobs.h"   
+#include "presencepluginwatcher.h"
+#include "presencepluginauthorization.h"
+#include "presencepluginwinfo.h"
+#include "presencepluginpublisher.h"
+#include "presenceplugingroup.h"
+#include "presencepluginxdmutils.h"
+#include "presencepluginvirtualgroup.h"
+#include "presenceconnectioninfo.h"
+#include "presenceplugindata.h"
+
+#include "simpleimpluginuids.hrh" //KImplUidSimpleImPlugin
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CPresencePluginConnection()
+// ---------------------------------------------------------------------------
+//
+CPresencePluginConnection::CPresencePluginConnection( ): 
+	CActive( CActive::EPriorityHigh ), iSipPresentity(NULL),
+    iStopPublishState( EFalse ), iGrantListSubs( EFalse ), iStopPublishCall( EFalse ),
+    iTerminatedCall( EFalse )
+    {
+    DP_SDA("CPresencePluginConnection::CPresencePluginConnection");
+    CActiveScheduler::Add(this);
+    iOwnTupleId = 0;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::NewL()
+// ---------------------------------------------------------------------------
+//
+CPresencePluginConnection* CPresencePluginConnection::NewL(
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& aClientCtxInfo )
+    {
+    DP_SDA("CPresencePluginConnection::NewL");
+    CPresencePluginConnection* self = 
+        new( ELeave ) CPresencePluginConnection( );
+    CleanupStack::PushL( self );
+    self->ConstructL( aServiceInfo, aClientCtxInfo );
+    CleanupStack::Pop( self );    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::NewL() loaded
+// ---------------------------------------------------------------------------
+//
+CPresencePluginConnection* CPresencePluginConnection::NewL(
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& aClientCtxInfo,
+    const TDesC8& aETag )
+    {
+    DP_SDA("CPresencePluginConnection::NewL loaded");
+    CPresencePluginConnection* self = 
+        new( ELeave ) CPresencePluginConnection( );
+    CleanupStack::PushL( self );
+    self->ConstructL( aServiceInfo, aClientCtxInfo, aETag );
+    CleanupStack::Pop( self );    
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::ConstructL() loaded
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::ConstructL(
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& /*aClientCtxInfo*/,
+    const TDesC8& aETag )
+    {
+    DP_SDA("CPresencePluginConnection::ConstructL loaded");
+    
+    iETag = aETag.AllocL();                  
+    
+    iSession = CPresencePluginSession::NewL( aServiceInfo, *this );
+            
+    // create instance from data class
+    iPresenceData = CPresencePluginData::NewL( *this,
+        aServiceInfo.IapId() ); 
+    
+    DP_SDA("ConstructL create subscribed buddy list loaded ");  
+    // create another virtual group for all subscribed buddyes
+    iSubscribedBuddys =
+        CPresencePluginVirtualGroup::NewL( *this, 
+        KPresenceBuddyList(),
+        iPresenceData );
+
+    iAuth = CPresencePluginAuthorization::NewL( *this, iPresenceData );
+    
+    iPublisher = CPresencePluginPublisher::NewL(
+               *this,        
+               *iSession->SimpleConnection(),
+               iPresenceData );
+    
+    iWatcher = CPresencePluginWatcher::NewL(
+               *this,
+               *iSession->SimpleConnection(),
+               iPresenceData ); 
+    
+    iGroups = CPresencePluginGroups::NewL( 
+        *this, iSubscribedBuddys, iPresenceData );
+    
+    iPluginWinfo = CPresencePluginWinfo::NewL( 
+                 *this, *(iSession->SimpleConnection() ));
+    
+    }    
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::ConstructL(
+    const MXIMPServiceInfo& aServiceInfo,
+    const MXIMPContextClientInfo& /*aClientCtxInfo*/ )
+    {
+    DP_SDA("CPresencePluginConnection::ConstructL");
+     
+    iETag = KNullDesC8().AllocL();                  
+    
+    iSession = CPresencePluginSession::NewL( aServiceInfo, *this );
+            
+    // create instance from data class
+    iPresenceData = CPresencePluginData::NewL( *this, 
+        aServiceInfo.IapId() ); 
+
+    DP_SDA("ConstructL create subscribed buddy list");	
+    // create another virtual group for all subscribed buddyes
+    iSubscribedBuddys =
+    	CPresencePluginVirtualGroup::NewL( 
+    	    *this, KPresenceBuddyList(), iPresenceData );
+
+    iAuth = CPresencePluginAuthorization::NewL( *this, iPresenceData );
+    
+    iPublisher = CPresencePluginPublisher::NewL(
+               *this,        
+               *iSession->SimpleConnection(),
+               iPresenceData );
+    
+    iWatcher = CPresencePluginWatcher::NewL(
+               *this,
+               *iSession->SimpleConnection(),
+               iPresenceData ); 
+      
+    iGroups = CPresencePluginGroups::NewL( 
+        *this, iSubscribedBuddys, iPresenceData );
+    
+    iPluginWinfo = CPresencePluginWinfo::NewL( 
+                 *this, *(iSession->SimpleConnection() ));   
+                                      
+    }    
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::~CPresencePluginConnection()
+// ---------------------------------------------------------------------------
+//
+CPresencePluginConnection::~CPresencePluginConnection()
+    {
+    DP_SDA("CPresencePluginConnection::~CPresencePluginConnection");
+    
+    Cancel();
+    
+    delete iSipPresentity;
+    iSipPresentity = NULL;
+    
+    delete iPluginWinfo;
+    iPluginWinfo = NULL;
+    
+    delete iWatcher;
+    iWatcher = NULL;
+    
+    delete iPublisher;
+    iPublisher = NULL;
+    
+    delete iAuth;
+    iAuth = NULL;
+    
+    delete iGroups;
+    iGroups = NULL;
+    
+    delete iSession;
+    iSession = NULL;
+    
+    delete iImFeatures;
+    
+    REComSession::FinalClose();
+    
+    delete iSubscribedBuddys;
+    delete iPresenceData;
+    
+    delete iETag;
+    iETag = NULL;
+    DP_SDA("CPresencePluginConnection::~CPresencePluginConnection end");
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PrimeHost
+// ---------------------------------------------------------------------------
+//  
+void CPresencePluginConnection::PrimeHost( 
+    MXIMPProtocolConnectionHost& aHost )
+    {
+    DP_SDA("CPresencePluginConnection::PrimeHost");
+    iConnectionHost = &aHost;
+    iAuth->SetDataHost( 
+        iConnectionHost->ProtocolPresenceDataHost().AuthorizationDataHost() );  
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetOnlineBuddyGroup()
+// ---------------------------------------------------------------------------
+//
+CPresencePluginVirtualGroup* CPresencePluginConnection::SubscribedContacts( )
+    {
+    return iSubscribedBuddys;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetSessionStatus()
+// ---------------------------------------------------------------------------
+//
+TBool CPresencePluginConnection::GetSessionStatus( )
+    {
+    return iSession->ConnectionStatus();
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::TupleIdGet()
+// ---------------------------------------------------------------------------
+//
+TInt CPresencePluginConnection::GetTupleId() const
+    {
+    DP_SDA("CPresencePluginConnection::TupleIdGet");
+    return iOwnTupleId;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetEtag()
+// ---------------------------------------------------------------------------
+//    
+const TDesC8& CPresencePluginConnection::GetETag() const
+    {
+    DP_SDA("CPresencePluginConnection::GetETag");
+    
+    if( !iETag )
+        {
+        DP_SDA2("CPresencePluginConnection::GetETag empty ??? %S", iConnectionArray->GetConnectionEtag() );
+        return  KNullDesC8();
+        }
+
+    return *iETag;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::SetETag()
+// ---------------------------------------------------------------------------
+//    
+void CPresencePluginConnection::SetETag( const TDesC8& aETag )
+    {
+    DP_SDA("CPresencePluginConnection::SetETag");
+    delete iETag;
+    iETag = NULL;
+        
+    TRAP_IGNORE( ( iETag = aETag.AllocL() ) );
+    //Add etag also in connectionArray
+    iConnectionArray->SetConnectionETag( *iETag );
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::SetConnectionArray()
+// ---------------------------------------------------------------------------
+//    
+void CPresencePluginConnection::SetConnectionArray( 
+		CPresenceConnectionInfo* aArray )
+    {
+    DP_SDA("CPresencePluginConnection::SetConnectionArray");
+    iConnectionArray = aArray;
+    iConnectionArray->SetConnectionStatus( EActive );
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetConnectionArray()
+// ---------------------------------------------------------------------------
+//    
+CPresenceConnectionInfo* CPresencePluginConnection::GetConnectionArray( )
+    {
+    DP_SDA("CPresencePluginConnection::GetConnectionArray");
+    return iConnectionArray;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::TupleIdGet()
+// ---------------------------------------------------------------------------
+//
+TInt32 CPresencePluginConnection::GetPresenceSetId() const
+    {
+    DP_SDA("CPresencePluginConnection::GetPresenceSetId");
+    return iSession->GetPresenceSetId();
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::TupleIdGet()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::SetTupleId( const TInt aTupleId )
+    {
+    DP_SDA("CPresencePluginConnection::TupleIdSet");
+    iOwnTupleId = aTupleId;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetStopPublishState()
+// ---------------------------------------------------------------------------
+//    
+TBool CPresencePluginConnection::GetStopPublishState()
+    {
+    DP_SDA2("::GetStopPublishState = %d", (TInt)iStopPublishState );
+    return iStopPublishState;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::SetStopPublishState()
+// ---------------------------------------------------------------------------
+// 
+void CPresencePluginConnection::SetStopPublishState( TBool aState )
+    {
+    DP_SDA2("SetStopPublishState : aState = %d ",  (TInt)aState );
+    iStopPublishState = aState;
+    }
+            
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresenceWatching
+// ---------------------------------------------------------------------------
+//    
+MProtocolPresenceDataHost& CPresencePluginConnection::ProtocolPresenceHost()
+    {
+    DP_SDA("CPresencePluginConnection::ProtocolPresenceHost");
+    return iConnectionHost->ProtocolPresenceDataHost();
+    }
+     
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresenceWatching
+// ---------------------------------------------------------------------------
+//    
+MProtocolPresenceWatching& CPresencePluginConnection::PresenceWatching()
+    {
+    DP_SDA("CPresencePluginConnection::PresenceWatching");
+    return *iWatcher;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresencePublishing
+// ---------------------------------------------------------------------------
+//   
+ MProtocolPresencePublishing& CPresencePluginConnection::PresencePublishing()
+    {
+    return *iPublisher;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresentityGroups
+// ---------------------------------------------------------------------------
+//   
+MProtocolPresentityGroups& CPresencePluginConnection::PresentityGroups()
+    {
+    return *iGroups;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresenceAuthorization
+// ---------------------------------------------------------------------------
+//   
+MProtocolPresenceAuthorization& 
+    CPresencePluginConnection::PresenceAuthorization()
+    {
+    DP_SDA2("CPresencePluginConnection::PresenceAuthorization %x", iAuth);
+    return *iAuth;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::InternalPresenceAuthorization
+// ---------------------------------------------------------------------------
+//       
+CPresencePluginAuthorization& 
+    CPresencePluginConnection::InternalPresenceAuthorization()
+    {
+    DP_SDA2("CPresencePluginConnection::InternalPresenceAuthorization %x", iAuth);
+    return *iAuth;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::OpenSessionL
+// ---------------------------------------------------------------------------
+//     
+void CPresencePluginConnection::OpenSessionL( 
+    const MXIMPContextClientInfo& /*aClientCtxInfo*/,
+    TXIMPRequestId aReqId )
+    {
+    DP_SDA("CPresencePluginConnection::OpenSessionL");
+    iGrantListSubs = ETrue; 
+    iTerminatedCall = EFalse;
+    iXIMPId = aReqId;
+    iSession->OpenSessionL();         
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::OpenSessionL
+// ---------------------------------------------------------------------------
+// 
+void CPresencePluginConnection::OpenSessionL( const TInt& /*aSettingsId*/,
+    TXIMPRequestId aReqId )
+    {
+    DP_SDA("CPresencePluginConnection::OpenSessionL 2 ");
+    iXIMPId = aReqId;
+    iGrantListSubs = ETrue; 
+    iTerminatedCall = EFalse;
+    iSession->OpenSessionL( ); 
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CloseSession
+// ---------------------------------------------------------------------------
+//    
+void CPresencePluginConnection::CloseSession( 
+    const MXIMPContextClientInfo& /*aContextClient*/,
+    TXIMPRequestId aReqId )
+    {
+    DP_SDA("CPresencePluginConnection::CloseSession begin");
+    
+    TBool completeXimpRequestNow( EFalse );
+    iConnectionArray->DecreaseClientCount();
+    iXIMPId = aReqId;
+        
+    // Client count canīt be negative. Increase if goes negative.
+    // This happens for example in network lost case.
+    // This method is called then because connection is terminated and
+    // for all clients which have done unbind. But here we cannot tell
+    // if this method is called by clients unbind or connection termination
+    // therefore this workaround needed.
+    if ( iConnectionArray->ClientCount() < 0 )
+        {        
+        completeXimpRequestNow = ETrue;
+        iConnectionArray->IncreaseClientCount();
+        }
+    
+    // In case there is no more clients we cannot complete Ximp request
+    // right away. We have to stop publish first, Ximp request completion is
+    // handled in RunL after that is done.
+    if( KErrNone == iConnectionArray->ClientCount() && 
+        (EActive == iConnectionArray->GetConnectionStatus()) )
+        {       
+        completeXimpRequestNow = EFalse; // request is completed later in RunL
+        iGrantListSubs = EFalse;
+        
+        //Start stopPublish request
+        DeRegister();
+        }
+        
+    if ( !iStopPublishCall )
+       {
+       completeXimpRequestNow = ETrue;
+       }
+    
+    if ( completeXimpRequestNow )
+        {
+        CompleteReq( iXIMPId, KErrNone );
+        }
+
+    DP_SDA("CPresencePluginConnection::CloseSession end");
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetSupportedFeaturesL
+// ---------------------------------------------------------------------------
+//     
+void CPresencePluginConnection::GetSupportedFeaturesL( 
+    CDesC8Array& aFeatures ) const
+    {
+    DP_SDA("CPresencePluginConnection::GetSupportedFeaturesL");
+    // first empty the whole array
+    aFeatures.Reset();   
+    using namespace NXIMPFeature::Presence;    
+    aFeatures.AppendL( KPublish );
+    aFeatures.AppendL( KSubscribe );    
+    aFeatures.AppendL( KUnsubscribe );  
+    aFeatures.AppendL( KAddContact );
+    aFeatures.AppendL( KDeleteContact );
+    aFeatures.AppendL( KFetch );
+    aFeatures.AppendL( KBlock );
+    aFeatures.AppendL( KUnBlock );
+    
+    if( iImFeatures )
+        {
+        using namespace NXIMPFeature::InstantMessage;
+        aFeatures.AppendL( KInstantMessage );
+        }
+    }
+
+//*****************************************************************************
+//*  FROM MPresencePluginConnectionObs
+//*****************************************************************************  
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CompleteReq()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::CompleteReq( TReqType aType, TInt aStatus )
+    {
+    DP_SDA("CPresencePluginConnection::CompleteReq");
+    // Return immediately if PrimeHost() is not called.
+    if ( !iConnectionHost )
+        {
+        DP_SDA("CPresencePluginConnection::CompleteReq !iConnectionHost");
+        iXIMPId = TXIMPRequestId(); 
+        return;
+        }
+                      
+    switch ( aType )
+        {
+        case EOpenSess:
+            {
+            DP_SDA("CPresencePluginConnection::CompleteReq EOpenSess");          
+            iConnectionHost->HandleRequestCompleted( iXIMPId, aStatus );
+            iXIMPId = TXIMPRequestId();
+            //Set connection status to connection Array
+            iConnectionArray->SetConnectionStatus( EActive );
+            }
+            break;
+        case ECloseSess:
+            {
+            DP_SDA("CPresencePluginConnection::CompleteReq ECloseSess"); 
+            iConnectionArray->DecreaseClientCount();
+            CompleteReq( iXIMPId, aStatus );
+            iConnectionArray->SetConnectionStatus( ENotActive );
+            }
+            break;
+        default:
+            DP_SDA("CPresencePluginConnection::CompleteReq DEFAULT");  
+            break;   
+        };
+    DP_SDA("CPresencePluginConnection::CompleteReq end"); 
+    }
+        
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CompleteReq()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::CompleteReq( 
+    TXIMPRequestId aReqId,
+    TInt aStatus )
+    { 
+    DP_SDA2("CPresencePluginConnection::CompleteReq status %d", aStatus); 
+    // Return immediately if PrimeHost() is not called.
+    if ( !iConnectionHost )
+        {
+        DP_SDA("CPresencePluginConnection::CompleteReq return"); 
+        return;
+        }               
+    DP_SDA("CPresencePluginConnection::CompleteReq complete");               
+    iConnectionHost->HandleRequestCompleted( aReqId, aStatus );
+    } 
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::ObjectFactory()
+// ---------------------------------------------------------------------------
+// 
+MXIMPObjectFactory& CPresencePluginConnection::ObjectFactory()
+    {
+    DP_SDA("CPresencePluginConnection::ObjectFactory");
+    return iConnectionHost->ObjectFactory();
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::Host
+// ---------------------------------------------------------------------------
+//     
+MXIMPProtocolConnectionHost* CPresencePluginConnection::Host()
+    {
+    DP_SDA("CPresencePluginConnection::Host");
+    return iConnectionHost;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection:CurrentDomain
+// ---------------------------------------------------------------------------
+//     
+TPtrC16 CPresencePluginConnection::CurrentDomain()
+    {
+    return iSession->CurrentDomain();    
+    } 
+     
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CurrentSipPresentit8()
+// ---------------------------------------------------------------------------
+// 
+TPtrC8 CPresencePluginConnection::CurrentSipPresentity8()
+    {
+    return iSession->CurrentSipPresentity();
+    } 
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection:XdmUtilsL
+// ---------------------------------------------------------------------------
+//
+CPresencePluginXdmUtils* CPresencePluginConnection::XdmUtilsL()
+    {
+    DP_SDA("CPresencePluginConnection::XdmUtilsL");
+    return iSession->XdmUtilsL();
+    } 
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::WinfoHandlerL()
+// ---------------------------------------------------------------------------
+//
+CPresencePluginWinfo* CPresencePluginConnection::WinfoHandlerL()
+    {
+    DP_SDA("CPresencePluginConnection::WinfoHandlerL");
+    if ( !iPluginWinfo )
+        {
+        iPluginWinfo = CPresencePluginWinfo::NewL( 
+            *this, *(iSession->SimpleConnection() ));
+        }
+    
+    iPluginWinfo->SetHost( iConnectionHost );
+    return iPluginWinfo;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::WatcherHandlerL()
+// ---------------------------------------------------------------------------
+//    
+ CPresencePluginWatcher* CPresencePluginConnection::WatcherHandlerL()
+    {
+    DP_SDA("CPresencePluginConnection::WatcherHandlerL");  
+    if ( !iWatcher )
+        {
+        DP_SDA("CPresencePluginConnection::WatcherHandlerL: if ( !iWatcher )");  
+        iWatcher = CPresencePluginWatcher::NewL(
+            *this,
+            *iSession->SimpleConnection(),
+            iPresenceData );
+        }
+    return iWatcher;
+    }
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::WinfoTerminatedL()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::WinfoTerminatedL( TInt aReason )
+    {
+    DP_SDA("CPresencePluginConnection::WinfoTerminatedL");  
+    // Pass the information to iAuth and iPublisher,
+    // so that they can call XIMP Plugin Data Host callbacks.
+    iAuth->WinfoTerminatedL( aReason );
+    iPublisher->WinfoTerminatedL( aReason );
+    }  
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::WinfoNotification()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::WinfoNotification( MSimpleWinfo& aWinfo )
+    {
+    DP_SDA("CPresencePluginConnection::WinfoNotification");  
+    TRAP_IGNORE( iPublisher->WinfoNotificationL( aWinfo  ));
+    TRAP_IGNORE( iAuth->WinfoNotificationL( aWinfo ));
+    }      
+        
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetInterface()
+// ---------------------------------------------------------------------------
+//
+TAny* CPresencePluginConnection::GetInterface(
+    TInt32 aInterfaceId,
+    TIfGetOps aOptions )
+    { 
+    DP_SDA("CPresencePluginConnection::GetInterface()");  
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        DP_SDA("CPresencePluginConnection::GetInterface()if ");
+        // caller wants this interface 
+        return this;
+        }
+    if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        DP_SDA("CPresencePluginConnection::GetInterface() panic");  
+        User::Panic( KPluginName, KErrExtensionNotSupported );
+        }  
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetInterface()
+// ---------------------------------------------------------------------------
+//
+const TAny* CPresencePluginConnection::GetInterface(
+    TInt32 aInterfaceId,
+    TIfGetOps aOptions ) const
+    {
+    DP_SDA("CPresencePluginConnection::GetInterface() const ");  
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        DP_SDA("CPresencePluginConnection::GetInterface()2 ");  
+        // caller wants this interface
+        return const_cast<CPresencePluginConnection*>(this);
+        }
+    if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        DP_SDA("CPresencePluginConnection::GetInterface()panic 2");  
+        User::Panic( KPluginName, KErrExtensionNotSupported );
+        }  
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetInterfaceId()
+// ---------------------------------------------------------------------------
+//
+TInt32 CPresencePluginConnection::GetInterfaceId() const
+    {
+    DP_SDA("CPresencePluginConnection::GetInterfaceId() const ");  
+    return MXIMPProtocolConnection::KInterfaceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::ProtocolPresenceFeatures()
+// ---------------------------------------------------------------------------
+//    
+MProtocolPresenceFeatures& CPresencePluginConnection::
+    ProtocolPresenceFeatures()           
+    {
+    DP_SDA("CPresencePluginConnection::ProtocolPresenceFeatures() ");  
+    return *this;
+    }
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::PresenceObjectFactory()
+// ---------------------------------------------------------------------------
+// 
+MPresenceObjectFactory& CPresencePluginConnection::PresenceObjectFactoryOwn()
+    {
+    DP_SDA("CPresencePluginConnection::PresenceObjectFactoryOwn() ");  
+    return iConnectionHost->
+        ProtocolPresenceDataHost().PresenceObjectFactory();    
+    }  
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GrandListState()
+// ---------------------------------------------------------------------------
+// 
+TBool CPresencePluginConnection::GrandListState( )
+    {
+    DP_SDA2("GrandListState : iGrantListSubs = %d", (TInt)iGrantListSubs );
+    return iGrantListSubs;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::IsStopPublishCalled()
+// ---------------------------------------------------------------------------
+// 
+TBool CPresencePluginConnection::IsStopPublishCalled( )
+    {
+    DP_SDA("CPresencePluginConnection::IsStopPublishCalled");
+    return iStopPublishCall;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::TerminateConnectionL()
+// ---------------------------------------------------------------------------
+// 
+void CPresencePluginConnection::TerminateConnectionL( )
+    {
+    DP_SDA("CPresencePluginConnection::TerminateConnectionL");
+    iConnectionHost->HandleConnectionTerminated( NULL );
+    iConnectionArray->SetConnectionStatus( ETerminated );
+    DP_SDA("CPresencePluginConnection::TerminateConnectionL Done");
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::DeRegister()
+// ---------------------------------------------------------------------------
+// 
+void CPresencePluginConnection::DeRegister( )
+    {
+    DP_SDA("CPresencePluginConnection::Deregister");
+    
+    DP_SDA(" -> CloseSession, delete permanent pres data");
+    TRAP_IGNORE( iPresenceData->DeletePresenceVariablesL( ServiceId() ) );
+    
+    // Try to stop publish only if we have successfully published
+    if ( iPublisher->Published() )
+        {
+        DP_SDA("CloseSession call stopPublish");
+        TRAP_IGNORE( iPublisher->StopPublishL( iStatus ) );
+        iStopPublishCall = ETrue;
+        SetActive();
+        }
+    
+    DP_SDA("CPresencePluginConnection::Deregister Done");
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::CreateImFeaturesPlugin()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::CreateImFeaturesPluginL( )
+    {
+    if ( !iImFeatures )
+        {
+        DP_SDA("Creating SimpleImPlugin");
+        
+        CSimpleImFeatures::TSimpleImPluginInitParams imPluginInitParams( 
+            *this,
+            *iSession->SimpleConnection(),
+            iSession->ServiceId() );
+        
+        iImFeatures = static_cast<CSimpleImFeatures*> ( 
+            CProtocolImFeatures::NewL( TUid::Uid(KImplUidSimpleImPlugin),
+            &imPluginInitParams ) );
+        
+        DP_SDA("Creating SimpleImPlugin done");
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::DeleteImFeaturesPlugin()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::DeleteImFeaturesPlugin( )
+    {
+    if ( iImFeatures )
+        {
+        DP_SDA("Deleting SimpleImPlugin");
+        
+        delete iImFeatures;
+        iImFeatures = NULL;      
+        REComSession::FinalClose();
+        
+        DP_SDA("Deleting SimpleImPlugin done");
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::DoCancel(  )
+    {
+    DP_SDA("CPresencePluginConnection::DoCancel CANCEL");
+    iPublisher->Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::RunL()
+// ---------------------------------------------------------------------------
+//
+void CPresencePluginConnection::RunL(  )
+    {
+    DP_SDA("CPresencePluginConnection::RunL");
+    TInt status = iStatus.Int();
+    DP_SDA2("CPresencePluginConnection::RunL status %d", status );
+    
+    if ( iStopPublishCall )
+        {
+        DP_SDA("CPresencePluginConnection::RunL complete");     
+        
+        iStopPublishCall = EFalse;
+        CompleteReq( iXIMPId, status );      
+        
+        DP_SDA("CPresencePluginConnection::RunL --> REMOVE CACHE");
+        iPresenceData->RemoveCacheL();
+        
+        DP_SDA("CPresencePluginConnection::RunL --> Delete im plugin");
+        DeleteImFeaturesPlugin();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CPresencePluginConnection::RunError( TInt /*aError*/ )
+    {
+    DP_SDA("CPresencePluginConnection::RunError"); 
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GroupsL()
+// ---------------------------------------------------------------------------
+// 
+CPresencePluginGroups& CPresencePluginConnection::GroupsL()
+	{
+	User::LeaveIfNull( iGroups );
+	return *iGroups;
+	}
+    
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::ServiceId()
+// ---------------------------------------------------------------------------
+// 	
+TInt& CPresencePluginConnection::ServiceId()
+    {
+    return iSession->ServiceId();
+    }
+	
+// ---------------------------------------------------------------------------
+// CPresencePluginConnection::GetProtocolInterface()
+// ---------------------------------------------------------------------------
+// 
+TAny* CPresencePluginConnection::GetProtocolInterface( TInt aInterfaceId )
+	{
+	DP_SDA("CPresencePluginConnection::GetProtocolInterface");
+	
+	if( aInterfaceId == CProtocolImFeatures::KInterfaceId )
+        {
+        TInt err( KErrNone );
+        
+        if ( !iImFeatures )
+            {
+            DP_SDA("    --> Create im features plugin");           
+            TRAP( err, CreateImFeaturesPluginL() );
+            }
+        
+        if ( !err )
+            {
+            DP_SDA("    --> get interface");
+            
+            return iImFeatures->GetInterface( 
+                aInterfaceId, MXIMPBase::EPanicIfUnknown );
+            }
+        else
+            {
+            DP_SDA("    --> Creating im features plugin failed");
+            return NULL;
+            }
+        }
+	else
+        {
+	    return NULL;
+        }
+	}
+    
+// End of file