presencefwsimpleadpt/src/simpleplugingroups.cpp
branchRCL_3
changeset 35 fbd2e7cec7ef
parent 0 c8caa15ef882
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presencefwsimpleadpt/src/simpleplugingroups.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,893 @@
+/*
+* 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:    SIMPLE Protocol implementation for Presence Framework
+*
+*/
+
+
+
+
+#include <e32std.h>
+
+#include <presentitygroupinfo.h>
+#include <presenceobjectfactory.h>
+#include <presentitygroupmemberinfo.h>
+#include <protocolpresencedatahost.h>
+#include <protocolpresentitygroupsdatahost.h>
+#include <ximpdatasubscriptionstate.h>
+#include <ximpidentity.h>
+#include <ximpobjectfactory.h>
+#include <ximpobjectcollection.h>
+#include <ximpprotocolconnectionhost.h>
+#include <ximpstatus.h>
+
+#include <simplefactory.h>
+#include <msimpleconnection.h>
+
+#include <pressettingsapi.h>
+#include <cpresencexdm.h>
+#include <rlspresxdmconsts.h>
+#include <XdmErrors.h>
+#include <presenceerrors.hrh>
+
+#include "simpleplugingroups.h"
+#include "simpleplugindebugutils.h"
+#include "simplepluginxdmutils.h"
+#include "simpleplugincommon.h"
+#include "simplepluginconnection.h"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CSimplePluginGroups
+// ---------------------------------------------------------------------------
+//
+CSimplePluginGroups::CSimplePluginGroups(
+    MSimplePluginConnectionObs& aObs  )
+: CActive( CActive::EPriorityStandard ),
+  iConnObs(aObs), iSubscribed(KSimplePluginSubsNone),
+  iOperation( ENoOperation),
+  iState( EPluginIdle ), iCompleted( ETrue )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::ConstructL( )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::NewL
+// ---------------------------------------------------------------------------
+//
+CSimplePluginGroups* CSimplePluginGroups::NewL(
+    MSimplePluginConnectionObs& aObs )
+    {
+    CSimplePluginGroups* self =
+        new( ELeave ) CSimplePluginGroups( aObs );
+    CleanupStack::PushL( self );
+    self->ConstructL(  );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::~CSimplePluginGroups
+// ---------------------------------------------------------------------------
+//
+CSimplePluginGroups::~CSimplePluginGroups()
+    {
+    delete iPresIdentity;
+    delete iPresIdentity2;
+    delete iDisplayName;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoSubscribePresentityGroupListL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoSubscribePresentityGroupListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoSubscribePresentityGroupListL"));
+#endif
+
+    iCompleted = EFalse;
+
+    // List of lists under OMa buddylist
+    StartXdmOperationL( aReqId, EGetListOfLists );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoUnsubscribePresentityGroupListL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoUnsubscribePresentityGroupListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoUnsubscribePresentityGroupListL"));
+#endif
+    iPrFwId = aReqId;
+    iCompleted = EFalse;
+    CompletePrFwReq( KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoCreatePresentityGroupL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoCreatePresentityGroupL(
+    const MXIMPIdentity& aGroupId,
+    const TDesC16& aDisplayName,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoCreatePresentityGroupL"));
+#endif
+    iCompleted = EFalse;
+    StartXdmOperationL(
+        aGroupId, aDisplayName, aReqId, ECreatePresentityGroup );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoDeletePresentityGroupL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoDeletePresentityGroupL(
+    const MXIMPIdentity& aGroupId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoDeletePresentityGroupL"));
+#endif
+    iCompleted = EFalse;
+    StartXdmOperationL( aGroupId, aReqId, EDeletePresentityGroup );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoUpdatePresentityGroupDisplayNameL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoUpdatePresentityGroupDisplayNameL(
+    const MXIMPIdentity& /*aGroupId*/,
+    const TDesC16& /*aDisplayName*/,
+    TXIMPRequestId /*aReqId*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoUpdatePresentityGroupDisplayNameL"));
+#endif
+    // Notice: not supported.
+    User::Leave( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoSubscribePresentityGroupContentL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoSubscribePresentityGroupContentL(
+    const MXIMPIdentity& aGroupId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoSubscribePresentityGroupContentL"));
+#endif
+    iCompleted = EFalse;
+
+    // List of lists under OMa buddylist
+    StartXdmOperationL( aGroupId, aReqId, EGetListContent );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoUnsubscribePresentityGroupContentL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoUnsubscribePresentityGroupContentL(
+    const MXIMPIdentity& /*aGroupId*/,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoUnsubscribePresentityGroupContentL"));
+#endif
+    iCompleted = EFalse;
+    iPrFwId = aReqId;
+    CompletePrFwReq( KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoAddPresentityGroupMemberL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoAddPresentityGroupMemberL(
+    const MXIMPIdentity& aGroupId,
+    const MXIMPIdentity& aMemberId,
+    const TDesC16& aMemberDisplayName,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoAddPresentityGroupMemberL"));
+#endif
+    iCompleted = EFalse;
+    StartXdmOperationL(
+        aGroupId, aMemberId, aMemberDisplayName,
+        aReqId, EAddPresentityGroupMember );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoRemovePresentityGroupMemberL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoRemovePresentityGroupMemberL(
+    const MXIMPIdentity& aGroupId,
+    const MXIMPIdentity& aMemberId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoRemovePresentityGroupMemberL"));
+#endif
+    iCompleted = EFalse;
+    StartXdmOperationL(
+        aGroupId, aMemberId,
+        aReqId, ERemovePresentityGroupMember );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoUpdatePresentityGroupMemberDisplayNameL(
+    const MXIMPIdentity& /*aGroupId*/,
+    const MXIMPIdentity& /*aMemberId*/,
+    const TDesC16& /*aMemberDisplayName*/,
+    TXIMPRequestId /*aReqId*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(
+        _L("PluginGroups: DoUpdatePresentityGroupMemberDisplayNameL"));
+#endif
+    // Notice: Not supported.
+    User::Leave( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoCancel(  )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: DoCancel"));
+#endif
+    if ( iOperation != ENoOperation )
+        {
+        iXdmUtils->Cancel();
+        }
+    else
+        {
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::RunL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::RunL(  )
+    {
+    TInt myStatus = iStatus.Int();
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: RunL status=%d active=%d"), myStatus, IsActive() );
+#endif
+
+    if ( !myStatus )
+        {
+        // OK resposne
+        CallActualXdmOperationL();
+        }
+    else
+        {
+        if ( iOperation == EDeletePresentityGroup && iState == EPluginCommitRls )
+            {
+            // Igonere RLS deletion failure and contine Shared XDM deletion
+            CallActualXdmOperationL();
+            }
+        else
+            {
+            // Other errors terminated the show
+            CompletePrFwReq( myStatus );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CallActualXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::CallActualXdmOperationL()
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: CallActualXdmOperationL operation=%d"), iOperation );
+#endif
+
+    switch ( iOperation )
+        {
+        case ECreatePresentityGroup:
+            HandleCreatePresentityGroupL( iPresIdentity->Des(), iDisplayName->Des() );
+            break;
+        case EDeletePresentityGroup:
+            HandleDeletePresentityGroupL( iPresIdentity->Des() );
+            break;
+        case EAddPresentityGroupMember:
+            HandleAddPresentityGroupMemberL();
+            break;
+        case ERemovePresentityGroupMember:
+            HandleRemovePresentityGroupMemberL();
+            break;
+        case EGetListOfLists:
+            GetListOfListsL();
+            break;
+        case EGetListContent:
+            GetListContentL();
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CSimplePluginGroups::RunError( TInt aError )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: RunError %d active=%d"), aError, IsActive());
+#endif
+    // complete the open request
+    CompletePrFwReq( aError );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::GetInterface()
+// ---------------------------------------------------------------------------
+//
+TAny* CSimplePluginGroups::GetInterface(
+        TInt32 aInterfaceId,
+        TIfGetOps aOptions )
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        MProtocolPresentityGroups* myIf = this;
+        return myIf;
+        }
+    if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::GetInterface()
+// ---------------------------------------------------------------------------
+//
+const TAny* CSimplePluginGroups::GetInterface(
+    TInt32 aInterfaceId,
+    TIfGetOps aOptions ) const
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        const MProtocolPresentityGroups* myIf = this;
+        return myIf;
+        }
+    else if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::GetInterfaceId()
+// ---------------------------------------------------------------------------
+//
+TInt32 CSimplePluginGroups::GetInterfaceId() const
+    {
+    return MProtocolPresentityGroups::KInterfaceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::SetPresIdentityL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::SetPresIdentityL(
+    const MXIMPIdentity& aPresentityId )
+    {
+    delete iPresIdentity;
+    iPresIdentity = NULL;
+    iPresIdentity = aPresentityId.Identity().AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::SetPresIdentity2L()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::SetPresIdentity2L(
+    const MXIMPIdentity& aPresentityId )
+    {
+    delete iPresIdentity2;
+    iPresIdentity2 = NULL;
+    iPresIdentity2 = aPresentityId.Identity().AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL(
+    TXIMPRequestId aReqId,
+    TPluginGroupsOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    StartXdmOperationL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL(
+    const MXIMPIdentity& aId,
+    TXIMPRequestId aReqId,
+    TPluginGroupsOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    SetPresIdentityL( aId );
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    StartXdmOperationL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL(
+        const MXIMPIdentity& aId,
+        const TDesC16& aDisplayName,
+        TXIMPRequestId aReqId,
+        TPluginGroupsOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    SetPresIdentityL( aId );
+
+    delete iDisplayName;
+    iDisplayName = NULL;
+    iDisplayName = aDisplayName.AllocL();
+
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    StartXdmOperationL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL(
+        const MXIMPIdentity& aId,
+        const MXIMPIdentity& aMemberId,
+        TXIMPRequestId aReqId,
+        TPluginGroupsOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    SetPresIdentityL( aId );
+    SetPresIdentity2L( aMemberId );
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    StartXdmOperationL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL(
+        const MXIMPIdentity& aId,
+        const MXIMPIdentity& aMemberId,
+        const TDesC16& aDisplayName,
+        TXIMPRequestId aReqId,
+        TPluginGroupsOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    SetPresIdentityL( aId );
+    SetPresIdentity2L( aMemberId );
+
+    delete iDisplayName;
+    iDisplayName = NULL;
+    iDisplayName = aDisplayName.AllocL();
+
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    StartXdmOperationL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::StartXdmOperationL()
+    {
+    TRAPD( err, DoStartXdmOperationL() );
+    if ( err )
+        {
+        User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+        }
+    else
+        {
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::DoStartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::DoStartXdmOperationL()
+    {
+    if ( !iXdmUtils )
+        {
+        iXdmUtils = iConnObs.XdmUtilsL();
+        }
+    else
+        {
+        }
+
+    // Delete Group is the only method that access XDM rules,
+    // others access shared lists only.
+    if ( iOperation != EDeletePresentityGroup )
+        {
+        iXdmUtils->InitializeXdmsOnlyL( iStatus );
+        }
+    else
+        {
+        iXdmUtils->InitializeXdmL( iStatus );
+        }
+
+    iState = EPluginInitXdm;
+    SetActive();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::GetListOfListsL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::GetListOfListsL()
+    {
+    MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory();
+    MProtocolPresentityGroupsDataHost& dataHost =
+        iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost();
+
+    // This searches data from the local cache only.
+    MXIMPObjectCollection* userLists =
+        myFactory.NewObjectCollectionLC();          // << userLists
+
+    const TInt KMyGran = 10;
+    CDesCArrayFlat* lists = new (ELeave) CDesCArrayFlat( KMyGran );
+    CleanupStack::PushL( lists );      // << lists
+
+    CDesCArrayFlat* dNames = new (ELeave) CDesCArrayFlat( KMyGran );
+    CleanupStack::PushL( dNames );      // << dNames
+
+    iXdmUtils->GetUserListsL( *lists, *dNames );
+
+    CopyGroupArraysToCollectionL( *lists, *dNames, *userLists );
+
+    CleanupStack::PopAndDestroy( dNames );  // >> dNames
+    CleanupStack::PopAndDestroy( lists );   // >> lists
+
+    CompletePrFwReq( KErrNone );
+
+    // Callback for subscription state (terminated).
+    MXIMPDataSubscriptionState* myState =
+        myFactory.NewDataSubscriptionStateLC();
+    MXIMPStatus* myStatus = myFactory.NewStatusLC();
+    // Notice: consider error codes
+    myStatus->SetResultCode( KErrNone );
+    myState->SetSubscriptionStateL(
+        MXIMPDataSubscriptionState::ESubscriptionInactive );
+    myState->SetDataStateL( MXIMPDataSubscriptionState::EDataUnavailable );
+#ifdef _DEBUG
+    PluginLogger::Log(
+    _L("PluginGroups: callback SetPresentityGroupListDataSubscriptionStateL"));
+#endif
+    dataHost.SetPresentityGroupListDataSubscriptionStateL(
+        myState, myStatus );
+
+
+    CleanupStack::Pop( 2 ); // >> myState, myStatus
+
+    // callback for data
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: callback HandlePresentityGroupListL"));
+#endif
+    dataHost.HandlePresentityGroupListL( userLists );
+    CleanupStack::Pop();     // >> userLists
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::GetListContentL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::GetListContentL()
+    {
+    MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory();
+    MProtocolPresentityGroupsDataHost& dataHost =
+        iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost();
+
+    MXIMPObjectCollection* entities =
+        myFactory.NewObjectCollectionLC();          // << entities
+
+    const TInt KMyGran = 10;
+    CPtrCArray* ids = new (ELeave) CPtrCArray( KMyGran );
+    CleanupStack::PushL( ids );      // << ids
+
+    CPtrCArray* dispNames = new (ELeave) CPtrCArray( KMyGran );
+    CleanupStack::PushL( dispNames  );      // << dispNames
+
+
+    iXdmUtils->GetEntitiesInListL( iPresIdentity->Des(), *ids, *dispNames );
+
+    CopyGroupMembersToCollectionL( *ids, *dispNames, *entities );
+
+    CleanupStack::PopAndDestroy( dispNames );
+    CleanupStack::PopAndDestroy( ids );
+
+    // Complete the PrFw request
+    CompletePrFwReq( KErrNone );
+
+    // callback for data
+    MXIMPIdentity* id = myFactory.NewIdentityLC();  // << id
+    id->SetIdentityL( iPresIdentity->Des() );
+#ifdef _DEBUG
+    PluginLogger::Log(
+        _L("PluginGroups: callback HandlePresentityGroupContentL ."));
+#endif
+    dataHost.HandlePresentityGroupContentL( id, entities );
+    CleanupStack::Pop();                  // >> id
+    CleanupStack::Pop();                  // >> entities
+
+    // Callback for subscription state (terminated).
+    id = myFactory.NewIdentityLC();                     // << id
+    id->SetIdentityL( iPresIdentity->Des() );
+    MXIMPDataSubscriptionState* myState =
+        myFactory.NewDataSubscriptionStateLC();         // << myState
+    MXIMPStatus* myStatus = myFactory.NewStatusLC();    // << myStatus
+    // Notice: consider error codes
+    myStatus->SetResultCode( KErrNone );
+    myState->SetSubscriptionStateL(
+        MXIMPDataSubscriptionState::ESubscriptionInactive );
+#ifdef _DEBUG
+    PluginLogger::Log(
+        _L("PluginGroups: callback SetPresentityGroupContentDataSubscriptionStateL"));
+#endif
+    dataHost.SetPresentityGroupContentDataSubscriptionStateL(
+        id, myState, myStatus );
+    CleanupStack::Pop( 3 ); // >> myStatus, myState, id
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CompletePrFwReq
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::CompletePrFwReq( TInt aStatus )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: CompletePrFwReq status=%d"), aStatus );
+#endif
+
+    if ( iCompleted  )
+        {
+        return;
+        }
+
+    iCompleted = ETrue;
+    iOperation = ENoOperation;
+    iConnObs.CompleteReq( iPrFwId, aStatus );
+    iPrFwId = TXIMPRequestId();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CompleteMe
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::CompleteMe( TInt aStatus )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginGroups: CompleteMe status=%d"), aStatus );
+#endif
+
+    iStatus = KRequestPending;
+    TRequestStatus* s= &iStatus;
+    User::RequestComplete( s, aStatus );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CopyGroupArraysToCollectionL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::CopyGroupArraysToCollectionL(
+    CDesCArrayFlat& aLists, CDesCArrayFlat& aNames, MXIMPObjectCollection& aCollection )
+    {
+    TInt count = aLists.Count();
+    for ( TInt i=0; i < count; i++ )
+        {
+        // create here the PrFW group info
+        MPresentityGroupInfo* info =
+            iConnObs.PresenceObjectFactory().NewPresentityGroupInfoLC(); // << info
+        MXIMPIdentity* id = iConnObs.ObjectFactory().NewIdentityLC();  // << id
+        id->SetIdentityL( aLists[i] );
+        info->SetGroupIdL( id );
+        CleanupStack::Pop(); // >> id
+
+        info->SetGroupDisplayNameL( aNames[i] );
+        aCollection.AddObjectL( info );
+        CleanupStack::Pop(); // >> info
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::CopyGroupMembersToCollectionL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::CopyGroupMembersToCollectionL(
+    CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection)
+    {
+    TInt count = aIds.Count();
+    for ( TInt i=0; i < count; i++ )
+        {
+        // create here MPresentityGroupMemberInfo
+        MPresentityGroupMemberInfo* info =
+            iConnObs.PresenceObjectFactory().NewPresentityGroupMemberInfoLC(); // << info
+        MXIMPIdentity* id = iConnObs.ObjectFactory().NewIdentityLC();  // << id
+        id->SetIdentityL( aIds[i] );
+        info->SetGroupMemberIdL( id );
+        CleanupStack::Pop(); // >> id
+
+        info->SetGroupMemberDisplayNameL( aNames[i] );
+        aCollection.AddObjectL( info );
+        CleanupStack::Pop(); // >> info
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::HandleCreatePresentityGroupL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::HandleCreatePresentityGroupL(
+    const TDesC& aGroupId, const TDesC& aDispName )
+    {
+    if ( iState == EPluginInitXdm )
+        {
+        iState = EPluginCommitXdm;
+        iXdmUtils->CreateEntityGroupL( aGroupId, aDispName );
+        iXdmUtils->CommitXdmL( iStatus );
+        SetActive();
+        }
+    else
+        {
+        // We are ready
+        CompletePrFwReq( KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::HandleDeletePresentityGroupL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::HandleDeletePresentityGroupL( const TDesC& aGroupId )
+    {
+    if ( iState == EPluginInitXdm )
+        {
+        iState = EPluginFetchRls;
+        iXdmUtils->FetchRlsL( iStatus );
+        SetActive();
+        }
+    else if ( iState == EPluginFetchRls )
+        {
+        iState = EPluginCommitRls;
+        // Remove RLS service
+        iXdmUtils->RemoveRlsServiceByResourceListL( aGroupId, iStatus );
+        SetActive();
+        }
+    else if ( iState == EPluginCommitRls )
+        {
+        iState = EPluginCommitXdm;
+        iXdmUtils->DeleteEntityGroupL( aGroupId );
+        iXdmUtils->CommitXdmL( iStatus );
+        SetActive();
+        }
+    else if ( iState == EPluginCommitXdm )
+        {
+        // Delete the group from a granted rule. The following won't leave if
+        // it does not locate under the rule.
+#ifdef _DEBUG
+        PluginLogger::Log(
+                _L("PluginWatcher: TEST COVERS 2 **"));
+#endif
+        iState = ERemoveGroupFromGranted;
+        iXdmUtils->RemoveGroupFromGrantedL( aGroupId, iStatus );
+        SetActive();
+        }
+    else
+        {
+        // We are ready
+        CompletePrFwReq( KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::HandleAddPresentityGroupMemberL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::HandleAddPresentityGroupMemberL( )
+    {
+    if ( iState == EPluginInitXdm )
+        {
+        iXdmUtils->AddPresentityGroupMemberL(
+            iPresIdentity->Des(), iPresIdentity2->Des(),
+            iDisplayName->Des(), iStatus );
+        iState = EPluginAddGroupMember;
+        SetActive();
+        }
+    else
+        {
+        // We are ready
+        CompletePrFwReq( KErrNone );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginGroups::HandleRemovePresentityGroupMemberL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginGroups::HandleRemovePresentityGroupMemberL()
+    {
+    if ( iState == EPluginInitXdm )
+        {
+        iXdmUtils->RemovePresentityGroupMemberL(
+            iPresIdentity->Des(), iPresIdentity2->Des(), iStatus );
+        iState = EPluginRemoveGroupMember;
+        SetActive();
+        }
+    else
+        {
+        // We are ready
+        CompletePrFwReq( KErrNone );
+        }
+    }
+
+
+// End of file
+