1 /*
2 |  Copyright (C) 2002-2007 Jorg Schuler <jcsjcs at users sourceforge net>
3 |  Part of the gtkpod project.
4 |
5 |  URL: http://www.gtkpod.org/
6 |  URL: http://gtkpod.sourceforge.net/
7 |
8 |  This program is free software; you can redistribute it and/or modify
9 |  it under the terms of the GNU General Public License as published by
10 |  the Free Software Foundation; either version 2 of the License, or
11 |  (at your option) any later version.
12 |
13 |  This program is distributed in the hope that it will be useful,
14 |  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 |  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 |  GNU General Public License for more details.
17 |
18 |  You should have received a copy of the GNU General Public License
19 |  along with this program; if not, write to the Free Software
20 |  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 |
22 |  iTunes and iPod are trademarks of Apple
23 |
24 |  This product is not supported/written/published by Apple!
25 |
26 |  $Id$
27 */
28 
29 #ifndef __MISC_H__
30 #define __MISC_H__
31 
32 #ifdef HAVE_CONFIG_H
33 #  include <config.h>
34 #endif
35 
36 #include <glib/gi18n-lib.h>
37 #include <gtk/gtk.h>
38 #include <glade/glade.h>
39 #include <stdio.h>
40 #include <libxml/xmlversion.h>
41 #include <libxml/xmlmemory.h>
42 #include "file.h"
43 #include "display_itdb.h"
44 #include "display.h"
45 #include "confirmation.h"
46 #include "time.h"
47 
48 
49 #define C_FREE(a) {g_free(a); a=NULL;}
50 
51 /* where to find the scripts */
52 extern const gchar *SCRIPTDIR;
53 
54 /* version of GTK_CHECK_VERSION that uses the runtime variables
55    gtk_*_version... instead of the compile-time constants
56    GTK_*_VERSION */
57 #define	RUNTIME_GTK_CHECK_VERSION(major,minor,micro)	\
58     (gtk_major_version > (major) || \
59      (gtk_major_version == (major) && gtk_minor_version > (minor)) || \
60      (gtk_major_version == (major) && gtk_minor_version == (minor) && \
61       gtk_micro_version >= (micro)))
62 
63 /* compare a and b, return sign (a-b) -- it has to be this way rather
64    than just calculate a-b, because a and b might be unsigned... */
65 #define COMP(a,b) (a<b ? -1:a>b ? +1:0)
66 
67 /* Response for the Apply button (we cannot use GTK_RESPONSE_APPLY)
68  * because that is only emitted if a filename is present */
69 enum { RESPONSE_APPLY = 5 };
70 
71 /* indicates whether widgets are currently blocked */
72 extern gboolean widgets_blocked;
73 /* full path to 'gtkpod.glade', defined in main.c */
74 extern gchar *xml_file;
75 
76 /* Some symbols not necessarily defined */
77 
78 gchar *utf8_strcasestr (const gchar *haystack, const gchar *needle);
79 
80 gchar *get_user_string (gchar *title, gchar *message, gchar *dflt,
81 			gchar *opt_msg, gboolean *opt_state, const gchar *accept_button);
82 Playlist *add_new_pl_user_name (iTunesDB *itdb, gchar *dflt, gint32 pos);
83 void add_new_pl_or_spl_user_name (iTunesDB *itdb, gchar *dflt, gint32 pos);
84 void create_add_files_fileselector (void);
85 void create_add_playlists_fileselector (void);
86 gchar *concat_dir (G_CONST_RETURN gchar *dir, G_CONST_RETURN gchar *file);
87 gchar *concat_dir_if_relative (G_CONST_RETURN gchar *base_dir,
88 			       G_CONST_RETURN gchar *rel_dir);
89 float get_ms_since (GTimeVal *old_time, gboolean update);
90 gint get_sort_tab_number (gchar *text);
91 gboolean parse_tracks_from_string (gchar **s, Track **track);
92 gboolean parse_artwork_from_string(gchar **s, Artwork **artwork);
93 void gtkpod_init (int argc, char *argv[]);
94 void gtkpod_shutdown (void);
95 
96 gchar *get_allowed_percent_char (void);
97 T_item TM_to_T (TM_item sm);
98 T_item char_to_T (char c);
99 T_item ST_to_T (ST_CAT_item st);
100 const gchar *get_tm_string (TM_item tm);
101 const gchar *get_tm_tooltip (TM_item tm);
102 const gchar *get_t_string (T_item t);
103 const gchar *get_t_tooltip (T_item t);
104 
105 void delete_playlist_head (DeleteAction deleteaction);
106 void delete_track_head (DeleteAction deleteaction);
107 void delete_entry_head (gint entry_inst, DeleteAction deleteaction);
108 
109 void delete_populate_settings (struct DeleteData *dd,
110 			       gchar **label, gchar **title,
111 			       gboolean *confirm_again,
112 			       gchar **confirm_again_key,
113 			       GString **str);
114 
115 void block_widgets (void);
116 void release_widgets (void);
117 void update_blocked_widget (GtkWidget *w, gboolean sens);
118 
119 /*void mount_ipod(void);
120   void unmount_ipod(void);*/
121 void call_script (gchar *script, ...);
122 
123 gchar **build_argv_from_strings (const gchar *first_arg, ...);
124 
125 void delete_track_ok (struct DeleteData *dd);
126 
127 void gtkpod_warning (const gchar *format, ...);
128 void gtkpod_warning_simple (const gchar *format, ...);
129 void gtkpod_warning_hig (GtkWindow *parent,
130 						 GtkMessageType icon,
131 						 const gchar *primary_text,
132 						 const gchar *secondary_text);
133 
134 gchar *time_time_to_string (time_t t);
135 gchar *time_fromtime_to_string (time_t t);
136 gchar *time_totime_to_string (time_t t);
137 time_t time_string_to_time (const gchar *str);
138 time_t time_string_to_fromtime (const gchar *str);
139 time_t time_string_to_totime (const gchar *str);
140 time_t time_get_time (Track *track, T_item t_item);
141 gchar *time_field_to_string (Track *track, T_item t_item);
142 void time_set_time (Track *track, time_t t, T_item t_item);
143 
144 gchar *get_filesize_as_string (double size);
145 
146 gchar *make_sortkey (const gchar *name);
147 gint compare_string (const gchar *str1, const gchar *str2);
148 void compare_string_fuzzy_generate_keys (void);
149 gint compare_string_fuzzy (const gchar *str1, const gchar *str2);
150 const gchar *fuzzy_skip_prefix (const gchar *sortkey);
151 gint compare_string_case_insensitive (const gchar *str1,
152 				      const gchar *str2);
153 gint compare_string_start_case_insensitive (const gchar *haystack,
154 					    const gchar *needle);
155 
156 gchar *filename_from_uri (const char *uri,
157 			  char      **hostname,
158 			  GError    **error);
159 
160 void generate_category_playlists (iTunesDB *itdb, T_item cat);
161 Playlist *generate_displayed_playlist (void);
162 Playlist *generate_selected_playlist (void);
163 void randomize_current_playlist (void);
164 Playlist *generate_random_playlist (iTunesDB *itdb);
165 Playlist *generate_not_listed_playlist (iTunesDB *itdb);
166 Playlist *generate_playlist_with_name (iTunesDB *itdb, GList *tracks,
167 				       gchar *pl_name, gboolean del_old);
168 Playlist *generate_new_playlist (iTunesDB *itdb, GList *tracks);
169 void most_listened_pl (iTunesDB *itdb);
170 void never_listened_pl (iTunesDB *itdb);
171 void last_listened_pl(iTunesDB *itdb);
172 void most_rated_pl(iTunesDB *itdb);
173 void since_last_pl(iTunesDB *itdb);
174 void each_rating_pl (iTunesDB *itdb);
175 
176 guint32 utf16_strlen (gunichar2 *utf16);
177 gunichar2 *utf16_strdup (gunichar2 *utf16);
178 
179 void check_db (iTunesDB *db);
180 
181 gboolean mkdirhier(const gchar *dirname, gboolean silent);
182 gboolean mkdirhierfile(const gchar *filename);
183 gint64 get_size_of_directory (const gchar *dir);
184 gchar *convert_filename (const gchar *filename);
185 
186 guint32 replaygain_to_soundcheck (gdouble gain);
187 gdouble soundcheck_to_replaygain (guint32 soundcheck);
188 
189 
190 void option_set_radio_button (GladeXML *win_xml,
191 			      const gchar *prefs_string,
192 			      const gchar **widgets,
193 			      gint dflt);
194 gint option_get_radio_button (GladeXML *win_xml,
195 			      const gchar *prefs_string,
196 			      const gchar **widgets);
197 void option_set_folder (GtkFileChooser *fc,
198 			const gchar *prefs_string);
199 void option_get_folder (GtkFileChooser *fc,
200 			const gchar *prefs_string,
201 			gchar **value);
202 void option_set_filename (GtkFileChooser *fc,
203 			  const gchar *prefs_string);
204 void option_get_filename (GtkFileChooser *fc,
205 			  const gchar *prefs_string,
206 			  gchar **value);
207 void option_set_string (GladeXML *win_xml,
208 			const gchar *name,
209 			const gchar *dflt);
210 void option_get_string (GladeXML *win_xml,
211 			const gchar *name,
212 			gchar **value);
213 void option_set_toggle_button (GladeXML *win_xml,
214 			       const gchar *name,
215 			       gboolean dflt);
216 gboolean option_get_toggle_button (GladeXML *win_xml,
217 				   const gchar *name);
218 
219 gchar *get_string_from_template (Track *track,
220 				 const gchar *template,
221 				 gboolean is_filename,
222 				 gboolean silent);
223 gchar *get_string_from_full_template (Track *track,
224 				      const gchar *full_template,
225 				      gboolean is_filename);
226 
227 gchar *which (const gchar *exe);
228 
229 GladeXML *gtkpod_xml_new (const gchar *xml_file, const gchar *name);
230 GtkWidget *gtkpod_xml_get_widget (GladeXML *xml, const gchar *name);
231 
232 gchar *get_itdb_prefs_key (gint index, const gchar *subkey);
233 gchar *get_playlist_prefs_key (gint index, Playlist *pl, const gchar *subkey);
234 gint get_itdb_index (iTunesDB *itdb);
235 gchar *get_itdb_prefs_string (iTunesDB *itdb, const gchar *subkey);
236 gchar *get_playlist_prefs_string (Playlist *playlist, const gchar *subkey);
237 gint get_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey);
238 gint get_playlist_prefs_int (Playlist *playlist, const gchar *subkey);
239 gboolean get_itdb_prefs_string_value (iTunesDB *itdb, const gchar *subkey,
240 				      gchar **value);
241 gboolean get_itdb_prefs_int_value (iTunesDB *itdb, const gchar *subkey,
242 				   gint *value);
243 void set_itdb_prefs_string (iTunesDB *itdb,
244 			    const gchar *subkey, const gchar *value);
245 void set_itdb_index_prefs_string (gint index,
246 				  const gchar *subkey, const gchar *value);
247 void set_itdb_prefs_int (iTunesDB *itdb, const gchar *subkey, gint value);
248 void set_itdb_index_prefs_int (gint index,
249 			       const gchar *subkey, gint value);
250 void remove_itdb_prefs (iTunesDB *itdb);
251 void load_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint);
252 gboolean save_ipod_prefs (iTunesDB *itdb, const gchar *mountpoint);
253 
254 gboolean get_offline (iTunesDB *itdb);
255 #endif
256