BufferedOutputStream.cpp
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Lesser General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Lesser General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Lesser General Public
  16.  *  License along with this library; if not, write to the Free Software
  17.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18.  *  MA  02110-1301  USA
  19.  */
  20. #include <assert.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include "BufferedOutputStream.h"
  24. #include "IOException.h"
  25. namespace OSL {
  26. BufferedOutputStream::BufferedOutputStream(OutputStream *stream, unsigned int size) {
  27. this->stream = stream;
  28. stream->ref();
  29. maxsize = size;
  30. buffer = new char[size];
  31. count = 0;
  32. }
  33. BufferedOutputStream::~BufferedOutputStream() {
  34. close();
  35. }
  36. void
  37. BufferedOutputStream::close() {
  38. if (stream != NULL) {
  39. flush();
  40. stream->close();
  41. stream->unref();
  42. delete buffer;
  43. stream = NULL;
  44. buffer = NULL;
  45. }
  46. }
  47. void
  48. BufferedOutputStream::flush() throw(IOException) {
  49. if (stream == NULL) {
  50. throw IOException("The stream is closed.");
  51. } else if (count > 0) {
  52. // We make a copy of count just in case write() or
  53. // flush() throws an exception.
  54. unsigned int c = count;
  55. count = 0;
  56. stream->write(buffer, c);
  57. stream->flush();
  58. }
  59. }
  60. unsigned int
  61. BufferedOutputStream::write(const char *data, unsigned int size) throw(IOException) {
  62. assert(data != NULL);
  63. assert(size > 0);
  64. if (stream == NULL) {
  65. throw IOException("The stream is closed.");
  66. }
  67. unsigned int written = 0;
  68. size_t rest = size;
  69. while (rest > 0) {
  70. size_t n = rest;
  71. if (n > maxsize - count) {
  72. n = maxsize - count;
  73. }
  74. memcpy (buffer + count, data + written, n);
  75. count += n;
  76. rest -= n;
  77. written += n;
  78. if (count == maxsize) {
  79. flush();
  80. }
  81. }
  82. return written;
  83. }
  84. }