diff --git a/console/linphonec.c b/console/linphonec.c
index ef1760ee4..41b70a816 100644
--- a/console/linphonec.c
+++ b/console/linphonec.c
@@ -130,7 +130,7 @@ static void linphonec_new_unknown_subscriber(LinphoneCore *lc,
LinphoneFriend *lf, const char *url);
static void linphonec_text_received(LinphoneCore *lc, LinphoneChatRoom *cr,
- const char *from, const char *msg);
+ const LinphoneAddress *from, const char *msg);
static void linphonec_display_status (LinphoneCore * lc, const char *something);
static void linphonec_dtmf_received(LinphoneCore *lc, LinphoneCall *call, int dtmf);
static void print_prompt(LinphoneCore *opm);
@@ -371,9 +371,9 @@ static void linphonec_call_state_changed(LinphoneCore *lc, LinphoneCall *call, L
*/
static void
linphonec_text_received(LinphoneCore *lc, LinphoneChatRoom *cr,
- const char *from, const char *msg)
+ const LinphoneAddress *from, const char *msg)
{
- printf("%s: %s\n", from, msg);
+ printf("%s: %s\n", linphone_address_as_string(from), msg);
// TODO: provide mechanism for answering.. ('say' command?)
}
diff --git a/coreapi/chat.c b/coreapi/chat.c
index 3a41b4c9f..d90cf61e4 100644
--- a/coreapi/chat.c
+++ b/coreapi/chat.c
@@ -78,7 +78,7 @@ bool_t linphone_chat_room_matches(LinphoneChatRoom *cr, const LinphoneAddress *f
return FALSE;
}
-void linphone_chat_room_text_received(LinphoneChatRoom *cr, LinphoneCore *lc, const char *from, const char *msg){
+void linphone_chat_room_text_received(LinphoneChatRoom *cr, LinphoneCore *lc, const LinphoneAddress *from, const char *msg){
if (lc->vtable.text_received!=NULL) lc->vtable.text_received(lc, cr, from, msg);
}
@@ -102,8 +102,9 @@ void linphone_core_text_received(LinphoneCore *lc, const char *from, const char
/* create a new chat room */
cr=linphone_core_create_chat_room(lc,cleanfrom);
}
+
linphone_address_destroy(addr);
- linphone_chat_room_text_received(cr,lc,cleanfrom,msg);
+ linphone_chat_room_text_received(cr,lc,cr->peer_url,msg);
ms_free(cleanfrom);
}
@@ -114,3 +115,6 @@ void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud){
void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr){
return cr->user_data;
}
+const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr) {
+ return cr->peer_url;
+}
diff --git a/coreapi/help/Makefile.am b/coreapi/help/Makefile.am
index 4ded6c77f..7fa592da2 100644
--- a/coreapi/help/Makefile.am
+++ b/coreapi/help/Makefile.am
@@ -32,7 +32,7 @@ endif
clean-local:
rm -rf doc
-noinst_PROGRAMS=helloworld registration buddy_status
+noinst_PROGRAMS=helloworld registration buddy_status chatroom
helloworld_SOURCES=helloworld.c
@@ -42,15 +42,16 @@ helloworld_LDADD=$(top_builddir)/coreapi/liblinphone.la \
registration_SOURCES=registration.c
-registration_LDADD=$(top_builddir)/coreapi/liblinphone.la \
- $(MEDIASTREAMER_LIBS) \
- $(ORTP_LIBS)
+registration_LDADD=$(helloworld_LDADD)
buddy_status_SOURCES=buddy_status.c
-buddy_status_LDADD=$(top_builddir)/coreapi/liblinphone.la \
- $(MEDIASTREAMER_LIBS) \
- $(ORTP_LIBS)
+buddy_status_LDADD=$(helloworld_LDADD)
+
+chatroom_SOURCES=chatroom.c
+
+chatroom_LDADD=$(helloworld_LDADD)
+
INCLUDES=-I$(top_srcdir)/coreapi \
diff --git a/coreapi/help/buddy_status.c b/coreapi/help/buddy_status.c
index ceff11a80..7ee06a8f5 100644
--- a/coreapi/help/buddy_status.c
+++ b/coreapi/help/buddy_status.c
@@ -1,6 +1,6 @@
/*
-linphone
+buddy_status
Copyright (C) 2010 Belledonne Communications SARL
This program is free software; you can redistribute it and/or
@@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* @defgroup buddy_tutorials Basic buddy status notification
* @ingroup tutorials
*This program is a _very_ simple usage example of liblinphone,
- *desmonstrating how to initiate SIP subscriptions and receive notifications from a sip uri identity passed from the command line.
+ *demonstrating how to initiate SIP subscriptions and receive notifications from a sip uri identity passed from the command line.
*
Argument must be like sip:jehan@sip.linphone.org .
*
*ex budy_list sip:jehan@sip.linphone.org
@@ -82,14 +82,14 @@ int main(int argc, char *argv[]){
#endif
/*
Fill the LinphoneCoreVTable with application callbacks.
- All are optional. Here we only use the registration_state_changed callbacks
- in order to get notifications about the progress of the registration.
+ All are optional. Here we only use the both notify_presence_recv and new_subscription_request callbacks
+ in order to get notifications about friend status.
*/
vtable.notify_presence_recv=notify_presence_recv_updated;
vtable.new_subscription_request=new_subscription_request;
/*
- Instanciate a LinphoneCore object given the LinphoneCoreVTable
+ Instantiate a LinphoneCore object given the LinphoneCoreVTable
*/
lc=linphone_core_new(&vtable,NULL,NULL,NULL);
LinphoneFriend* my_friend=NULL;
diff --git a/coreapi/help/chatroom.c b/coreapi/help/chatroom.c
new file mode 100644
index 000000000..448b9ca13
--- /dev/null
+++ b/coreapi/help/chatroom.c
@@ -0,0 +1,96 @@
+
+/*
+linphone
+Copyright (C) 2010 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @defgroup chatroom_tuto Chat room and messaging
+ * @ingroup tutorials
+ *This program is a _very_ simple usage example of liblinphone,
+ *desmonstrating how to send/receive SIP MESSAGE from a sip uri identity passed from the command line.
+ *
Argument must be like sip:jehan@sip.linphone.org .
+ *
+ *ex chatroom sip:jehan@sip.linphone.org
+ *
+ *@include chatroom.c
+
+ *
+ */
+
+#include "linphonecore.h"
+
+#include
+
+static bool_t running=TRUE;
+
+static void stop(int signum){
+ running=FALSE;
+}
+void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message) {
+ printf(" Message [%s] received from [%s] \n",message,linphone_address_as_string (from));
+}
+
+
+LinphoneCore *lc;
+int main(int argc, char *argv[]){
+ LinphoneCoreVTable vtable={0};
+
+ char* dest_friend=NULL;
+
+
+ /* takes sip uri identity from the command line arguments */
+ if (argc>1){
+ dest_friend=argv[1];
+ }
+
+ signal(SIGINT,stop);
+//#define DEBUG
+#ifdef DEBUG
+ linphone_core_enable_logs(NULL); /*enable liblinphone logs.*/
+#endif
+ /*
+ Fill the LinphoneCoreVTable with application callbacks.
+ All are optional. Here we only use the text_received callback
+ in order to get notifications about incoming message.
+ */
+ vtable.text_received=text_received;
+
+ /*
+ Instantiate a LinphoneCore object given the LinphoneCoreVTable
+ */
+ lc=linphone_core_new(&vtable,NULL,NULL,NULL);
+
+
+ /*Next step is to create a chat root*/
+ LinphoneChatRoom* chat_room = linphone_core_create_chat_room(lc,dest_friend);
+
+ linphone_chat_room_send_message(chat_room,"Hello world"); /*sending message*/
+
+ /* main loop for receiving incoming messages and doing background linphone core work: */
+ while(running){
+ linphone_core_iterate(lc);
+ ms_usleep(50000);
+ }
+
+ printf("Shutting down...\n");
+ linphone_chat_room_destroy(chat_room);
+ linphone_core_destroy(lc);
+ printf("Exited\n");
+ return 0;
+}
+
diff --git a/coreapi/help/doxygen.dox b/coreapi/help/doxygen.dox
index 1ef0e97d1..8707785b2 100644
--- a/coreapi/help/doxygen.dox
+++ b/coreapi/help/doxygen.dox
@@ -146,8 +146,29 @@ linphone_friend_done(my_friend); /*commit changes triggering an UNSUBSCRIBE mess
A complete tutorial can be found at : \ref buddy_tutorials "Registration tutorial"
-*/
+**/
+/**
+* @defgroup chatroom Chat room and Messaging
+ Exchanging text messages
+
Messages are sent using #LinphoneChatRoom object. First step is to create a \link linphone_core_create_chat_room() chat room \endlink
+from a peer sip uri.
+\code
+LinphoneChatRoom* chat_room = linphone_core_create_chat_room(lc,"sip:joe@sip.linphone.org");
+\endcode
+
+
Once created, messages are sent using function linphone_chat_room_send_message() .
+\code
+linphone_chat_room_send_message(chat_room,"Hello world"); /*sending message*/
+\endcode
+
Incoming message are received from call back LinphoneCoreVTable.text_received
+\code
+void text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message) {
+ printf(" Message [%s] received from [%s] \n",message,linphone_address_as_string (from));
+}
+\endcode
+
A complete tutorial can be found at : \ref chatroom_tuto "Chat room tutorial"
+**/
/**
* @defgroup call_logs Managing call logs
diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h
index f8fd75b39..1a75f5bad 100644
--- a/coreapi/linphonecore.h
+++ b/coreapi/linphonecore.h
@@ -402,14 +402,48 @@ LinphoneAuthInfo * linphone_auth_info_new_from_config_file(struct _LpConfig *con
struct _LinphoneChatRoom;
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+/**
+ * A chat room is the place where text messages are exchanged.
+ *
Can be created by linphone_core_create_chat_room().
+ */
typedef struct _LinphoneChatRoom LinphoneChatRoom;
-
-LinphoneChatRoom * linphone_core_create_chat_room(struct _LinphoneCore *lc, const char *to);
-void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg);
+/**
+ * Create a new chat room for messaging from a sip uri like sip:joe@sip.linphone.org
+ * @param lc #LinphoneCore object
+ * @param to destination address for messages
+ * @return #LinphoneChatRoom where messaging can take place.
+ */
+LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to);
+/**
+ * Destructor
+ * @param cr #LinphoneChatRoom object
+ */
void linphone_chat_room_destroy(LinphoneChatRoom *cr);
+
+
+/**
+ * get peer address \link linphone_core_create_chat_room() associated to \endlink this #LinphoneChatRoom
+ * @param cr #LinphoneChatRoom object
+ * @return #LinphoneAddress peer address
+ */
+const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr);
+/**
+ * send a message to peer member of this chat room.
+ * @param cr #LinphoneChatRoom object
+ * @param msg message to be sent
+ */
+void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg);
+
void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void * ud);
void * linphone_chat_room_get_user_data(LinphoneChatRoom *cr);
+/**
+ * @}
+ */
typedef enum _LinphoneGlobalState{
LinphoneGlobalOff,
LinphoneGlobalStartup,
@@ -464,8 +498,15 @@ typedef void (*NewSubscribtionRequestCb)(struct _LinphoneCore *lc, LinphoneFrien
typedef void (*AuthInfoRequested)(struct _LinphoneCore *lc, const char *realm, const char *username);
/** Callback prototype */
typedef void (*CallLogUpdated)(struct _LinphoneCore *lc, struct _LinphoneCallLog *newcl);
-/** Callback prototype */
-typedef void (*TextMessageReceived)(struct _LinphoneCore *lc, LinphoneChatRoom *room, const char *from, const char *message);
+/**
+ * Callback prototype
+ *
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom involved in this conversation. Can be be created by the framework in case \link #LinphoneAddress the from \endlink is not present in any chat room.
+ * @param from #LinphoneAddress from
+ * @param message incoming message
+ * */
+typedef void (*TextMessageReceived)(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message);
/** Callback prototype */
typedef void (*DtmfReceived)(struct _LinphoneCore* lc, LinphoneCall *call, int dtmf);
/** Callback prototype */
diff --git a/gtk/chat.c b/gtk/chat.c
index bc61850a8..b81a6aa13 100644
--- a/gtk/chat.c
+++ b/gtk/chat.c
@@ -94,13 +94,13 @@ void linphone_gtk_send_text(GtkWidget *button){
}
}
-void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const char *from, const char *message){
+void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message){
GtkWidget *w=(GtkWidget*)linphone_chat_room_get_user_data(room);
if (w==NULL){
- w=linphone_gtk_init_chatroom(room,from);
+ w=linphone_gtk_init_chatroom(room,linphone_address_as_string_uri_only(from));
}
linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textlog")),
- from,
+ linphone_address_as_string_uri_only(from),
message,FALSE);
gtk_window_present(GTK_WINDOW(w));
/*gtk_window_set_urgency_hint(GTK_WINDOW(w),TRUE);*/
diff --git a/gtk/linphone.h b/gtk/linphone.h
index 637448818..70e1d5dc4 100644
--- a/gtk/linphone.h
+++ b/gtk/linphone.h
@@ -61,7 +61,7 @@ void linphone_gtk_set_my_presence(LinphoneOnlineStatus ss);
void linphone_gtk_show_parameters(void);
void linphone_gtk_load_identities(void);
void linphone_gtk_create_chatroom(const char *with);
-void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const char *from, const char *message);
+void linphone_gtk_text_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message);
void linphone_gtk_call_log_update(GtkWidget *w);
void linphone_gtk_create_log_window(void);
void linphone_gtk_log_show(void);