static void setpath_cb(GObex *obex, GError *err, GObexPacket *rsp, gpointer user_data) { struct setpath_data *data = user_data; char *next; if (err != NULL) { setpath_complete(err, data); return; } next = data->remaining[data->index]; if (next == NULL) { setpath_complete(NULL, data); return; } data->index++; g_obex_setpath(obex, next, setpath_cb, data, &err); if (err != NULL) { setpath_complete(err, data); g_error_free(err); } }
guint obc_session_setpath(struct obc_session *session, const char *path, session_callback_t func, void *user_data, GError **err) { struct setpath_data *data; struct pending_request *p; const char *first = ""; if (session->obex == NULL) { g_set_error(err, OBEX_IO_ERROR, OBEX_IO_DISCONNECTED, "Session disconnected"); return 0; } if (session->p != NULL) { g_set_error(err, OBEX_IO_ERROR, OBEX_IO_BUSY, "Session busy"); return 0; } data = g_new0(struct setpath_data, 1); data->func = func; data->user_data = user_data; data->remaining = g_strsplit(path, "/", 3); p = pending_request_new(session, NULL, setpath_complete, data); /* Relative path */ if (path[0] != '/') { first = data->remaining[data->index]; data->index++; } p->req_id = g_obex_setpath(session->obex, first, setpath_cb, p, err); if (*err != NULL) goto fail; session->p = p; return p->id; fail: g_strfreev(data->remaining); g_free(data); pending_request_free(p); return 0; }
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 int session_process_setpath(struct pending_request *p, GError **err) { struct setpath_data *req = p->data; const char *first = ""; /* Relative path */ if (req->remaining[0][0] != '/') first = req->remaining[req->index]; req->index++; p->req_id = g_obex_setpath(p->session->obex, first, setpath_cb, p, err); if (*err != NULL) return (*err)->code; p->session->p = p; return 0; }
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 gboolean setpath(GObex *obex, const char *path, size_t max_elem, setpath_cb_t func, gpointer user_data) { GError *err = NULL; struct setpath_data *data; data = g_new0(struct setpath_data, 1); g_obex_setpath(obex, "", setpath_cb, data, &err); if (err != NULL) { error("set_path: %s", err->message); g_error_free(err); g_free(data); return FALSE; } data->func = func; data->user_data = user_data; data->remaining = g_strsplit(path, "/", max_elem); return TRUE; }