Move all FTP functions to unicode.

Improve FTP LIST parsing.
This commit is contained in:
Kevin Koltzau 2004-05-25 04:02:05 +00:00 committed by Alexandre Julliard
parent 94d74b5fed
commit 1d2d2d6bf1
5 changed files with 1066 additions and 864 deletions

File diff suppressed because it is too large Load Diff

View File

@ -72,7 +72,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet);
#define RESPONSE_TIMEOUT 30 #define RESPONSE_TIMEOUT 30
#define GET_HWININET_FROM_LPWININETFINDNEXT(lpwh) \ #define GET_HWININET_FROM_LPWININETFINDNEXT(lpwh) \
(LPWININETAPPINFOW)(((LPWININETFTPSESSIONA)(lpwh->hdr.lpwhparent))->hdr.lpwhparent) (LPWININETAPPINFOW)(((LPWININETFTPSESSIONW)(lpwh->hdr.lpwhparent))->hdr.lpwhparent)
typedef struct typedef struct
@ -81,7 +81,7 @@ typedef struct
CHAR response[MAX_REPLY_LEN]; CHAR response[MAX_REPLY_LEN];
} WITHREADERROR, *LPWITHREADERROR; } WITHREADERROR, *LPWITHREADERROR;
BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData); BOOL WINAPI INTERNET_FindNextFileW(HINTERNET hFind, LPVOID lpvFindData);
HINTERNET WINAPI INTERNET_InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl, HINTERNET WINAPI INTERNET_InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl,
LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD dwContext); LPCWSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwFlags, DWORD dwContext);
VOID INTERNET_ExecuteWork(); VOID INTERNET_ExecuteWork();
@ -745,13 +745,34 @@ HINTERNET WINAPI InternetConnectA(HINTERNET hInternet,
* *
*/ */
BOOL WINAPI InternetFindNextFileA(HINTERNET hFind, LPVOID lpvFindData) BOOL WINAPI InternetFindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
{
BOOL ret;
WIN32_FIND_DATAW fd;
ret = InternetFindNextFileW(hFind, lpvFindData?&fd:NULL);
if(lpvFindData)
WININET_find_data_WtoA(&fd, (LPWIN32_FIND_DATAA)lpvFindData);
return ret;
}
/***********************************************************************
* InternetFindNextFileW (WININET.@)
*
* Continues a file search from a previous call to FindFirstFile
*
* RETURNS
* TRUE on success
* FALSE on failure
*
*/
BOOL WINAPI InternetFindNextFileW(HINTERNET hFind, LPVOID lpvFindData)
{ {
LPWININETAPPINFOW hIC = NULL; LPWININETAPPINFOW hIC = NULL;
LPWININETFINDNEXTA lpwh; LPWININETFINDNEXTW lpwh;
TRACE("\n"); TRACE("\n");
lpwh = (LPWININETFINDNEXTA) WININET_GetObject( hFind ); lpwh = (LPWININETFINDNEXTW) WININET_GetObject( hFind );
if (NULL == lpwh || lpwh->hdr.htype != WH_HFINDNEXT) if (NULL == lpwh || lpwh->hdr.htype != WH_HFINDNEXT)
{ {
@ -763,23 +784,23 @@ BOOL WINAPI InternetFindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC) if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
{ {
WORKREQUEST workRequest; WORKREQUEST workRequest;
struct WORKREQ_INTERNETFINDNEXTA *req; struct WORKREQ_INTERNETFINDNEXTW *req;
workRequest.asyncall = INTERNETFINDNEXTA; workRequest.asyncall = INTERNETFINDNEXTW;
workRequest.handle = hFind; workRequest.handle = hFind;
req = &workRequest.u.InternetFindNextA; req = &workRequest.u.InternetFindNextW;
req->lpFindFileData = lpvFindData; req->lpFindFileData = lpvFindData;
return INTERNET_AsyncCall(&workRequest); return INTERNET_AsyncCall(&workRequest);
} }
else else
{ {
return INTERNET_FindNextFileA(hFind, lpvFindData); return INTERNET_FindNextFileW(hFind, lpvFindData);
} }
} }
/*********************************************************************** /***********************************************************************
* INTERNET_FindNextFileA (Internal) * INTERNET_FindNextFileW (Internal)
* *
* Continues a file search from a previous call to FindFirstFile * Continues a file search from a previous call to FindFirstFile
* *
@ -788,16 +809,16 @@ BOOL WINAPI InternetFindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
* FALSE on failure * FALSE on failure
* *
*/ */
BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData) BOOL WINAPI INTERNET_FindNextFileW(HINTERNET hFind, LPVOID lpvFindData)
{ {
BOOL bSuccess = TRUE; BOOL bSuccess = TRUE;
LPWININETAPPINFOW hIC = NULL; LPWININETAPPINFOW hIC = NULL;
LPWIN32_FIND_DATAA lpFindFileData; LPWIN32_FIND_DATAW lpFindFileData;
LPWININETFINDNEXTA lpwh; LPWININETFINDNEXTW lpwh;
TRACE("\n"); TRACE("\n");
lpwh = (LPWININETFINDNEXTA) WININET_GetObject( hFind ); lpwh = (LPWININETFINDNEXTW) WININET_GetObject( hFind );
if (NULL == lpwh || lpwh->hdr.htype != WH_HFINDNEXT) if (NULL == lpwh || lpwh->hdr.htype != WH_HFINDNEXT)
{ {
INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE); INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
@ -816,7 +837,7 @@ BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
TRACE("index(%d) size(%ld)\n", lpwh->index, lpwh->size); TRACE("index(%d) size(%ld)\n", lpwh->index, lpwh->size);
lpFindFileData = (LPWIN32_FIND_DATAA) lpvFindData; lpFindFileData = (LPWIN32_FIND_DATAW) lpvFindData;
ZeroMemory(lpFindFileData, sizeof(WIN32_FIND_DATAA)); ZeroMemory(lpFindFileData, sizeof(WIN32_FIND_DATAA));
if (lpwh->index >= lpwh->size) if (lpwh->index >= lpwh->size)
@ -829,12 +850,12 @@ BOOL WINAPI INTERNET_FindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
FTP_ConvertFileProp(&lpwh->lpafp[lpwh->index], lpFindFileData); FTP_ConvertFileProp(&lpwh->lpafp[lpwh->index], lpFindFileData);
lpwh->index++; lpwh->index++;
TRACE("\nName: %s\nSize: %ld\n", lpFindFileData->cFileName, lpFindFileData->nFileSizeLow); TRACE("\nName: %s\nSize: %ld\n", debugstr_w(lpFindFileData->cFileName), lpFindFileData->nFileSizeLow);
lend: lend:
hIC = GET_HWININET_FROM_LPWININETFINDNEXT(lpwh); hIC = GET_HWININET_FROM_LPWININETFINDNEXT(lpwh);
if (hIC->lpfnStatusCB) if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC && hIC->lpfnStatusCB)
{ {
INTERNET_ASYNC_RESULT iar; INTERNET_ASYNC_RESULT iar;
@ -933,11 +954,11 @@ BOOL WINAPI InternetCloseHandle(HINTERNET hInternet)
break; break;
case WH_HFTPSESSION: case WH_HFTPSESSION:
retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONA) lpwh); retval = FTP_CloseSessionHandle((LPWININETFTPSESSIONW) lpwh);
break; break;
case WH_HFINDNEXT: case WH_HFINDNEXT:
retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTA) lpwh); retval = FTP_CloseFindNextHandle((LPWININETFINDNEXTW) lpwh);
break; break;
case WH_HFILE: case WH_HFILE:
@ -1460,14 +1481,49 @@ INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackA(
INTERNET_STATUS_CALLBACK retVal; INTERNET_STATUS_CALLBACK retVal;
LPWININETAPPINFOW lpwai; LPWININETAPPINFOW lpwai;
TRACE("0x%08lx\n", (ULONG)hInternet);
lpwai = (LPWININETAPPINFOW)WININET_GetObject(hInternet); lpwai = (LPWININETAPPINFOW)WININET_GetObject(hInternet);
if (!lpwai) if (!lpwai)
return NULL; return NULL;
TRACE("0x%08lx\n", (ULONG)hInternet);
if (lpwai->hdr.htype != WH_HINIT) if (lpwai->hdr.htype != WH_HINIT)
return INTERNET_INVALID_STATUS_CALLBACK; return INTERNET_INVALID_STATUS_CALLBACK;
lpwai->hdr.dwInternalFlags &= ~INET_CALLBACKW;
retVal = lpwai->lpfnStatusCB;
lpwai->lpfnStatusCB = lpfnIntCB;
return retVal;
}
/***********************************************************************
* InternetSetStatusCallbackW (WININET.@)
*
* Sets up a callback function which is called as progress is made
* during an operation.
*
* RETURNS
* Previous callback or NULL on success
* INTERNET_INVALID_STATUS_CALLBACK on failure
*
*/
INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallbackW(
HINTERNET hInternet ,INTERNET_STATUS_CALLBACK lpfnIntCB)
{
INTERNET_STATUS_CALLBACK retVal;
LPWININETAPPINFOW lpwai;
TRACE("0x%08lx\n", (ULONG)hInternet);
lpwai = (LPWININETAPPINFOW)WININET_GetObject(hInternet);
if (!lpwai)
return NULL;
if (lpwai->hdr.htype != WH_HINIT)
return INTERNET_INVALID_STATUS_CALLBACK;
lpwai->hdr.dwInternalFlags |= INET_CALLBACKW;
retVal = lpwai->lpfnStatusCB; retVal = lpwai->lpfnStatusCB;
lpwai->lpfnStatusCB = lpfnIntCB; lpwai->lpfnStatusCB = lpfnIntCB;
@ -2071,7 +2127,13 @@ HINTERNET WINAPI INTERNET_InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl,
urlComponents.nPort = INTERNET_DEFAULT_FTP_PORT; urlComponents.nPort = INTERNET_DEFAULT_FTP_PORT;
client = FTP_Connect(hInternet, hostName, urlComponents.nPort, client = FTP_Connect(hInternet, hostName, urlComponents.nPort,
userName, password, dwFlags, dwContext, INET_OPENURL); userName, password, dwFlags, dwContext, INET_OPENURL);
if(client == NULL)
break;
client1 = FtpOpenFileW(client, path, GENERIC_READ, dwFlags, dwContext); client1 = FtpOpenFileW(client, path, GENERIC_READ, dwFlags, dwContext);
if(client1 == NULL) {
InternetCloseHandle(client);
break;
}
break; break;
case INTERNET_SCHEME_HTTP: case INTERNET_SCHEME_HTTP:
@ -2096,7 +2158,6 @@ HINTERNET WINAPI INTERNET_InternetOpenUrlW(HINTERNET hInternet, LPCWSTR lpszUrl,
HttpAddRequestHeadersW(client1, lpszHeaders, dwHeadersLength, HTTP_ADDREQ_FLAG_ADD); HttpAddRequestHeadersW(client1, lpszHeaders, dwHeadersLength, HTTP_ADDREQ_FLAG_ADD);
if (!HTTP_HttpSendRequestW(client1, NULL, 0, NULL, 0)) { if (!HTTP_HttpSendRequestW(client1, NULL, 0, NULL, 0)) {
InternetCloseHandle(client1); InternetCloseHandle(client1);
InternetCloseHandle(client);
client1 = NULL; client1 = NULL;
break; break;
} }
@ -2425,17 +2486,17 @@ VOID INTERNET_ExecuteWork()
if (TRACE_ON(wininet)) { if (TRACE_ON(wininet)) {
static const wininet_flag_info work_request_types[] = { static const wininet_flag_info work_request_types[] = {
#define FE(x) { x, #x } #define FE(x) { x, #x }
FE(FTPPUTFILEA), FE(FTPPUTFILEW),
FE(FTPSETCURRENTDIRECTORYA), FE(FTPSETCURRENTDIRECTORYW),
FE(FTPCREATEDIRECTORYA), FE(FTPCREATEDIRECTORYW),
FE(FTPFINDFIRSTFILEA), FE(FTPFINDFIRSTFILEW),
FE(FTPGETCURRENTDIRECTORYA), FE(FTPGETCURRENTDIRECTORYW),
FE(FTPOPENFILEA), FE(FTPOPENFILEW),
FE(FTPGETFILEA), FE(FTPGETFILEW),
FE(FTPDELETEFILEA), FE(FTPDELETEFILEW),
FE(FTPREMOVEDIRECTORYA), FE(FTPREMOVEDIRECTORYW),
FE(FTPRENAMEFILEA), FE(FTPRENAMEFILEW),
FE(INTERNETFINDNEXTA), FE(INTERNETFINDNEXTW),
FE(HTTPSENDREQUESTW), FE(HTTPSENDREQUESTW),
FE(HTTPOPENREQUESTW), FE(HTTPOPENREQUESTW),
FE(SENDCALLBACK), FE(SENDCALLBACK),
@ -2456,11 +2517,11 @@ VOID INTERNET_ExecuteWork()
} }
switch (workRequest.asyncall) switch (workRequest.asyncall)
{ {
case FTPPUTFILEA: case FTPPUTFILEW:
{ {
struct WORKREQ_FTPPUTFILEA *req = &workRequest.u.FtpPutFileA; struct WORKREQ_FTPPUTFILEW *req = &workRequest.u.FtpPutFileW;
FTP_FtpPutFileA(workRequest.handle, req->lpszLocalFile, FTP_FtpPutFileW(workRequest.handle, req->lpszLocalFile,
req->lpszNewRemoteFile, req->dwFlags, req->dwContext); req->lpszNewRemoteFile, req->dwFlags, req->dwContext);
HeapFree(GetProcessHeap(), 0, req->lpszLocalFile); HeapFree(GetProcessHeap(), 0, req->lpszLocalFile);
@ -2468,62 +2529,62 @@ VOID INTERNET_ExecuteWork()
} }
break; break;
case FTPSETCURRENTDIRECTORYA: case FTPSETCURRENTDIRECTORYW:
{ {
struct WORKREQ_FTPSETCURRENTDIRECTORYA *req; struct WORKREQ_FTPSETCURRENTDIRECTORYW *req;
req = &workRequest.u.FtpSetCurrentDirectoryA; req = &workRequest.u.FtpSetCurrentDirectoryW;
FTP_FtpSetCurrentDirectoryA(workRequest.handle, req->lpszDirectory); FTP_FtpSetCurrentDirectoryW(workRequest.handle, req->lpszDirectory);
HeapFree(GetProcessHeap(), 0, req->lpszDirectory); HeapFree(GetProcessHeap(), 0, req->lpszDirectory);
} }
break; break;
case FTPCREATEDIRECTORYA: case FTPCREATEDIRECTORYW:
{ {
struct WORKREQ_FTPCREATEDIRECTORYA *req; struct WORKREQ_FTPCREATEDIRECTORYW *req;
req = &workRequest.u.FtpCreateDirectoryA; req = &workRequest.u.FtpCreateDirectoryW;
FTP_FtpCreateDirectoryA(workRequest.handle, req->lpszDirectory); FTP_FtpCreateDirectoryW(workRequest.handle, req->lpszDirectory);
HeapFree(GetProcessHeap(), 0, req->lpszDirectory); HeapFree(GetProcessHeap(), 0, req->lpszDirectory);
} }
break; break;
case FTPFINDFIRSTFILEA: case FTPFINDFIRSTFILEW:
{ {
struct WORKREQ_FTPFINDFIRSTFILEA *req; struct WORKREQ_FTPFINDFIRSTFILEW *req;
req = &workRequest.u.FtpFindFirstFileA; req = &workRequest.u.FtpFindFirstFileW;
FTP_FtpFindFirstFileA(workRequest.handle, req->lpszSearchFile, FTP_FtpFindFirstFileW(workRequest.handle, req->lpszSearchFile,
req->lpFindFileData, req->dwFlags, req->dwContext); req->lpFindFileData, req->dwFlags, req->dwContext);
HeapFree(GetProcessHeap(), 0, req->lpszSearchFile); HeapFree(GetProcessHeap(), 0, req->lpszSearchFile);
} }
break; break;
case FTPGETCURRENTDIRECTORYA: case FTPGETCURRENTDIRECTORYW:
{ {
struct WORKREQ_FTPGETCURRENTDIRECTORYA *req; struct WORKREQ_FTPGETCURRENTDIRECTORYW *req;
req = &workRequest.u.FtpGetCurrentDirectoryA; req = &workRequest.u.FtpGetCurrentDirectoryW;
FTP_FtpGetCurrentDirectoryA(workRequest.handle, FTP_FtpGetCurrentDirectoryW(workRequest.handle,
req->lpszDirectory, req->lpdwDirectory); req->lpszDirectory, req->lpdwDirectory);
} }
break; break;
case FTPOPENFILEA: case FTPOPENFILEW:
{ {
struct WORKREQ_FTPOPENFILEA *req = &workRequest.u.FtpOpenFileA; struct WORKREQ_FTPOPENFILEW *req = &workRequest.u.FtpOpenFileW;
FTP_FtpOpenFileA(workRequest.handle, req->lpszFilename, FTP_FtpOpenFileW(workRequest.handle, req->lpszFilename,
req->dwAccess, req->dwFlags, req->dwContext); req->dwAccess, req->dwFlags, req->dwContext);
HeapFree(GetProcessHeap(), 0, req->lpszFilename); HeapFree(GetProcessHeap(), 0, req->lpszFilename);
} }
break; break;
case FTPGETFILEA: case FTPGETFILEW:
{ {
struct WORKREQ_FTPGETFILEA *req = &workRequest.u.FtpGetFileA; struct WORKREQ_FTPGETFILEW *req = &workRequest.u.FtpGetFileW;
FTP_FtpGetFileA(workRequest.handle, req->lpszRemoteFile, FTP_FtpGetFileW(workRequest.handle, req->lpszRemoteFile,
req->lpszNewFile, req->fFailIfExists, req->lpszNewFile, req->fFailIfExists,
req->dwLocalFlagsAttribute, req->dwFlags, req->dwContext); req->dwLocalFlagsAttribute, req->dwFlags, req->dwContext);
HeapFree(GetProcessHeap(), 0, req->lpszRemoteFile); HeapFree(GetProcessHeap(), 0, req->lpszRemoteFile);
@ -2531,41 +2592,41 @@ VOID INTERNET_ExecuteWork()
} }
break; break;
case FTPDELETEFILEA: case FTPDELETEFILEW:
{ {
struct WORKREQ_FTPDELETEFILEA *req = &workRequest.u.FtpDeleteFileA; struct WORKREQ_FTPDELETEFILEW *req = &workRequest.u.FtpDeleteFileW;
FTP_FtpDeleteFileA(workRequest.handle, req->lpszFilename); FTP_FtpDeleteFileW(workRequest.handle, req->lpszFilename);
HeapFree(GetProcessHeap(), 0, req->lpszFilename); HeapFree(GetProcessHeap(), 0, req->lpszFilename);
} }
break; break;
case FTPREMOVEDIRECTORYA: case FTPREMOVEDIRECTORYW:
{ {
struct WORKREQ_FTPREMOVEDIRECTORYA *req; struct WORKREQ_FTPREMOVEDIRECTORYW *req;
req = &workRequest.u.FtpRemoveDirectoryA; req = &workRequest.u.FtpRemoveDirectoryW;
FTP_FtpRemoveDirectoryA(workRequest.handle, req->lpszDirectory); FTP_FtpRemoveDirectoryW(workRequest.handle, req->lpszDirectory);
HeapFree(GetProcessHeap(), 0, req->lpszDirectory); HeapFree(GetProcessHeap(), 0, req->lpszDirectory);
} }
break; break;
case FTPRENAMEFILEA: case FTPRENAMEFILEW:
{ {
struct WORKREQ_FTPRENAMEFILEA *req = &workRequest.u.FtpRenameFileA; struct WORKREQ_FTPRENAMEFILEW *req = &workRequest.u.FtpRenameFileW;
FTP_FtpRenameFileA(workRequest.handle, req->lpszSrcFile, req->lpszDestFile); FTP_FtpRenameFileW(workRequest.handle, req->lpszSrcFile, req->lpszDestFile);
HeapFree(GetProcessHeap(), 0, req->lpszSrcFile); HeapFree(GetProcessHeap(), 0, req->lpszSrcFile);
HeapFree(GetProcessHeap(), 0, req->lpszDestFile); HeapFree(GetProcessHeap(), 0, req->lpszDestFile);
} }
break; break;
case INTERNETFINDNEXTA: case INTERNETFINDNEXTW:
{ {
struct WORKREQ_INTERNETFINDNEXTA *req; struct WORKREQ_INTERNETFINDNEXTW *req;
req = &workRequest.u.InternetFindNextA; req = &workRequest.u.InternetFindNextW;
INTERNET_FindNextFileA(workRequest.handle, req->lpFindFileData); INTERNET_FindNextFileW(workRequest.handle, req->lpFindFileData);
} }
break; break;
@ -2643,12 +2704,13 @@ LPSTR INTERNET_GetResponseBuffer()
* *
*/ */
LPSTR INTERNET_GetNextLine(INT nSocket, LPSTR lpszBuffer, LPDWORD dwBuffer) LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen)
{ {
struct timeval tv; struct timeval tv;
fd_set infd; fd_set infd;
BOOL bSuccess = FALSE; BOOL bSuccess = FALSE;
INT nRecv = 0; INT nRecv = 0;
LPSTR lpszBuffer = INTERNET_GetResponseBuffer();
TRACE("\n"); TRACE("\n");
@ -2657,7 +2719,7 @@ LPSTR INTERNET_GetNextLine(INT nSocket, LPSTR lpszBuffer, LPDWORD dwBuffer)
tv.tv_sec=RESPONSE_TIMEOUT; tv.tv_sec=RESPONSE_TIMEOUT;
tv.tv_usec=0; tv.tv_usec=0;
while (nRecv < *dwBuffer) while (nRecv < MAX_REPLY_LEN)
{ {
if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0) if (select(nSocket+1,&infd,NULL,NULL,&tv) > 0)
{ {
@ -2686,7 +2748,7 @@ lend:
if (bSuccess) if (bSuccess)
{ {
lpszBuffer[nRecv] = '\0'; lpszBuffer[nRecv] = '\0';
*dwBuffer = nRecv - 1; *dwLen = nRecv - 1;
TRACE(":%d %s\n", nRecv, lpszBuffer); TRACE(":%d %s\n", nRecv, lpszBuffer);
return lpszBuffer; return lpszBuffer;
} }

View File

@ -70,6 +70,42 @@ inline static LPWSTR WININET_strdupW( LPCWSTR str )
return ret; return ret;
} }
inline static LPWSTR WININET_strdup_AtoW( LPCSTR str )
{
int len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0);
LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
if (ret)
MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len);
return ret;
}
inline static LPSTR WININET_strdup_WtoA( LPCWSTR str )
{
int len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
LPSTR ret = HeapAlloc( GetProcessHeap(), 0, len );
if (ret)
WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL);
return ret;
}
inline static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
{
dataA->dwFileAttributes = dataW->dwFileAttributes;
dataA->ftCreationTime = dataW->ftCreationTime;
dataA->ftLastAccessTime = dataW->ftLastAccessTime;
dataA->ftLastWriteTime = dataW->ftLastWriteTime;
dataA->nFileSizeHigh = dataW->nFileSizeHigh;
dataA->nFileSizeLow = dataW->nFileSizeLow;
dataA->dwReserved0 = dataW->dwReserved0;
dataA->dwReserved1 = dataW->dwReserved1;
WideCharToMultiByte(CP_ACP, 0, dataW->cFileName, -1,
dataA->cFileName, sizeof(dataA->cFileName),
NULL, NULL);
WideCharToMultiByte(CP_ACP, 0, dataW->cAlternateFileName, -1,
dataA->cAlternateFileName, sizeof(dataA->cAlternateFileName),
NULL, NULL);
}
typedef enum typedef enum
{ {
WH_HINIT = INTERNET_HANDLE_TYPE_INTERNET, WH_HINIT = INTERNET_HANDLE_TYPE_INTERNET,
@ -82,6 +118,7 @@ typedef enum
} WH_TYPE; } WH_TYPE;
#define INET_OPENURL 0x0001 #define INET_OPENURL 0x0001
#define INET_CALLBACKW 0x0002
typedef struct _WININETHANDLEHEADER typedef struct _WININETHANDLEHEADER
{ {
@ -161,19 +198,19 @@ typedef struct
struct sockaddr_in socketAddress; struct sockaddr_in socketAddress;
struct sockaddr_in lstnSocketAddress; struct sockaddr_in lstnSocketAddress;
struct hostent *phostent; struct hostent *phostent;
LPSTR lpszPassword; LPWSTR lpszPassword;
LPSTR lpszUserName; LPWSTR lpszUserName;
} WININETFTPSESSIONA, *LPWININETFTPSESSIONA; } WININETFTPSESSIONW, *LPWININETFTPSESSIONW;
typedef struct typedef struct
{ {
BOOL bIsDirectory; BOOL bIsDirectory;
LPSTR lpszName; LPWSTR lpszName;
DWORD nSize; DWORD nSize;
struct tm tmLastModified; struct tm tmLastModified;
unsigned short permissions; unsigned short permissions;
} FILEPROPERTIESA, *LPFILEPROPERTIESA; } FILEPROPERTIESW, *LPFILEPROPERTIESW;
typedef struct typedef struct
@ -181,97 +218,97 @@ typedef struct
WININETHANDLEHEADER hdr; WININETHANDLEHEADER hdr;
int index; int index;
DWORD size; DWORD size;
LPFILEPROPERTIESA lpafp; LPFILEPROPERTIESW lpafp;
} WININETFINDNEXTA, *LPWININETFINDNEXTA; } WININETFINDNEXTW, *LPWININETFINDNEXTW;
typedef enum typedef enum
{ {
FTPPUTFILEA, FTPPUTFILEW,
FTPSETCURRENTDIRECTORYA, FTPSETCURRENTDIRECTORYW,
FTPCREATEDIRECTORYA, FTPCREATEDIRECTORYW,
FTPFINDFIRSTFILEA, FTPFINDFIRSTFILEW,
FTPGETCURRENTDIRECTORYA, FTPGETCURRENTDIRECTORYW,
FTPOPENFILEA, FTPOPENFILEW,
FTPGETFILEA, FTPGETFILEW,
FTPDELETEFILEA, FTPDELETEFILEW,
FTPREMOVEDIRECTORYA, FTPREMOVEDIRECTORYW,
FTPRENAMEFILEA, FTPRENAMEFILEW,
INTERNETFINDNEXTA, INTERNETFINDNEXTW,
HTTPSENDREQUESTW, HTTPSENDREQUESTW,
HTTPOPENREQUESTW, HTTPOPENREQUESTW,
SENDCALLBACK, SENDCALLBACK,
INTERNETOPENURLW, INTERNETOPENURLW,
} ASYNC_FUNC; } ASYNC_FUNC;
struct WORKREQ_FTPPUTFILEA struct WORKREQ_FTPPUTFILEW
{ {
LPSTR lpszLocalFile; LPWSTR lpszLocalFile;
LPSTR lpszNewRemoteFile; LPWSTR lpszNewRemoteFile;
DWORD dwFlags; DWORD dwFlags;
DWORD dwContext; DWORD dwContext;
}; };
struct WORKREQ_FTPSETCURRENTDIRECTORYA struct WORKREQ_FTPSETCURRENTDIRECTORYW
{ {
LPSTR lpszDirectory; LPWSTR lpszDirectory;
}; };
struct WORKREQ_FTPCREATEDIRECTORYA struct WORKREQ_FTPCREATEDIRECTORYW
{ {
LPSTR lpszDirectory; LPWSTR lpszDirectory;
}; };
struct WORKREQ_FTPFINDFIRSTFILEA struct WORKREQ_FTPFINDFIRSTFILEW
{ {
LPSTR lpszSearchFile; LPWSTR lpszSearchFile;
LPWIN32_FIND_DATAA lpFindFileData; LPWIN32_FIND_DATAW lpFindFileData;
DWORD dwFlags; DWORD dwFlags;
DWORD dwContext; DWORD dwContext;
}; };
struct WORKREQ_FTPGETCURRENTDIRECTORYA struct WORKREQ_FTPGETCURRENTDIRECTORYW
{ {
LPSTR lpszDirectory; LPWSTR lpszDirectory;
DWORD *lpdwDirectory; DWORD *lpdwDirectory;
}; };
struct WORKREQ_FTPOPENFILEA struct WORKREQ_FTPOPENFILEW
{ {
LPSTR lpszFilename; LPWSTR lpszFilename;
DWORD dwAccess; DWORD dwAccess;
DWORD dwFlags; DWORD dwFlags;
DWORD dwContext; DWORD dwContext;
}; };
struct WORKREQ_FTPGETFILEA struct WORKREQ_FTPGETFILEW
{ {
LPSTR lpszRemoteFile; LPWSTR lpszRemoteFile;
LPSTR lpszNewFile; LPWSTR lpszNewFile;
BOOL fFailIfExists; BOOL fFailIfExists;
DWORD dwLocalFlagsAttribute; DWORD dwLocalFlagsAttribute;
DWORD dwFlags; DWORD dwFlags;
DWORD dwContext; DWORD dwContext;
}; };
struct WORKREQ_FTPDELETEFILEA struct WORKREQ_FTPDELETEFILEW
{ {
LPSTR lpszFilename; LPWSTR lpszFilename;
}; };
struct WORKREQ_FTPREMOVEDIRECTORYA struct WORKREQ_FTPREMOVEDIRECTORYW
{ {
LPSTR lpszDirectory; LPWSTR lpszDirectory;
}; };
struct WORKREQ_FTPRENAMEFILEA struct WORKREQ_FTPRENAMEFILEW
{ {
LPSTR lpszSrcFile; LPWSTR lpszSrcFile;
LPSTR lpszDestFile; LPWSTR lpszDestFile;
}; };
struct WORKREQ_INTERNETFINDNEXTA struct WORKREQ_INTERNETFINDNEXTW
{ {
LPWIN32_FIND_DATAA lpFindFileData; LPWIN32_FIND_DATAW lpFindFileData;
}; };
struct WORKREQ_HTTPOPENREQUESTW struct WORKREQ_HTTPOPENREQUESTW
@ -318,17 +355,17 @@ typedef struct WORKREQ
HINTERNET handle; HINTERNET handle;
union { union {
struct WORKREQ_FTPPUTFILEA FtpPutFileA; struct WORKREQ_FTPPUTFILEW FtpPutFileW;
struct WORKREQ_FTPSETCURRENTDIRECTORYA FtpSetCurrentDirectoryA; struct WORKREQ_FTPSETCURRENTDIRECTORYW FtpSetCurrentDirectoryW;
struct WORKREQ_FTPCREATEDIRECTORYA FtpCreateDirectoryA; struct WORKREQ_FTPCREATEDIRECTORYW FtpCreateDirectoryW;
struct WORKREQ_FTPFINDFIRSTFILEA FtpFindFirstFileA; struct WORKREQ_FTPFINDFIRSTFILEW FtpFindFirstFileW;
struct WORKREQ_FTPGETCURRENTDIRECTORYA FtpGetCurrentDirectoryA; struct WORKREQ_FTPGETCURRENTDIRECTORYW FtpGetCurrentDirectoryW;
struct WORKREQ_FTPOPENFILEA FtpOpenFileA; struct WORKREQ_FTPOPENFILEW FtpOpenFileW;
struct WORKREQ_FTPGETFILEA FtpGetFileA; struct WORKREQ_FTPGETFILEW FtpGetFileW;
struct WORKREQ_FTPDELETEFILEA FtpDeleteFileA; struct WORKREQ_FTPDELETEFILEW FtpDeleteFileW;
struct WORKREQ_FTPREMOVEDIRECTORYA FtpRemoveDirectoryA; struct WORKREQ_FTPREMOVEDIRECTORYW FtpRemoveDirectoryW;
struct WORKREQ_FTPRENAMEFILEA FtpRenameFileA; struct WORKREQ_FTPRENAMEFILEW FtpRenameFileW;
struct WORKREQ_INTERNETFINDNEXTA InternetFindNextA; struct WORKREQ_INTERNETFINDNEXTW InternetFindNextW;
struct WORKREQ_HTTPOPENREQUESTW HttpOpenRequestW; struct WORKREQ_HTTPOPENREQUESTW HttpOpenRequestW;
struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW; struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW;
struct WORKREQ_SENDCALLBACK SendCallback; struct WORKREQ_SENDCALLBACK SendCallback;
@ -364,26 +401,26 @@ void INTERNET_SetLastError(DWORD dwError);
DWORD INTERNET_GetLastError(); DWORD INTERNET_GetLastError();
BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest); BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
LPSTR INTERNET_GetResponseBuffer(); LPSTR INTERNET_GetResponseBuffer();
LPSTR INTERNET_GetNextLine(INT nSocket, LPSTR lpszBuffer, LPDWORD dwBuffer); LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
BOOL FTP_CloseSessionHandle(LPWININETFTPSESSIONA lpwfs); BOOL FTP_CloseSessionHandle(LPWININETFTPSESSIONW lpwfs);
BOOL FTP_CloseFindNextHandle(LPWININETFINDNEXTA lpwfn); BOOL FTP_CloseFindNextHandle(LPWININETFINDNEXTW lpwfn);
BOOL FTP_CloseFileTransferHandle(LPWININETFILE lpwfn); BOOL FTP_CloseFileTransferHandle(LPWININETFILE lpwfn);
BOOLAPI FTP_FtpPutFileA(HINTERNET hConnect, LPCSTR lpszLocalFile, BOOLAPI FTP_FtpPutFileW(HINTERNET hConnect, LPCWSTR lpszLocalFile,
LPCSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext); LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
BOOLAPI FTP_FtpSetCurrentDirectoryA(HINTERNET hConnect, LPCSTR lpszDirectory); BOOLAPI FTP_FtpSetCurrentDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory);
BOOLAPI FTP_FtpCreateDirectoryA(HINTERNET hConnect, LPCSTR lpszDirectory); BOOLAPI FTP_FtpCreateDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory);
INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileA(HINTERNET hConnect, INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(HINTERNET hConnect,
LPCSTR lpszSearchFile, LPWIN32_FIND_DATAA lpFindFileData, DWORD dwFlags, DWORD dwContext); LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
BOOLAPI FTP_FtpGetCurrentDirectoryA(HINTERNET hFtpSession, LPSTR lpszCurrentDirectory, BOOLAPI FTP_FtpGetCurrentDirectoryW(HINTERNET hFtpSession, LPWSTR lpszCurrentDirectory,
LPDWORD lpdwCurrentDirectory); LPDWORD lpdwCurrentDirectory);
BOOL FTP_ConvertFileProp(LPFILEPROPERTIESA lpafp, LPWIN32_FIND_DATAA lpFindFileData); BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
BOOL FTP_FtpRenameFileA(HINTERNET hFtpSession, LPCSTR lpszSrc, LPCSTR lpszDest); BOOL FTP_FtpRenameFileW(HINTERNET hFtpSession, LPCWSTR lpszSrc, LPCWSTR lpszDest);
BOOL FTP_FtpRemoveDirectoryA(HINTERNET hFtpSession, LPCSTR lpszDirectory); BOOL FTP_FtpRemoveDirectoryW(HINTERNET hFtpSession, LPCWSTR lpszDirectory);
BOOL FTP_FtpDeleteFileA(HINTERNET hFtpSession, LPCSTR lpszFileName); BOOL FTP_FtpDeleteFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName);
HINTERNET FTP_FtpOpenFileA(HINTERNET hFtpSession, LPCSTR lpszFileName, HINTERNET FTP_FtpOpenFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName,
DWORD fdwAccess, DWORD dwFlags, DWORD dwContext); DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
BOOLAPI FTP_FtpGetFileA(HINTERNET hInternet, LPCSTR lpszRemoteFile, LPCSTR lpszNewFile, BOOLAPI FTP_FtpGetFileW(HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
DWORD dwContext); DWORD dwContext);

View File

@ -219,6 +219,7 @@ VOID SendAsyncCallbackInt(LPWININETAPPINFOW hIC, HINTERNET hHttpSession,
DWORD dwContext, DWORD dwInternetStatus, LPVOID DWORD dwContext, DWORD dwInternetStatus, LPVOID
lpvStatusInfo, DWORD dwStatusInfoLength) lpvStatusInfo, DWORD dwStatusInfoLength)
{ {
LPVOID lpvNewInfo = NULL;
if (! (hIC->lpfnStatusCB)) if (! (hIC->lpfnStatusCB))
return; return;
@ -229,8 +230,14 @@ VOID SendAsyncCallbackInt(LPWININETAPPINFOW hIC, HINTERNET hHttpSession,
TRACE("--> Callback %ld (%s)\n",dwInternetStatus, get_callback_name(dwInternetStatus)); TRACE("--> Callback %ld (%s)\n",dwInternetStatus, get_callback_name(dwInternetStatus));
if(!(hIC->hdr.dwInternalFlags & INET_CALLBACKW)) {
if(dwInternetStatus == INTERNET_STATUS_RESOLVING_NAME)
lpvNewInfo = WININET_strdup_WtoA(lpvStatusInfo);
}
hIC->lpfnStatusCB(hHttpSession, dwContext, dwInternetStatus, hIC->lpfnStatusCB(hHttpSession, dwContext, dwInternetStatus,
lpvStatusInfo, dwStatusInfoLength); lpvNewInfo?lpvNewInfo:lpvStatusInfo, dwStatusInfoLength);
if(lpvNewInfo)
HeapFree(GetProcessHeap(), 0, lpvNewInfo);
TRACE("<-- Callback %ld (%s)\n",dwInternetStatus, get_callback_name(dwInternetStatus)); TRACE("<-- Callback %ld (%s)\n",dwInternetStatus, get_callback_name(dwInternetStatus));
} }

View File

@ -54,7 +54,7 @@
@ stdcall FtpCreateDirectoryA(ptr str) @ stdcall FtpCreateDirectoryA(ptr str)
@ stdcall FtpCreateDirectoryW(ptr wstr) @ stdcall FtpCreateDirectoryW(ptr wstr)
@ stdcall FtpDeleteFileA(ptr str) @ stdcall FtpDeleteFileA(ptr str)
@ stub FtpDeleteFileW @ stdcall FtpDeleteFileW(ptr wstr)
@ stdcall FtpFindFirstFileA(ptr str ptr long long) @ stdcall FtpFindFirstFileA(ptr str ptr long long)
@ stdcall FtpFindFirstFileW(ptr wstr ptr long long) @ stdcall FtpFindFirstFileW(ptr wstr ptr long long)
@ stdcall FtpGetCurrentDirectoryA(ptr str ptr) @ stdcall FtpGetCurrentDirectoryA(ptr str ptr)
@ -64,11 +64,11 @@
@ stdcall FtpOpenFileA(ptr str long long long) @ stdcall FtpOpenFileA(ptr str long long long)
@ stdcall FtpOpenFileW(ptr wstr long long long) @ stdcall FtpOpenFileW(ptr wstr long long long)
@ stdcall FtpPutFileA(ptr str str long long) @ stdcall FtpPutFileA(ptr str str long long)
@ stub FtpPutFileW @ stdcall FtpPutFileW(ptr wstr wstr long long)
@ stdcall FtpRemoveDirectoryA(ptr str) @ stdcall FtpRemoveDirectoryA(ptr str)
@ stub FtpRemoveDirectoryW @ stdcall FtpRemoveDirectoryW(ptr wstr)
@ stdcall FtpRenameFileA(ptr str str) @ stdcall FtpRenameFileA(ptr str str)
@ stub FtpRenameFileW @ stdcall FtpRenameFileW(ptr wstr wstr)
@ stdcall FtpSetCurrentDirectoryA(ptr str) @ stdcall FtpSetCurrentDirectoryA(ptr str)
@ stdcall FtpSetCurrentDirectoryW(ptr wstr) @ stdcall FtpSetCurrentDirectoryW(ptr wstr)
@ stdcall GetUrlCacheConfigInfoA(ptr ptr long) @ stdcall GetUrlCacheConfigInfoA(ptr ptr long)
@ -123,7 +123,7 @@
@ stub InternetDial @ stub InternetDial
@ stdcall InternetErrorDlg(long long long long ptr) @ stdcall InternetErrorDlg(long long long long ptr)
@ stdcall InternetFindNextFileA(ptr ptr) @ stdcall InternetFindNextFileA(ptr ptr)
@ stub InternetFindNextFileW @ stdcall InternetFindNextFileW(ptr ptr)
@ stub InternetGetCertByURL @ stub InternetGetCertByURL
@ stdcall InternetGetConnectedState(ptr long) @ stdcall InternetGetConnectedState(ptr long)
@ stdcall InternetGetConnectedStateExW(ptr ptr long long) @ stdcall InternetGetConnectedStateExW(ptr ptr long long)
@ -156,7 +156,7 @@
@ stdcall InternetSetOptionExW(ptr long ptr long long) @ stdcall InternetSetOptionExW(ptr long ptr long long)
@ stdcall InternetSetStatusCallback(ptr ptr) InternetSetStatusCallbackA @ stdcall InternetSetStatusCallback(ptr ptr) InternetSetStatusCallbackA
@ stdcall InternetSetStatusCallbackA(ptr ptr) @ stdcall InternetSetStatusCallbackA(ptr ptr)
@ stub InternetSetStatusCallbackW @ stdcall InternetSetStatusCallbackW(ptr ptr)
@ stub InternetShowSecurityInfoByURL @ stub InternetShowSecurityInfoByURL
@ stub InternetTimeFromSystemTime @ stub InternetTimeFromSystemTime
@ stub InternetTimeToSystemTime @ stub InternetTimeToSystemTime