mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-30 09:49:26 +00:00
refer improvements, and caught refers
This commit is contained in:
parent
da5f073757
commit
2820f6026b
9 changed files with 88 additions and 38 deletions
|
|
@ -120,7 +120,8 @@ static void linphonec_display_something (LinphoneCore * lc, const char *somethin
|
|||
static void linphonec_display_url (LinphoneCore * lc, const char *something, const char *url);
|
||||
static void linphonec_display_warning (LinphoneCore * lc, const char *something);
|
||||
static void stub () {}
|
||||
static void linphonec_notify_received(LinphoneCore *lc,LinphoneFriend *fid);
|
||||
static void linphonec_notify_received(LinphoneCore *lc,const char *from,const char *msg);
|
||||
static void linphonec_notify_presence_received(LinphoneCore *lc,LinphoneFriend *fid);
|
||||
static void linphonec_new_unknown_subscriber(LinphoneCore *lc,
|
||||
LinphoneFriend *lf, const char *url);
|
||||
static void linphonec_bye_received(LinphoneCore *lc, const char *from);
|
||||
|
|
@ -176,6 +177,7 @@ LinphoneCoreVTable linphonec_vtable
|
|||
.inv_recv = linphonec_call_received,
|
||||
.bye_recv = linphonec_bye_received,
|
||||
.notify_recv = linphonec_notify_received,
|
||||
.notify_presence_recv = linphonec_notify_presence_received,
|
||||
.new_unknown_subscriber = linphonec_new_unknown_subscriber,
|
||||
.auth_info_requested = linphonec_prompt_for_auth,
|
||||
.display_status = linphonec_display_status,
|
||||
|
|
@ -209,7 +211,7 @@ LinphoneCoreVTable linphonec_vtable
|
|||
static void
|
||||
linphonec_display_refer (LinphoneCore * lc,const char *refer_to)
|
||||
{
|
||||
fprintf (stdout, "The distant end point asked to transfer the call to %s,don't forget to terminate the call\n%s", refer_to,prompt);
|
||||
fprintf (stdout, "The distant end point asked to transfer the call to %s,don't forget to terminate the call if not\n%s", refer_to,prompt);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
|
@ -294,7 +296,21 @@ linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *usern
|
|||
* Linphone core callback
|
||||
*/
|
||||
static void
|
||||
linphonec_notify_received(LinphoneCore *lc,LinphoneFriend *fid)
|
||||
linphonec_notify_received(LinphoneCore *lc,const char *from,const char *msg)
|
||||
{
|
||||
printf("Notify type %s from %s\n", msg, from);
|
||||
if(!strcmp(msg,"refer"))
|
||||
{
|
||||
printf("The distant SIP end point get the refer we can close the call\n");
|
||||
linphonec_parse_command_line(linphonec, "terminate");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Linphone core callback
|
||||
*/
|
||||
static void
|
||||
linphonec_notify_presence_received(LinphoneCore *lc,LinphoneFriend *fid)
|
||||
{
|
||||
char *tmp=linphone_address_as_string(linphone_friend_get_address(fid));
|
||||
printf("Friend %s is %s\n", tmp, linphone_online_status_to_string(linphone_friend_get_status(fid)));
|
||||
|
|
@ -608,7 +624,7 @@ int _tmain(int argc, _TCHAR* wargv[]) {
|
|||
linphonec_vtable.show =(ShowInterfaceCb) stub;
|
||||
linphonec_vtable.inv_recv = linphonec_call_received;
|
||||
linphonec_vtable.bye_recv = linphonec_bye_received;
|
||||
linphonec_vtable.notify_recv = linphonec_notify_received;
|
||||
linphonec_vtable.notify_presence_recv = linphonec_notify_received;
|
||||
linphonec_vtable.new_unknown_subscriber = linphonec_new_unknown_subscriber;
|
||||
linphonec_vtable.auth_info_requested = linphonec_prompt_for_auth;
|
||||
linphonec_vtable.display_status = linphonec_display_status;
|
||||
|
|
|
|||
|
|
@ -392,21 +392,11 @@ static void dtmf_received(SalOp *op, char dtmf){
|
|||
}
|
||||
|
||||
static void refer_received(Sal *sal, SalOp *op, const char *referto){
|
||||
osip_message_t *msg;
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal);
|
||||
if(op != NULL)
|
||||
{
|
||||
eXosip_call_build_notify(op->tid,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
|
||||
if(msg != NULL)
|
||||
{
|
||||
osip_message_set_header(msg,(const char *)"event","refer");
|
||||
osip_message_set_content_type(msg,"message/sipfrag");
|
||||
osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
|
||||
eXosip_call_send_request(op->tid,msg);
|
||||
}
|
||||
}
|
||||
if (lc->vtable.refer_received)
|
||||
if (lc->vtable.refer_received){
|
||||
lc->vtable.refer_received(lc,referto);
|
||||
if (op) sal_refer_accept(op);
|
||||
}
|
||||
}
|
||||
|
||||
static void text_received(Sal *sal, const char *from, const char *msg){
|
||||
|
|
@ -414,7 +404,15 @@ static void text_received(Sal *sal, const char *from, const char *msg){
|
|||
linphone_core_text_received(lc,from,msg);
|
||||
}
|
||||
|
||||
static void notify(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg){
|
||||
static void notify(SalOp *op, const char *from, const char *msg){
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
|
||||
|
||||
ms_message("get a %s notify from %s",msg,from);
|
||||
if(lc->vtable.notify_recv)
|
||||
lc->vtable.notify_recv(lc,from,msg);
|
||||
}
|
||||
|
||||
static void notify_presence(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg){
|
||||
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
|
||||
linphone_notify_recv(lc,op,ss,status);
|
||||
}
|
||||
|
|
@ -462,6 +460,7 @@ SalCallbacks linphone_sal_callbacks={
|
|||
refer_received,
|
||||
text_received,
|
||||
notify,
|
||||
notify_presence,
|
||||
subscribe_received,
|
||||
subscribe_closed,
|
||||
internal_message,
|
||||
|
|
|
|||
|
|
@ -1997,7 +1997,7 @@ int linphone_core_refer(LinphoneCore *lc, const char *url)
|
|||
ms_warning("No established call to refer.");
|
||||
return -1;
|
||||
}
|
||||
lc->call=NULL;
|
||||
//lc->call=NULL; //Do not do that you will lose the call afterward . . .
|
||||
real_url=linphone_address_as_string (real_parsed_url);
|
||||
sal_refer(call->op,real_url);
|
||||
ms_free(real_url);
|
||||
|
|
|
|||
|
|
@ -391,7 +391,9 @@ typedef void (*DisplayQuestionCb)(struct _LinphoneCore *lc, const char *message)
|
|||
/** Callback prototype */
|
||||
typedef void (*LinphoneCoreCbFunc)(struct _LinphoneCore *lc,void * user_data);
|
||||
/** Callback prototype */
|
||||
typedef void (*NotifyReceivedCb)(struct _LinphoneCore *lc, LinphoneFriend * fid);
|
||||
typedef void (*NotifyReceivedCb)(struct _LinphoneCore *lc, const char *from, const char *msg);
|
||||
/** Callback prototype */
|
||||
typedef void (*NotifyPresenceReceivedCb)(struct _LinphoneCore *lc, LinphoneFriend * fid);
|
||||
/** Callback prototype */
|
||||
typedef void (*NewUnknownSubscriberCb)(struct _LinphoneCore *lc, LinphoneFriend *lf, const char *url);
|
||||
/** Callback prototype */
|
||||
|
|
@ -418,7 +420,7 @@ typedef struct _LinphoneVTable
|
|||
ShowInterfaceCb show; /**< Notifies the application that it should show up*/
|
||||
InviteReceivedCb inv_recv; /**< Notifies incoming calls */
|
||||
ByeReceivedCb bye_recv; /**< Notify calls terminated by far end*/
|
||||
NotifyReceivedCb notify_recv; /**< Notify received presence events*/
|
||||
NotifyPresenceReceivedCb notify_presence_recv; /**< Notify received presence events*/
|
||||
NewUnknownSubscriberCb new_unknown_subscriber; /**< Notify about unknown subscriber */
|
||||
AuthInfoRequested auth_info_requested; /**< Ask the application some authentication information */
|
||||
DisplayStatusCb display_status; /**< Callback that notifies various events with human readable text.*/
|
||||
|
|
@ -432,6 +434,7 @@ typedef struct _LinphoneVTable
|
|||
DtmfReceived dtmf_received; /**< A dtmf has been received received */
|
||||
ReferReceived refer_received; /**< A refer was received */
|
||||
BuddyInfoUpdated buddy_info_updated; /**< a LinphoneFriend's BuddyInfo has changed*/
|
||||
NotifyReceivedCb notify_recv; /**< Other notifications*/
|
||||
} LinphoneCoreVTable;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ void linphone_notify_recv(LinphoneCore *lc, SalOp *op, SalSubscribeState ss, Sal
|
|||
tmp=linphone_address_as_string(friend);
|
||||
lf->status=estatus;
|
||||
lf->subscribe_active=TRUE;
|
||||
lc->vtable.notify_recv(lc,(LinphoneFriend*)lf);
|
||||
lc->vtable.notify_presence_recv(lc,(LinphoneFriend*)lf);
|
||||
ms_free(tmp);
|
||||
}else{
|
||||
ms_message("But this person is not part of our friend list, so we don't care.");
|
||||
|
|
|
|||
|
|
@ -183,7 +183,8 @@ 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 (*SalOnNotify)(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg);
|
||||
typedef void (*SalOnNotify)(SalOp *op, const char *from, const char *value);
|
||||
typedef void (*SalOnNotifyPresence)(SalOp *op, SalSubscribeState ss, SalPresenceStatus status, const char *msg);
|
||||
typedef void (*SalOnSubscribeReceived)(SalOp *salop, const char *from);
|
||||
typedef void (*SalOnSubscribeClosed)(SalOp *salop, const char *from);
|
||||
typedef void (*SalOnInternalMsg)(Sal *sal, const char *msg);
|
||||
|
|
@ -206,6 +207,7 @@ typedef struct SalCallbacks{
|
|||
SalOnRefer refer_received;
|
||||
SalOnTextReceived text_received;
|
||||
SalOnNotify notify;
|
||||
SalOnNotifyPresence notify_presence;
|
||||
SalOnSubscribeReceived subscribe_received;
|
||||
SalOnSubscribeClosed subscribe_closed;
|
||||
SalOnInternalMsg internal_message;
|
||||
|
|
@ -256,6 +258,7 @@ int sal_call_accept(SalOp*h);
|
|||
int sal_call_decline(SalOp *h, SalReason reason, const char *redirection /*optional*/);
|
||||
SalMediaDescription * sal_call_get_final_media_description(SalOp *h);
|
||||
int sal_refer(SalOp *h, const char *refer_to);
|
||||
int sal_refer_accept(SalOp *h);
|
||||
int sal_call_send_dtmf(SalOp *h, char dtmf);
|
||||
int sal_call_terminate(SalOp *h);
|
||||
bool_t sal_call_autoanswer_asked(SalOp *op);
|
||||
|
|
|
|||
|
|
@ -278,6 +278,8 @@ void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
|
|||
ctx->callbacks.dtmf_received=(SalOnDtmfReceived)unimplemented_stub;
|
||||
if (ctx->callbacks.notify==NULL)
|
||||
ctx->callbacks.notify=(SalOnNotify)unimplemented_stub;
|
||||
if (ctx->callbacks.notify_presence==NULL)
|
||||
ctx->callbacks.notify_presence=(SalOnNotifyPresence)unimplemented_stub;
|
||||
if (ctx->callbacks.subscribe_received==NULL)
|
||||
ctx->callbacks.subscribe_received=(SalOnSubscribeReceived)unimplemented_stub;
|
||||
if (ctx->callbacks.text_received==NULL)
|
||||
|
|
@ -533,6 +535,26 @@ int sal_ping(SalOp *op, const char *from, const char *to){
|
|||
return -1;
|
||||
}
|
||||
|
||||
int sal_refer_accept(SalOp *op){
|
||||
osip_message_t *msg=NULL;
|
||||
int err=0;
|
||||
eXosip_lock();
|
||||
err = eXosip_call_build_notify(op->did,EXOSIP_SUBCRSTATE_ACTIVE,&msg);
|
||||
if(msg != NULL)
|
||||
{
|
||||
osip_message_set_header(msg,(const char *)"event","refer");
|
||||
osip_message_set_content_type(msg,"message/sipfrag");
|
||||
osip_message_set_body(msg,"SIP/2.0 100 Trying",sizeof("SIP/2.0 100 Trying"));
|
||||
eXosip_call_send_request(op->did,msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_error("could not get a notify built\n");
|
||||
}
|
||||
eXosip_unlock();
|
||||
return err;
|
||||
}
|
||||
|
||||
int sal_refer(SalOp *h, const char *refer_to){
|
||||
osip_message_t *msg=NULL;
|
||||
int err=0;
|
||||
|
|
@ -934,7 +956,7 @@ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
|
|||
SalError error=SalErrorUnknown;
|
||||
SalReason sr=SalReasonUnknown;
|
||||
|
||||
op=(SalOp*)ev->external_reference;
|
||||
op=(SalOp*)find_op(sal,ev);
|
||||
|
||||
if (op==NULL) {
|
||||
ms_warning("Call failure reported for a closed call, ignored.");
|
||||
|
|
@ -995,7 +1017,7 @@ static bool_t call_failure(Sal *sal, eXosip_event_t *ev){
|
|||
|
||||
|
||||
static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
|
||||
SalOp *op=(SalOp*)ev->external_reference;
|
||||
SalOp *op=find_op(sal,ev);
|
||||
osip_body_t *body=NULL;
|
||||
|
||||
if (op==NULL){
|
||||
|
|
@ -1018,7 +1040,7 @@ static void process_media_control_xml(Sal *sal, eXosip_event_t *ev){
|
|||
}
|
||||
|
||||
static void process_dtmf_relay(Sal *sal, eXosip_event_t *ev){
|
||||
SalOp *op=(SalOp*)ev->external_reference;
|
||||
SalOp *op=find_op(sal,ev);
|
||||
osip_body_t *body=NULL;
|
||||
|
||||
if (op==NULL){
|
||||
|
|
@ -1088,6 +1110,8 @@ static void call_message_new(Sal *sal, eXosip_event_t *ev){
|
|||
}
|
||||
if(MSG_IS_REFER(ev->request)){
|
||||
osip_header_t *h=NULL;
|
||||
SalOp *op=find_op(sal,ev);
|
||||
|
||||
ms_message("Receiving REFER request !");
|
||||
osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
|
||||
eXosip_lock();
|
||||
|
|
@ -1096,25 +1120,30 @@ static void call_message_new(Sal *sal, eXosip_event_t *ev){
|
|||
eXosip_call_send_answer(ev->tid,202,ans);
|
||||
eXosip_unlock();
|
||||
if (h){
|
||||
SalOp *op=(SalOp*)ev->external_reference;
|
||||
sal->callbacks.refer_received(sal,op,h->hvalue);
|
||||
}
|
||||
else
|
||||
{
|
||||
ms_warning("cannot do anything with the refer without destination\n");
|
||||
}
|
||||
}
|
||||
if(MSG_IS_NOTIFY(ev->request)){
|
||||
osip_header_t *h=NULL;
|
||||
char *from=NULL;
|
||||
SalOp *op=find_op(sal,ev);
|
||||
|
||||
ms_message("Receiving NOTIFY request !");
|
||||
osip_from_to_str(ev->request->from,&from);
|
||||
osip_message_header_get_byname(ev->request,"Event",0,&h);
|
||||
if (h){
|
||||
if(!strcmp(h->hvalue,"refer"))
|
||||
{
|
||||
ms_message("get the notify of the Refer sent");
|
||||
}
|
||||
}
|
||||
if(h)
|
||||
sal->callbacks.notify(op,from,h->hvalue);
|
||||
/*answer that we received the notify*/
|
||||
eXosip_lock();
|
||||
eXosip_call_build_answer(ev->tid,200,&ans);
|
||||
if (ans)
|
||||
eXosip_call_send_answer(ev->tid,200,ans);
|
||||
eXosip_unlock();
|
||||
osip_free(from);
|
||||
}
|
||||
}else ms_warning("call_message_new: No request ?");
|
||||
}
|
||||
|
|
@ -1187,8 +1216,7 @@ static void other_request(Sal *sal, eXosip_event_t *ev){
|
|||
osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
|
||||
eXosip_message_send_answer(ev->tid,200,NULL);
|
||||
if (h){
|
||||
SalOp *op=(SalOp*)ev->external_reference;
|
||||
sal->callbacks.refer_received(sal,op,h->hvalue);
|
||||
sal->callbacks.refer_received(sal,NULL,h->hvalue);
|
||||
}
|
||||
}else ms_warning("Ignored REFER not coming from this local loopback interface.");
|
||||
}else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
|
||||
|
|
@ -1343,6 +1371,7 @@ static void other_request_reply(Sal *sal,eXosip_event_t *ev){
|
|||
}
|
||||
|
||||
static bool_t process_event(Sal *sal, eXosip_event_t *ev){
|
||||
ms_message("linphone process event get a message %d\n",ev->type);
|
||||
switch(ev->type){
|
||||
case EXOSIP_CALL_ANSWERED:
|
||||
ms_message("CALL_ANSWERED\n");
|
||||
|
|
|
|||
|
|
@ -711,7 +711,7 @@ void sal_exosip_notify_recv(Sal *sal, eXosip_event_t *ev){
|
|||
op->did=-1;
|
||||
ms_message("And outgoing subscription terminated by remote.");
|
||||
}
|
||||
sal->callbacks.notify(op,op->sid!=-1 ? SalSubscribeActive : SalSubscribeTerminated, estatus,NULL);
|
||||
sal->callbacks.notify_presence(op,op->sid!=-1 ? SalSubscribeActive : SalSubscribeTerminated, estatus,NULL);
|
||||
osip_free(tmp);
|
||||
}
|
||||
|
||||
|
|
@ -752,7 +752,7 @@ void sal_exosip_subscription_closed(Sal *sal,eXosip_event_t *ev){
|
|||
sal_remove_out_subscribe(sal,op);
|
||||
op->sid=-1;
|
||||
op->did=-1;
|
||||
sal->callbacks.notify(op,SalSubscribeTerminated, SalPresenceOffline,NULL);
|
||||
sal->callbacks.notify_presence(op,SalSubscribeTerminated, SalPresenceOffline,NULL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ static LinphoneCoreVTable vtable={
|
|||
.show=linphone_gtk_show,
|
||||
.inv_recv=linphone_gtk_inv_recv,
|
||||
.bye_recv=linphone_gtk_bye_recv,
|
||||
.notify_recv=linphone_gtk_notify_recv,
|
||||
.notify_presence_recv=linphone_gtk_notify_recv,
|
||||
.new_unknown_subscriber=linphone_gtk_new_unknown_subscriber,
|
||||
.auth_info_requested=linphone_gtk_auth_info_requested,
|
||||
.display_status=linphone_gtk_display_status,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue