17261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist/* GIO - GLib Input, Output and Streaming Library 2d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist * 37261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Copyright (C) 2006-2007 Red Hat, Inc. 47261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Copyright (C) 2008 Novell, Inc. 57261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * 67261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * This library is free software; you can redistribute it and/or 77261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * modify it under the terms of the GNU Lesser General Public 87261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * License as published by the Free Software Foundation; either 97261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * version 2 of the License, or (at your option) any later version. 107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * 117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * This library is distributed in the hope that it will be useful, 127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * but WITHOUT ANY WARRANTY; without even the implied warranty of 137261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 147261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Lesser General Public License for more details. 157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * 167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * You should have received a copy of the GNU Lesser General 177261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Public License along with this library; if not, write to the 187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Free Software Foundation, Inc., 59 Temple Place, Suite 330, 197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Boston, MA 02111-1307, USA. 207261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * 217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Author: Alexander Larsson <alexl@redhat.com> 227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Author: Tor Lillqvist <tml@novell.com> 237261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist */ 247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "config.h" 267261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 278607901a7406371d55874bb6c291351b4b0c4547Hans Breuer#include <stdio.h> 287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include <string.h> 296b2d7a53445abd4b4c33b801e1add8995dae3c79Tor Lillqvist#include <wchar.h> 307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gfile.h" 327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gfileattribute.h" 33d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist#include "gfileinfo.h" 347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gwinhttpfile.h" 357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gwinhttpfileinputstream.h" 367261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gwinhttpfileoutputstream.h" 377261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gioerror.h" 387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "glibintl.h" 407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#include "gioalias.h" 427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic void g_winhttp_file_file_iface_init (GFileIface *iface); 447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#define g_winhttp_file_get_type _g_winhttp_file_get_type 467261372b4534336fbe12d4d5f2aef9460d50bde3Tor LillqvistG_DEFINE_TYPE_WITH_CODE (GWinHttpFile, g_winhttp_file, G_TYPE_OBJECT, 477261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist G_IMPLEMENT_INTERFACE (G_TYPE_FILE, 487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_winhttp_file_file_iface_init)) 497261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic void 517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_finalize (GObject *object) 527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 537261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *file; 547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file = G_WINHTTP_FILE (object); 567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszScheme); 587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszHostName); 597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszUserName); 607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszPassword); 617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszUrlPath); 627261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszExtraInfo); 637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 648607901a7406371d55874bb6c291351b4b0c4547Hans Breuer g_object_unref (file->vfs); 658607901a7406371d55874bb6c291351b4b0c4547Hans Breuer 667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist G_OBJECT_CLASS (g_winhttp_file_parent_class)->finalize (object); 677261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic void 707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_class_init (GWinHttpFileClass *klass) 717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 727261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GObjectClass *gobject_class = G_OBJECT_CLASS (klass); 737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gobject_class->finalize = g_winhttp_file_finalize; 757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic void 787261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_init (GWinHttpFile *winhttp) 797261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 807261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 817261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 827261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist/** 837261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * _g_winhttp_file_new: 847261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * @vfs: GWinHttpVfs to use 857261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * @uri: URI of the GWinHttpFile to create. 86d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist * 877261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist * Returns: new winhttp #GFile. 887261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist **/ 897261372b4534336fbe12d4d5f2aef9460d50bde3Tor LillqvistGFile * 907261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist_g_winhttp_file_new (GWinHttpVfs *vfs, 917261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *uri) 927261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 937261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wchar_t *wuri; 947261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *file; 957261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 967261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wuri = g_utf8_to_utf16 (uri, -1, NULL, NULL, NULL); 977261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 987261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (wuri == NULL) 997261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 1007261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1017261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file = g_object_new (G_TYPE_WINHTTP_FILE, NULL); 1028607901a7406371d55874bb6c291351b4b0c4547Hans Breuer file->vfs = g_object_ref (vfs); 1037261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1047261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist memset (&file->url, 0, sizeof (file->url)); 1057261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwStructSize = sizeof (file->url); 1067261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwSchemeLength = 1; 1077261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwHostNameLength = 1; 1087261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwUserNameLength = 1; 1097261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwPasswordLength = 1; 1107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwUrlPathLength = 1; 1117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.dwExtraInfoLength = 1; 1127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1132f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url)) 1147261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 1157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wuri); 1167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 1177261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 1187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszScheme = g_new (wchar_t, ++file->url.dwSchemeLength); 1207261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszHostName = g_new (wchar_t, ++file->url.dwHostNameLength); 1217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszUserName = g_new (wchar_t, ++file->url.dwUserNameLength); 1227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszPassword = g_new (wchar_t, ++file->url.dwPasswordLength); 1237261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszUrlPath = g_new (wchar_t, ++file->url.dwUrlPathLength); 1247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist file->url.lpszExtraInfo = g_new (wchar_t, ++file->url.dwExtraInfoLength); 1257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1262f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (!G_WINHTTP_VFS_GET_CLASS (vfs)->funcs->pWinHttpCrackUrl (wuri, 0, 0, &file->url)) 1277261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 1287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszScheme); 1297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszHostName); 1307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszUserName); 1317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszPassword); 1327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszUrlPath); 1337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (file->url.lpszExtraInfo); 1347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wuri); 1357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 1367261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 137d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 1387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wuri); 1397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return G_FILE (file); 1407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 1437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_is_native (GFile *file) 1447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return FALSE; 1467261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1477261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 1497261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_has_uri_scheme (GFile *file, 1507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *uri_scheme) 1517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return (g_ascii_strcasecmp (uri_scheme, "http") == 0 || 1537261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_ascii_strcasecmp (uri_scheme, "https") == 0); 1547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 1577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_uri_scheme (GFile *file) 1587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 1607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return g_utf16_to_utf8 (winhttp_file->url.lpszScheme, -1, NULL, NULL, NULL); 1627261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1647261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 1657261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_basename (GFile *file) 1667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1677261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 1687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *basename; 1697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *last_slash; 1707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *retval; 1717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1727261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist basename = g_utf16_to_utf8 (winhttp_file->url.lpszUrlPath, -1, NULL, NULL, NULL); 1737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist last_slash = strrchr (basename, '/'); 1747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* If no slash, or only "/" fallback to full path part of URI */ 1757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (last_slash == NULL || last_slash[1] == '\0') 1767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return basename; 1777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1787261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = g_strdup (last_slash + 1); 1797261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (basename); 1807261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1817261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 1827261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1837261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1847261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 1857261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_path (GFile *file) 1867261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1877261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 1887261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 1897261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1907261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 1917261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_uri (GFile *file) 1927261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 1937261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 1947261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist DWORD len; 1957261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wchar_t *wuri; 1967261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *retval; 1977261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 1987261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist len = 0; 1992f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, NULL, &len) && 2007261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GetLastError () != ERROR_INSUFFICIENT_BUFFER) 2017261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 2027261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2037261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wuri = g_new (wchar_t, ++len); 2047261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2052f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpCreateUrl (&winhttp_file->url, ICU_ESCAPE, wuri, &len)) 2067261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 2077261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wuri); 2087261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 2097261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 2107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = g_utf16_to_utf8 (wuri, -1, NULL, NULL, NULL); 2127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wuri); 2137261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 214d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (g_str_has_prefix (retval, "http://:@")) 215d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 216d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist memmove (retval + 7, retval + 9, strlen (retval) - 9); 217d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval[strlen (retval) - 2] = '\0'; 218d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 219d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist else if (g_str_has_prefix (retval, "https://:@")) 220d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 221d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist memmove (retval + 8, retval + 10, strlen (retval) - 10); 222d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval[strlen (retval) - 2] = '\0'; 223d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 224d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 2257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 2267261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 2277261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 2297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_parse_name (GFile *file) 2307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 2317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* FIXME: More hair surely needed */ 2327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return g_winhttp_file_get_uri (file); 2347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 2357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2367261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFile * 2377261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_parent (GFile *file) 2387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 2397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file; 2407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *uri; 2417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *last_slash; 2427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *parent; 2437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file = G_WINHTTP_FILE (file); 2457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2467261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist uri = g_winhttp_file_get_uri (file); 2477261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (uri == NULL) 2487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 249d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 2507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist last_slash = strrchr (uri, '/'); 2517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (last_slash == NULL || *(last_slash+1) == 0) 2527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 2537261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri); 2547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 2557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 2567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist while (last_slash > uri && *last_slash == '/') 2587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist last_slash--; 2597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist last_slash[1] = '\0'; 2617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2627261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist parent = _g_winhttp_file_new (winhttp_file->vfs, uri); 2637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri); 264d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 2657261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return parent; 2667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 2677261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFile * 2697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_dup (GFile *file) 2707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 2717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 2727261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *uri = g_winhttp_file_get_uri (file); 2737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *retval = _g_winhttp_file_new (winhttp_file->vfs, uri); 2747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri); 2767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 2787261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 2797261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2807261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic guint 2817261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_hash (GFile *file) 2827261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 2837261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *uri = g_winhttp_file_get_uri (file); 2847261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist guint retval = g_str_hash (uri); 2857261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2867261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri); 2877261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2887261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 2897261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 2907261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2917261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 2927261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_equal (GFile *file1, 2937261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *file2) 2947261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 2957261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *uri1 = g_winhttp_file_get_uri (file1); 2967261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *uri2 = g_winhttp_file_get_uri (file2); 2977261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gboolean retval = g_str_equal (uri1, uri2); 2987261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 2997261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri1); 3007261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (uri2); 301d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 3027261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 3037261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 3047261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3057261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic const char * 306d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvistmatch_prefix (const char *path, 3077261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *prefix) 3087261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 3097261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist int prefix_len; 3107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist prefix_len = strlen (prefix); 3127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (strncmp (path, prefix, prefix_len) != 0) 3137261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 314d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 3157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (prefix_len > 0 && prefix[prefix_len-1] == '/') 3167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist prefix_len--; 317d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 3187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return path + prefix_len; 3197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 3207261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 3227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_prefix_matches (GFile *parent, 3237261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *descendant) 3247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 3257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *parent_uri = g_winhttp_file_get_uri (parent); 3267261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *descendant_uri = g_winhttp_file_get_uri (descendant); 3277261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *remainder; 3287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gboolean retval; 3297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist remainder = match_prefix (descendant_uri, parent_uri); 3317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (remainder != NULL && *remainder == '/') 3337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = TRUE; 3347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist else 3357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = FALSE; 3367261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3377261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (parent_uri); 3387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (descendant_uri); 3397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 3417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 3427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic char * 3447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_relative_path (GFile *parent, 3457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *descendant) 3467261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 3477261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *parent_uri = g_winhttp_file_get_uri (parent); 3487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *descendant_uri = g_winhttp_file_get_uri (descendant); 3497261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *remainder; 3507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *retval; 3517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist remainder = match_prefix (descendant_uri, parent_uri); 353d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 3547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (remainder != NULL && *remainder == '/') 3557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = g_strdup (remainder + 1); 3567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist else 3577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist retval = NULL; 3587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (parent_uri); 3607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (descendant_uri); 3617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3627261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return retval; 3637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 3647261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3657261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFile * 3667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_resolve_relative_path (GFile *file, 3677261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *relative_path) 3687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 3697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 3707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *child; 3717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wchar_t *wnew_path = g_utf8_to_utf16 (relative_path, -1, NULL, NULL, NULL); 3727261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (wnew_path == NULL) 3747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 3757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (*wnew_path != '/') 3777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 3787261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wchar_t *tmp = g_new (wchar_t, wcslen (winhttp_file->url.lpszUrlPath) + 1 + wcslen (wnew_path) + 1); 3797261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wcscpy (tmp, winhttp_file->url.lpszUrlPath); 3807261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wcscat (tmp, L"/"); 3817261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wcscat (tmp, wnew_path); 3827261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3837261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (wnew_path); 3847261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist wnew_path = tmp; 3857261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 3867261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 3877261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child = g_object_new (G_TYPE_WINHTTP_FILE, NULL); 3887261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child->vfs = winhttp_file->vfs; 3897261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child->url = winhttp_file->url; 390faeeebab030eee4610b41303754e44dc89239450Shixin Zeng child->url.lpszScheme = g_memdup (winhttp_file->url.lpszScheme, (winhttp_file->url.dwSchemeLength+1)*2); 391faeeebab030eee4610b41303754e44dc89239450Shixin Zeng child->url.lpszHostName = g_memdup (winhttp_file->url.lpszHostName, (winhttp_file->url.dwHostNameLength+1)*2); 392faeeebab030eee4610b41303754e44dc89239450Shixin Zeng child->url.lpszUserName = g_memdup (winhttp_file->url.lpszUserName, (winhttp_file->url.dwUserNameLength+1)*2); 393faeeebab030eee4610b41303754e44dc89239450Shixin Zeng child->url.lpszPassword = g_memdup (winhttp_file->url.lpszPassword, (winhttp_file->url.dwPasswordLength+1)*2); 3947261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child->url.lpszUrlPath = wnew_path; 395faeeebab030eee4610b41303754e44dc89239450Shixin Zeng child->url.dwUrlPathLength = wcslen (wnew_path); 3967261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child->url.lpszExtraInfo = NULL; 3977261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist child->url.dwExtraInfoLength = 0; 398d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 3997261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return (GFile *) child; 4007261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 4017261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 4027261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFile * 4037261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_get_child_for_display_name (GFile *file, 4047261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *display_name, 4057261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 4067261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 4077261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *new_file; 4087261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist char *basename; 4097261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 4107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist basename = g_locale_from_utf8 (display_name, -1, NULL, NULL, NULL); 4117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (basename == NULL) 4127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 413d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_FILENAME, 4147261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist _("Invalid filename %s"), display_name); 4157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 4167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 4177261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 4187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist new_file = g_file_get_child (file, basename); 4197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist g_free (basename); 420d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 4217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return new_file; 4227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 4237261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 4247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFile * 4257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_set_display_name (GFile *file, 4267261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *display_name, 4277261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 4287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 4297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 430d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, 4317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist _("Operation not supported")); 4327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 4337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 4347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 4357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 436d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqviststatic time_t 437d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvistmktime_utc (SYSTEMTIME *t) 438d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist{ 439d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist time_t retval; 440d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 441d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist static const gint days_before[] = 442d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 443d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 444d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist }; 445d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 446d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (t->wMonth < 1 || t->wMonth > 12) 447d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return (time_t) -1; 448d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 449d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval = (t->wYear - 1970) * 365; 450d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval += (t->wYear - 1968) / 4; 451d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval += days_before[t->wMonth-1] + t->wDay - 1; 452d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 453d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (t->wYear % 4 == 0 && t->wMonth < 3) 454d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval -= 1; 455d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 456d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist retval = ((((retval * 24) + t->wHour) * 60) + t->wMinute) * 60 + t->wSecond; 457d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 458d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return retval; 459d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist} 460d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 461d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqviststatic GFileInfo * 462d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvistg_winhttp_file_query_info (GFile *file, 463d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist const char *attributes, 464d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GFileQueryInfoFlags flags, 465d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GCancellable *cancellable, 466d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GError **error) 467d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist{ 468d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 469d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist HINTERNET connection, request; 470d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist const wchar_t *accept_types[] = 471d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 472d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist L"*/*", 473d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL, 474d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist }; 475d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GFileInfo *info; 476d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GFileAttributeMatcher *matcher; 477d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist char *basename; 478d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist wchar_t *content_length; 479d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist wchar_t *content_type; 480d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist SYSTEMTIME last_modified; 481d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist DWORD last_modified_len; 482d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 4832f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect 484d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist (G_WINHTTP_VFS (winhttp_file->vfs)->session, 485d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist winhttp_file->url.lpszHostName, 486d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist winhttp_file->url.nPort, 487d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 0); 488d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 489d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (connection == NULL) 490d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 491d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); 492d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 493d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return NULL; 494d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 495d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 4962f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest 497d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist (connection, 498d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist L"HEAD", 499d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist winhttp_file->url.lpszUrlPath, 500d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL, 501d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist WINHTTP_NO_REFERER, 502d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist accept_types, 503d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); 504d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 505d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (request == NULL) 506d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 507d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "HEAD request"); 508d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 509d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return NULL; 510d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 511d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 5122f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (!G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpSendRequest 513d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist (request, 514d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL, 0, 515d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL, 0, 516d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 0, 517d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 0)) 518d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 519d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "HEAD request"); 520d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 521d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return NULL; 522d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 523d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 524d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (!_g_winhttp_response (winhttp_file->vfs, request, error, "HEAD request")) 525d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return NULL; 526d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 527d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist matcher = g_file_attribute_matcher_new (attributes); 528d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist info = g_file_info_new (); 529d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_attribute_mask (info, matcher); 530d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 531d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist basename = g_winhttp_file_get_basename (file); 532d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_name (info, basename); 533d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_free (basename); 534d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 535d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist content_length = NULL; 536d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (_g_winhttp_query_header (winhttp_file->vfs, 537d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist request, 538d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist "HEAD request", 539d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist WINHTTP_QUERY_CONTENT_LENGTH, 540d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist &content_length, 541d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL)) 542d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 543d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist gint64 cl; 544d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist int n; 545d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 546d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (swscanf (content_length, L"%I64d%n", &cl, &n) == 1 && 547d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist n == wcslen (content_length)) 548d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_size (info, cl); 549d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 550d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_free (content_length); 551d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 552d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 553d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (matcher == NULL) 554d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return info; 555d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 556d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist content_type = NULL; 557d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (_g_winhttp_query_header (winhttp_file->vfs, 558d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist request, 559d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist "HEAD request", 560d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist WINHTTP_QUERY_CONTENT_TYPE, 561d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist &content_type, 562d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL)) 563d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 564d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist char *ct = g_utf16_to_utf8 (content_type, -1, NULL, NULL, NULL); 565d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 566d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (ct != NULL) 567d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 568d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist char *p = strchr (ct, ';'); 569d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 570d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist if (p != NULL) 571d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 572d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist char *tmp = g_strndup (ct, p - ct); 573d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 574d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_content_type (info, tmp); 575d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_free (tmp); 576d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 577d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist else 578d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_content_type (info, ct); 579d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 580d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 581d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_free (ct); 582d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 583d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 584d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist last_modified_len = sizeof (last_modified); 5852f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist if (G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpQueryHeaders 586d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist (request, 587d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist WINHTTP_QUERY_LAST_MODIFIED | WINHTTP_QUERY_FLAG_SYSTEMTIME, 588d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL, 589d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist &last_modified, 590d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist &last_modified_len, 591d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist NULL) && 592d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist last_modified_len == sizeof (last_modified) && 593d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist /* Don't bother comparing to the exact Y2038 moment */ 594d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist last_modified.wYear >= 1970 && 595d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist last_modified.wYear < 2038) 596d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist { 597d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist GTimeVal tv; 598d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 599d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist tv.tv_sec = mktime_utc (&last_modified); 600d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist tv.tv_usec = last_modified.wMilliseconds * 1000; 601d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 602d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_info_set_modification_time (info, &tv); 603d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist } 604d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 605d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_file_attribute_matcher_unref (matcher); 606d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 607d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist return info; 608d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist} 609d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist 6107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFileInputStream * 6117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_read (GFile *file, 6127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 6137261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 6147261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 6157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 6167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist HINTERNET connection, request; 6177261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const wchar_t *accept_types[] = 6187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 6197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist L"*/*", 6207261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist NULL, 6217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist }; 6227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6232f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect 6247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist (G_WINHTTP_VFS (winhttp_file->vfs)->session, 6257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.lpszHostName, 6267261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.nPort, 6277261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 0); 6287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (connection == NULL) 6307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 631d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); 6327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 6347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 6357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6362f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist request = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpOpenRequest 6377261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist (connection, 6387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist L"GET", 6397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.lpszUrlPath, 6407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist NULL, 6417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist WINHTTP_NO_REFERER, 6427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist accept_types, 6437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.nScheme == INTERNET_SCHEME_HTTPS ? WINHTTP_FLAG_SECURE : 0); 6447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (request == NULL) 6467261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 647d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "GET request"); 6487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6497261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 6507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 6517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return _g_winhttp_file_input_stream_new (winhttp_file, connection, request); 6537261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 6547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFileOutputStream * 6567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_create (GFile *file, 6577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileCreateFlags flags, 6587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 6597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 6607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 6617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GWinHttpFile *winhttp_file = G_WINHTTP_FILE (file); 662d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist HINTERNET connection; 6637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6642f575b95ac14f34d0f17efd5de69f8d1b37e7bffTor Lillqvist connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect 6657261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist (G_WINHTTP_VFS (winhttp_file->vfs)->session, 6667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.lpszHostName, 6677261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist winhttp_file->url.nPort, 6687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 0); 6697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist if (connection == NULL) 6717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist { 672d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist _g_winhttp_set_error (error, GetLastError (), "HTTP connection"); 6737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 6757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist } 6767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return _g_winhttp_file_output_stream_new (winhttp_file, connection); 6787261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 6797261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6807261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#if 0 6817261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6827261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic GFileOutputStream * 6837261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_replace (GFile *file, 6847261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist const char *etag, 6857261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gboolean make_backup, 6867261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileCreateFlags flags, 6877261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 6887261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 6897261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 6907261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* FIXME: Implement */ 6917261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6927261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return NULL; 6937261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 6947261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6957261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 6967261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 6977261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_delete (GFile *file, 6987261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 6997261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 7007261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 7017261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* FIXME: Implement */ 7027261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7037261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return FALSE; 7047261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 7057261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7067261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 7077261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_make_directory (GFile *file, 7087261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 7097261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 7107261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 7117261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* FIXME: Implement */ 7127261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7137261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return FALSE; 7147261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 7157261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7167261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 7177261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_copy (GFile *source, 7187261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *destination, 7197261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileCopyFlags flags, 7207261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 7217261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileProgressCallback progress_callback, 7227261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gpointer progress_callback_data, 7237261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 7247261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 7257261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* Fall back to default copy?? */ 726d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, 727d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist "Copy not supported"); 7287261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7297261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return FALSE; 7307261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 7317261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7327261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic gboolean 7337261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_move (GFile *source, 7347261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFile *destination, 7357261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileCopyFlags flags, 7367261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GCancellable *cancellable, 7377261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GFileProgressCallback progress_callback, 7387261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist gpointer progress_callback_data, 7397261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist GError **error) 7407261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 7417261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist /* FIXME: Implement */ 7427261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7437261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist return FALSE; 7447261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 7457261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7467261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#endif 7477261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist 7487261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqviststatic void 7497261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvistg_winhttp_file_file_iface_init (GFileIface *iface) 7507261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist{ 7517261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->dup = g_winhttp_file_dup; 7527261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->hash = g_winhttp_file_hash; 7537261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->equal = g_winhttp_file_equal; 7547261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->is_native = g_winhttp_file_is_native; 7557261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->has_uri_scheme = g_winhttp_file_has_uri_scheme; 7567261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_uri_scheme = g_winhttp_file_get_uri_scheme; 7577261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_basename = g_winhttp_file_get_basename; 7587261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_path = g_winhttp_file_get_path; 7597261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_uri = g_winhttp_file_get_uri; 7607261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_parse_name = g_winhttp_file_get_parse_name; 7617261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_parent = g_winhttp_file_get_parent; 7627261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->prefix_matches = g_winhttp_file_prefix_matches; 7637261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_relative_path = g_winhttp_file_get_relative_path; 7647261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->resolve_relative_path = g_winhttp_file_resolve_relative_path; 7657261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->get_child_for_display_name = g_winhttp_file_get_child_for_display_name; 7667261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->set_display_name = g_winhttp_file_set_display_name; 767d5863830ad51529cb4f5f82016790ea8c03110e9Tor Lillqvist iface->query_info = g_winhttp_file_query_info; 7687261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->read_fn = g_winhttp_file_read; 7697261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->create = g_winhttp_file_create; 7707261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#if 0 7717261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->replace = g_winhttp_file_replace; 7727261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->delete_file = g_winhttp_file_delete; 7737261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->make_directory = g_winhttp_file_make_directory; 7747261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->copy = g_winhttp_file_copy; 7757261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist iface->move = g_winhttp_file_move; 7767261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist#endif 7777261372b4534336fbe12d4d5f2aef9460d50bde3Tor Lillqvist} 778