1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#![deny(bare_trait_objects)]

extern crate gio_sys as gio_ffi;
extern crate glib_sys as glib_ffi;
extern crate gobject_sys as gobject_ffi;
extern crate gtk_sys as gtk_ffi;
extern crate libc;

use gio_ffi::{GFile, GFileType, GMount};
use glib_ffi::{GList, GType, gboolean, gpointer};
use gobject_ffi::{GClosure, GTypeInterface};
use gtk_ffi::GtkWidget;
use libc::c_char;

#[repr(C)]
pub struct NautilusFileInfo {
    g_iface: GTypeInterface,
    is_gone: Option<extern fn(*mut NautilusFileInfo) -> gboolean>,
    get_name: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    get_uri: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    get_parent_uri: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    get_uri_scheme: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    get_mime_type: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    is_mime_type: Option<extern fn(*mut NautilusFileInfo) -> gboolean>,
    is_directory: Option<extern fn(*mut NautilusFileInfo) -> gboolean>,
    add_emblem: Option<extern fn(*mut NautilusFileInfo)>,
    get_string_attribute: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    add_string_attribute: Option<extern fn(*mut NautilusFileInfo)>,
    invalidate_extension_info: Option<extern fn(*mut NautilusFileInfo)>,
    get_activation_uri: Option<extern fn(*mut NautilusFileInfo) -> *mut c_char>,
    get_file_type: Option<extern fn(*mut NautilusFileInfo) -> GFileType>,
    get_location: Option<extern fn(*mut NautilusFileInfo) -> *mut GFile>,
    get_parent_location: Option<extern fn(*mut NautilusFileInfo) -> *mut GFile>,
    get_parent_info: Option<extern fn(*mut NautilusFileInfo) -> *mut NautilusFileInfo>,
    get_mount: Option<extern fn(*mut NautilusFileInfo) -> *mut GMount>,
    can_write: Option<extern fn(*mut NautilusFileInfo) -> gboolean>,
}

#[repr(C)]
pub struct NautilusColumnProviderIface {
    g_iface: GTypeInterface,
    pub get_columns: Option<extern fn(gpointer) -> *mut GList>
}

#[repr(C)]
pub struct NautilusInfoProviderIface {
    g_iface: GTypeInterface,
    pub update_file_info: Option<unsafe extern fn(*mut NautilusInfoProvider, *mut NautilusFileInfo, *mut GClosure, *mut *mut NautilusOperationHandle) -> NautilusOperationResult>,
    pub cancel_update: Option<unsafe extern fn(*mut NautilusInfoProvider, *mut NautilusOperationHandle)>
}

#[repr(C)]
pub struct NautilusLocationWidgetProviderIface {
    g_iface: GTypeInterface,
    get_widget: Option<extern fn(*mut NautilusLocationWidgetProvider, *const c_char, *mut GtkWidget) -> *mut GtkWidget>
}

#[repr(C)]
pub struct NautilusMenuProviderIface {
    g_iface: GTypeInterface,
    pub get_file_items: Option<extern fn(gpointer, *mut GtkWidget, *mut GList) -> *mut GList>,
    pub get_background_items: Option<extern fn(gpointer, *mut GtkWidget, *mut NautilusFileInfo) -> *mut GList>,
}

#[repr(C)]
pub struct NautilusPropertyPageProviderIface {
    g_iface: GTypeInterface,
    pub get_pages: Option<extern fn(*mut NautilusPropertyPageProvider, *mut GList) -> *mut GList>
}

pub enum NautilusColumn {}
pub enum NautilusInfoProvider {}
pub enum NautilusLocationWidgetProvider {}
pub enum NautilusMenu {}
pub enum NautilusMenuItem {}
pub enum NautilusOperationHandle {}
pub enum NautilusPropertyPage {}
pub enum NautilusPropertyPageProvider {}

#[link(name = "nautilus-extension")]
extern {
    pub fn nautilus_column_new(name: *const c_char, attribute: *const c_char, label: *const c_char, description: *const c_char) -> *mut NautilusColumn;
    pub fn nautilus_column_provider_get_type() -> GType;
    pub fn nautilus_file_info_add_string_attribute(file: *mut NautilusFileInfo, attribute_name: *const c_char, value: *const c_char);
    pub fn nautilus_file_info_get_uri(file_info: *mut NautilusFileInfo) -> *mut c_char;
    pub fn nautilus_file_info_get_uri_scheme(file_info: *mut NautilusFileInfo) -> *mut c_char;
    pub fn nautilus_file_info_invalidate_extension_info(file: *mut NautilusFileInfo);
    pub fn nautilus_file_info_list_copy(files: *mut GList) -> *mut GList;
    pub fn nautilus_info_provider_get_type() -> GType;
    pub fn nautilus_info_provider_update_complete_invoke(update_complete: *mut GClosure,
                                                         provider: *mut NautilusInfoProvider,
                                                         handle: *mut NautilusOperationHandle,
                                                         result: NautilusOperationResult);
    pub fn nautilus_menu_append_item(menu: *mut NautilusMenu, item: *mut NautilusMenuItem);
    pub fn nautilus_menu_item_new(name: *const c_char, label: *const c_char, tip: *const c_char, icon: *const c_char) -> *mut NautilusMenuItem;
    pub fn nautilus_menu_item_set_submenu(item: *mut NautilusMenuItem, menu: *mut NautilusMenu);
    pub fn nautilus_menu_new() -> *mut NautilusMenu;
    pub fn nautilus_menu_provider_get_type() -> GType;
    pub fn nautilus_property_page_new(name: *const c_char, label: *mut GtkWidget, page: *mut GtkWidget) -> *mut NautilusPropertyPage;
    pub fn nautilus_property_page_provider_get_type() -> GType;
}

#[repr(C)]
pub enum NautilusOperationResult {
    NautilusOperationComplete,
    NautilusOperationFailed,
    NautilusOperationInProgress,
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}