/** * Insert an entry at a given position in the playlist without * validating it. * * @internal */ void xmms_playlist_insert_entry (xmms_playlist_t *playlist, const gchar *plname, guint32 pos, xmms_medialib_entry_t file, xmms_error_t *err) { xmms_medialib_session_t *session; xmmsv_t *dict; gint currpos; gint len; xmmsv_coll_t *plcoll; gboolean valid; g_mutex_lock (playlist->mutex); do { session = xmms_medialib_session_begin_ro (playlist->medialib); valid = xmms_medialib_check_id (session, file); } while (!xmms_medialib_session_commit (session)); if (!valid) { g_mutex_unlock (playlist->mutex); xmms_error_set (err, XMMS_ERROR_NOENT, "That is not a valid medialib id!"); return; } plcoll = xmms_playlist_get_coll (playlist, plname, err); if (plcoll == NULL) { /* FIXME: happens ? */ g_mutex_unlock (playlist->mutex); return; } len = xmms_playlist_coll_get_size (plcoll); if (pos > len) { xmms_error_set (err, XMMS_ERROR_GENERIC, "Could not insert entry outside of playlist!"); g_mutex_unlock (playlist->mutex); return; } xmmsv_coll_idlist_insert (plcoll, pos, file); /** propagate the MID ! */ dict = xmms_playlist_changed_msg_new (playlist, XMMS_PLAYLIST_CHANGED_INSERT, file, plname); xmmsv_dict_set_int (dict, "position", pos); xmms_playlist_changed_msg_send (playlist, dict); /** update position once client is familiar with the new item. */ currpos = xmms_playlist_coll_get_currpos (plcoll); if (pos <= currpos) { currpos++; xmms_collection_set_int_attr (plcoll, "position", currpos); XMMS_PLAYLIST_CURRPOS_MSG (currpos, plname); } g_mutex_unlock (playlist->mutex); }
void xmms_playlist_client_add_id (xmms_playlist_t *playlist, const gchar *plname, xmms_medialib_entry_t file, xmms_error_t *err) { gboolean valid; MEDIALIB_SESSION (playlist->medialib, valid = xmms_medialib_check_id (session, file)); if (!valid) { xmms_error_set (err, XMMS_ERROR_NOENT, "That is not a valid medialib id!"); return; } xmms_playlist_add_entry (playlist, plname, file, err); }
static void xmms_medialib_client_remove_entry (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, xmms_error_t *error) { xmms_medialib_session_t *session; do { session = xmms_medialib_session_begin (medialib); if (xmms_medialib_check_id (session, entry)) { xmms_medialib_entry_remove (session, entry); } else { xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); }
static xmmsv_t * xmms_medialib_client_get_info (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, xmms_error_t *err) { xmms_medialib_session_t *session; xmmsv_t *ret = NULL; do { session = xmms_medialib_session_begin_ro (medialib); if (xmms_medialib_check_id (session, entry)) { ret = xmms_medialib_entry_to_tree (session, entry); } else { xmms_error_set (err, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); return ret; }
static void xmms_medialib_client_remove_property (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, const gchar *source, const gchar *key, xmms_error_t *error) { xmms_medialib_session_t *session; do { session = xmms_medialib_session_begin (medialib); if (g_ascii_strcasecmp (source, "server") == 0) { xmms_error_set (error, XMMS_ERROR_GENERIC, "Can't remove properties set by the server!"); } else if (xmms_medialib_check_id (session, entry)) { xmms_medialib_property_remove (session, entry, source, key, error); } else { xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); }
static void xmms_medialib_client_rehash (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, xmms_error_t *error) { xmms_medialib_session_t *session; do { session = xmms_medialib_session_begin (medialib); if (xmms_medialib_check_id (session, entry)) { xmms_medialib_entry_status_set (session, entry, XMMS_MEDIALIB_ENTRY_STATUS_REHASH); } else if (entry == 0) { s4_sourcepref_t *sourcepref; s4_resultset_t *set; s4_val_t *status; gint i; sourcepref = xmms_medialib_session_get_source_preferences (session); status = s4_val_new_int (XMMS_MEDIALIB_ENTRY_STATUS_OK); set = xmms_medialib_filter (session, XMMS_MEDIALIB_ENTRY_PROPERTY_STATUS, status, 0, sourcepref, "song_id", S4_FETCH_PARENT); s4_val_free (status); s4_sourcepref_unref (sourcepref); for (i = 0; i < s4_resultset_get_rowcount (set); i++) { const s4_result_t *res; res = s4_resultset_get_result (set, i, 0); for (; res != NULL; res = s4_result_next (res)) { xmms_medialib_entry_t item; s4_val_get_int (s4_result_get_val (res), &item); xmms_medialib_entry_status_set (session, item, XMMS_MEDIALIB_ENTRY_STATUS_REHASH); } } s4_resultset_free (set); } else { xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); }
static void xmms_medialib_client_set_property_int (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, const gchar *source, const gchar *key, gint32 value, xmms_error_t *error) { xmms_medialib_session_t *session; do { session = xmms_medialib_session_begin (medialib); if (g_ascii_strcasecmp (source, "server") == 0) { xmms_error_set (error, XMMS_ERROR_GENERIC, "Can't write to source server!"); } else if (xmms_medialib_check_id (session, entry)) { xmms_medialib_entry_property_set_int_source (session, entry, key, value, source); } else { xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); }
/** * Changes the URL of an entry in the medialib. * * @param medialib Medialib pointer * @param entry entry to modify * @param url URL to change to * @param error In case of error this will be filled. */ static void xmms_medialib_client_move_entry (xmms_medialib_t *medialib, xmms_medialib_entry_t entry, const gchar *url, xmms_error_t *error) { xmms_medialib_session_t *session; gchar *encoded; encoded = xmms_medialib_url_encode (url); do { session = xmms_medialib_session_begin (medialib); if (xmms_medialib_check_id (session, entry)) { xmms_medialib_entry_property_set_str_source (session, entry, XMMS_MEDIALIB_ENTRY_PROPERTY_URL, encoded, "server"); } else { xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry"); } } while (!xmms_medialib_session_commit (session)); g_free (encoded); }
void xmms_playlist_client_add_idlist (xmms_playlist_t *playlist, const gchar *plname, xmmsv_coll_t *coll, xmms_error_t *err) { xmms_medialib_entry_t entry; xmmsv_list_iter_t *it; gboolean valid; xmmsv_get_list_iter (xmmsv_coll_idlist_get (coll), &it); for (xmmsv_list_iter_first (it); xmmsv_list_iter_valid (it); xmmsv_list_iter_next (it)) { xmmsv_list_iter_entry_int (it, &entry); MEDIALIB_SESSION (playlist->medialib, valid = xmms_medialib_check_id (session, entry)); if (!valid) { xmms_error_set (err, XMMS_ERROR_NOENT, "Idlist contains invalid medialib id!"); xmmsv_list_iter_explicit_destroy (it); return; } } for (xmmsv_list_iter_first (it); xmmsv_list_iter_valid (it); xmmsv_list_iter_next (it)) { xmmsv_list_iter_entry_int (it, &entry); xmms_playlist_add_entry (playlist, plname, entry, err); } xmmsv_list_iter_explicit_destroy (it); }