+static gboolean
+gpx_write_string(GnomeVFSHandle *handle, const gchar *str)
+{
+ GnomeVFSResult vfs_result;
+ GnomeVFSFileSize size;
+ if(GNOME_VFS_OK != (vfs_result = gnome_vfs_write(
+ handle, str, strlen(str), &size)))
+ {
+ gchar buffer[BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer),
+ "%s:\n%s\n%s", _("Error while writing to file"),
+ _("File is incomplete."),
+ gnome_vfs_result_to_string(vfs_result));
+ popup_error(_window, buffer);
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static gboolean
+gpx_write_escaped(GnomeVFSHandle *handle, const gchar *str)
+{
+ const gchar *ptr = str;
+ const gchar *nullchr = ptr + strlen(ptr);
+ while(ptr < nullchr)
+ {
+ gchar *newptr = strpbrk(ptr, "&<>");
+ if(newptr != NULL)
+ {
+ /* First, write out what we have so far. */
+ const gchar *to_write;
+ GnomeVFSResult vfs_result;
+ GnomeVFSFileSize size;
+ if(GNOME_VFS_OK != (vfs_result = gnome_vfs_write(
+ handle, ptr, newptr - ptr, &size)))
+ {
+ gchar buffer[BUFFER_SIZE];
+ snprintf(buffer, sizeof(buffer),
+ "%s:\n%s\n%s", _("Error while writing to file"),
+ _("File is incomplete."),
+ gnome_vfs_result_to_string(vfs_result));
+ popup_error(_window, buffer);
+ return FALSE;
+ }
+
+ /* Now, write the XML entity. */
+ switch(*newptr)
+ {
+ case '&':
+ to_write = "&";
+ break;
+ case '<':
+ to_write = "<";
+ break;
+ case '>':
+ to_write = ">";
+ break;
+ }
+ gpx_write_string(handle, to_write);
+
+ /* Advance the pointer to continue searching for entities. */
+ ptr = newptr + 1;
+ }
+ else
+ {
+ /* No characters need escaping - write the whole thing. */
+ gpx_write_string(handle, ptr);
+ ptr = nullchr;
+ }
+ }
+ return TRUE;
+}
+