uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailspresencehandler.cpp
branchRCL_3
changeset 23 9a48e301e94b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiservicetab/vimpstdetailsviewplugin/src/cvimpstdetailspresencehandler.cpp	Wed Sep 01 12:33:36 2010 +0100
@@ -0,0 +1,447 @@
+/*
+* Copyright (c) 2008-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Implementation of the presence handler
+*
+*/
+
+
+#include "cvimpstdetailspresencehandler.h"
+
+#include "tvimpstconsts.h"
+
+//presence cache header
+#include <presencecachereader2.h> // cache reader
+#include <avabilitytext.h>
+
+// ximpfw
+#include <ximpclient.h>
+#include <ximpcontext.h>
+#include <StringLoader.h>
+#include <vimpstdetailsviewpluginrsc.rsg>
+#include "uiservicetabtracer.h"
+
+// ---------------------------------------------------------------------------
+// NewL, two-phase construction
+// ---------------------------------------------------------------------------
+//
+CVIMPSTDetailsPresenceHandler* CVIMPSTDetailsPresenceHandler::NewL(const TDesC& aServiceName ,
+																   MVIMPSTDetailsPresenceObserver& aObserver,
+																   TBool aPresenceSupported )
+    {
+    CVIMPSTDetailsPresenceHandler* self= new (ELeave) CVIMPSTDetailsPresenceHandler( aObserver, aPresenceSupported );
+    CleanupStack::PushL(self);
+    self->ConstructL( aServiceName );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ (first phase) constructor
+// ---------------------------------------------------------------------------
+//
+CVIMPSTDetailsPresenceHandler::CVIMPSTDetailsPresenceHandler(MVIMPSTDetailsPresenceObserver& aObserver, 
+                                                             TBool aPresenceSupported)
+   : iPresenceObserver( aObserver ),
+   iStatus( TVIMPSTEnums::EOffline ),
+   iPresenceSupported( aPresenceSupported )
+    {
+    // No implementation required
+    }
+
+// ---------------------------------------------------------------------------
+// ConstructL, second phase constructor
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTDetailsPresenceHandler::ConstructL(const TDesC& aServiceName )
+	{
+	TRACER_AUTO;
+ 	iServiceName = aServiceName.AllocL();
+ 	
+ 		
+    iXIMClient = MXIMPClient::NewClientL();        
+    //Create new sink to receive ximp context events
+    iPresenceContext = iXIMClient->NewPresenceContextLC();
+ 	CleanupStack::Pop(); //  iPresenceContext
+ 	
+    //initialize the presence cache.
+    iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL(); 														 
+    iPresenceCacheReader->SetObserverForSubscribedNotifications(this);
+    iUserId = NULL;
+	}
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CVIMPSTDetailsPresenceHandler::~CVIMPSTDetailsPresenceHandler()
+    {
+    delete iStatusMessage;
+    delete iUserId;
+    delete iStatusText;
+    delete iServiceName;
+    delete iPresenceCacheReader;
+    delete iPresenceContext;
+    delete iXIMClient;
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::SubscribePresenceL
+// ---------------------------------------------------------------------------
+//  
+void CVIMPSTDetailsPresenceHandler::SubscribePresenceL(const TDesC& aUserId )
+	{
+	TRACER_AUTO;
+	if( iUserId )
+		{
+		delete iUserId;
+		iUserId = NULL;	
+		}
+	iUserId = aUserId.AllocL();
+	iStatus = TVIMPSTEnums::EOffline;
+	if( !iPresenceSupported )
+	    {
+	    return;
+	    }
+	HBufC* name = HBufC::NewLC( aUserId.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(aUserId);
+
+    iPresenceCacheReader->SubscribePresenceBuddyChangeL(namePtr);
+    MPresenceBuddyInfo2* presenceBuddyInfo = iPresenceCacheReader->PresenceInfoLC(namePtr);
+   
+    if ( presenceBuddyInfo )
+        {
+        TPtrC buddyXSPId = presenceBuddyInfo->BuddyId(); // read the buddyID : returns in XSP format
+        TPtrC buddyId = buddyXSPId.Right( buddyXSPId.Length() - iServiceName->Length() - KColon().Length());
+        // read the availability /presence state enum value 
+        MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = presenceBuddyInfo->Availability();
+        TPtrC avablityText = presenceBuddyInfo->AvailabilityText();
+        ConvertPresenceCacheEnums( availabilityEnum ,avablityText ); // convert the presence cache enum value to service tab enum 
+		if(TVIMPSTEnums::EUnknown ==  iStatus)
+			{
+			//get the blocked and pending state
+			GetKeyFieldsAndValuesL(*presenceBuddyInfo);
+			}
+        TPtrC statusMsg = presenceBuddyInfo->StatusMessage(); // read the  status message     
+        ProcessStatusMesssageL( statusMsg  );
+        CleanupStack::PopAndDestroy();  // presenceBuddyInfo
+        }
+    CleanupStack::PopAndDestroy(); //  name
+   	}
+
+
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::HandlePresenceReadL
+// ---------------------------------------------------------------------------
+//  
+void CVIMPSTDetailsPresenceHandler::HandlePresenceReadL(TInt /*aErrorCode*/,
+        RPointerArray<MPresenceBuddyInfo2>& /*aPresenceBuddyInfoList*/)
+        {
+        //Not required as we are not subcribing to all buddies presence
+
+        }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::HandlePresenceNotificationL
+// ---------------------------------------------------------------------------
+//  
+void CVIMPSTDetailsPresenceHandler::HandlePresenceNotificationL(TInt /*aErrorCode*/,
+        MPresenceBuddyInfo2* aPresenceBuddyInfo)
+    {
+	TRACER_AUTO;
+    if ( aPresenceBuddyInfo )
+        {
+        CleanupDeletePushL( aPresenceBuddyInfo );  
+        TPtrC buddyXSPId = aPresenceBuddyInfo->BuddyId(); // read the buddyID : returns in XSP format
+        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 
+       ConvertPresenceCacheEnums( availabilityEnum ,avablityText ); 
+       
+       // its either  blocked or pending stats, hence get the corrrect state
+        if(TVIMPSTEnums::EUnknown ==  iStatus)
+            {
+            //get the blocked and pending state
+            GetKeyFieldsAndValuesL(*aPresenceBuddyInfo);
+            }
+       
+        TPtrC statusMsg = aPresenceBuddyInfo->StatusMessage(); // read the  status message     
+        ProcessStatusMesssageL( statusMsg  );
+        CleanupStack::PopAndDestroy();  // aPresenceBuddyInfo
+        }
+    }    
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::ConvertPresenceCacheEnums
+// ---------------------------------------------------------------------------
+//  
+void CVIMPSTDetailsPresenceHandler::ConvertPresenceCacheEnums(MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum, TPtrC aAvabilityText)
+    {
+    // convert the presence cache enums to UI enumvalues
+    // by default if the enum doesnot match then its  TVIMPSTEnums::UnKnown
+    switch( aAvailabilityEnum )
+        {
+        case MPresenceBuddyInfo2::EBusy:
+            {
+           if(0==aAvabilityText.Compare(KAwayState))
+                {
+                iStatus  = TVIMPSTEnums::EAway;
+                }
+            else if(0==aAvabilityText.Compare(KOnPhoneState))
+                {
+                iStatus  = TVIMPSTEnums::EOnPhone;
+                }
+            else if(0==aAvabilityText.Compare(KDndState))
+                {
+                iStatus  = TVIMPSTEnums::EDoNotDisturb;
+                }
+            else
+                {
+                iStatus  = TVIMPSTEnums::EBusy;
+			    }
+            break;
+			}
+        case MPresenceBuddyInfo2::EAvailable:
+            {
+            iStatus  = TVIMPSTEnums::EOnline;
+            break;
+            }
+        case MPresenceBuddyInfo2::ENotAvailable:
+            {
+            iStatus  = TVIMPSTEnums::EOffline;
+            break;
+            }
+        case MPresenceBuddyInfo2::EUnknownAvailability:
+            {
+            iStatus  = TVIMPSTEnums::EUnknown;
+			if(0==aAvabilityText.Compare(KInvisibleState))
+			    {
+			    iStatus  = TVIMPSTEnums::EInvisible;
+			    }
+			
+            break;
+            }    
+        default:
+            {
+            iStatus  = TVIMPSTEnums::EOffline;
+            break;
+            }    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::ProcessStatusMesssageL
+// ---------------------------------------------------------------------------
+//  
+void CVIMPSTDetailsPresenceHandler::ProcessStatusMesssageL(const TDesC& aStatusMessage  )
+	{
+	TRACER_AUTO;
+	if( iStatusMessage )
+		{
+		delete iStatusMessage ;
+		iStatusMessage = NULL;	
+		}
+	if( aStatusMessage.Length() > 0 )
+	    {
+	    // MAx length of KStatusMsgMaxLength is allocated 
+	    // if status message is longer than KStatusMsgMaxLength
+	    iStatusMessage = aStatusMessage.Left( KStatusMsgMaxLength ).AllocL(); 
+	    }
+	iPresenceObserver.HandlePresenceChangedL();	
+    }
+
+// --------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::GetPresenceStatus
+// --------------------------------------------------------------------------
+//
+TVIMPSTEnums::TOnlineStatus CVIMPSTDetailsPresenceHandler::GetPresenceStatus()
+	{
+	if(!iUserId)
+	    {
+	    return TVIMPSTEnums::EUnknown;
+	    }
+	return iStatus;
+	}
+
+// --------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::GetHeaderLabelDataL
+// --------------------------------------------------------------------------
+//
+const TDesC& CVIMPSTDetailsPresenceHandler::GetHeaderLabelDataL( TInt aIndex )
+	{
+	TRACER_AUTO;
+	if( aIndex == 0 && iServiceName ) // first label data
+		{
+		return *iServiceName;
+		}
+	else if( aIndex == 2 && iPresenceSupported ) // second label data
+		{
+		return GetStatusTextL();
+		}
+	return KNullDesC; // return empty string for index 1 (label 2) for line in between the service name and presence
+	}
+
+// --------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::GetStatusMessageL
+// --------------------------------------------------------------------------
+//
+const TDesC& CVIMPSTDetailsPresenceHandler::GetStatusMessageL()
+	{
+	TRACER_AUTO;
+	if( iStatusMessage && iStatusMessage->Length() )
+		{
+		return *iStatusMessage;	
+		}
+	return GetStatusTextL();
+	}
+
+
+// --------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::IsSupported
+// --------------------------------------------------------------------------
+//
+TBool CVIMPSTDetailsPresenceHandler::IsSupported() const
+    {
+    return iPresenceSupported;
+    }
+ // --------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::GetStatusTextL
+// --------------------------------------------------------------------------
+//
+const TDesC& CVIMPSTDetailsPresenceHandler::GetStatusTextL()
+	{
+	TRACER_AUTO;
+	TInt resourceId =  R_SERVDETAIL_STATUSTEXT_OFFLINE;
+  
+	switch( iStatus )
+		{
+		case TVIMPSTEnums::EOffline:
+		    {
+		  	resourceId = R_SERVDETAIL_STATUSTEXT_OFFLINE;
+		    break;
+		    }
+		case TVIMPSTEnums::EBusy:
+		    {
+			resourceId = R_SERVDETAIL_STATUSTEXT_BUSY;
+		    break;
+		    }
+		case TVIMPSTEnums::EOnline:
+		    {
+		  	resourceId = R_SERVDETAIL_STATUSTEXT_ONLINE;
+		    break;
+		    }
+		case TVIMPSTEnums::EInvisible:
+		    {
+		  	resourceId = R_SERVDETAIL_STATUSTEXT_DND;
+		    break;
+		    }
+		case TVIMPSTEnums::EOnPhone:
+		    {
+		  	resourceId = R_SERVDETAIL_STATUSTEXT_ONTHEPHONE;
+		    break;
+		    }
+		case TVIMPSTEnums::EDoNotDisturb:
+		    {
+		  	resourceId = R_SERVDETAIL_STATUSTEXT_DND;
+		    break;
+		    }
+		case TVIMPSTEnums::EAway:
+		    {
+		   	resourceId = R_SERVDETAIL_STATUSTEXT_AWAY;
+		    break;
+		    }
+		case TVIMPSTEnums::EBlocked:
+		    {
+		    resourceId = R_SERVDETAIL_STATUSTEXT_BLOCKED;
+		    break;
+		    }
+	    case TVIMPSTEnums::EPending:
+	        {
+	        resourceId = R_SERVDETAIL_STATUSTEXT_PENDING;
+	        break;
+	        }
+	    case TVIMPSTEnums::ECallForward:
+	        {
+	        resourceId = R_SERVDETAIL_STATUSTEXT_CALLFORWARD;
+	        break;
+	        }	                
+		case TVIMPSTEnums::EUnknown:
+		case TVIMPSTEnums::EServiceOut:
+		default:
+		    {
+		    break;
+		    }
+		  }	
+	if( iStatusText )
+		{
+		delete iStatusText;
+		iStatusText = NULL;	
+		}
+	
+	if( CCoeEnv::Static() && TVIMPSTEnums::EServiceOut != iStatus 
+                            && TVIMPSTEnums::EUnknown != iStatus )
+		{
+		iStatusText = StringLoader::LoadL( resourceId );	
+		}
+	if( iStatusText )
+		{
+		return *iStatusText;	
+		}
+	return KNullDesC;
+	}
+
+// ---------------------------------------------------------------------------
+// CVIMPSTDetailsPresenceHandler::GetKeyFieldsAndValuesL
+// ---------------------------------------------------------------------------
+//
+void CVIMPSTDetailsPresenceHandler::GetKeyFieldsAndValuesL(MPresenceBuddyInfo2& aPresenceBuddyInfo)
+    {
+	TRACER_AUTO;
+    // At any point of time fro remote and blocked contact only one of the keys
+    // KPendingRequestExtensionValue/KBlockedExtensionValue will be assigned, and not both the keys.
+    TPtrC8 value = aPresenceBuddyInfo.GetAnyField( KExtensionKey() ) ;
+    if(value.Compare( KPendingRequestExtensionValue ) == 0)
+        {
+        iStatus = TVIMPSTEnums::EPending;
+        }
+    else if(value.Compare( KBlockedExtensionValue ) == 0)
+        {
+        iStatus  = TVIMPSTEnums::EBlocked;
+        }
+    else if(value.Compare( KServiceExtensionValue ) == 0)
+       {
+       iStatus  = TVIMPSTEnums::EServiceOut;
+       }
+    else if(value.Compare( KCallForwardExtensionValue ) == 0)
+       {
+        iStatus  = TVIMPSTEnums::ECallForward;
+        }
+	else
+		{
+		iStatus  = TVIMPSTEnums::EOffline;
+		}
+    }
+    
+// end of file
+
+
+