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

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  IETF SIMPLE Protocol implementation for XIMP Framework
*
*/

#include <e32std.h>
#include <s32strm.h>
#include <utf.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 <presenceinfofilter.h>
#include <msimplewinfo.h>
#include <msimpleelement.h>

#include <presenceinfo.h>
#include <presenceinfofieldcollection.h>
#include <personpresenceinfo.h>
#include <presenceinfofield.h>
#include <presenceinfofieldvalueenum.h>
#include <avabilitytext.h>

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


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

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::CPresencePluginAuthorization()
// ---------------------------------------------------------------------------
//
CPresencePluginAuthorization::CPresencePluginAuthorization(
    MPresencePluginConnectionObs& aObs,
    CPresencePluginData* aPresenceData )
    : CActive( CActive::EPriorityStandard ),
    iConnObs(aObs), iSubscribed( EFalse ),
    iOperation( ENoOperation ), iXdmOk( EFalse ),
    iComplete( EFalse ), iPresenceData( aPresenceData ),
    iContactIsStored( ETrue )
    {
    CActiveScheduler::Add(this);
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::NewL()
// ---------------------------------------------------------------------------
//
CPresencePluginAuthorization* CPresencePluginAuthorization::NewL(
    MPresencePluginConnectionObs& aObs,
    CPresencePluginData* aPresenceData )
    {
    DP_SDA("CPresencePluginAuthorization::NewL ");
    CPresencePluginAuthorization* self =
        new( ELeave ) CPresencePluginAuthorization( aObs, aPresenceData );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::ConstructL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::ConstructL()
    {
    HBufC* serviceName =
        iPresenceData->ServiceNameLC( iPresenceData->ServiceId() );
    iContacts = CPresencePluginContacts::NewL(
        iPresenceData->ServiceId(), *serviceName, *this );
    CleanupStack::PopAndDestroy( serviceName );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::~CPresencePluginAuthorization()
// ---------------------------------------------------------------------------
//
CPresencePluginAuthorization::~CPresencePluginAuthorization()
    {
    delete iPresIdentity;
    delete iContacts;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::SetDataHost()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::SetDataHost( 
    MProtocolPresenceAuthorizationDataHost& aDataHost )
    {
    DP_SDA("CPresencePluginAuthorization::SetDataHost ");
    iDataHost = &aDataHost;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::WinfoTerminatedL()
// ---------------------------------------------------------------------------
// 
void CPresencePluginAuthorization::WinfoTerminatedL( TInt aReason )
    {
    DP_SDA("CPresencePluginAuthorization::WinfoTerminatedL ");
    
    if ( iSubscribed )
        {
        MXIMPDataSubscriptionState* myState =
            iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
        MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
        myStatus->SetResultCode( aReason ? aReason : KErrCompletion );
        myState->SetSubscriptionStateL( 
            MXIMPDataSubscriptionState::ESubscriptionInactive );
        
        // parameters' OWNERSHIP is taken   
        iDataHost->SetPresenceGrantRequestDataSubscriptionStateL( 
            myState,  
            myStatus );
        
        CleanupStack::Pop( /*myStatus*/ );
        CleanupStack::Pop( /*myState*/ );
        }
    
    DP_SDA("CPresencePluginAuthorization::WinfoTerminatedL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoSubscribePresenceGrantRequestListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoSubscribePresenceGrantRequestListL(
    TXIMPRequestId aReqId )
    {
    DP_SDA("DoSubscribePresenceGrantRequestListL ");
    iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId );
    iSubscribed = ETrue;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoUnsubscribePresenceGrantRequestListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoUnsubscribePresenceGrantRequestListL(
    TXIMPRequestId aReqId )
    {
    DP_SDA("DoUnsubscribePresenceGrantRequestListL ");
    iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( aReqId );
    iSubscribed = EFalse;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoGrantPresenceForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoGrantPresenceForPresentityL(
    const MXIMPIdentity& aPresentityId,
    const MPresenceInfoFilter& /*aPif*/,  // notice: pif support
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForPresentityL ");
    
    // Workaround for clients that can only grant when accepting buddy request.
    // SIMPLE also requires grant + subscribe so do both here even though
    // it is agains ximp api definitions.
    
    _LIT( KDefaultBuddyList, "buddylist" );
    
    iAuthState = EStateAcceptBuddyRequest;
    MXIMPIdentity* buddyList = iConnObs.ObjectFactory().NewIdentityLC(); 
    buddyList->SetIdentityL( KDefaultBuddyList() ); 
    
    iConnObs.GroupsL().DoAddPresentityGroupMemberL( *buddyList, aPresentityId,
        KNullDesC(), aReqId );
    CleanupStack::PopAndDestroy( 1 ); // buddyList 
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL(
    const MXIMPIdentity& aPresentityId,
    TRequestStatus& aClientStatus )
    {
    DP_SDA("CPresencePluginAuthorization::DoPerformGrantPresenceForPresentityL");
    StartXdmOperationL( aPresentityId, 
        EGrantPresenceForPresentity, aClientStatus );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityL(
    const MXIMPIdentity& /*aPresentityId*/,
    const MPresenceInfoFilter& /*aPif*/,
    TXIMPRequestId /*aReqId*/ )
    {
    // Notice: later
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityL(
    const MXIMPIdentity& aPresentityId,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginAuth::DoWithdrawPresenceGrantFromPresentityL ");
    StartXdmOperationL( aPresentityId, aReqId, EWithdrawFromPresentity );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoPerformWithdrawPresGrantFromPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoPerformWithdrawPresGrantFromPresentityL(
    const MXIMPIdentity& aPresentityId,
    TRequestStatus& aClientStatus )
    {
    DP_SDA("CPresencePluginAuthorization");
    DP_SDA(" -> DoPerformWithdrawPresGrantFromPresentityL");
    StartXdmOperationL( aPresentityId,
        EWithdrawFromPresentity, aClientStatus );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL(
    const MXIMPIdentity& /*aGroupId*/,
    const MPresenceInfoFilter& /*aPif*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForPresentityGroupMembersL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::
// DoUpdatePresenceGrantPifForPresentityGroupMembersL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::
    DoUpdatePresenceGrantPifForPresentityGroupMembersL(
    const MXIMPIdentity& /*aGroupId*/,
    const MPresenceInfoFilter& /*aPif*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoUpdatePresenceGrantPifForPresentityGroupMembersL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::
// DoWithdrawPresenceGrantFromPresentityGroupMembersL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::
    DoWithdrawPresenceGrantFromPresentityGroupMembersL(
    const MXIMPIdentity& /*aGroupId*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoWithdrawPresenceGrantFromPresentityGroupMembersL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoGrantPresenceForEveryoneL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoGrantPresenceForEveryoneL(
    const MPresenceInfoFilter& /*aPif*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoGrantPresenceForEveryoneL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL(
    const MPresenceInfoFilter& /*aPif*/,
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoUpdatePresenceGrantPifForEveryoneL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL(
    TXIMPRequestId /*aReqId*/ )
    {
    DP_SDA("CPresencePluginAuthorization::DoWithdrawPresenceGrantFromEveryoneL -not supported");
    
    User::Leave( KErrNotSupported );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoSubscribePresenceBlockListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoSubscribePresenceBlockListL(
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginAuthorization::DoSubscribePresenceBlockListL ");
    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC(); 
    StartXdmOperationL( *nobody, aReqId, ESubscribeBlockList );
    // Cannot PopAndDestroy by name
    CleanupStack::PopAndDestroy( );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL(
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginAuthorization::DoUnsubscribePresenceBlockListL ");
    MXIMPIdentity* nobody = iConnObs.ObjectFactory().NewIdentityLC();
    StartXdmOperationL( *nobody, aReqId, EUnsubscribeBlockList );
    // Cannot PopAndDestroy by name
    CleanupStack::PopAndDestroy();
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoBlockPresenceForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoBlockPresenceForPresentityL(
    const MXIMPIdentity& aPresentityId,
    TXIMPRequestId aReqId )
    {
    DP_SDA("CPresencePluginAuthorization::DoBlockPresenceForPresentityL ");
    StartXdmOperationL( aPresentityId, aReqId, EBlockPresentity );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL(
    const MXIMPIdentity& aPresentityId,
    TRequestStatus& aClientStatus )
    {
    DP_SDA(
        "CPresencePluginAuthorization::DoPerformBlockPresenceForPresentityL");
    StartXdmOperationL( aPresentityId, EBlockPresentity, aClientStatus );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoCancelPresenceBlockFromPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoCancelPresenceBlockFromPresentityL(
    const MXIMPIdentity& aPresentityId,
    TXIMPRequestId aReqId )
    {
    DP_SDA(" DoCancelPresenceBlockFromPresentityL ");
    StartXdmOperationL( aPresentityId, aReqId, EUnblockPresentity );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoPerformCancelPresenceBlockFromPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoPerformCancelPresenceBlockFromPresentityL(
    const MXIMPIdentity& aPresentityId,
    TRequestStatus& aClientStatus )
    {
    DP_SDA(" DoPerformCancelPresenceBlockFromPresentityL (list)");
    StartXdmOperationL( aPresentityId, EUnblockPresentity, aClientStatus );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::DoCancel()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::DoCancel(  )
    {
    iXdmUtils->Cancel();
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::RunL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::RunL(  )
    {
    TInt myStatus = iStatus.Int();
    
    DP_SDA2( "CPresencePluginAuthorization::RunL mystatus %d ", myStatus );
    DP_SDA2( "CPresencePluginAuthorization::RunL state %d ",iOperation );
    
    if ( !iXdmOk && !myStatus )
        {
        DP_SDA( "CPresencePluginAuthorization::RunL !iXdmOk && !myStatus" );
        iXdmOk = ETrue;
        CallActualXdmOperationL();
        }
    else if ( iClientStatus )
        {
        DP_SDA( "CPresencePluginAuthorization::RunL - complete client" );
        TRequestStatus* s = iClientStatus;
        User::RequestComplete( s, myStatus );
        iClientStatus = NULL;
        DP_SDA( "CPresencePluginAuthorization::RunL - complete client ok" );
        }
    else if ( !myStatus )
        {
        switch ( iAuthState )
            {
            case EStateDoBlock:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL - Block presentity" );
                BlockPresentityL();
                iAuthState = EStateRemovePresentityFromGranted;
                }
                break;
                
            case EStateRemovePresentityFromGranted:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL - Remove presentity from granted" );
                WithdrawFromPresentityL();
                iAuthState = EStateBlocked;
                }
                break;
            
            case EStateBlocked:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL - Blocked" );
                SetPresentityBlockedToXIMPL();
                iAuthState = EStateIdle;
                CompleteXIMPReq( myStatus );
                }
                break;

            case EStateIsContactBlockedBuddyRequest:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL - Resolve contact type" );
                // resolve is contact blocked friend request
                HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
                IsBlockedContactFriendRequestL( *withoutPrefix, *this, iStatus );
                CleanupStack::PopAndDestroy( withoutPrefix );
                SetActive();
                iAuthState = EStateDoUnBlock;
                }
                break;
                
            case EStateDoUnBlock:
                {
                if ( iContactIsStored )
                    {
                    DP_SDA( "CPresencePluginAuthorization::RunL - Grant presence for presentity" );
                    GrantPresenceForPresentityL();
                    iAuthState = EStatePresenceGranted;
                    }
                else
                    {
                    DP_SDA( "CPresencePluginAuthorization::RunL - Complete unblock" );
                    iAuthState = EStateIdle;
                    CompleteXIMPReq( myStatus );
                    }
                }
                break;
            
            case EStatePresenceGranted:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL -Subscribe presentity presence" );  
                MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
                identity->SetIdentityL( iPresIdentity->Des() ); 
                iConnObs.WatcherHandlerL()->DoPerformSubscribePresentityPresenceL( *identity, iStatus );
                CleanupStack::PopAndDestroy( ); //identity 
                iAuthState = EStateSubscribe;
                SetActive();
                }
                break;
                
            case EStateSubscribe:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL -UnBlock completed" ); 
                HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
                iPresenceData->WriteStatusToCacheL( *withoutPrefix, 
                    MPresenceBuddyInfo2::ENotAvailable,
                    KInvisibleState(),
                    KNullDesC() );
                CleanupStack::PopAndDestroy( withoutPrefix );
                iAuthState = EStateIdle;
                CompleteXIMPReq( myStatus );
                }
                break;
                
            default:
                {
                DP_SDA( "CPresencePluginAuthorization::RunL - default case" );
                CompleteXIMPReq( myStatus );
                }
                break;
            }
        }
    else if ( KErrNotFound == myStatus && EStateDoBlock == iAuthState )
        {
        // When blocking friend request, watcher was not found but request
        // has to be blocked anyways.
        DP_SDA( "CPresencePluginAuthorization::RunL - Block presentity" );
        BlockPresentityL();
        iAuthState = EStateBlocked;
        }
    else
        {
        DP_SDA( "CPresencePluginAuthorization::RunL -error" );
        CompleteXIMPReq( myStatus );
        }
        
    if ( EStateAcceptBuddyRequest == iAuthState && EGrantPresenceForPresentity == iOperation )
        {
        iAuthState = EStateIdle;
        HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
        CallHandlePresenceGrantRequestObsoletedL( *withoutPrefix );
        iConnObs.SubscribedContacts()->HandlePresentityGroupMemberAddedL( *withoutPrefix );
        CleanupStack::PopAndDestroy( withoutPrefix );
        }
    
    DP_SDA( "CPresencePluginAuthorization::RunL - exit" );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::CallActualXdmOperationL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::CallActualXdmOperationL()
    {
    DP_SDA("CPresencePluginAuthorization::CallActualXdmOperationL ");
    DP_SDA2("CallActualXdmOperationL operation %d", iOperation );
    iComplete = EFalse;
    switch ( iOperation )
        {
        case EGrantPresenceForPresentity:
            {
            DP_SDA("CallActualXdmOperationL EGrantPresenceForPresentity");
            GrantPresenceForPresentityL();
            }
            break;
            
        case EWithdrawFromPresentity:
            {
            DP_SDA("CallActualXdmOperationL EWithdrawFromPresentity");
            WithdrawFromPresentityL();
            }
            break;
            
        case ESubscribeBlockList:
            {
            SubscribeBlockListL( );
            }
            break;
            
        case EUnsubscribeBlockList:
            {
            UnSubscribeBlockListL();
            }
            break;
            
        case EBlockPresentity:
            {
            DP_SDA( "CallActualXdmOperationL EBlockPresentity" );
            
            TRAPD( error, UnsubscribePresentityPresenceL() );
            
            if( error )
                {
                DP_SDA2( "Unsubscribe presentity FAIL, error = %d" , error );
                
                if ( KErrNotFound != error  )
                    {
                    User::Leave( error );
                    }
                BlockPresentityL();
                iAuthState = EStateBlocked;
                }
            else
                {
                iAuthState = EStateDoBlock;
                }
            }
            break;
            
        case EUnblockPresentity:
            {
            DP_SDA("CallActualXdmOperationL EUnblockPresentity"); 
            UnblockPresentityL();
            }
            break;
            
        default:
            User::Leave( KErrNotSupported );
            break;
        }
    DP_SDA("CPresencePluginAuthorization::CallActualXdmOperationL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::RunError()
// ---------------------------------------------------------------------------
//
TInt CPresencePluginAuthorization::RunError( TInt aError )
    {
    // complete the open request
    CompleteXIMPReq( aError );
    return KErrNone;
    }

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

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::GetInterface() const
// ---------------------------------------------------------------------------
//
const TAny* CPresencePluginAuthorization::GetInterface(
    TInt32 aInterfaceId,
    TIfGetOps aOptions ) const
    {
    if ( aInterfaceId == GetInterfaceId() )
        {
        // caller wants this interface
        return const_cast<CPresencePluginAuthorization*>(this);
        }
    if ( aOptions == MXIMPBase::EPanicIfUnknown )
        {
        User::Panic( KPluginName, KErrExtensionNotSupported );
        }  
    return NULL;
    }
    
// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::GetInterfaceId()
// ---------------------------------------------------------------------------
//
TInt32 CPresencePluginAuthorization::GetInterfaceId() const
    {
    return MProtocolPresenceAuthorization::KInterfaceId;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::SetPresIdentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::SetPresIdentityL(
    const MXIMPIdentity& aPresentityId,
    TBool aFormatUri )
    {  
    DP_SDA2("CPresencePluginAuthorization::SetPresIdentityL: %S",
        &aPresentityId.Identity() );
    
    delete iPresIdentity;
    iPresIdentity = NULL;
    
    if ( aFormatUri )
        {
        DP_SDA("CPresencePluginAuthorization::SetPresIdentityL, add prefix");
        
        HBufC8* identityCopy = HBufC8::NewLC( KBufSize255 );
        TPtr8 identityCopyPtr( identityCopy->Des() );
        identityCopyPtr.Copy( aPresentityId.Identity() );
        
        HBufC8* prefixUri = iPresenceData->CreatePresenceUri8LC( 
            identityCopyPtr );
        
        HBufC* prefixUri16 = HBufC::NewLC( KBufSize255 );
        TPtr prefixUri16Ptr( prefixUri16->Des() );
        prefixUri16Ptr.Copy( *prefixUri );
        
        iPresIdentity = prefixUri16;
        CleanupStack::Pop( prefixUri16 );
        CleanupStack::PopAndDestroy( prefixUri );
        CleanupStack::PopAndDestroy( identityCopy );
        }
    else
        {
        DP_SDA(" SetPresIdentityL, use as it is");
        iPresIdentity = aPresentityId.Identity().AllocL();
        }
    DP_SDA( "CPresencePluginAuthorization::SetPresIdentityL -exit" );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::WinfoNotificationL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::WinfoNotificationL(
    MSimpleWinfo& aWinfo )
    {
    DP_SDA("CPresencePluginAuthorization::WinfoNotificationL");
    // Ignore notification if not subscribed
    using namespace NPresencePlugin::NPresence;
    
    RPointerArray<MSimpleElement> elems;
    CleanupClosePushL( elems );
    TInt err = aWinfo.SimpleElementsL( elems );
    User::LeaveIfError( err );
    TInt count = elems.Count();
    
    DP_SDA2("CPresencePluginAuthorization::WinfoNotificationL count %d",
        count);
    
    if ( !count ) 
        { 
        // stop parsing empty notification 
        DP_SDA("CPresencePluginAuthorization::WinfoNotificationL LEAVE");
        User::Leave( KErrArgument ); 
        } 
    
    const TDesC8* stateVal = aWinfo.AttrValue( KPresenceState8 ); 
    if ( stateVal && !stateVal->CompareF( KPresenceFull8 )) 
        { 
        // Call full list method
        DP_SDA("CPresencePluginAuthorization::WinfoNotificationL FULL winfo");
        HandleFullWinfoNotificationL( aWinfo ); 
        } 
    else 
        { 
        // Indicate changes in WINFO list one by one.
        DP_SDA("CPresencePluginAuthorization::WinfoNotificationLPARTIAL winfo");
        HandlePartialWinfoNotificationL( aWinfo );
        } 
    CleanupStack::PopAndDestroy( &elems );
    DP_SDA("CPresencePluginAuthorization::WinfoNotificationL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::StartXdmOperationL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::StartXdmOperationL(
    const MXIMPIdentity& aId,
    TXIMPRequestId aReqId,
    TPluginAuthOperation aOperation )
    {
    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) );
    DP_SDA("CPresencePluginAuthorization::StartXdmOperationL 2");
    SetPresIdentityL( aId, ETrue );
    
    iXIMPId = aReqId;
    iOperation = aOperation;
    if ( !iXdmUtils )
        {
        DP_SDA("StartXdmOperationL !iXdmUtils");
        iXdmUtils = iConnObs.XdmUtilsL();
        }
    if ( iXdmUtils->CheckXdmDoc() )
        {
        DP_SDA("StartXdmOperationL iXdmOk");
        iXdmOk = ETrue;
        CallActualXdmOperationL();
        }
    else
        {
        DP_SDA("StartXdmOperationL else");
        iXdmUtils->InitializeXdmL( iStatus );
        SetActive();
        }
    DP_SDA("CPresencePluginAuthorization::StartXdmOperationL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::StartXdmOperationL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::StartXdmOperationL(
    const MXIMPIdentity& aId,
    TPluginAuthOperation aOperation,
    TRequestStatus& aClientStatus )
    {
    __ASSERT_DEBUG( !IsActive(), User::Leave( KErrNotReady ) );
    DP_SDA("CPresencePluginAuthorization::StartXdmOperationL 3 (list)");
    
    SetPresIdentityL( aId, EFalse );
    
    iClientStatus = &aClientStatus;
    *iClientStatus = KRequestPending;
    
    iOperation = aOperation;
    
    if ( !iXdmUtils )
        {
        DP_SDA("StartXdmOperationL !iXdmUtils");
        iXdmUtils = iConnObs.XdmUtilsL();
        }
    if ( iXdmUtils->CheckXdmDoc() )
        {
        DP_SDA("StartXdmOperationL iXdmOk");
        iXdmOk = ETrue;
        CallActualXdmOperationL();
        }
    else
        {
        DP_SDA("StartXdmOperationL else");
        iXdmUtils->InitializeXdmL( iStatus );
        SetActive();
        }
    DP_SDA("CPresencePluginAuthorization::StartXdmOperationL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::CompleteXIMPReq()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::CompleteXIMPReq( TInt aStatus )
    {
    DP_SDA("CPresencePluginAuthorization::CompleteXIMPReq");
    iOperation = ENoOperation;
    iConnObs.CompleteReq( iXIMPId, aStatus );
    iXIMPId = TXIMPRequestId();
    DP_SDA("CPresencePluginAuthorization::CompleteXIMPReq end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::SubscribeBlockListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::SubscribeBlockListL()
    {
    DP_SDA("CPresencePluginAuthorization::SubscribeBlockList");
    
    RPointerArray<MXIMPIdentity> blocked;
    CleanupStack::PushL( TCleanupItem(
        TPresencePluginUtility::ResetAndDestroyIdentities,
        &blocked ) );
    
    iXdmUtils->SubscribeBlockListL( blocked );
    MXIMPObjectCollection* coll =
        iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll
    
    TInt count = blocked.Count();
    for ( TInt i = 0; i < count; i++ )
        {
        MXIMPIdentity* currId = blocked[i];
        HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( currId->Identity() );
        currId->SetIdentityL( *withoutPrefix );
        CleanupStack::PopAndDestroy( withoutPrefix );
        MPresenceBlockInfo* bInfo =
            iConnObs.PresenceObjectFactoryOwn().NewPresenceBlockInfoLC();
        bInfo->SetBlockedEntityIdL( currId ); // ownership is taken
        blocked.Remove( i ); // remove currId from blocked
        blocked.InsertL( NULL, i );
        bInfo->SetBlockedEntityDisplayNameL( currId->Identity() );
        coll->AddObjectL( bInfo );// ownership is taken
        CleanupStack::Pop();// >> bInfo
        }
    
    DP_SDA("SubscribeBlockList complete request");
    CompleteXIMPReq( KErrNone );
    
    MXIMPDataSubscriptionState* myState =
       iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
    
    MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
    
    // Notice: consider XIMP error codes
    myStatus->SetResultCode( KErrNone );
    myState->SetSubscriptionStateL(
        MXIMPDataSubscriptionState::ESubscriptionInactive );
    
    iDataHost->SetPresenceBlockDataSubscriptionStateL(
        myState, myStatus );
    
    iDataHost->HandlePresenceBlockListL( coll );
    //Callback for subscription result
    CleanupStack::Pop( 3 ); // >> myState, myStatus, coll
    CleanupStack::PopAndDestroy( &blocked );
    DP_SDA("CPresencePluginAuthorization::SubscribeBlockList end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::UnSubscribeBlockListL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::UnSubscribeBlockListL()
    {
    DP_SDA("CPresencePluginAuthorization::UnSubscribeBlockListL");
    
    MXIMPObjectCollection* coll =
        iConnObs.ObjectFactory().NewObjectCollectionLC();
    
    MXIMPDataSubscriptionState* myState =
        iConnObs.ObjectFactory().NewDataSubscriptionStateLC();
    
    MXIMPStatus* myStatus = iConnObs.ObjectFactory().NewStatusLC();
    
    myStatus->SetResultCode( KErrNone );
    myState->SetSubscriptionStateL(
        MXIMPDataSubscriptionState::ESubscriptionInactive );
    
    iDataHost->SetPresenceBlockDataSubscriptionStateL(
        myState, myStatus );
    
    iDataHost->HandlePresenceBlockListL( coll );
    
    CleanupStack::Pop( 3 );
    
    CompleteXIMPReq( KErrNone );
    
    DP_SDA("CPresencePluginAuthorization::UnSubscribeBlockListL end");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::ReturnListSubsState()
// ---------------------------------------------------------------------------
//
TBool CPresencePluginAuthorization::ReturnListSubsState()
    {
    return iSubscribed;
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::PluginData()
// ---------------------------------------------------------------------------
//
CPresencePluginData& CPresencePluginAuthorization::PluginData()
    {
    return *iPresenceData;
    }

// --------------------------------------------------------------------------- 
// CPresencePluginAuthorization::HandleFullWinfoNotificationL 
// --------------------------------------------------------------------------- 
// 
void CPresencePluginAuthorization::HandleFullWinfoNotificationL( 
    MSimpleWinfo& aWinfo )
    {
    using namespace NPresencePlugin::NPresence;
    
    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( KPresenceWatcherList8 ); //watcher-list
    DP_SDA2("HandleFullWinfoNotificationL leave if watcherlist error %d", err);
    User::LeaveIfError( err );
    
    err = elem->SimpleElementsL( elems );
    DP_SDA2("HandleFullWinfoNotificationL error %d", err);
    User::LeaveIfError( err );
    
    count = elems.Count();
    DP_SDA("HandleFullWinfoNotificationL watcher list is valid");
    
    // 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( KPresenceWatcher8 )))
            {
            const TDesC8* pp8 = elem->AttrValue( KPresenceStatus8 );
            if ( pp8 && !pp8->CompareF( KPresencePending8 ))
                {
                DP_SDA("HandleFullWinfoNotificationL least one pending");
                // 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.PresenceObjectFactoryOwn().
                       NewPresenceGrantRequestInfoLC();
                MXIMPIdentity* identity =
                    iConnObs.ObjectFactory().NewIdentityLC();
                
                // Remove prefix to keep client side protocol agnostic
                HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( 
                    *nodeContent );
                identity->SetIdentityL( *withoutPrefix );
                CleanupStack::PopAndDestroy( withoutPrefix );
                
                grInfo->SetRequestorIdL( identity ); // ownership is taken
                
                pendings->AddObjectL( grInfo ); // ownership is taken
                pendingFound = ETrue;
                CleanupStack::Pop( 2 ); //grInfo, identity
                CleanupStack::PopAndDestroy( nodeContent );
                }
            }
        }
    
    if ( pendingFound )
        {
        DP_SDA("HandleFullWinfoNotificationL send pending");
        iXIMPIdOwn = iDataHost->HandlePresenceGrantRequestListL( pendings );
        CleanupStack::Pop();    // >> pendings
        }
    else
        {
        DP_SDA("HandleFullWinfoNotificationL pop pending");
        CleanupStack::PopAndDestroy( ); // >> pendings
        }
    
    CleanupStack::PopAndDestroy( &elems );
    DP_SDA("CPresencePluginAuthorization::HandleFullWinfoNotificationL END");
    } 
 
// --------------------------------------------------------------------------- 
// CPresencePluginAuthorization::HandlePartialWinfoNotificationL 
// --------------------------------------------------------------------------- 
// 
void CPresencePluginAuthorization::HandlePartialWinfoNotificationL( 
    MSimpleWinfo& aWinfo )
    {
    DP_SDA("CPresencePluginAuthorization::HandlePartialWinfoNotificationL");
    using namespace NPresencePlugin::NPresence;
    
    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( KPresenceWatcherList8 );
    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( KPresenceWatcher8 )))
            { 
            const TDesC8* pp8 = elem->AttrValue( KPresenceStatus8 );
            if ( pp8 && !pp8->CompareF( KPresencePending8 ))
                {
                nodeContent = elem->ContentUnicodeL();
                CleanupStack::PushL( nodeContent );
                
                // Remove prefix to keep client side protocol agnostic
                HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( 
                    *nodeContent );
                CallHandlePresenceGrantRequestReceivedL( *withoutPrefix ); 
                CleanupStack::PopAndDestroy( withoutPrefix );
                CleanupStack::PopAndDestroy( nodeContent ); 
                } 
            else if ( pp8 && !pp8->CompareF( KPresenceTerminated8 )) 
                {
                nodeContent = elem->ContentUnicodeL(); 
                CleanupStack::PushL( nodeContent ); 

                // Remove prefix to keep client side protocol agnostic
                HBufC16* withoutPrefix = iPresenceData->RemovePrefixLC( 
                    *nodeContent );
                CallHandlePresenceGrantRequestObsoletedL( *withoutPrefix ); 
                CleanupStack::PopAndDestroy( withoutPrefix );
                CleanupStack::PopAndDestroy( nodeContent ); 
                }
            else if ( pp8 && !pp8->CompareF( KPresenceActive8 ))
                {
                DP_SDA( "CPresencePluginAuthorization::HandlePartialWinfoNotificationL presence active" );
                
                nodeContent = elem->ContentUnicodeL();
                CleanupStack::PushL( nodeContent );
                TInt pos( 0 );
                if ( iConnObs.SubscribedContacts()->
                    GetVirtualIdentityArray()->Find( *nodeContent, pos ) == 0  )
                    {
                    HBufC8* buffer = HBufC8::NewLC( nodeContent->Length() );
                    buffer->Des().Copy( *nodeContent );
                    if ( !iConnObs.WatcherHandlerL()->MatchWatcherId( *buffer ) )
                        {
                        DP_SDA( "CPresencePluginAuthorization::HandlePartialWinfoNotificationL -subscribe presence" );
                        iConnObs.WatcherHandlerL()->SubscribeL( *nodeContent );
                        }
                    CleanupStack::PopAndDestroy( buffer );
                    }
                CleanupStack::PopAndDestroy( nodeContent );
                }
            }
        }
    CleanupStack::PopAndDestroy( &elems );
    DP_SDA("CPresencePluginAuthorization::HandlePartialWinfoNotificationL END");
    } 

// --------------------------------------------------------------------------- 
// CPresencePluginAuthorization::CallHandlePresenceGrantRequestReceivedL 
// --------------------------------------------------------------------------- 
// 
void CPresencePluginAuthorization::CallHandlePresenceGrantRequestReceivedL(
    const TDesC& aUserId ) 
    {
    DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestReceivedL");
    // create the collection entry here 
    MPresenceGrantRequestInfo* grInfo = 
        iConnObs.PresenceObjectFactoryOwn().NewPresenceGrantRequestInfoLC();
    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
    identity->SetIdentityL( aUserId ); 
    grInfo->SetRequestorIdL( identity ); // ownership is taken
    CleanupStack::Pop( ); // -identity 
    
    iDataHost->HandlePresenceGrantRequestReceivedL( grInfo );//ownership taken 
    CleanupStack::Pop( );           // -grInfo
    DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestReceivedL END");
    } 

// --------------------------------------------------------------------------- 
// CPresencePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL 
// --------------------------------------------------------------------------- 
// 
void CPresencePluginAuthorization::CallHandlePresenceGrantRequestObsoletedL(
    const TDesC& aUserId )
    {
    DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestObsoletedL");
    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); 
    identity->SetIdentityL( aUserId ); 
    iDataHost->HandlePresenceGrantRequestObsoletedL( identity );//taken 
    CleanupStack::Pop( );// >> identity
    DP_SDA("PluginAuthorization::CallHandlePresenceGrantRequestObsoletedL END");
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::GrantPresenceForPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::GrantPresenceForPresentityL()
    {
    iXdmUtils->AddEntityToGrantedL( 
        iPresIdentity->Des(), iStatus );
    SetActive();
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::WithdrawFromPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::WithdrawFromPresentityL()
    {
    iXdmUtils->RemoveEntityFromGrantedL( 
        iPresIdentity->Des(),iStatus );
    SetActive();
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::UnsubscribePresentityPresenceL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::UnsubscribePresentityPresenceL()
    {
    DP_SDA( "CPresencePluginAuthorization::UnsubscribePresentityPresence" );
    
    MXIMPIdentity* identity =
        iConnObs.ObjectFactory().NewIdentityLC();
    identity->SetIdentityL( iPresIdentity->Des() );
    iConnObs.WatcherHandlerL()->
        DoPerformUnsubscribePresentityPresenceL( *identity, iStatus );
    CleanupStack::PopAndDestroy(); // identity
    SetActive();
    
    DP_SDA( "CPresencePluginAuthorization::UnsubscribePresentityPresence -Exit" );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::BlockPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::BlockPresentityL()
    {
    DP_SDA( "CPresencePluginAuthorization::BlockPresentityL" );
    // add entity to block list
    iXdmUtils->AddEntityToBlockedL( 
        iPresIdentity->Des(), iStatus );
    SetActive();
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::BlockPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::SetPresentityBlockedToXIMPL()
    {
    DP_SDA( "CPresencePluginAuthorization::SetPresentityBlockedToXIMPL" );
    
    MPresenceBlockInfo* bInfo =
        iConnObs.PresenceObjectFactoryOwn().NewPresenceBlockInfoLC();
    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
    HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
    identity->SetIdentityL( *withoutPrefix ); 
    bInfo->SetBlockedEntityIdL( identity ); // ownership is taken
    // Write blocked state into the presence cache
    TBuf<20> buf;
    buf.Copy( KBlockedExtensionValue );
    iPresenceData->WriteStatusToCacheL(
        *withoutPrefix, 
        MPresenceBuddyInfo2::EUnknownAvailability,
        buf,
        KNullDesC() );
    CleanupStack::PopAndDestroy( withoutPrefix );
    iDataHost->HandlePresenceBlockedL( bInfo );
    CleanupStack::Pop();// >> identity
    CleanupStack::Pop();// >> bInfo
    
    DP_SDA( "CPresencePluginAuthorization::SetPresentityBlockedToXIMPL -Exit" );
    }

// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::UnblockPresentityL()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::UnblockPresentityL()
    {
    DP_SDA( "CPresencePluginAuthorization::UnblockPresentityL" );
     
    //remove entity from blocked list 
    iXdmUtils->RemoveEntityFromBlockedL( 
        iPresIdentity->Des(), iStatus );
    //remove enity from ximp blocked too
    MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC();
    HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *iPresIdentity );
    identity->SetIdentityL( *withoutPrefix );
    CleanupStack::PopAndDestroy( withoutPrefix );
    iDataHost->HandlePresenceBlockCanceledL( identity );
    CleanupStack::Pop();// >> identity
    iAuthState = EStateIsContactBlockedBuddyRequest;
    SetActive();
    
    DP_SDA( "CPresencePluginAuthorization::UnblockPresentityL -Exit" );
    }


// ---------------------------------------------------------------------------
// CPresencePluginAuthorization::IsBlockedContactFriendRequest()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::IsBlockedContactFriendRequestL(
    const TDesC& aPresenceId,
    MPresencePluginContactsObs& aObserver,
    TRequestStatus& aStatus )
    {
    DP_SDA( "CPresencePluginAuthorization::IsBlockedContactFriendRequest" );

    delete iContacts;
    iContacts = NULL;

    HBufC* serviceName =
        iPresenceData->ServiceNameLC( iPresenceData->ServiceId() );

    iContacts = CPresencePluginContacts::NewL(
        iPresenceData->ServiceId(), *serviceName, aObserver );

    CleanupStack::PopAndDestroy( serviceName );

    iContacts->IsPresenceIdStoredL( aPresenceId, aStatus );

    DP_SDA( "CPresencePluginAuthorization::IsBlockedContactFriendRequest -exit" );
    }


// ---------------------------------------------------------------------------
// From base class MPresencePluginContactsObs
// CPresencePluginAuthorization::RequestComplete()
// ---------------------------------------------------------------------------
//
void CPresencePluginAuthorization::RequestComplete( TAny* aResult,
    TPresenceContactsOperation aOperation, TInt aError )
    {
    DP_SDA( "CPresencePluginAuthorization::RequestComplete" );
    
    switch( aOperation )
        {
        case EOperationIsPresenceStoredToContacts:
            if ( aResult != NULL && KErrNone == aError  )
                {
                iContactIsStored = *static_cast<TBool*>( aResult );
                }
            break;
        default:
            break;
        }
    DP_SDA2( "CPresencePluginAuthorization::RequestComplete - iContactIsStored = %d", iContactIsStored );
    }

// End of file