Пример #1
0
struct sip_session *
sipe_core_conf_create(struct sipe_core_public *sipe_public,
		      const gchar *uri)
{
	gchar *uri_ue = sipe_utils_uri_unescape(uri);
	gchar *focus_uri;
	struct sip_session *session = NULL;

	SIPE_DEBUG_INFO("sipe_core_conf_create: URI '%s' unescaped '%s'",
			uri    ? uri    : "<UNDEFINED>",
			uri_ue ? uri_ue : "<UNDEFINED>");

	focus_uri = parse_ocs_focus_uri(uri_ue);
	if (!focus_uri) {
		focus_uri = parse_lync_join_url(uri_ue);
	}

	if (focus_uri) {
		session = sipe_conf_create(SIPE_CORE_PRIVATE, NULL, focus_uri);
		g_free(focus_uri);
	} else {
		gchar *error = g_strdup_printf(_("\"%s\" is not a valid conference URI"),
					       uri ? uri : "");
		sipe_backend_notify_error(sipe_public,
					  _("Failed to join the conference"),
					  error);
		g_free(error);
	}

	g_free(uri_ue);

	return session;
}
Пример #2
0
void sipe_backend_search_failed(struct sipe_core_public *sipe_public,
				SIPE_UNUSED_PARAMETER struct sipe_backend_search_token *token,
				const gchar *msg)
{
	sipe_backend_notify_error(sipe_public, msg, NULL);
}
Пример #3
0
/** Invite us to the focus callback */
static gboolean
process_invite_conf_focus_response(struct sipe_core_private *sipe_private,
				   struct sipmsg *msg,
				   SIPE_UNUSED_PARAMETER struct transaction *trans)
{
	struct sip_session *session = NULL;
	char *focus_uri = parse_from(sipmsg_find_header(msg, "To"));

	session = sipe_session_find_conference(sipe_private, focus_uri);

	if (!session) {
		SIPE_DEBUG_INFO("process_invite_conf_focus_response: unable to find conf session with focus=%s", focus_uri);
		g_free(focus_uri);
		return FALSE;
	}

	if (!session->focus_dialog) {
		SIPE_DEBUG_INFO_NOFORMAT("process_invite_conf_focus_response: session's focus_dialog is NULL");
		g_free(focus_uri);
		return FALSE;
	}

	sipe_dialog_parse(session->focus_dialog, msg, TRUE);

	if (msg->response >= 200) {
		/* send ACK to focus */
		session->focus_dialog->cseq = 0;
		sip_transport_ack(sipe_private, session->focus_dialog);
		session->focus_dialog->outgoing_invite = NULL;
		session->focus_dialog->is_established = TRUE;
	}

	if (msg->response >= 400) {
		gchar *reason = sipmsg_get_ms_diagnostics_reason(msg);

		SIPE_DEBUG_INFO_NOFORMAT("process_invite_conf_focus_response: INVITE response is not 200. Failed to join focus.");
		sipe_backend_notify_error(SIPE_CORE_PUBLIC,
					  _("Failed to join the conference"),
					  reason ? reason : _("no reason given"));
		g_free(reason);

		sipe_session_remove(sipe_private, session);
		g_free(focus_uri);
		return FALSE;
	} else if (msg->response == 200) {
		sipe_xml *xn_response = sipe_xml_parse(msg->body, msg->bodylen);
		const gchar *code = sipe_xml_attribute(xn_response, "code");
		if (sipe_strequal(code, "success")) {
			/* subscribe to focus */
			sipe_subscribe_conference(sipe_private,
						  session->chat_session->id,
						  FALSE);
#ifdef HAVE_VV
			if (session->is_call)
				sipe_core_media_connect_conference(SIPE_CORE_PUBLIC,
								   session->chat_session);
#endif
		}
		sipe_xml_free(xn_response);
	}

	g_free(focus_uri);
	return TRUE;
}