From b047087ac3c9d82dfb27e952e59934a09d801fb5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 8 Dec 2008 05:41:43 +0000 Subject: [PATCH] Add "fd" and "close-fd" properties including getters and setters. Patch by * gio.symbols: * gunixinputstream.[hc]: * gunixoutputstream.[hc]: Add "fd" and "close-fd" properties including getters and setters. Patch by Maciej Piechotka svn path=/trunk/; revision=7735 --- docs/reference/ChangeLog | 4 + docs/reference/gio/gio-sections.txt | 6 + gio/ChangeLog | 10 ++ gio/gio.symbols | 6 + gio/gunixinputstream.c | 193 +++++++++++++++++++++++++--- gio/gunixinputstream.h | 10 +- gio/gunixoutputstream.c | 191 ++++++++++++++++++++++++--- gio/gunixoutputstream.h | 11 +- 8 files changed, 390 insertions(+), 41 deletions(-) diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 42faa3ba2..a50902ccb 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2008-12-08 Matthias Clasen + + * gio/gio-sections.txt: Add new functions + 2008-12-07 Behdad Esfahbod Bug 563156 – Document printing and scanning gunichar values diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index 0e5dd4262..af76e423b 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -536,6 +536,9 @@ GFilterInputStreamPrivate GUnixInputStream GUnixInputStream g_unix_input_stream_new +g_unix_input_stream_set_close_fd +g_unix_input_stream_get_close_fd +g_unix_input_stream_get_fd GUnixInputStreamClass G_UNIX_INPUT_STREAM @@ -783,6 +786,9 @@ GDataOutputStreamPrivate GUnixOutputStream GUnixOutputStream g_unix_output_stream_new +g_unix_output_stream_set_close_fd +g_unix_output_stream_get_close_fd +g_unix_output_stream_get_fd GUnixOutputStreamClass G_UNIX_OUTPUT_STREAM diff --git a/gio/ChangeLog b/gio/ChangeLog index b5c820596..7c69a9af4 100644 --- a/gio/ChangeLog +++ b/gio/ChangeLog @@ -1,3 +1,13 @@ +2008-12-08 Matthias Clasen + + Bug 555465 – GUnix{Input,Output}Stream lacks fd/close_fd_at_close + property + + * gio.symbols: + * gunixinputstream.[hc]: + * gunixoutputstream.[hc]: Add "fd" and "close-fd" properties + including getters and setters. Patch by Maciej Piechotka + 2008-12-07 Matthias Clasen Bug 558458 – Cannot build gio tests on Solaris using SUN cc diff --git a/gio/gio.symbols b/gio/gio.symbols index 625666681..f074ee278 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -694,6 +694,9 @@ g_unix_is_mount_path_system_internal #ifdef G_OS_UNIX g_unix_input_stream_get_type G_GNUC_CONST g_unix_input_stream_new +g_unix_input_stream_set_close_fd +g_unix_input_stream_get_close_fd +g_unix_input_stream_get_fd #endif /* G_OS_UNIX */ #endif #endif @@ -703,6 +706,9 @@ g_unix_input_stream_new #ifdef G_OS_UNIX g_unix_output_stream_get_type G_GNUC_CONST g_unix_output_stream_new +g_unix_output_stream_set_close_fd +g_unix_output_stream_get_close_fd +g_unix_output_stream_get_fd #endif /* G_OS_UNIX */ #endif #endif diff --git a/gio/gunixinputstream.c b/gio/gunixinputstream.c index da9c8f413..13f5906ab 100644 --- a/gio/gunixinputstream.c +++ b/gio/gunixinputstream.c @@ -42,22 +42,36 @@ /** * SECTION:gunixinputstream - * @short_description: Streaming input operations for Unix file descriptors + * @short_description: Streaming input operations for UNIX file descriptors * @include: gio/gunixinputstream.h * @see_also: #GInputStream * * #GUnixInputStream implements #GInputStream for reading from a - * unix file descriptor, including asynchronous operations. The file + * UNIX file descriptor, including asynchronous operations. The file * descriptor must be selectable, so it doesn't work with opened files. **/ +enum { + PROP_0, + PROP_FD, + PROP_CLOSE_FD +}; + G_DEFINE_TYPE (GUnixInputStream, g_unix_input_stream, G_TYPE_INPUT_STREAM); struct _GUnixInputStreamPrivate { int fd; - gboolean close_fd_at_close; + gboolean close_fd; }; +static void g_unix_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_unix_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); static gssize g_unix_input_stream_read (GInputStream *stream, void *buffer, gsize count, @@ -112,7 +126,9 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass) GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); g_type_class_add_private (klass, sizeof (GUnixInputStreamPrivate)); - + + gobject_class->get_property = g_unix_input_stream_get_property; + gobject_class->set_property = g_unix_input_stream_set_property; gobject_class->finalize = g_unix_input_stream_finalize; stream_class->read_fn = g_unix_input_stream_read; @@ -127,6 +143,83 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass) } stream_class->close_async = g_unix_input_stream_close_async; stream_class->close_finish = g_unix_input_stream_close_finish; + + /** + * GUnixInputStream:fd: + * + * The file descriptor that the stream reads from. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_FD, + g_param_spec_int ("fd", + _("File descriptor"), + _("The file descriptor to read from"), + G_MININT, G_MAXINT, -1, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GUnixInputStream:close-fd: + * + * Whether to close the file descriptor when the stream is closed. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_FD, + g_param_spec_boolean ("close-fd", + _("Close file descriptor"), + _("Whether to close the file descriptor when the stream is closed"), + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); +} + +static void +g_unix_input_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixInputStream *unix_stream; + + unix_stream = G_UNIX_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + unix_stream->priv->fd = g_value_get_int (value); + break; + case PROP_CLOSE_FD: + unix_stream->priv->close_fd = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_input_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixInputStream *unix_stream; + + unix_stream = G_UNIX_INPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + g_value_set_int (value, unix_stream->priv->fd); + break; + case PROP_CLOSE_FD: + g_value_set_boolean (value, unix_stream->priv->close_fd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } static void @@ -135,34 +228,100 @@ g_unix_input_stream_init (GUnixInputStream *unix_stream) unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream, G_TYPE_UNIX_INPUT_STREAM, GUnixInputStreamPrivate); + + unix_stream->priv->fd = -1; + unix_stream->priv->close_fd = TRUE; } /** * g_unix_input_stream_new: - * @fd: unix file descriptor. - * @close_fd_at_close: a #gboolean. + * @fd: a UNIX file descriptor + * @close_fd: %TRUE to close the file descriptor when done * - * Creates a new #GUnixInputStream for the given @fd. If @close_fd_at_close - * is %TRUE, the file descriptor will be closed when the stream is closed. + * Creates a new #GUnixInputStream for the given @fd. + * + * If @close_fd is %TRUE, the file descriptor will be closed + * when the stream is closed. * - * Returns: a #GUnixInputStream. + * Returns: a new #GUnixInputStream **/ GInputStream * -g_unix_input_stream_new (int fd, - gboolean close_fd_at_close) +g_unix_input_stream_new (gint fd, + gboolean close_fd) { GUnixInputStream *stream; g_return_val_if_fail (fd != -1, NULL); - stream = g_object_new (G_TYPE_UNIX_INPUT_STREAM, NULL); + stream = g_object_new (G_TYPE_UNIX_INPUT_STREAM, + "fd", fd, + "close-fd", close_fd, + NULL); - stream->priv->fd = fd; - stream->priv->close_fd_at_close = close_fd_at_close; - return G_INPUT_STREAM (stream); } +/** + * g_unix_input_stream_set_close_fd: + * @stream: a #GUnixInputStream + * @close_fd: %TRUE to close the file descriptor when done + * + * Sets whether the file descriptor of @stream shall be closed + * when the stream is closed. + * + * Since: 2.20 + */ +void +g_unix_input_stream_set_close_fd (GUnixInputStream *stream, + gboolean close_fd) +{ + g_return_if_fail (G_IS_UNIX_INPUT_STREAM (stream)); + + close_fd = close_fd != FALSE; + if (stream->priv->close_fd != close_fd) + { + stream->priv->close_fd = close_fd; + g_object_notify (G_OBJECT (stream), "close-fd"); + } +} + +/** + * g_unix_input_stream_get_close_fd: + * @stream: a #GUnixInputStream + * + * Returns whether the file descriptor of @stream will be + * closed when the stream is closed. + * + * Return value: %TRUE if the file descriptor is closed when done + * + * Since: 2.20 + */ +gboolean +g_unix_input_stream_get_close_fd (GUnixInputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_INPUT_STREAM (stream), FALSE); + + return stream->priv->close_fd; +} + +/** + * g_unix_input_stream_get_fd: + * @stream: a #GUnixInputStream + * + * Return the UNIX file descriptor that the stream reads from. + * + * Return value: The file descriptor of @stream + * + * Since: 2.20 + */ +gint +g_unix_input_stream_get_fd (GUnixInputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_INPUT_STREAM (stream), -1); + + return stream->priv->fd; +} + static gssize g_unix_input_stream_read (GInputStream *stream, void *buffer, @@ -232,7 +391,7 @@ g_unix_input_stream_close (GInputStream *stream, unix_stream = G_UNIX_INPUT_STREAM (stream); - if (!unix_stream->priv->close_fd_at_close) + if (!unix_stream->priv->close_fd) return TRUE; while (1) @@ -412,7 +571,7 @@ close_async_cb (CloseAsyncData *data) unix_stream = G_UNIX_INPUT_STREAM (data->stream); - if (!unix_stream->priv->close_fd_at_close) + if (!unix_stream->priv->close_fd) { result = TRUE; goto out; diff --git a/gio/gunixinputstream.h b/gio/gunixinputstream.h index 9d80f01fe..cbdbe5449 100644 --- a/gio/gunixinputstream.h +++ b/gio/gunixinputstream.h @@ -64,10 +64,14 @@ struct _GUnixInputStreamClass void (*_g_reserved5) (void); }; -GType g_unix_input_stream_get_type (void) G_GNUC_CONST; +GType g_unix_input_stream_get_type (void) G_GNUC_CONST; -GInputStream * g_unix_input_stream_new (int fd, - gboolean close_fd_at_close); +GInputStream * g_unix_input_stream_new (gint fd, + gboolean close_fd); +void g_unix_input_stream_set_close_fd (GUnixInputStream *stream, + gboolean close_fd); +gboolean g_unix_input_stream_get_close_fd (GUnixInputStream *stream); +gint g_unix_input_stream_get_fd (GUnixInputStream *stream); G_END_DECLS diff --git a/gio/gunixoutputstream.c b/gio/gunixoutputstream.c index ebf17ded6..83a85a8a2 100644 --- a/gio/gunixoutputstream.c +++ b/gio/gunixoutputstream.c @@ -51,14 +51,28 @@ * descriptor must be selectable, so it doesn't work with opened files. **/ +enum { + PROP_0, + PROP_FD, + PROP_CLOSE_FD +}; + G_DEFINE_TYPE (GUnixOutputStream, g_unix_output_stream, G_TYPE_OUTPUT_STREAM); struct _GUnixOutputStreamPrivate { int fd; - gboolean close_fd_at_close; + gboolean close_fd; }; +static void g_unix_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void g_unix_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); static gssize g_unix_output_stream_write (GOutputStream *stream, const void *buffer, gsize count, @@ -104,7 +118,9 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) GOutputStreamClass *stream_class = G_OUTPUT_STREAM_CLASS (klass); g_type_class_add_private (klass, sizeof (GUnixOutputStreamPrivate)); - + + gobject_class->get_property = g_unix_output_stream_get_property; + gobject_class->set_property = g_unix_output_stream_set_property; gobject_class->finalize = g_unix_output_stream_finalize; stream_class->write_fn = g_unix_output_stream_write; @@ -113,6 +129,83 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) stream_class->write_finish = g_unix_output_stream_write_finish; stream_class->close_async = g_unix_output_stream_close_async; stream_class->close_finish = g_unix_output_stream_close_finish; + + /** + * GUnixOutputStream:fd: + * + * The file descriptor that the stream writes to. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_FD, + g_param_spec_int ("fd", + _("File descriptor"), + _("The file descriptor to write to"), + G_MININT, G_MAXINT, -1, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + /** + * GUnixOutputStream:close-fd: + * + * Whether to close the file descriptor when the stream is closed. + * + * Since: 2.20 + */ + g_object_class_install_property (gobject_class, + PROP_CLOSE_FD, + g_param_spec_boolean ("close-fd", + _("Close file descriptor"), + _("Whether to close the file descriptor when the stream is closed"), + TRUE, + G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); +} + +static void +g_unix_output_stream_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GUnixOutputStream *unix_stream; + + unix_stream = G_UNIX_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + unix_stream->priv->fd = g_value_get_int (value); + break; + case PROP_CLOSE_FD: + unix_stream->priv->close_fd = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +g_unix_output_stream_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GUnixOutputStream *unix_stream; + + unix_stream = G_UNIX_OUTPUT_STREAM (object); + + switch (prop_id) + { + case PROP_FD: + g_value_set_int (value, unix_stream->priv->fd); + break; + case PROP_CLOSE_FD: + g_value_set_boolean (value, unix_stream->priv->close_fd); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } } static void @@ -121,36 +214,100 @@ g_unix_output_stream_init (GUnixOutputStream *unix_stream) unix_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (unix_stream, G_TYPE_UNIX_OUTPUT_STREAM, GUnixOutputStreamPrivate); -} + unix_stream->priv->fd = -1; + unix_stream->priv->close_fd = TRUE; +} /** * g_unix_output_stream_new: - * @fd: unix's file descriptor. - * @close_fd_at_close: a #gboolean. + * @fd: a UNIX file descriptor + * @close_fd: %TRUE to close the file descriptor when done * - * Creates a new unix output stream for @fd. If @close_fd_at_close - * is %TRUE, the fd will be closed when the output stream is destroyed. + * Creates a new #GUnixOutputStream for the given @fd. * - * Returns: #GOutputStream. If @close_fd_at_close is %TRUE, then - * @fd will be closed when the #GOutputStream is closed. + * If @close_fd, is %TRUE, the file descriptor will be closed when + * the output stream is destroyed. + * + * Returns: a new #GOutputStream **/ GOutputStream * -g_unix_output_stream_new (int fd, - gboolean close_fd_at_close) +g_unix_output_stream_new (gint fd, + gboolean close_fd) { GUnixOutputStream *stream; g_return_val_if_fail (fd != -1, NULL); - stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM, NULL); - - stream->priv->fd = fd; - stream->priv->close_fd_at_close = close_fd_at_close; + stream = g_object_new (G_TYPE_UNIX_OUTPUT_STREAM, + "fd", fd, + "close-fd", close_fd, + NULL); return G_OUTPUT_STREAM (stream); } +/** + * g_unix_output_stream_set_close_fd: + * @stream: a #GUnixOutputStream + * @close_fd: %TRUE to close the file descriptor when done + * + * Sets whether the file descriptor of @stream shall be closed + * when the stream is closed. + * + * Since: 2.20 + */ +void +g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, + gboolean close_fd) +{ + g_return_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream)); + + close_fd = close_fd != FALSE; + if (stream->priv->close_fd != close_fd) + { + stream->priv->close_fd = close_fd; + g_object_notify (G_OBJECT (stream), "close-fd"); + } +} + +/** + * g_unix_output_stream_get_close_fd: + * @stream: a #GUnixOutputStream + * + * Returns whether the file descriptor of @stream will be + * closed when the stream is closed. + * + * Return value: %TRUE if the file descriptor is closed when done + * + * Since: 2.20 + */ +gboolean +g_unix_output_stream_get_close_fd (GUnixOutputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), FALSE); + + return stream->priv->close_fd; +} + +/** + * g_unix_output_stream_get_fd: + * @stream: a #GUnixOutputStream + * + * Return the UNIX file descriptor that the stream writes to. + * + * Return value: The file descriptor of @stream + * + * Since: 2.20 + */ +gint +g_unix_output_stream_get_fd (GUnixOutputStream *stream) +{ + g_return_val_if_fail (G_IS_UNIX_OUTPUT_STREAM (stream), -1); + + return stream->priv->fd; +} + static gssize g_unix_output_stream_write (GOutputStream *stream, const void *buffer, @@ -221,7 +378,7 @@ g_unix_output_stream_close (GOutputStream *stream, unix_stream = G_UNIX_OUTPUT_STREAM (stream); - if (!unix_stream->priv->close_fd_at_close) + if (!unix_stream->priv->close_fd) return TRUE; while (1) @@ -370,7 +527,7 @@ close_async_cb (CloseAsyncData *data) unix_stream = G_UNIX_OUTPUT_STREAM (data->stream); - if (!unix_stream->priv->close_fd_at_close) + if (!unix_stream->priv->close_fd) { result = TRUE; goto out; diff --git a/gio/gunixoutputstream.h b/gio/gunixoutputstream.h index 485643dfc..ad4292388 100644 --- a/gio/gunixoutputstream.h +++ b/gio/gunixoutputstream.h @@ -64,11 +64,14 @@ struct _GUnixOutputStreamClass void (*_g_reserved5) (void); }; -GType g_unix_output_stream_get_type (void) G_GNUC_CONST; - -GOutputStream * g_unix_output_stream_new (int fd, - gboolean close_fd_at_close); +GType g_unix_output_stream_get_type (void) G_GNUC_CONST; +GOutputStream * g_unix_output_stream_new (gint fd, + gboolean close_fd); +void g_unix_output_stream_set_close_fd (GUnixOutputStream *stream, + gboolean close_fd); +gboolean g_unix_output_stream_get_close_fd (GUnixOutputStream *stream); +gint g_unix_output_stream_get_fd (GUnixOutputStream *stream); G_END_DECLS #endif /* __G_UNIX_OUTPUT_STREAM_H__ */