dasher r3605 - in trunk: . Src/Gtk2
- From: pwelche svn gnome org
- To: svn-commits-list gnome org
- Subject: dasher r3605 - in trunk: . Src/Gtk2
- Date: Sat, 20 Dec 2008 16:29:56 +0000 (UTC)
Author: pwelche
Date: Sat Dec 20 16:29:55 2008
New Revision: 3605
URL: http://svn.gnome.org/viewvc/dasher?rev=3605&view=rev
Log:
Dasher depends on glib, and newish glib comes with gio, so use gio's gvfs
rather than gnome-vfs. There are some niggles left here: file size is given
by the machine independent (MI) off_t=guint64, but read/operations are in
MD size_t, e.g uint32_t, gsize, but some functions use -1 to mean read
until terminating NUL, so we rediscover the standard ctype.h problem, and
loose range because the size now has to be signed -> gssize. The other
niggle is e.g., m=fwrite(,n,,) : we don't handle m<n.
Modified:
trunk/ChangeLog
trunk/Src/Gtk2/dasher_editor.cpp
trunk/Src/Gtk2/dasher_editor_internal.cpp
trunk/configure.in
Modified: trunk/Src/Gtk2/dasher_editor.cpp
==============================================================================
--- trunk/Src/Gtk2/dasher_editor.cpp (original)
+++ trunk/Src/Gtk2/dasher_editor.cpp Sat Dec 20 16:29:55 2008
@@ -22,9 +22,6 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
-#ifdef GNOME_LIBS
-#include <libgnomevfs/gnome-vfs.h>
-#endif
#include "dasher_action_keyboard.h"
#ifdef WITH_MAEMO
Modified: trunk/Src/Gtk2/dasher_editor_internal.cpp
==============================================================================
--- trunk/Src/Gtk2/dasher_editor_internal.cpp (original)
+++ trunk/Src/Gtk2/dasher_editor_internal.cpp Sat Dec 20 16:29:55 2008
@@ -3,11 +3,10 @@
#include <cstring>
#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#ifdef GNOME_LIBS
-#include <libgnomevfs/gnome-vfs.h>
+#ifdef HAVE_GIO
+#include <gio/gio.h>
#endif
-
+#include <gtk/gtk.h>
#ifdef WITH_MAEMO
#include "dasher_action_keyboard_maemo.h"
@@ -133,13 +132,14 @@
static void dasher_editor_internal_command_open(DasherEditor *pSelf);
static void dasher_editor_internal_command_save(DasherEditor *pSelf, gboolean bPrompt, gboolean bAppend);
-#ifdef GNOME_LIBS
-static void dasher_editor_internal_vfs_print_error(DasherEditor *pSelf, GnomeVFSResult * result, const char *myfilename);
-static gboolean dasher_editor_internal_gnome_vfs_open_file(DasherEditor *pSelf, const char *filename, gchar ** buffer, unsigned long long *size);
-static gboolean dasher_editor_internal_gnome_vfs_save_file(DasherEditor *pSelf, const char *filename, gchar * buffer, unsigned long long length, bool append);
+#ifdef HAVE_GIO
+static void dasher_editor_internal_gvfs_print_error(DasherEditor *pSelf, GError *error, const char *myfilename);
+static GFileOutputStream *append_or_replace_file(GFile *file, bool append, GError **error);
+static gboolean dasher_editor_internal_gvfs_open_file(DasherEditor *pSelf, const char *filename, gchar ** buffer, gsize *size);
+static gboolean dasher_editor_internal_gvfs_save_file(DasherEditor *pSelf, const char *filename, gchar * buffer, gsize length, bool append);
#else
-static gboolean dasher_editor_internal_unix_vfs_open_file(DasherEditor *pSelf, const char *filename, gchar ** buffer, unsigned long long *size);
-static gboolean dasher_editor_internal_unix_vfs_save_file(DasherEditor *pSelf, const char *filename, gchar * buffer, unsigned long long length, bool append);
+static gboolean dasher_editor_internal_unix_vfs_open_file(DasherEditor *pSelf, const char *filename, gchar ** buffer, gsize *size);
+static gboolean dasher_editor_internal_unix_vfs_save_file(DasherEditor *pSelf, const char *filename, gchar * buffer, gsize length, bool append);
#endif
static void dasher_editor_internal_set_filename(DasherEditor *pSelf, const gchar *szFilename);
@@ -664,7 +664,7 @@
// TODO: Check where this function is used
DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
- gchar *szContext;
+ const gchar *szContext;
if(pPrivate->pBufferSet)
szContext = idasher_buffer_set_get_context(pPrivate->pBufferSet, iOffset, iLength);
@@ -715,11 +715,11 @@
dasher_editor_internal_open(DasherEditor *pSelf, const gchar *szFilename) {
DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
- unsigned long long size;
+ gsize size;
gchar *buffer;
-#ifdef GNOME_LIBS
- if(!dasher_editor_internal_gnome_vfs_open_file(pSelf, szFilename, &buffer, &size)) {
+#ifdef HAVE_GIO
+ if(!dasher_editor_internal_gvfs_open_file(pSelf, szFilename, &buffer, &size)) {
return;
}
#else
@@ -734,12 +734,12 @@
if(size != 0) {
// Don't attempt to insert new text if the file is empty as it makes
// GTK cry
- if(!g_utf8_validate(buffer, size, NULL)) {
+ if(!g_utf8_validate(buffer, size, NULL)) { // PRLW: size as gssize = signed int
// It's not UTF8, so we do the best we can...
// If there are zero bytes in the file then we have a problem -
// for now, just assert that we can't load these files.
- for(unsigned int i(0); i < size; ++i)
+ for(gsize i = 0; i < size; ++i)
if(buffer[i] == 0) {
// GtkWidget *pErrorBox = gtk_message_dialog_new(GTK_WINDOW(window),
// GTK_DIALOG_MODAL,
@@ -854,8 +854,8 @@
bytes_written = length;
// }
-#ifdef GNOME_LIBS
- if(!dasher_editor_internal_gnome_vfs_save_file(pSelf, szFilename, outbuffer, bytes_written, bAppend)) {
+#ifdef HAVE_GIO
+ if(!dasher_editor_internal_gvfs_save_file(pSelf, szFilename, outbuffer, bytes_written, bAppend)) {
return false;
}
#else
@@ -1337,12 +1337,12 @@
GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL, NULL);
-#ifdef GNOME_LIBS
+#ifdef HAVE_GIO
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
#endif
if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
-#ifdef GNOME_LIBS
+#ifdef HAVE_GIO
char *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
#else
char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
@@ -1371,12 +1371,12 @@
GTK_STOCK_CANCEL,
GTK_RESPONSE_CANCEL, NULL);
-#ifdef GNOME_LIBS
+#ifdef HAVE_GIO
gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(filesel), FALSE);
#endif
if(gtk_dialog_run(GTK_DIALOG(filesel)) == GTK_RESPONSE_ACCEPT) {
-#ifdef GNOME_LIBS
+#ifdef HAVE_GIO
szFilename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(filesel));
#else
szFilename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filesel));
@@ -1397,13 +1397,13 @@
g_free(szFilename);
}
-#ifdef GNOME_LIBS
+#ifdef HAVE_GIO
static void
-dasher_editor_internal_vfs_print_error(DasherEditor *pSelf, GnomeVFSResult *result, const char *myfilename) {
- // Turns a Gnome VFS error into English
+dasher_editor_internal_gvfs_print_error(DasherEditor *pSelf, GError *error, const char *myfilename) {
+ // Turns a GVFS error into English
GtkWidget *error_dialog;
// error_dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Could not open the file \"%s\"\n%s\n", myfilename, gnome_vfs_result_to_string(*result));
- error_dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Could not open the file \"%s\"\n%s\n", myfilename, gnome_vfs_result_to_string(*result));
+ error_dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Could not open the file \"%s\"\n%s\n", myfilename, error->message);
gtk_dialog_set_default_response(GTK_DIALOG(error_dialog), GTK_RESPONSE_OK);
gtk_window_set_resizable(GTK_WINDOW(error_dialog), FALSE);
gtk_dialog_run(GTK_DIALOG(error_dialog));
@@ -1412,119 +1412,141 @@
}
static gboolean
-dasher_editor_internal_gnome_vfs_open_file(DasherEditor *pSelf, const char *myfilename, gchar **buffer, unsigned long long *size) {
- GnomeVFSHandle *read_handle;
- GnomeVFSResult result;
- GnomeVFSFileInfo info;
- GnomeVFSFileSize bytes_read;
- GnomeVFSURI *uri;
-
- uri = gnome_vfs_uri_new(myfilename);
-
- if(uri == NULL) { // It's not a URI we can cope with - assume it's a filename
- char *tmpfilename = gnome_vfs_get_uri_from_local_path(myfilename);
- // TODO: figure out how this is supposed to work, and reimplement
-// if(myfilename != filename) {
-// g_free((void *)myfilename);
-// }
- myfilename = tmpfilename;
- uri = gnome_vfs_uri_new(myfilename);
- if(uri == NULL) {
+dasher_editor_internal_gvfs_open_file(DasherEditor *pSelf, const char *uri, gchar **buffer, gsize *size)
+{
+ GFile *file;
+ GFileInputStream *read_handle;
+ GError *error;
+ GFileInfo *info;
+ gssize bytes_read;
+
+ file = g_file_new_for_uri (uri);
+
+ read_handle = g_file_read (file, NULL, &error);
+
+ /* If URI didn't work, try path */
+ if (read_handle == NULL)
+ { // PRLW: g_object_unref isn't actually stipulated by g_file_new_for_uri
+ g_object_unref (file);
+ file = g_file_new_for_path (uri);
+ read_handle = g_file_read (file, NULL, &error);
+ }
+
+ if (read_handle == NULL)
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_object_unref (file);
return FALSE;
}
- }
- result = gnome_vfs_open_uri(&read_handle, uri, GNOME_VFS_OPEN_READ);
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
- return FALSE;
- }
+ info = g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_SIZE,
+ G_FILE_QUERY_INFO_NONE, NULL, &error);
- result = gnome_vfs_get_file_info_uri(uri, &info, GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
- return FALSE;
- }
+ if (info == NULL)
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_input_stream_close (G_INPUT_STREAM(read_handle), NULL, &error);
+ g_object_unref (read_handle);
+ g_object_unref (file);
+ return FALSE;
+ }
- *size = (gint) info.size;
- *buffer = (gchar *) g_malloc(*size);
- result = gnome_vfs_read(read_handle, *buffer, *size, &bytes_read);
+ // XXX PRLW: cases info > max(size) as max(size) < max(uint64),
+ // and bytes_read < size aren't handled.
+ *size = g_file_info_get_attribute_uint64(info,G_FILE_ATTRIBUTE_STANDARD_SIZE);
+ *buffer = (gchar *) g_malloc (*size);
+ bytes_read = g_input_stream_read (G_INPUT_STREAM(read_handle), *buffer,
+ *size, NULL, &error);
+
+ if (bytes_read == -1)
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_input_stream_close (G_INPUT_STREAM(read_handle), NULL, &error);
+ g_object_unref (read_handle);
+ g_object_unref (info);
+ g_object_unref (file);
+ return FALSE;
+ }
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
- return FALSE;
- }
- gnome_vfs_close(read_handle);
- g_free(uri);
+ g_input_stream_close (G_INPUT_STREAM(read_handle), NULL, NULL);
+ g_object_unref (read_handle);
+ g_object_unref (info);
+ g_object_unref (file);
return TRUE;
}
-static gboolean
-dasher_editor_internal_gnome_vfs_save_file(DasherEditor *pSelf, const char *myfilename, gchar *buffer, unsigned long long length, bool append) {
- GnomeVFSHandle *write_handle;
- GnomeVFSResult result;
- GnomeVFSFileSize bytes_written;
- GnomeVFSURI *uri;
-
- uri = gnome_vfs_uri_new(myfilename);
-
- if(uri == NULL) { // It's not a URI we can cope with - assume it's a filename
- char *tmpfilename = gnome_vfs_get_uri_from_local_path(myfilename);
- // TODO: figure out what this is supposed to do and reimplement
- // if(myfilename != filename) {
-// g_free((void *)myfilename);
-// }
- myfilename = tmpfilename;
- uri = gnome_vfs_uri_new(myfilename);
- if(uri == NULL) {
- return FALSE;
- }
- }
+static GFileOutputStream *append_or_replace_file(GFile *file, bool append, GError **error)
+{
+ GFileOutputStream *write_handle;
+ if (append)
+ write_handle = g_file_append_to (file, G_FILE_CREATE_NONE, NULL, error);
+ else
+ write_handle = g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE,
+ NULL, error);
- result = gnome_vfs_create_uri(&write_handle, uri, GnomeVFSOpenMode(GNOME_VFS_OPEN_WRITE | GNOME_VFS_OPEN_RANDOM), TRUE, 0666);
+ return write_handle;
+}
- if(result == GNOME_VFS_ERROR_FILE_EXISTS) {
- if(append) {
- result = gnome_vfs_open_uri(&write_handle, uri, GnomeVFSOpenMode(GNOME_VFS_OPEN_WRITE | GNOME_VFS_OPEN_RANDOM));
+static gboolean
+dasher_editor_internal_gvfs_save_file(DasherEditor *pSelf, const char *uri, gchar *buffer, gsize length, bool append)
+{
+ GFile *file;
+ GFileOutputStream *write_handle;
+ GError *error;
+ gssize bytes_written;
+
+ file = g_file_new_for_uri (uri);
+
+ write_handle = append_or_replace_file (file, append, &error);
+
+ /* If URI didn't work, try path */
+ if (write_handle == NULL)
+ {
+ g_object_unref (file);
+ file = g_file_new_for_path (uri);
+ write_handle = append_or_replace_file (file, append, &error);
}
- else {
- result = gnome_vfs_create_uri(&write_handle, uri, GnomeVFSOpenMode(GNOME_VFS_OPEN_WRITE | GNOME_VFS_OPEN_RANDOM), FALSE, 0666);
+
+ if (write_handle == NULL)
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_object_unref (file);
+ return FALSE;
}
- }
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
- return FALSE;
- }
+ if (append)
+ {
+ if (!g_seekable_seek(G_SEEKABLE(write_handle),0,G_SEEK_END, NULL, &error))
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_object_unref (write_handle);
+ g_object_unref (file);
+ return FALSE;
+ }
+ }
- if(append) {
- result = gnome_vfs_seek(write_handle, GNOME_VFS_SEEK_END, 0);
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
+ bytes_written = g_output_stream_write (G_OUTPUT_STREAM(write_handle), buffer,
+ length, NULL, &error);
+ // XXX PRLW: case bytes_written < length not handled.
+ if (bytes_written == -1)
+ {
+ dasher_editor_internal_gvfs_print_error (pSelf, error, uri);
+ g_output_stream_close (G_OUTPUT_STREAM(write_handle), NULL, NULL);
+ g_object_unref (write_handle);
+ g_object_unref (file);
return FALSE;
}
- }
- result = gnome_vfs_write(write_handle, buffer, length, &bytes_written);
- if(result != GNOME_VFS_OK) {
- dasher_editor_internal_vfs_print_error(pSelf, &result, myfilename);
- g_free(uri);
- return FALSE;
- }
-
- gnome_vfs_close(write_handle);
- g_free(uri);
+ g_output_stream_close (G_OUTPUT_STREAM(write_handle), NULL, NULL);
+ g_object_unref (write_handle);
+ g_object_unref (file);
return TRUE;
}
-#else
+
+#else /* not HAVE_GIO */
static gboolean
-dasher_editor_internal_unix_vfs_open_file(DasherEditor *pSelf, const char *myfilename, gchar **buffer, unsigned long long *size) {
+dasher_editor_internal_unix_vfs_open_file(DasherEditor *pSelf, const char *myfilename, gchar **buffer, gsize *size) {
GtkWidget *error_dialog;
struct stat file_stat;
@@ -1543,7 +1565,7 @@
return FALSE;
}
- *size = file_stat.st_size;
+ *size = file_stat.st_size; // PRLW: is off_t = uint64_t, size is size_t, MD
*buffer = (gchar *) g_malloc(*size);
fread(*buffer, *size, 1, fp);
fclose(fp);
@@ -1551,7 +1573,7 @@
}
static gboolean
-dasher_editor_internal_unix_vfs_save_file(DasherEditor *pSelf, const char *myfilename, gchar *buffer, unsigned long long length, bool append) {
+dasher_editor_internal_unix_vfs_save_file(DasherEditor *pSelf, const char *myfilename, gchar *buffer, gsize length, bool append) {
int opened = 1;
GtkWidget *error_dialog;
Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in (original)
+++ trunk/configure.in Sat Dec 20 16:29:55 2008
@@ -30,7 +30,7 @@
WITHGTK2=true;
-PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.4, have_glib=true, have_glib=false)
+PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.4)
AC_CHECK_LIB(expat, XML_Parse,, AC_MSG_ERROR([Expat library not found.]))
@@ -52,6 +52,19 @@
fi,
WITHGNOME=true)
+dnl Just useful for debugging
+AC_ARG_WITH([gvfs],
+ AC_HELP_STRING([--with-gvfs],
+ [build with gvfs from gio in glib (default is YES)]),
+ [],
+ with_gvfs="yes")
+if test $with_gvfs != "no"; then
+ PKG_CHECK_MODULES(GIO, gio-2.0,
+ [have_gio=true
+ AC_DEFINE(HAVE_GIO, 1, [gio exists so use gvfs])],
+ [have_gio=false])
+fi
+
AC_ARG_ENABLE([speech],
AC_HELP_STRING([--enable-speech],[build with speech support (default is NO)]),
if test $enableval = "no"; then
@@ -235,8 +248,8 @@
fi
if [[ x"$WITHGNOME" = xtrue ]]; then
- PKG_CHECK_MODULES(gnome, libgnome-2.0 libgnomeui-2.0 gnome-vfs-2.0)
- AC_DEFINE([GNOME_LIBS], 1, [libgnome-2, libgnomeui-2, and gnome-vfs-2 are present])
+ PKG_CHECK_MODULES(gnome, libgnome-2.0 libgnomeui-2.0 )
+ AC_DEFINE([GNOME_LIBS], 1, [libgnome-2 and libgnomeui-2 are present])
fi
if [[ x"$WITHSPEECH" = xtrue ]]; then
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]