diff -r 3104fc151679 -r 9a48e301e94b uiservicetab/vimpstengine/src/cvimpstenginesessioncntxtobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiservicetab/vimpstengine/src/cvimpstenginesessioncntxtobserver.cpp Wed Sep 01 12:33:36 2010 +0100 @@ -0,0 +1,665 @@ +/* +* Copyright (c) 2008 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: Implementation for CVIMPSTEngineSessionCntxtObserver +* +*/ + + +#include "cvimpstenginesessioncntxtobserver.h" + + + +#include "tvimpstenums.h" +#include "cvimpstenginerequestmapper.h" +#include "cvimpstenginerequest.h" +#include "mvimpstenginesearchextentioneventobserver.h" +#include "mvimpstenginesessioncntxtobserver.h" +//ximpfw +#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 "uiservicetabtracer.h" + +//xmppsettings +#include "xmppparams.h" +#include "xmppservicesettingsapi.h" + + +// ============================ MEMBER FUNCTIONS ============================== + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::NewL +// two phase construction +// --------------------------------------------------------- +CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewL( TUint32 aServiceId ) + { + TRACER_AUTO; + CVIMPSTEngineSessionCntxtObserver* self = + CVIMPSTEngineSessionCntxtObserver::NewLC( aServiceId); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::NewLC +// two phase construction +// --------------------------------------------------------- +CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewLC(TUint32 aServiceId) + { + TRACER_AUTO; + CVIMPSTEngineSessionCntxtObserver* self = new + (ELeave) CVIMPSTEngineSessionCntxtObserver( aServiceId); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::ConstructL +// two phase construction +// --------------------------------------------------------- +void CVIMPSTEngineSessionCntxtObserver::ConstructL() + { + TRACER_AUTO; + iRequestMapper = CVIMPSTEngineRequestMapper::NewL(); + iReqResult = KErrNone; + iClient = MXIMPClient::NewClientL(); + //Create new sink to receive ximp context events + iPresenceCtx = iClient->NewPresenceContextLC(); + // ignore code scanner warning, it gives panic + CleanupStack::Pop();// because of LC method + + iFeatures = MPresenceFeatures::NewL(iPresenceCtx); + + //Stores the XIMPFw EventTypes Subscribed for + iAcceptedEventTypes.Reset(); + iAcceptedEventTypes.AppendL( MXIMPRequestCompleteEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MXIMPContextStateEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MPresentityGroupContentEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MPresenceGrantRequestListEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MSearchEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MSearchKeysEvent::KInterfaceId ); + iAcceptedEventTypes.AppendL( MPresenceBlockListEvent::KInterfaceId ); + + TArray< TInt32 > eventFilterArray = iAcceptedEventTypes.Array(); + + // register this to prsence context + iPresenceCtx->RegisterObserverL( *this, &eventFilterArray ); + + } + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::~CVIMPSTEngineSessionCntxtObserver +// destructor +// --------------------------------------------------------- +CVIMPSTEngineSessionCntxtObserver::~CVIMPSTEngineSessionCntxtObserver() + { + TRACER_AUTO; + iObserverArray.Reset(); + iObserverArray.Close(); + + iAcceptedEventTypes.Reset(); + iAcceptedEventTypes.Close(); + delete iFeatures; + + if(iPresenceCtx) + { + iPresenceCtx->UnregisterObserver( *this ); + delete iPresenceCtx; + } + + delete iClient; + delete iRequestMapper; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver +// --------------------------------------------------------- +CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver(TUint32 aServiceId) +:iServiceId(aServiceId), + iBindStatus( TVIMPSTEnums::EVIMPSTBindNotDone ) + { + } + +// =========================================================================== +// FROM MPRFWximpCONTEXTOBSERVER +// =========================================================================== +// +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::HandlePresenceContextEvent +// --------------------------------------------------------- +void CVIMPSTEngineSessionCntxtObserver::HandlePresenceContextEvent( + const MXIMPContext& aContext, + const MXIMPBase& aEvent ) + { + TRACER_AUTO; + TRAP_IGNORE(DoHandlePresenceContextEventL( aContext, aEvent )); + } + + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::GetCompletedReqResult +// +// --------------------------------------------------------- +TInt CVIMPSTEngineSessionCntxtObserver::GetCompletedReqResult() const + { + return iReqResult; + } + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver +// +// --------------------------------------------------------- +CVIMPSTEngineRequestMapper* CVIMPSTEngineSessionCntxtObserver:: + GetRequestMapper() const + { + return iRequestMapper; + } + + +// --------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::ContextBindStatus +// +// --------------------------------------------------------- +TVIMPSTEnums::TVIMPSTBindStatus CVIMPSTEngineSessionCntxtObserver::ContextBindStatus() + { + return iBindStatus; + } +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::ServerBindL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTEngineSessionCntxtObserver::ServerBindL(TUid aProtocolUid) + { + TRACER_AUTO; + TInt err = KErrNotFound; + //Bind context to desired presence service + if ( TVIMPSTEnums::EVIMPSTBindDone != iBindStatus ) + { + TXIMPRequestId operationId = TXIMPRequestId::Null(); + TRAP( err, operationId = iPresenceCtx->BindToL( + aProtocolUid, iServiceId ) ); + if ( err ) + { + // XIMP queues all operations except bind operation. If there is + // unbind operation pending in ximp side, bind call will leave + // with KErrAlreadyExists. Client side is not ideal place to + // handle this type of logic so to work around this problem, this + // case is flagged here. When unbind completes, rebind is done. + // If unbind is called between these operations, flag is set + // ESVCEPresenceBindNotDone to avoid bind if service was disabled + TRACE( "err: %d", err); + iBindStatus = TVIMPSTEnums::EVIMPSTBindFailureMode; + } + else + { + //create the requestmapper for the corresponidng reuqest id. + iRequestMapper->CreateRequestL(operationId,ETrue,EVIMPSTXimpOperationBind); + iBindStatus = TVIMPSTEnums::EVIMPSTBindDone; + iFeatureSupported = EVIMPSTFeatureUnknown; + TRAP(err,IdentifySupportedFeaturesL()); + } + } + else + { + err = KErrNone; + } + return err; + } +// --------------------------------------------------------------------------- +// CVIMPSTEngineVoIPPrecenseHandler::ServerUnBindL +// --------------------------------------------------------------------------- +// +TInt CVIMPSTEngineSessionCntxtObserver::ServerUnBindL( + TBool aDoUnsubscribe ) + { + TRACER_AUTO; + TInt err = KErrNotFound; + if ( TVIMPSTEnums::EVIMPSTBindDone == iBindStatus ) + { + if ( aDoUnsubscribe ) + { + iBindStatus = TVIMPSTEnums::EVIMPSTUnBinding; + } + + TRACE( " do unbind"); + TXIMPRequestId operationId = TXIMPRequestId::Null(); + TRAP( err, operationId = iPresenceCtx->UnbindL()); + iBindStatus = TVIMPSTEnums::EVIMPSTUnBindWaiting; + iRequestMapper->CreateRequestL(operationId,EFalse,EVIMPSTXimpOperationUnBind) ; + iBindStatus = TVIMPSTEnums::EVIMPSTBindNotDone; + iFeatureSupported = EVIMPSTFeatureUnknown; + } + else if ( TVIMPSTEnums::EVIMPSTBindFailureMode == iBindStatus ) + { + // Disable flag here. If service is really disabled, we must not + // rebind when unbind completes. + iBindStatus = TVIMPSTEnums::EVIMPSTBindNotDone; + } + return err; + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC +// --------------------------------------------------------------------------- +// +HBufC* CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC(const MXIMPBase& aEvent ) + { + TRACER_AUTO; + const MPresentityPresenceEvent& event = + *TXIMPGetInterface< const MPresentityPresenceEvent >::From( + aEvent, MXIMPBase::EPanicIfUnknown ); + HBufC* retValue = NULL; + retValue = event.PresentityId().Identity().AllocLC(); + if(!retValue) + { + retValue = KNullDesC().AllocLC(); + } + return retValue; + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL( + const MXIMPContext& aContext, + const MXIMPBase& aEvent ) + { + TRACER_AUTO; + const TInt32 eventId = aEvent.GetInterfaceId(); + + switch( aEvent.GetInterfaceId() ) + { + case MXIMPRequestCompleteEvent::KInterfaceId: + { + + TRACE( "InsideCallbackswitch::MXIMPRequestCompleteEvent start"); + const MXIMPRequestCompleteEvent* event = + TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( + aEvent, MXIMPBase::EPanicIfUnknown ); + + iReqResult = event->CompletionResult().ResultCode(); + const TXIMPRequestId& reqId = event->RequestId(); + // Note:FindRequestId does not pass the ownership. hanece req + // should not be deleted. + CVIMPSTEngineRequest *req = iRequestMapper->FindRequestId( reqId ); + + if ( req ) + { + TXimpOperation operation = req->RequestType(); + + //contact mgmt & search will remove their own requests + //presence subservice should also do the same + //untill then use the below if check + //TBD + if ( (operation>EVIMPSTXimpOperationNoOperation)&& + (operation<=EVIMPSTXimpOperationUnsubscribe) ) + { + req->StopWait() ; + iRequestMapper->RemoveRequestId(reqId); + } + + TInt count = iObserverArray.Count(); + + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext, + aEvent, + operation); + } + } + TRACE("InsideCallbackswitch::MXIMPRequestCompleteEvent end"); + break; + } + + case MXIMPContextStateEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::MXIMPContextStateEvent"); + break; + } + case MPresentityPresenceEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::::MPresentityPresenceEvent start"); + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MPresentityPresenceEvent end"); + break; + } + case MPresentityGroupContentEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::::MPresentityGroupContentEvent start"); + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MPresentityGroupContentEvent end"); + break; + } + case MPresenceGrantRequestListEvent::KInterfaceId: + { + TRACE("InsideCallbackswitch::::MPresenceGrantRequestListEvent start"); + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MPresenceGrantRequestListEvent end"); + break; + } + + case MSearchEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::::MSearchEvent start"); + + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MSearchEvent end"); + + break; + } + case MSearchKeysEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::::MSearchKeysEvent start"); + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MSearchKeysEvent end"); + + break; + } + case MPresenceBlockListEvent::KInterfaceId: + { + TRACE( "InsideCallbackswitch::::MPresenceBlockListEvent start"); + TInt count = iObserverArray.Count(); + for(TInt i = 0; i < count; i++) + { + iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent); + } + TRACE( "InsideCallbackswitch::::MPresenceBlockListEvent end"); + break; + } + + default: + { + break; + } + } + } +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL +// --------------------------------------------------------------------------- +// +MPresenceAuthorization& +CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL() + { + TRACER_AUTO; + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported )); + __ASSERT_ALWAYS( &iFeatures->PresenceAuthorization(), + User::Leave( KErrNotSupported )); + return iFeatures->PresenceAuthorization(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::XimpPresenceWatchingL +// --------------------------------------------------------------------------- +// +MPresenceWatching& +CVIMPSTEngineSessionCntxtObserver::XimpPresenceWatchingL() + { + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported )); + __ASSERT_ALWAYS( &iFeatures->PresenceWatching(), + User::Leave( KErrNotSupported )); + return iFeatures->PresenceWatching(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::XimpPresentityGroupsL +// --------------------------------------------------------------------------- +// +MPresentityGroups& +CVIMPSTEngineSessionCntxtObserver::XimpPresentityGroupsL() + { + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported )); + __ASSERT_ALWAYS( &iFeatures->PresentityGroups(), + User::Leave( KErrNotSupported )); + return iFeatures->PresentityGroups(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::XimpPresencePublishingL +// --------------------------------------------------------------------------- +// +MPresencePublishing& +CVIMPSTEngineSessionCntxtObserver::XimpPresencePublishingL() + { + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported )); + __ASSERT_ALWAYS( &iFeatures->PresencePublishing(), + User::Leave( KErrNotSupported )); + return iFeatures->PresencePublishing(); + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::XimpPresenceContext +// --------------------------------------------------------------------------- +// +MXIMPContext& +CVIMPSTEngineSessionCntxtObserver::XimpPresenceContextL() + { + __ASSERT_ALWAYS( iPresenceCtx, User::Leave( KErrNotFound )); + return *iPresenceCtx; + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::PresenceObjectFactory +// --------------------------------------------------------------------------- +// +MPresenceObjectFactory& CVIMPSTEngineSessionCntxtObserver::PresenceObjectFactoryL() const + { + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotFound )); + return iFeatures->PresenceObjectFactory(); + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::PresenceFeaturesL +// --------------------------------------------------------------------------- +// +MPresenceFeatures& CVIMPSTEngineSessionCntxtObserver::PresenceFeaturesL() const + { + __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotFound )); + return *iFeatures; + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::RegisterObserver +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineSessionCntxtObserver::RegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver) + { + TRACER_AUTO; + if (aObserver) + { + + TInt index = iObserverArray.Find(aObserver); + if( index == KErrNotFound ) + { + iObserverArray.Append( aObserver ); + } + } + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver) + { + TRACER_AUTO; + if (aObserver) + { + TInt index = iObserverArray.Find(aObserver); + + if( index >=0 ) + { + iObserverArray.Remove( index ); + iObserverArray.Compress(); + } + } + } + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL +// --------------------------------------------------------------------------- +// +void CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL() + { + TRACER_AUTO; + using namespace NXIMPFeature::Presence; + using namespace NXIMPFeature::InstantMessage; + using namespace NXIMPFeature::Search; + using namespace NXIMPFeature::PresentityGroups; + + MXIMPFeatureInfo* ximpCtxFeats = iPresenceCtx->GetContextFeaturesLC(); + //get the supproted features from ximpfw adaptation. + if( ximpCtxFeats ) + { + CleanupStack::Pop() ; //iXimpctxFeat + + const MDesC8Array& supportedFeatures = ximpCtxFeats->FeatureIds(); + + TInt count = supportedFeatures.MdcaCount(); + + for(TInt index = 0; index < count; index++) + { + TPtrC8 feature = supportedFeatures.MdcaPoint(index); + + if ( !(iFeatureSupported & EVIMPSTFeaturePublish) && !(KPublish().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeaturePublish; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureFetch) && !(KFetch().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureFetch; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureSubscribe) && !(KSubscribe().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureSubscribe; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureUnsubscribe) && !(KUnsubscribe().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureUnsubscribe; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureAddContact) && !(KAddContact().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureAddContact; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureDeleteContact) && !(KDeleteContact().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureDeleteContact; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureBlock) && !(KBlock().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureBlock; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureUnBlock) && !(KUnBlock().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureUnBlock; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureAvatar) && !(KAvatar().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureAvatar; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureCreateGroup) && !(KCreate().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureCreateGroup; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureDeleteGroup) && !(KDelete().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureDeleteGroup; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureInstantMessage) && !(KInstantMessage().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureInstantMessage; + + } + else if ( !(iFeatureSupported & EVIMPSTFeatureSearch) && !(KSearch().Compare(feature)) ) + { + iFeatureSupported = iFeatureSupported | EVIMPSTFeatureSearch; + + } + + } + + delete ximpCtxFeats; + } + } + + +// --------------------------------------------------------------------------- +// CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures +// --------------------------------------------------------------------------- +// +TInt CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures() + { + return iFeatureSupported; + } + +// end of file + +