Jacek Caban : wininet: Moved InternetFindNextFileW implementation to vtbl.
Alexandre Julliard
julliard at winehq.org
Thu Feb 28 06:21:19 CST 2008
Module: wine
Branch: master
Commit: 8c45eecca780c9920b8bb929baedeba7824bf32f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8c45eecca780c9920b8bb929baedeba7824bf32f
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Feb 27 18:55:09 2008 +0100
wininet: Moved InternetFindNextFileW implementation to vtbl.
---
dlls/wininet/ftp.c | 108 +++++++++++++++++++++++++----------------------
dlls/wininet/http.c | 4 +-
dlls/wininet/internet.c | 56 ++++++++----------------
dlls/wininet/internet.h | 2 +-
4 files changed, 80 insertions(+), 90 deletions(-)
diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c
index d81e242..8a8c484 100644
--- a/dlls/wininet/ftp.c
+++ b/dlls/wininet/ftp.c
@@ -1170,7 +1170,8 @@ static const HANDLEHEADERVtbl FTPFILEVtbl = {
FTPFILE_Destroy,
NULL,
NULL,
- FTPFILE_WriteFile
+ FTPFILE_WriteFile,
+ NULL
};
/***********************************************************************
@@ -2088,6 +2089,7 @@ static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
FTPSESSION_Destroy,
FTPSESSION_CloseConnection,
NULL,
+ NULL,
NULL
};
@@ -3083,91 +3085,97 @@ recv_end:
return (nRC != -1);
}
-
/***********************************************************************
- * FTP_FindNextFileW (Internal)
- *
- * Continues a file search from a previous call to FindFirstFile
- *
- * RETURNS
- * TRUE on success
- * FALSE on failure
+ * FTPFINDNEXT_Destroy (internal)
*
+ * Deallocate session handle
*/
-BOOL WINAPI FTP_FindNextFileW(LPWININETFTPFINDNEXTW lpwh, LPVOID lpvFindData)
+static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr)
{
- BOOL bSuccess = TRUE;
- LPWIN32_FIND_DATAW lpFindFileData;
-
- TRACE("index(%d) size(%d)\n", lpwh->index, lpwh->size);
-
- assert (lpwh->hdr.htype == WH_HFTPFINDNEXT);
+ LPWININETFTPFINDNEXTW lpwfn = (LPWININETFTPFINDNEXTW) hdr;
+ DWORD i;
- /* Clear any error information */
- INTERNET_SetLastError(0);
+ TRACE("\n");
- lpFindFileData = (LPWIN32_FIND_DATAW) lpvFindData;
- ZeroMemory(lpFindFileData, sizeof(WIN32_FIND_DATAA));
+ WININET_Release(&lpwfn->lpFtpSession->hdr);
- if (lpwh->index >= lpwh->size)
+ for (i = 0; i < lpwfn->size; i++)
{
- INTERNET_SetLastError(ERROR_NO_MORE_FILES);
- bSuccess = FALSE;
- goto lend;
+ HeapFree(GetProcessHeap(), 0, lpwfn->lpafp[i].lpszName);
}
- FTP_ConvertFileProp(&lpwh->lpafp[lpwh->index], lpFindFileData);
- lpwh->index++;
+ HeapFree(GetProcessHeap(), 0, lpwfn->lpafp);
+ HeapFree(GetProcessHeap(), 0, lpwfn);
+}
- TRACE("\nName: %s\nSize: %d\n", debugstr_w(lpFindFileData->cFileName), lpFindFileData->nFileSizeLow);
+static DWORD WINAPI FTPFINDNEXT_FindNextFileProc(WININETFTPFINDNEXTW *find, LPVOID data)
+{
+ WIN32_FIND_DATAW *find_data = data;
+ DWORD res = ERROR_SUCCESS;
-lend:
+ TRACE("index(%d) size(%d)\n", find->index, find->size);
+
+ ZeroMemory(find_data, sizeof(WIN32_FIND_DATAW));
- if (lpwh->hdr.dwFlags & INTERNET_FLAG_ASYNC)
+ if (find->index < find->size) {
+ FTP_ConvertFileProp(&find->lpafp[find->index], find_data);
+ find->index++;
+
+ TRACE("Name: %s\nSize: %d\n", debugstr_w(find_data->cFileName), find_data->nFileSizeLow);
+ }else {
+ res = ERROR_NO_MORE_FILES;
+ }
+
+ if (find->hdr.dwFlags & INTERNET_FLAG_ASYNC)
{
INTERNET_ASYNC_RESULT iar;
- iar.dwResult = (DWORD)bSuccess;
- iar.dwError = iar.dwError = bSuccess ? ERROR_SUCCESS :
- INTERNET_GetLastError();
+ iar.dwResult = (res == ERROR_SUCCESS);
+ iar.dwError = res;
- INTERNET_SendCallback(&lpwh->hdr, lpwh->hdr.dwContext,
+ INTERNET_SendCallback(&find->hdr, find->hdr.dwContext,
INTERNET_STATUS_REQUEST_COMPLETE, &iar,
sizeof(INTERNET_ASYNC_RESULT));
}
- return bSuccess;
+ return res;
}
-
-/***********************************************************************
- * FTPFINDNEXT_Destroy (internal)
- *
- * Deallocate session handle
- */
-static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr)
+static void FTPFINDNEXT_AsyncFindNextFileProc(WORKREQUEST *workRequest)
{
- LPWININETFTPFINDNEXTW lpwfn = (LPWININETFTPFINDNEXTW) hdr;
- DWORD i;
+ struct WORKREQ_FTPFINDNEXTW *req = &workRequest->u.FtpFindNextW;
- TRACE("\n");
+ FTPFINDNEXT_FindNextFileProc((WININETFTPFINDNEXTW*)workRequest->hdr, req->lpFindFileData);
+}
- WININET_Release(&lpwfn->lpFtpSession->hdr);
+static DWORD FTPFINDNEXT_FindNextFileW(WININETHANDLEHEADER *hdr, void *data)
+{
+ WININETFTPFINDNEXTW *find = (WININETFTPFINDNEXTW*)hdr;
- for (i = 0; i < lpwfn->size; i++)
+ if (find->lpFtpSession->lpAppInfo->hdr.dwFlags & INTERNET_FLAG_ASYNC)
{
- HeapFree(GetProcessHeap(), 0, lpwfn->lpafp[i].lpszName);
+ WORKREQUEST workRequest;
+ struct WORKREQ_FTPFINDNEXTW *req;
+
+ workRequest.asyncproc = FTPFINDNEXT_AsyncFindNextFileProc;
+ workRequest.hdr = WININET_AddRef( &find->hdr );
+ req = &workRequest.u.FtpFindNextW;
+ req->lpFindFileData = data;
+
+ INTERNET_AsyncCall(&workRequest);
+
+ return ERROR_SUCCESS;
}
- HeapFree(GetProcessHeap(), 0, lpwfn->lpafp);
- HeapFree(GetProcessHeap(), 0, lpwfn);
+ return FTPFINDNEXT_FindNextFileProc(find, data);
}
static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
FTPFINDNEXT_Destroy,
NULL,
NULL,
- NULL
+ NULL,
+ FTPFINDNEXT_FindNextFileW
};
/***********************************************************************
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index f3c2afc..432b142 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1422,7 +1422,8 @@ static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_Destroy,
HTTPREQ_CloseConnection,
HTTPREQ_SetOption,
- HTTPREQ_WriteFile
+ HTTPREQ_WriteFile,
+ NULL
};
/***********************************************************************
@@ -2946,6 +2947,7 @@ static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
HTTPSESSION_Destroy,
NULL,
NULL,
+ NULL,
NULL
};
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 1088519..feda307 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -475,6 +475,7 @@ static const HANDLEHEADERVtbl APPINFOVtbl = {
APPINFO_Destroy,
NULL,
NULL,
+ NULL,
NULL
};
@@ -944,53 +945,32 @@ BOOL WINAPI InternetFindNextFileA(HINTERNET hFind, LPVOID lpvFindData)
* FALSE on failure
*
*/
-static void AsyncFtpFindNextFileProc(WORKREQUEST *workRequest)
-{
- struct WORKREQ_FTPFINDNEXTW *req = &workRequest->u.FtpFindNextW;
- LPWININETFTPFINDNEXTW lpwh = (LPWININETFTPFINDNEXTW) workRequest->hdr;
-
- TRACE("%p\n", lpwh);
-
- FTP_FindNextFileW(lpwh, req->lpFindFileData);
-}
-
BOOL WINAPI InternetFindNextFileW(HINTERNET hFind, LPVOID lpvFindData)
{
- LPWININETAPPINFOW hIC = NULL;
- LPWININETFTPFINDNEXTW lpwh;
- BOOL bSuccess = FALSE;
+ WININETHANDLEHEADER *hdr;
+ DWORD res;
TRACE("\n");
- lpwh = (LPWININETFTPFINDNEXTW) WININET_GetObject( hFind );
- if (NULL == lpwh || lpwh->hdr.htype != WH_HFTPFINDNEXT)
- {
- FIXME("Only FTP supported\n");
- INTERNET_SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
- goto lend;
+ hdr = WININET_GetObject(hFind);
+ if(!hdr) {
+ WARN("Invalid handle\n");
+ SetLastError(ERROR_INVALID_HANDLE);
+ return FALSE;
}
- hIC = lpwh->lpFtpSession->lpAppInfo;
- if (hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC)
- {
- WORKREQUEST workRequest;
- struct WORKREQ_FTPFINDNEXTW *req;
+ if(hdr->vtbl->FindNextFileW) {
+ res = hdr->vtbl->FindNextFileW(hdr, lpvFindData);
+ }else {
+ WARN("Handle doesn't support NextFile\n");
+ res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
+ }
- workRequest.asyncproc = AsyncFtpFindNextFileProc;
- workRequest.hdr = WININET_AddRef( &lpwh->hdr );
- req = &workRequest.u.FtpFindNextW;
- req->lpFindFileData = lpvFindData;
+ WININET_Release(hdr);
- bSuccess = INTERNET_AsyncCall(&workRequest);
- }
- else
- {
- bSuccess = FTP_FindNextFileW(lpwh, lpvFindData);
- }
-lend:
- if( lpwh )
- WININET_Release( &lpwh->hdr );
- return bSuccess;
+ if(res != ERROR_SUCCESS)
+ SetLastError(res);
+ return res == ERROR_SUCCESS;
}
/***********************************************************************
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index c3321e1..6bda9ab 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -140,6 +140,7 @@ typedef struct {
void (*CloseConnection)(WININETHANDLEHEADER*);
DWORD (*SetOption)(WININETHANDLEHEADER*,DWORD,void*,DWORD);
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
+ DWORD (*FindNextFileW)(WININETHANDLEHEADER*,void*);
} HANDLEHEADERVtbl;
struct _WININETHANDLEHEADER
@@ -429,7 +430,6 @@ BOOLAPI FTP_FtpSetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDire
BOOLAPI FTP_FtpCreateDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(LPWININETFTPSESSIONW lpwfs,
LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD_PTR dwContext);
-BOOL WINAPI FTP_FindNextFileW(LPWININETFTPFINDNEXTW lpwh, LPVOID lpvFindData);
BOOLAPI FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszCurrentDirectory,
LPDWORD lpdwCurrentDirectory);
BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
More information about the wine-cvs
mailing list