[gnac/devel] Fixed memory leaks



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]