wininet: Implement and test FtpCommand{A, W}.
This commit is contained in:
parent
5270b429fa
commit
9e934ee178
|
@ -4,6 +4,7 @@
|
||||||
* Copyright 1999 Corel Corporation
|
* Copyright 1999 Corel Corporation
|
||||||
* Copyright 2004 Mike McCormack for CodeWeavers
|
* Copyright 2004 Mike McCormack for CodeWeavers
|
||||||
* Copyright 2004 Kevin Koltzau
|
* Copyright 2004 Kevin Koltzau
|
||||||
|
* Copyright 2007 Hans Leidekker
|
||||||
*
|
*
|
||||||
* Ulrich Czekalla
|
* Ulrich Czekalla
|
||||||
* Noureddine Jemmali
|
* Noureddine Jemmali
|
||||||
|
@ -1863,10 +1864,34 @@ lend:
|
||||||
BOOL WINAPI FtpCommandA( HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags,
|
BOOL WINAPI FtpCommandA( HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags,
|
||||||
LPCSTR lpszCommand, DWORD_PTR dwContext, HINTERNET* phFtpCommand )
|
LPCSTR lpszCommand, DWORD_PTR dwContext, HINTERNET* phFtpCommand )
|
||||||
{
|
{
|
||||||
FIXME("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
|
BOOL r;
|
||||||
|
WCHAR *cmdW;
|
||||||
|
|
||||||
|
TRACE("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
|
||||||
debugstr_a(lpszCommand), dwContext, phFtpCommand);
|
debugstr_a(lpszCommand), dwContext, phFtpCommand);
|
||||||
|
|
||||||
return TRUE;
|
if (fExpectResponse)
|
||||||
|
{
|
||||||
|
FIXME("data connection not supported\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lpszCommand || !lpszCommand[0])
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(cmdW = WININET_strdup_AtoW(lpszCommand)))
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = FtpCommandW(hConnect, fExpectResponse, dwFlags, cmdW, dwContext, phFtpCommand);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, cmdW);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -1875,10 +1900,82 @@ BOOL WINAPI FtpCommandA( HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags
|
||||||
BOOL WINAPI FtpCommandW( HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags,
|
BOOL WINAPI FtpCommandW( HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags,
|
||||||
LPCWSTR lpszCommand, DWORD_PTR dwContext, HINTERNET* phFtpCommand )
|
LPCWSTR lpszCommand, DWORD_PTR dwContext, HINTERNET* phFtpCommand )
|
||||||
{
|
{
|
||||||
FIXME("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
|
BOOL r = FALSE;
|
||||||
debugstr_w(lpszCommand), dwContext, phFtpCommand);
|
LPWININETFTPSESSIONW lpwfs;
|
||||||
|
LPSTR cmd = NULL;
|
||||||
|
DWORD len, nBytesSent= 0;
|
||||||
|
INT nResCode, nRC = 0;
|
||||||
|
|
||||||
return TRUE;
|
TRACE("%p %d 0x%08x %s 0x%08lx %p\n", hConnect, fExpectResponse, dwFlags,
|
||||||
|
debugstr_w(lpszCommand), dwContext, phFtpCommand);
|
||||||
|
|
||||||
|
if (!lpszCommand || !lpszCommand[0])
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fExpectResponse)
|
||||||
|
{
|
||||||
|
FIXME("data connection not supported\n");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
lpwfs = (LPWININETFTPSESSIONW) WININET_GetObject( hConnect );
|
||||||
|
if (!lpwfs)
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WH_HFTPSESSION != lpwfs->hdr.htype)
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
|
||||||
|
goto lend;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpwfs->download_in_progress != NULL)
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_FTP_TRANSFER_IN_PROGRESS);
|
||||||
|
goto lend;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = WideCharToMultiByte(CP_ACP, 0, lpszCommand, -1, NULL, 0, NULL, NULL) + strlen(szCRLF);
|
||||||
|
if ((cmd = HeapAlloc(GetProcessHeap(), 0, len )))
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, lpszCommand, -1, cmd, len, NULL, NULL);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
INTERNET_SetLastError(ERROR_OUTOFMEMORY);
|
||||||
|
goto lend;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcat(cmd, szCRLF);
|
||||||
|
len--;
|
||||||
|
|
||||||
|
TRACE("Sending (%s) len(%d)\n", cmd, len);
|
||||||
|
while ((nBytesSent < len) && (nRC != -1))
|
||||||
|
{
|
||||||
|
nRC = send(lpwfs->sndSocket, cmd + nBytesSent, len - nBytesSent, 0);
|
||||||
|
if (nRC != -1)
|
||||||
|
{
|
||||||
|
nBytesSent += nRC;
|
||||||
|
TRACE("Sent %d bytes\n", nRC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nBytesSent)
|
||||||
|
{
|
||||||
|
nResCode = FTP_ReceiveResponse(lpwfs, lpwfs->hdr.dwContext);
|
||||||
|
if (nResCode > 0 && nResCode < 400)
|
||||||
|
r = TRUE;
|
||||||
|
else
|
||||||
|
FTP_SetResponseError(nResCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
lend:
|
||||||
|
WININET_Release( &lpwfs->hdr );
|
||||||
|
HeapFree(GetProcessHeap(), 0, cmd);
|
||||||
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
* TODO:
|
* TODO:
|
||||||
* Add W-function tests.
|
* Add W-function tests.
|
||||||
* Add missing function tests:
|
* Add missing function tests:
|
||||||
* FtpCommand
|
|
||||||
* FtpFindFirstFile
|
* FtpFindFirstFile
|
||||||
* FtpGetCurrentDirectory
|
* FtpGetCurrentDirectory
|
||||||
* FtpGetFileSize
|
* FtpGetFileSize
|
||||||
|
@ -652,6 +651,46 @@ static void test_renamefile(HINTERNET hFtp, HINTERNET hConnect)
|
||||||
"Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
|
"Expected ERROR_INTERNET_INCORRECT_HANDLE_TYPE, got %d\n", GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_command(HINTERNET hFtp, HINTERNET hConnect)
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
DWORD error;
|
||||||
|
unsigned int i;
|
||||||
|
static const struct
|
||||||
|
{
|
||||||
|
BOOL ret;
|
||||||
|
DWORD error;
|
||||||
|
const char *cmd;
|
||||||
|
}
|
||||||
|
command_test[] =
|
||||||
|
{
|
||||||
|
{ FALSE, ERROR_INVALID_PARAMETER, NULL },
|
||||||
|
{ FALSE, ERROR_INVALID_PARAMETER, "" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "HELO" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, " SIZE" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE " },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg /welcome.msg" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "SIZE /welcome.msg " },
|
||||||
|
{ TRUE, ERROR_SUCCESS, "SIZE\t/welcome.msg" },
|
||||||
|
{ TRUE, ERROR_SUCCESS, "SIZE /welcome.msg" },
|
||||||
|
{ FALSE, ERROR_INTERNET_EXTENDED_ERROR, "PWD /welcome.msg" },
|
||||||
|
{ TRUE, ERROR_SUCCESS, "PWD" },
|
||||||
|
{ TRUE, ERROR_SUCCESS, "PWD\r\n" }
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(command_test) / sizeof(command_test[0]); i++)
|
||||||
|
{
|
||||||
|
SetLastError(0xdeadbeef);
|
||||||
|
ret = FtpCommandA(hFtp, FALSE, FTP_TRANSFER_TYPE_ASCII, command_test[i].cmd, 0, NULL);
|
||||||
|
error = GetLastError();
|
||||||
|
|
||||||
|
ok(ret == command_test[i].ret, "%d: expected FtpCommandA to %s\n", i, command_test[i].ret ? "succeed" : "fail");
|
||||||
|
ok(error == command_test[i].error, "%d: expected error %u, got %u\n", i, command_test[i].error, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(ftp)
|
START_TEST(ftp)
|
||||||
{
|
{
|
||||||
HANDLE hInternet, hFtp, hHttp;
|
HANDLE hInternet, hFtp, hHttp;
|
||||||
|
@ -693,6 +732,7 @@ START_TEST(ftp)
|
||||||
test_putfile(hFtp, hHttp);
|
test_putfile(hFtp, hHttp);
|
||||||
test_removedir(hFtp, hHttp);
|
test_removedir(hFtp, hHttp);
|
||||||
test_renamefile(hFtp, hHttp);
|
test_renamefile(hFtp, hHttp);
|
||||||
|
test_command(hFtp, hHttp);
|
||||||
|
|
||||||
InternetCloseHandle(hHttp);
|
InternetCloseHandle(hHttp);
|
||||||
InternetCloseHandle(hFtp);
|
InternetCloseHandle(hFtp);
|
||||||
|
|
Loading…
Reference in New Issue