| 
									
										
										
										
											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 "gwinhttpfileoutputstream.h"
 | 
					
						
							|  |  |  | #include "glibintl.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GWinHttpFileOutputStream | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GFileOutputStream parent_instance; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   GWinHttpFile *file; | 
					
						
							|  |  |  |   HINTERNET connection; | 
					
						
							|  |  |  |   goffset offset; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GWinHttpFileOutputStreamClass | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GFileOutputStreamClass parent_class; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define g_winhttp_file_output_stream_get_type _g_winhttp_file_output_stream_get_type
 | 
					
						
							| 
									
										
										
										
											2014-10-17 11:54:02 +01:00
										 |  |  | G_DEFINE_TYPE (GWinHttpFileOutputStream, g_winhttp_file_output_stream, G_TYPE_FILE_OUTPUT_STREAM) | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static gssize     g_winhttp_file_output_stream_write      (GOutputStream     *stream, | 
					
						
							|  |  |  |                                                            const void        *buffer, | 
					
						
							|  |  |  |                                                            gsize              count, | 
					
						
							|  |  |  |                                                            GCancellable      *cancellable, | 
					
						
							|  |  |  |                                                            GError           **error); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_output_stream_finalize (GObject *object) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileOutputStream *winhttp_stream; | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (object); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   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
										 |  |  | 
 | 
					
						
							|  |  |  |   G_OBJECT_CLASS (g_winhttp_file_output_stream_parent_class)->finalize (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_output_stream_class_init (GWinHttpFileOutputStreamClass *klass) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class = G_OBJECT_CLASS (klass); | 
					
						
							|  |  |  |   GOutputStreamClass *stream_class = G_OUTPUT_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_output_stream_finalize; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream_class->write_fn = g_winhttp_file_output_stream_write; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | g_winhttp_file_output_stream_init (GWinHttpFileOutputStream *info) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-05 16:20:43 +01:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |  * g_winhttp_file_output_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: #GFileOutputStream for the given request | 
					
						
							| 
									
										
										
										
											2009-11-29 22:54:16 -05:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | GFileOutputStream * | 
					
						
							|  |  |  | _g_winhttp_file_output_stream_new (GWinHttpFile *file, | 
					
						
							|  |  |  |                                    HINTERNET     connection) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileOutputStream *stream; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream = g_object_new (G_TYPE_WINHTTP_FILE_OUTPUT_STREAM, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stream->file = file; | 
					
						
							|  |  |  |   stream->connection = connection; | 
					
						
							|  |  |  |   stream->offset = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return G_FILE_OUTPUT_STREAM (stream); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gssize | 
					
						
							|  |  |  | g_winhttp_file_output_stream_write (GOutputStream  *stream, | 
					
						
							|  |  |  |                                     const void     *buffer, | 
					
						
							|  |  |  |                                     gsize           count, | 
					
						
							|  |  |  |                                     GCancellable   *cancellable, | 
					
						
							|  |  |  |                                     GError        **error) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GWinHttpFileOutputStream *winhttp_stream = G_WINHTTP_FILE_OUTPUT_STREAM (stream); | 
					
						
							|  |  |  |   HINTERNET request; | 
					
						
							|  |  |  |   char *headers; | 
					
						
							|  |  |  |   wchar_t *wheaders; | 
					
						
							|  |  |  |   DWORD bytes_written; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |   request = G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpOpenRequest | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |     (winhttp_stream->connection, | 
					
						
							|  |  |  |      L"PUT", | 
					
						
							|  |  |  |      winhttp_stream->file->url.lpszUrlPath, | 
					
						
							|  |  |  |      NULL, | 
					
						
							|  |  |  |      WINHTTP_NO_REFERER, | 
					
						
							|  |  |  |      NULL, | 
					
						
							|  |  |  |      winhttp_stream->file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (request == NULL) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |       _g_winhttp_set_error (error, GetLastError (), "PUT request"); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:40:39 +00:00
										 |  |  |   headers = g_strdup_printf ("Content-Range: bytes %" G_GINT64_FORMAT "-%" G_GINT64_FORMAT "/*\r\n", | 
					
						
							|  |  |  |                              winhttp_stream->offset, winhttp_stream->offset + count); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   wheaders = g_utf8_to_utf16 (headers, -1, NULL, NULL, NULL); | 
					
						
							|  |  |  |   g_free (headers); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |       (request, | 
					
						
							|  |  |  |        wheaders, -1, | 
					
						
							|  |  |  |        NULL, 0, | 
					
						
							| 
									
										
										
										
											2008-08-12 23:40:39 +00:00
										 |  |  |        count, | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |        0)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |       _g_winhttp_set_error (error, GetLastError (), "PUT request"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |       G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |       g_free (wheaders); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |   g_free (wheaders); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |   if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpWriteData | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |       (request, buffer, count, &bytes_written)) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |       _g_winhttp_set_error (error, GetLastError (), "PUT request"); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |       G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:40:39 +00:00
										 |  |  |   winhttp_stream->offset += bytes_written; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  |   if (!_g_winhttp_response (winhttp_stream->file->vfs, | 
					
						
							|  |  |  |                             request, | 
					
						
							|  |  |  |                             error, | 
					
						
							|  |  |  |                             "PUT request")) | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |       G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); | 
					
						
							| 
									
										
										
										
											2008-08-13 19:39:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  |       return -1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-12 17:52:39 +00:00
										 |  |  |   G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (request); | 
					
						
							| 
									
										
										
										
											2008-08-12 23:09:04 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return bytes_written; | 
					
						
							|  |  |  | } |