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