uiservicetab/vimpstengine/src/cvimpstenginesessioncntxtobserver.cpp
changeset 0 5e5d6b214f4f
child 9 9fdee5e1da30
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstengine/src/cvimpstenginesessioncntxtobserver.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -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 <presencegrantrequestinfo.h>
+#include <presentitygroupcontentevent.h>
+#include <ximpcontext.h>
+#include <presenceinfofilter.h>
+#include <presencefeatures.h>
+#include <presenceobjectfactory.h>
+#include <presenceinfo.h>
+#include <presenceauthorization.h>
+#include <ximpidentity.h>
+#include <ximpobjectfactory.h>
+#include <searchinfo.h>
+#include <searchevent.h>
+#include <ximpclient.h>
+#include <ximpidentity.h>
+#include <ximpstatus.h>
+#include <ximpcontextstateevent.h>
+#include <ximprequestcompleteevent.h>
+#include <presentitypresenceevent.h>
+#include <presenceblocklistevent.h>
+#include <presencegrantrequestlistevent.h>
+#include <ximpcontextstate.h>
+#include <searchelement.h>
+#include <searchkeysevent.h>
+#include <searchkeyinfo.h>
+#include <ximpfeatureinfo.h>
+
+#include "vimpstdebugtrace.h"
+
+//xmppsettings
+#include "xmppparams.h"
+#include "xmppservicesettingsapi.h"
+
+
+// ============================ MEMBER FUNCTIONS ==============================
+
+// ---------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::NewL
+// two phase construction
+// ---------------------------------------------------------
+CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewL( TUint32 aServiceId )
+    {
+    CVIMPSTEngineSessionCntxtObserver* self = 
+    					CVIMPSTEngineSessionCntxtObserver::NewLC( aServiceId);
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::NewLC
+// two phase construction
+// ---------------------------------------------------------
+CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewLC(TUint32 aServiceId)
+    {
+    CVIMPSTEngineSessionCntxtObserver* self = new 
+    					(ELeave) CVIMPSTEngineSessionCntxtObserver( aServiceId);
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::ConstructL
+// two phase construction
+// ---------------------------------------------------------    
+void CVIMPSTEngineSessionCntxtObserver::ConstructL()
+	{
+	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()
+    {
+    
+    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 )
+    {
+    TRACE( T_LIT("InsideCallback::HandlePresenceContextEvent start"));
+    TRAP_IGNORE(DoHandlePresenceContextEventL( aContext, aEvent ));
+   	TRACE( T_LIT("InsideCallback::HandlePresenceContextEvent end"));	
+    }    
+
+	
+// ---------------------------------------------------------
+// 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)
+    {
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL start"));
+    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( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL 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;
+        }
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL end"));
+    return err;
+    }
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineVoIPPrecenseHandler::ServerUnBindL
+// ---------------------------------------------------------------------------
+//
+TInt CVIMPSTEngineSessionCntxtObserver::ServerUnBindL( 
+    TBool aDoUnsubscribe )
+    {
+	TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind start"));
+	TInt err = KErrNotFound;
+	if ( TVIMPSTEnums::EVIMPSTBindDone == iBindStatus )
+		{
+		if ( aDoUnsubscribe )
+			{
+			iBindStatus = TVIMPSTEnums::EVIMPSTUnBinding;
+			}
+		
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind - 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;
+		}
+	TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind end"));
+	return err;
+    } 
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC(const MXIMPBase& aEvent )
+    {
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC start"));
+    const MPresentityPresenceEvent& event =
+            *TXIMPGetInterface< const MPresentityPresenceEvent >::From( 
+                aEvent, MXIMPBase::EPanicIfUnknown );  
+    HBufC* retValue = NULL;
+    retValue = event.PresentityId().Identity().AllocLC();
+    if(!retValue)
+        {
+        retValue = KNullDesC().AllocLC();
+        }
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC end"));
+    return retValue;    
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL(
+    const MXIMPContext& aContext,
+    const MXIMPBase& aEvent )
+    {
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL start"));
+    const TInt32 eventId = aEvent.GetInterfaceId();
+        
+        switch( aEvent.GetInterfaceId() )
+            {
+            case MXIMPRequestCompleteEvent::KInterfaceId:
+                {
+                
+                TRACE( T_LIT("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( T_LIT("InsideCallbackswitch::MXIMPRequestCompleteEvent end"));    
+                break;
+                }
+
+            case MXIMPContextStateEvent::KInterfaceId:
+                {
+                TRACE( T_LIT("InsideCallbackswitch::MXIMPContextStateEvent"));                
+                break;
+                }
+            case MPresentityPresenceEvent::KInterfaceId:
+                {
+                TRACE( T_LIT("InsideCallbackswitch::::MPresentityPresenceEvent start"));
+                TInt count = iObserverArray.Count();
+                for(TInt i = 0; i < count; i++)
+                    {
+                    iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                    }
+                TRACE( T_LIT("InsideCallbackswitch::::MPresentityPresenceEvent end"));
+                break;
+                }
+            case MPresentityGroupContentEvent::KInterfaceId:
+               {
+               TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent start"));
+               TInt count = iObserverArray.Count();
+               for(TInt i = 0; i < count; i++)
+                  {
+                  iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                  }
+               TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent end"));
+               break;  
+               }
+            case MPresenceGrantRequestListEvent::KInterfaceId:
+               {
+               TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent start"));
+               TInt count = iObserverArray.Count();
+               for(TInt i = 0; i < count; i++)
+                  {
+                  iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                  }               
+               TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent end"));
+               break;
+               }
+           
+            case MSearchEvent::KInterfaceId:
+                {
+                TRACE( T_LIT("InsideCallbackswitch::::MSearchEvent start"));
+
+                TInt count = iObserverArray.Count();
+                for(TInt i = 0; i < count; i++)
+                   {
+                   iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                   } 
+                TRACE( T_LIT("InsideCallbackswitch::::MSearchEvent end"));
+
+                break;
+                }
+            case MSearchKeysEvent::KInterfaceId:
+                {
+                TRACE( T_LIT("InsideCallbackswitch::::MSearchKeysEvent start"));
+                TInt count = iObserverArray.Count();
+                for(TInt i = 0; i < count; i++)
+                   {
+                   iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                   } 
+                TRACE( T_LIT("InsideCallbackswitch::::MSearchKeysEvent end"));
+
+                break;
+                }
+            case MPresenceBlockListEvent::KInterfaceId:
+               {
+               TRACE( T_LIT("InsideCallbackswitch::::MPresenceBlockListEvent start"));
+               TInt count = iObserverArray.Count();
+               for(TInt i = 0; i < count; i++)
+                  {
+                  iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
+                  } 
+               TRACE( T_LIT("InsideCallbackswitch::::MPresenceBlockListEvent end"));
+               break;
+               }
+              
+            default:
+                {
+                break;
+                }
+            }
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL end"));
+    }
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL
+// ---------------------------------------------------------------------------
+// 
+MPresenceAuthorization& 
+CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL()
+    {
+    __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)
+    {
+    if (aObserver)
+	    {    	
+	    
+	    TInt index = iObserverArray.Find(aObserver);
+        if( index == KErrNotFound )
+            {
+            iObserverArray.Append( aObserver );   
+            }
+	    }
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver)
+    {
+    if (aObserver)
+	    {    
+	    TInt index = iObserverArray.Find(aObserver);
+	        
+	    if( index >=0 )
+	        {
+	        iObserverArray.Remove( index );
+	        iObserverArray.Compress();
+	        }
+	    }    
+   }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL()
+    {
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL start"));
+    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;
+        }
+    TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL end"));
+    }
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures
+// ---------------------------------------------------------------------------
+//
+TInt CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures()
+	{
+	return 	iFeatureSupported;
+	}    
+
+// end of file
+
+