Hans Leidekker : winhttp: Implement WinHttpConnect.
Alexandre Julliard
julliard at winehq.org
Tue Aug 19 08:46:57 CDT 2008
Module: wine
Branch: master
Commit: 770ee20461ba7a262f291a7c295ec2dfbd32333d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=770ee20461ba7a262f291a7c295ec2dfbd32333d
Author: Hans Leidekker <hans at meelstraat.net>
Date: Fri Aug 15 14:42:28 2008 +0200
winhttp: Implement WinHttpConnect.
---
dlls/winhttp/main.c | 13 ------
dlls/winhttp/session.c | 81 ++++++++++++++++++++++++++++++++++++++++
dlls/winhttp/tests/winhttp.c | 18 +++-----
dlls/winhttp/winhttp_private.h | 21 ++++++++++
4 files changed, 109 insertions(+), 24 deletions(-)
diff --git a/dlls/winhttp/main.c b/dlls/winhttp/main.c
index e5c904b..6133590 100644
--- a/dlls/winhttp/main.c
+++ b/dlls/winhttp/main.c
@@ -117,19 +117,6 @@ BOOL WINAPI WinHttpGetIEProxyConfigForCurrentUser(WINHTTP_CURRENT_USER_IE_PROXY_
}
/***********************************************************************
- * WinHttpConnect (winhttp.@)
- */
-
-HINTERNET WINAPI WinHttpConnect (HINTERNET hSession, LPCWSTR pwszServerName,
- INTERNET_PORT nServerPort, DWORD dwReserved)
-{
- FIXME("(%s, %d, 0x%x): stub\n", debugstr_w(pwszServerName), nServerPort, dwReserved);
-
- SetLastError(ERROR_NOT_SUPPORTED);
- return NULL;
-}
-
-/***********************************************************************
* WinHttpOpenRequest (winhttp.@)
*/
HINTERNET WINAPI WinHttpOpenRequest (HINTERNET hConnect, LPCWSTR pwszVerb, LPCWSTR pwszObjectName,
diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c
index 76a878e..8f8ac2f 100644
--- a/dlls/winhttp/session.c
+++ b/dlls/winhttp/session.c
@@ -102,6 +102,87 @@ end:
}
/***********************************************************************
+ * connect_destroy (internal)
+ */
+static void connect_destroy( object_header_t *hdr )
+{
+ connect_t *connect = (connect_t *)hdr;
+
+ TRACE("%p\n", connect);
+
+ release_object( &connect->session->hdr );
+
+ heap_free( connect->hostname );
+ heap_free( connect->servername );
+ heap_free( connect->username );
+ heap_free( connect->password );
+ heap_free( connect );
+}
+
+static const object_vtbl_t connect_vtbl =
+{
+ connect_destroy,
+ NULL,
+ NULL
+};
+
+/***********************************************************************
+ * WinHttpConnect (winhttp.@)
+ */
+HINTERNET WINAPI WinHttpConnect( HINTERNET hsession, LPCWSTR server, INTERNET_PORT port, DWORD reserved )
+{
+ connect_t *connect;
+ session_t *session;
+ HINTERNET hconnect = NULL;
+
+ TRACE("%p, %s, %u, %x\n", hsession, debugstr_w(server), port, reserved);
+
+ if (!server)
+ {
+ set_last_error( ERROR_INVALID_PARAMETER );
+ return NULL;
+ }
+ if (!(session = (session_t *)grab_object( hsession )))
+ {
+ set_last_error( ERROR_INVALID_HANDLE );
+ return NULL;
+ }
+ if (session->hdr.type != WINHTTP_HANDLE_TYPE_SESSION)
+ {
+ release_object( &session->hdr );
+ set_last_error( ERROR_WINHTTP_INCORRECT_HANDLE_TYPE );
+ return NULL;
+ }
+ if (!(connect = heap_alloc_zero( sizeof(connect_t) )))
+ {
+ release_object( &session->hdr );
+ return NULL;
+ }
+ connect->hdr.type = WINHTTP_HANDLE_TYPE_CONNECT;
+ connect->hdr.vtbl = &connect_vtbl;
+ connect->hdr.refs = 1;
+ connect->hdr.flags = session->hdr.flags;
+ connect->hdr.callback = session->hdr.callback;
+ connect->hdr.notify_mask = session->hdr.notify_mask;
+
+ addref_object( &session->hdr );
+ connect->session = session;
+ list_add_head( &session->hdr.children, &connect->hdr.entry );
+
+ if (server && !(connect->hostname = strdupW( server ))) goto end;
+ connect->hostport = port;
+
+ if (!(hconnect = alloc_handle( &connect->hdr ))) goto end;
+ connect->hdr.handle = hconnect;
+
+end:
+ release_object( &connect->hdr );
+
+ TRACE("returning %p\n", hconnect);
+ return hconnect;
+}
+
+/***********************************************************************
* WinHttpCloseHandle (winhttp.@)
*/
BOOL WINAPI WinHttpCloseHandle( HINTERNET handle )
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 2c7143e..5f6ce7c 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -42,13 +42,11 @@ static void test_OpenRequest (void)
SetLastError(0xdeadbeef);
connection = WinHttpConnect(session, NULL, INTERNET_DEFAULT_HTTP_PORT, 0);
ok (connection == NULL, "WinHttpConnect succeeded in opening connection to NULL server argument.\n");
- todo_wine ok(GetLastError() == ERROR_INVALID_PARAMETER,
- "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError());
+ ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError());
/* Test with a valid server name */
connection = WinHttpConnect (session, test_server, INTERNET_DEFAULT_HTTP_PORT, 0);
- todo_wine ok(connection != NULL,
- "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
+ ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
request = WinHttpOpenRequest(connection, NULL, NULL, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
@@ -67,7 +65,7 @@ static void test_OpenRequest (void)
done:
ret = WinHttpCloseHandle(connection);
- todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
+ ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
ret = WinHttpCloseHandle(session);
ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
@@ -101,8 +99,7 @@ static void test_SendRequest (void)
ok(session != NULL, "WinHttpOpen failed to open session.\n");
connection = WinHttpConnect (session, test_site, INTERNET_DEFAULT_HTTP_PORT, 0);
- todo_wine ok(connection != NULL,
- "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
+ ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
request = WinHttpOpenRequest(connection, test_verb, test_file, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_BYPASS_PROXY_CACHE);
@@ -140,7 +137,7 @@ static void test_SendRequest (void)
todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
done:
ret = WinHttpCloseHandle(connection);
- todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
+ ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
ret = WinHttpCloseHandle(session);
ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
}
@@ -230,8 +227,7 @@ static void test_WinHttpAddHeaders(void)
ok(session != NULL, "WinHttpOpen failed to open session.\n");
connection = WinHttpConnect (session, test_site, INTERNET_DEFAULT_HTTP_PORT, 0);
- todo_wine ok(connection != NULL,
- "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
+ ok(connection != NULL, "WinHttpConnect failed to open a connection, error: %u.\n", GetLastError());
request = WinHttpOpenRequest(connection, test_verb, test_file, NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
@@ -547,7 +543,7 @@ static void test_WinHttpAddHeaders(void)
todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing request, got %d.\n", ret);
done:
ret = WinHttpCloseHandle(connection);
- todo_wine ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
+ ok(ret == TRUE, "WinHttpCloseHandle failed on closing connection, got %d.\n", ret);
ret = WinHttpCloseHandle(session);
ok(ret == TRUE, "WinHttpCloseHandle failed on closing session, got %d.\n", ret);
diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h
index 1d40fcb..74398a6 100644
--- a/dlls/winhttp/winhttp_private.h
+++ b/dlls/winhttp/winhttp_private.h
@@ -19,9 +19,17 @@
#ifndef _WINE_WINHTTP_PRIVATE_H_
#define _WINE_WINHTTP_PRIVATE_H_
+#ifndef __WINE_CONFIG_H
+# error You must include config.h to use this header
+#endif
+
#include "wine/list.h"
#include "wine/unicode.h"
+#ifdef HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
typedef struct _object_header_t object_header_t;
typedef struct
@@ -57,6 +65,19 @@ typedef struct
LPWSTR proxy_password;
} session_t;
+typedef struct
+{
+ object_header_t hdr;
+ session_t *session;
+ LPWSTR hostname; /* final destination of the request */
+ LPWSTR servername; /* name of the server we directly connect to */
+ LPWSTR username;
+ LPWSTR password;
+ INTERNET_PORT hostport;
+ INTERNET_PORT serverport;
+ struct sockaddr_in sockaddr;
+} connect_t;
+
object_header_t *addref_object( object_header_t * );
object_header_t *grab_object( HINTERNET );
void release_object( object_header_t * );
More information about the wine-cvs
mailing list