#define mkdir(p,m) _mkdir(p)
#include <gdk/win32/gdkwin32.h> /* gdk_win32_hdc_get */
#else
-#error "The implementation is win32 only yet."
+#error "The implementation is win32 only."
#endif /* G_OS_WIN32 */
typedef struct _GtkFileSystemWin32Class GtkFileSystemWin32Class;
struct _GtkFileSystemWin32
{
GObject parent_instance;
+
+ GHashTable *folder_hash;
};
#define GTK_TYPE_FILE_FOLDER_WIN32 (gtk_file_folder_win32_get_type ())
{
GObject parent_instance;
+ GtkFileSystemWin32 *system_win32;
GtkFileInfoType types;
gchar *filename;
};
static void
gtk_file_system_win32_init (GtkFileSystemWin32 *system_win32)
{
+ system_win32->folder_hash = g_hash_table_new (g_str_hash, g_str_equal);
}
static void
gtk_file_system_win32_finalize (GObject *object)
{
+ GtkFileSystemWin32 *system_win32;
+
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (object);
+
+ /* FIXME: assert that the hash is empty? */
+ g_hash_table_destroy (system_win32->folder_hash);
+
system_parent_class->finalize (object);
}
static GSList *
gtk_file_system_win32_list_volumes (GtkFileSystem *file_system)
{
- gchar drives[26*4];
- guint len;
- gchar *p;
+ DWORD drives;
+ gchar drive[4] = "A:\\";
GSList *list = NULL;
- len = GetLogicalDriveStrings(sizeof(drives), drives);
+ drives = GetLogicalDrives();
- if (len < 3)
- g_warning("No drive strings available!");
+ if (!drives)
+ g_warning ("GetLogicalDrives failed.");
- p = drives;
- while ((len = strlen(p)) != 0)
+ while (drives && drive[0] <= 'Z')
{
- GtkFileSystemVolume *vol = g_new0 (GtkFileSystemVolume, 1);
- if (p[0] == 'a' || p[0] == 'b')
- vol->is_mounted = FALSE; /* skip floppy */
- else
- vol->is_mounted = TRUE;
-
- /*FIXME: gtk_file_path_compare() is case sensitive, we are not*/
- p[0] = toupper (p[0]);
- vol->drive = g_strdup (p);
-
- list = g_slist_append (list, vol);
-
- p += len + 1;
+ if (drives & 1)
+ {
+ GtkFileSystemVolume *vol = g_new0 (GtkFileSystemVolume, 1);
+ if (drive[0] == 'A' || drive[0] == 'B')
+ vol->is_mounted = FALSE; /* skip floppy */
+ else
+ vol->is_mounted = TRUE; /* handle other removable drives special, too? */
+
+ vol->drive = g_strdup (drive);
+ list = g_slist_append (list, vol);
+ }
+ drives >>= 1;
+ drive[0]++;
}
return list;
}
g_return_val_if_fail (p != NULL, NULL);
/*FIXME: gtk_file_path_compare() is case sensitive, we are not*/
- p[0] = toupper (p[0]);
+ p[0] = g_ascii_toupper (p[0]);
vol->drive = p;
- vol->is_mounted = (p[0] != 'a' && p[0] != 'b');
+ vol->is_mounted = (p[0] != 'A' && p[0] != 'B');
return vol;
}
GtkFileInfoType types,
GError **error)
{
+ GtkFileSystemWin32 *system_win32;
GtkFileFolderWin32 *folder_win32;
gchar *filename;
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (file_system);
+
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, NULL);
+ folder_win32 = g_hash_table_lookup (system_win32->folder_hash, filename);
+
+ if (folder_win32)
+ return g_object_ref (folder_win32);
+
+ if (!g_file_test (filename, G_FILE_TEST_IS_DIR))
+ {
+ int save_errno = errno;
+ gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
+
+ /* If g_file_test() returned FALSE but not due to an error, it means
+ * that the filename is not a directory.
+ */
+ if (save_errno == 0)
+ /* ENOTDIR */
+ g_set_error (error,
+ GTK_FILE_SYSTEM_ERROR,
+ GTK_FILE_SYSTEM_ERROR_NOT_FOLDER,
+ _("%s: %s"),
+ filename_utf8 ? filename_utf8 : "???",
+ g_strerror (ENOTDIR));
+ else
+ g_set_error (error,
+ GTK_FILE_SYSTEM_ERROR,
+ GTK_FILE_SYSTEM_ERROR_NONEXISTENT,
+ _("error getting information for '%s': %s"),
+ filename_utf8 ? filename_utf8 : "???",
+ g_strerror (save_errno));
+
+ g_free (filename_utf8);
+ return NULL;
+ }
+
folder_win32 = g_object_new (GTK_TYPE_FILE_FOLDER_WIN32, NULL);
+ folder_win32->system_win32 = system_win32;
folder_win32->filename = filename;
folder_win32->types = types;
+ g_hash_table_insert (system_win32->folder_hash, folder_win32->filename, folder_win32);
+
return GTK_FILE_FOLDER (folder_win32);
}
const GtkFilePath *path,
GError **error)
{
+ GtkFileSystemWin32 *system_win32;
gchar *filename;
gboolean result;
+ char *parent;
+
+ system_win32 = GTK_FILE_SYSTEM_WIN32 (file_system);
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, FALSE);
-
- result = mkdir (filename, 0777) != 0;
-
+
+ result = mkdir (filename, 0777) == 0;
+
if (!result)
{
gchar *filename_utf8 = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
g_strerror (errno));
g_free (filename_utf8);
}
-
+ else if (!filename_is_root (filename))
+ {
+ parent = g_path_get_dirname (filename);
+ if (parent)
+ {
+ GtkFileFolderWin32 *folder_win32;
+
+ folder_win32 = g_hash_table_lookup (system_win32->folder_hash, parent);
+ if (folder_win32)
+ {
+ GSList *paths;
+
+ paths = g_slist_append (NULL, (GtkFilePath *) path);
+ g_signal_emit_by_name (folder_win32, "files-added", paths);
+ g_slist_free (paths);
+ }
+ g_free(parent);
+ }
+ }
+
g_free (filename);
-
+
return result;
}
gtk_file_system_win32_volume_get_base_path (GtkFileSystem *file_system,
GtkFileSystemVolume *volume)
{
- return (GtkFilePath *) g_strndup (volume->drive, 2);
+ return (GtkFilePath *) g_strdup (volume->drive);
}
static gboolean
gtk_file_system_win32_volume_get_display_name (GtkFileSystem *file_system,
GtkFileSystemVolume *volume)
{
- gchar display_name[80];
+ gchar *real_display_name;
+ gunichar2 *wdrive = g_utf8_to_utf16 (volume->drive, -1, NULL, NULL, NULL);
+ gunichar2 wname[80];
+
+ g_return_val_if_fail (wdrive != NULL, NULL);
- if (GetVolumeInformation (volume->drive,
- display_name, sizeof(display_name),
+ if (GetVolumeInformationW (wdrive,
+ wname, G_N_ELEMENTS(wname),
NULL, /* serial number */
NULL, /* max. component length */
NULL, /* fs flags */
- NULL, 0)) /* fs type like FAT, NTFS */
+ NULL, 0) /* fs type like FAT, NTFS */
+ && wname[0])
{
- gchar* real_display_name = g_strconcat (display_name, " (", volume->drive, ")", NULL);
-
- return real_display_name;
+ gchar *name = g_utf16_to_utf8 (wname, -1, NULL, NULL, NULL);
+ real_display_name = g_strconcat (name, " (", volume->drive, ")", NULL);
+ g_free (name);
}
else
- return g_strdup (volume->drive);
+ real_display_name = g_strdup (volume->drive);
+
+ g_free (wdrive);
+
+ return real_display_name;
}
static GdkPixbuf *
}
if (ok && (f = fopen (filename, "wb")) != NULL)
{
+ entry = g_slist_find_custom (list, uri, (GCompareFunc) strcmp);
if (add)
{
/* g_slist_insert() and our insert semantics are
* positon > length ?
*
*/
- if (!g_slist_find_custom (list, uri, (GCompareFunc) strcmp))
+ if (!entry)
list = g_slist_insert (list, g_strdup (uri), position);
else
{
ok = FALSE;
}
}
- for (entry = list; entry != NULL; entry = entry->next)
+ else
{
- gchar *line = entry->data;
-
- /* to remove the given uri */
- if (!add && strcmp (line, uri) != 0)
- {
- fputs (line, f);
+ /* to remove the given uri */
+ if (entry)
+ list = g_slist_delete_link(list, entry);
+ for (entry = list; entry != NULL; entry = entry->next)
+ {
+ fputs (entry->data, f);
fputs ("\n", f);
}
}
{
GtkFileFolderWin32 *folder_win32 = GTK_FILE_FOLDER_WIN32 (object);
+ g_hash_table_remove (folder_win32->system_win32->folder_hash, folder_win32->filename);
+
g_free (folder_win32->filename);
folder_parent_class->finalize (object);
gchar *dirname;
gchar *filename;
+ if (!path)
+ {
+ g_return_val_if_fail (filename_is_root (folder_win32->filename), NULL);
+
+ /* ??? */
+ info = filename_get_info (folder_win32->filename, folder_win32->types, error);
+
+ return info;
+ }
+
filename = filename_from_path (path);
g_return_val_if_fail (filename != NULL, NULL);
/* accept both forms */
- return ( (len == 2 && filename[1] == ':')
- || (len == 3 && filename[1] == ':' && filename[2] == '\\'));
+ return (len == 3 && filename[1] == ':' && (filename[2] == '\\' || filename[2] == '/'));
}