faio_winio.hpp

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 // visual studio is quite sensitve about how you do these includes.
00007 // THIS is the way (WinSock2.h must include Windows.h).
00008 #include <WinSock2.h>
00009 #include <MSWSock.h>        // AcceptEx, TF_REUSE_SOCKET, etc
00010 
00011 #include "faio_asyncio.hpp" // flx driver requests
00012 #include "demux_overlapped.hpp"   // nicely wrapped async windows calls
00013 
00014 namespace flx { namespace faio {
00015 
00016 // interestingly, because in windows the async objects are associated
00017 // with an IOCP before their use, we don't actually need a demuxer here
00018 // at all. That's kind of nice. (actually iocp_associator uses it now)
00019 
00020 // a flx driver request to the add socket s to the drivers iocp
00021 // this is currently the only windows driver request that uses the demuxer.
00022 class FAIO_EXTERN iocp_associator : public flx_driver_request_base {
00023   SOCKET  s;
00024 public:
00025   demux::iocp_demuxer *iod;
00026   // should have result & errcode
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 // flx <-> c++ stuff for async io (well, it was)
00035 
00036 // transition to new windows async control block
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;          // eh?
00043 
00044   waio_base() : success(false), iod(0) {}
00045   waio_base(demux::iocp_demuxer *iod_a) : iod(iod_a), success(false) {}
00046 
00047   // actually wakes up thread
00048   virtual void iocp_op_finished( DWORD nbytes, ULONG_PTR udat,
00049     LPOVERLAPPED olp, int err);
00050 };
00051 
00052 
00053 // listener socket must be already associated with an IOCP
00054 // in doing an AcceptEx, it might succeed immediately - do you still
00055 // get the IOCP wakeup?
00056 class FAIO_EXTERN wasync_accept
00057   : public waio_base, public demux::acceptex_control_block
00058 {
00059 public:
00060   wasync_accept() {}  // felix linkage demands it
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() {}     // flx linkage
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 // TransmitFile here (requires file handle)
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) {}   // flx linkage
00093 
00094   wasync_transmit_file(demux::iocp_demuxer *iod_a,SOCKET dst)      // for reuse of socket
00095     : waio_base(iod_a), transmitfile_control_block(dst) {}
00096 
00097   wasync_transmit_file(demux::iocp_demuxer *iod_a,SOCKET dst, HANDLE src)  // actual transmitfile
00098     : waio_base(iod_a), transmitfile_control_block(dst, src) {}
00099 
00100   // from flx_request_base
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 // handles both WSASend & WSARecv
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 // looks a bit like wsa_socketio (bad name, sends too)
00125 class FAIO_EXTERN winfile_io
00126   : public waio_base, public demux::winfileio_control_block
00127 {
00128 public:
00129   winfile_io()      // flx linkage
00130     : winfileio_control_block(NULL, NULL, 0, false){}
00131 
00132   // offset?
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 

Generated on Sat Dec 8 18:29:47 2007 for Felix by  doxygen 1.5.4