RCS IM Library - Initial implementation
authorshivsood
Fri, 08 Oct 2010 18:07:26 +0530
changeset 0 59dfe4ae66d0
child 1 6bb5c618bd31
RCS IM Library - Initial implementation
commonimlib/bwins/commonimlibu.def
commonimlib/commonimlib.pro
commonimlib/eabi/commonimlibu.def
commonimlib/inc/chatimplfactory.h
commonimlib/inc/chatinterfaces.h
commonimlib/inc/imlib_common.h
commonimlib/inc/immanagerfactory.h
commonimlib/src/chatimplfactory.cpp
rcsimengine/inc/chatcontactmanager.h
rcsimengine/inc/chatcontactmanagerimpl_sym.h
rcsimengine/inc/chatinterfaces.h
rcsimengine/inc/chatsession.h
rcsimengine/inc/chatsessionimpl_sym.h
rcsimengine/inc/msrpchatsessiondata_sym.h
rcsimengine/inc/rcschatengine_globals.h
rcsimengine/inc/rcsimmanagerfactory.h
rcsimengine/rcsimengine.pro
rcsimengine/src/chatcontactmanager.cpp
rcsimengine/src/chatcontactmanagerimpl_sym.cpp
rcsimengine/src/chatsession.cpp
rcsimengine/src/chatsessionimpl_sym.cpp
rcsimengine/src/rcsimmanagerfactory.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/bwins/commonimlibu.def	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,27 @@
+EXPORTS
+	?getStaticMetaObject@MChatSessionIntf@RcsIMLib@@SAABUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const & RcsIMLib::MChatSessionIntf::getStaticMetaObject(void)
+	?sessionTerminated@MChatContactManagerIntf@RcsIMLib@@IAEXIPAVMChatSessionIntf@2@@Z @ 2 NONAME ; void RcsIMLib::MChatContactManagerIntf::sessionTerminated(unsigned int, class RcsIMLib::MChatSessionIntf *)
+	?trUtf8@MChatSessionIntf@RcsIMLib@@SA?AVQString@@PBD0@Z @ 3 NONAME ; class QString RcsIMLib::MChatSessionIntf::trUtf8(char const *, char const *)
+	?errorMessage@MChatSessionIntf@RcsIMLib@@IAEXVQString@@@Z @ 4 NONAME ; void RcsIMLib::MChatSessionIntf::errorMessage(class QString)
+	?trUtf8@MChatContactManagerIntf@RcsIMLib@@SA?AVQString@@PBD0H@Z @ 5 NONAME ; class QString RcsIMLib::MChatContactManagerIntf::trUtf8(char const *, char const *, int)
+	?newChatData@MChatSessionIntf@RcsIMLib@@IAEXVQString@@@Z @ 6 NONAME ; void RcsIMLib::MChatSessionIntf::newChatData(class QString)
+	?tr@MChatContactManagerIntf@RcsIMLib@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString RcsIMLib::MChatContactManagerIntf::tr(char const *, char const *, int)
+	?staticMetaObject@MChatContactManagerIntf@RcsIMLib@@2UQMetaObject@@B @ 8 NONAME ; struct QMetaObject const RcsIMLib::MChatContactManagerIntf::staticMetaObject
+	?trUtf8@MChatContactManagerIntf@RcsIMLib@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString RcsIMLib::MChatContactManagerIntf::trUtf8(char const *, char const *)
+	?tr@MChatSessionIntf@RcsIMLib@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString RcsIMLib::MChatSessionIntf::tr(char const *, char const *, int)
+	?sessionEstablised@MChatContactManagerIntf@RcsIMLib@@IAEXIPAVMChatSessionIntf@2@@Z @ 11 NONAME ; void RcsIMLib::MChatContactManagerIntf::sessionEstablised(unsigned int, class RcsIMLib::MChatSessionIntf *)
+	?qt_metacast@MChatSessionIntf@RcsIMLib@@UAEPAXPBD@Z @ 12 NONAME ; void * RcsIMLib::MChatSessionIntf::qt_metacast(char const *)
+	?incomingChatSession@MChatContactManagerIntf@RcsIMLib@@IAEXIVQString@@0I@Z @ 13 NONAME ; void RcsIMLib::MChatContactManagerIntf::incomingChatSession(unsigned int, class QString, class QString, unsigned int)
+	?metaObject@MChatSessionIntf@RcsIMLib@@UBEPBUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const * RcsIMLib::MChatSessionIntf::metaObject(void) const
+	?qt_metacall@MChatSessionIntf@RcsIMLib@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int RcsIMLib::MChatSessionIntf::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?trUtf8@MChatSessionIntf@RcsIMLib@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString RcsIMLib::MChatSessionIntf::trUtf8(char const *, char const *, int)
+	?tr@MChatContactManagerIntf@RcsIMLib@@SA?AVQString@@PBD0@Z @ 17 NONAME ; class QString RcsIMLib::MChatContactManagerIntf::tr(char const *, char const *)
+	?metaObject@MChatContactManagerIntf@RcsIMLib@@UBEPBUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const * RcsIMLib::MChatContactManagerIntf::metaObject(void) const
+	?getStaticMetaObject@MChatContactManagerIntf@RcsIMLib@@SAABUQMetaObject@@XZ @ 19 NONAME ; struct QMetaObject const & RcsIMLib::MChatContactManagerIntf::getStaticMetaObject(void)
+	?qt_metacall@MChatContactManagerIntf@RcsIMLib@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 20 NONAME ; int RcsIMLib::MChatContactManagerIntf::qt_metacall(enum QMetaObject::Call, int, void * *)
+	?additionalInfo@MChatSessionIntf@RcsIMLib@@IAEXVQString@@@Z @ 21 NONAME ; void RcsIMLib::MChatSessionIntf::additionalInfo(class QString)
+	?qt_metacast@MChatContactManagerIntf@RcsIMLib@@UAEPAXPBD@Z @ 22 NONAME ; void * RcsIMLib::MChatContactManagerIntf::qt_metacast(char const *)
+	?staticMetaObject@MChatSessionIntf@RcsIMLib@@2UQMetaObject@@B @ 23 NONAME ; struct QMetaObject const RcsIMLib::MChatSessionIntf::staticMetaObject
+	?tr@MChatSessionIntf@RcsIMLib@@SA?AVQString@@PBD0@Z @ 24 NONAME ; class QString RcsIMLib::MChatSessionIntf::tr(char const *, char const *)
+	?createIMManager@ChatImplFactory@@SAPAVMChatContactManagerIntf@RcsIMLib@@VQString@@@Z @ 25 NONAME ; class RcsIMLib::MChatContactManagerIntf * ChatImplFactory::createIMManager(class QString)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/commonimlib.pro	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,48 @@
+#
+#Copyright (c) 2009-2010 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:
+# RCS IM Library - Initial version
+#
+#
+
+TEMPLATE = lib
+TARGET = commonimlib
+
+QT += core 
+
+DEPENDPATH +=   ./inc \
+                ./src
+
+DEFINES += COMMONIMLIB_BUILD
+
+INCLUDEPATH += ./inc
+INCLUDEPATH += ../epoc32/include/app
+
+HEADERS += inc/chatimplfactory.h \ 
+    inc/chatinterfaces.h \
+    inc/immanagerfactory.h \
+	inc/imlib_common.h
+
+SOURCES += src/chatimplfactory.cpp
+
+symbian: { 
+	TARGET.CAPABILITY += All -Tcb
+    TARGET.UID3 = 0xE41BBB83
+    TARGET.EPOCALLOWDLLDATA=1
+    :BLD_INF_RULES.prj_exports += "inc/chatimplfactory.h APP_LAYER_PLATFORM_EXPORT_PATH(chatimplfactory.h)"
+    :BLD_INF_RULES.prj_exports += "inc/chatinterfaces.h APP_LAYER_PLATFORM_EXPORT_PATH(chatinterfaces.h)"
+    :BLD_INF_RULES.prj_exports += "inc/imlib_common.h APP_LAYER_PLATFORM_EXPORT_PATH(imlib_common.h)"
+    :BLD_INF_RULES.prj_exports += "inc/immanagerfactory.h APP_LAYER_PLATFORM_EXPORT_PATH(immanagerfactory.h)"    
+}
+
+win32:include(commonimlib_installs_win32.pri)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/eabi/commonimlibu.def	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,23 @@
+EXPORTS
+	_ZN15ChatImplFactory15createIMManagerE7QString @ 1 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf11newChatDataE7QString @ 2 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf11qt_metacastEPKc @ 4 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf12errorMessageE7QString @ 5 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf14additionalInfoE7QString @ 6 NONAME
+	_ZN8RcsIMLib16MChatSessionIntf16staticMetaObjectE @ 7 NONAME DATA 16
+	_ZN8RcsIMLib16MChatSessionIntf19getStaticMetaObjectEv @ 8 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf11qt_metacallEN11QMetaObject4CallEiPPv @ 9 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf11qt_metacastEPKc @ 10 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf16staticMetaObjectE @ 11 NONAME DATA 16
+	_ZN8RcsIMLib23MChatContactManagerIntf17sessionEstablisedEjPNS_16MChatSessionIntfE @ 12 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf17sessionTerminatedEjPNS_16MChatSessionIntfE @ 13 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf19getStaticMetaObjectEv @ 14 NONAME
+	_ZN8RcsIMLib23MChatContactManagerIntf19incomingChatSessionEj7QStringS1_j @ 15 NONAME
+	_ZNK8RcsIMLib16MChatSessionIntf10metaObjectEv @ 16 NONAME
+	_ZNK8RcsIMLib23MChatContactManagerIntf10metaObjectEv @ 17 NONAME
+	_ZTIN8RcsIMLib16MChatSessionIntfE @ 18 NONAME
+	_ZTIN8RcsIMLib23MChatContactManagerIntfE @ 19 NONAME
+	_ZTVN8RcsIMLib16MChatSessionIntfE @ 20 NONAME
+	_ZTVN8RcsIMLib23MChatContactManagerIntfE @ 21 NONAME
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/inc/chatimplfactory.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial Version
+*
+*/
+
+#ifndef __CHAT_IMPL_FACTORY__
+#define __CHAT_IMPL_FACTORY__
+
+#include "imlib_common.h"
+#include <QString>
+
+namespace RcsIMLib
+{
+	class MChatContactManagerIntf;
+}
+
+class COMMONIMLIB_EXPORT ChatImplFactory
+{
+	public:
+	static RcsIMLib::MChatContactManagerIntf* createIMManager(QString protocol);
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/inc/chatinterfaces.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,109 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+#ifndef __CHATINTERFACES_H__
+#define __CHATINTERFACES_H__
+
+#include <QObject>
+#include <QString>
+#include <QList>
+#include <qcontactid.h>
+#include "qmobilityglobal.h"
+#include <imlib_common.h>
+
+QTM_BEGIN_NAMESPACE
+class QContact;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+namespace RcsIMLib
+{
+
+typedef unsigned int QChatContactId;
+typedef unsigned int RcsChatId;
+
+/*
+ * Manages creation of a new session, notification for incoming
+ * session, closing the session. Also manages sending of
+ * IM Message, and notification of incoming message,
+ * and error notification.
+ */
+class MChatSessionIntf;
+
+/* Manages fetching and Managing of contacts for
+ * chat. The APIs allow for fetching of the list
+* of contacts and also their presence information.
+ * Also the status message can be filled up if supported.
+ */
+class COMMONIMLIB_EXPORT MChatContactManagerIntf: public QObject
+{
+	Q_OBJECT
+	public:
+	/* Also APIs need to be there for setting status message,
+	 * and presence info etc */
+
+	virtual RcsChatId createChatSession(QContactLocalId contactId, QString initMsg)=0;
+	virtual void closeSession(RcsChatId sessID)=0;
+	virtual void acceptIncomingSession(RcsChatId sessID)=0;
+	
+signals:
+    void incomingChatSession(QContactLocalId aMyBuddyID, QString incomingSipUri, QString initMsg, RcsIMLib::RcsChatId sessID);
+    void sessionEstablised(RcsIMLib::RcsChatId sessID,  RcsIMLib::MChatSessionIntf* chatSession);
+    void sessionTerminated(RcsIMLib::RcsChatId sessID,  RcsIMLib::MChatSessionIntf* chatSession);
+
+};
+
+/* The interface used to initiate a chat session with a 
+ * particular contact.
+ * The ChatSessionManager is symbolised by an instance of MChatInterface
+ */
+class COMMONIMLIB_EXPORT MChatSessionIntf: public QObject
+{
+	Q_OBJECT
+	public:
+
+	/* Creates a chat session with the specified contact.
+	 * If the session creation was successful the MChatSessionManagerIntf
+	 * returned will be a valid pointer.
+	 */
+	virtual bool sendChatData(QString newChatData)=0;
+    virtual bool endChatSession()=0;
+
+	//Dirty APIs :(
+	//Use this API to set any Platform Parameters
+	virtual void setPlatformParams(void *apPlatFormParam)=0;
+	//Get the Platform implementations
+	virtual void* getPlatformImpl()=0;
+
+	signals:
+	void newChatData(QString newChatData);
+	/* Notifies of error and the appropriate error
+	 * string */
+    void errorMessage(QString errorString);
+	/* Additional info such as,
+	 * User is typing a message etc,
+	 * The same will be reset by giving an empty string
+	 * when appropriate.*/
+	void additionalInfo(QString additionalInfo);
+
+
+};
+
+} //namespace
+
+#endif //__CHATINTERFACES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/inc/imlib_common.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+#ifndef __COMMON_IMLIB_H__
+#define __COMMON_IMLIB_H__
+
+#include <QtCore/QtGlobal>
+
+#if defined(COMMONIMLIB_BUILD)
+#define COMMONIMLIB_EXPORT Q_DECL_EXPORT
+#else
+#define COMMONIMLIB_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/inc/immanagerfactory.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __IMMANAGER_FACTORY__
+#define __IMMANAGER_FACTORY__
+
+#include <QString>
+#include <QtPlugin>
+
+namespace RcsIMLib
+{
+	class MChatContactManagerIntf;
+}
+
+class IMManagerFactory
+{
+	public:
+		virtual RcsIMLib::MChatContactManagerIntf* createIMManager()=0;
+		virtual QString protocol()=0;
+};
+
+Q_DECLARE_INTERFACE(IMManagerFactory, "com.nokia.qt.Plugin.IMManagerFactory/1.0");
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commonimlib/src/chatimplfactory.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,58 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#include "chatinterfaces.h"
+#include "immanagerfactory.h"
+#include "chatimplfactory.h"
+#include <QtPlugin>
+#include <QDir>
+#include <QLibraryInfo>
+#include <QPluginLoader>
+#include <QCoreApplication>
+
+RcsIMLib::MChatContactManagerIntf* ChatImplFactory::createIMManager(QString protocol)
+{
+#ifdef Q_OS_SYMBIAN
+    QDir pluginsDir = QLibraryInfo::location(QLibraryInfo::PluginsPath) + "/IMLIB";
+#else
+    QDir pluginsDir = QCoreApplication::applicationDirPath() + "/resource/qt/plugins/IMLIB";
+#endif
+	/* Now doing a dirty implementation.
+	 * The real thing to do is parse manifests and compare each plugin for
+	 * the protocol string 
+	 */
+	IMManagerFactory* imManagerFact=0;
+    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) 
+	{
+        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
+        QObject *plugin = pluginLoader.instance();
+        if (plugin) 
+	    {
+           imManagerFact = qobject_cast<IMManagerFactory *>(plugin);
+           if (imManagerFact && imManagerFact->protocol()==protocol)
+		   {
+		   RcsIMLib::MChatContactManagerIntf* imManager = imManagerFact->createIMManager();
+			   //delete imManagerFact;
+               return imManager;
+		   }
+		   //delete imManagerFact;
+		   imManagerFact = 0;
+        }	
+	}
+	return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/chatcontactmanager.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,44 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __CHATCONTACT_MANAGER_H__
+#define __CHATCONTACT_MANAGER_H__
+
+#include "chatinterfaces.h"
+//#include "rcschatengine_globals.h"
+
+class ChatContactManagerImpl;
+
+/* Interface implementation of MChatContactIntf
+ */
+class ChatContactManager: public RcsIMLib::MChatContactManagerIntf
+{
+	Q_OBJECT
+	public:
+		ChatContactManager();
+		~ChatContactManager();
+		RcsIMLib::RcsChatId createChatSession(QContactLocalId contactId, QString initMsg);
+		void closeSession(RcsIMLib::RcsChatId sessID);
+		void acceptIncomingSession(RcsIMLib::RcsChatId sessID);
+		
+	
+	private:
+		ChatContactManagerImpl *mpImpl;
+		friend class ChatContactManagerImpl;
+};
+
+#endif //__CHATCONTACT_MANAGER_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/chatcontactmanagerimpl_sym.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __CHATCONTACT_MANAGER_IMPL_SYM_H__
+#define __CHATCONTACT_MANAGER_IMPL_SYM_H__
+
+
+#include <QObject>
+#include <QList>
+#include "chatinterfaces.h"
+#include "qmobilityglobal.h"
+#include "qcontactfilter.h"
+#include "qcontactdetailfilter.h"
+#include "qtcontactsglobal.h"
+
+
+//SIP and MCE Specific Headers
+#include <e32base.h>
+#include <e32std.h>
+#include <e32math.h>
+#include <s32mem.h>
+#include <in_sock.h>
+#include <badesca.h>
+#include <e32cmn.h>
+#include <mcesessionobserver.h>
+#include <mcemanager.h>
+#include <mcetransactiondatacontainer.h>
+#include <mcemessagestream.h>
+#include <mceexternalsource.h>
+#include <mceexternalsink.h>
+#include <mcemessagesink.h>
+#include <mcemessagesource.h>
+#include <mcemsrpsource.h>
+#include <mcemsrpsink.h>
+#include <mceoutsession.h>
+#include <mceinsessionobserver.h>
+#include <mceinsession.h>
+#include <mceDataSinkObserver.h>
+#include <qcontactmanager.h>
+
+
+//Profile agent, SIP stack inclusions
+#include <sipprofileregistryobserver.h>
+#include <sipprofile.h>
+#include <sip.h>
+#include <sipobserver.h>
+
+//#include "rcschatengine_globals.h"
+
+class TMsrpChatSession;
+class CContactItem;
+class ChatContactManager;
+class ContactView;
+
+
+
+QTM_BEGIN_NAMESPACE
+class QContact;
+class QContactDetailFilterPrivate;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE 
+
+const TInt KGranularity = 12;
+const TInt KAcceptSize = 24;
+/* Interface implementation of MChatContactIntf */
+class ChatContactManagerImpl:   public QObject,
+                                public MMceSessionObserver, 
+                                public MSIPProfileRegistryObserver,  // for CSIPProfileRegistry
+                                public MSIPObserver, // for CSIP
+                                public MMceInSessionObserver, // for incoming sessions from MCE
+                                public MMceDataSinkObserver
+                      
+{
+ public:
+	ChatContactManagerImpl(ChatContactManager *apCntManager);
+	~ChatContactManagerImpl();
+	
+	
+		
+	/* Setup MCE Manager */		
+	RcsIMLib::RcsChatId createChatSession(QContactLocalId contactId, QString initMsg);	
+	void closeSession(RcsIMLib::RcsChatId sessID);
+	void acceptIncomingSession(RcsIMLib::RcsChatId sessID);
+	
+	
+	// From MMceSessionObserver
+	void SessionStateChanged(CMceSession& aSession, TMceTransactionDataContainer* aContainer);
+	void SessionConnectionStateChanged(CMceSession& aSession, TBool aActive );
+	void Failed( CMceSession& aSession, TInt aError );
+    void UpdateFailed(CMceSession& aSession, TMceTransactionDataContainer* aContainer );
+    
+	// From MSIPProfileAgentObserver
+    void ProfileRegistryEventOccurred(TUint32 aProfileId, TEvent aEvent);
+	void ProfileRegistryErrorOccurred(TUint32 aProfileId, TInt aError);
+	        
+	// From MSIPObserver
+    void IncomingRequest(TUint32 aIapId, CSIPServerTransaction* aTransaction);
+    void TimedOut(CSIPServerTransaction& aTransaction); 
+
+    // From MMceInSessionObserver
+    void IncomingSession(CMceInSession* aSession, TMceTransactionDataContainer* aContainer );
+	void IncomingUpdate(CMceSession& aOrigSession, CMceInSession* aUpdatedSession, TMceTransactionDataContainer* aContainer );	        
+	void DataReceived(CMceMediaStream& aStream,CMceMediaSink& aSink, const TDesC8& aData);
+
+ private:
+     void setupMceManagerL();
+     RcsIMLib::RcsChatId createChatSessionL(QContactLocalId contactId, QString initMsg);
+     void GetStreams(CMceSession& aSession, CMceMessageStream*& aUplinkStr, CMceMessageStream*& aDownlinkStr );
+	
+ private:     
+	//Variables here
+	QContactManager                    *mManager;
+	ChatContactManager                 *mParent;    
+	//SYM Specific Headers
+	CMceManager                        *mMceMgr;
+	CSIP                               *mSip;
+	CSIPProfileRegistry                *mProfileReg;
+	CSIPProfile                        *mProfile;
+	RPointerArray<CMceSession>         mMceSessions;
+	RPointerArray<TMsrpChatSession>    mChatSessionArray;
+	TMceTransactionDataContainer       mDataContainer;
+	RPointerArray<CSIPProfile>         mAllprofiles;
+	//QList<QContact>                    mAllContacts;
+	//QList<QContact>                    mAllSIPContacts;
+	//QContactLocalId                    mMyID;
+	//QContactLocalId                    mMyBuddyID;
+	//QString                            mMyFirstName;
+	//QContactDetailFilter               mFilter;
+	HBufC8                             *mOriginatorUri;
+	
+
+};
+#endif //__CHATCONTACT_MANAGER_IMPL_SYM_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/chatinterfaces.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,112 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+
+/* A set of interfaces to be implemented by providers for chat application.
+ */
+
+#ifndef __CHATINTERFACES_H__
+#define __CHATINTERFACES_H__
+
+#include <QObject>
+#include <QString>
+#include <QList>
+#include <qcontactid.h>
+
+
+QTM_BEGIN_NAMESPACE
+class QContact;
+QTM_END_NAMESPACE
+
+QTM_USE_NAMESPACE
+
+namespace RcsIMLib
+{
+
+typedef unsigned int RcsChatId;
+
+/*
+ * Manages creation of a new session, notification for incoming
+ * session, closing the session. Also manages sending of
+ * IM Message, and notification of incoming message,
+ * and error notification.
+ */
+class MChatSessionIntf;
+
+/* Manages fetching and Managing of contacts for
+ * chat. The APIs allow for fetching of the list
+* of contacts and also their presence information.
+ * Also the status message can be filled up if supported.
+ */
+class MChatContactManagerIntf: public QObject
+{
+	Q_OBJECT
+	public:
+	/* Also APIs need to be there for setting status message,
+	 * and presence info etc */
+
+	virtual RcsChatId createChatSession(QContactLocalId contactId, QString initMsg)=0;
+	virtual void closeSession(RcsChatId sessID)=0;
+	virtual void acceptIncomingSession(RcsChatId sessID)=0;
+	
+signals:
+    void incomingChatSession(QContactLocalId aMyBuddyID, QString incomingSipUri, QString initMsg, RcsIMLib::RcsChatId sessID);
+    void sessionEstablised(RcsIMLib::RcsChatId sessID,  RcsIMLib::MChatSessionIntf* chatSession);
+    void sessionTerminated(RcsIMLib::RcsChatId sessID,  RcsIMLib::MChatSessionIntf* chatSession);
+
+};
+
+/* The interface used to initiate a chat session with a 
+ * particular contact.
+ * The ChatSessionManager is symbolised by an instance of MChatInterface
+ */
+class MChatSessionIntf: public QObject
+{
+	Q_OBJECT
+	public:
+
+	/* Creates a chat session with the specified contact.
+	 * If the session creation was successful the MChatSessionManagerIntf
+	 * returned will be a valid pointer.
+	 */
+	virtual bool sendChatData(QString newChatData)=0;
+    virtual bool endChatSession()=0;
+
+	//Dirty APIs :(
+	//Use this API to set any Platform Parameters
+	virtual void setPlatformParams(void *apPlatFormParam)=0;
+	//Get the Platform implementations
+	virtual void* getPlatformImpl()=0;
+
+	signals:
+	void newChatData(QString newChatData);
+	/* Notifies of error and the appropriate error
+	 * string */
+    void errorMessage(QString errorString);
+	/* Additional info such as,
+	 * User is typing a message etc,
+	 * The same will be reset by giving an empty string
+	 * when appropriate.*/
+	void additionalInfo(QString additionalInfo);
+
+
+};
+
+} //namespace
+
+#endif //__CHATINTERFACES_H__
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/chatsession.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,50 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __CHATSESSIONMANAGER_H__
+#define __CHATSESSIONMANAGER_H__
+
+#include "chatinterfaces.h"
+//#include "rcschatengine_globals.h"
+
+class ChatSessionImpl;
+
+class ChatSession:public RcsIMLib::MChatSessionIntf
+{
+	Q_OBJECT
+	public:
+	ChatSession();
+	
+	
+	/* Close the session */
+	bool endChatSession();
+   	bool sendChatData(QString newChatData);
+
+   	
+	void setPlatformParams(void *apPlatFormParam);
+
+	//Get the Platform implementations
+	void* getPlatformImpl();
+	
+	
+	private:
+	ChatSessionImpl *mpImpl;	
+	friend class ChatSessionImpl;
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/chatsessionimpl_sym.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,59 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __CHATSESSION_IMPL_SYM_H__
+#define __CHATSESSION_IMPL_SYM_H__
+
+#include <QTimer>
+#include "chatinterfaces.h"
+#include "chatsession.h"
+//#include "rcschatengine_globals.h"
+
+class TMsrpChatSession;
+class CMceMessageSource;
+class TDesC8;
+
+
+class ChatSessionImpl: public QObject
+{
+	Q_OBJECT
+	public:
+	ChatSessionImpl(ChatSession *apParent);
+   	
+	/* Close the session */
+    bool endChatSession();
+    
+    bool sendChatData(QString newChatData);
+
+    
+    //****************
+	void setPlatformParams(void *apPlatFormParam);
+
+	//Get the Platform implementations
+	void* getPlatformImpl();
+	void  incomingData(const TDesC8& aData);
+
+
+	ChatSession *mParent;
+	TMsrpChatSession* mMsrpChatSessionData;
+	CMceMessageSource* mMessageSource;
+	
+
+};
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/msrpchatsessiondata_sym.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,39 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __MSRP_CHATSESSIONDATA_SYM_H__
+#define __MSRP_CHATSESSIONDATA_SYM_H__
+
+//#include "rcschatengine_globals.h"
+
+class CMceMediaStream;
+class CMceSession;
+class CMceMediaStream;
+class ChatSession;
+
+class TMsrpChatSession
+{
+	public:
+	CMceManager *iMceManager;
+	CMceSession *iMceSession;
+	ChatSession *iChatSession;
+	CMceMediaStream *iStream1;
+	CMceMediaStream *iStream2;
+	QString          iInitMsg;
+};
+
+#endif //__MSRP_CHATSESSIONDATA_SYM_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/rcschatengine_globals.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,35 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef RCSCHATENGINE_GLOBAL_H
+#define RCSCHATENGINE_GLOBAL_H
+
+#include <Qt/qglobal.h>
+
+
+#ifdef RCSCHATENGINE_LIB
+    #define RCSCHATENGINE_EXPORT Q_DECL_EXPORT
+#else
+    #ifdef RCSCHATENGINE_TEST
+        #define RCSCHATENGINE_EXPORT
+    #else
+        #define RCSCHATENGINE_EXPORT Q_DECL_IMPORT
+    #endif  
+#endif
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/inc/rcsimmanagerfactory.h	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#ifndef __RCS_IMMANAGER_FACTORY_H__
+#define __RCS_IMMANAGER_FACTORY_H__
+
+#include "immanagerfactory.h"
+
+class RcsIMManagerFactory: public QObject, public IMManagerFactory
+{
+
+	Q_INTERFACES(IMManagerFactory)
+	public:
+		virtual RcsIMLib::MChatContactManagerIntf* createIMManager();
+		virtual QString protocol();
+};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/rcsimengine.pro	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2009-2010 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:
+# RCS IM Library - Initial version
+
+
+TEMPLATE = lib
+TARGET = symmsrpplugin
+CONFIG += plugin
+CONFIG += hb
+QT += core
+
+HEADERS +=     ./inc/*.h
+SOURCES +=     ./src/*.cpp
+INCLUDEPATH += ../epoc32/include/app
+INCLUDEPATH += ../commonimlib/inc
+
+# LIBS += -lxqservice
+LIBS += -lInetProtUtil.dll \
+        -lbafl.dll \
+        -lecom.dll \
+        -lesock.dll \
+        -lsipclient.dll \
+        -lsipcodec.dll \
+        -lsipprofile.dll \
+        -lsipprofilecli.dll \
+        -lmceclient.dll \
+        -linsock.dll \
+        -lsdpcodec.dll \
+        -lcntmodel.dll \
+        -lcommonimlib \ 
+        -lqtcontacts \
+		
+TARGET.CAPABILITY += All \
+    -Tcb
+symbian: { 
+    TARGET.UID3 = 0xE41BBB83
+    :BLD_INF_RULES.prj_exports += "inc/chatcontactmanager.h APP_LAYER_PLATFORM_EXPORT_PATH(chatcontactmanager.h)"
+    :BLD_INF_RULES.prj_exports += "inc/chatcontactmanagerimpl_sym.h APP_LAYER_PLATFORM_EXPORT_PATH(chatcontactmanagerimpl_sym.h)"
+    :BLD_INF_RULES.prj_exports += "inc/chatsession.h APP_LAYER_PLATFORM_EXPORT_PATH(chatsession.h)"
+}
+symbian:include(symmsrpplugin_installs_sym.pri)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/src/chatcontactmanager.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#include "chatcontactmanager.h"
+
+#ifdef Q_OS_SYMBIAN
+#include "chatcontactmanagerimpl_sym.h"
+#endif
+
+using namespace RcsIMLib;
+
+ChatContactManager::ChatContactManager()
+{
+	mpImpl = new ChatContactManagerImpl(this);
+}
+
+ChatContactManager::~ChatContactManager()
+    {
+    delete mpImpl;
+    }
+
+RcsIMLib::RcsChatId ChatContactManager::createChatSession(QContactLocalId contactId, QString initMsg)
+{
+    return mpImpl->createChatSession(contactId, initMsg);
+}
+
+void ChatContactManager::closeSession(RcsIMLib::RcsChatId sessID)
+{
+    mpImpl->closeSession(sessID);
+}
+
+void ChatContactManager::acceptIncomingSession(RcsIMLib::RcsChatId sessID)
+{
+    mpImpl->acceptIncomingSession(sessID);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/src/chatcontactmanagerimpl_sym.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,610 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+
+#include <cntdb.h>
+#include <cntfield.h>
+#include <cntitem.h>
+#include <cntfldst.h>
+#include <qcontactmanager.h>
+#include <qcontact.h>
+#include <qcontactdetails.h>
+#include "chatsession.h"
+#include "chatcontactmanager.h"
+#include "chatcontactmanagerimpl_sym.h"
+#include "chatsessionimpl_sym.h"
+#include "msrpchatsessiondata_sym.h"
+#include <chatinterfaces.h>
+#include <sipprofileregistry.h>
+#include <mcesession.h>
+#include "qcontactfilter.h"
+
+using namespace RcsIMLib;
+
+
+ChatContactManagerImpl::ChatContactManagerImpl(ChatContactManager *apCntManager):mParent(apCntManager),mProfile(NULL)
+{
+    QT_TRAP_THROWING(setupMceManagerL());
+    mManager = new QContactManager("symbian");
+	
+	QContact  self = mManager->contact(mManager->selfContactId());
+	//mMyID = self.localId();
+	
+	// To get Self SIP Uri.
+	QContactDetail selfContactDetail = self.detail(QContactOnlineAccount::DefinitionName);
+	const QContactOnlineAccount &onlineUrl = static_cast<const QContactOnlineAccount &>(selfContactDetail);
+	QString selfSipUri = onlineUrl.accountUri();
+	TPtrC16 dataPtr(reinterpret_cast<const TUint16*>(selfSipUri.utf16()));
+	mOriginatorUri = HBufC8::NewL(dataPtr.Length());
+	mOriginatorUri->Des().Copy(dataPtr);
+			
+}
+
+
+ChatContactManagerImpl::~ChatContactManagerImpl()
+    {
+
+    for(int i=0;i<mMceSessions.Count();i++)
+        {
+        
+        int mSessionState =  mMceSessions[i]->State();
+        
+        if (mSessionState <= CMceSession::EEstablished)
+            mMceSessions[i]->TerminateL(0,0,0);
+             
+        }
+    
+    mMceSessions.ResetAndDestroy();//deletes streams, sources and sinks
+    mMceSessions.Close();
+    mChatSessionArray.ResetAndDestroy();
+    mChatSessionArray.Close();
+    delete mManager;
+    delete mMceMgr;
+    
+    //delete mProfile;
+    mAllprofiles.ResetAndDestroy();
+    mAllprofiles.Close();
+    
+    delete mProfileReg;
+    delete mSip;
+    delete mOriginatorUri;
+    
+    }
+
+void ChatContactManagerImpl::closeSession(RcsChatId sessID)
+{
+    
+    CMceSession *currentSession = reinterpret_cast<CMceSession*>(sessID);
+    
+    int mSessionState =  currentSession->State();
+           
+    if (mSessionState == CMceSession::EEstablished)
+        currentSession->TerminateL();
+    
+    //remove and close
+    
+    TInt idx = mMceSessions.Find(currentSession);
+    if (idx != KErrNotFound)
+        {
+        delete currentSession;
+        mMceSessions.Remove(idx);    
+        }
+    
+    for(int i=0;i<mChatSessionArray.Count();i++)
+        {
+           if(mChatSessionArray[i]->iMceSession == currentSession)
+               {
+               delete mChatSessionArray[i];
+               mChatSessionArray.Remove(i);
+               break;
+               }
+        }
+ }
+
+void ChatContactManagerImpl::acceptIncomingSession(RcsChatId sessID)
+{    
+    CMceInSession *currentSession = reinterpret_cast<CMceInSession*>(sessID);
+     if (currentSession->State() == CMceSession::EProceeding)
+      {
+         currentSession->AcceptL();
+      }           
+ }
+
+
+
+RcsIMLib::RcsChatId ChatContactManagerImpl::createChatSession(QContactLocalId contactId, QString initMsg)
+{
+    RcsIMLib::RcsChatId id = 0;
+    QT_TRAP_THROWING(id = createChatSessionL(contactId, initMsg));
+    //QT_TRYCATCH_ERROR(id = createChatSessionL(contactId, initMsg));
+    return id;
+}
+
+
+RcsIMLib::RcsChatId ChatContactManagerImpl::createChatSessionL(QContactLocalId contactId, QString initMsg)
+{             
+    // To get recipient SIP Uri.
+    const QContact buddy = mManager->contact(contactId);
+    QContactDetail buddyContactDetail = buddy.detail(QContactOnlineAccount::DefinitionName);
+    const QContactOnlineAccount &onlineUrl = static_cast<const QContactOnlineAccount &>(buddyContactDetail);
+    QString buddySipUri = onlineUrl.accountUri();
+    TPtrC16 dataPtr(reinterpret_cast<const TUint16*>(buddySipUri.utf16()));
+    HBufC8 *recipientUri = HBufC8::NewL(dataPtr.Length());
+    CleanupStack::PushL(recipientUri);
+    recipientUri->Des().Copy(dataPtr);
+    
+    CMceOutSession *outSess ;
+    if(mProfile)
+        {
+        outSess = CMceOutSession::NewL(*mMceMgr, *mProfile, *recipientUri);
+        }
+    else
+        {        
+        outSess = CMceOutSession::NewL(*mMceMgr, 1,*mOriginatorUri, *recipientUri); 
+        }        
+    CleanupStack::PopAndDestroy(recipientUri);
+    CleanupStack::PushL(outSess);
+    
+    /* Add the out session to the list of MCESessions */
+    mMceSessions.Append(outSess);
+    CleanupStack::Pop(outSess);
+
+    /* Streams Creation */
+    // Create the stream for UpLink and Downlink
+    CMceMessageStream* msgStrmUp = CMceMessageStream::NewL();
+    CleanupStack::PushL(msgStrmUp);
+    
+    // Message Source
+    CMceMessageSource* messageSrc = CMceMessageSource::NewL(*mMceMgr);  
+    CleanupStack::PushL(messageSrc);  
+    
+    //MSRP Sink
+    CMceMsrpSink* msrpSink = CMceMsrpSink::NewL();
+    CleanupStack::Pop(messageSrc);
+    CleanupStack::PushL(msrpSink);
+    CleanupStack::PushL(messageSrc);
+    msgStrmUp->SetSourceL(messageSrc);
+    CleanupStack::Pop(messageSrc);
+
+    // Add sink  to the stream
+    msgStrmUp->AddSinkL(msrpSink);
+    CleanupStack::Pop(msrpSink);
+    msgStrmUp->ConnectionSetUpL(CMceMessageStream::EActive);
+
+    // Set AcceptTypes
+    CDesC8ArrayFlat *acceptTypes = new(ELeave)CDesC8ArrayFlat(KGranularity);
+    _LIT8(KtextPlain,"text/plain");   
+    acceptTypes->AppendL(KtextPlain);    
+
+    msrpSink->SetAcceptTypesL(*acceptTypes);
+    delete acceptTypes;
+
+    _LIT8(KAcceptWrap, "acceptwrap");
+    TBuf8<KAcceptSize> accept(KAcceptWrap);
+    msrpSink->SetAcceptWrappedTypesL(accept);
+
+
+    //outSess->AddStreamL(msgStrmUp);
+    CleanupStack::Pop(msgStrmUp);
+
+
+    // Create the stream for Downlink
+    CMceMessageStream *msgStrmDown = CMceMessageStream::NewL();
+
+    // MSRP Source
+    CMceMsrpSource *msrpSrc = CMceMsrpSource::NewL();
+
+    // Message Sink
+    CMceMessageSink* messageSink = CMceMessageSink::NewL(*mMceMgr);
+    CleanupStack::PushL(msrpSrc);
+    msgStrmDown->SetSourceL(msrpSrc);
+    CleanupStack::Pop(msrpSrc);
+
+    // Add sink  to the stream
+    CleanupStack::PushL(messageSink);
+    msgStrmDown->AddSinkL(messageSink);
+    CleanupStack::Pop(messageSink);
+    msgStrmDown->ConnectionSetUpL(CMceMessageStream::EActive);
+
+    CleanupStack::PushL(msgStrmUp);
+    msgStrmDown->BindL(msgStrmUp);
+    CleanupStack::Pop(msgStrmUp);
+
+    CleanupStack::PushL(msgStrmDown);
+    outSess->AddStreamL(msgStrmDown);
+    CleanupStack::Pop(msgStrmDown);
+    
+    /* A new Chat Session with the Platform specific Init Params */
+    ChatSession *chatSession = new ChatSession();
+
+    /* Create the ChatSession here */
+    TMsrpChatSession *msrpChatSession = new TMsrpChatSession();
+    msrpChatSession->iMceManager = mMceMgr;
+    msrpChatSession->iMceSession = outSess;
+    msrpChatSession->iChatSession = chatSession;
+    msrpChatSession->iStream1 = msgStrmUp;
+    msrpChatSession->iStream2 = msgStrmDown;
+
+    //chatSession->setPlatformParams(msrpChatSession);
+
+    mChatSessionArray.Append(msrpChatSession);
+
+
+    //Start the session establishment here. Emit the signal when everything is
+    //done. The session will be matched my the ID returned.
+    //RcsChatId sessID = (RcsChatId)&outSess;
+    
+    
+    //Create the CDesC8Array with the syntax of the subject header and pass it 
+    //such that the INVITE is constructed with Subject header.
+    
+    CDesC8ArrayFlat *mSIPHeaders = new CDesC8ArrayFlat(20);
+    QString mSubjectHeader = "Subject:"+ initMsg;
+    TPtrC16 mDataPtr(reinterpret_cast<const TUint16*>(mSubjectHeader.utf16()));
+    RBuf8 mChatData;
+    mChatData.Create(300);
+    mChatData.Copy(mDataPtr);
+    
+    mSIPHeaders->AppendL(mChatData);
+    outSess->EstablishL(0,mSIPHeaders,0,0,0);                                                                                                                                                                                                                                                                                                                                                  
+
+    return reinterpret_cast<RcsChatId>(outSess);
+}
+
+void ChatContactManagerImpl::setupMceManagerL()
+{
+    //RFileLogger::Write( KLogDir1, KLogFile1, EFileLoggingModeAppend, _L("setupMceManagerL ChkPt 0") );
+    //Setup MCE For accepting and receiving chat messages
+    mMceMgr = CMceManager::NewL(TUid::Uid(0x10009388), &mDataContainer);
+
+    // Set session observer to get the session related state changes
+    mMceMgr->SetSessionObserver(this);    
+
+    // Set InSession Observer to recieve the incoming session
+    mMceMgr->SetInSessionObserver(this);
+    mMceMgr->SetDataSinkObserver(this);
+
+    TUid appUid;
+    
+    appUid.iUid = 0xA00001EC; //TODO get APPUID Correct
+    TRAPD(errsip, mSip = CSIP::NewL(appUid , *this))
+    //TRAPD(errsip, mSip = CSIP::NewL(TUid::Null(), *this))
+    if (!errsip) {
+        //CleanupStack::PushL(sipClient);
+        mProfileReg = CSIPProfileRegistry::NewL(*mSip, *this);
+        //CleanupStack::Pop(mSip);
+    }
+    
+    //assumes first profile is registered and valid    
+    //CleanupStack::PushL(profileReg);
+    //mProfile = profileReg->DefaultProfileL();
+    
+        
+    //later check for tag matches
+    
+    
+    mProfileReg->ProfilesL(mAllprofiles);
+    if (mAllprofiles.Count())
+    {     
+        mProfile = mAllprofiles[0];
+    }
+    
+    //CleanupStack::PopAndDestroy(profileReg);
+    //CleanupStack::PopAndDestroy(sipClient);
+}
+
+
+void ChatContactManagerImpl::SessionStateChanged( CMceSession& aSession, TMceTransactionDataContainer* aContainer)
+{
+    if (aSession.State() == CMceSession::EEstablished)
+    {       
+        
+        CMceMessageStream* downlinkStr = NULL;
+        CMceMessageStream* uplinkStr = NULL;
+        
+        GetStreams(aSession, uplinkStr, downlinkStr );
+                               
+        if (uplinkStr && uplinkStr->Source() &&
+                uplinkStr->Source()->Type() == KMceMessageSource)
+            {
+            uplinkStr->Source()->DisableL();
+            if (!uplinkStr->Source()->IsEnabled())
+                uplinkStr->Source()->EnableL();
+            }
+        
+        if (downlinkStr && downlinkStr->Sinks().Count() > 0)
+            {
+            // assume only one sink is added
+            downlinkStr->Sinks()[0]->DisableL();
+            if (! downlinkStr->Sinks()[0]->IsEnabled() )
+            downlinkStr->Sinks()[0]->EnableL();
+            }
+        
+        for(int i=0;i<mChatSessionArray.Count();i++)
+            {
+               if(mChatSessionArray[i]->iMceSession == &aSession)
+                   {
+                   mChatSessionArray[i]->iStream1 = uplinkStr;
+                   mChatSessionArray[i]->iStream2 = downlinkStr;
+                   mChatSessionArray[i]->iChatSession->setPlatformParams(mChatSessionArray[i]);
+                   break;
+                   }
+            }
+        
+       
+/*  //can be terminated without establishment
+        // A new Chat Session with the Platform specific Init Params 
+        ChatSession *chatSession = new ChatSession();
+
+         //Create the ChatSession here 
+        TMsrpChatSession *msrpChatSession = new TMsrpChatSession();
+        msrpChatSession->iMceManager = mMceMgr;
+        msrpChatSession->iMceSession = &aSession;
+        msrpChatSession->iChatSession = chatSession;
+        msrpChatSession->iStream1 = uplinkStr;
+        msrpChatSession->iStream2 = downlinkStr;
+
+        chatSession->setPlatformParams(msrpChatSession);
+
+        mChatSessionArray.Append(msrpChatSession);
+*/
+
+        /* Notify the UI that Session is established. Pointer to aSession
+         * serves as the key */
+        for(int i=0;i<mChatSessionArray.Count();i++)
+            {
+               if(mChatSessionArray[i]->iMceSession == &aSession)
+                   {
+                   emit mParent->sessionEstablised(reinterpret_cast<RcsChatId>(&aSession), mChatSessionArray[i]->iChatSession); 
+                   break;
+                   }
+            }
+        
+        
+    }
+    else if (aSession.State() == CMceSession::EProceeding)
+    {
+    //get originator
+    const TDesC8& remoteURI = aSession.Originator();
+    const QString remoteSIPURI = QString::fromUtf8((const char*)remoteURI.Ptr(),remoteURI.Length());
+    
+    //Pass the remote sip uri as a filter and fetch the buddy name. 
+    //Also emit a signal here for incomingChatSession with the contactID 
+
+    // To fetch the buddy name using the sip URI.
+    QList<QContactSortOrder> order;
+    QStringList list;
+    QContactDetailFilter filter;
+    filter.setDetailDefinitionName(QContactOnlineAccount::DefinitionName, QContactOnlineAccount::SubTypeSip);
+    filter.setValue(remoteSIPURI);
+    
+    QList<QContact> allContacts;
+    allContacts = mManager->contacts(filter);
+    unsigned int buddyID = 0;
+    if(allContacts.count())
+        {
+        buddyID = allContacts[0].localId();
+        }
+  
+    QString imMsg;
+	
+
+    for(int i=0;i<mChatSessionArray.Count();i++)
+    {
+       if(mChatSessionArray[i]->iMceSession == &aSession)
+           {
+           imMsg = mChatSessionArray[i]->iInitMsg;
+           break;
+           }
+    }
+    
+     
+    //emit on SSC to proceeding as a result of call to updateL //see insession header
+    //emit after update or could lead to accept call before update, little chance as user interaction involved
+    emit mParent->incomingChatSession(buddyID, remoteSIPURI, imMsg, reinterpret_cast<RcsChatId>(&aSession));
+    }
+    else if (aSession.State() == CMceSession::ETerminated)
+    {
+        for(int i=0;i<mChatSessionArray.Count();i++)
+        {
+           if(mChatSessionArray[i]->iMceSession == &aSession)
+               {
+               emit mParent->sessionTerminated(reinterpret_cast<RcsChatId>(&aSession), mChatSessionArray[i]->iChatSession);
+               break;
+               }
+        }
+    
+    }
+}
+
+
+
+void ChatContactManagerImpl::SessionConnectionStateChanged( CMceSession& , TBool /*aActive*/ )
+{
+}
+
+void ChatContactManagerImpl::Failed( CMceSession& /*aSession*/, TInt /*aError*/ )
+{
+}
+
+void ChatContactManagerImpl::UpdateFailed(CMceSession& /*aSession*/, TMceTransactionDataContainer* /*aContainer*/ )
+{
+}
+
+// From MSIPProfileAgentObserver
+void ChatContactManagerImpl::ProfileRegistryEventOccurred(TUint32 /*aProfileId*/, TEvent /*aEvent*/)
+{
+}
+
+void ChatContactManagerImpl::ProfileRegistryErrorOccurred(TUint32 /*aProfileId*/,  TInt /*aError*/)
+{
+}
+
+// From MSIPObserver
+void ChatContactManagerImpl::IncomingRequest(TUint32 /*aIapId*/, CSIPServerTransaction* /*aTransaction*/)
+{
+}
+
+void ChatContactManagerImpl::TimedOut(CSIPServerTransaction& /*aTransaction*/)
+{
+}
+
+// From MMceInSessionObserver
+void ChatContactManagerImpl::IncomingSession(CMceInSession* aSession, TMceTransactionDataContainer* aContainer )
+{       
+    if (aSession->State() == CMceSession::EIncoming)
+    {
+        ///////////////////////
+        QString imMsg;
+        //Fetch the message from the SIP INVITE
+        CDesC8Array *mSIPHeader = aContainer->GetHeaders(); 
+        TInt count = mSIPHeader->MdcaCount();
+           
+        for (int i=0; i<count; i++)
+        {
+            TPtrC8 data = mSIPHeader->MdcaPoint(i);
+            QString header = QString::fromUtf8((const char*)data.Ptr(),data.Length());
+            if (header.contains("Subject",Qt::CaseSensitive))
+                {
+                    QChar sep = ':';
+                    //QString mChatData = header.section(sep,1);
+                    imMsg = header.section(sep,1);
+                }
+                else 
+                {
+                    //QString mChatData = "";
+                    imMsg = "";
+                }
+        }
+        //////////////////////
+    
+        // get the stream for this incoming session to set the MSRP capabilities
+        CMceMessageStream* downlinkStr = NULL;
+        CMceMessageStream* uplinkStr = NULL;
+        GetStreams(*aSession, uplinkStr, downlinkStr);
+        
+        ChatSession *chatSession = new ChatSession();
+
+        // Create the ChatSession here 
+        TMsrpChatSession *msrpChatSession = new TMsrpChatSession();
+        msrpChatSession->iMceManager = mMceMgr;
+        msrpChatSession->iMceSession = aSession;
+        msrpChatSession->iChatSession = chatSession;
+        msrpChatSession->iStream1 = uplinkStr;
+        msrpChatSession->iStream2 = downlinkStr;
+        msrpChatSession->iInitMsg = imMsg;
+
+        mChatSessionArray.Append(msrpChatSession);
+        
+        
+         if (downlinkStr )
+         {
+            CMceMsrpSource* msrpSource = static_cast<CMceMsrpSource*> (downlinkStr->Source());
+            if(msrpSource)
+             {
+                downlinkStr->ConnectionSetUpL(CMceMessageStream::EPassive);
+                //uplinkStr->ConnectionSetUpL(CMceMessageStream::EPassive);
+
+                // Set AcceptTypes
+                CDesC8ArrayFlat *acceptTypes = new(ELeave)CDesC8ArrayFlat(KGranularity);
+                _LIT8(KtextPlain,"text/plain");
+                _LIT8(KMessageCpim, "message/cpim");
+                acceptTypes->AppendL(KtextPlain);
+                acceptTypes->AppendL(KMessageCpim);
+
+                msrpSource->SetAcceptTypesL(*acceptTypes);
+                delete acceptTypes;
+
+                _LIT8(KAcceptWrap, "acceptwrap");
+               TBuf8<KAcceptSize> accept(KAcceptWrap);
+               msrpSource->SetAcceptWrappedTypesL(accept);
+             }
+          }
+         
+         /* Add the out session to the list of MCESessions */
+         mMceSessions.Append(aSession);
+         aSession->UpdateL();
+       }         
+}
+
+
+void ChatContactManagerImpl::IncomingUpdate(CMceSession& , CMceInSession* , TMceTransactionDataContainer* )
+{
+}
+
+void ChatContactManagerImpl::DataReceived(CMceMediaStream& aStream, CMceMediaSink& /*aSink*/, const TDesC8& aData)
+{
+    /* Find the Session for which this Message is intented */
+    for(int i=0; i<mChatSessionArray.Count(); i++)
+    {
+       if(mChatSessionArray[i]->iStream1 == &aStream || mChatSessionArray[i]->iStream2 == &aStream)
+       {
+           ChatSessionImpl *pImpl = static_cast<ChatSessionImpl*>(mChatSessionArray[i]->iChatSession->getPlatformImpl());
+           pImpl->incomingData(aData);
+       }
+    }
+}
+
+
+void ChatContactManagerImpl::GetStreams(CMceSession& aSession, CMceMessageStream*& aUplinkStr, CMceMessageStream*& aDownlinkStr )
+    {
+    RPointerArray<CMceMediaStream> streams = aSession.Streams();
+    for (TInt i=0; i<streams.Count();i++)
+       {
+       if (streams[i]->Type() == KMceMessage  && 
+               streams[i]->Source() &&
+               streams[i]->Source()->Type() == KMceMSRPSource)
+           {
+           aDownlinkStr =static_cast<CMceMessageStream*> (streams[i]);
+           //break;
+           }
+           
+       if (streams[i]->Type() == KMceMessage  && 
+               streams[i]->Source() &&
+               streams[i]->Source()->Type() == KMceMessageSource)
+           {
+           aUplinkStr =static_cast<CMceMessageStream*> (streams[i]);
+           //break;
+           }  
+       if (aDownlinkStr == NULL && streams[i]->BoundStream())
+           {
+           if (streams[i]->BoundStreamL().Type() == KMceMessage  && 
+                   streams[i]->BoundStreamL().Source() &&
+                   streams[i]->BoundStreamL().Source()->Type() == KMceMSRPSource)
+               {
+               CMceMessageStream& stream =static_cast<CMceMessageStream&> (streams[i]->BoundStreamL());
+               aDownlinkStr =  &stream;
+             //  break;
+               } 
+           }
+           
+       if (aUplinkStr == NULL && streams[i]->BoundStream())
+           {
+           if (streams[i]->BoundStreamL().Type() == KMceMessage  && 
+                   streams[i]->BoundStreamL().Source() &&
+                   streams[i]->BoundStreamL().Source()->Type() == KMceMessageSource)
+               {
+               CMceMessageStream& stream =static_cast<CMceMessageStream&> (streams[i]->BoundStreamL());
+               aUplinkStr =  &stream;
+               } 
+           }
+       }   // for loop
+
+    }
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/src/chatsession.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#include "chatsession.h"
+#ifdef Q_OS_SYMBIAN
+#include "chatsessionimpl_sym.h"
+#endif
+
+using namespace RcsIMLib;
+
+ChatSession::ChatSession()
+{
+	mpImpl = new ChatSessionImpl(this);
+}
+
+bool ChatSession::endChatSession()
+{
+	return mpImpl->endChatSession();
+}
+
+bool ChatSession::sendChatData(QString newChatData)
+{
+    return mpImpl->sendChatData(newChatData);
+}
+
+void ChatSession::setPlatformParams(void *apPlatFormParam)
+{
+	mpImpl->setPlatformParams(apPlatFormParam);
+}
+
+//Get the Platform implementations
+void* ChatSession::getPlatformImpl()
+{
+	return mpImpl->getPlatformImpl();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/src/chatsessionimpl_sym.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#include <e32base.h>
+#include <e32std.h>
+
+#include <mcemessagesource.h>
+#include <mcemessagestream.h>
+
+#include <sipprofileregistry.h>
+#include <flogger.h>
+
+#include "chatsessionimpl_sym.h"
+#include "msrpchatsessiondata_sym.h"
+
+using namespace RcsIMLib;
+
+//_LIT( KLogDir1, "rcs" );
+//_LIT( KLogFile1, "rcs.txt" );
+
+
+
+ChatSessionImpl::ChatSessionImpl(ChatSession *apParent):mParent(apParent)
+{
+
+}
+
+bool ChatSessionImpl::sendChatData(QString newChatData)
+{
+	TPtrC16 dataPtr(reinterpret_cast<const TUint16*>(newChatData.utf16()));
+	RBuf8 chatData;
+	chatData.Create(300);
+	chatData.Copy(dataPtr);
+
+	mMessageSource->SendDataL(chatData);
+
+	chatData.Close();
+
+	return true;
+}
+
+
+bool ChatSessionImpl::endChatSession()
+{
+	return true;
+}
+
+void ChatSessionImpl::setPlatformParams(void *apPlatFormParam)
+{
+	mMsrpChatSessionData = static_cast<TMsrpChatSession*>(apPlatFormParam);
+    if (mMsrpChatSessionData->iStream1->Source()->Type() == KMceMessageSource)
+    {
+    	mMessageSource = (CMceMessageSource*) mMsrpChatSessionData->iStream1->Source();
+    }
+    else if (mMsrpChatSessionData->iStream2->Source()->Type() == KMceMessageSource)
+    {
+        mMessageSource = (CMceMessageSource*) mMsrpChatSessionData->iStream2->Source();
+    }
+}
+
+//Get the Platform implementations
+void* ChatSessionImpl::getPlatformImpl()
+{
+	return this;
+}
+
+void ChatSessionImpl::incomingData(const TDesC8& aData)
+{
+    QString chatData = QString::fromUtf8((const char*)aData.Ptr(),aData.Length());
+    emit mParent->newChatData(chatData);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rcsimengine/src/rcsimmanagerfactory.cpp	Fri Oct 08 18:07:26 2010 +0530
@@ -0,0 +1,51 @@
+/*
+* Copyright (c) 2009-2010 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:
+* RCS IM Library - Initial version
+*
+*/
+
+
+#include "rcsimmanagerfactory.h"
+#include "chatinterfaces.h"
+#include "chatcontactmanager.h"
+
+using namespace RcsIMLib;
+
+RcsIMLib::MChatContactManagerIntf* RcsIMManagerFactory::createIMManager()
+{
+	return new ChatContactManager();
+}
+
+QString RcsIMManagerFactory::protocol()
+{
+	return "rcsmsrp";
+}
+
+Q_EXPORT_PLUGIN2(symmsrpplugin, RcsIMManagerFactory)
+
+//static const char *qt_plugin_verification_data = \
+//      "pattern=""QT_PLUGIN_VERIFICATION_DATA""\n" \
+//      "version=""4.6.3""\n" \
+//      "debug=""false""\n" \
+//      "buildkey=""Symbian full-config"; \
+//            extern "C" __declspec(dllexport) \
+//            const char *  qt_plugin_query_verification_data() \
+//            { return qt_plugin_verification_data; } \
+//            extern "C" __declspec(dllexport) ::QObject *  qt_plugin_instance() \
+//            { \
+//            static QPointer<QObject> _instance; \
+//            if (!_instance)      \
+//                _instance = new RcsIMManagerFactory; \
+//            return _instance; \
+//        }
+