#include <cstring>
-#include <stdexcept>
+#include <msp/core/except.h>
#include "buffered.h"
+#include "handle.h"
using namespace std;
buf_size(s),
buf(new char[buf_size]),
begin(buf),
- end(buf),
- cur_op(M_NONE)
+ end(buf)
{
mode = below.get_mode();
below.signal_flush_required.connect(sigc::mem_fun(this, &Buffered::flush));
delete[] buf;
}
+void Buffered::set_block(bool)
+{
+ throw unsupported("Buffered::set_block");
+}
+
+void Buffered::set_inherit(bool)
+{
+ throw unsupported("Buffered::set_block");
+}
+
void Buffered::flush()
{
if(cur_op==M_WRITE)
{
unsigned len = below.write(begin, used);
- begin=end = buf;
+ begin = end = buf;
if(len<used)
throw runtime_error("Couldn't flush all data");
}
}
else if(cur_op==M_READ)
- begin=end = buf;
+ begin = end = buf;
}
-unsigned Buffered::do_write(const char *data, unsigned size)
+size_t Buffered::do_write(const char *data, size_t size)
{
set_op(M_WRITE);
}
}
-unsigned Buffered::do_read(char *data, unsigned size)
+size_t Buffered::do_read(char *data, size_t size)
{
set_op(M_READ);
{
// Give out whatever is in the buffer already
memcpy(data, begin, end-begin);
- unsigned ret = end-begin;
- begin=end = buf;
+ size_t ret = end-begin;
+ begin = end = buf;
data += ret;
size -= ret;
if(size<buf_size)
{
// Fill the buffer and serve the rest of the request from it
- unsigned len = below.read(end, buf+buf_size-end);
+ size_t len = below.read(end, buf+buf_size-end);
end += len;
- len = min(static_cast<unsigned>(end-begin), size);
+ len = min<size_t>(end-begin, size);
memcpy(data, begin, len);
begin += len;
ret += len;
}
}
-unsigned Buffered::put(char c)
+size_t Buffered::put(char c)
{
set_op(M_WRITE);
return do_write(&c, 1);
}
-bool Buffered::getline(std::string &line)
+bool Buffered::getline(string &line)
{
set_op(M_READ);
return static_cast<unsigned char>(c);
}
+const Handle &Buffered::get_handle(Mode)
+{
+ throw unsupported("Buffered::get_handle");
+}
+
void Buffered::set_op(Mode op)
{
if(op!=cur_op)
cur_op = op;
}
-unsigned Buffered::get_current_size() const
+size_t Buffered::get_current_size() const
{
return end-begin;
}
-Handle Buffered::get_event_handle()
-{
- throw logic_error("Buffered doesn't support events");
-}
-
} // namespace IO
} // namespace Msp