*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef _WINE_INTERNET_H_
#define _WINE_INTERNET_H_
+#ifndef __WINE_CONFIG_H
+# error You must include config.h to use this header
+#endif
+
#include "wine/unicode.h"
+#include "wine/list.h"
#include <time.h>
#ifdef HAVE_NETDB_H
# include <sys/types.h>
# include <netinet/in.h>
#endif
-#ifdef HAVE_OPENSSL_SSL_H
-#define DSA __ssl_DSA /* avoid conflict with commctrl.h */
-#undef FAR
-# include <openssl/ssl.h>
-#undef FAR
-#define FAR do_not_use_this_in_wine
-#undef DSA
-#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
-#if defined(__MINGW32__) || defined (_MSC_VER)
-#include "winsock2.h"
-#ifndef MSG_WAITALL
-#define MSG_WAITALL 0
-#endif
-#else
+#if !defined(__MINGW32__) && !defined(_MSC_VER)
#define closesocket close
+#define ioctlsocket ioctl
#endif /* __MINGW32__ */
+/* ReactOS-specific definitions */
+#undef CP_UNIXCP
+#define CP_UNIXCP CP_THREAD_ACP
+
/* used for netconnection.c stuff */
typedef struct
{
BOOL useSSL;
int socketFD;
-#ifdef HAVE_OPENSSL_SSL_H
- SSL *ssl_s;
- char *peek_msg;
- char *peek_msg_mem;
-#endif
+ void *ssl_s;
} WININET_NETCONNECTION;
-inline static LPSTR WININET_strdup( LPCSTR str )
+static inline LPWSTR heap_strdupW(LPCWSTR str)
{
- LPSTR ret = HeapAlloc( GetProcessHeap(), 0, strlen(str) + 1 );
- if (ret) strcpy( ret, str );
- return ret;
-}
+ LPWSTR ret = NULL;
+
+ if(str) {
+ DWORD size;
+
+ size = (strlenW(str)+1)*sizeof(WCHAR);
+ ret = HeapAlloc(GetProcessHeap(), 0, size);
+ if(ret)
+ memcpy(ret, str, size);
+ }
-inline static LPWSTR WININET_strdupW( LPCWSTR str )
-{
- LPWSTR ret = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1)*sizeof(WCHAR) );
- if (ret) strcpyW( ret, str );
return ret;
}
-inline static LPWSTR WININET_strdup_AtoW( LPCSTR str )
+static inline WCHAR *heap_strdupAtoW(const char *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);
+ LPWSTR ret = NULL;
+
+ if(str) {
+ DWORD len;
+
+ len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
+ 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 )
+static inline char *heap_strdupWtoA(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);
+ char *ret = NULL;
+
+ if(str) {
+ DWORD size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
+ ret = HeapAlloc(GetProcessHeap(), 0, size);
+ if(ret)
+ WideCharToMultiByte(CP_ACP, 0, str, -1, ret, size, NULL, NULL);
+ }
+
return ret;
}
-inline static void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
+static inline void WININET_find_data_WtoA(LPWIN32_FIND_DATAW dataW, LPWIN32_FIND_DATAA dataA)
{
dataA->dwFileAttributes = dataW->dwFileAttributes;
dataA->ftCreationTime = dataW->ftCreationTime;
WH_HGOPHERSESSION = INTERNET_HANDLE_TYPE_CONNECT_GOPHER,
WH_HHTTPSESSION = INTERNET_HANDLE_TYPE_CONNECT_HTTP,
WH_HFILE = INTERNET_HANDLE_TYPE_FTP_FILE,
- WH_HFINDNEXT = INTERNET_HANDLE_TYPE_FTP_FIND,
+ WH_HFTPFINDNEXT = INTERNET_HANDLE_TYPE_FTP_FIND,
WH_HHTTPREQ = INTERNET_HANDLE_TYPE_HTTP_REQUEST,
} WH_TYPE;
#define INET_OPENURL 0x0001
#define INET_CALLBACKW 0x0002
-struct _WININETHANDLEHEADER;
-typedef struct _WININETHANDLEHEADER WININETHANDLEHEADER, *LPWININETHANDLEHEADER;
+typedef struct _object_header_t object_header_t;
-typedef void (*WININET_object_destructor)( LPWININETHANDLEHEADER );
+typedef struct {
+ void (*Destroy)(object_header_t*);
+ void (*CloseConnection)(object_header_t*);
+ DWORD (*QueryOption)(object_header_t*,DWORD,void*,DWORD*,BOOL);
+ DWORD (*SetOption)(object_header_t*,DWORD,void*,DWORD);
+ DWORD (*ReadFile)(object_header_t*,void*,DWORD,DWORD*);
+ DWORD (*ReadFileExA)(object_header_t*,INTERNET_BUFFERSA*,DWORD,DWORD_PTR);
+ DWORD (*ReadFileExW)(object_header_t*,INTERNET_BUFFERSW*,DWORD,DWORD_PTR);
+ DWORD (*WriteFile)(object_header_t*,const void*,DWORD,DWORD*);
+ DWORD (*QueryDataAvailable)(object_header_t*,DWORD*,DWORD,DWORD_PTR);
+ DWORD (*FindNextFileW)(object_header_t*,void*);
+} object_vtbl_t;
-struct _WININETHANDLEHEADER
+struct _object_header_t
{
WH_TYPE htype;
+ const object_vtbl_t *vtbl;
+ HINTERNET hInternet;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
DWORD dwError;
DWORD dwInternalFlags;
- DWORD dwRefCount;
- WININET_object_destructor destroy;
+ LONG refs;
INTERNET_STATUS_CALLBACK lpfnStatusCB;
- struct _WININETHANDLEHEADER *lpwhparent;
+ struct list entry;
+ struct list children;
};
typedef struct
{
- WININETHANDLEHEADER hdr;
+ object_header_t hdr;
LPWSTR lpszAgent;
LPWSTR lpszProxy;
LPWSTR lpszProxyBypass;
LPWSTR lpszProxyUsername;
LPWSTR lpszProxyPassword;
DWORD dwAccessType;
-} WININETAPPINFOW, *LPWININETAPPINFOW;
+} appinfo_t;
typedef struct
{
- WININETHANDLEHEADER hdr;
+ object_header_t hdr;
+ appinfo_t *lpAppInfo;
LPWSTR lpszHostName; /* the final destination of the request */
LPWSTR lpszServerName; /* the name of the server we directly connect to */
LPWSTR lpszUserName;
+ LPWSTR lpszPassword;
INTERNET_PORT nHostPort; /* the final destination port of the request */
INTERNET_PORT nServerPort; /* the port of the server we directly connect to */
- struct sockaddr_in socketAddress;
-} WININETHTTPSESSIONW, *LPWININETHTTPSESSIONW;
+ struct sockaddr_storage socketAddress;
+ socklen_t sa_len;
+} http_session_t;
#define HDR_ISREQUEST 0x0001
#define HDR_COMMADELIMITED 0x0002
} HTTPHEADERW, *LPHTTPHEADERW;
+struct HttpAuthInfo;
+
+typedef struct gzip_stream_t gzip_stream_t;
+
typedef struct
{
- WININETHANDLEHEADER hdr;
+ object_header_t hdr;
+ http_session_t *lpHttpSession;
LPWSTR lpszPath;
LPWSTR lpszVerb;
LPWSTR lpszRawHeaders;
WININET_NETCONNECTION netConnection;
LPWSTR lpszVersion;
LPWSTR lpszStatusText;
+ DWORD dwBytesToWrite;
+ DWORD dwBytesWritten;
HTTPHEADERW *pCustHeaders;
DWORD nCustHeaders;
-} WININETHTTPREQW, *LPWININETHTTPREQW;
-
+ HANDLE hCacheFile;
+ LPWSTR lpszCacheFile;
+ struct HttpAuthInfo *pAuthInfo;
+ struct HttpAuthInfo *pProxyAuthInfo;
-typedef struct
-{
- WININETHANDLEHEADER hdr;
- BOOL session_deleted;
- int nDataSocket;
-} WININETFILE, *LPWININETFILE;
+ CRITICAL_SECTION read_section; /* section to protect the following fields */
+ DWORD dwContentLength; /* total number of bytes to be read */
+ DWORD dwContentRead; /* bytes of the content read so far */
+ BOOL read_chunked; /* are we reading in chunked mode? */
+ DWORD read_pos; /* current read position in read_buf */
+ DWORD read_size; /* valid data size in read_buf */
+ BYTE read_buf[4096]; /* buffer for already read but not returned data */
+ BOOL decoding;
+ gzip_stream_t *gzip_stream;
+} http_request_t;
-typedef struct
-{
- WININETHANDLEHEADER hdr;
- int sndSocket;
- int lstnSocket;
- int pasvSocket; /* data socket connected by us in case of passive FTP */
- LPWININETFILE download_in_progress;
- struct sockaddr_in socketAddress;
- struct sockaddr_in lstnSocketAddress;
- LPWSTR lpszPassword;
- LPWSTR lpszUserName;
-} WININETFTPSESSIONW, *LPWININETFTPSESSIONW;
-typedef struct
-{
- BOOL bIsDirectory;
- LPWSTR lpszName;
- DWORD nSize;
- struct tm tmLastModified;
- unsigned short permissions;
-} FILEPROPERTIESW, *LPFILEPROPERTIESW;
-
-
-typedef struct
-{
- WININETHANDLEHEADER hdr;
- DWORD index;
- DWORD size;
- LPFILEPROPERTIESW lpafp;
-} WININETFINDNEXTW, *LPWININETFINDNEXTW;
-
-typedef enum
-{
- FTPPUTFILEW,
- FTPSETCURRENTDIRECTORYW,
- FTPCREATEDIRECTORYW,
- FTPFINDFIRSTFILEW,
- FTPGETCURRENTDIRECTORYW,
- FTPOPENFILEW,
- FTPGETFILEW,
- FTPDELETEFILEW,
- FTPREMOVEDIRECTORYW,
- FTPRENAMEFILEW,
- INTERNETFINDNEXTW,
- HTTPSENDREQUESTW,
- HTTPOPENREQUESTW,
- SENDCALLBACK,
- INTERNETOPENURLW,
- INTERNETREADFILEEXA,
-} ASYNC_FUNC;
-
struct WORKREQ_FTPPUTFILEW
{
LPWSTR lpszLocalFile;
LPWSTR lpszNewRemoteFile;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
};
struct WORKREQ_FTPSETCURRENTDIRECTORYW
LPWSTR lpszSearchFile;
LPWIN32_FIND_DATAW lpFindFileData;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
};
struct WORKREQ_FTPGETCURRENTDIRECTORYW
LPWSTR lpszFilename;
DWORD dwAccess;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
};
struct WORKREQ_FTPGETFILEW
BOOL fFailIfExists;
DWORD dwLocalFlagsAttribute;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
};
struct WORKREQ_FTPDELETEFILEW
LPWSTR lpszDestFile;
};
-struct WORKREQ_INTERNETFINDNEXTW
+struct WORKREQ_FTPFINDNEXTW
{
LPWIN32_FIND_DATAW lpFindFileData;
};
-struct WORKREQ_HTTPOPENREQUESTW
-{
- LPWSTR lpszVerb;
- LPWSTR lpszObjectName;
- LPWSTR lpszVersion;
- LPWSTR lpszReferrer;
- LPCWSTR *lpszAcceptTypes;
- DWORD dwFlags;
- DWORD dwContext;
-};
-
struct WORKREQ_HTTPSENDREQUESTW
{
LPWSTR lpszHeader;
BOOL bEndRequest;
};
+struct WORKREQ_HTTPENDREQUESTW
+{
+ DWORD dwFlags;
+ DWORD_PTR dwContext;
+};
+
struct WORKREQ_SENDCALLBACK
{
- DWORD dwContext;
+ DWORD_PTR dwContext;
DWORD dwInternetStatus;
LPVOID lpvStatusInfo;
DWORD dwStatusInfoLength;
LPWSTR lpszHeaders;
DWORD dwHeadersLength;
DWORD dwFlags;
- DWORD dwContext;
+ DWORD_PTR dwContext;
};
struct WORKREQ_INTERNETREADFILEEXA
LPINTERNET_BUFFERSA lpBuffersOut;
};
+struct WORKREQ_INTERNETREADFILEEXW
+{
+ LPINTERNET_BUFFERSW lpBuffersOut;
+};
+
typedef struct WORKREQ
{
- ASYNC_FUNC asyncall;
- WININETHANDLEHEADER *hdr;
+ void (*asyncproc)(struct WORKREQ*);
+ object_header_t *hdr;
union {
struct WORKREQ_FTPPUTFILEW FtpPutFileW;
struct WORKREQ_FTPDELETEFILEW FtpDeleteFileW;
struct WORKREQ_FTPREMOVEDIRECTORYW FtpRemoveDirectoryW;
struct WORKREQ_FTPRENAMEFILEW FtpRenameFileW;
- struct WORKREQ_INTERNETFINDNEXTW InternetFindNextW;
- struct WORKREQ_HTTPOPENREQUESTW HttpOpenRequestW;
+ struct WORKREQ_FTPFINDNEXTW FtpFindNextW;
struct WORKREQ_HTTPSENDREQUESTW HttpSendRequestW;
+ struct WORKREQ_HTTPENDREQUESTW HttpEndRequestW;
struct WORKREQ_SENDCALLBACK SendCallback;
- struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
+ struct WORKREQ_INTERNETOPENURLW InternetOpenUrlW;
struct WORKREQ_INTERNETREADFILEEXA InternetReadFileExA;
+ struct WORKREQ_INTERNETREADFILEEXW InternetReadFileExW;
} u;
- struct WORKREQ *next;
- struct WORKREQ *prev;
-
} WORKREQUEST, *LPWORKREQUEST;
-HINTERNET WININET_AllocHandle( LPWININETHANDLEHEADER info );
-LPWININETHANDLEHEADER WININET_GetObject( HINTERNET hinternet );
-LPWININETHANDLEHEADER WININET_AddRef( LPWININETHANDLEHEADER info );
-BOOL WININET_Release( LPWININETHANDLEHEADER info );
+HINTERNET WININET_AllocHandle( object_header_t *info );
+object_header_t *WININET_GetObject( HINTERNET hinternet );
+object_header_t *WININET_AddRef( object_header_t *info );
+BOOL WININET_Release( object_header_t *info );
BOOL WININET_FreeHandle( HINTERNET hinternet );
-HINTERNET WININET_FindHandle( LPWININETHANDLEHEADER info );
+
+DWORD INET_QueryOption(DWORD,void*,DWORD*,BOOL);
time_t ConvertTimeString(LPCWSTR asctime);
-HINTERNET FTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
+HINTERNET FTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName,
INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD_PTR dwContext,
DWORD dwInternalFlags);
-HINTERNET HTTP_Connect(LPWININETAPPINFOW hIC, LPCWSTR lpszServerName,
- INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
- LPCWSTR lpszPassword, DWORD dwFlags, DWORD dwContext,
- DWORD dwInternalFlags);
+DWORD HTTP_Connect(appinfo_t*,LPCWSTR,
+ INTERNET_PORT nServerPort, LPCWSTR lpszUserName,
+ LPCWSTR lpszPassword, DWORD dwFlags, DWORD_PTR dwContext,
+ DWORD dwInternalFlags, HINTERNET*);
BOOL GetAddress(LPCWSTR lpszServerName, INTERNET_PORT nServerPort,
- struct sockaddr_in *psa);
+ struct sockaddr *psa, socklen_t *sa_len);
void INTERNET_SetLastError(DWORD dwError);
DWORD INTERNET_GetLastError(void);
-BOOL INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
+DWORD INTERNET_AsyncCall(LPWORKREQUEST lpWorkRequest);
LPSTR INTERNET_GetResponseBuffer(void);
LPSTR INTERNET_GetNextLine(INT nSocket, LPDWORD dwLen);
-BOOLAPI FTP_FtpPutFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszLocalFile,
- LPCWSTR lpszNewRemoteFile, DWORD dwFlags, DWORD dwContext);
-BOOLAPI FTP_FtpSetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
-BOOLAPI FTP_FtpCreateDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
-INTERNETAPI HINTERNET WINAPI FTP_FtpFindFirstFileW(LPWININETFTPSESSIONW lpwfs,
- LPCWSTR lpszSearchFile, LPWIN32_FIND_DATAW lpFindFileData, DWORD dwFlags, DWORD dwContext);
-BOOLAPI FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszCurrentDirectory,
- LPDWORD lpdwCurrentDirectory);
-BOOL FTP_ConvertFileProp(LPFILEPROPERTIESW lpafp, LPWIN32_FIND_DATAW lpFindFileData);
-BOOL FTP_FtpRenameFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszSrc, LPCWSTR lpszDest);
-BOOL FTP_FtpRemoveDirectoryW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszDirectory);
-BOOL FTP_FtpDeleteFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName);
-HINTERNET FTP_FtpOpenFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszFileName,
- DWORD fdwAccess, DWORD dwFlags, DWORD dwContext);
-BOOLAPI FTP_FtpGetFileW(LPWININETFTPSESSIONW lpwfs, LPCWSTR lpszRemoteFile, LPCWSTR lpszNewFile,
- BOOL fFailIfExists, DWORD dwLocalFlagsAttribute, DWORD dwInternetFlags,
- DWORD dwContext);
-
-BOOLAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders,
- DWORD dwHeaderLength, LPVOID lpOptional, DWORD dwOptionalLength,
- DWORD dwContentLength, BOOL bEndRequest);
-INTERNETAPI HINTERNET WINAPI HTTP_HttpOpenRequestW(LPWININETHTTPSESSIONW lpwhs,
- LPCWSTR lpszVerb, LPCWSTR lpszObjectName, LPCWSTR lpszVersion,
- LPCWSTR lpszReferrer , LPCWSTR *lpszAcceptTypes,
- DWORD dwFlags, DWORD dwContext);
-
-VOID SendAsyncCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
+VOID SendAsyncCallback(object_header_t *hdr, DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInfo,
DWORD dwStatusInfoLength);
-VOID INTERNET_SendCallback(LPWININETHANDLEHEADER hdr, DWORD dwContext,
+VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
DWORD dwInternetStatus, LPVOID lpvStatusInfo,
DWORD dwStatusInfoLength);
-
-LPHTTPHEADERW HTTP_GetHeader(LPWININETHTTPREQW lpwhr, LPCWSTR header);
+BOOL INTERNET_FindProxyForProtocol(LPCWSTR szProxy, LPCWSTR proto, WCHAR *foundProxy, DWORD *foundProxyLen);
BOOL NETCON_connected(WININET_NETCONNECTION *connection);
-void NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
-BOOL NETCON_create(WININET_NETCONNECTION *connection, int domain,
+DWORD NETCON_init(WININET_NETCONNECTION *connnection, BOOL useSSL);
+void NETCON_unload(void);
+DWORD NETCON_create(WININET_NETCONNECTION *connection, int domain,
int type, int protocol);
-BOOL NETCON_close(WININET_NETCONNECTION *connection);
-BOOL NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
+DWORD NETCON_close(WININET_NETCONNECTION *connection);
+DWORD NETCON_connect(WININET_NETCONNECTION *connection, const struct sockaddr *serv_addr,
unsigned int addrlen);
-BOOL NETCON_secure_connect(WININET_NETCONNECTION *connection, LPCWSTR hostname);
-BOOL NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
+DWORD NETCON_secure_connect(WININET_NETCONNECTION *connection, LPWSTR hostname);
+DWORD NETCON_send(WININET_NETCONNECTION *connection, const void *msg, size_t len, int flags,
int *sent /* out */);
-BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
+DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
int *recvd /* out */);
-BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
+BOOL NETCON_query_data_available(WININET_NETCONNECTION *connection, DWORD *available);
+LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
+DWORD NETCON_set_timeout(WININET_NETCONNECTION *connection, BOOL send, int value);
+int sock_get_error(int);
extern void URLCacheContainers_CreateDefaults(void);
extern void URLCacheContainers_DeleteAll(void);