StreamReader.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #pragma once
  6. namespace Js
  7. {
  8. //
  9. // A simple stream reader that hides low level stream details.
  10. //
  11. class StreamReader: public ScriptContextHolder
  12. {
  13. private:
  14. HostReadStream *m_stream;
  15. byte *m_buffer;
  16. size_t m_current;
  17. size_t m_length;
  18. //
  19. // Get number of bytes left for read in the buffer.
  20. //
  21. size_t GetBytesInBuffer() const
  22. {
  23. return m_length - m_current;
  24. }
  25. // ULONG RealRead(void* pv, ULONG cb);
  26. public:
  27. StreamReader(ScriptContext* scriptContext, byte* buffer, size_t length, HostReadStream *stream)
  28. : ScriptContextHolder(scriptContext),
  29. m_stream(stream),
  30. m_buffer(buffer),
  31. m_current(0),
  32. m_length(length)
  33. {
  34. }
  35. Var ReadHostObject();
  36. void Read(void* pv, size_t cb);
  37. void ReadRawBytes(void** pv, size_t cb)
  38. {
  39. Assert(cb < m_length);
  40. *pv = (m_buffer + m_current);
  41. m_current += cb;
  42. }
  43. template <typename T>
  44. void Read(T* value)
  45. {
  46. if (GetBytesInBuffer() >= sizeof(T))
  47. {
  48. *value = *(T*)(m_buffer + m_current);
  49. m_current += sizeof(T);
  50. }
  51. else
  52. {
  53. Read(value, sizeof(T));
  54. }
  55. }
  56. scaposition_t GetPosition() const;
  57. };
  58. }