presencefwsimpleadpt/src/simplepluginauthorization.cpp
branchRCL_3
changeset 35 fbd2e7cec7ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/presencefwsimpleadpt/src/simplepluginauthorization.cpp	Wed Sep 01 12:23:14 2010 +0100
@@ -0,0 +1,1071 @@
+/*
+* Copyright (c) 2007 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 <ximpdatasubscriptionstate.h>
+#include <protocolpresenceauthorizationdatahost.h>
+#include <ximpobjectfactory.h>
+#include <presenceobjectfactory.h>
+#include <ximpstatus.h>
+#include <ximpidentity.h>
+#include <presencegrantrequestinfo.h>
+#include <ximpobjectcollection.h>
+#include <presenceblockinfo.h>
+#include <presenceerrors.hrh>
+
+#include <simplefactory.h>
+#include <msimpleconnection.h>
+#include <msimplewinfo.h>
+#include <msimpleelement.h>
+
+#include "simplepluginauthorization.h"
+#include "simpleplugindebugutils.h"
+#include "simplepluginwinfo.h"
+#include "simplepluginxdmutils.h"
+#include "simpleplugincommon.h"
+#include "simplepluginconnection.h"
+
+/**
+    The design is the following one
+
+    1. DoGrantPresenceForEveryOneL
+      modify default rule to ALLOW.
+
+    2. DoWithdrawPresenceFromEveryOneL
+      if current rule is ALLOW then
+        {  BLOCK  }
+        otherwise no action.
+
+    3. DoSubscribePresenceGrantRequestListL
+      modify default rule to CONFIRM.
+
+    4. DoUnsubscribePresenceGrantRequestListL
+      if current rule is CONFIRM then
+        { go to ALLOW  }
+        otherwise no action.
+*/
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CSimplePluginAuthorization
+// ---------------------------------------------------------------------------
+//
+CSimplePluginAuthorization::CSimplePluginAuthorization(
+    MSimplePluginConnectionObs& aObs )
+: CActive( CActive::EPriorityStandard ),
+  iConnObs(aObs),
+  iOperation(ENoOperation),
+  iXdmOk(EFalse), iDefRule(ERuleDef), iWinfoSubs( EFalse )
+    {
+    CActiveScheduler::Add( this );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::ConstructL( )
+    {
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::NewL
+// ---------------------------------------------------------------------------
+//
+CSimplePluginAuthorization* CSimplePluginAuthorization::NewL(
+    MSimplePluginConnectionObs& aObs )
+    {
+    CSimplePluginAuthorization* self =
+        new( ELeave ) CSimplePluginAuthorization( aObs );
+    CleanupStack::PushL( self );
+    self->ConstructL(  );
+    CleanupStack::Pop( self );
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: NewL this=%d"), (TInt)self );
+#endif
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::~CSimplePluginAuthorization
+// ---------------------------------------------------------------------------
+//
+CSimplePluginAuthorization::~CSimplePluginAuthorization()
+    {
+    delete iPresIdentity;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::SetDataHost
+// We assume that this method is given by PrFw right after
+// constrcution.
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::SetDataHost(
+    MProtocolPresenceAuthorizationDataHost& aDataHost )
+    {
+    iDataHost = &aDataHost;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::WinfoTerminatedL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::WinfoTerminatedL( TInt /*aReason*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: WinfoTerminatedL") );
+#endif
+
+    if ( iWinfoSubs )
+        {
+        MXIMPDataSubscriptionState* myState = iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
+        MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
+        // Notice: consider error codes
+        myStatus->SetResultCode( KErrCompletion );
+        myState->SetSubscriptionStateL(
+            MXIMPDataSubscriptionState::ESubscriptionInactive );
+
+        // parameters' OWNERSHIP is taken
+        iDataHost->SetPresenceGrantRequestDataSubscriptionStateL(
+            myState,
+            myStatus );
+
+        iWinfoSubs = EFalse;
+
+        CleanupStack::Pop( /*myStatus*/ );
+        CleanupStack::Pop( /*myState*/ );
+        }
+ }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoSubscribePresenceGrantRequestListL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoSubscribePresenceGrantRequestListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoSubscribePresenceGrantRequestListL"));
+#endif
+
+    /*
+    This means Reactive authorization, i.e. modify default rule as CONFIRM.
+    Also this starts the WINFO subscription.
+
+    Once the authorization request is received the
+    MProtocolPresenceAuthorizationDataHost::HandlePresenceGrantRequestReceivedL shall
+    be called in the host API.
+
+    First make the watcher list SIP subscription and after that is completed
+    in HandleIfMine then continue and modify XDMS authentication rule.
+    HandleIfMine can be called also immediately if there already exists an WINFO subscrption.
+    */
+
+    iOperation = ESubscribePresenceGrantRequestList;
+    iPrFwId = aReqId;
+    TRAPD( err, iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId ));
+    if ( err )
+        {
+        iOperation = ENoOperation;
+        User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+        }
+    else
+        {
+        iWinfoSubs = ETrue;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoUnsubscribePresenceGrantRequestListL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoUnsubscribePresenceGrantRequestListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoUnsubscribePresenceGrantRequestListL TEST COVERS 4"));
+#endif
+
+    // First modify XDMS authentication rule and then unsubscribe
+    // SIP watcher list subscription.
+    TRAPD( err, DoStartXdmOperationL( aReqId, EUnsubscribePresenceGrantRequestList ));
+    if ( err )
+        {
+        User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+        }
+    iPrFwId = aReqId;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoGrantPresenceForPresentityL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoGrantPresenceForPresentityL(
+    const MXIMPIdentity& aPresentityId,
+    const MPresenceInfoFilter& /*aPif*/,  // notice: pif not supported
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForPresentityL"));
+#endif
+    StartXdmOperationL( aPresentityId, aReqId, EGrantPresenceForPresentity );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL(
+    const MXIMPIdentity& /*aPresentityId*/,
+    const MPresenceInfoFilter& /*aPif*/,
+    TXIMPRequestId /*aReqId*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForPresentityL"));
+#endif
+    // Notice: aPif filter not supported.
+    User::Leave( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL(
+    const MXIMPIdentity& aPresentityId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromPresentityL"));
+#endif
+    StartXdmOperationL( aPresentityId, aReqId, EWithdrawFromPresentity );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL(
+    const MXIMPIdentity& aGroupId,
+    const MPresenceInfoFilter& /*aPif*/,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForPresentityGroupMembersL"));
+#endif
+    StartXdmOperationL( aGroupId, aReqId, EGrantPresenceForPresentityGroupMembers );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL(
+    const MXIMPIdentity& /*aGroupId*/,
+    const MPresenceInfoFilter& /*aPif*/,
+    TXIMPRequestId /*aReqId*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForPresentityGroupMembersL"));
+#endif
+    // Notice: aPif filter not supported
+    User::Leave( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL(
+    const MXIMPIdentity& aGroupId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromPresentityGroupMembersL"));
+#endif
+    StartXdmOperationL( aGroupId, aReqId, EWithdrawFromGroupMembers );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoGrantPresenceForEveryoneL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoGrantPresenceForEveryoneL(
+    const MPresenceInfoFilter& /*aPif*/,   // // Notice: aPif filter not supported
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoGrantPresenceForEveryoneL"));
+#endif
+    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC();  // << nobody
+    StartXdmOperationL( *nobody, aReqId, EGrantForEveryone );
+    CleanupStack::PopAndDestroy( );                     // >> nobody
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL(
+    const MPresenceInfoFilter& /*aPif*/,
+    TXIMPRequestId /*aReqId*/ )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoUpdatePresenceGrantPifForEveryoneL"));
+#endif
+    // Notice: aPif filter not supported
+    User::Leave( KErrNotSupported );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoWithdrawPresenceGrantFromEveryoneL"));
+#endif
+    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC();  // << nobody
+    StartXdmOperationL( *nobody, aReqId, EWithdrawFromEveryone );
+    CleanupStack::PopAndDestroy( );                     // >> nobody
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoSubscribePresenceBlockListL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoSubscribePresenceBlockListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoSubscribePresenceBlockListL"));
+#endif
+    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC();  // << nobody
+    StartXdmOperationL( *nobody, aReqId, ESubscribeBlockList );
+    CleanupStack::PopAndDestroy( );                     // >> nobody
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoUnsubscribePresenceBlockListL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoUnsubscribePresenceBlockListL(
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoUnsubscribePresenceBlockListL"));
+#endif
+    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC();  // << nobody
+    StartXdmOperationL( *nobody, aReqId, EUnsubscribeBlockList );
+    CleanupStack::PopAndDestroy( );                     // >> nobody
+    }
+
+// Blocking presence information access from single presentities
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoBlockPresenceForPresentityL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoBlockPresenceForPresentityL(
+    const MXIMPIdentity& aPresentityId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoBlockPresenceForPresentityL"));
+#endif
+    StartXdmOperationL( aPresentityId, aReqId, EBlockPresentity );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoCancelPresenceBlockFromPresentityL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoCancelPresenceBlockFromPresentityL(
+    const MXIMPIdentity& aPresentityId,
+    TXIMPRequestId aReqId )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: DoCancelPresenceBlockFromPresentityL"));
+#endif
+    StartXdmOperationL( aPresentityId, aReqId, EUnblockPresentity );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoCancel()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoCancel(  )
+    {
+    iXdmUtils->Cancel();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::RunL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::RunL(  )
+    {
+    TInt myStatus = iStatus.Int();
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: RunL %d"), myStatus );
+#endif
+
+    if ( iOperation == EUnsubscribePresenceGrantRequestList && !myStatus )
+        {
+        // unsubscribe watcher list after successful default rule modification.
+        TRAPD( err, iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( iPrFwId ));
+        if ( err )
+            {
+            User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+            }
+        else
+            {
+            // This will end to HandleIfMine.
+            }
+        }
+    else if ( !iXdmOk && !myStatus )
+        {
+        iXdmOk = ETrue;
+        CallActualXdmOperationL();
+        }
+    else // iXdmOK or myStatus
+        {
+        CompletePrFwReq( myStatus );
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CallActualXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::CallActualXdmOperationL()
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: CallActualXdmOperationL") );
+#endif
+    switch ( iOperation )
+        {
+        case EGrantPresenceForPresentity:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->AddEntityToGrantedL( iPresIdentity->Des(), iStatus );
+            SetActive();
+            break;
+        case EWithdrawFromPresentity:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->RemoveEntityFromGrantedL( iPresIdentity->Des(),iStatus );
+            SetActive();
+            break;
+        case EGrantPresenceForPresentityGroupMembers:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->AddGroupToGrantedL( iPresIdentity->Des(), iStatus );
+            SetActive();
+            break;
+        case EWithdrawFromGroupMembers:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->RemoveGroupFromGrantedL( iPresIdentity->Des(), iStatus );
+            SetActive();
+            break;
+        case EGrantForEveryone:
+            iXdmUtils->GrantForEveryoneL( iStatus );
+            SetActive();
+            break;
+        case EWithdrawFromEveryone:
+            iXdmUtils->WithdrawFromEveryoneL( iStatus );
+            SetActive();
+            break;
+        case ESubscribeBlockList:
+            HandleSubscribeBlockListL();
+            break;
+        case EUnsubscribeBlockList:
+            iXdmUtils->UnsubscribeBlockListL( iStatus );
+            SetActive();
+            break;
+        case EBlockPresentity:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->AddEntityToBlockedL( iPresIdentity->Des(), iStatus );
+            SetActive();
+            break;
+        case EUnblockPresentity:
+            // iPresIdentity can't be null in this case
+            iXdmUtils->RemoveEntityFromBlockedL( iPresIdentity->Des(), iStatus );
+            SetActive();
+            break;
+        case ESubscribePresenceGrantRequestList:
+            iXdmUtils->SetReactiveAuthL( iStatus );
+            SetActive();
+            break;
+        case EUnsubscribePresenceGrantRequestList:
+        default:
+            iXdmUtils->SetProactiveAuthL( iStatus );
+            SetActive();
+            break;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CopyBlockersToArrayL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::CopyBlockersToArrayL(
+        CPtrCArray& aBlockers, RPointerArray<MXIMPIdentity>& aBlockedSouls )
+    {
+    MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory();
+
+    aBlockedSouls.Reset();
+
+    TInt nodeCount = aBlockers.Count();
+    for ( TInt i = 0; i < nodeCount; i++ )
+        {
+        MXIMPIdentity* entity = myFactory.NewIdentityLC(); // << entity
+        entity->SetIdentityL( aBlockers[i] );
+        aBlockedSouls.AppendL( entity );
+        CleanupStack::Pop(); // >> entity
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::RunError
+// ---------------------------------------------------------------------------
+//
+TInt CSimplePluginAuthorization::RunError( TInt aError )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: RunError %d"), aError );
+#endif
+    // complete the open request
+    CompletePrFwReq( aError );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::GetInterface()
+// ---------------------------------------------------------------------------
+//
+TAny* CSimplePluginAuthorization::GetInterface(
+        TInt32 aInterfaceId,
+        TIfGetOps aOptions )
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        MProtocolPresenceAuthorization* myIf = this;
+        return myIf;
+        }
+    if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::GetInterface()
+// ---------------------------------------------------------------------------
+//
+const TAny* CSimplePluginAuthorization::GetInterface(
+    TInt32 aInterfaceId,
+    TIfGetOps aOptions ) const
+    {
+    if ( aInterfaceId == GetInterfaceId() )
+        {
+        // caller wants this interface
+        const MProtocolPresenceAuthorization* myIf = this;
+        return myIf;
+        }
+    if ( aOptions == MXIMPBase::EPanicIfUnknown )
+        {
+        User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported );
+        }
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::GetInterfaceId()
+// ---------------------------------------------------------------------------
+//
+TInt32 CSimplePluginAuthorization::GetInterfaceId() const
+    {
+    return MProtocolPresenceAuthorization::KInterfaceId;
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::SetPresIdentityL()
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::SetPresIdentityL(
+     const MXIMPIdentity& aPresentityId )
+     {
+     delete iPresIdentity;
+     iPresIdentity = NULL;
+     iPresIdentity = aPresentityId.Identity().AllocL();
+     }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::WinfoNotificationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::WinfoNotificationL(
+    MSimpleWinfo& aWinfo )
+    {
+    if ( !iWinfoSubs )
+        {
+        return;
+        }
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: WinfoNotificationL starts"));
+#endif
+
+    using namespace NSimplePlugin::NSimpleOma;
+
+    RPointerArray<MSimpleElement> elems;
+    CleanupClosePushL( elems );
+    TInt err = aWinfo.SimpleElementsL( elems );
+    User::LeaveIfError( err );
+    TInt count = elems.Count();
+
+    if ( !count )
+        {
+        // stop parsing empty notification
+        User::Leave( KErrArgument );
+        }
+
+    __ASSERT_DEBUG( count == 1, User::Leave( KErrCorrupt ) );
+
+    const TDesC8* stateVal = aWinfo.AttrValue( KSimpleState8 );
+    if ( stateVal && !stateVal->CompareF( KSimpleFull8 ))
+        {
+        // Call full list method
+        HandleFullWinfoNotificationL( aWinfo );
+        }
+    else
+        {
+        // Indicate changes in WINFO list one by one.
+        HandlePartialWinfoNotificationL( aWinfo );
+        }
+    CleanupStack::PopAndDestroy( &elems );
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: WinfoNotificationL ends"));
+#endif
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::StartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::StartXdmOperationL(
+    const MXIMPIdentity& aId,
+    TXIMPRequestId aReqId,
+    TPluginAuthOperation aOperation )
+    {
+    TRAPD( err, DoStartXdmOperationL(aId, aReqId, aOperation ));
+    if ( err )
+        {
+        User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err ));
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoStartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoStartXdmOperationL(
+    const MXIMPIdentity& aId,
+    TXIMPRequestId aReqId,
+    TPluginAuthOperation aOperation )
+    {
+    SetPresIdentityL( aId );
+    DoStartXdmOperationL( aReqId, aOperation );
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::DoStartXdmOperationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::DoStartXdmOperationL(
+    TXIMPRequestId aReqId,
+    TPluginAuthOperation aOperation )
+    {
+    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) );
+    iPrFwId = aReqId;
+    iOperation = aOperation;
+    if ( !iXdmUtils )
+        {
+        iXdmUtils = iConnObs.XdmUtilsL();
+        }
+    if ( iXdmOk )
+        {
+        CallActualXdmOperationL();
+        }
+    else
+        {
+        iXdmUtils->InitializeXdmL( iStatus );
+        SetActive();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::HandleFullWinfoNotificationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::HandleFullWinfoNotificationL(
+    MSimpleWinfo& aWinfo )
+    {
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandleFullWinfoNotificationL starts"));
+#endif
+
+    // Search for pending watchers and call HandlePresenceGrantRequestListL
+    using namespace NSimplePlugin::NSimpleOma;
+
+    RPointerArray<MSimpleElement> elems;
+    CleanupClosePushL( elems );
+    TInt err = aWinfo.SimpleElementsL( elems );
+    User::LeaveIfError( err );
+    TInt count = elems.Count();
+
+    MSimpleElement* elem = elems[0];
+    TPtrC8 p8 = elem->LocalName();
+    err = p8.CompareF( KSimpleWatcherList8 );
+    User::LeaveIfError( err );
+
+    err = elem->SimpleElementsL( elems );
+    User::LeaveIfError( err );
+    count = elems.Count();
+
+    // Search watchers who are pending (status = pending)
+    HBufC* nodeContent = NULL;
+    MXIMPObjectCollection *pendings = iConnObs.ObjectFactory().NewObjectCollectionLC();
+
+    TBool pendingFound(EFalse);
+
+    for ( TInt i = 0; i < count; i++ )
+        {
+        elem = elems[i];
+        p8.Set( elem->LocalName());
+        if (!( p8.CompareF( KSimpleWatcher8 )))
+            {
+            const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 );
+            if ( pp8 && !pp8->CompareF( KSimplePending8 ))
+                {
+                // Build collection of grant requests
+                // Find the child node containing the SIP entity
+                nodeContent = elem->ContentUnicodeL();
+                CleanupStack::PushL( nodeContent );
+                // create the collection entry here
+                MPresenceGrantRequestInfo* grInfo =
+                   iConnObs.PresenceObjectFactory().NewPresenceGrantRequestInfoLC();
+                MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
+                identity->SetIdentityL( nodeContent->Des());
+                grInfo->SetRequestorIdL( identity ); // ownership is taken
+                CleanupStack::Pop( ); // identity
+#ifdef _DEBUG
+                TBuf<200> debug_buffer;
+                debug_buffer = nodeContent->Des();
+                PluginLogger::Log(
+                    _L("PluginAuth: add pending into collection: %S"), &debug_buffer );
+#endif
+                pendings->AddObjectL( grInfo );  // ownership is taken
+                CleanupStack::Pop( );            // grInfo
+                pendingFound = ETrue;
+                CleanupStack::PopAndDestroy( nodeContent );
+                }
+            }
+        }
+
+    if ( pendingFound )
+        {
+#ifdef _DEBUG
+        PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestListL"));
+#endif
+        iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestListL( pendings );
+        CleanupStack::Pop();    // >> pendings
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( ); // >> pendings
+        }
+
+    CleanupStack::PopAndDestroy( &elems );
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandleFullWinfoNotificationL ends"));
+#endif
+
+    /* example:
+
+   <?xml version="1.0"?>
+     <watcherinfo xmlns="urn:ietf:params:xml:ns:watcherinfo"
+   version="0" state="full">
+     <watcher-list resource="sip:presentity@example.com"
+                   package="presence">
+         <watcher status="active"
+            id="sr8fdsj"
+            duration-subscribed="509"
+            expiration="20"
+            event="approved">sip:watcherA@example.com"
+          </watcher>
+     */
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::HandlePartialWinfoNotificationL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::HandlePartialWinfoNotificationL(
+    MSimpleWinfo& aWinfo )
+    {
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandlePartialWinfoNotificationL starts"));
+#endif
+
+    using namespace NSimplePlugin::NSimpleOma;
+
+    RPointerArray<MSimpleElement> elems;
+    CleanupClosePushL( elems );
+    TInt err = aWinfo.SimpleElementsL( elems );
+    User::LeaveIfError( err );
+    TInt count = elems.Count();
+
+    MSimpleElement* elem = elems[0];
+    TPtrC8 p8 = elem->LocalName();
+    err = p8.CompareF( KSimpleWatcherList8 );
+    User::LeaveIfError( err );
+
+    err = elem->SimpleElementsL( elems );
+    User::LeaveIfError( err );
+    count = elems.Count();
+
+    HBufC* nodeContent = NULL;
+
+    for ( TInt i = 0; i < count; i++ )
+        {
+        elem = elems[i];
+        p8.Set( elem->LocalName());
+        if (!( p8.CompareF( KSimpleWatcher8 )))
+            {
+            const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 );
+            if ( pp8 && !pp8->CompareF( KSimplePending8 ))
+                {
+                nodeContent = elem->ContentUnicodeL();
+                CleanupStack::PushL( nodeContent );
+                CallHandlePresenceGrantRequestReceivedL( nodeContent->Des() );
+                CleanupStack::PopAndDestroy( nodeContent );
+                }
+            else if ( pp8 && !pp8->CompareF( KSimpleTerminated8 ))
+                {
+                nodeContent = elem->ContentUnicodeL();
+                CleanupStack::PushL( nodeContent );
+                CallHandlePresenceGrantRequestObsoletedL( nodeContent->Des() );
+                CleanupStack::PopAndDestroy( nodeContent );
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( &elems );
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandlePartialWinfoNotificationL ends"));
+#endif
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CallHandlePresenceGrantRequestReceivedL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::CallHandlePresenceGrantRequestReceivedL(
+    const TDesC& aUserId )
+    {
+    // create the collection entry here
+    MPresenceGrantRequestInfo* grInfo =
+       iConnObs.PresenceObjectFactory().NewPresenceGrantRequestInfoLC();  // +grInfo
+    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();   // +identity
+    identity->SetIdentityL( aUserId );
+    grInfo->SetRequestorIdL( identity ); // ownership is taken
+    CleanupStack::Pop( );    // -identity
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestReceivedL"));
+#endif
+    iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestReceivedL( grInfo ); // ownership is taken
+    CleanupStack::Pop( );           // -grInfo
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL(
+    const TDesC& aUserId)
+    {
+    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
+    identity->SetIdentityL( aUserId );
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: callback HandlePresenceGrantRequestObsoletedL"));
+#endif
+    iPrFwIdOwn = iDataHost->HandlePresenceGrantRequestObsoletedL( identity); // ownership is taken
+    CleanupStack::Pop( );           // >> identity
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::HandleSubscribeBlockListL
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::HandleSubscribeBlockListL()
+    {
+    RPointerArray<MXIMPIdentity> blockedSouls;
+    CleanupClosePushL( blockedSouls );
+
+    const TInt KMyGran = 10;
+    CPtrCArray* blockers = new (ELeave) CPtrCArray( KMyGran );
+    CleanupStack::PushL( blockers );      // << blockers
+
+    iXdmUtils->SubscribeBlockListL( *blockers );
+
+    CopyBlockersToArrayL( *blockers, blockedSouls );
+
+    CleanupStack::PopAndDestroy( blockers );
+
+    MXIMPObjectCollection* coll =
+        iConnObs.ObjectFactory().NewObjectCollectionLC();    // << coll
+    TInt count = blockedSouls.Count();
+    for ( TInt i = count-1; i >= 0; i-- )
+        {
+        MXIMPIdentity* currId = blockedSouls[i];
+        MPresenceBlockInfo* bInfo = iConnObs.PresenceObjectFactory().NewPresenceBlockInfoLC();
+        bInfo->SetBlockedEntityIdL( currId ); // ownership is taken
+        bInfo->SetBlockedEntityDisplayNameL( currId->Identity() );
+        blockedSouls.Remove( i );
+        coll->AddObjectL( bInfo );      // ownership is taken
+        CleanupStack::Pop();                                // >> bInfo
+        }
+    CompletePrFwReq( KErrNone );
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuth: callback HandlePresenceBlockListL"));
+#endif
+    // Callback for subscription result
+    iDataHost->HandlePresenceBlockListL( coll );
+
+    CleanupStack::Pop();                                // >> coll
+    CleanupStack::PopAndDestroy( &blockedSouls );
+
+    // Callback for subscription state (terminated).
+    MXIMPDataSubscriptionState* myState = iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
+    MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
+    // Notice: consider error codes
+    myStatus->SetResultCode( KErrNone );
+    myState->SetSubscriptionStateL(
+        MXIMPDataSubscriptionState::ESubscriptionInactive );
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: callback SetPresenceBlockDataSubscriptionStateL"));
+#endif
+    iDataHost->SetPresenceBlockDataSubscriptionStateL(
+        myState, myStatus );
+    CleanupStack::Pop( 2 ); // >> myState, myStatus
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::CompletePrFwReq
+// ---------------------------------------------------------------------------
+//
+void CSimplePluginAuthorization::CompletePrFwReq( TInt aStatus )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: CompletePrFwReq status=%d"), aStatus );
+#endif
+    iOperation = ENoOperation;
+    iConnObs.CompleteReq( iPrFwId, aStatus  );
+    iPrFwId = TXIMPRequestId();
+    }
+
+// ---------------------------------------------------------------------------
+// CSimplePluginAuthorization::HandleIfMine
+// ---------------------------------------------------------------------------
+//
+TBool CSimplePluginAuthorization::HandleIfMine( TXIMPRequestId aReqId, TInt aStatus )
+    {
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandleIfMine aStatus=%d iOper=%d"), aStatus, iOperation);
+#endif
+    TInt err = KErrNone;
+    TBool ret = EFalse;
+
+    // We check wheter the request is made by this entity.
+    if ( iPrFwId != aReqId )
+        {
+        // Nothing to do, request was not orginated by this entity.
+        }
+    else
+        {
+        if ( !aStatus )
+            {
+            switch ( iOperation )
+                {
+                case ESubscribePresenceGrantRequestList:
+                    // Modify rule to CONFIRM
+#ifdef _DEBUG
+                    PluginLogger::Log(_L("PluginAuthorization: HandleIfMine TEST COVERS 7"));
+#endif
+                    TRAP( err, DoStartXdmOperationL( aReqId, iOperation ));
+                    err = CSimplePluginConnection::HarmonizeErrorCode( err );
+                    ret = ETrue;
+                    break;
+                // In UnsubscribePresenceGrantRequestList case the rule modifcation
+                // has been made first before SIP unsubscribe operation.
+                case EUnsubscribePresenceGrantRequestList:
+                default:
+                    iWinfoSubs = EFalse;
+                    break;
+                }
+            }
+        else
+            {
+            CompletePrFwReq( err );
+            ret = ETrue;
+            }
+        if ( err )
+            {
+            CompletePrFwReq( err );
+            ret = ETrue;
+            }
+        else
+            {
+            }
+        }
+
+#ifdef _DEBUG
+    PluginLogger::Log(_L("PluginAuthorization: HandleIfMine returns %d"), ret );
+#endif
+    return ret;
+    }
+
+// End of file
+