mp3splt-gtk
preferences_manager.c
Go to the documentation of this file.
00001 /**********************************************************
00002  *
00003  * mp3splt-gtk -- utility based on mp3splt,
00004  *                for mp3/ogg splitting without decoding
00005  *
00006  * Copyright: (C) 2005-2012 Alexandru Munteanu
00007  * Contact: io_fx@yahoo.fr
00008  *
00009  * http://mp3splt.sourceforge.net/
00010  *
00011  *********************************************************/
00012 
00013 /**********************************************************
00014  *
00015  * This program is free software; you can redistribute it and/or
00016  * modify it under the terms of the GNU General Public License
00017  * as published by the Free Software Foundation; either version 2
00018  * of the License, or (at your option) any later version.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * USA.
00028  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
00029  *
00030  *********************************************************/
00031 
00032 /*!********************************************************
00033  * \file 
00034  * Save and read preferences
00035  *
00036  * This file contains the functions to save the preferences
00037  * on the hard disk and to read them again at the next 
00038  * start of the program.
00039  ********************************************************/
00040 
00041 #include <string.h>
00042 #include <stdlib.h>
00043 #include <unistd.h>
00044 
00045 #include <gtk/gtk.h>
00046 #include <glib/gi18n.h>
00047 #include <glib/gstdio.h>
00048 
00049 #include <libmp3splt/mp3splt.h>
00050 
00051 #include "player.h"
00052 #include "player_tab.h"
00053 #include "preferences_tab.h"
00054 #include "special_split.h"
00055 #include "combo_helper.h"
00056 #include "radio_helper.h"
00057 #include "ui_manager.h"
00058 
00059 extern GtkWidget *player_combo_box;
00060 extern GtkWidget *player_refresh_rate_spinner;
00061 extern gint selected_player;
00062 extern GList *player_pref_list;
00063 extern GtkWidget *radio_button;
00064 
00065 extern GtkWidget *file_mode_radio_button;
00066 
00067 extern GtkWidget *frame_mode;
00068 extern GtkWidget *adjust_mode;
00069 extern GtkWidget *names_from_filename;
00070 extern GtkWidget *spinner_adjust_gap;
00071 extern GtkWidget *spinner_adjust_offset;
00072 extern GtkWidget *spinner_adjust_threshold;
00073 extern GtkWidget *create_dirs_from_output_files;
00074 extern GtkWidget *spinner_time;
00075 extern GtkWidget *spinner_equal_tracks;
00076 
00077 extern GtkWidget *output_entry;
00078 extern GtkWidget *output_label;
00079 extern GtkWidget *radio_output;
00080 extern GtkWidget *tags_radio;
00081 extern GtkWidget *tags_version_radio;
00082 
00083 extern splt_state *the_state;
00084 
00085 extern GtkWidget *replace_underscore_by_space_check_box;
00086 extern GtkComboBox *artist_text_properties_combo;
00087 extern GtkComboBox *album_text_properties_combo;
00088 extern GtkComboBox *title_text_properties_combo;
00089 extern GtkComboBox *comment_text_properties_combo;
00090 extern GtkComboBox *genre_combo;
00091 extern GtkWidget *comment_tag_entry;
00092 extern GtkWidget *regex_entry;
00093 extern GtkWidget *test_regex_fname_entry;
00094 
00095 extern ui_state *ui;
00096 
00105 gchar *get_preferences_filename()
00106 {
00107   gchar mp3splt_dir[14] = ".mp3splt-gtk";
00108 
00109   //used to see if the directory exists
00110   struct stat buffer;
00111   gint         status;
00112   
00113   //home directory
00114   gchar *home_dir = g_strdup(g_get_home_dir());
00115  
00116 #ifdef __WIN32__
00117   //manage c:\ because the gtk dir returns us "c:\"
00118   //and the normal directories without the "\"
00119   if (home_dir[strlen(home_dir)-1] == '\\')
00120     {
00121       home_dir[strlen(home_dir)-1] = '\0';
00122     }
00123 #endif
00124 
00125   gchar *mp3splt_dir_with_path = NULL;
00126   gint malloc_number = strlen(home_dir) + strlen(mp3splt_dir)+2;
00127   mp3splt_dir_with_path = malloc(malloc_number *sizeof(gchar *));
00128   g_snprintf(mp3splt_dir_with_path, malloc_number,
00129              "%s%s%s", home_dir,G_DIR_SEPARATOR_S,
00130              mp3splt_dir);
00131 
00132   if (home_dir)
00133   {
00134     g_free(home_dir);
00135     home_dir = NULL;
00136   }
00137   
00138   gint fname_malloc_number = strlen(mp3splt_dir_with_path)+30;
00139   gchar *filename = malloc(fname_malloc_number*sizeof(gchar *));
00140   
00141   status = g_stat(mp3splt_dir_with_path, &buffer);
00142   //if it is not a directory
00143   if ((status != 0) || (S_ISDIR(buffer.st_mode) == 0))
00144   {
00145     //if its a file
00146     if ((status == 0) && (S_ISREG(buffer.st_mode) != 0))
00147     {
00148       gchar *backup_file;
00149       malloc_number = strlen(mp3splt_dir_with_path)+5;
00150       backup_file = malloc(malloc_number*sizeof(gchar *));
00151       snprintf(backup_file,malloc_number,
00152           "%s%s", mp3splt_dir_with_path,".bak");
00153       //we rename the file
00154       g_rename(mp3splt_dir_with_path,
00155           backup_file);
00156       g_free(backup_file);
00157     }
00158     //if it is not a directory and not a file, we suppose we can
00159     //create the directory
00160 #ifdef __WIN32__      
00161     g_mkdir(mp3splt_dir_with_path, 0775);
00162 #else
00163     g_mkdir(mp3splt_dir_with_path,
00164         S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
00165 #endif
00166   }
00167   
00168   //the config filename+path
00169   g_snprintf(filename,fname_malloc_number,
00170              "%s%smp3splt-gtk_prefs",
00171              mp3splt_dir_with_path, G_DIR_SEPARATOR_S);
00172   
00173   if (mp3splt_dir_with_path)
00174   {
00175     g_free(mp3splt_dir_with_path);
00176     mp3splt_dir_with_path = NULL;
00177   }
00178 
00179   return filename;
00180 }
00181 
00184 void load_preferences()
00185 {
00186   GKeyFile *key_file = g_key_file_new();
00187 
00188   gchar *filename = get_preferences_filename();
00189 
00190   //load config
00191   g_key_file_load_from_file(key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
00192 
00193   if (filename)
00194   {
00195     g_free(filename);
00196     filename = NULL;
00197   }
00198 
00199 #ifdef __WIN32__
00200   //language
00201   gchar *file_string = g_key_file_get_string(key_file, "general", "language", NULL);
00202   GString *lang = g_string_new(file_string);
00203 
00204   //0 = german, 1 = french, 2 = english
00205   gint list_number = 2;
00206   if (g_string_equal(lang,g_string_new("de")) ||
00207       g_string_equal(lang,g_string_new("de_DE")))
00208   {
00209     list_number = 0;
00210   }
00211   else if (g_string_equal(lang, g_string_new("fr")) ||
00212       g_string_equal(lang, g_string_new("fr_FR")))
00213   {
00214     list_number = 1;
00215   }
00216 
00217   GSList *radio_button_list =
00218     gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
00219   GtkWidget *our_button = (GtkWidget *)
00220     g_slist_nth_data(radio_button_list, list_number);
00221   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(our_button), TRUE);
00222 
00223   g_free(file_string);
00224   g_string_free(lang, TRUE);
00225   file_string = NULL;
00226   lang = NULL;
00227 #endif
00228 
00229   // If outputdirectory_get()!=NULL the path where to output the split file
00230   // to has been set from command line
00231   if(outputdirectory_get()==NULL)
00232   {
00233     // No output_path from command-line => get the path from the preferences
00234     gchar *save_path = g_key_file_get_string(key_file, "split", "save_path", NULL);
00235     {
00236       if (save_path != NULL)
00237       {
00238         outputdirectory_set(save_path);
00239       }
00240       g_free(save_path);
00241       save_path = NULL;
00242     }
00243   }
00244 
00245   //player
00246   gint item = g_key_file_get_integer(key_file, "player", "default_player",NULL);
00247   ch_set_active_value(GTK_COMBO_BOX(player_combo_box), item);
00248 
00249   item = g_key_file_get_integer(key_file, "player", "refresh_rate", NULL);  
00250   gtk_spin_button_set_value(GTK_SPIN_BUTTON(player_refresh_rate_spinner), item);
00251   update_timeout_value(NULL, NULL);
00252  
00253   //frame mode
00254   item = g_key_file_get_boolean(key_file, "split", "frame_mode", NULL);
00255   if (item)
00256   {
00257     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),TRUE);
00258   }
00259   else
00260   {
00261     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),FALSE);
00262   }
00263 
00264   //adjust mode
00265   item = g_key_file_get_boolean(key_file, "split", "adjust_mode", NULL);
00266   if (item)
00267   {
00268     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),TRUE);
00269   }
00270   else
00271   {
00272     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),FALSE);
00273   }
00274 
00275   item = g_key_file_get_boolean(key_file, "output", "splitpoint_names_from_filename", NULL);
00276   if (item)
00277   {
00278     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename),TRUE);
00279   }
00280   else
00281   {
00282     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename),FALSE);
00283   }
00284 
00285   //adjust threshold
00286   gfloat item2;
00287   item = g_key_file_get_integer(key_file, "split", "adjust_threshold", NULL);  
00288   item2 = item/100 + (item%100)/100.;
00289   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_threshold), item2);
00290   //adjust offset
00291   item = g_key_file_get_integer(key_file, "split", "adjust_offset", NULL);
00292   item2 = item/100 + (item%100)/100.;
00293   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_offset),
00294       item2);
00295   //adjust gap
00296   item = g_key_file_get_integer(key_file, "split", "adjust_gap", NULL);
00297   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_gap), item);
00298 
00299   //tags options
00300   gint tag_pref_file = g_key_file_get_integer(key_file, "split", "tags", NULL);
00301   GtkWidget *radio = rh_get_radio_from_value(tags_radio, tag_pref_file);
00302   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE);
00303 
00304   //replace underscores by spaces
00305   item = g_key_file_get_boolean(key_file, "split", "replace_underscore_by_space", NULL);
00306   if (item)
00307   {
00308     gtk_toggle_button_set_active(
00309         GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box), TRUE);
00310   }
00311   else
00312   {
00313     gtk_toggle_button_set_active(
00314         GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box), FALSE);
00315   }
00316 
00317   //artist text properties
00318   item = g_key_file_get_integer(key_file, "split", "artist_text_properties",NULL);
00319   if (item)
00320   {
00321     ch_set_active_value(artist_text_properties_combo, item);
00322   }
00323   else
00324   {
00325     ch_set_active_value(artist_text_properties_combo, SPLT_NO_CONVERSION);
00326   }
00327   //album text properties
00328   item = g_key_file_get_integer(key_file, "split", "album_text_properties",NULL);
00329   if (item)
00330   {
00331     ch_set_active_value(album_text_properties_combo, item);
00332   }
00333   else
00334   {
00335     ch_set_active_value(album_text_properties_combo, SPLT_NO_CONVERSION);
00336   }
00337   //title text properties
00338   item = g_key_file_get_integer(key_file, "split", "title_text_properties",NULL);
00339   if (item)
00340   {
00341     ch_set_active_value(title_text_properties_combo, item);
00342   }
00343   else
00344   {
00345     ch_set_active_value(title_text_properties_combo, SPLT_NO_CONVERSION);
00346   }
00347   //comment text properties
00348   item = g_key_file_get_integer(key_file, "split", "comment_text_properties",NULL);
00349   if (item)
00350   {
00351     ch_set_active_value(comment_text_properties_combo, item);
00352   }
00353   else
00354   {
00355     ch_set_active_value(comment_text_properties_combo, SPLT_NO_CONVERSION);
00356   }
00357 
00358   //genre
00359   gchar *default_genre = g_key_file_get_string(key_file, "split", "genre", NULL);
00360   if (default_genre)
00361   {
00362     ch_set_active_str_value(genre_combo, default_genre);
00363     g_free(default_genre);
00364     default_genre = NULL;
00365   }
00366   else
00367   {
00368     ch_set_active_str_value(genre_combo, SPLT_UNDEFINED_GENRE);
00369   }
00370 
00371   //default comment tag
00372   gchar *default_comment_tag = g_key_file_get_string(key_file, "split", "default_comment_tag", NULL);
00373   if (default_comment_tag)
00374   {
00375     gtk_entry_set_text(GTK_ENTRY(comment_tag_entry), default_comment_tag);
00376     g_free(default_comment_tag);
00377     default_comment_tag = NULL;
00378   }
00379 
00380   //regexp to parse filename into tags
00381   gchar *tags_from_fname_regex =
00382     g_key_file_get_string(key_file, "split", "tags_from_filename_regex", NULL);
00383   if (tags_from_fname_regex)
00384   {
00385     gtk_entry_set_text(GTK_ENTRY(regex_entry), tags_from_fname_regex);
00386     g_free(tags_from_fname_regex);
00387     tags_from_fname_regex = NULL;
00388   }
00389 
00390   gchar *test_regex_fname = 
00391     g_key_file_get_string(key_file, "split", "test_regex_fname", NULL);
00392   if (test_regex_fname)
00393   {
00394     gtk_entry_set_text(GTK_ENTRY(test_regex_fname_entry), test_regex_fname);
00395     g_free(test_regex_fname);
00396     test_regex_fname = NULL;
00397   }
00398 
00399   //tags version
00400   tag_pref_file = g_key_file_get_integer(key_file, "split", "tags_version", NULL);
00401 
00402   GSList *tags_version_radio_button_list = 
00403     gtk_radio_button_get_group(GTK_RADIO_BUTTON(tags_version_radio));
00404   GtkWidget *the_selection = 
00405     (GtkWidget *)g_slist_nth_data(tags_version_radio_button_list, tag_pref_file);
00406   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(the_selection), TRUE);
00407 
00408   //default output format or not
00409   gint default_output_format = g_key_file_get_boolean(key_file, "output",
00410       "default_output_format", NULL);
00411   GSList *output_radio_button_list = 
00412     gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_output));
00413   GtkWidget *our_selection = 
00414     (GtkWidget *)g_slist_nth_data(output_radio_button_list, default_output_format);
00415   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(our_selection), TRUE);
00416   if (default_output_format)
00417   {
00418     gtk_widget_set_sensitive(GTK_WIDGET(output_entry), FALSE);
00419     gtk_widget_set_sensitive(GTK_WIDGET(output_label), FALSE);
00420   }
00421 
00422   //output format
00423   gchar *output_format = g_key_file_get_string(key_file, "output", "output_format", NULL);
00424   if (output_format)
00425   {
00426     gtk_entry_set_text(GTK_ENTRY(output_entry), output_format);
00427     g_free(output_format);
00428     output_format = NULL;
00429   }
00430 
00431   //create directories if needed
00432   item = g_key_file_get_boolean(key_file, "output", "create_dirs_if_needed", NULL);
00433   if (item)
00434   {
00435     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files), TRUE);
00436   }
00437   else
00438   {
00439     gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files), FALSE);
00440   }
00441 
00442   //type of split: split mode
00443   gint split_mode = g_key_file_get_integer(key_file, "split", "split_mode", NULL);
00444   select_split_mode(split_mode);
00445 
00446   //time value
00447   gint time_value = g_key_file_get_integer(key_file, "split",
00448       "split_mode_time_value", NULL);
00449   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_time), time_value);
00450 
00451   //file mode
00452   gint file_mode = g_key_file_get_integer(key_file, "split",
00453       "file_mode", NULL);
00454   GSList *file_mode_radio_button_list = 
00455     gtk_radio_button_get_group(GTK_RADIO_BUTTON(file_mode_radio_button));
00456   our_selection = 
00457     (GtkWidget *)g_slist_nth_data(file_mode_radio_button_list, file_mode);
00458   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(our_selection), TRUE);
00459 
00460   //equal time tracks value
00461   gint equal_tracks = g_key_file_get_integer(key_file, "split",
00462       "split_mode_equal_time_tracks", NULL);
00463   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_equal_tracks), equal_tracks);
00464 
00465   gint root_x = g_key_file_get_integer(key_file, "gui", "root_x_position", NULL);
00466   gint root_y = g_key_file_get_integer(key_file, "gui", "root_y_position", NULL);
00467   if (root_x && root_y)
00468   {
00469     ui_set_main_win_position(ui, root_x, root_y);
00470   }
00471 
00472   gint width = g_key_file_get_integer(key_file, "gui", "width", NULL);
00473   gint height = g_key_file_get_integer(key_file, "gui", "height", NULL);
00474   if (width && height)
00475   {
00476     ui_set_main_win_size(ui, width, height);
00477   }
00478 
00479   gchar *browser_directory =
00480     g_key_file_get_string(key_file, "gui", "browser_directory", NULL);
00481   if (browser_directory)
00482   {
00483     ui_set_browser_directory(ui, browser_directory);
00484     g_free(browser_directory);
00485   }
00486 
00487   g_key_file_free(key_file);
00488   key_file = NULL;
00489 }
00490 
00491 /* \brief writes a default configuration file
00492 
00493 Also is used to write good values on a bad existing configuration file
00494 */
00495 void write_default_preferences_file()
00496 {
00497   gchar *filename = get_preferences_filename();
00498 
00499   GKeyFile *my_key_file = g_key_file_new();
00500   g_key_file_load_from_file(my_key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
00501 
00502 #ifdef __WIN32__
00503   gchar *file_string = NULL;
00504 
00505   //default language
00506   if (!g_key_file_has_key(my_key_file, "general", "language",NULL))
00507   {
00508     g_key_file_set_string(my_key_file, "general", "language", "en");
00509     g_key_file_set_comment(my_key_file, "general", "language",
00510         "\n language of the gui: en = english, fr = french, de = german",
00511         NULL);
00512   }
00513   //if we have the key, but we have ugly values
00514   else
00515   {
00516     file_string = g_key_file_get_string(my_key_file, "general", "language", NULL);
00517     GString * lang_char = g_string_new(file_string);
00518 
00519     if((!g_string_equal(lang_char,g_string_new("en")))
00520         &&(!g_string_equal(lang_char, g_string_new("fr")))
00521         &&(!g_string_equal(lang_char, g_string_new("fr_FR")))
00522         &&(!g_string_equal(lang_char, g_string_new("de")))
00523         &&(!g_string_equal(lang_char, g_string_new("de_DE")))
00524         )
00525     {
00526       g_key_file_set_string(my_key_file, "general", "language", "en");
00527       g_key_file_set_comment(my_key_file, "general", "language",
00528           "\n language of the gui: en = english, fr_FR = french, de_DE = german",
00529           NULL);
00530     }
00531 
00532     g_free(file_string);
00533     g_string_free(lang_char, TRUE);
00534     file_string = NULL;
00535     lang_char = NULL;
00536   }
00537 #endif
00538 
00539   //frame mode
00540   if (!g_key_file_has_key(my_key_file, "split", "frame_mode",NULL))
00541   {
00542     g_key_file_set_boolean(my_key_file, "split", "frame_mode", FALSE);
00543   }
00544 
00545   //adjust mode
00546   if (!g_key_file_has_key(my_key_file, "split", "adjust_mode",NULL))
00547   {
00548     g_key_file_set_boolean(my_key_file, "split", "adjust_mode", FALSE);
00549   }
00550 
00551   gint item;
00552   gfloat item2;
00553   //adjust threshold
00554   if (!g_key_file_has_key(my_key_file, "split", "adjust_threshold",NULL))
00555   {
00556     g_key_file_set_integer(my_key_file, "split", "adjust_threshold",
00557         (int)(SPLT_DEFAULT_PARAM_THRESHOLD * 100));
00558   }
00559   //if we have the key but we have ugly values
00560   else
00561   {
00562     item = g_key_file_get_integer(my_key_file, "split", "adjust_threshold", NULL);
00563     //convert to float
00564     item2 = item/100 + (item%100)/100.;
00565 
00566     if ((item2 < -96) || (item2 > 0))
00567     {
00568       g_key_file_set_integer(my_key_file, "split", "adjust_threshold",
00569           (int)(SPLT_DEFAULT_PARAM_THRESHOLD * 100));
00570     }
00571   }
00572 
00573   //adjust offset
00574   if (!g_key_file_has_key(my_key_file, "split", "adjust_offset",NULL))
00575   {
00576     g_key_file_set_integer(my_key_file, "split", "adjust_offset",
00577         (int)(SPLT_DEFAULT_PARAM_OFFSET * 100));
00578   }
00579   //if we have the key but we have ugly values
00580   else
00581   {
00582     item = g_key_file_get_integer(my_key_file, "split", "adjust_offset", NULL);
00583     //convert to float
00584     item2 = item/100 + (item%100)/100.;
00585 
00586     //if ugly values
00587     if ((item2 < -2) || (item2 > 2))
00588     {
00589       g_key_file_set_integer(my_key_file, "split", "adjust_offset",
00590           (int)(SPLT_DEFAULT_PARAM_OFFSET * 100));
00591     }
00592   }
00593 
00594   //adjust gap
00595   if (!g_key_file_has_key(my_key_file, "split", "adjust_gap",NULL))
00596   {
00597     g_key_file_set_integer(my_key_file, "split", "adjust_gap", SPLT_DEFAULT_PARAM_GAP);
00598   }
00599   //if we have the key but we have ugly values
00600   else
00601   {
00602     item = g_key_file_get_integer(my_key_file, "split", "adjust_gap", NULL);
00603 
00604     //if ugly values
00605     if ((item < 0) || (item > 2000))
00606     {
00607       g_key_file_set_integer(my_key_file, "split", "adjust_gap",
00608           SPLT_DEFAULT_PARAM_GAP);
00609     }
00610   }
00611 
00612   //tags options
00613   if (!g_key_file_has_key(my_key_file, "split", "tags",NULL))
00614   {
00615     g_key_file_set_integer(my_key_file, "split", "tags", 1);
00616     g_key_file_set_comment(my_key_file, "split", "tags",
00617         "\n 0 - No tags, 1 - Default tags, 2 - Original tags, 3 - Tags from filename", NULL);
00618   }
00619 
00620   //tags version
00621   if (!g_key_file_has_key(my_key_file, "split", "tags_version",NULL))
00622   {
00623     g_key_file_set_integer(my_key_file, "split", "tags_version", 0);
00624     g_key_file_set_comment(my_key_file, "split", "tags_version",
00625         "\n 0 - same tags version as the input file, 1 - ID3v1 tags,"
00626         " 2 - ID3v2 tags, 3 - ID3v1 & ID3v2 tags",
00627         NULL);
00628   }
00629 
00630   //default player
00631   if (!g_key_file_has_key(my_key_file, "player", "default_player",NULL))
00632   {
00633     g_key_file_set_integer(my_key_file, "player", "default_player",
00634         PLAYER_GSTREAMER);
00635     g_key_file_set_comment (my_key_file, "player", "default_player",
00636         "\n 1 = PLAYER_AUDACIOUS, 2 = PLAYER_SNACKAMP, 3 = PLAYER_GSTREAMER",
00637         NULL);
00638   }
00639   else
00640   {
00641     //check if we support selected player
00642     gint the_player = g_key_file_get_integer(my_key_file, "player",
00643         "default_player", NULL);
00644     if (the_player == PLAYER_AUDACIOUS)
00645     {
00646 #ifdef NO_AUDACIOUS
00647       g_key_file_set_integer(my_key_file, "player", "default_player",
00648           PLAYER_SNACKAMP);
00649 #endif
00650     }
00651     //if the value do not make sense
00652     else if ((the_player > PLAYER_GSTREAMER) || (the_player < 0))
00653     {
00654       g_key_file_set_integer(my_key_file, "player", "default_player",
00655           PLAYER_GSTREAMER);
00656     }
00657   }
00658 
00659   if (!g_key_file_has_key(my_key_file, "player", "refresh_rate", NULL))
00660   {
00661     g_key_file_set_integer(my_key_file, "player", "refresh_rate", DEFAULT_TIMEOUT_VALUE);
00662   }
00663 
00664   //output format
00665   if (!g_key_file_has_key(my_key_file, "output", "output_format",NULL))
00666   {
00667     g_key_file_set_string(my_key_file, "output", "output_format",
00668         SPLT_DEFAULT_OUTPUT);
00669     g_key_file_set_comment (my_key_file, "output", "output_format",
00670         "\n the output format, contains @a,"
00671         "@b, @g, @p, @t and @n, see the program for"
00672         " more details",
00673         NULL);
00674   }
00675 
00676   //default output path boolean
00677   if (!g_key_file_has_key(my_key_file, "output", "default_output_format",NULL))
00678   {
00679     g_key_file_set_boolean(my_key_file, "output", "default_output_format", TRUE);
00680     g_key_file_set_comment(my_key_file, "output", "default_output_format",
00681         "\n can be true or false"
00682         " - if we use the default output or"
00683         " not for cddb, cue and freedb search",
00684         NULL);
00685   }
00686 
00687   //frame mode
00688   if (!g_key_file_has_key(my_key_file, "output", "create_dirs_if_needed", NULL))
00689   {
00690     g_key_file_set_boolean(my_key_file, "output", "create_dirs_if_needed", TRUE);
00691   }
00692 
00693   //split save path (output dir)
00694   if (!g_key_file_has_key(my_key_file, "split", "save_path",NULL))
00695   {
00696 #ifdef __WIN32__
00697     const gchar *home_dir = g_get_home_dir();
00698     gint dir_malloc_number = strlen(home_dir)+ 10;
00699     gchar *default_dir = malloc(dir_malloc_number*sizeof(gchar *));
00700     g_snprintf(default_dir, dir_malloc_number, "%s\\Desktop",home_dir);
00701 
00702     //see if the directory exists
00703     struct stat buffer;
00704     gint status = g_stat(default_dir, &buffer);
00705     if ((status == 0) && (S_ISDIR(buffer.st_mode) == 0))
00706     {
00707       g_snprintf(default_dir,dir_malloc_number, "%s",home_dir);
00708     }
00709 #else
00710     const gchar *default_dir = g_get_home_dir();
00711 #endif
00712 
00713     g_key_file_set_string(my_key_file, "split", "save_path", default_dir);
00714     g_key_file_set_comment(my_key_file, "split", "save_path",
00715         "\n this is the path where you will find your split files ",
00716         NULL);
00717 
00718 #ifdef __WIN32__
00719     g_free(default_dir);
00720 #endif
00721   }
00722 
00723   //type of split: split mode
00724   if (!g_key_file_has_key(my_key_file, "split", "split_mode",NULL))
00725   {
00726     g_key_file_set_integer(my_key_file, "split", "split_mode", 3);
00727     g_key_file_set_comment(my_key_file, "split", "split_mode",
00728         "\n 0 - error mode, 1 - wrap mode, 2 - time mode, 3 - normal mode, 4 - equal time tracks",
00729         NULL);
00730   }
00731 
00732   //type of split: time value
00733   if (!g_key_file_has_key(my_key_file, "split", "split_mode_time_value",NULL))
00734   {
00735     g_key_file_set_integer(my_key_file, "split", "split_mode_time_value", 60);
00736     g_key_file_set_comment(my_key_file, "split", "split_mode_time_value",
00737         "\n value in seconds to split every X seconds (for the time split)",
00738         NULL);
00739   }
00740 
00741   //type of split: file mode
00742   if (!g_key_file_has_key(my_key_file, "split", "file_mode",NULL))
00743   {
00744     g_key_file_set_integer(my_key_file, "split", "file_mode", 1);
00745     g_key_file_set_comment(my_key_file, "split", "file_mode",
00746         "\n 0 - multiple files, 1 - single file",
00747         NULL);
00748   }
00749 
00750   //equal time tracks
00751   if (!g_key_file_has_key(my_key_file, "split", "split_mode_equal_time_tracks",NULL))
00752   {
00753     g_key_file_set_integer(my_key_file, "split", "split_mode_equal_time_tracks", 10);
00754     g_key_file_set_comment(my_key_file, "split", "split_mode_equal_time_tracks",
00755         "\n number of tracks when to split in X tracks (for the equal time tracks split)",
00756         NULL);
00757   }
00758 
00759   gchar *key_data = g_key_file_to_data(my_key_file, NULL, NULL);
00760 
00761   //write content to the preferences file
00762   FILE *preferences_file = (FILE *)fopen(filename,"w");
00763   g_fprintf(preferences_file,"%s", key_data);
00764   fclose(preferences_file);
00765   preferences_file = NULL;
00766 
00767   if (filename)
00768   {
00769     g_free(filename);
00770     filename = NULL;
00771   }
00772 
00773   g_free(key_data);
00774   key_data = NULL;
00775   g_key_file_free(my_key_file);
00776 }
00777 
00782 void check_pref_file()
00783 {
00784   //used to see if the file exists
00785   struct stat buffer;
00786   gint         status;
00787   
00788   gchar *pref_file = get_preferences_filename();
00789   
00790   status = stat(pref_file, &buffer);
00791   if ((status == 0) &&
00792       (S_ISREG(buffer.st_mode) == 0) && 
00793       (S_ISDIR(buffer.st_mode) != 0))
00794   {
00795     //backup the directory
00796     gint malloc_number = strlen(pref_file)+5;
00797     gchar *backup_dir = malloc(malloc_number * sizeof(gchar *));
00798     snprintf(backup_dir,malloc_number,
00799         "%s%s",pref_file,".bak");
00800     //rename the directory
00801     g_rename(pref_file, backup_dir);
00802     g_free(backup_dir);
00803     backup_dir = NULL;
00804   }
00805 
00806   if (pref_file)
00807   {
00808     g_free(pref_file);
00809     pref_file = NULL;
00810   }
00811 
00812   write_default_preferences_file();
00813 }
00814 
00816 void set_language()
00817 {
00818   GKeyFile *key_file = g_key_file_new();
00819   //filename
00820   gchar *filename = get_preferences_filename();
00821 
00822   //load config
00823   g_key_file_load_from_file(key_file, filename,
00824                             G_KEY_FILE_KEEP_COMMENTS,
00825                             NULL);
00826 
00827   if (filename)
00828   {
00829     g_free(filename);
00830     filename = NULL;
00831   }
00832   
00833   gchar *lang = g_key_file_get_string(key_file, "general", "language", NULL);
00834  
00835  //NOTE: current function is only used for windows: code needs cleanup ?
00836 #ifdef __WIN32__
00837   gchar lang_env[32] = { '\0' };
00838   g_snprintf(lang_env, 32, "LANG=%s", lang);
00839   putenv(lang_env);
00840 #else
00841   setenv("LANGUAGE", lang,1);
00842 #endif
00843 
00844   //freeing memory
00845   g_free(lang);
00846   g_key_file_free(key_file);
00847 }
00848