diff -r 2b7283837edb -r 3104fc151679 imstutils/imconversationview/imcvuiengine/src/cimcvenginemessagehandler.cpp --- a/imstutils/imconversationview/imcvuiengine/src/cimcvenginemessagehandler.cpp Thu Aug 19 09:41:53 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,958 +0,0 @@ -/* -* Copyright (c) 2007-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: message handler class implementation -* -*/ - -#include "cimcvenginemessagehandler.h" - -#include "mimcvenginechatinterface.h" -#include "mimcvenginemessageswriteinterface.h" -#include "imcvlogger.h" -#include "mimcvenginenewmessagehandler.h" -#include "imcvenginemessageutils.h" -#include "imcvuiliterals.h" - -// presence cache -#include - - -#include -#include -#include -#include -#include -#include -#include - -#include // KMaxDataTypeLength -#include // CnvUtfConverter - -// imcache related headers -#include -#include -#include - -#include -#include - -#include "cimcvengineopenchats.h" -#include "mimcvenginebuffermemoryhandler.h" -#include "cimcvenginestoragelistener.h" - -const TInt KMemorySafeValue = 1024; // One kbyte for safe memory allocation. - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::CIMCVEngineMessageHandler -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -CIMCVEngineMessageHandler::CIMCVEngineMessageHandler( MIMCVEngineChatInterface& aChatInterface, - MIMCVEngineMessageCreator& aMessageCreator, - MXIMPContext* aContext, - TInt aServiceId ) - : iMessageCreator( aMessageCreator ), - iChatInterface( aChatInterface ), - iContext(aContext), - iServiceId( aServiceId ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CIMCVEngineMessageHandler() start") ); - iPresenceStatus =EUnknown; // default status - iServiceName = NULL; - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CIMCVEngineMessageHandler() end") ); - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::~CIMCVEngineMessageHandler -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -CIMCVEngineMessageHandler::~CIMCVEngineMessageHandler() - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::~CIMCVEngineMessageHandler() start") ); - delete iStorageListener; - - iObserver = NULL; - delete iServiceName; - delete iPresenceCacheReader ; - if( iIMCacheUpdater ) - { - iIMCacheUpdater->UnRegisterObserver(*this); - } - if( iIMCacheFactory ) - { - CIMCacheFactory::Release(); - iIMCacheUpdater = NULL; - iIMCacheFactory = NULL; - } - if(iImFeatures ) - { - delete iImFeatures; - iImFeatures = NULL; - } - iHoldingMessages.Close(); - delete iOpenChats; - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::~CIMCVEngineMessageHandler() end") ); - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::NewL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -CIMCVEngineMessageHandler* CIMCVEngineMessageHandler::NewL( - MIMCVEngineChatInterface& aChatInterface, - MIMCVEngineMessageCreator& aMessageCreator, - MXIMPContext* aContext, - TInt aServiceId, - const TDesC& aOwnId) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::NewL() start") ); - CIMCVEngineMessageHandler* self = CIMCVEngineMessageHandler::NewLC( - aChatInterface, - aMessageCreator, - aContext, - aServiceId, - aOwnId ); - CleanupStack::Pop( self ); - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::NewL() end") ); - return self; - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::NewLC -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -CIMCVEngineMessageHandler* CIMCVEngineMessageHandler::NewLC( - MIMCVEngineChatInterface& aChatInterface, - MIMCVEngineMessageCreator& aMessageCreator, - MXIMPContext* aContext, - TInt aServiceId, - const TDesC& aOwnId) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::NewLC() start") ); - CIMCVEngineMessageHandler* self = new ( ELeave ) CIMCVEngineMessageHandler( - aChatInterface, - aMessageCreator, - aContext, - aServiceId ); - CleanupStack::PushL( self ); - self->ConstructL(aOwnId); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::NewLC() end") ); - return self; - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::ConstructL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::ConstructL( const TDesC& aOwnId ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ConstructL() start") ); - iStorageListener = CIMCVEngineStorageListener::NewL(*this); - // read the service name - ReadServiceNameL( iServiceId ); - // ximp im plugin - if (iContext) - { - iImFeatures = MImFeatures::NewL(iContext); - } - //initialize the presence cache. - iPresenceCacheReader = MPresenceCacheReader2::CreateReaderL(); - iPresenceCacheReader->SetObserverForSubscribedNotifications(this); - - // im cache factory - iIMCacheFactory = CIMCacheFactory::InstanceL(); - // im cache update interface - iIMCacheUpdater = iIMCacheFactory->CreateUpdaterL(iServiceId, aOwnId, ETrue );//registration required (ETrue). - iIMCacheUpdater->RegisterObserverL(*this); - - iOpenChats = CIMCVEngineOpenChats::NewL(*this, iChatInterface,iServiceId ); - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ConstructL() end") ); - } - -// --------------------------------------------------------- -// CIMCVEngineMessageHandler::ReadServiceNameL() -// --------------------------------------------------------- -// -void CIMCVEngineMessageHandler::ReadServiceNameL(TInt aServiceId ) - { - CSPSettings* settings = CSPSettings::NewLC(); - // read service name - CSPEntry* entry = CSPEntry::NewLC(); - settings->FindEntryL( aServiceId, *entry ) ; - - iServiceName = NULL; - iServiceName = entry->GetServiceName().AllocL(); - CleanupStack::PopAndDestroy(2); // entry, settings - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandleDeliveryReportL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::HandleDeliveryReportL(TXIMPRequestId aOperatioCode, TInt aResult) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandleDeliveryReportL() start") ); - - TInt holdingMessages = iHoldingMessages.Count(); - MIMCVEngineMessage* message = NULL; - // Check if holding messages hold one ready message - for(TInt index= 0 ; index < holdingMessages && !message; ++index ) - { - MIMCVEngineMessage* msg = iHoldingMessages[ index ]; - if( msg->OperationCode() == aOperatioCode ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler:: pending message index = %d "), index ); - message = msg; - if( aResult != KErrNone ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler:: message failed to deliver") ); - HandleMessageSentFailedL( *iHoldingMessages[ index ] ); - } - iHoldingMessages.Remove(index); - NotifyOperationCompletdL(message->MessagerType(), aResult ); - } - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandleDeliveryReportL() end") ); - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandleIMCacheMessageEventL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- - void CIMCVEngineMessageHandler::HandleConnectionEventL( TIMCVConnectionState aState, TInt aReason ) - { - if( iObserver ) - { - iObserver->HandleConnectionEventL( iServiceId, aState, aReason ); - } - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandleIMCacheMessageEventL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::HandleIMCacheEventL(TIMCacheEventType aEvent, TAny* aChatMessage ) - { - switch (aEvent) - { - case EIMCacheNewMessage: - { - if (!aChatMessage) - { - return; - } - SIMCacheMessageData* chatMesssge = static_cast( aChatMessage ) ; - - MIMCVEngineMessage::TMessageType messageType = GetEngineMessageType( chatMesssge->iMessageType ) ; - MIMCVEngineMessage::TMessagerType messagerType = GetEngineMessagerType( chatMesssge->iMessagerType ); - MIMCVEngineMessage::TContentType contentType = GetEngineContentType( chatMesssge->iContentType ) ; - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandleIMCacheMessageEventL() Msg ") ); - - TTime time = chatMesssge->iTime; - - TPtrC buddyId = chatMesssge->iBuddyId->Des(); - - if ( buddyId != KNullDesC ) - { - - if( !iChatInterface.MemoryHandler().FreeMemoryIfNeededL( KMemorySafeValue + chatMesssge->iText->Size() ) ) - { - //NotifyMessageError( KErrNoMemory, NULL ); - User::Leave( KErrNoMemory ); - } - } - - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandleIMCacheMessageEventL() Msg %S"), &buddyId ); - - - MIMCVEngineMessageCreator::SMessageData data = - { - KMessageDataVersion, - KNullDesC, - buddyId, - chatMesssge->iText->Des(), - contentType, - messagerType - }; - MIMCVEngineMessageWriteInterface& messageContainer = - iChatInterface.MessageWriteInterfaceL(iServiceId, buddyId ); - - MIMCVEngineMessage* message = iMessageCreator.CreateMessageL( data ); - message->SetTimeStamp(time); - - // Add message - IMCVEngineMessageUtils::AppendMessageWithDateStampL( - *message, - messageContainer, - iMessageCreator ); - - - break; - } - case EIMCacheNewChat: - { - if (!aChatMessage) - { - return; - } - - SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; - - iStorageListener->GetContactLinkInfoL( chatItem->iServiceId,*(chatItem->iBuddyId)); - - - MIMCVEngineMessageReadInterface& messageContainer = - iChatInterface.MessageReadInterfaceL( chatItem->iServiceId, - chatItem->iBuddyId->Des() ); - break; - } - case EIMCacheChatClosed: - { - if (!aChatMessage) - { - return; - } - SIMCacheChatItem* chatItem = static_cast( aChatMessage ) ; - iChatInterface.DeleteChatL( chatItem->iServiceId, chatItem->iBuddyId->Des() ); - break; - } - case EIMCacheAllChatClosed: - { - IM_CV_LOGS (TXT("CIMCVEngineMessageHandler :: HandleChatList Event AL CHAT DELETED")); - iChatInterface.CloseAllContainers(); - break; - } - case EIMCacheRequestCompleted : - { - NotifyOperationCompletdL(MIMCVEngineMessage::EMessageStarted, KErrNone ) ; - break; - } - default: - break; - - } - - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::GetEngineMessageType -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -MIMCVEngineMessage::TMessageType CIMCVEngineMessageHandler::GetEngineMessageType(TIMCacheMessageType aType ) - { - MIMCVEngineMessage::TMessageType messageType = MIMCVEngineMessage::EMessageInvalid; - switch( aType ) - { - case EIMCMessagePTOP: - { - messageType = MIMCVEngineMessage::EMessagePTOP; - break; - } - case EIMCMessageSystem: - { - messageType = MIMCVEngineMessage::EMessageSystem; - break; - } - default : - { - break; - } - } - return messageType; - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::GetEngineMessagerType -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -MIMCVEngineMessage::TMessagerType CIMCVEngineMessageHandler::GetEngineMessagerType(TIMCacheMessagerType aType ) - { - MIMCVEngineMessage::TMessagerType messagerType = MIMCVEngineMessage::EMessageOther; - switch( aType ) - { - case EIMCMessageSent: - { - messagerType = MIMCVEngineMessage::EMessageSent; - break; - } - case EIMCMessageReceived: - { - messagerType = MIMCVEngineMessage::EMessageReceived; - break; - } - default : - { - break; - } - } - return messagerType; - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::GetEngineContentType -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -MIMCVEngineMessage::TContentType CIMCVEngineMessageHandler::GetEngineContentType(TIMCacheContentType aType ) - { - MIMCVEngineMessage::TContentType contentType = MIMCVEngineMessage::EContentInvalid; - switch( aType ) - { - case EIMCContentText: - { - contentType = MIMCVEngineMessage::EContentText; - break; - } - case EIMCContentOther: - { - contentType = MIMCVEngineMessage::EContentOther; - break; - } - default : - { - break; - } - } - return contentType; - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::MessageCreator -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -MIMCVEngineMessageCreator& CIMCVEngineMessageHandler::MessageCreator() const - { - return iMessageCreator; - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::StartNewConversationL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::StartNewConversationL(const TDesC& aRecipientId ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::StartNewConversationL() start") ); - if(iIMCacheUpdater) - { - iIMCacheUpdater->StartNewConversationL(aRecipientId); - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::StartNewConversationL() end") ); - } - - //----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::CloseConversationL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -TInt CIMCVEngineMessageHandler::CloseConversationL(const TDesC& aBuddyId ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseConversationL() start ") ); - if(iIMCacheUpdater) - { - iIMCacheUpdater->CloseConversationL( aBuddyId );; - } - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseConversation () %S ************"), &aBuddyId); - UnSubscribePresenceL (aBuddyId); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseConversationL() end ") ); - return KErrNone; - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::CloseAllConversationL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::CloseAllConversationL() - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseAllConversationL() start") ); - iPresenceStatus = EOffline; - if(iIMCacheUpdater ) - { - iIMCacheUpdater->CloseAllConversationL(); - } - TInt count = iOpenChats->Count (); - - for (TInt i = 0; i < count; i++) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseAllConversationL() CLOSING %d, CHAT ************"), i ); - UnSubscribePresenceL (iOpenChats->GetTargetIdL (i)); - } - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::CloseAllConversationL() end") ); - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::DeactivateConversationL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -TInt CIMCVEngineMessageHandler::DeactivateConversationL() - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::DeactivateConversation()") ); - if(iIMCacheUpdater) - { - return iIMCacheUpdater->DeactivateConversationL(); - } - return KErrNone; - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::SendMessage -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::SendMessageL(MIMCVEngineMessage& message ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SendMessageL() start") ); - if(iContext == NULL || iImFeatures == NULL) - { - return; - } - - MXIMPObjectFactory& objFactory = iContext->ObjectFactory(); - MImConversation& imconversation = iImFeatures->ImConversation(); - - MImConversationInfo* imMessage = iImFeatures->ImObjectFactory().NewImConversationInfoLC(); - - MXIMPIdentity* identity = objFactory.NewIdentityLC(); - identity->SetIdentityL( KMsgId ); - - imMessage->SetMessageIdL(identity); - - imMessage->SetTextMessageL( message.Text() ); - - CDesCArrayFlat* recipients = new ( ELeave )CDesCArrayFlat( 2 ); - CleanupStack::PushL( recipients); //userid's - recipients->AppendL( message.Recipient() ); - - imMessage->SetRecipientL(recipients); - - TXIMPRequestId reqId = imconversation.SendMessageL(*imMessage); - // must set operation code - message.SetOperationCode(reqId); - // must append message to holding until it get delivered - iHoldingMessages.Append( &message ); - - CleanupStack::PopAndDestroy();// recipients - // ownership is transfer to ximpfw - CleanupStack::Pop(); //identity - CleanupStack::PopAndDestroy();//imMessage - - if(iIMCacheUpdater) - { - iIMCacheUpdater->AppendSendMessageL( message.Text() ); - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SendMessageL() end") ); - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::AppendToCacheL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::AppendToCacheL(const TDesC& aBuddyId, const TDesC& aTextMessage ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::AppendToCacheL() start") ); - if(iIMCacheUpdater) - { - iIMCacheUpdater->AppendMessageL(aBuddyId, aTextMessage ); - } - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::AppendToCacheL() End") ); - } - //----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandleMessageSentFailedL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::HandleMessageSentFailedL( MIMCVEngineMessage& aMessage ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageCreator::HandleMessageSentFailedL() end") ); - MIMCVEngineMessage* failMessage = - iMessageCreator.CreateFailedMessageL( &aMessage ); - CleanupDeletePushL( failMessage ); - MIMCVEngineMessageWriteInterface& messageContainer = - iChatInterface.MessageWriteInterfaceL( - 0, - aMessage.Recipient() ); - CleanupStack::Pop( failMessage ); - messageContainer.AppendL( failMessage ); - - // text will be Failed:text - if(iIMCacheUpdater) - { - iIMCacheUpdater->AppendSendMessageL( failMessage->Text() ); - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageCreator::HandleMessageSentFailedL() end") ); - } - //----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::NotifyOperationCompletdL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- - void CIMCVEngineMessageHandler::NotifyOperationCompletdL(MIMCVEngineMessage::TMessagerType aType , TInt aResult ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageCreator::NotifyOperationCompletdL() start") ); - if( iObserver ) - { - iObserver->HandleOperationCompletdL(iServiceId, aType, aResult ); - } - IM_CV_LOGS(TXT("CIMCVEngineMessageCreator::NotifyOperationCompletdL() end") ); - } - //----------------------------------------------------------------------------- -// CIMCVEngineMessageContainer::ResetContextL -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::ResetContextL(MXIMPContext* aContext) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ResetContextL() start") ); - iContext = NULL; - iContext = aContext; - if(iContext) - { - delete iImFeatures; - iImFeatures = NULL; - iImFeatures = MImFeatures::NewL(iContext); - } - else - { - if( iIMCacheUpdater ) - { - iIMCacheUpdater->UnRegisterObserver(*this); - } - if( iIMCacheFactory ) - { - CIMCacheFactory::Release(); - iIMCacheUpdater = NULL; - iIMCacheFactory = NULL; - } - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ResetContextL() end") ); - } - - -void CIMCVEngineMessageHandler::UnSubscribePresenceL(const TDesC& aRecipientId) -{ - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::UnSubscribePresenceL() start %S"), &aRecipientId); - if( !iServiceName ) - { - return; - } - iPresenceStatus = EUnknown; // default status - - HBufC* name = HBufC::NewLC( aRecipientId.Length() + iServiceName->Length() + KCVColon().Length() ); - TPtr namePtr( name->Des() ); - namePtr.Zero(); - - // append the service name followed by user id ,seperated by colon - namePtr.Append(*iServiceName); - namePtr.Append(KCVColon); - namePtr.Append(aRecipientId); - - - IM_CV_LOGS(TXT("***************CIMCVEngineMessageHandler::UnSubscribePresenceL() %S ***************************"), &(name->Des ())); - // subscribe for presence change notification - iPresenceCacheReader->UnSubscribePresenceBuddyChangeL(*name); - - CleanupStack::PopAndDestroy(); // name - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::UnSubscribePresenceL() End") ); -} - -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::SubscribePresenceL -// --------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::SubscribePresenceL(const TDesC& aRecipientId) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SubscribePresenceL() start %S"), &aRecipientId ); - if( !iServiceName ) - { - return; - } - iPresenceStatus = EUnknown; // default status - - HBufC* name = HBufC::NewLC( aRecipientId.Length() + iServiceName->Length() + KCVColon().Length() ); - TPtr namePtr( name->Des() ); - namePtr.Zero(); - - // append the service name followed by user id ,seperated by colon - namePtr.Append(*iServiceName); - namePtr.Append(KCVColon); - namePtr.Append(aRecipientId); - - // read the cache status - ReadPresenceStatusL( *name ); - - IM_CV_LOGS(TXT("***************CIMCVEngineMessageHandler::SubscribePresenceL() %S ***************************"), &(name->Des ())); - // subscribe for presence change notification - iPresenceCacheReader->SubscribePresenceBuddyChangeL(*name); - - CleanupStack::PopAndDestroy(); // name - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SubscribePresenceL() End") ); - } -//----------------------------------------------------------------------------- -// CIMCVEngineMessageContainer::SetPresenceObserver -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::SetObserver( MIMCVEngineMessageHandlerObserver* aObserver ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SetPresenceObserver() start") ); - iObserver = NULL; - iObserver = aObserver; - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::SetPresenceObserver() end") ); - } - -//----------------------------------------------------------------------------- -// CIMCVEngineMessageContainer::RemovePresenceObserver -// ( Other items commented in header ) -//----------------------------------------------------------------------------- -void CIMCVEngineMessageHandler::RemoveObserver() - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::RemovePresenceObserver() start") ); - iObserver = NULL; - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::RemovePresenceObserver() end") ); - } -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::ReadPresenceStatusL -// --------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::ReadPresenceStatusL(const TDesC& aIdentity ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ReadPresenceStatusL() start") ); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ReadPresenceStatusL() : buddy Id = %s"), &aIdentity ); - MPresenceBuddyInfo2* presenceInfo = iPresenceCacheReader->PresenceInfoLC( aIdentity ); //pushed into cleanup stack - if( presenceInfo ) - { - MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = presenceInfo->Availability(); - TPtrC availabilityText = presenceInfo->AvailabilityText(); - iPresenceStatus = ConvertPresenceCacheEnums( availabilityEnum ,availabilityText ); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ReadPresenceStatusL():ConvertPresenceCacheEnums: %d"),iPresenceStatus); - if(EUnknown ==iPresenceStatus) - { - GetKeyFiledsAndValuesL(*presenceInfo); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ReadPresenceStatusL()::GetKeyFiledsAndValuesL: %d"),iPresenceStatus); - } - CleanupStack::PopAndDestroy(); //presenceInfo - } - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ReadPresenceStatusL() End") ); - } - -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandlePresenceReadL -// --------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::HandlePresenceReadL(TInt /*aErrorCode*/, - RPointerArray& /*aPresenceBuddyInfoList*/) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceReadL() start") ); - // this is notification for all budy presence - // not interested for all - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceReadL() End") ); - } -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::HandlePresenceNotificationL -// --------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::HandlePresenceNotificationL(TInt /*aErrorCode*/, - MPresenceBuddyInfo2* aPresenceBuddyInfo ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceNotificationL() start") ); - - if ( aPresenceBuddyInfo ) - { - CleanupDeletePushL( aPresenceBuddyInfo ); - TPtrC xspId = aPresenceBuddyInfo->BuddyId(); - // extract user id from xsp id - TPtrC userId = xspId.Right(xspId.Length() - iServiceName->Length() - KCVColon().Length() ); - - // read the availability /presence state enum value - MPresenceBuddyInfo2::TAvailabilityValues availabilityEnum = aPresenceBuddyInfo->Availability(); - TPtrC availabilityText = aPresenceBuddyInfo->AvailabilityText(); - iPresenceStatus = ConvertPresenceCacheEnums( availabilityEnum ,availabilityText); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceNotificationL() : status = %d "), iPresenceStatus); - if(EUnknown == iPresenceStatus) - { - GetKeyFiledsAndValuesL(*aPresenceBuddyInfo); - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceNotificationL():GetKeyFiledsAndValuesL : status = %d "), iPresenceStatus); - } - // check if the display is already there, - // else get it from the servicetab - MIMCVEngineMessageReadInterface& readContainer = - iChatInterface.MessageReadInterfaceL(iServiceId, userId ); - IM_CV_LOGS(TXT(" CIMCVEngineMessageHandler::HandlePresenceNotificationL() before if") ); - if(readContainer.DisplayName().Length() == 0) - { - - // before informing ui about the hnages, - // create the chat if it is already not created, - // hence we can always have the first name and the contact link before ui gets notified. - IM_CV_LOGS(TXT("1 CIMCVEngineMessageHandler::HandlePresenceNotificationL() before call GetContactLinkInfoL") ); - iStorageListener->GetContactLinkInfoL( iServiceId,userId ); - IM_CV_LOGS(TXT(" CIMCVEngineMessageHandler::HandlePresenceNotificationL() after call GetContactLinkInfoL uid = %S"),&userId ); - - } - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceNotificationL::GetContactLinkInfoL() End ") ); - if( iObserver ) - { - iObserver->HandlePresenceChangedL( iServiceId, userId ); - } - CleanupStack::PopAndDestroy(); // aPresenceBuddyInfo - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::HandlePresenceNotificationL() End ") ); - } - -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::ConvertStringToStatus -// --------------------------------------------------------------------------- -// -TIMCVOnlineStatus CIMCVEngineMessageHandler::ConvertPresenceCacheEnums(MPresenceBuddyInfo2::TAvailabilityValues aAvailabilityEnum ,TPtrC aAvailabilityText) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ConvertStringToStatus() Start ") ); - - // convert the presence cache enums to conversation view enumvalues - // by default if the enum doesnot match then its TVIMPSTEnums::UnKnown - TIMCVOnlineStatus status; - switch( aAvailabilityEnum ) - { - case MPresenceBuddyInfo2::EBusy: - { - status = EBusy; - if(0==aAvailabilityText.Compare(KAwayState)) - { - status = EAway; - } - if(0==aAvailabilityText.Compare(KOnPhoneState)) - { - status = EOnPhone; - } - if(0==aAvailabilityText.Compare(KDndState)) - { - status = EDoNotDisturb; - } - break; - } - case MPresenceBuddyInfo2::EAvailable: - { - status = EOnline; - break; - } - case MPresenceBuddyInfo2::ENotAvailable: - { - status = EOffline; - break; - } - case MPresenceBuddyInfo2::EUnknownAvailability: - { - status = EUnknown; - if(0==aAvailabilityText.Compare(KInvisibleState)) - { - status = EInvisible; - } - break; - } - default: - { - status = EUnknown; - break; - } - } - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::ConvertStringToStatus() End ") ); - return status; - } - -// --------------------------------------------------------- -// CIMCVEngineMessageHandler::GetPresenceStatus -// -// --------------------------------------------------------- -TIMCVOnlineStatus CIMCVEngineMessageHandler::GetPresenceStatus() - { - // current presence status - return iPresenceStatus; - } - -// --------------------------------------------------------- -// CIMCVEngineMessageHandler::GetChatListL -// -// --------------------------------------------------------- -RArray CIMCVEngineMessageHandler::GetChatListL( TInt aServiceId ) - { - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::StartNewConversationL() start") ); - - IM_CV_LOGS(TXT("CIMCVEngineMessageHandler::StartNewConversationL() end") ); - - return iIMCacheUpdater->GetChatListL(aServiceId); - - } - -// --------------------------------------------------------- -// CIMCVEngineMessageHandler::OpenChats -// -// --------------------------------------------------------- -CIMCVEngineOpenChats& CIMCVEngineMessageHandler::OpenChats() - { - return *iOpenChats; - } - - -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::GetKeyFiledsAndValuesL -// --------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::GetKeyFiledsAndValuesL(MPresenceBuddyInfo2& aPresenceBuddyInfo) - { - TPtrC8 value = aPresenceBuddyInfo.GetAnyField( KExtensionKey()); - // 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. - if(value.Compare( KPendingRequestExtensionValue) == 0 ) - { - iPresenceStatus = EPending; - } - else if(value.Compare( KBlockedExtensionValue ) == 0 ) - { - iPresenceStatus = EBlock; - } - else if(value.Compare( KServiceExtensionValue ) == 0) - { - iPresenceStatus = EServiceOut; - } - else if(value.Compare( KCallForwardExtensionValue ) == 0) - { - iPresenceStatus = ECallForward; - } - } -// --------------------------------------------------------------------------- -// CIMCVEngineMessageHandler::ServiceId -// --------------------------------------------------------------------------- -// -TInt CIMCVEngineMessageHandler::ServiceId() const - { - return iServiceId; - } - -// ----------------------------------------------------------------------------- -// CIMCVEngineMessageHandler: HandleServiceBuddyDetailsFetchedL -// ----------------------------------------------------------------------------- -// -void CIMCVEngineMessageHandler::HandleServiceBuddyDetailsFetchedL(TInt aServiceId, - const TDesC& aXspId, - const TDesC8 & aContactLink, - const TDesC & aDisplayName ) - { - IM_CV_LOGS(TXT("HandleServiceBuddyDetailsFetchedL Start") ); - IM_CV_LOGS(TXT("HandleServiceBuddyDetailsFetchedL aName= %S"),&aDisplayName ); - IM_CV_LOGS(TXT("HandleServiceBuddyDetailsFetchedL aLink= %S"),&aContactLink); - MIMCVEngineMessageWriteInterface& messageContainer = - iChatInterface.MessageWriteInterfaceL(aServiceId, aXspId, aDisplayName, aContactLink ); - messageContainer.SetNameL(aDisplayName); - messageContainer.SetLinkL(aContactLink); - IM_CV_LOGS(TXT("HandleServiceBuddyDetailsFetchedL End") ); - } - // end of file - -