aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Alex Bennee <alex@bennee.com>2010-07-14 16:01:16 +0100
committerGravatar Alex Bennee <alex@bennee.com>2010-07-14 16:01:16 +0100
commit26b8e06374c71e42be86694f5d5c4ee920ae4d26 (patch)
treef94a09ea9cf0e006d73c0ef497f387fd0ed91ccb /src
parentd022d6443c6b7564ae05a3af70035822bccd0b19 (diff)
EasyTag 2.1.4
Diffstat (limited to 'src')
-rw-r--r--[-rwxr-xr-x]src/Makefile.am11
-rw-r--r--src/Makefile.in23
-rw-r--r--[-rwxr-xr-x]src/Makefile.mingw2
-rw-r--r--src/about.c108
-rwxr-xr-xsrc/ape_tag.c2
-rwxr-xr-x[-rw-r--r--]src/bar.c7
-rw-r--r--src/base64.c206
-rw-r--r--src/base64.h42
-rw-r--r--src/browser.c836
-rwxr-xr-x[-rw-r--r--]src/browser.h9
-rw-r--r--src/cddb.c160
-rwxr-xr-x[-rw-r--r--]src/cddb.h0
-rwxr-xr-xsrc/charset.c45
-rwxr-xr-x[-rw-r--r--]src/easytag.c438
-rwxr-xr-x[-rw-r--r--]src/easytag.h0
-rw-r--r--src/et_core.c110
-rw-r--r--src/et_core.h3
-rw-r--r--[-rwxr-xr-x]src/flac_header.c19
-rw-r--r--[-rwxr-xr-x]src/flac_tag.c1561
-rw-r--r--src/id3_tag.c72
-rw-r--r--src/id3v24_tag.c132
-rw-r--r--[-rwxr-xr-x]src/libapetag/apetaglib.c6
-rwxr-xr-x[-rw-r--r--]src/libmpg123/README0
-rw-r--r--[-rwxr-xr-x]src/libmpg123/mpg123.c2
-rwxr-xr-x[-rw-r--r--]src/log.c69
-rwxr-xr-x[-rw-r--r--]src/log.h12
-rw-r--r--src/misc.c264
-rwxr-xr-xsrc/misc.h1
-rwxr-xr-xsrc/mp4_header.c4
-rw-r--r--[-rwxr-xr-x]src/mp4_tag.c31
-rwxr-xr-xsrc/mpeg_header.c2
-rwxr-xr-x[-rw-r--r--]src/msgbox.c300
-rwxr-xr-x[-rw-r--r--]src/msgbox.h52
-rwxr-xr-xsrc/ogg_header.c28
-rw-r--r--[-rwxr-xr-x]src/ogg_tag.c147
-rw-r--r--src/picture.c199
-rw-r--r--[-rwxr-xr-x]src/picture.h30
-rwxr-xr-x[-rw-r--r--]src/prefs.c67
-rwxr-xr-x[-rw-r--r--]src/prefs.h0
-rw-r--r--src/scan.c189
-rwxr-xr-x[-rw-r--r--]src/scan.h0
-rwxr-xr-x[-rw-r--r--]src/setting.c107
-rwxr-xr-x[-rw-r--r--]src/setting.h0
-rwxr-xr-xsrc/win32/nsis/easytag-header.bmpbin0 -> 25818 bytes
-rwxr-xr-xsrc/win32/nsis/easytag-install.bmpbin0 -> 154542 bytes
-rwxr-xr-xsrc/win32/nsis/easytag-install.icobin0 -> 16958 bytes
-rwxr-xr-xsrc/win32/nsis/easytag-uninstall.bmpbin0 -> 154542 bytes
-rwxr-xr-x[-rw-r--r--]src/win32/win32dep.c64
-rwxr-xr-x[-rw-r--r--]src/win32/win32dep.h9
-rwxr-xr-xsrc/win32/win_easytag.c5
50 files changed, 3253 insertions, 2121 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 9383d83..5e9961d 100755..100644
--- 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
index aede25d..dd86f83 100755..100644
--- 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 <id3.h>
# endif
#endif
+#ifdef ENABLE_FLAC
+# include <FLAC/metadata.h>
+#endif
#include <errno.h>
#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
index 6f75403..95cc179 100644..100755
--- 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 <stdlib.h>
+#include <string.h>
+#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, &current_filename,
+ LIST_FILE_NAME, &current_filename,
LIST_FILE_POINTER, &current_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, _("<All albums>"),
- ALBUM_NUM_FILES, g_list_length(g_list_first(etfilelist)),
+ ALBUM_NAME, _("<All albums>"),
+ 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
index fb02029..098b1b3 100644..100755
--- 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), &currentIter, (GtkTreePath*)selectedRows->data))
- gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), &currentIter, CDDB_ALBUM_LIST_DATA, &cddbalbumSelected, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), &currentIter,
+ 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
index 9bcfd69..9bcfd69 100644..100755
--- a/src/cddb.h
+++ b/src/cddb.h
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
index 6a3bd4e..6d8bd62 100644..100755
--- 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
index 9823c75..9823c75 100644..100755
--- a/src/easytag.h
+++ b/src/easytag.h
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
index 408b73b..acdf628 100755..100644
--- 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
index a76e1cc..9d3be65 100755..100644
--- 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
index 1f5012e..52fc971 100755..100644
--- 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
index 1a66a66..1a66a66 100644..100755
--- a/src/libmpg123/README
+++ b/src/libmpg123/README
diff --git a/src/libmpg123/mpg123.c b/src/libmpg123/mpg123.c
index 1def17e..dae9327 100755..100644
--- 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
index 155d753..1218a30 100644..100755
--- 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);
@@ -103,6 +107,7 @@ GtkWidget *Create_Log_Area (void)
logListModel = gtk_list_store_new(LOG_COLUMN_COUNT,
G_TYPE_STRING,
G_TYPE_STRING,
+ G_TYPE_STRING,
GDK_TYPE_COLOR,
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
index 2ec4408..d1bb8db 100644..100755
--- 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
index 86b4cff..ab2bdde 100755..100644
--- 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
index f9a8cb7..82953f9 100644..100755
--- 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
index 6b5d663..b3dfaf2 100644..100755
--- a/src/msgbox.h
+++ b/src/msgbox.h
@@ -23,44 +23,10 @@
#define __MSGBOX_H__
-#include <gtk/gtkdialog.h>
-
-
-#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 <gtk/gtk.h>
+/*
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
index ce13c48..bf6e365 100755..100644
--- 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
index eda3af4..cc8ee2e 100755..100644
--- 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
index 7e862d9..8ca00fb 100644..100755
--- 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
index 5c1e122..5c1e122 100644..100755
--- a/src/prefs.h
+++ b/src/prefs.h
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
{
@@ -1810,6 +1828,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
*/
gchar **Scan_Return_File_Tag_Field_From_Mask_Code (File_Tag *FileTag, gchar 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
index de151a2..de151a2 100644..100755
--- a/src/scan.h
+++ b/src/scan.h
diff --git a/src/setting.c b/src/setting.c
index 9b00a32..217ab2d 100644..100755
--- 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
index a2b3042..a2b3042 100644..100755
--- a/src/setting.h
+++ b/src/setting.h
diff --git a/src/win32/nsis/easytag-header.bmp b/src/win32/nsis/easytag-header.bmp
new file mode 100755
index 0000000..85aaeb1
--- /dev/null
+++ b/src/win32/nsis/easytag-header.bmp
Binary files differ
diff --git a/src/win32/nsis/easytag-install.bmp b/src/win32/nsis/easytag-install.bmp
new file mode 100755
index 0000000..5bfd99b
--- /dev/null
+++ b/src/win32/nsis/easytag-install.bmp
Binary files differ
diff --git a/src/win32/nsis/easytag-install.ico b/src/win32/nsis/easytag-install.ico
new file mode 100755
index 0000000..0e8673e
--- /dev/null
+++ b/src/win32/nsis/easytag-install.ico
Binary files differ
diff --git a/src/win32/nsis/easytag-uninstall.bmp b/src/win32/nsis/easytag-uninstall.bmp
new file mode 100755
index 0000000..5cf16db
--- /dev/null
+++ b/src/win32/nsis/easytag-uninstall.bmp
Binary files differ
diff --git a/src/win32/win32dep.c b/src/win32/win32dep.c
index 9e400af..cccde13 100644..100755
--- 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
index 9107852..302ba0a 100644..100755
--- 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);