5 #include <msp/core/systemerror.h>
6 #include "eventreader.h"
7 #include "handle_private.h"
14 struct EventReader::Private
17 OVERLAPPED *overlapped;
27 EventReader::EventReader(Handle &h, unsigned size):
35 *priv->event = CreateEvent(0, true, false, 0);
36 priv->buf_size = size;
37 priv->buffer = new char[priv->buf_size];
39 priv->buf_next = priv->buffer;
47 EventReader::~EventReader()
50 CloseHandle(*priv->event);
51 delete priv->overlapped;
52 delete[] priv->buffer;
57 const Handle &EventReader::get_event() const
66 void EventReader::start()
69 if(priv->buf_avail || priv->overlapped)
72 priv->overlapped = new OVERLAPPED;
73 memset(priv->overlapped, 0, sizeof(OVERLAPPED));
74 priv->overlapped->hEvent = *priv->event;
77 priv->buf_next = priv->buffer;
78 if(!ReadFile(*handle, priv->buffer, priv->buf_size, &ret, priv->overlapped))
80 unsigned err = GetLastError();
81 if(err!=ERROR_IO_PENDING)
82 throw system_error("ReadFile");
86 priv->buf_avail = ret;
87 delete priv->overlapped;
89 SetEvent(*priv->event);
94 void EventReader::wait()
101 if(!GetOverlappedResult(*handle, priv->overlapped, &ret, true))
102 throw system_error("GetOverlappedResult");
105 priv->buf_avail = ret;
106 delete priv->overlapped;
107 priv->overlapped = 0;
112 unsigned EventReader::read(char *buf, unsigned len)
117 // No data in buffer, try to get some
122 len = min(len, priv->buf_avail);
123 memcpy(buf, priv->buf_next, len);
124 priv->buf_next += len;
125 priv->buf_avail -= len;
129 ResetEvent(*priv->event);
135 return sys_read(handle, buf, len);