Import Wininet from Wine
Added: vendor/wine/dlls/wininet/
Added: vendor/wine/dlls/wininet/current/
Added: vendor/wine/dlls/wininet/current/.cvsignore
Added: vendor/wine/dlls/wininet/current/Makefile.in
Added: vendor/wine/dlls/wininet/current/cookie.c
Added: vendor/wine/dlls/wininet/current/dialogs.c
Added: vendor/wine/dlls/wininet/current/ftp.c
Added: vendor/wine/dlls/wininet/current/gopher.c
Added: vendor/wine/dlls/wininet/current/http.c
Added: vendor/wine/dlls/wininet/current/internet.c
Added: vendor/wine/dlls/wininet/current/internet.h
Added: vendor/wine/dlls/wininet/current/netconnection.c
Added: vendor/wine/dlls/wininet/current/resource.h
Added: vendor/wine/dlls/wininet/current/rsrc.rc
Added: vendor/wine/dlls/wininet/current/tests/
Added: vendor/wine/dlls/wininet/current/tests/.cvsignore
Added: vendor/wine/dlls/wininet/current/tests/Makefile.in
Added: vendor/wine/dlls/wininet/current/tests/generated.c
Added: vendor/wine/dlls/wininet/current/tests/http.c
Added: vendor/wine/dlls/wininet/current/tests/wininet_test.h
Added: vendor/wine/dlls/wininet/current/urlcache.c
Added: vendor/wine/dlls/wininet/current/utility.c
Added: vendor/wine/dlls/wininet/current/version.rc
Added: vendor/wine/dlls/wininet/current/wininet.spec
Added: vendor/wine/dlls/wininet/current/wininet_Cs.rc
Added: vendor/wine/dlls/wininet/current/wininet_De.rc
Added: vendor/wine/dlls/wininet/current/wininet_En.rc
Added: vendor/wine/dlls/wininet/current/wininet_Es.rc
Added: vendor/wine/dlls/wininet/current/wininet_Fr.rc
Added: vendor/wine/dlls/wininet/current/wininet_It.rc
Added: vendor/wine/dlls/wininet/current/wininet_Ja.rc
Added: vendor/wine/dlls/wininet/current/wininet_Nl.rc
Added: vendor/wine/dlls/wininet/current/wininet_Pt.rc
Added: vendor/wine/dlls/wininet/current/wininet_Ru.rc
Added: vendor/wine/dlls/wininet/current/wininet_Si.rc
Added: vendor/wine/dlls/wininet/current/wininet_main.c
_____
Added: vendor/wine/dlls/wininet/current/.cvsignore
--- vendor/wine/dlls/wininet/current/.cvsignore 2005-04-18 22:11:46 UTC
(rev 14686)
+++ vendor/wine/dlls/wininet/current/.cvsignore 2005-04-19 04:44:23 UTC
(rev 14687)
@@ -0,0 +1,5 @@
+Makefile
+rsrc.res
+version.res
+wininet.dll.dbg.c
+wininet.spec.def
_____
Added: vendor/wine/dlls/wininet/current/Makefile.in
--- vendor/wine/dlls/wininet/current/Makefile.in 2005-04-18
22:11:46 UTC (rev 14686)
+++ vendor/wine/dlls/wininet/current/Makefile.in 2005-04-19
04:44:23 UTC (rev 14687)
@@ -0,0 +1,30 @@
+EXTRADEFS = -D_WINX32_
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = wininet.dll
+IMPORTS = mpr shlwapi shell32 user32 advapi32 kernel32 ntdll
+EXTRALIBS = $(LIBUNICODE) @SOCKETLIBS@
+
+C_SRCS = \
+ cookie.c \
+ dialogs.c \
+ ftp.c \
+ gopher.c \
+ http.c \
+ internet.c \
+ netconnection.c \
+ urlcache.c \
+ utility.c \
+ wininet_main.c
+
+RC_SRCS = \
+ rsrc.rc \
+ version.rc
+
+SUBDIRS = tests
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
_____
Added: vendor/wine/dlls/wininet/current/cookie.c
--- vendor/wine/dlls/wininet/current/cookie.c 2005-04-18 22:11:46 UTC
(rev 14686)
+++ vendor/wine/dlls/wininet/current/cookie.c 2005-04-19 04:44:23 UTC
(rev 14687)
@@ -0,0 +1,501 @@
+/*
+ * Wininet - cookie handling stuff
+ *
+ * Copyright 2002 TransGaming Technologies Inc.
+ *
+ * David Hammerton
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include "windef.h"
+#include "winbase.h"
+#include "wininet.h"
+#include "winerror.h"
+
+#include "wine/debug.h"
+#include "internet.h"
+
+#include "wine/list.h"
+
+#define RESPONSE_TIMEOUT 30 /* FROM internet.c */
+
+
+WINE_DEFAULT_DEBUG_CHANNEL(wininet);
+
+/* FIXME
+ * Cookies are currently memory only.
+ * Cookies are NOT THREAD SAFE
+ * Cookies could use A LOT OF MEMORY. We need some kind of memory
management here!
+ * Cookies should care about the expiry time
+ */
+
+typedef struct _cookie_domain cookie_domain;
+typedef struct _cookie cookie;
+
+struct _cookie
+{
+ struct list entry;
+
+ struct _cookie_domain *parent;
+
+ LPWSTR lpCookieName;
+ LPWSTR lpCookieData;
+ time_t expiry; /* FIXME: not used */
+};
+
+struct _cookie_domain
+{
+ struct list entry;
+
+ LPWSTR lpCookieDomain;
+ LPWSTR lpCookiePath;
+ struct list cookie_list;
+};
+
+static struct list domain_list = LIST_INIT(domain_list);
+
+static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name,
LPCWSTR data);
+static cookie *COOKIE_findCookie(cookie_domain *domain, LPCWSTR
lpszCookieName);
+static void COOKIE_deleteCookie(cookie *deadCookie, BOOL deleteDomain);
+static cookie_domain *COOKIE_addDomain(LPCWSTR domain, LPCWSTR path);
+static void COOKIE_deleteDomain(cookie_domain *deadDomain);
+
+
+/* adds a cookie to the domain */
+static cookie *COOKIE_addCookie(cookie_domain *domain, LPCWSTR name,
LPCWSTR data)
+{
+ cookie *newCookie = HeapAlloc(GetProcessHeap(), 0, sizeof(cookie));
+
+ list_init(&newCookie->entry);
+ newCookie->lpCookieName = NULL;
+ newCookie->lpCookieData = NULL;
+
+ if (name)
+ {
+ newCookie->lpCookieName = HeapAlloc(GetProcessHeap(), 0,
(strlenW(name) + 1)*sizeof(WCHAR));
+ lstrcpyW(newCookie->lpCookieName, name);
+ }
+ if (data)
+ {
+ newCookie->lpCookieData = HeapAlloc(GetProcessHeap(), 0,
(strlenW(data) + 1)*sizeof(WCHAR));
+ lstrcpyW(newCookie->lpCookieData, data);
+ }
+
+ TRACE("added cookie %p (data is %s)\n", newCookie, debugstr_w(data)
);
+
+ list_add_tail(&domain->cookie_list, &newCookie->entry);
+ newCookie->parent = domain;
+ return newCookie;
+}
+
+
+/* finds a cookie in the domain matching the cookie name */
+static cookie *COOKIE_findCookie(cookie_domain *domain, LPCWSTR
lpszCookieName)
+{
+ struct list * cursor;
+ TRACE("(%p, %s)\n", domain, debugstr_w(lpszCookieName));
+
+ LIST_FOR_EACH(cursor, &domain->cookie_list)
+ {
+ cookie *searchCookie = LIST_ENTRY(cursor, cookie, entry);
+ BOOL candidate = TRUE;
+ if (candidate && lpszCookieName)
+ {
+ if (candidate && !searchCookie->lpCookieName)
+ candidate = FALSE;
+ if (candidate && strcmpW(lpszCookieName,
searchCookie->lpCookieName) != 0)
+ candidate = FALSE;
+ }
+ if (candidate)
+ return searchCookie;
+ }
+ return NULL;
+}
+
+/* removes a cookie from the list, if its the last cookie we also
remove the domain */
+static void COOKIE_deleteCookie(cookie *deadCookie, BOOL deleteDomain)
+{
+ HeapFree(GetProcessHeap(), 0, deadCookie->lpCookieName);
+ HeapFree(GetProcessHeap(), 0, deadCookie->lpCookieData);
+ list_remove(&deadCookie->entry);
+
+ /* special case: last cookie, lets remove the domain to save memory
*/
+ if (list_empty(&deadCookie->parent->cookie_list) && deleteDomain)
+ COOKIE_deleteDomain(deadCookie->parent);
+ HeapFree(GetProcessHeap(), 0, deadCookie);
+}
+
+/* allocates a domain and adds it to the end */
+static cookie_domain *COOKIE_addDomain(LPCWSTR domain, LPCWSTR path)
+{
+ cookie_domain *newDomain = HeapAlloc(GetProcessHeap(), 0,
sizeof(cookie_domain));
+
+ list_init(&newDomain->entry);
+ list_init(&newDomain->cookie_list);
+ newDomain->lpCookieDomain = NULL;
+ newDomain->lpCookiePath = NULL;
+
+ if (domain)
+ {
+ newDomain->lpCookieDomain = HeapAlloc(GetProcessHeap(), 0,
(strlenW(domain) + 1)*sizeof(WCHAR));
+ strcpyW(newDomain->lpCookieDomain, domain);
+ }
+ if (path)
+ {
+ newDomain->lpCookiePath = HeapAlloc(GetProcessHeap(), 0,
(strlenW(path) + 1)*sizeof(WCHAR));
+ lstrcpyW(newDomain->lpCookiePath, path);
+ }
+
+ list_add_tail(&domain_list, &newDomain->entry);
+
+ TRACE("Adding domain: %p\n", newDomain);
+ return newDomain;
+}
+
+static void COOKIE_crackUrlSimple(LPCWSTR lpszUrl, LPWSTR hostName, int
hostNameLen, LPWSTR path, int pathLen)
+{
+ URL_COMPONENTSW UrlComponents;
+
+ UrlComponents.lpszExtraInfo = NULL;
+ UrlComponents.lpszPassword = NULL;
+ UrlComponents.lpszScheme = NULL;
+ UrlComponents.lpszUrlPath = path;
+ UrlComponents.lpszUserName = NULL;
+ UrlComponents.lpszHostName = hostName;
+ UrlComponents.dwHostNameLength = hostNameLen;
+ UrlComponents.dwUrlPathLength = pathLen;
+
+ InternetCrackUrlW(lpszUrl, 0, 0, &UrlComponents);
+}
+
+/* match a domain. domain must match if the domain is not NULL. path
must match if the path is not NULL */
+static BOOL COOKIE_matchDomain(LPCWSTR lpszCookieDomain, LPCWSTR
lpszCookiePath,
+ cookie_domain *searchDomain, BOOL
allow_partial)
+{
+ TRACE("searching on domain %p\n", searchDomain);
+ if (lpszCookieDomain)
+ {
+ if (!searchDomain->lpCookieDomain)
+ return FALSE;
+
+ TRACE("comparing domain %s with %s\n",
+ debugstr_w(lpszCookieDomain),
+ debugstr_w(searchDomain->lpCookieDomain));
+
+ if (allow_partial && !strstrW(lpszCookieDomain,
searchDomain->lpCookieDomain))
+ return FALSE;
+ else if (!allow_partial && lstrcmpW(lpszCookieDomain,
searchDomain->lpCookieDomain) != 0)
+ return FALSE;
+ }
+ if (lpszCookiePath)
+ {
+ TRACE("comparing paths: %s with %s\n",
debugstr_w(lpszCookiePath), debugstr_w(searchDomain->lpCookiePath));
+ if (!searchDomain->lpCookiePath)
+ return FALSE;
+ if (strcmpW(lpszCookiePath, searchDomain->lpCookiePath))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* remove a domain from the list and delete it */
+static void COOKIE_deleteDomain(cookie_domain *deadDomain)
+{
+ struct list * cursor;
+ while ((cursor = list_tail(&deadDomain->cookie_list)))
+ {
+ COOKIE_deleteCookie(LIST_ENTRY(cursor, cookie, entry), FALSE);
+ list_remove(cursor);
+ }
+
+ HeapFree(GetProcessHeap(), 0, deadDomain->lpCookieDomain);
+ HeapFree(GetProcessHeap(), 0, deadDomain->lpCookiePath);
+
+ list_remove(&deadDomain->entry);
+
+ HeapFree(GetProcessHeap(), 0, deadDomain);
+}
+
+/**********************************************************************
*
+ * InternetGetCookieW (WININET.@)
+ *
+ * Retrieve cookie from the specified url
+ *
+ * It should be noted that on windows the lpszCookieName parameter is
"not implemented".
+ * So it won't be implemented here.
+ *
+ * RETURNS
+ * TRUE on success
+ * FALSE on failure
+ *
+ */
+BOOL WINAPI InternetGetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
+ LPWSTR lpCookieData, LPDWORD lpdwSize)
+{
+ struct list * cursor;
+ int cnt = 0, domain_count = 0;
+ int cookie_count = 0;
+ WCHAR hostName[2048], path[2048];
+
+ TRACE("(%s, %s, %p, %p)\n",
debugstr_w(lpszUrl),debugstr_w(lpszCookieName),
+ lpCookieData, lpdwSize);
+
+ COOKIE_crackUrlSimple(lpszUrl, hostName,
sizeof(hostName)/sizeof(hostName[0]), path,
sizeof(path)/sizeof(path[0]));
+
+ LIST_FOR_EACH(cursor, &domain_list)
+ {
+ cookie_domain *cookiesDomain = LIST_ENTRY(cursor,
cookie_domain, entry);
+ if (COOKIE_matchDomain(hostName, NULL /* FIXME: path */,
cookiesDomain, TRUE))
+ {
+ struct list * cursor;
+ domain_count++;
+ TRACE("found domain %p\n", cookiesDomain);
+
+ LIST_FOR_EACH(cursor, &cookiesDomain->cookie_list)
+ {
+ cookie *thisCookie = LIST_ENTRY(cursor, cookie, entry);
+ if (lpCookieData == NULL) /* return the size of the
buffer required to lpdwSize */
+ {
+ if (cookie_count != 0)
+ cnt += 2; /* '; ' */
+ cnt += strlenW(thisCookie->lpCookieName);
+ cnt += 1; /* = */
+ cnt += strlenW(thisCookie->lpCookieData);
+ }
+ else
+ {
+ static const WCHAR szsc[] = { ';',' ',0 };
+ static const WCHAR szpseq[] = {
'%','s','=','%','s',0 };
+ if (cookie_count != 0)
+ cnt += snprintfW(lpCookieData + cnt, *lpdwSize
- cnt, szsc);
+ cnt += snprintfW(lpCookieData + cnt, *lpdwSize -
cnt, szpseq,
+ thisCookie->lpCookieName,
+ thisCookie->lpCookieData);
+ TRACE("Cookie: %s=%s\n",
debugstr_w(thisCookie->lpCookieName),
debugstr_w(thisCookie->lpCookieData));
+ }
+ cookie_count++;
+ }
+ }
+ }
+ if (lpCookieData == NULL)
+ {
+ cnt += 1; /* NULL */
+ *lpdwSize = cnt*sizeof(WCHAR);
+ TRACE("returning\n");
+ return TRUE;
+ }
+
+ if (!domain_count)
+ return FALSE;
+
+ *lpdwSize = (cnt + 1)*sizeof(WCHAR);
+
+ TRACE("Returning %i (from %i domains): %s\n", cnt, domain_count,
+ debugstr_w(lpCookieData));
+
+ return (cnt ? TRUE : FALSE);
+}
+
+
+/**********************************************************************
*
+ * InternetGetCookieA (WININET.@)
+ *
+ * Retrieve cookie from the specified url
+ *
+ * RETURNS
+ * TRUE on success
+ * FALSE on failure
+ *
+ */
+BOOL WINAPI InternetGetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
+ LPSTR lpCookieData, LPDWORD lpdwSize)
+{
+ DWORD len;
+ LPWSTR szCookieData = NULL, szUrl = NULL, szCookieName = NULL;
+ BOOL r;
+
+ TRACE("(%s,%s,%p)\n", debugstr_a(lpszUrl),
debugstr_a(lpszCookieName),
+ lpCookieData);
+
+ if( lpszUrl )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, lpszUrl, -1, NULL, 0 );
+ szUrl = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, lpszUrl, -1, szUrl, len );
+ }
+
+ if( lpszCookieName )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, lpszCookieName, -1, NULL,
0 );
+ szCookieName = HeapAlloc( GetProcessHeap(), 0, len *
sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, lpszCookieName, -1,
szCookieName, len );
+ }
+
+ r = InternetGetCookieW( szUrl, szCookieName, NULL, &len );
+ if( r )
+ {
+ szCookieData = HeapAlloc( GetProcessHeap(), 0, len *
sizeof(WCHAR) );
+ if( !szCookieData )
+ return FALSE;
+
+ r = InternetGetCookieW( szUrl, szCookieName, szCookieData, &len
);
+
+ *lpdwSize = WideCharToMultiByte( CP_ACP, 0, szCookieData, len,
+ lpCookieData, *lpdwSize, NULL, NULL );
+ }
+
+ HeapFree( GetProcessHeap(), 0, szCookieData );
+ HeapFree( GetProcessHeap(), 0, szCookieName );
+ HeapFree( GetProcessHeap(), 0, szUrl );
+
+ return r;
+}
+
+
+/**********************************************************************
*
+ * InternetSetCookieW (WININET.@)
+ *
+ * Sets cookie for the specified url
+ *
+ * RETURNS
+ * TRUE on success
+ * FALSE on failure
+ *
+ */
+BOOL WINAPI InternetSetCookieW(LPCWSTR lpszUrl, LPCWSTR lpszCookieName,
+ LPCWSTR lpCookieData)
+{
+ cookie_domain *thisCookieDomain = NULL;
+ cookie *thisCookie;
+ WCHAR hostName[2048], path[2048];
+ struct list * cursor;
+
+ TRACE("(%s,%s,%s)\n", debugstr_w(lpszUrl),
+ debugstr_w(lpszCookieName), debugstr_w(lpCookieData));
+
+ if (!lpCookieData || !strlenW(lpCookieData))
+ {
+ TRACE("no cookie data, not adding\n");
+ return FALSE;
+ }
+ if (!lpszCookieName)
+ {
+ /* some apps (or is it us??) try to add a cookie with no cookie
name, but
+ * the cookie data in the form of name=data. */
+ /* FIXME, probably a bug here, for now I don't care */
+ WCHAR *ourCookieName, *ourCookieData;
+ int ourCookieNameSize;
+ BOOL ret;
+
+ if (!(ourCookieData = strchrW(lpCookieData, '=')))
+ {
+ TRACE("something terribly wrong with cookie data %s\n",
+ debugstr_w(ourCookieData));
+ return FALSE;
+ }
+ ourCookieNameSize = ourCookieData - lpCookieData;
+ ourCookieData += 1;
+ ourCookieName = HeapAlloc(GetProcessHeap(), 0,
+ (ourCookieNameSize + 1)*sizeof(WCHAR));
+ memcpy(ourCookieName, ourCookieData, ourCookieNameSize *
sizeof(WCHAR));
+ ourCookieName[ourCookieNameSize] = '\0';
+ TRACE("setting (hacked) cookie of %s, %s\n",
+ debugstr_w(ourCookieName), debugstr_w(ourCookieData));
+ ret = InternetSetCookieW(lpszUrl, ourCookieName,
ourCookieData);
+ HeapFree(GetProcessHeap(), 0, ourCookieName);
+ return ret;
+ }
+
+ COOKIE_crackUrlSimple(lpszUrl, hostName,
sizeof(hostName)/sizeof(hostName[0]), path,
sizeof(path)/sizeof(path[0]));
+
+ LIST_FOR_EACH(cursor, &domain_list)
+ {
+ thisCookieDomain = LIST_ENTRY(cursor, cookie_domain, entry);
+ if (COOKIE_matchDomain(hostName, NULL /* FIXME: path */,
thisCookieDomain, FALSE))
+ break;
+ thisCookieDomain = NULL;
+ }
+ if (!thisCookieDomain)
+ thisCookieDomain = COOKIE_addDomain(hostName, path);
+
+ if ((thisCookie = COOKIE_findCookie(thisCookieDomain,
lpszCookieName)))
+ COOKIE_deleteCookie(thisCookie, FALSE);
+
+ thisCookie = COOKIE_addCookie(thisCookieDomain, lpszCookieName,
lpCookieData);
+ return TRUE;
+}
+
+
+/**********************************************************************
*
+ * InternetSetCookieA (WININET.@)
+ *
+ * Sets cookie for the specified url
+ *
+ * RETURNS
+ * TRUE on success
+ * FALSE on failure
+ *
+ */
+BOOL WINAPI InternetSetCookieA(LPCSTR lpszUrl, LPCSTR lpszCookieName,
+ LPCSTR lpCookieData)
+{
+ DWORD len;
+ LPWSTR szCookieData = NULL, szUrl = NULL, szCookieName = NULL;
+ BOOL r;
+
+ TRACE("(%s,%s,%s)\n", debugstr_a(lpszUrl),
+ debugstr_a(lpszCookieName), debugstr_a(lpCookieData));
+
+ if( lpszUrl )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, lpszUrl, -1, NULL, 0 );
+ szUrl = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, lpszUrl, -1, szUrl, len );
+ }
+
+ if( lpszCookieName )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, lpszCookieName, -1, NULL,
0 );
+ szCookieName = HeapAlloc( GetProcessHeap(), 0, len *
sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, lpszCookieName, -1,
szCookieName, len );
+ }
+
+ if( lpCookieData )
+ {
+ len = MultiByteToWideChar( CP_ACP, 0, lpCookieData, -1, NULL, 0
);
+ szCookieData = HeapAlloc( GetProcessHeap(), 0, len *
sizeof(WCHAR) );
+ MultiByteToWideChar( CP_ACP, 0, lpCookieData, -1, szCookieData,
len );
+ }
+
+ r = InternetSetCookieW( szUrl, szCookieName, szCookieData );
+
+ HeapFree( GetProcessHeap(), 0, szCookieData );
+ HeapFree( GetProcessHeap(), 0, szCookieName );
+ HeapFree( GetProcessHeap(), 0, szUrl );
+
+ return r;
+}
_____
Added: vendor/wine/dlls/wininet/current/dialogs.c
--- vendor/wine/dlls/wininet/current/dialogs.c 2005-04-18 22:11:46 UTC
(rev 14686)
+++ vendor/wine/dlls/wininet/current/dialogs.c 2005-04-19 04:44:23 UTC
(rev 14687)
@@ -0,0 +1,384 @@
+/*
+ * Wininet
+ *
+ * Copyright 2003 Mike McCormack for CodeWeavers Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "wininet.h"
+#include "winnetwk.h"
+#include "winnls.h"
+#include "wine/debug.h"
+#include "winerror.h"
+#define NO_SHLWAPI_STREAM
+#include "shlwapi.h"
+
+#include "internet.h"
+
+#include "wine/unicode.h"
+
+#include "resource.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wininet);
+
+struct WININET_ErrorDlgParams
+{
+ HWND hWnd;
+ HINTERNET hRequest;
+ DWORD dwError;
+ DWORD dwFlags;
+ LPVOID* lppvData;
+};
+
+/**********************************************************************
*
+ * WININET_GetProxyServer
+ *
+ * Determine the name of the proxy server the request is using
+ */
+static BOOL WININET_GetProxyServer( HINTERNET hRequest, LPWSTR szBuf,
DWORD sz )
+{
+ LPWININETHTTPREQW lpwhr;
+ LPWININETHTTPSESSIONW lpwhs = NULL;
+ LPWININETAPPINFOW hIC = NULL;
+ LPWSTR p;
+
+ lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hRequest );
+ if (NULL == lpwhr)
+ return FALSE;
+
+ lpwhs = (LPWININETHTTPSESSIONW) lpwhr->hdr.lpwhparent;
+ if (NULL == lpwhs)
+ return FALSE;
+
+ hIC = (LPWININETAPPINFOW) lpwhs->hdr.lpwhparent;
+ if (NULL == hIC)
+ return FALSE;
+
+ lstrcpynW(szBuf, hIC->lpszProxy, sz);
+
+ /* FIXME: perhaps it would be better to use InternetCrackUrl here
*/
+ p = strchrW(szBuf, ':');
+ if(*p)
+ *p = 0;
+
+ return TRUE;
+}
+
+/**********************************************************************
*
+ * WININET_GetAuthRealm
+ *
+ * Determine the name of the (basic) Authentication realm
+ */
+static BOOL WININET_GetAuthRealm( HINTERNET hRequest, LPWSTR szBuf,
DWORD sz )
+{
+ LPWSTR p, q;
+ DWORD index;
+ static const WCHAR szRealm[] = {
'r','e','a','l','m','=',0 };
+
+ /* extract the Realm from the proxy response and show it */
+ index = 0;
+ if( !HttpQueryInfoW( hRequest, HTTP_QUERY_PROXY_AUTHENTICATE,
+ szBuf, &sz, &index) )
+ return FALSE;
+
+ /*
+ * FIXME: maybe we should check that we're
+ * dealing with 'Basic' Authentication
+ */
+ p = strchrW( szBuf, ' ' );
+ if( p && !strncmpW( p+1, szRealm, strlenW(szRealm) ) )
+ {
+ /* remove quotes */
+ p += 7;
+ if( *p == '"' )
+ {
+ p++;
+ q = strrchrW( p, '"' );
+ if( q )
+ *q = 0;
+ }
+ }
+
+ strcpyW( szBuf, p );
+
+ return TRUE;
+}
+
+/**********************************************************************
*
+ * WININET_GetSetPassword
+ */
+static BOOL WININET_GetSetPassword( HWND hdlg, LPCWSTR szServer,
+ LPCWSTR szRealm, BOOL bSet )
+{
+ WCHAR szResource[0x80], szUserPass[0x40];
+ LPWSTR p;
+ HWND hUserItem, hPassItem;
+ DWORD r, dwMagic = 19;
+ UINT r_len, u_len;
+ WORD sz;
+ static const WCHAR szColon[] = { ':',0 };
+ static const WCHAR szbs[] = { '/', 0 };
+
+ hUserItem = GetDlgItem( hdlg, IDC_USERNAME );
+ hPassItem = GetDlgItem( hdlg, IDC_PASSWORD );
+
+ /* now try fetch the username and password */
+ lstrcpyW( szResource, szServer);
+ lstrcatW( szResource, szbs);
+ lstrcatW( szResource, szRealm);
+
+ /*
+ * WNetCachePassword is only concerned with the length
+ * of the data stored (which we tell it) and it does
+ * not use strlen() internally so we can add WCHAR data
+ * instead of ASCII data and get it back the same way.
+ */
+ if( bSet )
+ {
+ szUserPass[0] = 0;
+ GetWindowTextW( hUserItem, szUserPass,
+ (sizeof szUserPass-1)/sizeof(WCHAR) );
+ lstrcatW(szUserPass, szColon);
+ u_len = strlenW( szUserPass );
+ GetWindowTextW( hPassItem, szUserPass+u_len,
+ (sizeof szUserPass)/sizeof(WCHAR)-u_len );
+
+ r_len = (strlenW( szResource ) + 1)*sizeof(WCHAR);
+ u_len = (strlenW( szUserPass ) + 1)*sizeof(WCHAR);
+ r = WNetCachePassword( (CHAR*)szResource, r_len,
+ (CHAR*)szUserPass, u_len, dwMagic, 0 );
+
+ return ( r == WN_SUCCESS );
+ }
+
+ sz = sizeof szUserPass;
+ r_len = (strlenW( szResource ) + 1)*sizeof(WCHAR);
+ r = WNetGetCachedPassword( (CHAR*)szResource, r_len,
+ (CHAR*)szUserPass, &sz, dwMagic );
+ if( r != WN_SUCCESS )
+ return FALSE;
+
+ p = strchrW( szUserPass, ':' );
+ if( p )
+ {
+ *p = 0;
+ SetWindowTextW( hUserItem, szUserPass );
+ SetWindowTextW( hPassItem, p+1 );
+ }
+
+ return TRUE;
+}
+
+/**********************************************************************
*
+ * WININET_SetProxyAuthorization
+ */
+static BOOL WININET_SetProxyAuthorization( HINTERNET hRequest,
+ LPWSTR username, LPWSTR
password )
+{
+ LPWININETHTTPREQW lpwhr;
+ LPWININETHTTPSESSIONW lpwhs;
+ LPWININETAPPINFOW hIC;
+ LPWSTR p;
+
+ lpwhr = (LPWININETHTTPREQW) WININET_GetObject( hRequest );
+ if( !lpwhr )
+ return FALSE;
+
+ lpwhs = (LPWININETHTTPSESSIONW) lpwhr->hdr.lpwhparent;
+ if (NULL == lpwhs || lpwhs->hdr.htype != WH_HHTTPSESSION)
+ {
+ INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+ return FALSE;
+ }
+
+ hIC = (LPWININETAPPINFOW) lpwhs->hdr.lpwhparent;
+
+ p = HeapAlloc( GetProcessHeap(), 0, (strlenW( username ) +
1)*sizeof(WCHAR) );
+ if( !p )
+ return FALSE;
+
+ lstrcpyW( p, username );
+ hIC->lpszProxyUsername = p;
+
+ p = HeapAlloc( GetProcessHeap(), 0, (strlenW( password ) +
1)*sizeof(WCHAR) );
+ if( !p )
+ return FALSE;
+
+ lstrcpyW( p, password );
+ hIC->lpszProxyPassword = p;
+
+ return TRUE;
+}
+
+/**********************************************************************
*
+ * WININET_ProxyPasswordDialog
+ */
+static INT_PTR WINAPI WININET_ProxyPasswordDialog(
+ HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ HWND hitem;
+ struct WININET_ErrorDlgParams *params;
+ WCHAR szRealm[0x80], szServer[0x80];
+
+ if( uMsg == WM_INITDIALOG )
+ {
+ TRACE("WM_INITDIALOG (%08lx)\n", lParam);
+
+ /* save the parameter list */
+ params = (struct WININET_ErrorDlgParams*) lParam;
+ SetWindowLongPtrW( hdlg, GWLP_USERDATA, lParam );
+
+ /* extract the Realm from the proxy response and show it */
+ if( WININET_GetAuthRealm( params->hRequest,
+ szRealm, sizeof
szRealm/sizeof(WCHAR)) )
+ {
+ hitem = GetDlgItem( hdlg, IDC_REALM );
+ SetWindowTextW( hitem, szRealm );
+ }
+
+ /* extract the name of the proxy server */
+ if( WININET_GetProxyServer( params->hRequest,
+ szServer, sizeof
szServer/sizeof(WCHAR)) )
+ {
+ hitem = GetDlgItem( hdlg, IDC_PROXY );
+ SetWindowTextW( hitem, szServer );
+ }
+
+ WININET_GetSetPassword( hdlg, szServer, szRealm, FALSE );
+
+ return TRUE;
+ }
+
+ params = (struct WININET_ErrorDlgParams*)
+ GetWindowLongPtrW( hdlg, GWLP_USERDATA );
+
+ switch( uMsg )
+ {
+ case WM_COMMAND:
+ if( wParam == IDOK )
+ {
+ WCHAR username[0x20], password[0x20];
+
+ username[0] = 0;
+ hitem = GetDlgItem( hdlg, IDC_USERNAME );
+ if( hitem )
+ GetWindowTextW( hitem, username, sizeof
username/sizeof(WCHAR) );
+
+ password[0] = 0;
+ hitem = GetDlgItem( hdlg, IDC_PASSWORD );
+ if( hitem )
+ GetWindowTextW( hitem, password, sizeof
password/sizeof(WCHAR) );
+
+ hitem = GetDlgItem( hdlg, IDC_SAVEPASSWORD );
+ if( hitem &&
+ SendMessageW( hitem, BM_GETSTATE, 0, 0 ) &&
+ WININET_GetAuthRealm( params->hRequest,
+ szRealm, sizeof
szRealm/sizeof(WCHAR)) &&
+ WININET_GetProxyServer( params->hRequest,
+ szServer, sizeof
szServer/sizeof(WCHAR)) )
+ {
+ WININET_GetSetPassword( hdlg, szServer, szRealm, TRUE
);
+ }
+ WININET_SetProxyAuthorization( params->hRequest, username,
password );
+
+ EndDialog( hdlg, ERROR_INTERNET_FORCE_RETRY );
+ return TRUE;
+ }
+ if( wParam == IDCANCEL )
+ {
+ EndDialog( hdlg, 0 );
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+/**********************************************************************
*
+ * WININET_GetConnectionStatus
+ */
+static INT WININET_GetConnectionStatus( HINTERNET hRequest )
+{
+ WCHAR szStatus[0x20];
+ DWORD sz, index, dwStatus;
+
+ TRACE("%p\n", hRequest );
+
+ sz = sizeof szStatus;
+ index = 0;
+ if( !HttpQueryInfoW( hRequest, HTTP_QUERY_STATUS_CODE,
+ szStatus, &sz, &index))
+ return -1;
+ dwStatus = atoiW( szStatus );
+
+ TRACE("request %p status = %ld\n", hRequest, dwStatus );
+
+ return dwStatus;
+}
+
+
+/**********************************************************************
*
+ * InternetErrorDlg
+ */
+DWORD WINAPI InternetErrorDlg(HWND hWnd, HINTERNET hRequest,
+ DWORD dwError, DWORD dwFlags, LPVOID* lppvData)
+{
+ struct WININET_ErrorDlgParams params;
+ HMODULE hwininet = GetModuleHandleA( "wininet.dll" );
+ INT dwStatus;
+
+ TRACE("%p %p %ld %08lx %p\n", hWnd, hRequest, dwError, dwFlags,
lppvData);
+
+ params.hWnd = hWnd;
+ params.hRequest = hRequest;
+ params.dwError = dwError;
+ params.dwFlags = dwFlags;
+ params.lppvData = lppvData;
+
+ switch( dwError )
+ {
+ case ERROR_SUCCESS:
+ if( !(dwFlags & FLAGS_ERROR_UI_FILTER_FOR_ERRORS ) )
+ return 0;
+ dwStatus = WININET_GetConnectionStatus( hRequest );
+ if( HTTP_STATUS_PROXY_AUTH_REQ != dwStatus )
+ return ERROR_SUCCESS;
+ return DialogBoxParamW( hwininet, MAKEINTRESOURCEW(
IDD_PROXYDLG ),
+ hWnd, WININET_ProxyPasswordDialog, (LPARAM) ¶ms
);
+
+ case ERROR_INTERNET_INCORRECT_PASSWORD:
+ return DialogBoxParamW( hwininet, MAKEINTRESOURCEW(
IDD_PROXYDLG ),
+ hWnd, WININET_ProxyPasswordDialog, (LPARAM) ¶ms
);
+
+ case ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR:
+ case ERROR_INTERNET_INVALID_CA:
+ case ERROR_INTERNET_POST_IS_NON_SECURE:
+ case ERROR_INTERNET_SEC_CERT_CN_INVALID:
+ case ERROR_INTERNET_SEC_CERT_DATE_INVALID:
+ FIXME("Need to display dialog for error %ld\n", dwError);
+ return ERROR_SUCCESS;
+ }
+ return ERROR_INVALID_PARAMETER;
+}
_____
Added: vendor/wine/dlls/wininet/current/ftp.c
--- vendor/wine/dlls/wininet/current/ftp.c 2005-04-18 22:11:46 UTC
(rev 14686)
+++ vendor/wine/dlls/wininet/current/ftp.c 2005-04-19 04:44:23 UTC
(rev 14687)
@@ -0,0 +1,3141 @@
+/*
+ * WININET - Ftp implementation
+ *
+ * Copyright 1999 Corel Corporation
+ * Copyright 2004 Mike McCormack for CodeWeavers
+ * Copyright 2004 Kevin Koltzau
+ *
+ * Ulrich Czekalla
+ * Noureddine Jemmali
+ *
+ * Copyright 2000 Andreas Mohr
+ * Copyright 2002 Jaco Greeff
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <errno.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#ifdef HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <time.h>
+#include <assert.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "wininet.h"
+#include "winnls.h"
+#include "winerror.h"
+#include "winreg.h"
+#include "winternl.h"
[truncated at 1000 lines; 16095 more skipped]