static void async_cb(GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data) { struct pending_request *p = user_data; struct obc_session *session = p->session; GError *gerr = NULL; uint8_t code; p->req_id = 0; if (err != NULL) { if (p->func) p->func(p->session, NULL, err, p->data); goto done; } code = g_obex_packet_get_operation(rsp, NULL); if (code != G_OBEX_RSP_SUCCESS) g_set_error(&gerr, OBEX_IO_ERROR, code, "%s", g_obex_strerror(code)); if (p->func) p->func(p->session, NULL, gerr, p->data); if (gerr != NULL) g_clear_error(&gerr); done: pending_request_free(p); session->p = NULL; session_process_queue(session); }
static void transfer_response(GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data) { struct transfer *transfer = user_data; GObexPacket *req; gboolean rspcode, final; guint id; g_obex_debug(G_OBEX_DEBUG_TRANSFER, "transfer %u", transfer->id); id = transfer->req_id; transfer->req_id = 0; if (err != NULL) { transfer_complete(transfer, err); return; } rspcode = g_obex_packet_get_operation(rsp, &final); if (rspcode != G_OBEX_RSP_SUCCESS && rspcode != G_OBEX_RSP_CONTINUE) { err = g_error_new(G_OBEX_ERROR, rspcode, "%s", g_obex_strerror(rspcode)); goto failed; } if (transfer->opcode == G_OBEX_OP_GET) { handle_get_body(transfer, rsp, &err); if (err != NULL) goto failed; } if (rspcode == G_OBEX_RSP_SUCCESS) { transfer_complete(transfer, NULL); return; } if (transfer->opcode == G_OBEX_OP_PUT) { req = g_obex_packet_new(transfer->opcode, FALSE, G_OBEX_HDR_INVALID); g_obex_packet_add_body(req, put_get_data, transfer); } else if (!g_obex_srm_active(transfer->obex)) { req = g_obex_packet_new(transfer->opcode, TRUE, G_OBEX_HDR_INVALID); } else { /* Keep id since request still outstanting */ transfer->req_id = id; return; } transfer->req_id = g_obex_send_req(obex, req, -1, transfer_response, transfer, &err); failed: if (err != NULL) { g_obex_debug(G_OBEX_DEBUG_ERROR, "%s", err->message); transfer_complete(transfer, err); g_error_free(err); } }
static void setpath_cb(GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data) { struct pending_request *p = user_data; struct setpath_data *data = p->data; char *next; char *current; guint8 code; p->req_id = 0; if (err != NULL) { setpath_complete(p->session, NULL, err, user_data); return; } code = g_obex_packet_get_operation(rsp, NULL); if (code != G_OBEX_RSP_SUCCESS) { GError *gerr = NULL; g_set_error(&gerr, OBEX_IO_ERROR, code, "%s", g_obex_strerror(code)); setpath_complete(p->session, NULL, gerr, user_data); g_clear_error(&gerr); return; } current = data->remaining[data->index - 1]; setpath_set_folder(p->session, current); /* Ignore empty folder names to avoid resetting the current path */ while ((next = data->remaining[data->index]) && strlen(next) == 0) data->index++; if (next == NULL) { setpath_complete(p->session, NULL, NULL, user_data); return; } data->index++; p->req_id = g_obex_setpath(obex, next, setpath_cb, p, &err); if (err != NULL) { setpath_complete(p->session, NULL, err, user_data); g_error_free(err); } }
static void setpath_cb(GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data) { struct pending_request *p = user_data; struct setpath_data *data = p->data; char *next; guint8 code; p->req_id = 0; if (err != NULL) { setpath_complete(p->session, NULL, err, user_data); return; } code = g_obex_packet_get_operation(rsp, NULL); if (code != G_OBEX_RSP_SUCCESS) { GError *gerr = NULL; g_set_error(&gerr, OBEX_IO_ERROR, code, "%s", g_obex_strerror(code)); setpath_complete(p->session, NULL, err, user_data); g_clear_error(&gerr); return; } next = data->remaining[data->index]; if (next == NULL) { setpath_complete(p->session, NULL, NULL, user_data); return; } data->index++; p->req_id = g_obex_setpath(obex, next, setpath_cb, p, &err); if (err != NULL) { setpath_complete(p->session, NULL, err, data); g_error_free(err); } }
static void handle_request(GObex *obex, GObexPacket *req) { GSList *match; int op; op = parse_request(obex, req); if (op < 0) goto fail; match = g_slist_find_custom(obex->req_handlers, GUINT_TO_POINTER(op), req_handler_cmpop); if (match) { struct req_handler *handler = match->data; handler->func(obex, req, handler->user_data); return; } op = -G_OBEX_RSP_NOT_IMPLEMENTED; fail: g_obex_debug(G_OBEX_DEBUG_ERROR, "%s", g_obex_strerror(-op)); g_obex_send_rsp(obex, -op, NULL, G_OBEX_HDR_INVALID); }