diff -r 77cb48a03620 -r d9861ae9169c presencefwsimpleadpt/src/simplepluginwatcher.cpp --- a/presencefwsimpleadpt/src/simplepluginwatcher.cpp Thu Jul 01 14:09:06 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,784 +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 -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "simpleplugincommon.h" -#include "simplepluginwatcher.h" -#include "simplepluginentitywatcher.h" -#include "simpleplugindebugutils.h" -#include "simpleutils.h" -#include "simplepluginxdmutils.h" -#include "simpleplugindata.h" -#include "simplepluginconnection.h" - - - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::CSimplePluginWatcher -// --------------------------------------------------------------------------- -// -CSimplePluginWatcher::CSimplePluginWatcher( - MSimplePluginSettings& aConnSets, - MSimplePluginConnectionObs& aObs, - MSimpleConnection& aConn ) -: CActive( CActive::EPriorityStandard ), - iConnSets( aConnSets), iConnObs(aObs), iConnection(aConn), iCompleted( ETrue ), - iOperation( EPluginUndef ), iXdmState( EPluginIdle ) - { - CActiveScheduler::Add( this ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::ConstructL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::ConstructL( ) - { - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::NewL -// --------------------------------------------------------------------------- -// -CSimplePluginWatcher* CSimplePluginWatcher::NewL( - MSimplePluginSettings& aConnSets, - MSimplePluginConnectionObs& aObs, - MSimpleConnection& aConn ) - { - CSimplePluginWatcher* self = - new( ELeave ) CSimplePluginWatcher( aConnSets, aObs, aConn ); - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::~CSimplePluginWatcher -// --------------------------------------------------------------------------- -// -CSimplePluginWatcher::~CSimplePluginWatcher() - { - iWatchers.ResetAndDestroy(); - iWatchers.Close(); - delete iPresIdentity; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoSubscribePresentityPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoSubscribePresentityPresenceL( - const MXIMPIdentity& aPresentityId, - const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: DoSubscribePresentityPresenceL")); -#endif - - TRAPD( err, DoDoSubscribePresentityPresenceL(aPresentityId, aReqId )); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoDoSubscribePresentityPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoDoSubscribePresentityPresenceL( - const MXIMPIdentity& aPresentityId, - TXIMPRequestId aReqId ) - { - iOperation = EPluginUndef; - iXdmState = EPluginIdle; - - SetPresIdentityL( aPresentityId ); - iPrFwId = aReqId; - iCompleted = EFalse; - - HBufC8* pres8 = NULL; - pres8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); - CleanupStack::PushL( pres8 ); // << pres8 - - CSimplePluginEntityWatcher* watcher = MatchWatcher2L( pres8->Des(), ETrue ); - watcher->StartSubscribeL( pres8->Des() ); - CleanupStack::PopAndDestroy( pres8 ); // >> pres8 - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoUpdatePresentityPresenceSubscriptionPifL( - const MXIMPIdentity& /*aPresentityId*/, - const MPresenceInfoFilter& /*aPif*/, - TXIMPRequestId /*aReqId*/ ) - { -#ifdef _DEBUG - PluginLogger::Log( - _L("PluginWatcher: DoUpdatePresentityPresenceSubscriptionPifL")); -#endif - - iOperation = EPluginUndef; - - // notice: aPif filter not supported - User::Leave( KErrNotSupported ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoUnsubscribePresentityPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoUnsubscribePresentityPresenceL( - const MXIMPIdentity& aPresentityId, - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: DoUnsubscribePresentityPresenceL")); -#endif - - TRAPD( err, DoDoUnsubscribePresentityPresenceL( aPresentityId, aReqId ) ); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoDoUnsubscribePresentityPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoDoUnsubscribePresentityPresenceL( - const MXIMPIdentity& aPresentityId, - TXIMPRequestId aReqId ) - { - - iOperation = EPluginUndef; - iXdmState = EPluginIdle; - - SetPresIdentityL( aPresentityId ); - iPrFwId = aReqId; - iCompleted = EFalse; - - HBufC8* pres8 = NULL; - pres8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( iPresIdentity->Des() ); - CleanupStack::PushL( pres8 ); // << pres8 - - CSimplePluginEntityWatcher* watcher = MatchWatcher2L( pres8->Des(), EFalse ); - if ( !watcher ) - { - User::Leave( KErrNotFound ); // Notice: error code - } - else - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: -> StopSubscribeL")); -#endif - watcher->StopSubscribeL(); - } - CleanupStack::PopAndDestroy( pres8 ); // >> pres8 - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoSubscribePresentityGroupMembersPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoSubscribePresentityGroupMembersPresenceL( - const MXIMPIdentity& aGroupId, - const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log( - _L("PluginWatcher: DoSubscribePresentityGroupMembersPresenceL")); -#endif - - iOperation = EPluginSubscribeGroup; - iXdmState = EPluginIdle; - - SetPresIdentityL( aGroupId ); - iPrFwId = aReqId; - iCompleted = EFalse; - - // Get Shared XDM lists first and create RLS service first - StartXdmOperationL(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoUpdatePresentityGroupMembersPresenceSubscriptionPifL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoUpdatePresentityGroupMembersPresenceSubscriptionPifL( - const MXIMPIdentity& /*aGroupId*/, - const MPresenceInfoFilter& /*aPif*/, - TXIMPRequestId /*aReqId*/ ) - { -#ifdef _DEBUG - PluginLogger::Log( - _L("PluginWatcher: DoUpdatePresentityGroupMembersPresenceSubscriptionPifL")); -#endif - // notice: aPif filter not supported - User::Leave( KErrNotSupported ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoUnsubscribePresentityGroupMembersPresenceL( - const MXIMPIdentity& aGroupId, - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log( - _L("PluginWatcher: DoUnsubscribePresentityGroupMembersPresenceL")); -#endif - TRAPD( err, DoDoUnsubscribePresentityGroupMembersPresenceL( aGroupId, aReqId )); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoDoUnsubscribePresentityGroupMembersPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoDoUnsubscribePresentityGroupMembersPresenceL( - const MXIMPIdentity& aGroupId, - TXIMPRequestId aReqId ) - { - iOperation = EPluginUnsubscribeGroup; - iXdmState = EPluginIdle; - - SetPresIdentityL( aGroupId ); - iPrFwId = aReqId; - iCompleted = EFalse; - - HBufC* buf16 = iXdmUtils->RlsServiceByResourceListLC( iPresIdentity->Des() ); // << buf16 - - HBufC8* buf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( buf16->Des() ); - CleanupStack::PushL( buf ); // << buf - - CSimplePluginEntityWatcher* watcher = MatchWatcher2L( buf->Des(), EFalse ); - - CleanupStack::PopAndDestroy( buf ); // >> buf - CleanupStack::PopAndDestroy( buf16 ); // >> buf16 - - if ( !watcher ) - { - User::Leave( KErrNotFound ); // Notice: error code - } - else - { - watcher->StopSubscribeL(); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::GetInterface -// --------------------------------------------------------------------------- -// -TAny* CSimplePluginWatcher::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) - { - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - MProtocolPresenceWatching* myIf = this; - return myIf; - } - if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::GetInterface -// --------------------------------------------------------------------------- -// -const TAny* CSimplePluginWatcher::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) const - { - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - const MProtocolPresenceWatching* myIf = this; - return myIf; - } - if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::GetInterfaceId -// --------------------------------------------------------------------------- -// -TInt32 CSimplePluginWatcher::GetInterfaceId() const - { - return MProtocolPresenceWatching::KInterfaceId; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::MatchWatcher2L -// --------------------------------------------------------------------------- -// -CSimplePluginEntityWatcher* CSimplePluginWatcher::MatchWatcher2L( - const TDesC8& aPresentityid, TBool aCreate ) - { - TInt count = iWatchers.Count(); - for ( TInt i = 0; i < count; i++ ) - { - CSimplePluginEntityWatcher* temp = (iWatchers[i]); - if ( !temp->PresentityId().CompareF( aPresentityid )) - { - return temp; - } - } - - // If watcher was not found, crete it when wanted so. - if ( !aCreate ) - { - return NULL; - } - else - { - CSimplePluginEntityWatcher* watcher = CSimplePluginEntityWatcher::NewL( - iConnObs, iConnection, *this ); - iWatchers.Append( watcher ); - return watcher; - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DeleteWatcher -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DeleteWatcher( - const TDesC8& aPresentityid ) - { - -#ifdef _DEBUG - PluginLogger::Log( _L("PluginWatcher: DeleteWatcher **")); -#endif - - TInt count = iWatchers.Count(); - for ( TInt i = 0; i < count; i++ ) - { - CSimplePluginEntityWatcher* temp = (iWatchers[i]); - if ( !temp->PresentityId().CompareF( aPresentityid ) ) - { - iWatchers.Remove( i ); - iWatchers.GranularCompress(); - delete temp; - break; - } - else - { - } - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::GetEntitiesInListL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::GetEntitiesInListL( - const TDesC& aList, MXIMPObjectCollection& aMembers ) - { - __ASSERT_DEBUG( iXdmUtils, User::Leave( KErrCorrupt ) ); - - const TInt KMyGran = 10; - CPtrCArray* ids = new (ELeave) CPtrCArray( KMyGran ); - CleanupStack::PushL( ids ); // << ids - - CPtrCArray* dispNames = new (ELeave) CPtrCArray( KMyGran ); - CleanupStack::PushL( dispNames ); // << dispNames - - iXdmUtils->GetEntitiesInListL( aList, *ids, *dispNames ); - - CopyGroupMembersToCollectionL( *ids, *dispNames, aMembers ); - - CleanupStack::PopAndDestroy( dispNames ); - CleanupStack::PopAndDestroy( ids ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::StartWatchingRlsL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::StartWatchingRlsL() - { - HBufC* buf = iXdmUtils->RlsServiceByResourceListLC( iPresIdentity->Des() ); // << buf - - HBufC8* buf2 = NULL; - buf2 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( buf->Des() ); - CleanupStack::PushL( buf2 ); // << buf2 - - CSimplePluginEntityWatcher* watcher = MatchWatcher2L( buf2->Des(), ETrue ); - - watcher->StartSubscribeListL( buf2->Des() ); - - watcher->SetSimpleNameL( buf2->Des() ); - - CleanupStack::PopAndDestroy( buf2 ); // >> buf2 - CleanupStack::PopAndDestroy( buf ); // >> buf - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::SetPresIdentityL() -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::SetPresIdentityL( - const MXIMPIdentity& aPresentityId ) - { - delete iPresIdentity; - iPresIdentity = NULL; - iPresIdentity = aPresentityId.Identity().AllocL(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::CompletePrFwReq -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::CompletePrFwReq( TInt aStatus ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: CompletePrFwReq status=%d"), aStatus ); -#endif - iXdmState = EPluginIdle; - - if ( !iCompleted ) - { - iCompleted = ETrue; - // Convert error code when needed - if ( aStatus == KSimpleErrNotFound && - ( iOperation == EPluginSubscribeGroup || - iOperation == EPluginUnsubscribeGroup )) - { - aStatus = KPresenceErrUnknownPresentityGroup; - } - else if ( aStatus == KSimpleErrNotFound ) - { - aStatus = KPresenceErrUnknownPresentity; - } - else - { - } - iConnObs.CompleteReq( iPrFwId, aStatus ); - iPrFwId = TXIMPRequestId(); - iOperation = EPluginUndef; - } - else - { - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::CompleteWatcher -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::CompleteWatcher( TInt aStatus ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: CompleteWatcher status=%d"), aStatus ); -#endif - // start to remove RLS service when needed. - if ( iOperation == EPluginUnsubscribeGroup && iXdmState == EPluginIdle ) - { - TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); - if ( err ) - { - CompletePrFwReq( err ); - } - else - { - iXdmState = EPluginFetchRls; - SetActive(); - } - } - else - { - CompletePrFwReq( aStatus ); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::StartXdmOperationL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::StartXdmOperationL() - { - TRAPD( err, DoStartXdmOperationL() ); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoStartXdmOperationL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoStartXdmOperationL() - { - __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); - if ( !iXdmUtils ) - { - iXdmUtils = iConnObs.XdmUtilsL(); - } - iXdmUtils->InitializeXdmsOnlyL( iStatus ); - - iXdmState = EPluginInitXdm; - - SetActive(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoCancel -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoCancel( ) - { - iXdmUtils->Cancel(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::RunL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::RunL( ) - { - - TInt status = iStatus.Int(); - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginWatcher: RunL %d"), status ); -#endif - if ( !status ) - { - // create RLS service first here - if ( iOperation == EPluginSubscribeGroup ) - { - DoRunForSubscriptionL(); - } - // remove RLS service when needed. - else if ( iOperation == EPluginUnsubscribeGroup ) - { - DoRunForUnsubscriptionL(); - } - else - { - // Idle state should not be completed. We should not come here - // because of PrFw core makes one request at a time. - } - } - else - { - CompletePrFwReq( status ); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::RunError -// --------------------------------------------------------------------------- -// -TInt CSimplePluginWatcher::RunError( TInt aError ) - { - CompletePrFwReq( aError ); - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::GetListContentL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::GetListContentL() - { - MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); - MProtocolPresentityGroupsDataHost& dataHost = - iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); - - MXIMPObjectCollection* entities = - myFactory.NewObjectCollectionLC(); // << entities - GetEntitiesInListL( iPresIdentity->Des(), *entities ); - - // callback for data - MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id - id->SetIdentityL( iPresIdentity->Des() ); -#ifdef _DEBUG - PluginLogger::Log( - _L("PluginWatcher: callback HandlePresentityGroupContentL")); -#endif - dataHost.HandlePresentityGroupContentL( id, entities ); - CleanupStack::Pop(); // >> id - CleanupStack::Pop(); // >> entities - - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::CopyGroupMembersToCollectionL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::CopyGroupMembersToCollectionL( - CPtrCArray& aIds, CPtrCArray& aNames, MXIMPObjectCollection& aCollection) - { - MXIMPObjectFactory& myFactory = iConnObs.ObjectFactory(); - MPresenceObjectFactory& myPresenceFactory = iConnObs.PresenceObjectFactory(); - TInt count = aIds.Count(); - for ( TInt i=0; i < count; i++ ) - { - // create here MPresentityGroupMemberInfo - MPresentityGroupMemberInfo* info = myPresenceFactory.NewPresentityGroupMemberInfoLC(); // << info - MXIMPIdentity* id = myFactory.NewIdentityLC(); // << id - id->SetIdentityL( aIds[i] ); - info->SetGroupMemberIdL( id ); - CleanupStack::Pop(); // >> id - - info->SetGroupMemberDisplayNameL( aNames[i] ); - aCollection.AddObjectL( info ); - CleanupStack::Pop(); // >> info - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoRunForSubscriptionL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoRunForSubscriptionL( ) - { - if ( iXdmState == EPluginInitXdm ) - { - // get members of the list first - GetListContentL(); - - // Fetch RLS document first before modifying the data. - TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); - if ( err ) - { - CompletePrFwReq( err ); - } - else - { - iXdmState = EPluginFetchRls; - SetActive(); - } - } - else if ( iXdmState == EPluginFetchRls ) - { - // Create RLS document service - iXdmUtils->AddRlsGroupL( iPresIdentity->Des() ); - iXdmState = EPluginAddGroupMember; - iXdmUtils->CommitRlsL( iStatus ); - SetActive(); - } - else - { - StartWatchingRlsL(); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginWatcher::DoRunForUnsubscriptionL -// --------------------------------------------------------------------------- -// -void CSimplePluginWatcher::DoRunForUnsubscriptionL( ) - { - TInt status = iStatus.Int(); - if ( iXdmState == EPluginIdle ) - { - TRAPD( err, iXdmUtils->FetchRlsL( iStatus )); - if ( err ) - { - CompletePrFwReq( err ); - } - else - { - iXdmState = EPluginFetchRls; - SetActive(); - } - } - else if ( iXdmState == EPluginFetchRls ) - { - TRAPD( err, iXdmUtils->RemoveRlsServiceByResourceListL( iPresIdentity->Des(), iStatus )); - if ( err ) - { - CompletePrFwReq( err ); - } - else - { - iXdmState = EPluginRemoveGroupMember; - SetActive(); - } - } - else - { - CompletePrFwReq( status ); - } - } - - - -// End of file