Add "fd" and "close-fd" properties including getters and setters. Patch by
authorMatthias Clasen <matthiasc@src.gnome.org>
Mon, 8 Dec 2008 05:41:43 +0000 (05:41 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 8 Dec 2008 05:41:43 +0000 (05:41 +0000)
        * 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
docs/reference/gio/gio-sections.txt
gio/ChangeLog
gio/gio.symbols
gio/gunixinputstream.c
gio/gunixinputstream.h
gio/gunixoutputstream.c
gio/gunixoutputstream.h

index 42faa3b..a50902c 100644 (file)
@@ -1,3 +1,7 @@
+2008-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       * gio/gio-sections.txt: Add new functions
+
 2008-12-07  Behdad Esfahbod  <behdad@gnome.org>
 
        Bug 563156 – Document printing and scanning gunichar values
index 0e5dd42..af76e42 100644 (file)
@@ -536,6 +536,9 @@ GFilterInputStreamPrivate
 <TITLE>GUnixInputStream</TITLE>
 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
 <SUBSECTION Standard>
 GUnixInputStreamClass
 G_UNIX_INPUT_STREAM
@@ -783,6 +786,9 @@ GDataOutputStreamPrivate
 <TITLE>GUnixOutputStream</TITLE>
 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
 <SUBSECTION Standard>
 GUnixOutputStreamClass
 G_UNIX_OUTPUT_STREAM
index b5c8205..7c69a9a 100644 (file)
@@ -1,3 +1,13 @@
+2008-12-08  Matthias Clasen  <mclasen@redhat.com>
+
+       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  <mclasen@redhat.com>
 
        Bug 558458 – Cannot build gio tests on Solaris using SUN cc
index 6256666..f074ee2 100644 (file)
@@ -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
index da9c8f4..13f5906 100644 (file)
 
 /**
  * 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;
index 9d80f01..cbdbe54 100644 (file)
@@ -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
 
index ebf17de..83a85a8 100644 (file)
  * 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;
index 485643d..ad42923 100644 (file)
@@ -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__ */