[Pkg-voip-commits] [janus] 22/282: Working outgoing INVITE (incoming calls, BYEs, etc. still WIP)

Jonas Smedegaard dr at jones.dk
Wed Dec 20 21:53:24 UTC 2017


This is an automated email from the git hooks/post-receive script.

js pushed a commit to annotated tag debian/0.2.6-1
in repository janus.

commit 2efd8512c965d2636a36f527f6dfc9dfb9efa02a
Author: Lorenzo Miniero <lminiero at gmail.com>
Date:   Wed Apr 5 12:21:23 2017 +0200

    Working outgoing INVITE (incoming calls, BYEs, etc. still WIP)
---
 plugins/janus_sipre.c | 341 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 298 insertions(+), 43 deletions(-)

diff --git a/plugins/janus_sipre.c b/plugins/janus_sipre.c
index 4f0576f..6c6dd78 100644
--- a/plugins/janus_sipre.c
+++ b/plugins/janus_sipre.c
@@ -221,7 +221,12 @@ static struct mqueue *mq = NULL;
 void janus_sipre_mqueue_handler(int id, void *data, void *arg);
 typedef enum janus_sipre_mqueue_event {
 	janus_sipre_mqueue_event_do_init,
+	janus_sipre_mqueue_event_do_listen,
 	janus_sipre_mqueue_event_do_register,
+	janus_sipre_mqueue_event_do_call,
+	janus_sipre_mqueue_event_do_accept,
+	janus_sipre_mqueue_event_do_rcode,
+	janus_sipre_mqueue_event_do_bye,
 	/* TODO Add other events here */
 	janus_sipre_mqueue_event_do_exit
 } janus_sipre_mqueue_event;
