void xmms_fetch_spec_free (xmms_fetch_spec_t *spec) { int i; if (spec == NULL) return; switch (spec->type) { case FETCH_METADATA: g_free (spec->data.metadata.cols); break; case FETCH_CLUSTER_DICT: case FETCH_CLUSTER_LIST: xmms_fetch_spec_free (spec->data.cluster.data); break; case FETCH_ORGANIZE: for (i = 0; i < spec->data.organize.count; i++) { xmms_fetch_spec_free (spec->data.organize.data[i]); } g_free (spec->data.organize.keys); g_free (spec->data.organize.data); break; case FETCH_COUNT: /* Nothing to free */ break; default: g_assert_not_reached (); } g_free (spec); }
static xmms_fetch_spec_t * xmms_fetch_spec_new_organize (xmmsv_t *fetch, xmms_fetch_info_t *info, s4_sourcepref_t *prefs, xmms_error_t *err) { xmms_fetch_spec_t *spec; xmmsv_dict_iter_t *it; s4_sourcepref_t *sp; xmmsv_t *org_data; gint org_idx; if (!xmmsv_dict_get (fetch, "data", &org_data)) { xmms_error_set (err, XMMS_ERROR_INVAL, "Required field 'data' not set in organize."); return NULL; } if (xmmsv_get_type (org_data) != XMMSV_TYPE_DICT) { xmms_error_set (err, XMMS_ERROR_INVAL, "Field 'data' in organize must be a dict."); return NULL; } sp = normalize_source_preferences (fetch, prefs, err); if (xmms_error_iserror (err)) { return NULL; } spec = g_new0 (xmms_fetch_spec_t, 1); spec->type = FETCH_ORGANIZE; spec->data.organize.count = xmmsv_dict_get_size (org_data); spec->data.organize.keys = g_new0 (const char *, spec->data.organize.count); spec->data.organize.data = g_new0 (xmms_fetch_spec_t *, spec->data.organize.count); org_idx = 0; xmmsv_get_dict_iter (org_data, &it); while (xmmsv_dict_iter_valid (it)) { xmms_fetch_spec_t *orgee; const gchar *str; xmmsv_t *entry; xmmsv_dict_iter_pair (it, &str, &entry); orgee = xmms_fetch_spec_new (entry, info, sp, err); if (xmms_error_iserror (err)) { xmms_fetch_spec_free (spec); spec = NULL; break; } spec->data.organize.keys[org_idx] = str; spec->data.organize.data[org_idx] = orgee; org_idx++; xmmsv_dict_iter_next (it); } xmmsv_dict_iter_explicit_destroy (it); s4_sourcepref_unref (sp); return spec; }
/** * Queries the medialib and returns an xmmsv_t with the info requested * * @param coll The collection to find * @param fetch Specifies what to fetch * @return An xmmsv_t with the structure requested in fetch */ xmmsv_t * xmms_medialib_query (xmms_medialib_session_t *session, xmmsv_t *coll, xmmsv_t *fetch, xmms_error_t *err) { s4_sourcepref_t *sourcepref; s4_resultset_t *set; xmmsv_t *ret; xmms_fetch_info_t *info; xmms_fetch_spec_t *spec; xmms_error_reset (err); sourcepref = xmms_medialib_session_get_source_preferences (session); info = xmms_fetch_info_new (sourcepref); spec = xmms_fetch_spec_new (fetch, info, sourcepref, err); s4_sourcepref_unref (sourcepref); if (spec == NULL) { xmms_fetch_spec_free (spec); xmms_fetch_info_free (info); return NULL; } set = xmms_medialib_query_recurs (session, coll, info); ret = xmms_medialib_query_to_xmmsv (set, spec); s4_resultset_free (set); xmms_fetch_spec_free (spec); xmms_fetch_info_free (info); if (ret == NULL) { if (err) { xmms_error_set (err, XMMS_ERROR_NOENT, "Failed to retrieve query " "result. This is probably a bug in xmms2d."); } return NULL; } xmms_medialib_session_track_garbage (session, ret); return ret; }