[patch] InternetOpenUrlA (wininet)
Bernhard Rosenkraenzer
bero at redhat.de
Tue Mar 19 15:00:11 CST 2002
Hi,
a couple of installer applications keep complaining about wine's lack of
InternetOpenUrlA(); here's a first try at implementing it.
I don't have Windoze; can't verify this actually does the same thing it
does there. It does what MSDN claims it should do.
LLaP
bero
--
This message is provided to you under the terms outlined at
http://www.bero.org/terms.html
-------------- next part --------------
--- wine/dlls/wininet/internet.c.internetopenurl Mon Mar 11 20:28:17 2002
+++ wine/dlls/wininet/internet.c Sun Mar 17 14:07:01 2002
@@ -22,7 +22,10 @@
#include "config.h"
+#define MAXHOSTNAME 100 /* from http.c */
+
#include <string.h>
+#include <stdio.h>
#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
@@ -517,7 +520,7 @@
*
* Break up URL into its components
*
- * TODO: Hadnle dwFlags
+ * TODO: Handle dwFlags
*
* RETURNS
* TRUE on success
@@ -1165,7 +1168,80 @@
return rc;
}
-
+/**********************************************************
+ * InternetOpenUrlA (WININET.@)
+ *
+ * Opens an URL
+ *
+ * RETURNS
+ * handle of connection or NULL on failure
+ */
+HINTERNET WINAPI InternetOpenUrlA(HINTERNET hInternet, LPCSTR lpszUrl, LPCSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD dwContext)
+{
+ URL_COMPONENTSA urlComponents;
+ char protocol[32], hostName[MAXHOSTNAME], userName[1024], password[1024], path[2048], extra[1024];
+ HINTERNET client = NULL, client1 = NULL;
+ urlComponents.dwStructSize = sizeof(URL_COMPONENTSA);
+ urlComponents.lpszScheme = protocol;
+ urlComponents.dwSchemeLength = 32;
+ urlComponents.lpszHostName = hostName;
+ urlComponents.dwHostNameLength = MAXHOSTNAME;
+ urlComponents.lpszUserName = userName;
+ urlComponents.dwUserNameLength = 1024;
+ urlComponents.lpszPassword = password;
+ urlComponents.dwPasswordLength = 1024;
+ urlComponents.lpszUrlPath = path;
+ urlComponents.dwUrlPathLength = 2048;
+ urlComponents.lpszExtraInfo = extra;
+ urlComponents.dwExtraInfoLength = 1024;
+ if(!InternetCrackUrlA(lpszUrl, strlen(lpszUrl), 0, &urlComponents))
+ return NULL;
+ switch(urlComponents.nScheme) {
+ case INTERNET_SCHEME_FTP:
+ if(urlComponents.nPort == 0)
+ urlComponents.nPort = INTERNET_DEFAULT_FTP_PORT;
+ client = InternetConnectA(hInternet, hostName, urlComponents.nPort, userName, password, INTERNET_SERVICE_FTP, dwFlags, dwContext);
+ return FtpOpenFileA(client, path, GENERIC_READ, dwFlags, dwContext);
+ break;
+ case INTERNET_SCHEME_HTTP:
+ case INTERNET_SCHEME_HTTPS:
+ {
+ LPCSTR accept[2] = { "*/*", NULL };
+ char *hostreq=(char*)malloc(strlen(hostName)+9);
+ sprintf(hostreq, "Host: %s\r\n", hostName);
+ if(urlComponents.nPort == 0) {
+ if(urlComponents.nScheme == INTERNET_SCHEME_HTTP)
+ urlComponents.nPort = INTERNET_DEFAULT_HTTP_PORT;
+ else
+ urlComponents.nPort = INTERNET_DEFAULT_HTTPS_PORT;
+ }
+ client = InternetConnectA(hInternet, hostName, urlComponents.nPort, userName, password, INTERNET_SERVICE_HTTP, dwFlags, dwContext);
+ if(client == NULL)
+ return NULL;
+ client1 = HttpOpenRequestA(hInternet, NULL, path, NULL, NULL, accept, dwFlags, dwContext);
+ if(client1 == NULL) {
+ InternetCloseHandle(client);
+ return NULL;
+ }
+ HttpAddRequestHeadersA(client1, lpszHeaders, dwHeadersLength, HTTP_ADDREQ_FLAG_ADD);
+ HttpAddRequestHeadersA(client1, hostreq, -1L, HTTP_ADDREQ_FLAG_ADD_IF_NEW);
+ if(!HttpSendRequestA(client1, NULL, 0, NULL, 0)) {
+ InternetCloseHandle(client1);
+ InternetCloseHandle(client);
+ return NULL;
+ }
+ return client1;
+ break;
+ }
+ case INTERNET_SCHEME_GOPHER:
+ /* gopher doesn't seem to be implemented in wine, but it's supposed
+ * to be supported by InternetOpenUrlA. */
+ default:
+ return NULL;
+ }
+ if(client != NULL)
+ InternetCloseHandle(client);
+}
/***********************************************************************
* INTERNET_WriteDataToStream (internal)
@@ -1586,4 +1662,3 @@
return NULL;
}
}
-
--- wine/dlls/wininet/wininet.spec.internetopenurl Mon Mar 11 20:28:17 2002
+++ wine/dlls/wininet/wininet.spec Sun Mar 17 13:36:08 2002
@@ -123,7 +123,7 @@
@ stub InternetLockRequestFile
@ stdcall InternetOpenA(str long str str long) InternetOpenA
@ stub InternetOpenServerPushParse
-@ stub InternetOpenUrlA
+@ stdcall InternetOpenUrlA(ptr str str long long long) InternetOpenUrlA
@ stub InternetOpenUrlW
@ stub InternetOpenW
@ stub InternetQueryDataAvailable
More information about the wine-devel
mailing list