diff -r 000000000000 -r c8caa15ef882 simpledatamodeladapter/src/presencepluginentitywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/src/presencepluginentitywatcher.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,689 @@ +/* +* 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: IETF SIMPLE Protocol implementation for XIMP Framework +* +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "presencepluginentitywatcher.h" +#include "presenceplugindata.h" +#include "presencepluginwatcher.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::CPresencePluginEntityWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher::CPresencePluginEntityWatcher( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher ) + :iConnObs(aObs), iConnection(aConn), + iPluginWatcher(aWatcher), iOperation( EPluginIdle ) + { + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::ConstructL( + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginEntityWatcher::ConstructL - begin"); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + iPresenceData = aPresenceData; + DP_SDA("CPresencePluginEntityWatcher::ConstructL - end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::NewL() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher* CPresencePluginEntityWatcher::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CPresencePluginWatcher& aWatcher, + CPresencePluginData* aPresenceData ) + { + DP_SDA("CPresencePluginEntityWatcher::NewL"); + CPresencePluginEntityWatcher* self = + new( ELeave ) CPresencePluginEntityWatcher( aObs, aConn, aWatcher ); + CleanupStack::PushL( self ); + self->ConstructL( aPresenceData ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher() +// --------------------------------------------------------------------------- +// +CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher() + { + DP_SDA("CPresencePluginEntityWatcher::~CPresencePluginEntityWatcher"); + if ( iWatcher ) + { + iWatcher->Close(); + } + delete iEntityId; + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StartSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL"); + delete iEntityId; + iEntityId = NULL; + DP_SDA(" StartSubscribeL - entity id deleted"); + + TRAPD( error, iSimpleId = iWatcher->SubscribeL( + aPresentityId, NULL, ETrue, EFalse );); + DP_SDA2("StartSubscribeL subscribe error %d",error); + + if( KErrNone != error ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL ERROR"); + if( KErrInUse == error ) + { + DP_SDA(" iWatcher is in use try to close and restart"); + iWatcher->Close(); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + DP_SDA("StartSubscribeL Second try after creating iWatcher again"); + error = KErrNone; + TRAP( error, iSimpleId = iWatcher->GetPresenceL( + aPresentityId, NULL, EFalse );); + DP_SDA2("iWatcher->GetPresenceL error2 = %d",error ); + } + } + + // Save entity id after successful call + DP_SDA("StartSubscribeL - allocate entity id"); + iEntityId = aPresentityId.AllocL(); + DP_SDA("StartSubscribeL - new entity id stored"); + + iOperation = EPluginStart; + + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL End"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StartSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId, TRequestStatus& aClientRequst ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL 2"); + delete iEntityId; + iEntityId = NULL; + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL - entity id deleted"); + + iClientStatus = &aClientRequst; + *iClientStatus = KRequestPending; // wait for watcher complete + iOperation = EPluginStartNotifyClient; + + TRAPD( error, iSimpleId = iWatcher->SubscribeL( + aPresentityId, NULL, ETrue, EFalse );); + DP_SDA2("StartSubscribeL subscribe error %d",error); + + if( KErrInUse == error ) + { + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL ERROR"); + DP_SDA("StartSubscribeL iWatcher is in use try to close and restart"); + iWatcher->Close(); + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + DP_SDA("StartSubscribeL Second try after creating iWatcher again"); + error = KErrNone; + TRAP( error, iSimpleId = iWatcher->GetPresenceL( + aPresentityId, NULL, EFalse );); + DP_SDA2("iWatcher->GetPresenceL error2 = %d",error ); + } + User::LeaveIfError( error ); + + // Save entity id after successful call + DP_SDA("StartSubscribeL - allocate entity id"); + iEntityId = aPresentityId.AllocL(); + DP_SDA("StartSubscribeL - new entity id stored"); + + DP_SDA("CPresencePluginEntityWatcher::StartSubscribeL End"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StopSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StopSubscribeL( + TRequestStatus& aClientRequst ) + { + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL 2 (list)"); + iClientStatus = &aClientRequst; + *iClientStatus = KRequestPending; // wait for watcher complete + + iSimpleId = iWatcher->UnsubscribeL(); + iOperation = EPluginStop; + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL 2 end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::StopSubscribeL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::StopSubscribeL( ) + { + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL"); + iSimpleId = iWatcher->UnsubscribeL(); + iOperation = EPluginStop; + DP_SDA("CPresencePluginEntityWatcher::StopSubscribeL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherReqCompleteL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherReqCompleteL( + TInt /*aOpId*/, TInt aStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL"); + DP_SDA2("WatcherReqCompleteL status %d",aStatus ); + TPluginEntityWatcherOperation orig = iOperation; + DP_SDA2("WatcherReqCompleteL orig %d",orig ); + iOperation = EPluginIdle; + + if( !aStatus ) + { + iPluginWatcher.AcceptL( this ); + } + + if ( EPluginStartNotifyClient == orig ) + { + orig = EPluginStart; + DP_SDA(" WatcherReqCompleteL complete client"); + CompleteClientReq( aStatus ); + } + else if ( iClientStatus ) + { + DP_SDA(" WatcherReqCompleteL complete client 2"); + CompleteClientReq( aStatus ); + } + + MSimpleWatcher::TSimpleSipSubscriptionState subscribeStatus = + iWatcher->SipSubscriptionState(); + DP_SDA2("WatcherReqCompleteL subscribe status %d",subscribeStatus ); + + if ( aStatus && ( orig == EPluginStop || orig == EPluginStart && + MSimpleWatcher::ESimpleStateTerminated != subscribeStatus ) ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL if"); + // Delete this entity as useless + DP_SDA("WatcherReqCompleteL DELETE WATCHER"); + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + //Do not call anything, + //since the method call above deletes this instance. + } + else if( !aStatus && ( MSimpleWatcher::ESimpleStateActive == + subscribeStatus && + orig == EPluginStop ) ) + { + DP_SDA(" WatcherReqCompleteL state STOP"); + // Delete this entity as useless + DP_SDA("WatcherReqCompleteL DELETE WATCHER 2"); + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + } + else if ( MSimpleWatcher::ESimpleStatePending == subscribeStatus ) + { + SetPendingToXIMPL(); + } + DP_SDA("CPresencePluginEntityWatcher::WatcherReqCompleteL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetPendingToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetPendingToXIMPL() + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL"); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyToPendingToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + CleanupStack::PushL( uniBuffer ); + + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + TBuf<20> buf; + buf.Copy( KPendingRequestExtensionValue ); + + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + buf, + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SipSubscriptionState end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetActiveToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetActiveToXIMPL( const TDesC& aIdentity ) + { + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, identity"); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetPendingToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + DP_SDA(" SetPendingToXIMPL, notify active"); + iPresenceData->NotifyToActiveToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + DP_SDA(" SetActiveToXIMPL, create new identity"); + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + + DP_SDA(" SetActiveToXIMPL, strip prefix"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( aIdentity ); + identity2->SetIdentityL( *withoutPrefix ); + + DP_SDA(" SetActiveToXIMPL, write to cache"); + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KDefaultAvailableStatus(), + KNullDesC() ); + + DP_SDA(" SetActiveToXIMPL, ximp api callback"); + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, cleanup"); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetTerminatedToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetTerminatedToXIMPL( + const TDesC& aIdentity ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL"); + DP_SDA2("CPresencePluginEntityWatcher::SetTerminatedToXIMPL, uri: %S", + &aIdentity ); + //check what is grand request list subscribe state + if( iConnObs.GrandListState() ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL True"); + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyTerminatedToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( aIdentity ); + identity2->SetIdentityL( *withoutPrefix ); + + DP_SDA("SetTerminatedToXIMPL, write offline status to cache"); + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KNullDesC(), + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop( ); // >> prInfo + } + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetActiveToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetActiveToXIMPL( + MSimpleDocument& aDocument ) + { + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, aDocument"); + // No need to check the expiration here since WatcherTerminatedL + // is called then too. + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + DP_SDA(" SetActiveToXIMPL, call NotifyToPrInfoL"); + + iPresenceData->NotifyToPrInfoL( + iConnObs.ObjectFactory(), + iConnObs.PresenceObjectFactoryOwn(), + aDocument, *prInfo ); + DP_SDA(" SetActiveToXIMPL, NotifyToPrInfoL ok"); + + // Get variables from presence info object for cache entry + MPresenceBuddyInfo2::TAvailabilityValues availability = + MPresenceBuddyInfo2::ENotAvailable; + + HBufC* extendedAvailability = HBufC::NewLC( KBufSize255 ); + TPtr extendedAvailabilityPtr( extendedAvailability->Des() ); + + HBufC* statusMessage = HBufC::NewLC( KBufSize255 ); + TPtr statusMessagePtr( statusMessage->Des() ); + + DP_SDA(" SetActiveToXIMPL, NotifyToPrInfoL ok, get cache entries"); + iPresenceData->CacheEntriesFromPrInfo( *prInfo, + availability, extendedAvailabilityPtr, statusMessagePtr ); + + DP_SDA(" SetActiveToXIMPL, create identity"); + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( + *aDocument.EntityURI() ); + CleanupStack::PushL( uniBuffer ); + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, identity ok"); + + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL, strip prefix"); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, availability, + extendedAvailabilityPtr, statusMessagePtr ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity2 + + CleanupStack::PopAndDestroy( statusMessage ); + CleanupStack::PopAndDestroy( extendedAvailability ); + + CleanupStack::Pop(); // >> prInfo + DP_SDA("CPresencePluginEntityWatcher::SetActiveToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::SetTerminatedToXIMPL +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::SetTerminatedToXIMPL( ) + { + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL"); + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL True"); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.ProtocolPresenceHost().WatchingDataHost(); + MPresenceInfo* prInfo = + iConnObs.PresenceObjectFactoryOwn().NewPresenceInfoLC(); + + //Call set to pending + iPresenceData->NotifyTerminatedToXIMPL( + iConnObs.PresenceObjectFactoryOwn(), + *prInfo ); + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + + CleanupStack::PushL( uniBuffer ); + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( *uniBuffer ); + identity2->SetIdentityL( *withoutPrefix ); + + //Call presence cache writer too + iPresenceData->WriteStatusToCacheL( *withoutPrefix, + MPresenceBuddyInfo2::ENotAvailable, + KInvisibleState(), + KNullDesC() ); + + // XIMP Host API callback + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + + DP_SDA2("SetTerminatedToXIMPL2: ident %S", &identity2->Identity() ); + CleanupStack::PopAndDestroy( withoutPrefix ); + CleanupStack::PopAndDestroy( uniBuffer ); + CleanupStack::Pop(); // >> identity21 + CleanupStack::Pop(); // >> prInfo + + DP_SDA("CPresencePluginEntityWatcher::SetTerminatedToXIMPL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherNotificationL( + MSimpleDocument& aDocument ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL"); + + MSimpleWatcher::TSimpleSipSubscriptionState subscribeStatus = + iWatcher->SipSubscriptionState(); + DP_SDA2("WatcherNotificationL subscribe status %d",subscribeStatus ); + + //If subscribeStatus = pending + if( MSimpleWatcher::ESimpleStatePending == subscribeStatus ) + { + // Pending + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL PENDING"); + SetPendingToXIMPL(); + } + else if( MSimpleWatcher::ESimpleStateTerminated == subscribeStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL TERMINATED"); + SetTerminatedToXIMPL( ); + } + else + { + //Active + DP_SDA("WatcherNotificationL normal Case"); + SetActiveToXIMPL( aDocument ); + } + DP_SDA("CPresencePluginEntityWatcher::WatcherNotificationL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherListNotificationL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherListNotificationL( + MSimplePresenceList& aList ) + { + DP_SDA("CPresencePluginEntityWatcher::WatcherListNotificationL"); + // call all the necessary callbacks, for new data + teminated ones. + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + RPointerArray entities; + RPointerArray terminated; + RPointerArray actives; + + TRAPD( err, iPresenceData->NotifyListToPrInfoL( + iConnObs.ObjectFactory(),iConnObs.PresenceObjectFactoryOwn(), + aList, entities, actives, terminated )); + if ( err ) + { + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + actives.ResetAndDestroy(); + entities.Close(); + terminated.Close(); + actives.Close(); + return; + } + + // Start to collect data for HandleSubscribedPresentityPresenceL + TInt counter = entities.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + HBufC* withoutPrefix = iPresenceData->RemovePrefixLC( + actives[i]->Identity() ); + actives[i]->SetIdentityL( *withoutPrefix ); + + watcherHost.HandleSubscribedPresentityPresenceL( + actives[i], entities[i] ); + // Owenership is transferred + actives.Remove(i); + entities.Remove(i); + CleanupStack::PopAndDestroy( withoutPrefix ); + } + + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + actives.ResetAndDestroy(); + + entities.Close(); + terminated.Close(); + actives.Close(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::WatcherTerminatedL() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::WatcherTerminatedL( + TInt /*aOpId*/, TInt aReason ) + { + DP_SDA2("CPresencePluginEntityWatcher::WatcherTerminatedL -reason: %d", aReason ); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + MXIMPDataSubscriptionState *state = + iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + status->SetResultCode( aReason ); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC16* buf16 = HBufC16::NewLC( PresentityId().Length()); + buf16->Des().Copy( PresentityId() ); + identity->SetIdentityL( buf16->Des() ); + + //Visualize closed state OpenSer + SetTerminatedToXIMPL( buf16->Des() ); + + CleanupStack::PopAndDestroy( buf16 ); + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + identity, state, status ); + DP_SDA("CPresencePluginEntityWatcher::WatcherTerminatedL pop"); + CleanupStack::Pop( 3 ); + + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + + DP_SDA("CPresencePluginEntityWatcher::WatcherTerminatedL end"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginWatcher::CompleteClientReq() +// --------------------------------------------------------------------------- +// +void CPresencePluginEntityWatcher::CompleteClientReq( TInt aStatus ) + { + DP_SDA("CPresencePluginEntityWatcher::CompleteClientReq"); + iOperation = EPluginIdle; + TRequestStatus* s = iClientStatus; + User::RequestComplete( s, aStatus ); + iClientStatus = NULL; + DP_SDA("CPresencePluginEntityWatcher::CompleteClientReq out"); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::PresentityId +// --------------------------------------------------------------------------- +// +TPtrC8 CPresencePluginEntityWatcher::PresentityId( ) + { + DP_SDA("CPresencePluginEntityWatcher::PresentityId"); + return iEntityId ? iEntityId->Des() : TPtrC8(); + } + +// --------------------------------------------------------------------------- +// CPresencePluginEntityWatcher::XIMPRequestId +// --------------------------------------------------------------------------- +// +TXIMPRequestId CPresencePluginEntityWatcher::XIMPRequestId( ) + { + return iXIMPId; + } + +// End of file