jio.ipp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef JIO_IPP
  14. #define JIO_IPP
  15. #include "jiface.hpp"
  16. #include "jexcept.hpp"
  17. #include "jio.hpp"
  18. #define DEFAULT_BUFFER_SIZE 0x10000
  19. class CUnbufferedReadWriteSeq : public IWriteSeq, public IReadSeq, public CInterface
  20. {
  21. private:
  22. offset_t offset;
  23. offset_t fpos;
  24. size32_t size;
  25. int fh;
  26. public:
  27. IMPLEMENT_IINTERFACE;
  28. CUnbufferedReadWriteSeq(int _fh, offset_t offset, size32_t _size);
  29. virtual void put(const void *src);
  30. virtual void putn(const void *src, unsigned n);
  31. virtual void flush();
  32. virtual size32_t getRecordSize() { return size; }
  33. virtual offset_t getPosition();
  34. virtual bool get(void *dst);
  35. virtual unsigned getn(void *dst, unsigned n);
  36. virtual void reset();
  37. virtual void stop() {} // no action required
  38. };
  39. class CTeeWriteSeq : public IWriteSeq, public CInterface
  40. {
  41. protected:
  42. IWriteSeq *w1;
  43. IWriteSeq *w2;
  44. public:
  45. IMPLEMENT_IINTERFACE;
  46. CTeeWriteSeq(IWriteSeq *f1, IWriteSeq *f2);
  47. ~CTeeWriteSeq();
  48. virtual void put(const void *src);
  49. virtual void putn(const void *src, unsigned n);
  50. virtual void flush();
  51. virtual size32_t getRecordSize();
  52. virtual offset_t getPosition();
  53. };
  54. class CBufferedIOStreamBase: public CInterface
  55. {
  56. public:
  57. CBufferedIOStreamBase(unsigned _bufferSize);
  58. protected:
  59. inline size32_t bytesRemaining() { return numInBuffer + curBufferOffset; }
  60. inline void writeToBuffer(size32_t len, const void * data)
  61. {
  62. memcpy(buffer + curBufferOffset, data, len);
  63. curBufferOffset += len;
  64. if (curBufferOffset > numInBuffer)
  65. numInBuffer = curBufferOffset;
  66. }
  67. inline size32_t readFromBuffer(size32_t len, void * data)
  68. {
  69. size32_t sizeGot = numInBuffer - curBufferOffset;
  70. if (sizeGot > len)
  71. sizeGot = len;
  72. memcpy(data, buffer+curBufferOffset, sizeGot);
  73. curBufferOffset += sizeGot;
  74. return sizeGot;
  75. }
  76. virtual bool fillBuffer()=0;
  77. virtual size32_t directRead(size32_t len, void * data)=0;
  78. virtual size32_t directWrite(size32_t len, const void * data)=0;
  79. virtual void doflush()=0;
  80. size32_t doread(size32_t len, void * data);
  81. size32_t dowrite(size32_t len, const void * data);
  82. protected:
  83. byte * buffer;
  84. size32_t bufferSize;
  85. size32_t minDirectSize;
  86. size32_t numInBuffer;
  87. size32_t curBufferOffset;
  88. bool reading;
  89. };
  90. extern size32_t chunked_fwrite(void *buffer, size32_t count, FILE *stream);
  91. #endif