00001 #line 4 "./lpsrc/flx_winio.ipk"
00002 #ifndef __FLX_FAIO_WINIO_H__
00003 #define __FLX_FAIO_WINIO_H__
00004 #include <flx_faio_config.hpp>
00005
00006
00007
00008 #include <WinSock2.h>
00009 #include <MSWSock.h>
00010
00011 #include "faio_asyncio.hpp"
00012 #include "demux_overlapped.hpp"
00013
00014 namespace flx { namespace faio {
00015
00016
00017
00018
00019
00020
00021
00022 class FAIO_EXTERN iocp_associator : public flx_driver_request_base {
00023 SOCKET s;
00024 public:
00025 demux::iocp_demuxer *iod;
00026
00027 iocp_associator() : iod(0) {}
00028 iocp_associator(demux::iocp_demuxer *iod_a, SOCKET associatee)
00029 : iod(iod_a), s(associatee) {}
00030
00031 bool start_async_op_impl();
00032 };
00033
00034
00035
00036
00037 class FAIO_EXTERN waio_base : public flx_driver_request_base {
00038 protected:
00039 finote_t *fn_a;
00040 public:
00041 demux::iocp_demuxer *iod;
00042 bool success;
00043
00044 waio_base() : success(false), iod(0) {}
00045 waio_base(demux::iocp_demuxer *iod_a) : iod(iod_a), success(false) {}
00046
00047
00048 virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00049 LPOVERLAPPED olp, int err);
00050 };
00051
00052
00053
00054
00055
00056 class FAIO_EXTERN wasync_accept
00057 : public waio_base, public demux::acceptex_control_block
00058 {
00059 public:
00060 wasync_accept() {}
00061
00062 wasync_accept(demux::iocp_demuxer *iod_a,SOCKET l, SOCKET a) : waio_base(iod_a) { listener = l; acceptor = a; }
00063
00064 bool start_async_op_impl();
00065
00066 virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00067 LPOVERLAPPED olp, int err);
00068 };
00069
00070 class FAIO_EXTERN connect_ex
00071 : public waio_base, public demux::connectex_control_block
00072 {
00073 public:
00074
00075 connect_ex() {}
00076
00077 connect_ex(demux::iocp_demuxer *iod_a,SOCKET soc, const char* addr, int port)
00078 : waio_base(iod_a) { s = soc; addy = addr; p = port; }
00079
00080 bool start_async_op_impl();
00081
00082 virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00083 LPOVERLAPPED olp, int err);
00084 };
00085
00086
00087 class FAIO_EXTERN wasync_transmit_file
00088 : public waio_base, public demux::transmitfile_control_block
00089 {
00090 public:
00091 wasync_transmit_file()
00092 : waio_base(0), transmitfile_control_block(INVALID_SOCKET, NULL) {}
00093
00094 wasync_transmit_file(demux::iocp_demuxer *iod_a,SOCKET dst)
00095 : waio_base(iod_a), transmitfile_control_block(dst) {}
00096
00097 wasync_transmit_file(demux::iocp_demuxer *iod_a,SOCKET dst, HANDLE src)
00098 : waio_base(iod_a), transmitfile_control_block(dst, src) {}
00099
00100
00101 bool start_async_op_impl();
00102
00103 virtual void iocp_op_finished(DWORD nbytes, ULONG_PTR udat,
00104 LPOVERLAPPED olp, int err);
00105 };
00106
00107
00108 class FAIO_EXTERN wsa_socketio
00109 : public waio_base, public demux::wsasocketio_control_block
00110 {
00111 public:
00112 wsa_socketio()
00113 : wsasocketio_control_block(INVALID_SOCKET, NULL, false) {}
00114
00115 wsa_socketio(demux::iocp_demuxer *iod_a,SOCKET src, demux::sel_param* ppb, bool read)
00116 : waio_base(iod_a), wsasocketio_control_block(src, ppb, read) {}
00117
00118 bool start_async_op_impl();
00119
00120 virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00121 LPOVERLAPPED olp, int err);
00122 };
00123
00124
00125 class FAIO_EXTERN winfile_io
00126 : public waio_base, public demux::winfileio_control_block
00127 {
00128 public:
00129 winfile_io()
00130 : winfileio_control_block(NULL, NULL, 0, false){}
00131
00132
00133 winfile_io(demux::iocp_demuxer *iod_a,HANDLE f, void* buf, int len, bool read)
00134 : waio_base(iod_a), winfileio_control_block(f, buf, len, read) {}
00135
00136 bool start_async_op_impl();
00137
00138 virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00139 LPOVERLAPPED olp, int err);
00140 };
00141
00142
00143 }}
00144 #endif // __DWINIO__
00145