aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Alex Bennee <alex@bennee.com>2010-07-14 16:04:37 +0100
committerGravatar Alex Bennee <alex@bennee.com>2010-07-14 16:04:37 +0100
commit4103b09671b40013e10cab4d556fd65465fa800f (patch)
tree8be548ec2b569d858f0b2e4f9152d0b47f4684c9 /src
parenta3e202820fd12e3c368c9ed2446740e9b1d16fd7 (diff)
EasyTag 2.1.6
Diffstat (limited to 'src')
-rwxr-xr-xsrc/Makefile.am2
-rw-r--r--src/Makefile.in2
-rwxr-xr-xsrc/Makefile.mingw1
-rwxr-xr-xsrc/about.c6
-rw-r--r--[-rwxr-xr-x]src/bar.c8
-rw-r--r--[-rwxr-xr-x]src/bar.h4
-rwxr-xr-x[-rw-r--r--]src/browser.c236
-rw-r--r--[-rwxr-xr-x]src/browser.h7
-rwxr-xr-xsrc/cddb.c82
-rwxr-xr-xsrc/charset.c19
-rwxr-xr-x[-rw-r--r--]src/easytag.c532
-rwxr-xr-x[-rw-r--r--]src/et_core.c101
-rwxr-xr-xsrc/et_core.h4
-rwxr-xr-x[-rw-r--r--]src/flac_tag.c98
-rwxr-xr-xsrc/id3_tag.c13
-rwxr-xr-x[-rw-r--r--]src/id3v24_tag.c42
-rwxr-xr-xsrc/log.c37
-rwxr-xr-xsrc/log.h2
-rwxr-xr-xsrc/misc.c11
-rwxr-xr-xsrc/ogg_tag.c62
-rwxr-xr-x[-rw-r--r--]src/picture.c73
-rw-r--r--src/scan.c111
-rwxr-xr-x[-rw-r--r--]src/setting.c93
-rw-r--r--[-rwxr-xr-x]src/ui_manager.h5
-rwxr-xr-xsrc/win32/gtkwin32dep.c236
-rwxr-xr-xsrc/win32/gtkwin32dep.h43
-rwxr-xr-xsrc/win32/win32dep.c648
-rwxr-xr-xsrc/win32/win32dep.h51
-rwxr-xr-xsrc/win32/win_easytag.c147
29 files changed, 1811 insertions, 865 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 5e9961d..02dd02e 100755
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -74,6 +74,8 @@ easytag_SOURCES = \
EXTRA_DIST = \
Makefile.mingw \
win32/easytag.rc \
+ win32/gtkwin32dep.c \
+ win32/gtkwin32dep.h \
win32/resource.h \
win32/win32dep.c \
win32/win32dep.h \
diff --git a/src/Makefile.in b/src/Makefile.in
index 6367466..52da17e 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -297,6 +297,8 @@ easytag_SOURCES = \
EXTRA_DIST = \
Makefile.mingw \
win32/easytag.rc \
+ win32/gtkwin32dep.c \
+ win32/gtkwin32dep.h \
win32/resource.h \
win32/win32dep.c \
win32/win32dep.h \
diff --git a/src/Makefile.mingw b/src/Makefile.mingw
index dd86f83..d4ed141 100755
--- a/src/Makefile.mingw
+++ b/src/Makefile.mingw
@@ -108,6 +108,7 @@ DLL_C_SRC = about.c \
vcedit.c \
wavpack_header.c \
wavpack_tag.c \
+ win32/gtkwin32dep.c \
win32/win32dep.c
DLL_OBJECTS = $(DLL_C_SRC:%.c=%.o) $(RC_SRC:%.rc=%.o)
diff --git a/src/about.c b/src/about.c
index 3b19a68..e57f31f 100755
--- a/src/about.c
+++ b/src/about.c
@@ -50,6 +50,7 @@
#ifdef WIN32
# include "win32/win32dep.h"
+# include "win32/gtkwin32dep.h"
#endif
@@ -155,6 +156,7 @@ void Show_About_Window (void)
{" - Björn Olievier ", _("(Dutch translation)")},
{" - Patrik Israelsson ", _("(Swedish translation)")},
{" - Anders Strömer ", _("(Swedish translation)")},
+ {" - Arild Matsson ", _("(Swedish translation)")},
{" - Szel Miklos ", _("(Hungarian translation)")},
{" - Nagy Boldizsar ", _("(Hungarian translation)")},
{" - Mészáros Csaba ", _("(Hungarian translation)")},
@@ -638,7 +640,7 @@ void Show_About_Window (void)
tmp = convert_string(temp, "iso-8859-1", "utf-8",TRUE);
else
tmp = g_strdup(temp);*/
- tmp = Try_To_Validate_Utf8_String(tmp);
+ tmp = Try_To_Validate_Utf8_String(temp);
if (tmp && tmp[0]!=' ') // If first character is a space => 1rst line after title
{
@@ -695,7 +697,7 @@ void Show_About_Window (void)
void About_Window_Go_To_Home_Page (void)
{
#ifdef WIN32
- ET_Win32_Notify_Uri(WEBPAGE);
+ wineasytag_notify_uri(WEBPAGE);
#else
if (system("gnome-moz-remote "WEBPAGE)!=0)
if (system("x-www-browser "WEBPAGE)!=0)
diff --git a/src/bar.c b/src/bar.c
index 95cc179..ab6facc 100755..100644
--- a/src/bar.c
+++ b/src/bar.c
@@ -208,8 +208,12 @@ void Create_UI (GtkWidget **ppmenubar, GtkWidget **pptoolbar)
{ MENU_BROWSER, NULL, _("_Browser"), NULL, NULL, NULL },
{ AM_LOAD_HOME_DIR, GTK_STOCK_HOME, _("Go to _Home Directory"), "<Alt>Home", _("Go to Home Directory"), G_CALLBACK(Browser_Load_Home_Directory) },
- { AM_LOAD_DEFAULT_DIR, GTK_STOCK_HARDDISK, _("Go to _Default Directory"), "<Control>D", _("Go to Default Directory"), G_CALLBACK(Browser_Load_Default_Directory) },
- { AM_SET_PATH_AS_DEFAULT, GTK_STOCK_JUMP_TO, _("Set _Current Path as Default"), NULL, _("Set Current Path as Default"), G_CALLBACK(Set_Current_Path_As_Default) },
+ { AM_LOAD_DESKTOP_DIR, GTK_STOCK_JUMP_TO, _("Go to Desktop Directory"), NULL, _("Go to Desktop Directory"), G_CALLBACK(Browser_Load_Desktop_Directory) },
+ { AM_LOAD_DOCUMENTS_DIR, GTK_STOCK_JUMP_TO, _("Go to Documents Directory"), NULL, _("Go to Documents Directory"), G_CALLBACK(Browser_Load_Documents_Directory) },
+ { AM_LOAD_DOWNLOADS_DIR, GTK_STOCK_JUMP_TO, _("Go to Downloads Directory"), NULL, _("Go to Downloads Directory"), G_CALLBACK(Browser_Load_Downloads_Directory) },
+ { AM_LOAD_MUSIC_DIR, GTK_STOCK_JUMP_TO, _("Go to Music Directory"), NULL, _("Go to Music Directory"), G_CALLBACK(Browser_Load_Music_Directory) },
+ { AM_LOAD_DEFAULT_DIR, GTK_STOCK_JUMP_TO, _("Go to _Default Directory"), "<Control>D", _("Go to Default Directory"), G_CALLBACK(Browser_Load_Default_Directory) },
+ { AM_SET_PATH_AS_DEFAULT, GTK_STOCK_DIRECTORY, _("Set _Current Path as Default"), NULL, _("Set Current Path as Default"), G_CALLBACK(Set_Current_Path_As_Default) },
{ AM_TREE_OR_ARTISTALBUM_VIEW, "easytag-artist-album", _("Tree View | Artist-Album View"), NULL, _("Tree View | Artist-Album View"), G_CALLBACK(Menu_Sort_Action) },
{ AM_RENAME_DIR, GTK_STOCK_INDEX, _("Rename Directory ..."), "F2", _("Rename Directory ..."), G_CALLBACK(Browser_Open_Rename_Directory_Window) },
{ AM_RELOAD_DIRECTORY, GTK_STOCK_REFRESH, _("Reload Directory"), "F5", _("Reload Directory"), G_CALLBACK(Browser_Reload_Directory) },
diff --git a/src/bar.h b/src/bar.h
index 846c2f0..b167e05 100755..100644
--- a/src/bar.h
+++ b/src/bar.h
@@ -69,6 +69,10 @@ GtkWidget *CheckMenuItemBrowseHiddenDirMainMenu;
#define AM_INVERT_SELECTION "SelInv"
#define AM_DELETE_FILE "DeleteFile"
#define AM_LOAD_HOME_DIR "GoToHome"
+#define AM_LOAD_DESKTOP_DIR "GoToDesktop"
+#define AM_LOAD_DOCUMENTS_DIR "GoToDocument"
+#define AM_LOAD_DOWNLOADS_DIR "GoToDownload"
+#define AM_LOAD_MUSIC_DIR "GoToMusic"
#define AM_LOAD_DEFAULT_DIR "GoToDefaultPath"
#define AM_SET_PATH_AS_DEFAULT "SetDefaultPath"
#define AM_RENAME_DIR "RenameDir"
diff --git a/src/browser.c b/src/browser.c
index 69a7dfe..7c86a41 100644..100755
--- a/src/browser.c
+++ b/src/browser.c
@@ -219,6 +219,38 @@ void Browser_Load_Home_Directory (void)
Browser_Tree_Select_Dir(HOME_VARIABLE);
}
+/*
+ * Load desktop directory
+ */
+void Browser_Load_Desktop_Directory (void)
+{
+ Browser_Tree_Select_Dir((gchar *)g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));
+}
+
+/*
+ * Load documents directory
+ */
+void Browser_Load_Documents_Directory (void)
+{
+ Browser_Tree_Select_Dir((gchar *)g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));
+}
+
+/*
+ * Load downloads directory
+ */
+void Browser_Load_Downloads_Directory (void)
+{
+ Browser_Tree_Select_Dir((gchar *)g_get_user_special_dir(G_USER_DIRECTORY_DOWNLOAD));
+}
+
+/*
+ * Load music directory
+ */
+void Browser_Load_Music_Directory (void)
+{
+ Browser_Tree_Select_Dir((gchar *)g_get_user_special_dir(G_USER_DIRECTORY_MUSIC));
+}
+
/*
* Load default directory
@@ -227,7 +259,7 @@ void Browser_Load_Default_Directory (void)
{
gchar *path_utf8;
gchar *path;
-
+
path_utf8 = g_strdup(DEFAULT_PATH_TO_MP3);
if (!path_utf8 || strlen(path_utf8)<=0)
{
@@ -238,7 +270,7 @@ void Browser_Load_Default_Directory (void)
// '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);
}
@@ -258,7 +290,7 @@ gchar *Browser_Tree_Get_Path_Of_Selected_Node (void)
if (!BrowserTree) return NULL;
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserTree));
- if (selection
+ if (selection
&& gtk_tree_selection_get_selected(selection, NULL, &selectedIter))
{
gtk_tree_model_get(GTK_TREE_MODEL(directoryTreeModel), &selectedIter,
@@ -385,7 +417,7 @@ void Browser_Parent_Button_Clicked (void)
void Browser_Label_Set_Text (gchar *text)
{
if (BrowserLabel && text)
- gtk_label_set_text(GTK_LABEL(BrowserLabel),text?text:"");
+ gtk_label_set_text(GTK_LABEL(BrowserLabel),text ? text : "");
}
/*
@@ -531,9 +563,9 @@ gboolean Browser_List_Key_Press (GtkWidget *list, GdkEvent *event, gpointer data
valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &currentIter, currentPath);
if (valid)
{
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
- LIST_FILE_POINTER, &currentETFile,
- LIST_FILE_NAME, &current_filename,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
+ LIST_FILE_POINTER, &currentETFile,
+ LIST_FILE_NAME, &current_filename,
-1);
/* UTF-8 comparison */
@@ -648,9 +680,9 @@ void Browser_Tree_Collapse (void)
/*
* Set a row (or node) visible in the TreeView (by scrolling the tree)
*/
-void Browser_Tree_Set_Node_Visible (GtkWidget *directoryView, GtkTreePath * path)
+void Browser_Tree_Set_Node_Visible (GtkWidget *directoryView, GtkTreePath *path)
{
- if (!directoryView) return;
+ if (!directoryView || !path) return;
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(directoryView), path, NULL, TRUE, 0.5, 0.0);
}
@@ -668,7 +700,7 @@ void Browser_List_Set_Row_Visible (GtkTreeModel *treeModel, GtkTreeIter *rowIter
*/
GtkTreePath *rowPath;
- if (!treeModel) return;
+ if (!treeModel || !rowIter) return;
rowPath = gtk_tree_model_get_path(treeModel, rowIter);
gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(BrowserList), rowPath, NULL, FALSE, 0, 0);
@@ -758,9 +790,9 @@ gboolean Browser_Tree_Node_Selected (GtkTreeSelection *selection, gpointer user_
{
gboolean dir_loaded;
GtkTreeIter parentIter;
-
+
dir_loaded = Read_Directory(pathName);
-
+
// If the directory can't be loaded, the directory musn't exist.
// So we load the parent node and refresh the children
if (dir_loaded == FALSE)
@@ -858,9 +890,9 @@ gint Browser_Tree_Select_Dir (gchar *current_path)
#endif
- /* Don't check here if the path is valid. It will be done later when
+ /* Don't check here if the path is valid. It will be done later when
* selecting a node in the tree */
-
+
Browser_Update_Current_Path(current_path);
parts = g_strsplit((const gchar*)current_path, G_DIR_SEPARATOR_S, 0);
@@ -962,7 +994,7 @@ void Browser_List_Row_Selected (GtkTreeSelection *selection, gpointer data)
// Returns the last line selected (in ascending line order) to display the item
lastSelected = (GtkTreePath *)g_list_last(selectedRows)->data;
if (gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &lastFile, lastSelected))
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &lastFile,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &lastFile,
LIST_FILE_POINTER, &fileETFile, -1);
Action_Select_Nth_File_By_Etfile(fileETFile);
@@ -1093,14 +1125,14 @@ void Browser_List_Refresh_Whole_List (void)
// Refresh filename and other fields
gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &iter,
LIST_FILE_POINTER, &ETFile, -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,
+
+ gtk_list_store_set(fileListModel, &iter,
LIST_FILE_NAME, current_basename_utf8,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
@@ -1251,11 +1283,11 @@ void Browser_List_Refresh_File_In_List (ET_File *ETFile)
// 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,
+
+ gtk_list_store_set(fileListModel, &selectedIter,
LIST_FILE_NAME, current_basename_utf8,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
@@ -1358,10 +1390,10 @@ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter)
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,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), iter,
+ LIST_FILE_POINTER, &rowETFile,
+ LIST_FILE_OTHERDIR, &otherdir,
+ //LIST_FILE_NAME, &temp,
-1);
// Must change background color?
@@ -1375,22 +1407,22 @@ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter)
{
if (CHANGED_FILES_DISPLAYED_TO_BOLD)
{
- gtk_list_store_set(fileListModel, iter,
- LIST_FONT_WEIGHT, PANGO_WEIGHT_BOLD,
- LIST_ROW_BACKGROUND, backgroundcolor,
+ gtk_list_store_set(fileListModel, iter,
+ 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_ROW_BACKGROUND, backgroundcolor,
+ gtk_list_store_set(fileListModel, iter,
+ 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_ROW_BACKGROUND, backgroundcolor,
+ gtk_list_store_set(fileListModel, iter,
+ LIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
+ LIST_ROW_BACKGROUND, backgroundcolor,
LIST_ROW_FOREGROUND, NULL ,-1);
}
@@ -1399,8 +1431,8 @@ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter)
/*if (rowETFile)
{
File_Tag *FileTag = ((File_Tag *)((ET_File *)rowETFile)->FileTag->data);
-
- gtk_list_store_set(fileListModel, iter,
+
+ gtk_list_store_set(fileListModel, iter,
LIST_FILE_TITLE, FileTag->title,
LIST_FILE_ARTIST, FileTag->artist,
LIST_FILE_ALBUM, FileTag->album,
@@ -1415,7 +1447,7 @@ void Browser_List_Set_Row_Appearance (GtkTreeIter *iter)
LIST_FILE_ENCODED_BY, FileTag->encoded_by,
-1);
}*/
-
+
// Frees allocated item from gtk_tree_model_get...
//g_free(temp);
}
@@ -1446,7 +1478,7 @@ void Browser_List_Remove_File (ET_File *searchETFile)
valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &currentIter, currentPath);
if (valid)
{
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
LIST_FILE_POINTER, &currentETFile, -1);
if (currentETFile == searchETFile)
@@ -1501,7 +1533,7 @@ void Browser_List_Select_File_By_Etfile (ET_File *searchETFile, gboolean select_
/*
* Select the specified file in the list, by its ETFile
* - startPath : if set : starting path to try increase speed
- * - returns allocated "currentPath" to free
+ * - returns allocated "currentPath" to free
*/
GtkTreePath *Browser_List_Select_File_By_Etfile2 (ET_File *searchETFile, gboolean select_it, GtkTreePath *startPath)
{
@@ -1522,7 +1554,7 @@ GtkTreePath *Browser_List_Select_File_By_Etfile2 (ET_File *searchETFile, gboolea
valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &currentIter, startPath);
if (valid)
{
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
LIST_FILE_POINTER, &currentETFile, -1);
// It is the good file?
if (currentETFile == searchETFile)
@@ -1541,7 +1573,7 @@ GtkTreePath *Browser_List_Select_File_By_Etfile2 (ET_File *searchETFile, gboolea
valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &currentIter, currentPath);
if (valid)
{
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
LIST_FILE_POINTER, &currentETFile, -1);
if (currentETFile == searchETFile)
@@ -1583,14 +1615,18 @@ void Browser_List_Select_File_By_Iter (GtkTreeIter *rowIter, gboolean select_it)
* Select the specified file in the list, by a string representation of an iter
* e.g. output of gtk_tree_model_get_string_from_iter()
*/
-void Browser_List_Select_File_By_Iter_String (const gchar* stringIter, gboolean select_it)
+ET_File *Browser_List_Select_File_By_Iter_String (const gchar* stringIter, gboolean select_it)
{
GtkTreeIter iter;
+ ET_File *current_etfile = NULL;
- if (!fileListModel || !BrowserList) return;
+ if (!fileListModel || !BrowserList) return NULL;
if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(fileListModel), &iter, stringIter))
{
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &iter,
+ LIST_FILE_POINTER, &current_etfile, -1);
+
if (select_it)
{
GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(BrowserList));
@@ -1605,6 +1641,8 @@ void Browser_List_Select_File_By_Iter_String (const gchar* stringIter, gboolean
}
Browser_List_Set_Row_Visible(GTK_TREE_MODEL(fileListModel), &iter);
}
+
+ return current_etfile;
}
/*
@@ -1680,7 +1718,7 @@ void Browser_List_Unselect_File_By_Etfile(ET_File *searchETFile)
valid = gtk_tree_model_get_iter(GTK_TREE_MODEL(fileListModel), &currentIter, currentPath);
if (valid)
{
- gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
+ gtk_tree_model_get(GTK_TREE_MODEL(fileListModel), &currentIter,
LIST_FILE_POINTER, &currentETFile, -1);
if (currentETFile == searchETFile)
@@ -2072,7 +2110,7 @@ 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,
+ gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), &iter,
ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1);
Browser_Album_List_Load_Files(AlbumList, NULL);
}
@@ -2086,7 +2124,7 @@ void Browser_Artist_List_Set_Row_Appearance (GtkTreeIter *iter)
GList *etfilelist;
gboolean not_all_saved = FALSE;
- gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), iter,
+ gtk_tree_model_get(GTK_TREE_MODEL(artistListModel), iter,
ARTIST_ALBUM_LIST_POINTER, &AlbumList, -1);
// Change the style (red/bold) of the row if one of the files was changed
@@ -2100,13 +2138,13 @@ 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,
+ 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,
+ gtk_list_store_set(artistListModel, iter,
+ ARTIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
ARTIST_ROW_FOREGROUND, &RED, -1);
}
not_all_saved = TRUE;
@@ -2116,15 +2154,15 @@ void Browser_Artist_List_Set_Row_Appearance (GtkTreeIter *iter)
}
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,
+ gtk_list_store_set(artistListModel, iter,
+ ARTIST_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
ARTIST_ROW_FOREGROUND, NULL, -1);
}
-
+
}
@@ -2242,7 +2280,7 @@ 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,
+ gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), &iter,
ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1);
// Save the current displayed data
@@ -2266,7 +2304,7 @@ 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,
+ gtk_tree_model_get(GTK_TREE_MODEL(albumListModel), iter,
ALBUM_ETFILE_LIST_POINTER, &etfilelist, -1);
// Change the style (red/bold) of the row if one of the files was changed
@@ -2277,12 +2315,12 @@ 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,
+ 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,
+ gtk_list_store_set(albumListModel, iter,
ALBUM_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
ALBUM_ROW_FOREGROUND, &RED, -1);
}
@@ -2291,11 +2329,11 @@ void Browser_Album_List_Set_Row_Appearance (GtkTreeIter *iter)
}
etfilelist = etfilelist->next;
}
-
+
// Reset style if all files saved
if (not_all_saved == FALSE)
{
- gtk_list_store_set(albumListModel, iter,
+ gtk_list_store_set(albumListModel, iter,
ALBUM_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
ALBUM_ROW_FOREGROUND, NULL, -1);
}
@@ -2361,6 +2399,7 @@ void Browser_Area_Set_Sensitive (gboolean activate)
gtk_widget_set_sensitive(GTK_WIDGET(BrowserArtistList),activate);
gtk_widget_set_sensitive(GTK_WIDGET(BrowserAlbumList), activate);
gtk_widget_set_sensitive(GTK_WIDGET(BrowserButton), activate);
+ gtk_widget_set_sensitive(GTK_WIDGET(BrowserLabel), activate);
}
@@ -2704,9 +2743,9 @@ static gboolean check_for_subdir (gchar *path)
if ((g_ascii_strcasecmp(dirent->d_name,".") != 0)
&& (g_ascii_strcasecmp(dirent->d_name,"..") != 0)
// Display hidden directories is needed, or keep only the not hidden directories
- && (BROWSE_HIDDEN_DIR
- || !( (g_ascii_strncasecmp(dirent->d_name,".", 1) == 0)
- && (strlen(dirent->d_name) > 1)
+ && (BROWSE_HIDDEN_DIR
+ || !( (g_ascii_strncasecmp(dirent->d_name,".", 1) == 0)
+ && (strlen(dirent->d_name) > 1)
&& (g_ascii_strncasecmp(dirent->d_name+1,".", 1) != 0) ))
)
{
@@ -2744,6 +2783,34 @@ static gboolean check_for_subdir (gchar *path)
GdkPixbuf *Pixmap_From_Directory_Permission (gchar *path)
{
DIR *dir;
+ struct stat statbuf;
+
+
+#if 0
+ // TESTING : to display a different icon for non writable directories
+ if (stat(path,&statbuf) == 0)
+ {
+ //aaaaaaaaaaaaaaaaaaaaaaaaa
+ //g_print(">>%04X %x %x %s\n",statbuf.st_mode,S_IRUSR|S_IRGRP,S_IWUSR|S_IWGRP,path);
+ g_print(">>%04X %x %x %s\n",statbuf.st_mode,S_IRUSR,S_IWUSR,path);
+ if ( (statbuf.st_mode & ~S_IRUSR)==0 )
+ {
+ return closed_folder_unreadable_pixmap;
+
+ }else if ( (statbuf.st_mode & ~S_IWUSR)==0 )
+ {
+ return closed_folder_readonly_pixmap;
+
+ }else
+ {
+ return closed_folder_pixmap;
+ }
+ }else
+ {
+ return closed_folder_pixmap;
+ }
+
+#else
if( (dir=opendir(path)) == NULL )
{
@@ -2754,6 +2821,7 @@ GdkPixbuf *Pixmap_From_Directory_Permission (gchar *path)
closedir(dir);
}
return closed_folder_pixmap;
+#endif
}
@@ -2828,9 +2896,9 @@ static void expand_cb (GtkWidget *tree, GtkTreeIter *iter, GtkTreePath *gtreePat
&& (g_ascii_strcasecmp(dirent->d_name,".") != 0)
&& (g_ascii_strcasecmp(dirent->d_name,"..") != 0)
// Display hidden directories is needed, or keep only the not hidden directories
- && (BROWSE_HIDDEN_DIR
- || !( (g_ascii_strncasecmp(dirent->d_name,".", 1) == 0)
- && (strlen(dirent->d_name) > 1)
+ && (BROWSE_HIDDEN_DIR
+ || !( (g_ascii_strncasecmp(dirent->d_name,".", 1) == 0)
+ && (strlen(dirent->d_name) > 1)
&& (g_ascii_strncasecmp(dirent->d_name+1,".", 1) != 0) ))
)
{
@@ -2841,7 +2909,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);
@@ -3014,7 +3082,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
/*
* The label for displaying number of files in path (without subdirs)
*/
- BrowserLabel = gtk_label_new(" ... ");
+ BrowserLabel = gtk_label_new(_("... file(s)"));
gtk_box_pack_start(GTK_BOX(HBox),BrowserLabel,FALSE,FALSE,2);
@@ -3091,7 +3159,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
BrowserTree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(directoryTreeModel));
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]));
@@ -3100,13 +3168,13 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
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,
+ "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,
+ "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);
@@ -3321,8 +3389,8 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
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
column = gtk_tree_view_column_new();
renderer = gtk_cell_renderer_text_new();
@@ -3336,7 +3404,7 @@ 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();
@@ -3350,7 +3418,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3364,7 +3432,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3378,7 +3446,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3392,7 +3460,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3406,7 +3474,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3420,7 +3488,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3434,7 +3502,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3448,7 +3516,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3462,7 +3530,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3476,7 +3544,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
@@ -3490,7 +3558,7 @@ GtkWidget *Create_Browser_Items (GtkWidget *parent)
"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();
diff --git a/src/browser.h b/src/browser.h
index 098b1b3..3ce9fa6 100755..100644
--- a/src/browser.h
+++ b/src/browser.h
@@ -153,7 +153,7 @@ void Browser_List_Clear (void);
void Browser_List_Select_File_By_Etfile (ET_File *ETFile, gboolean select_it);
GtkTreePath *Browser_List_Select_File_By_Etfile2 (ET_File *searchETFile, gboolean select_it, GtkTreePath *startPath);
void Browser_List_Select_File_By_Iter (GtkTreeIter *iter, gboolean select_it);
-void Browser_List_Select_File_By_Iter_String(const gchar* stringiter, gboolean select_it);
+ET_File *Browser_List_Select_File_By_Iter_String(const gchar* stringiter, gboolean select_it);
ET_File *Browser_List_Select_File_By_DLM (const gchar* string, gboolean select_it);
void Browser_List_Unselect_File_By_Etfile (ET_File *ETFile);
void Browser_List_Unselect_File_By_Iter (GtkTreeIter *iter);
@@ -179,6 +179,11 @@ void Browser_Display_Tree_Or_Artist_Album_List (void);
void Browser_Area_Set_Sensitive (gboolean activate);
void Browser_Load_Home_Directory (void);
+void Browser_Load_Desktop_Directory (void);
+void Browser_Load_Documents_Directory (void);
+void Browser_Load_Downloads_Directory (void);
+void Browser_Load_Music_Directory (void);
+
void Browser_Load_Default_Directory (void);
void Browser_Reload_Directory (void);
gchar *Browser_Tree_Get_Path_Of_Selected_Node (void);
diff --git a/src/cddb.c b/src/cddb.c
index 8d4cf7f..f23de7e 100755
--- a/src/cddb.c
+++ b/src/cddb.c
@@ -772,7 +772,7 @@ void Open_Cddb_Window (void)
// Check box to use DLM (also used in the preferences window)
CddbUseDLM2 = gtk_check_button_new_with_label(_("Match lines with the Levenshtein algorithm"));
gtk_box_pack_start(GTK_BOX(hbox),CddbUseDLM2,FALSE,FALSE,2);
- // Doesn't activate it by default because if the new user don't pay attention to it,
+ // Doesn't activate it by default because if the new user don't pay attention to it,
// it will not understand why the cddb results aren't loaded correctly...
//gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(CddbUseDLM2),CDDB_USE_DLM);
gtk_tooltips_set_tip(Tips,CddbUseDLM2,_("When activating this option, the "
@@ -1503,12 +1503,12 @@ GtkWidget *Create_Cddb_Track_List_Popup_Menu(GtkWidget *list)
MenuItem = gtk_menu_item_new_with_label(_("Unselect all lines"));
gtk_menu_shell_append(GTK_MENU_SHELL(CddbPopupMenu), MenuItem);
- g_signal_connect(G_OBJECT(MenuItem),"activate",
+ g_signal_connect(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Cddb_Track_List_Unselect_All),NULL);
MenuItem = gtk_menu_item_new_with_label(_("Invert selection"));
gtk_menu_shell_append(GTK_MENU_SHELL(CddbPopupMenu), MenuItem);
- g_signal_connect(G_OBJECT(MenuItem),"activate",
+ g_signal_connect(G_OBJECT(MenuItem),"activate",
G_CALLBACK(Cddb_Track_List_Invert_Selection),NULL);
MenuItem = gtk_menu_item_new();
@@ -1714,6 +1714,7 @@ gint Cddb_Write_Result_To_File (gint socket_id, gulong *bytes_read_total)
{
gchar *home_path = NULL;
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
@@ -1725,8 +1726,13 @@ gint Cddb_Write_Result_To_File (gint socket_id, gulong *bytes_read_total)
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
NULL);
-
file_path = g_strconcat(home_path,CDDB_RESULT_FILE,NULL);
+
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( (file=fopen(file_path,"w+")) != NULL )
{
gchar cddb_out[MAX_STRING_LEN+1];
@@ -1747,7 +1753,7 @@ gint Cddb_Write_Result_To_File (gint socket_id, gulong *bytes_read_total)
*bytes_read_total += bytes_read;
//g_print("\nLine : %lu : %s\n",bytes_read,cddb_out);
-
+
// Display message
size_str = Convert_Size_1(*bytes_read_total);
msg = g_strdup_printf(_("Receiving data (%s) ..."),size_str);
@@ -1802,6 +1808,7 @@ gint Cddb_Read_Line (FILE **file, gchar **cddb_out)
// Open the file for reading the first time
gchar *home_path;
gchar *file_path;
+ gchar *file_path_tmp;
home_path = g_strconcat(HOME_VARIABLE,
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
@@ -1809,6 +1816,11 @@ gint Cddb_Read_Line (FILE **file, gchar **cddb_out)
file_path = g_strconcat(home_path,CDDB_RESULT_FILE,NULL);
g_free(home_path);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( (*file=fopen(file_path,"r"))==0 )
{
Log_Print(LOG_ERROR,_("Can't open file '%s' (%s)"),file_path,g_strerror(errno));
@@ -1831,10 +1843,10 @@ gint Cddb_Read_Line (FILE **file, gchar **cddb_out)
// On error, or EOF
fclose(*file);
*file = NULL;
-
+
//*cddb_out = NULL;
*cddb_out = g_strdup(""); // To avoid a crash
-
+
return 0;
}
@@ -1997,7 +2009,7 @@ 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,
+ gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), &currentIter,
CDDB_ALBUM_LIST_DATA, &cddbalbumSelected, -1);
}
@@ -2889,7 +2901,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void)
}else if (file_selectedcount > 99)
{
// The CD redbook standard defines the maximum number of tracks as 99, any
- // queries with more than 99 tracks will never return a result.
+ // queries with more than 99 tracks will never return a result.
msg = g_strdup_printf(_("More than 99 files selected! Can't send request!"));
gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,msg);
g_free(msg);
@@ -3056,7 +3068,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void)
g_free(file_path);
}
-
+
}else
{
@@ -3084,7 +3096,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void)
cddb_server_port = CDDB_SERVER_PORT_AUTOMATIC_SEARCH2;
cddb_server_cgi_path = g_strdup(CDDB_SERVER_CGI_PATH_AUTOMATIC_SEARCH2);
}
-
+
// Check values
if (!cddb_server_name || strcmp(cddb_server_name,"")==0)
continue;
@@ -3215,7 +3227,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void)
|| strncmp(cddb_out_tmp,"211",3)==0) )
cddb_out_tmp = cddb_out_tmp + 4;
- // Reading of lines with albums (skiping return code lines :
+ // Reading of lines with albums (skiping return code lines :
// "211 Found inexact matches, list follows (until terminating `.')" )
if (cddb_out != NULL && strstr(cddb_out_tmp,"/") != NULL)
{
@@ -3266,7 +3278,7 @@ gboolean Cddb_Search_Album_From_Selected_Files (void)
fclose(file);
file = NULL;
}
-
+
// Close connection
Cddb_Close_Connection(socket_id);
}
@@ -3363,7 +3375,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
cddb_server_name = cddbalbum->server_name;
cddb_server_port = cddbalbum->server_port;
cddb_server_cgi_path = cddbalbum->server_cgi_path;
-
+
if (!cddb_server_name)
{
// Local access
@@ -3372,16 +3384,16 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
Log_Print(LOG_ERROR,_("Can't load file: '%s' (%s)!"),cddb_server_cgi_path,g_strerror(errno));
return FALSE;
}
-
+
}else
{
// Remote access
-
+
// Connection to the server
if ( (socket_id=Cddb_Open_Connection(CDDB_USE_PROXY?CDDB_PROXY_NAME:cddb_server_name,
CDDB_USE_PROXY?CDDB_PROXY_PORT:cddb_server_port)) <= 0 )
return FALSE;
-
+
// CDDB Request (ex: GET /~cddb/cddb.cgi?cmd=cddb+read+jazz+0200a401&hello=noname+localhost+EasyTAG+0.31&proto=1 HTTP/1.1\r\nHost: freedb.freedb.org:80\r\nConnection: close)
// Without proxy : "GET /~cddb/cddb.cgi?..." but doesn't work with a proxy.
// With proxy : "GET http://freedb.freedb.org/~cddb/cddb.cgi?..."
@@ -3400,7 +3412,7 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
);
g_free(proxy_auth);
//g_print("Request : '%s'\n", cddb_in);
-
+
// Send the request
gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,_("Sending request ..."));
while (gtk_events_pending()) gtk_main_iteration();
@@ -3412,13 +3424,13 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
return FALSE;
}
g_free(cddb_in);
-
-
+
+
// Read the answer
gtk_statusbar_push(GTK_STATUSBAR(CddbStatusBar),CddbStatusBarContext,_("Receiving data ..."));
while (gtk_events_pending())
gtk_main_iteration();
-
+
// Write result in a file
if (Cddb_Write_Result_To_File(socket_id,&bytes_read_total) < 0)
{
@@ -3430,8 +3442,8 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
gtk_widget_set_sensitive(GTK_WIDGET(CddbStopSearchAutoButton),FALSE);
return FALSE;
}
-
-
+
+
// Parse server answer : Check HTTP Header and CDDB Header
file = NULL;
if ( Cddb_Read_Http_Header(&file,&cddb_out) <= 0
@@ -3614,11 +3626,11 @@ gboolean Cddb_Get_Album_Tracks_List (GtkTreeSelection* selection)
fclose(file);
file = NULL;
}
-
+
if (cddb_server_name)
{
// Remote access
-
+
/* Close connection */
Cddb_Close_Connection(socket_id);
}
@@ -3655,7 +3667,7 @@ void Cddb_Album_List_Set_Row_Appearance (GtkTreeIter *row)
{
CddbAlbum *cddbalbum = NULL;
- gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), row,
+ gtk_tree_model_get(GTK_TREE_MODEL(CddbAlbumListModel), row,
CDDB_ALBUM_LIST_DATA, &cddbalbum, -1);
if (cddbalbum->track_list != NULL)
@@ -3670,13 +3682,13 @@ void Cddb_Album_List_Set_Row_Appearance (GtkTreeIter *row)
{
if (cddbalbum->other_version == TRUE)
{
- gtk_list_store_set(CddbAlbumListModel, row,
+ 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,
+ 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);
@@ -3688,20 +3700,20 @@ void Cddb_Album_List_Set_Row_Appearance (GtkTreeIter *row)
{
if (CHANGED_FILES_DISPLAYED_TO_BOLD)
{
- gtk_list_store_set(CddbAlbumListModel, row,
+ 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,
+ 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,
+ 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);
@@ -4031,7 +4043,7 @@ gboolean Cddb_Set_Track_Infos_To_File_List (void)
// Build the filename with the path
if (NUMBER_TRACK_FORMATED) snprintf(buffer,sizeof(buffer),"%.*d",NUMBER_TRACK_FORMATED_SPIN_BUTTON,cddbtrackalbum->track_number);
else snprintf(buffer,sizeof(buffer),"%d", cddbtrackalbum->track_number);
-
+
filename_generated_utf8 = g_strconcat(buffer," - ",cddbtrackalbum->track_name,NULL);
ET_File_Name_Convert_Character(filename_generated_utf8); // Replace invalid characters
filename_new_utf8 = ET_File_Name_Generate(etfile,filename_generated_utf8);
@@ -4100,7 +4112,7 @@ gchar *Cddb_Get_Id3_Genre_From_Cddb_Genre (gchar *cddb_genre)
#include "../pixmaps/musicbrainz.xpm"
//#include "../pixmaps/closed_folder.xpm"
-/*
+/*
* Returns the pixmap to display following the server name
*/
GdkPixbuf *Cddb_Get_Pixbuf_From_Server_Name (gchar *server_name)
@@ -4145,7 +4157,7 @@ char *base64_encode (char *str)
table[62] = '+';
table[63] = '/';
-
+
num = strlen (str) / 3;
if (strlen (str) % 3 > 0)
num++;
@@ -4178,7 +4190,7 @@ gchar *Cddb_Format_Proxy_Authentification (void)
if (CDDB_USE_PROXY && CDDB_PROXY_USER_NAME != NULL && *CDDB_PROXY_USER_NAME != '\0')
{
-
+
gchar *tempstr;
gchar *str_encoded;
gint size;
diff --git a/src/charset.c b/src/charset.c
index 6684540..b00af23 100755
--- a/src/charset.c
+++ b/src/charset.c
@@ -354,22 +354,23 @@ get_encoding_from_locale (const char *locale)
*/
const gchar *get_locale (void)
{
- if (g_getenv("LC_ALL"))
- return g_getenv("LC_ALL");
+ gchar *loc;
+
+ if ((loc = g_getenv("LC_ALL")) && *loc)
+ return loc;
- else if (g_getenv("LC_CTYPE"))
- return g_getenv("LC_CTYPE");
+ else if ((loc = g_getenv("LC_CTYPE")) && *loc)
+ return loc;
- else if (g_getenv("LANG"))
- return g_getenv("LANG");
+ else if ((loc = g_getenv("LANG")) && *loc)
+ return loc;
- else
- return NULL;
+ else
+ return NULL;
}
-
/*
* convert_string : (don't use with UTF-16 strings)
* - display_error : if TRUE, may return an escaped string and display an error
diff --git a/src/easytag.c b/src/easytag.c
index 38f42ff..ebf50eb 100644..100755
--- a/src/easytag.c
+++ b/src/easytag.c
@@ -117,8 +117,8 @@ void Clear_Header_Fields (void);
gint Make_Dir (const gchar *dirname_old, const gchar *dirname_new);
gint Remove_Dir (const gchar *dirname_old, const gchar *dirname_new);
-void Write_File_Tag (ET_File *ETFile);
-void Rename_File (ET_File *ETFile);
+gboolean Write_File_Tag (ET_File *ETFile, gboolean hide_msgbox);
+gboolean Rename_File (ET_File *ETFile, gboolean hide_msgbox);
gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_files);
gint Delete_File (ET_File *ETFile, gboolean multiple_files);
gint Save_All_Files_With_Answer (gboolean force_saving_files);
@@ -161,7 +161,8 @@ int main (int argc, char *argv[])
#ifdef WIN32
- ET_Win32_Init(hInstance);
+ weasytag_init();
+ //ET_Win32_Init(hInstance);
#else
/* Signal handling to display a message(SIGSEGV, ...) */
signal(SIGBUS,Handle_Crash);
@@ -184,7 +185,13 @@ int main (int argc, char *argv[])
gtk_init(&argc, &argv);
/* Get home variable */
- HOME_VARIABLE = (gchar *)g_getenv("HOME");
+#ifdef WIN32
+ HOME_VARIABLE = (gchar *)weasytag_data_dir();
+#else
+ HOME_VARIABLE = g_get_home_dir();
+ //HOME_VARIABLE = (gchar *)g_getenv("HOME");
+#endif
+
INIT_DIRECTORY = NULL;
/* Starting messages */
@@ -343,7 +350,7 @@ int main (int argc, char *argv[])
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);
@@ -1679,7 +1686,7 @@ void Action_Select_Prev_File (void)
Update_Command_Buttons_Sensivity();
Scan_Rename_File_Generate_Preview();
Scan_Fill_Tag_Generate_Preview();
-
+
if (SET_FOCUS_TO_FIRST_TAG_FIELD)
gtk_widget_grab_focus(GTK_WIDGET(TitleEntry));
}
@@ -1713,7 +1720,7 @@ void Action_Select_Next_File (void)
Update_Command_Buttons_Sensivity();
Scan_Rename_File_Generate_Preview();
Scan_Fill_Tag_Generate_Preview();
-
+
if (SET_FOCUS_TO_FIRST_TAG_FIELD)
gtk_widget_grab_focus(GTK_WIDGET(TitleEntry));
}
@@ -2108,6 +2115,7 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files)
gint progress_bar_index;
gint saving_answer;
gint nb_files_to_save;
+ gint nb_files_changed_by_ext_program;
gchar *msg;
gchar progress_bar_text[30];
GList *etfilelist_tmp;
@@ -2132,17 +2140,30 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files)
widget_focused = gtk_window_get_focus(GTK_WINDOW(MainWindow));
/* Count the number of files to save */
+ /* Count the number of files changed by an external program */
nb_files_to_save = 0;
+ nb_files_changed_by_ext_program = 0;
etfilelist_tmp = etfilelist;
while (etfilelist_tmp)
{
- File_Tag *filetag = ((ET_File *)etfilelist_tmp->data)->FileTag->data;
- File_Name *filename = ((ET_File *)etfilelist_tmp->data)->FileNameNew->data;
+ struct stat statbuf;
+ ET_File *ETFile = (ET_File *)etfilelist_tmp->data;
+ File_Tag *FileTag = (File_Tag *)ETFile->FileTag->data;
+ File_Name *FileName = (File_Name *)ETFile->FileNameNew->data;
+ gchar *filename_cur = ((File_Name *)ETFile->FileNameCur->data)->value;
+ gchar *filename_cur_utf8 = ((File_Name *)ETFile->FileNameCur->data)->value_utf8;
+ gchar *basename_cur_utf8 = g_path_get_basename(filename_cur_utf8);
// Count only the changed files or all files if force_saving_files==TRUE
if ( force_saving_files
- || (filename && filename->saved==FALSE) || (filetag && filetag->saved==FALSE) )
+ || (FileName && FileName->saved==FALSE) || (FileTag && FileTag->saved==FALSE) )
nb_files_to_save++;
+
+ stat(filename_cur,&statbuf);
+ if (ETFile->FileModificationTime != statbuf.st_mtime)
+ nb_files_changed_by_ext_program++;
+ g_free(basename_cur_utf8);
+
etfilelist_tmp = etfilelist_tmp->next;
}
@@ -2163,11 +2184,48 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files)
SF_HideMsgbox_Rename_File = 0;
Main_Stop_Button_Pressed = 0;
- uiaction = gtk_ui_manager_get_action(UIManager, "/ToolBar/Stop");
+ uiaction = gtk_ui_manager_get_action(UIManager, "/ToolBar/Stop"); // Activate the stop button
g_object_set(uiaction, "sensitive", FALSE, NULL);
+ /*
+ * Check if file was changed by an external program
+ */
+ if (nb_files_changed_by_ext_program > 0)
+ {
+ // Some files were changed by other program than EasyTAG
+ GtkWidget *msgbox = NULL;
+ gchar *msg;
+ gint response;
+
+ msg = g_strdup_printf(_("Be careful, severals files (%d file(s)) were changed by an external program.\n"
+ "Do you want to continue anyway?"),nb_files_changed_by_ext_program);
+ msgbox = msg_box_new(_("Saving File(s)..."),
+ GTK_WINDOW(MainWindow),
+ NULL,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ msg,
+ GTK_STOCK_DIALOG_WARNING,
+ GTK_STOCK_NO, GTK_RESPONSE_NO,
+ GTK_STOCK_YES, GTK_RESPONSE_YES,
+ NULL);
+ g_free(msg);
+
+ response = gtk_dialog_run(GTK_DIALOG(msgbox));
+ gtk_widget_destroy(msgbox);
+
+ switch (response)
+ {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ case GTK_RESPONSE_NONE:
+ Main_Stop_Button_Pressed = 1; // To don't enter to following loop
+ break;
+ }
+ }
+
etfilelist_tmp = etfilelist;
- while (etfilelist_tmp)
+ while (etfilelist_tmp && !Main_Stop_Button_Pressed)
{
FileTag = ((ET_File *)etfilelist_tmp->data)->FileTag->data;
FileNameNew = ((ET_File *)etfilelist_tmp->data)->FileNameNew->data;
@@ -2197,8 +2255,9 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files)
if (saving_answer == -1)
{
/* Stop saving files + reinit progress bar */
+ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ProgressBar), "");
gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ProgressBar), 0.0);
- Statusbar_Message(_("All files have been saved..."),TRUE);
+ Statusbar_Message(_("Saving files was stopped..."),TRUE);
/* To update state of command buttons */
Update_Command_Buttons_Sensivity();
Browser_Area_Set_Sensitive(TRUE);
@@ -2219,7 +2278,7 @@ gint Save_List_Of_Files (GList *etfilelist, gboolean force_saving_files)
gtk_tree_path_free(currentPath);
if (Main_Stop_Button_Pressed)
- msg = g_strdup(_("Files have been partially saved..."));
+ msg = g_strdup(_("Saving files was stopped..."));
else
msg = g_strdup(_("All files have been saved..."));
@@ -2413,6 +2472,8 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
gchar *msg = NULL;
gchar *msg_title = NULL;
gint stop_loop = 0;
+ //struct stat statbuf;
+ //gchar *filename_cur = ((File_Name *)ETFile->FileNameCur->data)->value;
gchar *filename_cur_utf8 = ((File_Name *)ETFile->FileNameCur->data)->value_utf8;
gchar *filename_new_utf8 = ((File_Name *)ETFile->FileNameNew->data)->value_utf8;
gchar *basename_cur_utf8, *basename_new_utf8;
@@ -2425,11 +2486,49 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
basename_new_utf8 = g_path_get_basename(filename_new_utf8);
/* Save the current displayed data */
- // Not needed, done before //ET_Save_File_Data_From_UI((ET_File *)ETFileList->data);
+ //ET_Save_File_Data_From_UI((ET_File *)ETFileList->data); // Not needed, because it was done before
FileTag = ETFile->FileTag->data;
FileNameNew = ETFile->FileNameNew->data;
/*
+ * Check if file was changed by an external program
+ */
+ /*stat(filename_cur,&statbuf);
+ if (ETFile->FileModificationTime != statbuf.st_mtime)
+ {
+ // File was changed
+ GtkWidget *msgbox = NULL;
+ gint response;
+
+ msg = g_strdup_printf(_("The file '%s' was changed by an external program.\nDo you want to continue?"),basename_cur_utf8);
+ msgbox = msg_box_new(_("Write File..."),
+ GTK_WINDOW(MainWindow),
+ NULL,
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ msg,
+ GTK_STOCK_DIALOG_WARNING,
+ GTK_STOCK_NO, GTK_RESPONSE_NO,
+ GTK_STOCK_YES, GTK_RESPONSE_YES,
+ NULL);
+ g_free(msg);
+
+ response = gtk_dialog_run(GTK_DIALOG(msgbox));
+ gtk_widget_destroy(msgbox);
+
+ switch (response)
+ {
+ case GTK_RESPONSE_YES:
+ break;
+ case GTK_RESPONSE_NO:
+ case GTK_RESPONSE_NONE:
+ stop_loop = -1;
+ return stop_loop;
+ break;
+ }
+ }*/
+
+
+ /*
* First part: write tag informations (artist, title,...)
*/
// Note : the option 'force_saving_files' is only used to save tags
@@ -2474,7 +2573,7 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
g_free(msg);
SF_ButtonPressed_Write_Tag = response = gtk_dialog_run(GTK_DIALOG(msgbox));
- // When check button in msgbox was activated : do not display the message again
+ // 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);
@@ -2489,8 +2588,19 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
switch (response)
{
case GTK_RESPONSE_YES:
- Write_File_Tag(ETFile);
+ {
+ gboolean rc;
+
+ // if 'SF_HideMsgbox_Write_Tag is TRUE', then errors are displayed only in log
+ rc = Write_File_Tag(ETFile,SF_HideMsgbox_Write_Tag);
+ // if an error occurs when 'SF_HideMsgbox_Write_Tag is TRUE', we don't stop saving...
+ if (rc != TRUE && !SF_HideMsgbox_Write_Tag)
+ {
+ stop_loop = -1;
+ return stop_loop;
+ }
break;
+ }
case GTK_RESPONSE_NO:
break;
case GTK_RESPONSE_CANCEL:
@@ -2589,8 +2699,19 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
switch(response)
{
case GTK_RESPONSE_YES:
- Rename_File(ETFile);
+ {
+ gboolean rc;
+
+ // if 'SF_HideMsgbox_Rename_File is TRUE', then errors are displayed only in log
+ rc = Rename_File(ETFile,SF_HideMsgbox_Rename_File);
+ // if an error occurs when 'SF_HideMsgbox_Rename_File is TRUE', we don't stop saving...
+ if (rc != TRUE && !SF_HideMsgbox_Rename_File)
+ {
+ stop_loop = -1;
+ return stop_loop;
+ }
break;
+ }
case GTK_RESPONSE_NO:
break;
case GTK_RESPONSE_CANCEL:
@@ -2613,11 +2734,14 @@ gint Save_File (ET_File *ETFile, gboolean multiple_files, gboolean force_saving_
/*
* Write tag of the ETFile
+ * Return TRUE => OK
+ * FALSE => error
*/
-void Write_File_Tag (ET_File *ETFile)
+gboolean Write_File_Tag (ET_File *ETFile, gboolean hide_msgbox)
{
gchar *cur_filename_utf8 = ((File_Name *)ETFile->FileNameCur->data)->value_utf8;
gchar *msg;
+ gchar *msg1;
gchar *basename_utf8;
GtkWidget *msgbox;
@@ -2629,7 +2753,7 @@ void Write_File_Tag (ET_File *ETFile)
if (ET_Save_File_Tag_To_HD(ETFile))
{
Statusbar_Message(_("Tag(s) written"),TRUE);
- return;
+ return TRUE;
}
switch ( ((ET_File_Description *)ETFile->ETFileDescription)->TagType)
@@ -2639,25 +2763,37 @@ void Write_File_Tag (ET_File *ETFile)
// Special for Ogg Vorbis because the error is defined into 'vcedit_error(state)'
msg = g_strdup_printf(_("Can't write tag in file '%s'!\n(%s)"),
basename_utf8,ogg_error_msg);
+ msg1 = g_strdup_printf(_("Can't write tag in file '%s'! (%s)"),
+ basename_utf8,ogg_error_msg);
break;
#endif
default:
msg = g_strdup_printf(_("Can't write tag in file '%s'!\n(%s)"),
basename_utf8,g_strerror(errno));
+ msg1 = g_strdup_printf(_("Can't write tag in file '%s'! (%s)"),
+ basename_utf8,g_strerror(errno));
}
- 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);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
+ if (!hide_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(basename_utf8);
+
+ return FALSE;
}
@@ -2717,13 +2853,13 @@ gint Remove_Dir (const gchar *dirname_old, const gchar *dirname_new)
temp_old = g_strdup(dirname_old);
temp_new = g_strdup(dirname_new);
-
+
while (temp_old && temp_new && strcmp(temp_old,temp_new)!=0 )
{
if (rmdir(temp_old)==-1)
{
// Patch from vdaghan : ENOTEMPTY & EEXIST are synonymous and used by some systems
- if (errno != ENOTEMPTY
+ if (errno != ENOTEMPTY
&& errno != EEXIST)
{
g_free(temp_old);
@@ -2734,10 +2870,10 @@ gint Remove_Dir (const gchar *dirname_old, const gchar *dirname_new)
break;
}
}
-
+
temp_end_old = temp_old + strlen(temp_old) - 1;
temp_end_new = temp_new + strlen(temp_new) - 1;
-
+
while (*temp_end_old && *temp_end_old!=G_DIR_SEPARATOR)
{
temp_end_old--;
@@ -2758,8 +2894,10 @@ gint Remove_Dir (const gchar *dirname_old, const gchar *dirname_new)
/*
* Rename the file ETFile
+ * Return TRUE => OK
+ * FALSE => error
*/
-void Rename_File (ET_File *ETFile)
+gboolean Rename_File (ET_File *ETFile, gboolean hide_msgbox)
{
FILE *file;
gchar *tmp_filename = NULL;
@@ -2770,7 +2908,7 @@ void Rename_File (ET_File *ETFile)
gchar *cur_basename_utf8 = g_path_get_basename(cur_filename_utf8); // Only filename
gchar *new_basename_utf8 = g_path_get_basename(new_filename_utf8);
gint fd_tmp;
- gchar *msg;
+ gchar *msg, *msg1;
gchar *dirname_cur;
gchar *dirname_new;
gchar *dirname_cur_utf8;
@@ -2792,34 +2930,42 @@ void Rename_File (ET_File *ETFile)
// Rename to the temporary name
if ( rename(cur_filename,tmp_filename)!=0 ) // => rename() fails
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
/* 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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't rename file '%s' to '%s'! (%s)"),
+ cur_basename_utf8,new_basename_utf8,g_strerror(errno));
+ if (!hide_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);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
Statusbar_Message(_("File(s) not renamed..."),TRUE);
g_free(tmp_filename);
g_free(cur_basename_utf8);
g_free(new_basename_utf8);
- return;
+ return FALSE;
}
- /* Check if the new file name already exists. Must be done after changing
- * filename to the temporary name, else we can't detect the problem under
- * Linux when renaming a file 'aa.mp3' to 'AA.mp3' and if the last one
+ /* Check if the new file name already exists. Must be done after changing
+ * filename to the temporary name, else we can't detect the problem under
+ * Linux when renaming a file 'aa.mp3' to 'AA.mp3' and if the last one
* already exists */
if ( (file=fopen(new_filename,"r"))!=NULL )
{
@@ -2830,51 +2976,66 @@ void Rename_File (ET_File *ETFile)
// Restore the initial name
if ( rename(tmp_filename,cur_filename)!=0 ) // => rename() fails
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
/* 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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't rename file '%s' to '%s'! (%s)"),
+ new_basename_utf8,cur_basename_utf8,g_strerror(errno));
+ if (!hide_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);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
Statusbar_Message(_("File(s) not renamed..."),TRUE);
g_free(tmp_filename);
g_free(cur_basename_utf8);
g_free(new_basename_utf8);
- return;
+ return FALSE;
}
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..."),
- GTK_WINDOW(MainWindow),
- NULL,
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- msg,
- GTK_STOCK_DIALOG_ERROR,
- GTK_STOCK_OK, GTK_RESPONSE_OK,
- NULL);
+ msg1 = g_strdup_printf(_("Can't rename file '%s' because the following "
+ "file already exists: '%s'"),cur_basename_utf8,new_basename_utf8);
+ if (!hide_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(msg);
+
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
Statusbar_Message(_("File(s) not renamed..."),TRUE);
g_free(new_basename_utf8);
g_free(cur_basename_utf8);
- return;
-
+ return FALSE;
}
/* If files are in different directories, we need to create the new
@@ -2886,7 +3047,7 @@ void Rename_File (ET_File *ETFile)
{
if (Make_Dir(dirname_cur,dirname_new))
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
/* Renaming file has failed, but we try to set the initial name */
@@ -2895,25 +3056,33 @@ 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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't create target directory '%s'! (%s)"),
+ dirname_new_utf8,g_strerror(errno));
+ if (!hide_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(dirname_new_utf8);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
g_free(tmp_filename);
g_free(cur_basename_utf8);
g_free(new_basename_utf8);
g_free(dirname_cur);
g_free(dirname_new);
- return;
+ return FALSE;
}
}
@@ -2926,38 +3095,46 @@ void Rename_File (ET_File *ETFile)
ETFile->FileNameCur = ETFile->FileNameNew;
/* Now the file was renamed, so mark his state */
ET_Mark_File_Name_As_Saved(ETFile);
-
+
Statusbar_Message(_("File(s) renamed..."),TRUE);
/* Remove the of directory (check automatically if it is empty) */
if (Remove_Dir(dirname_cur,dirname_new))
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
/* Removing directories failed */
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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't remove old directory '%s'! (%s)"),
+ dirname_cur_utf8,g_strerror(errno));
+ if (!hide_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(dirname_cur_utf8);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
g_free(tmp_filename);
g_free(cur_basename_utf8);
g_free(new_basename_utf8);
g_free(dirname_cur);
g_free(dirname_new);
- return;
+ return FALSE;
}
}else if ( errno==EXDEV )
{
@@ -2972,7 +3149,7 @@ void Rename_File (ET_File *ETFile)
{
/* Delete the old file */
unlink(tmp_filename);
-
+
/* Renaming file has succeeded */
Log_Print(LOG_OK,_("Moved file '%s' to '%s'"),cur_basename_utf8,new_basename_utf8);
@@ -2985,58 +3162,81 @@ void Rename_File (ET_File *ETFile)
/* Remove the of directory (check automatically if it is empty) */
if (Remove_Dir(dirname_cur,dirname_new))
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
-
+
/* Removing directories failed */
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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't remove old directory '%s'! (%s)"),
+ dirname_cur_utf8,g_strerror(errno));
+ if (!hide_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(dirname_cur_utf8);
-
+
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
g_free(tmp_filename);
g_free(cur_basename_utf8);
g_free(new_basename_utf8);
g_free(dirname_cur);
g_free(dirname_new);
- return;
+ return FALSE;
}
}else
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
-
+
/* 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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't move file '%s' to '%s'! (%s)"),
+ cur_basename_utf8,new_basename_utf8,g_strerror(errno));
+ if (!hide_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);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
Statusbar_Message(_("File(s) not moved..."),TRUE);
+
+ g_free(tmp_filename);
+ g_free(cur_basename_utf8);
+ g_free(new_basename_utf8);
+ g_free(dirname_cur);
+ g_free(dirname_new);
+ return FALSE;
}
}else
{
- gchar *msg;
+ gchar *msg, *msg1;
GtkWidget *msgbox;
/* Renaming file has failed, but we try to set the initial name */
@@ -3044,25 +3244,37 @@ 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..."),
- 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);
+ msg1 = g_strdup_printf(_("Can't rename file '%s' to '%s'! (%s)"),
+ cur_basename_utf8,new_basename_utf8,g_strerror(errno));
+ if (!hide_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);
+ Log_Print(LOG_ERROR,"%s", msg1);
+ g_free(msg1);
+
Statusbar_Message(_("File(s) not renamed..."),TRUE);
+
+ g_free(tmp_filename);
+ g_free(cur_basename_utf8);
+ g_free(new_basename_utf8);
+ g_free(dirname_cur);
+ g_free(dirname_new);
+ return FALSE;
}
- g_free(tmp_filename);
- g_free(cur_basename_utf8);
- g_free(new_basename_utf8);
- g_free(dirname_cur);
- g_free(dirname_new);
+
+ return TRUE;
}
/*
@@ -3401,7 +3613,7 @@ gboolean Read_Directory (gchar *path_real)
g_free(msg);
Set_Unbusy_Cursor();
ReadingDirectory = FALSE;
-
+
return TRUE;
}
@@ -3437,7 +3649,7 @@ GList *Read_Directory_Recursively (GList *file_list, gchar *path_real, gint recu
else
filename = g_strconcat(path_real,dirent->d_name,NULL);
- if (lstat(filename, &statbuf) == -1)
+ if (stat(filename, &statbuf) == -1)
{
g_free(filename);
continue;
@@ -3643,6 +3855,7 @@ void Update_Command_Buttons_Sensivity (void)
ET_File *etfile;
gboolean has_undo = FALSE;
gboolean has_redo = FALSE;
+ //gboolean has_to_save = FALSE;
GtkTreeSelection *selection;
/* File and Tag frames */
@@ -3710,8 +3923,8 @@ void Update_Command_Buttons_Sensivity (void)
etfile = Browser_List_Get_ETFile_From_Path(selfilelist->data);
has_undo |= ET_File_Data_Has_Undo_Data(etfile);
has_redo |= ET_File_Data_Has_Redo_Data(etfile);
- //has_to_save |= ET_Check_If_File_Is_Saved((ET_File *)etfilelist->data);
- if ((has_undo && has_redo) || !selfilelist->next) // Useless to check the other files
+ //has_to_save |= ET_Check_If_File_Is_Saved(etfile);
+ if ((has_undo && has_redo /*&& has_to_save*/) || !selfilelist->next) // Useless to check the other files
break;
selfilelist = g_list_next(selfilelist);
}
@@ -3732,15 +3945,12 @@ void Update_Command_Buttons_Sensivity (void)
ui_widget_set_sensitive(MENU_FILE, AM_REDO, FALSE);
/* Enable save file command if file has been changed */
- // Desactivated because problem with only one file in the list
- //if (has_to_save)
- //{
- // gtk_widget_set_sensitive(TBSaveButton,FALSE);
- // ui_widget_set_sensitive(AM_SAVE,FALSE);
- //}else
- //{
- ui_widget_set_sensitive(MENU_FILE, AM_SAVE, TRUE);
- //}
+ // Desactivated because problem with only one file in the list, as we can't change the selected file => can't mark file as changed
+ /*if (has_to_save)
+ ui_widget_set_sensitive(MENU_FILE, AM_SAVE, FALSE);
+ else*/
+ ui_widget_set_sensitive(MENU_FILE, AM_SAVE, TRUE);
+
ui_widget_set_sensitive(MENU_FILE, AM_SAVE_FORCED, TRUE);
/* Enable undo command if there are data into main undo list (history list) */
@@ -4319,7 +4529,7 @@ void Convert_Insert_Space (GtkWidget *entry)
gchar *string = g_malloc(string_length+1);
strncpy(string,gtk_entry_get_text(GTK_ENTRY(entry)),string_length);
string[string_length]='\0';
-
+
Scan_Process_Fields_Insert_Space(&string);
gtk_entry_set_text(GTK_ENTRY(entry),string);
g_free(string);
@@ -4630,9 +4840,9 @@ void Display_Usage (void)
"%s/path_to/files Use an absolute path to load,\n"
"path_to/files Use a relative path.\n"
"\n"),xPREFIX);
-
+
#undef xPREFIX
-
+
exit(0);
}
@@ -4648,7 +4858,7 @@ void EasyTAG_Exit (void)
Log_Print(LOG_OK,_("EasyTAG: Normal exit."));
gtk_main_quit();
#ifdef WIN32
- ET_Win32_Cleanup();
+ weasytag_cleanup();
#endif
exit(0);
}
@@ -4710,7 +4920,7 @@ void Quit_MainWindow (void)
case GTK_RESPONSE_NONE:
return;
}
-
+
} else if (CONFIRM_BEFORE_EXIT)
{
msgbox = msg_box_new(_("Confirm..."),
@@ -4758,7 +4968,7 @@ void MainWindow_Apply_Changes (void)
gdk_window_get_size(MainWindow->window,&width,&height);
MAIN_WINDOW_WIDTH = width;
MAIN_WINDOW_HEIGHT = height;
-
+
// Handle panes position
PANE_HANDLE_POSITION1 = GTK_PANED(MainWindowHPaned)->child1_size;
PANE_HANDLE_POSITION2 = GTK_PANED(BrowserHPaned)->child1_size;
diff --git a/src/et_core.c b/src/et_core.c
index cace2c5..567a4bf 100644..100755
--- a/src/et_core.c
+++ b/src/et_core.c
@@ -459,9 +459,10 @@ GList *ET_Add_File_To_File_List (gchar *filename)
gchar *ETFileExtension;
guint ETFileKey;
guint undo_key;
+ struct stat statbuf;
gchar *filename_utf8 = filename_to_display(filename);
const gchar *locale_lc_ctype = getenv("LC_CTYPE");
-
+
if (!filename)
return ETCore->ETFileList;
@@ -474,6 +475,9 @@ GList *ET_Add_File_To_File_List (gchar *filename)
/* Get real extension of the file (keeping the case) */
ETFileExtension = g_strdup(ET_Get_File_Extension(filename));
+ /* Store the modification time of the file to check if the file was changed before saving */
+ stat(filename,&statbuf);
+
/* Fill the File_Name structure for FileNameList */
FileName = ET_File_Name_Item_New();
FileName->saved = TRUE; /* The file hasn't been changed, so it's saved */
@@ -485,7 +489,7 @@ 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 and Onur Kucuk: avoid upper/lower conversion bugs
+ /* Patch from Doruk Fisek and Onur Kucuk: 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 */
@@ -578,19 +582,20 @@ GList *ET_Add_File_To_File_List (gchar *filename)
/* 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...
- ETFile->ETFileKey = ETFileKey;
- ETFile->ETFileDescription = ETFileDescription;
- ETFile->ETFileExtension = ETFileExtension;
- ETFile->FileNameList = g_list_append(NULL,FileName);
- ETFile->FileNameCur = ETFile->FileNameList;
- ETFile->FileNameNew = ETFile->FileNameList;
- ETFile->FileTagList = g_list_append(NULL,FileTag);
- ETFile->FileTag = ETFile->FileTagList;
- ETFile->ETFileInfo = ETFileInfo;
+ ETFile->IndexKey = 0; // Will be renumered after...
+ ETFile->ETFileKey = ETFileKey;
+ ETFile->FileModificationTime = statbuf.st_mtime;
+ ETFile->ETFileDescription = ETFileDescription;
+ ETFile->ETFileExtension = ETFileExtension;
+ ETFile->FileNameList = g_list_append(NULL,FileName);
+ ETFile->FileNameCur = ETFile->FileNameList;
+ ETFile->FileNameNew = ETFile->FileNameList;
+ ETFile->FileTagList = g_list_append(NULL,FileTag);
+ ETFile->FileTag = ETFile->FileTagList;
+ ETFile->ETFileInfo = ETFileInfo;
/* Add the item to the "main list" */
ETCore->ETFileList = g_list_append(ETCore->ETFileList,ETFile);
@@ -616,6 +621,16 @@ GList *ET_Add_File_To_File_List (gchar *filename)
*/
ET_Manage_Changes_Of_File_Data(ETFile,FileName,FileTag);
+ /*
+ * Display a message if the file was changed at start
+ */
+ FileTag = (File_Tag *)ETFile->FileTag->data;
+ FileName = (File_Name *)ETFile->FileNameNew->data;
+ if ( (FileName && FileName->saved==FALSE) || (FileTag && FileTag->saved==FALSE) )
+ {
+ Log_Print(LOG_INFO,_("Automatic corrections applied for file '%s'."), filename_utf8);
+ }
+
/* Add the item to the ArtistAlbum list (placed here to take advantage of previous changes) */
//ET_Add_File_To_Artist_Album_File_List(ETFile);
@@ -1110,8 +1125,8 @@ gint ET_Comp_Func_Sort_File_By_Ascending_Creation_Date (ET_File *ETFile1, ET_Fil
gchar *filename1 = ((File_Name *)ETFile1->FileNameCur->data)->value;
gchar *filename2 = ((File_Name *)ETFile2->FileNameCur->data)->value;
- lstat(filename1, &statbuf1);
- lstat(filename2, &statbuf2);
+ stat(filename1, &statbuf1);
+ stat(filename2, &statbuf2);
// Second criterion
if (statbuf1.st_ctime == statbuf2.st_ctime)
@@ -2432,7 +2447,7 @@ gboolean ET_Set_Filename_File_Name_Item (File_Name *FileName, gchar *filename_ut
{
return FALSE;
}
-
+
return TRUE;
}
@@ -2498,7 +2513,9 @@ void ET_Display_File_Data_To_UI (ET_File *ETFile)
gchar *cur_filename_utf8;
gchar *msg;
- if (!ETFile) return;
+ if (!ETFile
+ || !((GList *)ETFile->FileNameCur)->data ) // For the case where ETFile is an "empty" structure
+ return;
cur_filename = ((File_Name *)((GList *)ETFile->FileNameCur)->data)->value;
cur_filename_utf8 = ((File_Name *)((GList *)ETFile->FileNameCur)->data)->value_utf8;
@@ -2885,7 +2902,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile)
string = g_strdup_printf(_("Pictures (%d)"),nbr_pic);
// Update the notebook tab
gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(TagNoteBook),page,string);
- // Update the notebook menu
+ // Update the notebook menu
gtk_notebook_set_menu_label_text(GTK_NOTEBOOK(TagNoteBook),page,string);
g_free(string);
@@ -2896,7 +2913,7 @@ gboolean ET_Display_File_Tag_To_UI (ET_File *ETFile)
page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(TagNoteBook),1);
// Update the notebook tab
gtk_notebook_set_tab_label_text(GTK_NOTEBOOK(TagNoteBook),page,"Pictures");
- // Update the notebook menu
+ // Update the notebook menu
gtk_notebook_set_menu_label_text(GTK_NOTEBOOK(TagNoteBook),page,"Pictures");
}
@@ -3136,7 +3153,7 @@ gboolean ET_Save_File_Name_From_UI (ET_File *ETFile, File_Name *FileName)
/*
- * Do the same thing of ET_Save_File_Name_From_UI, but without getting the
+ * Do the same thing of ET_Save_File_Name_From_UI, but without getting the
* data from the UI.
*/
gboolean ET_Save_File_Name_Internal (ET_File *ETFile, File_Name *FileName)
@@ -3704,7 +3721,7 @@ gboolean ET_Save_File_Tag_To_HD (ET_File *ETFile)
if (state==TRUE)
{
- // Update date and time of the parent directory of the file after changing the tag
+ // Update date and time of the parent directory of the file after changing the tag
// value (ex: needed for Amarok for refreshing). Note that when renaming a file the
// parent directory is automatically updated.
if (UPDATE_PARENT_DIRECTORY_MODIFICATION_TIME)
@@ -3837,7 +3854,8 @@ gboolean ET_Manage_Changes_Of_File_Data (ET_File *ETFile, File_Name *FileName, F
if (undo_added)
ET_Add_File_To_History_List(ETFile);
- return TRUE; //undo_added;
+ //return TRUE;
+ return undo_added;
}
@@ -4683,6 +4701,8 @@ void ET_Debug_Print_File_List (GList *ETFileList, gchar *file, gint line, gchar
GList *etfilelist;
GList *filenamelist;
GList *filetaglist;
+ char str[50];
+ struct tm *tms;
g_print("\n#### File list from %s:%d - start ####\n",file,line);
@@ -4694,8 +4714,13 @@ void ET_Debug_Print_File_List (GList *ETFileList, gchar *file, gint line, gchar
etfilelist_length = g_list_length(etfilelist);
while (etfilelist)
{
+ time_t time = ((ET_File *)etfilelist->data)->FileModificationTime;
+ tms = localtime(&time);
+ strftime(str,sizeof(str),"%Y.%m.%d %X",tms); // Time without date in current locale
+
g_print("#> ETFile %d/%d (%p)\n",efl_item,etfilelist_length,(ET_File *)etfilelist->data);
g_print("|--- IndexKey : '%d'\n",((ET_File *)etfilelist->data)->IndexKey);
+ g_print("|--- time : '%s'\n",&str);
g_print("|--- file_cur : '%s'\n",((File_Name *)((ET_File *)etfilelist->data)->FileNameCur->data)->value_utf8);
g_print("|--- file_new : '%s'\n",((File_Name *)((ET_File *)etfilelist->data)->FileNameNew->data)->value_utf8);
g_print("|--- saved : '%d'\n",((File_Name *)((ET_File *)etfilelist->data)->FileNameNew->data)->saved);
@@ -4723,20 +4748,20 @@ void ET_Debug_Print_File_List (GList *ETFileList, gchar *file, gint line, gchar
g_print("|--> File_Tag : %d/%d %s\n",ftl_item,filetaglist_length,(filetaglist==((ET_File *)etfilelist->data)->FileTag)?"<<CURRENT>>":"");
g_print("| |-> key : '%d'\n",((File_Tag *)filetaglist->data)->key);
g_print("| |-> saved : '%d'\n",((File_Tag *)filetaglist->data)->saved);
- g_print("| |-> title : '%s'\n",((File_Tag *)filetaglist->data)->title);
- g_print("| |-> artist : '%s'\n",((File_Tag *)filetaglist->data)->artist);
- g_print("| |-> album : '%s'\n",((File_Tag *)filetaglist->data)->album);
- g_print("| |-> disc_number : '%s'\n",((File_Tag *)filetaglist->data)->disc_number);
- g_print("| |-> year : '%s'\n",((File_Tag *)filetaglist->data)->year);
- g_print("| |-> track : '%s'\n",((File_Tag *)filetaglist->data)->track);
- g_print("| |-> track_total : '%s'\n",((File_Tag *)filetaglist->data)->track_total);
- g_print("| |-> genre : '%s'\n",((File_Tag *)filetaglist->data)->genre);
- g_print("| |-> comment : '%s'\n",((File_Tag *)filetaglist->data)->comment);
- g_print("| |-> composer : '%s'\n",((File_Tag *)filetaglist->data)->composer);
- g_print("| |-> orig_artist : '%s'\n",((File_Tag *)filetaglist->data)->orig_artist);
- g_print("| |-> copyright : '%s'\n",((File_Tag *)filetaglist->data)->copyright);
- g_print("| |-> url : '%s'\n",((File_Tag *)filetaglist->data)->url);
- g_print("| |-> encoded_by : '%s'\n",((File_Tag *)filetaglist->data)->encoded_by);
+ g_print("| |-> title : '%s'\n",((File_Tag *)filetaglist->data)->title ? ((File_Tag *)filetaglist->data)->title : "");
+ g_print("| |-> artist : '%s'\n",((File_Tag *)filetaglist->data)->artist ? ((File_Tag *)filetaglist->data)->artist : "");
+ g_print("| |-> album : '%s'\n",((File_Tag *)filetaglist->data)->album ? ((File_Tag *)filetaglist->data)->album : "");
+ g_print("| |-> disc_number : '%s'\n",((File_Tag *)filetaglist->data)->disc_number ? ((File_Tag *)filetaglist->data)->disc_number : "");
+ g_print("| |-> year : '%s'\n",((File_Tag *)filetaglist->data)->year ? ((File_Tag *)filetaglist->data)->year : "");
+ g_print("| |-> track : '%s'\n",((File_Tag *)filetaglist->data)->track ? ((File_Tag *)filetaglist->data)->track : "");
+ g_print("| |-> track_total : '%s'\n",((File_Tag *)filetaglist->data)->track_total ? ((File_Tag *)filetaglist->data)->track_total : "");
+ g_print("| |-> genre : '%s'\n",((File_Tag *)filetaglist->data)->genre ? ((File_Tag *)filetaglist->data)->genre : "");
+ g_print("| |-> comment : '%s'\n",((File_Tag *)filetaglist->data)->comment ? ((File_Tag *)filetaglist->data)->comment : "");
+ g_print("| |-> composer : '%s'\n",((File_Tag *)filetaglist->data)->composer ? ((File_Tag *)filetaglist->data)->composer : "");
+ g_print("| |-> orig_artist : '%s'\n",((File_Tag *)filetaglist->data)->orig_artist ? ((File_Tag *)filetaglist->data)->orig_artist : "");
+ g_print("| |-> copyright : '%s'\n",((File_Tag *)filetaglist->data)->copyright ? ((File_Tag *)filetaglist->data)->copyright : "");
+ g_print("| |-> url : '%s'\n",((File_Tag *)filetaglist->data)->url ? ((File_Tag *)filetaglist->data)->url : "");
+ g_print("| |-> encoded_by : '%s'\n",((File_Tag *)filetaglist->data)->encoded_by ? ((File_Tag *)filetaglist->data)->encoded_by : "");
filetaglist = filetaglist->next;
ftl_item++;
@@ -4786,8 +4811,8 @@ void ET_Debug_Print_Artist_Album_List (gchar *file, gint line, gchar *function)
etfile = (ET_File *)etfilelist->data;
g_print(" | |-> ETFile %d/%d (%p)\n",etfile_item,etfile_length,etfile);
g_print(" | | |-> file : '%s'\n",((File_Name *)etfile->FileNameCur->data)->value_utf8);
- g_print(" | | |-> artist : '%s'\n",((File_Tag *)etfile->FileTag->data)->artist);
- g_print(" | | |-> album : '%s'\n",((File_Tag *)etfile->FileTag->data)->album);
+ g_print(" | | |-> artist : '%s'\n",((File_Tag *)etfile->FileTag->data)->artist ? ((File_Tag *)etfile->FileTag->data)->artist : "");
+ g_print(" | | |-> album : '%s'\n",((File_Tag *)etfile->FileTag->data)->album ? ((File_Tag *)etfile->FileTag->data)->album : "");
etfilelist = etfilelist->next;
etfile_item++;
diff --git a/src/et_core.h b/src/et_core.h
index 8f275c8..63f9565 100755
--- 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 bytes (like lstat) */
+ gulong size; /* Picture size in bytes (like stat) */
guchar *data;
Picture *next;
};
@@ -283,6 +283,8 @@ struct _ET_File
guint ETFileKey; /* Primary key to identify each item of the list (no longer used?) */
+ time_t FileModificationTime; /* Save modification time of the file */
+
ET_File_Description *ETFileDescription;
gchar *ETFileExtension; /* Real extension of the file (keeping the case) (should be placed in ETFileDescription?) */
ET_File_Info *ETFileInfo; /* Header infos: bitrate, duration, ... */
diff --git a/src/flac_tag.c b/src/flac_tag.c
index 55475fb..7c7906e 100644..100755
--- a/src/flac_tag.c
+++ b/src/flac_tag.c
@@ -70,7 +70,7 @@
* - ARTIST : Track performer
* - ORGANIZATION : Name of the organization producing the track (i.e. the 'record label')
* - DESCRIPTION : A short text description of the contents
- * - COMME?T : same than DESCRIPTION
+ * - COMMENT : same than DESCRIPTION
* - GENRE : A short text indication of music genre
* - DATE : Date the track was recorded
* - LOCATION : Location where track was recorded
@@ -90,6 +90,8 @@
**************/
gboolean Flac_Tag_Write_File (FILE *file_in, gchar *filename_in, vcedit_state *state);
+static gboolean Flac_Write_Delimetered_Tag (FLAC__StreamMetadata *vc_block, const gchar *tag_name, gchar *values);
+
/*************
* Functions *
@@ -104,6 +106,7 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
{
FLAC__Metadata_SimpleIterator *iter;
gchar *string = NULL;
+ gchar *filename_utf8 = filename_to_display(filename);
guint i;
#ifndef LEGACY_FLAC // For FLAC >= 1.1.3
Picture *prev_pic = NULL;
@@ -120,7 +123,6 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
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 )
{
// Error with "FLAC__metadata_simple_iterator_new"
@@ -292,6 +294,8 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
field_value = Try_To_Validate_Utf8_String(field_value_tmp);
g_free(field_value_tmp);
FileTag->year = field_value;
+ if (g_utf8_strlen(FileTag->year, -1) > 4)
+ Log_Print(LOG_WARNING,_("The year value '%s' seems to be invalid in file '%s'. The information will be lost while saving tag."),FileTag->year,filename_utf8);
}
}
}
@@ -608,7 +612,6 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
FileTag->other = g_list_append(FileTag->other,g_strndup((const gchar *)field->entry, field->length));
}
}
-
break;
}
@@ -664,7 +667,6 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
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
* (but it will be deleted when rewriting the tag) */
@@ -707,6 +709,7 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
FileTag->saved = FALSE;
}
+ g_free(filename_utf8);
return rc;
}
@@ -731,6 +734,34 @@ gboolean Flac_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
}***/
#endif
+ g_free(filename_utf8);
+ return TRUE;
+}
+
+
+
+/*
+ * Save field value in separated tags if it contains multifields
+ */
+static gboolean Flac_Write_Delimetered_Tag (FLAC__StreamMetadata *vc_block, const gchar *tag_name, gchar *values)
+{
+ gchar **strings = g_strsplit(values,MULTIFIELD_SEPARATOR,255);
+ unsigned int i=0;
+
+ for (i=0;i<g_strv_length(strings);i++)
+ {
+ if (strlen(strings[i])>0)
+ {
+ FLAC__StreamMetadata_VorbisComment_Entry field;
+ char *string = g_strconcat(tag_name,strings[i],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);
+ }
+ }
+ g_strfreev(strings);
return TRUE;
}
@@ -810,10 +841,13 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
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.entry = (FLAC__byte *)g_strdup((gchar *)vc->vendor_string.entry);
- vce_field_vendor_string.length = strlen((gchar *)vce_field_vendor_string.entry);
- vce_field_vendor_string_found = TRUE;
+ if (vc->vendor_string.entry != NULL)
+ {
+ // Get initial vendor string, to don't alterate it by FLAC__VENDOR_STRING when saving file
+ vce_field_vendor_string.entry = (FLAC__byte *)g_strdup((gchar *)vc->vendor_string.entry);
+ vce_field_vendor_string.length = strlen((gchar *)vce_field_vendor_string.entry);
+ vce_field_vendor_string_found = TRUE;
+ }
// Free block data
FLAC__metadata_iterator_delete_block(iter,true);
@@ -862,11 +896,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
*********/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"TITLE=",FileTag->title);
}
/**********
@@ -874,11 +904,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
**********/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"ARTIST=",FileTag->artist);
}
/*********
@@ -886,11 +912,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
*********/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"ALBUM=",FileTag->album);
}
/***************
@@ -942,11 +964,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
*********/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"GENRE=",FileTag->genre);
}
/***********
@@ -955,17 +973,9 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
// 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);
+ Flac_Write_Delimetered_Tag(vc_block,"DESCRIPTION=",FileTag->comment);
- 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);
+ Flac_Write_Delimetered_Tag(vc_block,"COMMENT=",FileTag->comment);
}
/************
@@ -973,11 +983,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
************/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"COMPOSER=",FileTag->composer);
}
/*******************
@@ -985,11 +991,7 @@ gboolean Flac_Tag_Write_File_Tag (ET_File *ETFile)
*******************/
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);
+ Flac_Write_Delimetered_Tag(vc_block,"PERFORMER=",FileTag->orig_artist);
}
/*************
diff --git a/src/id3_tag.c b/src/id3_tag.c
index 8a21abf..61c95c0 100755
--- a/src/id3_tag.c
+++ b/src/id3_tag.c
@@ -948,7 +948,7 @@ ID3_TextEnc Id3tag_Set_Field (const ID3Frame *id3_frame, ID3_FieldID id3_fieldid
}
/*
- * We prioritize the rule selected in options. If the encoding of the
+ * We prioritize the rule selected in options. If the encoding of the
* field is ISO-8859-1, we can write it to an other single byte encoding.
*/
if (FILE_WRITING_ID3V2_USE_UNICODE_CHARACTER_SET)
@@ -1252,6 +1252,7 @@ gboolean Id3tag_Check_If_Id3lib_Is_Bugged (void)
0x00, 0x00, 0x00, 0x00};
ID3Tag *id3_tag = NULL;
gchar *filename;
+ gchar *filename_tmp;
gchar *result = NULL;
ID3Frame *id3_frame;
gboolean use_unicode;
@@ -1262,9 +1263,15 @@ gboolean Id3tag_Check_If_Id3lib_Is_Bugged (void)
// Create a temporary file
filename = g_strconcat(HOME_VARIABLE,
- HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
- ".easytag"G_DIR_SEPARATOR_S"test_easytag.mp3",
+ HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR ? G_DIR_SEPARATOR_S : "",
+ ".easytag" G_DIR_SEPARATOR_S "test_easytag.mp3",
NULL);
+
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ filename_tmp = filename;
+ filename = filename_from_display(filename);
+ g_free(filename_tmp);
+
if ( (file=fopen(filename,"w+"))==NULL )
{
gchar *filename_utf8 = filename_to_display(filename);
diff --git a/src/id3v24_tag.c b/src/id3v24_tag.c
index a627fcd..29cbb1f 100644..100755
--- a/src/id3v24_tag.c
+++ b/src/id3v24_tag.c
@@ -1355,6 +1355,7 @@ etag_write_tags (const gchar *filename,
long filev2size, ctxsize;
char *ctx = NULL;
int err = 0;
+ long size_read = 0;
v1buf = v2buf = NULL;
if ( !strip_tags )
@@ -1410,8 +1411,10 @@ etag_write_tags (const gchar *filename,
/* Handle Id3v1 tag */
if ((curpos = lseek(fd, -128, SEEK_END)) < 0)
goto out;
- if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE)
+ if ( (size_read = read(fd, tmp, ID3_TAG_QUERYSIZE)) != ID3_TAG_QUERYSIZE)
+ {
goto out;
+ }
if ( (tmp[0] == 'T')
&& (tmp[1] == 'A')
@@ -1440,8 +1443,10 @@ etag_write_tags (const gchar *filename,
if ( (filev2size > 10)
&& (curpos = lseek(fd, -filev2size, SEEK_CUR)) )
{
- if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE)
+ if ( (size_read = read(fd, tmp, ID3_TAG_QUERYSIZE)) != ID3_TAG_QUERYSIZE)
+ {
goto out;
+ }
if (id3_tag_query((id3_byte_t const *)tmp, ID3_TAG_QUERYSIZE) != filev2size)
curpos = lseek(fd, -ID3_TAG_QUERYSIZE - filev2size, SEEK_CUR);
else
@@ -1451,10 +1456,12 @@ etag_write_tags (const gchar *filename,
/* Write id3v1 tag */
if (v1buf)
+ {
if ( write(fd, v1buf, v1size) != v1size)
goto out;
+ }
- /* Truncate file (strip tags) */
+ /* Truncate file (strip tags at the end of file) */
if ((curpos = lseek(fd, 0, SEEK_CUR)) <= 0 )
goto out;
if ((err = ftruncate(fd, curpos)))
@@ -1464,13 +1471,16 @@ etag_write_tags (const gchar *filename,
if ((curpos = lseek(fd, 0, SEEK_SET)) < 0)
goto out;
- if (read(fd, tmp, ID3_TAG_QUERYSIZE) != ID3_TAG_QUERYSIZE)
+ if ( (size_read = read(fd, tmp, ID3_TAG_QUERYSIZE)) != ID3_TAG_QUERYSIZE)
+ {
goto out;
+ }
filev2size = id3_tag_query((id3_byte_t const *)tmp, ID3_TAG_QUERYSIZE);
+ // No ID3v2 tag in the file, and no new tag
if ( (filev2size == 0)
- && (v2size == 0))
+ && (v2size == 0) )
goto out;
if (filev2size == v2size)
@@ -1482,18 +1492,33 @@ etag_write_tags (const gchar *filename,
}else
{
/* XXX */
+ // Size of audio data (tags at the end were already removed)
ctxsize = lseek(fd, 0, SEEK_END) - filev2size;
+
if ((ctx = g_try_malloc(ctxsize)) == NULL)
goto out;
- if (lseek(fd, filev2size, SEEK_SET) < 0)
+ if ((curpos = lseek(fd, filev2size, SEEK_SET)) < 0)
goto out;
- if (read(fd, ctx, ctxsize) != ctxsize)
+ if ((size_read = /*err = */read(fd, ctx, ctxsize)) != ctxsize)
+ {
+ gchar *filename_utf8 = filename_to_display(filename);
+ gchar *basename_utf8 = g_path_get_basename(filename_utf8);
+
+ Log_Print(LOG_ERROR,_("Can't write tag of file '%s' (were read %d bytes instead of %d bytes!)"),basename_utf8,size_read,ctxsize);
+ g_free(filename_utf8);
+ g_free(basename_utf8);
goto out;
+ }
+
+ // Return to the beginning of the file
if (lseek(fd, 0, SEEK_SET) < 0)
goto out;
+
+ // Write the ID3v2 tag
if (v2buf)
write(fd, v2buf, v2size);
-
+
+ // Write audio data
if (write(fd, ctx, ctxsize) != ctxsize)
{
gchar *filename_utf8 = filename_to_display(filename);
@@ -1506,6 +1531,7 @@ etag_write_tags (const gchar *filename,
if ((curpos = lseek(fd, 0, SEEK_CUR)) <= 0 )
goto out;
+
if ((err = ftruncate(fd, curpos)))
goto out;
}
diff --git a/src/log.c b/src/log.c
index 22870d8..cde953e 100755
--- a/src/log.c
+++ b/src/log.c
@@ -63,7 +63,7 @@ typedef struct _Log_Data Log_Data;
struct _Log_Data
{
gchar *time; /* The time of this line of log */
- Log_Error_Type error_type;
+ Log_Error_Type error_type;
gchar *string; /* The string of the line of log to display */
};
@@ -245,7 +245,7 @@ void Log_Print (Log_Error_Type error_type, gchar const *format, ...)
va_start (args, format);
- string = g_strdup_vprintf (format, args);
+ string = g_strdup_vprintf(format, args);
va_end (args);
// If the log window is displayed then messages are displayed, else
@@ -258,9 +258,9 @@ void Log_Print (Log_Error_Type error_type, gchar const *format, ...)
if (LogListNbrRows > LOG_MAX_LINES - 1
&& gtk_tree_model_get_iter_first(GTK_TREE_MODEL(logListModel), &iter))
{
- gtk_list_store_remove(GTK_LIST_STORE(logListModel), &iter);
+ gtk_list_store_remove(GTK_LIST_STORE(logListModel), &iter);
}
-
+
LogListNbrRows++;
gtk_list_store_append(logListModel, &iter);
gtk_list_store_set(logListModel, &iter,
@@ -286,10 +286,19 @@ void Log_Print (Log_Error_Type error_type, gchar const *format, ...)
// Store also the messages in the log file.
if (!file_path)
+ {
+ gchar *file_path_tmp = NULL;
+
file_path = g_strconcat(HOME_VARIABLE,
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR ? G_DIR_SEPARATOR_S : "",
LOG_FILE,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+ }
+
// The first time, the whole file is delete. Else, text is appended
if (first_time)
file = fopen(file_path,"w+");
@@ -322,7 +331,7 @@ void Log_Print_Tmp_List (void)
LogPrintTmpList = g_list_first(LogPrintTmpList);
while (LogPrintTmpList)
{
-
+
if (LogList && logListModel)
{
LogListNbrRows++;
@@ -336,7 +345,7 @@ void Log_Print_Tmp_List (void)
-1);
Log_List_Set_Row_Visible(GTK_TREE_MODEL(logListModel), &iter);
}
-
+
if (!LogPrintTmpList->next) break;
LogPrintTmpList = LogPrintTmpList->next;
}
@@ -364,22 +373,30 @@ 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_INFO:
+ stock_id = GTK_STOCK_DIALOG_INFO;
+ break;
+
+ case LOG_WARNING:
+ stock_id = GTK_STOCK_DIALOG_WARNING;
+ 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 d1bb8db..d7c9cbb 100755
--- a/src/log.h
+++ b/src/log.h
@@ -34,6 +34,8 @@ typedef enum
{
LOG_UNKNOWN = 0,
LOG_OK,
+ LOG_INFO,
+ LOG_WARNING,
LOG_ERROR
} Log_Error_Type;
diff --git a/src/misc.c b/src/misc.c
index baf8f04..5803279 100755
--- a/src/misc.c
+++ b/src/misc.c
@@ -463,7 +463,7 @@ gboolean Parse_Date (void)
/* Get the current date */
memcpy(&t0, localtime(&t), sizeof(struct tm));
/* Put the current year in 'current_year' tab */
- sprintf(current_year,"%d",1900+t0.tm_year);
+ sprintf(current_year,"%04d",1900+t0.tm_year);
tmp = &current_year[4-strlen(year)];
if ( atoi(year) <= atoi(tmp) )
@@ -2635,6 +2635,7 @@ void Search_Result_List_Row_Selected(GtkTreeSelection *selection, gpointer data)
return;
}
+ // Unselect files in the main list before re-selecting them...
Browser_List_Unselect_All_Files();
while (selectedRows)
@@ -2642,9 +2643,13 @@ void Search_Result_List_Row_Selected(GtkTreeSelection *selection, gpointer data)
found = gtk_tree_model_get_iter(GTK_TREE_MODEL(SearchResultListModel), &currentFile, (GtkTreePath*)selectedRows->data);
if (found)
{
- gtk_tree_model_get(GTK_TREE_MODEL(SearchResultListModel), &currentFile, SEARCH_RESULT_POINTER, &ETFile, -1);
+ gtk_tree_model_get(GTK_TREE_MODEL(SearchResultListModel), &currentFile,
+ SEARCH_RESULT_POINTER, &ETFile, -1);
+ // Select the files (but don't display them to increase speed)
Browser_List_Select_File_By_Etfile(ETFile, TRUE);
- Action_Select_Nth_File_By_Etfile(ETFile);
+ // Display only the last file (to increase speed)
+ if (!selectedRows->next)
+ Action_Select_Nth_File_By_Etfile(ETFile);
}
selectedRows = selectedRows->next;
}
diff --git a/src/ogg_tag.c b/src/ogg_tag.c
index bf6e365..1fa12a2 100755
--- a/src/ogg_tag.c
+++ b/src/ogg_tag.c
@@ -109,6 +109,8 @@
**************/
gboolean Ogg_Tag_Write_File (FILE *file_in, gchar *filename_in, vcedit_state *state);
+static gboolean Ogg_Write_Delimetered_Tag (vorbis_comment *vc, const gchar *tag_name, gchar *values);
+
/*************
* Functions *
@@ -271,6 +273,8 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
if ( (string = vorbis_comment_query(vc,"DATE",0)) != NULL && g_utf8_strlen(string, -1) > 0 )
{
FileTag->year = g_strdup(string);
+ if (g_utf8_strlen(FileTag->year, -1) > 4)
+ Log_Print(LOG_WARNING,_("The year value '%s' seems to be invalid in file '%s'. The information will be lost while saving tag."),FileTag->year,filename_utf8);
}
/*************************
@@ -564,6 +568,28 @@ gboolean Ogg_Tag_Read_File_Tag (gchar *filename, File_Tag *FileTag)
}
+/*
+ * Save field value in separated tags if it contains multifields
+ */
+static gboolean Ogg_Write_Delimetered_Tag (vorbis_comment *vc, const gchar *tag_name, gchar *values)
+{
+ gchar **strings = g_strsplit(values,MULTIFIELD_SEPARATOR,255);
+ unsigned int i=0;
+
+ for (i=0;i<g_strv_length(strings);i++)
+ {
+ if (strlen(strings[i])>0)
+ {
+ char *string = g_strconcat(tag_name,strings[i],NULL);
+
+ vorbis_comment_add(vc,string);
+ g_free(string);
+ }
+ }
+ g_strfreev(strings);
+ return TRUE;
+}
+
gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
{
@@ -646,9 +672,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
*********/
if ( FileTag->title )
{
- string = g_strconcat("TITLE=",FileTag->title,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"TITLE=",FileTag->title);
}
/**********
@@ -656,9 +680,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
**********/
if ( FileTag->artist )
{
- string = g_strconcat("ARTIST=",FileTag->artist,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"ARTIST=",FileTag->artist);
}
/*********
@@ -666,9 +688,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
*********/
if ( FileTag->album )
{
- string = g_strconcat("ALBUM=",FileTag->album,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"ALBUM=",FileTag->album);
}
/***************
@@ -712,9 +732,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
*********/
if ( FileTag->genre )
{
- string = g_strconcat("GENRE=",FileTag->genre,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"GENRE=",FileTag->genre);
}
/***********
@@ -724,21 +742,15 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
if ( FileTag->comment )
{
// Format of new specification
- string = g_strconcat("DESCRIPTION=",FileTag->comment,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"DESCRIPTION=",FileTag->comment);
// Format used in winamp plugin
- string = g_strconcat("COMMENT=",FileTag->comment,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"COMMENT=",FileTag->comment);
if (OGG_TAG_WRITE_XMMS_COMMENT)
{
// Format used into xmms-1.2.5
- string = g_strconcat("=",FileTag->comment,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"=",FileTag->comment);
}
}
@@ -747,9 +759,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
************/
if ( FileTag->composer )
{
- string = g_strconcat("COMPOSER=",FileTag->composer,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"COMPOSER=",FileTag->composer);
}
/*******************
@@ -757,9 +767,7 @@ gboolean Ogg_Tag_Write_File_Tag (ET_File *ETFile)
*******************/
if ( FileTag->orig_artist )
{
- string = g_strconcat("PERFORMER=",FileTag->orig_artist,NULL);
- vorbis_comment_add(vc,string);
- g_free(string);
+ Ogg_Write_Delimetered_Tag(vc,"PERFORMER=",FileTag->orig_artist);
}
/*************
diff --git a/src/picture.c b/src/picture.c
index f1de37b..dea79e6 100644..100755
--- a/src/picture.c
+++ b/src/picture.c
@@ -233,7 +233,7 @@ void Picture_Load_Filename (gchar *filename, gpointer user_data)
{
// By default, set the filename in the description
pic->description = g_path_get_basename(filename_utf8);
-
+
// Try to identify the type of the picture from the file name
filename_utf8_folded = g_utf8_casefold(pic->description, -1);
front_folded = g_utf8_casefold("Front", -1);
@@ -309,11 +309,11 @@ void Picture_Add_Button_Clicked (GObject *object)
// "PNG and JPEG" filter
filter = gtk_file_filter_new ();
gtk_file_filter_set_name(GTK_FILE_FILTER(filter), _("PNG and JPEG"));
- //gtk_file_filter_add_mime_type(GTK_FILE_FILTER(filter), "image/jpeg");
- //gtk_file_filter_add_mime_type(GTK_FILE_FILTER(filter), "image/png");
- gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.jpeg");
- gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.jpg");
- gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.png");
+ gtk_file_filter_add_mime_type(GTK_FILE_FILTER(filter), "image/jpeg"); // Using mime type avoid problem of case sensitive with extensions
+ gtk_file_filter_add_mime_type(GTK_FILE_FILTER(filter), "image/png");
+ //gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.jpeg"); // Warning: *.JPEG or *.JpEg files will not be displayed
+ //gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.jpg");
+ //gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter), "*.png");
gtk_file_chooser_add_filter(GTK_FILE_CHOOSER (FileSelectionWindow), GTK_FILE_FILTER(filter));
// Make this filter the default
gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(FileSelectionWindow), GTK_FILE_FILTER(filter));
@@ -1095,15 +1095,31 @@ void Picture_Free (Picture *pic)
* Load the picture represented by the 'filename' (must be passed in
* file system encoding, not UTF-8)
*/
+#ifdef WIN32
+Picture *Picture_Load_File_Data (const gchar *filename_utf8)
+#else
Picture *Picture_Load_File_Data (const gchar *filename)
+#endif
{
Picture *pic;
gchar *buffer = 0;
size_t size = 0;
struct stat st;
- if (lstat(filename, &st)==-1)
+#ifdef WIN32
+ // Strange : on Win32, the file seems to be in UTF-8, so we can't load files with accentuated characters...
+ // To avoid this problem, we convert the filename to the file system encoding
+ gchar *filename = filename_from_display(filename_utf8);
+#endif
+
+ if (stat(filename, &st)==-1)
+ {
+ Log_Print(LOG_ERROR,_("Picture file not loaded (%s)..."),g_strerror(errno));
+#ifdef WIN32
+ g_free(filename);
+#endif
return (Picture *)NULL;
+ }
size = st.st_size;
buffer = g_malloc(size);
@@ -1131,26 +1147,41 @@ Picture *Picture_Load_File_Data (const gchar *filename)
gtk_dialog_run(GTK_DIALOG(msgbox));
gtk_widget_destroy(msgbox);
- Statusbar_Message(_("Picture file not loaded..."),TRUE);
+ Log_Print(LOG_ERROR,_("Picture file not loaded (%s)..."),g_strerror(errno));
g_free(filename_utf8);
+#ifdef WIN32
+ g_free(filename);
+#endif
return FALSE;
}
- if (fread(buffer, size, 1, fd) != 1)
- goto fail;
-
- fclose(fd);
-
- pic = Picture_Allocate();
- pic->size = size;
- pic->data = (guchar *)buffer;
- return pic;
+#ifdef WIN32
+ g_free(filename);
+#endif
- fail:
+ if (fread(buffer, size, 1, fd) != 1)
+ {
+ // Error
+ fclose(fd);
if (buffer)
g_free(buffer);
- fclose(fd);
+
+ Log_Print(LOG_ERROR,_("Picture file not loaded (%s)..."),g_strerror(errno));
+
return (Picture *)NULL;
+ }else
+ {
+ // Loaded
+ fclose(fd);
+
+ pic = Picture_Allocate();
+ pic->size = size;
+ pic->data = (guchar *)buffer;
+
+ Log_Print(LOG_OK,_("Picture file loaded..."));
+
+ return pic;
+ }
}
/*
@@ -1162,11 +1193,15 @@ gboolean Picture_Save_File_Data (const Picture *pic, const gchar *filename)
fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0666);
if (fd == -1)
+ {
+ Log_Print(LOG_ERROR,_("Picture file can't be saved (%s)..."),g_strerror(errno));
return FALSE;
+ }
if (write(fd, pic->data, pic->size) != pic->size)
{
close(fd);
+ Log_Print(LOG_ERROR,_("Picture file can't be saved (%s)..."),g_strerror(errno));
return FALSE;
}
diff --git a/src/scan.c b/src/scan.c
index dd24ab6..c0cb13f 100644
--- a/src/scan.c
+++ b/src/scan.c
@@ -344,7 +344,7 @@ void Scan_Tag_With_Mask (ET_File *ETFile)
case ID3_TAG:
crc32_file_with_ID3_tag( ((File_Name *)((GList *)ETFile->FileNameNew)->data)->value, &crc32_value);
- if (crc32_value > 0)
+ if (crc32_value > 0)
{
buffer = g_strdup_printf("%.8lx",crc32_value);
ET_Set_Field_File_Tag_Item((void *)&FileTag->comment,buffer);
@@ -1803,7 +1803,9 @@ gint Scan_Word_Is_Roman_Numeral (gchar *text)
gint rn_int;
gchar *rn_char;
- if (!GTK_TOGGLE_BUTTON(ProcessFieldsDetectRomanNumerals)->active)
+ if (!ScannerWindow
+ || !ProcessFieldsDetectRomanNumerals
+ || !GTK_TOGGLE_BUTTON(ProcessFieldsDetectRomanNumerals)->active)
return 0;
tmp = text;
@@ -2046,7 +2048,8 @@ int roman2int (const char * str)
int num;
unsigned i;
unsigned len;
- unsigned p[2]; // stores values of previous symbols for error checking
+ unsigned last;
+ unsigned prevlast;
// checks args
if (!(str))
@@ -2057,8 +2060,8 @@ int roman2int (const char * str)
// sets initial values
num = 0;
len = strlen(str);
- p[0] = 1000;
- p[1] = 1000;
+ last = 1000;
+ prevlast = 1000;
// loops through characters
for(i = 0; i < len; i++)
@@ -2077,123 +2080,117 @@ int roman2int (const char * str)
case 'I':
num += 1;
// prevent patterns like IXI
- if ((p[1] == 1) && (p[0] != 1))
+ if ((prevlast == 1) && (last != 1))
{
return(-1);
};
-
// prevent patterns like IIIII and VIIIII
if ((!(num%5)) || (!(num%10)))
{
return(-1);
};
- p[1] = p[0];
- p[0] = 1;
+ // rotates value into history
+ prevlast = last;
+ last = 1;
break;
case 'v':
case 'V':
num += 5;
- if (((p[0] < 5) && (p[1] < 5)) || (p[1] == 5) || (p[0] == 5))
+ // tests for invalid syntax
+ if ( ((last <= 5) && (last != 1)) || (prevlast <= 5) )
{
return(-1);
}
- else if (p[0] < 5)
- num -= (p[0] * 2);
- p[1] = p[0];
- p[0] = 5;
+ // applies subtraction method & rotates value into history
+ if (last < 5)
+ num -= (last * 2);
+ prevlast = last;
+ last = 5;
break;
case 'x':
case 'X':
num += 10;
- // prevent patterns like XCX
- if (((p[0] < 10) && (p[1] < 10)) || ((p[1] < 10) && (p[0] <= 10)))
- {
- return(-1);
- };
- if (p[0] == 1)
- num -= (p[0] * 2);
- else if (p[0] < 10)
+ // tests for invalid syntax
+ if ( ((prevlast < 10) && (last <= 10)) || ((last < 10) && (last != 1)) )
{
return(-1);
};
-
// prevent patterns like XXXXX and VXXXXX
if ((!(num%50)) || (!(num%100)))
{
return(-1);
};
- p[1] = p[0];
- p[0] = 10;
+ // applies subtraction method & rotates value into history
+ if (last == 1)
+ num -= (last * 2);
+ prevlast = last;
+ last = 10;
break;
case 'l':
case 'L':
num += 50;
- if (((p[0] < 50) && (p[1] < 50)) || (p[1] == 50) || (p[0] == 50))
+ // tests for invalid syntax
+ if ( ((last <= 50) && (last != 10)) || (prevlast <= 50) )
{
return(-1);
}
- else if (p[0] < 50)
- num -= (p[0] * 2);
- p[1] = p[0];
- p[0] = 50;
+ // applies subtraction method & rotates value into history
+ if (last < 50)
+ num -= (last * 2);
+ prevlast = last;
+ last = 50;
break;
case 'c':
case 'C':
num += 100;
- // prevent patterns like CMC
- if (((p[0] < 100) && (p[1] < 100)) || ((p[1] < 100) && (p[0] <= 100)))
+ // tests for invalid syntax
+ if ( ((prevlast < 100) && (last <= 100)) || ((last < 100) && (last != 10)) )
{
return(-1);
};
- if (p[0] == 10)
- num -= (p[0] * 2);
- else if (p[0] < 100)
- {
- return(-1);
- };
-
// prevent patterns like CCCCC and VCCCCC
if ((!(num%500)) || (!(num%1000)))
{
return(-1);
};
- p[1] = p[0];
- p[0] = 100;
+ // applies subtraction method & rotates value into history
+ if (last == 10)
+ num -= (last * 2);
+ prevlast = last;
+ last = 100;
break;
case 'd':
case 'D':
num += 500;
- if (((p[0] < 500) && (p[1] < 500)) || (p[1] == 500) || (p[0] == 500))
+ // tests for invalid syntax
+ if ( ((last <= 500) && (last != 100)) || (prevlast <= 500) )
{
return(-1);
}
- else if (p[0] < 500)
- num -= (p[0] * 2);
- p[1] = p[0];
- p[0] = 500;
+ // applies subtraction method & rotates value into history
+ if (last < 500)
+ num -= (last * 2);
+ prevlast = last;
+ last = 500;
break;
case 'm':
case 'M':
num += 1000;
- // prevent patterns like M?M
- if (((p[0] < 1000) && (p[1] < 1000)) || ((p[1] < 100) && (p[0] <= 1000)))
- {
- return(-1);
- };
- if (p[0] == 100)
- num -= (p[0] * 2);
- else if (p[0] < 1000)
+ // tests for invalid syntax
+ if ( ((prevlast < 1000) && (last <= 1000)) || ((last < 1000) && (last != 100)) )
{
return(-1);
};
-
// prevent patterns like MMMMM and VMMMMM
if ((!(num%5000)) || (!(num%10000)))
{
return(-1);
};
- p[1] = p[0];
- p[0] = 1000;
+ // applies subtraction method & rotates value into history
+ if (last == 100)
+ num -= (last * 2);
+ prevlast = last;
+ last = 1000;
break;
default:
return(-1);
diff --git a/src/setting.c b/src/setting.c
index d90221a..6e67d84 100644..100755
--- a/src/setting.c
+++ b/src/setting.c
@@ -61,39 +61,39 @@
// Base directory created into home dir
#define EASYTAG_DIR ".easytag"
// File for configuration
-#define CONFIG_FILE EASYTAG_DIR "/easytagrc"
+#define CONFIG_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "easytagrc"
// File of masks for tag scanner
-#define SCAN_TAG_MASKS_FILE EASYTAG_DIR "/scan_tag.mask"
+#define SCAN_TAG_MASKS_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "scan_tag.mask"
// File of masks for rename file scanner
-#define RENAME_FILE_MASKS_FILE EASYTAG_DIR "/rename_file.mask"
+#define RENAME_FILE_MASKS_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "rename_file.mask"
// File for history of RenameDirectoryMaskCombo combobox
-#define RENAME_DIRECTORY_MASKS_FILE EASYTAG_DIR "/rename_directory.mask"
+#define RENAME_DIRECTORY_MASKS_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "rename_directory.mask"
// File for history of PlayListNameCombo combobox
-#define PLAY_LIST_NAME_MASKS_FILE EASYTAG_DIR "/play_list_name.mask"
+#define PLAY_LIST_NAME_MASKS_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "play_list_name.mask"
// File for history of PlayListContentMaskEntry combobox
-#define PLAYLIST_CONTENT_MASKS_FILE EASYTAG_DIR "/playlist_content.mask"
+#define PLAYLIST_CONTENT_MASKS_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "playlist_content.mask"
// File for history of DefaultPathToMp3 combobox
-#define DEFAULT_PATH_TO_MP3_HISTORY_FILE EASYTAG_DIR "/default_path_to_mp3.history"
+#define DEFAULT_PATH_TO_MP3_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "default_path_to_mp3.history"
// File for history of DefaultComment combobox
-#define DEFAULT_TAG_COMMENT_HISTORY_FILE EASYTAG_DIR "/default_tag_comment.history"
+#define DEFAULT_TAG_COMMENT_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "default_tag_comment.history"
// File for history of BrowserEntry combobox
-#define PATH_ENTRY_HISTORY_FILE EASYTAG_DIR "/browser_path.history"
+#define PATH_ENTRY_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "browser_path.history"
// File for history of run program combobox for directories
-#define RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE EASYTAG_DIR "/run_program_with_directory.history"
+#define RUN_PROGRAM_WITH_DIRECTORY_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "run_program_with_directory.history"
// File for history of run program combobox for files
-#define RUN_PROGRAM_WITH_FILE_HISTORY_FILE EASYTAG_DIR "/run_program_with_file.history"
+#define RUN_PROGRAM_WITH_FILE_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "run_program_with_file.history"
// File for history of run player combobox
-#define AUDIO_FILE_PLAYER_HISTORY_FILE EASYTAG_DIR "/audio_file_player.history"
+#define AUDIO_FILE_PLAYER_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "audio_file_player.history"
// File for history of search string combobox
-#define SEARCH_FILE_HISTORY_FILE EASYTAG_DIR "/search_file.history"
+#define SEARCH_FILE_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "search_file.history"
// File for history of FileToLoad combobox
-#define FILE_TO_LOAD_HISTORY_FILE EASYTAG_DIR "/file_to_load.history"
+#define FILE_TO_LOAD_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "file_to_load.history"
// File for history of CddbSearchStringEntry combobox
-#define CDDB_SEARCH_STRING_HISTORY_FILE EASYTAG_DIR "/cddb_search_string.history"
+#define CDDB_SEARCH_STRING_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "cddb_search_string.history"
// File for history of CddbSearchStringInResultEntry combobox
-#define CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE EASYTAG_DIR "/cddb_search_string_in_result.history"
+#define CDDB_SEARCH_STRING_IN_RESULT_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "cddb_search_string_in_result.history"
// File for history of CddbLocalPath combobox
-#define CDDB_LOCAL_PATH_HISTORY_FILE EASYTAG_DIR "/cddb_local_path.history"
+#define CDDB_LOCAL_PATH_HISTORY_FILE EASYTAG_DIR G_DIR_SEPARATOR_S "cddb_local_path.history"
@@ -418,11 +418,19 @@ void Init_Config_Variables (void)
USE_NON_STANDARD_ID3_READING_CHARACTER_SET = 0;
FILE_READING_ID3V1V2_CHARACTER_SET = g_strdup("UTF-8");
FILE_WRITING_ID3V2_WRITE_TAG = 1;
+#ifdef WIN32
+ FILE_WRITING_ID3V2_VERSION_4 = 0;
+#else
FILE_WRITING_ID3V2_VERSION_4 = 1;
+#endif
FILE_WRITING_ID3V2_USE_CRC32 = 0;
FILE_WRITING_ID3V2_USE_COMPRESSION = 0;
FILE_WRITING_ID3V2_USE_UNICODE_CHARACTER_SET = 1;
+#ifdef WIN32
+ FILE_WRITING_ID3V2_UNICODE_CHARACTER_SET = g_strdup("UTF-16");
+#else
FILE_WRITING_ID3V2_UNICODE_CHARACTER_SET = g_strdup("UTF-8");
+#endif
FILE_WRITING_ID3V2_NO_UNICODE_CHARACTER_SET = g_strdup("ISO-8859-1");
FILE_WRITING_ID3V2_ICONV_OPTIONS_NO = 1;
FILE_WRITING_ID3V2_ICONV_OPTIONS_TRANSLIT = 0;
@@ -477,7 +485,7 @@ void Init_Config_Variables (void)
PROCESS_COPYRIGHT_FIELD = 1;
PROCESS_URL_FIELD = 1;
PROCESS_ENCODED_BY_FIELD = 1;
-
+
PROCESS_FIELDS_CONVERT_FROM = NULL;
PROCESS_FIELDS_CONVERT_TO = NULL;
@@ -877,6 +885,7 @@ void Save_Changes_Of_Preferences_Window (void)
void Save_Config_To_File (void)
{
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
/* The file to write */
@@ -885,6 +894,11 @@ void Save_Config_To_File (void)
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR ? G_DIR_SEPARATOR_S : "",
CONFIG_FILE,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( Create_Easytag_Directory()==0 || (file=fopen(file_path,"w+"))==0 )
{
Log_Print(LOG_ERROR,_("ERROR: Can't write config file: %s (%s)"),file_path,g_strerror(errno));
@@ -1019,6 +1033,7 @@ void Set_Config (gchar *line)
void Read_Config (void)
{
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
gchar buffer[MAX_STRING_LEN];
@@ -1028,6 +1043,11 @@ void Read_Config (void)
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
CONFIG_FILE,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( (file=fopen(file_path,"r"))==0 )
{
Log_Print(LOG_ERROR,_("Can't open configuration file '%s' (%s)"),file_path,g_strerror(errno));
@@ -1057,6 +1077,7 @@ void Read_Config (void)
void Display_Config (void)
{
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
/* The file to write */
@@ -1065,6 +1086,11 @@ void Display_Config (void)
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
CONFIG_FILE,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( (file=fopen(file_path,"r"))==0 )
{
g_print(_("Can't open configuration file '%s' (%s)"),file_path,g_strerror(errno));
@@ -1113,6 +1139,7 @@ void Display_Config (void)
gboolean Setting_Create_Files (void)
{
gchar *home_path = NULL;
+ gchar *home_path_tmp = NULL;
gchar *file_path = NULL;
FILE *file;
@@ -1124,9 +1151,15 @@ gboolean Setting_Create_Files (void)
return FALSE;
home_path = g_strconcat(HOME_VARIABLE,
- HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
+ HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR ? G_DIR_SEPARATOR_S : "",
NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ // We do it only for 'home_path' to avoid lot of code...
+ home_path_tmp = home_path;
+ home_path = filename_from_display(home_path);
+ g_free(home_path_tmp);
+
file_path = g_strconcat(home_path,CONFIG_FILE,NULL);
if ( (file=fopen(file_path,"a+")) != NULL )
fclose(file);
@@ -1260,6 +1293,7 @@ gboolean Setting_Create_Files (void)
void Save_List_Store_To_File (gchar *filename, GtkListStore *liststore, gint colnum)
{
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
gchar *data = NULL;
gchar *text;
@@ -1274,6 +1308,11 @@ void Save_List_Store_To_File (gchar *filename, GtkListStore *liststore, gint col
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
filename,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( Create_Easytag_Directory()==0 || (file=fopen(file_path,"w+"))==NULL )
{
Log_Print(LOG_ERROR,_("ERROR: Can't write list to file: %s (%s)"),file_path,g_strerror(errno));
@@ -1303,6 +1342,7 @@ gboolean Populate_List_Store_From_File (gchar *filename, GtkListStore *liststore
{
gchar *file_path = NULL;
+ gchar *file_path_tmp = NULL;
FILE *file;
gchar buffer[MAX_STRING_LEN];
GtkTreeIter iter;
@@ -1314,6 +1354,11 @@ gboolean Populate_List_Store_From_File (gchar *filename, GtkListStore *liststore
HOME_VARIABLE[strlen(HOME_VARIABLE)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
filename,NULL);
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ file_path_tmp = file_path;
+ file_path = filename_from_display(file_path);
+ g_free(file_path_tmp);
+
if ( (file=fopen(file_path,"r"))==NULL )
{
Log_Print(LOG_ERROR,_("Can't open file '%s' (%s)"),file_path,g_strerror(errno));
@@ -1325,7 +1370,7 @@ 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))
data = g_strdup(buffer);
else
@@ -1602,6 +1647,7 @@ void Save_Cddb_Local_Path_List (GtkListStore *liststore, gint colnum)
gboolean Create_Easytag_Directory (void)
{
gchar *easytag_path = NULL;
+ gchar *easytag_path_tmp = NULL;
DIR *dir;
if (!HOME_VARIABLE)
@@ -1617,7 +1663,12 @@ gboolean Create_Easytag_Directory (void)
EASYTAG_DIR,
//EASYTAG_DIR[strlen(EASYTAG_DIR)-1]!=G_DIR_SEPARATOR?G_DIR_SEPARATOR_S:"",
NULL);
-
+
+ // Must convert to the filesystem encoding (else may cause problem under XP with accounts like "Léo")
+ easytag_path_tmp = easytag_path;
+ easytag_path = filename_from_display(easytag_path);
+ g_free(easytag_path_tmp);
+
if ( (dir=opendir(easytag_path)) == NULL )
{
if ( (mkdir(easytag_path,S_IRWXU|S_IXGRP|S_IRGRP)) == -1)
diff --git a/src/ui_manager.h b/src/ui_manager.h
index 8d34a94..aed2235 100755..100644
--- a/src/ui_manager.h
+++ b/src/ui_manager.h
@@ -112,6 +112,11 @@ static const gchar *ui_xml =
" <menu action='BrowserMenu'>"
" <menuitem action='GoToHome' />"
+" <menuitem action='GoToDesktop' />"
+" <menuitem action='GoToDocument' />"
+" <menuitem action='GoToDownload' />"
+" <menuitem action='GoToMusic' />"
+" <separator />"
" <menuitem action='GoToDefaultPath' />"
" <menuitem action='SetDefaultPath' />"
" <separator />"
diff --git a/src/win32/gtkwin32dep.c b/src/win32/gtkwin32dep.c
new file mode 100755
index 0000000..af5d73b
--- /dev/null
+++ b/src/win32/gtkwin32dep.c
@@ -0,0 +1,236 @@
+/*
+ * easytag
+ *
+ * File: win32dep.c
+ * Date: June, 2002
+ * Description: Windows dependant code for Easytag
+ * this code if largely taken from win32 Gaim and Pidgin
+ *
+ * Copyright (C) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ *
+ */
+#include <windows.h>
+#include <io.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <winuser.h>
+
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkwin32.h>
+
+#include "resource.h"
+
+#include <libintl.h>
+
+#include "win32dep.h"
+//#include "../log.h"
+
+
+
+/*
+ * GLOBALS
+ */
+HINSTANCE exe_hInstance = 0;
+HINSTANCE dll_hInstance = 0;
+HWND messagewin_hwnd;
+
+typedef BOOL (CALLBACK* LPFNFLASHWINDOWEX)(PFLASHWINFO);
+static LPFNFLASHWINDOWEX MyFlashWindowEx = NULL;
+
+/*
+ * PUBLIC CODE
+ */
+
+HINSTANCE wineasytag_exe_hinstance (void)
+{
+ return exe_hInstance;
+}
+
+HINSTANCE wineasytag_dll_hinstance(void) {
+ return dll_hInstance;
+}
+
+void wineasytag_shell_execute(const char *target, const char *verb, const char *clazz) {
+
+ g_return_if_fail(target != NULL);
+ g_return_if_fail(verb != NULL);
+
+ if (G_WIN32_HAVE_WIDECHAR_API()) {
+ SHELLEXECUTEINFOW wsinfo;
+ wchar_t *w_uri, *w_verb, *w_clazz = NULL;
+
+ w_uri = g_utf8_to_utf16(target, -1, NULL, NULL, NULL);
+ w_verb = g_utf8_to_utf16(verb, -1, NULL, NULL, NULL);
+
+ memset(&wsinfo, 0, sizeof(wsinfo));
+ wsinfo.cbSize = sizeof(wsinfo);
+ wsinfo.lpVerb = w_verb;
+ wsinfo.lpFile = w_uri;
+ wsinfo.nShow = SW_SHOWNORMAL;
+ if (clazz != NULL) {
+ w_clazz = g_utf8_to_utf16(clazz, -1, NULL, NULL, NULL);
+ wsinfo.fMask |= SEE_MASK_CLASSNAME;
+ wsinfo.lpClass = w_clazz;
+ }
+
+ if(!ShellExecuteExW(&wsinfo))
+ g_print("Error opening URI: %s error: %d\n",
+ target, (int) wsinfo.hInstApp);
+
+ g_free(w_uri);
+ g_free(w_verb);
+ g_free(w_clazz);
+ } else {
+ SHELLEXECUTEINFOA sinfo;
+ gchar *locale_uri;
+
+ locale_uri = g_locale_from_utf8(target, -1, NULL, NULL, NULL);
+
+ memset(&sinfo, 0, sizeof(sinfo));
+ sinfo.cbSize = sizeof(sinfo);
+ sinfo.lpVerb = verb;
+ sinfo.lpFile = locale_uri;
+ sinfo.nShow = SW_SHOWNORMAL;
+ if (clazz != NULL) {
+ sinfo.fMask |= SEE_MASK_CLASSNAME;
+ sinfo.lpClass = clazz;
+ }
+
+ if(!ShellExecuteExA(&sinfo))
+ g_print("Error opening URI: %s error: %d\n",
+ target, (int) sinfo.hInstApp);
+
+ g_free(locale_uri);
+ }
+
+}
+
+void wineasytag_notify_uri(const char *uri) {
+ /* We'll allow whatever URI schemes are supported by the
+ * default http browser.
+ */
+ wineasytag_shell_execute(uri, "open", "http");
+}
+
+/*
+#define EASYTAG_WM_FOCUS_REQUEST (WM_APP + 13)
+#define EASYTAG_WM_PROTOCOL_HANDLE (WM_APP + 14)
+
+static LRESULT CALLBACK message_window_handler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
+
+ if (msg == PIDGIN_WM_FOCUS_REQUEST) {
+ g_print("Got external Buddy List focus request.");
+ purple_blist_set_visible(TRUE);
+ return TRUE;
+ } else if (msg == PIDGIN_WM_PROTOCOL_HANDLE) {
+ char *proto_msg = (char *) lparam;
+ g_print("Got protocol handler request: %s\n", proto_msg ? proto_msg : "");
+ purple_got_protocol_handler_uri(proto_msg);
+ return TRUE;
+ }
+
+ return DefWindowProc(hwnd, msg, wparam, lparam);
+}*/
+
+/*static HWND wineasytag_message_window_init(void) {
+ HWND win_hwnd;
+ WNDCLASSEX wcx;
+ LPCTSTR wname;
+
+ wname = TEXT("WinpidginMsgWinCls");
+
+ wcx.cbSize = sizeof(wcx);
+ wcx.style = 0;
+ wcx.lpfnWndProc = message_window_handler;
+ wcx.cbClsExtra = 0;
+ wcx.cbWndExtra = 0;
+ wcx.hInstance = wineasytag_exe_hinstance();
+ wcx.hIcon = NULL;
+ wcx.hCursor = NULL;
+ wcx.hbrBackground = NULL;
+ wcx.lpszMenuName = NULL;
+ wcx.lpszClassName = wname;
+ wcx.hIconSm = NULL;
+
+ RegisterClassEx(&wcx);
+
+ // Create the window
+ if(!(win_hwnd = CreateWindow(wname, TEXT("WinpidginMsgWin"), 0, 0, 0, 0, 0,
+ NULL, NULL, winpidgin_exe_hinstance(), 0))) {
+
+ g_print("Unable to create message window.\n");
+ return NULL;
+ }
+
+ return win_hwnd;
+}*/
+
+void wineasytag_init(HINSTANCE hint) {
+
+ g_print("wineasytag_init start\n");
+
+ exe_hInstance = hint;
+
+ /* IdleTracker Initialization */
+ ////if(!wineasytag_set_idlehooks())
+ //// g_print("Failed to initialize idle tracker\n");
+
+ ////wineasytag_spell_init();
+ g_print("GTK+ :%u.%u.%u\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+
+ ////messagewin_hwnd = wineasytag_message_window_init();
+
+ MyFlashWindowEx = (LPFNFLASHWINDOWEX) weasytag_find_and_loadproc("user32.dll", "FlashWindowEx");
+
+ g_print("wineasytag_init end\n");
+}
+
+void wineasytag_post_init(void) {
+
+ //purple_prefs_add_none(PIDGIN_PREFS_ROOT "/win32");
+ //purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/win32/blink_im", TRUE);
+
+ //purple_signal_connect(pidgin_conversations_get_handle(),
+ // "displaying-im-msg", &gtkwin32_handle, PURPLE_CALLBACK(wineasytag_conv_im_blink),
+ // NULL);
+
+}
+
+/* Windows Cleanup */
+
+void wineasytag_cleanup(void) {
+ g_print("wineasytag_cleanup\n");
+
+ if(messagewin_hwnd)
+ DestroyWindow(messagewin_hwnd);
+
+ /* Idle tracker cleanup */
+ ////wineasytag_remove_idlehooks();
+
+}
+
+/* DLL initializer */
+/* suppress gcc "no previous prototype" warning */
+/*BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
+ dll_hInstance = hinstDLL;
+ return TRUE;
+}*/
+
diff --git a/src/win32/gtkwin32dep.h b/src/win32/gtkwin32dep.h
new file mode 100755
index 0000000..71d49a2
--- /dev/null
+++ b/src/win32/gtkwin32dep.h
@@ -0,0 +1,43 @@
+/*
+ * gtkwin32dep.h UI Win32 Specific Functionality
+ * easytag
+ *
+ * File: win32dep.h
+ *
+ * Copyright (C) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ *
+ */
+#ifndef _GTKWIN32DEP_H_
+#define _GTKWIN32DEP_H_
+#include <windows.h>
+#include <gtk/gtk.h>
+
+HINSTANCE wineasytag_dll_hinstance(void);
+HINSTANCE wineasytag_exe_hinstance(void);
+
+
+/* Misc */
+void wineasytag_notify_uri(const char *uri);
+void wineasytag_shell_execute(const char *target, const char *verb, const char *clazz);
+
+/* init / cleanup */
+void wineasytag_init(HINSTANCE);
+void wineasytag_post_init(void);
+void wineasytag_cleanup(void);
+
+#endif /* _GTKWIN32DEP_H_ */
+
diff --git a/src/win32/win32dep.c b/src/win32/win32dep.c
index cccde13..35e32d6 100755
--- a/src/win32/win32dep.c
+++ b/src/win32/win32dep.c
@@ -4,7 +4,7 @@
* File: win32dep.c
* Date: June, 2002
* Description: Windows dependant code for Easytag
- * this code if largely taken from win32 gaim
+ * this code if largely taken from win32 Gaim and Purple
*
* Copyright (C) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com>
*
@@ -28,7 +28,6 @@
#include <stdlib.h>
#include <stdio.h>
#include <winuser.h>
-#include <shlobj.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
@@ -36,12 +35,8 @@
#include <gtk/gtk.h>
#include <glib.h>
-#if GLIB_CHECK_VERSION(2,6,0)
-# include <glib/gstdio.h>
-#else
-# define g_fopen fopen
-# define g_unlink unlink
-#endif
+#include <glib/gstdio.h>
+
#include <gdk/gdkwin32.h>
#include "resource.h"
@@ -65,6 +60,7 @@
typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHA)(HWND, int, HANDLE, DWORD, LPSTR);
typedef HRESULT (CALLBACK* LPFNSHGETFOLDERPATHW)(HWND, int, HANDLE, DWORD, LPWSTR);
+// Defined also in "#include <shlobj.h>"
typedef enum
{
SHGFP_TYPE_CURRENT = 0, // current value for user, verify it exists
@@ -74,44 +70,22 @@ typedef enum
/*
* LOCALS
*/
-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);
+static char *app_data_dir = NULL, *install_dir = NULL,
+ *lib_dir = NULL, *locale_dir = NULL;
-/*
- * GLOBALS
- */
-HINSTANCE ET_exe_hInstance = 0;
-HINSTANCE ET_dll_hInstance = 0;
-
-/*
- * PROTOS
- */
-LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL;
-LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL;
+static HINSTANCE libeasytagdll_hInstance = 0;
-FARPROC ET_Win32_Find_And_Loadproc (char*, char*);
-char* ET_Win32_Data_Dir (void);
/*
* PUBLIC CODE
*/
-HINSTANCE ET_Win32_Hinstance (void)
-{
- return ET_exe_hInstance;
-}
-
/* Escape windows dir separators. This is needed when paths are saved,
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 (const char *filename)
-{
+char *weasytag_escape_dirsep(const char *filename) {
int sepcount = 0;
const char *tmp = filename;
char *ret;
@@ -136,49 +110,18 @@ char *ET_Win32_Escape_Dirsep (const char *filename)
return ret;
}
-/* this is used by libmp4v2 : what is it doing here you think ? well...search! */
-int gettimeofday (struct timeval *t, void *foo)
-{
- struct _timeb temp;
-
- if (t != 0) {
- _ftime(&temp);
- t->tv_sec = temp.time; /* seconds since 1-1-1970 */
- t->tv_usec = temp.millitm * 1000; /* microseconds */
- }
- return (0);
-}
-
-
-/* emulate the unix function */
-int mkstemp (char *template)
-{
- int fd = -1;
-
- char *str = mktemp(template);
- if(str != NULL)
- {
- fd = open(str, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
- }
-
- return fd;
-}
-
/* 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 weasytag_find_and_loadproc(const char *dllname, const char *procedure) {
HMODULE hmod;
BOOL did_load = FALSE;
FARPROC proc = 0;
- if(!(hmod=GetModuleHandle(dllname)))
- {
- //Log_Print(_("DLL '%s' not found. Try loading it..."), dllname);
- g_printf(_("DLL '%s' not found. Try loading it..."), dllname);
+ if(!(hmod = GetModuleHandle(dllname))) {
+ //Log_Print(_("DLL '%s' not already loaded. Try loading it..."), dllname);
+ g_printf(_("DLL '%s' not already loaded. Try loading it..."), dllname);
g_print("\n");
- if(!(hmod = LoadLibrary(dllname)))
- {
+ if(!(hmod = LoadLibrary(dllname))) {
//Log_Print(_("DLL '%s' could not be loaded"), dllname);
g_print(_("DLL '%s' could not be loaded"), dllname);
g_print("\n");
@@ -188,20 +131,17 @@ FARPROC ET_Win32_Find_And_Loadproc (char *dllname, char *procedure)
did_load = TRUE;
}
- if((proc=GetProcAddress(hmod, procedure)))
- {
+ if((proc = GetProcAddress(hmod, procedure))) {
//Log_Print(_("This version of '%s' contains '%s'"), dllname, procedure);
g_print(_("This version of '%s' contains '%s'"), dllname, procedure);
g_print("\n");
return proc;
}
- else
- {
+ else {
//Log_Print(_("Function '%s' not found in dll '%s'"), procedure, dllname);
g_print(_("Function '%s' not found in dll '%s'"), procedure, dllname);
g_print("\n");
- if(did_load)
- {
+ if(did_load) {
/* unload dll */
FreeLibrary(hmod);
}
@@ -211,122 +151,401 @@ FARPROC ET_Win32_Find_And_Loadproc (char *dllname, char *procedure)
/* Determine Easytag Paths during Runtime */
-char* ET_Win32_Install_Dir (void)
-{
- HMODULE hmod;
- char* buf;
+/* Get paths to special Windows folders. */
+char *weasytag_get_special_folder(int folder_type) {
+ static LPFNSHGETFOLDERPATHA MySHGetFolderPathA = NULL;
+ static LPFNSHGETFOLDERPATHW MySHGetFolderPathW = NULL;
+ char *retval = NULL;
- hmod = GetModuleHandle(NULL);
- if ( hmod == 0 )
- {
- buf = g_win32_error_message( GetLastError() );
- //Log_Print("GetModuleHandle error: %s\n", buf);
- g_print("GetModuleHandle error: %s\n", buf);
- g_free(buf);
- return NULL;
- }
- if (GetModuleFileName( hmod, (char*)&install_dir, MAXPATHLEN ) == 0)
- {
- buf = g_win32_error_message( GetLastError() );
- //Log_Print("GetModuleFileName error: %s\n", buf);
- g_print("GetModuleFileName error: %s\n", buf);
- g_free(buf);
- return NULL;
- }
- buf = g_path_get_dirname( install_dir );
- strcpy( (char*)&install_dir, buf );
- g_free( buf );
+ if (!MySHGetFolderPathW) {
+ MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW)
+ weasytag_find_and_loadproc("shfolder.dll", "SHGetFolderPathW");
+ }
+
+ if (MySHGetFolderPathW) {
+ wchar_t utf_16_dir[MAX_PATH + 1];
+
+ if (SUCCEEDED(MySHGetFolderPathW(NULL, folder_type, NULL,
+ SHGFP_TYPE_CURRENT, utf_16_dir))) {
+ retval = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL);
+ }
+ }
+
+ if (!retval) {
+ if (!MySHGetFolderPathA) {
+ MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA)
+ weasytag_find_and_loadproc("shfolder.dll", "SHGetFolderPathA");
+ }
+ if (MySHGetFolderPathA) {
+ char locale_dir[MAX_PATH + 1];
+
+ if (SUCCEEDED(MySHGetFolderPathA(NULL, folder_type, NULL,
+ SHGFP_TYPE_CURRENT, locale_dir))) {
+ retval = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL);
+ }
+ }
+ }
- return (char*)&install_dir;
+ return retval;
}
+const char *weasytag_install_dir(void) {
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ char *tmp = NULL;
+ if (G_WIN32_HAVE_WIDECHAR_API()) {
+ wchar_t winstall_dir[MAXPATHLEN];
+ if (GetModuleFileNameW(NULL, winstall_dir,
+ MAXPATHLEN) > 0) {
+ tmp = g_utf16_to_utf8(winstall_dir, -1,
+ NULL, NULL, NULL);
+ }
+ } else {
+ gchar cpinstall_dir[MAXPATHLEN];
+ if (GetModuleFileNameA(NULL, cpinstall_dir,
+ MAXPATHLEN) > 0) {
+ tmp = g_locale_to_utf8(cpinstall_dir,
+ -1, NULL, NULL, NULL);
+ }
+ }
+
+ if (tmp == NULL) {
+ tmp = g_win32_error_message(GetLastError());
+ //Log_Print("GetModuleFileName error: %s", tmp);
+ g_print("GetModuleFileName error: %s", tmp);
+ g_print("\n");
+ g_free(tmp);
+ return NULL;
+ } else {
+ install_dir = g_path_get_dirname(tmp);
+ g_free(tmp);
+ initialized = TRUE;
+ }
+ }
-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;
+ return install_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;
+const char *weasytag_lib_dir(void) {
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ const char *inst_dir = weasytag_install_dir();
+ if (inst_dir != NULL) {
+ lib_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "library", inst_dir);
+ initialized = TRUE;
+ } else {
+ return NULL;
+ }
+ }
+
+ return lib_dir;
}
-char *ET_Win32_Data_Dir (void)
-{
- return (char*)&app_data_dir;
+const char *weasytag_locale_dir(void) {
+ static gboolean initialized = FALSE;
+
+ if (!initialized) {
+ const char *inst_dir = weasytag_install_dir();
+ if (inst_dir != NULL) {
+ locale_dir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "locale", inst_dir);
+ initialized = TRUE;
+ } else {
+ return NULL;
+ }
+ }
+
+ return locale_dir;
}
+const char *weasytag_data_dir(void) {
+
+ if (!app_data_dir) {
+ /* Set app data dir, used by easytag_home_dir */
+ const char *newenv = g_getenv("EASYTAGHOME");
+ if (newenv)
+ app_data_dir = g_strdup(newenv);
+ else {
+ app_data_dir = weasytag_get_special_folder(CSIDL_APPDATA);
+ if (!app_data_dir)
+ app_data_dir = g_strdup("C:");
+ }
+
+ //ET_Win32_Path_Replace_Backslashes(app_data_dir);
+
+ //Log_Print(_("EasyTAG settings dir: '%s'"), app_data_dir);
+ g_print(_("EasyTAG settings dir: '%s'"), app_data_dir);
+ g_print("\n");
+ }
+
+ return app_data_dir;
+}
/* Miscellaneous */
-gboolean ET_Win32_Read_Reg_String (HKEY key, char* sub_key, char* val_name, LPBYTE data, LPDWORD data_len)
-{
- HKEY hkey;
- gboolean ret = FALSE;
+gboolean weasytag_write_reg_string(HKEY rootkey, const char *subkey, const char *valname,
+ const char *value) {
+ HKEY reg_key;
+ gboolean success = FALSE;
+
+ if(G_WIN32_HAVE_WIDECHAR_API()) {
+ wchar_t *wc_subkey = g_utf8_to_utf16(subkey, -1, NULL,
+ NULL, NULL);
+
+ if(RegOpenKeyExW(rootkey, wc_subkey, 0,
+ KEY_SET_VALUE, &reg_key) == ERROR_SUCCESS) {
+ wchar_t *wc_valname = NULL;
+
+ if (valname)
+ wc_valname = g_utf8_to_utf16(valname, -1,
+ NULL, NULL, NULL);
+
+ if(value) {
+ wchar_t *wc_value = g_utf8_to_utf16(value, -1,
+ NULL, NULL, NULL);
+ int len = (wcslen(wc_value) * sizeof(wchar_t)) + 1;
+ if(RegSetValueExW(reg_key, wc_valname, 0, REG_SZ,
+ (LPBYTE)wc_value, len
+ ) == ERROR_SUCCESS)
+ success = TRUE;
+ g_free(wc_value);
+ } else
+ if(RegDeleteValueW(reg_key, wc_valname) == ERROR_SUCCESS)
+ success = TRUE;
+
+ g_free(wc_valname);
+ }
+ g_free(wc_subkey);
+ } else {
+ char *cp_subkey = g_locale_from_utf8(subkey, -1, NULL,
+ NULL, NULL);
+ if(RegOpenKeyExA(rootkey, cp_subkey, 0,
+ KEY_SET_VALUE, &reg_key) == ERROR_SUCCESS) {
+ char *cp_valname = NULL;
+ if(valname)
+ cp_valname = g_locale_from_utf8(valname, -1,
+ NULL, NULL, NULL);
+
+ if (value) {
+ char *cp_value = g_locale_from_utf8(value, -1,
+ NULL, NULL, NULL);
+ int len = strlen(cp_value) + 1;
+ if(RegSetValueExA(reg_key, cp_valname, 0, REG_SZ,
+ cp_value, len
+ ) == ERROR_SUCCESS)
+ success = TRUE;
+ g_free(cp_value);
+ } else
+ if(RegDeleteValueA(reg_key, cp_valname) == ERROR_SUCCESS)
+ success = TRUE;
+
+ g_free(cp_valname);
+ }
+ g_free(cp_subkey);
+ }
- if(ERROR_SUCCESS == RegOpenKeyEx(key, sub_key, 0, KEY_QUERY_VALUE, &hkey))
- {
- if (ERROR_SUCCESS == RegQueryValueEx(hkey, val_name, 0, NULL, data, data_len))
- ret = TRUE;
- RegCloseKey(key);
- }
- return ret;
+ if(reg_key != NULL)
+ RegCloseKey(reg_key);
+
+ return success;
}
-/* find a default player executable */
-char* ET_Win32_Get_Audio_File_Player (void)
-{
- DWORD len = 256;
- char key_value[256];
+static HKEY _reg_open_key(HKEY rootkey, const char *subkey, REGSAM access) {
+ HKEY reg_key = NULL;
+ LONG rv;
+
+ if(G_WIN32_HAVE_WIDECHAR_API()) {
+ wchar_t *wc_subkey = g_utf8_to_utf16(subkey, -1, NULL,
+ NULL, NULL);
+ rv = RegOpenKeyExW(rootkey, wc_subkey, 0, access, &reg_key);
+ g_free(wc_subkey);
+ } else {
+ char *cp_subkey = g_locale_from_utf8(subkey, -1, NULL,
+ NULL, NULL);
+ rv = RegOpenKeyExA(rootkey, cp_subkey, 0, access, &reg_key);
+ g_free(cp_subkey);
+ }
- char *player;
+ if (rv != ERROR_SUCCESS) {
+ char *errmsg = g_win32_error_message(rv);
+ g_print("Could not open reg key '%s' subkey '%s'. Message: (%ld) %s\n",
+ ((rootkey == HKEY_LOCAL_MACHINE) ? "HKLM" :
+ (rootkey == HKEY_CURRENT_USER) ? "HKCU" :
+ (rootkey == HKEY_CLASSES_ROOT) ? "HKCR" : "???"),
+ subkey, rv, errmsg);
+ g_free(errmsg);
+ }
- if(ET_Win32_Read_Reg_String(HKEY_CURRENT_USER, "Software\\foobar2000", "InstallDir", key_value, &len))
- {
- player = g_strconcat(key_value, "\\foobar2000.exe", NULL);
- }
- else if(ET_Win32_Read_Reg_String(HKEY_CURRENT_USER, "Software\\Winamp", "", key_value, &len))
- {
- player = g_strconcat(key_value, "\\winamp.exe", NULL);
- }
- else
- {
- player = g_strdup("");
+ return reg_key;
+}
+
+static gboolean _reg_read(HKEY reg_key, const char *valname, LPDWORD type, LPBYTE data, LPDWORD data_len) {
+ LONG rv;
+
+ if(G_WIN32_HAVE_WIDECHAR_API()) {
+ wchar_t *wc_valname = NULL;
+ if (valname)
+ wc_valname = g_utf8_to_utf16(valname, -1, NULL, NULL, NULL);
+ rv = RegQueryValueExW(reg_key, wc_valname, 0, type, data, data_len);
+ g_free(wc_valname);
+ } else {
+ char *cp_valname = NULL;
+ if(valname)
+ cp_valname = g_locale_from_utf8(valname, -1, NULL, NULL, NULL);
+ rv = RegQueryValueExA(reg_key, cp_valname, 0, type, data, data_len);
+ g_free(cp_valname);
+ }
+
+ if (rv != ERROR_SUCCESS) {
+ char *errmsg = g_win32_error_message(rv);
+ g_print("Could not read from reg key value '%s'. Message: (%ld) %s\n",
+ valname, rv, errmsg);
+ g_free(errmsg);
+ }
+
+ return (rv == ERROR_SUCCESS);
+}
+
+gboolean weasytag_read_reg_dword(HKEY rootkey, const char *subkey, const char *valname, LPDWORD result) {
+
+ DWORD type;
+ DWORD nbytes;
+ HKEY reg_key = _reg_open_key(rootkey, subkey, KEY_QUERY_VALUE);
+ gboolean success = FALSE;
+
+ if(reg_key) {
+ if(_reg_read(reg_key, valname, &type, (LPBYTE)result, &nbytes))
+ success = TRUE;
+ RegCloseKey(reg_key);
+ }
+
+ return success;
+}
+
+char *weasytag_read_reg_string(HKEY rootkey, const char *subkey, const char *valname) {
+
+ DWORD type;
+ DWORD nbytes;
+ HKEY reg_key = _reg_open_key(rootkey, subkey, KEY_QUERY_VALUE);
+ char *result = NULL;
+
+ if(reg_key) {
+ if(_reg_read(reg_key, valname, &type, NULL, &nbytes) && type == REG_SZ) {
+ LPBYTE data;
+ if(G_WIN32_HAVE_WIDECHAR_API())
+ data = (LPBYTE) g_new(wchar_t, ((nbytes + 1) / sizeof(wchar_t)) + 1);
+ else
+ data = (LPBYTE) g_malloc(nbytes + 1);
+
+ if(_reg_read(reg_key, valname, &type, data, &nbytes)) {
+ if(G_WIN32_HAVE_WIDECHAR_API()) {
+ wchar_t *wc_temp = (wchar_t*) data;
+ wc_temp[nbytes / sizeof(wchar_t)] = '\0';
+ result = g_utf16_to_utf8(wc_temp, -1,
+ NULL, NULL, NULL);
+ } else {
+ char *cp_temp = (char*) data;
+ cp_temp[nbytes] = '\0';
+ result = g_locale_to_utf8(cp_temp, -1,
+ NULL, NULL, NULL);
+ }
+ }
+ g_free(data);
+ }
+ RegCloseKey(reg_key);
+ }
+
+ return result;
+}
+
+
+void weasytag_init(void) {
+ WORD wVersionRequested;
+ WSADATA wsaData;
+ char *newenv;
+
+ //Log_Print(_("weasytag_init start..."));
+ g_print(_("weasytag_init start..."));
+ g_print("\n");
+ //Log_Print(_("EasyTAG version: %s"),VERSION);
+ //g_print(_("EasyTAG version: %s"),VERSION);
+ //g_print("\n");
+
+ g_print(_("Glib version: %u.%u.%u\n"),glib_major_version, glib_minor_version, glib_micro_version);
+
+ /* Winsock init */
+ wVersionRequested = MAKEWORD( 2, 2 );
+ WSAStartup( wVersionRequested, &wsaData );
+
+ /* Confirm that the winsock DLL supports 2.2 */
+ /* Note that if the DLL supports versions greater than
+ 2.2 in addition to 2.2, it will still return 2.2 in
+ wVersion since that is the version we requested. */
+ if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
+ g_print("Could not find a usable WinSock DLL. Oh well.\n");
+ WSACleanup();
}
-
- //Log_Print(_("Audio player: '%s'"), player);
- g_print(_("Audio player: '%s'"), player);
+
+ /* Set Environmental Variables */
+
+ //Log_Print(_("weasytag_init end..."));
+ g_print(_("weasytag_init end..."));
g_print("\n");
+}
- return player;
+/* Windows Cleanup */
+
+void weasytag_cleanup(void) {
+ //Log_Print("weasytag_cleanup");
+ g_print("weasytag_cleanup\n");
+
+ /* winsock cleanup */
+ WSACleanup();
+
+ g_free(app_data_dir);
+ app_data_dir = NULL;
+
+ libeasytagdll_hInstance = NULL;
+}
+
+/* DLL initializer */
+/* suppress gcc "no previous prototype" warning */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
+ libeasytagdll_hInstance = hinstDLL;
+ return TRUE;
}
-void ET_Win32_Notify_Uri (const char *uri)
+
+/* this is used by libmp4v2 : what is it doing here you think ? well...search! */
+int gettimeofday (struct timeval *t, void *foo)
{
- SHELLEXECUTEINFO sinfo;
-
- memset(&sinfo, 0, sizeof(sinfo));
- sinfo.cbSize = sizeof(sinfo);
- sinfo.fMask = SEE_MASK_CLASSNAME;
- sinfo.lpVerb = "open";
- sinfo.lpFile = uri;
- sinfo.nShow = SW_SHOWNORMAL;
- sinfo.lpClass = "http";
-
- /* We'll allow whatever URI schemes are supported by the
- default http browser.
- */
- if(!ShellExecuteEx(&sinfo))
- //Log_Print("Error opening URI: %s error: %d\n", uri, (int)sinfo.hInstApp);
- g_print("Error opening URI: %s error: %d\n", uri, (int)sinfo.hInstApp);
+ struct _timeb temp;
+
+ if (t != 0) {
+ _ftime(&temp);
+ t->tv_sec = temp.time; /* seconds since 1-1-1970 */
+ t->tv_usec = temp.millitm * 1000; /* microseconds */
+ }
+ return (0);
}
+/* emulate the unix function */
+int mkstemp (char *template)
+{
+ int fd = -1;
+
+ char *str = mktemp(template);
+ if(str != NULL)
+ {
+ fd = open(str, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+ }
+
+ return fd;
+}
void str_replace_char (gchar *str, gchar in_char, gchar out_char)
{
@@ -338,8 +557,6 @@ void str_replace_char (gchar *str, gchar in_char, gchar out_char)
}
}
-
-
/* Remove trailing '/' if any */
void ET_Win32_Path_Remove_Trailing_Slash (gchar *path)
{
@@ -372,97 +589,32 @@ void ET_Win32_Path_Replace_Slashes (gchar *path)
str_replace_char(path, '/', '\\');
}
-void ET_Win32_Init (HINSTANCE hint)
+/* find a default player executable */
+char* ET_Win32_Get_Audio_File_Player (void)
{
- WORD wVersionRequested;
- WSADATA wsaData;
- char *newenv;
-
- ET_exe_hInstance = hint;
-
- /* Winsock init */
- wVersionRequested = MAKEWORD( 2, 2 );
- WSAStartup( wVersionRequested, &wsaData );
+ char *key_value;
+ char *player;
- /* Confirm that the winsock DLL supports 2.2 */
- /* Note that if the DLL supports versions greater than
- 2.2 in addition to 2.2, it will still return 2.2 in
- wVersion since that is the version we requested. */
- if ( LOBYTE( wsaData.wVersion ) != 2
- || HIBYTE( wsaData.wVersion ) != 2 )
+ if (key_value=weasytag_read_reg_string(HKEY_CURRENT_USER, "Software\\foobar2000", "InstallDir"))
{
- g_print("Could not find a usable WinSock DLL. Oh well.\n");
- WSACleanup();
- }
-
- /* Set app data dir, used by easytag_home_dir */
- newenv = (char*)g_getenv("EASYTAGHOME");
- if(!newenv)
+ player = g_strconcat(key_value, "\\foobar2000.exe", NULL);
+ g_free(key_value);
+
+ }else if(key_value=weasytag_read_reg_string(HKEY_CURRENT_USER, "Software\\Winamp", ""))
{
-#if GLIB_CHECK_VERSION(2,6,0)
- if ((MySHGetFolderPathW = (LPFNSHGETFOLDERPATHW) ET_Win32_Find_And_Loadproc("shfolder.dll", "SHGetFolderPathW")))
- {
- wchar_t utf_16_dir[MAX_PATH +1];
- char *temp;
- MySHGetFolderPathW(NULL, CSIDL_APPDATA, NULL,
- SHGFP_TYPE_CURRENT, utf_16_dir);
- temp = g_utf16_to_utf8(utf_16_dir, -1, NULL, NULL, NULL);
- g_strlcpy(app_data_dir, temp, sizeof(app_data_dir));
- g_free(temp);
- } else if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) ET_Win32_Find_And_Loadproc("shfolder.dll", "SHGetFolderPathA")))
- {
- char locale_dir[MAX_PATH + 1];
- char *temp;
- MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL,
- SHGFP_TYPE_CURRENT, locale_dir);
- temp = g_locale_to_utf8(locale_dir, -1, NULL, NULL, NULL);
- g_strlcpy(app_data_dir, temp, sizeof(app_data_dir));
- g_free(temp);
- }
-#else
- if ((MySHGetFolderPathA = (LPFNSHGETFOLDERPATHA) ET_Win32_Find_And_Loadproc("shfolder.dll", "SHGetFolderPathA")))
- {
- MySHGetFolderPathA(NULL, CSIDL_APPDATA, NULL,
- SHGFP_TYPE_CURRENT, app_data_dir);
- }
-#endif
- else
- {
- strcpy(app_data_dir, "C:");
- }
- }
- else
+ player = g_strconcat(key_value, "\\winamp.exe", NULL);
+ g_free(key_value);
+
+ }else
{
- g_strlcpy(app_data_dir, newenv, sizeof(app_data_dir));
+ player = g_strdup("");
}
-
- //ET_Win32_Path_Replace_Backslashes(app_data_dir);
-
- //Log_Print(_("EasyTAG settings dir: '%s'"), app_data_dir);
- g_print(_("EasyTAG settings dir: '%s'"), app_data_dir);
+
+ //Log_Print(_("Audio player: '%s'"), player);
+ g_print(_("Audio player: '%s'"), player);
g_print("\n");
- newenv = g_strdup_printf("HOME=%s", app_data_dir);
-
- if (putenv(newenv)<0)
- g_print("putenv failed\n");
- g_free(newenv);
-
+ return player;
}
-/* Windows Cleanup */
-
-void ET_Win32_Cleanup (void)
-{
- /* winsock cleanup */
- WSACleanup();
- ET_dll_hInstance = NULL;
-}
-
-/* DLL initializer */
-BOOL WINAPI DllMain ( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
-{
- ET_dll_hInstance = hinstDLL;
- return TRUE;
-}
diff --git a/src/win32/win32dep.h b/src/win32/win32dep.h
index 302ba0a..5a12ba3 100755
--- a/src/win32/win32dep.h
+++ b/src/win32/win32dep.h
@@ -23,7 +23,7 @@
#ifndef _WIN32DEP_H_
#define _WIN32DEP_H_
-
+#include <shlobj.h>
#include <winsock2.h>
#include <process.h>
#include <gtk/gtk.h>
@@ -45,41 +45,42 @@
** win32dep.c
**/
/* Windows helper functions */
-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 (const char *filename);
+FARPROC weasytag_find_and_loadproc(const char *dllname, const char *procedure);
+char *weasytag_read_reg_string(HKEY rootkey, const char *subkey, const char *valname); /* needs to be g_free'd */
+gboolean weasytag_write_reg_string(HKEY rootkey, const char *subkey, const char *valname, const char *value);
+char *weasytag_escape_dirsep(const char *filename); /* needs to be g_free'd */
+
+/* Determine EasyTAG paths */
+char *weasytag_get_special_folder(int folder_type);
+const char *weasytag_install_dir(void);
+const char *weasytag_lib_dir(void);
+const char *weasytag_locale_dir(void);
+const char *weasytag_data_dir(void);
-/* 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);
+/* init / cleanup */
+void weasytag_init(void);
+void weasytag_cleanup(void);
/* Misc */
-extern char * ET_Win32_Get_Audio_File_Player (void);
-extern void ET_Win32_Notify_Uri (const char *uri);
+extern char *ET_Win32_Get_Audio_File_Player (void);
-/* init / cleanup */
-extern void ET_Win32_Init (HINSTANCE);
-extern void ET_Win32_Cleanup (void);
+extern void ET_Win32_Path_Remove_Trailing_Slash (gchar *path);
+extern void ET_Win32_Path_Remove_Trailing_Backslash (gchar *path);
+extern void ET_Win32_Path_Replace_Backslashes (gchar *path);
+extern void ET_Win32_Path_Replace_Slashes (gchar *path);
-extern void ET_Win32_Path_Remove_Trailing_Slash (gchar *path);
-extern void ET_Win32_Path_Remove_Trailing_Backslash (gchar *path);
-extern void ET_Win32_Path_Replace_Backslashes (gchar *path);
-extern void ET_Win32_Path_Replace_Slashes (gchar *path);
+extern int mkstemp (char *template);
/*
* MACROS
*/
/*
- * ET specific
+ * EasyTAG specific
*/
-#define DATADIR ET_Win32_Install_Dir()
-#define LIBDIR ET_Win32_Lib_Dir()
-#define LOCALEDIR ET_Win32_Locale_Dir()
-//#define PACKAGE_DATA_DIR DATADIR
+#define DATADIR weasytag_install_dir()
+#define LIBDIR weasytag_lib_dir()
+#define LOCALEDIR weasytag_locale_dir()
#endif /* _WIN32DEP_H_ */
+
diff --git a/src/win32/win_easytag.c b/src/win32/win_easytag.c
index 21f4bac..8aaa825 100755
--- a/src/win32/win_easytag.c
+++ b/src/win32/win_easytag.c
@@ -112,34 +112,9 @@ static BOOL read_reg_string(HKEY key, char* sub_key, char* val_name, LPBYTE data
return ret;
}
-static void dll_prep() {
- char path[MAX_PATH + 1];
+static void common_dll_prep(const char *path) {
HMODULE hmod;
HKEY hkey;
- char gtkpath[MAX_PATH + 1];
- DWORD plen;
-
- plen = sizeof(gtkpath);
- hkey = HKEY_CURRENT_USER;
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
- (LPBYTE) &gtkpath, &plen)) {
- hkey = HKEY_LOCAL_MACHINE;
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
- (LPBYTE) &gtkpath, &plen)) {
- printf("GTK+ Path Registry Key not found. "
- "Assuming GTK+ is in the PATH.\n");
- return;
- }
- }
-
- /* this value is replaced during a successful RegQueryValueEx() */
- plen = sizeof(path);
- /* Determine GTK+ dll path .. */
- if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "DllPath",
- (LPBYTE) &path, &plen)) {
- strcpy(path, gtkpath);
- strcat(path, "\\bin");
- }
printf("GTK+ path found: %s\n", path);
@@ -212,27 +187,49 @@ static void dll_prep() {
}
}
-static char* lcid_to_posix(LCID lcid) {
+static void dll_prep() {
+ char path[MAX_PATH + 1];
+ HKEY hkey;
+ char gtkpath[MAX_PATH + 1];
+ DWORD plen;
+
+ plen = sizeof(gtkpath);
+ hkey = HKEY_CURRENT_USER;
+ if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
+ (LPBYTE) &gtkpath, &plen)) {
+ hkey = HKEY_LOCAL_MACHINE;
+ if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "Path",
+ (LPBYTE) &gtkpath, &plen)) {
+ printf("GTK+ Path Registry Key not found. "
+ "Assuming GTK+ is in the PATH.\n");
+ return;
+ }
+ }
+
+ /* this value is replaced during a successful RegQueryValueEx() */
+ plen = sizeof(path);
+ /* Determine GTK+ dll path .. */
+ if (!read_reg_string(hkey, "SOFTWARE\\GTK\\2.0", "DllPath",
+ (LPBYTE) &path, &plen)) {
+ strcpy(path, gtkpath);
+ strcat(path, "\\bin");
+ }
+
+ common_dll_prep(path);
+}
+
+static char* wineasytag_lcid_to_posix(LCID lcid) {
char *posix = NULL;
int lang_id = PRIMARYLANGID(lcid);
int sub_id = SUBLANGID(lcid);
switch (lang_id) {
+ case LANG_AFRIKAANS: posix = "af"; break;
case LANG_ARABIC: posix = "ar"; break;
case LANG_AZERI: posix = "az"; break;
case LANG_BENGALI: posix = "bn"; break;
case LANG_BULGARIAN: posix = "bg"; break;
case LANG_CATALAN: posix = "ca"; break;
- case LANG_CHINESE:
- switch (sub_id) {
- case SUBLANG_CHINESE_SIMPLIFIED:
- posix = "zh_CN"; break;
- case SUBLANG_CHINESE_TRADITIONAL:
- posix = "zh_TW"; break;
- default:
- posix = "zh"; break;
- }
- break;
case LANG_CZECH: posix = "cs"; break;
case LANG_DANISH: posix = "da"; break;
case LANG_ESTONIAN: posix = "et"; break;
@@ -261,9 +258,11 @@ static char* lcid_to_posix(LCID lcid) {
case LANG_HINDI: posix = "hi"; break;
case LANG_HUNGARIAN: posix = "hu"; break;
case LANG_ICELANDIC: break;
+ case LANG_INDONESIAN: posix = "id"; break;
case LANG_ITALIAN: posix = "it"; break;
case LANG_JAPANESE: posix = "ja"; break;
case LANG_GEORGIAN: posix = "ka"; break;
+ case LANG_KANNADA: posix = "kn"; break;
case LANG_KOREAN: posix = "ko"; break;
case LANG_LITHUANIAN: posix = "lt"; break;
case LANG_MACEDONIAN: posix = "mk"; break;
@@ -279,6 +278,7 @@ static char* lcid_to_posix(LCID lcid) {
break;
case LANG_PUNJABI: posix = "pa"; break;
case LANG_POLISH: posix = "pl"; break;
+ case LANG_PASHTO: posix = "ps"; break;
case LANG_PORTUGUESE:
switch (sub_id) {
case SUBLANG_PORTUGUESE_BRAZILIAN:
@@ -289,6 +289,9 @@ static char* lcid_to_posix(LCID lcid) {
break;
case LANG_ROMANIAN: posix = "ro"; break;
case LANG_RUSSIAN: posix = "ru"; break;
+ case LANG_SLOVAK: posix = "sk"; break;
+ case LANG_SLOVENIAN: posix = "sl"; break;
+ case LANG_ALBANIAN: posix = "sq"; break;
/* LANG_CROATIAN == LANG_SERBIAN == LANG_BOSNIAN */
case LANG_SERBIAN:
switch (sub_id) {
@@ -303,9 +306,6 @@ static char* lcid_to_posix(LCID lcid) {
posix = "hr"; break;
}
break;
- case LANG_SLOVAK: posix = "sk"; break;
- case LANG_SLOVENIAN: posix = "sl"; break;
- case LANG_ALBANIAN: posix = "sq"; break;
case LANG_SWEDISH: posix = "sv"; break;
case LANG_TAMIL: posix = "ta"; break;
case LANG_TELUGU: posix = "te"; break;
@@ -314,12 +314,20 @@ static char* lcid_to_posix(LCID lcid) {
case LANG_UKRAINIAN: posix = "uk"; break;
case LANG_VIETNAMESE: posix = "vi"; break;
case LANG_XHOSA: posix = "xh"; break;
+ case LANG_CHINESE:
+ switch (sub_id) {
+ case SUBLANG_CHINESE_SIMPLIFIED:
+ posix = "zh_CN"; break;
+ case SUBLANG_CHINESE_TRADITIONAL:
+ posix = "zh_TW"; break;
+ default:
+ posix = "zh"; break;
+ }
+ break;
case LANG_URDU: break;
- case LANG_INDONESIAN: break;
case LANG_BELARUSIAN: break;
case LANG_LATVIAN: break;
case LANG_ARMENIAN: break;
- case LANG_AFRIKAANS: break;
case LANG_FAEROESE: break;
case LANG_MALAY: break;
case LANG_KAZAK: break;
@@ -328,7 +336,6 @@ static char* lcid_to_posix(LCID lcid) {
case LANG_UZBEK: break;
case LANG_TATAR: break;
case LANG_ORIYA: break;
- case LANG_KANNADA: break;
case LANG_MALAYALAM: break;
case LANG_ASSAMESE: break;
case LANG_MARATHI: break;
@@ -358,7 +365,7 @@ static char* lcid_to_posix(LCID lcid) {
- Check NSIS Installer Language reg value
- Use default user locale
*/
-static const char *get_locale() {
+static const char *wineasytag_get_locale() {
const char *locale = NULL;
LCID lcid = 0;
char data[10];
@@ -373,23 +380,23 @@ static const char *get_locale() {
if (read_reg_string(HKEY_CURRENT_USER, "SOFTWARE\\easytag",
"Installer Language", (LPBYTE) &data, &datalen)) {
- if ((locale = lcid_to_posix(atoi(data))))
+ if ((locale = wineasytag_lcid_to_posix(atoi(data))))
return locale;
}
// List of LCID : http://www.microsoft.com/globaldev/reference/lcid-all.mspx
lcid = GetUserDefaultLCID();
- if ((locale = lcid_to_posix(lcid)))
+ if ((locale = wineasytag_lcid_to_posix(lcid)))
return locale;
return "en";
}
-static void set_locale() {
+static void wineasytag_set_locale() {
const char *locale = NULL;
char envstr[25];
- locale = get_locale();
+ locale = wineasytag_get_locale();
snprintf(envstr, 25, "LANG=%s", locale);
printf("Setting locale: %s\n", envstr);
@@ -397,9 +404,9 @@ static void set_locale() {
}
#if 0
-#define WM_FOCUS_REQUEST (WM_APP + 13)
+#define EASYTAG_WM_FOCUS_REQUEST (WM_APP + 13)
-static BOOL set_running() {
+static BOOL wineasytag_set_running() {
HANDLE h;
if ((h = CreateMutex(NULL, FALSE, "easytag_is_running"))) {
@@ -407,7 +414,7 @@ static BOOL set_running() {
HWND msg_win;
if((msg_win = FindWindow(TEXT("WineasytagMsgWinCls"), NULL)))
- if(SendMessage(msg_win, WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL))
+ if(SendMessage(msg_win, EASYTAG_WM_FOCUS_REQUEST, (WPARAM) NULL, (LPARAM) NULL))
return FALSE;
/* If we get here, the focus request wasn't successful */
@@ -476,13 +483,18 @@ int _stdcall
WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
char *lpszCmdLine, int nCmdShow) {
char errbuf[512];
+ char pidgin_dir[MAX_PATH];
+ char exe_name[MAX_PATH];
HMODULE hmod;
+ char *tmp;
+ int easytag_argc = __argc;
+ char **easytag_argv = __argv;
/* If debug or help or version flag used, create console for output */
if (strstr(lpszCmdLine, "-d") || strstr(lpszCmdLine, "-h") || strstr(lpszCmdLine, "-v")) {
/* If stdout hasn't been redirected to a file, alloc a console
* (_istty() doesn't work for stuff using the GUI subsystem) */
- if (_fileno(stdout) == -1) {
+ if (_fileno(stdout) == -1 || _fileno(stdout) == -2) {
LPFNATTACHCONSOLE MyAttachConsole = NULL;
if ((hmod = GetModuleHandle("kernel32.dll"))) {
MyAttachConsole =
@@ -496,12 +508,14 @@ WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
}
}
}
+
#if 0
/* Load exception handler if we have it */
- if (GetModuleFileName(NULL, gaimdir, MAX_PATH) != 0) {
- char *tmp = gaimdir;
+ if (GetModuleFileName(NULL, easytag_dir, MAX_PATH) != 0) {
char *prev = NULL;
+ tmp = easytag_dir;
+ /* primitive dirname() */
while ((tmp = strchr(tmp, '\\'))) {
prev = tmp;
tmp++;
@@ -509,9 +523,15 @@ WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
if (prev) {
prev[0] = '\0';
- strcat(gaimdir, "\\exchndl.dll");
- if (LoadLibrary(gaimdir))
+
+ /* prev++ will now point to the executable file name */
+ strcpy(exe_name, prev + 1);
+
+ strcat(easytag_dir, "\\exchndl.dll");
+ if (LoadLibrary(easytag_dir))
printf("Loaded exchndl.dll\n");
+
+ prev[0] = '\0';
}
} else {
DWORD dw = GetLastError();
@@ -519,18 +539,19 @@ WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
snprintf(errbuf, 512,
"Error getting module filename. Error: (%u) %s",
(UINT) dw, err_msg);
- printf(errbuf);
+ printf("%s", errbuf);
MessageBox(NULL, errbuf, NULL, MB_OK | MB_TOPMOST);
+ easytag_dir[0] = '\0';
}
#endif
dll_prep();
- set_locale();
+ wineasytag_set_locale();
/* If help or version flag used, do not check Mutex */
- //if (!strstr(lpszCmdLine, "-h") && !strstr(lpszCmdLine, "-v"))
- // if (!getenv("GAIM_MULTI_INST") && !wgaim_set_running())
- // return 0;
+ /*if (!strstr(lpszCmdLine, "-h") && !strstr(lpszCmdLine, "-v"))
+ if (!getenv("GAIM_MULTI_INST") && !wineasytag_set_running())
+ return 0;*/
set_proxy();
@@ -548,11 +569,11 @@ WinMain (struct HINSTANCE__ *hInstance, struct HINSTANCE__ *hPrevInstance,
(UINT) dw, err_msg,
mod_not_found ? "\n" : "",
mod_not_found ? "This probably means that a dependency (like GTK+, libogg or libvorbis) can't be found." : "");
- printf(errbuf);
+ printf("%s", errbuf);
MessageBox(NULL, errbuf, TEXT("Error"), MB_OK | MB_TOPMOST);
return 0;
}
- return easytag_main (hInstance, __argc, __argv);
+ return easytag_main (hInstance, easytag_argc, easytag_argv);
}