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