gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r19687 - gnunet-gtk/src/fs


From: gnunet
Subject: [GNUnet-SVN] r19687 - gnunet-gtk/src/fs
Date: Sat, 4 Feb 2012 21:13:38 +0100

Author: grothoff
Date: 2012-02-04 21:13:38 +0100 (Sat, 04 Feb 2012)
New Revision: 19687

Modified:
   gnunet-gtk/src/fs/gnunet-fs-gtk_download-save-as.c
Log:
-create directory if it does not exist to allow nice save-as suggestion; clean 
it up on abort

Modified: gnunet-gtk/src/fs/gnunet-fs-gtk_download-save-as.c
===================================================================
--- gnunet-gtk/src/fs/gnunet-fs-gtk_download-save-as.c  2012-02-04 20:03:37 UTC 
(rev 19686)
+++ gnunet-gtk/src/fs/gnunet-fs-gtk_download-save-as.c  2012-02-04 20:13:38 UTC 
(rev 19687)
@@ -49,10 +49,36 @@
    */
   GtkWidget *dialog;
 
+  /**
+   * Name of the directory that should be unlinked if the operation is aborted,
+   * can be NULL.
+   */
+  char *dirname;
+
 };
 
 
 /**
+ * Clean up the given DLC context, including possibly removing
+ * the left-over (empty) directory.
+ *
+ * @param dlc context to clean up
+ */
+static void
+clean_up_download_as_context (struct DownloadAsDialogContext *dlc)
+{
+  g_object_unref (G_OBJECT (dlc->builder));
+  if (NULL != dlc->dirname)
+  {
+    if (0 != RMDIR (dlc->dirname))
+      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "rmdir", 
dlc->dirname);
+    GNUNET_free (dlc->dirname);
+  }
+  GNUNET_free (dlc);
+}
+
+
+/**
  * Free resources associated with the given download entry.
  *
  * @param de context to free
@@ -89,8 +115,7 @@
   struct DownloadAsDialogContext *dlc = user_data;
 
   GNUNET_FS_GTK_free_download_entry (dlc->de);
-  g_object_unref (G_OBJECT (dlc->builder));
-  GNUNET_free (dlc);
+  clean_up_download_as_context (dlc);
   return FALSE;
 }
 
@@ -116,9 +141,8 @@
   if (GTK_RESPONSE_OK != response_id)
   {
     GNUNET_FS_GTK_free_download_entry (de);
-    gtk_widget_destroy (GTK_WIDGET (dialog));
-    g_object_unref (G_OBJECT (dlc->builder));
-    GNUNET_free (dlc);
+    gtk_widget_destroy (GTK_WIDGET (dialog));    
+    clean_up_download_as_context (dlc);
     return;
   }
   GNUNET_free_non_null (de->filename);
@@ -136,8 +160,9 @@
                                           (dlc->builder,
                                            
"GNUNET_GTK_save_as_dialog_anonymity_spin_button")));
   gtk_widget_destroy (GTK_WIDGET (dialog));
-  g_object_unref (G_OBJECT (dlc->builder));
-  GNUNET_free (dlc);
+  GNUNET_free_non_null (dlc->dirname);
+  dlc->dirname = NULL;
+  clean_up_download_as_context (dlc);
   GNUNET_FS_GTK_download_context_start_download (de);
 }
 
@@ -184,6 +209,7 @@
   {
     char *dirname;
     char *basename;
+    struct stat sbuf;
 
     dirname = GNUNET_strdup (de->filename);
     basename = (char *) GNUNET_STRINGS_get_short_name (dirname);
@@ -191,16 +217,21 @@
     if (basename > dirname)
       basename[-1] = '\0';
 
-    /* FIXME: remove following lines after testing... */
-    fprintf (stderr,
-            "Splitting `%s' into `%s' + `%s' for file chooser dialog.\n",
-            de->filename,
-            dirname,
-            basename);
-
+    if (0 != STAT (dirname, &sbuf))
+    {
+      if (GNUNET_OK != GNUNET_DISK_directory_create (dirname))
+      {
+       GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING, "mkdir", dirname);
+      }
+      else
+      {
+       dlc->dirname = dirname; 
+      }
+    }
     gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dlc->dialog), 
dirname);
     gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dlc->dialog), 
basename);
-    GNUNET_free (dirname);
+    if (NULL == dlc->dirname)
+      GNUNET_free (dirname);
   }
   gtk_dialog_set_default_response (GTK_DIALOG (dlc->dialog),
                                   GTK_RESPONSE_OK);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]