gboolean playlist_positions_parse (const gchar *expr, playlist_positions_t **p, gint currpos) { gchar **tokens; playlist_positions_t *positions; gint i = 0; gboolean success = TRUE; /* Empty/NULL string, or invalid chars, don't bother */ if (!expr || !*expr || strspn (expr, "0123456789,_+- ") != strlen (expr)) { return FALSE; } tokens = g_strsplit (expr, " ", 0); positions = playlist_positions_new (currpos); while (tokens[i]) { if (!playlist_positions_parse_token (tokens[i], positions)) { success = FALSE; break; } i++; } g_strfreev (tokens); if (success) { *p = positions; } else { playlist_positions_free (positions); } return success; }
gboolean cli_jump (cli_context_t *ctx, command_t *cmd) { xmmsc_connection_t *conn = cli_context_xmms_sync (ctx); xmmsv_t *query; gboolean backward = FALSE; playlist_positions_t *positions; command_flag_boolean_get (cmd, "backward", &backward); /* Select by positions */ if (command_arg_positions_get (cmd, 0, &positions, cli_context_current_position (ctx))) { gint pos; if (playlist_positions_get_single (positions, &pos)) { XMMS_CALL_CHAIN (XMMS_CALL_P (xmmsc_playlist_set_next, conn, pos), XMMS_CALL_P (xmmsc_playback_tickle, conn)); } else { g_printf (_("Cannot jump to several positions!\n")); } playlist_positions_free (positions); /* Select by pattern */ } else if (command_arg_pattern_get (cmd, 0, &query, TRUE)) { query = xmmsv_coll_intersect_with_playlist (query, XMMS_ACTIVE_PLAYLIST); XMMS_CALL_CHAIN (XMMS_CALL_P (xmmsc_coll_query_ids, conn, query, NULL, 0, 0), FUNC_CALL_P (cli_jump_relative, ctx, (backward ? -1 : 1), XMMS_PREV_VALUE)); xmmsv_unref (query); } return FALSE; }
/* TODO: Not really a part of the server sub-command, but in the future it * can be refactored to just call "xmms2 server property" and let that * do the printing */ gboolean cli_info (cli_context_t *ctx, command_t *cmd) { xmmsc_connection_t *conn = cli_context_xmms_sync (ctx); playlist_positions_t *positions; xmmsv_t *query; gint current_position = cli_context_current_position (ctx); gint current_id = cli_context_current_id (ctx); if (command_arg_positions_get (cmd, 0, &positions, current_position)) { cli_info_print_positions (ctx, positions); playlist_positions_free (positions); } else if (command_arg_pattern_get (cmd, 0, &query, FALSE)) { XMMS_CALL_CHAIN (XMMS_CALL_P (xmmsc_coll_query_ids, conn, query, NULL, 0, 0); FUNC_CALL_P (cli_info_print_list, ctx, XMMS_PREV_VALUE)); xmmsv_unref (query); } else {