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