]> err.no Git - mapper/blob - src/file.c
More work on the split open/save functions.
[mapper] / src / file.c
1 #define _GNU_SOURCE
2
3 #include <config.h>
4 #include <gtk/gtk.h>
5 #include <libgnomevfs/gnome-vfs.h>
6
7 #include "utils.h"
8 #include "mapper-types.h"
9
10 #include "settings.h"
11 #include "ui-common.h"
12 #include "hildon-wrappers.h"
13
14 /**
15  * Open a file for reading.
16  */
17 gboolean
18 file_open(gchar *dir, gchar *file, gchar *new_file)
19 {
20 GtkWidget *dialog;
21 gint r;
22 gboolean success=FALSE;
23
24 #ifdef WITH_HILDON
25 dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(_window), GTK_FILE_CHOOSER_ACTION_OPEN);
26 #else
27 dialog = gtk_file_chooser_dialog_new("Open...", GTK_WINDOW(_window), GTK_FILE_CHOOSER_ACTION_OPEN,
28                                                      GTK_STOCK_CANCEL,
29                                                      GTK_RESPONSE_CANCEL,
30                                                      GTK_STOCK_OPEN,
31                                                      GTK_RESPONSE_ACCEPT, NULL);
32 #endif
33
34 if (dir)
35         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), dir);
36
37 if (file)
38         gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog), file);
39
40 new_file=NULL;
41
42 r=gtk_dialog_run(GTK_DIALOG(dialog));
43 if (r==GTK_RESPONSE_ACCEPT || r==GTK_RESPONSE_OK) {
44                 /* Get the selected filename. */
45                 new_file = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
46                 g_printf("file: %s\n", new_file);
47                 success=TRUE;
48 }
49
50 gtk_widget_destroy(dialog);
51 return success;
52 }
53
54 /**
55  * Open a file for writing. Return a GnomeVFSHandle to the file for writing.
56  */
57 gboolean
58 file_save(gchar *dir, gchar *file, GnomeVFSHandle **vfs_handle)
59 {
60 GtkWidget *dialog;
61 gint r;
62 gboolean success=FALSE;
63
64 #ifdef WITH_HILDON
65 dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(_window), GTK_FILE_CHOOSER_ACTION_SAVE);
66 #else
67 dialog = gtk_file_chooser_dialog_new("Save...", GTK_WINDOW(_window), GTK_FILE_CHOOSER_ACTION_SAVE,
68                                                      GTK_STOCK_CANCEL,
69                                                      GTK_RESPONSE_CANCEL,
70                                                      GTK_STOCK_SAVE,
71                                                      GTK_RESPONSE_ACCEPT, NULL);
72 gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE);
73 #endif
74
75 if (dir)
76         gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER(dialog), dir);
77
78 if (file)
79         gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog), file);
80
81 r=gtk_dialog_run(GTK_DIALOG(dialog));
82 if (r==GTK_RESPONSE_ACCEPT || r==GTK_RESPONSE_OK) {
83         gchar *file_uri_str;
84         GnomeVFSResult vfs_result;
85
86         file_uri_str = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
87         vfs_result = gnome_vfs_create(vfs_handle, file_uri_str, GNOME_VFS_OPEN_WRITE, FALSE, 0664);
88         g_free(file_uri_str);
89
90         if (vfs_result!=GNOME_VFS_OK) {
91                 success=FALSE;
92         } else {
93                 if (dir) {
94                         g_free(dir);
95                         dir = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER(dialog));
96                 }
97                 if (file) {
98                         g_free(file);
99                         file = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
100                 }
101                 success=TRUE;
102         }
103 }
104
105 gtk_widget_destroy(dialog);
106 return success;
107 }
108
109 gboolean
110 file_open_get_content(gchar *file, gchar *dir, gchar **buffer, guint *bytes)
111 {
112 gchar *file_uri_str;
113 GnomeVFSResult vfs_result;
114
115 if (!file_open(file,dir, file_uri_str)) {
116         buffer=NULL;
117         return TRUE;
118 }
119 vfs_result = gnome_vfs_read_entire_file(file_uri_str, bytes, buffer);
120 if (vfs_result != GNOME_VFS_OK) {
121         return FALSE;
122 } else {
123         return TRUE;
124 }
125 }
126
127 /**
128  * This is a multi-purpose function for allowing the user to select a file
129  * for either reading or writing.  If chooser_action is
130  * GTK_FILE_CHOOSER_ACTION_OPEN, then bytes_out and size_out must be
131  * non-NULL.  If chooser_action is GTK_FILE_CHOOSER_ACTION_SAVE, then
132  * handle_out must be non-NULL.  Either dir or file (or both) can be NULL.
133  * This function returns TRUE if a file was successfully opened.
134  */
135 gboolean
136 open_file(gchar ** bytes_out, GnomeVFSHandle ** handle_out, gint * size_out,
137           gchar ** dir, gchar ** file, GtkFileChooserAction chooser_action)
138 {
139         GtkWidget *dialog;
140         gboolean success = FALSE;
141         printf("%s()\n", __PRETTY_FUNCTION__);
142
143         dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(_window), chooser_action);
144
145         if (dir && *dir)
146                 gtk_file_chooser_set_current_folder_uri(GTK_FILE_CHOOSER
147                                                         (dialog), *dir);
148
149         if (file && *file) {
150                 GValue val;
151                 gtk_file_chooser_set_uri(GTK_FILE_CHOOSER(dialog), *file);
152                 if (chooser_action == GTK_FILE_CHOOSER_ACTION_SAVE) {
153                         /* Work around a bug in HildonFileChooserDialog. */
154                         memset(&val, 0, sizeof(val));
155                         g_value_init(&val, G_TYPE_BOOLEAN);
156                         g_value_set_boolean(&val, FALSE);
157                         g_object_set_property(G_OBJECT(dialog), "autonaming",
158                                               &val);
159                         gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER
160                                                           (dialog), strrchr(*file, '/') + 1);
161                 }
162         }
163
164         gtk_widget_show_all(dialog);
165
166         g_printf("A\n");
167
168         while (!success && gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
169                 gchar *file_uri_str;
170                 GnomeVFSResult vfs_result;
171
172                 /* Get the selected filename. */
173                 file_uri_str = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
174
175                 g_printf("file: %s\n", file_uri_str);
176
177                 if ((chooser_action == GTK_FILE_CHOOSER_ACTION_OPEN
178                      && (GNOME_VFS_OK !=
179                          (vfs_result = gnome_vfs_read_entire_file(file_uri_str, size_out,
180                                                      bytes_out))))
181                     || (chooser_action == GTK_FILE_CHOOSER_ACTION_SAVE
182                         && GNOME_VFS_OK != (vfs_result = gnome_vfs_create(handle_out,
183                                                              file_uri_str, GNOME_VFS_OPEN_WRITE, FALSE, 0664)))) {
184                         gchar buffer[BUFFER_SIZE];
185                         snprintf(buffer, sizeof(buffer),"%s:\n%s",
186                                  chooser_action == GTK_FILE_CHOOSER_ACTION_OPEN ?
187                                  _("Failed to open file for reading")
188                                  : _("Failed to open file for writing"),
189                                  gnome_vfs_result_to_string(vfs_result));
190                         popup_error(dialog, buffer);
191                 } else
192                         success = TRUE;
193
194                 g_free(file_uri_str);
195         }
196
197         g_printf("B\n");
198
199         if (success) {
200                 /* Success!. */
201                 if (dir) {
202                         g_free(*dir);
203                         *dir = gtk_file_chooser_get_current_folder_uri
204                             (GTK_FILE_CHOOSER(dialog));
205                 }
206
207                 /* If desired, save the file for later. */
208                 if (file) {
209                         g_free(*file);
210                         *file = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
211                 }
212
213                 g_printf("C\n");
214
215         }
216
217         gtk_widget_destroy(dialog);
218
219         vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, success);
220         return success;
221 }