--- /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 <e32std.h>
+#include <e32svr.h>
+#include <utf.h>
+#include <ximpdatasubscriptionstate.h>
+#include <protocolpresencewatchingdatahost.h>
+#include <ximpobjectfactory.h>
+#include <presenceinfo.h>
+#include <ximpprotocolconnectionhost.h>
+#include <protocolpresencedatahost.h>
+#include <presenceobjectfactory.h>
+#include <ximpstatus.h>
+#include <ximpidentity.h>
+#include <simplefactory.h>
+#include <msimplewatcher.h>
+#include <msimpledocument.h>
+#include <msimpleconnection.h>
+#include <simpleerrors.h>
+#include <avabilitytext.h>
+
+#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<MPresenceInfo> entities;
+ RPointerArray<MXIMPIdentity> terminated;
+ RPointerArray<MXIMPIdentity> 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