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