59#define RESPONSE_TIMEOUT 30
107#define DATA_PACKET_SIZE 0x2000
114#define FTP_CONDITION_MASK 0x0007
203 BOOL fFailIfExists,
DWORD dwLocalFlagsAttribute,
DWORD dwInternetFlags,
232 lpwzNewRemoteFile =
strdupAtoW(lpszNewRemoteFile);
236 free(lpwzNewRemoteFile);
279 if (!lpszLocalFile || !lpszNewRemoteFile)
316 task->remote_file =
wcsdup(lpszNewRemoteFile);
318 task->context = dwContext;
325 lpszNewRemoteFile,
dwFlags, dwContext);
718 lpFindFileDataW = lpFindFileData?&wfd:
NULL;
720 free(lpwzSearchFile);
722 if (
ret && lpFindFileData)
784 task->find_file_data = lpFindFileData;
786 task->context = dwContext;
842 if (
name != lpszSearchFile)
844 lpszSearchPath =
strndupW(lpszSearchFile,
name - lpszSearchFile);
845 lpszSearchFile =
name;
856 if (nResCode == 125 || nResCode == 150)
863 hFindNext =
FTP_ReceiveFileList(lpwfs, nDataSocket, lpszSearchFile, lpFindFileData, dwContext);
866 if (nResCode != 226 && nResCode != 250)
875 free(lpszSearchPath);
923 if(lpdwCurrentDirectory) {
924 len = *lpdwCurrentDirectory;
925 if(lpszCurrentDirectory)
937 if (
ret && lpszCurrentDirectory)
940 if (lpdwCurrentDirectory) *lpdwCurrentDirectory =
len;
978 TRACE(
"%p %p %p\n", hFtpSession, lpszCurrentDirectory, lpdwCurrentDirectory);
993 if (!lpdwCurrentDirectory)
999 if (lpszCurrentDirectory ==
NULL)
1017 task->directory = lpszCurrentDirectory;
1018 task->directory_len = lpdwCurrentDirectory;
1025 lpdwCurrentDirectory);
1064 if (nResCode == 257)
1069 for (firstpos = 0, lastpos = 0; lpszResponseBuffer[lastpos]; lastpos++)
1071 if (
'"' == lpszResponseBuffer[lastpos])
1079 len = lastpos - firstpos;
1080 if (*lpdwCurrentDirectory >=
len)
1082 memcpy(lpszCurrentDirectory, &lpszResponseBuffer[firstpos + 1],
len *
sizeof(
WCHAR));
1083 lpszCurrentDirectory[
len - 1] = 0;
1084 *lpdwCurrentDirectory =
len;
1089 free(lpszResponseBuffer);
1137 if (nResCode > 0 && nResCode != 226)
WARN(
"server reports failed transfer\n");
1146 TRACE(
"INTERNET_OPTION_HANDLE_TYPE\n");
1159 TRACE(
"INTERNET_OPTION_DATAFILE_NAME\n");
1161 if (!
file->cache_file)
1197 if (
file->nDataSocket == -1)
1207 DWORD bytes_written;
1222 *written =
res>0 ?
res : 0;
1265 TRACE(
"%ld bytes of queued, but unread data\n", unread);
1375 memset(&uc, 0,
sizeof(uc));
1494 TRACE(
"(%p,%s,0x%08lx,0x%08lx,0x%08Ix)\n", hFtpSession,
1510 if ((!lpszFileName) ||
1531 task->access = fdwAccess;
1533 task->context = dwContext;
1561 BOOL fFailIfExists,
DWORD dwLocalFlagsAttribute,
DWORD dwInternetFlags,
1570 ret =
FtpGetFileW(hInternet, lpwzRemoteFile, lpwzNewFile, fFailIfExists,
1571 dwLocalFlagsAttribute, dwInternetFlags, dwContext);
1572 free(lpwzRemoteFile);
1612 BOOL fFailIfExists,
DWORD dwLocalFlagsAttribute,
DWORD dwInternetFlags,
1619 if (!lpszRemoteFile || !lpszNewFile)
1658 task->local_attr = dwLocalFlagsAttribute;
1659 task->fail_if_exists = fFailIfExists;
1660 task->flags = dwInternetFlags;
1661 task->context = dwContext;
1668 fFailIfExists, dwLocalFlagsAttribute, dwInternetFlags, dwContext);
1689 BOOL fFailIfExists,
DWORD dwLocalFlagsAttribute,
DWORD dwInternetFlags,
1724 if (nResCode == 226)
1760 FIXME(
"(%p, %p)\n",
hFile, lpdwFileSizeHigh);
1762 if (lpdwFileSizeHigh)
1763 *lpdwFileSizeHigh = 0;
1883 TRACE(
"%p\n", lpwfs);
1894 if (nResCode == 250)
1932 free(lpwzDirectory);
2036 if (nResCode == 250)
2188 if (nResCode == 350)
2196 if (nResCode == 250)
2225 TRACE(
"%p %d 0x%08lx %s 0x%08Ix %p\n", hConnect, fExpectResponse,
dwFlags,
2226 debugstr_a(lpszCommand), dwContext, phFtpCommand);
2228 if (fExpectResponse)
2230 FIXME(
"data connection not supported\n");
2234 if (!lpszCommand || !lpszCommand[0])
2262 INT nResCode, nRC = 0;
2264 TRACE(
"%p %d 0x%08lx %s 0x%08Ix %p\n", hConnect, fExpectResponse,
dwFlags,
2265 debugstr_w(lpszCommand), dwContext, phFtpCommand);
2267 if (!lpszCommand || !lpszCommand[0])
2273 if (fExpectResponse)
2275 FIXME(
"data connection not supported\n");
2311 while ((nBytesSent <
len) && (nRC != -1))
2317 TRACE(
"Sent %d bytes\n", nRC);
2324 if (nResCode > 0 && nResCode < 400)
2384 TRACE(
"INTERNET_OPTION_HANDLE_TYPE\n");
2433 DWORD dwInternalFlags)
2442 TRACE(
"%p Server(%s) Port(%d) User(%s) Paswd(%s)\n",
2481 FIXME(
"Several proxies not implemented.\n");
2483 FIXME(
"Proxy bypass is ignored.\n");
2485 if (!lpszUserName || !lpszUserName[0]) {
2502 TRACE(
"Password used for anonymous ftp : (%s)\n",
debugstr_w(szPassword));
2527 sock_namelen =
sizeof(socketAddr);
2542 szaddr,
strlen(szaddr)+1);
2553 szaddr,
strlen(szaddr)+1);
2555 if (
connect(nsocket, (
struct sockaddr *)&socketAddr, sock_namelen) < 0)
2563 TRACE(
"Connected to server\n");
2566 szaddr,
strlen(szaddr)+1);
2573 TRACE(
"Successfully logged into server\n");
2614 if (nResCode == 230)
2617 else if (nResCode == 331)
2620 else if (nResCode == 332)
2626 TRACE(
"Returning %d\n", bSuccess);
2658 if (
sock_recv(nSocket, &lpszBuffer[nRecv], 1, 0) <= 0)
2664 if (lpszBuffer[nRecv] ==
'\n')
2666 lpszBuffer[nRecv] =
'\0';
2668 TRACE(
":%d %s\n", nRecv, lpszBuffer);
2671 if (lpszBuffer[nRecv] !=
'\r')
2699 DWORD nBytesSent = 0;
2710 dwParamLen = lpszParam?
strlen(lpszParam)+1:0;
2718 dwParamLen ? lpszParam :
"",
szCRLF);
2721 while((nBytesSent <
len) && (nRC != -1))
2731 &nBytesSent,
sizeof(
DWORD));
2734 TRACE(
"Sent %ld bytes\n", nBytesSent);
2773 char firstprefix[5];
2789 if(lpszResponse[3] !=
'-')
2794 memcpy(firstprefix, lpszResponse, 3);
2795 firstprefix[3] =
' ';
2796 firstprefix[4] =
'\0';
2801 if(!
memcmp(firstprefix, lpszResponse, 4))
2809 rc =
atoi(lpszResponse);
2812 &nRecv,
sizeof(
DWORD));
2816 TRACE(
"return %d\n", rc);
2843 TRACE(
"Received reply code %d\n", nResCode);
2845 if (nResCode == 230)
2849 else if (nResCode == 332)
2856 TRACE(
"Returning %d\n", bSuccess);
2921 if (nResCode == 150 || nResCode == 125)
2959 TRACE(
"Unable to create listening socket\n");
2971 TRACE(
"Unable to bind socket\n");
2977 TRACE(
"listen failed\n");
3059 if (nResCode == 213) {
3064 for (
i = 0; (lpszResponseBuffer[
i] !=
' ') && (lpszResponseBuffer[
i] !=
'\0');
i++) ;
3065 if (lpszResponseBuffer[
i] ==
'\0')
return FALSE;
3093 WCHAR szIPAddress[64];
3111 if (nResCode == 200)
3145 if (nResCode == 227)
3151 char *
pAddr, *pPort;
3155 p = lpszResponseBuffer+4;
3156 while (*
p !=
'\0' && (*
p <
'0' || *
p >
'9'))
p++;
3160 ERR(
"no address found in response, aborting\n");
3164 if (
sscanf(
p,
"%d,%d,%d,%d,%d,%d", &
f[0], &
f[1], &
f[2], &
f[3],
3167 ERR(
"unknown response address format '%s', aborting\n",
p);
3170 for (
i=0;
i < 6;
i++)
3175 pPort = (
char *)&(dataSocketAddress.
sin_port);
3187 if (
connect(nsocket, (
struct sockaddr *)&dataSocketAddress,
sizeof(dataSocketAddress)))
3189 ERR(
"can't connect passive FTP data port.\n");
3251 return *nDataSocket != -1;
3268 DWORD nBytesRead = 0;
3269 DWORD nBytesSent = 0;
3270 DWORD nTotalSent = 0;
3271 DWORD nBytesToSend, nLen;
3273 time_t s_long_time, e_long_time;
3286 nBytesToSend = nBytesRead - nBytesSent;
3288 if (nBytesToSend <= 0)
3293 ERR(
"Failed reading from file\n");
3296 nBytesToSend = nBytesRead;
3303 nRC =
sock_send(nDataSocket, lpszBuffer, nLen, 0);
3313 nSeconds = e_long_time - s_long_time;
3314 if( nSeconds / 60 > 0 )
3316 TRACE(
"%ld bytes of %ld bytes (%ld%%) in %ld min %ld sec estimated remaining time %ld sec\n",
3318 nSeconds % 60, (fi.
nFileSizeLow - nTotalSent) * nSeconds / nTotalSent );
3322 TRACE(
"%ld bytes of %ld bytes (%ld%%) in %ld sec estimated remaining time %ld sec\n",
3324 (fi.
nFileSizeLow - nTotalSent) * nSeconds / nTotalSent);
3326 }
while (nRC != -1);
3328 TRACE(
"file transfer complete!\n");
3364 if ((nResCode != 125) && (nResCode != 150)) {
3393 DWORD nBytesWritten;
3400 if (
NULL == lpszBuffer)
3418 TRACE(
"Data transfer complete\n");
3439 for (
i = 0;
i < lpwfn->
size;
i++)
3495 TRACE(
"INTERNET_OPTION_HANDLE_TYPE\n");
3555 TRACE(
"(%p,%d,%s,%p,%08Ix)\n", lpwfs, nSocket,
debugstr_w(lpszSearchFile), lpFindFileData, dwContext);
3569 lpwfn->
lpafp = lpafp;
3631 static const char szSpace[] =
" \t";
3644 pszToken =
strtok(pszLine, szSpace);
3654 for(
i=0;
i<=3;
i++) {
3658 if(!pszToken)
continue;
3660 TRACE(
"Is directory\n");
3664 TRACE(
"Size: %s\n", pszToken);
3677 if(!pszToken)
continue;
3678 if(
strlen(pszToken) >= 3) {
3685 if(!pszToken)
continue;
3689 if(!pszToken)
continue;
3690 if((pszTmp =
strchr(pszToken,
':'))) {
3703 TRACE(
"Mod time: %02d:%02d:%02d %04d/%02d/%02d\n",
3708 if(!pszToken)
continue;
3718 int mon, mday, year, hour,
min;
3721 sscanf(pszToken,
"%d-%d-%d", &mon, &mday, &year);
3730 if(!pszToken)
continue;
3734 if((pszToken[5] ==
'P') && (pszToken[6] ==
'M')) {
3739 TRACE(
"Mod time: %02d:%02d:%02d %04d/%02d/%02d\n",
3744 if(!pszToken)
continue;
3745 if(!
stricmp(pszToken,
"<DIR>")) {
3748 TRACE(
"Is directory\n");
3757 if(!pszToken)
continue;
3762 else if(pszToken[0] ==
'+') {
3763 FIXME(
"EPLF Format not implemented\n");
3767 if((lpszSearchFile ==
NULL) ||
3794 INT sizeFilePropArray = 500;
3795 INT indexFilePropArray = -1;
3805 if (indexFilePropArray+1 >= sizeFilePropArray)
3818 sizeFilePropArray *= 2;
3820 indexFilePropArray++;
3821 }
while (
FTP_ParseNextFile(nSocket, lpszSearchFile, &(*lpafp)[indexFilePropArray]));
3823 if (bSuccess && indexFilePropArray)
3825 if (indexFilePropArray < sizeFilePropArray - 1)
3833 *dwfp = indexFilePropArray;
3859 unsigned short nPermission = 0;
3864 if ((*lpszPermission !=
'd') && (*lpszPermission !=
'-') && (*lpszPermission !=
'l'))
3876 nPermission |= (*(lpszPermission+1) ==
'r' ? 1 : 0) << 8;
3879 nPermission |= (*(lpszPermission+2) ==
'w' ? 1 : 0) << 7;
3882 nPermission |= (*(lpszPermission+3) ==
'x' ? 1 : 0) << 6;
3885 nPermission |= (*(lpszPermission+4) ==
'r' ? 1 : 0) << 5;
3888 nPermission |= (*(lpszPermission+5) ==
'w' ? 1 : 0) << 4;
3891 nPermission |= (*(lpszPermission+6) ==
'x' ? 1 : 0) << 3;
3894 nPermission |= (*(lpszPermission+7) ==
'r' ? 1 : 0) << 2;
3897 nPermission |= (*(lpszPermission+8) ==
'w' ? 1 : 0) << 1;
3900 nPermission |= (*(lpszPermission+9) ==
'x' ? 1 : 0);
3904 }
while (nPos <= nLast);
static char * strdupWtoA(const WCHAR *str)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_add_head(struct list_entry *head, struct list_entry *entry)
#define RegCloseKey(hKey)
#define ERROR_INSUFFICIENT_BUFFER
static int find_data(const struct Vector *v, const void *pData, int size)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
LPSTR WINAPI StrStrIA(LPCSTR lpszStr, LPCSTR lpszSearch)
static WCHAR available[MAX_STRING_RESOURCE_LEN]
static WCHAR * strdupAtoW(const char *str)
#define ERROR_INVALID_PARAMETER
#define ReadFile(a, b, c, d, e)
#define INVALID_HANDLE_VALUE
#define stricmp(_String1, _String2)
#define ERROR_NOT_SUPPORTED
#define ERROR_INVALID_HANDLE
#define FILE_ATTRIBUTE_NORMAL
#define WideCharToMultiByte
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
BOOL WINAPI GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)
BOOL WINAPI WriteFile(_In_ HANDLE hFile, _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer, _In_ DWORD nNumberOfBytesToWrite, _Out_opt_ LPDWORD lpNumberOfBytesWritten, _Inout_opt_ LPOVERLAPPED lpOverlapped)
BOOL WINAPI SystemTimeToFileTime(IN CONST SYSTEMTIME *lpSystemTime, OUT LPFILETIME lpFileTime)
VOID WINAPI GetLocalTime(OUT LPSYSTEMTIME lpSystemTime)
BOOL WINAPI PathMatchSpecW(const WCHAR *path, const WCHAR *mask)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl sscanf(const char *, const char *,...) __WINE_CRT_SCANF_ATTR(2
_ACRTIMP __msvcrt_long __cdecl atol(const char *)
_ACRTIMP int __cdecl atoi(const char *)
_ACRTIMP char *__cdecl strchr(const char *, int)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP char *__cdecl strtok(char *, const char *)
static wchar_t * wcsdup(const wchar_t *str)
static int sock_send(int fd, const void *msg, size_t len, WSAOVERLAPPED *ovr)
static int sock_recv(int fd, void *msg, size_t len, int flags)
static BOOL FTP_FtpGetCurrentDirectoryW(ftp_session_t *, LPWSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
static BOOL FTP_GetDataSocket(ftp_session_t *, LPINT nDataSocket)
static const object_vtbl_t FTPSESSIONVtbl
BOOL WINAPI FtpRenameFileA(HINTERNET hFtpSession, LPCSTR lpszSrc, LPCSTR lpszDest)
BOOL WINAPI FtpRemoveDirectoryW(HINTERNET hFtpSession, LPCWSTR lpszDirectory)
static DWORD FTPFINDNEXT_FindNextFileProc(WININETFTPFINDNEXTW *find, LPVOID data)
static void AsyncFtpRemoveDirectoryProc(task_header_t *hdr)
DWORD WINAPI FtpGetFileSize(HINTERNET hFile, LPDWORD lpdwFileSizeHigh)
BOOL WINAPI FtpRenameFileW(HINTERNET hFtpSession, LPCWSTR lpszSrc, LPCWSTR lpszDest)
static BOOL FTP_ParseNextFile(INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW fileprop)
static const CHAR *const szFtpCommands[]
static const CHAR szMonths[]
BOOL WINAPI FtpCommandW(HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags, LPCWSTR lpszCommand, DWORD_PTR dwContext, HINTERNET *phFtpCommand)
static void AsyncFtpPutFileProc(task_header_t *hdr)
BOOL WINAPI FtpCreateDirectoryA(HINTERNET hConnect, LPCSTR lpszDirectory)
BOOL WINAPI FtpGetFileW(HINTERNET hInternet, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
HINTERNET WINAPI FtpFindFirstFileA(HINTERNET hConnect, LPCSTR lpszSearchFile, LPWIN32_FIND_DATAA lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
static BOOL FTP_SendPassword(ftp_session_t *)
static DWORD FTP_SetResponseError(DWORD dwResponse)
static BOOL FTP_DoPassive(ftp_session_t *)
static void AsyncFtpGetFileProc(task_header_t *hdr)
BOOL WINAPI FtpSetCurrentDirectoryA(HINTERNET hConnect, LPCSTR lpszDirectory)
HINTERNET WINAPI FtpOpenFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
static BOOL FTP_SendType(ftp_session_t *, DWORD dwType)
HINTERNET WINAPI FtpOpenFileA(HINTERNET hFtpSession, LPCSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
static BOOL FTP_ParsePermission(LPCSTR lpszPermission, LPFILEPROPERTIESW lpfp)
static BOOL FTP_SendPort(ftp_session_t *)
BOOL WINAPI FtpPutFileA(HINTERNET hConnect, LPCSTR lpszLocalFile, LPCSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
static DWORD FTPFILE_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
BOOL WINAPI FtpCreateDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory)
static LPSTR FTP_GetNextLine(INT nSocket, LPDWORD dwLen)
static const object_vtbl_t FTPFINDNEXTVtbl
static BOOL FTP_InitListenSocket(ftp_session_t *)
static void AsyncFtpCreateDirectoryProc(task_header_t *hdr)
BOOL WINAPI FtpDeleteFileW(HINTERNET hFtpSession, LPCWSTR lpszFileName)
static BOOL res_to_le(DWORD res)
BOOL WINAPI FtpSetCurrentDirectoryW(HINTERNET hConnect, LPCWSTR lpszDirectory)
static BOOL FTP_SendAccount(ftp_session_t *)
static void FTP_ReceiveRequestData(ftp_file_t *file, BOOL first_notif)
static DWORD FTPFINDNEXT_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
static void AsyncFtpDeleteFileProc(task_header_t *hdr)
static void AsyncFtpSetCurrentDirectoryProc(task_header_t *hdr)
static BOOL FTP_SendData(ftp_session_t *, INT nDataSocket, HANDLE hFile)
static DWORD FTPFINDNEXT_FindNextFileW(object_header_t *hdr, void *data)
static BOOL FTP_ParseDirectory(ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPFILEPROPERTIESW *lpafp, LPDWORD dwfp)
static HINTERNET FTP_FtpFindFirstFileW(ftp_session_t *, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
static void AsyncFtpOpenFileProc(task_header_t *hdr)
static DWORD FTPFILE_QueryDataAvailable(object_header_t *hdr, DWORD *available, DWORD flags, DWORD_PTR ctx)
static DWORD FTPFILE_ReadFile(object_header_t *hdr, void *buffer, DWORD size, DWORD *read, DWORD flags, DWORD_PTR context)
HINTERNET WINAPI FtpFindFirstFileW(HINTERNET hConnect, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext)
static BOOL FTP_SendCommand(INT nSocket, FTP_COMMAND ftpCmd, LPCWSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
static BOOL FTP_FtpDeleteFileW(ftp_session_t *, LPCWSTR lpszFileName)
static void AsyncFtpRenameFileProc(task_header_t *hdr)
static HINTERNET FTP_ReceiveFileList(ftp_session_t *, INT nSocket, LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD_PTR dwContext)
static HINTERNET FTP_FtpOpenFileW(ftp_session_t *lpwfs, LPCWSTR lpszFileName, DWORD fdwAccess, DWORD dwFlags, DWORD_PTR dwContext)
static BOOL FTP_SendPortOrPasv(ftp_session_t *)
BOOL WINAPI FtpRemoveDirectoryA(HINTERNET hFtpSession, LPCSTR lpszDirectory)
static const object_vtbl_t FTPFILEVtbl
HINTERNET FTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName, INTERNET_PORT nServerPort, LPCWSTR lpszUserName, LPCWSTR lpszPassword, DWORD dwFlags, DWORD_PTR dwContext, DWORD dwInternalFlags)
BOOL WINAPI FtpDeleteFileA(HINTERNET hFtpSession, LPCSTR lpszFileName)
struct WININETFTPFINDNEXTW * LPWININETFTPFINDNEXTW
static BOOL FTP_FtpRenameFileW(ftp_session_t *, LPCWSTR lpszSrc, LPCWSTR lpszDest)
static void FTPSESSION_Destroy(object_header_t *hdr)
BOOL WINAPI FtpPutFileW(HINTERNET hConnect, LPCWSTR lpszLocalFile, LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
BOOL WINAPI FtpGetCurrentDirectoryW(HINTERNET hFtpSession, LPWSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
static BOOL FTP_FtpSetCurrentDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
static BOOL FTP_FtpRemoveDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
static void FTPFILE_AsyncQueryDataAvailableProc(task_header_t *task)
static BOOL FTP_SendCommandA(INT nSocket, FTP_COMMAND ftpCmd, LPCSTR lpszParam, INTERNET_STATUS_CALLBACK lpfnStatusCB, object_header_t *hdr, DWORD_PTR dwContext)
static DWORD FTPFILE_LockRequestFile(object_header_t *hdr, req_file_t **ret)
#define FTP_CONDITION_MASK
static DWORD FTPFILE_WriteFile(object_header_t *hdr, const void *buffer, DWORD size, DWORD *written)
static DWORD FTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
BOOL WINAPI FtpGetCurrentDirectoryA(HINTERNET hFtpSession, LPSTR lpszCurrentDirectory, LPDWORD lpdwCurrentDirectory)
static void AsyncFtpFindFirstFileProc(task_header_t *hdr)
static BOOL FTP_FtpPutFileW(ftp_session_t *, LPCWSTR lpszLocalFile, LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD_PTR dwContext)
BOOL WINAPI FtpCommandA(HINTERNET hConnect, BOOL fExpectResponse, DWORD dwFlags, LPCSTR lpszCommand, DWORD_PTR dwContext, HINTERNET *phFtpCommand)
static BOOL FTP_FtpGetFileW(ftp_session_t *, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
static INT FTP_ReceiveResponse(ftp_session_t *, DWORD_PTR dwContext)
static void FTPFILE_Destroy(object_header_t *hdr)
static void FTPFINDNEXT_Destroy(object_header_t *hdr)
static BOOL FTP_SendStore(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
static BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData)
static BOOL FTP_SendRetrieve(ftp_session_t *, LPCWSTR lpszRemoteFile, DWORD dwType)
static void FTPFINDNEXT_AsyncFindNextFileProc(task_header_t *hdr)
static BOOL FTP_RetrieveFileData(ftp_session_t *, INT nDataSocket, HANDLE hFile)
static void AsyncFtpGetCurrentDirectoryProc(task_header_t *hdr)
BOOL WINAPI FtpGetFileA(HINTERNET hInternet, LPCSTR lpszRemoteFile, LPCSTR lpszNewFile, BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags, DWORD_PTR dwContext)
static BOOL FTP_ConnectToHost(ftp_session_t *)
static void FTPSESSION_CloseConnection(object_header_t *hdr)
struct FILEPROPERTIESW * LPFILEPROPERTIESW
static BOOL FTP_FtpCreateDirectoryW(ftp_session_t *, LPCWSTR lpszDirectory)
BOOL WININET_Release(object_header_t *info)
DWORD INTERNET_AsyncCall(task_header_t *task)
object_header_t * WININET_AddRef(object_header_t *info)
DWORD INTERNET_GetLastError(void)
LPSTR INTERNET_GetResponseBuffer(void)
void INTERNET_SetLastError(DWORD dwError)
BOOL WINAPI InternetCreateUrlW(LPURL_COMPONENTSW lpUrlComponents, DWORD dwFlags, LPWSTR lpszUrl, LPDWORD lpdwUrlLength)
DWORD INET_SetOption(object_header_t *hdr, DWORD option, void *buf, DWORD size)
void * alloc_async_task(object_header_t *hdr, async_task_proc_t proc, size_t size)
object_header_t * get_handle_object(HINTERNET hinternet)
DWORD INET_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
void * alloc_object(object_header_t *parent, const object_vtbl_t *vtbl, size_t size)
BOOL WINAPI CreateUrlCacheEntryW(LPCWSTR lpszUrlName, DWORD dwExpectedFileSize, LPCWSTR lpszFileExtension, LPWSTR lpszFileName, DWORD dwReserved)
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER pAddr
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLenum GLuint GLenum GLsizei const GLchar * buf
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpvStatusInfo, DWORD dwStatusInfoLength)
static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
BOOL GetAddress(const WCHAR *, INTERNET_PORT, SOCKADDR *, int *, char *)
#define memcpy(s1, s2, n)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define FILE_ATTRIBUTE_DIRECTORY
INT WSAAPI getsockname(IN SOCKET s, OUT LPSOCKADDR name, IN OUT INT FAR *namelen)
INT WSAAPI listen(IN SOCKET s, IN INT backlog)
INT WSAAPI bind(IN SOCKET s, IN CONST struct sockaddr *name, IN INT namelen)
SOCKET WSAAPI accept(IN SOCKET s, OUT LPSOCKADDR addr, OUT INT FAR *addrlen)
SYSTEMTIME tmLastModified
unsigned short permissions
ftp_session_t * lpFtpSession
_Field_z_ WCHAR cFileName[MAX_PATH]
FILETIME ftLastAccessTime
ftp_file_t * download_in_progress
struct sockaddr_in lstnSocketAddress
struct sockaddr_in socketAddress
WIN32_FIND_DATAW * find_file_data
WIN32_FIND_DATAW * find_data
ftp_session_t * lpFtpSession
static WCHAR * strndupW(LPCWSTR str, int len)
DWORD WINAPI GetLastError(void)
_In_opt_ LPSTR _In_opt_ LPSTR lpszPassword
#define ERROR_NO_MORE_FILES
#define INTERNET_SCHEME_FTP
#define INTERNET_DEFAULT_FTP_PORT
#define INTERNET_STATUS_RECEIVING_RESPONSE
#define ERROR_INTERNET_EXTENDED_ERROR
#define INTERNET_STATUS_CONNECTION_CLOSED
#define INTERNET_ERROR_BASE
#define INTERNET_FLAG_TRANSFER_ASCII
#define INTERNET_FLAG_ASYNC
#define INTERNET_STATUS_REQUEST_SENT
VOID(CALLBACK * INTERNET_STATUS_CALLBACK)(_In_ HINTERNET, _In_opt_ DWORD_PTR, _In_ DWORD, _In_opt_ LPVOID, _In_ DWORD)
#define ERROR_INTERNET_ITEM_NOT_FOUND
#define INTERNET_FLAG_PASSIVE
#define FTP_TRANSFER_TYPE_BINARY
#define ERROR_INTERNET_TIMEOUT
#define INTERNET_STATUS_SENDING_REQUEST
#define INTERNET_OPTION_DATAFILE_NAME
#define ERROR_INTERNET_DISCONNECTED
#define ERROR_INTERNET_CONNECTION_ABORTED
#define INTERNET_HANDLE_TYPE_FTP_FIND
#define INTERNET_STATUS_RESOLVING_NAME
#define ERROR_INTERNET_LOGIN_FAILURE
#define INTERNET_STATUS_RESPONSE_RECEIVED
#define INTERNET_STATUS_REQUEST_COMPLETE
#define INTERNET_STATUS_CONNECTING_TO_SERVER
#define ERROR_FTP_TRANSFER_IN_PROGRESS
#define INTERNET_OPEN_TYPE_PROXY
#define INTERNET_INVALID_PORT_NUMBER
#define INTERNET_STATUS_HANDLE_CREATED
#define ERROR_INTERNET_CANNOT_CONNECT
#define INTERNET_HANDLE_TYPE_CONNECT_FTP
#define ERROR_INTERNET_NAME_NOT_RESOLVED
#define INTERNET_STATUS_CONNECTED_TO_SERVER
#define INTERNET_STATUS_NAME_RESOLVED
#define INTERNET_OPTION_HANDLE_TYPE
#define INTERNET_HANDLE_TYPE_FTP_FILE
#define ERROR_INTERNET_INCORRECT_HANDLE_TYPE
#define INTERNET_STATUS_CLOSING_CONNECTION
#define HKEY_CURRENT_USER
int PASCAL FAR WSAGetLastError(void)