@@ -229,8 +234,18 @@ static const char *janus_sipre_mqueue_event_string(janus_sipre_mqueue_event even
 	switch(event) {
 		case janus_sipre_mqueue_event_do_init:
 			return "init";
+		case janus_sipre_mqueue_event_do_listen:
+			return "listen";
 		case janus_sipre_mqueue_event_do_register:
 			return "register";
+		case janus_sipre_mqueue_event_do_call:
+			return "call";
+		case janus_sipre_mqueue_event_do_accept:
+			return "accept";
+		case janus_sipre_mqueue_event_do_rcode:
+			return "rcode";
+		case janus_sipre_mqueue_event_do_bye:
+			return "bye";
 		case janus_sipre_mqueue_event_do_exit:
 			return "exit";
 		default:
@@ -318,8 +333,7 @@ typedef struct janus_sipre_stack {
 	struct sipsess *sess;				/* SIP session */
 	struct sipsess_sock *sess_sock;		/* SIP session socket */
 	struct sipreg *reg;					/* SIP registration */
-	struct sdp_session *sdp;			/* SDP session */
-	struct sdp_media *sdp_media;		/* SDP media */
+	struct sip_msg *invite;				/* Current INVITE */
 	void *session;						/* Opaque pointer to the plugin session */
 } janus_sipre_stack;
 
@@ -364,6 +378,8 @@ typedef struct janus_sipre_session {
 	char *transaction;
 	char *callee;
 	char *callid;
+	int temp_rcode;
+	char *temp_sdp, *temp_headers;
 	janus_sdp *sdp;				/* The SDP this user sent */
 	janus_recorder *arc;		/* The Janus recorder instance for this user's audio, if enabled */
 	janus_recorder *arc_peer;	/* The Janus recorder instance for the peer's audio, if enabled */
@@ -954,11 +970,7 @@ void janus_sipre_create_session(janus_plugin_session *handle, int *error) {
 	janus_mutex_init(&session->mutex);
 	handle->plugin_handle = session;
 
-	int err = sipsess_listen(&session->stack.sess_sock, sipstack, 32, janus_sipre_cb_established, session);
-	if(err < 0) {
-		/* TODO Anything we should do? */
-		JANUS_LOG(LOG_ERR, "Error listening: %d (%s)\n", err, strerror(err));
-	}
+	mqueue_push(mq, janus_sipre_mqueue_event_do_listen, session);
 
 	janus_mutex_lock(&sessions_mutex);
 	g_hash_table_insert(sessions, handle, session);
@@ -1511,12 +1523,12 @@ static void *janus_sipre_handler(void *data) {
 			}
 		} else if(!strcasecmp(request_text, "call")) {
 			/* Call another peer */
-			//~ if(session->stack == NULL) {
-				//~ JANUS_LOG(LOG_ERR, "Wrong state (register first)\n");
-				//~ error_code = JANUS_SIPRE_ERROR_WRONG_STATE;
-				//~ g_snprintf(error_cause, 512, "Wrong state (register first)");
-				//~ goto error;
-			//~ }
+			if(session->account.registration_status < janus_sipre_registration_status_registered) {
+				JANUS_LOG(LOG_ERR, "Wrong state (register first)\n");
+				error_code = JANUS_SIPRE_ERROR_WRONG_STATE;
+				g_snprintf(error_cause, 512, "Wrong state (register first)");
+				goto error;
+			}
 			if(session->status >= janus_sipre_call_status_inviting) {
 				JANUS_LOG(LOG_ERR, "Wrong state (already in a call? status=%s)\n", janus_sipre_call_status_string(session->status));
 				error_code = JANUS_SIPRE_ERROR_WRONG_STATE;
@@ -1653,8 +1665,6 @@ static void *janus_sipre_handler(void *data) {
 			} else {
 				g_snprintf(from_hdr, sizeof(from_hdr), "%s", session->account.identity);
 			}
-			/* Prepare the stack */
-				/* TODO */
 			g_atomic_int_set(&session->hangingup, 0);
 			session->status = janus_sipre_call_status_inviting;
 			/* Create a random call-id */
@@ -1669,13 +1679,16 @@ static void *janus_sipre_handler(void *data) {
 				json_object_set_new(info, "sdp", json_string(sdp));
 				gateway->notify_event(&janus_sipre_plugin, session->handle, info);
 			}
-			/* Send INVITE */
+			/* Enqueue the INVITE */
 			session->callee = g_strdup(uri_text);
 			session->callid = g_strdup(callid);
 			g_hash_table_insert(callids, session->callid, session);
 			session->media.autoack = do_autoack;
-				/* TODO Use re to send INVITE */
-			g_free(sdp);
+			session->temp_sdp = sdp;
+			if(strlen(custom_headers) > 0)
+				session->temp_headers = g_strdup(custom_headers);
+			mqueue_push(mq, janus_sipre_mqueue_event_do_call, session);
+			/* Done for now */
 			if(session->transaction)
 				g_free(session->transaction);
 			session->transaction = msg->transaction ? g_strdup(msg->transaction) : NULL;
@@ -1794,11 +1807,11 @@ static void *janus_sipre_handler(void *data) {
 					json_object_set_new(info, "call-id", json_string(session->callid));
 				gateway->notify_event(&janus_sipre_plugin, session->handle, info);
 			}
-			/* Send 200 OK */
+			/* Enqueue the 200 OK */
 			g_atomic_int_set(&session->hangingup, 0);
 			session->status = janus_sipre_call_status_incall;
-				/* TODO Use re to send 200 OK */
-			g_free(sdp);
+			session->temp_sdp = sdp;
+			mqueue_push(mq, janus_sipre_mqueue_event_do_accept, session);
 			/* Send an ack back */
 			result = json_object();
 			json_object_set_new(result, "event", json_string("accepted"));
@@ -1837,7 +1850,9 @@ static void *janus_sipre_handler(void *data) {
 				JANUS_LOG(LOG_WARN, "Invalid SIPre response code specified, using 486 to decline call\n");
 				response_code = 486;
 			}
-				/* TODO Use re to send error */
+			/* Enqueue the response */
+			session->temp_rcode = response_code;
+			mqueue_push(mq, janus_sipre_mqueue_event_do_rcode, session);
 			/* Also notify event handlers */
 			if(notify_events && gateway->events_is_enabled()) {
 				json_t *info = json_object();
@@ -1848,8 +1863,6 @@ static void *janus_sipre_handler(void *data) {
 				json_object_set_new(info, "code", json_integer(response_code));
 				gateway->notify_event(&janus_sipre_plugin, session->handle, info);
 			}
-			g_free(session->callee);
-			session->callee = NULL;
 			/* Notify the operation */
 			result = json_object();
 			json_object_set_new(result, "event", json_string("declining"));
@@ -1871,9 +1884,8 @@ static void *janus_sipre_handler(void *data) {
 				goto error;
 			}
 			session->status = janus_sipre_call_status_closing;
-				/* TODO Use re to send BYE */
-			g_free(session->callee);
-			session->callee = NULL;
+			/* Enqueue the BYE */
+			mqueue_push(mq, janus_sipre_mqueue_event_do_bye, session);
 			/* Notify the operation */
 			result = json_object();
 			json_object_set_new(result, "event", json_string("hangingup"));
@@ -2894,7 +2906,12 @@ void janus_sipre_cb_register(int err, const struct sip_msg *msg, void *arg) {
 /* Called when SIP progress (e.g., 180 Ringing) responses are received */
 void janus_sipre_cb_progress(const struct sip_msg *msg, void *arg) {
 	janus_sipre_session *session = (janus_sipre_session *)arg;
-	JANUS_LOG(LOG_INFO, "[SIPre-%s] session progress: %u %s\n", session->account.username, msg->scode, (char *)&msg->reason.p);
+	char reason[256];
+	reason[0] = '\0';
+	if(msg->reason.l > 0) {
+		g_snprintf(reason, (msg->reason.l < 255 ? msg->reason.l+1 : 255), "%s", msg->reason.p);
+	}
+	JANUS_LOG(LOG_INFO, "[SIPre-%s] Session progress: %u %s\n", session->account.username, msg->scode, reason);
 
 	/* TODO Handle */
 }
@@ -2930,25 +2947,94 @@ int janus_sipre_cb_offer(struct mbuf **mbp, const struct sip_msg *msg, void *arg
 }
 
 
-/* called when an SDP answer is received */
+/* Called when an SDP answer is received */
 int janus_sipre_cb_answer(const struct sip_msg *msg, void *arg) {
 	janus_sipre_session *session = (janus_sipre_session *)arg;
 	JANUS_LOG(LOG_INFO, "[SIPre-%s] janus_sipre_cb_answer\n", session->account.username);
 
-	JANUS_LOG(LOG_INFO, "SDP answer received\n");
-
-	struct sdp_session *sdp = NULL;
-	int err = sdp_decode(sdp, msg->mb, false);
-	if(err) {
-		JANUS_LOG(LOG_ERR, "unable to decode SDP answer: %s\n", strerror(err));
-		return err;
+	const char *sdp_answer = (const char *)mbuf_buf(msg->mb);
+	JANUS_LOG(LOG_INFO, "SDP answer received\n%s", sdp_answer);
+
+	/* Parse the SDP */
+	char sdperror[100];
+	janus_sdp *sdp = janus_sdp_parse(sdp_answer, sdperror, sizeof(sdperror));
+	if(!sdp) {
+		JANUS_LOG(LOG_ERR, "\tError parsing SDP! %s\n", sdperror);
+		return EINVAL;
+	}
+	/* Parse SDP */
+	JANUS_LOG(LOG_VERB, "Peer accepted our call:\n%s", sdp_answer);
+	session->status = janus_sipre_call_status_incall;
+	char *fixed_sdp = g_strdup(sdp_answer);
+	janus_sipre_sdp_process(session, sdp, TRUE, FALSE, NULL);
+	/* If we asked for SRTP and are not getting it, fail */
+	if(session->media.require_srtp && !session->media.has_srtp_remote) {
+		JANUS_LOG(LOG_ERR, "\tWe asked for mandatory SRTP but didn't get any in the reply!\n");
+		janus_sdp_free(sdp);
+		g_free(fixed_sdp);
+		/* Hangup immediately */
+		session->status = janus_sipre_call_status_closing;
+		mqueue_push(mq, janus_sipre_mqueue_event_do_bye, session);
+		g_free(session->callee);
+		session->callee = NULL;
+		return EINVAL;
+	}
+	if(!session->media.remote_ip) {
+		/* No remote address parsed? Give up */
+		JANUS_LOG(LOG_ERR, "\tNo remote IP address found for RTP, something's wrong with the SDP!\n");
+		janus_sdp_free(sdp);
+		g_free(fixed_sdp);
+		/* Hangup immediately */
+		session->status = janus_sipre_call_status_closing;
+		mqueue_push(mq, janus_sipre_mqueue_event_do_bye, session);
+		g_free(session->callee);
+		session->callee = NULL;
+		return EINVAL;
+	}
+	if(session->media.audio_pt > -1) {
+		session->media.audio_pt_name = janus_get_codec_from_pt(fixed_sdp, session->media.audio_pt);
+		JANUS_LOG(LOG_VERB, "Detected audio codec: %d (%s)\n", session->media.audio_pt, session->media.audio_pt_name);
+	}
+	if(session->media.video_pt > -1) {
+		session->media.video_pt_name = janus_get_codec_from_pt(fixed_sdp, session->media.video_pt);
+		JANUS_LOG(LOG_VERB, "Detected video codec: %d (%s)\n", session->media.video_pt, session->media.video_pt_name);
+	}
+	session->media.ready = 1;	/* FIXME Maybe we need a better way to signal this */
+	GError *error = NULL;
+	char tname[16];
+	g_snprintf(tname, sizeof(tname), "siprtp %s", session->account.username);
+	g_thread_try_new(tname, janus_sipre_relay_thread, session, &error);
+	if(error != NULL) {
+		JANUS_LOG(LOG_ERR, "Got error %d (%s) trying to launch the RTP/RTCP thread...\n", error->code, error->message ? error->message : "??");
+	}
+	/* Send SDP to the browser */
+	json_t *jsep = json_pack("{ssss}", "type", "answer", "sdp", fixed_sdp);
+	json_t *call = json_object();
+	json_object_set_new(call, "sip", json_string("event"));
+	json_t *calling = json_object();
+	json_object_set_new(calling, "event", json_string("accepted"));
+	json_object_set_new(calling, "username", json_string(session->callee));
+	json_object_set_new(call, "result", calling);
+	int ret = gateway->push_event(session->handle, &janus_sipre_plugin, session->transaction, call, jsep);
+	JANUS_LOG(LOG_VERB, "  >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));
+	json_decref(call);
+	json_decref(jsep);
+	g_free(fixed_sdp);
+	janus_sdp_free(sdp);
+	/* Also notify event handlers */
+	if(notify_events && gateway->events_is_enabled()) {
+		json_t *info = json_object();
+		json_object_set_new(info, "event", json_string("accepted"));
+		if(session->callid)
+			json_object_set_new(info, "call-id", json_string(session->callid));
+		json_object_set_new(info, "username", json_string(session->callee));
+		gateway->notify_event(&janus_sipre_plugin, session->handle, info);
 	}
 
-	/* TODO Handle */
 	return 0;
 }
 
-/* called when the session is established */
+/* Called when the session is established */
 void janus_sipre_cb_established(const struct sip_msg *msg, void *arg) {
 	janus_sipre_session *session = (janus_sipre_session *)arg;
 	JANUS_LOG(LOG_INFO, "[SIPre-%s] janus_sipre_cb_established\n", session->account.username);
@@ -2966,7 +3052,34 @@ void janus_sipre_cb_closed(int err, const struct sip_msg *msg, void *arg) {
 		JANUS_LOG(LOG_INFO, "[SIPre-%s] janus_sipre_cb_closed: %u %s\n", session->account.username, msg->scode, (char *)&msg->reason.p);
 	}
 
-	/* TODO Handle */
+	/* Tell the browser... */
+	json_t *event = json_object();
+	json_object_set_new(event, "sip", json_string("event"));
+	json_t *result = json_object();
+	json_object_set_new(result, "event", json_string("hangup"));
+	json_object_set_new(result, "code", json_integer(err ? err : msg->scode));
+	char reason[256];
+	reason[0] = '\0';
+	if(!err && msg->reason.l > 0) {
+		g_snprintf(reason, (msg->reason.l < 255 ? msg->reason.l+1 : 255), "%s", msg->reason.p);
+	}
+	json_object_set_new(result, "reason", json_string(err ? strerror(err) : reason));
+	json_object_set_new(event, "result", result);
+	int ret = gateway->push_event(session->handle, &janus_sipre_plugin, session->transaction, event, NULL);
+	JANUS_LOG(LOG_VERB, "  >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));
+	json_decref(event);
+	/* Also notify event handlers */
+	if(notify_events && gateway->events_is_enabled()) {
+		json_t *info = json_object();
+		json_object_set_new(info, "event", json_string("hangup"));
+		json_object_set_new(info, "code", json_integer(err ? err : msg->scode));
+		json_object_set_new(info, "reason", json_string(err ? strerror(err) : reason));
+		gateway->notify_event(&janus_sipre_plugin, session->handle, info);
+	}
+
+	/* Cleanup */
+	session->stack.sess = mem_deref(session->stack.sess);
+	session->stack.reg = mem_deref(session->stack.reg);
 }
 
 /* Called when all SIP transactions are completed */
@@ -2978,7 +3091,7 @@ void janus_sipre_cb_exit(void *arg) {
 
 /* Callback to implement SIP requests in the re_main loop thread */
 void janus_sipre_mqueue_handler(int id, void *data, void *arg) {
-	JANUS_LOG(LOG_HUGE, "janus_sipre_mqueue_handler: %d (%s)\n", id, janus_sipre_mqueue_event_string((janus_sipre_mqueue_event)id));
+	JANUS_LOG(LOG_WARN, "janus_sipre_mqueue_handler: %d (%s)\n", id, janus_sipre_mqueue_event_string((janus_sipre_mqueue_event)id));
 	switch((janus_sipre_mqueue_event)id) {
 		case janus_sipre_mqueue_event_do_init: {
 			JANUS_LOG(LOG_INFO, "Initializing SIP transports\n");
@@ -3003,21 +3116,163 @@ void janus_sipre_mqueue_handler(int id, void *data, void *arg) {
 			mem_deref(tls);
 			break;
 		}
+		case janus_sipre_mqueue_event_do_listen: {
+			janus_sipre_session *session = (janus_sipre_session *)data;
+			JANUS_LOG(LOG_VERB, "[SIPre-%s] Listening\n", session->account.username);
+			int err = sipsess_listen(&session->stack.sess_sock, sipstack, 32, janus_sipre_cb_incoming, session);
+			if(err != 0) {
+				/* TODO Anything we should do? */
+				JANUS_LOG(LOG_ERR, "Error listening: %d (%s)\n", err, strerror(err));
+			}
+			break;
+		}
 		case janus_sipre_mqueue_event_do_register: {
 			janus_sipre_session *session = (janus_sipre_session *)data;
 			JANUS_LOG(LOG_VERB, "[SIPre-%s] Sending REGISTER\n", session->account.username);
+			/* Send the REGISTER */
 			int err = sipreg_register(&session->stack.reg, sipstack,
 				session->account.proxy,
 				session->account.identity, session->account.identity, 3600,
 				session->account.display_name ? session->account.display_name : session->account.username, NULL, 0, 0,
 				janus_sipre_cb_auth, session, FALSE,
 				janus_sipre_cb_register, session, NULL, NULL);
-			if(err < 0) {
-				/* TODO Send event and handle accordingly */
-				JANUS_LOG(LOG_ERR, "Error attempting to REGISTER...\n");
+			if(err != 0) {
+				JANUS_LOG(LOG_ERR, "Error attempting to REGISTER: %d (%s)\n", err, strerror(err));
+				/* Tell the browser... */
+				json_t *event = json_object();
+				json_object_set_new(event, "sip", json_string("event"));
+				json_t *result = json_object();
+				json_object_set_new(result, "event", json_string("registration_failed"));
+				json_object_set_new(result, "code", json_integer(err));
+				json_object_set_new(result, "reason", json_string(strerror(err)));
+				json_object_set_new(event, "result", result);
+				int ret = gateway->push_event(session->handle, &janus_sipre_plugin, session->transaction, event, NULL);
+				JANUS_LOG(LOG_VERB, "  >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));
+				json_decref(event);
+				/* Also notify event handlers */
+				if(notify_events && gateway->events_is_enabled()) {
+					json_t *info = json_object();
+					json_object_set_new(info, "event", json_string("registration_failed"));
+					json_object_set_new(info, "code", json_integer(err));
+					json_object_set_new(info, "reason", json_string(strerror(err)));
+					gateway->notify_event(&janus_sipre_plugin, session->handle, info);
+				}
 			}
 			break;
 		}
+		case janus_sipre_mqueue_event_do_call: {
+			janus_sipre_session *session = (janus_sipre_session *)data;
+			JANUS_LOG(LOG_WARN, "[SIPre-%s] Sending INVITE\n%s", session->account.username, session->temp_sdp);
+			/* Convert the SDP into a struct mbuf */
+			struct mbuf *mb = mbuf_alloc(strlen(session->temp_sdp)+1);
+			mbuf_printf(mb, "%s", session->temp_sdp);
+			mbuf_set_pos(mb, 0);
+			/* Send the INVITE */
+			int err = sipsess_connect(&session->stack.sess, session->stack.sess_sock,
+				session->callee,
+				session->account.display_name, session->account.identity,
+				session->account.display_name ? session->account.display_name : session->account.username,
+				NULL, 0, "application/sdp", mb,
+				janus_sipre_cb_auth, session, FALSE,
+				janus_sipre_cb_offer, janus_sipre_cb_answer,
+				janus_sipre_cb_progress, janus_sipre_cb_established,
+				NULL, NULL, janus_sipre_cb_closed, session,
+				"%s", (session->temp_headers ? session->temp_headers : ""));
+			if(err != 0) {
+				JANUS_LOG(LOG_ERR, "Error attempting to INVITE: %d (%s)\n", err, strerror(err));
+				/* Tell the browser... */
+				json_t *event = json_object();
+				json_object_set_new(event, "sip", json_string("event"));
+				json_t *result = json_object();
+				json_object_set_new(result, "event", json_string("hangup"));
+				json_object_set_new(result, "code", json_integer(err));
+				json_object_set_new(result, "reason", json_string(strerror(err)));
+				json_object_set_new(event, "result", result);
+				int ret = gateway->push_event(session->handle, &janus_sipre_plugin, session->transaction, event, NULL);
+				JANUS_LOG(LOG_VERB, "  >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));
+				json_decref(event);
+				/* Also notify event handlers */
+				if(notify_events && gateway->events_is_enabled()) {
+					json_t *info = json_object();
+					json_object_set_new(info, "event", json_string("hangup"));
+					json_object_set_new(info, "code", json_integer(err));
+					json_object_set_new(info, "reason", json_string(strerror(err)));
+					gateway->notify_event(&janus_sipre_plugin, session->handle, info);
+				}
+			}
+			mem_deref(mb);
+			g_free(session->temp_sdp);
+			session->temp_sdp = NULL;
+			g_free(session->temp_headers);
+			session->temp_headers = NULL;
+			break;
+		}
+		case janus_sipre_mqueue_event_do_accept: {
+			janus_sipre_session *session = (janus_sipre_session *)data;
+			JANUS_LOG(LOG_WARN, "[SIPre-%s] Sending 200 OK\n%s", session->account.username, session->temp_sdp);
+			/* Convert the SDP into a struct mbuf */
+			struct mbuf *mb = mbuf_alloc(strlen(session->temp_sdp)+1);
+			mbuf_printf(mb, "%s", session->temp_sdp);
+			mbuf_set_pos(mb, 0);
+			/* Send the 200 OK */
+			int err = sipsess_accept(&session->stack.sess, session->stack.sess_sock,
+				session->stack.invite, 200, "OK",
+				session->account.display_name ? session->account.display_name : session->account.username,
+				"application/sdp", mb,
+				janus_sipre_cb_auth, session, FALSE,
+				janus_sipre_cb_offer, janus_sipre_cb_answer,
+				janus_sipre_cb_established, NULL, NULL,
+				janus_sipre_cb_closed, NULL, NULL);
+			if(err != 0) {
+				JANUS_LOG(LOG_ERR, "Error attempting to send the 200 OK: %d (%s)\n", err, strerror(err));
+				/* Tell the browser... */
+				json_t *event = json_object();
+				json_object_set_new(event, "sip", json_string("event"));
+				json_t *result = json_object();
+				json_object_set_new(result, "event", json_string("hangup"));
+				json_object_set_new(result, "code", json_integer(err));
+				json_object_set_new(result, "reason", json_string(strerror(err)));
+				json_object_set_new(event, "result", result);
+				int ret = gateway->push_event(session->handle, &janus_sipre_plugin, session->transaction, event, NULL);
+				JANUS_LOG(LOG_VERB, "  >> Pushing event to peer: %d (%s)\n", ret, janus_get_api_error(ret));
+				json_decref(event);
+				/* Also notify event handlers */
+				if(notify_events && gateway->events_is_enabled()) {
+					json_t *info = json_object();
+					json_object_set_new(info, "event", json_string("hangup"));
+					json_object_set_new(info, "code", json_integer(err));
+					json_object_set_new(info, "reason", json_string(strerror(err)));
+					gateway->notify_event(&janus_sipre_plugin, session->handle, info);
+				}
+			}
+			mem_deref(mb);
+			g_free(session->temp_sdp);
+			session->temp_sdp = NULL;
+			g_free(session->temp_headers);
+			session->temp_headers = NULL;
+			break;
+		}
+		case janus_sipre_mqueue_event_do_rcode: {
+			janus_sipre_session *session = (janus_sipre_session *)data;
+			JANUS_LOG(LOG_WARN, "[SIPre-%s] Sending response code %d\n", session->account.username, session->temp_rcode);
+			/* Send the response code */
+			struct sip_msg *msg = NULL;	/* TODO Needs to be the message to reply to */
+			sip_treply(NULL, sipstack, msg, session->temp_rcode, NULL);
+			if(session->temp_rcode > 399) {
+				g_free(session->callee);
+				session->callee = NULL;
+			}
+			break;
+		}
+		case janus_sipre_mqueue_event_do_bye: {
+			janus_sipre_session *session = (janus_sipre_session *)data;
+			JANUS_LOG(LOG_WARN, "[SIPre-%s] Sending BYE\n", session->account.username);
+			/* TODO */
+			sipsess_close_all(session->stack.sess_sock);
+			g_free(session->callee);
+			session->callee = NULL;
+			break;
+		}
 		case janus_sipre_mqueue_event_do_exit:
 			/* We're done, here, break the loop */
 			re_cancel();

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/janus.git



More information about the Pkg-voip-commits mailing list