presencefwsimpleadpt/src/simplepluginxdmutils.cpp
branchRCL_3
changeset 34 2669f8761a99
parent 31 2580314736af
child 35 fbd2e7cec7ef
--- a/presencefwsimpleadpt/src/simplepluginxdmutils.cpp	Thu Aug 19 10:19:02 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2522 +0,0 @@
-/*
-* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:    SIMPLE Protocol implementation for Presence Framework
-*
-*/
-
-
-
-
-#include <e32std.h>
-#include <utf.h>
-
-#include <simplefactory.h>
-#include <msimpleconnection.h>
-
-#include <pressettingsapi.h>
-#include <cpresencexdm.h>
-#include <rlspresxdmconsts.h>
-#include <XdmErrors.h>
-#include <prescondmisc.h>
-#include <prescondidentityone.h>
-#include <presenceactionxdm.h>
-#include <presencetransformxdm.h>
-#include <crlsxdm.h>
-
-#include <XdmEngine.h>
-#include <XdmDocument.h>
-#include <XdmProtocolInfo.h>
-#include <XdmDocumentNode.h>
-#include <XdmNodeAttribute.h>
-#include <XdmSettingsApi.h>
-#include <XdmErrors.h>
-
-#include "simpleplugindebugutils.h"
-#include "simpleplugincommon.h"
-#include "simplepluginxdmutils.h"
-#include "simpleplugindata.h"
-#include "simplepluginvariation.h"
-#include "msimplepluginsettings.h"
-
-// Test suite
-#include "msimpleplugintestobs.h"
-
-// This is for debugging and local test mode oly
-#include <in_sock.h>
-
-// URI prefixies
-const TInt KMyLenPrefix = 4;
-_LIT16( KMySip, "sip:" );
-_LIT16( KMyTel, "tel:" );
-
-
-// ======== MEMBER FUNCTIONS ========
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CSimplePluginXdmUtils
-// ---------------------------------------------------------------------------
-//
-CSimplePluginXdmUtils::CSimplePluginXdmUtils(
-    MSimplePluginSettings& aConnSets, TInt aXmdId )
-: CActive( EPriorityStandard ),
-  iConnSets(aConnSets), iSettingsId(aXmdId),
-  iXdmState(EStateIdle), iOperation( ENoOperation), iTestObs( NULL )
-    {
-    CActiveScheduler::Add( this );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::ConstructL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::ConstructL(  )
-    {
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::NewL
-// ---------------------------------------------------------------------------
-//
-CSimplePluginXdmUtils* CSimplePluginXdmUtils::NewL(
-    MSimplePluginSettings& aConnSets,
-    TInt aXmdId )
-    {
-    CSimplePluginXdmUtils* self =
-        new( ELeave ) CSimplePluginXdmUtils( aConnSets, aXmdId );
-    CleanupStack::PushL( self );
-    self->ConstructL(   );
-    CleanupStack::Pop( self );
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: NewL this=%d"), (TInt)self);
-#endif
-
-    return self;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::~CSimplePluginXdmUtils()
-// ---------------------------------------------------------------------------
-//
-CSimplePluginXdmUtils::~CSimplePluginXdmUtils()
-    {
-
-    Cancel();
-
-    CancelWrappers();
-
-    if ( iXdmDoc && iXdmEngine )
-        {
-        TRAP_IGNORE( iXdmEngine->DeleteDocumentModelL( iXdmDoc ));
-        }
-    delete iRlsXdm;
-    delete iPresenceXdm;
-    delete iXdmEngine;
-    delete iAuxBuffer;
-
-    delete iAuxBuffer2;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::InitializeXdmL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::InitializeXdmL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: InitializeXdmL") );
-#endif
-
-    iOperation = EXdmInit;
-    iClientStatus = &aStatus;
-
-    if ( !iXdmOk )
-        {
-        GetXdmOMAListsL();
-        iXdmState = EGetXdmOMALists;
-        *iClientStatus = KRequestPending;
-        }
-    else if ( !iPresXdmOk )
-        {
-        GetXdmRulesL();
-        *iClientStatus = KRequestPending;
-        }
-    else
-        {
-        // All is ok
-        *iClientStatus = KRequestPending;
-        CompleteClientReq( KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::InitializeXdmsOnlyL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::InitializeXdmsOnlyL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: InitializeXdmsOnlyL") );
-#endif
-
-    iOperation = EXdmInitXdmsOnly;
-    iClientStatus = &aStatus;
-
-    if ( !iXdmOk )
-        {
-        GetXdmOMAListsL();
-        iXdmState = EGetXdmOMAListsOnly;
-        *iClientStatus = KRequestPending;
-        }
-    else
-        {
-        // All is ok
-        *iClientStatus = KRequestPending;
-        CompleteClientReq( KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RunL()
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RunL(  )
-    {
-    TPluginXdmState origState = iXdmState;
-    iXdmState = EStateIdle;
-    TInt myStatus = iStatus.Int();
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RunL %d"), myStatus );
-#endif
-
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackInRunL(
-            myStatus, origState, iOperation, KNullDesC );
-        }
-
-#ifdef FAKE_XDM_OK
-#ifdef _DEBUG
-    // -191 = KErrHostUnreach in_sock.h
-    if ( myStatus == KErrTimedOut || myStatus == KXcapErrorNetworkNotAvailabe || -191 )
-        {
-        PluginLogger::Log(_L("PluginXdmUtils : RunL FAKE_XDM_OK resets error code %d"), myStatus );
-        myStatus = 0;
-        }
-#endif
-#endif
-
-    DoXdmRunL( origState, myStatus );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoXdmRunL()
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoXdmRunL( TPluginXdmState aOrigState, TInt aStatus )
-    {
-
-    switch ( aOrigState )
-        {
-        case EGetXdmOMALists:
-        case EGetXdmOMAListsOnly:
-            {
-            // no OMA resource-list, let's start to create it.
-            if ( CreateXdmOMAListsIfNeededL() )
-                {
-                iXdmState = aOrigState == EGetXdmOMALists ? ECreateXdmOMALists : ECreateXdmOMAListsOnly;
-                }
-            else
-                {
-                iXdmOk = ETrue;
-                if ( !iPresXdmOk && aOrigState == EGetXdmOMALists )
-                    {
-                    GetXdmRulesL();
-                    }
-                else
-                    {
-                    CompleteClientReq( KErrNone );
-                    }
-                }
-            }
-            break;
-        case ECreateXdmOMALists:
-            {
-            if ( aStatus )
-                {
-                CompleteClientReq( aStatus );
-                }
-            else
-                {
-                iXdmOk = ETrue;
-                GetXdmRulesL();
-                }
-            }
-            break;
-        case ECreateXdmOMAListsOnly:
-            {
-            if ( !aStatus )
-                {
-                iXdmOk = ETrue;
-                }
-            CompleteClientReq( aStatus );
-            }
-            break;
-        default:
-            // complete reqular request
-            CompleteClientReq( aStatus );
-            break;
-        };
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CancelWrappers()
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CancelWrappers( )
-    {
-    iOperation = EXdmCancel;
-
-    // Cancel M-class interface methods that calls callback method.
-    if ( iXdmState == EGetRlsServices ||
-         iXdmState == EUpdateRlsServices ||
-         iXdmState == EReUpdateRlsServices )
-        {
-        iXdmState = ECancelDocument;
-#ifdef _DEBUG
-        PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->Cancel"));
-#endif
-        // Better call Cancel() instead of CancelUpdateL().
-        // It works and is easier to implement. Otherwise we should have here
-        // SetActive(); iStatus=KRequestPending; User::WaitForRequest(iStatus)
-        // and we should have implemented HandleRLSUpdateCancelL that completes
-        // own iStatus.
-        iRlsXdm->Cancel();
-        }
-    else if ( iXdmState == EGetXdmRules ||
-              iXdmState == EUpdateXdmRules )
-        {
-        iXdmState = ECancelDocument;
-#ifdef _DEBUG
-        PluginLogger::Log(_L("PluginXdm: -> iPresenceXdm->Cancel"));
-#endif
-        iPresenceXdm->Cancel();
-        }
-    else
-        {
-        }
-    }
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoCancel()
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoCancel(  )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: DoCancel"));
-#endif
-    iOperation = EXdmCancel;
-
-    if ( iXdmState == EGetXdmOMALists || iXdmState == ECreateXdmOMALists ||
-         iXdmState == EGetXdmOMAListsOnly || iXdmState == ECreateXdmOMAListsOnly ||
-         iXdmState == EUpdateXdmOMAList )
-        {
-        // Cancel a request made to XDM Engine.
-        iXdmState = ECancelDocument;
-#ifdef _DEBUG
-      PluginLogger::Log(_L("PluginXdm: iXdmEngine->CancelUpdate"));
-#endif
-        iXdmEngine->CancelUpdate( iXdmDoc );
-        CompleteClientReq( KErrCancel );
-        }
-    else
-        {
-        // Cancel a request where we have completed our own iStatus.
-        // Very rare posibility that this happens when GetXdmOMALists is not ready.
-        // It's very hard to make it happen in test suite.
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RunError
-// ---------------------------------------------------------------------------
-//
-TInt CSimplePluginXdmUtils::RunError( TInt aError )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RunError"));
-#endif
-    // complete the open request
-    CompleteClientReq( aError );
-    return KErrNone;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::FetchRlsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::FetchRlsL(
-    TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: FetchRlsL"));
-#endif
-    _LIT( KMyOper, "FetchRlsL");
-
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmRlsFetch;
-
-    if ( !iRlsXdm )
-        {
-        iRlsXdm = CRLSXDM::NewL( iSettingsId );
-        }
-
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackAsynchL(
-            KErrNone, iXdmState, iOperation, KMyOper );
-        }
-
-    // The following returns in MRLSPresXDMAsyncHandler callback
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->UpdateAllFromServerL"));
-#endif
-    User::LeaveIfError( iRlsXdm->UpdateAllFromServerL( this ));
-
-    *iClientStatus = KRequestPending;
-
-    iXdmState = EGetRlsServices;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AddRlsGroupL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::AddRlsGroupL(
-    const TDesC&  aName )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: AddRlsGroupL"));
-#endif
-    iOperation = EXdmRlsAdd;
-
-    HBufC16* buf = CreateRlsDocumentUri16LC(
-        aName, iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() );
-
-    // KErrAlreadyExists
-    TInt errx = iRlsXdm->AddServiceURIL( buf->Des() );
-    if ( errx && errx != KErrAlreadyExists )
-        {
-        User::Leave( errx );
-        }
-    User::LeaveIfError( iRlsXdm->SwitchToServiceURIL( buf->Des() ));
-
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    TInt err = iRlsXdm->AddElementL( KPresResourceList,
-        listUri->Des(), aName );
-    if ( err && err != KErrAlreadyExists )
-        {
-        User::Leave( err );
-        }
-
-    // Save aName for RLS Service URI negoriation handling (HTTP error 409).
-    // Notice: We assume that only one AddRlsGroupL is called between CommitRlsL methods.
-
-    delete iAuxBuffer;
-    iAuxBuffer = NULL;
-    iAuxBuffer = aName.AllocL();
-
-    CleanupStack::PopAndDestroy( listUri );     // >> listUri
-    CleanupStack::PopAndDestroy( xcapUri );     // >> xcapUri
-    CleanupStack::PopAndDestroy( buf );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemoveRlsGroupL
-// Use RemoveRlsServiceByResourceListL when possible
-//
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemoveRlsGroupL(
-    const TDesC&  aName )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemoveRlsGroupL"));
-#endif
-
-    iOperation = EXdmRlsRemove;
-
-    HBufC16* buf = CreateRlsDocumentUri16LC(
-        aName, iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() );
-
-    User::LeaveIfError( iRlsXdm->RemoveServiceURIL( buf->Des()));
-    CleanupStack::PopAndDestroy( buf );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AddEntityToGrantedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::AddEntityToGrantedL(
-    const TDesC&  aUri, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: AddEntityToGrantedL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmAddUserToGroup;
-
-    DoAddUserToListL( iConnSets.Variation().GrantListName(), aUri );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-    iXdmState = EUpdateXdmOMAList;
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AddEntityToBlockedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::AddEntityToBlockedL(
-    const TDesC&  aUri, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: AddEntityToBlockedL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmAddUserToGroup;
-    DoAddUserToListL( KSimpleOMABlockedList, aUri );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-    iXdmState = EUpdateXdmOMAList;
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoAddUserToListL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoAddUserToListL(
-    const TDesC& aList, const TDesC&  aUri )
-    {
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    RPointerArray<CXdmDocumentNode> lists;
-    CleanupClosePushL( lists );                 // <<  lists
-
-    CXdmDocumentNode* root = iXdmDoc->DocumentRoot();
-    CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList );
-
-    if ( foundNode )
-        {
-        if ( foundNode->IsEmptyNode() )
-            {
-            foundNode->SetEmptyNode( EFalse );
-            }
-
-        CXdmDocumentNode* newNode = foundNode->CreateChileNodeL( KSimpleEntry );
-        CXdmNodeAttribute* attributeEntryUri = newNode->CreateAttributeL( KSimpleUri );
-        attributeEntryUri->SetAttributeValueL( aUri );
-        iXdmDoc->AppendL( newNode );
-        }
-    else
-        {
-        User::Leave( KErrNotFound );
-        }
-
-    CleanupStack::PopAndDestroy( &lists  );     // >> lists
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemoveEntityFromGrantedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemoveEntityFromGrantedL(
-    const TDesC&  aUri, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemoveEntityFromGrantedL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmRemoveUserFromGroup;
-    DoRemoveUserFromListL( iConnSets.Variation().GrantListName(), aUri );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-    iXdmState = EUpdateXdmOMAList;
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemoveEntityFromBlockedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemoveEntityFromBlockedL(
-    const TDesC&  aUri, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemoveEntityFromBlockedL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmRemoveUserFromGroup;
-    DoRemoveUserFromListL( KSimpleOMABlockedList, aUri );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-    iXdmState = EUpdateXdmOMAList;
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoRemoveUserFromListL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoRemoveUserFromListL(
-    const TDesC& aList, const TDesC&  aUri )
-    {
-    CXdmNodeAttribute* attr = NULL;
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    RPointerArray<CXdmDocumentNode> lists;
-    CleanupClosePushL( lists );
-
-    RPointerArray<CXdmDocumentNode> nodes;
-    CleanupClosePushL( nodes );
-
-    CXdmDocumentNode* root = iXdmDoc->DocumentRoot();
-    CXdmDocumentNode* foundNode = SearchListUnderParentL( root, aList );
-    if ( foundNode )
-        {
-        User::LeaveIfError( foundNode->Find( KSimpleEntry, nodes ));
-        TInt nodeCount = nodes.Count();
-        for ( TInt i = 0; i < nodeCount; i++ )
-            {
-            CXdmDocumentNode* currNode = nodes[i];
-            attr = ( currNode )->Attribute( KSimpleUri );
-            if ( attr && !attr->AttributeValue().CompareF( aUri ))
-                {
-                // This is the user we are looking for deletion.
-                iXdmDoc->DeleteDataL( currNode );
-                break;
-                }
-            }
-        }
-    else
-        {
-        User::Leave( KErrNotFound );
-        }
-
-    CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
-    CleanupStack::PopAndDestroy( &lists ); // >>> lists
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemoveGroupFromGrantedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemoveGroupFromGrantedL(
-    const TDesC&  aName, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemoveGroupFromGrantedL"));
-#endif
-    iClientStatus = &aStatus;
-
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    DoRemoveListFromGrantRuleL( listUri->Des() );
-
-    CleanupStack::PopAndDestroy( listUri );
-    CleanupStack::PopAndDestroy( xcapUri );
-
-    iOperation = EXdmWithdrawGroup;
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoRemoveListFromGrantRuleL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoRemoveListFromGrantRuleL(
-    const TDesC&  aListUri )
-    {
-    TPresCondMisc misc;
-    misc.Init( iPresenceXdm );
-
-    if ( !misc.DeleteExternalListL( iConnSets.Variation().GrantRuleName(), aListUri ))
-        {
-        // update document in the server only if there was a modification.
-        UpdateXdmRulesL();
-        *iClientStatus = KRequestPending;
-        }
-    else
-        {
-        // Complete without server operation
-        CompleteClientReq( KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AddGroupToGrantedL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::AddGroupToGrantedL(
-    const TDesC&  aName, TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: AddGroupToGrantedL"));
-#endif
-
-    iClientStatus = &aStatus;
-
-    if ( !DoesUserListExistsL( aName )  )
-      {
-      User::Leave( KErrNotFound );
-      }
-
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aName );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    iOperation = EXdmGrantGroup;
-
-    DoAddListIntoGrantRuleL( listUri->Des() );
-
-    CleanupStack::PopAndDestroy( listUri );     // >> listUri
-    CleanupStack::PopAndDestroy( xcapUri );     // >> xcapUri
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoAddListIntoGrantRuleL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoAddListIntoGrantRuleL(
-    const TDesC& aListUri)
-    {
-    TPresCondMisc misc;
-    misc.Init( iPresenceXdm );
-
-    User::LeaveIfError( misc.AddExternListL( iConnSets.Variation().GrantRuleName(), aListUri ));
-
-    UpdateXdmRulesL();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::GrantForEveryoneL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::GrantForEveryoneL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: GrantForEveryoneL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmGrantForAll;
-    DoGrantForAllL();
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::WithdrawFromEveryoneL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::WithdrawFromEveryoneL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: WithdrawFromEveryoneL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmWithdrawFromAll;
-    DoWithdrawFromAllL();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::SetReactiveAuthL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::SetReactiveAuthL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: SetReactiveAuthL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmSetReactiveAuth;
-    DoSetReactiveAuthL();
-
-    *iClientStatus = KRequestPending;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::SetProactiveAuthL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::SetProactiveAuthL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: SetProactiveAuthL"));
-#endif
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmSetProactiveAuth;
-    DoSetProactiveAuthL();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::SubscribeBlockListL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::SubscribeBlockListL( CPtrCArray& aMembers )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: SubscribeBlockListL"));
-#endif
-    iOperation = EXdmGetBlockedList;
-    DoGetListMembersL( KSimpleOMABlockedList, aMembers );
-    // The cient will call a method GetEntitiesL that access those arrays
-    // Those member arrays will be emptied after the call. + in destrcutor.
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::UnsubscribeBlockListL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::UnsubscribeBlockListL( TRequestStatus& aStatus )
-    {
-    iClientStatus = &aStatus;
-    *iClientStatus = KRequestPending;
-    // Subscription state is always terminated
-    CompleteClientReq( KErrNone );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoGetListMembersL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoGetListMembersL(
-    const TDesC& aList, CPtrCArray& aMembers  )
-    {
-    using namespace NSimplePlugin::NSimpleOma;
-
-    aMembers.Reset();
-
-    RPointerArray<CXdmDocumentNode> nodes;
-    CleanupClosePushL( nodes );
-
-    CXdmNodeAttribute* attr = NULL;
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* foundNode = SearchListUnderParentL( buddylist, aList );
-    if ( foundNode )
-        {
-        nodes.Reset();
-        // Do not leave if there is nobody blocked
-        TRAP_IGNORE( foundNode->Find( KSimpleEntry, nodes ));
-        TInt nodeCount = nodes.Count();
-        for ( TInt i = 0; i < nodeCount; i++ )
-            {
-            attr = (nodes[i])->Attribute( KSimpleUri );
-            if ( attr )
-                {
-                aMembers.AppendL( attr->AttributeValue() );
-                }
-            }
-        }
-
-    CleanupStack::PopAndDestroy( &nodes );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::HandleRLSUpdateDocumentL
-// RLS Callback
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::HandleRLSUpdateDocumentL( TInt aErrorCode )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: HandleRLSUpdateDocumentL %d"), aErrorCode);
-#ifdef FAKE_XDM_OK
-
-    if ( aErrorCode == KErrTimedOut || aErrorCode == KXcapErrorNetworkNotAvailabe || aErrorCode == KErrHostUnreach )
-        {
-        PluginLogger::Log(
-            _L("PluginXdm : HandleRLSUpdateDocumentL FAKE_XDM_OK resets error code %d"),
-            aErrorCode  );
-        aErrorCode  = 0;
-        }
-#endif
-#endif
-
-    TRAPD( err, DoHandleRLSUpdateDocumentL( aErrorCode ));
-    if ( err )
-        {
-        // Complete with ok or error the last initial opreration
-        CompleteClientReq( err );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoHandleRLSUpdateDocumentL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoHandleRLSUpdateDocumentL( TInt aErrorCode )
-    {
-
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackInRunL( aErrorCode, iXdmState, iOperation, KNullDesC );
-        }
-
-    // Resend 409 failed request only if the server sent a preposal for the right URI
-    // and only once, so that this do not remain in endless loop between server and
-    // a client.
-    if ( aErrorCode == KXcapErrorHttpConflict &&
-         iOperation == EXdmRlsAdd &&
-         iRlsXdm->NegotiatedServiceUri().Length() )
-        {
-        RlsServiceUriNegotiationL();
-        return;
-        }
-
-    switch ( iXdmState )
-        {
-        case EGetRlsServices:
-            if ( aErrorCode == KXcapErrorHttpNotFound || aErrorCode == KErrNotFound )
-                {
-                aErrorCode = KErrNone;
-                }
-            break;
-        default:
-            break;
-        }
-
-    CompleteClientReq( aErrorCode );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::HandleRLSUpdateCancelL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::HandleRLSUpdateCancelL( TInt /*aErrorCode*/ )
-    {
-    // notice: not needed
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::HandleRLSDeleteAllEmptyListsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::HandleRLSDeleteAllEmptyListsL( TInt /*aErrorCode*/ )
-    {
-    // Notice: Not needed
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::HandlePresUpdateDocumentL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::HandlePresUpdateDocumentL( TInt aErrorCode )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: HandlePresUpdateDocumentL %d"), aErrorCode);
-#ifdef FAKE_XDM_OK
-        if ( aErrorCode == KErrTimedOut || aErrorCode == KXcapErrorNetworkNotAvailabe || aErrorCode == KErrHostUnreach )
-            {
-            PluginLogger::Log(_L("PluginXdm : HandlePresUpdateDocumentL FAKE_XDM_OK resets error code %d"), aErrorCode  );
-            aErrorCode  = 0;
-            }
-#endif
-#endif
-
-    TRAPD( err, DoHandlePresUpdateDocumentL( aErrorCode ));
-    if ( err )
-        {
-        // Complete with ok or error the last initial opreration
-        CompleteClientReq( err );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoHandlePresUpdateDocumentL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoHandlePresUpdateDocumentL( TInt aErrorCode )
-    {
-
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackInRunL(
-            aErrorCode, iXdmState, iOperation, KNullDesC );
-        }
-
-    if ( iXdmState == EGetXdmRules )
-        {
-        iXdmState = EStateIdle;
-        if ( aErrorCode && aErrorCode != KXcapErrorHttpNotFound &&
-             aErrorCode != KErrNotFound )
-            {
-            User::Leave( aErrorCode );
-            }
-        // check and create the rules when needed
-        MakeInitialXdmsDocumentL();
-        }
-    else
-        {
-        iPresXdmOk = ETrue;
-        // Complete with ok or error the last initial opreration
-        CompleteClientReq( aErrorCode );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::HandlePresUpdateCancelL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::HandlePresUpdateCancelL( TInt /*aErrorCode*/ )
-    {
-    // notice: not needed
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::GetXdmOMAListsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::GetXdmOMAListsL()
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: GetXdmOMAListsL"));
-#endif
-    if ( !iXdmEngine )
-        {
-        // get data from a network if not done so yet
-        CXdmProtocolInfo* info = CXdmProtocolInfo::NewL( iSettingsId );
-        CleanupStack::PushL( info );
-        // Notice: we don't use cache for XDM
-        info->SetCacheUsage( EFalse );
-        iXdmEngine = CXdmEngine::NewL( *info );
-        CleanupStack::PopAndDestroy( info );
-        }
-    if ( !iXdmOk )
-        {
-        using namespace NSimplePlugin::NSimpleOma;
-        if ( iXdmDoc )
-            {
-            // Clean a document from s previous failed case.
-            iXdmEngine->DeleteDocumentModelL( iXdmDoc );
-            iXdmDoc = NULL;
-            }
-
-        // Get data from network
-        iXdmDoc = iXdmEngine->CreateDocumentModelL( KSimpleIndex, EXdmSharedXdm );
-        iXdmDoc->FetchDataL();
-        UpdateXdmsL();
-        iXdmState = EGetXdmOMALists;
-        }
-    else
-        {
-        // Document already exists, no need to search from a server
-        iStatus = KRequestPending;
-        TRequestStatus* s= &iStatus;
-        User::RequestComplete( s, KErrNone );
-        SetActive();
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CreateXdmOMAListsIfNeededL
-// Notice: separate CheckXdmOMAListsL method  (validity)
-// ---------------------------------------------------------------------------
-//
-TBool CSimplePluginXdmUtils::CreateXdmOMAListsIfNeededL( )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: CreateXdmOMAListsIfNeededL"));
-#endif
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    CXdmDocumentNode* root = iXdmDoc->DocumentRoot();
-    if ( !root )
-        {
-        root = iXdmDoc->CreateRootL();
-        root->SetNameL( KSimpleResourceLists );
-        }
-
-    if ( root->IsEmptyNode() )
-        {
-        root->SetEmptyNode( EFalse );
-        }
-
-    TInt isCreated = 0;
-
-    // add all the list nodes
-
-    isCreated += CreateXdmOMAListIfNeededL( root, iConnSets.Variation().SharedXdmTop() );
-
-    isCreated += CreateXdmOMAListIfNeededL( root, KSimpleOMABlockedList );
-
-    // grant-list name is variable issue
-    isCreated += CreateXdmOMAListIfNeededL( root, iConnSets.Variation().GrantListName()  );
-
-    if ( !isCreated )
-        {
-        return EFalse;
-        }
-
-    // send to the server and start wait a response
-    iXdmDoc->AppendL( root );
-    UpdateXdmsL();
-    iXdmState = ECreateXdmOMALists;
-
-    return ETrue;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CreateXdmOMAListIfNeededL
-// ---------------------------------------------------------------------------
-//
-TBool CSimplePluginXdmUtils::CreateXdmOMAListIfNeededL(
-    CXdmDocumentNode* aRoot, const TDesC& aName )
-    {
-    TBool isCreated( EFalse );
-    CXdmDocumentNode* nodeFound = SearchListUnderParentL( aRoot, aName );
-    if ( !nodeFound )
-        {
-        CreateResourceListL( aRoot, aName );
-        isCreated = ETrue;
-        }
-    return isCreated;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CreateResourceListL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CreateResourceListL(
-    CXdmDocumentNode* aParent, const TDesC& aName )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: CreateResourceListL"));
-#endif
-    using namespace NSimplePlugin::NSimpleOma;
-    CXdmDocumentNode* child1 = aParent->CreateChileNodeL( KSimpleList );
-    CXdmNodeAttribute* name = child1->CreateAttributeL( KSimpleName );
-    name->SetAttributeValueL( aName );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::SearchListUnderParentL
-// ---------------------------------------------------------------------------
-//
-CXdmDocumentNode* CSimplePluginXdmUtils::SearchListUnderParentL(
-    CXdmDocumentNode* aParent, const TDesC& aName )
-    {
-    using namespace NSimplePlugin::NSimpleOma;
-
-    if ( !aParent )
-        {
-        return NULL;
-        }
-
-    RPointerArray<CXdmDocumentNode> resultArray;
-    RPointerArray<SXdmAttribute16>  attributeArray;
-
-    CleanupClosePushL( resultArray );           // <<< resultArray
-    CleanupClosePushL( attributeArray );        // <<< attributeArray
-
-    SXdmAttribute16 attr;
-    attr.iName.Set( KSimpleName );
-    attr.iValue.Set( aName );
-    attributeArray.AppendL( &attr );
-
-    CXdmDocumentNode* currNode = NULL;
-
-    aParent->Find( KSimpleList, resultArray, attributeArray );
-
-    TInt count = resultArray.Count();
-    for ( TInt i=0; i < count; i++ )
-        {
-        currNode = resultArray[i];
-        CXdmDocumentNode* parent = currNode->Parent();
-        if ( parent == aParent )
-            {
-            break;
-            }
-        currNode = NULL;
-        }
-
-    CleanupStack::PopAndDestroy( &attributeArray); // >>> attributeArray
-    CleanupStack::PopAndDestroy( &resultArray );   // >>> resultArray
-
-    return currNode;
-
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::MakeRlsUriL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSimplePluginXdmUtils::MakeRlsUriL(
-    const TDesC& aXcapUri, const TDesC& aListName )
-    {
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: MakeRlsUriL"));
-#endif
-
-    /* example:
-        "http://XCAP.EXAMPLE.COM/resource-lists/users/
-        sip:USER@EXAMPLE.COM/index/~~/resource-lists/list%5b@name=%22oma_blockedlist%22%5d"
-        */
-
-    using namespace NSimplePlugin::NSimpleRls;
-
-    TInt myLen = totalSize;
-    myLen += aXcapUri.Length();
-    myLen += aListName.Length();
-    myLen += iConnSets.CurrentSipPresentity().Length();
-    HBufC* myBuf = HBufC::NewL( myLen );
-
-    myBuf->Des().Append( KOne );
-    myBuf->Des().Append( aXcapUri);
-    myBuf->Des().Append( KThree );
-    myBuf->Des().Append( iConnSets.CurrentSipPresentity() );
-    myBuf->Des().Append( KFive );
-    myBuf->Des().Append( aListName );
-    myBuf->Des().Append( KSeven );
-
-    return myBuf;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::MakeRlsBuddyUriL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSimplePluginXdmUtils::MakeRlsBuddyUriL(
-    const TDesC& aXcapUri, const TDesC& aListName )
-    {
-    /* example:
-        "http://XCAP.EXAMPLE.COM/resource-lists/users/
-        sip:USER@EXAMPLE.COM/~~/resource-lists/list%5b@name=%22oma_buddylist%22%5d/
-        list5d@name=%22my_friends%22%5d"
-        */
-
-    using namespace NSimplePlugin::NSimpleRlsBuddy;
-
-    TInt myLen = totalSize + aXcapUri.Length() + aListName.Length() +
-                 iConnSets.CurrentSipPresentity().Length();
-
-    HBufC* myBuf = HBufC::NewL( myLen );
-    TPtr temp = myBuf->Des();
-
-    temp.Append( KOne );
-    temp.Append( aXcapUri);
-    temp.Append( KThree );
-    temp.Append( iConnSets.CurrentSipPresentity() );
-    temp.Append( KFive );
-    temp.Append( aListName );
-    temp.Append( KSeven );
-
-    return myBuf;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::GetXdmRulesL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::GetXdmRulesL()
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: GetXdmRulesL"));
-#endif
-    if ( !iPresenceXdm )
-        {
-        // get data from a network if not done so yet
-        iPresenceXdm = CPresenceXDM::NewL( iSettingsId );
-        }
-    User::LeaveIfError( iPresenceXdm->UpdateAllFromServerL( this ));
-    iXdmState = EGetXdmRules;
-    // The is completed in a callback method, not in RunL
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::MakeInitialXdmsDocumentL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::MakeInitialXdmsDocumentL()
-    {
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: MakeInitialXdmsDocumentL"));
-#endif
-    TBuf<KSimplePluginMaxRuleLength> myRuleId;
-
-    TBool ruleAdded( EFalse );
-
-    TPresenceActionXDM action;
-    action.Init( iPresenceXdm );
-
-    TPresenceTransformXDM transform;
-    transform.Init( iPresenceXdm );
-
-    TPresCondMisc misc;
-    misc.Init( iPresenceXdm );
-
-    TPresCondIdentityOne one;
-    one.Init( iPresenceXdm );
-
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );
-    HBufC* listUri = MakeRlsUriL( xcapUri->Des(), KSimpleOMABlockedList );
-    CleanupStack::PushL( listUri );
-
-    // Default rule
-    // get the rule id, use run-time variation
-    myRuleId = iConnSets.Variation().DefaultRuleName(); // KSimpleXdmDefaultRule;
-    if ( myRuleId.Length() && !iPresenceXdm->IsRuleExist( myRuleId ))
-        {
-        // If default rule does not exist in the variation then do not create it.
-        MakeDefaultRuleL( myRuleId, action, transform, misc );
-        ruleAdded = ETrue;
-        }
-
-    // Block rule
-    // get the rule id, use run-time variation
-    myRuleId = iConnSets.Variation().BlockRuleName();
-    // ruleCreate = EFalse;
-
-    if ( !iPresenceXdm->IsRuleExist( myRuleId ))
-        {
-        iPresenceXdm->CreateNewRuleL( myRuleId );
-        ruleAdded = ETrue;
-
-        // use run-time variation for rule action
-        CSimplePluginVariation::TSimplePluginAuthRule authRule =
-            iConnSets.Variation().BlockRuleAction();
-
-        User::LeaveIfError( misc.AddExternListL( myRuleId, listUri->Des() ));
-
-        switch (authRule)
-            {
-            case CSimplePluginVariation::ERulePoliteBlock:
-                User::LeaveIfError( action.AddOrReplaceActionL(myRuleId, KPresPoliteBlock ));
-                break;
-            default:
-                User::LeaveIfError( action.AddOrReplaceActionL(myRuleId, KPresBlock ));
-            };
-        }
-
-    // Grant rule
-    // get the rule id, use run-time variation
-    myRuleId = iConnSets.Variation().GrantRuleName();
-    if ( !iPresenceXdm->IsRuleExist( myRuleId ))
-        {
-        iPresenceXdm->CreateNewRuleL( myRuleId );
-        ruleAdded = ETrue;
-        CleanupStack::PopAndDestroy( listUri );
-        listUri = NULL;
-        listUri = MakeRlsUriL( xcapUri->Des(), iConnSets.Variation().GrantListName() );
-        CleanupStack::PushL( listUri );
-        User::LeaveIfError( misc.AddExternListL( myRuleId, listUri->Des() ));
-        User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideAllAttributes ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvidePersons ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideDevices ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideServices ));
-        }
-
-    // Grant own subscription rule
-    // get the rule id, use run-time variation
-    myRuleId = iConnSets.Variation().GrantOwnRuleName();
-    if ( !iPresenceXdm->IsRuleExist( myRuleId ))
-        {
-        iPresenceXdm->CreateNewRuleL( myRuleId );
-        ruleAdded = ETrue;
-        User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideAllAttributes ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvidePersons ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideDevices ));
-        User::LeaveIfError( transform.AddOrRepProvideAllTransComplexL(
-            myRuleId, KPresProvideServices ));
-        // own sip identity
-        User::LeaveIfError( one.AddIdentityL(
-            myRuleId, iConnSets.CurrentSipPresentity() ));
-        }
-
-    // Update into server only when needed.
-    if ( ruleAdded )
-        {
-        UpdateXdmRulesL();
-        }
-    else
-        {
-        iXdmState = EUpdateXdmRules;
-        iPresXdmOk = ETrue;
-        // Complete with ok or error the last initial opreration
-        CompleteClientReq( KErrNone );
-        }
-
-    CleanupStack::PopAndDestroy( listUri );
-    CleanupStack::PopAndDestroy( xcapUri );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoGrantForAllL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoGrantForAllL()
-    {
-    const TInt KMyPresRuleIDLength(30);
-    TBuf<KMyPresRuleIDLength> myRuleId;
-
-    TInt err( KErrNone );
-
-    TPresenceActionXDM action;
-    action.Init( iPresenceXdm );
-
-    // Default rule id is searched
-    myRuleId = iConnSets.Variation().DefaultRuleName(); // KSimpleXdmDefaultRule;
-    TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) );
-    if ( err && err != KErrAlreadyExists )
-        {
-        User::Leave( err );
-        }
-
-    // modify the rule in the server.
-    User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow ));
-    UpdateXdmRulesL();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoWithdrawFromAllL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoWithdrawFromAllL()
-    {
-    const TInt KMyPresRuleIDLength(30);
-    TBuf<KMyPresRuleIDLength> myRuleId;
-
-    /* pseudo code:
-        if current rule is ALLOW then {  BLOCK  }
-        otherwise no action.
-    */
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginWatcher: DoWithdrawFromAllL TEST COVERS 3"));
-#endif
-
-
-    TInt err( KErrNone );
-
-    TPresenceActionXDM action;
-    action.Init( iPresenceXdm );
-
-    // Default rule id is searched
-    myRuleId = iConnSets.Variation().DefaultRuleName();
-    TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) );
-    if ( err && err != KErrAlreadyExists )
-        {
-        User::Leave( err );
-        }
-
-    TBuf<KMyPresRuleIDLength> myActionBuf;
-    err = action.GetActionL( myRuleId, myActionBuf);
-
-    if ( !myActionBuf.CompareF( KPresAllow )  )
-        {
-        User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresPoliteBlock ));
-        UpdateXdmRulesL();
-        *iClientStatus = KRequestPending;
-        }
-    else
-        {
-        CompleteClientReq( KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoSetReactiveAuthL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoSetReactiveAuthL()
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(
-            _L("PluginWatcher: DoSetReactiveAuthL TEST COVERS 5"));
-#endif
-
-    // Default rule is modified to CONFIRM
-
-    const TInt KMyPresRuleIDLength(30);
-    TBuf<KMyPresRuleIDLength> myRuleId;
-
-    TInt err( KErrNone );
-
-    TPresenceActionXDM action;
-    action.Init( iPresenceXdm );
-
-    // Default rule id is searched
-    myRuleId = iConnSets.Variation().DefaultRuleName();
-    TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) );
-    if ( err && err != KErrAlreadyExists )
-        {
-#ifdef _DEBUG
-        PluginLogger::Log( _L("PluginWatcher: TEST COVERS 5b"));
-#endif
-        User::Leave( err );
-        }
-
-    // modify the rule in the server.
-    User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresConfirm ));
-    UpdateXdmRulesL();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoSetProactiveAuthL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoSetProactiveAuthL()
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(
-            _L("PluginWatcher: DoSetProactiveAuthL TEST COVERS 6"));
-#endif
-
-    /* pseudo code:
-        if current rule is CONFIRM then {  ALLOW  }
-        otherwise no action.
-    */
-
-    const TInt KMyPresRuleIDLength(30);
-    TBuf<KMyPresRuleIDLength> myRuleId;
-
-    TInt err( KErrNone );
-
-    TPresenceActionXDM action;
-    action.Init( iPresenceXdm );
-
-    // Default rule id is searched
-    myRuleId = iConnSets.Variation().DefaultRuleName();
-    TRAP( err, iPresenceXdm->CreateNewRuleL( myRuleId ) );
-    if ( err && err != KErrAlreadyExists )
-        {
-        User::Leave( err );
-        }
-
-    // modify the rule in the server.
-    TBuf<KMyPresRuleIDLength> myActionBuf;
-    err = action.GetActionL( myRuleId, myActionBuf);
-
-    if ( !myActionBuf.CompareF( KPresConfirm )  )
-        {
-        User::LeaveIfError( action.AddOrReplaceActionL( myRuleId, KPresAllow ));
-        UpdateXdmRulesL();
-        *iClientStatus = KRequestPending;
-        }
-    else
-        {
-        CompleteClientReq( KErrNone );
-        }
-
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CreateEntityGroupL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CreateEntityGroupL(
-    const TDesC&  aName, const TDesC&  aDisplayName )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: CreateEntityGroupL"));
-#endif
-    iOperation = EXdmCreateGroup;
-    DoCreateEntityGroupL( aName, aDisplayName );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DeleteEntityGroupL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::DeleteEntityGroupL(
-    const TDesC&  aName)
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: DeleteEntityGroupL"));
-#endif
-
-    iOperation = EXdmDeleteGroup;
-    DoDeleteEntityGroupL( aName );
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AddPresentityGroupMemberL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::AddPresentityGroupMemberL(
-    const TDesC&  aGroup,
-    const TDesC&  aUser,
-    const TDesC&  aDispName,
-    TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: AddPresentityGroupMemberL"));
-#endif
-
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmAddUserToGroup;
-    DoAddUserToUserListL( aGroup, aUser, aDispName );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-
-    *iClientStatus = KRequestPending;
-    iXdmState = EUpdateXdmOMAList;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemovePresentityGroupMemberL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemovePresentityGroupMemberL(
-    const TDesC&  aGroup,
-    const TDesC&  aUser,
-    TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemovePresentityGroupMemberL"));
-#endif
-
-    iClientStatus = &aStatus;
-
-    iOperation = EXdmAddUserToGroup;
-    DoRemoveUserFromUserListL( aGroup, aUser );
-
-    // send to the server and start wait a response
-    UpdateXdmsL();
-
-    *iClientStatus = KRequestPending;
-    iXdmState = EUpdateXdmOMAList;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::GetUserListsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::GetUserListsL(
-    CDesCArrayFlat& aIds, CDesCArrayFlat& aDispNames )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: GetUserListsL"));
-#endif
-    using namespace NSimplePlugin::NSimpleOma;
-
-    aIds.Reset();
-    aDispNames.Reset();
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* entry = NULL;
-
-    RPointerArray<CXdmDocumentNode> lists;
-    CleanupClosePushL( lists );         // <<< lists
-
-    RPointerArray<CXdmDocumentNode> lists2;
-    CleanupClosePushL( lists2 );        // <<< lists2
-
-    buddylist->Find( KSimpleList, lists );
-    TInt count = lists.Count();
-    for ( TInt i=0; i < count; i++ )
-        {
-        // Name
-        entry = lists[i];
-        CXdmNodeAttribute* attr = entry->Attribute( KSimpleName );
-        if ( attr )
-            {
-            aIds.AppendL( attr->AttributeValue() );
-#ifdef _DEBUG
-            TBuf<200> debug_buffer;
-            debug_buffer = attr->AttributeValue();
-            PluginLogger::Log(_L("PluginXdm: add group id into aIds : %S"), &debug_buffer );
-#endif
-            }
-        else
-            {
-            continue;
-            }
-        // Display name
-        TInt err = entry->Find( KSimpleDisplayName, lists2 );
-        // Notice: assume there is only one display-name.
-        // Always when an item is added into aIds we have to add an itmem also into aDispNames.
-        if ( !err )
-            {
-            CXdmDocumentNode* disName = lists2[0];
-            if ( !disName->IsEmptyNode() )
-                {
-                // Convert Display-Name to Unicode.
-                HBufC16* uri16 = NULL;
-                uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( disName->LeafNodeContent() );
-                CleanupStack::PushL( uri16 );  // << uri16
-                aDispNames.AppendL( uri16->Des() );
-                CleanupStack::PopAndDestroy( uri16 );  // >> uri16
-                }
-                else
-                    {
-                    aDispNames.AppendL( KNullDesC );
-                    }
-            }
-            else
-                {
-                aDispNames.AppendL( KNullDesC );
-                }
-        }
-
-    CleanupStack::PopAndDestroy( &lists2 ); // >>> lists2
-    CleanupStack::PopAndDestroy( &lists ); // >>> lists
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::GetEntitiesInListL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::GetEntitiesInListL(
-    const TDesC&  aList, CPtrCArray& aIds, CPtrCArray& aDispNames )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: GetEntitiesInListL"));
-#endif
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* target = DoGetUserListL( aList, buddylist );
-
-    // make a collection of MPresentityGroupMemberInfo
-    RPointerArray<CXdmDocumentNode> entries;
-    CleanupClosePushL(entries);       // <<< entries
-
-    RPointerArray<CXdmDocumentNode> nodes;
-    CleanupClosePushL(nodes);         // <<< nodes
-
-    target->Find( KSimpleEntry, entries );
-    TInt count = entries.Count();
-    for ( TInt i=0; i < count; i++ )
-        {
-        // ID
-        CXdmDocumentNode* entry = entries[i];
-        CXdmNodeAttribute* attr = entry->Attribute( KSimpleUri );
-        if ( attr )
-            {
-            aIds.AppendL( attr->AttributeValue() );
-#ifdef _DEBUG
-            TBuf<200> debug_buffer;
-            debug_buffer = attr->AttributeValue();
-            PluginLogger::Log(_L("PluginXdm: add member into collection : %S"), &debug_buffer );
-#endif
-            }
-        else
-            {
-            continue;
-            }
-
-        // Display name
-        TInt err = entry->Find( KSimpleDisplayName, nodes );
-        // Notice: assume there is only one display-name
-        if ( !err )
-            {
-            CXdmDocumentNode* disName = nodes[0];
-            HBufC16* uri16 = NULL;
-            uri16 = CnvUtfConverter::ConvertToUnicodeFromUtf8L( disName->LeafNodeContent() );
-            CleanupStack::PushL( uri16 );  // << uri16
-            aDispNames.AppendL( uri16->Des() );
-            CleanupStack::PopAndDestroy( uri16 );  // >> uri16
-            }
-        else
-            {
-            aDispNames.AppendL( TPtrC() );
-            }
-        }
-
-    CleanupStack::PopAndDestroy( &nodes ); // >>> nodes
-    CleanupStack::PopAndDestroy( &entries ); // >>> entries
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CommitXdmL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CommitXdmL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: CommitXdmL"));
-#endif
-    iClientStatus = &aStatus;
-
-    UpdateXdmsL();
-
-    *iClientStatus = KRequestPending;
-    iXdmState = EUpdateXdmOMAList;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CommitRlsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CommitRlsL( TRequestStatus& aStatus )
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: CommitRlsL"));
-#endif
-    iClientStatus = &aStatus;
-    *iClientStatus = KRequestPending;
-    UpdateRlsL();
-
-    iXdmState = EUpdateRlsServices;
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoCreateEntityGroupL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoCreateEntityGroupL(
-    const TDesC& aList, const TDesC&  aDisName )
-    {
-    using namespace NSimplePlugin::NSimpleOma;
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    if ( buddylist->IsEmptyNode() )
-        {
-        buddylist->SetEmptyNode( EFalse );
-        }
-
-    CXdmDocumentNode* foundNode = SearchListUnderParentL(
-        buddylist, aDisName );
-
-    if ( foundNode )
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-
-    CXdmDocumentNode* newNode = buddylist->CreateChileNodeL( KSimpleList );
-    CXdmNodeAttribute* attributeName = newNode->CreateAttributeL( KSimpleName );
-    attributeName->SetAttributeValueL( aList );
-
-    // Display name
-    CXdmDocumentNode* displayName = newNode->CreateChileNodeL( KSimpleDisplayName );
-    displayName->SetLeafNode( ETrue );
-    displayName->SetLeafNodeContentL( aDisName );
-
-    iXdmDoc->AppendL( newNode );
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoDeleteEntityGroupL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoDeleteEntityGroupL(
-    const TDesC& aList )
-    {
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* target = DoGetUserListL( aList, buddylist );
-    iXdmDoc->DeleteDataL( target );
-    // iXdmEngine is asked to be updated to a server by CSimplePlugingGroups later.
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoAddUserToUserListL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoAddUserToUserListL(
-    const TDesC& aList, const TDesC&  aUser, const TDesC&  aDisName )
-    {
-    RPointerArray<CXdmDocumentNode> resultArray;
-    RPointerArray<SXdmAttribute16>  attributeArray;
-
-    CleanupClosePushL( resultArray );           // << resultArray
-    CleanupClosePushL( attributeArray );        // << attributeArray
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* target = DoGetUserListL( aList, buddylist );
-
-    if ( target->IsEmptyNode() )
-        {
-        target->SetEmptyNode( EFalse );
-        }
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    SXdmAttribute16 attr;
-    attr.iName.Set( KSimpleUri );
-    attr.iValue.Set( aUser );
-    attributeArray.AppendL( &attr );
-
-    // If member already exists then leave
-    target->Find( KSimpleEntry, resultArray, attributeArray );
-    if ( resultArray.Count() > 0 )
-        {
-        User::Leave( KErrAlreadyExists );
-        }
-
-    CXdmDocumentNode* newNode = target->CreateChileNodeL( KSimpleEntry );
-    CXdmNodeAttribute* attributeName = newNode->CreateAttributeL( KSimpleUri );
-    attributeName->SetAttributeValueL( aUser );
-
-    // Display name
-    CXdmDocumentNode* displayName = newNode->CreateChileNodeL( KSimpleDisplayName );
-    displayName->SetLeafNode( ETrue );
-    displayName->SetLeafNodeContentL( aDisName );
-
-    iXdmDoc->AppendL( newNode );
-
-    CleanupStack::PopAndDestroy( &attributeArray );
-    CleanupStack::PopAndDestroy( &resultArray );
-    }
-
-// ----------------------------------------------------
-// CSimplePluginXdmUtils::DoRemoveUserFromUserListL
-// ----------------------------------------------------
-//
-void CSimplePluginXdmUtils::DoRemoveUserFromUserListL(
-    const TDesC& aList, const TDesC&  aUri )
-    {
-    CXdmNodeAttribute* attr = NULL;
-    TBool myFound( EFalse );
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* target = DoGetUserListL( aList, buddylist );
-
-    RPointerArray<CXdmDocumentNode> entries;
-    CleanupClosePushL( entries );           // <<< entries
-
-    User::LeaveIfError( target->Find( KSimpleEntry, entries ));
-    TInt nodeCount = entries.Count();
-    for ( TInt i = 0; i < nodeCount; i++ )
-        {
-        CXdmDocumentNode* currNode = entries[i];
-        attr = currNode->Attribute( KSimpleUri );
-        if ( attr && !attr->AttributeValue().CompareF( aUri ))
-            {
-            // This is the user we are looking for deletion.
-            iXdmDoc->DeleteDataL( currNode );
-            myFound = ETrue;
-            break;
-            }
-        }
-
-    CleanupStack::PopAndDestroy( &entries ); // >>> entries
-
-    if ( !myFound )
-        {
-        // If the member is not found then leave
-        User::Leave( KErrNotFound );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoGetBuddyListL
-// ---------------------------------------------------------------------------
-//
-CXdmDocumentNode* CSimplePluginXdmUtils::DoGetBuddyListL()
-    {
-    CXdmDocumentNode* root = iXdmDoc->DocumentRoot();
-    CXdmDocumentNode* ret = SearchListUnderParentL( root, iConnSets.Variation().SharedXdmTop() );
-    if ( !ret )
-        {
-        User::Leave( KErrNotFound );
-        }
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoGetUserListL
-// ---------------------------------------------------------------------------
-//
-CXdmDocumentNode* CSimplePluginXdmUtils::DoGetUserListL(
-    const TDesC& aList, CXdmDocumentNode* aBuddyList )
-    {
-    CXdmDocumentNode* listNode = NULL;
-    CXdmNodeAttribute* attr = NULL;
-    TBool found( EFalse );
-
-    using namespace NSimplePlugin::NSimpleOma;
-
-    RPointerArray<CXdmDocumentNode> lists;
-    CleanupClosePushL( lists );
-
-    User::LeaveIfError( aBuddyList->Find( KSimpleList, lists ));
-    TInt count = lists.Count();
-    for ( TInt i=0; i < count; i++ )
-        {
-        listNode = lists[i];
-        attr = listNode->Attribute( KSimpleName );
-        if ( attr && !attr->AttributeValue().CompareF( aList ))
-            {
-            // List is found
-            found = ETrue;
-            break;
-            }
-        }
-    if ( !found )
-        {
-        User::Leave( KErrNotFound );
-        }
-
-    CleanupStack::PopAndDestroy( &lists );
-    return listNode;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::UpdateXdmRulesL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::UpdateXdmRulesL()
-    {
-    _LIT( KMyOper, "UpdateXdmRulesL");
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackAsynchL(
-            KErrNone, iXdmState, iOperation, KMyOper );
-        }
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: UpdateXdmRulesL -> iPresenceXdm->UpdateToServerL"));
-#endif
-    User::LeaveIfError( iPresenceXdm->UpdateToServerL( this ));
-    iXdmState = EUpdateXdmRules;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::UpdateXdmsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::UpdateXdmsL()
-    {
-    _LIT( KMyOper, "UpdateXdmsL");
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackAsynchL(
-            KErrNone, iXdmState, iOperation, KMyOper );
-        }
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: UpdateXdmsL -> iXdmEngine->UpdateToServerL"));
-#endif
-    iXdmEngine->UpdateL( iXdmDoc, iStatus );
-    SetActive();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::UpdateRlsL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::UpdateRlsL()
-    {
-    _LIT( KMyOper, "UpdateRlsL");
-
-    if ( iTestObs )
-        {
-        // Test suite
-        iTestObs->TestCallbackAsynchL(
-            KErrNone, iXdmState, iOperation, KMyOper );
-        }
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: -> iRlsXdm->UpdateToServerL"));
-#endif
-    User::LeaveIfError( iRlsXdm->UpdateToServerL( this ));
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::SetTestObserver
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::SetTestObserver( MSimplePluginTestObs* aObs )
-    {
-    iTestObs = aObs;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CreateRlsDocumentUri16LC
-// ---------------------------------------------------------------------------
-//
-HBufC16* CSimplePluginXdmUtils::CreateRlsDocumentUri16LC(
-    const TDesC16& aGroup,
-    const TDesC16& aPresentityUri,
-    const TDesC16& aDomain )
-    {
-
-    TPtrC uriTemplate( iConnSets.Variation().RlsGroupUriTemplate() );
-
-    // Calculate URI length
-    TInt uriSize = uriTemplate.Length() + KMyLenPrefix;
-    if ( uriTemplate.Find( KSimpleGroupTag ) != KErrNotFound )
-        {
-        TPtrC p8( KSimpleGroupTag );
-        uriSize = uriSize - p8.Length() + aGroup.Length();
-        }
-    if ( uriTemplate.Find( KSimpleUserTag ) != KErrNotFound )
-        {
-        TPtrC p8( KSimpleUserTag );
-        uriSize = uriSize - p8.Length() + aPresentityUri.Length();
-        }
-    if ( uriTemplate.Find( KSimpleDomainTag ) != KErrNotFound )
-        {
-        TPtrC p8( KSimpleDomainTag );
-        uriSize = uriSize - p8.Length() + aDomain.Length();
-        }
-
-    // allocate new buffer for URI
-    // Temporarily the buffer might need more space then the final URI length
-    // (when tags are longer than the real values replacing them).
-    if ( uriSize < uriTemplate.Length() + KMyLenPrefix )
-        {
-        uriSize = uriTemplate.Length() + KMyLenPrefix +
-                  aGroup.Length() + aPresentityUri.Length() + aDomain.Length();
-        }
-    HBufC16* buf = HBufC16::NewLC( uriSize );
-    TPtr16 pBuf(buf->Des());
-
-    // Append "sip:" prefix
-    pBuf.Append( KMySip );
-
-    // Append template
-    pBuf.Append( uriTemplate );
-
-    // Replace tags in URI template with the real values.
-    ReplaceGroupTag( buf, aGroup );
-    ReplaceDomainTag( buf, aDomain );
-    ReplaceUserTag( buf, aPresentityUri );
-
-    return buf;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoesUserListExistsL
-// ---------------------------------------------------------------------------
-//
-TBool CSimplePluginXdmUtils::DoesUserListExistsL( const TDesC& aName )
-  {
-    CXdmDocumentNode* buddylist = DoGetBuddyListL();
-    CXdmDocumentNode* foundNode = SearchListUnderParentL( buddylist, aName );
-    return foundNode ? ETrue : EFalse;
-  }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::AuxBuffer
-// ---------------------------------------------------------------------------
-//
-TPtrC CSimplePluginXdmUtils::AuxBuffer( )
-    {
-    return iAuxBuffer ? iAuxBuffer->Des() : TPtrC();
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RemoveRlsServiceByResourceListL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RemoveRlsServiceByResourceListL(
-    const TDesC& aGroup, TRequestStatus& aStatus )
-    {
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: RemoveRlsServiceByResourceListL"));
-#endif
-
-    TBool ret( EFalse );
-
-    iOperation = EXdmRlsRemove;
-    iClientStatus = &aStatus;
-
-    // convert a Group into resource-list value
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aGroup );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    // remove service-uri in the rls-services document
-    ret = DoRemoveRlsServiceByResourceListL( listUri->Des() );
-
-    CleanupStack::PopAndDestroy( listUri );
-    CleanupStack::PopAndDestroy( xcapUri );
-
-    *iClientStatus = KRequestPending;
-
-    if ( ret )
-        {
-        // Update RLS document when needed.
-        UpdateRlsL();
-        iXdmState = EUpdateRlsServices;
-        }
-    else
-        {
-        CompleteClientReq( KErrNone );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoRemoveRlsServiceByResourceListL
-// ---------------------------------------------------------------------------
-//
-TBool CSimplePluginXdmUtils::DoRemoveRlsServiceByResourceListL( const TDesC& aResourceList )
-    {
-    TBool ret( EFalse );
-
-    CDesC16Array* myArray = new (ELeave) CDesC16ArraySeg(10);
-    CleanupStack::PushL( myArray );
-
-    CDesC16Array* myValues = new (ELeave) CDesC16ArraySeg(10);
-    CleanupStack::PushL( myValues );
-
-    iRlsXdm->GetServiceUrisL( *myArray );
-    TInt myCount = myArray->MdcaCount();
-
-    for ( TInt i=0; i < myCount && !ret; i++ )
-        {
-        iRlsXdm->SwitchToServiceURIL( myArray->MdcaPoint( i ));
-        iRlsXdm->GetElementsL( KPresResourceList, *myValues);
-        TInt myValuesCount = myValues->MdcaCount();
-        for ( TInt j=0; j < myValuesCount; j++ )
-            {
-            if ( !myValues->MdcaPoint( i ).Compare( aResourceList ) )
-                {
-                // delete service with the URI
-                iRlsXdm->RemoveServiceURIL( myArray->MdcaPoint( i ) );
-                ret = ETrue;
-                break;
-                }
-            }
-        }
-
-    CleanupStack::PopAndDestroy( myValues );
-    CleanupStack::PopAndDestroy( myArray );
-
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RlsServiceByResourceListL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSimplePluginXdmUtils::RlsServiceByResourceListLC(
-    const TDesC& aGroup )
-    {
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: :RlsServiceByResourceListLC"));
-#endif
-
-    HBufC* myRet = NULL;
-
-    // convert a Group into resource-list value
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-    CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), aGroup );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    // remove service-uri in the rls-services document
-    myRet = DoGetRlsServiceByResourceListL( listUri->Des() );
-
-    CleanupStack::PopAndDestroy( listUri );
-    CleanupStack::PopAndDestroy( xcapUri );
-
-    CleanupStack::PushL( myRet );
-
-    return myRet;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::DoGetRlsServiceByResourceListL
-// ---------------------------------------------------------------------------
-//
-HBufC* CSimplePluginXdmUtils::DoGetRlsServiceByResourceListL( const TDesC& aResourceList )
-    {
-
-    HBufC* ret = NULL;
-
-    CDesC16Array* myArray = new (ELeave) CDesC16ArraySeg(10);
-    CleanupStack::PushL( myArray );
-
-    CDesC16Array* myValues = new (ELeave) CDesC16ArraySeg(10);
-    CleanupStack::PushL( myValues );
-
-    iRlsXdm->GetServiceUrisL( *myArray );
-    TInt myCount = myArray->MdcaCount();
-
-    for ( TInt i=0; i < myCount && !ret; i++ )
-        {
-        iRlsXdm->SwitchToServiceURIL( myArray->MdcaPoint( i ));
-        iRlsXdm->GetElementsL( KPresResourceList, *myValues);
-        TInt myValuesCount = myValues->MdcaCount();
-        for ( TInt j=0; j < myValuesCount; j++ )
-            {
-            if ( !myValues->MdcaPoint( i ).Compare( aResourceList ) )
-                {
-                // save the URI
-                ret = myArray->MdcaPoint( i ).AllocL();
-                break;
-                }
-            }
-        }
-
-    CleanupStack::PopAndDestroy( myValues );
-    CleanupStack::PopAndDestroy( myArray );
-
-    if ( !ret )
-        {
-        User::Leave( KErrNotFound );
-        }
-    return ret;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::RlsServiceUriNegotiationL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::RlsServiceUriNegotiationL()
-    {
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: :RlsServiceUriNegotiationL"));
-#endif
-    // Handle RLS Service URI negotiation
-
-    HBufC16* buf = CreateRlsDocumentUri16LC(
-        AuxBuffer(), iConnSets.CurrentSipPresentity(), iConnSets.CurrentDomain() );
-
-    TRAP_IGNORE( iRlsXdm->RemoveServiceURIL( buf->Des() ));
-
-    TInt errx = iRlsXdm->AddServiceURIL( iRlsXdm->NegotiatedServiceUri() );
-    if ( errx && errx != KErrAlreadyExists )
-        {
-        User::Leave( errx );
-        }
-    User::LeaveIfError( iRlsXdm->SwitchToServiceURIL( iRlsXdm->NegotiatedServiceUri() ));
-
-    HBufC* xcapUri = TXdmSettingsApi::PropertyL( iSettingsId, EXdmPropUri );
-        CleanupStack::PushL( xcapUri );             // << xcapUri
-
-    HBufC* listUri = MakeRlsBuddyUriL( xcapUri->Des(), AuxBuffer() );
-    CleanupStack::PushL( listUri );             // << listUri
-
-    TInt err = iRlsXdm->AddElementL( KPresResourceList, listUri->Des(), AuxBuffer() );
-    if ( err && err != KErrAlreadyExists )
-        {
-        User::Leave( err );
-        }
-
-    CleanupStack::PopAndDestroy( listUri );     // >> listUri
-    CleanupStack::PopAndDestroy( xcapUri );     // >> xcapUri
-    CleanupStack::PopAndDestroy( buf );
-
-    delete iAuxBuffer;
-    iAuxBuffer = NULL;
-    iAuxBuffer = iRlsXdm->NegotiatedServiceUri().AllocL();
-
-    UpdateRlsL();
-    iXdmState = EReUpdateRlsServices;
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::MakeDefaultRuleL
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::MakeDefaultRuleL(
-    TDes& aRuleId,
-    TPresenceActionXDM& aAction,
-    TPresenceTransformXDM& aTransform,
-    TPresCondMisc& aMisc )
-    {
-
-#ifdef _DEBUG
-    PluginLogger::Log(_L("PluginXdm: :MakeDefaultRuleL"));
-#endif
-
-    iPresenceXdm->CreateNewRuleL( aRuleId );
-    User::LeaveIfError( aMisc.AddOtherIdentityL(aRuleId) );
-
-    // use run-time variation for rule action
-    CSimplePluginVariation::TSimplePluginAuthRule authRule =
-        iConnSets.Variation().DefaultRuleAction();
-
-    switch (authRule)
-        {
-        case CSimplePluginVariation::ERuleConfirm:
-            User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresConfirm ));
-            break;
-        case CSimplePluginVariation::ERulePoliteBlock:
-            User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresPoliteBlock ));
-            break;
-        case CSimplePluginVariation::ERuleBlock:
-            User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresBlock ));
-            break;
-        default:
-            User::LeaveIfError( aAction.AddOrReplaceActionL(aRuleId, KPresAllow ));
-        };
-    User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL(
-        aRuleId, KPresProvideAllAttributes ));
-    User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL(
-        aRuleId, KPresProvidePersons ));
-    User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL(
-        aRuleId, KPresProvideDevices ));
-    User::LeaveIfError( aTransform.AddOrRepProvideAllTransComplexL(
-        aRuleId, KPresProvideServices ));
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::ReplaceGroupTag
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::ReplaceGroupTag( HBufC16* aBuf, const TDesC16& aGroup )
-    {
-    // Replace group if found
-    TPtr pBuf( aBuf->Des() );
-    TInt pos = pBuf.Find( KSimpleGroupTag );
-    if ( pos != KErrNotFound )
-        {
-        TPtrC p8( KSimpleGroupTag );
-        pBuf.Replace( pos, p8.Length(), aGroup );
-        }
-    else
-        {
-        // No tag
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::ReplaceDomainTag
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::ReplaceDomainTag( HBufC16* aBuf, const TDesC16& aDomain )
-    {
-    // Replace domain if found
-    TPtr pBuf( aBuf->Des() );
-    TInt pos = pBuf.Find( KSimpleDomainTag );
-    if ( pos != KErrNotFound )
-        {
-        // remove leading "@"
-        TPtrC p8( KSimpleDomainTag );
-        if ( aDomain[0] == '@')
-            {
-            pBuf.Replace( pos, p8.Length(), aDomain.Mid( 1 ));
-            }
-        else
-            {
-            pBuf.Replace( pos, p8.Length(), aDomain );
-            }
-        }
-    else
-        {
-        // No tag
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::ReplaceUserTag
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::ReplaceUserTag(
-    HBufC16* aBuf, const TDesC16& aPresentityUri )
-    {
-    TPtr pBuf( aBuf->Des() );
-    TInt presentityUriLen = aPresentityUri.Length();
-    // Replace user if found
-    TInt pos = pBuf.Find( KSimpleUserTag );
-    if ( pos != KErrNotFound )
-        {
-        TPtrC p8( KSimpleUserTag );
-
-        // Remove leading "sip:" or "tel:" prefix and strip off domain part from aPresentityUri.
-        TInt domainPos = presentityUriLen;
-        TInt userIdPos = 0;
-
-        if ( !aPresentityUri.Left( KMyLenPrefix ).CompareF( KMySip ) ||
-             !aPresentityUri.Left( KMyLenPrefix ).CompareF( KMyTel ))
-            {
-            userIdPos = KMyLenPrefix;
-            }
-
-        for ( TInt i = userIdPos; i < presentityUriLen; i++ )
-            {
-            if ( aPresentityUri[i] == '@' )
-                {
-                domainPos = i;
-                break;
-                }
-            }
-
-        TPtrC userId( aPresentityUri.Mid( userIdPos, domainPos - userIdPos ));
-        pBuf.Replace( pos, p8.Length(), userId );
-        }
-    }
-
-// ---------------------------------------------------------------------------
-// CSimplePluginXdmUtils::CompleteClientReq
-// ---------------------------------------------------------------------------
-//
-void CSimplePluginXdmUtils::CompleteClientReq( TInt aStatus )
-    {
-    iXdmState = EStateIdle;
-    iOperation = ENoOperation;
-    TRequestStatus* s = iClientStatus;
-    User::RequestComplete( s, aStatus );
-    }
-
-
-// End of file
-