servicewidget/servicewidgetdatapublisher/src/cservicewidgetpresencehandler.cpp
changeset 15 81eeb8c83ce5
parent 0 5e5d6b214f4f
equal deleted inserted replaced
0:5e5d6b214f4f 15:81eeb8c83ce5
     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:  presene status handler 
       
    15  *                
       
    16  *
       
    17 */
       
    18 
       
    19  
       
    20 #include "cservicewidgetpresencehandler.h"
       
    21 
       
    22 #include "cservicewidgetbuddypresence.h"
       
    23 #include "servicewidgetcpglobals.h"
       
    24 #include "mservicewidgetobservers.h"
       
    25 #include "cservicewidgetimagedecoder.h"
       
    26 #include "swpdebugtrace.h"
       
    27 //ximp includes
       
    28 #include <ximpclient.h>
       
    29 #include <ximpcontext.h>
       
    30 #include <ximpobjectfactory.h>
       
    31 #include <ximpidentity.h>
       
    32 #include <ximpstatus.h>
       
    33 #include <ximpcontextstateevent.h>
       
    34 #include <ximprequestcompleteevent.h>
       
    35 #include <ximpcontextstate.h>
       
    36 #include <ximpobjectfactory.h>
       
    37 #include <ximpidentity.h>
       
    38 #include <ximpstatus.h>
       
    39 #include <presencegrantrequestlistevent.h>
       
    40 #include <presentitygroupcontentevent.h>
       
    41 #include <presentitygroupmemberinfo.h>
       
    42 #include <presencegrantrequestinfo.h>
       
    43 #include <presencefeatures.h>
       
    44 #include <presentitygroups.h>
       
    45 #include <ximpstatus.h> //Presence info test
       
    46 #include <presentitygroupcontentevent.h>
       
    47 #include <presentitygroupmemberinfo.h>
       
    48 #include <presenceauthorization.h>
       
    49 
       
    50 //ximpfw presence cache
       
    51 #include <presencecachereader2.h> // cache reader
       
    52 #include <presencebuddyinfolist.h>
       
    53 #include <presencebuddyinfo.h>
       
    54 #include <presenceinfofield.h>
       
    55 #include <personpresenceinfo.h>
       
    56 #include <presenceinfofieldvaluetext.h>
       
    57 #include <presenceinfofieldcollection.h>
       
    58 #include <ximpidentity.h>
       
    59 //presencecache event handler.
       
    60 #include <prescachereadhandler.h>
       
    61 #include <presenceinfo.h>
       
    62 
       
    63 #include <avabilitytext.h>
       
    64 
       
    65 #include "vimpstcustomcleanupapi.h" //For customized cleanup function
       
    66 
       
    67 _LIT( KListNameAllBuddy ,"buddylist" );
       
    68 const TInt KUriMaxLength = 255; 
       
    69 // ---------------------------------------------------------------------------
       
    70 // CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler
       
    71 // ---------------------------------------------------------------------------
       
    72 // 
       
    73 CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler(MServiceWidgetPresenceObserver& aPresenceObserver )
       
    74 	:iPresenceObserver( aPresenceObserver ),
       
    75 	 iTotalCount( 0 ),
       
    76 	 iOperationId( EWSOperationUnknown ),
       
    77 	 iOwnStatus( EWSOnline )
       
    78 	   {
       
    79 	   TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler()") );
       
    80 	   }
       
    81 
       
    82 // ---------------------------------------------------------------------------
       
    83 // CServiceWidgetPresenceHandler::NewL
       
    84 // ---------------------------------------------------------------------------
       
    85 // 
       
    86 CServiceWidgetPresenceHandler* CServiceWidgetPresenceHandler::NewL(MServiceWidgetPresenceObserver& aPresenceObserver,
       
    87 															const TDesC& aServiceName,
       
    88 															const TDesC& aOwnId )
       
    89     {
       
    90 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewL() start") );
       
    91     CServiceWidgetPresenceHandler* self = NewLC(aPresenceObserver, aServiceName, aOwnId );
       
    92     CleanupStack::Pop(self);
       
    93     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewL() end") );
       
    94     return self;
       
    95     }
       
    96 
       
    97 // ---------------------------------------------------------------------------
       
    98 // CServiceWidgetPresenceHandler::NewLC
       
    99 // ---------------------------------------------------------------------------
       
   100 // 
       
   101 CServiceWidgetPresenceHandler* CServiceWidgetPresenceHandler::NewLC(MServiceWidgetPresenceObserver& aPresenceObserver,
       
   102 													const TDesC& aServiceName,
       
   103 													const TDesC& aOwnId )
       
   104     {
       
   105     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewLC() start") );
       
   106     CServiceWidgetPresenceHandler* self =
       
   107         new (ELeave) CServiceWidgetPresenceHandler(aPresenceObserver);
       
   108     CleanupStack::PushL(self);
       
   109     self->ConstructL( aServiceName, aOwnId );
       
   110     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewLC() end") );
       
   111     return self;
       
   112     }
       
   113 
       
   114 // ---------------------------------------------------------------------------
       
   115 // CServiceWidgetPresenceHandler::ConstructL
       
   116 // ---------------------------------------------------------------------------
       
   117 // 
       
   118 void CServiceWidgetPresenceHandler::ConstructL(const TDesC& aServiceName,const TDesC& aOwnId )
       
   119     {
       
   120     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() start") );
       
   121     iServiceName = aServiceName.AllocL();
       
   122     iOwnUserId =  aOwnId.AllocL();
       
   123     iClient = MXIMPClient::NewClientL();  
       
   124     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iClient created") );             
       
   125     //Create new sink to receive ximp context events
       
   126 	iPresenceCtx = iClient->NewPresenceContextLC();
       
   127 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iPresenceCtx created") );    
       
   128 	iFeatures = MPresenceFeatures::NewL(iPresenceCtx);
       
   129 	iAcceptedEventTypes.Reset();
       
   130     iAcceptedEventTypes.AppendL( MXIMPRequestCompleteEvent::KInterfaceId );
       
   131     iAcceptedEventTypes.AppendL( MXIMPContextStateEvent::KInterfaceId );
       
   132     iAcceptedEventTypes.AppendL( MPresentityGroupContentEvent::KInterfaceId );   
       
   133     iAcceptedEventTypes.AppendL( MPresenceGrantRequestListEvent::KInterfaceId );
       
   134     TArray< TInt32 > eventFilterArray = iAcceptedEventTypes.Array();
       
   135 	// register this to prsence context   
       
   136 	iPresenceCtx->RegisterObserverL( *this, &eventFilterArray );
       
   137     // ignore code scanner warning, it gives panic
       
   138     CleanupStack::Pop();// because of LC method    
       
   139     //initialize the presence cache.
       
   140     iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL(); 	
       
   141     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iPresenceCacheReader created") );  													 
       
   142     iPresenceCacheReader->SetObserverForSubscribedNotifications(this);
       
   143     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() end") );
       
   144     }
       
   145 
       
   146 // ---------------------------------------------------------------------------
       
   147 // CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler
       
   148 // ---------------------------------------------------------------------------
       
   149 // 
       
   150 CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler()
       
   151     {
       
   152     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler() start") );
       
   153     iAcceptedEventTypes.Reset();
       
   154     iOnlineBuddyArray.ResetAndDestroy();
       
   155     delete iServiceName;
       
   156     delete iOwnUserId;
       
   157   	delete iPresenceCacheReader;
       
   158   	delete iFeatures;
       
   159     if(iPresenceCtx)
       
   160         {
       
   161         iPresenceCtx->UnregisterObserver( *this );
       
   162         delete  iPresenceCtx;   
       
   163         }
       
   164     delete iClient; 
       
   165     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler() end") );
       
   166     }
       
   167 
       
   168 // ---------------------------------------------------------
       
   169 // CServiceWidgetPresenceHandler::GetConnectedSessionL
       
   170 // 
       
   171 // ---------------------------------------------------------
       
   172 void CServiceWidgetPresenceHandler::GetConnectedSessionL(TInt aProtocolUid,TInt aServiceId )
       
   173 	{
       
   174 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetConnectedSessionL() start") );
       
   175 	iOperationId = EWSOperationBind;
       
   176     iPresenceCtx->BindToL( TUid::Uid( aProtocolUid), aServiceId ) ;
       
   177     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetConnectedSessionL() end") );
       
   178     }
       
   179 // ---------------------------------------------------------
       
   180 // CServiceWidgetPresenceHandler::GetCompletedReqResult
       
   181 // 
       
   182 // ---------------------------------------------------------
       
   183 void CServiceWidgetPresenceHandler::ReleaseConnectionL()
       
   184 	{
       
   185 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReleaseConnectionL() start") );
       
   186 	iPresenceCtx->UnbindL() ;
       
   187 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReleaseConnectionL() end") );
       
   188 	} 
       
   189 // ---------------------------------------------------------
       
   190 // CServiceWidgetPresenceHandler::SubscribePresenceL
       
   191 // 
       
   192 // ---------------------------------------------------------
       
   193 void CServiceWidgetPresenceHandler::SubscribePresenceL( const TDesC& aUserId )
       
   194 	{
       
   195 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribePresenceL() start") );
       
   196 	 __ASSERT_ALWAYS( aUserId.Length(), User::Leave( KErrArgument ) );	
       
   197 	 //if anything is there with colon e.g. sip:user@presence1. strip the part before :
       
   198 	 TInt len = aUserId.Find(_L(":"));
       
   199 	 TPtrC buddyId = aUserId.Right( aUserId.Length() - len - KColon().Length() );
       
   200 
       
   201     HBufC* name = HBufC::NewLC( buddyId.Length() + iServiceName->Length() + KColon().Length() );
       
   202     TPtr namePtr( name->Des() );
       
   203     namePtr.Zero();
       
   204    // append the service name followed by user id ,seperated by colon
       
   205     namePtr.Append(*iServiceName);
       
   206     namePtr.Append(KColon);
       
   207     namePtr.Append(buddyId);
       
   208     iPresenceCacheReader->SubscribePresenceBuddyChangeL( *name );
       
   209     CleanupStack::PopAndDestroy(); //  name   
       
   210     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribePresenceL() end") );                                          
       
   211 	}
       
   212 
       
   213 
       
   214 // ---------------------------------------------------------------------------
       
   215 // CServiceWidgetPresenceHandler::RetrieveSubscribedListL
       
   216 // ---------------------------------------------------------------------------
       
   217 //
       
   218 void CServiceWidgetPresenceHandler::RetrieveSubscribedListL()
       
   219     {
       
   220     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::RetrieveSubscribedListL() start") );
       
   221     iOperationId = EWSOperationFetching;
       
   222      //Create group id
       
   223     TBuf<KUriMaxLength> buffer( KListNameAllBuddy );
       
   224     MXIMPIdentity* groupList = iPresenceCtx->ObjectFactory().NewIdentityLC();
       
   225      __ASSERT_ALWAYS( groupList , User::Leave( KErrNoMemory ) );		
       
   226     groupList->SetIdentityL( buffer );
       
   227     //Subscribe buddy list
       
   228     TXIMPRequestId operationId = TXIMPRequestId::Null();
       
   229     __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ) ) ;
       
   230     MPresentityGroups& groups = iFeatures->PresentityGroups() ;
       
   231     groups.SubscribePresentityGroupContentL( *groupList );
       
   232     CleanupStack::PopAndDestroy(); // groupList
       
   233     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::RetrieveSubscribedListL() end") );
       
   234     } 	
       
   235 // ---------------------------------------------------------
       
   236 // CServiceWidgetPresenceHandler::ReadPresenceFromCacheL
       
   237 // 
       
   238 // ---------------------------------------------------------	
       
   239 void CServiceWidgetPresenceHandler::ReadPresenceFromCacheL()
       
   240 	{
       
   241 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReadPresenceFromCache() start") );
       
   242 	iOnlineBuddyArray.ResetAndDestroy();
       
   243 	__ASSERT_ALWAYS( iServiceName, User::Leave( KErrArgument ) );
       
   244     // passed the service id to see the member count
       
   245     iPresenceCacheReader->BuddyCountInService(*iServiceName);
       
   246     // passed the service to register for notification
       
   247 	iPresenceCacheReader->AllBuddiesPresenceInService(*iServiceName, this ); 
       
   248 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReadPresenceFromCache() end") );
       
   249 	}
       
   250 // ---------------------------------------------------------
       
   251 // CServiceWidgetPresenceHandler::SubscribeForAuthorizationL
       
   252 //  
       
   253 // ---------------------------------------------------------    
       
   254 void  CServiceWidgetPresenceHandler::SubscribeForAuthorizationL()
       
   255     {
       
   256     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribeForAuthorizationL() start") );
       
   257          __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ) ) ;
       
   258     MPresenceAuthorization& authorization = iFeatures->PresenceAuthorization();
       
   259      __ASSERT_ALWAYS( &authorization, User::Leave( KErrNotSupported ) ); 
       
   260     authorization.SubscribePresenceGrantRequestListL();  
       
   261     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribeForAuthorizationL() end") );
       
   262     }
       
   263 // ---------------------------------------------------------
       
   264 // CServiceWidgetPresenceHandler::OnlineBuddyCount
       
   265 // 
       
   266 // ---------------------------------------------------------	
       
   267 TInt CServiceWidgetPresenceHandler::OnlineBuddyCount()
       
   268 	{
       
   269 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::OnlineBuddyCount()") );
       
   270     return iOnlineBuddyArray.Count();
       
   271 	}
       
   272 	
       
   273 // ---------------------------------------------------------
       
   274 // CServiceWidgetPresenceHandler::AllBuddyCount
       
   275 // 
       
   276 // ---------------------------------------------------------	
       
   277 TInt CServiceWidgetPresenceHandler::AllBuddyCount()
       
   278 	{
       
   279 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::AllBuddyCount()") );
       
   280     return iTotalCount;
       
   281 	}
       
   282 // ---------------------------------------------------------
       
   283 // CServiceWidgetPresenceHandler::GetInviteCountsL
       
   284 // 
       
   285 // ---------------------------------------------------------	
       
   286 TInt CServiceWidgetPresenceHandler::GetInviteCounts()
       
   287 	{
       
   288 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetInviteCountsL()") );
       
   289     return iInvitationCount;
       
   290 	}
       
   291 
       
   292  // ---------------------------------------------------------
       
   293 // CServiceWidgetPresenceHandler::GetOwnStatusL
       
   294 // 
       
   295 // ---------------------------------------------------------	
       
   296 TWSPresenceStatus CServiceWidgetPresenceHandler::GetOwnStatus()
       
   297 	{
       
   298 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetOwnStatusL()") );
       
   299 	// get the avatar image if not return the default image
       
   300     return iOwnStatus;
       
   301 	}
       
   302 
       
   303 // ---------------------------------------------------------
       
   304 // CServiceWidgetPresenceHandler::GetOwnStatusL
       
   305 // 
       
   306 // ---------------------------------------------------------	
       
   307 TWServiceOperationId CServiceWidgetPresenceHandler::GetOngoingOperationId()
       
   308 	{
       
   309 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetOngoingOperationId()") );
       
   310 	// get the state of ongoing operation
       
   311     return iOperationId;
       
   312 	}
       
   313 
       
   314 // ---------------------------------------------------------
       
   315 // CServiceWidgetPresenceHandler::HandlePresenceContextEvent
       
   316 // ---------------------------------------------------------
       
   317 void CServiceWidgetPresenceHandler::HandlePresenceContextEvent( 
       
   318     const MXIMPContext& /*aContext*/,
       
   319     const MXIMPBase& aEvent )
       
   320 	{
       
   321 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceContextEvent() start") );
       
   322 	switch( aEvent.GetInterfaceId() )
       
   323 		{
       
   324 		case MXIMPRequestCompleteEvent::KInterfaceId:
       
   325 			{
       
   326 			TRACE_SWP(TXT("CServiceWidgetPresenceHandler:: MXIMPRequestCompleteEvent ") );
       
   327 			const MXIMPRequestCompleteEvent* complEvent = 
       
   328 			TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( 
       
   329 							aEvent, MXIMPBase::EPanicIfUnknown );
       
   330 			TXIMPRequestId reqId = complEvent->RequestId();
       
   331 			const MXIMPStatus& status = complEvent->CompletionResult() ;
       
   332 			TInt reqResult = complEvent->CompletionResult().ResultCode();
       
   333 			if( iOperationId == EWSOperationBind && reqResult == KErrNone )
       
   334 				{
       
   335 				TRACE_SWP(TXT("CServiceWidgetPresenceHandler::login completed ") );
       
   336 				iOwnStatus = EWSOnline;
       
   337 				TRAP_IGNORE(DoHandleBindCompleteL()) ;	
       
   338 				}
       
   339 			break;
       
   340 			}
       
   341 		case MPresentityGroupContentEvent::KInterfaceId:
       
   342 	       {
       
   343 	       TRACE_SWP(TXT("CServiceWidgetPresenceHandler::MPresentityGroupContentEvent ") );
       
   344            TRAP_IGNORE(DoHandlePresentityGroupContentEventL( aEvent )) ;
       
   345 	       break;  
       
   346 	       }
       
   347 		case MPresenceGrantRequestListEvent::KInterfaceId:
       
   348 	       {
       
   349 	       TRACE_SWP(TXT("CServiceWidgetPresenceHandler:: MPresenceGrantRequestListEvent ") );
       
   350 	       TRAP_IGNORE(DoHandlePresenceGrantRequestListEventL(aEvent )) ;
       
   351 	       break;
       
   352 	       }
       
   353 		default:
       
   354 			{
       
   355 			break;
       
   356 			}
       
   357 		}
       
   358 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceContextEvent() end") );
       
   359 	} 
       
   360 // ---------------------------------------------------------------------------
       
   361 // CServiceWidgetPresenceHandler::HandlePresenceNotificationL
       
   362 // ---------------------------------------------------------------------------
       
   363 //  
       
   364 void CServiceWidgetPresenceHandler::HandlePresenceNotificationL(TInt /*aErrorCode*/,
       
   365 	        									MPresenceBuddyInfo2* aPresenceBuddyInfo)
       
   366 	{
       
   367 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() start") );
       
   368     if ( aPresenceBuddyInfo)
       
   369         {
       
   370         // we have the ownership of  aPresenceBuddyInfo ; Push into cleanup stack
       
   371         CleanupDeletePushL( aPresenceBuddyInfo );
       
   372         if (iServiceName )
       
   373             {
       
   374             // read the buddyID : returns in XSP format
       
   375             TPtrC buddyXSPId = aPresenceBuddyInfo->BuddyId();
       
   376             TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
       
   377             // read the availability /presence state enum value 
       
   378             MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = aPresenceBuddyInfo->Availability();
       
   379             TPtrC avablityText = aPresenceBuddyInfo->AvailabilityText();
       
   380             // convert the presence cache enum value to service tab enum 
       
   381             TWSPresenceStatus status = ConvertPresenceCacheEnums( availabilityEnum, avablityText );
       
   382 
       
   383             TPtrC statusMsg = aPresenceBuddyInfo->StatusMessage(); // read the  status message
       
   384             TBool isOwnId = buddyId.Compare(*iOwnUserId) ? EFalse : ETrue ;
       
   385 
       
   386             if( isOwnId )
       
   387                 {
       
   388                 TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() own status change") );
       
   389                 iOwnStatus = status;
       
   390                 iPresenceObserver.HandleOwnStatusChangeL( iOwnStatus );	
       
   391                 }
       
   392             else
       
   393                 {
       
   394                 TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() buddy status change") );
       
   395                 CheckAndCacheBuddyAvailabilityL( buddyId, status );
       
   396                 iPresenceObserver.HandleBuddyPresenceChangeL(buddyId, status, statusMsg );
       
   397                 }
       
   398             }
       
   399         CleanupStack::PopAndDestroy(); //  aPresenceBuddyInfo
       
   400         }
       
   401     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() end") );
       
   402     }
       
   403 
       
   404 // ---------------------------------------------------------------------------
       
   405 // CServiceWidgetPresenceHandler::HandlePresenceReadL
       
   406 // ---------------------------------------------------------------------------
       
   407 //  
       
   408 void CServiceWidgetPresenceHandler::HandlePresenceReadL(TInt /*aErrorCode*/,
       
   409 	         									   RPointerArray<MPresenceBuddyInfo2>& aPresenceBuddyInfoList)
       
   410     {
       
   411     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() start") );
       
   412     iOnlineBuddyArray.ResetAndDestroy(); // rest and destroy old data
       
   413     // we have the ownership of  aPresenceBuddyInfoList : Push it to customize cleanupstack
       
   414     // aPresenceBuddyInfoList is collection of owned object and each object need to be deleted    
       
   415     CustomCleanupResetAndDestroyPushL(aPresenceBuddyInfoList);
       
   416    
       
   417     TInt buddyCount = aPresenceBuddyInfoList.Count();
       
   418     for ( TInt i =0 ; i < buddyCount && iServiceName; ++i )
       
   419         {
       
   420         MPresenceBuddyInfo2* buddyinfo = aPresenceBuddyInfoList[i];
       
   421         // read the buddyID : returns in XSP format
       
   422         TPtrC buddyXSPId = buddyinfo->BuddyId();
       
   423         TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
       
   424         // read the availability /presence state enum value 
       
   425         MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = buddyinfo->Availability();
       
   426         TPtrC avablityText = buddyinfo->AvailabilityText();
       
   427          // convert the presence cache enum value to service tab enum 
       
   428         TWSPresenceStatus status = ConvertPresenceCacheEnums( availabilityEnum,avablityText );
       
   429         //compare if its for own user id
       
   430         TBool isOwnId = buddyId.Compare(*iOwnUserId) ? EFalse : ETrue ;
       
   431         if( isOwnId )
       
   432 	        {
       
   433 	        TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() own status change") );
       
   434 	         iOwnStatus = status;
       
   435 	         iPresenceObserver.HandleOwnStatusChangeL( iOwnStatus );
       
   436 	         }
       
   437         else 
       
   438             {
       
   439             TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() buddy status change") );
       
   440             CheckAndCacheBuddyAvailabilityL( buddyId, status );
       
   441             }
       
   442          }
       
   443     CleanupStack::PopAndDestroy();  //  aPresenceBuddyInfoList, calls LocalResetAndDestroy 
       
   444     iPresenceObserver.HandleChangeL();
       
   445     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() end") );	
       
   446     }
       
   447 
       
   448  // ---------------------------------------------------------------------------
       
   449 // CServiceWidgetPresenceHandler::DoHandleBindCompleteL
       
   450 // ---------------------------------------------------------------------------
       
   451 //  
       
   452 void CServiceWidgetPresenceHandler::DoHandleBindCompleteL()
       
   453 	{
       
   454 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandleBindCompleteL() start") );
       
   455     __ASSERT_ALWAYS( iOwnUserId, User::Leave( KErrArgument ) );	
       
   456 	SubscribePresenceL(*iOwnUserId);
       
   457 	iInvitationCount = 0;
       
   458 	SubscribeForAuthorizationL();
       
   459 	// get the list.
       
   460 	RetrieveSubscribedListL();
       
   461 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandleBindCompleteL() end") );
       
   462 	}
       
   463 // ---------------------------------------------------------------------------
       
   464 // CServiceWidgetPresenceHandler:: DoHandlePresentityGroupContentEventL
       
   465 // ---------------------------------------------------------------------------
       
   466 //
       
   467 void CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL( const MXIMPBase& aEvent )
       
   468     {
       
   469     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL() start") );
       
   470     const MPresentityGroupContentEvent& event =	*TXIMPGetInterface< 
       
   471     const MPresentityGroupContentEvent >::From(aEvent,MXIMPBase::EPanicIfUnknown );
       
   472     TInt newCount = event.NewMembersCount();
       
   473     TInt disapCount = event.DisappearedMembersCount();
       
   474     
       
   475     iTotalCount = iTotalCount + newCount; 
       
   476     iTotalCount = iTotalCount - disapCount; 
       
   477     if( iTotalCount <0 )
       
   478 	    {
       
   479 	    // if total count becomes < 0 assign to 0
       
   480 	    iTotalCount = 0;	
       
   481 	    }
       
   482     TRACE_SWP(TXT("CServiceWidgetPresenceHandler iTotalCount %d "), iTotalCount );
       
   483     HBufC* groupId = event.GroupId().Identity().AllocLC();   
       
   484     if ( groupId && !groupId->Compare( KListNameAllBuddy ) )
       
   485         {
       
   486         for( TInt i =0; i < newCount; i++ )
       
   487             {
       
   488             const MPresentityGroupMemberInfo& subscribedEntitys =  event.NewMember(i);
       
   489             const MXIMPIdentity& ident = subscribedEntitys.GroupMemberId();
       
   490             HBufC* buddy = ident.Identity().AllocLC();
       
   491             if( buddy )
       
   492 				{
       
   493 				SubscribePresenceL(*buddy);
       
   494 				CleanupStack::PopAndDestroy( buddy );
       
   495 				}
       
   496             }
       
   497         }
       
   498     if( groupId)
       
   499 	    {
       
   500 	    CleanupStack::PopAndDestroy( groupId );
       
   501         }
       
   502     iOperationId = EWSOperationComplete;
       
   503     iPresenceObserver.HandleChangeL();	
       
   504     ReadPresenceFromCacheL();
       
   505     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL() end") );
       
   506     }
       
   507 // ---------------------------------------------------------------------------
       
   508 // CServiceWidgetPresenceHandler:: DoHandlePresenceGrantRequestListEventL
       
   509 // ---------------------------------------------------------------------------
       
   510 //
       
   511 void CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL( const MXIMPBase& aEvent )
       
   512 	{
       
   513 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL() start") );
       
   514 	const MPresenceGrantRequestListEvent& event = *TXIMPGetInterface< const MPresenceGrantRequestListEvent >::From( 
       
   515 	   					 aEvent, MXIMPBase::EPanicIfUnknown );
       
   516 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler iInvitationCount %d"), iInvitationCount );
       
   517 	TInt newcount    = event.NewRequestsCount();
       
   518 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler newcount %d"), newcount );
       
   519 	TInt disapearCount  = event.DisappearedRequestsCount();
       
   520 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::disapearCount %d "), disapearCount);
       
   521     if(newcount)
       
   522 		{
       
   523 		iInvitationCount++; // one more inviation recieved
       
   524 		TRACE_SWP(TXT("CServiceWidgetPresenceHandler new invitation ,iInvitationCount %d"), iInvitationCount );
       
   525 		const MPresenceGrantRequestInfo& reqInfo = event.NewRequest ( 0 );// its always a new request
       
   526 		HBufC* requesterId = reqInfo.RequestorId().Identity().AllocLC();
       
   527 		if( requesterId )
       
   528 		    {
       
   529 		    iPresenceObserver.HandleAddRequestL(  *requesterId );
       
   530 			CleanupStack::PopAndDestroy( requesterId );
       
   531 		    }
       
   532 		}
       
   533 	else if( disapearCount )
       
   534 		{
       
   535 		iInvitationCount--;
       
   536 		if( iInvitationCount <0 )
       
   537 			{
       
   538 			// if <0  assign to 0
       
   539 			iInvitationCount = 0;	
       
   540 			}
       
   541 		TRACE_SWP(TXT("CServiceWidgetPresenceHandler accept/decline ,iInvitationCount %d"), iInvitationCount );
       
   542 		// there is some count changes
       
   543 		iPresenceObserver.HandleChangeL();	
       
   544 		}
       
   545 	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL() end") );
       
   546 	}
       
   547 
       
   548 // ---------------------------------------------------------------------------
       
   549 // CServiceWidgetPresenceHandler::ConvertXimpToClientPresenceStatus
       
   550 // ---------------------------------------------------------------------------
       
   551 //  
       
   552 TWSPresenceStatus CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums( MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum,TPtrC aAvabilityText)
       
   553     {
       
   554     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums() start") );
       
   555     TWSPresenceStatus status = EWSUnknown ;
       
   556     switch( aAvailabilityEnum )
       
   557         {
       
   558         case MPresenceBuddyInfo2::EBusy:
       
   559             {
       
   560             status  = EWSbusy;
       
   561             if(0==aAvabilityText.Compare(KAwayState))
       
   562                 {
       
   563                 status  = EWSAway;
       
   564                 }
       
   565             if(0==aAvabilityText.Compare(KOnPhoneState))
       
   566                 {
       
   567                 status  = EWSOnPhone;
       
   568                 }
       
   569             if(0==aAvabilityText.Compare(KDndState))
       
   570                 {
       
   571                 status  = EWSDoNotDisturb;
       
   572                 }
       
   573             break;
       
   574             }
       
   575         case MPresenceBuddyInfo2::EAvailable:
       
   576             {
       
   577             status  = EWSOnline;
       
   578             break;
       
   579             }
       
   580         case MPresenceBuddyInfo2::ENotAvailable:
       
   581             {
       
   582             status  = EWSOffline;
       
   583             break;
       
   584             }
       
   585         case MPresenceBuddyInfo2::EUnknownAvailability:
       
   586             {
       
   587             status  = EWSUnknown;
       
   588             if(0==aAvabilityText.Compare(KInvisibleState))
       
   589                 {
       
   590                 status  = EWSInvisible;
       
   591                 }
       
   592             break;
       
   593             }
       
   594         default:
       
   595             {
       
   596             status  = EWSUnknown;
       
   597             break;
       
   598             }    
       
   599         }
       
   600     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums() end") );
       
   601     return status;
       
   602     }
       
   603  // ---------------------------------------------------------------------------
       
   604 // CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL
       
   605 // ---------------------------------------------------------------------------
       
   606 //  
       
   607 void CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL( const TDesC& aUserId, TWSPresenceStatus aStatus )
       
   608     {
       
   609     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL() start") );
       
   610     TBool needToAdd = ETrue;
       
   611     TInt count = iOnlineBuddyArray.Count();
       
   612     for( TInt i=0; i<count; i++ )
       
   613 	    {
       
   614 	    CServiceWidgetBuddyPresence* store = iOnlineBuddyArray[ i ];
       
   615 	    if( store && aUserId.Compare( store->BuddyId() ) == 0 )
       
   616 		    {
       
   617 		    if( aStatus == EWSUnknown || aStatus == EWSOffline )
       
   618 			    {
       
   619 			    // went offline remove from array
       
   620 			    iOnlineBuddyArray.Remove( i ); // do not use agian the loop ,may cuase to crash 
       
   621 			    delete store;
       
   622 			    store = NULL;
       
   623 			    iOnlineBuddyArray.Compress();
       
   624 			    }
       
   625 			else
       
   626 				{
       
   627 				store->SetPresenceStatus( aStatus );
       
   628 		   		}
       
   629 		  	needToAdd = EFalse;	
       
   630 		    break;	// break the loop 
       
   631 		    }
       
   632 	    }
       
   633 	if( needToAdd && ( aStatus != EWSUnknown ) && ( aStatus != EWSOffline ) )
       
   634 		{
       
   635 		// add only availabe buddies to list
       
   636 		CServiceWidgetBuddyPresence* store = CServiceWidgetBuddyPresence::NewL( aUserId, aStatus );
       
   637         iOnlineBuddyArray.Append(store); // ownership given to array	
       
   638 		}
       
   639     TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL() end") );
       
   640     }
       
   641 
       
   642 // end of file