## Unified network I/O

Unified network I/O — Posix style network input/output functions.

## Synopsis

    typedef             GnomeVFSSocket;
                        GnomeVFSSocketImpl;
    GnomeVFSResult      (*GnomeVFSSocketReadFunc)           (gpointer connection,
                                                             gpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_read_out,
                                                             GnomeVFSCancellation *cancellation);
    GnomeVFSResult      (*GnomeVFSSocketWriteFunc)          (gpointer connection,
                                                             gconstpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_written_out,
                                                             GnomeVFSCancellation *cancellation);
    void                (*GnomeVFSSocketCloseFunc)          (gpointer connection,
                                                             GnomeVFSCancellation *cancellation);
    GnomeVFSResult      (*GnomeVFSSocketSetTimeoutFunc)     (gpointer connection,
                                                             GTimeVal *timeout,
                                                             GnomeVFSCancellation *cancellation);
    GnomeVFSSocket *    gnome_vfs_socket_new                (GnomeVFSSocketImpl *impl,
                                                             void *connection);
    GnomeVFSResult      gnome_vfs_socket_write              (GnomeVFSSocket *socket,
                                                             gconstpointer buffer,
                                                             int bytes,
                                                             GnomeVFSFileSize *bytes_written,
                                                             GnomeVFSCancellation *cancellation);
    GnomeVFSResult      gnome_vfs_socket_close              (GnomeVFSSocket *socket,
                                                             GnomeVFSCancellation *cancellation);
    GnomeVFSResult      gnome_vfs_socket_read               (GnomeVFSSocket *socket,
                                                             gpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_read,
                                                             GnomeVFSCancellation *cancellation);
    void                gnome_vfs_socket_free               (GnomeVFSSocket *socket);
    GnomeVFSResult      gnome_vfs_socket_set_timeout        (GnomeVFSSocket *socket,
                                                             GTimeVal *timeout,
                                                             GnomeVFSCancellation *cancellation);

## Description

The GnomeVFSSocket function family unifies network I/O through functions similar to the standard POSIX read/write functions. The main difference is that all operations are cancellable through the standard GnomeVFS cancellation mechanism and you can specify a maximum amount of time an operation may take through gnome_vfs_socket_set_timeout.

## Details

### GnomeVFSSocket

    typedef struct GnomeVFSSocket GnomeVFSSocket;

An handle to a generic unbuffered socket connection established with `gnome_vfs_socket_new()`.

The specifics of the underlying socket implementation are hidden inside the GnomeVFSSocketImpl passed on construction.

If you need buffered I/O, you will also have to create a GnomeVFSSocketBuffer.

### GnomeVFSSocketImpl

    typedef struct {
      GnomeVFSSocketReadFunc read;
      GnomeVFSSocketWriteFunc write;
      GnomeVFSSocketCloseFunc close;
      GnomeVFSSocketSetTimeoutFunc set_timeout;
    } GnomeVFSSocketImpl;

An implementation of a generic socket (i.e. of GnomeVFSSocket) encapsulating the details of how socket I/O works.

Please refer to GnomeVFSSSL for a sample implementation of this interface.

GnomeVFSSocketReadFunc `read`; | A GnomeVFSSocketReadFunc function used for reading from a socket.
GnomeVFSSocketWriteFunc `write`; | A GnomeVFSSocketWriteFunc function used for writing to a socket.
GnomeVFSSocketCloseFunc `close`; | A GnomeVFSSocketCloseFunc function used for closing an open socket.
GnomeVFSSocketSetTimeoutFunc `set_timeout`; | A GnomeVFSSocketSetTimeoutFunc function used for setting a socket's timeout.

### GnomeVFSSocketReadFunc ()

    GnomeVFSResult      (*GnomeVFSSocketReadFunc)           (gpointer connection,
                                                             gpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_read_out,
                                                             GnomeVFSCancellation *cancellation);

This is a generic prototype for a function that reads from a socket.

This function is implemented by a GnomeVFSSocketImpl, and it defines how data should be written to a buffer using the `gnome_vfs_socket_read()` function which hides the socket implementation details.

`connection` : | The socket connection.
`buffer` : | A connection buffer.
`bytes` : | The bytes to read.
`bytes_read_out` : | The bytes that were read (out).
`cancellation` : | A cancellation handle that allows clients to cancel the read operation.
Returns : | A GnomeVFSResult signalling the result of the read operation.

### GnomeVFSSocketWriteFunc ()

    GnomeVFSResult      (*GnomeVFSSocketWriteFunc)          (gpointer connection,
                                                             gconstpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_written_out,
                                                             GnomeVFSCancellation *cancellation);

This is a generic prototype for a function that writes to a socket.

This function is implemented by a GnomeVFSSocketImpl, and it defines how data should be written to a buffer using the `gnome_vfs_socket_write()` function which hides the socket implementation details.

