Re-ordered arguments to execvp.
[gssmp.git] / src / gssmp_config.c
blob2f39cdd877c32e55f4100b8354b99fcbaa232f60
1 /*
2 * Gnome Simple Stateful Music Player
3 * Copyright (C) 2007 Andy Balaam
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 **/
20 #include "gssmp_config.h"
22 #include <gnome.h>
23 #include <gconf/gconf-client.h>
25 #define GCONF_KEY_ROOT "/apps/gssmp/"
26 #define GCONF_KEY_BOOKMARKS "bookmarks/"
28 typedef struct
30 const gchar* album;
31 const gchar* filename;
32 const gchar* directory;
33 } TrackDetails;
36 // The head of the queue is the most recent bookmark
37 GQueue* config_bookmarks;
39 gchar* current_directory;
40 gchar* current_filename;
41 gint current_time;
42 gint current_length;
44 gint config_num_bookmarks;
45 gboolean config_paused;
46 enum repeatstyle config_repeat_style;
48 gboolean config_lastfm_active;
49 gchar* config_lastfm_exe;
51 void bookmarks_shorten_queue (guint length);
52 void bookmark_free_members (GssmpBookmark* bmk);
53 gint compare_bookmark_same_album_name (GssmpBookmark* bmk, TrackDetails* af);
55 void config_set (GConfClient *client, const gchar* key, const gchar* value);
56 void config_set_int (GConfClient *client, const gchar* key, const gint value);
57 void config_set_repeatstyle (GConfClient *client, const gchar* key,
58 const enum repeatstyle value);
59 void config_set_bool (GConfClient *client, const gchar* key,
60 const gboolean value);
62 void config_get (GConfClient *client, const gchar* key, gchar** value);
63 void config_get_int (GConfClient *client, const gchar* key, gint* value);
64 void config_get_bool (GConfClient *client, const gchar* key, gboolean* value);
65 void config_get_repeatstyle (GConfClient *client, const gchar* key,
66 enum repeatstyle* value);
68 void bookmarks_load (GConfClient *client);
69 void bookmarks_save (GConfClient *client);
71 void gssmp_config_init ()
73 GConfClient *client;
75 client = gconf_client_get_default ();
77 config_get_int (client, "num_bookmarks", &config_num_bookmarks);
78 config_get_bool (client, "paused", &config_paused);
79 config_get_repeatstyle (client, "repeat_style", &config_repeat_style);
81 config_get_bool (client, "lastfm/active", &config_lastfm_active);
82 config_get (client, "lastfm/exe", &config_lastfm_exe);
83 if (!config_lastfm_exe)
85 config_lastfm_exe = g_strdup( "lastfmsubmit" );
88 current_length = 0;
90 bookmarks_load (client);
93 void gssmp_config_quit ()
95 // Save config
96 GConfClient *client;
98 client = gconf_client_get_default ();
100 config_set_int (client, "num_bookmarks", config_num_bookmarks);
101 config_set_bool (client, "paused", config_paused);
102 config_set_repeatstyle (client, "repeat_style", config_repeat_style);
104 config_set_bool (client, "lastfm/active", config_lastfm_active);
105 config_set (client, "lastfm/exe", config_lastfm_exe);
107 bookmarks_save (client);
109 // Clean up memory
110 bookmarks_shorten_queue (0);
112 g_queue_free (config_bookmarks);
113 g_free (current_directory);
114 g_free (current_filename);
117 void gssmp_config_set_directory (const gchar* cfg_dir)
119 int len;
121 len = strlen (cfg_dir);
123 if (cfg_dir[len-1] == G_DIR_SEPARATOR)
125 --len;
128 current_directory = g_strndup (cfg_dir, len);
131 void gssmp_config_add_bookmark (const gchar* track, const gchar* artist,
132 const gchar* album, const gchar* directory, const gchar* filename,
133 gint time, gint length)
135 GssmpBookmark* bmk;
136 GList* foundlist;
138 if (config_bookmarks)
140 TrackDetails *af;
142 af = g_slice_new (TrackDetails);
143 af->album = album;
144 af->filename = filename;
145 af->directory = directory;
147 foundlist = g_queue_find_custom (config_bookmarks, af,
148 (GCompareFunc)compare_bookmark_same_album_name);
150 g_slice_free (TrackDetails, af);
152 else
154 foundlist = NULL;
157 if (foundlist)
159 bmk = (GssmpBookmark*)(foundlist->data);
160 bookmark_free_members (bmk);
161 g_queue_remove (config_bookmarks, bmk);
162 // Remove from queue so we can re-add at the front
164 else
166 bmk = g_slice_alloc (sizeof (GssmpBookmark));
169 bmk->track = g_strdup (track);
170 bmk->artist = g_strdup (artist);
171 bmk->album = g_strdup (album);
172 bmk->directory = g_strdup (directory);
173 bmk->filename = g_strdup (filename);
174 bmk->time = time;
175 bmk->length = length;
177 g_queue_push_head (config_bookmarks, bmk);
179 bookmarks_shorten_queue (config_num_bookmarks);
182 GssmpBookmark* gssmp_config_get_bookmark (guint number)
184 return g_queue_peek_nth (config_bookmarks, number);
187 guint gssmp_config_bookmarks_length ()
189 return g_queue_get_length (config_bookmarks);
192 // -------------------------
194 void bookmarks_shorten_queue (guint length)
196 while (g_queue_get_length (config_bookmarks) > length)
198 GssmpBookmark* deleted_bmk;
199 deleted_bmk = g_queue_pop_tail (config_bookmarks);
201 bookmark_free_members (deleted_bmk);
202 g_slice_free( GssmpBookmark, deleted_bmk );
206 void bookmark_free_members (GssmpBookmark* bmk)
208 g_free (bmk->track);
209 g_free (bmk->artist);
210 g_free (bmk->album);
211 g_free (bmk->directory);
212 g_free (bmk->filename);
215 gint compare_bookmark_same_album_name (GssmpBookmark* bmk, TrackDetails* af)
217 if (strcmp (bmk->album, af->album) == 0)
219 // If the album names are the same, they match.
220 return 0;
222 else if (strcmp (bmk->directory, af->directory) == 0)
224 // If the directories are the same, they match.
225 return 0;
227 else
229 // Obviously, if it's the same file, they match.
230 return strcmp (bmk->filename, af->filename);
234 void config_set (GConfClient *client, const gchar* key, const gchar* value)
236 if (value)
238 gchar *full_key;
239 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
240 gconf_client_set_string (client, full_key, value, NULL);
241 g_free (full_key);
245 void config_set_int (GConfClient *client, const gchar* key, const gint value)
247 gchar *full_key;
248 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
249 gconf_client_set_int (client, full_key, value, NULL);
250 g_free (full_key);
253 void config_set_repeatstyle (GConfClient *client, const gchar* key,
254 const enum repeatstyle value)
256 gchar *full_key;
257 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
258 gconf_client_set_int (client, full_key, (gint)value, NULL);
259 g_free (full_key);
262 void config_set_bool (GConfClient *client, const gchar* key,
263 const gboolean value)
265 gchar *full_key;
266 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
267 gconf_client_set_bool (client, full_key, value, NULL);
268 g_free (full_key);
271 void config_get (GConfClient *client, const gchar* key, gchar** value)
273 gchar *full_key;
274 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
275 *value = gconf_client_get_string (client, full_key, NULL);
276 g_free (full_key);
279 void config_get_int (GConfClient *client, const gchar* key, gint* value)
281 gchar *full_key;
282 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
283 *value = gconf_client_get_int (client, full_key, NULL);
284 g_free (full_key);
287 void config_get_repeatstyle (GConfClient *client, const gchar* key,
288 enum repeatstyle* value)
290 gchar *full_key;
291 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
292 *value = (enum repeatstyle)(gconf_client_get_int (client, full_key, NULL));
293 g_free (full_key);
296 void config_get_bool (GConfClient *client, const gchar* key, gboolean* value)
298 gchar *full_key;
299 full_key = g_strconcat (GCONF_KEY_ROOT, key, NULL);
300 *value = gconf_client_get_bool (client, full_key, NULL);
301 g_free (full_key);
304 void bookmarks_load (GConfClient *client)
306 gboolean more_bmks;
307 uint bmk_counter;
309 if (config_num_bookmarks == 0)
311 config_num_bookmarks = 10;
314 more_bmks = TRUE;
315 config_bookmarks = g_queue_new ();
317 for (bmk_counter = 0;
318 bmk_counter < config_num_bookmarks && more_bmks;
319 ++bmk_counter)
321 gchar* bmk_track;
322 gchar* key_base;
323 gchar* key_track;
325 key_base = g_strdup_printf ("%s%s%d", GCONF_KEY_ROOT,
326 GCONF_KEY_BOOKMARKS, bmk_counter);
328 key_track = g_strconcat (key_base, "/track", NULL);
330 bmk_track = gconf_client_get_string (client, key_track, NULL);
332 if (bmk_track)
334 GssmpBookmark* bmk;
335 gchar* key_artist;
336 gchar* key_album;
337 gchar* key_directory;
338 gchar* key_filename;
339 gchar* key_time;
340 gchar* key_length;
341 gchar* bmk_artist;
342 gchar* bmk_album;
343 gchar* bmk_directory;
344 gchar* bmk_filename;
345 gint bmk_time;
346 gint bmk_length;
348 key_artist = g_strconcat (key_base, "/artist", NULL);
349 key_album = g_strconcat (key_base, "/album", NULL);
350 key_directory = g_strconcat (key_base, "/directory", NULL);
351 key_filename = g_strconcat (key_base, "/filename", NULL);
352 key_time = g_strconcat (key_base, "/time", NULL);
353 key_length = g_strconcat (key_base, "/length", NULL);
355 bmk_artist = gconf_client_get_string (client, key_artist, NULL);
356 bmk_album = gconf_client_get_string (client, key_album, NULL);
357 bmk_directory = gconf_client_get_string (client, key_directory, NULL);
358 bmk_filename = gconf_client_get_string (client, key_filename, NULL);
359 bmk_time = gconf_client_get_int (client, key_time, NULL);
360 bmk_length = gconf_client_get_int (client, key_length, NULL);
362 bmk = g_slice_alloc (sizeof (GssmpBookmark));
364 bmk->track = bmk_track;
365 bmk->artist = bmk_artist;
366 bmk->album = bmk_album;
367 bmk->directory = bmk_directory;
368 bmk->filename = bmk_filename;
369 bmk->time = bmk_time;
370 bmk->length = bmk_length;
372 g_queue_push_tail (config_bookmarks, bmk);
374 g_free (key_artist);
375 g_free (key_album);
376 g_free (key_directory);
377 g_free (key_filename);
378 g_free (key_time);
379 g_free (key_length);
381 else
383 more_bmks = FALSE;
386 g_free (key_track);
387 g_free (key_base);
391 void bookmarks_save (GConfClient *client)
393 uint bmk_counter;
394 GList *queue_item;
396 for (bmk_counter = 0, queue_item = g_queue_peek_head_link (config_bookmarks);
397 bmk_counter < config_num_bookmarks && queue_item;
398 ++bmk_counter, queue_item = g_list_next (queue_item))
400 gchar *key_base;
401 gchar *key_track;
402 gchar *key_artist;
403 gchar *key_album;
404 gchar *key_directory;
405 gchar *key_filename;
406 gchar *key_time;
407 gchar *key_length;
408 GssmpBookmark *bmk;
410 bmk = (GssmpBookmark*)(queue_item->data);
412 key_base = g_strdup_printf ("%s%s%d", GCONF_KEY_ROOT,
413 GCONF_KEY_BOOKMARKS, bmk_counter);
415 key_track = g_strconcat (key_base, "/track", NULL);
416 key_artist = g_strconcat (key_base, "/artist", NULL);
417 key_album = g_strconcat (key_base, "/album", NULL);
418 key_directory = g_strconcat (key_base, "/directory", NULL);
419 key_filename = g_strconcat (key_base, "/filename", NULL);
420 key_time = g_strconcat (key_base, "/time", NULL);
421 key_length = g_strconcat (key_base, "/length", NULL);
423 gconf_client_set_string (client, key_track, bmk->track, NULL);
424 gconf_client_set_string (client, key_artist, bmk->artist, NULL);
425 gconf_client_set_string (client, key_album, bmk->album, NULL);
426 gconf_client_set_string (client, key_directory, bmk->directory, NULL);
427 gconf_client_set_string (client, key_filename, bmk->filename, NULL);
428 gconf_client_set_int (client, key_time, bmk->time, NULL);
429 gconf_client_set_int (client, key_length, bmk->length, NULL);
431 g_free (key_base);
432 g_free (key_track);
433 g_free (key_artist);
434 g_free (key_album);
435 g_free (key_directory);
436 g_free (key_filename);
437 g_free (key_time);
438 g_free (key_length);
442 void gssmp_config_bookmarks_foreach (
443 void (*callback) (GssmpBookmark*, gpointer),
444 gpointer user_data)
446 g_queue_foreach (config_bookmarks, (GFunc)callback, user_data);