diff -r 2580314736af -r 2669f8761a99 presencefwsimpleadpt/src/simplepluginauthorization.cpp --- a/presencefwsimpleadpt/src/simplepluginauthorization.cpp Thu Aug 19 10:19:02 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1071 +0,0 @@ -/* -* 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#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& 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 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 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: - - - - - sip:watcherA@example.com" - - */ - } - -// --------------------------------------------------------------------------- -// CSimplePluginAuthorization::HandlePartialWinfoNotificationL -// --------------------------------------------------------------------------- -// -void CSimplePluginAuthorization::HandlePartialWinfoNotificationL( - MSimpleWinfo& aWinfo ) - { - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginAuthorization: HandlePartialWinfoNotificationL starts")); -#endif - - using namespace NSimplePlugin::NSimpleOma; - - RPointerArray 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 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 -