From 0f117e568ff084b45f5be4b250dd0d5b53c4419b Mon Sep 17 00:00:00 2001 From: Misha Koshelev Date: Thu, 23 Aug 2007 00:06:00 -0500 Subject: [PATCH] wininet: Separate connection closing from object destruction. --- dlls/wininet/ftp.c | 6 ++++++ dlls/wininet/http.c | 10 ++++++---- dlls/wininet/internet.c | 6 ++++++ dlls/wininet/internet.h | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c index d9291c25ec0..b0c36f94500 100644 --- a/dlls/wininet/ftp.c +++ b/dlls/wininet/ftp.c @@ -1121,6 +1121,7 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, lpwh->hdr.dwFlags = dwFlags; lpwh->hdr.dwContext = dwContext; lpwh->hdr.dwRefCount = 1; + lpwh->hdr.close_connection = NULL; lpwh->hdr.destroy = FTP_CloseFileTransferHandle; lpwh->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB; lpwh->nDataSocket = nDataSocket; @@ -1897,6 +1898,10 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, lpwfs->hdr.dwContext = dwContext; lpwfs->hdr.dwInternalFlags = dwInternalFlags; lpwfs->hdr.dwRefCount = 1; + /* FIXME: Native sends INTERNET_STATUS_CLOSING_CONNECTION and + * INTERNET_STATUS_CONNECTION_CLOSED, need an equivalent FTP_CloseConnection + * function */ + lpwfs->hdr.close_connection = NULL; lpwfs->hdr.destroy = FTP_CloseSessionHandle; lpwfs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB; lpwfs->download_in_progress = NULL; @@ -3006,6 +3011,7 @@ static HINTERNET FTP_ReceiveFileList(LPWININETFTPSESSIONW lpwfs, INT nSocket, LP lpwfn->hdr.htype = WH_HFTPFINDNEXT; lpwfn->hdr.dwContext = dwContext; lpwfn->hdr.dwRefCount = 1; + lpwfn->hdr.close_connection = NULL; lpwfn->hdr.destroy = FTP_CloseFindNextHandle; lpwfn->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB; lpwfn->index = 1; /* Next index is 1 since we return index 0 */ diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index b676f48100c..08be913a1e8 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -103,6 +103,7 @@ struct HttpAuthInfo BOOL finished; /* finished authenticating */ }; +static void HTTP_CloseConnection(LPWININETHANDLEHEADER hdr); static void HTTP_CloseHTTPRequestHandle(LPWININETHANDLEHEADER hdr); static void HTTP_CloseHTTPSessionHandle(LPWININETHANDLEHEADER hdr); static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr); @@ -1363,6 +1364,7 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, lpwhr->hdr.dwFlags = dwFlags; lpwhr->hdr.dwContext = dwContext; lpwhr->hdr.dwRefCount = 1; + lpwhr->hdr.close_connection = HTTP_CloseConnection; lpwhr->hdr.destroy = HTTP_CloseHTTPRequestHandle; lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB; lpwhr->hdr.dwInternalFlags = lpwhs->hdr.dwInternalFlags & INET_CALLBACKW; @@ -2816,6 +2818,7 @@ HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, lpwhs->hdr.dwContext = dwContext; lpwhs->hdr.dwInternalFlags = dwInternalFlags | (hIC->hdr.dwInternalFlags & INET_CALLBACKW); lpwhs->hdr.dwRefCount = 1; + lpwhs->hdr.close_connection = NULL; lpwhs->hdr.destroy = HTTP_CloseHTTPSessionHandle; lpwhs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB; @@ -3319,8 +3322,9 @@ static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR v * Close socket connection * */ -static VOID HTTP_CloseConnection(LPWININETHTTPREQW lpwhr) +static void HTTP_CloseConnection(LPWININETHANDLEHEADER hdr) { + LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW) hdr; LPWININETHTTPSESSIONW lpwhs = NULL; LPWININETAPPINFOW hIC = NULL; @@ -3380,7 +3384,7 @@ BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) &dwBufferSize, NULL) || strcmpiW(szConnectionResponse, szKeepAlive)) { - HTTP_CloseConnection(lpwhr); + HTTP_CloseConnection(&lpwhr->hdr); } /* FIXME: store data in the URL cache here */ @@ -3403,8 +3407,6 @@ static void HTTP_CloseHTTPRequestHandle(LPWININETHANDLEHEADER hdr) WININET_Release(&lpwhr->lpHttpSession->hdr); - HTTP_CloseConnection(lpwhr); - HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath); HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb); HeapFree(GetProcessHeap(), 0, lpwhr->lpszRawHeaders); diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c index d24eed34157..4886f7c113e 100644 --- a/dlls/wininet/internet.c +++ b/dlls/wininet/internet.c @@ -173,6 +173,11 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info ) TRACE( "object %p refcount = %d\n", info, info->dwRefCount ); if( !info->dwRefCount ) { + if ( info->close_connection ) + { + TRACE( "closing connection %p\n", info); + info->close_connection( info ); + } TRACE( "destroying object %p\n", info); info->destroy( info ); } @@ -477,6 +482,7 @@ HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, lpwai->hdr.htype = WH_HINIT; lpwai->hdr.dwFlags = dwFlags; lpwai->hdr.dwRefCount = 1; + lpwai->hdr.close_connection = NULL; lpwai->hdr.destroy = INTERNET_CloseHandle; lpwai->dwAccessType = dwAccessType; lpwai->lpszProxyUsername = NULL; diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h index d388b5bd405..42ade48353f 100644 --- a/dlls/wininet/internet.h +++ b/dlls/wininet/internet.h @@ -146,6 +146,7 @@ struct _WININETHANDLEHEADER DWORD dwError; DWORD dwInternalFlags; DWORD dwRefCount; + WININET_object_function close_connection; WININET_object_function destroy; INTERNET_STATUS_CALLBACK lpfnStatusCB; };