uiservicetab/vimpstengine/src/cvimpstenginesessioncntxtobserver.cpp
changeset 0 5e5d6b214f4f
child 9 9fdee5e1da30
equal deleted inserted replaced
-1:000000000000 0:5e5d6b214f4f
       
     1 /*
       
     2 * Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: Implementation for CVIMPSTEngineSessionCntxtObserver
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "cvimpstenginesessioncntxtobserver.h"
       
    20 
       
    21 
       
    22 
       
    23 #include "tvimpstenums.h"
       
    24 #include "cvimpstenginerequestmapper.h"
       
    25 #include "cvimpstenginerequest.h"
       
    26 #include "mvimpstenginesearchextentioneventobserver.h"
       
    27 #include "mvimpstenginesessioncntxtobserver.h"
       
    28 //ximpfw
       
    29 #include <presencegrantrequestinfo.h>
       
    30 #include <presentitygroupcontentevent.h>
       
    31 #include <ximpcontext.h>
       
    32 #include <presenceinfofilter.h>
       
    33 #include <presencefeatures.h>
       
    34 #include <presenceobjectfactory.h>
       
    35 #include <presenceinfo.h>
       
    36 #include <presenceauthorization.h>
       
    37 #include <ximpidentity.h>
       
    38 #include <ximpobjectfactory.h>
       
    39 #include <searchinfo.h>
       
    40 #include <searchevent.h>
       
    41 #include <ximpclient.h>
       
    42 #include <ximpidentity.h>
       
    43 #include <ximpstatus.h>
       
    44 #include <ximpcontextstateevent.h>
       
    45 #include <ximprequestcompleteevent.h>
       
    46 #include <presentitypresenceevent.h>
       
    47 #include <presenceblocklistevent.h>
       
    48 #include <presencegrantrequestlistevent.h>
       
    49 #include <ximpcontextstate.h>
       
    50 #include <searchelement.h>
       
    51 #include <searchkeysevent.h>
       
    52 #include <searchkeyinfo.h>
       
    53 #include <ximpfeatureinfo.h>
       
    54 
       
    55 #include "vimpstdebugtrace.h"
       
    56 
       
    57 //xmppsettings
       
    58 #include "xmppparams.h"
       
    59 #include "xmppservicesettingsapi.h"
       
    60 
       
    61 
       
    62 // ============================ MEMBER FUNCTIONS ==============================
       
    63 
       
    64 // ---------------------------------------------------------
       
    65 // CVIMPSTEngineSessionCntxtObserver::NewL
       
    66 // two phase construction
       
    67 // ---------------------------------------------------------
       
    68 CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewL( TUint32 aServiceId )
       
    69     {
       
    70     CVIMPSTEngineSessionCntxtObserver* self = 
       
    71     					CVIMPSTEngineSessionCntxtObserver::NewLC( aServiceId);
       
    72     CleanupStack::Pop( self );
       
    73     return self;
       
    74     }
       
    75 
       
    76 // ---------------------------------------------------------
       
    77 // CVIMPSTEngineSessionCntxtObserver::NewLC
       
    78 // two phase construction
       
    79 // ---------------------------------------------------------
       
    80 CVIMPSTEngineSessionCntxtObserver* CVIMPSTEngineSessionCntxtObserver::NewLC(TUint32 aServiceId)
       
    81     {
       
    82     CVIMPSTEngineSessionCntxtObserver* self = new 
       
    83     					(ELeave) CVIMPSTEngineSessionCntxtObserver( aServiceId);
       
    84     CleanupStack::PushL( self );
       
    85     self->ConstructL();
       
    86     return self;
       
    87     }
       
    88 
       
    89 // ---------------------------------------------------------
       
    90 // CVIMPSTEngineSessionCntxtObserver::ConstructL
       
    91 // two phase construction
       
    92 // ---------------------------------------------------------    
       
    93 void CVIMPSTEngineSessionCntxtObserver::ConstructL()
       
    94 	{
       
    95 	iRequestMapper = CVIMPSTEngineRequestMapper::NewL();	
       
    96 	iReqResult = KErrNone;
       
    97 	iClient = MXIMPClient::NewClientL();               
       
    98     //Create new sink to receive ximp context events
       
    99 	iPresenceCtx = iClient->NewPresenceContextLC();
       
   100     // ignore code scanner warning, it gives panic
       
   101     CleanupStack::Pop();// because of LC method    
       
   102 	
       
   103 	iFeatures = MPresenceFeatures::NewL(iPresenceCtx);
       
   104 	
       
   105 	//Stores the XIMPFw EventTypes Subscribed for      
       
   106 	iAcceptedEventTypes.Reset();
       
   107     iAcceptedEventTypes.AppendL( MXIMPRequestCompleteEvent::KInterfaceId );
       
   108     iAcceptedEventTypes.AppendL( MXIMPContextStateEvent::KInterfaceId );
       
   109     iAcceptedEventTypes.AppendL( MPresentityGroupContentEvent::KInterfaceId );   
       
   110     iAcceptedEventTypes.AppendL( MPresenceGrantRequestListEvent::KInterfaceId );
       
   111 	iAcceptedEventTypes.AppendL( MSearchEvent::KInterfaceId );   
       
   112     iAcceptedEventTypes.AppendL( MSearchKeysEvent::KInterfaceId );
       
   113     iAcceptedEventTypes.AppendL( MPresenceBlockListEvent::KInterfaceId );
       
   114 	    
       
   115 	TArray< TInt32 > eventFilterArray = iAcceptedEventTypes.Array();
       
   116     
       
   117 	// register this to prsence context   
       
   118 	iPresenceCtx->RegisterObserverL( *this, &eventFilterArray );
       
   119 	 
       
   120 	}
       
   121 
       
   122 // ---------------------------------------------------------
       
   123 // CVIMPSTEngineSessionCntxtObserver::~CVIMPSTEngineSessionCntxtObserver
       
   124 // destructor
       
   125 // ---------------------------------------------------------
       
   126 CVIMPSTEngineSessionCntxtObserver::~CVIMPSTEngineSessionCntxtObserver()
       
   127     {
       
   128     
       
   129     iObserverArray.Reset();
       
   130     iObserverArray.Close();
       
   131     
       
   132     iAcceptedEventTypes.Reset();
       
   133     iAcceptedEventTypes.Close();
       
   134     delete iFeatures;
       
   135     
       
   136     if(iPresenceCtx)
       
   137         {
       
   138         iPresenceCtx->UnregisterObserver( *this );
       
   139         delete  iPresenceCtx;   
       
   140         }
       
   141     
       
   142     delete iClient;           
       
   143     delete iRequestMapper;
       
   144     }
       
   145 
       
   146 // ---------------------------------------------------------
       
   147 // CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver
       
   148 // ---------------------------------------------------------
       
   149 CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver(TUint32 aServiceId)
       
   150 :iServiceId(aServiceId),
       
   151  iBindStatus( TVIMPSTEnums::EVIMPSTBindNotDone )
       
   152     {
       
   153     }
       
   154 
       
   155 // ===========================================================================
       
   156 // FROM MPRFWximpCONTEXTOBSERVER
       
   157 // ===========================================================================
       
   158 //
       
   159 // ---------------------------------------------------------
       
   160 // CVIMPSTEngineSessionCntxtObserver::HandlePresenceContextEvent
       
   161 // ---------------------------------------------------------
       
   162 void CVIMPSTEngineSessionCntxtObserver::HandlePresenceContextEvent( 
       
   163     const MXIMPContext& aContext,
       
   164     const MXIMPBase& aEvent )
       
   165     {
       
   166     TRACE( T_LIT("InsideCallback::HandlePresenceContextEvent start"));
       
   167     TRAP_IGNORE(DoHandlePresenceContextEventL( aContext, aEvent ));
       
   168    	TRACE( T_LIT("InsideCallback::HandlePresenceContextEvent end"));	
       
   169     }    
       
   170 
       
   171 	
       
   172 // ---------------------------------------------------------
       
   173 // CVIMPSTEngineSessionCntxtObserver::GetCompletedReqResult
       
   174 // 
       
   175 // ---------------------------------------------------------
       
   176 TInt CVIMPSTEngineSessionCntxtObserver::GetCompletedReqResult() const
       
   177 	{
       
   178 	return iReqResult;	
       
   179 	}
       
   180 
       
   181 // ---------------------------------------------------------
       
   182 // CVIMPSTEngineSessionCntxtObserver::CVIMPSTEngineSessionCntxtObserver
       
   183 // 
       
   184 // ---------------------------------------------------------
       
   185 CVIMPSTEngineRequestMapper* CVIMPSTEngineSessionCntxtObserver::
       
   186 											GetRequestMapper() const
       
   187 	{
       
   188 	return iRequestMapper;	
       
   189 	}
       
   190 
       
   191 
       
   192 // ---------------------------------------------------------
       
   193 // CVIMPSTEngineSessionCntxtObserver::ContextBindStatus
       
   194 // 
       
   195 // ---------------------------------------------------------
       
   196 TVIMPSTEnums::TVIMPSTBindStatus CVIMPSTEngineSessionCntxtObserver::ContextBindStatus()
       
   197 	{
       
   198 	return iBindStatus;	
       
   199 	}
       
   200 // ---------------------------------------------------------------------------
       
   201 // CVIMPSTEngineSessionCntxtObserver::ServerBindL
       
   202 // ---------------------------------------------------------------------------
       
   203 //
       
   204 TInt CVIMPSTEngineSessionCntxtObserver::ServerBindL(TUid aProtocolUid)
       
   205     {
       
   206     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL start"));
       
   207     TInt err = KErrNotFound;
       
   208     //Bind context to desired presence service
       
   209     if ( TVIMPSTEnums::EVIMPSTBindDone != iBindStatus )
       
   210         {  
       
   211         TXIMPRequestId operationId = TXIMPRequestId::Null();
       
   212         TRAP( err, operationId = iPresenceCtx->BindToL( 
       
   213                 aProtocolUid, iServiceId ) );
       
   214         if ( err )
       
   215             {
       
   216             // XIMP queues all operations except bind operation. If there is
       
   217             // unbind operation pending in ximp side, bind call will leave
       
   218             // with KErrAlreadyExists. Client side is not ideal place to 
       
   219             // handle this type of logic so to work around this problem, this 
       
   220             // case is flagged here. When unbind completes, rebind is done. 
       
   221             // If unbind is called between these operations, flag is set 
       
   222             // ESVCEPresenceBindNotDone to avoid bind if service was disabled
       
   223             TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL err: %d"), err);
       
   224             iBindStatus = TVIMPSTEnums::EVIMPSTBindFailureMode;
       
   225             }
       
   226         else
       
   227             {
       
   228             //create the requestmapper for the corresponidng reuqest id.
       
   229             iRequestMapper->CreateRequestL(operationId,ETrue,EVIMPSTXimpOperationBind);
       
   230             iBindStatus = TVIMPSTEnums::EVIMPSTBindDone; 
       
   231             iFeatureSupported = EVIMPSTFeatureUnknown;
       
   232             TRAP(err,IdentifySupportedFeaturesL());
       
   233             }
       
   234         }
       
   235     else
       
   236         {
       
   237         err = KErrNone;
       
   238         }
       
   239     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerBindL end"));
       
   240     return err;
       
   241     }
       
   242 // ---------------------------------------------------------------------------
       
   243 // CVIMPSTEngineVoIPPrecenseHandler::ServerUnBindL
       
   244 // ---------------------------------------------------------------------------
       
   245 //
       
   246 TInt CVIMPSTEngineSessionCntxtObserver::ServerUnBindL( 
       
   247     TBool aDoUnsubscribe )
       
   248     {
       
   249 	TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind start"));
       
   250 	TInt err = KErrNotFound;
       
   251 	if ( TVIMPSTEnums::EVIMPSTBindDone == iBindStatus )
       
   252 		{
       
   253 		if ( aDoUnsubscribe )
       
   254 			{
       
   255 			iBindStatus = TVIMPSTEnums::EVIMPSTUnBinding;
       
   256 			}
       
   257 		
       
   258     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind - do unbind"));
       
   259 		TXIMPRequestId operationId = TXIMPRequestId::Null(); 
       
   260 		TRAP( err, operationId = iPresenceCtx->UnbindL());
       
   261 		iBindStatus = TVIMPSTEnums::EVIMPSTUnBindWaiting;
       
   262 		iRequestMapper->CreateRequestL(operationId,EFalse,EVIMPSTXimpOperationUnBind) ;
       
   263 		iBindStatus = TVIMPSTEnums::EVIMPSTBindNotDone;
       
   264 		iFeatureSupported = EVIMPSTFeatureUnknown;
       
   265 		}
       
   266 	else if ( TVIMPSTEnums::EVIMPSTBindFailureMode == iBindStatus )
       
   267 		{
       
   268 		// Disable flag here. If service is really disabled, we must not
       
   269 		// rebind when unbind completes.
       
   270 		iBindStatus = TVIMPSTEnums::EVIMPSTBindNotDone;
       
   271 		}
       
   272 	TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::ServerUnBind end"));
       
   273 	return err;
       
   274     } 
       
   275 
       
   276 
       
   277 // ---------------------------------------------------------------------------
       
   278 // CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC
       
   279 // ---------------------------------------------------------------------------
       
   280 //
       
   281 HBufC* CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC(const MXIMPBase& aEvent )
       
   282     {
       
   283     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC start"));
       
   284     const MPresentityPresenceEvent& event =
       
   285             *TXIMPGetInterface< const MPresentityPresenceEvent >::From( 
       
   286                 aEvent, MXIMPBase::EPanicIfUnknown );  
       
   287     HBufC* retValue = NULL;
       
   288     retValue = event.PresentityId().Identity().AllocLC();
       
   289     if(!retValue)
       
   290         {
       
   291         retValue = KNullDesC().AllocLC();
       
   292         }
       
   293     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::UriFromXimpOperationLC end"));
       
   294     return retValue;    
       
   295     }
       
   296 
       
   297 // ---------------------------------------------------------------------------
       
   298 // CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL
       
   299 // ---------------------------------------------------------------------------
       
   300 //
       
   301 void CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL(
       
   302     const MXIMPContext& aContext,
       
   303     const MXIMPBase& aEvent )
       
   304     {
       
   305     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL start"));
       
   306     const TInt32 eventId = aEvent.GetInterfaceId();
       
   307         
       
   308         switch( aEvent.GetInterfaceId() )
       
   309             {
       
   310             case MXIMPRequestCompleteEvent::KInterfaceId:
       
   311                 {
       
   312                 
       
   313                 TRACE( T_LIT("InsideCallbackswitch::MXIMPRequestCompleteEvent start"));
       
   314                 const MXIMPRequestCompleteEvent* event =
       
   315                     TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( 
       
   316                         aEvent, MXIMPBase::EPanicIfUnknown );
       
   317                 
       
   318                 iReqResult = event->CompletionResult().ResultCode();
       
   319                 const TXIMPRequestId& reqId = event->RequestId();
       
   320                 // Note:FindRequestId does not pass the ownership. hanece req
       
   321                 // should not be deleted.
       
   322                 CVIMPSTEngineRequest *req = iRequestMapper->FindRequestId( reqId );                
       
   323                 
       
   324                 if ( req )
       
   325                     {                                        
       
   326                     TXimpOperation operation = req->RequestType(); 
       
   327                     
       
   328                     //contact mgmt & search will remove their own requests
       
   329                     //presence subservice should also do the same 
       
   330                     //untill then use the below if check 
       
   331                     //TBD
       
   332                     if ( (operation>EVIMPSTXimpOperationNoOperation)&&
       
   333                     		(operation<=EVIMPSTXimpOperationUnsubscribe) )
       
   334 	                    {
       
   335 	                    req->StopWait() ;   
       
   336 	                    iRequestMapper->RemoveRequestId(reqId);              
       
   337 	                    }
       
   338 
       
   339                     TInt count = iObserverArray.Count();
       
   340                     
       
   341                     for(TInt i = 0; i < count; i++)
       
   342 	                    {
       
   343 	                    iObserverArray[i]->HandleSessionContextEventL(aContext,
       
   344 	                    						aEvent,
       
   345 	                    						operation);
       
   346 	                    }
       
   347                     }
       
   348                 TRACE( T_LIT("InsideCallbackswitch::MXIMPRequestCompleteEvent end"));    
       
   349                 break;
       
   350                 }
       
   351 
       
   352             case MXIMPContextStateEvent::KInterfaceId:
       
   353                 {
       
   354                 TRACE( T_LIT("InsideCallbackswitch::MXIMPContextStateEvent"));                
       
   355                 break;
       
   356                 }
       
   357             case MPresentityPresenceEvent::KInterfaceId:
       
   358                 {
       
   359                 TRACE( T_LIT("InsideCallbackswitch::::MPresentityPresenceEvent start"));
       
   360                 TInt count = iObserverArray.Count();
       
   361                 for(TInt i = 0; i < count; i++)
       
   362                     {
       
   363                     iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   364                     }
       
   365                 TRACE( T_LIT("InsideCallbackswitch::::MPresentityPresenceEvent end"));
       
   366                 break;
       
   367                 }
       
   368             case MPresentityGroupContentEvent::KInterfaceId:
       
   369                {
       
   370                TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent start"));
       
   371                TInt count = iObserverArray.Count();
       
   372                for(TInt i = 0; i < count; i++)
       
   373                   {
       
   374                   iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   375                   }
       
   376                TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent end"));
       
   377                break;  
       
   378                }
       
   379             case MPresenceGrantRequestListEvent::KInterfaceId:
       
   380                {
       
   381                TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent start"));
       
   382                TInt count = iObserverArray.Count();
       
   383                for(TInt i = 0; i < count; i++)
       
   384                   {
       
   385                   iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   386                   }               
       
   387                TRACE( T_LIT("InsideCallbackswitch::::MPresentityGroupContentEvent end"));
       
   388                break;
       
   389                }
       
   390            
       
   391             case MSearchEvent::KInterfaceId:
       
   392                 {
       
   393                 TRACE( T_LIT("InsideCallbackswitch::::MSearchEvent start"));
       
   394 
       
   395                 TInt count = iObserverArray.Count();
       
   396                 for(TInt i = 0; i < count; i++)
       
   397                    {
       
   398                    iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   399                    } 
       
   400                 TRACE( T_LIT("InsideCallbackswitch::::MSearchEvent end"));
       
   401 
       
   402                 break;
       
   403                 }
       
   404             case MSearchKeysEvent::KInterfaceId:
       
   405                 {
       
   406                 TRACE( T_LIT("InsideCallbackswitch::::MSearchKeysEvent start"));
       
   407                 TInt count = iObserverArray.Count();
       
   408                 for(TInt i = 0; i < count; i++)
       
   409                    {
       
   410                    iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   411                    } 
       
   412                 TRACE( T_LIT("InsideCallbackswitch::::MSearchKeysEvent end"));
       
   413 
       
   414                 break;
       
   415                 }
       
   416             case MPresenceBlockListEvent::KInterfaceId:
       
   417                {
       
   418                TRACE( T_LIT("InsideCallbackswitch::::MPresenceBlockListEvent start"));
       
   419                TInt count = iObserverArray.Count();
       
   420                for(TInt i = 0; i < count; i++)
       
   421                   {
       
   422                   iObserverArray[i]->HandleSessionContextEventL(aContext,aEvent);
       
   423                   } 
       
   424                TRACE( T_LIT("InsideCallbackswitch::::MPresenceBlockListEvent end"));
       
   425                break;
       
   426                }
       
   427               
       
   428             default:
       
   429                 {
       
   430                 break;
       
   431                 }
       
   432             }
       
   433     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::DoHandlePresenceContextEventL end"));
       
   434     }
       
   435 // ---------------------------------------------------------------------------
       
   436 // CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL
       
   437 // ---------------------------------------------------------------------------
       
   438 // 
       
   439 MPresenceAuthorization& 
       
   440 CVIMPSTEngineSessionCntxtObserver::XimpAuthorizationL()
       
   441     {
       
   442     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ));
       
   443     __ASSERT_ALWAYS( &iFeatures->PresenceAuthorization(), 
       
   444         User::Leave( KErrNotSupported ));
       
   445     return iFeatures->PresenceAuthorization();
       
   446     }
       
   447     
       
   448 // ---------------------------------------------------------------------------
       
   449 // CVIMPSTEngineSessionCntxtObserver::XimpPresenceWatchingL
       
   450 // ---------------------------------------------------------------------------
       
   451 //
       
   452 MPresenceWatching& 
       
   453 CVIMPSTEngineSessionCntxtObserver::XimpPresenceWatchingL()
       
   454     {
       
   455     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ));
       
   456     __ASSERT_ALWAYS( &iFeatures->PresenceWatching(), 
       
   457         User::Leave( KErrNotSupported ));
       
   458     return iFeatures->PresenceWatching();
       
   459     }    
       
   460     
       
   461 // ---------------------------------------------------------------------------
       
   462 // CVIMPSTEngineSessionCntxtObserver::XimpPresentityGroupsL
       
   463 // ---------------------------------------------------------------------------
       
   464 //
       
   465 MPresentityGroups& 
       
   466 CVIMPSTEngineSessionCntxtObserver::XimpPresentityGroupsL()
       
   467     {
       
   468     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ));
       
   469     __ASSERT_ALWAYS( &iFeatures->PresentityGroups(), 
       
   470         User::Leave( KErrNotSupported ));
       
   471     return iFeatures->PresentityGroups();
       
   472     }        
       
   473     
       
   474 // ---------------------------------------------------------------------------
       
   475 // CVIMPSTEngineSessionCntxtObserver::XimpPresencePublishingL
       
   476 // ---------------------------------------------------------------------------
       
   477 //
       
   478 MPresencePublishing& 
       
   479 CVIMPSTEngineSessionCntxtObserver::XimpPresencePublishingL()
       
   480     {
       
   481     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ));
       
   482     __ASSERT_ALWAYS( &iFeatures->PresencePublishing(), 
       
   483         User::Leave( KErrNotSupported ));
       
   484     return iFeatures->PresencePublishing();
       
   485     }
       
   486 
       
   487 
       
   488 // ---------------------------------------------------------------------------
       
   489 // CVIMPSTEngineSessionCntxtObserver::XimpPresenceContext
       
   490 // ---------------------------------------------------------------------------
       
   491 //
       
   492 MXIMPContext& 
       
   493 CVIMPSTEngineSessionCntxtObserver::XimpPresenceContextL()
       
   494     {
       
   495     __ASSERT_ALWAYS( iPresenceCtx, User::Leave( KErrNotFound ));
       
   496      return *iPresenceCtx;
       
   497     }
       
   498 
       
   499 // ---------------------------------------------------------------------------
       
   500 // CVIMPSTEngineSessionCntxtObserver::PresenceObjectFactory
       
   501 // ---------------------------------------------------------------------------
       
   502 //
       
   503 MPresenceObjectFactory& CVIMPSTEngineSessionCntxtObserver::PresenceObjectFactoryL() const
       
   504     {
       
   505     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotFound ));
       
   506     return iFeatures->PresenceObjectFactory();
       
   507     }
       
   508     
       
   509 // ---------------------------------------------------------------------------
       
   510 // CVIMPSTEngineSessionCntxtObserver::PresenceFeaturesL
       
   511 // ---------------------------------------------------------------------------
       
   512 //
       
   513 MPresenceFeatures& CVIMPSTEngineSessionCntxtObserver::PresenceFeaturesL() const
       
   514     {
       
   515     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotFound ));
       
   516     return *iFeatures;
       
   517     }
       
   518     
       
   519 // ---------------------------------------------------------------------------
       
   520 // CVIMPSTEngineSessionCntxtObserver::RegisterObserver
       
   521 // ---------------------------------------------------------------------------
       
   522 //
       
   523 void CVIMPSTEngineSessionCntxtObserver::RegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver)
       
   524     {
       
   525     if (aObserver)
       
   526 	    {    	
       
   527 	    
       
   528 	    TInt index = iObserverArray.Find(aObserver);
       
   529         if( index == KErrNotFound )
       
   530             {
       
   531             iObserverArray.Append( aObserver );   
       
   532             }
       
   533 	    }
       
   534     }
       
   535 
       
   536 // ---------------------------------------------------------------------------
       
   537 // CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver
       
   538 // ---------------------------------------------------------------------------
       
   539 //
       
   540 void CVIMPSTEngineSessionCntxtObserver::UnRegisterObserver(MVIMPSTEngineSessionCntxtObserver* aObserver)
       
   541     {
       
   542     if (aObserver)
       
   543 	    {    
       
   544 	    TInt index = iObserverArray.Find(aObserver);
       
   545 	        
       
   546 	    if( index >=0 )
       
   547 	        {
       
   548 	        iObserverArray.Remove( index );
       
   549 	        iObserverArray.Compress();
       
   550 	        }
       
   551 	    }    
       
   552    }
       
   553 
       
   554 // ---------------------------------------------------------------------------
       
   555 // CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL
       
   556 // ---------------------------------------------------------------------------
       
   557 //
       
   558 void CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL()
       
   559     {
       
   560     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL start"));
       
   561     using namespace NXIMPFeature::Presence;
       
   562     using namespace NXIMPFeature::InstantMessage;
       
   563     using namespace NXIMPFeature::Search;
       
   564     using namespace NXIMPFeature::PresentityGroups;
       
   565     
       
   566    	MXIMPFeatureInfo* ximpCtxFeats = iPresenceCtx->GetContextFeaturesLC();
       
   567     //get the supproted features from ximpfw adaptation.
       
   568     if( ximpCtxFeats )
       
   569         {        
       
   570         CleanupStack::Pop() ; //iXimpctxFeat 
       
   571         
       
   572         const MDesC8Array& supportedFeatures = ximpCtxFeats->FeatureIds();
       
   573         
       
   574         TInt count  = supportedFeatures.MdcaCount();
       
   575 				
       
   576 		for(TInt index = 0; index < count; index++)
       
   577 		    {
       
   578 		    TPtrC8 feature = supportedFeatures.MdcaPoint(index);
       
   579 		    
       
   580 		    if ( !(iFeatureSupported & EVIMPSTFeaturePublish) && !(KPublish().Compare(feature)) )
       
   581 			    {
       
   582 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeaturePublish;
       
   583 			    
       
   584 			    }
       
   585 		    else if ( !(iFeatureSupported & EVIMPSTFeatureFetch) && !(KFetch().Compare(feature)) )
       
   586 		        {
       
   587 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureFetch;
       
   588 			    
       
   589 			    }
       
   590 			else if ( !(iFeatureSupported & EVIMPSTFeatureSubscribe) && !(KSubscribe().Compare(feature)) )			    
       
   591 			    {
       
   592 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureSubscribe;
       
   593 			    
       
   594 			    }
       
   595 			else if ( !(iFeatureSupported & EVIMPSTFeatureUnsubscribe) && !(KUnsubscribe().Compare(feature)) )			    
       
   596 			    {
       
   597 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureUnsubscribe;
       
   598 			    
       
   599 			    }    
       
   600 			else if ( !(iFeatureSupported & EVIMPSTFeatureAddContact) && !(KAddContact().Compare(feature)) )			    
       
   601 			    {
       
   602 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureAddContact;
       
   603 			    
       
   604 			    }	
       
   605 			else if ( !(iFeatureSupported & EVIMPSTFeatureDeleteContact) && !(KDeleteContact().Compare(feature)) )			    
       
   606        		    {
       
   607 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureDeleteContact;
       
   608 			    
       
   609 			    } 
       
   610 			else if ( !(iFeatureSupported & EVIMPSTFeatureBlock) && !(KBlock().Compare(feature)) )			    
       
   611         	    {
       
   612 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureBlock;
       
   613 			    
       
   614 			    }
       
   615 			else if ( !(iFeatureSupported & EVIMPSTFeatureUnBlock) && !(KUnBlock().Compare(feature)) )			    
       
   616         	    {
       
   617 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureUnBlock;
       
   618 			    
       
   619 			    }
       
   620 			else if ( !(iFeatureSupported & EVIMPSTFeatureAvatar) && !(KAvatar().Compare(feature)) )			    
       
   621         	    {
       
   622 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureAvatar;
       
   623 			    
       
   624 			    }
       
   625 			else if ( !(iFeatureSupported & EVIMPSTFeatureCreateGroup) && !(KCreate().Compare(feature)) )			    
       
   626         	    {
       
   627 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureCreateGroup;
       
   628 			    
       
   629 			    }    
       
   630 			else if ( !(iFeatureSupported & EVIMPSTFeatureDeleteGroup) && !(KDelete().Compare(feature)) )			    
       
   631     		    {
       
   632 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureDeleteGroup;
       
   633 			    
       
   634 			    }
       
   635 			else if ( !(iFeatureSupported & EVIMPSTFeatureInstantMessage) && !(KInstantMessage().Compare(feature)) )			    			
       
   636 			    {
       
   637 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureInstantMessage;
       
   638 			    
       
   639 			    }  
       
   640 			else if ( !(iFeatureSupported & EVIMPSTFeatureSearch) && !(KSearch().Compare(feature)) )			    			
       
   641 			    {
       
   642 			    iFeatureSupported = iFeatureSupported | EVIMPSTFeatureSearch;
       
   643 			    
       
   644 			    }			      
       
   645     
       
   646 		    }
       
   647     
       
   648     	delete ximpCtxFeats;
       
   649         }
       
   650     TRACE( T_LIT("CVIMPSTEngineSessionCntxtObserver::IdentifySupportedFeaturesL end"));
       
   651     }
       
   652 
       
   653 
       
   654 // ---------------------------------------------------------------------------
       
   655 // CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures
       
   656 // ---------------------------------------------------------------------------
       
   657 //
       
   658 TInt CVIMPSTEngineSessionCntxtObserver::GetSupportedFeatures()
       
   659 	{
       
   660 	return 	iFeatureSupported;
       
   661 	}    
       
   662 
       
   663 // end of file
       
   664 
       
   665