2 * Gnome Simple Stateful Music Player
3 * Copyright (C) 2007 Andy Balaam
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.
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
20 #include "gssmp_config.h"
23 #include <gconf/gconf-client.h>
25 #define GCONF_KEY_ROOT "/apps/gssmp/"
26 #define GCONF_KEY_BOOKMARKS "bookmarks/"
31 const gchar
* filename
;
32 const gchar
* directory
;
36 // The head of the queue is the most recent bookmark
37 GQueue
* config_bookmarks
;
39 gchar
* current_directory
;
40 gchar
* current_filename
;
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 ()
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" );
90 bookmarks_load (client
);
93 void gssmp_config_quit ()
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
);
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
)
121 len
= strlen (cfg_dir
);
123 if (cfg_dir
[len
-1] == G_DIR_SEPARATOR
)
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
)
138 if (config_bookmarks
)
142 af
= g_slice_new (TrackDetails
);
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
);
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
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
);
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
)
209 g_free (bmk
->artist
);
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.
222 else if (strcmp (bmk
->directory
, af
->directory
) == 0)
224 // If the directories are the same, they match.
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
)
239 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
240 gconf_client_set_string (client
, full_key
, value
, NULL
);
245 void config_set_int (GConfClient
*client
, const gchar
* key
, const gint value
)
248 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
249 gconf_client_set_int (client
, full_key
, value
, NULL
);
253 void config_set_repeatstyle (GConfClient
*client
, const gchar
* key
,
254 const enum repeatstyle value
)
257 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
258 gconf_client_set_int (client
, full_key
, (gint
)value
, NULL
);
262 void config_set_bool (GConfClient
*client
, const gchar
* key
,
263 const gboolean value
)
266 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
267 gconf_client_set_bool (client
, full_key
, value
, NULL
);
271 void config_get (GConfClient
*client
, const gchar
* key
, gchar
** value
)
274 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
275 *value
= gconf_client_get_string (client
, full_key
, NULL
);
279 void config_get_int (GConfClient
*client
, const gchar
* key
, gint
* value
)
282 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
283 *value
= gconf_client_get_int (client
, full_key
, NULL
);
287 void config_get_repeatstyle (GConfClient
*client
, const gchar
* key
,
288 enum repeatstyle
* value
)
291 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
292 *value
= (enum repeatstyle
)(gconf_client_get_int (client
, full_key
, NULL
));
296 void config_get_bool (GConfClient
*client
, const gchar
* key
, gboolean
* value
)
299 full_key
= g_strconcat (GCONF_KEY_ROOT
, key
, NULL
);
300 *value
= gconf_client_get_bool (client
, full_key
, NULL
);
304 void bookmarks_load (GConfClient
*client
)
309 if (config_num_bookmarks
== 0)
311 config_num_bookmarks
= 10;
315 config_bookmarks
= g_queue_new ();
317 for (bmk_counter
= 0;
318 bmk_counter
< config_num_bookmarks
&& more_bmks
;
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
);
337 gchar
* key_directory
;
343 gchar
* bmk_directory
;
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
);
376 g_free (key_directory
);
377 g_free (key_filename
);
391 void bookmarks_save (GConfClient
*client
)
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
))
404 gchar
*key_directory
;
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
);
435 g_free (key_directory
);
436 g_free (key_filename
);
442 void gssmp_config_bookmarks_foreach (
443 void (*callback
) (GssmpBookmark
*, gpointer
),
446 g_queue_foreach (config_bookmarks
, (GFunc
)callback
, user_data
);