[gtk/docs-gtk-org] gio: Add the Overview
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/docs-gtk-org] gio: Add the Overview
- Date: Thu, 25 Nov 2021 13:51:32 +0000 (UTC)
commit 054e65be4c7d89450f77694faf5c103a7d129535
Author: Emmanuele Bassi <ebassi gnome org>
Date: Thu Nov 25 13:51:18 2021 +0000
gio: Add the Overview
glib/gio/gio.toml.in | 2 +
glib/gio/meson.build | 3 +-
glib/gio/overview.md | 385 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 389 insertions(+), 1 deletion(-)
---
diff --git a/glib/gio/gio.toml.in b/glib/gio/gio.toml.in
index 2310aab2e1..5b925af61f 100644
--- a/glib/gio/gio.toml.in
+++ b/glib/gio/gio.toml.in
@@ -36,6 +36,8 @@ show_class_hierarchy = true
urlmap_file = "urlmap.js"
# The same order will be used when generating the index
content_files = [
+ "overview.md",
+
"migrating-gdbus.md",
"migrating-gconf.md",
"migrating-gnome-vfs.md",
diff --git a/glib/gio/meson.build b/glib/gio/meson.build
index ce9a2b1f51..b254089a9c 100644
--- a/glib/gio/meson.build
+++ b/glib/gio/meson.build
@@ -1,7 +1,8 @@
expand_content_files = [
- 'migrating-gdbus.md',
'migrating-gconf.md',
+ 'migrating-gdbus.md',
'migrating-gnome-vfs.md',
+ 'overview.md',
]
gio_gir = meson.current_source_dir() / 'Gio-2.0.gir'
diff --git a/glib/gio/overview.md b/glib/gio/overview.md
new file mode 100644
index 0000000000..d3523661e6
--- /dev/null
+++ b/glib/gio/overview.md
@@ -0,0 +1,385 @@
+Title: Overview
+
+# Overview
+
+GIO is striving to provide a modern, easy-to-use VFS API that sits at the
+right level in the library stack, as well as other generally useful APIs
+for desktop applications (such as networking and D-Bus support). The goal
+is to overcome the shortcomings of GnomeVFS and provide an API that is so
+good that developers prefer it over raw POSIX calls. Among other things
+that means using GObject. It also means not cloning the POSIX API, but
+providing higher-level, document-centric interfaces.
+
+The abstract file system model of GIO consists of a number of interfaces and
+base classes for I/O and files:
+
+[iface Gio File]
+: reference to a file
+
+[class@Gio.FileInfo]
+: information about a file or filesystem
+
+[class@Gio.FileEnumerator]
+: list files in directories
+
+[iface@Gio.Drive]
+: represents a drive
+
+[iface@Gio.Volume]
+: represents a file system in an abstract way
+
+[iface@Gio.Mount]
+: represents a mounted file system
+
+Then there is a number of stream classes, similar to the input and output
+stream hierarchies that can be found in frameworks like Java:
+
+[class@Gio.InputStream]
+: read data
+
+[class@Gio.OutputStream]
+: write data
+
+[class@Gio.IOStream]
+: read and write data
+
+[iface@Gio.Seekable]
+: interface optionally implemented by streams to support seeking
+
+There are interfaces related to applications and the types of files they
+handle:
+
+[iface@Gio.AppInfo]
+: information about an installed application
+
+[iface Gio Icon]
+: abstract type for file and application icons
+
+There is a framework for storing and retrieving application settings:
+
+[class@Gio.Settings]
+: stores and retrieves application settings
+
+There is support for network programming, including connectivity monitoring,
+name resolution, lowlevel socket APIs and highlevel client and server helper
+classes:
+
+[class@Gio.Socket]
+: lowlevel platform independent socket object
+
+[class@Gio.Resolver]
+: asynchronous and cancellable DNS resolver
+
+[class@Gio.SocketClient]
+: high-level network client helper
+
+[class@Gio.SocketService]
+: high-level network server helper
+
+[class@Gio.SocketConnection]
+: network connection stream
+
+[iface@Gio.NetworkMonitor]
+: network connectivity monitoring
+
+There is support for connecting to D-Bus, sending and receiving messages,
+owning and watching bus names, and making objects available on the bus:
+
+[class@Gio.DBusConnection]
+: a D-Bus connection
+
+[class@Gio.DBusMethodInvocation]
+: for handling remote calls
+
+[class@Gio.DBusServer]
+: helper for accepting connections
+
+[class@Gio.DBusProxy]
+: proxy to access D-Bus interfaces on a remote object
+
+Beyond these, GIO provides facilities for file monitoring, asynchronous I/O
+and filename completion. In addition to the interfaces, GIO provides
+implementations for the local case. Implementations for various network file
+systems are provided by the GVFS package as loadable modules.
+
+Other design choices which consciously break with the GnomeVFS design are to
+move backends out-of-process, which minimizes the dependency bloat and makes
+the whole system more robust. The backends are not included in GIO, but in
+the separate GVFS package. The GVFS package also contains the GVFS daemon,
+which spawn further mount daemons for each individual connection.
+
+[![GIO in the GTK library stack](./gvfs-overview.png)]
+
+The GIO model of I/O is stateful: if an application establishes e.g. a SFTP
+connection to a server, it becomes available to all applications in the
+session; the user does not have to enter his password over and over again.
+
+One of the big advantages of putting the VFS in the GLib layer is that GTK
+can directly use it, e.g. in the filechooser.
+
+## Writing GIO applications
+
+The information in the GLib documentation about writing GLib applications is
+generally applicable when writing GIO applications.
+
+### Threads
+
+GDBus has its own private worker thread, so applications using GDBus have at
+least 3 threads. GIO makes heavy use of the concept of a thread-default main
+context to execute callbacks of asynchronous methods in the same context in
+which the operation was started.
+
+### Asynchronous Programming
+
+Many GIO functions come in two versions: synchronous and asynchronous,
+denoted by an `_async` suffix. It is important to use these appropriately:
+synchronous calls should not be used from within a main loop which is shared
+with other code, such as one in the application’s main thread. Synchronous
+calls block until they complete, and I/O operations can take noticeable
+amounts of time (even on ‘fast’ SSDs). Blocking a main loop iteration while
+waiting for I/O means that other sources in the main loop will not be
+dispatched, such as input and redraw handlers for the application’s UI. This
+can cause the application to ‘freeze’ until I/O completes.
+
+A few self-contained groups of functions, such as code generated by
+gdbus-codegen, use a different convention: functions are asynchronous
+default, and it is the synchronous version which has a `_sync` suffix. Aside
+from naming differences, they should be treated the same way as functions
+following the normal convention above.
+
+The asynchronous (`_async`) versions of functions return control to the
+caller immediately, after scheduling the I/O in the kernel and adding a
+callback for it to the main loop. This callback will be invoked when the
+operation has completed. From the callback, the paired `_finish` function
+should be called to retrieve the return value of the I/O operation, and any
+errors which occurred. For more information on using and implementing
+asynchronous functions, see [iface@Gio.AsyncResult] and [class Gio Task].
+
+By starting multiple asynchronous operations in succession, they will be
+executed in parallel (up to an arbitrary limit imposed by GIO’s internal
+worker thread pool).
+
+The synchronous versions of functions can be used early in application
+startup when there is no main loop to block, for example to load initial
+configuration files. They can also be used for I/O on files which are
+guaranteed to be small and on the local disk. Note that the user’s home
+directory is not guaranteed to be on the local disk. Security
+
+When your program needs to carry out some privileged operation (say, create
+a new user account), there are various ways in which you can go about this:
+
+- Implement a daemon that offers the privileged operation. A convenient way
+ to do this is as a D-Bus system-bus service. The daemon will probably need
+ ways to check the identity and authorization of the caller before
+ executing the operation. polkit is a framework that allows this.
+- Use a small helper that is executed with elevated privileges via pkexec.
+ pkexec is a small program launcher that is part of polkit.
+- Use a small helper that is executed with elevated privileges by being suid
+ root.
+
+None of these approaches is the clear winner, they all have their advantages
+and disadvantages.
+
+When writing code that runs with elevated privileges, it is important to
+follow some basic rules of secure programming. David Wheeler has an
+excellent book on this topic, Secure Programming for Linux and Unix HOWTO.
+
+When using GIO in code that runs with elevated privileges, you have to be
+careful. GIO has extension points whose implementations get loaded from
+modules (executable code in shared objects), which could allow an attacker
+to sneak his own code into your application by tricking it into loading the
+code as a module. However, GIO will never load modules from your home
+directory except when explicitly asked to do so via an environment variable.
+
+In most cases, your helper program should be so small that you don't need
+GIO, whose APIs are largely designed to support full-blown desktop
+applications. If you can't resist the convenience of these APIs, here are
+some steps you should take:
+
+- Clear the environment, e.g. using the `clearenv()` function. David Wheeler
+ has a good explanation for why it is important to sanitize the
+ environment. See the section on running GIO applications for a list of all
+ environment variables affecting GIO. In particular, `PATH` (used to locate
+ binaries), `GIO_EXTRA_MODULES` (used to locate loadable modules) and
+ `DBUS_{SYSTEM,SESSION}_BUS_ADDRESS` (used to locate the D-Bus system and
+ session bus) are important.
+- Don't use GVfs, by setting `GIO_USE_VFS=local` in the environment. The
+ reason to avoid GVfs in security-sensitive programs is that it uses many
+ libraries which have not necessarily been audited for security problems.
+ Gvfs is also heavily distributed and relies on a session bus to be
+ present.
+
+## Compiling GIO applications
+
+GIO comes with a `gio-2.0.pc` file that you should use together with
+pkg-config to obtain the necessary information about header files and
+libraries. See the pkg-config man page or the GLib documentation for more
+information on how to use pkg-config to compile your application.
+
+If you are using GIO on UNIX-like systems, you may want to use UNIX-specific
+GIO interfaces such as `GUnixInputStream`, `GUnixOutputStream`, `GUnixMount`
+or `GDesktopAppInfo`. To do so, use the `gio-unix-2.0.pc` file instead of
+`gio-2.0.pc`.
+
+## Running GIO applications
+
+GIO inspects a few environment variables in addition to the ones used by GLib.
+
+- `XDG_DATA_HOME`, `XDG_DATA_DIRS`. GIO uses these environment variables to
+ locate MIME information. For more information, see the Shared MIME-info
+ Database and the Base Directory Specification.
+- `GVFS_DISABLE_FUSE`. This variable can be set to keep Gvfs from starting
+ the fuse backend, which may be unwanted or unnecessary in certain
+ situations.
+- `GIO_USE_VFS`. This environment variable can be set to the name of a GVfs
+ implementation to override the default for debugging purposes. The GVfs
+ implementation for local files that is included in GIO has the name
+ "local", the implementation in the gvfs module has the name "gvfs". Most
+ commonly, system software will set this to "local" to avoid having `GFile`
+ APIs perform unnecessary D-Bus calls. The special value help can be used
+ to print a list of available implementations to standard output.
+
+The following environment variables are only useful for debugging GIO itself
+or modules that it loads. They should not be set in a production
+environment.
+
+- `GIO_USE_FILE_MONITOR`. This variable can be set to the name of a
+ GFileMonitor implementation to override the default for debugging
+ purposes. The GFileMonitor implementation for local files that is included
+ in GIO on Linux has the name "inotify", others that are built are built as
+ modules (depending on the platform) are called "fam" and "fen". The
+ special value help can be used to print a list of available
+ implementations to standard output.
+- `GIO_USE_VOLUME_MONITOR`. This variable can be set to the name of a
+ GVolumeMonitor implementation to override the default for debugging
+ purposes. The GVolumeMonitor implementation for local files that is
+ included in GIO has the name "unix", the udisks2-based implementation in
+ the gvfs module has the name "udisks2". The special value help can be used
+ to print a list of available implementations to standard output.
+- `GIO_USE_TLS`. This variable can be set to the name of a GTlsBackend
+ implementation to override the default for debugging purposes. GIO does
+ not include a GTlsBackend implementation, the gnutls-based implementation
+ in the glib-networking module has the name "gnutls". The special value
+ help can be used to print a list of available implementations to standard
+ output.
+- `GIO_MODULE_DIR`. When this environment variable is set to a path, GIO
+ will load modules from this alternate directory instead of the directory
+ built into GIO. This is useful when running tests, for example. This
+ environment variable is ignored when running in a setuid program.
+- `GIO_EXTRA_MODULES`. When this environment variable is set to a path, or
+ a set of paths separated by a colon, GIO will attempt to load additional
+ modules from within the path. This environment variable is ignored when
+ running in a setuid program.
+- `GSETTINGS_BACKEND`. This variable can be set to the name of a
+ GSettingsBackend implementation to override the default for debugging
+ purposes. The memory-based implementation that is included in GIO has the
+ name "memory", the one in dconf has the name "dconf". The special value
+ help can be used to print a list of available implementations to standard
+ output.
+- `GSETTINGS_SCHEMA_DIR`. This variable can be set to the names of
+ directories to consider when looking for compiled schemas for GSettings,
+ in addition to the `glib-2.0/schemas` subdirectories of the XDG system
+ data dirs. To specify multiple directories, use `G_SEARCHPATH_SEPARATOR_S`
+ as a separator.
+- `DBUS_SYSTEM_BUS_ADDRESS`. This variable is consulted to find the address
+ of the D-Bus system bus. For the format of D-Bus addresses, see the D-Bus
+ specification. Setting this variable overrides platform-specific ways of
+ determining the system bus address.
+- `DBUS_SESSION_BUS_ADDRESS`. This variable is consulted to find the
+ address of the D-Bus session bus. Setting this variable overrides
+ platform-specific ways of determining the session bus address.
+- `DBUS_STARTER_BUS_TYPE`. This variable is consulted to find out the
+ 'starter' bus for an application that has been started via D-Bus
+ activation. The possible values are 'system' or 'session'.
+- `G_DBUS_DEBUG`. This variable can be set to a list of debug options,
+ which cause GLib to print out different types of debugging information
+ when using the D-Bus routines.
+ - `transport`: Show IO activity (e.g. reads and writes)
+ - `message`: Show all sent and received D-Bus messages
+ - `payload`: Show payload for all sent and received D-Bus messages (implies
+ message)
+ - `call`: Trace `g_dbus_connection_call()` and
+ `g_dbus_connection_call_sync()` API usage
+ - `signal`: Show when a D-Bus signal is received
+ - `incoming`: Show when an incoming D-Bus method call is received
+ - `return`: Show when a reply is returned via the GDBusMethodInvocation API
+ - `emission`: Trace `g_dbus_connection_emit_signal()` API usage
+ - `authentication`: Show information about connection authentication
+ - `address`: Show information about D-Bus address lookups and autolaunching
+ - `all`: Turn on all debug options
+ - `help`: Print a list of supported options to the standard output
+- `G_DBUS_COOKIE_SHA1_KEYRING_DIR`. Can be used to override the directory
+ used to store the keyring used in the `DBUS_COOKIE_SHA1` authentication
+ mechanism. Normally the directory used is `.dbus-keyrings` in the user's
+ home directory.
+- `G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION`. If set, the
+ permissions of the directory used to store the keyring used in the
+ `DBUS_COOKIE_SHA1` authentication mechanism won't be checked. Normally the
+ directory must be readable only by the user.
+
+## Extending GIO
+
+A lot of the functionality that is accessible through GIO is implemented in
+loadable modules, and modules provide a convenient way to extend GIO. In
+addition to the [`GIOModule`] API which supports writing such modules, GIO has a
+mechanism to define extension points, and register implementations thereof,
+see [`GIOExtensionPoint`].
+
+The following extension points are currently defined by GIO:
+
+- `G_VFS_EXTENSION_POINT_NAME`. Allows to override the functionality of the
+ GVfs class. Implementations of this extension point must be derived from
+ GVfs. GIO uses the implementation with the highest priority that is
+ active, see `g_vfs_is_active()`. GIO implements this extension point for
+ local files, gvfs contains an implementation that supports all the
+ backends in gvfs.
+- `G_VOLUME_MONITOR_EXTENSION_POINT_NAME`. Allows to add more volume
+ monitors. Implementations of this extension point must be derived from
+ GVolumeMonitor. GIO uses all registered extensions. gvfs contains an
+ implementation that works together with the GVfs implementation in gvfs.
+- `G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME`. Allows to override the
+ 'native' volume monitor. Implementations of this extension point must be
+ derived from GNativeVolumeMonitor. GIO uses the implementation with the
+ highest priority that is supported, as determined by the `is_supported()`
+ vfunc in GVolumeMonitorClass. GIO implements this extension point for
+ local mounts, gvfs contains a udisks2-based implementation.
+- `G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME`. Allows to override the file
+ monitor implementation for local files. Implementations of this extension
+ point must be derived from GLocalFileMonitor. GIO uses the implementation
+ with the highest priority that is supported, as determined by the
+ `is_supported()` vfunc in GLocalFileMonitorClass. GIO uses this extension
+ point internally, to switch between its fam-based and inotify-based file
+ monitoring implementations.
+- `G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME`. Allows to override the
+ directory monitor implementation for local files. Implementations of this
+ extension point must be derived from GLocalDirectoryMonitor. GIO uses the
+ implementation with the highest priority that is supported, as determined
+ by the `is_supported()` vfunc in GLocalDirectoryMonitorClass. GIO uses
+ this extension point internally, to switch between its fam-based and
+ inotify-based directory monitoring implementations.
+- `G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME`. Unix-only. Allows to
+ provide a way to associate default handlers with URI schemes.
+ Implementations of this extension point must implement the
+ GDesktopAppInfoLookup interface. GIO uses the implementation with the
+ highest priority. This extension point has been discontinued in GLib 2.28.
+ It is still available to keep API and ABI stability, but GIO is no longer
+ using it for default handlers. Instead, the mime handler mechanism is
+ used, together with x-scheme-handler pseudo-mimetypes.
+- `G_SETTINGS_BACKEND_EXTENSION_POINT_NAME`. Allows to provide an
+ alternative storage for GSettings. Implementations of this extension point
+ must derive from the GSettingsBackend type. GIO contains a keyfile-based
+ implementation of this extension point, another one is provided by dconf.
+- `G_PROXY_EXTENSION_POINT_NAME`. Allows to provide implementations for
+ network proxying. Implementations of this extension point must provide the
+ GProxy interface, and must be named after the network protocol they are
+ proxying. glib-networking contains an implementation of this extension
+ point based on libproxy.
+- `G_TLS_BACKEND_EXTENSION_POINT_NAME`. Allows to provide implementations
+ for TLS support. Implementations of this extension point must implement
+ the GTlsBackend interface. glib-networking contains an implementation of
+ this extension point.
+- `G_NETWORK_MONITOR_EXTENSION_POINT_NAME`. Allows to provide
+ implementations for network connectivity monitoring. Implementations of
+ this extension point must implement the GNetworkMonitorInterface
+ interface. GIO contains an implementation of this extension point that is
+ using the netlink interface of the Linux kernel.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]