--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/presencefwsimpleadpt/src/simplepluginauthorization.cpp Tue Feb 02 01:05:17 2010 +0200
@@ -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.Append( 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
+