From 26b8e06374c71e42be86694f5d5c4ee920ae4d26 Mon Sep 17 00:00:00 2001 From: Alex Bennee Date: Wed, 14 Jul 2010 16:01:16 +0100 Subject: EasyTag 2.1.4 --- src/Makefile.am | 11 +- src/Makefile.in | 23 +- src/Makefile.mingw | 2 + src/about.c | 108 ++- src/ape_tag.c | 2 +- src/bar.c | 7 +- src/base64.c | 206 +++++ src/base64.h | 42 + src/browser.c | 836 +++++++++++++----- src/browser.h | 9 +- src/cddb.c | 160 ++-- src/cddb.h | 0 src/charset.c | 45 +- src/easytag.c | 438 ++++++---- src/easytag.h | 0 src/et_core.c | 110 +-- src/et_core.h | 3 +- src/flac_header.c | 19 +- src/flac_tag.c | 1561 ++++++++++++++++++---------------- src/id3_tag.c | 72 +- src/id3v24_tag.c | 132 +-- src/libapetag/apetaglib.c | 6 +- src/libmpg123/README | 0 src/libmpg123/mpg123.c | 2 +- src/log.c | 69 +- src/log.h | 12 +- src/misc.c | 264 +++--- src/misc.h | 1 - src/mp4_header.c | 4 +- src/mp4_tag.c | 31 +- src/mpeg_header.c | 2 +- src/msgbox.c | 300 ++----- src/msgbox.h | 52 +- src/ogg_header.c | 28 +- src/ogg_tag.c | 147 +++- src/picture.c | 199 +++-- src/picture.h | 30 +- src/prefs.c | 67 +- src/prefs.h | 0 src/scan.c | 189 ++-- src/scan.h | 0 src/setting.c | 107 +-- src/setting.h | 0 src/win32/nsis/easytag-header.bmp | Bin 0 -> 25818 bytes src/win32/nsis/easytag-install.bmp | Bin 0 -> 154542 bytes src/win32/nsis/easytag-install.ico | Bin 0 -> 16958 bytes src/win32/nsis/easytag-uninstall.bmp | Bin 0 -> 154542 bytes src/win32/win32dep.c | 64 +- src/win32/win32dep.h | 9 +- src/win32/win_easytag.c | 5 +- 50 files changed, 3253 insertions(+), 2121 deletions(-) mode change 100755 => 100644 src/Makefile.am mode change 100755 => 100644 src/Makefile.mingw mode change 100644 => 100755 src/bar.c create mode 100644 src/base64.c create mode 100644 src/base64.h mode change 100644 => 100755 src/browser.h mode change 100644 => 100755 src/cddb.h mode change 100644 => 100755 src/easytag.c mode change 100644 => 100755 src/easytag.h mode change 100755 => 100644 src/flac_header.c mode change 100755 => 100644 src/flac_tag.c mode change 100755 => 100644 src/libapetag/apetaglib.c mode change 100644 => 100755 src/libmpg123/README mode change 100755 => 100644 src/libmpg123/mpg123.c mode change 100644 => 100755 src/log.c mode change 100644 => 100755 src/log.h mode change 100755 => 100644 src/mp4_tag.c mode change 100644 => 100755 src/msgbox.c mode change 100644 => 100755 src/msgbox.h mode change 100755 => 100644 src/ogg_tag.c mode change 100755 => 100644 src/picture.h mode change 100644 => 100755 src/prefs.c mode change 100644 => 100755 src/prefs.h mode change 100644 => 100755 src/scan.h mode change 100644 => 100755 src/setting.c mode change 100644 => 100755 src/setting.h create mode 100755 src/win32/nsis/easytag-header.bmp create mode 100755 src/win32/nsis/easytag-install.bmp create mode 100755 src/win32/nsis/easytag-install.ico create mode 100755 src/win32/nsis/easytag-uninstall.bmp mode change 100644 => 100755 src/win32/win32dep.c mode change 100644 => 100755 src/win32/win32dep.h (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am old mode 100755 new mode 100644 index 9383d83..5e9961d --- a/src/Makefile.am +++ b/src/Makefile.am @@ -11,6 +11,8 @@ easytag_SOURCES = \ ape_tag.h \ bar.c \ bar.h \ + base64.c \ + base64.h \ browser.c \ browser.h \ cddb.c \ @@ -75,10 +77,15 @@ EXTRA_DIST = \ win32/resource.h \ win32/win32dep.c \ win32/win32dep.h \ - win32/win_easytag.c + win32/win_easytag.c \ + win32/nsis/easytag-header.bmp \ + win32/nsis/easytag-install.bmp \ + win32/nsis/easytag-install.ico \ + win32/nsis/easytag-uninstall.bmp easytag_LDADD = $(GTK_LIBS) libmpg123/libmpg123.a libapetag/libapetag.a id3lib/libid3bugfix.a localedir = $(datadir)/locale PACKAGE_DATA_DIR = $(datadir)/$(PACKAGE) -INCLUDES = -DLOCALE=\"$(localedir)\" -DPACKAGE_DATA_DIR=\"$(PACKAGE_DATA_DIR)\" +INCLUDES = -DLOCALEDIR=\"$(localedir)\" \ + -DPACKAGE_DATA_DIR=\"$(PACKAGE_DATA_DIR)\" diff --git a/src/Makefile.in b/src/Makefile.in index 858e54f..6367466 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -46,11 +46,11 @@ am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_easytag_OBJECTS = about.$(OBJEXT) ape_tag.$(OBJEXT) bar.$(OBJEXT) \ - browser.$(OBJEXT) cddb.$(OBJEXT) charset.$(OBJEXT) \ - crc32.$(OBJEXT) dlm.$(OBJEXT) easytag.$(OBJEXT) \ - et_core.$(OBJEXT) flac_header.$(OBJEXT) flac_tag.$(OBJEXT) \ - id3_tag.$(OBJEXT) id3v24_tag.$(OBJEXT) log.$(OBJEXT) \ - misc.$(OBJEXT) monkeyaudio_header.$(OBJEXT) \ + base64.$(OBJEXT) browser.$(OBJEXT) cddb.$(OBJEXT) \ + charset.$(OBJEXT) crc32.$(OBJEXT) dlm.$(OBJEXT) \ + easytag.$(OBJEXT) et_core.$(OBJEXT) flac_header.$(OBJEXT) \ + flac_tag.$(OBJEXT) id3_tag.$(OBJEXT) id3v24_tag.$(OBJEXT) \ + log.$(OBJEXT) misc.$(OBJEXT) monkeyaudio_header.$(OBJEXT) \ mpeg_header.$(OBJEXT) mp4_header.$(OBJEXT) mp4_tag.$(OBJEXT) \ musepack_header.$(OBJEXT) msgbox.$(OBJEXT) \ ogg_header.$(OBJEXT) ogg_tag.$(OBJEXT) picture.$(OBJEXT) \ @@ -234,6 +234,8 @@ easytag_SOURCES = \ ape_tag.h \ bar.c \ bar.h \ + base64.c \ + base64.h \ browser.c \ browser.h \ cddb.c \ @@ -298,11 +300,17 @@ EXTRA_DIST = \ win32/resource.h \ win32/win32dep.c \ win32/win32dep.h \ - win32/win_easytag.c + win32/win_easytag.c \ + win32/nsis/easytag-header.bmp \ + win32/nsis/easytag-install.bmp \ + win32/nsis/easytag-install.ico \ + win32/nsis/easytag-uninstall.bmp easytag_LDADD = $(GTK_LIBS) libmpg123/libmpg123.a libapetag/libapetag.a id3lib/libid3bugfix.a PACKAGE_DATA_DIR = $(datadir)/$(PACKAGE) -INCLUDES = -DLOCALE=\"$(localedir)\" -DPACKAGE_DATA_DIR=\"$(PACKAGE_DATA_DIR)\" +INCLUDES = -DLOCALEDIR=\"$(localedir)\" \ + -DPACKAGE_DATA_DIR=\"$(PACKAGE_DATA_DIR)\" + all: all-recursive .SUFFIXES: @@ -377,6 +385,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/about.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ape_tag.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/browser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cddb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/charset.Po@am__quote@ diff --git a/src/Makefile.mingw b/src/Makefile.mingw old mode 100755 new mode 100644 index aede25d..dd86f83 --- a/src/Makefile.mingw +++ b/src/Makefile.mingw @@ -51,6 +51,7 @@ LIB_PATHS = `pkg-config --libs gtk+-2.0` \ -lid3 \ -lid3tag \ -liconv \ + -lspeex \ -lstdc++ \ -lz \ -lwavpack \ @@ -66,6 +67,7 @@ RC_SRC = win32/easytag.rc DLL_C_SRC = about.c \ ape_tag.c \ bar.c \ + base64.c \ browser.c \ charset.c \ cddb.c \ diff --git a/src/about.c b/src/about.c index f6efc08..3b19a68 100644 --- a/src/about.c +++ b/src/about.c @@ -32,6 +32,9 @@ # include # endif #endif +#ifdef ENABLE_FLAC +# include +#endif #include #include "about.h" @@ -55,10 +58,12 @@ ****************/ static GtkWidget *AboutWindow = NULL; +// Columns for features supported... enum { // Columns for titles - EXTENSION_NAME = 0, + EXTENSION_PIXBUF = 0, + EXTENSION_NAME, EXTENSION_STATUT, EXTENSION_COMMENT, @@ -121,6 +126,7 @@ void Show_About_Window (void) GtkTextIter textIter; GtkWidget *Button; GtkWidget *Logo; + //GdkPixbuf *pixbuf = NULL; GdkPixmap *pixmap; GdkBitmap *mask; gchar temp[MAX_STRING_LEN]; @@ -169,6 +175,7 @@ void Show_About_Window (void) {" - doutor zero ", _("(Brazilian Portuguese translation)")}, {" - Luchezar P. Petkov ", _("(Bulgarian translation)")}, {" - Yang Jinsong ", _("(Chinese translation)")}, + {" - Jose Sun ", _("(Chinese (Taiwan) translation)")}, {" - Yuval Hager ", _("(Hebrew translation)")}, {" - Miloš Popović ", _("(Serbian translation)")}, {NULL,NULL} @@ -228,6 +235,7 @@ void Show_About_Window (void) N_("Comment") }; GtkTreeIter treeIter; + //GError *error = NULL; /* Check if already opened */ @@ -275,7 +283,7 @@ void Show_About_Window (void) #else pixmap = gdk_pixmap_create_from_xpm_d(AboutWindow->window,&mask,NULL,EasyTAG_logo_xpm); #endif - + if (pixmap) { Logo = gtk_image_new_from_pixmap(pixmap, mask); @@ -284,6 +292,21 @@ void Show_About_Window (void) gtk_box_pack_start(GTK_BOX(VBox),Logo,FALSE,TRUE,0); gtk_misc_set_padding(GTK_MISC(Logo),2,2); } +/*#ifdef PACKAGE_DATA_DIR + pixbuf = gdk_pixbuf_new_from_file(PACKAGE_DATA_DIR"/EasyTAG_logo.png",&error); +#endif + + if (pixbuf) + { + Logo = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(pixbuf); + gtk_box_pack_start(GTK_BOX(VBox),Logo,FALSE,TRUE,0); + gtk_misc_set_padding(GTK_MISC(Logo),2,2); + }else + { + Log_Print(LOG_ERROR,error->message); + g_error_free(error); + }*/ /* Infos */ Label = gtk_label_new(NULL); @@ -329,12 +352,12 @@ void Show_About_Window (void) gtk_frame_set_shadow_type(GTK_FRAME(Frame),GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(VBox),Frame,FALSE,TRUE,0); gtk_container_set_border_width(GTK_CONTAINER(Frame), 2); - + Label = gtk_label_new(_(description_text)); gtk_misc_set_padding(GTK_MISC(Label),2,2); gtk_label_set_line_wrap(GTK_LABEL(Label),TRUE); gtk_container_add(GTK_CONTAINER(Frame),Label); - gtk_container_resize_children(GTK_CONTAINER(Frame)); + /* @@ -352,27 +375,42 @@ void Show_About_Window (void) GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); ExtensionListModel = gtk_list_store_new(EXTENSION_COLUMN_COUNT, - G_TYPE_STRING, /* Extension name */ - G_TYPE_STRING, /* Statut */ - G_TYPE_STRING /* Comment */ + G_TYPE_STRING, /* Pixbuf, but we use the Stock ID, so don't use GDK_TYPE_PIXBUF */ + G_TYPE_STRING, /* Extension name */ + G_TYPE_STRING, /* Statut */ + G_TYPE_STRING /* Comment */ ); ExtensionList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(ExtensionListModel)); - renderer = gtk_cell_renderer_text_new(); /* Extension name */ - column = gtk_tree_view_column_new_with_attributes(_(ExtensionList_Titles[0]), renderer, - "text", EXTENSION_NAME, - NULL); + /* Pixbuf and Extension name */ + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(ExtensionList_Titles[0])); + + // Cell of the column for the pixbuf + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "stock-id", EXTENSION_PIXBUF, + NULL); + // Cell of the column for the text + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", EXTENSION_NAME, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ExtensionList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - renderer = gtk_cell_renderer_text_new(); /* Statut */ + /* Statut */ + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_(ExtensionList_Titles[1]), renderer, "text", EXTENSION_STATUT, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(ExtensionList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - renderer = gtk_cell_renderer_text_new(); /* Comment */ + /* Comment */ + renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_(ExtensionList_Titles[2]), renderer, "text", EXTENSION_COMMENT, NULL); @@ -384,32 +422,37 @@ void Show_About_Window (void) GTK_SELECTION_NONE); gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(ExtensionList), FALSE); + // Load extensions list // MP3 #ifdef ENABLE_MP3 - sprintf(temp, _("libid3tag %s"), ID3_VERSION); + sprintf(temp, "libid3tag %s", ID3_VERSION); #endif gtk_list_store_append(ExtensionListModel, &treeIter); gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("MP3 file support"), #ifdef ENABLE_MP3 + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), EXTENSION_COMMENT, temp, #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); #ifdef ENABLE_MP3 #if (defined ENABLE_ID3LIB) - sprintf(temp, _("id3lib %d.%d.%d"), ID3LIB_MAJOR_VERSION, ID3LIB_MINOR_VERSION, ID3LIB_PATCH_VERSION); + sprintf(temp, "id3lib %d.%d.%d", ID3LIB_MAJOR_VERSION, ID3LIB_MINOR_VERSION, ID3LIB_PATCH_VERSION); #endif gtk_list_store_append(ExtensionListModel, &treeIter); gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("ID3v2.3 tags writting support"), #if (defined ENABLE_ID3LIB) + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("available"), // May not be used EXTENSION_COMMENT, temp, #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); @@ -419,8 +462,10 @@ void Show_About_Window (void) gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("Ogg Vorbis file support"), #ifdef ENABLE_OGG + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); @@ -429,18 +474,27 @@ void Show_About_Window (void) gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("Speex file support"), #ifdef ENABLE_SPEEX + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); // FLAC +#ifdef ENABLE_FLAC + sprintf(temp, "flac %s", FLAC__VERSION_STRING); +#endif + gtk_list_store_append(ExtensionListModel, &treeIter); gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("FLAC file support"), #ifdef ENABLE_FLAC + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), + EXTENSION_COMMENT, temp, #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); @@ -449,8 +503,10 @@ void Show_About_Window (void) gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("MP4/AAC file support"), #ifdef ENABLE_MP4 + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); @@ -459,8 +515,10 @@ void Show_About_Window (void) gtk_list_store_set(ExtensionListModel, &treeIter, EXTENSION_NAME, _("WavPack file support"), #ifdef ENABLE_WAVPACK + EXTENSION_PIXBUF, GTK_STOCK_APPLY, EXTENSION_STATUT, _("enabled"), #else + EXTENSION_PIXBUF, GTK_STOCK_CANCEL, EXTENSION_STATUT, _("disabled"), #endif -1); @@ -498,18 +556,20 @@ void Show_About_Window (void) for (i=0; translations_thanks_text[i][0]!=NULL; i++) { // Translator name - if (!g_utf8_validate(translations_thanks_text[i][0], -1, NULL)) + /*if (!g_utf8_validate(translations_thanks_text[i][0], -1, NULL)) temp_str = convert_string(translations_thanks_text[i][0], "iso-8859-1", "utf-8",TRUE); else - temp_str = g_strdup(translations_thanks_text[i][0]); + temp_str = g_strdup(translations_thanks_text[i][0]);*/ + temp_str = Try_To_Validate_Utf8_String(translations_thanks_text[i][0]); gtk_text_buffer_insert(TextBuffer, &textIter, temp_str, -1); g_free(temp_str); // Translation language - if (!g_utf8_validate(translations_thanks_text[i][1], -1, NULL)) + /*if (!g_utf8_validate(translations_thanks_text[i][1], -1, NULL)) temp_str = convert_string(translations_thanks_text[i][1], "iso-8859-1", "utf-8",TRUE); else - temp_str = g_strdup(translations_thanks_text[i][1]); + temp_str = g_strdup(translations_thanks_text[i][1]);*/ + temp_str = Try_To_Validate_Utf8_String(translations_thanks_text[i][1]); gtk_text_buffer_insert_with_tags_by_name(TextBuffer, &textIter, temp_str, -1, "italic", NULL); g_free(temp_str); @@ -574,10 +634,11 @@ void Show_About_Window (void) temp[strlen(temp)-1]='\0'; // Convert line to UTF-8 - if (!g_utf8_validate(temp, -1, NULL)) + /*if (!g_utf8_validate(temp, -1, NULL)) tmp = convert_string(temp, "iso-8859-1", "utf-8",TRUE); else - tmp = g_strdup(temp); + tmp = g_strdup(temp);*/ + tmp = Try_To_Validate_Utf8_String(tmp); if (tmp && tmp[0]!=' ') // If first character is a space => 1rst line after title { @@ -625,10 +686,9 @@ void Show_About_Window (void) gtk_widget_grab_default(Button); - /* Disable main window */ - /*gtk_widget_set_sensitive(MainWindow,FALSE);*/ - gtk_widget_show_all(AboutWindow); + //gtk_container_resize_children(GTK_CONTAINER(AboutNoteBook)); + } diff --git a/src/ape_tag.c b/src/ape_tag.c index e15f41e..fa0de5d 100755 --- a/src/ape_tag.c +++ b/src/ape_tag.c @@ -71,7 +71,7 @@ gboolean Ape_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) if ((file = fopen(filename, "rb")) == NULL) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8, g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8, g_strerror(errno)); g_free(filename_utf8); return FALSE; } diff --git a/src/bar.c b/src/bar.c old mode 100644 new mode 100755 index 6f75403..95cc179 --- a/src/bar.c +++ b/src/bar.c @@ -441,11 +441,12 @@ void Statusbar_Message (gchar *message, gint with_timer) if (!StatusBar) return; /* Validate UTF8 */ - if (!g_utf8_validate(message, -1, NULL)) + /*if (!g_utf8_validate(message, -1, NULL)) msg_temp = convert_to_utf8(message); else - msg_temp = g_strdup(message); - + msg_temp = g_strdup(message);*/ + msg_temp = Try_To_Validate_Utf8_String(message); + /* Remove a running timer */ Statusbar_Remove_Timer(); diff --git a/src/base64.c b/src/base64.c new file mode 100644 index 0000000..496f697 --- /dev/null +++ b/src/base64.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 1995 - 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt) + The following encoding technique is taken from RFC 1521 by Borenstein + and Freed. It is reproduced here in a slightly edited form for + convenience. + + A 65-character subset of US-ASCII is used, enabling 6 bits to be + represented per printable character. (The extra 65th character, "=", + is used to signify a special processing function.) + + The encoding process represents 24-bit groups of input bits as output + strings of 4 encoded characters. Proceeding from left to right, a + 24-bit input group is formed by concatenating 3 8-bit input groups. + These 24 bits are then treated as 4 concatenated 6-bit groups, each + of which is translated into a single digit in the base64 alphabet. + + Each 6-bit group is used as an index into an array of 64 printable + characters. The character referenced by the index is placed in the + output string. + + Table 1: The Base64 Alphabet + + Value Encoding Value Encoding Value Encoding Value Encoding + 0 A 17 R 34 i 51 z + 1 B 18 S 35 j 52 0 + 2 C 19 T 36 k 53 1 + 3 D 20 U 37 l 54 2 + 4 E 21 V 38 m 55 3 + 5 F 22 W 39 n 56 4 + 6 G 23 X 40 o 57 5 + 7 H 24 Y 41 p 58 6 + 8 I 25 Z 42 q 59 7 + 9 J 26 a 43 r 60 8 + 10 K 27 b 44 s 61 9 + 11 L 28 c 45 t 62 + + 12 M 29 d 46 u 63 / + 13 N 30 e 47 v + 14 O 31 f 48 w (pad) = + 15 P 32 g 49 x + 16 Q 33 h 50 y + + Special processing is performed if fewer than 24 bits are available + at the end of the data being encoded. A full encoding quantum is + always completed at the end of a quantity. When fewer than 24 input + bits are available in an input group, zero bits are added (on the + right) to form an integral number of 6-bit groups. Padding at the + end of the data is performed using the '=' character. + + Since all base64 input is an integral number of octets, only the + ------------------------------------------------- + following cases can arise: + + (1) the final quantum of encoding input is an integral + multiple of 24 bits; here, the final unit of encoded + output will be an integral multiple of 4 characters + with no "=" padding, + (2) the final quantum of encoding input is exactly 8 bits; + here, the final unit of encoded output will be two + characters followed by two "=" padding characters, or + (3) the final quantum of encoding input is exactly 16 bits; + here, the final unit of encoded output will be three + characters followed by one "=" padding character. + */ + +/* $Id: base64.c,v 1.5 2001/05/28 17:33:41 joda Exp $ */ + +/* + * Code taken from Kerberos krb4-1.2.2 + */ + +#include +#include +#include "base64.h" + +static char base64_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static int +pos(char c) +{ + char *p; + for (p = base64_chars; *p; p++) + if (*p == c) + return p - base64_chars; + return -1; +} + +int +base64_encode(const void *data, int size, char **str) +{ + char *s, *p; + int i; + int c; + const unsigned char *q; + + p = s = (char *) malloc(size * 4 / 3 + 4); + if (p == NULL) + return -1; + q = (const unsigned char *) data; + i = 0; + for (i = 0; i < size;) + { + c = q[i++]; + c *= 256; + if (i < size) + c += q[i]; + i++; + c *= 256; + if (i < size) + c += q[i]; + i++; + p[0] = base64_chars[(c & 0x00fc0000) >> 18]; + p[1] = base64_chars[(c & 0x0003f000) >> 12]; + p[2] = base64_chars[(c & 0x00000fc0) >> 6]; + p[3] = base64_chars[(c & 0x0000003f) >> 0]; + if (i > size) + p[3] = '='; + if (i > size + 1) + p[2] = '='; + p += 4; + } + *p = 0; + *str = s; + return strlen(s); +} + +#define DECODE_ERROR 0xffffffff + +static unsigned int +token_decode(const char *token) +{ + int i; + unsigned int val = 0; + int marker = 0; + + if (strlen(token) < 4) + return DECODE_ERROR; + for (i = 0; i < 4; i++) + { + val *= 64; + if (token[i] == '=') + marker++; + else if (marker > 0) + return DECODE_ERROR; + else + val += pos(token[i]); + } + if (marker > 2) + return DECODE_ERROR; + return (marker << 24) | val; +} + +int +base64_decode(const char *str, void *data) +{ + const char *p; + unsigned char *q; + + q = data; + for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) + { + unsigned int val = token_decode(p); + unsigned int marker = (val >> 24) & 0xff; + + if (val == DECODE_ERROR) + return -1; + *q++ = (val >> 16) & 0xff; + if (marker < 2) + *q++ = (val >> 8) & 0xff; + if (marker < 1) + *q++ = val & 0xff; + } + return q - (unsigned char *) data; +} diff --git a/src/base64.h b/src/base64.h new file mode 100644 index 0000000..f0ddea4 --- /dev/null +++ b/src/base64.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id: base64.h,v 1.2 1999/12/02 16:58:45 joda Exp $ */ + +#ifndef _BASE64_H_ +#define _BASE64_H_ + +int base64_encode(const void *data, int size, char **str); +int base64_decode(const char *str, void *data); + +#endif diff --git a/src/browser.c b/src/browser.c index 3261692..7aa56f0 100644 --- a/src/browser.c +++ b/src/browser.c @@ -84,6 +84,7 @@ GtkWidget *BrowserList; // List of files GtkListStore *fileListModel; GtkWidget *BrowserLabel; GtkWidget *BrowserButton; +GtkWidget *BrowserParentButton; GtkWidget *BrowserNoteBook; GtkWidget *BrowserArtistList; GtkListStore *artistListModel; @@ -152,7 +153,7 @@ void Browser_Entry_Activated (void); void Browser_Entry_Disable (void); void Browser_Entry_Enable (void); -void Browser_Button_Clicked (void); +void Browser_Parent_Button_Clicked (void); void Browser_Artist_List_Load_Files (ET_File *etfile_to_select); void Browser_Artist_List_Row_Selected (GtkTreeSelection *selection, gpointer data); @@ -222,19 +223,22 @@ void Browser_Load_Home_Directory (void) */ void Browser_Load_Default_Directory (void) { - gchar *temp; - temp = g_strdup(DEFAULT_PATH_TO_MP3); - - if (temp && g_utf8_strlen(temp, -1)>0) - { - Browser_Tree_Select_Dir(temp); - } else + gchar *path_utf8; + gchar *path; + + path_utf8 = g_strdup(DEFAULT_PATH_TO_MP3); + if (!path_utf8 || strlen(path_utf8)<=0) { - g_free(temp); - temp = g_strdup(HOME_VARIABLE); - Browser_Tree_Select_Dir(HOME_VARIABLE); + g_free(path_utf8); + path_utf8 = g_strdup(HOME_VARIABLE); } - g_free(temp); + + // 'DEFAULT_PATH_TO_MP3' is stored in UTF-8, we must convert it to the file system encoding before... + path = filename_from_display(path_utf8); + Browser_Tree_Select_Dir(path); + + g_free(path); + g_free(path_utf8); } @@ -357,7 +361,7 @@ void Browser_Entry_Set_Text (gchar *text) /* * Button to go to parent directory */ -void Browser_Button_Clicked (void) +void Browser_Parent_Button_Clicked (void) { gchar *parent_dir, *path; @@ -531,6 +535,7 @@ gboolean Browser_List_Key_Press (GtkWidget *list, GdkEvent *event, gpointer data -1); /* UTF-8 comparison */ + //key_string = Try_To_Validate_Utf8_String(key_string); if (g_utf8_validate(key_string, -1, NULL) == FALSE) { temp = convert_to_utf8(key_string); @@ -708,24 +713,31 @@ gboolean Browser_Tree_Node_Selected (GtkTreeSelection *selection, gpointer user_ if (ET_Check_If_All_Files_Are_Saved() != TRUE) { GtkWidget *msgbox = NULL; - gint button; - - msgbox = msg_box_new(_("Confirm..."),_("Some files have been modified but not " - "saved...\nDo you want to save them before changing the directory?"), - GTK_STOCK_DIALOG_QUESTION,BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + gint response; + + msgbox = msg_box_new(_("Confirm..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Some files have been modified but not saved...\nDo you want to save them before " + "changing the directory?"), + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - switch (button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: if (Save_All_Files_With_Answer(FALSE)==-1) return TRUE; break; - case BUTTON_NO: + case GTK_RESPONSE_NO: break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: return TRUE; } } @@ -818,6 +830,8 @@ gint Browser_Win32_Get_Drive_Root (gchar *drive, GtkTreeIter *rootNode, GtkTreeP * Browser_Tree_Select_Dir: Select the directory corresponding to the 'path' in * the tree browser, but it doesn't read it! * Check if path is correct before selecting it. And returns 1 on success, else 0. + * + * - "current_path" is in file system encoding (not UTF-8) */ gint Browser_Tree_Select_Dir (gchar *current_path) { @@ -841,6 +855,7 @@ gint Browser_Tree_Select_Dir (gchar *current_path) ET_Win32_Path_Remove_Trailing_Backslash(current_path); #endif + /* Don't check here if the path is valid. It will be done later when * selecting a node in the tree */ @@ -967,7 +982,7 @@ void Browser_List_Row_Selected (GtkTreeSelection *selection, gpointer data) void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select) { gboolean activate_bg_color = 0; - GtkTreeIter row; + GtkTreeIter rowIter; if (!BrowserList) return; @@ -975,9 +990,11 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select) etfilelist = g_list_first(etfilelist); while (etfilelist) { - guint fileKey = ((ET_File *)etfilelist->data)->ETFileKey; + guint fileKey = ((ET_File *)etfilelist->data)->ETFileKey; gchar *current_filename_utf8 = ((File_Name *)((ET_File *)etfilelist->data)->FileNameCur->data)->value_utf8; - gchar *basename_utf8 = g_path_get_basename(current_filename_utf8); + gchar *basename_utf8 = g_path_get_basename(current_filename_utf8); + File_Tag *FileTag = ((File_Tag *)((ET_File *)etfilelist->data)->FileTag->data); + gchar *track; // Change background color when changing directory (the first row must not be changed) if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(fileListModel), NULL) > 0) @@ -996,24 +1013,39 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select) g_free(dir2_utf8); } - // File list displays the current filename (name on HD) - gtk_list_store_append(fileListModel, &row); - gtk_list_store_set(fileListModel, &row, - LIST_FILE_NAME, basename_utf8, - LIST_FILE_POINTER, etfilelist->data, - LIST_FILE_KEY, fileKey, - LIST_FILE_OTHERDIR, activate_bg_color, + // File list displays the current filename (name on HardDisk) and tag fields + gtk_list_store_append(fileListModel, &rowIter); + track = g_strconcat(FileTag->track ? FileTag->track : "",FileTag->track_total ? "/" : NULL,FileTag->track_total,NULL); + + gtk_list_store_set(fileListModel, &rowIter, + LIST_FILE_NAME, basename_utf8, + LIST_FILE_POINTER, etfilelist->data, + LIST_FILE_KEY, fileKey, + LIST_FILE_OTHERDIR, activate_bg_color, + LIST_FILE_TITLE, FileTag->title, + LIST_FILE_ARTIST, FileTag->artist, + LIST_FILE_ALBUM, FileTag->album, + LIST_FILE_YEAR, FileTag->year, + LIST_FILE_TRACK, track, + LIST_FILE_GENRE, FileTag->genre, + LIST_FILE_COMMENT, FileTag->comment, + LIST_FILE_COMPOSER, FileTag->composer, + LIST_FILE_ORIG_ARTIST, FileTag->orig_artist, + LIST_FILE_COPYRIGHT, FileTag->copyright, + LIST_FILE_URL, FileTag->url, + LIST_FILE_ENCODED_BY, FileTag->encoded_by, -1); g_free(basename_utf8); + g_free(track); if (etfile_to_select == etfilelist->data) { - Browser_List_Select_File_By_Iter(&row, TRUE); + Browser_List_Select_File_By_Iter(&rowIter, TRUE); //ET_Display_File_Data_To_UI(etfilelist->data); } // Set appearance of the row - Browser_List_Set_Row_Appearance(&row); + Browser_List_Set_Row_Appearance(&rowIter); etfilelist = g_list_next(etfilelist); } @@ -1022,22 +1054,25 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select) /* * Update state of files in the list after changes (without clearing the list model!) - * - Refresh filename is file saved, - * - Change color is something change on the file + * - Refresh 'filename' is file saved, + * - Change color is something changed on the file */ void Browser_List_Refresh_Whole_List (void) { - ET_File *ETFile; + ET_File *ETFile; + File_Tag *FileTag; + File_Name *FileName; //GtkTreeIter iter; GtkTreePath *currentPath = NULL; GtkTreeIter iter; gint row; gchar *current_basename_utf8; + gchar *track; gboolean valid; GtkWidget *TBViewMode; - if (!ETCore->ETFileDisplayedList || !BrowserList || - gtk_tree_model_iter_n_children(GTK_TREE_MODEL(fileListModel), NULL) == 0) + if (!ETCore->ETFileDisplayedList || !BrowserList + || gtk_tree_model_iter_n_children(GTK_TREE_MODEL(fileListModel), NULL) == 0) { return; } @@ -1053,12 +1088,33 @@ void Browser_List_Refresh_Whole_List (void) valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &iter, currentPath); while (valid) { - // Refresh filename + // Refresh filename and other fields gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &iter, LIST_FILE_POINTER, &ETFile, -1); - current_basename_utf8 = g_path_get_basename( ((File_Name *)ETFile->FileNameCur->data)->value_utf8 ); - gtk_list_store_set(fileListModel, &iter, LIST_FILE_NAME, current_basename_utf8, -1); + + FileName = (File_Name *)ETFile->FileNameCur->data; + FileTag = (File_Tag *)ETFile->FileTag->data; + + current_basename_utf8 = g_path_get_basename(FileName->value_utf8); + track = g_strconcat(FileTag->track ? FileTag->track : "",FileTag->track_total ? "/" : NULL,FileTag->track_total,NULL); + + gtk_list_store_set(fileListModel, &iter, + LIST_FILE_NAME, current_basename_utf8, + LIST_FILE_TITLE, FileTag->title, + LIST_FILE_ARTIST, FileTag->artist, + LIST_FILE_ALBUM, FileTag->album, + LIST_FILE_YEAR, FileTag->year, + LIST_FILE_TRACK, track, + LIST_FILE_GENRE, FileTag->genre, + LIST_FILE_COMMENT, FileTag->comment, + LIST_FILE_COMPOSER, FileTag->composer, + LIST_FILE_ORIG_ARTIST, FileTag->orig_artist, + LIST_FILE_COPYRIGHT, FileTag->copyright, + LIST_FILE_URL, FileTag->url, + LIST_FILE_ENCODED_BY, FileTag->encoded_by, + -1); g_free(current_basename_utf8); + g_free(track); Browser_List_Set_Row_Appearance(&iter); @@ -1110,9 +1166,12 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) GtkTreeSelection *selection; GtkTreeIter selectedIter; GtkTreePath *currentPath = NULL; - ET_File *file; + ET_File *etfile; + File_Tag *FileTag; + File_Name *FileName; gboolean row_found = FALSE; - gchar *current_basename_utf8; + gchar *current_basename_utf8; + gchar *track; gboolean valid; gint row; gchar *artist, *album; @@ -1133,8 +1192,8 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) if (valid) { gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &selectedIter, - LIST_FILE_POINTER, &file, -1); - if (ETFile->ETFileKey == file->ETFileKey) + LIST_FILE_POINTER, &etfile, -1); + if (ETFile->ETFileKey == etfile->ETFileKey) { row_found = TRUE; } @@ -1153,8 +1212,8 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) if (valid) { gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &selectedIter, - LIST_FILE_POINTER, &file, -1); - if (ETFile->ETFileKey == file->ETFileKey) + LIST_FILE_POINTER, &etfile, -1); + if (ETFile->ETFileKey == etfile->ETFileKey) { row_found = TRUE; } @@ -1168,13 +1227,14 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) if (row_found == FALSE) { valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(fileListModel), &selectedIter); - while (valid && !row_found) + while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &selectedIter, - LIST_FILE_POINTER, &file, -1); - if (ETFile->ETFileKey == file->ETFileKey) + LIST_FILE_POINTER, &etfile, -1); + if (ETFile->ETFileKey == etfile->ETFileKey) { row_found = TRUE; + break; } else { valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(fileListModel), &selectedIter); @@ -1186,10 +1246,30 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) if (row_found == FALSE) return; - // Displayed the filename - current_basename_utf8 = g_path_get_basename( ((File_Name *)file->FileNameCur->data)->value_utf8 ); - gtk_list_store_set(fileListModel, &selectedIter, LIST_FILE_NAME, current_basename_utf8, -1); + // Displayed the filename and refresh other fields + FileName = (File_Name *)etfile->FileNameCur->data; + FileTag = (File_Tag *)etfile->FileTag->data; + + current_basename_utf8 = g_path_get_basename(FileName->value_utf8); + track = g_strconcat(FileTag->track ? FileTag->track : "",FileTag->track_total ? "/" : NULL,FileTag->track_total,NULL); + + gtk_list_store_set(fileListModel, &selectedIter, + LIST_FILE_NAME, current_basename_utf8, + LIST_FILE_TITLE, FileTag->title, + LIST_FILE_ARTIST, FileTag->artist, + LIST_FILE_ALBUM, FileTag->album, + LIST_FILE_YEAR, FileTag->year, + LIST_FILE_TRACK, track, + LIST_FILE_GENRE, FileTag->genre, + LIST_FILE_COMMENT, FileTag->comment, + LIST_FILE_COMPOSER, FileTag->composer, + LIST_FILE_ORIG_ARTIST, FileTag->orig_artist, + LIST_FILE_COPYRIGHT, FileTag->copyright, + LIST_FILE_URL, FileTag->url, + LIST_FILE_ENCODED_BY, FileTag->encoded_by, + -1); g_free(current_basename_utf8); + g_free(track); // Change appearance (line to red) if filename changed Browser_List_Set_Row_Appearance(&selectedIter); @@ -1262,53 +1342,80 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile) /* * Set the appearance of the row + * - change background according LIST_FILE_OTHERDIR + * - change foreground according file status (saved or not) */ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter) { - ET_File *rowETFile; + ET_File *rowETFile = NULL; gboolean otherdir = FALSE; GdkColor *backgroundcolor; - gchar *temp; + //gchar *temp = NULL; if (iter == NULL) return; // Get the ETFile reference gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), iter, - LIST_FILE_POINTER, &rowETFile, - LIST_FILE_OTHERDIR, &otherdir, - LIST_FILE_NAME, &temp, -1); + LIST_FILE_POINTER, &rowETFile, + LIST_FILE_OTHERDIR, &otherdir, + //LIST_FILE_NAME, &temp, + -1); + // Must change background color? if (otherdir) backgroundcolor = &LIGHT_BLUE; else backgroundcolor = NULL; - // Set text to bold/red if filename or tag changed + // Set text to bold/red if 'filename' or 'tag' changed if ( ET_Check_If_File_Is_Saved(rowETFile) == FALSE ) { if (CHANGED_FILES_DISPLAYED_TO_BOLD) { gtk_list_store_set(fileListModel, iter, - LIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, + LIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, LIST_ROW_BACKGROUND, backgroundcolor, LIST_ROW_FOREGROUND, NULL, -1); } else { gtk_list_store_set(fileListModel, iter, - LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, LIST_ROW_BACKGROUND, backgroundcolor, LIST_ROW_FOREGROUND, &RED, -1); } } else { gtk_list_store_set(fileListModel, iter, - LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, LIST_ROW_BACKGROUND, backgroundcolor, LIST_ROW_FOREGROUND, NULL ,-1); } + + // Update text fields + // Don't do it here + /*if (rowETFile) + { + File_Tag *FileTag = ((File_Tag *)((ET_File *)rowETFile)->FileTag->data); + + gtk_list_store_set(fileListModel, iter, + LIST_FILE_TITLE, FileTag->title, + LIST_FILE_ARTIST, FileTag->artist, + LIST_FILE_ALBUM, FileTag->album, + LIST_FILE_YEAR, FileTag->year, + LIST_FILE_TRACK, FileTag->track, + LIST_FILE_GENRE, FileTag->genre, + LIST_FILE_COMMENT, FileTag->comment, + LIST_FILE_COMPOSER, FileTag->composer, + LIST_FILE_ORIG_ARTIST, FileTag->orig_artist, + LIST_FILE_COPYRIGHT, FileTag->copyright, + LIST_FILE_URL, FileTag->url, + LIST_FILE_ENCODED_BY, FileTag->encoded_by, + -1); + }*/ + // Frees allocated item from gtk_tree_model_get... - g_free(temp); + //g_free(temp); } @@ -1518,7 +1625,7 @@ ET_File *Browser_List_Select_File_By_DLM (const gchar* string, gboolean select_i do { gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &iter, - LIST_FILE_NAME, ¤t_filename, + LIST_FILE_NAME, ¤t_filename, LIST_FILE_POINTER, ¤t_etfile, -1); current_title = ((File_Tag *)current_etfile->FileTag->data)->title; @@ -1903,6 +2010,7 @@ void Browser_Artist_List_Load_Files (ET_File *etfile_to_select) // Add the new row gtk_list_store_append(artistListModel, &iter); gtk_list_store_set(artistListModel, &iter, + ARTIST_PIXBUF, "easytag-artist", ARTIST_NAME, artistname, ARTIST_NUM_ALBUMS, g_list_length(g_list_first(AlbumList)), ARTIST_NUM_FILES, nbr_files, @@ -1961,7 +2069,8 @@ void Browser_Artist_List_Row_Selected(GtkTreeSelection* selection, gpointer data // Save the current displayed data ET_Save_File_Data_From_UI(ETCore->ETFileDisplayed); - gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), &iter, ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1); + gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), &iter, + ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1); Browser_Album_List_Load_Files(AlbumList, NULL); } @@ -1972,10 +2081,12 @@ void Browser_Artist_List_Set_Row_Appearance (GtkTreeIter *iter) { GList *AlbumList; GList *etfilelist; + gboolean not_all_saved = FALSE; - gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), iter, ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1); + gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), iter, + ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1); - // Reset the style of the row if one of the files was changed + // Change the style (red/bold) of the row if one of the files was changed while (AlbumList) { etfilelist = (GList *)AlbumList->data; @@ -1986,18 +2097,31 @@ void Browser_Artist_List_Set_Row_Appearance (GtkTreeIter *iter) if (CHANGED_FILES_DISPLAYED_TO_BOLD) { // Set the font-style to "bold" - gtk_list_store_set(artistListModel, iter, ARTIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, -1); + gtk_list_store_set(artistListModel, iter, + ARTIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, -1); } else { // Set the background-color to "red" - gtk_list_store_set(artistListModel, iter, ARTIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, ARTIST_ROW_FOREGROUND, &RED, -1); + gtk_list_store_set(artistListModel, iter, + ARTIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + ARTIST_ROW_FOREGROUND, &RED, -1); } + not_all_saved = TRUE; break; } etfilelist = etfilelist->next; } AlbumList = AlbumList->next; } + + // Reset style if all files saved + if (not_all_saved == FALSE) + { + gtk_list_store_set(artistListModel, iter, + ARTIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + ARTIST_ROW_FOREGROUND, NULL, -1); + } + } @@ -2037,8 +2161,8 @@ void Browser_Album_List_Load_Files (GList *albumlist, ET_File *etfile_to_select) } gtk_list_store_append(albumListModel, &iter); gtk_list_store_set(albumListModel, &iter, - ALBUM_NAME, _(""), - ALBUM_NUM_FILES, g_list_length(g_list_first(etfilelist)), + ALBUM_NAME, _(""), + ALBUM_NUM_FILES, g_list_length(g_list_first(etfilelist)), ALBUM_ETFILE_LIST_POINTER, etfilelist, -1); @@ -2054,8 +2178,9 @@ void Browser_Album_List_Load_Files (GList *albumlist, ET_File *etfile_to_select) // Add the new row gtk_list_store_append(albumListModel, &iter); gtk_list_store_set(albumListModel, &iter, - ALBUM_NAME, albumname, - ALBUM_NUM_FILES, g_list_length(g_list_first(etfilelist)), + ALBUM_PIXBUF, "easytag-album", + ALBUM_NAME, albumname, + ALBUM_NUM_FILES, g_list_length(g_list_first(etfilelist)), ALBUM_ETFILE_LIST_POINTER, etfilelist, -1); @@ -2114,7 +2239,8 @@ void Browser_Album_List_Row_Selected (GtkTreeSelection *selection, gpointer data if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return; - gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), &iter, ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1); + gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), &iter, + ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1); // Save the current displayed data ET_Save_File_Data_From_UI(ETCore->ETFileDisplayed); @@ -2135,10 +2261,12 @@ void Browser_Album_List_Row_Selected (GtkTreeSelection *selection, gpointer data void Browser_Album_List_Set_Row_Appearance (GtkTreeIter *iter) { GList *etfilelist; + gboolean not_all_saved = FALSE; - gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), iter, ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1); + gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), iter, + ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1); - // Reset the style of the row if one of the files was changed + // Change the style (red/bold) of the row if one of the files was changed while (etfilelist) { if ( ET_Check_If_File_Is_Saved((ET_File *)etfilelist->data) == FALSE ) @@ -2146,16 +2274,28 @@ void Browser_Album_List_Set_Row_Appearance (GtkTreeIter *iter) if (CHANGED_FILES_DISPLAYED_TO_BOLD) { // Set the font-style to "bold" - gtk_list_store_set(albumListModel, iter, ALBUM_FONT_WEIGHT, PANGO_WEIGHT_BOLD, -1); + gtk_list_store_set(albumListModel, iter, + ALBUM_FONT_WEIGHT, PANGO_WEIGHT_BOLD, -1); } else { // Set the background-color to "red" - gtk_list_store_set(albumListModel, iter, ALBUM_ROW_FOREGROUND, &RED, -1); + gtk_list_store_set(albumListModel, iter, + ALBUM_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + ALBUM_ROW_FOREGROUND, &RED, -1); } + not_all_saved = TRUE; break; } etfilelist = etfilelist->next; } + + // Reset style if all files saved + if (not_all_saved == FALSE) + { + gtk_list_store_set(albumListModel, iter, + ALBUM_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + ALBUM_ROW_FOREGROUND, NULL, -1); + } } void Browser_Display_Tree_Or_Artist_Album_List (void) @@ -2306,13 +2446,13 @@ void Browser_Tree_Initialize (void) drive_dir_name = g_strconcat("(", drive_slashless, ") ", drive_label, NULL); gtk_tree_store_append(directoryTreeModel, &parent_iter, NULL); - gtk_tree_store_set(directoryTreeModel, &parent_iter, - TREE_COLUMN_DIR_NAME, drive_dir_name, - TREE_COLUMN_FULL_PATH, drive_backslashed, - TREE_COLUMN_HAS_SUBDIR, TRUE, - TREE_COLUMN_SCANNED, FALSE, - TREE_COLUMN_PIXBUF, drive_pixmap, - -1); + gtk_tree_store_set(directoryTreeModel, &parent_iter, + TREE_COLUMN_DIR_NAME, drive_dir_name, + TREE_COLUMN_FULL_PATH, drive_backslashed, + TREE_COLUMN_HAS_SUBDIR, TRUE, + TREE_COLUMN_SCANNED, FALSE, + TREE_COLUMN_PIXBUF, drive_pixmap, + -1); // Insert dummy node gtk_tree_store_append(directoryTreeModel, &dummy_iter, &parent_iter); @@ -2328,11 +2468,11 @@ void Browser_Tree_Initialize (void) gtk_tree_store_append(directoryTreeModel, &parent_iter, NULL); gtk_tree_store_set(directoryTreeModel, &parent_iter, - TREE_COLUMN_DIR_NAME, G_DIR_SEPARATOR_S, - TREE_COLUMN_FULL_PATH, G_DIR_SEPARATOR_S, - TREE_COLUMN_HAS_SUBDIR, TRUE, - TREE_COLUMN_SCANNED, FALSE, - TREE_COLUMN_PIXBUF, closed_folder_pixmap, + TREE_COLUMN_DIR_NAME, G_DIR_SEPARATOR_S, + TREE_COLUMN_FULL_PATH, G_DIR_SEPARATOR_S, + TREE_COLUMN_HAS_SUBDIR, TRUE, + TREE_COLUMN_SCANNED, FALSE, + TREE_COLUMN_PIXBUF, closed_folder_pixmap, -1); // insert dummy node gtk_tree_store_append(directoryTreeModel, &dummy_iter, &parent_iter); @@ -2431,7 +2571,7 @@ void Browser_Tree_Rename_Directory (gchar *last_path, gchar *new_path) { // ERROR! Could not find it! gchar *text_utf8 = filename_to_display(textsplit[i]); - Log_Print(_("Error: Searching for %s, could not find node %s in tree."), last_path, text_utf8); + Log_Print(LOG_ERROR,_("Error: Searching for %s, could not find node %s in tree."), last_path, text_utf8); g_strfreev(textsplit); g_free(text_utf8); return; @@ -2447,7 +2587,7 @@ void Browser_Tree_Rename_Directory (gchar *last_path, gchar *new_path) new_basename = g_path_get_basename(new_path); new_basename_utf8 = filename_to_display(new_basename); gtk_tree_store_set(directoryTreeModel, &iter, - TREE_COLUMN_DIR_NAME, new_basename_utf8, + TREE_COLUMN_DIR_NAME, new_basename_utf8, TREE_COLUMN_FULL_PATH, new_path, -1); @@ -2475,7 +2615,7 @@ void Browser_Tree_Handle_Rename (GtkTreeIter *parentnode, gchar *old_path, gchar gchar *path_new; // If there are no children then nothing needs to be done! - if(!gtk_tree_model_iter_children(GTK_TREE_MODEL(directoryTreeModel), &iter, parentnode)) + if (!gtk_tree_model_iter_children(GTK_TREE_MODEL(directoryTreeModel), &iter, parentnode)) return; do @@ -2498,7 +2638,7 @@ void Browser_Tree_Handle_Rename (GtkTreeIter *parentnode, gchar *old_path, gchar if(gtk_tree_model_iter_has_child(GTK_TREE_MODEL(directoryTreeModel), &iter)) Browser_Tree_Handle_Rename(&iter, old_path, new_path); - } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(directoryTreeModel), &iter)); + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(directoryTreeModel), &iter)); } @@ -2657,7 +2797,7 @@ static void expand_cb (GtkWidget *tree, GtkTreeIter *iter, GtkTreePath *gtreePat gtk_tree_model_get(GTK_TREE_MODEL(directoryTreeModel), iter, TREE_COLUMN_FULL_PATH, &parentPath, - TREE_COLUMN_SCANNED, &treeScanned, -1); + TREE_COLUMN_SCANNED, &treeScanned, -1); if (treeScanned) return; @@ -2681,6 +2821,7 @@ static void expand_cb (GtkWidget *tree, GtkTreeIter *iter, GtkTreePath *gtreePat fullpath_file = g_strdup(path); dirname_utf8 = filename_to_display(dirent->d_name); + //if (!dirname_utf8) //{ // gchar *escaped_temp = g_strescape(dirent->d_name, NULL); @@ -2786,7 +2927,7 @@ static void collapse_cb (GtkWidget *tree, GtkTreeIter *iter, GtkTreePath *treePa */ GtkWidget *Create_Browser_Items (GtkWidget *parent) { - GtkWidget *VerticalBox; + GtkWidget *VerticalBox; GtkWidget *HBox; GtkWidget *ScrollWindowDirectoryTree; GtkWidget *ScrollWindowFileList; @@ -2798,8 +2939,13 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) GtkTreeViewColumn *column; GtkTooltips *Tips; GtkWidget *PopupMenu; - gchar *ArtistList_Titles[] = {N_("Artist"),N_("# Albums"),N_("# Files")}; - gchar *AlbumList_Titles[] = {N_("Album"),N_("# Files")}; + gchar *BrowserTree_Titles[] = {N_("Tree")}; + gchar *BrowserList_Titles[] = {N_("File Name"),N_("Title"),N_("Artist"),N_("Album"), + N_("Year"),N_("Track"),N_("Genre"),N_("Comment"), + N_("Composer"),N_("Orig. Artist"),N_("Copyright"), + N_("URL"),N_("Encoded By")}; + gchar *ArtistList_Titles[] = {N_("Artist"),N_("# Albums"),N_("# Files")}; + gchar *AlbumList_Titles[] = {N_("Album"),N_("# Files")}; Tips = gtk_tooltips_new(); VerticalBox = gtk_vbox_new(FALSE,2); @@ -2813,13 +2959,13 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) /* * The button to go to the parent directory */ - BrowserButton = gtk_button_new(); + BrowserParentButton = gtk_button_new(); Icon = gtk_image_new_from_stock("easytag-parent-folder", GTK_ICON_SIZE_SMALL_TOOLBAR); // On Win32, GTK_ICON_SIZE_BUTTON enlarge the combobox... - gtk_container_add(GTK_CONTAINER(BrowserButton),Icon); - gtk_box_pack_start(GTK_BOX(HBox),BrowserButton,FALSE,FALSE,0); - gtk_button_set_relief(GTK_BUTTON(BrowserButton),GTK_RELIEF_NONE); - g_signal_connect(G_OBJECT(BrowserButton),"clicked",G_CALLBACK(Browser_Button_Clicked),NULL); - gtk_tooltips_set_tip(Tips,BrowserButton,_("Go to parent directory"),NULL); + gtk_container_add(GTK_CONTAINER(BrowserParentButton),Icon); + gtk_box_pack_start(GTK_BOX(HBox),BrowserParentButton,FALSE,FALSE,0); + gtk_button_set_relief(GTK_BUTTON(BrowserParentButton),GTK_RELIEF_NONE); + g_signal_connect(G_OBJECT(BrowserParentButton),"clicked",G_CALLBACK(Browser_Parent_Button_Clicked),NULL); + gtk_tooltips_set_tip(Tips,BrowserParentButton,_("Go to parent directory"),NULL); /* * The entry box for displaying path @@ -2838,6 +2984,15 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) gtk_box_pack_start(GTK_BOX(HBox),BrowserEntryCombo,TRUE,TRUE,1); gtk_tooltips_set_tip(Tips,GTK_WIDGET(GTK_ENTRY(GTK_BIN(BrowserEntryCombo)->child)),_("Enter a directory to browse."),NULL); + /* + * The button to select a directory to browse + */ + BrowserButton = gtk_button_new_from_stock(GTK_STOCK_OPEN); + gtk_box_pack_start(GTK_BOX(HBox),BrowserButton,FALSE,FALSE,1); + g_signal_connect_swapped(G_OBJECT(BrowserButton),"clicked", + G_CALLBACK(File_Selection_Window_For_Directory),G_OBJECT(GTK_BIN(BrowserEntryCombo)->child)); + gtk_tooltips_set_tip(Tips,BrowserButton,_("Select a directory to browse."),NULL); + /* * The label for displaying number of files in path (without subdirs) @@ -2857,28 +3012,28 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) /* get GTK's theme harddrive and removable icons and render it in a pixbuf */ harddrive_pixmap = gtk_icon_set_render_icon(gtk_style_lookup_icon_set(parent->style, GTK_STOCK_HARDDISK), parent->style, - gtk_widget_get_direction (parent), + gtk_widget_get_direction(parent), GTK_STATE_NORMAL, GTK_ICON_SIZE_BUTTON, parent, NULL); removable_pixmap = gtk_icon_set_render_icon(gtk_style_lookup_icon_set(parent->style, GTK_STOCK_FLOPPY), parent->style, - gtk_widget_get_direction (parent), + gtk_widget_get_direction(parent), GTK_STATE_NORMAL, GTK_ICON_SIZE_BUTTON, parent, NULL); cdrom_pixmap = gtk_icon_set_render_icon(gtk_style_lookup_icon_set(parent->style, GTK_STOCK_CDROM), parent->style, - gtk_widget_get_direction (parent), + gtk_widget_get_direction(parent), GTK_STATE_NORMAL, GTK_ICON_SIZE_BUTTON, parent, NULL); network_pixmap = gtk_icon_set_render_icon(gtk_style_lookup_icon_set(parent->style, GTK_STOCK_NETWORK), parent->style, - gtk_widget_get_direction (parent), + gtk_widget_get_direction(parent), GTK_STATE_NORMAL, GTK_ICON_SIZE_BUTTON, parent, NULL); @@ -2916,19 +3071,27 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) /* The tree view */ BrowserTree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(directoryTreeModel)); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserTree), FALSE); - renderer = gtk_cell_renderer_pixbuf_new(); + gtk_container_add(GTK_CONTAINER(ScrollWindowDirectoryTree),BrowserTree); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserTree), TRUE); + + // Column for the pixbuf + text column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(BrowserTree_Titles[0])); + + // Cell of the column for the pixbuf + renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, - "pixbuf", TREE_COLUMN_PIXBUF, NULL); + "pixbuf", TREE_COLUMN_PIXBUF, + NULL); + // Cell of the column for the text renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, - "text", TREE_COLUMN_DIR_NAME, NULL); + "text", TREE_COLUMN_DIR_NAME, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserTree), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_container_add(GTK_CONTAINER(ScrollWindowDirectoryTree),BrowserTree); Browser_Tree_Initialize(); @@ -2962,47 +3125,71 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); artistListModel = gtk_list_store_new(ARTIST_COLUMN_COUNT, - G_TYPE_STRING, - G_TYPE_UINT, - G_TYPE_UINT, - G_TYPE_POINTER, - PANGO_TYPE_STYLE, - G_TYPE_INT, - GDK_TYPE_COLOR); + G_TYPE_STRING, // Stock-id + G_TYPE_STRING, + G_TYPE_UINT, + G_TYPE_UINT, + G_TYPE_POINTER, + PANGO_TYPE_STYLE, + G_TYPE_INT, + GDK_TYPE_COLOR); BrowserArtistList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(artistListModel)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserArtistList), TRUE); - renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(BrowserArtistList), FALSE); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserArtistList)),GTK_SELECTION_SINGLE); + - column = gtk_tree_view_column_new_with_attributes(_(ArtistList_Titles[0]), renderer, - "text", ARTIST_NAME, - "weight", ARTIST_FONT_WEIGHT, - "style", ARTIST_FONT_STYLE, - "foreground-gdk", ARTIST_ROW_FOREGROUND, - NULL); + // Artist column + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(ArtistList_Titles[0])); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "stock-id", ARTIST_PIXBUF, + NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", ARTIST_NAME, + "weight", ARTIST_FONT_WEIGHT, + "style", ARTIST_FONT_STYLE, + "foreground-gdk", ARTIST_ROW_FOREGROUND, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserArtistList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - column = gtk_tree_view_column_new_with_attributes(_(ArtistList_Titles[1]), renderer, - "text", ARTIST_NUM_ALBUMS, - "weight", ARTIST_FONT_WEIGHT, - "style", ARTIST_FONT_STYLE, - "foreground-gdk", ARTIST_ROW_FOREGROUND, - NULL); + // # Albums of Artist column + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(ArtistList_Titles[1])); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", ARTIST_NUM_ALBUMS, + "weight", ARTIST_FONT_WEIGHT, + "style", ARTIST_FONT_STYLE, + "foreground-gdk", ARTIST_ROW_FOREGROUND, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserArtistList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - column = gtk_tree_view_column_new_with_attributes(_(ArtistList_Titles[2]), renderer, - "text", ARTIST_NUM_FILES, - "weight", ARTIST_FONT_WEIGHT, - "style", ARTIST_FONT_STYLE, - "foreground-gdk", ARTIST_ROW_FOREGROUND, - NULL); + // # Files of Artist column + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(ArtistList_Titles[2])); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", ARTIST_NUM_FILES, + "weight", ARTIST_FONT_WEIGHT, + "style", ARTIST_FONT_STYLE, + "foreground-gdk", ARTIST_ROW_FOREGROUND, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserArtistList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(BrowserArtistList), FALSE); - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserArtistList)),GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserArtistList))),"changed",G_CALLBACK(Browser_Artist_List_Row_Selected),NULL); gtk_container_add(GTK_CONTAINER(ScrollWindowArtistList),BrowserArtistList); @@ -3019,6 +3206,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); albumListModel = gtk_list_store_new(ALBUM_COLUMN_COUNT, + G_TYPE_STRING, // Stock-id G_TYPE_STRING, G_TYPE_UINT, G_TYPE_POINTER, @@ -3028,28 +3216,43 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) BrowserAlbumList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(albumListModel)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserAlbumList), TRUE); - renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(BrowserAlbumList), FALSE); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserAlbumList)), GTK_SELECTION_SINGLE); - column = gtk_tree_view_column_new_with_attributes(_(AlbumList_Titles[0]), renderer, - "text", ALBUM_NAME, - "weight", ALBUM_FONT_WEIGHT, - "style", ALBUM_FONT_STYLE, - "foreground-gdk", ALBUM_ROW_FOREGROUND, - NULL); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserAlbumList), column); + // Album column + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(AlbumList_Titles[0])); - column = gtk_tree_view_column_new_with_attributes(_(AlbumList_Titles[1]), renderer, - "text", ALBUM_NUM_FILES, - "weight", ALBUM_FONT_WEIGHT, - "style", ALBUM_FONT_STYLE, - "foreground-gdk", ALBUM_ROW_FOREGROUND, - NULL); + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "stock-id", ALBUM_PIXBUF, + NULL); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", ALBUM_NAME, + "weight", ALBUM_FONT_WEIGHT, + "style", ALBUM_FONT_STYLE, + "foreground-gdk", ALBUM_ROW_FOREGROUND, + NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserAlbumList), column); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); - gtk_tree_view_set_reorderable(GTK_TREE_VIEW(BrowserAlbumList), FALSE); - gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserAlbumList)), GTK_SELECTION_SINGLE); + // # files column + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(column, _(AlbumList_Titles[1])); + + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "text", ALBUM_NUM_FILES, + "weight", ALBUM_FONT_WEIGHT, + "style", ALBUM_FONT_STYLE, + "foreground-gdk", ALBUM_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserAlbumList), column); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserAlbumList))),"changed",G_CALLBACK(Browser_Album_List_Row_Selected),NULL); gtk_container_add(GTK_CONTAINER(ScrollWindowAlbumList),BrowserAlbumList); @@ -3082,17 +3285,32 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) G_TYPE_BOOLEAN, G_TYPE_INT, GDK_TYPE_COLOR, - GDK_TYPE_COLOR); + GDK_TYPE_COLOR, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_STRING); BrowserList = gtk_tree_view_new_with_model(GTK_TREE_MODEL(fileListModel)); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserList), FALSE); gtk_container_add(GTK_CONTAINER(ScrollWindowFileList), BrowserList); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(BrowserList), TRUE); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(BrowserList), FALSE); + // Column for File Name - renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[0])); gtk_tree_view_column_set_attributes(column, renderer, "text", LIST_FILE_NAME, "weight", LIST_FONT_WEIGHT, @@ -3100,8 +3318,176 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent) "foreground-gdk", LIST_ROW_FOREGROUND, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Title + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[1])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_TITLE, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Artist + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[2])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_ARTIST, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Album + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[3])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_ALBUM, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Year + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[4])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_YEAR, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Track + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[5])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_TRACK, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Genre + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[6])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_GENRE, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Comment + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[7])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_COMMENT, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Composer + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[8])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_COMPOSER, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Original Artist + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[9])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_ORIG_ARTIST, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Copyright + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[10])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_COPYRIGHT, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + // Column for Url + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[11])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_URL, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + // Column for Encoded By + column = gtk_tree_view_column_new(); + renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + gtk_tree_view_column_set_title(column, _(BrowserList_Titles[12])); + gtk_tree_view_column_set_attributes(column, renderer, + "text", LIST_FILE_ENCODED_BY, + "weight", LIST_FONT_WEIGHT, + "background-gdk", LIST_ROW_BACKGROUND, + "foreground-gdk", LIST_ROW_FOREGROUND, + NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(BrowserList), column); + + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(BrowserList), FALSE); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserList)),GTK_SELECTION_MULTIPLE); // When selecting a line @@ -3402,10 +3788,15 @@ void Rename_Directory (void) { GtkWidget *msgbox; - msgbox = msg_box_new(_("Error..."),_("You must type a directory name!"), - GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("You must type a directory name!"), + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(directory_new_name); return; @@ -3417,9 +3808,15 @@ void Rename_Directory (void) { GtkWidget *msgbox; - msgbox = msg_box_new(_("Error..."),_("Could not convert '%s' into filename encoding. Please use another name."),GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Could not convert '%s' into filename encoding. Please use another name."), + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(directory_new_name); g_free(directory_new_name_file); @@ -3447,7 +3844,7 @@ void Rename_Directory (void) { gchar *msg; GtkWidget *msgbox; - //gint button; + //gint response; closedir(dir); if (strcasecmp(last_path,new_path) != 0) @@ -3456,16 +3853,22 @@ void Rename_Directory (void) // // The same directory already exists. So we ask if we want to move the files // msg = g_strdup_printf(_("The directory already exists!\n(%s)\nDo you want " // "to move the files?"),new_path_utf8); - // msgbox = msg_box_new(_("Confirm..."),msg,GTK_STOCK_DIALOG_QUESTION, - // BUTTON_NO,BUTTON_YES,0); + // msgbox = msg_box_new(_("Confirm..."), + // GTK_WINDOW(MainWindow), + // NULL, + // GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + // msg, + // GTK_STOCK_DIALOG_QUESTION, + // GTK_STOCK_NO, GTK_RESPONSE_NO, + // GTK_STOCK_YES, GTK_RESPONSE_YES, + // NULL); // g_free(msg); - // msg_box_hide_check_button(MSG_BOX(msgbox)); - // button = msg_box_run(MSG_BOX(msgbox)); + // response = gtk_dialog_run(GTK_DIALOG(msgbox)); // gtk_widget_destroy(msgbox); // - // switch (button) + // switch (response) // { - // case BUTTON_YES: + // case GTK_STOCK_YES: // // Here we must rename all files with the new location, and remove the directory // // Rename_File () @@ -3477,11 +3880,17 @@ void Rename_Directory (void) msg = g_strdup_printf(_("Can't rename because this directory name " "already exists!\n(%s)"),new_path_utf8); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); g_free(directory_new_name); g_free(directory_new_name_file); @@ -3512,11 +3921,17 @@ void Rename_Directory (void) msg = g_strdup_printf(_("Can't rename directory \n'%s'\n to \n'%s'!\n(%s)"), last_path_utf8,tmp_path_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); g_free(directory_new_name); g_free(directory_new_name_file); @@ -3538,11 +3953,17 @@ void Rename_Directory (void) msg = g_strdup_printf(_("Can't rename directory \n'%s'\n to \n'%s'!\n(%s)"), tmp_path_utf8,new_path_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); g_free(directory_new_name); g_free(directory_new_name_file); @@ -3679,7 +4100,7 @@ void Browser_Open_Run_Program_Tree_Window (void) G_CALLBACK(Run_Program_With_Directory),G_OBJECT(RunProgramComboBox)); /* The button to Browse */ - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(HBox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File),G_OBJECT(GTK_BIN(RunProgramComboBox)->child)); @@ -3839,7 +4260,7 @@ void Browser_Open_Run_Program_List_Window (void) G_CALLBACK(Run_Program_With_Selected_Files),G_OBJECT(RunProgramComboBox)); /* The button to Browse */ - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(HBox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File),G_OBJECT(GTK_BIN(RunProgramComboBox)->child)); @@ -3982,10 +4403,15 @@ gboolean Run_Program (gchar *program_name, GList *args_list) { GtkWidget *msgbox; - msgbox = msg_box_new(_("Error..."),_("You must type a program name!"), - GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("You must type a program name!"), + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); return FALSE; } @@ -3996,9 +4422,15 @@ gboolean Run_Program (gchar *program_name, GList *args_list) gchar *msg; msg = g_strdup_printf(_("The program '%s' can't be found!"),program_name); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); return FALSE; @@ -4044,7 +4476,7 @@ gboolean Run_Program (gchar *program_name, GList *args_list) &siStartupInfo, &piProcessInfo) == FALSE) { - Log_Print(_("Can't execute %s (error %d)!\n"), program_name, GetLastError()); + Log_Print(LOG_ERROR,_("Can't execute %s (error %d)!\n"), program_name, GetLastError()); } // Free allocated parameters (for each filename) @@ -4063,7 +4495,7 @@ gboolean Run_Program (gchar *program_name, GList *args_list) switch (pid) { case -1: - Log_Print(_("Can't fork another process!\n")); + Log_Print(LOG_ERROR,_("Can't fork another process!\n")); //exit(-1); break; case 0: diff --git a/src/browser.h b/src/browser.h old mode 100644 new mode 100755 index fb02029..098b1b3 --- a/src/browser.h +++ b/src/browser.h @@ -76,27 +76,29 @@ enum LIST_FILE_NAME, LIST_FILE_POINTER, LIST_FILE_KEY, - LIST_FILE_OTHERDIR, + LIST_FILE_OTHERDIR, // To change color for other directories LIST_FONT_WEIGHT, LIST_ROW_BACKGROUND, LIST_ROW_FOREGROUND, // Tag fields - /*LIST_FILE_TITLE, + LIST_FILE_TITLE, LIST_FILE_ARTIST, LIST_FILE_ALBUM, LIST_FILE_YEAR, + LIST_FILE_TRACK, LIST_FILE_GENRE, LIST_FILE_COMMENT, LIST_FILE_COMPOSER, LIST_FILE_ORIG_ARTIST, LIST_FILE_COPYRIGHT, LIST_FILE_URL, - LIST_FILE_ENCODED_BY,*/ + LIST_FILE_ENCODED_BY, LIST_COLUMN_COUNT }; enum { + ARTIST_PIXBUF, ARTIST_NAME, ARTIST_NUM_ALBUMS, ARTIST_NUM_FILES, @@ -109,6 +111,7 @@ enum enum { + ALBUM_PIXBUF, ALBUM_NAME, ALBUM_NUM_FILES, ALBUM_ETFILE_LIST_POINTER, diff --git a/src/cddb.c b/src/cddb.c index e8cf147..8d4cf7f 100644 --- a/src/cddb.c +++ b/src/cddb.c @@ -44,6 +44,7 @@ #include "easytag.h" #include "et_core.h" #include "browser.h" +#include "base64.h" #include "scan.h" #include "log.h" #include "misc.h" @@ -55,7 +56,7 @@ enum { - CDDB_ALBUM_LIST_BITMAP, + CDDB_ALBUM_LIST_PIXBUF, CDDB_ALBUM_LIST_ALBUM, CDDB_ALBUM_LIST_CATEGORY, CDDB_ALBUM_LIST_DATA, @@ -196,7 +197,7 @@ gint Cddb_Track_List_Sort_Func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter void Cddb_Track_List_Sort_By_Ascending_Track_Number (void); void Cddb_Track_List_Sort_By_Ascending_Track_Name (void); -char *base64_encode (char *str); +//char *base64_encode (char *str); gchar *Cddb_Format_Proxy_Authentification (void); @@ -614,7 +615,7 @@ void Open_Cddb_Window (void) renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes(_(CddbAlbumList_Titles[0]), renderer, - "pixbuf", CDDB_ALBUM_LIST_BITMAP, + "pixbuf", CDDB_ALBUM_LIST_PIXBUF, NULL); gtk_tree_view_column_set_resizable(column, FALSE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); @@ -622,9 +623,9 @@ void Open_Cddb_Window (void) renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_(CddbAlbumList_Titles[1]), renderer, - "text", CDDB_ALBUM_LIST_ALBUM, - "weight", CDDB_ALBUM_LIST_FONT_WEIGHT, - "style", CDDB_ALBUM_LIST_FONT_STYLE, + "text", CDDB_ALBUM_LIST_ALBUM, + "weight", CDDB_ALBUM_LIST_FONT_WEIGHT, + "style", CDDB_ALBUM_LIST_FONT_STYLE, "foreground-gdk", CDDB_ALBUM_LIST_FOREGROUND_COLOR, NULL); gtk_tree_view_column_set_resizable(column, TRUE); @@ -633,9 +634,9 @@ void Open_Cddb_Window (void) renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_(CddbAlbumList_Titles[2]), renderer, - "text", CDDB_ALBUM_LIST_CATEGORY, - "weight", CDDB_ALBUM_LIST_FONT_WEIGHT, - "style", CDDB_ALBUM_LIST_FONT_STYLE, + "text", CDDB_ALBUM_LIST_CATEGORY, + "weight", CDDB_ALBUM_LIST_FONT_WEIGHT, + "style", CDDB_ALBUM_LIST_FONT_STYLE, "foreground-gdk", CDDB_ALBUM_LIST_FOREGROUND_COLOR, NULL); gtk_tree_view_column_set_resizable(column, TRUE); @@ -1626,7 +1627,7 @@ gint Cddb_Open_Connection (gchar *host, gint port) { msg = g_strdup_printf(_("Can't resolve host '%s' (%s)!"),host,g_strerror(errno)); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); return 0; } @@ -1641,7 +1642,7 @@ gint Cddb_Open_Connection (gchar *host, gint port) { msg = g_strdup_printf(_("Can't create a new socket (%s)!"),g_strerror(errno)); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); return 0; } @@ -1649,7 +1650,7 @@ gint Cddb_Open_Connection (gchar *host, gint port) // FIX ME : must catch SIGPIPE? if ( setsockopt(socket_id,SOL_SOCKET,SO_KEEPALIVE,(gchar *)&optval,sizeof(optval)) < 0 ) { - Log_Print("Can't set option of the new created socket!"); + Log_Print(LOG_ERROR,"Can't set option of the new created socket!"); } // Open connection to the server @@ -1662,7 +1663,7 @@ gint Cddb_Open_Connection (gchar *host, gint port) { msg = g_strdup_printf(_("Can't connect to host '%s' (%s)!"),host,g_strerror(errno)); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); return 0; } @@ -1761,13 +1762,13 @@ gint Cddb_Write_Result_To_File (gint socket_id, gulong *bytes_read_total) if (bytes_read < 0) { - Log_Print(_("Error when reading cddb response (%s)!"),g_strerror(errno)); + Log_Print(LOG_ERROR,_("Error when reading cddb response (%s)!"),g_strerror(errno)); return -1; // Error! } } else { - Log_Print(_("Can't create file '%s' (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create file '%s' (%s)"),file_path,g_strerror(errno)); } g_free(file_path); g_free(home_path); @@ -1810,7 +1811,7 @@ gint Cddb_Read_Line (FILE **file, gchar **cddb_out) if ( (*file=fopen(file_path,"r"))==0 ) { - Log_Print(_("Can't open file '%s' (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't open file '%s' (%s)"),file_path,g_strerror(errno)); g_free(file_path); return -1; // Error! } @@ -1996,7 +1997,8 @@ void Cddb_Load_Album_List (gboolean only_red_lines) if (selectedRows) { if (gtk_tree_model_get_iter(GTK_TREE_MODEL(CddbAlbumListModel), ¤tIter, (GtkTreePath*)selectedRows->data)) - gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), ¤tIter, CDDB_ALBUM_LIST_DATA, &cddbalbumSelected, -1); + gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), ¤tIter, + CDDB_ALBUM_LIST_DATA, &cddbalbumSelected, -1); } // Remove lines @@ -2013,7 +2015,7 @@ void Cddb_Load_Album_List (gboolean only_red_lines) // Load the row in the list gtk_list_store_append(CddbAlbumListModel, &iter); gtk_list_store_set(CddbAlbumListModel, &iter, - CDDB_ALBUM_LIST_BITMAP, cddbalbum->bitmap, + CDDB_ALBUM_LIST_PIXBUF, cddbalbum->bitmap, CDDB_ALBUM_LIST_ALBUM, cddbalbum->artist_album, CDDB_ALBUM_LIST_CATEGORY, cddbalbum->category, CDDB_ALBUM_LIST_DATA, cddbalbum, -1); @@ -2220,7 +2222,7 @@ gboolean Cddb_Search_Album_List_From_String_Freedb (void) /* Build request */ //cddb_in = g_strdup_printf("GET http://www.freedb.org/freedb_search.php?" // In this case, problem with squid cache... - cddb_in = g_strdup_printf("GET /freedb_search.php?" + cddb_in = g_strdup_printf("GET %s%s/freedb_search.php?" "words=%s" "%s" "&grouping=none" @@ -2230,6 +2232,7 @@ gboolean Cddb_Search_Album_List_From_String_Freedb (void) "%s" "Connection: close\r\n" "\r\n", + CDDB_USE_PROXY?"http://":"", CDDB_USE_PROXY?cddb_server_name:"", // Needed when using proxy string, (tmp=Cddb_Generate_Request_String_With_Fields_And_Categories_Options()), cddb_server_name,cddb_server_port, @@ -2247,7 +2250,7 @@ gboolean Cddb_Search_Album_List_From_String_Freedb (void) while (gtk_events_pending()) gtk_main_iteration(); if ( (bytes_written=send(socket_id,cddb_in,strlen(cddb_in)+1,0)) < 0) { - Log_Print(_("Can't send the request (%s)!"),g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't send the request (%s)!"),g_strerror(errno)); Cddb_Close_Connection(socket_id); g_free(cddb_in); g_free(string); @@ -2278,7 +2281,7 @@ gboolean Cddb_Search_Album_List_From_String_Freedb (void) { msg = g_strdup(_("The server returned a wrong answer!")); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_server_name); g_free(cddb_server_cgi_path); @@ -2292,7 +2295,7 @@ gboolean Cddb_Search_Album_List_From_String_Freedb (void) { msg = g_strdup_printf(_("The server returned a wrong answer! (%s)"),cddb_out); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_out); g_free(cddb_server_name); @@ -2541,7 +2544,7 @@ gboolean Cddb_Search_Album_List_From_String_Gnudb (void) /* Build request */ - cddb_in = g_strdup_printf("GET /search/" + cddb_in = g_strdup_printf("GET %s%s/search/" "%s" "?page=%d" " HTTP/1.1\r\n" @@ -2550,6 +2553,7 @@ gboolean Cddb_Search_Album_List_From_String_Gnudb (void) "%s" "Connection: close\r\n" "\r\n", + CDDB_USE_PROXY?"http://":"", CDDB_USE_PROXY?cddb_server_name:"", // Needed when using proxy string, next_page_cpt, cddb_server_name,cddb_server_port, @@ -2565,7 +2569,7 @@ gboolean Cddb_Search_Album_List_From_String_Gnudb (void) while (gtk_events_pending()) gtk_main_iteration(); if ( (bytes_written=send(socket_id,cddb_in,strlen(cddb_in)+1,0)) < 0) { - Log_Print(_("Can't send the request (%s)!"),g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't send the request (%s)!"),g_strerror(errno)); Cddb_Close_Connection(socket_id); g_free(cddb_in); g_free(string); @@ -2596,7 +2600,7 @@ gboolean Cddb_Search_Album_List_From_String_Gnudb (void) { msg = g_strdup(_("The server returned a wrong answer!")); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(string); g_free(cddb_server_name); @@ -2612,7 +2616,7 @@ gboolean Cddb_Search_Album_List_From_String_Gnudb (void) { msg = g_strdup_printf(_("The server returned a wrong answer! (%s)"),cddb_out); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_out); g_free(string); @@ -2968,11 +2972,15 @@ gboolean Cddb_Search_Album_From_Selected_Files (void) GtkWidget *msgbox; msgbox = msg_box_new(_("Local CD search..."), - _("The path for 'Local CD Data Base' wasn't " - "defined!\nFill it in the preferences window."), - GTK_STOCK_DIALOG_ERROR,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + GTK_WINDOW(CddbWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("The path for 'Local CD Data Base' wasn't defined!\nFill it in the preferences " + "window before to use this search."), + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); break; } @@ -3122,7 +3130,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void) if ( (bytes_written=send(socket_id,cddb_in,strlen(cddb_in)+1,0)) < 0) { - Log_Print(_("Can't send the request (%s)!"),g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't send the request (%s)!"),g_strerror(errno)); Cddb_Close_Connection(socket_id); g_free(cddb_in); g_free(cddb_server_name); @@ -3144,7 +3152,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void) { msg = g_strdup(_("The server returned a wrong answer!")); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_server_name); g_free(cddb_server_cgi_path); @@ -3159,7 +3167,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void) { msg = g_strdup_printf(_("The server returned a wrong answer! (%s)"),cddb_out); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_out); g_free(cddb_server_name); @@ -3361,7 +3369,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection) // Local access if ( (file=fopen(cddb_server_cgi_path,"r"))==0 ) { - Log_Print(_("Can't load file: '%s' (%s)!"),cddb_server_cgi_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't load file: '%s' (%s)!"),cddb_server_cgi_path,g_strerror(errno)); return FALSE; } @@ -3398,7 +3406,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection) while (gtk_events_pending()) gtk_main_iteration(); if ( (bytes_written=send(socket_id,cddb_in,strlen(cddb_in)+1,0)) < 0) { - Log_Print(_("Can't send the request (%s)!"),g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't send the request (%s)!"),g_strerror(errno)); Cddb_Close_Connection(socket_id); g_free(cddb_in); return FALSE; @@ -3416,7 +3424,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection) { msg = g_strdup(_("The server returned a wrong answer!")); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); gtk_widget_set_sensitive(GTK_WIDGET(CddbStopSearchButton),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(CddbStopSearchAutoButton),FALSE); @@ -3431,7 +3439,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection) { gchar *msg = g_strdup_printf(_("The server returned a wrong answer! (%s)"),cddb_out); gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg); - Log_Print("%s",msg); + Log_Print(LOG_ERROR,"%s",msg); g_free(msg); g_free(cddb_out); if (file) @@ -3640,41 +3648,63 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection) /* * Set the row apperance depending if we have cached info or not - * Bold/Red = Info is cached + * Bold/Red = Info are already loaded, but not displayed * Italic/Light Red = Duplicate CDDB entry */ void Cddb_Album_List_Set_Row_Appearance (GtkTreeIter *row) { CddbAlbum *cddbalbum = NULL; - gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), row, CDDB_ALBUM_LIST_DATA, &cddbalbum, -1); + gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), row, + CDDB_ALBUM_LIST_DATA, &cddbalbum, -1); if (cddbalbum->track_list != NULL) { if (CHANGED_FILES_DISPLAYED_TO_BOLD) { - gtk_list_store_set(CddbAlbumListModel, row, CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, -1); + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_NORMAL, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, NULL,-1); } else { - if(cddbalbum->other_version == TRUE) + if (cddbalbum->other_version == TRUE) { - gtk_list_store_set(CddbAlbumListModel, row, CDDB_ALBUM_LIST_FOREGROUND_COLOR, &LIGHT_RED, -1); + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_NORMAL, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, &LIGHT_RED, -1); } else { - gtk_list_store_set(CddbAlbumListModel, row, CDDB_ALBUM_LIST_FOREGROUND_COLOR, &RED, -1); + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_NORMAL, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, &RED, -1); } } } else { - if(cddbalbum->other_version == TRUE) + if (cddbalbum->other_version == TRUE) { if (CHANGED_FILES_DISPLAYED_TO_BOLD) { - gtk_list_store_set(CddbAlbumListModel, row, CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_ITALIC, -1); + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_ITALIC, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, NULL,-1); } else { - gtk_list_store_set(CddbAlbumListModel, row, CDDB_ALBUM_LIST_FOREGROUND_COLOR, &GREY, -1); + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_NORMAL, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, &GREY, -1); } + } else + { + gtk_list_store_set(CddbAlbumListModel, row, + CDDB_ALBUM_LIST_FONT_STYLE, PANGO_STYLE_NORMAL, + CDDB_ALBUM_LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, + CDDB_ALBUM_LIST_FOREGROUND_COLOR, NULL, -1); } } } @@ -3792,18 +3822,24 @@ gboolean Cddb_Set_Track_Infos_To_File_List (void) { GtkWidget *msgbox; gchar *msg; - gint button; + gint response; msg = g_strdup_printf(_("Be careful, you are applying %d lines of the CDDB " "results to %d lines in the list of files!\n\nDo you want to continue ?"), rows_to_loop,file_selectedcount); - msgbox = msg_box_new(_("Write Tag from CDDB..."),msg, - GTK_STOCK_DIALOG_QUESTION,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Write Tag from CDDB..."), + GTK_WINDOW(CddbWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - if (button != BUTTON_YES) + if (response != GTK_RESPONSE_YES) { g_list_foreach(file_iterlist, (GFunc)g_free, NULL); g_list_free(file_iterlist); @@ -4089,12 +4125,14 @@ GdkPixbuf *Cddb_Get_Pixbuf_From_Server_Name (gchar *server_name) * Function taken from gFTP. * The standard to Base64 encoding can be found in RFC2045 */ +/* char *base64_encode (char *str) { char *newstr, *newpos, *fillpos, *pos; unsigned char table[64], encode[3]; int i, num; + // Build table for (i = 0; i < 26; i++) { table[i] = 'A' + i; @@ -4107,6 +4145,7 @@ char *base64_encode (char *str) table[62] = '+'; table[63] = '/'; + num = strlen (str) / 3; if (strlen (str) % 3 > 0) num++; @@ -4131,20 +4170,25 @@ char *base64_encode (char *str) } return (newstr); } +*/ gchar *Cddb_Format_Proxy_Authentification (void) { - gchar *tempstr; - gchar *str; gchar *ret; if (CDDB_USE_PROXY && CDDB_PROXY_USER_NAME != NULL && *CDDB_PROXY_USER_NAME != '\0') { + + gchar *tempstr; + gchar *str_encoded; + gint size; + tempstr = g_strconcat(CDDB_PROXY_USER_NAME, ":", CDDB_PROXY_USER_PASSWORD, NULL); - str = base64_encode(tempstr); + //str_encoded = base64_encode(tempstr); + size = base64_encode(tempstr, strlen(tempstr), &str_encoded); - ret = g_strdup_printf("Proxy-authorization: Basic %s\r\n", str); - g_free (str); + ret = g_strdup_printf("Proxy-authorization: Basic %s\r\n", str_encoded); + g_free (str_encoded); }else { ret = g_strdup(""); diff --git a/src/cddb.h b/src/cddb.h old mode 100644 new mode 100755 diff --git a/src/charset.c b/src/charset.c index 74ecd9d..6684540 100755 --- a/src/charset.c +++ b/src/charset.c @@ -166,7 +166,8 @@ insert_locales (GHashTable *encodings, char *enc, ...) char *s; va_start (args, enc); - for (;;) { + for (;;) + { s = va_arg (args, char *); if (s == NULL) break; @@ -201,7 +202,7 @@ Charset_Insert_Locales_Init (void) insert_locales (encodings, "EUC-KR", "ko", NULL); /*insert_locales (encodings, "GEORGIAN-ACADEMY", NULL);*/ insert_locales (encodings, "GEORGIAN-PS", "ka", NULL); - insert_locales (encodings, "ISO-8859-1", "br", "ca", "da", "de", "en", "es", "eu", "fi", "fr", "gl", "it", "nl", "wa", "no", "pt", "pt", "sv", NULL); + insert_locales (encodings, "ISO-8859-1", "br", "ca", "da", "de", "en", "es", "eu", "fi", "fr", "gl", "it", "nl", "wa", "nb", "nn", "pt", "pt", "sv", NULL); #if WIN32 insert_locales (encodings, "windows-1250", "cs", "hr", "hu", "pl", "ro", "sk", "sl", "sq", "sr", NULL); #else @@ -399,8 +400,8 @@ gchar *convert_string_1 (const gchar *string, gssize length, const gchar *from_c gchar *escaped_str = g_strescape(string, NULL); if (display_error) { - Log_Print("convert_string(): Failed conversion from charset '%s' to '%s'. " - "String '%s'. Errcode %d (%s).\n", + Log_Print(LOG_ERROR,"convert_string(): Failed conversion from charset '%s' to '%s'. " + "String '%s'. Errcode %d (%s).", from_codeset, to_codeset, escaped_str, error->code, error->message); } g_free(escaped_str); @@ -448,15 +449,15 @@ gchar *convert_to_utf8 (const gchar *string) const gchar *usercharset; gchar *escaped_str = g_strescape(string, NULL); g_get_charset(&usercharset); - Log_Print("convert_to_utf8(): Failed conversion from charset '%s'. " - "String '%s'. Errcode %d (%s).\n", + Log_Print(LOG_ERROR,"convert_to_utf8(): Failed conversion from charset '%s'. " + "String '%s'. Errcode %d (%s).", usercharset, escaped_str, error->code, error->message); g_free(escaped_str); if (g_utf8_validate(string, -1, NULL)) - Log_Print("convert_to_utf8(): String was valid UTF-8.\n"); + Log_Print(LOG_ERROR,"convert_to_utf8(): String was valid UTF-8."); else - Log_Print("convert_to_utf8(): String was INVALID UTF-8.\n"); + Log_Print(LOG_ERROR,"convert_to_utf8(): String was INVALID UTF-8."); g_error_free(error); return g_strdup(string); @@ -480,15 +481,15 @@ gchar *convert_from_utf8 (const char *string) const gchar *usercharset; gchar *escaped_str = g_strescape(string, NULL); g_get_charset(&usercharset); - Log_Print("convert_from_utf8(): Failed conversion to charset '%s'. " - "String '%s'. Errcode %d (%s).\n", + Log_Print(LOG_ERROR,"convert_from_utf8(): Failed conversion to charset '%s'. " + "String '%s'. Errcode %d (%s).", usercharset, escaped_str, error->code, error->message); g_free(escaped_str); if (g_utf8_validate(string, -1, NULL)) - Log_Print("convert_from_utf8(): String was valid UTF-8.\n"); + Log_Print(LOG_ERROR,"convert_from_utf8(): String was valid UTF-8."); else - Log_Print("convert_from_utf8(): String was INVALID UTF-8.\n"); + Log_Print(LOG_ERROR,"convert_from_utf8(): String was INVALID UTF-8."); g_error_free(error); return g_strdup(string); @@ -539,7 +540,7 @@ gchar *filename_to_display (const gchar *string) if (!ret) { gchar *escaped_str = g_strescape(string, NULL); - Log_Print(_("The filename '%s' couldn't be converted into UTF-8 (%s).\n"), + Log_Print(LOG_ERROR,_("The filename '%s' couldn't be converted into UTF-8 (%s)."), escaped_str, error && error->message ? error->message : _("Invalid UTF-8")); g_clear_error(&error); @@ -638,7 +639,7 @@ gchar *filename_from_display (const gchar *string) { // Conversion KO! gchar *escaped_str = g_strescape(string, NULL); - Log_Print(_("The UTF-8 string '%s' couldn't be converted into filename encoding (%s)\n"), + Log_Print(LOG_ERROR,_("The UTF-8 string '%s' couldn't be converted into filename encoding (%s)."), escaped_str, error && error->message ? error->message : _("Invalid UTF-8")); g_clear_error(&error); @@ -702,7 +703,7 @@ gchar *Try_To_Validate_Utf8_String (const gchar *string) if (!ret) { gchar *escaped_str = g_strescape(string, NULL); - Log_Print(_("The string '%s' couldn't be converted into UTF-8 (%s).\n"), + Log_Print(LOG_ERROR,_("The string '%s' couldn't be converted into UTF-8 (%s)."), escaped_str, error && error->message ? error->message : _("Invalid UTF-8")); g_clear_error(&error); @@ -789,25 +790,25 @@ gboolean test_conversion_charset (const gchar *from, const gchar *to) /*// Error in conversion if (error && error->code == G_CONVERT_ERROR_NO_CONVERSION) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_NO_CONVERSION)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_NO_CONVERSION)",from,to); } else if (error && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_ILLEGAL_SEQUENCE)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_ILLEGAL_SEQUENCE)",from,to); } else if (error && error->code == G_CONVERT_ERROR_FAILED) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_FAILED)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_FAILED)",from,to); } else if (error && error->code == G_CONVERT_ERROR_PARTIAL_INPUT) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_PARTIAL_INPUT)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_PARTIAL_INPUT)",from,to); } else if (error && error->code == G_CONVERT_ERROR_BAD_URI) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_BAD_URI)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_BAD_URI)",from,to); } else if (error && error->code == G_CONVERT_ERROR_NOT_ABSOLUTE_PATH) { - Log_Print("Conversion error from '%s' to '%s' (G_CONVERT_ERROR_NOT_ABSOLUTE_PATH)",from,to); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (G_CONVERT_ERROR_NOT_ABSOLUTE_PATH)",from,to); } else { - Log_Print("Conversion error from '%s' to '%s' (unknown : %d)",from,to,error->code); + Log_Print(LOG_ERROR,"Conversion error from '%s' to '%s' (unknown : %d)",from,to,error->code); } if (error) diff --git a/src/easytag.c b/src/easytag.c old mode 100644 new mode 100755 index 6a3bd4e..6d8bd62 --- a/src/easytag.c +++ b/src/easytag.c @@ -142,6 +142,8 @@ int main (int argc, char *argv[]) GtkWidget *HBox, *VBox; gboolean created_settings; struct stat statbuf; + //GError *error = NULL; + //GdkPixbuf *pixbuf; GdkPixmap *pixmap; GdkBitmap *mask; @@ -158,7 +160,7 @@ int main (int argc, char *argv[]) #endif #ifdef ENABLE_NLS - bindtextdomain(GETTEXT_PACKAGE, LOCALE); + bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); /* Initialize i18n support */ @@ -174,25 +176,25 @@ int main (int argc, char *argv[]) INIT_DIRECTORY = NULL; /* Starting messages */ - Log_Print(_("Starting EasyTAG %s (PId: %d) ..."),VERSION,getpid()); + Log_Print(LOG_OK,_("Starting EasyTAG %s (PId: %d) ..."),VERSION,getpid()); #ifdef ENABLE_MP3 - Log_Print(_("Currently using libid3tag version %s ..."), ID3_VERSION); + Log_Print(LOG_OK,_("Currently using libid3tag version %s ..."), ID3_VERSION); #endif #if defined ENABLE_MP3 && defined ENABLE_ID3LIB - Log_Print(_("Currently using id3lib version %d.%d.%d ..."),ID3LIB_MAJOR_VERSION, + Log_Print(LOG_OK,_("Currently using id3lib version %d.%d.%d ..."),ID3LIB_MAJOR_VERSION, ID3LIB_MINOR_VERSION, ID3LIB_PATCH_VERSION); #endif #ifdef WIN32 if (g_getenv("EASYTAGLANG")) - Log_Print(_("Variable EASYTAGLANG defined. Setting locale : '%s'"),g_getenv("EASYTAGLANG")); + Log_Print(LOG_OK,_("Variable EASYTAGLANG defined. Setting locale : '%s'"),g_getenv("EASYTAGLANG")); else - Log_Print(_("Setting locale : '%s'"),g_getenv("LANG")); + Log_Print(LOG_OK,_("Setting locale : '%s'"),g_getenv("LANG")); #endif if (get_locale()) - Log_Print(_("Currently using locale '%s' (and eventually '%s')..."), + Log_Print(LOG_OK,_("Currently using locale '%s' (and eventually '%s')..."), get_locale(),get_encoding_from_locale(get_locale())); @@ -316,10 +318,20 @@ int main (int argc, char *argv[]) /* Minimised window icon */ gtk_widget_realize(MainWindow); + pixmap = gdk_pixmap_create_from_xpm_d(MainWindow->window,&mask,NULL,EasyTAG_icon_xpm); gdk_window_set_icon(MainWindow->window,(GdkWindow *)NULL,pixmap,mask); - - + /*pixbuf = gdk_pixbuf_new_from_file(PACKAGE_DATA_DIR"/EasyTAG_icon.png",&error); + if (pixbuf) + { + gtk_window_set_icon(GTK_WINDOW(MainWindow),pixbuf); + g_object_unref(G_OBJECT(pixbuf)); + }else + { + Log_Print(LOG_ERROR,error->message); + g_error_free(error); + }*/ + /* MainVBox for Menu bar + Tool bar + "Browser Area & FileArea & TagArea" + Log Area + "Status bar & Progress bar" */ MainVBox = gtk_vbox_new(FALSE,0); gtk_container_add (GTK_CONTAINER(MainWindow),MainVBox); @@ -1542,7 +1554,7 @@ void Mini_Button_Clicked (GObject *object) if (msg) { - Log_Print("%s",msg); + Log_Print(LOG_OK,"%s",msg); Statusbar_Message(msg,TRUE); g_free(msg); } @@ -2134,7 +2146,7 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files) Tag_Area_Set_Sensitive(FALSE); File_Area_Set_Sensitive(FALSE); - /* Show msgbox (if needed) to ask confirmation */ + /* Show msgbox (if needed) to ask confirmation ('SF' for Save File) */ SF_HideMsgbox_Write_Tag = 0; SF_HideMsgbox_Rename_File = 0; @@ -2413,7 +2425,8 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_ || FileTag->saved == FALSE ) // This tag had been already saved ? { GtkWidget *msgbox = NULL; - gint button; + GtkWidget *msgbox_check_button = NULL; + gint response; if (CONFIRM_WRITE_TAG && !SF_HideMsgbox_Write_Tag) { @@ -2423,39 +2436,53 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_ if (multiple_files) { - msgbox = msg_box_new(_("Write Tag..."),msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); - msg_box_check_button_set_active(MSG_BOX(msgbox),TRUE); // Checked by default + msgbox = msg_box_new(_("Write Tag..."), + GTK_WINDOW(MainWindow), + &msgbox_check_button, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + GTK_TOGGLE_BUTTON(msgbox_check_button)->active = TRUE; // Checked by default }else { - msgbox = msg_box_new(_("Write Tag..."),msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Write Tag..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); } g_free(msg); - SF_ButtonPressed_Write_Tag = button = msg_box_run(MSG_BOX(msgbox)); - /* When check button in msgbox was activated : do not display the message again */ - if (msg_box_check_button_get_active(MSG_BOX(msgbox))) - SF_HideMsgbox_Write_Tag = MSG_BOX(msgbox)->check_button_state; + SF_ButtonPressed_Write_Tag = response = gtk_dialog_run(GTK_DIALOG(msgbox)); + // When check button in msgbox was activated : do not display the message again + if (msgbox_check_button && GTK_TOGGLE_BUTTON(msgbox_check_button)->active) + SF_HideMsgbox_Write_Tag = GTK_TOGGLE_BUTTON(msgbox_check_button)->active; gtk_widget_destroy(msgbox); }else { if (SF_HideMsgbox_Write_Tag) - button = SF_ButtonPressed_Write_Tag; + response = SF_ButtonPressed_Write_Tag; else - button = BUTTON_YES; + response = GTK_RESPONSE_YES; } - switch (button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: Write_File_Tag(ETFile); break; - case BUTTON_NO: + case GTK_RESPONSE_NO: break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: stop_loop = -1; return stop_loop; break; @@ -2470,7 +2497,8 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_ if ( FileNameNew->saved == FALSE ) // This filename had been already saved ? { GtkWidget *msgbox = NULL; - gint button; + GtkWidget *msgbox_check_button = NULL; + gint response; if (CONFIRM_RENAME_FILE && !SF_HideMsgbox_Rename_File) { @@ -2509,38 +2537,52 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_ if (multiple_files) { // Allow to cancel for all other files - msgbox = msg_box_new(msg_title,msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); - msg_box_check_button_set_active(MSG_BOX(msgbox),TRUE); // Checked by default + msgbox = msg_box_new(msg_title, + GTK_WINDOW(MainWindow), + &msgbox_check_button, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + GTK_TOGGLE_BUTTON(msgbox_check_button)->active = TRUE; // Checked by default }else { - msgbox = msg_box_new(msg_title,msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); + msgbox = msg_box_new(msg_title, + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); } g_free(msg); g_free(msg_title); - SF_ButtonPressed_Rename_File = button = msg_box_run(MSG_BOX(msgbox)); - if (msg_box_check_button_get_active(MSG_BOX(msgbox))) - SF_HideMsgbox_Rename_File = msg_box_check_button_get_active(MSG_BOX(msgbox)); + SF_ButtonPressed_Rename_File = response = gtk_dialog_run(GTK_DIALOG(msgbox)); + if (msgbox_check_button && GTK_TOGGLE_BUTTON(msgbox_check_button)->active) + SF_HideMsgbox_Rename_File = GTK_TOGGLE_BUTTON(msgbox_check_button)->active; gtk_widget_destroy(msgbox); }else { if (SF_HideMsgbox_Rename_File) - button = SF_ButtonPressed_Rename_File; + response = SF_ButtonPressed_Rename_File; else - button = BUTTON_YES; + response = GTK_RESPONSE_YES; } - switch(button) + switch(response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: Rename_File(ETFile); break; - case BUTTON_NO: + case GTK_RESPONSE_NO: break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: stop_loop = -1; return stop_loop; break; @@ -2592,12 +2634,18 @@ void Write_File_Tag (ET_File *ETFile) basename_utf8,g_strerror(errno)); } - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); g_free(msg); g_free(basename_utf8); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); } @@ -2736,11 +2784,17 @@ void Rename_File (ET_File *ETFile) /* Renaming file to the temporary filename has failed */ msg = g_strdup_printf(_("Can't rename file '%s'\n to \n'%s'!\n(%s)"), cur_basename_utf8,new_basename_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); Statusbar_Message(_("File(s) not renamed..."),TRUE); g_free(tmp_filename); @@ -2768,11 +2822,17 @@ void Rename_File (ET_File *ETFile) /* Renaming file from the temporary filename has failed */ msg = g_strdup_printf(_("Can't rename file '%s'\n to \n'%s'!\n(%s)"), new_basename_utf8,cur_basename_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); Statusbar_Message(_("File(s) not renamed..."),TRUE); g_free(tmp_filename); @@ -2783,11 +2843,17 @@ void Rename_File (ET_File *ETFile) msg = g_strdup_printf(_("Can't rename file \n'%s'\nbecause the following " "file already exists:\n'%s'"),cur_basename_utf8,new_basename_utf8); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); + g_free(msg); Statusbar_Message(_("File(s) not renamed..."),TRUE); @@ -2815,12 +2881,18 @@ void Rename_File (ET_File *ETFile) dirname_new_utf8 = filename_to_display(dirname_new); msg = g_strdup_printf(_("Can't create target directory\n'%s'!\n(%s)"), dirname_new_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); g_free(msg); g_free(dirname_new_utf8); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); g_free(tmp_filename); g_free(cur_basename_utf8); @@ -2835,7 +2907,7 @@ void Rename_File (ET_File *ETFile) if ( rename(tmp_filename,new_filename)==0 ) { /* Renaming file has succeeded */ - Log_Print(_("Renamed file '%s' to '%s'"),cur_basename_utf8,new_basename_utf8); + Log_Print(LOG_OK,_("Renamed file '%s' to '%s'"),cur_basename_utf8,new_basename_utf8); ETFile->FileNameCur = ETFile->FileNameNew; /* Now the file was renamed, so mark his state */ @@ -2853,12 +2925,18 @@ void Rename_File (ET_File *ETFile) dirname_cur_utf8 = filename_to_display(dirname_cur); msg = g_strdup_printf(_("Can't remove old directory\n'%s'!\n(%s)"), dirname_cur_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); g_free(msg); g_free(dirname_cur_utf8); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); g_free(tmp_filename); g_free(cur_basename_utf8); @@ -2882,7 +2960,7 @@ void Rename_File (ET_File *ETFile) unlink(tmp_filename); /* Renaming file has succeeded */ - Log_Print(_("Moved file '%s' to '%s'"),cur_basename_utf8,new_basename_utf8); + Log_Print(LOG_OK,_("Moved file '%s' to '%s'"),cur_basename_utf8,new_basename_utf8); ETFile->FileNameCur = ETFile->FileNameNew; /* Now the file was renamed, so mark his state */ @@ -2900,12 +2978,18 @@ void Rename_File (ET_File *ETFile) dirname_cur_utf8 = filename_to_display(dirname_cur); msg = g_strdup_printf(_("Can't remove old directory\n'%s'!\n(%s)"), dirname_cur_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); g_free(msg); g_free(dirname_cur_utf8); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); g_free(tmp_filename); g_free(cur_basename_utf8); @@ -2922,12 +3006,18 @@ void Rename_File (ET_File *ETFile) /* Moving file has failed */ msg = g_strdup_printf(_("Can't move file '%s'\n to \n'%s'!\n(%s)"), cur_basename_utf8,new_basename_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - + g_free(msg); + Statusbar_Message(_("File(s) not moved..."),TRUE); } }else @@ -2940,11 +3030,17 @@ void Rename_File (ET_File *ETFile) msg = g_strdup_printf(_("Can't rename file '%s'\n to \n'%s'!\n(%s)"), cur_basename_utf8,new_basename_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); Statusbar_Message(_("File(s) not renamed..."),TRUE); } @@ -2961,11 +3057,12 @@ void Rename_File (ET_File *ETFile) gint Delete_File (ET_File *ETFile, gboolean multiple_files) { GtkWidget *msgbox = NULL; + GtkWidget *msgbox_check_button = NULL; gchar *cur_filename; gchar *cur_filename_utf8; gchar *basename_utf8; gchar *msg; - gint button; + gint response; gint stop_loop; if (!ETFile) return FALSE; @@ -2983,30 +3080,45 @@ gint Delete_File (ET_File *ETFile, gboolean multiple_files) msg = g_strdup_printf(_("Do you really want to delete definitively the file\n'%s' ?"),basename_utf8); if (multiple_files) { - msgbox = msg_box_new(_("Delete File..."),msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); + msgbox = msg_box_new(_("Delete File..."), + GTK_WINDOW(MainWindow), + &msgbox_check_button, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + //GTK_TOGGLE_BUTTON(msgbox_check_button)->active = TRUE; // Checked by default }else { - msgbox = msg_box_new(_("Delete File..."),msg,GTK_STOCK_DIALOG_QUESTION, - BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Delete File..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); } g_free(msg); - SF_ButtonPressed_Delete_File = button = msg_box_run(MSG_BOX(msgbox)); - if (msg_box_check_button_get_active(MSG_BOX(msgbox))) - SF_HideMsgbox_Delete_File = MSG_BOX(msgbox)->check_button_state; + SF_ButtonPressed_Delete_File = response = gtk_dialog_run(GTK_DIALOG(msgbox)); + if (msgbox_check_button && GTK_TOGGLE_BUTTON(msgbox_check_button)->active) + SF_HideMsgbox_Delete_File = GTK_TOGGLE_BUTTON(msgbox_check_button)->active; gtk_widget_destroy(msgbox); }else { if (SF_HideMsgbox_Delete_File) - button = SF_ButtonPressed_Delete_File; + response = SF_ButtonPressed_Delete_File; else - button = BUTTON_YES; + response = GTK_RESPONSE_YES; } - switch(button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: if (remove(cur_filename)==0) { msg = g_strdup_printf(_("File '%s' deleted"), basename_utf8); @@ -3016,10 +3128,10 @@ gint Delete_File (ET_File *ETFile, gboolean multiple_files) return 1; } break; - case BUTTON_NO: + case GTK_RESPONSE_NO: break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: stop_loop = -1; g_free(basename_utf8); return stop_loop; @@ -3145,14 +3257,19 @@ gboolean Read_Directory (gchar *path_real) gchar *msg; msg = g_strdup_printf(_("Can't read directory :\n'%s'\n(%s)"),path_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox); g_free(msg); g_free(path_utf8); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); - gtk_widget_destroy(msgbox); - ReadingDirectory = FALSE; //Allow a new reading Browser_Area_Set_Sensitive(TRUE); return FALSE; @@ -3843,13 +3960,13 @@ void Tag_Area_Display_Controls (ET_File *ETFile) gtk_widget_show(GTK_WIDGET(EncodedByLabel)); gtk_widget_show(GTK_WIDGET(EncodedByEntry)); gtk_widget_show(GTK_WIDGET(EncodedByMButton)); - gtk_widget_hide(GTK_WIDGET(PictureLabel)); - gtk_widget_hide(GTK_WIDGET(PictureScrollWindow)); - gtk_widget_hide(GTK_WIDGET(PictureMButton)); - gtk_widget_hide(GTK_WIDGET(PictureClearButton)); - gtk_widget_hide(GTK_WIDGET(PictureAddButton)); - gtk_widget_hide(GTK_WIDGET(PictureSaveButton)); - gtk_widget_hide(GTK_WIDGET(PicturePropertiesButton)); + gtk_widget_show(GTK_WIDGET(PictureLabel)); + gtk_widget_show(GTK_WIDGET(PictureScrollWindow)); + gtk_widget_show(GTK_WIDGET(PictureMButton)); + gtk_widget_show(GTK_WIDGET(PictureClearButton)); + gtk_widget_show(GTK_WIDGET(PictureAddButton)); + gtk_widget_show(GTK_WIDGET(PictureSaveButton)); + gtk_widget_show(GTK_WIDGET(PicturePropertiesButton)); break; #endif @@ -3873,8 +3990,9 @@ void Tag_Area_Display_Controls (ET_File *ETFile) gtk_widget_show(GTK_WIDGET(EncodedByLabel)); gtk_widget_show(GTK_WIDGET(EncodedByEntry)); gtk_widget_show(GTK_WIDGET(EncodedByMButton)); - if (WRITE_ID3_TAGS_IN_FLAC_FILE) - { + // Picture always supported now... + /*if (WRITE_ID3_TAGS_IN_FLAC_FILE) + {*/ gtk_widget_show(GTK_WIDGET(PictureLabel)); gtk_widget_show(GTK_WIDGET(PictureScrollWindow)); gtk_widget_show(GTK_WIDGET(PictureMButton)); @@ -3882,7 +4000,7 @@ void Tag_Area_Display_Controls (ET_File *ETFile) gtk_widget_show(GTK_WIDGET(PictureAddButton)); gtk_widget_show(GTK_WIDGET(PictureSaveButton)); gtk_widget_show(GTK_WIDGET(PicturePropertiesButton)); - }else + /*}else { gtk_widget_hide(GTK_WIDGET(PictureLabel)); gtk_widget_hide(GTK_WIDGET(PictureScrollWindow)); @@ -3891,7 +4009,7 @@ void Tag_Area_Display_Controls (ET_File *ETFile) gtk_widget_hide(GTK_WIDGET(PictureAddButton)); gtk_widget_hide(GTK_WIDGET(PictureSaveButton)); gtk_widget_hide(GTK_WIDGET(PicturePropertiesButton)); - } + }*/ break; #endif @@ -4321,10 +4439,10 @@ void Handle_Crash (gint signal_id) { //gchar commmand[256]; - Log_Print(_("EasyTAG %s: Abnormal exit! (PId: %d)."),VERSION,getpid()); - Log_Print(_("Received signal %s (%d)\a"),signal_to_string(signal_id),signal_id); + Log_Print(LOG_ERROR,_("EasyTAG %s: Abnormal exit! (PId: %d)."),VERSION,getpid()); + Log_Print(LOG_ERROR,_("Received signal %s (%d)\a"),signal_to_string(signal_id),signal_id); - Log_Print(_("You have probably found a bug in EasyTAG. Please, send a bug " + Log_Print(LOG_ERROR,_("You have probably found a bug in EasyTAG. Please, send a bug " "report with a gdb backtrace ('gdb easytag core' then 'bt' and " "'l') and informations to reproduce it to easytag@gmail.com")); @@ -4504,7 +4622,7 @@ void EasyTAG_Exit (void) { ET_Core_Destroy(); Charset_Insert_Locales_Destroy(); - Log_Print(_("EasyTAG: Normal exit.")); + Log_Print(LOG_OK,_("EasyTAG: Normal exit.")); gtk_main_quit(); #ifdef WIN32 ET_Win32_Cleanup(); @@ -4532,7 +4650,7 @@ void Quit_MainWindow_Save_And_Quit (void) void Quit_MainWindow (void) { GtkWidget *msgbox; - gint button; + gint response; /* If you change the displayed data and quit immediately */ if (ETCore->ETFileList) @@ -4547,38 +4665,50 @@ void Quit_MainWindow (void) if (ET_Check_If_All_Files_Are_Saved() != TRUE) { /* Some files haven't been saved */ - msgbox = msg_box_new(_("Confirm..."),_("Some files have been modified but " - "not saved...\nDo you want to save them before exiting the program?"), - GTK_STOCK_DIALOG_QUESTION,BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Confirm..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Some files have been modified but not saved...\nDo you want to save them before exiting the program?"), + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - switch(button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: Quit_MainWindow_Save_And_Quit(); break; - case BUTTON_NO: + case GTK_RESPONSE_NO: Quit_MainWindow_Confirmed(); break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: return; } } else { - msgbox = msg_box_new(_("Confirm..."),_(" Do you really want to exit the program? "), - GTK_STOCK_DIALOG_QUESTION,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Confirm..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _(" Do you really want to exit the program? "), + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - switch(button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: Quit_MainWindow_Confirmed(); break; - case BUTTON_NO: - case -1: + case GTK_RESPONSE_NO: + case GTK_RESPONSE_NONE: return; break; } @@ -4586,22 +4716,28 @@ void Quit_MainWindow (void) }else if (ET_Check_If_All_Files_Are_Saved() != TRUE) { /* Some files aren't saved */ - msgbox = msg_box_new(_("Confirm..."),_("Some files have been modified but not " - "saved...\nDo you want to save them before exiting the program?"), - GTK_STOCK_DIALOG_QUESTION,BUTTON_CANCEL,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Confirm..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("Some files have been modified but not saved...\nDo you want to save them before exiting the program?"), + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - switch(button) + switch (response) { - case BUTTON_YES: + case GTK_RESPONSE_YES: Quit_MainWindow_Save_And_Quit(); break; - case BUTTON_NO: + case GTK_RESPONSE_NO: Quit_MainWindow_Confirmed(); break; - case BUTTON_CANCEL: - case -1: + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NONE: return; } }else diff --git a/src/easytag.h b/src/easytag.h old mode 100644 new mode 100755 diff --git a/src/et_core.c b/src/et_core.c index 3240088..35280ab 100644 --- a/src/et_core.c +++ b/src/et_core.c @@ -459,7 +459,8 @@ GList *ET_Add_File_To_File_List (gchar *filename) guint ETFileKey; guint undo_key; gchar *filename_utf8 = filename_to_display(filename); - + const gchar *locale_lc_ctype = getenv("LC_CTYPE"); + if (!filename) return ETCore->ETFileList; @@ -483,6 +484,11 @@ GList *ET_Add_File_To_File_List (gchar *filename) FileTag = ET_File_Tag_Item_New(); FileTag->saved = TRUE; /* The file hasn't been changed, so it's saved */ + /* Patch from Doruk Fisek : avoid upper/lower conversion bugs (like I->i conversion in + * some locales) in tag parsing. The problem occurs for example with Turkish language + * where it can't read 'TITLE=' field if it is written as 'Title=' in the file */ + setlocale(LC_CTYPE, "C"); + switch (ETFileDescription->TagType) { #ifdef ENABLE_MP3 @@ -515,7 +521,7 @@ GList *ET_Add_File_To_File_List (gchar *filename) #endif case UNKNOWN_TAG: default: - Log_Print("FileTag: Undefined tag type (%d) for file %s",ETFileDescription->TagType,filename_utf8); + Log_Print(LOG_ERROR,"FileTag: Undefined tag type (%d) for file %s",ETFileDescription->TagType,filename_utf8); break; } @@ -563,11 +569,14 @@ GList *ET_Add_File_To_File_List (gchar *filename) #endif case UNKNOWN_FILE: default: - Log_Print("ETFileInfo: Undefined file type (%d) for file %s",ETFileDescription->FileType,filename_utf8); + Log_Print(LOG_ERROR,"ETFileInfo: Undefined file type (%d) for file %s",ETFileDescription->FileType,filename_utf8); ET_Read_File_Info(filename,ETFileInfo); // To get at least the file size break; } + /* Restore previous value */ + setlocale(LC_CTYPE, locale_lc_ctype ? locale_lc_ctype : ""); + /* Attach all data defined above to this ETFile item */ ETFile = ET_File_Item_New(); ETFile->IndexKey = 0; // Will be renumered after... @@ -2542,7 +2551,7 @@ void ET_Display_File_Data_To_UI (ET_File *ETFile) default: gtk_frame_set_label(GTK_FRAME(TagFrame),_("Tag")); ET_Display_File_Tag_To_UI(ETFile); // To reinit screen - Log_Print("FileTag: Undefined tag type %d for file %s.",ETFileDescription->TagType,cur_filename_utf8); + Log_Print(LOG_ERROR,"FileTag: Undefined tag type %d for file %s.",ETFileDescription->TagType,cur_filename_utf8); break; } @@ -2605,7 +2614,7 @@ void ET_Display_File_Data_To_UI (ET_File *ETFile) gtk_frame_set_label(GTK_FRAME(FileFrame),_("File")); // Default displaying ET_Display_File_Info_To_UI(ETFile->ETFileInfo); - Log_Print("ETFileInfo: Undefined file type %d for file %s.",ETFileDescription->FileType,cur_filename_utf8); + Log_Print(LOG_ERROR,"ETFileInfo: Undefined file type %d for file %s.",ETFileDescription->FileType,cur_filename_utf8); break; } @@ -2680,7 +2689,7 @@ void ET_Display_Filename_To_UI (ET_File *ETFile) if ((pos=g_utf8_strrchr(basename_utf8, -1, '.'))!=NULL) *pos = 0; gtk_entry_set_text(GTK_ENTRY(FileEntry),basename_utf8); - /*FIX ME : gchar *tmp = ET_Utf8_Validate_Full_String(basename_utf8); + /*FIX ME : gchar *tmp = Try_To_Validate_Utf8_String(basename_utf8); g_free(tmp);*/ g_free(basename_utf8); // Justify to the left text into FileEntry @@ -2724,7 +2733,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show title */ if (FileTag && FileTag->title) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->title); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->title); gtk_entry_set_text(GTK_ENTRY(TitleEntry), tmp); g_free(tmp); }else @@ -2733,7 +2742,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show artist */ if (FileTag && FileTag->artist) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->artist); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->artist); gtk_entry_set_text(GTK_ENTRY(ArtistEntry), tmp); g_free(tmp); }else @@ -2742,7 +2751,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show album */ if (FileTag && FileTag->album) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->album); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->album); gtk_entry_set_text(GTK_ENTRY(AlbumEntry), tmp); g_free(tmp); }else @@ -2751,7 +2760,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show disc_number */ if (FileTag && FileTag->disc_number) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->disc_number); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->disc_number); gtk_entry_set_text(GTK_ENTRY(DiscNumberEntry), tmp); g_free(tmp); }else @@ -2760,7 +2769,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show year */ if (FileTag && FileTag->year) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->year); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->year); gtk_entry_set_text(GTK_ENTRY(YearEntry),tmp); g_free(tmp); }else @@ -2769,7 +2778,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show track */ if (FileTag && FileTag->track) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->track); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->track); gtk_entry_set_text(GTK_ENTRY(GTK_BIN(TrackEntryCombo)->child),tmp); g_free(tmp); }else @@ -2778,7 +2787,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show number of tracks on the album */ if (FileTag && FileTag->track_total) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->track_total); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->track_total); gtk_entry_set_text(GTK_ENTRY(TrackTotalEntry),tmp); g_free(tmp); }else @@ -2787,7 +2796,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show genre */ if (FileTag && FileTag->genre) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->genre); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->genre); gtk_entry_set_text(GTK_ENTRY(GTK_BIN(GenreCombo)->child), tmp); g_free(tmp); }else @@ -2797,7 +2806,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) //textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(CommentView)); if (FileTag && FileTag->comment) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->comment); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->comment); //gtk_text_buffer_set_text(GTK_TEXT_BUFFER(textbuffer), FileTag->comment, -1); gtk_entry_set_text(GTK_ENTRY(CommentEntry), tmp); g_free(tmp); @@ -2808,7 +2817,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show composer */ if (FileTag && FileTag->composer) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->composer); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->composer); gtk_entry_set_text(GTK_ENTRY(ComposerEntry), tmp); g_free(tmp); }else @@ -2817,7 +2826,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show original artist */ if (FileTag && FileTag->orig_artist) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->orig_artist); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->orig_artist); gtk_entry_set_text(GTK_ENTRY(OrigArtistEntry), tmp); g_free(tmp); }else @@ -2826,7 +2835,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show copyright */ if (FileTag && FileTag->copyright) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->copyright); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->copyright); gtk_entry_set_text(GTK_ENTRY(CopyrightEntry), tmp); g_free(tmp); }else @@ -2835,7 +2844,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show URL */ if (FileTag && FileTag->url) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->url); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->url); gtk_entry_set_text(GTK_ENTRY(URLEntry), tmp); g_free(tmp); }else @@ -2844,7 +2853,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) /* Show Encoded by */ if (FileTag && FileTag->encoded_by) { - gchar *tmp = ET_Utf8_Validate_Full_String(FileTag->encoded_by); + gchar *tmp = Try_To_Validate_Utf8_String(FileTag->encoded_by); gtk_entry_set_text(GTK_ENTRY(EncodedByEntry), tmp); g_free(tmp); }else @@ -2859,7 +2868,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile) GtkWidget *page; gchar *string; - PictureEntry_Update(FileTag->picture, 0); + PictureEntry_Update(FileTag->picture, FALSE); // Count the number of items while (pic) @@ -3012,7 +3021,7 @@ void ET_Save_File_Data_From_UI (ET_File *ETFile) break; case UNKNOWN_TAG: default: - Log_Print("FileTag: Undefined tag type %d for file %s.",ETFileDescription->TagType,cur_filename_utf8); + Log_Print(LOG_ERROR,"FileTag: Undefined tag type %d for file %s.",ETFileDescription->TagType,cur_filename_utf8); break; } @@ -3057,9 +3066,15 @@ gboolean ET_Save_File_Name_From_UI (ET_File *ETFile, File_Name *FileName) msg = g_strdup_printf(_("Could not convert filename : '%s'\n" "into system filename encoding\n" "(Try setting the environment variable G_FILENAME_ENCODING)."), filename_escaped_utf8); - msgbox = msg_box_new(_("Filename translation"),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Filename translation"), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); g_free(filename); @@ -3662,7 +3677,7 @@ gboolean ET_Save_File_Tag_To_HD (ET_File *ETFile) #endif case UNKNOWN_TAG: default: - Log_Print("Saving to HD: Undefined function for tag type '%d' (file %s).", + Log_Print(LOG_ERROR,"Saving to HD: Undefined function for tag type '%d' (file %s).", ETFileDescription->TagType,cur_filename_utf8); state = FALSE; break; @@ -4382,7 +4397,7 @@ gboolean ET_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) if ( (file=fopen(filename,"r"))==NULL ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -4533,7 +4548,7 @@ void ET_File_Name_Check_Length (ET_File *ETFile, gchar *filename_utf8) case OGG_FILE: if ( (exceed_size = (strlen(basename) - 245)) > 0 ) // 255 - 4 (extension) - 6 (mkstemp) { - Log_Print(_("The filename '%s' exceeds %d characters and will be truncated!\n"), filename_utf8, 245); + Log_Print(LOG_ERROR,_("The filename '%s' exceeds %d characters and will be truncated!\n"), filename_utf8, 245); filename_utf8[strlen(filename_utf8) - exceed_size] = '\0'; } break; @@ -4541,7 +4556,7 @@ void ET_File_Name_Check_Length (ET_File *ETFile, gchar *filename_utf8) default: if ( (exceed_size = (strlen(basename) - 251)) > 0 ) // 255 - 4 (extension) { - Log_Print(_("The filename '%s' exceeds %d characters and will be truncated!\n"), filename_utf8, 251); + Log_Print(LOG_ERROR,_("The filename '%s' exceeds %d characters and will be truncated!\n"), filename_utf8, 251); filename_utf8[strlen(filename_utf8) - exceed_size] = '\0'; } break; @@ -4630,43 +4645,6 @@ guint ET_Get_Number_Of_Files_In_Directory (gchar *path_utf8) return count; } -/* - * Try to valide a full string : if some characters are invalid, we skip them to - * return a string with only the valid characters. - */ -gchar *ET_Utf8_Validate_Full_String (gchar *string_to_validate) -{ - gchar *stv; - gchar *stv_end; - gchar *tmp, *tmp1; - - if (!string_to_validate) - return NULL; - - stv = g_strdup(string_to_validate); - // Remove all invalid character - while ( !g_utf8_validate(stv,-1,(const gchar **)&stv_end) ) - { - // Not UTF-8 validated - tmp = tmp1 = stv_end; - tmp++; - while (*tmp) - { - if (*tmp) - *(tmp1++) = *(tmp++); - } - *tmp1 = '\0'; - } - /* - // Truncate at first invalid character - if ( !g_utf8_validate(stv,-1,(const gchar **)&stv_end) ) - { - // Not UTF-8 validated - *stv_end = '\0'; - }*/ - - return stv; -} /*********************** * Debugging functions * diff --git a/src/et_core.h b/src/et_core.h index 6836656..8f275c8 100644 --- a/src/et_core.h +++ b/src/et_core.h @@ -164,7 +164,7 @@ struct _Picture gchar *description; gint width; /* Original width of the picture */ gint height; /* Original height of the picture */ - gulong size; /* Picture size in bits */ + gulong size; /* Picture size in bytes (like lstat) */ guchar *data; Picture *next; }; @@ -412,7 +412,6 @@ gboolean ET_File_Name_Convert_Character (gchar *filename_utf8); gchar *ET_File_Name_Format_Extension (ET_File *ETFile); gchar *ET_File_Name_Generate (ET_File *ETFile, gchar *new_file_name); guint ET_Get_Number_Of_Files_In_Directory (gchar *path_utf8); -gchar *ET_Utf8_Validate_Full_String (gchar *string_to_validate); gboolean ET_Detect_Changes_Of_File_Tag (File_Tag *FileTag1, File_Tag *FileTag2); diff --git a/src/flac_header.c b/src/flac_header.c old mode 100755 new mode 100644 index 408b73b..acdf628 --- a/src/flac_header.c +++ b/src/flac_header.c @@ -123,7 +123,7 @@ gboolean Flac_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) if ( (file=fopen(filename,"r"))==NULL ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -245,24 +245,27 @@ void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMe { file_info_struct *file_info = (file_info_struct *)client_data; (void)decoder; - if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { + if (metadata->type == FLAC__METADATA_TYPE_STREAMINFO) + { FLAC__ASSERT(metadata->data.stream_info.total_samples < 0x100000000); /* this plugin can only handle < 4 gigasamples */ file_info->total_samples = (unsigned)(metadata->data.stream_info.total_samples&0xffffffff); file_info->bits_per_sample = metadata->data.stream_info.bits_per_sample; file_info->channels = metadata->data.stream_info.channels; file_info->sample_rate = metadata->data.stream_info.sample_rate; - if (file_info->bits_per_sample == 8) { + if (file_info->bits_per_sample == 8) + { file_info->sample_format = FMT_S8; - } - else if (file_info->bits_per_sample == 16) { + } else if (file_info->bits_per_sample == 16) + { file_info->sample_format = FMT_S16_NE; - } - else { + } else + { file_info->abort_flag = true; return; } - file_info->length_in_msec = file_info->total_samples * 10 / (file_info->sample_rate / 100); + if (file_info->sample_rate != 0 && (file_info->sample_rate / 100) != 0) // To prevent crash... + file_info->length_in_msec = file_info->total_samples * 10 / (file_info->sample_rate / 100); } } diff --git a/src/flac_tag.c b/src/flac_tag.c old mode 100755 new mode 100644 index a76e1cc..9d3be65 --- a/src/flac_tag.c +++ b/src/flac_tag.c @@ -96,538 +96,578 @@ gboolean Flac_Tag_Write_File (FILE *file_in, gchar *filename_in, vcedit_state *s *************/ /* - * Read tag data from a FLAC file. + * Read tag data from a FLAC file using the level 1 flac interface, * Note: * - if field is found but contains no info (strlen(str)==0), we don't read it */ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) { - FLAC__Metadata_SimpleIterator *iter; - FLAC__StreamMetadata *vc_block; - FLAC__StreamMetadata_VorbisComment *vc; - FLAC__StreamMetadata_VorbisComment_Entry *field; - gchar *field_value; - gchar *field_value_tmp; - gchar *string = NULL; - gint field_num; - gint field_len; - guint i; - + FLAC__Metadata_SimpleIterator *iter; + gchar *string = NULL; + guint i; + Picture *prev_pic = NULL; + //gint j = 1; + if (!filename || !FileTag) return FALSE; flac_error_msg = NULL; + // Initialize the iterator for the blocks iter = FLAC__metadata_simple_iterator_new(); if ( iter == NULL || !FLAC__metadata_simple_iterator_init(iter, filename, true, false) ) { gchar *filename_utf8 = filename_to_display(filename); if ( iter == NULL ) { -#ifdef WIN32 - const char ** const iter = FLAC__Metadata_SimpleIteratorStatusString; /* this is for win32 auto-import of this external symbol works */ - flac_error_msg = iter[FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR]; -#else + // Error with "FLAC__metadata_simple_iterator_new" flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR]; -#endif }else { - flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[FLAC__metadata_simple_iterator_status(iter)]; + // Error with "FLAC__metadata_simple_iterator_init" + FLAC__Metadata_SimpleIteratorStatus status = FLAC__metadata_simple_iterator_status(iter); + flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[status]; + FLAC__metadata_simple_iterator_delete(iter); } - Log_Print(_("ERROR while opening file: '%s' as FLAC (%s)."),filename_utf8,flac_error_msg); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' as FLAC (%s)."),filename_utf8,flac_error_msg); g_free(filename_utf8); return FALSE; } + /* libFLAC is able to detect (and skip) ID3v2 tags by itself */ - /* Find the VORBIS_COMMENT block */ - while ( FLAC__metadata_simple_iterator_get_block_type(iter) != FLAC__METADATA_TYPE_VORBIS_COMMENT ) - { - if ( !FLAC__metadata_simple_iterator_next(iter) ) - { - /* End of metadata: comment block not found, nothing to read */ - FLAC__metadata_simple_iterator_delete(iter); - return TRUE; - } - } - - /* Get comments from block */ - vc_block = FLAC__metadata_simple_iterator_get_block(iter); - vc = &vc_block->data.vorbis_comment; - - /* Get vendor string */ - /*{ - FLAC__StreamMetadata_VorbisComment_Entry vce; - vce = vc->vendor_string; - g_print("File %s : \n",filename); - g_print(" - FLAC File vendor string : '%s'\n",g_strndup(vce.entry,vce.length)); - g_print(" - FLAC Lib vendor string : '%s'\n",FLAC__VENDOR_STRING); - }*/ - - - /********* - * Title * - *********/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"TITLE")) >= 0 ) + while (FLAC__metadata_simple_iterator_next(iter)) { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); - - if (field_value) + // Get block data + FLAC__StreamMetadata *block = FLAC__metadata_simple_iterator_get_block(iter); + //g_print("Read: %d %s -> block type: %d\n",j++,g_path_get_basename(filename),FLAC__metadata_simple_iterator_get_block_type(iter)); + + // Action to do according the type + switch ( FLAC__metadata_simple_iterator_get_block_type(iter) ) { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + // + // Read the VORBIS_COMMENT block (only one should exist) + // + case FLAC__METADATA_TYPE_VORBIS_COMMENT: { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->title==NULL) - FileTag->title = g_strdup(field_value); - else - FileTag->title = g_strconcat(FileTag->title,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + FLAC__StreamMetadata_VorbisComment *vc; + FLAC__StreamMetadata_VorbisComment_Entry *field; + gint field_num; + gint field_len; + gchar *field_value; + gchar *field_value_tmp; + + // Get comments from block + vc = &block->data.vorbis_comment; + + /********* + * Title * + *********/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"TITLE")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /********** - * Artist * - **********/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"ARTIST")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->title==NULL) + FileTag->title = g_strdup(field_value); + else + FileTag->title = g_strconcat(FileTag->title,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->artist==NULL) - FileTag->artist = g_strdup(field_value); - else - FileTag->artist = g_strconcat(FileTag->artist,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /********** + * Artist * + **********/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"ARTIST")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /********* - * Album * - *********/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"ALBUM")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->artist==NULL) + FileTag->artist = g_strdup(field_value); + else + FileTag->artist = g_strconcat(FileTag->artist,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->album==NULL) - FileTag->album = g_strdup(field_value); - else - FileTag->album = g_strconcat(FileTag->album,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /********* + * Album * + *********/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"ALBUM")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /*************** - * Disc Number * - ***************/ - if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,0,"DISCNUMBER")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->album==NULL) + FileTag->album = g_strdup(field_value); + else + FileTag->album = g_strconcat(FileTag->album,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - FileTag->disc_number = field_value; - } - } - } + /*************** + * Disc Number * + ***************/ + if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"DISCNUMBER")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num]; + field_value = memchr(field->entry, '=', field->length); - /******** - * Year * - ********/ - if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,0,"DATE")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + FileTag->disc_number = field_value; + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - FileTag->year = field_value; - } - } - } + /******** + * Year * + ********/ + if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"DATE")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num]; + field_value = memchr(field->entry, '=', field->length); - /************************* - * Track and Total Track * - *************************/ - if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,0,"TRACKTOTAL")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + FileTag->year = field_value; + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (NUMBER_TRACK_FORMATED) - { - FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(field_value)); - }else + /************************* + * Track and Total Track * + *************************/ + if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"TRACKTOTAL")) >= 0 ) { - FileTag->track_total = g_strdup(field_value); + /* Extract field value */ + field = &vc->comments[field_num]; + field_value = memchr(field->entry, '=', field->length); + + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (NUMBER_TRACK_FORMATED) + { + FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(field_value)); + }else + { + FileTag->track_total = g_strdup(field_value); + } + g_free(field_value); + } + } + // Below is also filled track_total if not done here } - g_free(field_value); - } - } - // Below is also filled track_total if not done here - } - if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,0,"TRACKNUMBER")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num]; - field_value = memchr(field->entry, '=', field->length); + if ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,0,"TRACKNUMBER")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num]; + field_value = memchr(field->entry, '=', field->length); - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - string = g_utf8_strchr(field_value, -1, '/'); - if (NUMBER_TRACK_FORMATED) + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + string = g_utf8_strchr(field_value, -1, '/'); + if (NUMBER_TRACK_FORMATED) + { + // If track_total not filled before, try now... + if (string && !FileTag->track_total) + { + FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(string+1)); + *string = '\0'; + } + FileTag->track = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(field_value)); + }else + { + if (string && !FileTag->track_total) + { + FileTag->track_total = g_strdup(string+1); + *string = '\0'; + } + FileTag->track = g_strdup(field_value); + } + g_free(field_value); + } + } + } + + /********* + * Genre * + *********/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"GENRE")) >= 0 ) { - // If track_total not filled before, try now... - if (string && !FileTag->track_total) + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); + + if (field_value) { - FileTag->track_total = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(string+1)); - *string = '\0'; + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->genre==NULL) + FileTag->genre = g_strdup(field_value); + else + FileTag->genre = g_strconcat(FileTag->genre,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } } - FileTag->track = g_strdup_printf("%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,atoi(field_value)); - }else + } + + /*********** + * Comment * + ***********/ + field_num = 0; + while ( 1 ) { - if (string && !FileTag->track_total) + gint field_num1, field_num2; + + // The comment field can take two forms... + field_num1 = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"DESCRIPTION"); + field_num2 = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"COMMENT"); + + if (field_num1 >= 0 && field_num2 >= 0) + // Note : We set field_num to the last "comment" field to avoid to concatenate + // the DESCRIPTION and COMMENT field if there are both present (EasyTAG writes the both...) + if (field_num1 < field_num2) + field_num = field_num2; + else + field_num = field_num1; + else if (field_num1 >= 0) + field_num = field_num1; + else if (field_num2 >= 0) + field_num = field_num2; + else + break; + + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); + + if (field_value) { - FileTag->track_total = g_strdup(string+1); - *string = '\0'; + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->comment==NULL) + FileTag->comment = g_strdup(field_value); + else + FileTag->comment = g_strconcat(FileTag->comment,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } } - FileTag->track = g_strdup(field_value); } - g_free(field_value); - } - } - } - /********* - * Genre * - *********/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"GENRE")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + /************ + * Composer * + ************/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"COMPOSER")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->genre==NULL) - FileTag->genre = g_strdup(field_value); - else - FileTag->genre = g_strconcat(FileTag->genre,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->composer==NULL) + FileTag->composer = g_strdup(field_value); + else + FileTag->composer = g_strconcat(FileTag->composer,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - /*********** - * Comment * - ***********/ - field_num = 0; - while ( 1 ) - { - gint field_num1, field_num2; - - // The comment field can take two forms... - field_num1 = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"DESCRIPTION"); - field_num2 = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"COMMENT"); - - if (field_num1 >= 0 && field_num2 >= 0) - // Note : We set field_num to the last "comment" field to avoid to concatenate - // the DESCRIPTION and COMMENT field if there are both present (EasyTAG writes the both...) - if (field_num1 < field_num2) - field_num = field_num2; - else - field_num = field_num1; - else if (field_num1 >= 0) - field_num = field_num1; - else if (field_num2 >= 0) - field_num = field_num2; - else - break; - - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); - - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->comment==NULL) - FileTag->comment = g_strdup(field_value); - else - FileTag->comment = g_strconcat(FileTag->comment,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /******************* + * Original artist * + *******************/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"PERFORMER")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /************ - * Composer * - ************/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"COMPOSER")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->orig_artist==NULL) + FileTag->orig_artist = g_strdup(field_value); + else + FileTag->orig_artist = g_strconcat(FileTag->orig_artist,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->composer==NULL) - FileTag->composer = g_strdup(field_value); - else - FileTag->composer = g_strconcat(FileTag->composer,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /************* + * Copyright * + *************/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"COPYRIGHT")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /******************* - * Original artist * - *******************/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"PERFORMER")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->copyright==NULL) + FileTag->copyright = g_strdup(field_value); + else + FileTag->copyright = g_strconcat(FileTag->copyright,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->orig_artist==NULL) - FileTag->orig_artist = g_strdup(field_value); - else - FileTag->orig_artist = g_strconcat(FileTag->orig_artist,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /******* + * URL * + *******/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"LICENSE")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /************* - * Copyright * - *************/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"COPYRIGHT")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->url==NULL) + FileTag->url = g_strdup(field_value); + else + FileTag->url = g_strconcat(FileTag->url,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->copyright==NULL) - FileTag->copyright = g_strdup(field_value); - else - FileTag->copyright = g_strconcat(FileTag->copyright,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /************** + * Encoded by * + **************/ + field_num = 0; + while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(block,field_num,"ENCODED-BY")) >= 0 ) + { + /* Extract field value */ + field = &vc->comments[field_num++]; + field_value = memchr(field->entry, '=', field->length); - /******* - * URL * - *******/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"LICENSE")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + if (field_value) + { + field_value++; + if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + { + field_len = field->length - (field_value - (gchar*) field->entry); + field_value_tmp = g_strndup(field_value, field_len); + field_value = Try_To_Validate_Utf8_String(field_value_tmp); + g_free(field_value_tmp); + if (FileTag->encoded_by==NULL) + FileTag->encoded_by = g_strdup(field_value); + else + FileTag->encoded_by = g_strconcat(FileTag->encoded_by,MULTIFIELD_SEPARATOR,field_value,NULL); + g_free(field_value); + } + } + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) - { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->url==NULL) - FileTag->url = g_strdup(field_value); - else - FileTag->url = g_strconcat(FileTag->url,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); - } - } - } + /*************************** + * Save unsupported fields * + ***************************/ + for (i=0;i<(guint)vc->num_comments;i++) + { + field = &vc->comments[i]; + if ( strncasecmp((gchar *)field->entry,"TITLE=", MIN(6, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"ARTIST=", MIN(7, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"ALBUM=", MIN(6, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"DISCNUMBER=", MIN(11, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"DATE=", MIN(5, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"TRACKNUMBER=", MIN(12, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"TRACKTOTAL=", MIN(11, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"GENRE=", MIN(6, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"DESCRIPTION=", MIN(12, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"COMMENT=", MIN(8, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"COMPOSER=", MIN(9, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"PERFORMER=", MIN(10, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"COPYRIGHT=", MIN(10, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"LICENSE=", MIN(8, field->length)) != 0 + && strncasecmp((gchar *)field->entry,"ENCODED-BY=", MIN(11, field->length)) != 0 ) + { + //g_print("custom %*s\n", field->length, field->entry); + FileTag->other = g_list_append(FileTag->other,g_strndup((const gchar *)field->entry, field->length)); + } + } - /************** - * Encoded by * - **************/ - field_num = 0; - while ( (field_num = FLAC__metadata_object_vorbiscomment_find_entry_from(vc_block,field_num,"ENCODED-BY")) >= 0 ) - { - /* Extract field value */ - field = &vc->comments[field_num++]; - field_value = memchr(field->entry, '=', field->length); + + break; + } - if (field_value) - { - field_value++; - if ( field_value && g_utf8_strlen(field_value, -1) > 0 ) + + // + // Read the PICTURE block (severals can exist) + // + case FLAC__METADATA_TYPE_PICTURE: { - field_len = field->length - (field_value - (gchar*) field->entry); - field_value_tmp = g_strndup(field_value, field_len); - field_value = Try_To_Validate_Utf8_String(field_value_tmp); - g_free(field_value_tmp); - if (FileTag->encoded_by==NULL) - FileTag->encoded_by = g_strdup(field_value); - else - FileTag->encoded_by = g_strconcat(FileTag->encoded_by,MULTIFIELD_SEPARATOR,field_value,NULL); - g_free(field_value); + + /*********** + * Picture * + ***********/ + // For FLAC >= 1.1.3 + #ifndef LEGACY_FLAC + FLAC__StreamMetadata_Picture *p; + Picture *pic; + + // Get picture data from block + p = &block->data.picture; + + pic = Picture_Allocate(); + if (!prev_pic) + FileTag->picture = pic; + else + prev_pic->next = pic; + prev_pic = pic; + + pic->size = p->data_length; + pic->data = g_memdup(p->data,pic->size); + pic->type = p->type; + pic->description = g_strdup((gchar *)p->description); + // Not necessary: will be calculated later + //pic->height = p->height; + //pic->width = p->width; + + //g_print("Picture type : %s\n",FLAC__StreamMetadata_Picture_TypeString[p->type]); + //g_print("Mime type : %s\n",p->mime_type); + + #endif + + break; } + + default: + break; } + + // Free block data + ////FLAC__metadata_object_delete(block); } - - - /*********** - * Picture * - ***********/ - // For FLAC > 1.1.3 - #ifndef LEGACY_FLAC - #endif + // Free iter + FLAC__metadata_simple_iterator_delete(iter); - /*************************** - * Save unsupported fields * - ***************************/ - for (i=0;i<(guint)vc->num_comments;i++) - { - field = &vc->comments[i]; - if ( strncasecmp((gchar *)field->entry,"TITLE=", MIN(6, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"ARTIST=", MIN(7, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"ALBUM=", MIN(6, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"DISCNUMBER=", MIN(11, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"DATE=", MIN(5, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"TRACKNUMBER=", MIN(12, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"TRACKTOTAL=", MIN(11, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"GENRE=", MIN(6, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"DESCRIPTION=", MIN(12, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"COMMENT=", MIN(8, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"COMPOSER=", MIN(9, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"PERFORMER=", MIN(10, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"COPYRIGHT=", MIN(10, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"LICENSE=", MIN(8, field->length)) != 0 - && strncasecmp((gchar *)field->entry,"ENCODED-BY=", MIN(11, field->length)) != 0 ) - { - //g_print("custom %*s\n", field->length, field->entry); - FileTag->other = g_list_append(FileTag->other,g_strndup((const gchar *)field->entry, field->length)); - } - } - - FLAC__metadata_object_delete(vc_block); - FLAC__metadata_simple_iterator_delete(iter); #ifdef ENABLE_MP3 /* If no FLAC vorbis tag found : we try to get the ID3 tag if it exists - * (will be deleted when writing the tag */ + * (but it will be deleted when rewriting the tag) */ if ( FileTag->title == NULL && FileTag->artist == NULL && FileTag->album == NULL @@ -641,12 +681,13 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) && FileTag->orig_artist == NULL && FileTag->copyright == NULL && FileTag->url == NULL - && FileTag->encoded_by == NULL) + && FileTag->encoded_by == NULL + && FileTag->picture == NULL) { gint rc = Id3tag_Read_File_Tag(filename,FileTag); // If an ID3 tag has been found (and no FLAC tag), we mark the file as - // unsaved to rewrite a flac tag + // unsaved to rewrite a flac tag. if ( FileTag->title != NULL || FileTag->artist != NULL || FileTag->album != NULL @@ -660,7 +701,8 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) || FileTag->orig_artist != NULL || FileTag->copyright != NULL || FileTag->url != NULL - || FileTag->encoded_by != NULL) + || FileTag->encoded_by != NULL + || FileTag->picture != NULL) { FileTag->saved = FALSE; } @@ -670,10 +712,10 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) /* Part to get cover artist : * If we have read the ID3 tag previously we don't arrive here (and we have - * the picture if it exists) + * the picture if it exists). * Else the ID3 tag wasn't read (as there was data in FLAC tag) so we try - * to read it only to get the picture (not supported by the FLAC tag) */ - if (WRITE_ID3_TAGS_IN_FLAC_FILE && FileTag->picture == NULL) + * to read it only to get the picture (not supported by the FLAC tag). */ + /***if (WRITE_ID3_TAGS_IN_FLAC_FILE && FileTag->picture == NULL) { File_Tag *FileTag_tmp = ET_File_Tag_Item_New(); gint rc = Id3tag_Read_File_Tag(filename,FileTag_tmp); @@ -686,31 +728,28 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) ET_Free_File_Tag_Item(FileTag_tmp); return rc; - } + }***/ #endif return TRUE; } + +/* + * Write Flac tag, using the level 2 flac interface + */ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile) { - File_Tag *FileTag; - gchar *filename_utf8, *filename; - gchar *basename_utf8; - FLAC__Metadata_SimpleIterator *iter; - FLAC__StreamMetadata *vc_block; - FLAC__StreamMetadata_VorbisComment_Entry field; - FLAC__bool write_ok; - gchar *string; - GList *list; - // To get original vendor string - FLAC__StreamMetadata *vc_block_svg = NULL; - FLAC__StreamMetadata_VorbisComment *vc_svg; - FLAC__StreamMetadata_VorbisComment_Entry field_svg; - gboolean vc_found_svg = TRUE; - + File_Tag *FileTag; + gchar *filename_utf8, *filename; + gchar *basename_utf8; + FLAC__Metadata_Chain *chain; + FLAC__Metadata_Iterator *iter; + FLAC__StreamMetadata_VorbisComment_Entry vce_field_vendor_string; // To save vendor string + gboolean vce_field_vendor_string_found = FALSE; + if (!ETFile || !ETFile->FileTag) return FALSE; @@ -720,282 +759,382 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile) flac_error_msg = NULL; /* libFLAC is able to detect (and skip) ID3v2 tags by itself */ - - iter = FLAC__metadata_simple_iterator_new(); - if ( iter == NULL || !FLAC__metadata_simple_iterator_init(iter,filename,false,false) ) + + // Create a new chain instance to get all blocks in one time + chain = FLAC__metadata_chain_new(); + if (chain == NULL || !FLAC__metadata_chain_read(chain,filename)) { - if ( iter == NULL ) + if (chain == NULL) { -#ifdef WIN32 - const char **iter = FLAC__Metadata_SimpleIteratorStatusString; /* this is for win32 auto-import of this external symbol works */ - flac_error_msg = iter[FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR]; -#else - flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR]; -#endif + // Error with "FLAC__metadata_chain_new" + flac_error_msg = FLAC__Metadata_ChainStatusString[FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR]; }else { - flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[FLAC__metadata_simple_iterator_status(iter)]; - FLAC__metadata_simple_iterator_delete(iter); + // Error with "FLAC__metadata_chain_read" + FLAC__Metadata_ChainStatus status = FLAC__metadata_chain_status(chain); + flac_error_msg = FLAC__Metadata_ChainStatusString[status]; + + FLAC__metadata_chain_delete(chain); } - - Log_Print(_("ERROR while opening file: '%s' as FLAC (%s)."),filename_utf8,flac_error_msg); + + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' as FLAC (%s)."),filename_utf8,flac_error_msg); return FALSE; } - - /* Find the VORBIS_COMMENT block to get original vendor string */ - while ( FLAC__metadata_simple_iterator_get_block_type(iter) != FLAC__METADATA_TYPE_VORBIS_COMMENT ) + + // Create a new iterator instance for the chain + iter = FLAC__metadata_iterator_new(); + if (iter == NULL) { - if ( !FLAC__metadata_simple_iterator_next(iter) ) - { - /* End of metadata: comment block not found, nothing to read */ - vc_found_svg = FALSE; - break; - } + flac_error_msg = FLAC__Metadata_ChainStatusString[FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR]; + + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' as FLAC (%s)."),filename_utf8,flac_error_msg); + return FALSE; } - if (vc_found_svg) + + // Initialize the iterator to point to the first metadata block in the given chain. + FLAC__metadata_iterator_init(iter,chain); + + while (FLAC__metadata_iterator_next(iter)) { - /* Get comments from block */ - vc_block_svg = FLAC__metadata_simple_iterator_get_block(iter); - vc_svg = &vc_block_svg->data.vorbis_comment; - /* Get original vendor string */ - field_svg = vc_svg->vendor_string; - } - - - vc_block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT); - - /* Set the original vendor string else it is version of library */ - if (vc_found_svg) - FLAC__metadata_object_vorbiscomment_set_vendor_string(vc_block, field_svg, true); - + //g_print("Write: %d %s -> block type: %d\n",j++,g_path_get_basename(filename),FLAC__metadata_iterator_get_block_type(iter)); + + // Action to do according the type + switch ( FLAC__metadata_iterator_get_block_type(iter) ) + { + // + // Delete the VORBIS_COMMENT block and convert to padding. But before, save the original vendor string. + // + case FLAC__METADATA_TYPE_VORBIS_COMMENT: + { + // Get block data + FLAC__StreamMetadata *block = FLAC__metadata_iterator_get_block(iter); + FLAC__StreamMetadata_VorbisComment *vc = &block->data.vorbis_comment; + + // Get initial vendor string, to don't alterate it by FLAC__VENDOR_STRING when saving file + vce_field_vendor_string = vc->vendor_string; + vce_field_vendor_string_found = TRUE; + + // Free block data + FLAC__metadata_iterator_delete_block(iter,true); + break; + } + + // + // Delete all the PICTURE blocks, and convert to padding + // + case FLAC__METADATA_TYPE_PICTURE: + { + FLAC__metadata_iterator_delete_block(iter,true); + break; + } - /********* - * Title * - *********/ - if ( FileTag->title ) - { - string = g_strconcat("TITLE=",FileTag->title,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); // Warning : g_utf8_strlen doesn't count the multibyte characters. Here we need the allocated size. - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); + default: + break; + } } - - /********** - * Artist * - **********/ - if ( FileTag->artist ) + + + // + // Create and insert a new VORBISCOMMENT block + // { - string = g_strconcat("ARTIST=",FileTag->artist,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + FLAC__StreamMetadata *vc_block; // For vorbis comments + FLAC__StreamMetadata_VorbisComment_Entry field; + gchar *string; + GList *list; + + // Allocate a block for Vorbis comments + vc_block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT); + + // Set the original vendor string, else will be use the version of library + if (vce_field_vendor_string_found) + FLAC__metadata_object_vorbiscomment_set_vendor_string(vc_block, vce_field_vendor_string, true); + + + /********* + * Title * + *********/ + if ( FileTag->title ) + { + string = g_strconcat("TITLE=",FileTag->title,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); // Warning : g_utf8_strlen doesn't count the multibyte characters. Here we need the allocated size. + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /********* - * Album * - *********/ - if ( FileTag->album ) - { - string = g_strconcat("ALBUM=",FileTag->album,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /********** + * Artist * + **********/ + if ( FileTag->artist ) + { + string = g_strconcat("ARTIST=",FileTag->artist,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /*************** - * Disc Number * - ***************/ - if ( FileTag->disc_number ) - { - string = g_strconcat("DISCNUMBER=",FileTag->disc_number,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /********* + * Album * + *********/ + if ( FileTag->album ) + { + string = g_strconcat("ALBUM=",FileTag->album,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /******** - * Year * - ********/ - if ( FileTag->year ) - { - string = g_strconcat("DATE=",FileTag->year,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /*************** + * Disc Number * + ***************/ + if ( FileTag->disc_number ) + { + string = g_strconcat("DISCNUMBER=",FileTag->disc_number,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /************************* - * Track and Total Track * - *************************/ - if ( FileTag->track ) - { - string = g_strconcat("TRACKNUMBER=",FileTag->track,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } - if ( FileTag->track_total /*&& strlen(FileTag->track_total)>0*/ ) - { - string = g_strconcat("TRACKTOTAL=",FileTag->track_total,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /******** + * Year * + ********/ + if ( FileTag->year ) + { + string = g_strconcat("DATE=",FileTag->year,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /********* - * Genre * - *********/ - if ( FileTag->genre ) - { - string = g_strconcat("GENRE=",FileTag->genre,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /************************* + * Track and Total Track * + *************************/ + if ( FileTag->track ) + { + string = g_strconcat("TRACKNUMBER=",FileTag->track,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } + if ( FileTag->track_total /*&& strlen(FileTag->track_total)>0*/ ) + { + string = g_strconcat("TRACKTOTAL=",FileTag->track_total,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /*********** - * Comment * - ***********/ - // We write the comment using the "both" format - if ( FileTag->comment ) - { - string = g_strconcat("DESCRIPTION=",FileTag->comment,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - - string = g_strconcat("COMMENT=",FileTag->comment,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /********* + * Genre * + *********/ + if ( FileTag->genre ) + { + string = g_strconcat("GENRE=",FileTag->genre,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /************ - * Composer * - ************/ - if ( FileTag->composer ) - { - string = g_strconcat("COMPOSER=",FileTag->composer,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /*********** + * Comment * + ***********/ + // We write the comment using the "both" format + if ( FileTag->comment ) + { + string = g_strconcat("DESCRIPTION=",FileTag->comment,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); - /******************* - * Original artist * - *******************/ - if ( FileTag->orig_artist ) - { - string = g_strconcat("PERFORMER=",FileTag->orig_artist,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + string = g_strconcat("COMMENT=",FileTag->comment,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /************* - * Copyright * - *************/ - if ( FileTag->copyright ) - { - string = g_strconcat("COPYRIGHT=",FileTag->copyright,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /************ + * Composer * + ************/ + if ( FileTag->composer ) + { + string = g_strconcat("COMPOSER=",FileTag->composer,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /******* - * URL * - *******/ - if ( FileTag->url ) - { - string = g_strconcat("LICENSE=",FileTag->url,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /******************* + * Original artist * + *******************/ + if ( FileTag->orig_artist ) + { + string = g_strconcat("PERFORMER=",FileTag->orig_artist,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /************** - * Encoded by * - **************/ - if ( FileTag->encoded_by ) - { - string = g_strconcat("ENCODED-BY=",FileTag->encoded_by,NULL); - field.entry = (FLAC__byte *)string; - field.length = strlen(string); - FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); - g_free(string); - } + /************* + * Copyright * + *************/ + if ( FileTag->copyright ) + { + string = g_strconcat("COPYRIGHT=",FileTag->copyright,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } + /******* + * URL * + *******/ + if ( FileTag->url ) + { + string = g_strconcat("LICENSE=",FileTag->url,NULL); + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); + } - /************************** - * Set unsupported fields * - **************************/ - list = FileTag->other; - while (list) - { - if (list->data) + /************** + * Encoded by * + **************/ + if ( FileTag->encoded_by ) { - string = (gchar*)list->data; + string = g_strconcat("ENCODED-BY=",FileTag->encoded_by,NULL); field.entry = (FLAC__byte *)string; field.length = strlen(string); FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + g_free(string); } - list = list->next; - } - /* Find the VORBIS_COMMENT block */ - while ( FLAC__metadata_simple_iterator_get_block_type(iter) != FLAC__METADATA_TYPE_VORBIS_COMMENT ) - { - if ( !FLAC__metadata_simple_iterator_next(iter) ) - break; - } + /************************** + * Set unsupported fields * + **************************/ + list = FileTag->other; + while (list) + { + if (list->data) + { + string = (gchar*)list->data; + field.entry = (FLAC__byte *)string; + field.length = strlen(string); + FLAC__metadata_object_vorbiscomment_insert_comment(vc_block,vc_block->data.vorbis_comment.num_comments,field,true); + } + list = list->next; + } - /* - * Write FLAC tag (as Vorbis comment) - */ - if ( FLAC__metadata_simple_iterator_get_block_type(iter) != FLAC__METADATA_TYPE_VORBIS_COMMENT ) - { - /* End of metadata: no comment block, so insert one */ - write_ok = FLAC__metadata_simple_iterator_insert_block_after(iter,vc_block,true); - }else + // Add the block to the the chain + FLAC__metadata_iterator_insert_block_after(iter, vc_block); + ////FLAC__metadata_object_delete(vc_block); + } + + + + // + // Create and insert PICTURE blocks + // + + /*********** + * Picture * + ***********/ + // For FLAC >= 1.1.3 + #ifndef LEGACY_FLAC { - write_ok = FLAC__metadata_simple_iterator_set_block(iter,vc_block,true); + Picture *pic = FileTag->picture; + while (pic) + { + if (pic->data) + { + const gchar *violation; + FLAC__StreamMetadata *picture_block; // For picture data + Picture_Format format; + + // Allocate block for picture data + picture_block = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PICTURE); + + // Type + picture_block->data.picture.type = pic->type; + + // Mime type + format = Picture_Format_From_Data(pic); + FLAC__metadata_object_picture_set_mime_type(picture_block, (gchar *)Picture_Mime_Type_String(format), TRUE); + + // Description + FLAC__metadata_object_picture_set_description(picture_block, (FLAC__byte *)pic->description, TRUE); + + // Resolution + picture_block->data.picture.width = pic->width; + picture_block->data.picture.height = pic->height; + picture_block->data.picture.depth = 0; + + // Picture data + FLAC__metadata_object_picture_set_data(picture_block, (FLAC__byte *)pic->data, (FLAC__uint32) pic->size, TRUE); + + if (!FLAC__metadata_object_picture_is_legal(picture_block, &violation)) + { + Log_Print(LOG_ERROR,_("Picture block isn't valid: '%s'"),violation); + FLAC__metadata_object_delete(picture_block); + }else + { + // Add the block to the the chain + FLAC__metadata_iterator_insert_block_after(iter, picture_block); + ////FLAC__metadata_object_delete(picture_block); + } + } + + pic = pic->next; + } } - - if ( !write_ok ) + #endif + + // Free iter + FLAC__metadata_iterator_delete(iter); + + + // + // Prepare for writing tag + // + + // Move all PADDING blocks to the end on the metadata, and merge them into a single block. + FLAC__metadata_chain_sort_padding(chain); + + // Write tag + if ( !FLAC__metadata_chain_write(chain, /*padding*/TRUE, /*preserve_file_stats*/TRUE) ) { - flac_error_msg = FLAC__Metadata_SimpleIteratorStatusString[FLAC__metadata_simple_iterator_status(iter)]; - Log_Print(_("ERROR: Failed to write comments to file '%s' (%s)."),filename_utf8,flac_error_msg); - FLAC__metadata_simple_iterator_delete(iter); - FLAC__metadata_object_delete(vc_block); + // Error with "FLAC__metadata_chain_write" + FLAC__Metadata_ChainStatus status = FLAC__metadata_chain_status(chain); + flac_error_msg = FLAC__Metadata_ChainStatusString[status]; + + FLAC__metadata_chain_delete(chain); + + Log_Print(LOG_ERROR,_("ERROR: Failed to write comments to file '%s' (%s)."),filename_utf8,flac_error_msg); return FALSE; }else { basename_utf8 = g_path_get_basename(filename_utf8); - Log_Print(_("Written tag of '%s'"),basename_utf8); + Log_Print(LOG_OK,_("Written tag of '%s'"),basename_utf8); g_free(basename_utf8); } + + FLAC__metadata_chain_delete(chain); - FLAC__metadata_simple_iterator_delete(iter); - FLAC__metadata_object_delete(vc_block); - if (vc_found_svg) - FLAC__metadata_object_delete(vc_block_svg); - + #ifdef ENABLE_MP3 /* * Write also the ID3 tags (ID3v1 and/or ID3v2) if wanted (as needed by some players) @@ -1021,7 +1160,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile) ET_Free_File_List_Item(ETFile_tmp); } #endif - + return TRUE; } diff --git a/src/id3_tag.c b/src/id3_tag.c index 9092fee..8a21abf 100644 --- a/src/id3_tag.c +++ b/src/id3_tag.c @@ -142,7 +142,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) /* Test to know if we can write into the file */ if ( (file=fopen(filename,"r+"))==NULL ) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); return FALSE; } fclose(file); @@ -386,24 +386,28 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) has_picture = 0; while (pic) { + Picture_Format format = Picture_Format_From_Data(pic); + id3_frame = ID3Frame_NewID(ID3FID_PICTURE); ID3Tag_AttachFrame(id3_tag,id3_frame); - switch (Picture_Format(pic)) + switch (format) { case PICTURE_FORMAT_JPEG: if ((id3_field = ID3Frame_GetField(id3_frame,ID3FN_MIMETYPE))) - ID3Field_SetASCII(id3_field, "image/jpeg"); + ID3Field_SetASCII(id3_field, Picture_Mime_Type_String(format)); if ((id3_field = ID3Frame_GetField(id3_frame,ID3FN_IMAGEFORMAT))) ID3Field_SetASCII(id3_field, "JPG"); break; case PICTURE_FORMAT_PNG: if ((id3_field = ID3Frame_GetField(id3_frame,ID3FN_MIMETYPE))) - ID3Field_SetASCII(id3_field, "image/png"); + ID3Field_SetASCII(id3_field, Picture_Mime_Type_String(format)); if ((id3_field = ID3Frame_GetField(id3_frame,ID3FN_IMAGEFORMAT))) ID3Field_SetASCII(id3_field, "PNG"); break; + default: + break; } if ((id3_field = ID3Frame_GetField(id3_frame, ID3FN_PICTURETYPE))) @@ -481,13 +485,13 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) /* Check error messages */ if (error_strip_id3v1 == ID3E_NoError && error_strip_id3v2 == ID3E_NoError) { - Log_Print(_("Removed tag of '%s'"),basename_utf8); + Log_Print(LOG_OK,_("Removed tag of '%s'"),basename_utf8); }else { if (error_strip_id3v1 != ID3E_NoError) - Log_Print(_("Error while removing ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v1)); + Log_Print(LOG_ERROR,_("Error while removing ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v1)); if (error_strip_id3v2 != ID3E_NoError) - Log_Print(_("Error while removing ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v2)); + Log_Print(LOG_ERROR,_("Error while removing ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v2)); error++; } @@ -506,7 +510,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) error_update_id3v2 = ID3Tag_UpdateByTagType(id3_tag,ID3TT_ID3V2); if (error_update_id3v2 != ID3E_NoError) { - Log_Print(_("Error while updating ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_update_id3v2)); + Log_Print(LOG_ERROR,_("Error while updating ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_update_id3v2)); error++; }else { @@ -536,13 +540,19 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) "available in EasyTAG package sources.\n" "Note that this message will appear only one time.\n\n" "File : %s"),filename_utf8); - //Log_Print(msg); - - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + //Log_Print(LOG_ERROR,msg); + + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); + g_free(msg); flag_id3lib_bugged = FALSE; // To display the message only one time } ET_Free_File_Tag_Item(FileTag_tmp); @@ -554,7 +564,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) error_strip_id3v2 = ID3Tag_Strip(id3_tag,ID3TT_ID3V2); if (error_strip_id3v2 != ID3E_NoError) { - Log_Print(_("Error while removing ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v2)); + Log_Print(LOG_ERROR,_("Error while removing ID3v2 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v2)); error++; } } @@ -574,7 +584,7 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) error_update_id3v1 = ID3Tag_UpdateByTagType(id3_tag,ID3TT_ID3V1); if (error_update_id3v1 != ID3E_NoError) { - Log_Print(_("Error while updating ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_update_id3v1)); + Log_Print(LOG_ERROR,_("Error while updating ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_update_id3v1)); error++; } }else @@ -582,13 +592,13 @@ gboolean Id3tag_Write_File_v23Tag (ET_File *ETFile) error_strip_id3v1 = ID3Tag_Strip(id3_tag,ID3TT_ID3V1); if (error_strip_id3v1 != ID3E_NoError) { - Log_Print(_("Error while removing ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v1)); + Log_Print(LOG_ERROR,_("Error while removing ID3v1 tag of '%s' (%s)"),basename_utf8,Id3tag_Get_Error_Message(error_strip_id3v1)); error++; } } if (error == 0) - Log_Print(_("Updated tag of '%s'"),basename_utf8); + Log_Print(LOG_OK,_("Updated tag of '%s'"),basename_utf8); } @@ -794,7 +804,7 @@ gchar *Id3tag_Get_Field (const ID3Frame *id3_frame, ID3_FieldID id3_fieldid) // Data of the field must be a TEXT (ID3FTY_TEXTSTRING) if (ID3Field_GetType(id3_field) != ID3FTY_TEXTSTRING) { - Log_Print("Id3tag_Get_Field() must be used only for fields containing text.\n"); + Log_Print(LOG_ERROR,"Id3tag_Get_Field() must be used only for fields containing text.\n"); return NULL; } @@ -883,15 +893,15 @@ gchar *Id3tag_Get_Field (const ID3Frame *id3_frame, ID3_FieldID id3_fieldid) if (num_chars && !string1) { gchar *escaped_str = g_strescape(string, NULL); - Log_Print("Id3tag_Get_Field: Trying to fix string '%s' ...",escaped_str); + Log_Print(LOG_OK,"Id3tag_Get_Field: Trying to fix string '%s' ...",escaped_str); g_free(escaped_str); string1 = filename_to_display(string); if (string1) - Log_Print("OK"); + Log_Print(LOG_OK,"OK"); else - Log_Print("KO"); + Log_Print(LOG_ERROR,"KO"); } g_free(string); @@ -933,7 +943,7 @@ ID3_TextEnc Id3tag_Set_Field (const ID3Frame *id3_frame, ID3_FieldID id3_fieldid // Data of the field must be a TEXT (ID3FTY_TEXTSTRING) if (ID3Field_GetType(id3_field) != ID3FTY_TEXTSTRING) { - Log_Print("Id3tag_Set_Field() must be used only for fields containing text."); + Log_Print(LOG_ERROR,"Id3tag_Set_Field() must be used only for fields containing text."); return ID3TE_NONE; } @@ -1182,7 +1192,7 @@ gboolean Id3tag_Check_If_File_Is_Corrupted (gchar *filename) if ( (file=fopen(filename,"rb"))==NULL ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -1211,9 +1221,15 @@ gboolean Id3tag_Check_If_File_Is_Corrupted (gchar *filename) msg = g_strdup_printf(_("As the following corrupted file: '%s'\nwill cause " "an error in id3lib, it will not be processed by the program."),basename_utf8); - msgbox = msg_box_new(_("Corrupted file..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_CLOSE,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Corrupted file..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); g_free(basename); @@ -1252,7 +1268,7 @@ gboolean Id3tag_Check_If_Id3lib_Is_Bugged (void) if ( (file=fopen(filename,"w+"))==NULL ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } diff --git a/src/id3v24_tag.c b/src/id3v24_tag.c index d1302ca..04da4a8 100644 --- a/src/id3v24_tag.c +++ b/src/id3v24_tag.c @@ -143,6 +143,7 @@ gboolean Id3tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) /* ID3v2 tag found */ if (FILE_WRITING_ID3V2_WRITE_TAG == 0) { + // To delete the tag update = 1; }else { @@ -414,7 +415,7 @@ gboolean Id3tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) data = id3_field_getbinarydata(field, &size); if (pic->data) g_free(pic->data); - if ( (pic->data = g_memdup(data, size)) ) + if ( data && (pic->data = g_memdup(data, size)) ) pic->size = size; } break; @@ -767,7 +768,6 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) union id3_field *field; gchar *string1; Picture *pic; - unsigned i; gint error = 0; gboolean strip_tags = TRUE; guchar genre_value = ID3_INVALID_GENRE; @@ -786,7 +786,7 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) { struct id3_file *file; struct id3_tag *tmptag; - unsigned i; + unsigned tagsize; id3_byte_t *tmpbuf = NULL; /* Read old v2 tag */ @@ -806,12 +806,12 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) ID3_TAG_OPTION_UNSYNCHRONISATION); /* XXX Create new tag and copy all frames*/ - i = id3_tag_render(tmptag, NULL); - if ((i > 10) - && (tmpbuf = g_try_malloc(i)) + tagsize = id3_tag_render(tmptag, NULL); + if ((tagsize > 10) + && (tmpbuf = g_try_malloc(tagsize)) && (id3_tag_render(tmptag, tmpbuf) != 0) ) - v2tag = id3_tag_parse(tmpbuf, i); + v2tag = id3_tag_parse(tmpbuf, tagsize); g_free(tmpbuf); if (v2tag == NULL) @@ -827,7 +827,7 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) /* Set padding XXX */ if ((v2tag->paddedsize < 1024) - || ((v2tag->paddedsize > 4096) && (i < 1024)) + || ((v2tag->paddedsize > 4096) && (tagsize < 1024)) ) v2tag->paddedsize = 1024; @@ -963,26 +963,21 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) { while (pic) { + gint i; + if ((frame = id3_frame_new("APIC")) == NULL) continue; id3_tag_attachframe(v2tag, frame); for (i = 0; (field = id3_frame_field(frame, i)); i++) { + Picture_Format format; + switch (id3_field_type(field)) { case ID3_FIELD_TYPE_LATIN1: - switch (Picture_Format(pic)) - { - case PICTURE_FORMAT_JPEG: - id3_field_setlatin1(field, (id3_latin1_t const *)"image/jpeg"); - break; - case PICTURE_FORMAT_PNG: - id3_field_setlatin1(field, (id3_latin1_t const *)"image/png"); - break; - default: - break; - } + format = Picture_Format_From_Data(pic); + id3_field_setlatin1(field, (id3_latin1_t const *)Picture_Mime_Type_String(format)); break; case ID3_FIELD_TYPE_INT8: id3_field_setint(field, pic->type); @@ -1012,6 +1007,7 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) *********************************/ error |= etag_write_tags(filename, v1tag, v2tag, strip_tags); + // Free data if (v1tag) id3_tag_delete(v1tag); if (v2tag) @@ -1020,7 +1016,7 @@ gboolean Id3tag_Write_File_v24Tag (ET_File *ETFile) if (error == 0) { basename_utf8 = g_path_get_basename(filename_utf8); - Log_Print(_("Updated tag of '%s'"),basename_utf8); + Log_Print(LOG_OK,_("Updated tag of '%s'"),basename_utf8); g_free(basename_utf8); } @@ -1108,7 +1104,7 @@ Id3tag_find_and_create_frame (struct id3_tag *tag, const gchar *name) * create new if not found */ static struct id3_frame * -Id3tag_find_and_create_txxframe(struct id3_tag *tag, const gchar *param1) +Id3tag_find_and_create_txxframe (struct id3_tag *tag, const gchar *param1) { const id3_ucs4_t *ucs4string; struct id3_frame *frame; @@ -1144,9 +1140,10 @@ Id3tag_find_and_create_txxframe(struct id3_tag *tag, const gchar *param1) } static int -id3taglib_set_field(struct id3_frame *frame, const gchar *str, - enum id3_field_type type, - int num, int clear, int id3v1) +id3taglib_set_field(struct id3_frame *frame, + const gchar *str, + enum id3_field_type type, + int num, int clear, int id3v1) { union id3_field *field; enum id3_field_type curtype; @@ -1311,12 +1308,12 @@ id3taglib_set_field(struct id3_frame *frame, const gchar *str, static int -etag_set_tags(const gchar *str, - const char *frame_name, - enum id3_field_type field_type, - struct id3_tag *v1tag, - struct id3_tag *v2tag, - gboolean *strip_tags) +etag_set_tags (const gchar *str, + const char *frame_name, + enum id3_field_type field_type, + struct id3_tag *v1tag, + struct id3_tag *v2tag, + gboolean *strip_tags) { struct id3_frame *ftmp; @@ -1338,7 +1335,10 @@ etag_set_tags(const gchar *str, } static int -etag_write_tags(const gchar *filename, const struct id3_tag *v1tag, const struct id3_tag *v2tag, gboolean strip_tags) +etag_write_tags (const gchar *filename, + const struct id3_tag *v1tag, + const struct id3_tag *v2tag, + gboolean strip_tags) { id3_byte_t *v1buf, *v2buf; id3_length_t v1size = 0, v2size = 0; @@ -1400,38 +1400,42 @@ etag_write_tags(const gchar *filename, const struct id3_tag *v1tag, const struct err = 1; /* Handle Id3v1 tag */ - if (lseek(fd, -128, SEEK_END) < 0) + if ((curpos = lseek(fd, -128, SEEK_END)) < 0) goto out; if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE) goto out; if ( (tmp[0] == 'T') - && (tmp[1] == 'A') - && (tmp[2] == 'G') + && (tmp[1] == 'A') + && (tmp[2] == 'G') ) { - if (lseek(fd, -128, SEEK_END) < 0) + if ((curpos = lseek(fd, -128, SEEK_END)) < 0) + { goto out; + } }else - if (lseek(fd, 0, SEEK_END) < 0) + if ((curpos = lseek(fd, 0, SEEK_END)) < 0) + { goto out; + } /* Search id3v2 tags at the end of the file (before any ID3v1 tag) */ /* XXX: Unsafe */ - if (lseek(fd, -ID3_TAG_QUERYSIZE, SEEK_CUR) >= 0) + if ((curpos = lseek(fd, -ID3_TAG_QUERYSIZE, SEEK_CUR)) >= 0) { if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE) goto out; filev2size = id3_tag_query((id3_byte_t const *)tmp, ID3_TAG_QUERYSIZE); - if ((filev2size > 10) - && lseek(fd, -filev2size, SEEK_CUR)) + if ( (filev2size > 10) + && (curpos = lseek(fd, -filev2size, SEEK_CUR)) ) { if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE) goto out; if (id3_tag_query((id3_byte_t const *)tmp, ID3_TAG_QUERYSIZE) != filev2size) - lseek(fd, -ID3_TAG_QUERYSIZE - filev2size, SEEK_CUR); + curpos = lseek(fd, -ID3_TAG_QUERYSIZE - filev2size, SEEK_CUR); else - lseek(fd, -ID3_TAG_QUERYSIZE, SEEK_CUR); + curpos = lseek(fd, -ID3_TAG_QUERYSIZE, SEEK_CUR); } } @@ -1447,7 +1451,7 @@ etag_write_tags(const gchar *filename, const struct id3_tag *v1tag, const struct goto out; /* Handle Id3v2 tag */ - if (lseek(fd, 0, SEEK_SET) < 0) + if ((curpos = lseek(fd, 0, SEEK_SET)) < 0) goto out; if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE) @@ -1461,35 +1465,35 @@ etag_write_tags(const gchar *filename, const struct id3_tag *v1tag, const struct if (filev2size == v2size) { - if (lseek(fd, 0, SEEK_SET) < 0) + if ((curpos = lseek(fd, 0, SEEK_SET)) < 0) goto out; if (write(fd, v2buf, v2size) != v2size) goto out; }else { - /* XXX */ - ctxsize = lseek(fd, 0, SEEK_END) - filev2size; - if ((ctx = g_try_malloc(ctxsize)) == NULL) - goto out; - if (lseek(fd, filev2size, SEEK_SET) < 0) - goto out; - if (read(fd, ctx, ctxsize) != ctxsize) - goto out; - if (lseek(fd, 0, SEEK_SET) < 0) - goto out; - if (v2buf) - write(fd, v2buf, v2size); + /* XXX */ + ctxsize = lseek(fd, 0, SEEK_END) - filev2size; + if ((ctx = g_try_malloc(ctxsize)) == NULL) + goto out; + if (lseek(fd, filev2size, SEEK_SET) < 0) + goto out; + if (read(fd, ctx, ctxsize) != ctxsize) + goto out; + if (lseek(fd, 0, SEEK_SET) < 0) + goto out; + if (v2buf) + write(fd, v2buf, v2size); - if (write(fd, ctx, ctxsize) != ctxsize) - { - g_print("OOPS\n"); - goto out; - } + if (write(fd, ctx, ctxsize) != ctxsize) + { + g_print("OOPS\n"); + goto out; + } - if ((curpos = lseek(fd, 0, SEEK_CUR)) <= 0 ) - goto out; - if ((err = ftruncate(fd, curpos))) - goto out; + if ((curpos = lseek(fd, 0, SEEK_CUR)) <= 0 ) + goto out; + if ((err = ftruncate(fd, curpos))) + goto out; } err = 0; diff --git a/src/libapetag/apetaglib.c b/src/libapetag/apetaglib.c old mode 100755 new mode 100644 index 1f5012e..52fc971 --- a/src/libapetag/apetaglib.c +++ b/src/libapetag/apetaglib.c @@ -757,11 +757,11 @@ apetag_read_fp(apetag *mem_cnt, FILE * fp, char *filename, int flag) unsigned long flag = ape2long(p + 4); unsigned long sizeValue = ape2long(p); unsigned long sizeName; - char *name = p + 8; + char *name = (char *)p + 8; char *value; - sizeName = strlen(p + 8); - value = p + sizeName + 8 + 1; + sizeName = strlen((char *)p + 8); + value = (char *)p + sizeName + 8 + 1; if (apeTag2 == 1000 && value[sizeValue - 1] == '\0') { libapetag_maloc_cont(mem_cnt, flag, sizeName, name, diff --git a/src/libmpg123/README b/src/libmpg123/README old mode 100644 new mode 100755 diff --git a/src/libmpg123/mpg123.c b/src/libmpg123/mpg123.c old mode 100755 new mode 100644 index 1def17e..dae9327 --- a/src/libmpg123/mpg123.c +++ b/src/libmpg123/mpg123.c @@ -163,7 +163,7 @@ guint mpg123_get_song_time(FILE * file) len = ftell(file) - id3v2size; fseek(file, -128, SEEK_END); fread(tmp, 1, 3, file); - if (!strncmp(tmp, "TAG", 3)) + if (!strncmp((gchar *)tmp, "TAG", 3)) len -= 128; return ((guint) ((guint)(len / bpf) * tpf * 1000)); } diff --git a/src/log.c b/src/log.c old mode 100644 new mode 100755 index 155d753..1218a30 --- a/src/log.c +++ b/src/log.c @@ -29,6 +29,7 @@ #include "easytag.h" #include "bar.h" #include "setting.h" +#include "charset.h" #ifdef WIN32 # include "win32/win32dep.h" @@ -46,6 +47,7 @@ gint LogListNbrRows; enum { + LOG_PIXBUF, LOG_TIME_TEXT, LOG_TEXT, LOG_ROW_BACKGROUND, @@ -60,8 +62,9 @@ gchar *LOG_FILE = ".easytag/easytag.log"; typedef struct _Log_Data Log_Data; struct _Log_Data { - gchar *time; /* The time of this line of log */ - gchar *string; /* The string of the line of log to display */ + gchar *time; /* The time of this line of log */ + Log_Error_Type error_type; + gchar *string; /* The string of the line of log to display */ }; @@ -72,6 +75,7 @@ gboolean Log_Popup_Menu_Handler (GtkMenu *menu, GdkEventButton *event); void Log_List_Set_Row_Visible (GtkTreeModel *treeModel, GtkTreeIter *rowIter); void Log_Print_Tmp_List (void); gchar *Log_Format_Date (void); +gchar *Log_Get_Stock_Id_From_Error_Type (Log_Error_Type error_type); @@ -101,6 +105,7 @@ GtkWidget *Create_Log_Area (void) /* The file list */ logListModel = gtk_list_store_new(LOG_COLUMN_COUNT, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, GDK_TYPE_COLOR, @@ -114,27 +119,31 @@ GtkWidget *Create_Log_Area (void) gtk_tree_view_set_reorderable(GTK_TREE_VIEW(LogList), FALSE); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(LogList)),GTK_SELECTION_MULTIPLE); - renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); + gtk_tree_view_append_column(GTK_TREE_VIEW(LogList), column); + gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); + + renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, renderer, FALSE); + gtk_tree_view_column_set_attributes(column, renderer, + "stock-id", LOG_PIXBUF, + NULL); + + renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", LOG_TIME_TEXT, "background-gdk", LOG_ROW_BACKGROUND, "foreground-gdk", LOG_ROW_FOREGROUND, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(LogList), column); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_attributes(column, renderer, "text", LOG_TEXT, "background-gdk", LOG_ROW_BACKGROUND, "foreground-gdk", LOG_ROW_FOREGROUND, NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(LogList), column); - gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE); // Create Popup Menu on browser album list PopupMenu = gtk_ui_manager_get_widget(UIManager, "/LogPopup"); @@ -207,13 +216,15 @@ gchar *Log_Format_Date (void) { struct tm *tms; time_t nowtime; - gchar *current_date = g_malloc0(21); + gchar *current_date, *current_work = g_malloc0(21); // Get current time and date nowtime = time(NULL); tms = localtime(&nowtime); - strftime(current_date,20,"%X",tms); // Time without date in current locale - //strftime(current_date,20,"%x",ptr); // Date without time in current locale + strftime(current_work,20,"%X",tms); // Time without date in current locale + //strftime(current_work,20,"%x",ptr); // Date without time in current locale + current_date = Try_To_Validate_Utf8_String(current_work); + g_free(current_work); return current_date; } @@ -222,7 +233,7 @@ gchar *Log_Format_Date (void) /* * Function to use anywhere in the application to send a message to the LogList */ -void Log_Print (gchar const *format, ...) +void Log_Print (Log_Error_Type error_type, gchar const *format, ...) { va_list args; gchar *string; @@ -253,8 +264,9 @@ void Log_Print (gchar const *format, ...) LogListNbrRows++; gtk_list_store_append(logListModel, &iter); gtk_list_store_set(logListModel, &iter, - LOG_TIME_TEXT, time, - LOG_TEXT, string, + LOG_PIXBUF, Log_Get_Stock_Id_From_Error_Type(error_type), + LOG_TIME_TEXT, time, + LOG_TEXT, string, LOG_ROW_BACKGROUND, NULL, LOG_ROW_FOREGROUND, NULL, -1); @@ -263,8 +275,9 @@ void Log_Print (gchar const *format, ...) }else { Log_Data *LogData = g_malloc0(sizeof(Log_Data)); - LogData->time = Log_Format_Date(); - LogData->string = string; + LogData->time = Log_Format_Date(); + LogData->error_type = error_type; + LogData->string = string; LogPrintTmpList = g_list_append(LogPrintTmpList,LogData); //g_print("%s",string); @@ -314,6 +327,7 @@ void Log_Print_Tmp_List (void) LogListNbrRows++; gtk_list_store_append(logListModel, &iter); gtk_list_store_set(logListModel, &iter, + LOG_PIXBUF, Log_Get_Stock_Id_From_Error_Type( ((Log_Data *)LogPrintTmpList->data)->error_type ), LOG_TIME_TEXT, ((Log_Data *)LogPrintTmpList->data)->time, LOG_TEXT, ((Log_Data *)LogPrintTmpList->data)->string, LOG_ROW_BACKGROUND, NULL, @@ -345,3 +359,26 @@ void Log_Print_Tmp_List (void) } + +gchar *Log_Get_Stock_Id_From_Error_Type (Log_Error_Type error_type) +{ + gchar *stock_id; + + switch (error_type) + { + case LOG_OK: + stock_id = GTK_STOCK_APPLY; + break; + + case LOG_ERROR: + stock_id = GTK_STOCK_CANCEL; + break; + + case LOG_UNKNOWN: + default: + stock_id = NULL; + break; + } + + return stock_id; +} diff --git a/src/log.h b/src/log.h old mode 100644 new mode 100755 index 2ec4408..d1bb8db --- a/src/log.h +++ b/src/log.h @@ -27,6 +27,16 @@ //#include "et_core.h" +/* + * Types of errors + */ +typedef enum +{ + LOG_UNKNOWN = 0, + LOG_OK, + LOG_ERROR +} Log_Error_Type; + /************** * Prototypes * @@ -36,7 +46,7 @@ GtkWidget *Create_Log_Area (void); void Log_Clean_Log_List (void); -void Log_Print (gchar const *format, ...); +void Log_Print (Log_Error_Type error_type, gchar const *format, ...); #endif /* __LOG_H__ */ diff --git a/src/misc.c b/src/misc.c index 9346abe..baf8f04 100644 --- a/src/misc.c +++ b/src/misc.c @@ -196,93 +196,6 @@ void File_Selection_Window_For_Directory (GtkWidget *entry); /****************************** * Functions managing pixmaps * ******************************/ -/* - * Buttons creation with pixmap - */ - -GtkWidget *Create_Button_With_Pixmap(guint button_type) -{ - GtkWidget *Button; - GtkWidget *HBox; - GtkWidget *Label; - GtkWidget *Pixmap; - - gtk_widget_realize(MainWindow); - switch (button_type) - { - case BUTTON_OK: - Label = gtk_label_new(_(" OK ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_YES: - Label = gtk_label_new(_(" Yes ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_NO: - Label = gtk_label_new(_(" No ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_APPLY: - Label = gtk_label_new(_(" Apply ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_SAVE: - Label = gtk_label_new(_(" Save ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_CANCEL: - Label = gtk_label_new(_(" Cancel ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_CLOSE: - Label = gtk_label_new(_(" Close ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_WRITE: - Label = gtk_label_new(_(" Write ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_EXECUTE: - Label = gtk_label_new(_(" Execute ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_EXECUTE, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_SEARCH: - Label = gtk_label_new(_(" Search ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON); - break; - - case BUTTON_BROWSE: - Label = gtk_label_new(_(" Browse... ")); - Pixmap = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON); - break; - - default: - Button = gtk_button_new_with_label("Unknown button"); - return Button; - break; - } - - Button = gtk_button_new(); - HBox = gtk_hbox_new(FALSE,0); - gtk_container_add(GTK_CONTAINER(Button),HBox); - /* Add items in button */ - gtk_container_add(GTK_CONTAINER(HBox),Pixmap); - gtk_container_add(GTK_CONTAINER(HBox),Label); - /* Alignment of items */ - gtk_misc_set_alignment(GTK_MISC(Pixmap),1,0.5); - gtk_misc_set_alignment(GTK_MISC(Label),0,0.5); - - return Button; -} /* * Create an icon into an event box to allow some events (as to display tooltips). @@ -676,50 +589,52 @@ void Set_Unbusy_Cursor (void) /* * Add easytag specific icons to GTK stock set */ -#include "../pixmaps/scan.xpm" -#include "../pixmaps/select_all.xpm" -#include "../pixmaps/invert_selection.xpm" -#include "../pixmaps/add.xpm" -#include "../pixmaps/unselect_all.xpm" -#include "../pixmaps/grab.xpm" -#include "../pixmaps/mask.xpm" -//#include "../pixmaps/blackwhite.xpm" -#include "../pixmaps/forbidden.xpm" -#include "../pixmaps/read_only.xpm" -//#include "../pixmaps/sequence_track.xpm" -#include "../pixmaps/artist_album.xpm" -#include "../pixmaps/red_lines.xpm" #include "../pixmaps/add_folder.xpm" -#include "../pixmaps/parent_folder.xpm" -#include "../pixmaps/sound.xpm" +#include "../pixmaps/album.xpm" #include "../pixmaps/all_uppercase.xpm" #include "../pixmaps/all_downcase.xpm" +#include "../pixmaps/artist.xpm" +#include "../pixmaps/artist_album.xpm" +//#include "../pixmaps/blackwhite.xpm" #include "../pixmaps/first_letter_uppercase.xpm" #include "../pixmaps/first_letter_uppercase_word.xpm" +#include "../pixmaps/forbidden.xpm" +#include "../pixmaps/grab.xpm" +#include "../pixmaps/invert_selection.xpm" +#include "../pixmaps/mask.xpm" +#include "../pixmaps/parent_folder.xpm" +#include "../pixmaps/read_only.xpm" +#include "../pixmaps/red_lines.xpm" +#include "../pixmaps/scan.xpm" +#include "../pixmaps/select_all.xpm" +//#include "../pixmaps/sequence_track.xpm" +#include "../pixmaps/sound.xpm" +#include "../pixmaps/unselect_all.xpm" void Init_Custom_Icons (void) { - Create_Xpm_Icon_Factory((const char**)select_all_xpm, "easytag-select-all"); - Create_Xpm_Icon_Factory((const char**)scan_xpm, "easytag-scan"); - ////Create_Png_Icon_Factory("scan.png", "easytag-scan"); - Create_Xpm_Icon_Factory((const char**)invert_selection_xpm, "easytag-invert-selection"); - Create_Xpm_Icon_Factory((const char**)add_xpm, "easytag-add"); - Create_Xpm_Icon_Factory((const char**)unselect_all_xpm, "easytag-unselect-all"); - Create_Xpm_Icon_Factory((const char**)grab_xpm, "easytag-grab"); - Create_Xpm_Icon_Factory((const char**)mask_xpm, "easytag-mask"); - //Create_Xpm_Icon_Factory((const char**)blackwhite_xpm, "easytag-blackwhite"); - Create_Xpm_Icon_Factory((const char**)forbidden_xpm, "easytag-forbidden"); - Create_Xpm_Icon_Factory((const char**)read_only_xpm, "easytag-read-only"); - //Create_Xpm_Icon_Factory((const char**)sequence_track_xpm, "easytag-sequence-track"); - Create_Xpm_Icon_Factory((const char**)red_lines_xpm, "easytag-red-lines"); - Create_Xpm_Icon_Factory((const char**)artist_album_xpm, "easytag-artist-album"); - ////Create_Png_Icon_Factory("artist_album.png", "easytag-artist-album"); - Create_Xpm_Icon_Factory((const char**)parent_folder_xpm, "easytag-parent-folder"); - Create_Xpm_Icon_Factory((const char**)add_folder_xpm, "easytag-add-folder"); - Create_Xpm_Icon_Factory((const char**)sound_xpm, "easytag-sound"); - Create_Xpm_Icon_Factory((const char**)all_uppercase_xpm, "easytag-all-uppercase"); - Create_Xpm_Icon_Factory((const char**)all_downcase_xpm, "easytag-all-downcase"); - Create_Xpm_Icon_Factory((const char**)first_letter_uppercase_xpm, "easytag-first-letter-uppercase"); - Create_Xpm_Icon_Factory((const char**)first_letter_uppercase_word_xpm, "easytag-first-letter-uppercase-word"); + Create_Xpm_Icon_Factory((const char**)artist_xpm, "easytag-artist"); + Create_Xpm_Icon_Factory((const char**)album_xpm, "easytag-album"); + Create_Xpm_Icon_Factory((const char**)select_all_xpm, "easytag-select-all"); + Create_Xpm_Icon_Factory((const char**)scan_xpm, "easytag-scan"); +//// Create_Png_Icon_Factory("scan.png", "easytag-scan"); + Create_Xpm_Icon_Factory((const char**)invert_selection_xpm, "easytag-invert-selection"); + Create_Xpm_Icon_Factory((const char**)unselect_all_xpm, "easytag-unselect-all"); + Create_Xpm_Icon_Factory((const char**)grab_xpm, "easytag-grab"); + Create_Xpm_Icon_Factory((const char**)mask_xpm, "easytag-mask"); + //Create_Xpm_Icon_Factory((const char**)blackwhite_xpm, "easytag-blackwhite"); + Create_Xpm_Icon_Factory((const char**)forbidden_xpm, "easytag-forbidden"); + Create_Xpm_Icon_Factory((const char**)read_only_xpm, "easytag-read-only"); + //Create_Xpm_Icon_Factory((const char**)sequence_track_xpm, "easytag-sequence-track"); + Create_Xpm_Icon_Factory((const char**)red_lines_xpm, "easytag-red-lines"); + Create_Xpm_Icon_Factory((const char**)artist_album_xpm, "easytag-artist-album"); +//// Create_Png_Icon_Factory("artist_album.png", "easytag-artist-album"); + Create_Xpm_Icon_Factory((const char**)parent_folder_xpm, "easytag-parent-folder"); + Create_Xpm_Icon_Factory((const char**)add_folder_xpm, "easytag-add-folder"); + Create_Xpm_Icon_Factory((const char**)sound_xpm, "easytag-sound"); + Create_Xpm_Icon_Factory((const char**)all_uppercase_xpm, "easytag-all-uppercase"); + Create_Xpm_Icon_Factory((const char**)all_downcase_xpm, "easytag-all-downcase"); + Create_Xpm_Icon_Factory((const char**)first_letter_uppercase_xpm, "easytag-first-letter-uppercase"); + Create_Xpm_Icon_Factory((const char**)first_letter_uppercase_word_xpm, "easytag-first-letter-uppercase-word"); } @@ -754,6 +669,7 @@ void Create_Xpm_Icon_Factory (const char **xpm_data, const char *name_in_factory * Create an icon factory from the specified png file * Also add it to the GTK stock images */ +/* void Create_Png_Icon_Factory (const char *png_file, const char *name_in_factory) { GdkPixbuf *pixbuf; @@ -780,10 +696,11 @@ void Create_Png_Icon_Factory (const char *png_file, const char *name_in_factory) gtk_icon_factory_add_default(factory); }else { - Log_Print(error->message); + Log_Print(LOG_ERROR,error->message); g_error_free(error); } } +*/ /* * Return a widget with a pixmap @@ -853,12 +770,12 @@ gint Combo_Alphabetic_Sort (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, *************************/ void File_Selection_Window_For_File (GtkWidget *entry) { - Open_File_Selection_Window(entry, _("Select directory..."), GTK_FILE_CHOOSER_ACTION_OPEN); + Open_File_Selection_Window(entry, _("Select file..."), GTK_FILE_CHOOSER_ACTION_OPEN); } void File_Selection_Window_For_Directory (GtkWidget *entry) { - Open_File_Selection_Window(entry, _("Select file..."), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + Open_File_Selection_Window(entry, _("Select directory..."), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); } /* @@ -870,6 +787,7 @@ static void Open_File_Selection_Window (GtkWidget *entry, gchar *title, GtkFileC gchar *filename, *filename_utf8; GtkWidget *FileSelectionWindow; GtkWindow *parent_window = NULL; + gint response; parent_window = (GtkWindow*) gtk_widget_get_toplevel(entry); if (!GTK_WIDGET_TOPLEVEL(parent_window)) @@ -880,7 +798,7 @@ static void Open_File_Selection_Window (GtkWidget *entry, gchar *title, GtkFileC FileSelectionWindow = gtk_file_chooser_dialog_new(title, parent_window, action, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); // Set initial directory tmp = (gchar*) gtk_entry_get_text(GTK_ENTRY(entry)); @@ -890,15 +808,18 @@ static void Open_File_Selection_Window (GtkWidget *entry, gchar *title, GtkFileC gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileSelectionWindow),tmp); } - - if (gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)) == GTK_RESPONSE_ACCEPT) + response = gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)); + if (response == GTK_RESPONSE_ACCEPT) { filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(FileSelectionWindow)); filename_utf8 = filename_to_display(filename); gtk_entry_set_text(GTK_ENTRY(entry),filename_utf8); - g_free(filename); + g_free(filename); g_free(filename_utf8); + // Gives the focus to the entry (useful for the button on the main window) + gtk_widget_grab_focus(GTK_WIDGET(entry)); } + gtk_widget_destroy(FileSelectionWindow); } @@ -928,10 +849,15 @@ void Run_Audio_Player_Using_File_List (GList *etfilelist_init) // Exit if no program selected... if (!AUDIO_FILE_PLAYER || strlen(g_strstrip(AUDIO_FILE_PLAYER))<1) { - GtkWidget *msgbox = msg_box_new(_("Warning..."),_("No audio player defined!"),GTK_STOCK_DIALOG_WARNING,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - //gtk_window_set_transient_for(GTK_WINDOW(msgbox),GTK_WINDOW(OptionsWindow)); - msg_box_run(MSG_BOX(msgbox)); + GtkWidget *msgbox = msg_box_new(_("Warning..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + _("No audio player defined!"), + GTK_STOCK_DIALOG_WARNING, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); return; @@ -940,7 +866,7 @@ void Run_Audio_Player_Using_File_List (GList *etfilelist_init) if ( !(program_path = Check_If_Executable_Exists(AUDIO_FILE_PLAYER)) ) { gchar *msg = g_strdup_printf(_("The program '%s' can't be found!"),AUDIO_FILE_PLAYER); - Log_Print(msg); + Log_Print(LOG_ERROR,msg); g_free(msg); return; } @@ -985,7 +911,7 @@ void Run_Audio_Player_Using_File_List (GList *etfilelist_init) &siStartupInfo, &piProcessInfo) == FALSE) { - Log_Print(_("Can't execute %s (error %d)!\n"), AUDIO_FILE_PLAYER, GetLastError()); + Log_Print(LOG_ERROR,_("Can't execute %s (error %d)!\n"), AUDIO_FILE_PLAYER, GetLastError()); } // Free allocated parameters (for each filename) @@ -1024,13 +950,13 @@ void Run_Audio_Player_Using_File_List (GList *etfilelist_init) switch (pid) { case -1: - Log_Print(_("Can't fork another process!\n")); + Log_Print(LOG_ERROR,_("Can't fork another process!\n")); break; case 0: { if (execvp(argv[0],argv) == -1) { - Log_Print(_("Can't execute %s (%s)!\n"),argv[0],g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't execute %s (%s)!\n"),argv[0],g_strerror(errno)); } g_strfreev(argv_user); _exit(1); @@ -1495,7 +1421,7 @@ void Open_Write_Playlist_Window (void) g_signal_connect(G_OBJECT(Button),"clicked", G_CALLBACK(Destroy_Write_Playlist_Window),NULL); /* Button to Write the playlist */ - Button = Create_Button_With_Pixmap(BUTTON_WRITE); + Button = gtk_button_new_from_stock(GTK_STOCK_SAVE); gtk_container_add(GTK_CONTAINER(ButtonBox),Button); GTK_WIDGET_SET_FLAGS(Button,GTK_CAN_DEFAULT); g_signal_connect_swapped(G_OBJECT(Button),"clicked",G_CALLBACK(Playlist_Write_Button_Pressed),NULL); @@ -1593,7 +1519,7 @@ void Playlist_Write_Button_Pressed (void) FILE *file; gchar *msg; GtkWidget *msgbox; - gint msgbox_button = 0; + gint response = 0; // Check if playlist name was filled @@ -1694,6 +1620,7 @@ void Playlist_Write_Button_Pressed (void) g_free(playlist_basename_utf8); playlist_name = filename_from_display(playlist_name_utf8); + playlist_basename_utf8 = g_path_get_basename(playlist_name_utf8); // Check if file exists if (CONFIRM_WRITE_PLAYLIST) @@ -1701,35 +1628,59 @@ void Playlist_Write_Button_Pressed (void) if ( (file=fopen(playlist_name,"r")) != NULL ) { fclose(file); - msg = g_strdup_printf(_("Playlist file '%s' already exists!\nOverwrite?"),playlist_name_utf8); - msgbox = msg_box_new(_("Write Playlist..."),msg,GTK_STOCK_DIALOG_QUESTION,BUTTON_NO,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msgbox_button = msg_box_run(MSG_BOX(msgbox)); + msg = g_strdup_printf(_("Playlist file '%s' already exists!\nOverwrite?"),playlist_basename_utf8); + msgbox = msg_box_new(_("Write Playlist..."), + GTK_WINDOW(WritePlaylistWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); } } // Writing playlist if ok - if (msgbox_button==0 || msgbox_button==BUTTON_YES ) + if (response == 0 + || response == GTK_RESPONSE_YES ) { if ( Write_Playlist(playlist_name) == FALSE ) { // Writing fails... msg = g_strdup_printf(_("Can't write playlist file '%s'!\n(%s)"),playlist_name_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(WritePlaylistWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); }else { msg = g_strdup_printf(_("Written playlist file '%s'"),playlist_name_utf8); - //msgbox = msg_box_new(_("Information..."),msg,GTK_STOCK_DIALOG_INFO,BUTTON_OK,0); + /*msgbox = msg_box_new(_("Information..."), + GTK_WINDOW(WritePlaylistWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_INFO, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); + gtk_widget_destroy(msgbox);*/ Statusbar_Message(msg,TRUE); } g_free(msg); } g_free(playlist_name_utf8); + g_free(playlist_basename_utf8); g_free(playlist_name); } @@ -1806,7 +1757,7 @@ gboolean Write_Playlist (gchar *playlist_name) if ((file = fopen(playlist_name,"wb")) == NULL) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),playlist_name_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),playlist_name_utf8,g_strerror(errno)); g_free(playlist_name_utf8); return FALSE; } @@ -2779,12 +2730,12 @@ void Open_Load_Filename_Window (void) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(FileToLoadCombo)->child),path); // the 'changed' signal is attached below to enable/disable the button to load // Button 'browse' - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File), G_OBJECT(GTK_BIN(FileToLoadCombo)->child)); // Button 'load' // the signal attached to this button, to load the file, is placed after the LoadFileContentList definition - ButtonLoad = Create_Button_With_Icon_And_Label("easytag-add",_(" Load ")); + ButtonLoad = Create_Button_With_Icon_And_Label(GTK_STOCK_REVERT_TO_SAVED,_(" Load ")); //ButtonLoad = gtk_button_new_with_label(_(" Load ")); gtk_box_pack_start(GTK_BOX(hbox),ButtonLoad,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(GTK_BIN(FileToLoadCombo)->child),"changed", G_CALLBACK(Button_Load_Set_Sensivity), G_OBJECT(ButtonLoad)); @@ -3165,7 +3116,7 @@ void Load_File_Content (GtkWidget *entry) if ( (file=fopen(filename,"r"))==0 ) { - Log_Print(_("Can't open file '%s' (%s)"),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't open file '%s' (%s)"),filename_utf8,g_strerror(errno)); g_free(filename); return; } @@ -3179,13 +3130,14 @@ void Load_File_Content (GtkWidget *entry) buffer[strlen(buffer)-1]='\0'; text = &buffer[0]; - if (g_utf8_validate(text, -1, NULL)) + /*if (g_utf8_validate(text, -1, NULL)) { valid = g_strdup(buffer); } else { valid = convert_to_utf8(text); - } + }*/ + valid = Try_To_Validate_Utf8_String(text); gtk_list_store_append(LoadFileContentListModel, &iter); gtk_list_store_set(LoadFileContentListModel, &iter, diff --git a/src/misc.h b/src/misc.h index 2fbadde..2b0c582 100755 --- a/src/misc.h +++ b/src/misc.h @@ -56,7 +56,6 @@ GtkWidget *LoadFileRunScanner; /* * Create Pixmaps, buttons... */ -GtkWidget *Create_Button_With_Pixmap (guint button_type); GtkWidget *Create_Pixmap_Icon_With_Event_Box (const gchar *pixmap_name); GtkWidget *Create_Button_With_Icon_And_Label (const gchar *pixmap_name, gchar *label); GtkWidget *Create_Xpm_Image (const char **xpm_name); diff --git a/src/mp4_header.c b/src/mp4_header.c index 0ba1449..2648093 100755 --- a/src/mp4_header.c +++ b/src/mp4_header.c @@ -208,7 +208,7 @@ gboolean Mp4_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) { gchar *filename_utf8 = filename_to_display(filename); //g_print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); g_free(filename_utf8); return FALSE; } @@ -217,7 +217,7 @@ gboolean Mp4_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) if( MP4GetNumberOfTracks(file,MP4_AUDIO_TRACK_TYPE,0) < 1 ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,("Contains no audio track")); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,("Contains no audio track")); MP4Close(file); g_free(filename_utf8); return FALSE; diff --git a/src/mp4_tag.c b/src/mp4_tag.c old mode 100755 new mode 100644 index 86b4cff..ab2bdde --- a/src/mp4_tag.c +++ b/src/mp4_tag.c @@ -84,6 +84,7 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) uint16_t disk, disktotal; u_int8_t *coverArt; u_int32_t coverSize; + Picture *prev_pic = NULL; if (!filename || !FileTag) return FALSE; @@ -91,7 +92,7 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) if ( (file=fopen(filename,"r"))==NULL ) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -102,7 +103,7 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) if (mp4file == MP4_INVALID_FILE_HANDLE) { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); g_free(filename_utf8); return FALSE; } @@ -176,7 +177,6 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) MP4GetMetadataTool(mp4file, &FileTag->encoded_by); /* Unimplemented - Tempo / BPM MP4GetMetadataTempo(file, &string) */ @@ -184,16 +184,28 @@ gboolean Mp4tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) /*********** * Picture * ***********/ - // There is only one picture! +#ifdef NEWMP4 + // There version can handle multiple pictures! + // Version 1.6 of libmp4v2 introduces an index argument for MP4GetMetadataCoverart + for (i = 0; (MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize,i )); i++) +#else + // There version handle only one picture! if ( MP4GetMetadataCoverArt( mp4file, &coverArt, &coverSize ) ) +#endif { - Picture *pic = Picture_Allocate(); + Picture *pic; + + pic = Picture_Allocate(); + if (!prev_pic) + FileTag->picture = pic; + else + prev_pic->next = pic; + prev_pic = pic; + pic->size = coverSize; pic->data = coverArt; pic->type = PICTURE_TYPE_FRONT_COVER; pic->description = NULL; - - FileTag->picture = pic; } @@ -231,7 +243,7 @@ gboolean Mp4tag_Write_File_Tag (ET_File *ETFile) /* Test to know if we can write into the file */ if ( (file=fopen(filename,"r+"))==NULL ) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); return FALSE; } fclose(file); @@ -240,7 +252,7 @@ gboolean Mp4tag_Write_File_Tag (ET_File *ETFile) mp4file = MP4Modify(filename,0,0); if (mp4file == MP4_INVALID_FILE_HANDLE) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,_("MP4 format invalid")); return FALSE; } @@ -405,6 +417,7 @@ gboolean Mp4tag_Write_File_Tag (ET_File *ETFile) * Picture * ***********/ { + // Can handle only one picture... Picture *pic; //MP4DeleteMetadataCoverArt(mp4file); diff --git a/src/mpeg_header.c b/src/mpeg_header.c index 1c9400d..82edd99 100755 --- a/src/mpeg_header.c +++ b/src/mpeg_header.c @@ -206,7 +206,7 @@ gboolean Mpeg_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) }else { gchar *filename_utf8 = filename_to_display(filename); - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } diff --git a/src/msgbox.c b/src/msgbox.c old mode 100644 new mode 100755 index f9a8cb7..82953f9 --- a/src/msgbox.c +++ b/src/msgbox.c @@ -32,281 +32,101 @@ #include "setting.h" -static void msg_box_class_init (MsgBoxClass *class); -static void msg_box_init (MsgBox *mb); +GtkWidget *msg_box_new (gchar *title, GtkWindow *parent, GtkWidget **check_button, GtkDialogFlags flags, gchar *message, const gchar *icon, ...); -static void msg_box_show (GtkWidget *widget); -static gint msg_box_delete_event (GtkWidget *widget, GdkEventAny *event); -static void msg_box_button_clicked (GtkButton *button, gpointer data); -void check_button_toggled (GtkCheckButton *checkbutton, gpointer data); - - -static GtkDialogClass *parent_klass = NULL; - - -GType msg_box_get_type(void) -{ - static GType mb_type = 0; - - if (!mb_type) - { - GTypeInfo mb_info = - { - sizeof(MsgBoxClass), - NULL, - NULL, - (GClassInitFunc) msg_box_class_init, - NULL, - NULL, - sizeof(MsgBox), - 0, - (GInstanceInitFunc) msg_box_init - }; - mb_type = g_type_register_static(GTK_TYPE_DIALOG, "MsgBox", &mb_info, 0); - } - return mb_type; -} - - -static void msg_box_button_clicked (GtkButton *button, gpointer data) -{ - MsgBox *mb; - - g_return_if_fail( (mb = MSG_BOX(data)) ); - - mb->button_clicked = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button),"button_value")); - - if (gtk_main_level()>1) - gtk_main_quit(); -} - - -static void msg_box_class_init (MsgBoxClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GtkDialogClass *dialog_class; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - dialog_class = (GtkDialogClass*) class; - - parent_klass = gtk_type_class(gtk_dialog_get_type()); - - object_class->destroy = msg_box_destroy; - widget_class->delete_event = msg_box_delete_event; - widget_class->show = msg_box_show; -} - - -static void msg_box_init (MsgBox *mb) -{ - g_return_if_fail(mb != NULL); - g_return_if_fail(IS_MSG_BOX(mb)); - - mb->icon = -1; - mb->check_button = NULL; - mb->check_button_state = 0; - -} /* - * Create a new message box + * Create a new message box to display a message and a check button (for some actions). + * The first button passed as parameter will have the focus */ -GtkWidget *msg_box_new (gchar *title, gchar *message, const gchar *stock_id, - /* Put all the buttons to display, and terminate by 0 */ - ...) +GtkWidget *msg_box_new (gchar *title, + GtkWindow *parent, + GtkWidget **check_button, + GtkDialogFlags flags, + gchar *message, + const gchar *stock_id, + /* Put all the buttons to display, and terminate by 0 */ + ...) { - MsgBox *mb; + GtkWidget *dialog; GtkWidget *Table; GtkWidget *Pixmap; GtkWidget *Label; - GtkWidget *ButtonBox; - GtkWidget *Button = NULL; - va_list cursor; - gint cursor_value; - + GtkWidget *Button; + gboolean first_button = TRUE; + va_list args; + g_return_val_if_fail(message!=NULL, NULL); + + //dialog = GTK_DIALOG(gtk_dialog_new_empty (title, parent, flags)); + dialog = gtk_dialog_new_with_buttons(title,parent,flags,NULL); - mb = MSG_BOX(g_object_new(TYPE_MSG_BOX, NULL)); - //mb->icon = icon; - mb->check_button = gtk_check_button_new_with_label(_("Repeat action for the rest of the files")); /* Can save or cancel all files */ - - /* Window configuration */ - gtk_window_set_title(GTK_WINDOW(mb),title); - gtk_window_set_transient_for(GTK_WINDOW(mb),GTK_WINDOW(MainWindow)); - gtk_window_set_modal(GTK_WINDOW(mb),TRUE); - + // Position of the dialog window if (MESSAGE_BOX_POSITION_NONE) - gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_NONE); + gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_NONE); else if (MESSAGE_BOX_POSITION_CENTER) - gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_CENTER); + gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER); else if (MESSAGE_BOX_POSITION_MOUSE) - gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_MOUSE); + gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_MOUSE); else if (MESSAGE_BOX_POSITION_CENTER_ON_PARENT) - gtk_window_set_position(GTK_WINDOW(mb),GTK_WIN_POS_CENTER_ON_PARENT); + gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER_ON_PARENT); + - - /* Table to put: the pixmap, the message and the check button */ + // Table to insert: the pixmap, the message and the check button Table = gtk_table_new(2,2,FALSE); - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(mb)->vbox),Table,TRUE,TRUE,0); + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),Table,TRUE,TRUE,0); gtk_container_set_border_width(GTK_CONTAINER(Table),4); gtk_widget_show(Table); - /* The Pixmap */ + // The pixmap Pixmap = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_DIALOG); gtk_table_attach_defaults(GTK_TABLE(Table),Pixmap,0,1,0,1); //gtk_table_attach(GTK_TABLE(Table),Pixmap,0,1,0,1,GTK_FILL,GTK_FILL,0,0); gtk_misc_set_padding(GTK_MISC(Pixmap),6,6); gtk_widget_show(Pixmap); - /* The Message */ - Label = gtk_label_new (message); + // The message + Label = gtk_label_new(message); gtk_table_attach_defaults(GTK_TABLE(Table),Label,1,2,0,1); gtk_misc_set_padding(GTK_MISC(Label),6,6); gtk_label_set_justify(GTK_LABEL(Label),GTK_JUSTIFY_CENTER); //gtk_label_set_line_wrap(GTK_LABEL(Label),TRUE); gtk_widget_show(Label); - /* The Check Button */ - gtk_table_attach_defaults(GTK_TABLE(Table),mb->check_button,0,2,1,2); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mb->check_button),mb->check_button_state); - g_signal_connect(G_OBJECT(mb->check_button),"toggled",G_CALLBACK(check_button_toggled),mb); - gtk_widget_show(mb->check_button); - - - /* Buttons */ - ButtonBox = gtk_hbutton_box_new(); - gtk_box_set_spacing(GTK_BOX(ButtonBox), 15); - gtk_button_box_set_layout(GTK_BUTTON_BOX(ButtonBox), GTK_BUTTONBOX_END); - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(mb)->action_area),ButtonBox); + // The check button + if (check_button) + { + *check_button = gtk_check_button_new_with_label(_("Repeat action for the rest of the files")); // Can save or cancel all files + gtk_table_attach_defaults(GTK_TABLE(Table),*check_button,0,2,1,2); + } - /* Read buttons from variable arguments */ - va_start(cursor,stock_id); - while ( (cursor_value = va_arg(cursor,gint)) != 0 ) + // Read buttons from variable arguments + va_start(args, stock_id); + for (;;) { - Button = Create_Button_With_Pixmap(cursor_value); - gtk_container_add(GTK_CONTAINER(ButtonBox),Button); + const gchar *button_text = NULL; + gint response_id = 0; + + button_text = va_arg (args, const gchar *); + if (button_text == NULL) + break; + response_id = va_arg (args, gint); + if (response_id == 0) + break; + + Button = gtk_dialog_add_button(GTK_DIALOG(dialog),button_text,response_id); GTK_WIDGET_SET_FLAGS(Button,GTK_CAN_DEFAULT); - g_signal_connect(G_OBJECT(Button),"destroy", G_CALLBACK(gtk_widget_destroyed),&Button); - g_signal_connect(G_OBJECT(Button),"clicked", G_CALLBACK(msg_box_button_clicked),mb); - g_object_set_data(G_OBJECT(Button),"button_value", GINT_TO_POINTER(cursor_value)); + + // To focus to the first button + if (first_button) + gtk_widget_grab_default(Button); + first_button = FALSE; } - va_end(cursor); - gtk_widget_grab_default(Button); - gtk_widget_show_all(ButtonBox); - - return GTK_WIDGET(mb); -} - - -void msg_box_destroy (GtkObject *object) -{ - MsgBox *mb; - - g_return_if_fail( (mb = MSG_BOX(object)) ); - - if (mb->check_button) - gtk_widget_destroy(mb->check_button); - -/* FIXME: causes segfault in some cases (when callin gtk_widget_destroy(msgbox) ) */ -/* if (GTK_OBJECT_CLASS(parent_klass)->destroy) - * (* GTK_OBJECT_CLASS(parent_klass)->destroy) (object); - */ -} - - -static gint msg_box_delete_event (GtkWidget *widget, GdkEventAny *event) -{ - MsgBox *mb; - - g_return_val_if_fail((mb = MSG_BOX(widget)), FALSE); - - /* If the window is closed whitout pressing a button, we return -1 */ - mb->button_clicked = -1; - - if (gtk_main_level()>1) - gtk_main_quit(); - - return TRUE; -} - - -/* - * "Run" and show the msgbox, and send which button was pressed (or not a button) - */ -gint msg_box_run (MsgBox *msgbox) -{ - MsgBox *mb; - - g_return_val_if_fail((mb = MSG_BOX(msgbox)),0); - - gtk_widget_show(GTK_WIDGET(mb)); - gtk_main(); - gtk_widget_hide(GTK_WIDGET(mb)); - gtk_window_set_modal(GTK_WINDOW(mb),FALSE); - - return (MSG_BOX(mb)->button_clicked); -} - - -static void msg_box_show (GtkWidget *widget) -{ - if (GTK_WIDGET_CLASS(parent_klass)->show) - (* (GTK_WIDGET_CLASS(parent_klass)->show))(widget); -} - - -/* - * Callback when the check_button is pressed - */ -void check_button_toggled (GtkCheckButton *checkbutton, gpointer data) -{ - MsgBox *mb; - - g_return_if_fail((mb = MSG_BOX(data))); - - mb->check_button_state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton)); -} - - -/* - * Set the check_button to the 'is_active' state - */ -void msg_box_check_button_set_active (MsgBox *msgbox, gboolean is_active) -{ - MsgBox *mb; - - g_return_if_fail((mb = MSG_BOX(msgbox))); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mb->check_button),is_active); - mb->check_button_state = is_active; -} - - -/* - * Get state of the check_button - */ -gboolean msg_box_check_button_get_active (MsgBox *msgbox) -{ - MsgBox *mb; - - g_return_val_if_fail((mb = MSG_BOX(msgbox)),FALSE); - - return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(mb->check_button)); -} - - -/* - * Hide the check_button. - */ -void msg_box_hide_check_button (MsgBox *msgbox) -{ - MsgBox *mb; - - g_return_if_fail((mb = MSG_BOX(msgbox))); - - gtk_widget_hide(mb->check_button); + va_end(args); + + gtk_widget_show_all(dialog); + + return GTK_WIDGET(dialog); } diff --git a/src/msgbox.h b/src/msgbox.h old mode 100644 new mode 100755 index 6b5d663..b3dfaf2 --- a/src/msgbox.h +++ b/src/msgbox.h @@ -23,44 +23,10 @@ #define __MSGBOX_H__ -#include - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -#define TYPE_MSG_BOX (msg_box_get_type()) -#define MSG_BOX(obj) (GTK_CHECK_CAST((obj), TYPE_MSG_BOX, MsgBox)) -#define MSG_BOX_CLASS(klass) (GTK_CHECK_CLASS_CAST((klass), TYPE_MSG_BOX, MsgBoxClass)) -#define IS_MSG_BOX(obj) (GTK_CHECK_TYPE((obj), TYPE_MSG_BOX)) -#define IS_MSG_BOX_CLASS(klass) (GTK_CHECK_CLASS_TYPE((klass), TYPE_MSG_BOX)) - - -typedef struct _MsgBox MsgBox; -typedef struct _MsgBoxClass MsgBoxClass; - -struct _MsgBox -{ - GtkDialog dialog; - - gint icon; - - /* Check button */ - GtkWidget *check_button; - gint check_button_state; - - /* To know which button have been pressed */ - gint button_clicked; -}; - -struct _MsgBoxClass -{ - GtkDialogClass parent_class; -}; +#include +/* enum Button_Type { BUTTON_OK = 1<<0 , @@ -83,21 +49,11 @@ enum Message_Type MSG_QUESTION = 1<<2, MSG_WARNING = 1<<3 }; +*/ -GType msg_box_get_type(void); - -GtkWidget *msg_box_new (gchar *title, gchar *message, const gchar *icon, ...); -gint msg_box_run (MsgBox *msgbox); -void msg_box_destroy (GtkObject *object); -void msg_box_check_button_set_active (MsgBox *msgbox, gboolean is_active); -gboolean msg_box_check_button_get_active (MsgBox *msgbox); -void msg_box_hide_check_button (MsgBox *msgbox); +GtkWidget *msg_box_new (gchar *title, GtkWindow *parent, GtkWidget **check_button, GtkDialogFlags flags, gchar *message, const gchar *icon, ...); -#ifdef __cplusplus -}; -#endif /* __cplusplus */ - #endif /* __MSGBOX_H__ */ diff --git a/src/ogg_header.c b/src/ogg_header.c index 61d7a76..69634f7 100755 --- a/src/ogg_header.c +++ b/src/ogg_header.c @@ -79,7 +79,7 @@ gboolean Ogg_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) if ( (file=fopen(filename,"rb"))==NULL ) // Warning : it is important to open the file in binary mode! (to get header informations under Win32) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -97,7 +97,7 @@ gboolean Ogg_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) bitrate_lower = vi->bitrate_nominal; // (b/s) Specifies the lower limit in a VBR bitstream. }else { - Log_Print(_("Ogg Vorbis: The specified bitstream does not exist or the " + Log_Print(LOG_ERROR,_("Ogg Vorbis: The specified bitstream does not exist or the " "file has been initialized improperly (file: '%s')."),filename_utf8); } @@ -109,12 +109,12 @@ gboolean Ogg_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) /***{ // Test for displaying comments vorbis_comment *vc = ov_comment(&vf,-1); - Log_Print(">>> %s",filename_utf8); - Log_Print("Nbr comments : %d",vc->comments); - Log_Print("Vendor : %s",vc->vendor); + Log_Print(LOG_OK,">>> %s",filename_utf8); + Log_Print(LOG_OK,"Nbr comments : %d",vc->comments); + Log_Print(LOG_OK,"Vendor : %s",vc->vendor); char **ptr = vc->user_comments; - while(*ptr){ - Log_Print("> %s",*ptr); + while(*ptr){ + Log_Print(LOG_OK,"> %s",*ptr); ++ptr; } }***/ @@ -128,19 +128,19 @@ gboolean Ogg_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) switch (ret) { case OV_EREAD: - Log_Print(_("Ogg Vorbis: Read from media returned an error (file: '%s')."),filename_utf8); + Log_Print(LOG_ERROR,_("Ogg Vorbis: Read from media returned an error (file: '%s')."),filename_utf8); break; case OV_ENOTVORBIS: - Log_Print(_("Ogg Vorbis: Bitstream is not Vorbis data (file: '%s')."),filename_utf8); + Log_Print(LOG_ERROR,_("Ogg Vorbis: Bitstream is not Vorbis data (file: '%s')."),filename_utf8); break; case OV_EVERSION: - Log_Print(_("Ogg Vorbis: Vorbis version mismatch (file: '%s')."),filename_utf8); + Log_Print(LOG_ERROR,_("Ogg Vorbis: Vorbis version mismatch (file: '%s')."),filename_utf8); break; case OV_EBADHEADER: - Log_Print(_("Ogg Vorbis: Invalid Vorbis bitstream header (file: '%s')."),filename_utf8); + Log_Print(LOG_ERROR,_("Ogg Vorbis: Invalid Vorbis bitstream header (file: '%s')."),filename_utf8); break; case OV_EFAULT: - Log_Print(_("Ogg Vorbis: Internal logic fault, indicates a bug or heap/stack corruption (file: '%s')."),filename_utf8); + Log_Print(LOG_ERROR,_("Ogg Vorbis: Internal logic fault, indicates a bug or heap/stack corruption (file: '%s')."),filename_utf8); break; default: break; @@ -183,7 +183,7 @@ gboolean Speex_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) if ( (file=fopen(filename,"rb"))==NULL ) // Warning : it is important to open the file in binary mode! (to get header informations under Win32) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -192,7 +192,7 @@ gboolean Speex_Header_Read_File_Info (gchar *filename, ET_File_Info *ETFileInfo) state = vcedit_new_state(); // Allocate memory for 'state' if ( vcedit_open(state,file) < 0 ) { - Log_Print(_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); + Log_Print(LOG_ERROR,_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); fclose(file); g_free(filename_utf8); vcedit_clear(state); diff --git a/src/ogg_tag.c b/src/ogg_tag.c old mode 100755 new mode 100644 index ce13c48..bf6e365 --- a/src/ogg_tag.c +++ b/src/ogg_tag.c @@ -38,6 +38,8 @@ #include "et_core.h" #include "log.h" #include "misc.h" +#include "base64.h" +#include "picture.h" #include "setting.h" #include "charset.h" @@ -127,6 +129,7 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) gchar *string2 = NULL; gchar *filename_utf8 = filename_to_display(filename); guint field_num, i; + Picture *prev_pic = NULL; if (!filename || !FileTag) @@ -136,7 +139,7 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) if ( (file=fopen(filename,"rb")) == NULL ) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); g_free(filename_utf8); return FALSE; } @@ -160,7 +163,7 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) id3v2size = 10 + ( (long)(tmp_id3[3]) | ((long)(tmp_id3[2]) << 7) | ((long)(tmp_id3[1]) << 14) | ((long)(tmp_id3[0]) << 21) ); fseek(file, id3v2size, SEEK_SET); - Log_Print(_("Warning : The Ogg Vorbis file '%s' contains an ID3v2 tag."),filename_utf8); + Log_Print(LOG_ERROR,_("Warning : The Ogg Vorbis file '%s' contains an ID3v2 tag."),filename_utf8); }else { fseek(file, 0L, SEEK_SET); @@ -178,7 +181,7 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) state = vcedit_new_state(); // Allocate memory for 'state' if ( vcedit_open(state,file) < 0 ) { - Log_Print(_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); + Log_Print(LOG_ERROR,_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); ogg_error_msg = vcedit_error(state); fclose(file); g_free(filename_utf8); @@ -471,27 +474,82 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag) } + /************** + * Picture * + **************/ + /* Non officials tags used for picture informations: + * - COVERART : contains the picture data + * - COVERARTTYPE : cover front, ... + * - COVERARTDESCRIPTION : information set by user + * - COVERARTMIME : image/jpeg or image/png (written only) + */ + field_num = 0; + while ( (string = vorbis_comment_query(vc,"COVERART",field_num++)) != NULL ) + { + gchar *data; + gint size; + Picture *pic; + + pic = Picture_Allocate(); + if (!prev_pic) + FileTag->picture = pic; + else + prev_pic->next = pic; + prev_pic = pic; + + pic->data = NULL; + + // Decode picture data + data = g_strdup(string); + size = base64_decode(string, data); + if ( data && (pic->data = g_memdup(data, size)) ) + pic->size = size; + g_free(data); + + if ( (string = vorbis_comment_query(vc,"COVERARTTYPE",field_num-1)) != NULL ) + { + pic->type = atoi(string); + } + + if ( (string = vorbis_comment_query(vc,"COVERARTDESCRIPTION",field_num-1)) != NULL ) + { + pic->description = g_strdup(string); + } + + //if ((string = vorbis_comment_query(vc,"COVERTARTMIME",field_num-1)) != NULL ) + //{ + // pic->description = g_strdup(string); + //} + + } + + /*************************** * Save unsupported fields * ***************************/ for (i=0;i<(guint)vc->comments;i++) { - if ( strncasecmp(vc->user_comments[i],"TITLE=", 6) != 0 - && strncasecmp(vc->user_comments[i],"ARTIST=", 7) != 0 - && strncasecmp(vc->user_comments[i],"ALBUM=", 6) != 0 - && strncasecmp(vc->user_comments[i],"DISCNUMBER=", 11) != 0 - && strncasecmp(vc->user_comments[i],"DATE=", 5) != 0 - && strncasecmp(vc->user_comments[i],"TRACKNUMBER=",12) != 0 - && strncasecmp(vc->user_comments[i],"TRACKTOTAL=", 11) != 0 - && strncasecmp(vc->user_comments[i],"GENRE=", 6) != 0 - && strncasecmp(vc->user_comments[i],"DESCRIPTION=",12) != 0 - && strncasecmp(vc->user_comments[i],"COMMENT=", 8) != 0 - && strncasecmp(vc->user_comments[i],"=", 1) != 0 - && strncasecmp(vc->user_comments[i],"COMPOSER=", 9) != 0 - && strncasecmp(vc->user_comments[i],"PERFORMER=", 10) != 0 - && strncasecmp(vc->user_comments[i],"COPYRIGHT=", 10) != 0 - && strncasecmp(vc->user_comments[i],"LICENSE=", 8) != 0 - && strncasecmp(vc->user_comments[i],"ENCODED-BY=", 11) != 0 ) + if ( strncasecmp(vc->user_comments[i],"TITLE=", 6) != 0 + && strncasecmp(vc->user_comments[i],"ARTIST=", 7) != 0 + && strncasecmp(vc->user_comments[i],"ALBUM=", 6) != 0 + && strncasecmp(vc->user_comments[i],"DISCNUMBER=", 11) != 0 + && strncasecmp(vc->user_comments[i],"DATE=", 5) != 0 + && strncasecmp(vc->user_comments[i],"TRACKNUMBER=", 12) != 0 + && strncasecmp(vc->user_comments[i],"TRACKTOTAL=", 11) != 0 + && strncasecmp(vc->user_comments[i],"GENRE=", 6) != 0 + && strncasecmp(vc->user_comments[i],"DESCRIPTION=", 12) != 0 + && strncasecmp(vc->user_comments[i],"COMMENT=", 8) != 0 + && strncasecmp(vc->user_comments[i],"=", 1) != 0 + && strncasecmp(vc->user_comments[i],"COMPOSER=", 9) != 0 + && strncasecmp(vc->user_comments[i],"PERFORMER=", 10) != 0 + && strncasecmp(vc->user_comments[i],"COPYRIGHT=", 10) != 0 + && strncasecmp(vc->user_comments[i],"LICENSE=", 8) != 0 + && strncasecmp(vc->user_comments[i],"ENCODED-BY=", 11) != 0 + && strncasecmp(vc->user_comments[i],"COVERART=", 9) != 0 + && strncasecmp(vc->user_comments[i],"COVERARTTYPE=", 13) != 0 + && strncasecmp(vc->user_comments[i],"COVERARTMIME=", 13) != 0 + && strncasecmp(vc->user_comments[i],"COVERARTDESCRIPTION=",20) != 0 + ) { FileTag->other = g_list_append(FileTag->other, Try_To_Validate_Utf8_String(vc->user_comments[i])); @@ -518,6 +576,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile) vorbis_comment *vc; gchar *string; GList *list; + Picture *pic; if (!ETFile || !ETFile->FileTag) return FALSE; @@ -530,7 +589,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile) /* Test to know if we can write into the file */ if ( (file_in=fopen(filename,"rb"))==NULL ) { - Log_Print(_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR while opening file: '%s' (%s)."),filename_utf8,g_strerror(errno)); return FALSE; } @@ -570,7 +629,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile) state = vcedit_new_state(); // Allocate memory for 'state' if ( vcedit_open(state,file_in) < 0 ) { - Log_Print(_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); + Log_Print(LOG_ERROR,_("ERROR: Failed to open file: '%s' as vorbis (%s)."),filename_utf8,vcedit_error(state)); ogg_error_msg = vcedit_error(state); fclose(file_in); vcedit_clear(state); @@ -732,6 +791,48 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile) vorbis_comment_add(vc,string); g_free(string); } + + + /*********** + * Picture * + ***********/ + pic = FileTag->picture; + while (pic) + { + if (pic->data) + { + gchar *data_encoded = NULL; + gint size; + Picture_Format format = Picture_Format_From_Data(pic); + + string = g_strdup_printf("COVERARTMIME=%s",Picture_Mime_Type_String(format)); + vorbis_comment_add(vc,string); + g_free(string); + + if (pic->type) + { + string = g_strdup_printf("COVERARTTYPE=%d",pic->type); + vorbis_comment_add(vc,string); + g_free(string); + } + + if (pic->description) + { + string = g_strdup_printf("COVERARTDESCRIPTION=%s",pic->description); + vorbis_comment_add(vc,string); + g_free(string); + } + + size = base64_encode(pic->data, pic->size, &data_encoded); + string = g_strdup_printf("COVERART=%s",data_encoded); + vorbis_comment_add(vc,string); + g_free(data_encoded); + g_free(string); + } + + pic = pic->next; + } + /************************** @@ -749,14 +850,14 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile) if ( Ogg_Tag_Write_File(file_in,filename,state) == FALSE ) { ogg_error_msg = vcedit_error(state); - Log_Print(_("ERROR: Failed to write comments to file '%s' (%s)."),filename_utf8,ogg_error_msg == NULL ? "" : ogg_error_msg); + Log_Print(LOG_ERROR,_("ERROR: Failed to write comments to file '%s' (%s)."),filename_utf8,ogg_error_msg == NULL ? "" : ogg_error_msg); vcedit_clear(state); return FALSE; }else { basename_utf8 = g_path_get_basename(filename_utf8); - Log_Print(_("Written tag of '%s'"),basename_utf8); + Log_Print(LOG_OK,_("Written tag of '%s'"),basename_utf8); vcedit_clear(state); } diff --git a/src/picture.c b/src/picture.c index 4f9edae..6ccfd14 100644 --- a/src/picture.c +++ b/src/picture.c @@ -66,12 +66,12 @@ void Picture_Properties_Button_Clicked (GObject *object); void Picture_Save_Button_Clicked (GObject *object); void Picture_Clear_Button_Clicked (GObject *object); -gint Picture_Format (Picture *pic); -const gchar *Picture_Format_String (gint format); -const gchar *Picture_Type_String (gint type); -gchar *Picture_Info (Picture *pic); -void PictureEntry_Clear (void); -void PictureEntry_Update (Picture *pic, gint select); +Picture_Format Picture_Format_From_Data (Picture *pic); +const gchar *Picture_Format_String (Picture_Format format); +const gchar *Picture_Type_String (Picture_Type type); +gchar *Picture_Info (Picture *pic); +void PictureEntry_Clear (void); +void PictureEntry_Update (Picture *pic, gboolean select_it); Picture *Picture_Allocate (void); Picture *Picture_Copy_One (const Picture *pic); @@ -126,7 +126,7 @@ void Tag_Area_Picture_Drag_Data (GtkWidget *widget, GdkDragContext *dc, /*pic = Picture_Load_File_Data(filename); g_free(filename); if (pic) - PictureEntry_Update(pic, 1);*/ + PictureEntry_Update(pic, TRUE);*/ } uri++; } @@ -221,6 +221,7 @@ void Picture_Load_Filename (gchar *filename, gpointer user_data) // Behaviour following the tag type... switch (ETCore->ETFileDisplayed->ETFileDescription->TagType) { + // Only one picture supported case MP4_TAG: { pic->type = PICTURE_TYPE_FRONT_COVER; @@ -255,7 +256,7 @@ void Picture_Load_Filename (gchar *filename, gpointer user_data) } } - PictureEntry_Update(pic, 1); + PictureEntry_Update(pic, TRUE); // FIXME: Call Picture_Free(pic) here? It seems PictureEntry_Update makes copies of pic. //Picture_Free(pic); @@ -271,7 +272,7 @@ void Picture_Load_Filename (gchar *filename, gpointer user_data) } /* - * To add an image in the list -> call a FileSelectionWindow + * To add a picture in the list -> call a FileSelectionWindow */ void Picture_Add_Button_Clicked (GObject *object) { @@ -279,6 +280,7 @@ void Picture_Add_Button_Clicked (GObject *object) GtkFileFilter *filter; GtkWindow *parent_window = NULL; static gchar *init_dir = NULL; + gint response; if (!PictureEntryView) return; @@ -294,7 +296,7 @@ void Picture_Add_Button_Clicked (GObject *object) parent_window, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_OK, + GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL); // Add files filters @@ -355,7 +357,8 @@ void Picture_Add_Button_Clicked (GObject *object) if (init_dir) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(FileSelectionWindow),init_dir); - if (gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)) == GTK_RESPONSE_OK) + response = gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)); + if (response == GTK_RESPONSE_OK) { GtkTreeSelection *selection; GSList *list; @@ -375,6 +378,9 @@ void Picture_Add_Button_Clicked (GObject *object) } +/* + * Open the window to select and type the picture properties + */ void Picture_Properties_Button_Clicked (GObject *object) { GtkWidget *ScrollWindowPictureTypes, *PictureTypesWindow; @@ -387,32 +393,9 @@ void Picture_Properties_Button_Clicked (GObject *object) GtkTreeModel *model; GtkWindow *parent_window = NULL; GList *selection_list = NULL; - guint i; gint selection_nbr, selection_i = 1; - gint picture_types[] = - { - PICTURE_TYPE_OTHER, - PICTURE_TYPE_FILE_ICON, - PICTURE_TYPE_OTHER_FILE_ICON, - PICTURE_TYPE_FRONT_COVER, - PICTURE_TYPE_BACK_COVER, - PICTURE_TYPE_LEAFLET_PAGE, - PICTURE_TYPE_MEDIA, - PICTURE_TYPE_LEAD_ARTIST_LEAD_PERFORMER_SOLOIST, - PICTURE_TYPE_ARTIST_PERFORMER, - PICTURE_TYPE_CONDUCTOR, - PICTURE_TYPE_BAND_ORCHESTRA, - PICTURE_TYPE_COMPOSER, - PICTURE_TYPE_LYRICIST_TEXT_WRITER, - PICTURE_TYPE_RECORDING_LOCATION, - PICTURE_TYPE_DURING_RECORDING, - PICTURE_TYPE_DURING_PERFORMANCE, - PICTURE_TYPE_MOVIDE_VIDEO_SCREEN_CAPTURE, - PICTURE_TYPE_A_BRIGHT_COLOURED_FISH, - PICTURE_TYPE_ILLUSTRATION, - PICTURE_TYPE_BAND_ARTIST_LOGOTYPE, - PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE - }; + gint response; + Picture_Type pic_type; if (!PictureEntryView) return; @@ -447,7 +430,7 @@ void Picture_Properties_Button_Clicked (GObject *object) parent_window, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); g_free(title); @@ -502,17 +485,17 @@ void Picture_Properties_Button_Clicked (GObject *object) default: { // Load pictures types - for (i = 0; i < sizeof(picture_types)/sizeof(picture_types[0]); i++) + for (pic_type = PICTURE_TYPE_OTHER; pic_type < PICTURE_TYPE_UNDEFINED; pic_type++) { GtkTreeIter itertype; gtk_list_store_append(store, &itertype); gtk_list_store_set(store, &itertype, - PICTURE_TYPE_COLUMN_TEXT, _(Picture_Type_String(picture_types[i])), - PICTURE_TYPE_COLUMN_TYPE_CODE, picture_types[i], + PICTURE_TYPE_COLUMN_TEXT, _(Picture_Type_String(pic_type)), + PICTURE_TYPE_COLUMN_TYPE_CODE, pic_type, -1); // Line to select by default - if (pic->type == picture_types[i]) + if (pic->type == pic_type) type_iter_to_select = itertype; } break; @@ -528,7 +511,7 @@ void Picture_Properties_Button_Clicked (GObject *object) gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(type), rowPath, NULL, FALSE, 0, 0); gtk_tree_path_free(rowPath); - // Description + // Description of the picture label = gtk_label_new(_("Picture Description:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(PictureTypesWindow)->vbox),label,FALSE,FALSE,4); @@ -537,7 +520,7 @@ void Picture_Properties_Button_Clicked (GObject *object) gtk_box_pack_start(GTK_BOX(GTK_DIALOG(PictureTypesWindow)->vbox),desc,FALSE,FALSE,0); if (pic->description) { - gchar *tmp = ET_Utf8_Validate_Full_String(pic->description); + gchar *tmp = Try_To_Validate_Utf8_String(pic->description); gtk_entry_set_text(GTK_ENTRY(desc), tmp); g_free(tmp); } @@ -561,7 +544,8 @@ void Picture_Properties_Button_Clicked (GObject *object) gtk_widget_show_all(PictureTypesWindow); - if (gtk_dialog_run(GTK_DIALOG(PictureTypesWindow)) == GTK_RESPONSE_OK) + response = gtk_dialog_run(GTK_DIALOG(PictureTypesWindow)); + if (response == GTK_RESPONSE_OK) { GtkTreeModel *modeltype; GtkTreeIter itertype; @@ -640,6 +624,7 @@ void Picture_Save_Button_Clicked (GObject *object) Picture *pic; gchar *title; gboolean valid; + gint response; // Get corresponding picture valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path); @@ -651,7 +636,7 @@ void Picture_Save_Button_Clicked (GObject *object) parent_window, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_OK, + GTK_STOCK_SAVE, GTK_RESPONSE_OK, NULL); g_free(title); @@ -692,7 +677,7 @@ void Picture_Save_Button_Clicked (GObject *object) }else { gchar *image_name = NULL; - switch (Picture_Format(pic)) + switch (Picture_Format_From_Data(pic)) { case PICTURE_FORMAT_JPEG : image_name = g_strdup("image_name.jpg"); @@ -708,7 +693,8 @@ void Picture_Save_Button_Clicked (GObject *object) g_free(image_name); } - if (gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)) == GTK_RESPONSE_OK) + response = gtk_dialog_run(GTK_DIALOG(FileSelectionWindow)); + if (response == GTK_RESPONSE_OK) { FILE *file; gchar *filename, *filename_utf8; @@ -725,20 +711,25 @@ void Picture_Save_Button_Clicked (GObject *object) { gchar *msg; GtkWidget *msgbox; - gint button; fclose(file); msg = g_strdup_printf(_("The following file already exists :\n'%s'\n" "Do you want to overwrite?"),filename_utf8); - msgbox = msg_box_new(_("Save file..."),msg, - GTK_STOCK_DIALOG_QUESTION,BUTTON_NO,BUTTON_YES,0); + msgbox = msg_box_new(_("Save file..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_QUESTION, + GTK_STOCK_NO, GTK_RESPONSE_NO, + GTK_STOCK_YES, GTK_RESPONSE_YES, + NULL); g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - button = msg_box_run(MSG_BOX(msgbox)); + response = gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); - if (button == BUTTON_YES) + if (response == GTK_RESPONSE_YES) { Picture_Save_File_Data(pic, filename_utf8); } @@ -757,13 +748,15 @@ void Picture_Save_Button_Clicked (GObject *object) /* FIXME: Possibly use gnome_vfs_get_mime_type_for_buffer. */ -gint Picture_Format (Picture *pic) +Picture_Format Picture_Format_From_Data (Picture *pic) { + // JPEG : "\xff\xd8" if (pic->data && pic->size > 2 && pic->data[0] == 0xff && pic->data[1] == 0xd8) return PICTURE_FORMAT_JPEG; + // PNG : "\x89PNG\x0d\x0a\x1a\x0a" if (pic->data && pic->size > 8 && pic->data[0] == 0x89 && pic->data[1] == 0x50 @@ -774,11 +767,35 @@ gint Picture_Format (Picture *pic) && pic->data[6] == 0x1a && pic->data[7] == 0x0a) return PICTURE_FORMAT_PNG; - + + /*// GIF : "GIF87a" + if (pic->data && pic->size > 6 + && pic->data[0] == 0x47 + && pic->data[1] == 0x49 + && pic->data[2] == 0x46 + && pic->data[3] == 0x38 + && pic->data[4] == 0x37 + && pic->data[5] == 0x61) + return PICTURE_FORMAT_GIF;*/ + return PICTURE_FORMAT_UNKNOWN; } -const gchar *Picture_Format_String (gint format) +const gchar *Picture_Mime_Type_String (Picture_Format format) +{ + switch (format) + { + case PICTURE_FORMAT_JPEG: + return "image/jpeg"; + case PICTURE_FORMAT_PNG: + return "image/png"; + default: + return NULL; + } +} + + +const gchar *Picture_Format_String (Picture_Format format) { switch (format) { @@ -791,7 +808,7 @@ const gchar *Picture_Format_String (gint format) } } -const gchar *Picture_Type_String (gint type) +const gchar *Picture_Type_String (Picture_Type type) { switch (type) { @@ -837,6 +854,8 @@ const gchar *Picture_Type_String (gint type) return _("Band/Artist logotype"); case PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE: return _("Publisher/studio logotype"); + + case PICTURE_TYPE_UNDEFINED: default: return _("Unknown picture type"); } @@ -847,7 +866,7 @@ gchar *Picture_Info (Picture *pic) gchar *format, *desc, *type, *r, *size_str; GString *s; - format = (gchar *)Picture_Format_String(Picture_Format(pic)); + format = (gchar *)Picture_Format_String(Picture_Format_From_Data(pic)); if (pic->description) desc = pic->description; @@ -883,7 +902,7 @@ gchar *Picture_Info (Picture *pic) break; } } - r = ET_Utf8_Validate_Full_String(s->str); + r = Try_To_Validate_Utf8_String(s->str); g_string_free(s, TRUE); // TRUE to free also 's->str'! g_free(size_str); @@ -912,10 +931,11 @@ void PictureEntry_Clear (void) gtk_list_store_clear(picture_store); } -void PictureEntry_Update (Picture *pic, gint select) +void PictureEntry_Update (Picture *pic, gboolean select_it) { GdkPixbufLoader *loader = 0; - + GError *error = NULL; + if (!pic || !PictureEntryView) return; if (!pic->data) @@ -927,11 +947,17 @@ void PictureEntry_Update (Picture *pic, gint select) loader = gdk_pixbuf_loader_new(); if (loader) { - if (gdk_pixbuf_loader_write(loader, pic->data, pic->size, 0)) + if (gdk_pixbuf_loader_write(loader, pic->data, pic->size, &error)) { GtkTreeSelection *selection; GdkPixbuf *pixbuf; + if (!gdk_pixbuf_loader_close(loader, &error)) + { + Log_Print(LOG_ERROR,_("Error with 'loader_close': %s"), error->message); + g_error_free(error); + } + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(PictureEntryView)); pixbuf = gdk_pixbuf_loader_get_pixbuf(loader); @@ -944,9 +970,12 @@ void PictureEntry_Update (Picture *pic, gint select) gint scaled_pixbuf_height; gchar *pic_info; + g_object_ref(pixbuf); + g_object_unref(loader); + // Keep aspect ratio of the picture - pic->width = gdk_pixbuf_get_width (pixbuf); - pic->height = gdk_pixbuf_get_height (pixbuf); + pic->width = gdk_pixbuf_get_width(pixbuf); + pic->height = gdk_pixbuf_get_height(pixbuf); if (pic->width > pic->height) { scaled_pixbuf_width = 96; @@ -967,37 +996,47 @@ void PictureEntry_Update (Picture *pic, gint select) gtk_list_store_append(picture_store, &iter1); pic_info = Picture_Info(pic); gtk_list_store_set(picture_store, &iter1, - PICTURE_COLUMN_PIC, scaled_pixbuf, + PICTURE_COLUMN_PIC, scaled_pixbuf, PICTURE_COLUMN_TEXT, pic_info, PICTURE_COLUMN_DATA, Picture_Copy_One(pic), -1); g_free(pic_info); - if (select) + if (select_it) gtk_tree_selection_select_iter(selection, &iter1); gdk_pixbuf_unref(scaled_pixbuf); }else { GtkWidget *msgbox = NULL; gchar *msg = NULL; - + + g_object_unref(loader); + msg = g_strdup(_("Can't display the picture, as not enough data " "has been read to determine how to create the image buffer.")); - Log_Print("%s",msg); - msgbox = msg_box_new(_("Loading Picture File..."),msg, - GTK_STOCK_DIALOG_ERROR,BUTTON_YES,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); + Log_Print(LOG_ERROR,"%s",msg); + msgbox = msg_box_new(_("Loading Picture File..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); g_free(msg); - msg_box_run(MSG_BOX(msgbox)); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); } + }else + { + Log_Print(LOG_ERROR,_("Error with 'loader_write': %s"), error->message); + g_error_free(error); } } - gdk_pixbuf_loader_close(loader, 0); // Do also for next picture if (pic->next) - PictureEntry_Update(pic->next, select); + PictureEntry_Update(pic->next, select_it); return; } @@ -1080,10 +1119,16 @@ Picture *Picture_Load_File_Data (const gchar *filename) filename_utf8 = filename_to_display(filename); msg = g_strdup_printf(_("Can't open file :\n'%s'!\n(%s)"), filename_utf8,g_strerror(errno)); - msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); + msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(MainWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); g_free(msg); - msg_box_hide_check_button(MSG_BOX(msgbox)); - msg_box_run(MSG_BOX(msgbox)); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); Statusbar_Message(_("Picture file not loaded..."),TRUE); diff --git a/src/picture.h b/src/picture.h old mode 100755 new mode 100644 index eda3af4..cc8ee2e --- a/src/picture.h +++ b/src/picture.h @@ -42,9 +42,10 @@ struct _Picture Picture *next; };*/ -enum // Picture types +typedef enum // Picture types { - PICTURE_TYPE_OTHER, + // Same values for FLAC, see: http://flac.sourceforge.net/api/group__flac__format.html#ga113 + PICTURE_TYPE_OTHER = 0, PICTURE_TYPE_FILE_ICON, PICTURE_TYPE_OTHER_FILE_ICON, PICTURE_TYPE_FRONT_COVER, @@ -64,15 +65,17 @@ enum // Picture types PICTURE_TYPE_A_BRIGHT_COLOURED_FISH, PICTURE_TYPE_ILLUSTRATION, PICTURE_TYPE_BAND_ARTIST_LOGOTYPE, - PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE -}; + PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE, + + PICTURE_TYPE_UNDEFINED +} Picture_Type; -enum +typedef enum { PICTURE_FORMAT_JPEG, PICTURE_FORMAT_PNG, PICTURE_FORMAT_UNKNOWN -}; +} Picture_Format; enum // Columns for PictureEntryView { @@ -110,13 +113,14 @@ void Picture_Save_Button_Clicked (GObject *object); void Picture_Clear_Button_Clicked (GObject *object); void PictureEntry_Clear (void); -void PictureEntry_Update (Picture *pic, gint select); - -Picture *Picture_Allocate (void); -Picture *Picture_Copy_One (const Picture *pic); -Picture *Picture_Copy (const Picture *pic); -void Picture_Free (Picture *pic); -gint Picture_Format (Picture *pic); +void PictureEntry_Update (Picture *pic, gboolean select_it); + +Picture *Picture_Allocate (void); +Picture *Picture_Copy_One (const Picture *pic); +Picture *Picture_Copy (const Picture *pic); +void Picture_Free (Picture *pic); +Picture_Format Picture_Format_From_Data (Picture *pic); +const gchar *Picture_Mime_Type_String (Picture_Format format); gboolean Picture_Entry_View_Button_Pressed (GtkTreeView *treeview, GdkEventButton *event, gpointer data); gboolean Picture_Entry_View_Key_Pressed (GtkTreeView *treeview, GdkEvent *event, gpointer data); diff --git a/src/prefs.c b/src/prefs.c old mode 100644 new mode 100755 index 7e862d9..8ca00fb --- a/src/prefs.c +++ b/src/prefs.c @@ -191,7 +191,7 @@ void Open_OptionsWindow (void) g_free(path_utf8); // Button browse - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(HBox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_Directory),G_OBJECT(GTK_BIN(DefaultPathToMp3)->child)); @@ -402,7 +402,7 @@ void Open_OptionsWindow (void) g_free(program_path); // Button browse - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_File), G_OBJECT(GTK_BIN(FilePlayerCombo)->child)); @@ -819,9 +819,13 @@ void Open_OptionsWindow (void) gtk_table_attach(GTK_TABLE(Table),LabelAdditionalId3v2IconvOptions,2,5,5,6,GTK_FILL,GTK_FILL,0,0); gtk_misc_set_alignment(GTK_MISC(LabelAdditionalId3v2IconvOptions),0,0.5); - FileWritingId3v2IconvOptionsNo = gtk_radio_button_new_with_label(NULL, _("No")); + FileWritingId3v2IconvOptionsNo = gtk_radio_button_new_with_label(NULL, + _("No")); gtk_table_attach(GTK_TABLE(Table),FileWritingId3v2IconvOptionsNo,2,3,6,7,GTK_FILL,GTK_FILL,0,0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v2IconvOptionsNo),FILE_WRITING_ID3V2_ICONV_OPTIONS_NO); + gtk_tooltips_set_tip(Tips,FileWritingId3v2IconvOptionsNo,_("With this option, when " + "a character cannot be represented in the target character set, it isn't changed. " + "But note that an error message will be displayed for information."),NULL); FileWritingId3v2IconvOptionsTranslit = gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(FileWritingId3v2IconvOptionsNo)), _("//TRANSLIT")); @@ -888,6 +892,9 @@ void Open_OptionsWindow (void) _("No")); gtk_table_attach(GTK_TABLE(Table),FileWritingId3v1IconvOptionsNo,1,2,4,5,GTK_FILL,GTK_FILL,0,0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(FileWritingId3v1IconvOptionsNo),FILE_WRITING_ID3V1_ICONV_OPTIONS_NO); + gtk_tooltips_set_tip(Tips,FileWritingId3v1IconvOptionsNo,_("With this option, when " + "a character cannot be represented in the target character set, it isn't changed. " + "But note that an error message will be displayed for information."),NULL); FileWritingId3v1IconvOptionsTranslit = gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(FileWritingId3v1IconvOptionsNo)), _("//TRANSLIT")); @@ -1275,7 +1282,7 @@ void Open_OptionsWindow (void) g_free(path_utf8); } - Button = Create_Button_With_Pixmap(BUTTON_BROWSE); + Button = gtk_button_new_from_stock(GTK_STOCK_OPEN); gtk_box_pack_start(GTK_BOX(hbox),Button,FALSE,FALSE,0); g_signal_connect_swapped(G_OBJECT(Button),"clicked", G_CALLBACK(File_Selection_Window_For_Directory),G_OBJECT(GTK_BIN(CddbLocalPath)->child)); @@ -1736,10 +1743,15 @@ gint Check_DefaultPathToMp3 (void) gchar *msg = g_strdup_printf(_(" The selected path for 'Default path to " "files' isn't valid!\n'%s'\n(%s) "),path_utf8, (stat(path_real,&stbuf)==0)?_("Not a directory"):g_strerror(errno) ); - GtkWidget *msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - gtk_window_set_transient_for(GTK_WINDOW(msgbox),GTK_WINDOW(OptionsWindow)); - msg_box_run(MSG_BOX(msgbox)); + GtkWidget *msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(OptionsWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); g_free(path_real); @@ -1774,10 +1786,15 @@ gint Check_CharacterSetTranslation (void) { gchar *msg = g_strdup_printf(_("The character set translation from '%s'\n" "to '%s' isn't supported!"),reading_character,"UTF-8"); - GtkWidget *msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - gtk_window_set_transient_for(GTK_WINDOW(msgbox),GTK_WINDOW(OptionsWindow)); - msg_box_run(MSG_BOX(msgbox)); + GtkWidget *msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(OptionsWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(UseNonStandardId3ReadingCharacterSet),FALSE); @@ -1789,10 +1806,15 @@ gint Check_CharacterSetTranslation (void) { gchar *msg = g_strdup_printf(_("The character set translation from '%s'\n" "to '%s' isn't supported!"),"UTF-8",writing_character); - GtkWidget *msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - gtk_window_set_transient_for(GTK_WINDOW(msgbox),GTK_WINDOW(OptionsWindow)); - msg_box_run(MSG_BOX(msgbox)); + GtkWidget *msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(OptionsWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(UseNonStandardId3WritingCharacterSet),FALSE); @@ -1838,10 +1860,15 @@ gint Check_FilePlayerCombo (void) { gchar *msg = g_strdup_printf(_("The audio file player '%s' can't be found!"), gtk_entry_get_text(GTK_ENTRY(GTK_BIN(FilePlayerCombo)->child))); - GtkWidget *msgbox = msg_box_new(_("Error..."),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_hide_check_button(MSG_BOX(msgbox)); - gtk_window_set_transient_for(GTK_WINDOW(msgbox),GTK_WINDOW(OptionsWindow)); - msg_box_run(MSG_BOX(msgbox)); + GtkWidget *msgbox = msg_box_new(_("Error..."), + GTK_WINDOW(OptionsWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); diff --git a/src/prefs.h b/src/prefs.h old mode 100644 new mode 100755 diff --git a/src/scan.c b/src/scan.c index a16adf9..476fbe9 100644 --- a/src/scan.c +++ b/src/scan.c @@ -141,6 +141,10 @@ gchar *Rename_File_Masks [] = "%n_-_%a_-_%t", "%n. %a - %t", "%n._%a_-_%t", + "%a - %b"G_DIR_SEPARATOR_S"%n - %t", + "%a_-_%b"G_DIR_SEPARATOR_S"%n_-_%t", + "%a - %b (%y) - %g"G_DIR_SEPARATOR_S"%n - %t", + "%a_-_%b_(%y)_-_%g"G_DIR_SEPARATOR_S"%n_-_%t", "%n - %t", "%n_-_%t", "%n. %t", @@ -352,7 +356,7 @@ void Scan_Tag_With_Mask (ET_File *ETFile) g_free(mask); Statusbar_Message(_("Tag successfully scanned..."),TRUE); filename_utf8 = g_path_get_basename( ((File_Name *)ETFile->FileNameNew->data)->value_utf8 ); - Log_Print(_("Tag successfully scanned...(%s)"),filename_utf8); + Log_Print(LOG_OK,_("Tag successfully scanned...(%s)"),filename_utf8); g_free(filename_utf8); } @@ -392,7 +396,7 @@ GList *Scan_Generate_New_Tag_From_Mask (ET_File *ETFile, gchar *mask) if (i==ET_FILE_DESCRIPTION_SIZE) { gchar *tmp1 = g_path_get_basename(filename_utf8); - Log_Print(_("Tag scanner: strange..., the extension '%s' was not found into filename '%s'!"),tmp,tmp1); + Log_Print(LOG_ERROR,_("Tag scanner: strange..., the extension '%s' was not found into filename '%s'!"),tmp,tmp1); g_free(tmp1); } @@ -474,7 +478,7 @@ GList *Scan_Generate_New_Tag_From_Mask (ET_File *ETFile, gchar *mask) file_seq = file_seq + len; // We remove it }else { - Log_Print(_("Scan Error: can't find separator '%s' within '%s'"),buf,file_seq_utf8); + Log_Print(LOG_ERROR,_("Scan Error: can't find separator '%s' within '%s'"),buf,file_seq_utf8); } g_free(buf); } @@ -503,7 +507,7 @@ GList *Scan_Generate_New_Tag_From_Mask (ET_File *ETFile, gchar *mask) // Try to find the separator in 'file_seq' if ( (tmp=strstr(file_seq,separator)) == NULL ) { - Log_Print(_("Scan Error: can't find separator '%s' within '%s'"),separator,file_seq_utf8); + Log_Print(LOG_ERROR,_("Scan Error: can't find separator '%s' within '%s'"),separator,file_seq_utf8); separator[0] = 0; // Needed to avoid error when calculting 'len' below } @@ -661,8 +665,15 @@ void Scan_Rename_File_With_Mask (ET_File *ETFile) { GtkWidget *msgbox; gchar *msg = g_strdup_printf(_("Could not convert filename '%s' into system filename encoding."), filename_generated_utf8); - msgbox = msg_box_new(_("Filename translation"),msg,GTK_STOCK_DIALOG_ERROR,BUTTON_OK,0); - msg_box_run(MSG_BOX(msgbox)); + msgbox = msg_box_new(_("Filename translation"), + GTK_WINDOW(ScannerWindow), + NULL, + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + msg, + GTK_STOCK_DIALOG_ERROR, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_run(GTK_DIALOG(msgbox)); gtk_widget_destroy(msgbox); g_free(msg); g_free(filename_generated_utf8); @@ -686,7 +697,7 @@ void Scan_Rename_File_With_Mask (ET_File *ETFile) Statusbar_Message(_("New file name successfully scanned..."),TRUE); filename_new_utf8 = g_path_get_basename(((File_Name *)ETFile->FileNameNew->data)->value_utf8); - Log_Print(_("New file name successfully scanned...(%s)"),filename_new_utf8); + Log_Print(LOG_OK,_("New file name successfully scanned...(%s)"),filename_new_utf8); g_free(filename_new_utf8); return; @@ -984,13 +995,14 @@ void Scan_Rename_File_Prefix_Path (void) // The current text in the combobox combo_text = (gchar *)gtk_entry_get_text(GTK_ENTRY(GTK_BIN(RenameFileMaskCombo)->child)); - if (!g_utf8_validate(combo_text, -1, NULL)) + /*if (!g_utf8_validate(combo_text, -1, NULL)) { combo_tmp = convert_to_utf8(combo_text); }else { combo_tmp = g_strdup(combo_text); - } + }*/ + combo_tmp = Try_To_Validate_Utf8_String(combo_text); // If the path already exists we don't add it again // Use g_utf8_collate_key instead of strncmp @@ -1077,7 +1089,7 @@ void Scan_Process_Fields (ET_File *ETFile) st_filename = (File_Name *)ETFile->FileNameNew->data; st_filetag = (File_Tag *)ETFile->FileTag->data; - + /* Process the filename */ if (st_filename != NULL) { @@ -1135,7 +1147,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->artist); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->artist,string); @@ -1153,7 +1165,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->album); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->album,string); @@ -1171,7 +1183,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->genre); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->genre,string); @@ -1189,7 +1201,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->comment); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->comment,string); @@ -1207,7 +1219,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->composer); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->composer,string); @@ -1225,7 +1237,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->orig_artist); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->orig_artist,string); @@ -1243,7 +1255,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->copyright); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->copyright,string); @@ -1261,7 +1273,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->url); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->url,string); @@ -1279,7 +1291,7 @@ void Scan_Process_Fields (ET_File *ETFile) } string = g_strdup(st_filetag->encoded_by); - + Scan_Process_Fields_Functions(&string); ET_Set_Field_File_Tag_Item(&FileTag->encoded_by,string); @@ -1418,7 +1430,7 @@ void Scan_Process_Fields_Letter_Uppercase (gchar *string) } /* - * Function to set the first letter of each word to uppercase, according the "Chicago Manual of Style" + * Function to set the first letter of each word to uppercase, according the "Chicago Manual of Style" (http://www.docstyles.com/cmscrib.htm#Note2) * No needed to reallocate */ void Scan_Process_Fields_First_Letters_Uppercase (gchar *string) @@ -1485,7 +1497,7 @@ void Scan_Process_Fields_First_Letters_Uppercase (gchar *string) if (!g_utf8_validate(string,-1,NULL)) { - Log_Print("Scan_Process_Fields_First_Letters_Uppercase: Not a valid utf8! quiting"); + Log_Print(LOG_ERROR,"Scan_Process_Fields_First_Letters_Uppercase: Not a valid utf8! quiting"); return; } // Removes trailing whitespace @@ -1582,7 +1594,7 @@ void Scan_Process_Fields_First_Letters_Uppercase (gchar *string) void Scan_Process_Fields_Remove_Space (gchar *string) { gchar *tmp, *tmp1; - + tmp = tmp1 = string; while (*tmp) @@ -1606,7 +1618,7 @@ void Scan_Process_Fields_Insert_Space (gchar **string) gint j; guint string_length; gchar *string1; - + // FIX ME : we suppose that it will not grow more than 2 times its size... string_length = 2 * strlen(*string); //string1 = g_realloc(*string, string_length+1); @@ -1615,7 +1627,7 @@ void Scan_Process_Fields_Insert_Space (gchar **string) string1[string_length]='\0'; g_free(*string); *string = string1; - + for (iter = g_utf8_next_char(*string); *iter; iter = g_utf8_next_char(iter)) // At start : g_utf8_next_char to not consider first "uppercase" letter { c = g_utf8_get_char(iter); @@ -1637,7 +1649,7 @@ void Scan_Process_Fields_Insert_Space (gchar **string) void Scan_Process_Fields_Keep_One_Space (gchar *string) { gchar *tmp, *tmp1; - + tmp = tmp1 = string; // Remove multiple consecutive underscores and spaces. @@ -1649,7 +1661,7 @@ void Scan_Process_Fields_Keep_One_Space (gchar *string) break; *(tmp++) = *(tmp1++); while (*tmp1 == ' ' || *tmp1 == '_') - *tmp1++; + *(tmp1++); } *tmp = '\0'; } @@ -1710,16 +1722,16 @@ void Scan_Convert_Character (gchar **string) gchar *token; gint n_tokens; gchar **result; - - + + tokens_list = NULL; n_tokens = 0; s = current = *string; - + // Find tokens if (strlen(from) > 0) { - while (s + while (s && *s != '\0' && (s = g_strstr_len(current,strlen(current),from)) ) { @@ -1738,7 +1750,7 @@ void Scan_Convert_Character (gchar **string) }else { // We search an empty string... we suppose it exists between each UTF-8 character - while (s + while (s && *s != '\0' && (s = g_utf8_find_next_char(current,NULL)) ) { @@ -1748,16 +1760,16 @@ void Scan_Convert_Character (gchar **string) current = s; } } - + // Load the tokens list in an array for g_strjoinv result = g_new (gchar *, n_tokens + 1); result[n_tokens] = NULL; for (list = tokens_list; list != NULL; list = list->next) result[--n_tokens] = list->data; g_slist_free(tokens_list); - + g_free(*string); - + // Join all the tokens with the 'to' separator *string = g_strjoinv(to,result); @@ -1786,18 +1798,24 @@ gint Scan_Word_Is_Roman_Numeral (gchar *text) while (*tmp) { - if (*tmp == (gunichar)'i' || - *tmp == (gunichar)'v' || - *tmp == (gunichar)'x' || - *tmp == (gunichar)'l' || - *tmp == (gunichar)'c' || - *tmp == (gunichar)'d' || - *tmp == (gunichar)'m') + if (*tmp == (gunichar)'i' + || *tmp == (gunichar)'v' + || *tmp == (gunichar)'x' + || *tmp == (gunichar)'l' + || *tmp == (gunichar)'c' + || *tmp == (gunichar)'d' + || *tmp == (gunichar)'m') { + // Found a roman numeral => continue tmp++; len++; - } else if (*tmp == ' ' || *tmp == '_') + } else if (*tmp == ' ' + || *tmp == '_' + || *tmp == '.' + || *tmp == ',' + || *tmp == '-') { + // Found separator => stop return len; } else { @@ -1809,6 +1827,57 @@ gint Scan_Word_Is_Roman_Numeral (gchar *text) } +/* +** roman2long() - Converts a roman numeral string into a long integer +** public domain by Bob Stout +** Arguments: 1 - Roman numeral string +** +** Returns: Long value if valid, else -1L +*/ +/* +long roman2long(const char *str) +{ + struct numeral { + long val; + int ch; + }; + + static struct numeral numerals[] = { + { 1L, 'I' }, + { 5L, 'V' }, + { 10L, 'X' }, + { 50L, 'L' }, + { 100L, 'C' }, + { 500L, 'D' }, + { 1000L, 'M' } + }; + int i, j, k; + long retval = 0L; + + if (!str) + return -1L; + for (i = 0, k = -1; str[i]; ++i) + { + for (j = 0; j < 7; ++j) + { + if (numerals[j].ch == toupper(str[i])) + break; + } + if (7 == j) + return -1L; + if (k >= 0 && k < j) + { + retval -= numerals[k].val * 2; + retval += numerals[j].val; + } + else retval += numerals[j].val; + k = j; + } + return retval; +}*/ + + + /* * Return the field of a 'File_Tag' structure corresponding to the mask code */ @@ -1847,7 +1916,7 @@ gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar code case 'i': /* Ignored */ return NULL; default: - Log_Print("Scanner: Invalid code '%%%c' found!",code); + Log_Print(LOG_ERROR,"Scanner: Invalid code '%%%c' found!",code); return NULL; } } @@ -1938,15 +2007,15 @@ void Open_ScannerWindow (gint scanner_type) gtk_widget_set_size_request(ScannerOptionCombo, 160, -1); /* Option for Tag */ - gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), + gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), _(Scanner_Option_Menu_Items[SCANNER_FILL_TAG])); /* Option for FileName */ - gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), + gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), _(Scanner_Option_Menu_Items[SCANNER_RENAME_FILE])); /* Option for ProcessFields */ - gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), + gtk_combo_box_append_text(GTK_COMBO_BOX(ScannerOptionCombo), _(Scanner_Option_Menu_Items[SCANNER_PROCESS_FIELDS])); // Selection of the item made at the end of the function @@ -2677,7 +2746,7 @@ void ScannerWindow_Apply_Changes (void) // The scanner selected SCANNER_TYPE = gtk_combo_box_get_active(GTK_COMBO_BOX(ScannerOptionCombo)); - + SCAN_MASK_EDITOR_BUTTON = GTK_TOGGLE_BUTTON(MaskEditorButton)->active; SCAN_LEGEND_BUTTON = GTK_TOGGLE_BUTTON(LegendButton)->active; @@ -2693,7 +2762,7 @@ void ScannerWindow_Apply_Changes (void) PROCESS_COPYRIGHT_FIELD = GTK_TOGGLE_BUTTON(ProcessCopyrightField)->active; PROCESS_URL_FIELD = GTK_TOGGLE_BUTTON(ProcessURLField)->active; PROCESS_ENCODED_BY_FIELD = GTK_TOGGLE_BUTTON(ProcessEncodedByField)->active; - + if (PROCESS_FIELDS_CONVERT_FROM) g_free(PROCESS_FIELDS_CONVERT_FROM); PROCESS_FIELDS_CONVERT_FROM = g_strdup(gtk_entry_get_text(GTK_ENTRY(ProcessFieldsConvertFrom))); if (PROCESS_FIELDS_CONVERT_TO) g_free(PROCESS_FIELDS_CONVERT_TO); @@ -3152,14 +3221,14 @@ void Mask_Editor_List_Duplicate (void) if (g_list_length(selectedRows) == 0) { - Log_Print(_("Copy: No row selected!")); + Log_Print(LOG_ERROR,_("Copy: No row selected!")); g_list_foreach(selectedRows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selectedRows); return; } /* Loop through selected rows, duplicating them into a GList - * We cannot directly insert because the paths in selectedRows + * We cannot directly insert because the paths in selectedRows * get out of date after an insertion */ while (selectedRows) { @@ -3174,7 +3243,7 @@ void Mask_Editor_List_Duplicate (void) if (!selectedRows) break; } - /* Duplicate the relevant entries, by looping through the list backwards + /* Duplicate the relevant entries, by looping through the list backwards * (to preserve original order) */ toInsert = g_list_last(toInsert); while (toInsert) @@ -3189,7 +3258,7 @@ void Mask_Editor_List_Duplicate (void) // Set focus to the last inserted line if (toInsert) Mask_Editor_List_Set_Row_Visible(treeModel,&rowIter); - + /* Free data no longer needed */ selectedRows = g_list_first(selectedRows); toInsert = g_list_first(toInsert); @@ -3212,10 +3281,11 @@ void Mask_Editor_List_Add (void) { while(Scan_Masks[i]) { - if (!g_utf8_validate(Scan_Masks[i], -1, NULL)) + /*if (!g_utf8_validate(Scan_Masks[i], -1, NULL)) temp = convert_to_utf8(Scan_Masks[i]); else - temp = g_strdup(Scan_Masks[i]); + temp = g_strdup(Scan_Masks[i]);*/ + temp = Try_To_Validate_Utf8_String(Scan_Masks[i]); gtk_list_store_append(GTK_LIST_STORE(treemodel), &iter); gtk_list_store_set(GTK_LIST_STORE(treemodel), &iter, @@ -3227,10 +3297,11 @@ void Mask_Editor_List_Add (void) { while(Rename_File_Masks[i]) { - if (!g_utf8_validate(Rename_File_Masks[i], -1, NULL)) + /*if (!g_utf8_validate(Rename_File_Masks[i], -1, NULL)) temp = convert_to_utf8(Rename_File_Masks[i]); else - temp = g_strdup(Scan_Masks[i]); + temp = g_strdup(Rename_File_Masks[i]);*/ + temp = Try_To_Validate_Utf8_String(Rename_File_Masks[i]); gtk_list_store_append(GTK_LIST_STORE(treemodel), &iter); gtk_list_store_set(GTK_LIST_STORE(treemodel), &iter, @@ -3256,7 +3327,7 @@ void Mask_Editor_List_Remove (void) treemodel = gtk_tree_view_get_model(GTK_TREE_VIEW(MaskEditorList)); if (gtk_tree_selection_count_selected_rows(selection) == 0) { - Log_Print(_("Remove: No row selected!")); + Log_Print(LOG_ERROR,_("Remove: No row selected!")); return; } @@ -3303,7 +3374,7 @@ void Mask_Editor_List_Move_Up (void) if (g_list_length(selectedRows) == 0) { - Log_Print(_("Move Up: No row selected!")); + Log_Print(LOG_ERROR,_("Move Up: No row selected!")); g_list_foreach(selectedRows, (GFunc)gtk_tree_path_free, NULL); g_list_free(selectedRows); return; @@ -3356,7 +3427,7 @@ void Mask_Editor_List_Move_Down (void) if (g_list_length(selectedRows) == 0) { - Log_Print(_("Move Down: No row selected!")); + Log_Print(LOG_ERROR,_("Move Down: No row selected!")); g_list_foreach(selectedRows, (GFunc)gtk_tree_path_free, NULL); g_list_free(selectedRows); return; diff --git a/src/scan.h b/src/scan.h old mode 100644 new mode 100755 diff --git a/src/setting.c b/src/setting.c old mode 100644 new mode 100755 index 9b00a32..217ab2d --- a/src/setting.c +++ b/src/setting.c @@ -59,42 +59,41 @@ */ // Base directory created into home dir -gchar *EASYTAG_DIR = ".easytag"; +#define EASYTAG_DIR ".easytag" // File for configuration -gchar *CONFIG_FILE = ".easytag/easytagrc"; +#define CONFIG_FILE EASYTAG_DIR "/easytagrc" // File of masks for tag scanner -gchar *SCAN_TAG_MASKS_FILE = ".easytag/scan_tag.mask"; +#define SCAN_TAG_MASKS_FILE EASYTAG_DIR "/scan_tag.mask" // File of masks for rename file scanner -gchar *RENAME_FILE_MASKS_FILE = ".easytag/rename_file.mask"; +#define RENAME_FILE_MASKS_FILE EASYTAG_DIR "/rename_file.mask" // File for history of RenameDirectoryMaskCombo combobox -gchar *RENAME_DIRECTORY_MASKS_FILE = ".easytag/rename_directory.mask"; +#define RENAME_DIRECTORY_MASKS_FILE EASYTAG_DIR "/rename_directory.mask" // File for history of PlayListNameCombo combobox -gchar *PLAY_LIST_NAME_MASKS_FILE = ".easytag/play_list_name.mask"; +#define PLAY_LIST_NAME_MASKS_FILE EASYTAG_DIR "/play_list_name.mask" // File for history of PlayListContentMaskEntry combobox -gchar *PLAYLIST_CONTENT_MASKS_FILE = ".easytag/playlist_content.mask"; +#define PLAYLIST_CONTENT_MASKS_FILE EASYTAG_DIR "/playlist_content.mask" // File for history of DefaultPathToMp3 combobox -gchar *DEFAULT_PATH_TO_MP3_HISTORY_FILE = ".easytag/default_path_to_mp3.history"; +#define DEFAULT_PATH_TO_MP3_HISTORY_FILE EASYTAG_DIR "/default_path_to_mp3.history" // File for history of DefaultComment combobox -gchar *DEFAULT_TAG_COMMENT_HISTORY_FILE = ".easytag/default_tag_comment.history"; +#define DEFAULT_TAG_COMMENT_HISTORY_FILE EASYTAG_DIR "/default_tag_comment.history" // File for history of BrowserEntry combobox -gchar *PATH_ENTRY_HISTORY_FILE = ".easytag/browser_path.history"; +#define PATH_ENTRY_HISTORY_FILE EASYTAG_DIR "/browser_path.history" // File for history of run program combobox for directories -gchar *RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE = ".easytag/run_program_with_directory.history"; +#define RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE EASYTAG_DIR "/run_program_with_directory.history" // File for history of run program combobox for files -gchar *RUN_PROGRAM_WITH_FILE_HISTORY_FILE = ".easytag/run_program_with_file.history"; +#define RUN_PROGRAM_WITH_FILE_HISTORY_FILE EASYTAG_DIR "/run_program_with_file.history" // File for history of run player combobox -gchar *AUDIO_FILE_PLAYER_HISTORY_FILE = ".easytag/audio_file_player.history"; +#define AUDIO_FILE_PLAYER_HISTORY_FILE EASYTAG_DIR "/audio_file_player.history" // File for history of search string combobox -gchar *SEARCH_FILE_HISTORY_FILE = ".easytag/search_file.history"; +#define SEARCH_FILE_HISTORY_FILE EASYTAG_DIR "/search_file.history" // File for history of FileToLoad combobox -gchar *FILE_TO_LOAD_HISTORY_FILE = ".easytag/file_to_load.history"; +#define FILE_TO_LOAD_HISTORY_FILE EASYTAG_DIR "/file_to_load.history" // File for history of CddbSearchStringEntry combobox -gchar *CDDB_SEARCH_STRING_HISTORY_FILE = ".easytag/cddb_search_string.history"; +#define CDDB_SEARCH_STRING_HISTORY_FILE EASYTAG_DIR "/cddb_search_string.history" // File for history of CddbSearchStringInResultEntry combobox -gchar *CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE = ".easytag/cddb_search_string_in_result.history"; +#define CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE EASYTAG_DIR "/cddb_search_string_in_result.history" // File for history of CddbLocalPath combobox -gchar *CDDB_LOCAL_PATH_HISTORY_FILE = ".easytag/cddb_local_path.history"; - +#define CDDB_LOCAL_PATH_HISTORY_FILE EASYTAG_DIR "/cddb_local_path.history" @@ -429,8 +428,8 @@ void Init_Config_Variables (void) FILE_WRITING_ID3V2_ICONV_OPTIONS_IGNORE = 0; FILE_WRITING_ID3V1_WRITE_TAG = 1; FILE_WRITING_ID3V1_CHARACTER_SET = g_strdup("ISO-8859-1"); - FILE_WRITING_ID3V1_ICONV_OPTIONS_NO = 1; - FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT = 0; + FILE_WRITING_ID3V1_ICONV_OPTIONS_NO = 0; + FILE_WRITING_ID3V1_ICONV_OPTIONS_TRANSLIT = 1; FILE_WRITING_ID3V1_ICONV_OPTIONS_IGNORE = 0; /* @@ -886,7 +885,7 @@ void Save_Config_To_File (void) if ( Create_Easytag_Directory()==0 || (file=fopen(file_path,"w+"))==0 ) { - Log_Print(_("ERROR: Can't write config file: %s (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR: Can't write config file: %s (%s)"),file_path,g_strerror(errno)); }else { gint ConfigVarListLen = sizeof(Config_Variables)/sizeof(tConfigVariable); @@ -929,7 +928,7 @@ void Save_Config_To_File (void) } default: { - Log_Print("ERROR: Can't save: type of config variable not supported " + Log_Print(LOG_ERROR,"ERROR: Can't save: type of config variable not supported " "for '%s'!",Config_Variables[i].name); break; } @@ -1002,7 +1001,7 @@ void Set_Config (gchar *line) default: { - Log_Print("ERROR: Can't read: type of config variable not supported " + Log_Print(LOG_ERROR,"ERROR: Can't read: type of config variable not supported " "for '%s'!",Config_Variables[i].name); break; } @@ -1029,8 +1028,8 @@ void Read_Config (void) if ( (file=fopen(file_path,"r"))==0 ) { - Log_Print(_("Can't open configuration file '%s' (%s)"),file_path,g_strerror(errno)); - Log_Print(_("Loading default configuration...")); + Log_Print(LOG_ERROR,_("Can't open configuration file '%s' (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_OK,_("Loading default configuration...")); }else { while (fgets(buffer,sizeof(buffer),file)) @@ -1130,119 +1129,119 @@ gboolean Setting_Create_Files (void) if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),CONFIG_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),CONFIG_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,SCAN_TAG_MASKS_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),SCAN_TAG_MASKS_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),SCAN_TAG_MASKS_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,RENAME_FILE_MASKS_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),RENAME_FILE_MASKS_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),RENAME_FILE_MASKS_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,RENAME_DIRECTORY_MASKS_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),RENAME_DIRECTORY_MASKS_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),RENAME_DIRECTORY_MASKS_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,DEFAULT_PATH_TO_MP3_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),DEFAULT_PATH_TO_MP3_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),DEFAULT_PATH_TO_MP3_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,DEFAULT_TAG_COMMENT_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),DEFAULT_TAG_COMMENT_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),DEFAULT_TAG_COMMENT_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,PATH_ENTRY_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),PATH_ENTRY_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),PATH_ENTRY_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,PLAY_LIST_NAME_MASKS_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),PLAY_LIST_NAME_MASKS_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),PLAY_LIST_NAME_MASKS_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,RUN_PROGRAM_WITH_FILE_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),RUN_PROGRAM_WITH_FILE_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),RUN_PROGRAM_WITH_FILE_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,AUDIO_FILE_PLAYER_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),AUDIO_FILE_PLAYER_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),AUDIO_FILE_PLAYER_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,SEARCH_FILE_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),SEARCH_FILE_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),SEARCH_FILE_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,FILE_TO_LOAD_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),FILE_TO_LOAD_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),FILE_TO_LOAD_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,PLAYLIST_CONTENT_MASKS_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),PLAYLIST_CONTENT_MASKS_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),PLAYLIST_CONTENT_MASKS_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,CDDB_SEARCH_STRING_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),CDDB_SEARCH_STRING_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),CDDB_SEARCH_STRING_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE,g_strerror(errno)); g_free(file_path); file_path = g_strconcat(home_path,CDDB_LOCAL_PATH_HISTORY_FILE,NULL); if ( (file=fopen(file_path,"a+")) != NULL ) fclose(file); else - Log_Print(_("Can't create or open file '%s' (%s)"),CDDB_LOCAL_PATH_HISTORY_FILE,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't create or open file '%s' (%s)"),CDDB_LOCAL_PATH_HISTORY_FILE,g_strerror(errno)); g_free(file_path); @@ -1275,7 +1274,7 @@ void Save_List_Store_To_File (gchar *filename, GtkListStore *liststore, gint col if ( Create_Easytag_Directory()==0 || (file=fopen(file_path,"w+"))==NULL ) { - Log_Print(_("ERROR: Can't write list to file: %s (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR: Can't write list to file: %s (%s)"),file_path,g_strerror(errno)); }else { do @@ -1315,7 +1314,7 @@ gboolean Populate_List_Store_From_File (gchar *filename, GtkListStore *liststore if ( (file=fopen(file_path,"r"))==NULL ) { - Log_Print(_("Can't open file '%s' (%s)"),file_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("Can't open file '%s' (%s)"),file_path,g_strerror(errno)); }else { gchar *data = NULL; @@ -1324,10 +1323,12 @@ gboolean Populate_List_Store_From_File (gchar *filename, GtkListStore *liststore { if (buffer[strlen(buffer)-1]=='\n') buffer[strlen(buffer)-1]='\0'; - if (g_utf8_validate(buffer, -1, NULL)) + + /*if (g_utf8_validate(buffer, -1, NULL)) data = g_strdup(buffer); else - data = convert_to_utf8(buffer); + data = convert_to_utf8(buffer);*/ + data = Try_To_Validate_Utf8_String(buffer); if (data && g_utf8_strlen(data, -1) > 0) { @@ -1355,7 +1356,7 @@ void Load_Scan_Tag_Masks_List (GtkListStore *liststore, gint colnum, gchar **fal if (!Populate_List_Store_From_File(SCAN_TAG_MASKS_FILE, liststore, colnum)) { // Fall back to defaults - Log_Print(_("Loading default 'Fill Tag' masks...")); + Log_Print(LOG_OK,_("Loading default 'Fill Tag' masks...")); while(fallback[i]) { @@ -1383,7 +1384,7 @@ void Load_Rename_File_Masks_List (GtkListStore *liststore, gint colnum, gchar ** if (!Populate_List_Store_From_File(RENAME_FILE_MASKS_FILE, liststore, colnum)) { // Fall back to defaults - Log_Print(_("Loading default 'Rename File' masks...")); + Log_Print(LOG_OK,_("Loading default 'Rename File' masks...")); while(fallback[i]) { @@ -1410,7 +1411,7 @@ void Load_Rename_Directory_Masks_List (GtkListStore *liststore, gint colnum, gch if (!Populate_List_Store_From_File(RENAME_DIRECTORY_MASKS_FILE, liststore, colnum)) { // Fall back to defaults - Log_Print(_("Loading default 'Rename Directory' masks...")); + Log_Print(LOG_OK,_("Loading default 'Rename Directory' masks...")); while(fallback[i]) { @@ -1603,7 +1604,7 @@ gboolean Create_Easytag_Directory (void) if (!HOME_VARIABLE) { - Log_Print(_("ERROR: The environment variable HOME is not defined!")); + Log_Print(LOG_ERROR,_("ERROR: The environment variable HOME is not defined!")); return FALSE; } @@ -1614,12 +1615,12 @@ gboolean Create_Easytag_Directory (void) EASYTAG_DIR, //EASYTAG_DIR[strlen(EASYTAG_DIR)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"", NULL); - + if ( (dir=opendir(easytag_path)) == NULL ) { if ( (mkdir(easytag_path,S_IRWXU|S_IXGRP|S_IRGRP)) == -1) { - Log_Print(_("ERROR: Can't create directory '%s' (%s)!"),easytag_path,g_strerror(errno)); + Log_Print(LOG_ERROR,_("ERROR: Can't create directory '%s' (%s)!"),easytag_path,g_strerror(errno)); return FALSE; } }else diff --git a/src/setting.h b/src/setting.h old mode 100644 new mode 100755 diff --git a/src/win32/nsis/easytag-header.bmp b/src/win32/nsis/easytag-header.bmp new file mode 100755 index 0000000..85aaeb1 Binary files /dev/null and b/src/win32/nsis/easytag-header.bmp differ diff --git a/src/win32/nsis/easytag-install.bmp b/src/win32/nsis/easytag-install.bmp new file mode 100755 index 0000000..5bfd99b Binary files /dev/null and b/src/win32/nsis/easytag-install.bmp differ diff --git a/src/win32/nsis/easytag-install.ico b/src/win32/nsis/easytag-install.ico new file mode 100755 index 0000000..0e8673e Binary files /dev/null and b/src/win32/nsis/easytag-install.ico differ diff --git a/src/win32/nsis/easytag-uninstall.bmp b/src/win32/nsis/easytag-uninstall.bmp new file mode 100755 index 0000000..5cf16db Binary files /dev/null and b/src/win32/nsis/easytag-uninstall.bmp differ diff --git a/src/win32/win32dep.c b/src/win32/win32dep.c old mode 100644 new mode 100755 index 9e400af..cccde13 --- a/src/win32/win32dep.c +++ b/src/win32/win32dep.c @@ -76,6 +76,7 @@ typedef enum */ static char app_data_dir[MAX_PATH + 1] = "C:"; static char install_dir[MAXPATHLEN]; +static char lib_dir[MAXPATHLEN]; static char locale_dir[MAXPATHLEN]; static void str_replace_char (gchar *str, gchar in_char, gchar out_char); @@ -109,30 +110,30 @@ HINSTANCE ET_Win32_Hinstance (void) and on being read back have their '\' chars used as an escape char. Returns an allocated string which needs to be freed. */ -char* ET_Win32_Escape_Dirsep (char* filename ) +char *ET_Win32_Escape_Dirsep (const char *filename) { - int sepcount=0; - char* ret=NULL; - int cnt=0; - - ret = filename; - while(*ret) - { - if(*ret == '\\') - sepcount++; - ret++; - } - ret = g_malloc0(strlen(filename) + sepcount + 1); - while(*filename) - { - ret[cnt] = *filename; - if(*filename == '\\') - ret[++cnt] = '\\'; - filename++; - cnt++; - } - ret[cnt] = '\0'; - return ret; + int sepcount = 0; + const char *tmp = filename; + char *ret; + int cnt = 0; + + g_return_val_if_fail(filename != NULL, NULL); + + while(*tmp) { + if(*tmp == '\\') + sepcount++; + tmp++; + } + ret = g_malloc0(strlen(filename) + sepcount + 1); + while(*filename) { + ret[cnt] = *filename; + if(*filename == '\\') + ret[++cnt] = '\\'; + filename++; + cnt++; + } + ret[cnt] = '\0'; + return ret; } /* this is used by libmp4v2 : what is it doing here you think ? well...search! */ @@ -165,10 +166,10 @@ int mkstemp (char *template) /* Determine whether the specified dll contains the specified procedure. If so, load it (if not already loaded). */ -FARPROC ET_Win32_Find_And_Loadproc ( char* dllname, char* procedure ) +FARPROC ET_Win32_Find_And_Loadproc (char *dllname, char *procedure) { HMODULE hmod; - int did_load=0; + BOOL did_load = FALSE; FARPROC proc = 0; if(!(hmod=GetModuleHandle(dllname))) @@ -240,14 +241,21 @@ char* ET_Win32_Install_Dir (void) } -char* ET_Win32_Locale_Dir (void) +char *ET_Win32_Lib_Dir (void) +{ + strcpy(lib_dir, ET_Win32_Install_Dir()); + g_strlcat(lib_dir, G_DIR_SEPARATOR_S "library", sizeof(lib_dir)); + return (char*)&lib_dir; +} + +char *ET_Win32_Locale_Dir (void) { strcpy(locale_dir, ET_Win32_Install_Dir()); g_strlcat(locale_dir, G_DIR_SEPARATOR_S "locale", sizeof(locale_dir)); return (char*)&locale_dir; } -char* ET_Win32_Data_Dir (void) +char *ET_Win32_Data_Dir (void) { return (char*)&app_data_dir; } @@ -448,6 +456,8 @@ void ET_Win32_Cleanup (void) { /* winsock cleanup */ WSACleanup(); + + ET_dll_hInstance = NULL; } /* DLL initializer */ diff --git a/src/win32/win32dep.h b/src/win32/win32dep.h old mode 100644 new mode 100755 index 9107852..302ba0a --- a/src/win32/win32dep.h +++ b/src/win32/win32dep.h @@ -49,10 +49,11 @@ extern int mkstemp(char *template); extern HINSTANCE ET_Win32_Hinstance (void); extern gboolean ET_Win32_Read_Reg_String (HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len); -extern char* ET_Win32_Escape_Dirsep (char*); +extern char *ET_Win32_Escape_Dirsep (const char *filename); /* Determine ET paths */ extern char* ET_Win32_Install_Dir (void); +extern char* ET_Win32_Lib_Dir (void); extern char* ET_Win32_Locale_Dir (void); extern char* ET_Win32_Data_Dir (void); @@ -76,7 +77,9 @@ extern void ET_Win32_Path_Replace_Slashes (gchar *path); /* * ET specific */ -#define DATADIR ET_Win32_Install_Dir() -#define LOCALE ET_Win32_Locale_Dir() +#define DATADIR ET_Win32_Install_Dir() +#define LIBDIR ET_Win32_Lib_Dir() +#define LOCALEDIR ET_Win32_Locale_Dir() +//#define PACKAGE_DATA_DIR DATADIR #endif /* _WIN32DEP_H_ */ diff --git a/src/win32/win_easytag.c b/src/win32/win_easytag.c index cd6628d..21f4bac 100755 --- a/src/win32/win_easytag.c +++ b/src/win32/win_easytag.c @@ -360,7 +360,7 @@ static char* lcid_to_posix(LCID lcid) { */ static const char *get_locale() { const char *locale = NULL; - LCID lcid; + LCID lcid = 0; char data[10]; DWORD datalen = 10; @@ -377,6 +377,7 @@ static const char *get_locale() { return locale; } + // List of LCID : http://www.microsoft.com/globaldev/reference/lcid-all.mspx lcid = GetUserDefaultLCID(); if ((locale = lcid_to_posix(lcid))) return locale; @@ -546,7 +547,7 @@ WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance, snprintf(errbuf, 512, "Error loading 'easytag.dll'. Error: (%u) %s%s%s", (UINT) dw, err_msg, mod_not_found ? "\n" : "", - mod_not_found ? "This probably means that GTK+ can't be found." : ""); + mod_not_found ? "This probably means that a dependency (like GTK+, libogg or libvorbis) can't be found." : ""); printf(errbuf); MessageBox(NULL, errbuf, TEXT("Error"), MB_OK | MB_TOPMOST); -- cgit v1.2.3