}
if (handle->session_callback && signal) {
- handle->session_callback(handle, session, signal, msg);
+ handle->session_callback(handle, session, signal, from, id, msg);
}
return LDL_STATUS_SUCCESS;
}
} else if (strcmp("failure", iks_name(node)) == 0) {
globals.logger(DL_LOG_DEBUG, "sasl authentication failed\n");
+ if (handle->session_callback) {
+ handle->session_callback(handle, NULL, LDL_SIGNAL_LOGIN_FAILURE, "core", "Login Failure", handle->login);
+ }
} else if (strcmp("success", iks_name(node)) == 0) {
globals.logger(DL_LOG_DEBUG, "XMPP server connected\n");
+ if (handle->session_callback) {
+ handle->session_callback(handle, NULL, LDL_SIGNAL_LOGIN_SUCCESS, "core", "Login Success", handle->login);
+ }
iks_send_header(handle->parser, handle->acc->server);
ldl_set_flag(handle, LDL_FLAG_AUTHORIZED);
} else {
{
char *cmd = iks_find_cdata(pak->x, "body");
char *from = iks_find_attrib(pak->x, "from");
+ char *subject = iks_find_attrib(pak->x, "subject");
ldl_handle_t *handle = user_data;
ldl_session_t *session = NULL;
- if (from && (session = apr_hash_get(handle->sessions, from, APR_HASH_KEY_STRING))) {
- if (handle->session_callback) {
- handle->session_callback(handle, session, LDL_SIGNAL_MSG, cmd);
- }
+ if (from) {
+ session = apr_hash_get(handle->sessions, from, APR_HASH_KEY_STRING);
}
-
- //printf("%s %s\n", handle->login, cmd);
+ if (handle->session_callback) {
+ handle->session_callback(handle, session, LDL_SIGNAL_MSG, from, subject ? subject : "N/A", cmd);
+ }
-
return 0;
}
return session->private_data;
}
-
void *ldl_handle_get_private(ldl_handle_t *handle)
{
return handle->private_info;
}
+void ldl_handle_send_msg(ldl_handle_t *handle, char *to, char *subject, char *body)
+{
+ iks *msg;
+
+ assert(handle != NULL);
+ assert(body != NULL);
+
+ msg = iks_make_msg(IKS_TYPE_NONE, to, body);
+
+ if (subject) {
+ iks_insert_attrib(msg, "subject", subject);
+ }
+
+ apr_queue_push(handle->queue, msg);
+
+}
+
void ldl_global_set_logger(ldl_logger_t logger)
{
globals.logger = logger;
LDL_SIGNAL_CANDIDATES,
LDL_SIGNAL_MSG,
LDL_SIGNAL_TERMINATE,
- LDL_SIGNAL_ERROR
+ LDL_SIGNAL_ERROR,
+ LDL_SIGNAL_LOGIN_SUCCESS,
+ LDL_SIGNAL_LOGIN_FAILURE,
} ldl_signal_t;
typedef enum {
#define DL_LOG_EMERG DL_PRE, 0
typedef ldl_status (*ldl_loop_callback_t)(ldl_handle_t *);
-typedef ldl_status (*ldl_session_callback_t)(ldl_handle_t *, ldl_session_t *, ldl_signal_t, char *);
+typedef ldl_status (*ldl_session_callback_t)(ldl_handle_t *, ldl_session_t *, ldl_signal_t, char *, char *, char *);
typedef ldl_status (*ldl_response_callback_t)(ldl_handle_t *, char *);
typedef void (*ldl_logger_t)(char *file, const char *func, int line, int level, char *fmt, ...);
*/
void *ldl_handle_get_private(ldl_handle_t *handle);
+
+/*!
+ \brief Send a message
+ \param handle the conection handle
+ \param to the message recipiant
+ \param subject optional subject
+ \param body body of the message
+*/
+void ldl_handle_send_msg(ldl_handle_t *handle, char *to, char *subject, char *body);
+
/*!
\brief Offer candidates to a potential session
\param session the session to send candidates on
#define DL_CAND_WAIT 10000000
#define DL_CAND_INITIAL_WAIT 2000000
+
+#define DL_EVENT_LOGIN_SUCCESS "dingaling::login_success"
+#define DL_EVENT_LOGIN_FAILURE "dingaling::login_failure"
+#define DL_EVENT_MESSAGE "dingaling::message"
+
static const char modname[] = "mod_dingaling";
static switch_memory_pool_t *module_pool = NULL;
static switch_status_t channel_write_frame(switch_core_session_t *session, switch_frame_t *frame, int timeout,
switch_io_flag_t flags, int stream_id);
static switch_status_t channel_kill_channel(switch_core_session_t *session, int sig);
- static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsession, ldl_signal_t signal, char *msg);
+ static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsession, ldl_signal_t signal, char *from, char *subject, char *msg);
static ldl_status handle_response(ldl_handle_t *handle, char *id);
static switch_status_t load_config(void);
load_config();
+ if (switch_event_reserve_subclass(DL_EVENT_LOGIN_SUCCESS) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!", DL_EVENT_LOGIN_SUCCESS);
+ return SWITCH_STATUS_GENERR;
+ }
+
+ if (switch_event_reserve_subclass(DL_EVENT_LOGIN_FAILURE) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!", DL_EVENT_LOGIN_FAILURE);
+ return SWITCH_STATUS_GENERR;
+ }
+
+ if (switch_event_reserve_subclass(DL_EVENT_MESSAGE) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!", DL_EVENT_MESSAGE);
+ return SWITCH_STATUS_GENERR;
+ }
+
/* connect my internal structure to the blank pointer passed to me */
*module_interface = &channel_module_interface;
-static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsession, ldl_signal_t signal, char *msg)
+static ldl_status handle_signalling(ldl_handle_t *handle, ldl_session_t *dlsession, ldl_signal_t signal, char *from, char *subject, char *msg)
{
struct mdl_profile *profile = NULL;
switch_core_session_t *session = NULL;
switch_channel_t *channel = NULL;
struct private_object *tech_pvt = NULL;
+ switch_event_t *event;
- assert(dlsession != NULL);
assert(handle != NULL);
if (!(profile = ldl_handle_get_private(handle))) {
return LDL_STATUS_FALSE;
}
+
+ //#define DL_EVENT_LOGIN_SUCCESS "dingaling::login_success"
+ //#define DL_EVENT_LOGIN_FAILURE "dingaling::login_failure"
+ //#define DL_EVENT_MESSAGE "dingaling::message"
+
+ if (!dlsession) {
+ switch(signal) {
+ case LDL_SIGNAL_MSG:
+ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, DL_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "login", profile->login);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", from);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "subject", subject);
+ switch_event_add_body(event, msg);
+ switch_event_fire(&event);
+ }
+ break;
+ case LDL_SIGNAL_LOGIN_SUCCESS:
+ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, DL_EVENT_LOGIN_SUCCESS) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "login", profile->login);
+ switch_event_fire(&event);
+ }
+ break;
+ case LDL_SIGNAL_LOGIN_FAILURE:
+ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, DL_EVENT_LOGIN_FAILURE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "login", profile->login);
+ switch_event_fire(&event);
+ }
+ break;
+ default:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR\n");
+ break;
+
+ }
+ return LDL_STATUS_SUCCESS;
+ }
+
+
if ((session = ldl_session_get_private(dlsession))) {
tech_pvt = switch_core_session_get_private(session);
assert(tech_pvt != NULL);
}
switch(signal) {
- case LDL_SIGNAL_NONE:
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR\n");
- break;
case LDL_SIGNAL_MSG:
if (msg) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "MSG [%s]\n", msg);
}
}
+ if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, DL_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "login", profile->login);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", from);
+ switch_event_add_header(event, SWITCH_STACK_BOTTOM, "subject", subject);
+ switch_event_add_body(event, msg);
+ switch_event_fire(&event);
+ }
+ break;
+
break;
case LDL_SIGNAL_INITIATE:
if (signal) {
}
break;
+
+ default:
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "ERROR\n");
+ break;
}
return LDL_STATUS_SUCCESS;