X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgwin32inputstream.c;h=179e139919731b7fc793360a7cf54b9cfa869124;hb=8df2cca08a5c06286303b39a34121c7e6925bf15;hp=21af46865acf30141e6e80e8f4105fe3471268d4;hpb=6dee874b68548981ae567b553be3c010766e4a25;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gwin32inputstream.c b/gio/gwin32inputstream.c index 21af468..179e139 100644 --- a/gio/gwin32inputstream.c +++ b/gio/gwin32inputstream.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: Alexander Larsson * Author: Tor Lillqvist @@ -31,6 +29,7 @@ #include "gioerror.h" #include "gsimpleasyncresult.h" #include "gwin32inputstream.h" +#include "giowin32-priv.h" #include "gcancellable.h" #include "gasynchelper.h" #include "glibintl.h" @@ -45,9 +44,9 @@ * #GWin32InputStream implements #GInputStream for reading from a * Windows file handle. * - * Note that <gio/gwin32inputstream.h> belongs - * to the Windows-specific GIO interfaces, thus you have to use the - * gio-windows-2.0.pc pkg-config file when using it. + * Note that `` belongs to the Windows-specific GIO + * interfaces, thus you have to use the `gio-windows-2.0.pc` pkg-config file + * when using it. */ enum { @@ -56,13 +55,14 @@ enum { PROP_CLOSE_HANDLE }; -G_DEFINE_TYPE (GWin32InputStream, g_win32_input_stream, G_TYPE_INPUT_STREAM); - struct _GWin32InputStreamPrivate { HANDLE handle; gboolean close_handle; + gint fd; }; +G_DEFINE_TYPE_WITH_PRIVATE (GWin32InputStream, g_win32_input_stream, G_TYPE_INPUT_STREAM) + static void g_win32_input_stream_set_property (GObject *object, guint prop_id, const GValue *value, @@ -81,22 +81,13 @@ static gboolean g_win32_input_stream_close (GInputStream *stream, GError **error); static void -g_win32_input_stream_finalize (GObject *object) -{ - G_OBJECT_CLASS (g_win32_input_stream_parent_class)->finalize (object); -} - -static void g_win32_input_stream_class_init (GWin32InputStreamClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); - g_type_class_add_private (klass, sizeof (GWin32InputStreamPrivate)); - gobject_class->get_property = g_win32_input_stream_get_property; gobject_class->set_property = g_win32_input_stream_set_property; - gobject_class->finalize = g_win32_input_stream_finalize; stream_class->read_fn = g_win32_input_stream_read; stream_class->close_fn = g_win32_input_stream_close; @@ -181,12 +172,10 @@ g_win32_input_stream_get_property (GObject *object, static void g_win32_input_stream_init (GWin32InputStream *win32_stream) { - win32_stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (win32_stream, - G_TYPE_WIN32_INPUT_STREAM, - GWin32InputStreamPrivate); - + win32_stream->priv = g_win32_input_stream_get_instance_private (win32_stream); win32_stream->priv->handle = NULL; win32_stream->priv->close_handle = TRUE; + win32_stream->priv->fd = -1; } /** @@ -251,7 +240,7 @@ g_win32_input_stream_set_close_handle (GWin32InputStream *stream, * Returns whether the handle of @stream will be * closed when the stream is closed. * - * Return value: %TRUE if the handle is closed when done + * Returns: %TRUE if the handle is closed when done * * Since: 2.26 */ @@ -269,7 +258,7 @@ g_win32_input_stream_get_close_handle (GWin32InputStream *stream) * * Return the Windows file handle that the stream reads from. * - * Return value: The file handle of @stream + * Returns: The file handle of @stream * * Since: 2.26 */ @@ -376,19 +365,44 @@ g_win32_input_stream_close (GInputStream *stream, if (!win32_stream->priv->close_handle) return TRUE; - res = CloseHandle (win32_stream->priv->handle); - if (!res) + if (win32_stream->priv->fd != -1) { - int errsv = GetLastError (); - gchar *emsg = g_win32_error_message (errsv); - - g_set_error (error, G_IO_ERROR, - g_io_error_from_win32_error (errsv), - _("Error closing handle: %s"), - emsg); - g_free (emsg); - return FALSE; + if (close (win32_stream->priv->fd) < 0) + { + g_set_error_literal (error, G_IO_ERROR, + g_io_error_from_errno (errno), + g_strerror (errno)); + return FALSE; + } + } + else + { + res = CloseHandle (win32_stream->priv->handle); + if (!res) + { + int errsv = GetLastError (); + gchar *emsg = g_win32_error_message (errsv); + + g_set_error (error, G_IO_ERROR, + g_io_error_from_win32_error (errsv), + _("Error closing handle: %s"), + emsg); + g_free (emsg); + return FALSE; + } } return TRUE; } + +GInputStream * +g_win32_input_stream_new_from_fd (gint fd, + gboolean close_fd) +{ + GWin32InputStream *win32_stream; + + win32_stream = G_WIN32_INPUT_STREAM (g_win32_input_stream_new ((HANDLE) _get_osfhandle (fd), close_fd)); + win32_stream->priv->fd = fd; + + return (GInputStream*)win32_stream; +}