IOChannel
Object Hierarchy:
Description:
[ CCode ( ref_function = "g_io_channel_ref" , type_id = "G_TYPE_IO_CHANNEL" , unref_function = "g_io_channel_unref" ) ]
public class IOChannel
The `GIOChannel` data type aims to provide a portable method for using file descriptors, pipes, and sockets, and integrating them into the main event loop (see [struct@GLib.
MainContext]). Currently, full support is available on UNIX platforms; support for Windows is only partially complete.
To create a new `GIOChannel` on UNIX systems use [ctor@GLib.IOChannel.unix_new]. This works for plain file descriptors, pipes and sockets. Alternatively, a channel can be created for a file in a system independent manner using [ctor@GLib.IOChannel.new_file].
Once a `GIOChannel` has been created, it can be used in a generic manner with the functions [method@GLib.IOChannel.read_chars], [ method@GLib.IOChannel.write_chars], [method@GLib.IOChannel.seek_position], and [method@GLib.IOChannel.shutdown].
To add a `GIOChannel` to the main event loop, use [func@GLib.io_add_watch] or [func@GLib.io_add_watch_full]. Here you specify which events you are interested in on the `GIOChannel`, and provide a function to be called whenever these events occur.
`GIOChannel` instances are created with an initial reference count of 1. [method@GLib.IOChannel.ref] and [method@GLib.IOChannel.unref] can be used to increment or decrement the reference count respectively. When the reference count falls to 0, the `GIOChannel` is freed. (Though it isn’t closed automatically, unless it was created using [ctor@GLib.IOChannel.new_file].) Using [func@GLib.io_add_watch] or [ func@GLib.io_add_watch_full] increments a channel’s reference count.
The new functions [method@GLib.IOChannel.read_chars], [method@GLib.IOChannel.read_line], [method@GLib.IOChannel.read_line_string], [ method@GLib.IOChannel.read_to_end], [method@GLib.IOChannel.write_chars], [method@GLib.IOChannel.seek_position], and [method@GLib.IOChannel.flush ] should not be mixed with the deprecated functions [method@GLib.IOChannel.read], [method@GLib.IOChannel.write], and [method@GLib.IOChannel.seek ] on the same channel.
Example: Watch a file with IOChannel:
public static int main (string[] args) {
MainLoop loop = new MainLoop (null, false);
IOChannel channel = null;
try {
channel = new IOChannel.file ("my-io-channel-test-file.txt", "r");
} catch (FileError e) {
print ("FileError: %s\n", e.message);
return 0;
}
uint stat = channel.add_watch (IOCondition.IN, (source, condition) => {
size_t terminator_pos = -1;
string str_return = null;
size_t length = -1;
if (condition == IOCondition.HUP) {
print ("The connection has been broken.\n");
return false;
}
try {
IOStatus status = channel.read_line (out str_return, out length, out terminator_pos);
if (status == IOStatus.EOF) {
// Quit the program:
loop.quit ();
return false;
}
print ("watch: %s", str_return);
return true;
} catch (IOChannelError e) {
print ("IOChannelError: %s\n", e.message);
return false;
} catch (ConvertError e) {
print ("ConvertError: %s\n", e.message);
return false;
}
});
if(stat == 0) {
print ("Cannot add watch on IOChannel.\n");
return 0;
}
loop.run ();
return 0;
}
valac --pkg glib-2.0 GLib.IOChannel.vala