]> git.tdb.fi Git - libs/core.git/blobdiff - source/io/windows/eventreader.cpp
Use size_t to represent sizes
[libs/core.git] / source / io / windows / eventreader.cpp
index 8a4c862d3eb7a9d846af590322fffed6d73b1ccb..8c4102067854eb0c9096ff92ab4277c1e3cf6441 100644 (file)
@@ -13,11 +13,12 @@ struct EventReader::Private
 {
        OVERLAPPED overlapped;
        Handle event;
-       unsigned buf_size;
-       char *buffer;
-       unsigned buf_avail;
-       char *buf_next;
-       bool pending;
+       size_t buf_size = 0;
+       char *buffer = 0;
+       size_t buf_avail = 0;
+       char *buf_next = 0;
+       bool pending = false;
+       bool eof = false;
 };
 
 
@@ -30,9 +31,7 @@ EventReader::EventReader(Handle &h, unsigned size):
        priv->overlapped.hEvent = *priv->event;
        priv->buf_size = size;
        priv->buffer = new char[priv->buf_size];
-       priv->buf_avail = 0;
        priv->buf_next = priv->buffer;
-       priv->pending = false;
 }
 
 EventReader::~EventReader()
@@ -58,7 +57,9 @@ void EventReader::start()
        if(!ReadFile(*handle, priv->buffer, priv->buf_size, &ret, &priv->overlapped))
        {
                unsigned err = GetLastError();
-               if(err==ERROR_IO_PENDING)
+               if(err==ERROR_BROKEN_PIPE)
+                       priv->eof = true;
+               else if(err==ERROR_IO_PENDING)
                        priv->pending = true;
                else
                        throw system_error("ReadFile");
@@ -77,7 +78,13 @@ void EventReader::wait()
 
        DWORD ret;
        if(!GetOverlappedResult(*handle, &priv->overlapped, &ret, true))
-               throw system_error("GetOverlappedResult");
+       {
+               DWORD err = GetLastError();
+               if(err==ERROR_BROKEN_PIPE)
+                       priv->eof = true;
+               else
+                       throw system_error("GetOverlappedResult");
+       }
        else
        {
                priv->buf_avail = ret;
@@ -89,6 +96,9 @@ unsigned EventReader::read(char *buf, unsigned len)
 {
        if(!priv->buf_avail)
        {
+               if(priv->eof)
+                       return 0;
+
                // No data in buffer, try to get some
                start();
                wait();