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