simpledatamodeladapter/src/presenceplugingroup.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:14 +0100
branchRCL_3
changeset 18 fbd2e7cec7ef
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201027 Kit: 201035

/*
* 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 <e32std.h>
#include <ximpdatasubscriptionstate.h>
#include <protocolpresentitygroupsdatahost.h>
#include <protocolpresencedatahost.h>
#include <ximpobjectfactory.h>
#include <presenceobjectfactory.h>
#include <ximpstatus.h>
#include <ximpidentity.h>
#include <ximpobjectcollection.h>
#include <XdmErrors.h>
#include <presentitygroupinfo.h>
#include <presentitygroupmemberinfo.h>
#include <utf.h>
#include <avabilitytext.h>

#include "mpresencepluginconnectionobs.h"
#include "presenceplugingroup.h"
#include "presencepluginxdmutils.h"
#include "presenceplugincommon.h"
#include "presencepluginvirtualgroup.h"
#include "presenceplugindata.h"
#include "presencepluginwatcher.h"
#include "presencepluginauthorization.h"
#include "presencepluginutility.h"

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// CPresencePluginGroups::CPresencePluginGroups
// ---------------------------------------------------------------------------
//
CPresencePluginGroups::CPresencePluginGroups(
    MPresencePluginConnectionObs& aObs,
    CPresencePluginVirtualGroup* aSubscribedBuddies,
    CPresencePluginData* aPresenceData ):
  	CActive( CActive::EPriorityStandard ),
  	iConnObs(aObs),
  	iOperation( ENoOperation),
  	iState( EPluginIdle ), iCompleted( ETrue ),
  	iSubscribedBuddies( aSubscribedBuddies ),
  	iPresenceData( aPresenceData )
    {
    CActiveScheduler::Add( this );
    }
    
// ---------------------------------------------------------------------------
// CPresencePluginGroups::NewL
// ---------------------------------------------------------------------------
//
CPresencePluginGroups* CPresencePluginGroups::NewL(
    MPresencePluginConnectionObs& aObs,
    CPresencePluginVirtualGroup* aSubscribedBuddies,
    CPresencePluginData* aPresenceData )
    {
    CPresencePluginGroups* self =
        CPresencePluginGroups::NewLC( 
             aObs,
             aSubscribedBuddies,
             aPresenceData );    
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::NewLC
// ---------------------------------------------------------------------------
//
CPresencePluginGroups* CPresencePluginGroups::NewLC(
    MPresencePluginConnectionObs& aObs,
    CPresencePluginVirtualGroup* aSubscribedBuddies,
    CPresencePluginData* aPresenceData )
    {
    CPresencePluginGroups* self =
        new( ELeave ) CPresencePluginGroups( 
             aObs,
             aSubscribedBuddies,
             aPresenceData );
    CleanupStack::PushL( self );
    return self;
    }
    
// ---------------------------------------------------------------------------
// CPresencePluginGroups::~CPresencePluginGroups
// ---------------------------------------------------------------------------
//
CPresencePluginGroups::~CPresencePluginGroups()
    {
    DP_SDA("CPresencePluginGroups::~CPresencePluginGroups");
    Cancel();
    delete iPresIdentity;
    delete iDisplayName;
    DP_SDA("CPresencePluginGroups::~CPresencePluginGroups end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoSubscribePresentityGroupListL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoSubscribePresentityGroupListL(
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginGroups::DoSubscribePresentityGroupListL");
    iCompleted = EFalse;
    // List of lists under buddylist
    StartXdmOperationL( aReqId, EGetListOfLists );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoUnsubscribePresentityGroupListL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoUnsubscribePresentityGroupListL(
    TXIMPRequestId /*aReqId*/ )
    {
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoCreatePresentityGroupL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoCreatePresentityGroupL(
    const MXIMPIdentity& /*aGroupId*/,
    const TDesC16& /*aDisplayName*/,
    TXIMPRequestId /*aReqId*/ )
    {
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoDeletePresentityGroupL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoDeletePresentityGroupL(
    const MXIMPIdentity& /*aGroupId*/,
    TXIMPRequestId /*aReqId*/ )
    {
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoUpdatePresentityGroupDisplayNameL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoUpdatePresentityGroupDisplayNameL(
    const MXIMPIdentity& /*aGroupId*/,
    const TDesC16& /*aDisplayName*/,
    TXIMPRequestId /*aReqId*/ )
    {
    // Notice: later
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoSubscribePresentityGroupContentL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoSubscribePresentityGroupContentL(
    const MXIMPIdentity& aGroupId,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginGroups::DoSubscribePresentityGroupContentL");
    iCompleted = EFalse;
    // List of lists under buddylist
    StartXdmOperationL( aGroupId, aReqId, EGetListContent );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoUnsubscribePresentityGroupContentL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoUnsubscribePresentityGroupContentL(
    const MXIMPIdentity& /*aGroupId*/,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginGroups::DoUnsubscribePresentityGroupContentL");
    
    iXIMPId = aReqId;
    iConnObs.WatcherHandlerL()->UnSubscribeAllL();    
    iCompleted = EFalse;
    CompleteXIMPReq( KErrNone );
    DP_SDA("CPresencePluginGroups::DoUnsubscribePresentityGroupContentL out");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoAddPresentityGroupMemberL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoAddPresentityGroupMemberL(
    const MXIMPIdentity& aGroupId,
    const MXIMPIdentity& aMemberId,
    const TDesC16& /*aMemberDisplayName*/,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL");
    __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrNotReady ) );
    
    SetPresIdentityL( aMemberId, ETrue );
    
    iCompleted = EFalse;
    iXIMPId = aReqId;
        
    if( !aGroupId.Identity().Compare( KPresenceBuddyList ) )
        {
        DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - buddylist");
        TBool contactIsBlocked = EFalse;
        RPointerArray<MXIMPIdentity> blockedList;
        CleanupStack::PushL( TCleanupItem(
            TPresencePluginUtility::ResetAndDestroyIdentities,
            &blockedList ) );
        iXdmUtils->SubscribeBlockListL( blockedList );
        DP_SDA2( "CPresencePluginGroups::DoAddPresentityGroupMemberL - blockedList.Count = %d",
            blockedList.Count() );
        
        for ( TInt i( 0 ); i < blockedList.Count() && !contactIsBlocked; i++ ) 
            {
            if ( 0 == blockedList[i]->Identity().Compare( aMemberId.Identity() ) )
                {
                // contact found from blocked list
                contactIsBlocked = ETrue;
                }
            }
        CleanupStack::PopAndDestroy( &blockedList );
        
        if ( contactIsBlocked )
            {
            DP_SDA( "CPresencePluginGroups::DoAddPresentityGroupMemberL - contact is Blocked" );
            iOperation = EUnblockInAddPresentityGroupMember;
            iConnObs.InternalPresenceAuthorization().
                DoPerformCancelPresenceBlockFromPresentityL(
                    aMemberId, iStatus  );
            SetActive();
            }
        else
            {
            DP_SDA( "CPresencePluginGroups::DoAddPresentityGroupMemberL - contact is not Blocked" );
            iOperation = EAddPresentityGroupMember;
            // write pending to presence cache
            TBuf<20> buf;
            buf.Copy( KPendingRequestExtensionValue );
            iPresenceData->WriteStatusToCacheL( aMemberId.Identity(), 
                MPresenceBuddyInfo2::ENotAvailable,
                buf,
                KNullDesC() );
            iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( 
                aMemberId, iStatus );
            SetActive();
            }
        }
    else if ( !aGroupId.Identity().Compare( KPresenceBlockedList ) )
        {
        DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - blockedlist");
        iOperation = EBlockPresentityGroupMember;
        iConnObs.InternalPresenceAuthorization().
            DoPerformBlockPresenceForPresentityL( aMemberId, iStatus );
        SetActive();
        }
    else
        {
        DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL - unknown, leave");
        User::Leave( KErrNotSupported );
        }
    
    DP_SDA("CPresencePluginGroups::DoAddPresentityGroupMemberL out");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoRemovePresentityGroupMemberL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoRemovePresentityGroupMemberL(
    const MXIMPIdentity& aGroupId,
    const MXIMPIdentity& aMemberId,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginGroups::DoRemovePresentityGroupMemberL");
    __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrNotReady ) );

    SetPresIdentityL( aMemberId, ETrue );
    
    iCompleted = EFalse;
    iXIMPId = aReqId;
    iOperation = ERemovePresentityGroupMember;
    
    if( !aGroupId.Identity().Compare( KPresenceBuddyList ) )
        {
        DP_SDA( "DoRemovePresentityGroupMemberL - buddylist" );
        iConnObs.WatcherHandlerL()->DoPerformUnsubscribePresentityPresenceL( 
            aMemberId, iStatus );
        SetActive();
        }
    else if ( !aGroupId.Identity().Compare( KPresenceBlockedList ) )
        {
        DP_SDA( "DoRemovePresentityGroupMemberL - blockedlist" );
        // Contact blocking is not cancelled when blocked contact is removed
        // user can remove blocking from blocked list later
        DeletePersonCacheL();
        CompleteXIMPReq( KErrNone );
        }
    else
        {
        DP_SDA("DoRemovePresentityGroupMemberL - unknown, leave");
        User::Leave( KErrNotSupported );
        }
        
    DP_SDA("CPresencePluginGroups::DoRemovePresentityGroupMemberL out");    
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL(
    const MXIMPIdentity& /*aGroupId*/,
    const MXIMPIdentity& /*aMemberId*/,
    const TDesC16& /*aMemberDisplayName*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL");
    // Notice: Later
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoCancel()
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoCancel(  )
    {
    if ( iOperation != ENoOperation )
        {
        iXdmUtils->Cancel();
        }
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::RunL()
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::RunL()
    {
    DP_SDA("CPresencePluginGroups::RunL");
    TInt myStatus = iStatus.Int();
    DP_SDA2("CPresencePluginGroups::RunL myStatus %d", myStatus );
    
    if ( !myStatus && !iCompleted )
        {
        DP_SDA("CPresencePluginGroups::RunL !myStatus");
        // OK response
        CallActualXdmOperationL( myStatus );
        }
    else if ( KErrNotFound == myStatus && !iCompleted )
        {
        DP_SDA("CPresencePluginGroups::RunL KErrNotFound == myStatus");
        
        // DoPerformUnsubscribePresentityPresenceL didn't find watcher
        // so it did not execute StopSubscribeL from the watcher. Still
        // presentity group member has to be removed.
        CallActualXdmOperationL( KErrNone );
        }
    else if ( !myStatus && iCompleted )
        {
        DP_SDA("CPresencePluginGroups::RunL SEND COMPLETE");
        CompleteXIMPReq( myStatus );
        }
    else
        {
        if ( iOperation == EDeletePresentityGroup && iState ==
        	EPluginCommitRls )
            {
            DP_SDA("CPresencePluginGroups::RunL CallActualXdmOperation");
            CallActualXdmOperationL( myStatus );
            }
        else
            {
            DP_SDA("CPresencePluginGroups::RunL SEND COMPLETE 2");
            // Other errors terminated the show
            CompleteXIMPReq( myStatus );
            }
        }
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::CallActualXdmOperationL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::CallActualXdmOperationL( TInt aCompleteStatus )
    {
    DP_SDA("CPresencePluginGroups::CallActualXdmOperationL");
        
    DP_SDA2("CallActualXdmOperationL iOperation %d", iOperation);
    switch ( iOperation )
        {
        case EGetListOfLists:
            {
            DP_SDA("PluginGroups::CallActualXdmOperationL EGetListOfLists");
            iOperation = EGetListOfLists;
            GetListOfListsL();
            }
            break;
        
        case EGetListContent:
            {
            DP_SDA("PluginGroups::CallActualXdmOperationL EGetListContent");
            iOperation = EGetListContent;
            GetListContentL();
            }
            break;
            
        case EAddPresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL EAddPresentityGroupMember");
            
            iOperation = EGrantPresentityGroupMember;
            MXIMPIdentity* newIdentity = 
                iConnObs.ObjectFactory().NewIdentityLC();
            newIdentity->SetIdentityL( *iPresIdentity );
            
            iConnObs.InternalPresenceAuthorization().
                DoPerformGrantPresenceForPresentityL( *newIdentity, iStatus );
            CleanupStack::PopAndDestroy(); // >> newIdentity
            SetActive();
            }
            break;
            
        case ERemovePresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL ERemovePresentityGroupMember");
            iOperation = EWithdrawGrantFromMember;
            MXIMPIdentity* newIdentity = iConnObs.ObjectFactory().NewIdentityLC();
            newIdentity->SetIdentityL( *iPresIdentity );
            iConnObs.InternalPresenceAuthorization().
                DoPerformWithdrawPresGrantFromPresentityL( 
                    *newIdentity, iStatus );
            CleanupStack::PopAndDestroy(); // >> newIdentity
            SetActive();
            }
            break;
            
        case EGrantPresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL EGrantPresentityGroupMember");
            CompleteXIMPReq( aCompleteStatus );
            }
            break;
            
        case EWithdrawGrantFromMember:
            {
            DP_SDA(" CallActualXdmOperationL EWithdrawGrantFromMember");
            if ( !aCompleteStatus )
                {
                DP_SDA(" -> succesfully unblocked, store to cache");
                DeletePersonCacheL();                
                DP_SDA(" -> store info to cache done");                
                }            
            CompleteXIMPReq( aCompleteStatus );
            }
            break;
            
        case EBlockPresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL EBlockPresentityGroupMember");
            if ( !aCompleteStatus )
                {
                DP_SDA(" -> succesfully blocked, store to cache");

                DP_SDA(" -> strip prefix from uri");
                HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( 
                    *iPresIdentity );
                DP_SDA(" -> store info to cache");
                
                TBuf<20> buf;
                buf.Copy( KBlockedExtensionValue );
                                
                iPresenceData->WriteStatusToCacheL( *withoutPrefix, 
                    MPresenceBuddyInfo2::EUnknownAvailability,
                    buf,
                    KNullDesC() );
                
                CleanupStack::PopAndDestroy( withoutPrefix );
                DP_SDA(" -> store info to cache done");
                }
            CompleteXIMPReq( aCompleteStatus );
            }
            break;
            
        case EUnblockPresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL EUnblockPresentityGroupMember");
            if ( !aCompleteStatus )
                {
                DP_SDA(" -> succesfully unblocked, store to cache");
                DeletePersonCacheL();                
                DP_SDA(" -> store info to cache done");                
                }            
            CompleteXIMPReq( aCompleteStatus );
            }
            break;
            
        case EUnblockInAddPresentityGroupMember:
            {
            DP_SDA(" CallActualXdmOperationL EUnblockInAddPresentityGroupMember");
            iOperation = EAddPresentityGroupMember;
            MXIMPIdentity* newIdentity = iConnObs.ObjectFactory().NewIdentityLC();
            newIdentity->SetIdentityL( *iPresIdentity );
            
            TBuf<20> buf;
            buf.Copy( KPendingRequestExtensionValue );
            iPresenceData->WriteStatusToCacheL( *iPresIdentity,
                MPresenceBuddyInfo2::ENotAvailable,
                buf, KNullDesC() );
            
            iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( 
                *newIdentity, iStatus );
            CleanupStack::PopAndDestroy(); // >> newIdentity
            SetActive();
            }
            break;
            
        default:
            User::Leave( KErrNotSupported );
            break;
        }
    DP_SDA("CPresencePluginGroups::CallActualXdmOperationL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::RunError
// ---------------------------------------------------------------------------
//
TInt CPresencePluginGroups::RunError( TInt aError )
    {
    DP_SDA("CPresencePluginGroups::RunError SEND COMPLETE");
    // complete the open request
    CompleteXIMPReq( aError );
    return KErrNone;
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::GetInterface()
// ---------------------------------------------------------------------------
//
TAny* CPresencePluginGroups::GetInterface(
    TInt32 aInterfaceId,
    TIfGetOps aOptions )
    {
    if ( aInterfaceId == GetInterfaceId() )
        {
        // caller wants this interface
        MProtocolPresentityGroups* myIf = this;
        return myIf;
        }
    if ( aOptions == MXIMPBase::EPanicIfUnknown )
        {
        User::Panic( KPluginName, KErrExtensionNotSupported );
        }
    return NULL;
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::GetInterface()
// ---------------------------------------------------------------------------
//
const TAny* CPresencePluginGroups::GetInterface(
    TInt32 aInterfaceId,
    TIfGetOps aOptions ) const
    {
    if ( aInterfaceId == GetInterfaceId() )
        {
        // caller wants this interface
        const MProtocolPresentityGroups* myIf = this;
        return myIf;
        }
    if ( aOptions == MXIMPBase::EPanicIfUnknown )
        {
        User::Panic( KPluginName, KErrExtensionNotSupported );
        }
    return NULL;
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::GetInterfaceId()
// ---------------------------------------------------------------------------
//
TInt32 CPresencePluginGroups::GetInterfaceId() const
    {
    return MProtocolPresentityGroups::KInterfaceId;
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::SetPresIdentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::SetPresIdentityL(
     const MXIMPIdentity& aPresentityId,
     TBool aFormatUri )
    {
    DP_SDA2("CPresencePluginGroups::SetPresIdentityL: %S", 
        &aPresentityId.Identity() ); 
     
    delete iPresIdentity;
    iPresIdentity = NULL;
     
    if ( aFormatUri )
        {
        DP_SDA("CPresencePluginGroups::SetPresIdentityL, format uri");

        HBufC8* identityCopy = HBufC8::NewLC( KBufSize255 );
        TPtr8 identityCopyPtr( identityCopy->Des() );
        identityCopyPtr.Copy( aPresentityId.Identity() );
    
        HBufC8* prefixUri = iPresenceData->CreatePresenceUri8LC( 
            identityCopyPtr );
    
        HBufC* prefixUri16 = HBufC::NewLC( KBufSize255 );
        TPtr prefixUri16Ptr( prefixUri16->Des() );
        prefixUri16Ptr.Copy( *prefixUri );
    
        iPresIdentity = prefixUri16;
        CleanupStack::Pop( prefixUri16 );
        CleanupStack::PopAndDestroy( prefixUri );
        CleanupStack::PopAndDestroy( identityCopy );
        }
    else
        {
        DP_SDA("CPresencePluginGroups::SetPresIdentityL, use as it is");
        iPresIdentity = aPresentityId.Identity().AllocL();
        }
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::StartXdmOperationL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::StartXdmOperationL(
    TXIMPRequestId aReqId,
    TPluginGroupsOperation aOperation )
    {
    DP_SDA("StartXdmOperationL StartXdmOperationL two param");
    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
    iXIMPId = aReqId;
    iOperation = aOperation;
    StartXdmOperationL();
    DP_SDA("StartXdmOperationL StartXdmOperationL two param end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::StartXdmOperationL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::StartXdmOperationL(
    const MXIMPIdentity& aId,
    TXIMPRequestId aReqId,
    TPluginGroupsOperation aOperation )
    {
    DP_SDA("StartXdmOperationL StartXdmOperationL three param");
    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
    SetPresIdentityL( aId, EFalse );
    iXIMPId = aReqId;
    iOperation = aOperation;
    StartXdmOperationL();
    }
  
// ---------------------------------------------------------------------------
// CPresencePluginGroups::StartXdmOperationL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::StartXdmOperationL()
    {
    if ( !iXdmUtils )
        {
        DP_SDA("CPresencePluginGroups::StartXdmOperationL Get xdmUtils");
        iXdmUtils = iConnObs.XdmUtilsL();
        }
    DP_SDA("CPresencePluginGroups::StartXdmOperationL StartXdmOperationL");
    
    iXdmUtils->InitializeXdmL( iStatus );
    iState = EPluginInitXdm;
    DP_SDA("CPresencePluginGroups::StartXdmOperationL SetActive");
    SetActive();
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::GetListOfListsL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::GetListOfListsL()
    {
    DP_SDA("CPresencePluginGroups::GetListOfListsL");

    RPointerArray<MXIMPIdentity> subscribed;
    CleanupClosePushL( subscribed );

    iXdmUtils->SubscribeBuddyListL( subscribed );
	DP_SDA("CPresencePluginGroups::GetListOfListsL SubscribeBudyList Ready");
	
    MXIMPObjectCollection* coll =
        iConnObs.ObjectFactory().NewObjectCollectionLC();    // << coll
        
    TInt count = subscribed.Count();
    DP_SDA2("CPresencePluginGroups::GetListOfListsL soul count %d", count);
    
    for ( TInt i = 0; i < count; i++ )
        {
        MXIMPIdentity* currId = subscribed[i];
        MPresentityGroupInfo* sInfo =
            iConnObs.PresenceObjectFactoryOwn().NewPresentityGroupInfoLC();
        sInfo->SetGroupIdL( currId ); // ownership is taken
        sInfo->SetGroupDisplayNameL( currId->Identity() );
        
        coll->AddObjectL( sInfo );      // ownership is taken
        CleanupStack::Pop();                                // >> bInfo
        }
    DP_SDA("SubscribeBudyList For ready SEND COMPLETE continue");    
     
    CompleteXIMPReq( KErrNone );
    
     // Callback for subscription state (terminated).
    MXIMPDataSubscriptionState* myState =
        iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
        
    MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
    
    // Notice: consider XIMP error codes
    myStatus->SetResultCode( KErrNone );
    myState->SetSubscriptionStateL(
        MXIMPDataSubscriptionState::ESubscriptionInactive );
        
    MProtocolPresentityGroupsDataHost& dataHost =
         iConnObs.ProtocolPresenceHost().GroupsDataHost();
    
    dataHost.SetPresentityGroupListDataSubscriptionStateL(
        myState, myStatus );
        
    dataHost.HandlePresentityGroupListL( coll );    

    CleanupStack::Pop( 3 ); // >> myState, myStatus, coll
   	CleanupStack::Pop( &subscribed );
   	DP_SDA("CPresencePluginGroups::GetListOfListsL end"); 
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::GetListContentL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::GetListContentL()
    {
    DP_SDA("CPresencePluginGroups::GetListContentL");
    
    if( !iPresIdentity->Compare( KPresenceBuddyList ) )
        {
        DP_SDA("CPresencePluginGroups::GetListContentL - get buddies");
        DoGetSubscribedBuddyListL();
        
        // Consider waiting complete for each subscribe before completing
        CompleteXIMPReq( KErrNone ); 
        }
    else if( !iPresIdentity->Compare( KPresenceSubcribedBuddys ) )
    	{
    	//Subscribe subscribed buddyes virtual group
    	DP_SDA("GetListContentL KPresenceSubcribedBuddys");
    	DoGetSubscribedBuddyListL();
    	}
    else
    	{
    	DP_SDA("CPresencePluginGroups::GetListContentL Wrong list name");	
        User::Leave( KErrNotFound );
        }
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoGetBuddyListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoGetBuddyListL()
    {
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL KPresenceBuddyList");
    MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory();
    MProtocolPresentityGroupsDataHost& dataHost =
        iConnObs.ProtocolPresenceHost().GroupsDataHost();
    
    MXIMPObjectCollection* entities =
    	myFactory.NewObjectCollectionLC();          // << entities
    iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *entities );
    DP_SDA("DoGetBuddyListL entities get ready SEND COMPLETE");
    
    // callback for data
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL callback data");
    MXIMPIdentity* id = myFactory.NewIdentityLC();  // << id
    id->SetIdentityL( iPresIdentity->Des() );
    dataHost.HandlePresentityGroupContentL( id, entities );
    CleanupStack::Pop();// >> id
    CleanupStack::Pop();// >> entities
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL callback ready");

    // Callback for subscription state (terminated).
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL terminated ");
    id = myFactory.NewIdentityLC();  // << id
    id->SetIdentityL( iPresIdentity->Des() );
    MXIMPDataSubscriptionState* myState =
    myFactory.NewDataSubscriptionStateLC();
    MXIMPStatus* myStatus = myFactory.NewStatusLC();
    // Notice: consider XIMP error codes
    myStatus->SetResultCode( KErrNone );
    myState->SetSubscriptionStateL(
    		MXIMPDataSubscriptionState::ESubscriptionInactive );
    
    dataHost.SetPresentityGroupContentDataSubscriptionStateL(
    	id, myState, myStatus );
  
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL Pop");
	CleanupStack::Pop( 3 );
	
    DP_SDA("CPresencePluginGroups::DoGetBuddyListL end");
    }
    
// ---------------------------------------------------------------------------
// CPresencePluginGroups::DoGetSubscribedBuddyListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DoGetSubscribedBuddyListL()
    {
    DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL");
    MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory();
    MProtocolPresentityGroupsDataHost& dataHost =
        iConnObs.ProtocolPresenceHost().GroupsDataHost();
    
    // Get internal list content
    MXIMPObjectCollection* entities =
    	myFactory.NewObjectCollectionLC();          // << entities
    iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *entities );
    DP_SDA("DoGetBuddyListL entities get ready SEND COMPLETE");
    CleanupStack::PopAndDestroy();	// entities
    
    // start getting virtualEntities
    MXIMPObjectCollection* virtualEntities =
        myFactory.NewObjectCollectionLC();// << virtualEntities

    iSubscribedBuddies->GetVirtualEntitiesL( *virtualEntities );
    
    DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL - subscribe all");
    iConnObs.WatcherHandlerL()->SubscribeAllL();
    DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL - subscribe all ok");

    // callback for data
    DP_SDA("DoGetSubscribedBuddyListL callback data");
    MXIMPIdentity* id = myFactory.NewIdentityLC();  // << id
    id->SetIdentityL( iPresIdentity->Des() );
    dataHost.HandlePresentityGroupContentL( id, virtualEntities );
    CleanupStack::Pop();                            // >> id
    CleanupStack::Pop();                            // >> entities
    DP_SDA("DoGetSubscribedBuddyListL callback ready");

    // Callback for subscription state (terminated).
    DP_SDA("CPresencePluginGroups::DoGetSubscribedBuddyListL terminated");
    id = myFactory.NewIdentityLC();  // << id
    id->SetIdentityL( iPresIdentity->Des() );
    MXIMPDataSubscriptionState* myState =
    	myFactory.NewDataSubscriptionStateLC();
    MXIMPStatus* myStatus = myFactory.NewStatusLC();
    // Notice: consider XIMP error codes
    myStatus->SetResultCode( KErrNone );
    myState->SetSubscriptionStateL(
    		MXIMPDataSubscriptionState::ESubscriptionActive );
    dataHost.SetPresentityGroupContentDataSubscriptionStateL(
    	id, myState, myStatus );
    
	CleanupStack::Pop( 3 );
	
    DP_SDA("DoGetSubscribedBuddyListL - KPresenceOnlineBuddy case end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::CompleteXIMPReq
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::CompleteXIMPReq( TInt aStatus )
    {
    DP_SDA("CPresencePluginGroups::CompleteXIMPReq");
    if ( iCompleted  )
        {
        DP_SDA("CPresencePluginGroups::CompleteXIMPReq return");
        return;
        }

    iCompleted = ETrue;
    iOperation = ENoOperation;
    iConnObs.CompleteReq( iXIMPId, aStatus );
    iXIMPId = TXIMPRequestId();
    DP_SDA("CPresencePluginGroups::CompleteXIMPReq end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginGroups::DeletePersonCacheL
// ---------------------------------------------------------------------------
//
void CPresencePluginGroups::DeletePersonCacheL()
    {
    DP_SDA("CPresencePluginGroups::DeletePersonCacheL");
    DP_SDA(" -> strip prefix from uri");
    HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
    iPresenceData->DeletePresenceL( *withoutPrefix );
    CleanupStack::PopAndDestroy( withoutPrefix );
    DP_SDA("CPresencePluginGroups::DeletePersonCacheL out");
    }

// End of file