/* GIO - GLib Input, Output and Streaming Library
- *
+ *
* Copyright (C) 2006-2007 Red Hat, Inc.
* Copyright (C) 2008 Novell, Inc.
*
* 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 <http://www.gnu.org/licenses/>.
*
* Author: Alexander Larsson <alexl@redhat.com>
* Author: Tor Lillqvist <tml@novell.com>
#include <glib.h>
-#include "gcancellable.h"
-#include "gioerror.h"
+#include "gio/gcancellable.h"
+#include "gio/gioerror.h"
#include "gwinhttpfileinputstream.h"
#include "glibintl.h"
-#include "gioalias.h"
-
struct _GWinHttpFileInputStream
{
GFileInputStream parent_instance;
GCancellable *cancellable,
GError **error);
+static gboolean g_winhttp_file_input_stream_close (GInputStream *stream,
+ GCancellable *cancellable,
+ GError **error);
+
static void
g_winhttp_file_input_stream_finalize (GObject *object)
{
GWinHttpFileInputStream *winhttp_stream;
-
+
winhttp_stream = G_WINHTTP_FILE_INPUT_STREAM (object);
if (winhttp_stream->request != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (winhttp_stream->request);
+ G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->request);
if (winhttp_stream->connection != NULL)
- G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpCloseHandle (winhttp_stream->connection);
+ G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpCloseHandle (winhttp_stream->connection);
+
+ g_object_unref (winhttp_stream->file);
+ winhttp_stream->file = NULL;
G_OBJECT_CLASS (g_winhttp_file_input_stream_parent_class)->finalize (object);
}
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass);
-
+
gobject_class->finalize = g_winhttp_file_input_stream_finalize;
stream_class->read_fn = g_winhttp_file_input_stream_read;
+ stream_class->close_fn = g_winhttp_file_input_stream_close;
}
static void
/**
* g_winhttp_file_input_stream_new:
- * @file: the GWinHttpFile being read
+ * @file: the GWinHttpFile being read
* @connection: handle to the HTTP connection, as from WinHttpConnect()
* @request: handle to the HTTP request, as from WinHttpOpenRequest
- *
+ *
* Returns: #GFileInputStream for the given request
- **/
+ */
GFileInputStream *
_g_winhttp_file_input_stream_new (GWinHttpFile *file,
HINTERNET connection,
stream = g_object_new (G_TYPE_WINHTTP_FILE_INPUT_STREAM, NULL);
- stream->file = file;
+ stream->file = g_object_ref (file);
stream->request_sent = FALSE;
stream->connection = connection;
stream->request = request;
-
+
return G_FILE_INPUT_STREAM (stream);
}
if (!winhttp_stream->request_sent)
{
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpSendRequest
+ if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpSendRequest
(winhttp_stream->request,
NULL, 0,
NULL, 0,
0,
0))
{
- char *emsg = _g_winhttp_error_message (GetLastError ());
-
- g_set_error (error, G_IO_ERROR,
- G_IO_ERROR_FAILED,
- "%s", emsg);
- g_free (emsg);
-
- return -1;
- }
-
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpReceiveResponse
- (winhttp_stream->request, NULL))
- {
- char *emsg = _g_winhttp_error_message (GetLastError ());
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", emsg);
- g_free (emsg);
+ _g_winhttp_set_error (error, GetLastError (), "GET request");
return -1;
}
+
+ if (!_g_winhttp_response (winhttp_stream->file->vfs,
+ winhttp_stream->request,
+ error,
+ "GET request"))
+ return -1;
+
winhttp_stream->request_sent = TRUE;
}
-
- if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->pWinHttpReadData
+
+ if (!G_WINHTTP_VFS_GET_CLASS (winhttp_stream->file->vfs)->funcs->pWinHttpReadData
(winhttp_stream->request, buffer, count, &bytes_read))
{
- char *emsg = _g_winhttp_error_message (GetLastError ());
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "%s", emsg);
- g_free (emsg);
+ _g_winhttp_set_error (error, GetLastError (), "GET request");
return -1;
}
-
+
return bytes_read;
}
+
+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;
+}