| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | /* GIO - GLib Input, Output and Streaming Library
 | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * Copyright (C) 2006-2007 Red Hat, Inc. | 
					
						
							|  |  |  |  * Copyright (C) 2008 Novell, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							| 
									
										
										
										
											2017-01-05 14:32:59 +01:00
										 |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General | 
					
						
							| 
									
										
										
										
											2014-01-23 12:58:29 +01:00
										 |  |  |  * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Author: Alexander Larsson <alexl@redhat.com> | 
					
						
							|  |  |  |  * Author: Tor Lillqvist <tml@novell.com> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "config.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 16:01:39 +03:00
										 |  |  | #include "gio/gcancellable.h"
 | 
					
						
							|  |  |  | #include "gio/gioerror.h"
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | #include "gwinhttpfileinputstream.h"
 | 
					
						
							|  |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GWinHttpFileInputStream | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GFileInputStream parent_instance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   GWinHttpFile *file; | 
					
						
							|  |  |  |   gboolean request_sent; | 
					
						
							|  |  |  |   HINTERNET connection; | 
					
						
							|  |  |  |   HINTERNET request; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GWinHttpFileInputStreamClass | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GFileInputStreamClass parent_class; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define g_winhttp_file_input_stream_get_type _g_winhttp_file_input_stream_get_type
 | 
					
						
							| 
									
										
										
										
											2014-10-17 11:54:02 +01:00
										 |  |  | G_DEFINE_TYPE (GWinHttpFileInputStream, g_winhttp_file_input_stream, G_TYPE_FILE_INPUT_STREAM) | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static gssize g_winhttp_file_input_stream_read (GInputStream    *stream, | 
					
						
							|  |  |  |                                                 void            *buffer, | 
					
						
							|  |  |  |                                                 gsize            count, | 
					
						
							|  |  |  |                                                 GCancellable    *cancellable, | 
					
						
							|  |  |  |                                                 GError         **error); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-27 15:12:31 +03:00
										 |  |  | static gboolean g_winhttp_file_input_stream_close (GInputStream  *stream, | 
					
						
							|  |  |  | 						   GCancellable  *cancellable, | 
					
						
							|  |  |  | 						   GError       **error); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_input_stream_finalize (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileInputStream *winhttp_stream; | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (winhttp_stream->request != NULL) | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |     G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->request); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   if (winhttp_stream->connection != NULL) | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |     G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-27 15:12:31 +03:00
										 |  |  |   g_object_unref (winhttp_stream->file); | 
					
						
							|  |  |  |   winhttp_stream->file = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   G_OBJECT_CLASS (g_winhttp_file_input_stream_parent_class)->finalize (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_input_stream_class_init (GWinHttpFileInputStreamClass *klass) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass); | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   gobject_class->finalize = g_winhttp_file_input_stream_finalize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream_class->read_fn = g_winhttp_file_input_stream_read; | 
					
						
							| 
									
										
										
										
											2009-05-27 15:12:31 +03:00
										 |  |  |   stream_class->close_fn = g_winhttp_file_input_stream_close; | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_input_stream_init (GWinHttpFileInputStream *info) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 16:20:43 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * g_winhttp_file_input_stream_new: | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |  * @file: the GWinHttpFile being read | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * @connection: handle to the HTTP connection, as from WinHttpConnect() | 
					
						
							|  |  |  |  * @request: handle to the HTTP request, as from WinHttpOpenRequest | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * Returns: #GFileInputStream for the given request | 
					
						
							| 
									
										
										
										
											2009-11-29 22:54:16 -05:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | GFileInputStream * | 
					
						
							|  |  |  | _g_winhttp_file_input_stream_new (GWinHttpFile *file, | 
					
						
							|  |  |  |                                   HINTERNET     connection, | 
					
						
							|  |  |  |                                   HINTERNET     request) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileInputStream *stream; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream = g_object_new (G_TYPE_WINHTTP_FILE_INPUT_STREAM, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-27 15:12:31 +03:00
										 |  |  |   stream->file = g_object_ref (file); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   stream->request_sent = FALSE; | 
					
						
							|  |  |  |   stream->connection = connection; | 
					
						
							|  |  |  |   stream->request = request; | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   return G_FILE_INPUT_STREAM (stream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gssize | 
					
						
							|  |  |  | g_winhttp_file_input_stream_read (GInputStream  *stream, | 
					
						
							|  |  |  |                                   void          *buffer, | 
					
						
							|  |  |  |                                   gsize          count, | 
					
						
							|  |  |  |                                   GCancellable  *cancellable, | 
					
						
							|  |  |  |                                   GError       **error) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileInputStream *winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (stream); | 
					
						
							|  |  |  |   DWORD bytes_read; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!winhttp_stream->request_sent) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |       if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |           (winhttp_stream->request, | 
					
						
							|  |  |  |            NULL, 0, | 
					
						
							|  |  |  |            NULL, 0, | 
					
						
							|  |  |  |            0, | 
					
						
							|  |  |  |            0)) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |           _g_winhttp_set_error (error, GetLastError (), "GET request"); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |           return -1; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (!_g_winhttp_response (winhttp_stream->file->vfs, | 
					
						
							|  |  |  |                                 winhttp_stream->request, | 
					
						
							|  |  |  |                                 error, | 
					
						
							|  |  |  |                                 "GET request")) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |       winhttp_stream->request_sent = TRUE; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |   if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpReadData | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |       (winhttp_stream->request, buffer, count, &bytes_read)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |       _g_winhttp_set_error (error, GetLastError (), "GET request"); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   return bytes_read; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-05-27 15:12:31 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | static gboolean  | 
					
						
							|  |  |  | g_winhttp_file_input_stream_close (GInputStream         *stream, | 
					
						
							|  |  |  | 				   GCancellable         *cancellable, | 
					
						
							|  |  |  | 				   GError              **error) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileInputStream *winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (stream); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (winhttp_stream->connection != NULL) | 
					
						
							|  |  |  |     G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection); | 
					
						
							|  |  |  |   winhttp_stream->connection = NULL; | 
					
						
							|  |  |  |   return TRUE; | 
					
						
							|  |  |  | } |