struct obc_session *obc_session_create(const char *source, const char *destination, const char *service, uint8_t channel, const char *owner, session_callback_t function, void *user_data) { DBusConnection *conn; struct obc_session *session; struct obc_transport *transport; struct obc_driver *driver; if (destination == NULL) return NULL; session = session_find(source, destination, service, channel, owner); if (session != NULL) goto proceed; /* FIXME: Do proper transport lookup when the API supports it */ transport = obc_transport_find("Bluetooth"); if (transport == NULL) return NULL; driver = obc_driver_find(service); if (driver == NULL) return NULL; conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); if (conn == NULL) return NULL; session = g_try_malloc0(sizeof(*session)); if (session == NULL) return NULL; session->refcount = 1; session->transport = transport; session->driver = driver; session->conn = conn; session->source = g_strdup(source); session->destination = g_strdup(destination); session->channel = channel; session->queue = g_queue_new(); if (owner) obc_session_set_owner(session, owner, owner_disconnected); proceed: if (session_connect(session, function, user_data) < 0) { obc_session_unref(session); return NULL; } DBG("session %p transport %s driver %s", session, session->transport->name, session->driver->service); return session; }
struct obc_session *obc_session_create(const char *source, const char *destination, const char *service, uint8_t channel, const char *owner, session_callback_t function, void *user_data) { struct obc_session *session; struct callback_data *callback; struct pending_req *req; struct obc_driver *driver; if (destination == NULL) return NULL; session = session_find(source, destination, service, channel, owner); if (session) { obc_session_ref(session); goto proceed; } driver = obc_driver_find(service); if (!driver) return NULL; session = g_try_malloc0(sizeof(*session)); if (session == NULL) return NULL; session->refcount = 1; session->channel = channel; session->conn = dbus_bus_get(DBUS_BUS_SESSION, NULL); if (session->conn == NULL) { session_free(session); return NULL; } session->conn_system = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL); if (session->conn_system == NULL) { session_free(session); return NULL; } if (source == NULL) bacpy(&session->src, BDADDR_ANY); else str2ba(source, &session->src); str2ba(destination, &session->dst); session->driver = driver; DBG("driver %s", driver->service); proceed: callback = g_try_malloc0(sizeof(*callback)); if (callback == NULL) { obc_session_unref(session); return NULL; } callback->session = obc_session_ref(session); callback->func = function; callback->data = user_data; if (source) { req = send_method_call(session->conn_system, BT_BUS_NAME, BT_PATH, BT_MANAGER_IFACE, "FindAdapter", manager_reply, callback, DBUS_TYPE_STRING, &source, DBUS_TYPE_INVALID); } else { req = send_method_call(session->conn_system, BT_BUS_NAME, BT_PATH, BT_MANAGER_IFACE, "DefaultAdapter", manager_reply, callback, DBUS_TYPE_INVALID); } if (!req) { obc_session_unref(session); g_free(callback); return NULL; } session->pending_calls = g_slist_prepend(session->pending_calls, req); if (owner) obc_session_set_owner(session, owner, owner_disconnected); return session; }