[gnac/devel] Fixed memory leaks
- From: BenoÃt Dupasquier <bdupasqu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnac/devel] Fixed memory leaks
- Date: Thu, 12 Jan 2012 22:32:48 +0000 (UTC)
commit 705bff31a434a66f11e9ee4b235ebdbcc70a5515
Author: BenoÃt Dupasquier <bdupasqu src gnome org>
Date: Thu Jan 12 22:32:13 2012 +0000
Fixed memory leaks
libgnac/libgnac-output.c | 93 ++++++++++++++++++++++++++++------------------
libgnac/libgnac-output.h | 6 +-
2 files changed, 60 insertions(+), 39 deletions(-)
---
diff --git a/libgnac/libgnac-output.c b/libgnac/libgnac-output.c
index d9deeeb..6afa13e 100644
--- a/libgnac/libgnac-output.c
+++ b/libgnac/libgnac-output.c
@@ -120,13 +120,10 @@ static gchar*
libgnac_output_sanitize_path(const gchar *str,
gboolean strip_special)
{
- gchar *result = NULL;
- gchar *temp;
-
/* Skip leading periods, otherwise files disappear... */
while (*str == '.') str++;
- temp = g_strdup(str);
+ gchar *temp = g_strdup(str);
if (strip_special) {
/* Replace separators with a hyphen */
@@ -137,7 +134,7 @@ libgnac_output_sanitize_path(const gchar *str,
g_strdelimit(temp, "\t ", '_');
}
- result = g_filename_from_utf8(temp, -1, NULL, NULL, NULL);
+ gchar *result = g_filename_from_utf8(temp, -1, NULL, NULL, NULL);
g_free(temp);
return result ? result : g_strdup(str);
@@ -156,6 +153,7 @@ libgnac_output_rename_pattern_new(const gchar pattern)
RENAME_PATTERN_SEPARATOR, pattern);
rename_pattern->id = pattern;
+ rename_pattern->replace = NULL;
rename_pattern->regex = g_regex_new(full_pattern, G_REGEX_OPTIMIZE, 0, NULL);
g_free(full_pattern);
@@ -167,6 +165,7 @@ static void
libgnac_output_rename_pattern_set_replace(LibgnacRenamePattern *pattern,
LibgnacTags *tags)
{
+ g_free(pattern->replace);
pattern->replace = libgnac_output_replace_pattern(pattern, tags);
/* Replace path seperators with a hyphen */
g_strdelimit(pattern->replace, G_DIR_SEPARATOR_S, '-');
@@ -186,77 +185,77 @@ libgnac_output_replace_pattern(LibgnacRenamePattern *pattern,
GValue *val = LIBGNAC_METADATA_TAG_ARTIST(tags);
return g_value_dup_string(val);
}
- return RENAME_PATTERN_DEFAULT_ARTIST;
+ return g_strdup(RENAME_PATTERN_DEFAULT_ARTIST);
case RENAME_PATTERN_ALBUM:
if (libgnac_metadata_tag_exists(tags, GST_TAG_ALBUM)) {
GValue *val = LIBGNAC_METADATA_TAG_ALBUM(tags);
return g_value_dup_string(val);
}
- return RENAME_PATTERN_DEFAULT_ALBUM;
+ return g_strdup(RENAME_PATTERN_DEFAULT_ALBUM);
case RENAME_PATTERN_DISC_NUMBER:
if (libgnac_metadata_tag_exists(tags, GST_TAG_ALBUM_VOLUME_NUMBER)) {
GValue *val = LIBGNAC_METADATA_TAG_ALBUM_VOLUME_NUMBER(tags);
return g_strdup_printf("%d", g_value_get_uint(val));
}
- return RENAME_PATTERN_DEFAULT_DISC_NUMBER;
+ return g_strdup(RENAME_PATTERN_DEFAULT_DISC_NUMBER);
case RENAME_PATTERN_DISC_COUNT:
if (libgnac_metadata_tag_exists(tags, GST_TAG_ALBUM_VOLUME_COUNT)) {
GValue *val = LIBGNAC_METADATA_TAG_ALBUM_VOLUME_COUNT(tags);
return g_strdup_printf("%d", g_value_get_uint(val));
}
- return RENAME_PATTERN_DEFAULT_DISC_NUMBER;
+ return g_strdup(RENAME_PATTERN_DEFAULT_DISC_NUMBER);
case RENAME_PATTERN_COMMENT:
if (libgnac_metadata_tag_exists(tags, GST_TAG_COMMENT)) {
GValue *val = LIBGNAC_METADATA_TAG_COMMENT(tags);
return g_value_dup_string(val);
}
- return RENAME_PATTERN_DEFAULT_COMMENT;
+ return g_strdup(RENAME_PATTERN_DEFAULT_COMMENT);
case RENAME_PATTERN_DATE:
if (libgnac_metadata_tag_exists(tags, GST_TAG_DATE)) {
GValue *val = LIBGNAC_METADATA_TAG_DATE(tags);
return g_strdup_printf("%d", g_value_get_uint(val));
}
- return RENAME_PATTERN_DEFAULT_DATE;
+ return g_strdup(RENAME_PATTERN_DEFAULT_DATE);
case RENAME_PATTERN_FILENAME:
if (libgnac_metadata_tag_exists(tags, GNAC_TAG_FILENAME)) {
GValue *val = LIBGNAC_METADATA_TAG_FILENAME(tags);
return libgnac_output_remove_extension(g_value_get_string(val));
}
- return RENAME_PATTERN_DEFAULT_FILENAME;
+ return g_strdup(RENAME_PATTERN_DEFAULT_FILENAME);
case RENAME_PATTERN_GENRE:
if (libgnac_metadata_tag_exists(tags, GST_TAG_GENRE)) {
GValue *val = LIBGNAC_METADATA_TAG_GENRE(tags);
return g_value_dup_string(val);
}
- return RENAME_PATTERN_DEFAULT_GENRE;
+ return g_strdup(RENAME_PATTERN_DEFAULT_GENRE);
case RENAME_PATTERN_TITLE:
if (libgnac_metadata_tag_exists(tags, GST_TAG_TITLE)) {
GValue *val = LIBGNAC_METADATA_TAG_TITLE(tags);
return g_value_dup_string(val);
}
- return RENAME_PATTERN_DEFAULT_TITLE;
+ return g_strdup(RENAME_PATTERN_DEFAULT_TITLE);
case RENAME_PATTERN_TRACK_COUNT:
if (libgnac_metadata_tag_exists(tags, GST_TAG_TRACK_COUNT)) {
GValue *val = LIBGNAC_METADATA_TAG_TRACK_COUNT(tags);
return g_strdup_printf("%02d", g_value_get_uint(val));
}
- return RENAME_PATTERN_DEFAULT_TRACK_NUMBER;
+ return g_strdup(RENAME_PATTERN_DEFAULT_TRACK_NUMBER);
case RENAME_PATTERN_TRACK_NUMBER:
if (libgnac_metadata_tag_exists(tags, GST_TAG_TRACK_NUMBER)) {
GValue *val = LIBGNAC_METADATA_TAG_TRACK_NUMBER(tags);
return g_strdup_printf("%02d", g_value_get_uint(val));
}
- return RENAME_PATTERN_DEFAULT_TRACK_NUMBER;
+ return g_strdup(RENAME_PATTERN_DEFAULT_TRACK_NUMBER);
default:
libgnac_debug("Unknown pattern: %s", pattern);
@@ -286,9 +285,21 @@ libgnac_output_rename_patterns_init(LibgnacTags *tags)
static void
+libgnac_output_rename_pattern_free(LibgnacRenamePattern *pattern)
+{
+ if (!pattern) return;
+
+ g_regex_unref(pattern->regex);
+ g_free(pattern->replace);
+ g_free(pattern);
+}
+
+
+static void
libgnac_output_rename_patterns_free(void)
{
- g_slist_free(rename_patterns);
+ g_slist_free_full(rename_patterns,
+ (GDestroyNotify) libgnac_output_rename_pattern_free);
}
@@ -341,25 +352,11 @@ libgnac_output_finalize(void)
}
-GFile *
-libgnac_output_build_output(GFile *source,
- LibgnacOutputConfig *config,
- GError **error)
+static GFile *
+libgnac_output_get_output_directory(GFile *source,
+ LibgnacOutputConfig *config)
{
- g_return_val_if_fail(!error || !*error, NULL);
-
- GError *output_error = NULL;
-
- gchar *filename = libgnac_output_get_filename(source,
- config->rename_pattern, &output_error);
- if (output_error) {
- libgnac_debug("Filename creation failed");
- g_propagate_error(error, output_error);
- return NULL;
- }
-
GFile *out_directory;
- gchar *output_name;
switch (config->folder_type)
{
@@ -372,14 +369,38 @@ libgnac_output_build_output(GFile *source,
case FOLDER_SELECTED:
out_directory = g_file_new_for_uri(config->folder_path);
- break;
+ break;
case FOLDER_CURRENT:
default:
out_directory = g_file_get_parent(source);
- break;
+ break;
}
+ return out_directory;
+}
+
+
+GFile *
+libgnac_output_build_output(GFile *source,
+ LibgnacOutputConfig *config,
+ GError **error)
+{
+ g_return_val_if_fail(!error || !*error, NULL);
+
+ GError *output_error = NULL;
+
+ gchar *filename = libgnac_output_get_filename(source,
+ config->rename_pattern, &output_error);
+ if (output_error) {
+ libgnac_debug("Filename creation failed");
+ g_propagate_error(error, output_error);
+ return NULL;
+ }
+
+ gchar *output_name;
+ GFile *out_directory = libgnac_output_get_output_directory(source, config);
+
/* check whether we have to build a folder hierarchy */
if (config->folder_hierarchy
&& !g_str_equal(g_strstrip(config->folder_hierarchy), ""))
diff --git a/libgnac/libgnac-output.h b/libgnac/libgnac-output.h
index 5a6547f..f2b8ef0 100644
--- a/libgnac/libgnac-output.h
+++ b/libgnac/libgnac-output.h
@@ -67,9 +67,9 @@
G_BEGIN_DECLS
typedef struct {
- const GRegex *regex;
- gchar *replace;
- gchar id; /* single letter representing the pattern */
+ GRegex *regex;
+ gchar *replace;
+ gchar id; /* single letter representing the pattern */
} LibgnacRenamePattern;
typedef enum
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]