⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stream.cc

📁 本人收集整理的一份c/c++跨平台网络库
💻 CC
📖 第 1 页 / 共 2 页
字号:
  // 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 + -