Commit 5a535d6b authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

wininet: Moved handle destructor to vtbl.

parent 928c9f09
...@@ -122,10 +122,7 @@ static const CHAR *const szFtpCommands[] = { ...@@ -122,10 +122,7 @@ static const CHAR *const szFtpCommands[] = {
static const CHAR szMonths[] = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC"; static const CHAR szMonths[] = "JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC";
static const WCHAR szNoAccount[] = {'n','o','a','c','c','o','u','n','t','\0'}; static const WCHAR szNoAccount[] = {'n','o','a','c','c','o','u','n','t','\0'};
static void FTP_CloseFileTransferHandle(LPWININETHANDLEHEADER hdr);
static void FTP_CloseSessionHandle(LPWININETHANDLEHEADER hdr);
static void FTP_CloseConnection(LPWININETHANDLEHEADER hdr); static void FTP_CloseConnection(LPWININETHANDLEHEADER hdr);
static void FTP_CloseFindNextHandle(LPWININETHANDLEHEADER hdr);
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam,
INTERNET_STATUS_CALLBACK lpfnStatusCB, LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext); INTERNET_STATUS_CALLBACK lpfnStatusCB, LPWININETHANDLEHEADER hdr, DWORD_PTR dwContext);
static BOOL FTP_SendStore(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, DWORD dwType); static BOOL FTP_SendStore(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, DWORD dwType);
...@@ -1131,6 +1128,39 @@ lend: ...@@ -1131,6 +1128,39 @@ lend:
/*********************************************************************** /***********************************************************************
* FTPFILE_Destroy(internal)
*
* Closes the file transfer handle. This also 'cleans' the data queue of
* the 'transfer complete' message (this is a bit of a hack though :-/ )
*
*/
static void FTPFILE_Destroy(WININETHANDLEHEADER *hdr)
{
LPWININETFTPFILE lpwh = (LPWININETFTPFILE) hdr;
LPWININETFTPSESSIONW lpwfs = lpwh->lpFtpSession;
INT nResCode;
TRACE("\n");
WININET_Release(&lpwh->lpFtpSession->hdr);
if (!lpwh->session_deleted)
lpwfs->download_in_progress = NULL;
if (lpwh->nDataSocket != -1)
closesocket(lpwh->nDataSocket);
nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
if (nResCode > 0 && nResCode != 226) WARN("server reports failed transfer\n");
HeapFree(GetProcessHeap(), 0, lpwh);
}
static const HANDLEHEADERVtbl FTPFILEVtbl = {
FTPFILE_Destroy
};
/***********************************************************************
* FTP_FtpOpenFileW (Internal) * FTP_FtpOpenFileW (Internal)
* *
* Open a remote file for writing or reading * Open a remote file for writing or reading
...@@ -1171,11 +1201,11 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, ...@@ -1171,11 +1201,11 @@ HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs,
{ {
lpwh = HeapAlloc(GetProcessHeap(), 0, sizeof(WININETFTPFILE)); lpwh = HeapAlloc(GetProcessHeap(), 0, sizeof(WININETFTPFILE));
lpwh->hdr.htype = WH_HFILE; lpwh->hdr.htype = WH_HFILE;
lpwh->hdr.vtbl = &FTPFILEVtbl;
lpwh->hdr.dwFlags = dwFlags; lpwh->hdr.dwFlags = dwFlags;
lpwh->hdr.dwContext = dwContext; lpwh->hdr.dwContext = dwContext;
lpwh->hdr.dwRefCount = 1; lpwh->hdr.dwRefCount = 1;
lpwh->hdr.close_connection = NULL; lpwh->hdr.close_connection = NULL;
lpwh->hdr.destroy = FTP_CloseFileTransferHandle;
lpwh->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB; lpwh->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB;
lpwh->nDataSocket = nDataSocket; lpwh->nDataSocket = nDataSocket;
lpwh->session_deleted = FALSE; lpwh->session_deleted = FALSE;
...@@ -1998,6 +2028,31 @@ lend: ...@@ -1998,6 +2028,31 @@ lend:
return r; return r;
} }
/***********************************************************************
* FTPSESSION_Destroy (internal)
*
* Deallocate session handle
*/
static void FTPSESSION_Destroy(WININETHANDLEHEADER *hdr)
{
LPWININETFTPSESSIONW lpwfs = (LPWININETFTPSESSIONW) hdr;
TRACE("\n");
WININET_Release(&lpwfs->lpAppInfo->hdr);
HeapFree(GetProcessHeap(), 0, lpwfs->lpszPassword);
HeapFree(GetProcessHeap(), 0, lpwfs->lpszUserName);
HeapFree(GetProcessHeap(), 0, lpwfs);
}
static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
FTPSESSION_Destroy
};
/*********************************************************************** /***********************************************************************
* FTP_Connect (internal) * FTP_Connect (internal)
* *
...@@ -2061,12 +2116,12 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, ...@@ -2061,12 +2116,12 @@ HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
nServerPort = INTERNET_DEFAULT_FTP_PORT; nServerPort = INTERNET_DEFAULT_FTP_PORT;
lpwfs->hdr.htype = WH_HFTPSESSION; lpwfs->hdr.htype = WH_HFTPSESSION;
lpwfs->hdr.vtbl = &FTPSESSIONVtbl;
lpwfs->hdr.dwFlags = dwFlags; lpwfs->hdr.dwFlags = dwFlags;
lpwfs->hdr.dwContext = dwContext; lpwfs->hdr.dwContext = dwContext;
lpwfs->hdr.dwInternalFlags = dwInternalFlags; lpwfs->hdr.dwInternalFlags = dwInternalFlags;
lpwfs->hdr.dwRefCount = 1; lpwfs->hdr.dwRefCount = 1;
lpwfs->hdr.close_connection = FTP_CloseConnection; lpwfs->hdr.close_connection = FTP_CloseConnection;
lpwfs->hdr.destroy = FTP_CloseSessionHandle;
lpwfs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB; lpwfs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB;
lpwfs->download_in_progress = NULL; lpwfs->download_in_progress = NULL;
lpwfs->sndSocket = -1; lpwfs->sndSocket = -1;
...@@ -3022,25 +3077,6 @@ static void FTP_CloseConnection(LPWININETHANDLEHEADER hdr) ...@@ -3022,25 +3077,6 @@ static void FTP_CloseConnection(LPWININETHANDLEHEADER hdr)
/*********************************************************************** /***********************************************************************
* FTP_CloseSessionHandle (internal)
*
* Deallocate session handle
*/
static void FTP_CloseSessionHandle(LPWININETHANDLEHEADER hdr)
{
LPWININETFTPSESSIONW lpwfs = (LPWININETFTPSESSIONW) hdr;
TRACE("\n");
WININET_Release(&lpwfs->lpAppInfo->hdr);
HeapFree(GetProcessHeap(), 0, lpwfs->lpszPassword);
HeapFree(GetProcessHeap(), 0, lpwfs->lpszUserName);
HeapFree(GetProcessHeap(), 0, lpwfs);
}
/***********************************************************************
* FTP_FindNextFileW (Internal) * FTP_FindNextFileW (Internal)
* *
* Continues a file search from a previous call to FindFirstFile * Continues a file search from a previous call to FindFirstFile
...@@ -3097,16 +3133,11 @@ lend: ...@@ -3097,16 +3133,11 @@ lend:
/*********************************************************************** /***********************************************************************
* FTP_CloseFindNextHandle (internal) * FTPFINDNEXT_Destroy (internal)
* *
* Deallocate session handle * Deallocate session handle
*
* RETURNS
* TRUE on success
* FALSE on failure
*
*/ */
static void FTP_CloseFindNextHandle(LPWININETHANDLEHEADER hdr) static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr)
{ {
LPWININETFTPFINDNEXTW lpwfn = (LPWININETFTPFINDNEXTW) hdr; LPWININETFTPFINDNEXTW lpwfn = (LPWININETFTPFINDNEXTW) hdr;
DWORD i; DWORD i;
...@@ -3124,34 +3155,9 @@ static void FTP_CloseFindNextHandle(LPWININETHANDLEHEADER hdr) ...@@ -3124,34 +3155,9 @@ static void FTP_CloseFindNextHandle(LPWININETHANDLEHEADER hdr)
HeapFree(GetProcessHeap(), 0, lpwfn); HeapFree(GetProcessHeap(), 0, lpwfn);
} }
/*********************************************************************** static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
* FTP_CloseFileTransferHandle (internal) FTPFINDNEXT_Destroy
* };
* Closes the file transfer handle. This also 'cleans' the data queue of
* the 'transfer complete' message (this is a bit of a hack though :-/ )
*
*/
static void FTP_CloseFileTransferHandle(LPWININETHANDLEHEADER hdr)
{
LPWININETFTPFILE lpwh = (LPWININETFTPFILE) hdr;
LPWININETFTPSESSIONW lpwfs = lpwh->lpFtpSession;
INT nResCode;
TRACE("\n");
WININET_Release(&lpwh->lpFtpSession->hdr);
if (!lpwh->session_deleted)
lpwfs->download_in_progress = NULL;
if (lpwh->nDataSocket != -1)
closesocket(lpwh->nDataSocket);
nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
if (nResCode > 0 && nResCode != 226) WARN("server reports failed transfer\n");
HeapFree(GetProcessHeap(), 0, lpwh);
}
/*********************************************************************** /***********************************************************************
* FTP_ReceiveFileList (internal) * FTP_ReceiveFileList (internal)
...@@ -3182,10 +3188,10 @@ static HINTERNET FTP_ReceiveFileList(LPWININETFTPSESSIONW lpwfs, INT nSocket, LP ...@@ -3182,10 +3188,10 @@ static HINTERNET FTP_ReceiveFileList(LPWININETFTPSESSIONW lpwfs, INT nSocket, LP
if (lpwfn) if (lpwfn)
{ {
lpwfn->hdr.htype = WH_HFTPFINDNEXT; lpwfn->hdr.htype = WH_HFTPFINDNEXT;
lpwfn->hdr.vtbl = &FTPFINDNEXTVtbl;
lpwfn->hdr.dwContext = dwContext; lpwfn->hdr.dwContext = dwContext;
lpwfn->hdr.dwRefCount = 1; lpwfn->hdr.dwRefCount = 1;
lpwfn->hdr.close_connection = NULL; lpwfn->hdr.close_connection = NULL;
lpwfn->hdr.destroy = FTP_CloseFindNextHandle;
lpwfn->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB; lpwfn->hdr.lpfnStatusCB = lpwfs->hdr.lpfnStatusCB;
lpwfn->index = 1; /* Next index is 1 since we return index 0 */ lpwfn->index = 1; /* Next index is 1 since we return index 0 */
lpwfn->size = dwSize; lpwfn->size = dwSize;
......
...@@ -104,8 +104,6 @@ struct HttpAuthInfo ...@@ -104,8 +104,6 @@ struct HttpAuthInfo
}; };
static void HTTP_CloseConnection(LPWININETHANDLEHEADER hdr); static void HTTP_CloseConnection(LPWININETHANDLEHEADER hdr);
static void HTTP_CloseHTTPRequestHandle(LPWININETHANDLEHEADER hdr);
static void HTTP_CloseHTTPSessionHandle(LPWININETHANDLEHEADER hdr);
static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr); static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr);
static BOOL HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr); static BOOL HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr);
static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR value, DWORD dwModifier); static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR value, DWORD dwModifier);
...@@ -1311,6 +1309,50 @@ static BOOL HTTP_ResolveName(LPWININETHTTPREQW lpwhr) ...@@ -1311,6 +1309,50 @@ static BOOL HTTP_ResolveName(LPWININETHTTPREQW lpwhr)
return TRUE; return TRUE;
} }
/***********************************************************************
* HTTPREQ_Destroy (internal)
*
* Deallocate request handle
*
*/
static void HTTPREQ_Destroy(WININETHANDLEHEADER *hdr)
{
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW) hdr;
DWORD i;
TRACE("\n");
if(lpwhr->hCacheFile)
CloseHandle(lpwhr->hCacheFile);
if(lpwhr->lpszCacheFile) {
DeleteFileW(lpwhr->lpszCacheFile); /* FIXME */
HeapFree(GetProcessHeap(), 0, lpwhr->lpszCacheFile);
}
WININET_Release(&lpwhr->lpHttpSession->hdr);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszRawHeaders);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszVersion);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszStatusText);
for (i = 0; i < lpwhr->nCustHeaders; i++)
{
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[i].lpszField);
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[i].lpszValue);
}
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders);
HeapFree(GetProcessHeap(), 0, lpwhr);
}
static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_Destroy
};
/*********************************************************************** /***********************************************************************
* HTTP_HttpOpenRequestW (internal) * HTTP_HttpOpenRequestW (internal)
* *
...@@ -1348,11 +1390,11 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs, ...@@ -1348,11 +1390,11 @@ HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
goto lend; goto lend;
} }
lpwhr->hdr.htype = WH_HHTTPREQ; lpwhr->hdr.htype = WH_HHTTPREQ;
lpwhr->hdr.vtbl = &HTTPREQVtbl;
lpwhr->hdr.dwFlags = dwFlags; lpwhr->hdr.dwFlags = dwFlags;
lpwhr->hdr.dwContext = dwContext; lpwhr->hdr.dwContext = dwContext;
lpwhr->hdr.dwRefCount = 1; lpwhr->hdr.dwRefCount = 1;
lpwhr->hdr.close_connection = HTTP_CloseConnection; lpwhr->hdr.close_connection = HTTP_CloseConnection;
lpwhr->hdr.destroy = HTTP_CloseHTTPRequestHandle;
lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB; lpwhr->hdr.lpfnStatusCB = lpwhs->hdr.lpfnStatusCB;
lpwhr->hdr.dwInternalFlags = lpwhs->hdr.dwInternalFlags & INET_CALLBACKW; lpwhr->hdr.dwInternalFlags = lpwhs->hdr.dwInternalFlags & INET_CALLBACKW;
...@@ -2808,6 +2850,33 @@ lend: ...@@ -2808,6 +2850,33 @@ lend:
} }
/*********************************************************************** /***********************************************************************
* HTTPSESSION_Destroy (internal)
*
* Deallocate session handle
*
*/
static void HTTPSESSION_Destroy(WININETHANDLEHEADER *hdr)
{
LPWININETHTTPSESSIONW lpwhs = (LPWININETHTTPSESSIONW) hdr;
TRACE("%p\n", lpwhs);
WININET_Release(&lpwhs->lpAppInfo->hdr);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszHostName);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszPassword);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszUserName);
HeapFree(GetProcessHeap(), 0, lpwhs);
}
static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
HTTPSESSION_Destroy
};
/***********************************************************************
* HTTP_Connect (internal) * HTTP_Connect (internal)
* *
* Create http session handle * Create http session handle
...@@ -2848,12 +2917,12 @@ HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName, ...@@ -2848,12 +2917,12 @@ HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
*/ */
lpwhs->hdr.htype = WH_HHTTPSESSION; lpwhs->hdr.htype = WH_HHTTPSESSION;
lpwhs->hdr.vtbl = &HTTPSESSIONVtbl;
lpwhs->hdr.dwFlags = dwFlags; lpwhs->hdr.dwFlags = dwFlags;
lpwhs->hdr.dwContext = dwContext; lpwhs->hdr.dwContext = dwContext;
lpwhs->hdr.dwInternalFlags = dwInternalFlags | (hIC->hdr.dwInternalFlags & INET_CALLBACKW); lpwhs->hdr.dwInternalFlags = dwInternalFlags | (hIC->hdr.dwInternalFlags & INET_CALLBACKW);
lpwhs->hdr.dwRefCount = 1; lpwhs->hdr.dwRefCount = 1;
lpwhs->hdr.close_connection = NULL; lpwhs->hdr.close_connection = NULL;
lpwhs->hdr.destroy = HTTP_CloseHTTPSessionHandle;
lpwhs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB; lpwhs->hdr.lpfnStatusCB = hIC->hdr.lpfnStatusCB;
WININET_AddRef( &hIC->hdr ); WININET_AddRef( &hIC->hdr );
...@@ -3436,67 +3505,6 @@ BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr) ...@@ -3436,67 +3505,6 @@ BOOL HTTP_FinishedReading(LPWININETHTTPREQW lpwhr)
return TRUE; return TRUE;
} }
/***********************************************************************
* HTTP_CloseHTTPRequestHandle (internal)
*
* Deallocate request handle
*
*/
static void HTTP_CloseHTTPRequestHandle(LPWININETHANDLEHEADER hdr)
{
DWORD i;
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW) hdr;
TRACE("\n");
if(lpwhr->hCacheFile)
CloseHandle(lpwhr->hCacheFile);
if(lpwhr->lpszCacheFile) {
DeleteFileW(lpwhr->lpszCacheFile); /* FIXME */
HeapFree(GetProcessHeap(), 0, lpwhr->lpszCacheFile);
}
WININET_Release(&lpwhr->lpHttpSession->hdr);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszPath);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszVerb);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszRawHeaders);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszVersion);
HeapFree(GetProcessHeap(), 0, lpwhr->lpszStatusText);
for (i = 0; i < lpwhr->nCustHeaders; i++)
{
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[i].lpszField);
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders[i].lpszValue);
}
HeapFree(GetProcessHeap(), 0, lpwhr->pCustHeaders);
HeapFree(GetProcessHeap(), 0, lpwhr);
}
/***********************************************************************
* HTTP_CloseHTTPSessionHandle (internal)
*
* Deallocate session handle
*
*/
static void HTTP_CloseHTTPSessionHandle(LPWININETHANDLEHEADER hdr)
{
LPWININETHTTPSESSIONW lpwhs = (LPWININETHTTPSESSIONW) hdr;
TRACE("%p\n", lpwhs);
WININET_Release(&lpwhs->lpAppInfo->hdr);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszHostName);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszServerName);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszPassword);
HeapFree(GetProcessHeap(), 0, lpwhs->lpszUserName);
HeapFree(GetProcessHeap(), 0, lpwhs);
}
/*********************************************************************** /***********************************************************************
* HTTP_GetCustomHeaderIndex (internal) * HTTP_GetCustomHeaderIndex (internal)
......
...@@ -78,7 +78,6 @@ typedef struct ...@@ -78,7 +78,6 @@ typedef struct
CHAR response[MAX_REPLY_LEN]; CHAR response[MAX_REPLY_LEN];
} WITHREADERROR, *LPWITHREADERROR; } WITHREADERROR, *LPWITHREADERROR;
static VOID INTERNET_CloseHandle(LPWININETHANDLEHEADER hdr);
HINTERNET WINAPI INTERNET_InternetOpenUrlW(LPWININETAPPINFOW hIC, LPCWSTR lpszUrl, HINTERNET WINAPI INTERNET_InternetOpenUrlW(LPWININETAPPINFOW hIC, LPCWSTR lpszUrl,
LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext); LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD_PTR dwContext);
...@@ -186,7 +185,7 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info ) ...@@ -186,7 +185,7 @@ BOOL WININET_Release( LPWININETHANDLEHEADER info )
TRACE( "destroying object %p\n", info); TRACE( "destroying object %p\n", info);
if ( info->htype != WH_HINIT ) if ( info->htype != WH_HINIT )
list_remove( &info->entry ); list_remove( &info->entry );
info->destroy( info ); info->vtbl->Destroy( info );
} }
return TRUE; return TRUE;
} }
...@@ -453,6 +452,31 @@ static void dump_INTERNET_FLAGS(DWORD dwFlags) ...@@ -453,6 +452,31 @@ static void dump_INTERNET_FLAGS(DWORD dwFlags)
} }
/*********************************************************************** /***********************************************************************
* INTERNET_CloseHandle (internal)
*
* Close internet handle
*
*/
static VOID APPINFO_Destroy(WININETHANDLEHEADER *hdr)
{
LPWININETAPPINFOW lpwai = (LPWININETAPPINFOW) hdr;
TRACE("%p\n",lpwai);
HeapFree(GetProcessHeap(), 0, lpwai->lpszAgent);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxy);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyBypass);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyUsername);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyPassword);
HeapFree(GetProcessHeap(), 0, lpwai);
}
static const HANDLEHEADERVtbl APPINFOVtbl = {
APPINFO_Destroy
};
/***********************************************************************
* InternetOpenW (WININET.@) * InternetOpenW (WININET.@)
* *
* Per-application initialization of wininet * Per-application initialization of wininet
...@@ -504,10 +528,10 @@ HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType, ...@@ -504,10 +528,10 @@ HINTERNET WINAPI InternetOpenW(LPCWSTR lpszAgent, DWORD dwAccessType,
} }
lpwai->hdr.htype = WH_HINIT; lpwai->hdr.htype = WH_HINIT;
lpwai->hdr.vtbl = &APPINFOVtbl;
lpwai->hdr.dwFlags = dwFlags; lpwai->hdr.dwFlags = dwFlags;
lpwai->hdr.dwRefCount = 1; lpwai->hdr.dwRefCount = 1;
lpwai->hdr.close_connection = NULL; lpwai->hdr.close_connection = NULL;
lpwai->hdr.destroy = INTERNET_CloseHandle;
lpwai->dwAccessType = dwAccessType; lpwai->dwAccessType = dwAccessType;
lpwai->lpszProxyUsername = NULL; lpwai->lpszProxyUsername = NULL;
lpwai->lpszProxyPassword = NULL; lpwai->lpszProxyPassword = NULL;
...@@ -968,30 +992,6 @@ lend: ...@@ -968,30 +992,6 @@ lend:
} }
/*********************************************************************** /***********************************************************************
* INTERNET_CloseHandle (internal)
*
* Close internet handle
*
* RETURNS
* Void
*
*/
static VOID INTERNET_CloseHandle(LPWININETHANDLEHEADER hdr)
{
LPWININETAPPINFOW lpwai = (LPWININETAPPINFOW) hdr;
TRACE("%p\n",lpwai);
HeapFree(GetProcessHeap(), 0, lpwai->lpszAgent);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxy);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyBypass);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyUsername);
HeapFree(GetProcessHeap(), 0, lpwai->lpszProxyPassword);
HeapFree(GetProcessHeap(), 0, lpwai);
}
/***********************************************************************
* InternetCloseHandle (WININET.@) * InternetCloseHandle (WININET.@)
* *
* Generic close handle function * Generic close handle function
......
...@@ -138,9 +138,14 @@ typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER; ...@@ -138,9 +138,14 @@ typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
typedef void (*WININET_object_function)( LPWININETHANDLEHEADER ); typedef void (*WININET_object_function)( LPWININETHANDLEHEADER );
typedef struct {
void (*Destroy)(WININETHANDLEHEADER*);
} HANDLEHEADERVtbl;
struct _WININETHANDLEHEADER struct _WININETHANDLEHEADER
{ {
WH_TYPE htype; WH_TYPE htype;
const HANDLEHEADERVtbl *vtbl;
HINTERNET hInternet; HINTERNET hInternet;
DWORD dwFlags; DWORD dwFlags;
DWORD_PTR dwContext; DWORD_PTR dwContext;
...@@ -148,7 +153,6 @@ struct _WININETHANDLEHEADER ...@@ -148,7 +153,6 @@ struct _WININETHANDLEHEADER
DWORD dwInternalFlags; DWORD dwInternalFlags;
DWORD dwRefCount; DWORD dwRefCount;
WININET_object_function close_connection; WININET_object_function close_connection;
WININET_object_function destroy;
INTERNET_STATUS_CALLBACK lpfnStatusCB; INTERNET_STATUS_CALLBACK lpfnStatusCB;
struct list entry; struct list entry;
struct list children; struct list children;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment