3 #include "wvwinstreamclone.h"
5 ATOM WvWinStreamClone::s_aClass = 0;
6 WvWinStreamClone::WndVector WvWinStreamClone::s_wndpool;
7 WvWinStreamClone::WndStreamMap WvWinStreamClone::s_wndmap;
9 HWND WvWinStreamClone::alloc_wnd()
11 if (s_wndpool.empty())
13 HWND hWnd = CreateWindow(
15 "WvWinStreamWindowName",
16 WS_POPUP | WS_DISABLED,
27 s_wndpool.push_back(hWnd);
30 HWND hWnd = s_wndpool.back();
34 s_wndmap[hWnd] =
this;
39 void WvWinStreamClone::free_wnd(HWND w)
41 s_wndpool.push_back(w);
44 DWORD WvWinStreamClone::Initialize()
47 wc.style = CS_HREDRAW | CS_VREDRAW;
48 wc.lpfnWndProc = WvWinStreamClone::WndProc;
51 wc.hInstance = GetModuleHandle(NULL);
54 wc.hbrBackground = NULL;
55 wc.lpszMenuName = NULL;
56 wc.lpszClassName =
"WvWinStreamClone";
58 s_aClass = RegisterClass(&wc);
61 DWORD error = GetLastError();
67 WvWinStreamClone::WvWinStreamClone(
WvStream * _cloned) :
68 WvStreamClone(_cloned), m_pending_callback(false), m_select_in_progress(false),
71 memset(&m_si, 0,
sizeof(m_si));
76 WvWinStreamClone::~WvWinStreamClone()
82 void WvWinStreamClone::select_set(SocketEventsMap &sockmap, fd_set *set,
long event )
84 for (
unsigned i=0; i<set->fd_count; i++)
86 SOCKET &socket = set->fd_array[i];
87 sockmap[socket] |= event;
93 void WvWinStreamClone::pre_poll()
95 this->_build_selectinfo(m_si, m_msec_timeout,
96 false,
false,
false,
true);
101 SocketEventsMap sockmap;
102 this->select_set(sockmap, &m_si.read, FD_READ);
103 this->select_set(sockmap, &m_si.write, FD_WRITE);
104 this->select_set(sockmap, &m_si.except, FD_OOB);
108 for (SocketEventsMap::iterator i = sockmap.begin(); i!=sockmap.end(); ++i)
110 SOCKET socket = (*i).first;
111 long events = (*i).second;
113 int result = ::WSAAsyncSelect(socket, m_hWnd, WM_SELECT,
114 events | FD_CONNECT | FD_CLOSE | FD_ACCEPT);
119 ::KillTimer(m_hWnd, TIMER_ID);
120 if (m_si.msec_timeout >= 0)
122 ::SetTimer(m_hWnd, TIMER_ID, m_si.msec_timeout, NULL);
125 m_select_in_progress =
true;
128 void WvWinStreamClone::post_poll()
130 bool sure = this->_process_selectinfo(m_si,
true);
132 if (sure || m_pending_callback)
134 m_pending_callback =
false;
136 if (globalstream) globalstream->
callback();
140 void WvWinStreamClone::select_callback(SOCKET socket,
int events,
int error)
142 if (events | FD_READ) FD_SET(socket, &m_si.read);
143 if (events | FD_WRITE) FD_SET(socket, &m_si.write);
144 if (events | FD_OOB) FD_SET(socket, &m_si.except);
145 m_pending_callback =
true;
147 if (m_select_in_progress)
149 ::PostMessage(m_hWnd, WM_DONESELECT, 0, 0);
150 m_select_in_progress =
false;
154 LRESULT CALLBACK WvWinStreamClone::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
172 SOCKET socket = wParam;
173 int events = WSAGETSELECTEVENT(lParam);
174 int error = WSAGETSELECTERROR(lParam);
175 _this->select_callback( socket, events, error );
182 ::PostMessage(hwnd, WM_DONESELECT, 0, 0);
188 return DefWindowProc(hwnd, uMsg, wParam, lParam);
199 if (newclone != NULL)
200 my_type =
WvString(
"WvWinStreamClone:%s", newclone->wstype());
202 my_type =
"WvWinStreamClone:(none)";