wininet: Use vtbl in InternetWriteFile implementation.

This commit is contained in:
Jacek Caban 2008-02-26 20:21:34 +01:00 committed by Alexandre Julliard
parent 7dc9bf677b
commit 1ffcfbce85
4 changed files with 38 additions and 40 deletions

View File

@ -1155,9 +1155,21 @@ static void FTPFILE_Destroy(WININETHANDLEHEADER *hdr)
HeapFree(GetProcessHeap(), 0, lpwh);
}
static BOOL FTPFILE_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
LPWININETFTPFILE lpwh = (LPWININETFTPFILE) hdr;
int res;
res = send(lpwh->nDataSocket, buffer, size, 0);
*written = res>0 ? res : 0;
return res >= 0;
}
static const HANDLEHEADERVtbl FTPFILEVtbl = {
FTPFILE_Destroy,
NULL
NULL,
FTPFILE_WriteFile
};
/***********************************************************************
@ -2073,7 +2085,8 @@ static void FTPSESSION_CloseConnection(WININETHANDLEHEADER *hdr)
static const HANDLEHEADERVtbl FTPSESSIONVtbl = {
FTPSESSION_Destroy,
FTPSESSION_CloseConnection
FTPSESSION_CloseConnection,
NULL
};
@ -3150,6 +3163,7 @@ static void FTPFINDNEXT_Destroy(WININETHANDLEHEADER *hdr)
static const HANDLEHEADERVtbl FTPFINDNEXTVtbl = {
FTPFINDNEXT_Destroy,
NULL,
NULL
};

View File

@ -1392,9 +1392,17 @@ static void HTTPREQ_CloseConnection(WININETHANDLEHEADER *hdr)
INTERNET_STATUS_CONNECTION_CLOSED, 0, 0);
}
static BOOL HTTPREQ_WriteFile(WININETHANDLEHEADER *hdr, const void *buffer, DWORD size, DWORD *written)
{
LPWININETHTTPREQW lpwhr = (LPWININETHTTPREQW)hdr;
return NETCON_send(&lpwhr->netConnection, buffer, size, 0, (LPINT)written);
}
static const HANDLEHEADERVtbl HTTPREQVtbl = {
HTTPREQ_Destroy,
HTTPREQ_CloseConnection
HTTPREQ_CloseConnection,
HTTPREQ_WriteFile
};
/***********************************************************************
@ -2916,6 +2924,7 @@ static void HTTPSESSION_Destroy(WININETHANDLEHEADER *hdr)
static const HANDLEHEADERVtbl HTTPSESSIONVtbl = {
HTTPSESSION_Destroy,
NULL,
NULL
};

View File

@ -473,6 +473,7 @@ static VOID APPINFO_Destroy(WININETHANDLEHEADER *hdr)
static const HANDLEHEADERVtbl APPINFOVtbl = {
APPINFO_Destroy,
NULL,
NULL
};
@ -1692,48 +1693,24 @@ DWORD WINAPI InternetSetFilePointer(HINTERNET hFile, LONG lDistanceToMove,
* FALSE on failure
*
*/
BOOL WINAPI InternetWriteFile(HINTERNET hFile, LPCVOID lpBuffer ,
BOOL WINAPI InternetWriteFile(HINTERNET hFile, LPCVOID lpBuffer,
DWORD dwNumOfBytesToWrite, LPDWORD lpdwNumOfBytesWritten)
{
BOOL retval = FALSE;
int nSocket = -1;
LPWININETHANDLEHEADER lpwh;
BOOL retval = FALSE;
TRACE("(%p %p %d %p)\n", hFile, lpBuffer, dwNumOfBytesToWrite, lpdwNumOfBytesWritten);
TRACE("\n");
lpwh = WININET_GetObject( hFile );
if (NULL == lpwh)
return FALSE;
switch (lpwh->htype)
{
case WH_HHTTPREQ:
{
LPWININETHTTPREQW lpwhr;
lpwhr = (LPWININETHTTPREQW)lpwh;
TRACE("HTTPREQ %i\n",dwNumOfBytesToWrite);
retval = NETCON_send(&lpwhr->netConnection, lpBuffer,
dwNumOfBytesToWrite, 0, (LPINT)lpdwNumOfBytesWritten);
WININET_Release( lpwh );
return retval;
}
break;
case WH_HFILE:
nSocket = ((LPWININETFTPFILE)lpwh)->nDataSocket;
break;
default:
break;
if(lpwh && lpwh->vtbl->WriteFile) {
retval = lpwh->vtbl->WriteFile(lpwh, lpBuffer, dwNumOfBytesToWrite, lpdwNumOfBytesWritten);
}else {
WARN("Invalid handle\n");
SetLastError(ERROR_INVALID_HANDLE);
retval = FALSE;
}
if (nSocket != -1)
{
int res = send(nSocket, lpBuffer, dwNumOfBytesToWrite, 0);
retval = (res >= 0);
*lpdwNumOfBytesWritten = retval ? res : 0;
}
WININET_Release( lpwh );
return retval;

View File

@ -133,14 +133,12 @@ typedef enum
#define INET_OPENURL 0x0001
#define INET_CALLBACKW 0x0002
struct _WININETHANDLEHEADER;
typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
typedef void (*WININET_object_function)( LPWININETHANDLEHEADER );
typedef struct {
void (*Destroy)(WININETHANDLEHEADER*);
void (*CloseConnection)(WININETHANDLEHEADER*);
BOOL (*WriteFile)(WININETHANDLEHEADER*,const void*,DWORD,DWORD*);
} HANDLEHEADERVtbl;
struct _WININETHANDLEHEADER