static void session_free(struct session_data *session) { DBG("%p", session); if (session->agent) agent_release(session); if (session->watch) g_dbus_remove_watch(session->conn, session->watch); if (session->obex != NULL) gw_obex_close(session->obex); if (session->io != NULL) { g_io_channel_shutdown(session->io, TRUE, NULL); g_io_channel_unref(session->io); } if (session->path) session_unregistered(session); if (session->conn) { dbus_connection_unref(session->conn); } g_free(session->callback); g_free(session->path); g_free(session->owner); g_free(session); }
static DBusMessage *release_agent(DBusConnection *conn, DBusMessage *msg, void *user_data) { bt_shell_printf("Agent released\n"); agent_release(conn); return dbus_message_new_method_return(msg); }
static void release_agents(void) { GHashTableIter iter; gpointer key, value; g_hash_table_iter_init(&iter, agent_hash); while (g_hash_table_iter_next(&iter, &key, &value)) agent_release(value, get_driver()->interface); }
static void agent_destroy(gpointer data) { struct agent *agent = data; DBG("agent %s", agent->owner); if (agent->watch > 0) { g_dbus_remove_watch(btd_get_dbus_connection(), agent->watch); agent->watch = 0; agent_release(agent); } agent_unref(agent); }
static void unregister_agent_reply(DBusMessage *message, void *user_data) { DBusConnection *conn = user_data; DBusError error; dbus_error_init(&error); if (dbus_set_error_from_message(&error, message) == FALSE) { bt_shell_printf("Agent unregistered\n"); agent_release(conn); } else { bt_shell_printf("Failed to unregister agent: %s\n", error.name); dbus_error_free(&error); } }
void agent_free(struct agent *agent) { if (!agent) return; if (agent->remove_cb) agent->remove_cb(agent, agent->remove_cb_data); if (agent->request) { DBusError err; agent_pincode_cb pincode_cb; agent_passkey_cb passkey_cb; agent_cb cb; dbus_error_init(&err); dbus_set_error_const(&err, "org.bluez.Error.Failed", "Canceled"); switch (agent->request->type) { case AGENT_REQUEST_PINCODE: pincode_cb = agent->request->cb; pincode_cb(agent, &err, NULL, agent->request->user_data); break; case AGENT_REQUEST_PASSKEY: passkey_cb = agent->request->cb; passkey_cb(agent, &err, 0, agent->request->user_data); break; default: cb = agent->request->cb; cb(agent, &err, agent->request->user_data); } dbus_error_free(&err); agent_cancel(agent); } if (!agent->exited) { g_dbus_remove_watch(btd_get_dbus_connection(), agent->listener_id); agent_release(agent); } g_free(agent->name); g_free(agent->path); g_free(agent); }
void agent_unregister(DBusConnection *conn, GDBusProxy *manager) { if (agent_registered == FALSE) { bt_shell_printf("No agent is registered\n"); return; } if (!manager) { bt_shell_printf("Agent unregistered\n"); agent_release(conn); return; } if (g_dbus_proxy_method_call(manager, "UnregisterAgent", unregister_agent_setup, unregister_agent_reply, conn, NULL) == FALSE) { bt_shell_printf("Failed to call unregister agent method\n"); return; } }
void ofono_handsfree_audio_unref(void) { if (ref_count == 0) { ofono_error("Error in handsfree audio manager ref counting"); return; } ref_count -= 1; if (ref_count > 0) return; g_dbus_unregister_interface(ofono_dbus_get_connection(), OFONO_MANAGER_PATH, HFP_AUDIO_MANAGER_INTERFACE); if (agent) { agent_release(agent); agent_free(agent); } __ofono_handsfree_audio_manager_cleanup(); }