gboolean blocking;
gboolean cancel_open;
- LmCallback *close_cb;
+ LmCallback *close_cb; /* unused */
LmCallback *auth_cb;
- LmCallback *register_cb;
+ LmCallback *register_cb; /* unused */
LmCallback *disconnect_cb;
connection_do_close (connection);
}
+ if (connection->open_cb) {
+ _lm_utils_free_callback (connection->open_cb);
+ }
+
+ if (connection->auth_cb) {
+ _lm_utils_free_callback (connection->auth_cb);
+ }
+
+ lm_connection_set_disconnect_function (connection, NULL, NULL, NULL);
+
while ((m = g_queue_pop_head (connection->incoming_messages)) != NULL) {
lm_message_unref (m);
}
const gchar *id;
LmHandlerResult result = LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+ lm_connection_ref (connection);
+
if (lm_message_get_type (m) == LM_MESSAGE_TYPE_STREAM) {
connection_stream_received (connection, m);
- return;
+ goto out;
}
id = lm_message_node_get_attribute (m->node, "id");
}
if (result == LM_HANDLER_RESULT_REMOVE_MESSAGE) {
- return;
+ goto out;
}
for (l = connection->handlers[lm_message_get_type (m)];
connection,
m);
}
+
+out:
+ lm_connection_unref (connection);
return;
}
if (connect_data->current_addr == NULL) {
connection_do_close (connection);
- if (connection->open_cb && connection->open_cb->func) {
+ if (connection->open_cb) {
LmCallback *cb = connection->open_cb;
+
+ connection->open_cb = NULL;
(* ((LmResultFunction) cb->func)) (connection, FALSE,
cb->user_data);
+ _lm_utils_free_callback (cb);
}
freeaddrinfo (connect_data->resolved_addrs);
_lm_connection_failed_with_error (connect_data,
_lm_sock_get_last_error());
}
-
+
static gboolean
connection_connect_cb (GIOChannel *source,
GIOCondition condition,
lm_verbose ("AUTH reply: %d\n", result);
- if (connection->auth_cb && connection->auth_cb->func) {
- LmCallback *cb = connection->auth_cb;
+ if (connection->auth_cb) {
+ LmCallback *cb = connection->auth_cb;
- (* ((LmResultFunction) cb->func)) (connection,
- result, cb->user_data);
+ connection->auth_cb = NULL;
+
+ if (cb->func) {
+ (* ((LmResultFunction) cb->func)) (connection,
+ result, cb->user_data);
+ }
+
+ _lm_utils_free_callback (cb);
}
- _lm_utils_free_callback (connection->auth_cb);
- connection->auth_cb = NULL;
-
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
connection_start_keep_alive (connection);
- if (connection->open_cb && connection->open_cb->func) {
+ if (connection->open_cb) {
LmCallback *cb = connection->open_cb;
+
+ connection->open_cb = NULL;
- (* ((LmResultFunction) cb->func)) (connection, result,
- cb->user_data);
+ if (cb->func) {
+ (* ((LmResultFunction) cb->func)) (connection, result,
+ cb->user_data);
+
+ }
+ _lm_utils_free_callback (connection->open_cb);
}
-
- _lm_utils_free_callback (connection->open_cb);
- connection->open_cb = NULL;
}
static gint
_lm_utils_free_callback (connection->disconnect_cb);
}
- connection->disconnect_cb = _lm_utils_new_callback (function,
- user_data,
- notify);
+ if (function) {
+ connection->disconnect_cb = _lm_utils_new_callback (function,
+ user_data,
+ notify);
+ } else {
+ connection->disconnect_cb = NULL;
+ }
}
/**