diff -r 77cb48a03620 -r d9861ae9169c presencefwsimpleadpt/src/simplepluginpublisher.cpp --- a/presencefwsimpleadpt/src/simplepluginpublisher.cpp Thu Jul 01 14:09:06 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1071 +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 -#include -#include - -#include "simpleplugincommon.h" -#include "simplepluginpublisher.h" -#include "simpleplugindebugutils.h" -#include "simpleutils.h" -#include "simplepluginwinfo.h" -#include "simpleplugindata.h" -#include "simplepluginxdmutils.h" -#include "simplepluginconnection.h" - - -// ======== MEMBER FUNCTIONS ======== - - -// ----------------------------------------------------------------------------- -// CSimplePluginWatcherInfo::CSimplePluginWatcherInfo -// ----------------------------------------------------------------------------- -CSimplePluginWatcherInfo::CSimplePluginWatcherInfo( ) - {} - -// ----------------------------------------------------------------------------- -// CSimplePluginWatcherInfo::~CSimplePluginWatcherInfo -// ----------------------------------------------------------------------------- -CSimplePluginWatcherInfo::~CSimplePluginWatcherInfo() - { - delete iId; - delete iSipId; - } - -// ---------------------------------------------------------- -// CSimplePluginWatcherInfo::NewL -// ---------------------------------------------------------- -// -CSimplePluginWatcherInfo* CSimplePluginWatcherInfo::NewL( - const TDesC8& aId, const TDesC& aSipId ) - { - CSimplePluginWatcherInfo* self = new (ELeave) CSimplePluginWatcherInfo( ); - CleanupStack::PushL( self ); - self->ConstructL( aId, aSipId ); - CleanupStack::Pop( self ); - return self; - } - -// ---------------------------------------------------------- -// CSimplePluginWatcherInfo::ConstructL -// ---------------------------------------------------------- -// -void CSimplePluginWatcherInfo::ConstructL( - const TDesC8& aId, const TDesC& aSipId ) - { - iId = aId.AllocL(); - iSipId = aSipId.AllocL(); - } - -// ----------------------------------------------------------------------------- -// CSimplePluginWatcherInfo::Destroy -// ----------------------------------------------------------------------------- -void CSimplePluginWatcherInfo::Destroy() - { - iLink.Deque(); - delete this; - } - -// ----------------------------------------------------------------------------- -// CSimplePluginWatcherInfo::Match -// ----------------------------------------------------------------------------- -TBool CSimplePluginWatcherInfo::Match( const TDesC8& aId, const TDesC& aSipId ) - { - if ( (!iId->Des().CompareF( aId )) && (!iSipId->Des().CompareF( aSipId)) ) - { - return ETrue; - } - else - { - return EFalse; - } - } - -// ----------------------------------------------------------------------------- -// CSimplePluginWatcherInfo::SipId -// ----------------------------------------------------------------------------- -TPtrC CSimplePluginWatcherInfo::SipId( ) - { - return iSipId ? iSipId->Des() : TPtrC(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::CSimplePluginPublisher -// --------------------------------------------------------------------------- -// -CSimplePluginPublisher::CSimplePluginPublisher( - MSimplePluginSettings& aConnSets, - MSimplePluginConnectionObs& aObs, - MSimpleConnection& aConn ) -: CActive( CActive::EPriorityStandard ), - iConnObs(aObs), iConnSets( aConnSets), iConnection(aConn), - iSubscribed(EFalse), iSubscribedOwn(EFalse), iPublished(EFalse), - iWatcherList( CSimplePluginWatcherInfo::LinkOffset()) - { - CActiveScheduler::Add(this); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::ConstructL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::ConstructL( ) - { - iPublisher = TSimpleFactory::NewPublisherL( iConnection, *this ); - iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::NewL -// --------------------------------------------------------------------------- -// -CSimplePluginPublisher* CSimplePluginPublisher::NewL( - MSimplePluginSettings& aConnSets, - MSimplePluginConnectionObs& aObs, - MSimpleConnection& aConn ) - { - CSimplePluginPublisher* self = - new( ELeave ) CSimplePluginPublisher( aConnSets, aObs, aConn ); - CleanupStack::PushL( self ); - self->ConstructL( ); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::~CSimplePluginPublisher -// --------------------------------------------------------------------------- -// -CSimplePluginPublisher::~CSimplePluginPublisher() - { - if ( iDocument ) - { - iDocument->Close(); - } - - if ( iPublisher ) - { - iPublisher->Close(); - } - - if ( iWatcher ) - { - iWatcher->Close(); - } - - // delete iWatchers; - DeleteWatchers(); - - } - -// ----------------------------------------------------------------------------- -// CSimplePluginPublisher::DeleteWatchers -// ----------------------------------------------------------------------------- -void CSimplePluginPublisher::DeleteWatchers() - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DeleteWatchers" ) ); -#endif - // Delete all buffered transaction requests - TDblQueIter rIter( iWatcherList ); - rIter.SetToFirst(); - - while ( rIter ) - { - CSimplePluginWatcherInfo* w = rIter; - rIter++; - // delete wathcer info - w->Destroy(); - } - } - -// ----------------------------------------------------------------------------- -// CSimplePluginPublisher::AddWatcherIfNotExistsL -// ----------------------------------------------------------------------------- -void CSimplePluginPublisher::AddWatcherIfNotExistsL( const TDesC8& aId, const TDesC& aSipId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: AddWatcherIfNotExistsL" ) ); -#endif - TDblQueIter rIter( iWatcherList ); - rIter.SetToFirst(); - - TBool found(EFalse); - - while ( rIter ) - { - CSimplePluginWatcherInfo* w = rIter; - rIter++; - found = w->Match( aId, aSipId ); - if ( found ) - { - break; - } - else - { - // continue searching - } - } - if ( !found ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: AddWatcherIfNotExistsL adds a watcher" ) ); -#endif - CSimplePluginWatcherInfo* w = CSimplePluginWatcherInfo::NewL( aId, aSipId ); - iWatcherList.AddLast( *w ); - } - } - -// ----------------------------------------------------------------------------- -// CSimplePluginPublisher::RemoveWatcherIfExistsL -// ----------------------------------------------------------------------------- -void CSimplePluginPublisher::RemoveWatcherIfExistsL( const TDesC8& aId, const TDesC& aSipId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: RemoveWatcherIfExistsL" ) ); -#endif - TDblQueIter rIter( iWatcherList ); - rIter.SetToFirst(); - - TBool found(EFalse); - - while ( rIter ) - { - CSimplePluginWatcherInfo* w = rIter; - rIter++; - // delete wathcer info - found = w->Match( aId, aSipId ); - if ( found ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: RemoveWatcherIfExistsL removes a watcher" ) ); -#endif - w->Destroy(); - break; - } - else - { - // continue searching - } - } - } -// ----------------------------------------------------------------------------- -// CSimplePluginPublisher::MakeCurrentWatcherListLC -// ----------------------------------------------------------------------------- -CDesCArrayFlat* CSimplePluginPublisher::MakeCurrentWatcherListLC() - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: MakeCurrentWatcherListL" ) ); -#endif - // No one should be added more than once - const TInt KMyGran = 10; - CDesCArrayFlat* watchers = new (ELeave) CDesCArrayFlat( KMyGran ); - CleanupStack::PushL( watchers ); // << watchers - - // add user only once here. - TDblQueIter rIter( iWatcherList ); - rIter.SetToFirst(); - - while ( rIter ) - { - CSimplePluginWatcherInfo* w = rIter; - rIter++; - - TInt dummy = 0; - if ( watchers->Find( w->SipId(), dummy )) - { - watchers->AppendL( w->SipId() ); - } - else - { - // continue searching - } - } - - return watchers; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoPublishOwnPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoPublishOwnPresenceL( - const MPresenceInfo& aOwnPresence, - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoPublishOwnPresenceL")); -#endif - - const MPersonPresenceInfo* persInfo = aOwnPresence.PersonPresence(); - - // convert data format from PrFW to internal - if ( !persInfo ) - { - // Notice: error codes - CompletePrFwReq( KErrArgument ); - return; - } - InitializeSimpleDocumentL( ); - AddSimpleDocumentPersL( persInfo ); - - TInt myCount = aOwnPresence.ServicePresenceCount(); - for ( TInt i=0; i < myCount; i++ ) - { - const MServicePresenceInfo& servInfo = aOwnPresence.ServicePresenceAt(i); - AddSimpleDocumentServiceL( servInfo ); - } - myCount = aOwnPresence.DevicePresenceCount(); - for ( TInt i=0; i < myCount; i++ ) - { - const MDevicePresenceInfo& devInfo = aOwnPresence.DevicePresenceAt(i); - AddSimpleDocumentDeviceL( devInfo ); - } - - // Ensure that XDM rules exists, the show continues in RunL - StartXdmOperationL(aReqId ); - iOperation = EPublishOwn; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoSubscribeOwnPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoSubscribeOwnPresenceL( - const MPresenceInfoFilter& /*aPif*/, // notice: aPif filter not supported - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoSubscribeOwnPresenceL")); -#endif - - StartXdmOperationL( aReqId ); - - iOperation = ESubscribeOwn; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoUpdateOwnPresenceSubscriptionPifL( - const MPresenceInfoFilter& /*aPif*/, - TXIMPRequestId /*aReqId*/ ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoUpdateOwnPresenceSubscriptionPifL")); -#endif - // Notice: aPif filter not supported - User::Leave( KErrNotSupported ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoUnsubscribeOwnPresenceL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoUnsubscribeOwnPresenceL( - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoUnsubscribeOwnPresenceL")); -#endif - iSubscribedOwn = EFalse; - TRAPD( err, iSimpleId = iWatcher->UnsubscribeL()); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - iPrFwId = aReqId; - iOperation = EUnsubscribeOwn; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoSubscribePresenceWatcherListL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoSubscribePresenceWatcherListL( - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoSubscribePresenceWatcherListL")); -#endif - - if ( !iSubscribed ) - { - TRAPD( err, iConnObs.WinfoHandlerL()->SubscribeWinfoListL( aReqId )); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - iSubscribed = ETrue; - iPrFwId = aReqId; - iOperation = ESubscribeWinfo; - } - else - { - iPrFwId = aReqId; - CompletePrFwReq( KErrNone ); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoUnsubscribePresenceWatcherListL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoUnsubscribePresenceWatcherListL( - TXIMPRequestId aReqId ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: DoUnsubscribePresenceWatcherListL")); -#endif - if ( iSubscribed ) - { - TRAPD( err, iConnObs.WinfoHandlerL()->UnsubscribeWinfoListL( aReqId )); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - iSubscribed = EFalse; - iPrFwId = aReqId; - iOperation = EUnsubscribeWinfo; - } - else - { - iPrFwId = aReqId; - CompletePrFwReq( KErrNone ); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::PublishReqCompleteL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::PublishReqCompleteL( TInt /*aOpid*/, TInt aStatus ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: PublishReqCompleteL(")); -#endif - if ( !aStatus ) - { - iPublished = ETrue; - } - else - { - } - - CompletePrFwReq( aStatus ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::PublishTerminatedL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::PublishTerminatedL( TInt /*aOpid*/ ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: PublishTerminatedL")); -#endif - // Notice: nothing to do now in Host APi. - iPublished = EFalse; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WatcherReqCompleteL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WatcherReqCompleteL( TInt /*aOpid*/, TInt aStatus ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: WatcherReqCompleteL")); -#endif - if ( !aStatus ) - { - iSubscribedOwn = ETrue; - } - else - { - } - CompletePrFwReq( aStatus ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WatcherNotificationL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WatcherNotificationL( MSimpleDocument& aDocument ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: WatcherNotificationL")); -#endif - - // Notice: Do not need to check the expiration here since WatcherTerminatedL - // is called then too. - - MProtocolPresencePublishingDataHost& publishHost = - iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); - MPresenceInfo* prInfo = iConnObs.PresenceObjectFactory().NewPresenceInfoLC(); // << prInfo - CSimplePluginData::NotifyToPrInfoL( iConnObs.PresenceObjectFactory(), aDocument, *prInfo ); - -#ifdef _DEBUG - // --------------------------------------------------------- - const MPersonPresenceInfo* pers_debug = prInfo->PersonPresence(); - const MPresenceInfoFieldCollection& coll_debug = pers_debug->Fields(); - TInt count_debug = coll_debug.FieldCount(); - PluginLogger::Log(_L("PluginPublisher: nbr of fields received =%d"), count_debug ); - // --------------------------------------------------------- -#endif - - // PrFw Host API callbacks - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: callback HandleSubscribedOwnPresenceL")); -#endif - publishHost.HandleSubscribedOwnPresenceL( prInfo ); - CleanupStack::Pop(); // >> prInfo - - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WatcherListNotificationL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WatcherListNotificationL( MSimplePresenceList& /*aList*/ ) - { - // Notice: not needed. - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WatcherTerminatedL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WatcherTerminatedL( - TInt /*aOpId*/, TInt /*aReason*/ ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: WatcherTerminatedL")); -#endif - iSubscribedOwn = EFalse; - - MProtocolPresencePublishingDataHost& publishHost = - iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); - MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); - MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); - state->SetSubscriptionStateL( MXIMPDataSubscriptionState::ESubscriptionInactive ); - status->SetResultCode( KErrCompletion ); -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: callback SetOwnPresenceDataSubscriptionStateL")); -#endif - publishHost.SetOwnPresenceDataSubscriptionStateL( state, status ); - CleanupStack::Pop( 2 ); // status, state - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::CompletePrFwReq -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::CompletePrFwReq( TInt aStatus ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: CompletePrFwReq status=%d"), aStatus ); -#endif - if ( iOperation != ENoOperation ) - { - iOperation = ENoOperation; - iConnObs.CompleteReq( iPrFwId, aStatus ); - iPrFwId = TXIMPRequestId(); - } - else - { - } - return; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoCancel -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoCancel( ) - { - iXdmUtils->Cancel(); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::RunL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::RunL( ) - { - - TInt status = iStatus.Int(); - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: RunL %d"), status ); -#endif - - if ( !status ) - { - if ( iOperation == ESubscribeOwn ) - { - iSimpleId = iWatcher->SubscribeL( - iConnSets.CurrentSipPresentity8(), - NULL, // aFilter <-> aPif - ETrue, EFalse ); - } - else - { - MakePublishReqL(); - } - } - else - { - CompletePrFwReq( status ); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::RunError -// --------------------------------------------------------------------------- -// -TInt CSimplePluginPublisher::RunError( TInt aError ) - { - CompletePrFwReq( aError ); - return KErrNone; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::GetInterface -// --------------------------------------------------------------------------- -// -TAny* CSimplePluginPublisher::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) - { - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - MProtocolPresencePublishing* myIf = this; - return myIf; - } - else if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::GetInterface -// --------------------------------------------------------------------------- -// -const TAny* CSimplePluginPublisher::GetInterface( - TInt32 aInterfaceId, - TIfGetOps aOptions ) const - { - if ( aInterfaceId == GetInterfaceId() ) - { - // caller wants this interface - const MProtocolPresencePublishing* myIf = this; - return myIf; - } - else if ( aOptions == MXIMPBase::EPanicIfUnknown ) - { - User::Panic( _L("CSimplePlugin"), KErrExtensionNotSupported ); - } - return NULL; - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::GetInterfaceId -// --------------------------------------------------------------------------- -// -TInt32 CSimplePluginPublisher::GetInterfaceId() const - { - return MProtocolPresencePublishing::KInterfaceId; - } - - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::InitializeSimpleDocumentL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::InitializeSimpleDocumentL( ) - { - if ( iDocument ) - { - iDocument->Close(); - iDocument = NULL; - } - iDocument = TSimpleFactory::NewDocumentL(); - iDocument->AddNamespaceL( KSimplePDM, KSimpleNsPDM ); - iDocument->AddNamespaceL( KSimpleRPID, KSimpleNsRPID ); - iDocument->AddNamespaceL( KSimpleOP, KSimpleNsOP ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::AddSimpleDocumentPersL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::AddSimpleDocumentPersL( - const MPersonPresenceInfo* aInfo ) - { - CSimplePluginData::AddPrPersToSimpleDocumentL( - aInfo, *iDocument, iConnSets.CurrentSipPresentity8() ); - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::AddSimpleDocumentServiceL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::AddSimpleDocumentServiceL( - const MServicePresenceInfo& aInfo ) - { - if ( aInfo.Fields().FieldCount() > 0 || aInfo.ServiceType().Length() ) - { - // Notice: currently all the fields in the namespace are supported, - // but this ensures that if namespace is extended later, it is - // handled right way in the adaptation - User::Leave( KPresenceErrPresenceInfoFieldTypeNotSupported ); - } - else - { - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::AddSimpleDocumentDeviceL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::AddSimpleDocumentDeviceL( - const MDevicePresenceInfo& aInfo ) - { - if ( aInfo.Fields().FieldCount() > 0 || aInfo.DeviceName().Length() ) - { - // Notice: currently all the fields in the namespace are supported, - // but this ensures that if namespace is extended later, it is - // handled right way in the adaptation - User::Leave( KPresenceErrPresenceInfoFieldTypeNotSupported ); - } - else - { - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::MakePublishReqL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::MakePublishReqL( ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: -> MakePublishReqL")); -#endif - // Send the iDocument - if ( !iPublished ) - { - iSimpleId = iPublisher->StartPublishL( *iDocument, ETrue ); - } - else - { - iSimpleId = iPublisher->ModifyPublishL( *iDocument); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::StartXdmOperationL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::StartXdmOperationL( - TXIMPRequestId aReqId ) - { - TRAPD( err, DoStartXdmOperationL( aReqId )); - if ( err ) - { - User::Leave( CSimplePluginConnection::HarmonizeErrorCode( err )); - } - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::DoStartXdmOperationL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::DoStartXdmOperationL( - TXIMPRequestId aReqId ) - { - __ASSERT_DEBUG( !IsActive(), User::Leave( KErrCorrupt ) ); - iPrFwId = aReqId; - if ( !iXdmUtils ) - { - iXdmUtils = iConnObs.XdmUtilsL(); - } - iXdmUtils->InitializeXdmL( iStatus ); - SetActive(); - } - - - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WinfoNotificationL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WinfoNotificationL( - MSimpleWinfo& aWinfo ) - { - // ignore if not subscribed - if ( !iSubscribed ) - { - return; - } - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: WinfoNotificationL")); -#endif - - // Handle full-state and partial state notifications - // - If terminated -> remove from iWatcherList - // - If active -> add into iWatcherList if does not already exist - // WinfoTerminatedL handles termination of subscription. - - // Notice: CSimplePluginWinfo has completed the open request if needed before this. - - - /* example: - - // active/pending/terminated - - - - - sip:watcherA@example.com" - - */ - - RPointerArray elems; - CleanupClosePushL( elems ); // << elems - TInt err = aWinfo.SimpleElementsL( elems ); - User::LeaveIfError( err ); - TInt count = elems.Count(); - - __ASSERT_DEBUG( count == 1, User::Leave( KErrCorrupt ) ); - - using namespace NSimplePlugin::NSimpleOma; - - const TDesC8* stateVal = aWinfo.AttrValue( KSimpleState8 ); - if ( stateVal && !stateVal->CompareF( KSimpleFull8 )) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: fullstate = TRUE") ); -#endif - // full winfo-list is received - DeleteWatchers(); - } - else - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: fullstate = FALSE") ); -#endif - } - - MSimpleElement* elem = elems[0]; - TPtrC8 p8 = elem->LocalName(); - err = p8.CompareF( KSimpleWatcherList8 ); - User::LeaveIfError( err ); - - err = elem->SimpleElementsL( elems ); - User::LeaveIfError( err ); - - // Collect the active watchers only. - UpdateActiveWatchersListL( elems ); - - CDesCArrayFlat* watchers = MakeCurrentWatcherListLC(); // << watchers - MXIMPObjectCollection *actives = - iConnObs.ObjectFactory().NewObjectCollectionLC(); // << actives - - // Create MPresenceWatcherInfo entities for - // all active watchers and add to actives. - TInt wCount = watchers->MdcaCount(); - for ( TInt j = 0; j < wCount; j++ ) - { - // create MPresenceWatcherInfo object - MPresenceWatcherInfo* wInfo = - iConnObs.PresenceObjectFactory().NewPresenceWatcherInfoLC(); // << wInfo - - MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); // << identity -#ifdef _DEBUG - TBuf<200> debug_buffer; - debug_buffer = watchers->MdcaPoint( j ); - PluginLogger::Log(_L("PluginPublisher: add watcher into collection: %S"), &debug_buffer); -#endif - identity->SetIdentityL( watchers->MdcaPoint( j ) ); - wInfo->SetWatcherIdL( identity ); - CleanupStack::Pop( ); // >> identity - - wInfo->SetWatcherDisplayNameL( watchers->MdcaPoint( j ) ); - wInfo->SetWatcherTypeL( MPresenceWatcherInfo::EPresenceSubscriber ); - - actives->AddObjectL( wInfo ); - CleanupStack::Pop( ); // >> wInfo - } - - MProtocolPresencePublishingDataHost& publishHost = - iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); - -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: callback HandlePresenceWatcherListL")); -#endif - publishHost.HandlePresenceWatcherListL( actives ); - CleanupStack::Pop(); // >> actives - CleanupStack::PopAndDestroy( watchers ); // >> watchers - CleanupStack::PopAndDestroy( &elems ); // >> elems - - } - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::WinfoTerminatedL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::WinfoTerminatedL( TInt /*aReason*/ ) - { -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: WinfoTerminatedL") ); -#endif - - if ( !iSubscribed ) - { - return; - } - - // call SetPresenceWatcherListDataSubscriptionStateL - iSubscribed = EFalse; - - MProtocolPresencePublishingDataHost& publishHost = - iConnObs.Host()->ProtocolPresenceDataHost().PublishingDataHost(); - MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); - MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); - state->SetSubscriptionStateL( MXIMPDataSubscriptionState::ESubscriptionInactive ); - state->SetDataStateL( MXIMPDataSubscriptionState::EDataUnavailable ); - status->SetResultCode( KErrCompletion ); -#ifdef _DEBUG - PluginLogger::Log(_L("PluginPublisher: callback SetPresenceWatcherListDataSubscriptionStateL")); -#endif - publishHost.SetPresenceWatcherListDataSubscriptionStateL( state, status ); - CleanupStack::Pop( 2 ); // status, state - } - - -// --------------------------------------------------------------------------- -// CSimplePluginPublisher::UpdateActiveWatchersListL -// --------------------------------------------------------------------------- -// -void CSimplePluginPublisher::UpdateActiveWatchersListL( - RPointerArray& aElems ) - { - // Collect active users. - using namespace NSimplePlugin::NSimpleOma; - - HBufC* nodeContent = NULL; - - TInt count = aElems.Count(); - - for ( TInt i = 0; i < count; i++ ) - { - MSimpleElement* elem = aElems[i]; - TPtrC8 p8( elem->LocalName()); - if (!( p8.CompareF( KSimpleWatcher8 ))) - { - const TDesC8* pp8 = elem->AttrValue( KSimpleStatus8 ); - // Active wathers here - if ( pp8 && !pp8->CompareF( KSimpleActive8 )) - { - - // save id since there may be multiple subscriptions - // from a single watcher SIP identity. - const TDesC8* pId8 = elem->AttrValue( KSimpleId8 ); - - // Build collection of grant requests - // Find the child node containing the SIP entity - nodeContent = elem->ContentUnicodeL(); - CleanupStack::PushL( nodeContent ); // << nodeContent - - AddWatcherIfNotExistsL( pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); - - CleanupStack::PopAndDestroy( nodeContent ); // >> nodeContent - } - // Terminated wathers here, remove them from active list - else if ( pp8 && !pp8->CompareF( KSimpleTerminated8 )) - { - - const TDesC8* pId8 = elem->AttrValue( KSimpleId8 ); - - // Remove terminated from iWatcherList - nodeContent = elem->ContentUnicodeL(); - CleanupStack::PushL( nodeContent ); // << nodeContent - - RemoveWatcherIfExistsL( pId8 ? *pId8 : KNullDesC8, nodeContent->Des() ); - - CleanupStack::PopAndDestroy( nodeContent ); // >> nodeContent - } - } - } - - } - - - -// End of file