]> sjero.net Git - linphone/commitdiff
remove adherence from Sal to liblinphone, improve notification of failed messageso
authorSimon Morlat <simon.morlat@linphone.org>
Fri, 7 Sep 2012 11:04:27 +0000 (13:04 +0200)
committerSimon Morlat <simon.morlat@linphone.org>
Fri, 7 Sep 2012 11:04:27 +0000 (13:04 +0200)
coreapi/callbacks.c
coreapi/chat.c
coreapi/private.h
coreapi/sal.h
coreapi/sal_eXosip2.c
gtk/chat.c

index 161aaab24150811d33ba8f6041d754cc779a3c26..cd20cf6b9dfe634fd2919c7d32716a3165c6fc7f 100644 (file)
@@ -801,6 +801,28 @@ static void notify_refer(SalOp *op, SalReferStatus status){
        }
 }
 
+static LinphoneChatMessageState chatStatusSal2Linphone(SalTextDeliveryStatus status){
+       switch(status){
+               case SalTextDeliveryInProgress:
+                       return LinphoneChatMessageStateInProgress;
+               case SalTextDeliveryDone:
+                       return LinphoneChatMessageStateDelivered;
+               case SalTextDeliveryFailed:
+                       return LinphoneChatMessageStateNotDelivered;
+       }
+       return LinphoneChatMessageStateIdle;
+}
+
+static void text_delivery_update(SalOp *op, SalTextDeliveryStatus status){
+       LinphoneChatMessage *chat_msg=(LinphoneChatMessage* )sal_op_get_user_pointer(op);
+       if (chat_msg && chat_msg->cb) {
+               chat_msg->cb(chat_msg
+                       ,chatStatusSal2Linphone(status)
+                       ,chat_msg->cb_ud);
+       }
+       linphone_chat_message_destroy(chat_msg);
+}
+
 SalCallbacks linphone_sal_callbacks={
        call_received,
        call_ringing,
@@ -818,12 +840,13 @@ SalCallbacks linphone_sal_callbacks={
        dtmf_received,
        refer_received,
        text_received,
+       text_delivery_update,
        notify,
        notify_presence,
        notify_refer,
        subscribe_received,
        subscribe_closed,
-       ping_reply
+       ping_reply,
 };
 
 
index 3d336dbcdece681854dde543721b683feae53d96..758293067970fa46fdff17e8dd3a17bc2271f09c 100644 (file)
@@ -136,10 +136,12 @@ LinphoneChatMessage* linphone_chat_room_create_message(const LinphoneChatRoom *c
        msg->message=ms_strdup(message);
        return msg;
 }
+
 void linphone_chat_message_destroy(LinphoneChatMessage* msg) {
-       if (msg->message) ms_free((void*)msg->message);
-       ms_free((void*)msg);
+       if (msg->message) ms_free(msg->message);
+       ms_free(msg);
 }
+
 void linphone_chat_room_send_message2(LinphoneChatRoom *cr, LinphoneChatMessage* msg,LinphoneChatMessageStateChangeCb status_cb,void* ud) {
        msg->cb=status_cb;
        msg->cb_ud=ud;
index 2bf643d470164862473b29cd7d39adf8576b2cc3..6affd1599fc70f8dfd710b0b5bbcb4770bc4dd4a 100644 (file)
@@ -91,7 +91,7 @@ typedef struct _CallCallbackObj
 static const int linphone_call_magic=0x3343;
 
 struct _LinphoneChatMessage {
-       const char* message;
+       char* message;
        LinphoneChatRoom* chat_room;
        LinphoneChatMessageStateChangeCb cb;
        void* cb_ud;
index 8faa1137514b486cc07ea6a305f62e225c00125e..e12cdaf0c5cbb09fa5915c04ff23afbead8c899f 100644 (file)
@@ -253,6 +253,12 @@ typedef enum SalSubscribeStatus{
        SalSubscribeTerminated
 }SalSubscribeStatus;
 
+typedef enum SalTextDeliveryStatus{
+       SalTextDeliveryInProgress,
+       SalTextDeliveryDone,
+       SalTextDeliveryFailed
+}SalTextDeliveryStatus;
+
 typedef void (*SalOnCallReceived)(SalOp *op);
 typedef void (*SalOnCallRinging)(SalOp *op);
 typedef void (*SalOnCallAccepted)(SalOp *op);
@@ -269,6 +275,7 @@ typedef void (*SalOnVfuRequest)(SalOp *op);
 typedef void (*SalOnDtmfReceived)(SalOp *op, char dtmf);
 typedef void (*SalOnRefer)(Sal *sal, SalOp *op, const char *referto);
 typedef void (*SalOnTextReceived)(Sal *sal, const char *from, const char *msg);
+typedef void (*SalOnTextDeliveryUpdate)(SalOp *op, SalTextDeliveryStatus status);
 typedef void (*SalOnNotify)(SalOp *op, const char *from, const char *event);
 typedef void (*SalOnNotifyRefer)(SalOp *op, SalReferStatus state);
 typedef void (*SalOnNotifyPresence)(SalOp *op, SalSubscribeStatus ss, SalPresenceStatus status, const char *msg);
@@ -293,6 +300,7 @@ typedef struct SalCallbacks{
        SalOnDtmfReceived dtmf_received;
        SalOnRefer refer_received;
        SalOnTextReceived text_received;
+       SalOnTextDeliveryUpdate text_delivery_update;
        SalOnNotify notify;
        SalOnNotifyPresence notify_presence;
        SalOnNotifyRefer notify_refer;
index 447ce34eb359432277fd3b6c556f6b9a9f77e338..d3ce16929b274522ebb95a1b89a6a98510a5f187 100644 (file)
@@ -21,7 +21,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #endif
 
 #include "sal_eXosip2.h"
-#include "private.h"
 #include "offeranswer.h"
 
 #ifdef ANDROID
@@ -98,12 +97,12 @@ static void sal_remove_register(Sal *sal, int rid){
        }
 }
 
-static SalOp * sal_find_other(Sal *sal, osip_message_t *response){
+static SalOp * sal_find_other(Sal *sal, osip_message_t *message){
        const MSList *elem;
        SalOp *op;
-       osip_call_id_t *callid=osip_message_get_call_id(response);
+       osip_call_id_t *callid=osip_message_get_call_id(message);
        if (callid==NULL) {
-               ms_error("There is no call-id in this response !");
+               ms_error("There is no call-id in this message !");
                return NULL;
        }
        for(elem=sal->other_transactions;elem!=NULL;elem=elem->next){
@@ -931,9 +930,9 @@ void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){
 }
 void sal_op_cancel_authentication(SalOp *h) {
        if (h->rid >0) {
-               sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"));
+               sal_op_get_sal(h)->callbacks.register_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure");
        } else if (h->cid >0) {
-               sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,_("Authentication failure"),0);
+               sal_op_get_sal(h)->callbacks.call_failure(h,SalErrorFailure, SalReasonForbidden,"Authentication failure",0);
        } else {
                ms_warning("Auth failure not handled");
        }
@@ -999,6 +998,7 @@ static SalOp *find_op(Sal *sal, eXosip_event_t *ev){
                return sal_find_in_subscribe(sal,ev->nid);
        }
        if (ev->response) return sal_find_other(sal,ev->response);
+       else if (ev->request) return sal_find_other(sal,ev->request);
        return NULL;
 }
 
@@ -1953,7 +1953,6 @@ static bool_t registration_failure(Sal *sal, eXosip_event_t *ev){
 
 static void other_request_reply(Sal *sal,eXosip_event_t *ev){
        SalOp *op=find_op(sal,ev);
-       LinphoneChatMessage* chat_msg;
        if (op==NULL){
                ms_warning("other_request_reply(): Receiving response to unknown request.");
                return;
@@ -1963,16 +1962,18 @@ static void other_request_reply(Sal *sal,eXosip_event_t *ev){
                update_contact_from_response(op,ev->response);
                if (ev->request && strcmp(osip_message_get_method(ev->request),"OPTIONS")==0)
                        sal->callbacks.ping_reply(op);
-               else if (ev->request && strcmp(osip_message_get_method(ev->request),"MESSAGE")==0) {
-                       /*out of call message acknolegment*/
-                       chat_msg=(LinphoneChatMessage* )op->base.user_pointer;
-                       if (chat_msg->cb) {
-                               chat_msg->cb(chat_msg
-                                                        ,(ev->response->status_code==200?LinphoneChatMessageStateDelivered:LinphoneChatMessageStateNotDelivered)
-                                                        ,chat_msg->cb_ud);
+       }
+       if (ev->request && strcmp(osip_message_get_method(ev->request),"MESSAGE")==0) {
+               /*out of call message acknolegment*/
+               SalTextDeliveryStatus status=SalTextDeliveryFailed;
+               if (ev->response){
+                       if (ev->response->status_code<200){
+                               status=SalTextDeliveryInProgress;
+                       }else if (ev->response->status_code<300 && ev->response->status_code>=200){
+                               status=SalTextDeliveryDone;
                        }
-                       linphone_chat_message_destroy(chat_msg);
                }
+               sal->callbacks.text_delivery_update(op,status);
        }
 }
 
@@ -2081,8 +2082,8 @@ static bool_t process_event(Sal *sal, eXosip_event_t *ev){
                        if (ev->response && (ev->response->status_code == 407 || ev->response->status_code == 401)){
                                return process_authentication(sal,ev);
                        }
-       case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
-               case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
+               case EXOSIP_SUBSCRIPTION_SERVERFAILURE:
+               case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:
                        sal_exosip_subscription_closed(sal,ev);
                        break;
                case EXOSIP_REGISTRATION_FAILURE:
index 4138f67224e89787bb44c22b09e990491231d094..cb866a92f38219f3577a8482e141143fa7990e87 100644 (file)
@@ -90,6 +90,10 @@ const char* linphone_gtk_get_used_identity(){
        else return linphone_core_get_primary_contact(lc);
 }
 
+static void on_chat_state_changed(LinphoneChatMessage *msg, LinphoneChatMessageState state, void *user_pointer){
+       g_message("chat message state is %s",linphone_chat_message_state_to_string(state));
+}
+
 void linphone_gtk_send_text(GtkWidget *button){
        GtkWidget *w=gtk_widget_get_toplevel(button);
        GtkWidget *entry=linphone_gtk_get_widget(w,"text_entry");
@@ -97,10 +101,12 @@ void linphone_gtk_send_text(GtkWidget *button){
        const gchar *entered;
        entered=gtk_entry_get_text(GTK_ENTRY(entry));
        if (strlen(entered)>0) {
+               LinphoneChatMessage *msg;
                linphone_gtk_push_text(GTK_TEXT_VIEW(linphone_gtk_get_widget(w,"textlog")),
                                linphone_gtk_get_used_identity(),
                                entered,TRUE);
-               linphone_chat_room_send_message(cr,entered);
+               msg=linphone_chat_room_create_message(cr,entered);
+               linphone_chat_room_send_message2(cr,msg,on_chat_state_changed,NULL);
                gtk_entry_set_text(GTK_ENTRY(entry),"");
        }
 }