servicewidget/servicewidgetdatapublisher/src/cservicewidgetpresencehandler.cpp
changeset 0 5e5d6b214f4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/servicewidget/servicewidgetdatapublisher/src/cservicewidgetpresencehandler.cpp	Tue Feb 02 10:12:18 2010 +0200
@@ -0,0 +1,642 @@
+/*
+* 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:  presene status handler 
+ *                
+ *
+*/
+
+ 
+#include "cservicewidgetpresencehandler.h"
+
+#include "cservicewidgetbuddypresence.h"
+#include "servicewidgetcpglobals.h"
+#include "mservicewidgetobservers.h"
+#include "cservicewidgetimagedecoder.h"
+#include "swpdebugtrace.h"
+//ximp includes
+#include <ximpclient.h>
+#include <ximpcontext.h>
+#include <ximpobjectfactory.h>
+#include <ximpidentity.h>
+#include <ximpstatus.h>
+#include <ximpcontextstateevent.h>
+#include <ximprequestcompleteevent.h>
+#include <ximpcontextstate.h>
+#include <ximpobjectfactory.h>
+#include <ximpidentity.h>
+#include <ximpstatus.h>
+#include <presencegrantrequestlistevent.h>
+#include <presentitygroupcontentevent.h>
+#include <presentitygroupmemberinfo.h>
+#include <presencegrantrequestinfo.h>
+#include <presencefeatures.h>
+#include <presentitygroups.h>
+#include <ximpstatus.h> //Presence info test
+#include <presentitygroupcontentevent.h>
+#include <presentitygroupmemberinfo.h>
+#include <presenceauthorization.h>
+
+//ximpfw presence cache
+#include <presencecachereader2.h> // cache reader
+#include <presencebuddyinfolist.h>
+#include <presencebuddyinfo.h>
+#include <presenceinfofield.h>
+#include <personpresenceinfo.h>
+#include <presenceinfofieldvaluetext.h>
+#include <presenceinfofieldcollection.h>
+#include <ximpidentity.h>
+//presencecache event handler.
+#include <prescachereadhandler.h>
+#include <presenceinfo.h>
+
+#include <avabilitytext.h>
+
+#include "vimpstcustomcleanupapi.h" //For customized cleanup function
+
+_LIT( KListNameAllBuddy ,"buddylist" );
+const TInt KUriMaxLength = 255; 
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler
+// ---------------------------------------------------------------------------
+// 
+CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler(MServiceWidgetPresenceObserver& aPresenceObserver )
+	:iPresenceObserver( aPresenceObserver ),
+	 iTotalCount( 0 ),
+	 iOperationId( EWSOperationUnknown ),
+	 iOwnStatus( EWSOnline )
+	   {
+	   TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CServiceWidgetPresenceHandler()") );
+	   }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::NewL
+// ---------------------------------------------------------------------------
+// 
+CServiceWidgetPresenceHandler* CServiceWidgetPresenceHandler::NewL(MServiceWidgetPresenceObserver& aPresenceObserver,
+															const TDesC& aServiceName,
+															const TDesC& aOwnId )
+    {
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewL() start") );
+    CServiceWidgetPresenceHandler* self = NewLC(aPresenceObserver, aServiceName, aOwnId );
+    CleanupStack::Pop(self);
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewL() end") );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::NewLC
+// ---------------------------------------------------------------------------
+// 
+CServiceWidgetPresenceHandler* CServiceWidgetPresenceHandler::NewLC(MServiceWidgetPresenceObserver& aPresenceObserver,
+													const TDesC& aServiceName,
+													const TDesC& aOwnId )
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewLC() start") );
+    CServiceWidgetPresenceHandler* self =
+        new (ELeave) CServiceWidgetPresenceHandler(aPresenceObserver);
+    CleanupStack::PushL(self);
+    self->ConstructL( aServiceName, aOwnId );
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::NewLC() end") );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::ConstructL
+// ---------------------------------------------------------------------------
+// 
+void CServiceWidgetPresenceHandler::ConstructL(const TDesC& aServiceName,const TDesC& aOwnId )
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() start") );
+    iServiceName = aServiceName.AllocL();
+    iOwnUserId =  aOwnId.AllocL();
+    iClient = MXIMPClient::NewClientL();  
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iClient created") );             
+    //Create new sink to receive ximp context events
+	iPresenceCtx = iClient->NewPresenceContextLC();
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iPresenceCtx created") );    
+	iFeatures = MPresenceFeatures::NewL(iPresenceCtx);
+	iAcceptedEventTypes.Reset();
+    iAcceptedEventTypes.AppendL( MXIMPRequestCompleteEvent::KInterfaceId );
+    iAcceptedEventTypes.AppendL( MXIMPContextStateEvent::KInterfaceId );
+    iAcceptedEventTypes.AppendL( MPresentityGroupContentEvent::KInterfaceId );   
+    iAcceptedEventTypes.AppendL( MPresenceGrantRequestListEvent::KInterfaceId );
+    TArray< TInt32 > eventFilterArray = iAcceptedEventTypes.Array();
+	// register this to prsence context   
+	iPresenceCtx->RegisterObserverL( *this, &eventFilterArray );
+    // ignore code scanner warning, it gives panic
+    CleanupStack::Pop();// because of LC method    
+    //initialize the presence cache.
+    iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL(); 	
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() iPresenceCacheReader created") );  													 
+    iPresenceCacheReader->SetObserverForSubscribedNotifications(this);
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConstructL() end") );
+    }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler
+// ---------------------------------------------------------------------------
+// 
+CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler()
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler() start") );
+    iAcceptedEventTypes.Reset();
+    iOnlineBuddyArray.ResetAndDestroy();
+    delete iServiceName;
+    delete iOwnUserId;
+  	delete iPresenceCacheReader;
+  	delete iFeatures;
+    if(iPresenceCtx)
+        {
+        iPresenceCtx->UnregisterObserver( *this );
+        delete  iPresenceCtx;   
+        }
+    delete iClient; 
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::~CServiceWidgetPresenceHandler() end") );
+    }
+
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::GetConnectedSessionL
+// 
+// ---------------------------------------------------------
+void CServiceWidgetPresenceHandler::GetConnectedSessionL(TInt aProtocolUid,TInt aServiceId )
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetConnectedSessionL() start") );
+	iOperationId = EWSOperationBind;
+    iPresenceCtx->BindToL( TUid::Uid( aProtocolUid), aServiceId ) ;
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetConnectedSessionL() end") );
+    }
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::GetCompletedReqResult
+// 
+// ---------------------------------------------------------
+void CServiceWidgetPresenceHandler::ReleaseConnectionL()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReleaseConnectionL() start") );
+	iPresenceCtx->UnbindL() ;
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReleaseConnectionL() end") );
+	} 
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::SubscribePresenceL
+// 
+// ---------------------------------------------------------
+void CServiceWidgetPresenceHandler::SubscribePresenceL( const TDesC& aUserId )
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribePresenceL() start") );
+	 __ASSERT_ALWAYS( aUserId.Length(), User::Leave( KErrArgument ) );	
+	 //if anything is there with colon e.g. sip:user@presence1. strip the part before :
+	 TInt len = aUserId.Find(_L(":"));
+	 TPtrC buddyId = aUserId.Right( aUserId.Length() - len - KColon().Length() );
+
+    HBufC* name = HBufC::NewLC( buddyId.Length() + iServiceName->Length() + KColon().Length() );
+    TPtr namePtr( name->Des() );
+    namePtr.Zero();
+   // append the service name followed by user id ,seperated by colon
+    namePtr.Append(*iServiceName);
+    namePtr.Append(KColon);
+    namePtr.Append(buddyId);
+    iPresenceCacheReader->SubscribePresenceBuddyChangeL( *name );
+    CleanupStack::PopAndDestroy(); //  name   
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribePresenceL() end") );                                          
+	}
+
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::RetrieveSubscribedListL
+// ---------------------------------------------------------------------------
+//
+void CServiceWidgetPresenceHandler::RetrieveSubscribedListL()
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::RetrieveSubscribedListL() start") );
+    iOperationId = EWSOperationFetching;
+     //Create group id
+    TBuf<KUriMaxLength> buffer( KListNameAllBuddy );
+    MXIMPIdentity* groupList = iPresenceCtx->ObjectFactory().NewIdentityLC();
+     __ASSERT_ALWAYS( groupList , User::Leave( KErrNoMemory ) );		
+    groupList->SetIdentityL( buffer );
+    //Subscribe buddy list
+    TXIMPRequestId operationId = TXIMPRequestId::Null();
+    __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ) ) ;
+    MPresentityGroups& groups = iFeatures->PresentityGroups() ;
+    groups.SubscribePresentityGroupContentL( *groupList );
+    CleanupStack::PopAndDestroy(); // groupList
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::RetrieveSubscribedListL() end") );
+    } 	
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::ReadPresenceFromCacheL
+// 
+// ---------------------------------------------------------	
+void CServiceWidgetPresenceHandler::ReadPresenceFromCacheL()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReadPresenceFromCache() start") );
+	iOnlineBuddyArray.ResetAndDestroy();
+	__ASSERT_ALWAYS( iServiceName, User::Leave( KErrArgument ) );
+    // passed the service id to see the member count
+    iPresenceCacheReader->BuddyCountInService(*iServiceName);
+    // passed the service to register for notification
+	iPresenceCacheReader->AllBuddiesPresenceInService(*iServiceName, this ); 
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ReadPresenceFromCache() end") );
+	}
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::SubscribeForAuthorizationL
+//  
+// ---------------------------------------------------------    
+void  CServiceWidgetPresenceHandler::SubscribeForAuthorizationL()
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribeForAuthorizationL() start") );
+         __ASSERT_ALWAYS( iFeatures, User::Leave( KErrNotSupported ) ) ;
+    MPresenceAuthorization& authorization = iFeatures->PresenceAuthorization();
+     __ASSERT_ALWAYS( &authorization, User::Leave( KErrNotSupported ) ); 
+    authorization.SubscribePresenceGrantRequestListL();  
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::SubscribeForAuthorizationL() end") );
+    }
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::OnlineBuddyCount
+// 
+// ---------------------------------------------------------	
+TInt CServiceWidgetPresenceHandler::OnlineBuddyCount()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::OnlineBuddyCount()") );
+    return iOnlineBuddyArray.Count();
+	}
+	
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::AllBuddyCount
+// 
+// ---------------------------------------------------------	
+TInt CServiceWidgetPresenceHandler::AllBuddyCount()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::AllBuddyCount()") );
+    return iTotalCount;
+	}
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::GetInviteCountsL
+// 
+// ---------------------------------------------------------	
+TInt CServiceWidgetPresenceHandler::GetInviteCounts()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetInviteCountsL()") );
+    return iInvitationCount;
+	}
+
+ // ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::GetOwnStatusL
+// 
+// ---------------------------------------------------------	
+TWSPresenceStatus CServiceWidgetPresenceHandler::GetOwnStatus()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetOwnStatusL()") );
+	// get the avatar image if not return the default image
+    return iOwnStatus;
+	}
+
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::GetOwnStatusL
+// 
+// ---------------------------------------------------------	
+TWServiceOperationId CServiceWidgetPresenceHandler::GetOngoingOperationId()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::GetOngoingOperationId()") );
+	// get the state of ongoing operation
+    return iOperationId;
+	}
+
+// ---------------------------------------------------------
+// CServiceWidgetPresenceHandler::HandlePresenceContextEvent
+// ---------------------------------------------------------
+void CServiceWidgetPresenceHandler::HandlePresenceContextEvent( 
+    const MXIMPContext& /*aContext*/,
+    const MXIMPBase& aEvent )
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceContextEvent() start") );
+	switch( aEvent.GetInterfaceId() )
+		{
+		case MXIMPRequestCompleteEvent::KInterfaceId:
+			{
+			TRACE_SWP(TXT("CServiceWidgetPresenceHandler:: MXIMPRequestCompleteEvent ") );
+			const MXIMPRequestCompleteEvent* complEvent = 
+			TXIMPGetInterface< const MXIMPRequestCompleteEvent >::From( 
+							aEvent, MXIMPBase::EPanicIfUnknown );
+			TXIMPRequestId reqId = complEvent->RequestId();
+			const MXIMPStatus& status = complEvent->CompletionResult() ;
+			TInt reqResult = complEvent->CompletionResult().ResultCode();
+			if( iOperationId == EWSOperationBind && reqResult == KErrNone )
+				{
+				TRACE_SWP(TXT("CServiceWidgetPresenceHandler::login completed ") );
+				iOwnStatus = EWSOnline;
+				TRAP_IGNORE(DoHandleBindCompleteL()) ;	
+				}
+			break;
+			}
+		case MPresentityGroupContentEvent::KInterfaceId:
+	       {
+	       TRACE_SWP(TXT("CServiceWidgetPresenceHandler::MPresentityGroupContentEvent ") );
+           TRAP_IGNORE(DoHandlePresentityGroupContentEventL( aEvent )) ;
+	       break;  
+	       }
+		case MPresenceGrantRequestListEvent::KInterfaceId:
+	       {
+	       TRACE_SWP(TXT("CServiceWidgetPresenceHandler:: MPresenceGrantRequestListEvent ") );
+	       TRAP_IGNORE(DoHandlePresenceGrantRequestListEventL(aEvent )) ;
+	       break;
+	       }
+		default:
+			{
+			break;
+			}
+		}
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceContextEvent() end") );
+	} 
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::HandlePresenceNotificationL
+// ---------------------------------------------------------------------------
+//  
+void CServiceWidgetPresenceHandler::HandlePresenceNotificationL(TInt /*aErrorCode*/,
+	        									MPresenceBuddyInfo2* aPresenceBuddyInfo)
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() start") );
+    if ( aPresenceBuddyInfo)
+        {
+        // we have the ownership of  aPresenceBuddyInfo ; Push into cleanup stack
+        CleanupDeletePushL( aPresenceBuddyInfo );
+        if (iServiceName )
+            {
+            // read the buddyID : returns in XSP format
+            TPtrC buddyXSPId = aPresenceBuddyInfo->BuddyId();
+            TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
+            // read the availability /presence state enum value 
+            MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = aPresenceBuddyInfo->Availability();
+            TPtrC avablityText = aPresenceBuddyInfo->AvailabilityText();
+            // convert the presence cache enum value to service tab enum 
+            TWSPresenceStatus status = ConvertPresenceCacheEnums( availabilityEnum, avablityText );
+
+            TPtrC statusMsg = aPresenceBuddyInfo->StatusMessage(); // read the  status message
+            TBool isOwnId = buddyId.Compare(*iOwnUserId) ? EFalse : ETrue ;
+
+            if( isOwnId )
+                {
+                TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() own status change") );
+                iOwnStatus = status;
+                iPresenceObserver.HandleOwnStatusChangeL( iOwnStatus );	
+                }
+            else
+                {
+                TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() buddy status change") );
+                CheckAndCacheBuddyAvailabilityL( buddyId, status );
+                iPresenceObserver.HandleBuddyPresenceChangeL(buddyId, status, statusMsg );
+                }
+            }
+        CleanupStack::PopAndDestroy(); //  aPresenceBuddyInfo
+        }
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceNotificationL() end") );
+    }
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::HandlePresenceReadL
+// ---------------------------------------------------------------------------
+//  
+void CServiceWidgetPresenceHandler::HandlePresenceReadL(TInt /*aErrorCode*/,
+	         									   RPointerArray<MPresenceBuddyInfo2>& aPresenceBuddyInfoList)
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() start") );
+    iOnlineBuddyArray.ResetAndDestroy(); // rest and destroy old data
+    // we have the ownership of  aPresenceBuddyInfoList : Push it to customize cleanupstack
+    // aPresenceBuddyInfoList is collection of owned object and each object need to be deleted    
+    CustomCleanupResetAndDestroyPushL(aPresenceBuddyInfoList);
+   
+    TInt buddyCount = aPresenceBuddyInfoList.Count();
+    for ( TInt i =0 ; i < buddyCount && iServiceName; ++i )
+        {
+        MPresenceBuddyInfo2* buddyinfo = aPresenceBuddyInfoList[i];
+        // read the buddyID : returns in XSP format
+        TPtrC buddyXSPId = buddyinfo->BuddyId();
+        TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
+        // read the availability /presence state enum value 
+        MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = buddyinfo->Availability();
+        TPtrC avablityText = buddyinfo->AvailabilityText();
+         // convert the presence cache enum value to service tab enum 
+        TWSPresenceStatus status = ConvertPresenceCacheEnums( availabilityEnum,avablityText );
+        //compare if its for own user id
+        TBool isOwnId = buddyId.Compare(*iOwnUserId) ? EFalse : ETrue ;
+        if( isOwnId )
+	        {
+	        TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() own status change") );
+	         iOwnStatus = status;
+	         iPresenceObserver.HandleOwnStatusChangeL( iOwnStatus );
+	         }
+        else 
+            {
+            TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() buddy status change") );
+            CheckAndCacheBuddyAvailabilityL( buddyId, status );
+            }
+         }
+    CleanupStack::PopAndDestroy();  //  aPresenceBuddyInfoList, calls LocalResetAndDestroy 
+    iPresenceObserver.HandleChangeL();
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::HandlePresenceReadL() end") );	
+    }
+
+ // ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::DoHandleBindCompleteL
+// ---------------------------------------------------------------------------
+//  
+void CServiceWidgetPresenceHandler::DoHandleBindCompleteL()
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandleBindCompleteL() start") );
+    __ASSERT_ALWAYS( iOwnUserId, User::Leave( KErrArgument ) );	
+	SubscribePresenceL(*iOwnUserId);
+	iInvitationCount = 0;
+	SubscribeForAuthorizationL();
+	// get the list.
+	RetrieveSubscribedListL();
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandleBindCompleteL() end") );
+	}
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler:: DoHandlePresentityGroupContentEventL
+// ---------------------------------------------------------------------------
+//
+void CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL( const MXIMPBase& aEvent )
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL() start") );
+    const MPresentityGroupContentEvent& event =	*TXIMPGetInterface< 
+    const MPresentityGroupContentEvent >::From(aEvent,MXIMPBase::EPanicIfUnknown );
+    TInt newCount = event.NewMembersCount();
+    TInt disapCount = event.DisappearedMembersCount();
+    
+    iTotalCount = iTotalCount + newCount; 
+    iTotalCount = iTotalCount - disapCount; 
+    if( iTotalCount <0 )
+	    {
+	    // if total count becomes < 0 assign to 0
+	    iTotalCount = 0;	
+	    }
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler iTotalCount %d "), iTotalCount );
+    HBufC* groupId = event.GroupId().Identity().AllocLC();   
+    if ( groupId && !groupId->Compare( KListNameAllBuddy ) )
+        {
+        for( TInt i =0; i < newCount; i++ )
+            {
+            const MPresentityGroupMemberInfo& subscribedEntitys =  event.NewMember(i);
+            const MXIMPIdentity& ident = subscribedEntitys.GroupMemberId();
+            HBufC* buddy = ident.Identity().AllocLC();
+            if( buddy )
+				{
+				SubscribePresenceL(*buddy);
+				CleanupStack::PopAndDestroy( buddy );
+				}
+            }
+        }
+    if( groupId)
+	    {
+	    CleanupStack::PopAndDestroy( groupId );
+        }
+    iOperationId = EWSOperationComplete;
+    iPresenceObserver.HandleChangeL();	
+    ReadPresenceFromCacheL();
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresentityGroupContentEventL() end") );
+    }
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler:: DoHandlePresenceGrantRequestListEventL
+// ---------------------------------------------------------------------------
+//
+void CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL( const MXIMPBase& aEvent )
+	{
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL() start") );
+	const MPresenceGrantRequestListEvent& event = *TXIMPGetInterface< const MPresenceGrantRequestListEvent >::From( 
+	   					 aEvent, MXIMPBase::EPanicIfUnknown );
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler iInvitationCount %d"), iInvitationCount );
+	TInt newcount    = event.NewRequestsCount();
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler newcount %d"), newcount );
+	TInt disapearCount  = event.DisappearedRequestsCount();
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::disapearCount %d "), disapearCount);
+    if(newcount)
+		{
+		iInvitationCount++; // one more inviation recieved
+		TRACE_SWP(TXT("CServiceWidgetPresenceHandler new invitation ,iInvitationCount %d"), iInvitationCount );
+		const MPresenceGrantRequestInfo& reqInfo = event.NewRequest ( 0 );// its always a new request
+		HBufC* requesterId = reqInfo.RequestorId().Identity().AllocLC();
+		if( requesterId )
+		    {
+		    iPresenceObserver.HandleAddRequestL(  *requesterId );
+			CleanupStack::PopAndDestroy( requesterId );
+		    }
+		}
+	else if( disapearCount )
+		{
+		iInvitationCount--;
+		if( iInvitationCount <0 )
+			{
+			// if <0  assign to 0
+			iInvitationCount = 0;	
+			}
+		TRACE_SWP(TXT("CServiceWidgetPresenceHandler accept/decline ,iInvitationCount %d"), iInvitationCount );
+		// there is some count changes
+		iPresenceObserver.HandleChangeL();	
+		}
+	TRACE_SWP(TXT("CServiceWidgetPresenceHandler::DoHandlePresenceGrantRequestListEventL() end") );
+	}
+
+// ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::ConvertXimpToClientPresenceStatus
+// ---------------------------------------------------------------------------
+//  
+TWSPresenceStatus CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums( MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum,TPtrC aAvabilityText)
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums() start") );
+    TWSPresenceStatus status = EWSUnknown ;
+    switch( aAvailabilityEnum )
+        {
+        case MPresenceBuddyInfo2::EBusy:
+            {
+            status  = EWSbusy;
+            if(0==aAvabilityText.Compare(KAwayState))
+                {
+                status  = EWSAway;
+                }
+            if(0==aAvabilityText.Compare(KOnPhoneState))
+                {
+                status  = EWSOnPhone;
+                }
+            if(0==aAvabilityText.Compare(KDndState))
+                {
+                status  = EWSDoNotDisturb;
+                }
+            break;
+            }
+        case MPresenceBuddyInfo2::EAvailable:
+            {
+            status  = EWSOnline;
+            break;
+            }
+        case MPresenceBuddyInfo2::ENotAvailable:
+            {
+            status  = EWSOffline;
+            break;
+            }
+        case MPresenceBuddyInfo2::EUnknownAvailability:
+            {
+            status  = EWSUnknown;
+            if(0==aAvabilityText.Compare(KInvisibleState))
+                {
+                status  = EWSInvisible;
+                }
+            break;
+            }
+        default:
+            {
+            status  = EWSUnknown;
+            break;
+            }    
+        }
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::ConvertPresenceCacheEnums() end") );
+    return status;
+    }
+ // ---------------------------------------------------------------------------
+// CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL
+// ---------------------------------------------------------------------------
+//  
+void CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL( const TDesC& aUserId, TWSPresenceStatus aStatus )
+    {
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL() start") );
+    TBool needToAdd = ETrue;
+    TInt count = iOnlineBuddyArray.Count();
+    for( TInt i=0; i<count; i++ )
+	    {
+	    CServiceWidgetBuddyPresence* store = iOnlineBuddyArray[ i ];
+	    if( store && aUserId.Compare( store->BuddyId() ) == 0 )
+		    {
+		    if( aStatus == EWSUnknown || aStatus == EWSOffline )
+			    {
+			    // went offline remove from array
+			    iOnlineBuddyArray.Remove( i ); // do not use agian the loop ,may cuase to crash 
+			    delete store;
+			    store = NULL;
+			    iOnlineBuddyArray.Compress();
+			    }
+			else
+				{
+				store->SetPresenceStatus( aStatus );
+		   		}
+		  	needToAdd = EFalse;	
+		    break;	// break the loop 
+		    }
+	    }
+	if( needToAdd && ( aStatus != EWSUnknown ) && ( aStatus != EWSOffline ) )
+		{
+		// add only availabe buddies to list
+		CServiceWidgetBuddyPresence* store = CServiceWidgetBuddyPresence::NewL( aUserId, aStatus );
+        iOnlineBuddyArray.Append(store); // ownership given to array	
+		}
+    TRACE_SWP(TXT("CServiceWidgetPresenceHandler::CheckAndCacheBuddyAvailabilityL() end") );
+    }
+
+// end of file