diff -r 2669f8761a99 -r fbd2e7cec7ef simpledatamodeladapter/simpleimplugin/src/simpleimconversation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/simpledatamodeladapter/simpleimplugin/src/simpleimconversation.cpp Wed Sep 01 12:23:14 2010 +0100 @@ -0,0 +1,487 @@ +/* +* Copyright (c) 2009 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: +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simpleimconversation.h" +#include "presenceplugincommon.h" +#include "mpresencepluginconnectionobs.h" +#include "simpleimplugindefs.h" +#include "simpleimlogger.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CPresencePluginGroups::CPresencePluginGroups +// --------------------------------------------------------------------------- +// +CSimpleImConversation::CSimpleImConversation( + MPresencePluginConnectionObs& aObs, MSimpleConnection& aConn, + TUint aServiceId ): + iConnectionObs( &aObs ), + iConnection( &aConn ), + iServiceId( aServiceId ) + { + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::NewL +// --------------------------------------------------------------------------- +// +CSimpleImConversation* CSimpleImConversation::NewL( + MPresencePluginConnectionObs& aObs, + MSimpleConnection& aConn, TUint aServiceId) + { + CSimpleImConversation* self = + new( ELeave ) CSimpleImConversation ( aObs, aConn, aServiceId ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::ConstructL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::ConstructL() + { + DP_IMP("CSimpleImConversation::ConstructL") + + iImHandler = TSimpleFactory::NewInstantMessageL( + *iConnection, *this ); + + iImCacheFactory = CIMCacheFactory::InstanceL(); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::~CSimpleImConversation +// --------------------------------------------------------------------------- +// +CSimpleImConversation::~CSimpleImConversation() + { + DP_IMP("CSimpleImConversation::~CSimpleImConversation") + + if ( iImHandler ) + { + DP_IMP("Close the msg handler") + iImHandler->Close(); + } + + // Release the imcache, all the conversation will lost here + if ( iImCacheFactory ) + { + DP_IMP("Release IM Cache") + CIMCacheFactory::Release(); + iImCacheFactory = NULL; + } + + iImCacheUpdater = NULL; + iHost = NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::SetHost +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::SetHost( MProtocolImDataHost& aHost ) + { + DP_IMP("CSimpleImConversation::SetHost") + + iHost = &aHost; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterface() +// --------------------------------------------------------------------------- +// +TAny* CSimpleImConversation::GetInterface( + TInt32 aInterfaceId, + TIfGetOps aOptions ) + { + DP_IMP("CSimpleImConversation::GetInterface") + + if ( MProtocolImConversation::KInterfaceId == aInterfaceId ) + { + return this; + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterface() const +// --------------------------------------------------------------------------- +// +const TAny* CSimpleImConversation::GetInterface( + TInt32 aInterfaceId, TIfGetOps aOptions ) const + { + DP_IMP("CSimpleImConversation::GetInterface") + + if ( MProtocolImConversation::KInterfaceId == aInterfaceId ) + { + // caller wants this interface + return const_cast( this ); + } + + if ( MXIMPBase::EPanicIfUnknown == aOptions ) + { + User::Panic( KSimpleImPluginName, KErrExtensionNotSupported ); + } + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::GetInterfaceId() const +// --------------------------------------------------------------------------- +// +TInt32 CSimpleImConversation::GetInterfaceId() const + { + DP_IMP("CSimpleImConversation::GetInterfaceId") + + return MProtocolImConversation::KInterfaceId; + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoSendMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoSendMessageL( + const MImConversationInfo& aImMessage, + TXIMPRequestId aReqId ) + { + DP_IMP( "CSimpleImConversation::DoSendMessageL" ) + + iCompleted = EFalse; + + TPtrC16 msgText16 = aImMessage.TextMessage(); + DP_IMP2( "CSimpleImConversation::DoSendMessageL, CONTENT: %S", + &msgText16 ) + HBufC8* contentData = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + msgText16 ); + CleanupStack::PushL( contentData ); + + const MDesCArray& recipients = aImMessage.RecipientL(); + for ( TInt i = 0; i < recipients.MdcaCount(); i++ ) + { + TPtrC16 recipientsPtr16 = recipients.MdcaPoint( i ); + HBufC8* recipientsData = CnvUtfConverter::ConvertFromUnicodeToUtf8L( + recipientsPtr16 ); + CleanupStack::PushL( recipientsData ); + DP_IMP2( "CSimpleImConversation::DoSendMessageL, RECIPIENT: %S", + &recipientsPtr16 ) + + TInt result = iImHandler->SendInstantMessage( *contentData, + *recipientsData ); + CleanupStack::PopAndDestroy( recipientsData ); + + if ( KErrInUse == result ) + { + User::Leave( KErrInUse ); + } + } + + CleanupStack::PopAndDestroy( contentData ); + iXimpId = aReqId; + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoForwardMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoForwardMessageL( + const MImConversationInfo& /*aImMessage*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoForwardMessageL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoSendMessageToGroupL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoSendMessageToGroupL( + const MImConversationInfo& /*aImMessage*/, + const TDesC* /*aGroupId*/, TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoSendMessageToGroupL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoBlockUsersL() +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimpleImConversation::DoBlockUsersL( + const MDesCArray* /*aUserIds*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoBlockUsersL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + return TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoUnBlockUsersL() +// --------------------------------------------------------------------------- +// +TXIMPRequestId CSimpleImConversation::DoUnBlockUsersL( + const MDesCArray* /*aUserIds*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoUnBlockUsersL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + return TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoGetBlockedListRequestL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoGetBlockedListRequestL( + const MXIMPIdentity& /*aImMessageId*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoGetBlockedListRequestL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoGetMessageListL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoGetMessageListL( + const MXIMPIdentity& /*aImMessageId*/, + const TDesC* /*aGroupId*/, + const TInt /*aMessageCount*/, + TBool /*aDeliveryReportWanted*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoGetMessageListL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MProtocolImConversation. +// CSimpleImConversation::DoRejectMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoRejectMessageL( + const MXIMPIdentity& /*aImMessageId*/, + const TDesC& /*aMessageID*/, + TXIMPRequestId /*aReqId*/ ) + { + DP_IMP( "CSimpleImConversation::DoRejectMessageL, NOT SUPPORTED" ) + + User::Leave( KErrNotSupported ); + } + + +// --------------------------------------------------------------------------- +// From MSimpleInstantMsgObserver. +// CSimpleImConversation::SendInstantMsgReqComplete() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::SendInstantMsgReqComplete( + TInt /*aOpid*/, TInt aStatus) + { + DP_IMP("CSimpleImConversation::SendInstantMsgReqComplete") + + CompleteXimpReq( aStatus ); + } + + +// --------------------------------------------------------------------------- +// From MSimpleInstantMsgObserver. +// CSimpleImConversation::HandleReceiveTextMessage() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::HandleReceiveTextMessage( + TPtrC8 aFrom, TPtrC8 aContent ) + { + DP_IMP( "CSimpleImConversation::HandleReceiveTextMessage" ) + + TRAPD( err, DoHandleReceiveTextMessageL( aFrom, aContent ) ) + + if ( KErrNone != err ) + { + // Do nothing + DP_IMP2( "CSimpleImConversation::HandleReceiveTextMessage, ERROR: %i", + err ) + } + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::CompleteXimpReq() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::CompleteXimpReq( TInt aStatus ) + { + DP_IMP( "CSimpleImConversation::CompleteXimpReq" ) + + if ( iCompleted ) + { + DP_IMP("CSimpleImConversation::CompleteXimpReq return") + return; + } + + iCompleted = ETrue; + iConnectionObs->CompleteReq( iXimpId, aStatus ); + iXimpId = TXIMPRequestId(); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::DoHandleReceiveTextMessageL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::DoHandleReceiveTextMessageL( TPtrC8 aFrom, + TPtrC8 aContent ) + { + DP_IMP( "CSimpleImConversation::DoHandleReceiveTextMessageL" ) + + CreateImCacheUpdaterIfNeededL(); + + if ( iHost ) + { + MXIMPObjectFactory& objFact = iConnectionObs->Host()->ObjectFactory(); + MImObjectFactory& imObjFact = iHost->ImObjectFactory(); + + MXIMPIdentity* identity = objFact.NewIdentityLC(); // CS:1 + MImConversationInfo* convinfo = imObjFact. + NewImConversationInfoLC(); // CS:2 + + HBufC16* sendername = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + aFrom ); + CleanupStack::PushL( sendername ); // CS:3 + identity->SetIdentityL( *sendername ); + CleanupStack::PopAndDestroy( sendername ); // CS:2 + convinfo->SetMessageIdL( identity ); + + HBufC16* messagecontent = CnvUtfConverter::ConvertToUnicodeFromUtf8L( + aContent ); + CleanupStack::PushL( messagecontent ); // CS:3 + convinfo->SetTextMessageL( *messagecontent ); + CleanupStack::PopAndDestroy( messagecontent ); // CS:2 + + iHost->ConversationDataHost().HandleNewTextMessageL( convinfo ); + TRAP_IGNORE( iImCacheUpdater->AppendReceiveMessageL( + identity->Identity(), convinfo->TextMessage() ) ); + + CleanupStack::Pop(); // CS:1 + CleanupStack::Pop(); // CS:0 + } + else + { + DP_IMP( " --> PROTOCOL IM DATA HOST IS NULL!" ) + } + } + +// --------------------------------------------------------------------------- +// CSimpleImConversation::ResolveUsernameL +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::ResolveUsernameL( + TUint aServiceId, RBuf& aUserName ) const + { + DP_IMP( "CSimpleImConversation::ResolveUsernameL" ) + + CCch* cchApi = CCch::NewLC(); + CCchService* service = cchApi->GetService( aServiceId ); + + User::LeaveIfError( service->GetConnectionParameter( + ECCHUnknown, ECchUsername, aUserName ) ); + + DP_IMP2( "CSimpleImConversation::ResolveUsernameL, USERNAME: %S", + &aUserName ) + + CleanupStack::PopAndDestroy( cchApi ); + } + + +// --------------------------------------------------------------------------- +// CSimpleImConversation::CreateImCacheUpdaterIfNeededL() +// --------------------------------------------------------------------------- +// +void CSimpleImConversation::CreateImCacheUpdaterIfNeededL() + { + if ( !iImCacheUpdater ) + { + DP_IMP( "CSimpleImConversation::CreateImCacheUpdaterIfNeededL," ) + DP_IMP( "CREATING UPDATER" ) + + RBuf username; + CleanupClosePushL( username ); + const TInt KMaxUserNameLength = 255; + username.CreateL( KMaxUserNameLength ); + ResolveUsernameL( iServiceId, username ); + + iImCacheUpdater = + iImCacheFactory->CreateUpdaterL( iServiceId, username, EFalse ); + CleanupStack::PopAndDestroy( &username ); + } + } + +// End of file