📄 stream.cc
字号:
// TODO: extend the file to the proper length return true;}bool FileStream::GetSize(const std::string& filename, size_t* size) { struct stat file_stats; if (stat(filename.c_str(), &file_stats) != 0) return false; *size = file_stats.st_size; return true;}int FileStream::Flush() { if (file_) { return fflush (file_); } // try to flush empty file? ASSERT(false); return 0;}///////////////////////////////////////////////////////////////////////////////MemoryStream::MemoryStream() : allocated_length_(0), buffer_(NULL), data_length_(0), seek_position_(0) {}MemoryStream::MemoryStream(const char* data) : allocated_length_(0), buffer_(NULL), data_length_(0), seek_position_(0) { SetContents(data, strlen(data));}MemoryStream::MemoryStream(const char* data, size_t length) : allocated_length_(0), buffer_(NULL), data_length_(0), seek_position_(0) { SetContents(data, length);}MemoryStream::~MemoryStream() { delete [] buffer_;}void MemoryStream::SetContents(const char* data, size_t length) { delete [] buffer_; data_length_ = allocated_length_ = length; buffer_ = new char[allocated_length_]; memcpy(buffer_, data, data_length_);}StreamState MemoryStream::GetState() const { return SS_OPEN;}StreamResult MemoryStream::Read(void *buffer, size_t bytes, size_t *bytes_read, int *error) { if (seek_position_ >= data_length_) { // At end of stream if (error) { *error = EOF; } return SR_EOS; } size_t remaining_length = data_length_ - seek_position_; if (bytes > remaining_length) { // Read partial buffer bytes = remaining_length; } memcpy(buffer, &buffer_[seek_position_], bytes); seek_position_ += bytes; if (bytes_read) { *bytes_read = bytes; } return SR_SUCCESS;}StreamResult MemoryStream::Write(const void *buffer, size_t bytes, size_t *bytes_written, int *error) { StreamResult sr = SR_SUCCESS; int error_value = 0; size_t bytes_written_value = 0; size_t new_position = seek_position_ + bytes; if (new_position > allocated_length_) { // Increase buffer size to the larger of: // a) new position rounded up to next 256 bytes // b) double the previous length size_t new_allocated_length = _max((new_position | 0xFF) + 1, allocated_length_ * 2); if (char* new_buffer = new char[new_allocated_length]) { memcpy(new_buffer, buffer_, data_length_); delete [] buffer_; buffer_ = new_buffer; allocated_length_ = new_allocated_length; } else { error_value = ENOMEM; sr = SR_ERROR; } } if (sr == SR_SUCCESS) { bytes_written_value = bytes; memcpy(&buffer_[seek_position_], buffer, bytes); seek_position_ = new_position; if (data_length_ < seek_position_) { data_length_ = seek_position_; } } if (bytes_written) { *bytes_written = bytes_written_value; } if (error) { *error = error_value; } return sr;}void MemoryStream::Close() { // nothing to do}bool MemoryStream::SetPosition(size_t position) { if (position <= data_length_) { seek_position_ = position; return true; } return false;}bool MemoryStream::GetPosition(size_t *position) const { if (!position) { return false; } *position = seek_position_; return true;}bool MemoryStream::GetSize(size_t *size) const { if (!size) { return false; } *size = data_length_; return true;}bool MemoryStream::ReserveSize(size_t size) { if (allocated_length_ >= size) return true; if (char* new_buffer = new char[size]) { memcpy(new_buffer, buffer_, data_length_); delete [] buffer_; buffer_ = new_buffer; allocated_length_ = size; return true; } return false;}///////////////////////////////////////////////////////////////////////////////StreamResult Flow(StreamInterface* source, char* buffer, size_t buffer_len, StreamInterface* sink) { ASSERT(buffer_len > 0); StreamResult result; size_t count, read_pos, write_pos; bool end_of_stream = false; do { // Read until buffer is full, end of stream, or error read_pos = 0; do { result = source->Read(buffer + read_pos, buffer_len - read_pos, &count, NULL); if (result == SR_EOS) { end_of_stream = true; } else if (result != SR_SUCCESS) { return result; } else { read_pos += count; } } while (!end_of_stream && (read_pos < buffer_len)); // Write until buffer is empty, or error (including end of stream) write_pos = 0; do { result = sink->Write(buffer + write_pos, read_pos - write_pos, &count, NULL); if (result != SR_SUCCESS) return result; write_pos += count; } while (write_pos < read_pos); } while (!end_of_stream); return SR_SUCCESS;}///////////////////////////////////////////////////////////////////////////////LoggingAdapter::LoggingAdapter(StreamInterface* stream, LoggingSeverity level, const std::string& label, bool hex_mode): StreamAdapterInterface(stream), level_(level), hex_mode_(hex_mode){ label_.append("["); label_.append(label); label_.append("]");}StreamResult LoggingAdapter::Read(void* buffer, size_t buffer_len, size_t* read, int* error) { size_t local_read; if (!read) read = &local_read; StreamResult result = StreamAdapterInterface::Read(buffer, buffer_len, read, error); if (result == SR_SUCCESS) { LogMultiline(level_, label_.c_str(), true, static_cast<const char *>(buffer), *read, hex_mode_, &lms_); } return result;}StreamResult LoggingAdapter::Write(const void* data, size_t data_len, size_t* written, int* error) { size_t local_written; if (!written) written = &local_written; StreamResult result = StreamAdapterInterface::Write(data, data_len, written, error); if (result == SR_SUCCESS) { LogMultiline(level_, label_.c_str(), false, static_cast<const char *>(data), *written, hex_mode_, &lms_); } return result;}void LoggingAdapter::Close() { LOG_V(level_) << label_ << " Closed locally"; StreamAdapterInterface::Close();}void LoggingAdapter::OnEvent(StreamInterface* stream, int events, int err) { if (events & SE_OPEN) { LOG_V(level_) << label_ << " Open"; } else if (events & SE_CLOSE) { LOG_V(level_) << label_ << " Closed with error: " << err; } StreamAdapterInterface::OnEvent(stream, events, err);}///////////////////////////////////////////////////////////////////////////////// StringStream - Reads/Writes to an external std::string///////////////////////////////////////////////////////////////////////////////StringStream::StringStream(std::string& str): str_(str), read_pos_(0), read_only_(false){}StringStream::StringStream(const std::string& str): str_(const_cast<std::string&>(str)), read_pos_(0), read_only_(true){}StreamState StringStream::GetState() const { return SS_OPEN;}StreamResult StringStream::Read(void* buffer, size_t buffer_len, size_t* read, int* error) { size_t available = utils_base::_min(buffer_len, str_.size() - read_pos_); if (!available) return SR_EOS; memcpy(buffer, str_.data() + read_pos_, available); read_pos_ += available; if (read) *read = available; return SR_SUCCESS;}StreamResult StringStream::Write(const void* data, size_t data_len, size_t* written, int* error) { if (read_only_) { if (error) { *error = -1; } return SR_ERROR; } str_.append(static_cast<const char*>(data), static_cast<const char*>(data) + data_len); if (written) *written = data_len; return SR_SUCCESS;}void StringStream::Close() {}bool StringStream::GetSize(size_t* size) const { ASSERT(size != NULL); *size = str_.size(); return true;}bool StringStream::ReserveSize(size_t size) { if (read_only_) return false; str_.reserve(size); return true;}bool StringStream::Rewind() { read_pos_ = 0; return true;}///////////////////////////////////////////////////////////////////////////////} // namespace utils_base
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -