--- /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 <ximpobjectfactory.h>
+#include <imobjectfactory.h>
+#include <simplefactory.h>
+#include <imconversationinfo.h>
+#include <utf.h>
+#include <ximpprotocolconnectionhost.h>
+#include <protocolimdatahost.h>
+#include <protocolimconversationdatahost.h>
+#include <spsettings.h>
+#include <cch.h>
+#include <cimcachefactory.h>
+#include <mimcacheupdater.h>
+
+#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<CSimpleImConversation*>( 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