X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fbuffered.cpp;h=f53d2fc23fa49e38ede87da0188b40d3cfeadb50;hp=32688db83618d874652fd0926a8d556648e765d7;hb=b97d4e9f86e90254ab9edef7ee62a910f6333c78;hpb=ed9f0b874e7e09fc3b3b223585572a18854765f6 diff --git a/source/buffered.cpp b/source/buffered.cpp index 32688db..f53d2fc 100644 --- a/source/buffered.cpp +++ b/source/buffered.cpp @@ -1,10 +1,3 @@ -/* $Id$ - -This file is part of libmspio -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #include "buffered.h" #include "except.h" @@ -22,97 +15,39 @@ Buffered::Buffered(Base &b, unsigned s): end(buf), cur_op(M_NONE) { - mode=below.get_mode(); + mode = below.get_mode(); below.signal_flush_required.connect(sigc::mem_fun(this, &Buffered::flush)); } -unsigned Buffered::put(char c) +Buffered::~Buffered() { - set_op(M_WRITE); - - if(end(*begin++); - - char c; - if(do_read(&c, 1)==0) - return -1; - return static_cast(c); -} - -Handle Buffered::get_event_handle() -{ - throw Exception("Buffered doesn't support events"); -} - -unsigned Buffered::get_current_size() const -{ - return end-begin; -} - -Buffered::~Buffered() -{ - try - { - flush(); - } - catch(...) - { } - - delete[] buf; -} - -void Buffered::set_op(Mode op) -{ - if(op!=cur_op) - flush(); - cur_op=op; + begin=end = buf; } unsigned Buffered::do_write(const char *data, unsigned size) @@ -123,7 +58,7 @@ unsigned Buffered::do_write(const char *data, unsigned size) { // All data fits in buffer with whatever is already there memcpy(end, data, size); - end+=size; + end += size; return size; } @@ -136,7 +71,7 @@ unsigned Buffered::do_write(const char *data, unsigned size) { // Put new data in the buffer to wait for more memcpy(end, data, size); - end+=size; + end += size; return size; } @@ -154,9 +89,9 @@ unsigned Buffered::do_read(char *data, unsigned size) { // The request can be served from the buffer memcpy(data, begin, size); - begin+=size; + begin += size; - eof_flag=(below.eof() && begin==end); + eof_flag = (below.eof() && begin==end); return size; } @@ -164,32 +99,90 @@ unsigned Buffered::do_read(char *data, unsigned size) { // Give out whatever is in the buffer already memcpy(data, begin, end-begin); - unsigned ret=end-begin; - begin=end=buf; + unsigned ret = end-begin; + begin=end = buf; - data+=ret; - size-=ret; + data += ret; + size -= ret; if(size(end-begin), size); + len = min(static_cast(end-begin), size); memcpy(data, begin, len); - begin+=len; - ret+=len; + begin += len; + ret += len; } else // Read the rest directly from the underlying object - ret+=below.read(data, size); + ret += below.read(data, size); - eof_flag=(below.eof() && begin==end); + eof_flag = (below.eof() && begin==end); return ret; } } +unsigned Buffered::put(char c) +{ + set_op(M_WRITE); + + if(end(*begin++); + + char c; + if(do_read(&c, 1)==0) + return -1; + return static_cast(c); +} + +void Buffered::set_op(Mode op) +{ + if(op!=cur_op) + flush(); + cur_op = op; +} + +unsigned Buffered::get_current_size() const +{ + return end-begin; +} + +Handle Buffered::get_event_handle() +{ + throw Exception("Buffered doesn't support events"); +} + } // namespace IO } // namespace Msp