guint obc_session_queue(struct obc_session *session, struct obc_transfer *transfer, session_callback_t func, void *user_data, GError **err) { struct pending_request *p; if (session->obex == NULL) { obc_transfer_unregister(transfer); g_set_error(err, OBEX_IO_ERROR, -ENOTCONN, "Session not connected"); return 0; } if (!obc_transfer_register(transfer, session->conn, session->owner, err)) { obc_transfer_unregister(transfer); return 0; } obc_transfer_set_callback(transfer, transfer_complete, session); p = pending_request_new(session, transfer, func, user_data); g_queue_push_tail(session->queue, p); if (session->queue_complete_id == 0) session->queue_complete_id = g_idle_add( session_queue_complete, session); return p->id; }
static void pending_request_free(struct pending_request *p) { if (p->transfer) obc_transfer_unregister(p->transfer); if (p->session) obc_session_unref(p->session); g_free(p); }
static void pending_request_free(struct pending_request *p) { if (p->req_id > 0) g_obex_cancel_req(p->session->obex, p->req_id, TRUE); if (p->destroy) p->destroy(p->data); if (p->transfer) obc_transfer_unregister(p->transfer); if (p->session) obc_session_unref(p->session); g_free(p); }
static void pull_vcard_listing_callback(struct obc_session *session, GError *err, void *user_data) { struct obc_transfer *transfer = obc_session_get_transfer(session); struct pbap_data *pbap = user_data; GMarkupParseContext *ctxt; DBusMessage *reply; DBusMessageIter iter, array; const char *buf; int size; if (pbap->msg == NULL) goto complete; if (err) { reply = g_dbus_create_error(pbap->msg, "org.openobex.Error.Failed", "%s", err->message); goto send; } reply = dbus_message_new_method_return(pbap->msg); buf = obc_transfer_get_buffer(transfer, &size); if (size == 0) buf = ""; dbus_message_iter_init_append(reply, &iter); dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, DBUS_STRUCT_BEGIN_CHAR_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_STRING_AS_STRING DBUS_STRUCT_END_CHAR_AS_STRING, &array); ctxt = g_markup_parse_context_new(&listing_parser, 0, &array, NULL); g_markup_parse_context_parse(ctxt, buf, strlen(buf) - 1, NULL); g_markup_parse_context_free(ctxt); dbus_message_iter_close_container(&iter, &array); obc_transfer_clear_buffer(transfer); send: g_dbus_send_message(conn, reply); dbus_message_unref(pbap->msg); pbap->msg = NULL; complete: obc_transfer_unregister(transfer); }
static void session_terminate_transfer(struct obc_session *session, struct obc_transfer *transfer, GError *gerr) { struct session_callback *callback = session->callback; if (callback) { callback->func(session, gerr, callback->data); return; } obc_session_ref(session); obc_transfer_unregister(transfer); if (session->pending) session_request(session, session_prepare_put, session->pending->data); obc_session_unref(session); }
static void pull_phonebook_callback(struct obc_session *session, GError *err, void *user_data) { struct obc_transfer *transfer = obc_session_get_transfer(session); struct pbap_data *pbap = user_data; DBusMessage *reply; const char *buf; int size; if (pbap->msg == NULL) goto done; if (err) { reply = g_dbus_create_error(pbap->msg, "org.openobex.Error.Failed", "%s", err->message); goto send; } reply = dbus_message_new_method_return(pbap->msg); buf = obc_transfer_get_buffer(transfer, &size); if (size == 0) buf = ""; dbus_message_append_args(reply, DBUS_TYPE_STRING, &buf, DBUS_TYPE_INVALID); obc_transfer_clear_buffer(transfer); send: g_dbus_send_message(conn, reply); dbus_message_unref(pbap->msg); pbap->msg = NULL; done: obc_transfer_unregister(transfer); }
static void phonebook_size_callback(struct obc_session *session, GError *err, void *user_data) { struct obc_transfer *transfer = obc_session_get_transfer(session); struct pbap_data *pbap = user_data; DBusMessage *reply; guint16 phone_book_size; guint8 new_missed_calls; if (pbap->msg == NULL) goto done; if (err) { reply = g_dbus_create_error(pbap->msg, "org.openobex.Error.Failed", "%s", err->message); goto send; } reply = dbus_message_new_method_return(pbap->msg); read_return_apparam(session, &phone_book_size, &new_missed_calls); dbus_message_append_args(reply, DBUS_TYPE_UINT16, &phone_book_size, DBUS_TYPE_INVALID); obc_transfer_clear_buffer(transfer); send: g_dbus_send_message(conn, reply); dbus_message_unref(pbap->msg); pbap->msg = NULL; done: obc_transfer_unregister(transfer); }