diff -r 2669f8761a99 -r fbd2e7cec7ef presencefwsimpleadpt/src/simplepluginentitywatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/presencefwsimpleadpt/src/simplepluginentitywatcher.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,459 @@ +/* +* 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 "simpleplugincommon.h" +#include "simplepluginentitywatcher.h" +#include "simpleplugindebugutils.h" +#include "simpleplugindata.h" +#include "simpleutils.h" +#include "simplepluginwatcher.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::CSimplePluginEntityWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher::CSimplePluginEntityWatcher( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher + ) + : iPluginWatcher(aWatcher), iConnObs(aObs), iConnection(aConn), + iOperation(EPluginIdle) + { + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::ConstructL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::ConstructL( ) + { + iWatcher = TSimpleFactory::NewWatcherL( iConnection, *this ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::NewL +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher* CSimplePluginEntityWatcher::NewL( + MSimplePluginConnectionObs& aObs, + MSimpleConnection& aConn, + CSimplePluginWatcher& aWatcher ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: NewL")); +#endif + CSimplePluginEntityWatcher* self = + new( ELeave ) CSimplePluginEntityWatcher( aObs, aConn, aWatcher ); + CleanupStack::PushL( self ); + self->ConstructL( ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::~CSimplePluginEntityWatcher +// --------------------------------------------------------------------------- +// +CSimplePluginEntityWatcher::~CSimplePluginEntityWatcher() + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: DESTRUCTOR")); +#endif + if ( iWatcher ) + { + iWatcher->Close(); + } + delete iEntityId; + delete iSimpleEntityId; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StartSubscribeL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StartSubscribeL( + const TDesC8& aPresentityId ) + { + delete iEntityId; + iEntityId = NULL; + + iListSubsActive = EFalse; + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> SubscribeL")); +#endif + iSimpleId = iWatcher->SubscribeL( aPresentityId, NULL, ETrue, EFalse ); + + // Save entity id after successful call + iEntityId = aPresentityId.AllocL(); + + iOperation = EPluginStart; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StartSubscribeListL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StartSubscribeListL( + const TDesC8& aPresentityId ) + { + delete iEntityId; + iEntityId = NULL; + + iListSubsActive = ETrue; + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> SubscribeListL")); +#endif + iSimpleId = iWatcher->SubscribeListL( aPresentityId, NULL, ETrue, EFalse ); + + // Save entity id after successful call + iEntityId = aPresentityId.AllocL(); + + iOperation = EPluginStart; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::SetSimpleNameL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::SetSimpleNameL( + const TDesC8& aPresentityId ) + { + delete iSimpleEntityId; + iSimpleEntityId = NULL; + + + // Save entity id after successful call + iSimpleEntityId = aPresentityId.AllocL(); + + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::StopSubscribeL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::StopSubscribeL( + ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: -> UnsubscribeL")); +#endif + iSimpleId = iWatcher->UnsubscribeL( ); + iOperation = EPluginStop; + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherReqCompleteL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherReqCompleteL( + TInt /*aOpId*/, TInt aStatus ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherReqCompleteL")); +#endif + TPluginEntityWatcherOperation orig = iOperation; + iOperation = EPluginIdle; + + CompleteClientReq( aStatus ); + + if ( aStatus && ( orig == EPluginStop || orig == EPluginStart) ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: calls DeleteWatcher **")); +#endif + // Delete this entity as useless + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + // Do not call anything, since the method call above deletes this instance. + } + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherNotificationL( + MSimpleDocument& aDocument ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherNotificationL" )); +#endif + + // No need to check the expiration here since WatcherTerminatedL + // is called then too. + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + MPresenceInfo* prInfo = iConnObs.PresenceObjectFactory().NewPresenceInfoLC(); + + 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("PluginEntityWatcher: nbr of fields received =%d"), count_debug ); + // --------------------------------------------------------- +#endif + + MXIMPIdentity* identity2 = iConnObs.ObjectFactory().NewIdentityLC(); + HBufC* uniBuffer = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( *aDocument.EntityURI() ); + CleanupStack::PushL( uniBuffer ); // << uniBuffer + identity2->SetIdentityL( uniBuffer->Des() ); + CleanupStack::PopAndDestroy( uniBuffer ); // >> uniBuffer + + if ( iListSubsActive ) + { + // Set Group Id + HBufC* uniBuffer2 = + CnvUtfConverter::ConvertToUnicodeFromUtf8L( iEntityId->Des() ); + CleanupStack::PushL( uniBuffer2 ); + MXIMPIdentity* gId = iConnObs.ObjectFactory().NewIdentityLC(); // << gId + gId->SetIdentityL( uniBuffer2->Des() ); + + MXIMPObjectCollection* coll = + iConnObs.ObjectFactory().NewObjectCollectionLC(); // << coll + + iPluginWatcher.GetEntitiesInListL( uniBuffer2->Des(), *coll ); + + MProtocolPresentityGroupsDataHost& groupHost = + iConnObs.Host()->ProtocolPresenceDataHost().GroupsDataHost(); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginEntityWatcher: callback HandlePresentityGroupContentL")); +#endif + groupHost.HandlePresentityGroupContentL( gId, coll ); + + CleanupStack::Pop( 2 ); // >> gId, coll + CleanupStack::PopAndDestroy( uniBuffer2 ); + + // This is done only for first notification for group subscription + iListSubsActive = EFalse; + } + + // PrFw Host API callback +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginEntityWatcher: callback HandleSubscribedPresentityPresenceL")); +#endif + watcherHost.HandleSubscribedPresentityPresenceL( identity2, prInfo ); + CleanupStack::Pop(); // >> identity2 + CleanupStack::Pop(); // >> prInfo + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherListNotificationL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherListNotificationL( + MSimplePresenceList& aList ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherListNotificationL" )); +#endif + + // call all the necessary callbacks, for new data + teminated ones. + + // check out whether fullstate list or not + TBool fullState( EFalse ); + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + + RPointerArray entities; + RPointerArray terminated; + RPointerArray allEntities; + + TRAPD( err, CSimplePluginData::NotifyListToPrInfoL( + iConnObs.ObjectFactory(), iConnObs.PresenceObjectFactory(), + aList, entities, allEntities, terminated, fullState )); + if ( err ) + { +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherListNotificationL error *" )); +#endif + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + allEntities.ResetAndDestroy(); + entities.Close(); + terminated.Close(); + allEntities.Close(); + return; + } + + CompleteClientReq( KErrNone ); + + // Call HandleSubscribedPresentityPresenceL for all users + TInt counter = entities.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + // --------------------------------------------------------- +#ifdef _DEBUG + const MPersonPresenceInfo* info = entities[i]->PersonPresence(); + const MPresenceInfoFieldCollection& coll_debug = info->Fields(); + TInt count_debug = coll_debug.FieldCount(); + + PluginLogger::Log( + _L("PluginWatcher: callback HandleSubscribedPresentityPresenceL nbrFields=%d"), count_debug ); +#endif + // --------------------------------------------------------- + + watcherHost.HandleSubscribedPresentityPresenceL( + allEntities[i], entities[i] ); + // Owenership is transferred + allEntities.Remove(i); + entities.Remove(i); + } + + // call SetPresentityPresenceDataSubscriptionStateL for terminated users + counter = terminated.Count(); + for ( TInt i = counter-1 ; i>=0; i-- ) + { + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: TEST COVERS 1")); + PluginLogger::Log( + _L("PluginWatcher: callback SetPresentityPresenceDataSubscriptionStateL")); +#endif + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + terminated[i], state, NULL ); + CleanupStack::Pop( 1 ); // state + // Owenership is transferred + terminated.Remove(i); + } + + entities.ResetAndDestroy(); + terminated.ResetAndDestroy(); + allEntities.ResetAndDestroy(); + + entities.Close(); + terminated.Close(); + allEntities.Close(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::WatcherTerminatedL +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::WatcherTerminatedL( + TInt /*aOpId*/, TInt /*aReason*/ ) + { + // Call PrFw Host and tell to CSimplePluginWatcher that + // this entity can be deleted. + +#ifdef _DEBUG + PluginLogger::Log(_L("PluginEntityWatcher: WatcherTerminatedL" )); +#endif + + MProtocolPresenceWatchingDataHost& watcherHost = + iConnObs.Host()->ProtocolPresenceDataHost().WatchingDataHost(); + MXIMPDataSubscriptionState *state = iConnObs.ObjectFactory().NewDataSubscriptionStateLC(); + MXIMPStatus* status = iConnObs.ObjectFactory().NewStatusLC(); + state->SetSubscriptionStateL( + MXIMPDataSubscriptionState::ESubscriptionInactive ); + status->SetResultCode( KErrCompletion ); + MXIMPIdentity* identity = iConnObs.ObjectFactory().NewIdentityLC(); + + HBufC16* buf16 = HBufC16::NewLC( PresentityId().Length()); + buf16->Des().Copy( PresentityId() ); + identity->SetIdentityL( buf16->Des() ); + CleanupStack::PopAndDestroy( buf16 ); + +#ifdef _DEBUG + PluginLogger::Log( + _L("PluginWatcher: callback SetPresentityPresenceDataSubscriptionStateL")); +#endif + watcherHost.SetPresentityPresenceDataSubscriptionStateL( + identity, state, status ); + CleanupStack::Pop( 3 ); // identity, status, state + + // Delete this entity as useless + iPluginWatcher.DeleteWatcher( iEntityId->Des() ); + // Do not call anything, since the method call above deletes this instance. + + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::CompleteClientReq +// --------------------------------------------------------------------------- +// +void CSimplePluginEntityWatcher::CompleteClientReq( TInt aStatus ) + { + // complete the open PrFw request immediately here! + iPluginWatcher.CompleteWatcher( aStatus ); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::PresentityId +// --------------------------------------------------------------------------- +// +TPtrC8 CSimplePluginEntityWatcher::PresentityId( ) + { + return iEntityId ? iEntityId->Des() : TPtrC8(); + } + +// --------------------------------------------------------------------------- +// CSimplePluginEntityWatcher::PrFwRequestId +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimplePluginEntityWatcher::PrFwRequestId( ) + { + return iPrFwId; + } + + +// End of file