`connection` : | The socket connection.
`buffer` : | A connection buffer.
`bytes` : | The bytes to write.
`bytes_written_out` : | The bytes that were written.
`cancellation` : | A cancellation handle that allows clients to cancel the write operation.
Returns : | A GnomeVFSResult signalling the result of the write operation.

### GnomeVFSSocketCloseFunc ()

    void                (*GnomeVFSSocketCloseFunc)          (gpointer connection,
                                                             GnomeVFSCancellation *cancellation);

This is a generic prototype for a function that closes a socket.

This function is implemented by a GnomeVFSSocketImpl, and it defines how an open socket that was previously opened by `gnome_vfs_socket_new()` should be closed using the `gnome_vfs_socket_set_timeout()` function which hides the socket implementation details.

`connection` : |
`cancellation` : | A cancellation handle that allows clients to cancel the write operation.

### GnomeVFSSocketSetTimeoutFunc ()

    GnomeVFSResult      (*GnomeVFSSocketSetTimeoutFunc)     (gpointer connection,
                                                             GTimeVal *timeout,
                                                             GnomeVFSCancellation *cancellation);

This is a generic prototype for a function that sets a socket timeout.

This function is implemented by a GnomeVFSSocketImpl, and it defines how a socket timeout should be set using should be closed by the `gnome_vfs_socket_close()` function which hides the socket implementation details.

`connection` : |
`timeout` : |
`cancellation` : | A cancellation handle that allows clients to cancel the write operation.
Returns : | A GnomeVFSResult signalling the result of the write operation.

### gnome_vfs_socket_new ()

    GnomeVFSSocket *    gnome_vfs_socket_new                (GnomeVFSSocketImpl *impl,
                                                             void *connection);

Creates a new GnomeVFSSocket using the specific implementation `impl`.

`impl` : | an implementation of socket, e.g. GnomeVFSSSL.
`connection` : | pointer to a connection object used by `impl` to track. state (the exact nature of `connection` varies from implementation to implementation).
Returns : | a newly created socket.

### gnome_vfs_socket_write ()

    GnomeVFSResult      gnome_vfs_socket_write              (GnomeVFSSocket *socket,
                                                             gconstpointer buffer,
                                                             int bytes,
                                                             GnomeVFSFileSize *bytes_written,
                                                             GnomeVFSCancellation *cancellation);

Write `bytes` bytes of data from `buffer` to `socket`.

`socket` : | socket to write data to.
`buffer` : | data to write to the socket.
`bytes` : | number of bytes from `buffer` to write to `socket`.
`bytes_written` : | pointer to a GnomeVFSFileSize, will contain the number of bytes actually written to the `socket` on return.
`cancellation` : | optional cancellation object.
Returns : | GnomeVFSResult indicating the success of the operation.

### gnome_vfs_socket_close ()

    GnomeVFSResult      gnome_vfs_socket_close              (GnomeVFSSocket *socket,
                                                             GnomeVFSCancellation *cancellation);

Close `socket`, freeing any resources it may be using.

`socket` : | the socket to be closed.
`cancellation` : | optional cancellation object.
Returns : | GnomeVFSResult indicating the success of the operation.

### gnome_vfs_socket_read ()

    GnomeVFSResult      gnome_vfs_socket_read               (GnomeVFSSocket *socket,
                                                             gpointer buffer,
                                                             GnomeVFSFileSize bytes,
                                                             GnomeVFSFileSize *bytes_read,
                                                             GnomeVFSCancellation *cancellation);

Read `bytes` bytes of data from the `socket` into `buffer`.

`socket` : | socket to read data from.
`buffer` : | allocated buffer of at least `bytes` bytes to be read into.
`bytes` : | number of bytes to read from `socket` into `buffer`.
`bytes_read` : | pointer to a GnomeVFSFileSize, will contain the number of bytes actually read from the socket on return.
`cancellation` : | optional cancellation object.
Returns : | GnomeVFSResult indicating the success of the operation.

### gnome_vfs_socket_free ()

    void                gnome_vfs_socket_free               (GnomeVFSSocket *socket);

Frees the memory allocated for `socket`, but does not call any GnomeVFSSocketImpl function.

`socket` : | The GnomeVFSSocket you want to free.

Since 2.8

### gnome_vfs_socket_set_timeout ()

    GnomeVFSResult      gnome_vfs_socket_set_timeout        (GnomeVFSSocket *socket,
                                                             GTimeVal *timeout,
                                                             GnomeVFSCancellation *cancellation);

Set a timeout of `timeout`. If `timeout` is `NULL`, following operations will block indefinitely).

Note if you set `timeout` to 0 (means tv_sec and tv_usec are both 0) every following operation will return immediately. (This can be used for polling.)

`socket` : | socket to set the timeout of.
`timeout` : | the timeout.
`cancellation` : | optional cancellation object.
Returns : | GnomeVFSResult indicating the success of the operation.

Since 2.8