1ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Copyright 2014 PDFium Authors. All rights reserved.
2ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
3ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// found in the LICENSE file.
4ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
5ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include <algorithm>
8ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
9ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "xfa/src/fgas/src/fgas_base.h"
10ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#include "fx_stream.h"
11ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_BufferRead* pBufferRead,
12ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwAccess,
13ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     int32_t iFileSize,
14ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_BOOL bReleaseBufferRead) {
15ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pSR = new CFX_Stream;
16ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSR->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
17ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                           bReleaseBufferRead)) {
18ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSR->Release();
19ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
20ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
21ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
22ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
23ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
24ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
25ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
26ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_FileRead* pFileRead,
27ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwAccess) {
28ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pSR = new CFX_Stream;
29ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSR->LoadFileRead(pFileRead, dwAccess)) {
30ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSR->Release();
31ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
32ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
33ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
34ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
35ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
36ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
37ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
38ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(IFX_FileWrite* pFileWrite,
39ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwAccess) {
40ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pSR = new CFX_Stream;
41ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSR->LoadFileWrite(pFileWrite, dwAccess)) {
42ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSR->Release();
43ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
44ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
45ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
46ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
47ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
48ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
49ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
50ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(const FX_WCHAR* pszFileName,
51ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwAccess) {
52ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pSR = new CFX_Stream;
53ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSR->LoadFile(pszFileName, dwAccess)) {
54ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSR->Release();
55ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
56ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
57ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
58ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
59ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
60ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
61ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
62ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateStream(uint8_t* pData,
63ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     int32_t length,
64ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     FX_DWORD dwAccess) {
65ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pSR = new CFX_Stream;
66ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pSR->LoadBuffer(pData, length, dwAccess)) {
67ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pSR->Release();
68ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
69ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
70ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
71ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
72ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
73ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
74ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
75ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_StreamImp::CFX_StreamImp() : CFX_ThreadLock(), m_dwAccess(0) {}
76ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileStreamImp::CFX_FileStreamImp()
77ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CFX_StreamImp(), m_hFile(NULL), m_iLength(0) {}
78ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileStreamImp::~CFX_FileStreamImp() {
79ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_hFile != NULL) {
80ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_fclose(m_hFile);
81ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
82ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
83ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::LoadFile(const FX_WCHAR* pszSrcFileName,
84ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_DWORD dwAccess) {
85ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile == NULL);
86ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pszSrcFileName != NULL && FXSYS_wcslen(pszSrcFileName) > 0);
87ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN32_MOBILE_ || \
88ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    _FX_OS_ == _FX_WIN64_
89ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString wsMode;
90ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Write) {
91ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwAccess & FX_STREAMACCESS_Append) {
92ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = L"a+b";
93ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
94ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = L"w+b";
95ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
96ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = L"r+b";
97ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
98ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
99ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wsMode = L"rb";
100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_
102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_WideString wsSrcFileName(pszSrcFileName);
103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  _wfopen_s(&m_hFile, wsSrcFileName, wsMode);
104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_hFile = FXSYS_wfopen(pszSrcFileName, wsMode);
106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_hFile == NULL) {
108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwAccess & FX_STREAMACCESS_Write) {
109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (dwAccess & FX_STREAMACCESS_Create) {
110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_
111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString wsSrcFileName(pszSrcFileName);
112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        _wfopen_s(&m_hFile, wsSrcFileName, L"w+b");
113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_hFile = FXSYS_wfopen(pszSrcFileName, L"w+b");
115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_hFile == NULL) {
118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#ifdef _FX_WINAPI_PARTITION_APP_
119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        CFX_WideString wsSrcFileName(pszSrcFileName);
120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        _wfopen_s(&m_hFile, wsSrcFileName, L"r+b");
121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_hFile = FXSYS_wfopen(pszSrcFileName, L"r+b");
123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_hFile == NULL) {
125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (dwAccess & FX_STREAMACCESS_Truncate) {
128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_fsetsize(m_hFile, 0);
129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString wsMode;
137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Write) {
138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwAccess & FX_STREAMACCESS_Append) {
139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = "a+b";
140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (dwAccess & FX_STREAMACCESS_Truncate) {
141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = "w+b";
142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      wsMode = "r+b";
144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    wsMode = "rb";
147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_ByteString szFileName = CFX_ByteString::FromUnicode(pszSrcFileName);
149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_hFile = FXSYS_fopen(szFileName, wsMode);
150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_hFile == NULL) {
151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (dwAccess & FX_STREAMACCESS_Write) {
152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (dwAccess & FX_STREAMACCESS_Create) {
153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_hFile = FXSYS_fopen(szFileName, "w+b");
154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_hFile == NULL) {
156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_hFile = FXSYS_fopen(szFileName, "r+b");
157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (m_hFile == NULL) {
158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          return FALSE;
159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        if (dwAccess & FX_STREAMACCESS_Truncate) {
161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann          FX_fsetsize(m_hFile, 0);
162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        }
163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwAccess = dwAccess;
170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((dwAccess & (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) ==
171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (FX_STREAMACCESS_Write | FX_STREAMACCESS_Truncate)) {
172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = 0;
173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = FX_filelength(m_hFile);
175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::GetLength() const {
179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iLength;
181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_fseek(m_hFile, iOffset, eSeek);
185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXSYS_ftell(m_hFile);
186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::GetPosition() {
188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXSYS_ftell(m_hFile);
190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::IsEOF() const {
192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXSYS_ftell(m_hFile) >= m_iLength;
194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FXSYS_fread(pBuffer, 1, iBufferSize, m_hFile);
199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::ReadString(FX_WCHAR* pStr,
201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      int32_t iMaxLength,
202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      FX_BOOL& bEOS) {
203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL);
204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iLength <= 0) {
206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iPosition = FXSYS_ftell(m_hFile);
209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min((m_iLength - iPosition) / 2, iMaxLength);
210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = FXSYS_fread(pStr, 2, iLen, m_hFile);
214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (*pStr != L'\0' && iCount < iLen) {
216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pStr++, iCount++;
217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iPosition += iCount * 2;
219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (FXSYS_ftell(m_hFile) != iPosition) {
220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_fseek(m_hFile, iPosition, 0);
221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = (iPosition >= m_iLength);
223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iCount;
224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::WriteData(const uint8_t* pBuffer,
226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                     int32_t iBufferSize) {
227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iRet = FXSYS_fwrite(pBuffer, 1, iBufferSize, m_hFile);
230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iRet != 0) {
231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iPos = FXSYS_ftell(m_hFile);
232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iPos > m_iLength) {
233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iLength = iPos;
234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iRet;
237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileStreamImp::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iLength > 0);
241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iRet = FXSYS_fwrite(pStr, 2, iLength, m_hFile);
242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iRet != 0) {
243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iPos = FXSYS_ftell(m_hFile);
244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iPos > m_iLength) {
245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iLength = iPos;
246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iRet;
249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_FileStreamImp::Flush() {
251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_fflush(m_hFile);
253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileStreamImp::SetLength(int32_t iLength) {
255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_hFile != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet = FX_fsetsize(m_hFile, iLength);
257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iLength = FX_filelength(m_hFile);
258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileReadStreamImp::CFX_FileReadStreamImp()
261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pFileRead(NULL), m_iPosition(0), m_iLength(0) {}
262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileReadStreamImp::LoadFileRead(IFX_FileRead* pFileRead,
263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            FX_DWORD dwAccess) {
264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFileRead == NULL && pFileRead != NULL);
265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Write) {
266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFileRead = pFileRead;
269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iLength = m_pFileRead->GetSize();
270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::GetLength() const {
273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iLength;
274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eSeek) {
277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Begin:
278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iOffset;
279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Current:
281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition += iOffset;
282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_End:
284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = m_iLength + iOffset;
285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < 0) {
288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = 0;
289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_iPosition >= m_iLength) {
290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = m_iLength;
291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition;
293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileReadStreamImp::IsEOF() const {
295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition >= m_iLength;
296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFileRead != NULL);
299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iBufferSize > m_iLength - m_iPosition) {
301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBufferSize = m_iLength - m_iPosition;
302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFileRead->ReadBlock(pBuffer, m_iPosition, iBufferSize)) {
304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition += iBufferSize;
305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return iBufferSize;
306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileReadStreamImp::ReadString(FX_WCHAR* pStr,
310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int32_t iMaxLength,
311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          FX_BOOL& bEOS) {
312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFileRead != NULL);
313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iMaxLength <= 0) {
316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i = 0;
319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < iMaxLength && pStr[i] != L'\0') {
320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ++i;
321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = (m_iPosition >= m_iLength) || pStr[i] == L'\0';
323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return i;
324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferReadStreamImp::CFX_BufferReadStreamImp()
326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pBufferRead(NULL),
327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bReleaseBufferRead(FALSE),
328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition(0),
329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iBufferSize(0) {}
330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferReadStreamImp::~CFX_BufferReadStreamImp() {
331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bReleaseBufferRead && m_pBufferRead != NULL) {
332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pBufferRead->Release();
333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferReadStreamImp::LoadBufferRead(IFX_BufferRead* pBufferRead,
336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                int32_t iFileSize,
337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_DWORD dwAccess,
338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                                FX_BOOL bReleaseBufferRead) {
339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pBufferRead == NULL && pBufferRead != NULL);
340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Write) {
341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_bReleaseBufferRead = bReleaseBufferRead;
344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pBufferRead = pBufferRead;
345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iBufferSize = iFileSize;
346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iBufferSize >= 0) {
347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iBufferSize = m_pBufferRead->GetBlockSize();
353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (!m_pBufferRead->IsEOF()) {
354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pBufferRead->ReadNextBlock(FALSE);
355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iBufferSize += m_pBufferRead->GetBlockSize();
356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
358ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
359ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::GetLength() const {
360ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iBufferSize;
361ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
362ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
363ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = GetLength();
364ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eSeek) {
365ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Begin:
366ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iOffset;
367ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
368ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Current:
369ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition += iOffset;
370ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
371ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_End:
372ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iLength + iOffset;
373ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
374ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
375ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < 0) {
376ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = 0;
377ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_iPosition >= iLength) {
378ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iLength;
379ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
380ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition;
381ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
382ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferReadStreamImp::IsEOF() const {
383ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pBufferRead ? m_pBufferRead->IsEOF() : TRUE;
384ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
385ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::ReadData(uint8_t* pBuffer,
386ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int32_t iBufferSize) {
387ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pBufferRead != NULL);
388ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
389ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = GetLength();
390ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition >= iLength) {
391ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
392ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
393ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iBufferSize > iLength - m_iPosition) {
394ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBufferSize = iLength - m_iPosition;
395ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
396ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwBlockOffset = m_pBufferRead->GetBlockOffset();
397ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwBlockSize = m_pBufferRead->GetBlockSize();
398ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < (int32_t)dwBlockOffset) {
399ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
400ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
401ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
402ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
403ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
404ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
405ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (m_iPosition < (int32_t)dwBlockOffset ||
406ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann         m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
407ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
408ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
409ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
410ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
411ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
412ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
413ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < (int32_t)dwBlockOffset ||
414ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition >= (int32_t)(dwBlockOffset + dwBlockSize)) {
415ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
416ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
417ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const uint8_t* pBufferTmp = m_pBufferRead->GetBlockBuffer();
418ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwOffsetTmp = m_iPosition - dwBlockOffset;
419ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_DWORD dwCopySize =
420ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      std::min(iBufferSize, (int32_t)(dwBlockSize - dwOffsetTmp));
421ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(pBuffer, pBufferTmp + dwOffsetTmp, dwCopySize);
422ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  dwOffsetTmp = dwCopySize;
423ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iBufferSize -= dwCopySize;
424ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (iBufferSize > 0) {
425ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
426ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
427ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
428ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
429ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
430ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pBufferTmp = m_pBufferRead->GetBlockBuffer();
431ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwCopySize = std::min((FX_DWORD)iBufferSize, dwBlockSize);
432ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(pBuffer + dwOffsetTmp, pBufferTmp, dwCopySize);
433ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwOffsetTmp += dwCopySize;
434ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBufferSize -= dwCopySize;
435ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
436ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += dwOffsetTmp;
437ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return dwOffsetTmp;
438ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
439ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferReadStreamImp::ReadString(FX_WCHAR* pStr,
440ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            int32_t iMaxLength,
441ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            FX_BOOL& bEOS) {
442ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pBufferRead != NULL);
443ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
444ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iMaxLength = ReadData((uint8_t*)pStr, iMaxLength * 2) / 2;
445ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iMaxLength <= 0) {
446ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
447ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
448ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t i = 0;
449ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (i < iMaxLength && pStr[i] != L'\0') {
450ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    ++i;
451ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
452ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = (m_iPosition >= GetLength()) || pStr[i] == L'\0';
453ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return i;
454ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
455ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_FileWriteStreamImp::CFX_FileWriteStreamImp()
456ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pFileWrite(NULL), m_iPosition(0) {}
457ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileWriteStreamImp::LoadFileWrite(IFX_FileWrite* pFileWrite,
458ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                              FX_DWORD dwAccess) {
459ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pFileWrite == NULL && pFileWrite != NULL);
460ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Read) {
461ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
462ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
463ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Append) {
464ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = pFileWrite->GetSize();
465ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
466ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pFileWrite = pFileWrite;
467ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
468ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
469ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::GetLength() const {
470ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pFileWrite) {
471ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
472ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
473ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (int32_t)m_pFileWrite->GetSize();
474ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
475ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
476ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLength = GetLength();
477ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  switch (eSeek) {
478ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Begin:
479ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iOffset;
480ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
481ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_Current:
482ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition += iOffset;
483ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
484ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    case FX_STREAMSEEK_End:
485ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition = iLength + iOffset;
486ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
487ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
488ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < 0) {
489ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = 0;
490ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (m_iPosition >= iLength) {
491ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iLength;
492ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
493ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition;
494ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
495ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_FileWriteStreamImp::IsEOF() const {
496ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition >= GetLength();
497ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
498ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::WriteData(const uint8_t* pBuffer,
499ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                          int32_t iBufferSize) {
500ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pFileWrite) {
501ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
502ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
503ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFileWrite->WriteBlock(pBuffer, m_iPosition, iBufferSize)) {
504ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition += iBufferSize;
505ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
506ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iBufferSize;
507ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
508ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_FileWriteStreamImp::WriteString(const FX_WCHAR* pStr,
509ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                            int32_t iLength) {
510ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return WriteData((const uint8_t*)pStr, iLength * sizeof(FX_WCHAR));
511ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
512ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_FileWriteStreamImp::Flush() {
513ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pFileWrite) {
514ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pFileWrite->Flush();
515ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
516ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
517ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferStreamImp::CFX_BufferStreamImp()
518ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : CFX_StreamImp(),
519ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pData(NULL),
520ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iTotalSize(0),
521ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition(0),
522ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iLength(0) {}
523ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferStreamImp::LoadBuffer(uint8_t* pData,
524ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t iTotalSize,
525ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        FX_DWORD dwAccess) {
526ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData == NULL);
527ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pData != NULL && iTotalSize > 0);
528ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwAccess = dwAccess;
529ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pData = pData;
530ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iTotalSize = iTotalSize;
531ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition = 0;
532ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iTotalSize;
533ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
534ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
535ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::GetLength() const {
536ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
537ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iLength;
538ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
539ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
540ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
541ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eSeek == FX_STREAMSEEK_Begin) {
542ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iOffset;
543ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (eSeek == FX_STREAMSEEK_Current) {
544ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition += iOffset;
545ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (eSeek == FX_STREAMSEEK_End) {
546ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = m_iLength + iOffset;
547ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
548ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > m_iLength) {
549ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = m_iLength;
550ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
551ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < 0) {
552ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = 0;
553ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
554ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition;
555ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
556ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::GetPosition() {
557ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
558ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition;
559ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
560ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferStreamImp::IsEOF() const {
561ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
562ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition >= m_iLength;
563ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
564ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
565ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
566ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
567ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min(m_iLength - m_iPosition, iBufferSize);
568ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
569ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
570ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
571ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(pBuffer, m_pData + m_iPosition, iLen);
572ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += iLen;
573ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
574ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
575ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::ReadString(FX_WCHAR* pStr,
576ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        int32_t iMaxLength,
577ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        FX_BOOL& bEOS) {
578ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL);
579ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
580ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min((m_iLength - m_iPosition) / 2, iMaxLength);
581ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
582ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
583ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
584ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_WCHAR* pSrc = (const FX_WCHAR*)(FX_CHAR*)(m_pData + m_iPosition);
585ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iCount = 0;
586ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (*pSrc != L'\0' && iCount < iLen) {
587ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    *pStr++ = *pSrc++, iCount++;
588ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
589ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += iCount * 2;
590ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = (*pSrc == L'\0') || (m_iPosition >= m_iLength);
591ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iCount;
592ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
593ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::WriteData(const uint8_t* pBuffer,
594ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                       int32_t iBufferSize) {
595ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
596ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
597ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min(m_iTotalSize - m_iPosition, iBufferSize);
598ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
599ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
600ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
601ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(m_pData + m_iPosition, pBuffer, iLen);
602ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += iLen;
603ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > m_iLength) {
604ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_iPosition;
605ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
606ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
607ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
608ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_BufferStreamImp::WriteString(const FX_WCHAR* pStr,
609ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         int32_t iLength) {
610ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pData != NULL && (m_dwAccess & FX_STREAMACCESS_Write) != 0);
611ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iLength > 0);
612ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min((m_iTotalSize - m_iPosition) / 2, iLength);
613ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
614ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
615ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
616ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(m_pData + m_iPosition, pStr, iLen * 2);
617ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition += iLen * 2;
618ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > m_iLength) {
619ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_iPosition;
620ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
621ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
622ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
623ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* IFX_Stream::CreateTextStream(IFX_Stream* pBaseStream,
624ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                         FX_BOOL bDeleteOnRelease) {
625ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBaseStream != NULL);
626ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CFX_TextStream(pBaseStream, bDeleteOnRelease);
627ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
628ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_TextStream::CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream)
629ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_wCodePage(FX_CODEPAGE_DefANSI),
630ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength(0),
631ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwBOM(0),
632ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pBuf(NULL),
633ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iBufSize(0),
634ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bDelStream(bDelStream),
635ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp(pStream),
636ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iRefCount(1) {
637ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pStreamImp != NULL);
638ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Retain();
639ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  InitStream();
640ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
641ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_TextStream::~CFX_TextStream() {
642ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Release();
643ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bDelStream) {
644ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
645ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
646ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pBuf != NULL) {
647ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FX_Free(m_pBuf);
648ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
649ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
650ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::InitStream() {
651ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iPosition = m_pStreamImp->GetPosition();
652ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, 0);
653ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->ReadData((uint8_t*)&m_dwBOM, 3);
654ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
655ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwBOM &= 0x00FFFFFF;
656ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwBOM == 0x00BFBBEF) {
657ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_wBOMLength = 3;
658ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_wCodePage = FX_CODEPAGE_UTF8;
659ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
660ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwBOM &= 0x0000FFFF;
661ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_dwBOM == 0x0000FFFE) {
662ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 2;
663ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FX_CODEPAGE_UTF16BE;
664ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (m_dwBOM == 0x0000FEFF) {
665ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 2;
666ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FX_CODEPAGE_UTF16LE;
667ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
668ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 0;
669ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwBOM = 0;
670ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FXSYS_GetACP();
671ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
672ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
673ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
674ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_dwBOM &= 0xFFFFFF00;
675ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_dwBOM == 0xEFBBBF00) {
676ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_wBOMLength = 3;
677ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_wCodePage = FX_CODEPAGE_UTF8;
678ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
679ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwBOM &= 0xFFFF0000;
680ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_dwBOM == 0xFEFF0000) {
681ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 2;
682ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FX_CODEPAGE_UTF16BE;
683ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else if (m_dwBOM == 0xFFFE0000) {
684ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 2;
685ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FX_CODEPAGE_UTF16LE;
686ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
687ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wBOMLength = 0;
688ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwBOM = 0;
689ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage = FXSYS_GetACP();
690ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
691ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
692ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
693ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Seek(FX_STREAMSEEK_Begin, std::max(m_wBOMLength, iPosition));
694ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
695ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::Release() {
696ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (--m_iRefCount < 1) {
697ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete this;
698ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
699ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
700ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_TextStream::Retain() {
701ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRefCount++;
702ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return this;
703ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
704ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_DWORD CFX_TextStream::GetAccessModes() const {
705ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->GetAccessModes() | FX_STREAMACCESS_Text;
706ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
707ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetLength() const {
708ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->GetLength();
709ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
710ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
711ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->Seek(eSeek, iOffset);
712ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
713ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetPosition() {
714ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->GetPosition();
715ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
716ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_TextStream::IsEOF() const {
717ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->IsEOF();
718ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
719ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
720ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->ReadData(pBuffer, iBufferSize);
721ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
722ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
723ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->WriteData(pBuffer, iBufferSize);
724ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
725ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_TextStream::Flush() {
726ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Flush();
727ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
728ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_TextStream::SetLength(int32_t iLength) {
729ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->SetLength(iLength);
730ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
731ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_TextStream::GetCodePage() const {
732ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_wCodePage;
733ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
734ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_TextStream::CreateSharedStream(FX_DWORD dwAccess,
735ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               int32_t iOffset,
736ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                               int32_t iLength) {
737ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  IFX_Stream* pSR =
738ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp->CreateSharedStream(dwAccess, iOffset, iLength);
739ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pSR == NULL) {
740ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
741ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
742ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
743ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return new CFX_TextStream(pSR, TRUE);
744ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
745ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pSR;
746ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
747ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::GetBOM(uint8_t bom[4]) const {
748ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_wBOMLength < 1) {
749ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
750ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
751ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  *(FX_DWORD*)bom = m_dwBOM;
752ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_wBOMLength;
753ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
754ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_TextStream::SetCodePage(FX_WORD wCodePage) {
755ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_wBOMLength > 0) {
756ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_wCodePage;
757ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
758ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_WORD v = m_wCodePage;
759ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_wCodePage = wCodePage;
760ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return v;
761ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
762ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::ReadString(FX_WCHAR* pStr,
763ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int32_t iMaxLength,
764ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_BOOL& bEOS,
765ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int32_t const* pByteSize) {
766ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
767ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
768ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
769ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
770ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen;
771ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_wCodePage == FX_CODEPAGE_UTF16LE ||
772ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_wCodePage == FX_CODEPAGE_UTF16BE) {
773ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iBytes = pByteSize == NULL ? iMaxLength * 2 : *pByteSize;
774ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Lock();
775ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLen = m_pStreamImp->ReadData((uint8_t*)pStr, iBytes);
776ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Unlock();
777ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iMaxLength = iLen / 2;
778ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (sizeof(FX_WCHAR) > 2) {
779ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_UTF16ToWChar(pStr, iMaxLength);
780ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
781ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_BIG_ENDIAN_
782ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_wCodePage == FX_CODEPAGE_UTF16LE) {
783ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_SwapByteOrder(pStr, iMaxLength);
784ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
785ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
786ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_wCodePage == FX_CODEPAGE_UTF16BE) {
787ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      FX_SwapByteOrder(pStr, iMaxLength);
788ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
789ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
790ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
791ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t pos = m_pStreamImp->GetPosition();
792ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t iBytes = pByteSize == NULL ? iMaxLength : *pByteSize;
793ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iBytes = std::min(iBytes, m_pStreamImp->GetLength() - pos);
794ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iBytes > 0) {
795ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (m_pBuf == NULL) {
796ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pBuf = FX_Alloc(uint8_t, iBytes);
797ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_iBufSize = iBytes;
798ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      } else if (iBytes > m_iBufSize) {
799ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_pBuf = FX_Realloc(uint8_t, m_pBuf, iBytes);
800ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        m_iBufSize = iBytes;
801ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
802ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp->Lock();
803ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iLen = m_pStreamImp->ReadData(m_pBuf, iBytes);
804ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iSrc = iLen;
805ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      int32_t iDecode = FX_DecodeString(m_wCodePage, (const FX_CHAR*)m_pBuf,
806ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                        &iSrc, pStr, &iMaxLength, TRUE);
807ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp->Seek(FX_STREAMSEEK_Current, iSrc - iLen);
808ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp->Unlock();
809ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      if (iDecode < 1) {
810ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann        return -1;
811ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      }
812ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    } else {
813ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      iMaxLength = 0;
814ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
815ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
816ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  bEOS = m_pStreamImp->IsEOF();
817ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iMaxLength;
818ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
819ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_TextStream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
820ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iLength > 0);
821ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_pStreamImp->GetAccessModes() & FX_STREAMACCESS_Write) == 0) {
822ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
823ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
824ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_wCodePage == FX_CODEPAGE_UTF8) {
825ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    int32_t len = iLength;
826ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_UTF8Encoder encoder;
827ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    while (len-- > 0) {
828ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      encoder.Input(*pStr++);
829ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
830ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    CFX_ByteStringC bsResult = encoder.GetResult();
831ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Lock();
832ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->WriteData((const uint8_t*)bsResult.GetCStr(),
833ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                            bsResult.GetLength());
834ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Unlock();
835ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
836ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLength;
837ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
838ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Stream::CFX_Stream()
839ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_eStreamType(FX_SREAMTYPE_Unknown),
840ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_pStreamImp(NULL),
841ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_dwAccess(0),
842ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iTotalSize(0),
843ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iPosition(0),
844ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iStart(0),
845ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iLength(0),
846ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iRefCount(1) {}
847ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_Stream::~CFX_Stream() {
848ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_STREAMTYPE_Stream && m_pStreamImp != NULL) {
849ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
850ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
851ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
852ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFile(const FX_WCHAR* pszSrcFileName,
853ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                             FX_DWORD dwAccess) {
854ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
855ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
856ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
857ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pszSrcFileName == NULL || FXSYS_wcslen(pszSrcFileName) < 1) {
858ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
859ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
860ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp = new CFX_FileStreamImp();
861ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet =
862ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ((CFX_FileStreamImp*)m_pStreamImp)->LoadFile(pszSrcFileName, dwAccess);
863ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bRet) {
864ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
865ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp = NULL;
866ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
867ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eStreamType = FX_STREAMTYPE_File;
868ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwAccess = dwAccess;
869ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_pStreamImp->GetLength();
870ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
871ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
872ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
873ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess) {
874ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
875ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
876ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
877ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFileRead == NULL) {
878ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
879ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
880ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp = new CFX_FileReadStreamImp();
881ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet =
882ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      ((CFX_FileReadStreamImp*)m_pStreamImp)->LoadFileRead(pFileRead, dwAccess);
883ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bRet) {
884ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
885ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp = NULL;
886ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
887ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eStreamType = FX_STREAMTYPE_File;
888ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwAccess = dwAccess;
889ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_pStreamImp->GetLength();
890ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
891ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
892ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
893ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadFileWrite(IFX_FileWrite* pFileWrite,
894ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_DWORD dwAccess) {
895ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
896ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
897ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
898ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pFileWrite == NULL) {
899ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
900ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
901ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp = new CFX_FileWriteStreamImp();
902ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet = ((CFX_FileWriteStreamImp*)m_pStreamImp)
903ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     ->LoadFileWrite(pFileWrite, dwAccess);
904ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bRet) {
905ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
906ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp = NULL;
907ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
908ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eStreamType = FX_STREAMTYPE_File;
909ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwAccess = dwAccess;
910ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_pStreamImp->GetLength();
911ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
912ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
913ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
914ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadBuffer(uint8_t* pData,
915ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int32_t iTotalSize,
916ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               FX_DWORD dwAccess) {
917ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
918ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
919ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
920ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pData == NULL || iTotalSize < 1) {
921ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
922ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
923ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp = new CFX_BufferStreamImp();
924ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet = ((CFX_BufferStreamImp*)m_pStreamImp)
925ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     ->LoadBuffer(pData, iTotalSize, dwAccess);
926ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bRet) {
927ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
928ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp = NULL;
929ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
930ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eStreamType = FX_STREAMTYPE_Buffer;
931ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwAccess = dwAccess;
932ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_pStreamImp->GetLength();
933ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
934ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
935ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
936ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::LoadBufferRead(IFX_BufferRead* pBufferRead,
937ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   int32_t iFileSize,
938ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_DWORD dwAccess,
939ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_BOOL bReleaseBufferRead) {
940ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType != FX_SREAMTYPE_Unknown || m_pStreamImp != NULL) {
941ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
942ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
943ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pBufferRead) {
944ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
945ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
946ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp = new CFX_BufferReadStreamImp;
947ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_BOOL bRet = ((CFX_BufferReadStreamImp*)m_pStreamImp)
948ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                     ->LoadBufferRead(pBufferRead, iFileSize, dwAccess,
949ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                      bReleaseBufferRead);
950ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!bRet) {
951ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Release();
952ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp = NULL;
953ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else {
954ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_eStreamType = FX_STREAMTYPE_BufferRead;
955ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_dwAccess = dwAccess;
956ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_pStreamImp->GetLength();
957ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
958ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return bRet;
959ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
960ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_Stream::Release() {
961ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (--m_iRefCount < 1) {
962ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    delete this;
963ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
964ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
965ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_Stream::Retain() {
966ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iRefCount++;
967ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return this;
968ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
969ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetLength() const {
970ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
971ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
972ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
973ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_File ||
974ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_eStreamType == FX_STREAMTYPE_Buffer) {
975ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pStreamImp->GetLength();
976ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
977ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iLength;
978ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
979ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::Seek(FX_STREAMSEEK eSeek, int32_t iOffset) {
980ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
981ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
982ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
983ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_File ||
984ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_eStreamType == FX_STREAMTYPE_Buffer) {
985ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_iPosition = m_pStreamImp->Seek(eSeek, iOffset);
986ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
987ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEnd = m_iStart + m_iLength;
988ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iPosition = m_iStart + iOffset;
989ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (eSeek == FX_STREAMSEEK_Begin) {
990ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iPosition;
991ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (eSeek == FX_STREAMSEEK_Current) {
992ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition += iOffset;
993ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  } else if (eSeek == FX_STREAMSEEK_End) {
994ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iEnd + iOffset;
995ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
996ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > iEnd) {
997ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = iEnd;
998ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
999ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition < m_iStart) {
1000ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iPosition = m_iStart;
1001ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1002ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition - m_iStart;
1003ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1004ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetPosition() {
1005ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1006ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1007ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1008ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_File ||
1009ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_eStreamType == FX_STREAMTYPE_Buffer) {
1010ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_iPosition = m_pStreamImp->GetPosition();
1011ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1012ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition - m_iStart;
1013ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1014ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::IsEOF() const {
1015ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1016ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
1017ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1018ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_File ||
1019ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_eStreamType == FX_STREAMTYPE_Buffer) {
1020ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_pStreamImp->IsEOF();
1021ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1022ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iPosition >= m_iStart + m_iLength;
1023ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1024ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
1025ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
1026ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1027ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1028ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1029ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = std::min(m_iStart + m_iLength - m_iPosition, iBufferSize);
1030ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
1031ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1032ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1033ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Lock();
1034ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp->GetPosition() != m_iPosition) {
1035ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
1036ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1037ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = m_pStreamImp->ReadData(pBuffer, iLen);
1038ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition = m_pStreamImp->GetPosition();
1039ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Unlock();
1040ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
1041ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1042ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::ReadString(FX_WCHAR* pStr,
1043ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int32_t iMaxLength,
1044ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               FX_BOOL& bEOS,
1045ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                               int32_t const* pByteSize) {
1046ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iMaxLength > 0);
1047ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1048ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1049ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1050ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEnd = m_iStart + m_iLength;
1051ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = iEnd - m_iPosition;
1052ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (pByteSize != NULL) {
1053ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLen = std::min(iLen, *pByteSize);
1054ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1055ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = std::min(iEnd / 2, iMaxLength);
1056ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen <= 0) {
1057ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1058ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1059ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Lock();
1060ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp->GetPosition() != m_iPosition) {
1061ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
1062ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1063ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = m_pStreamImp->ReadString(pStr, iLen, bEOS);
1064ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition = m_pStreamImp->GetPosition();
1065ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iLen > 0 && m_iPosition >= iEnd) {
1066ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    bEOS = TRUE;
1067ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1068ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Unlock();
1069ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
1070ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1071ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
1072ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBuffer != NULL && iBufferSize > 0);
1073ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1074ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1075ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1076ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
1077ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1078ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1079ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = iBufferSize;
1080ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_Stream) {
1081ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLen = std::min(m_iStart + m_iTotalSize - m_iPosition, iBufferSize);
1082ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iLen <= 0) {
1083ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
1084ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1085ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1086ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Lock();
1087ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEnd = m_iStart + m_iLength;
1088ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp->GetPosition() != m_iPosition) {
1089ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
1090ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1091ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = m_pStreamImp->WriteData(pBuffer, iLen);
1092ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition = m_pStreamImp->GetPosition();
1093ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > iEnd) {
1094ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_iPosition - m_iStart;
1095ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1096ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Unlock();
1097ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
1098ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1099ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
1100ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pStr != NULL && iLength > 0);
1101ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1102ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1103ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1104ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
1105ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1106ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1107ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = iLength;
1108ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_eStreamType == FX_STREAMTYPE_Stream) {
1109ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    iLen = std::min((m_iStart + m_iTotalSize - m_iPosition) / 2, iLength);
1110ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (iLen <= 0) {
1111ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return 0;
1112ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1113ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1114ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Lock();
1115ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEnd = m_iStart + m_iLength;
1116ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp->GetPosition() != m_iPosition) {
1117ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStreamImp->Seek(FX_STREAMSEEK_Begin, m_iPosition);
1118ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1119ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  iLen = m_pStreamImp->WriteString(pStr, iLen);
1120ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iPosition = m_pStreamImp->GetPosition();
1121ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iPosition > iEnd) {
1122ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iLength = m_iPosition - m_iStart;
1123ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1124ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Unlock();
1125ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen;
1126ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1127ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannvoid CFX_Stream::Flush() {
1128ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1129ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1130ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1131ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
1132ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return;
1133ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1134ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStreamImp->Flush();
1135ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1136ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_Stream::SetLength(int32_t iLength) {
1137ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1138ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1139ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1140ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0) {
1141ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1142ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1143ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStreamImp->SetLength(iLength);
1144ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1145ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmannint32_t CFX_Stream::GetBOM(uint8_t bom[4]) const {
1146ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1147ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return -1;
1148ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1149ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return 0;
1150ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1151ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_Stream::GetCodePage() const {
1152ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
1153ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_CODEPAGE_UTF16LE;
1154ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
1155ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_CODEPAGE_UTF16BE;
1156ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1157ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1158ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_WORD CFX_Stream::SetCodePage(FX_WORD wCodePage) {
1159ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#if _FX_ENDIAN_ == _FX_LITTLE_ENDIAN_
1160ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_CODEPAGE_UTF16LE;
1161ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#else
1162ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return FX_CODEPAGE_UTF16BE;
1163ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann#endif
1164ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1165ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_Stream* CFX_Stream::CreateSharedStream(FX_DWORD dwAccess,
1166ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t iOffset,
1167ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                           int32_t iLength) {
1168ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(iLength > 0);
1169ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_pStreamImp == NULL) {
1170ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1171ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1172ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Text) != 0 &&
1173ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (dwAccess & FX_STREAMACCESS_Text) == 0) {
1174ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1175ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1176ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if ((m_dwAccess & FX_STREAMACCESS_Write) == 0 &&
1177ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      (dwAccess & FX_STREAMACCESS_Write) != 0) {
1178ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1179ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1180ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iStart = m_iStart + iOffset;
1181ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iTotal = m_iStart + m_iLength;
1182ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iStart < m_iStart || iStart >= iTotal) {
1183ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1184ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1185ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iEnd = iStart + iLength;
1186ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (iEnd < iStart || iEnd > iTotal) {
1187ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1188ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1189ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  CFX_Stream* pShared = new CFX_Stream;
1190ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_eStreamType = FX_STREAMTYPE_Stream;
1191ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_pStreamImp = m_pStreamImp;
1192ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_dwAccess = dwAccess;
1193ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_iTotalSize = iLength;
1194ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_iPosition = iStart;
1195ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_iStart = iStart;
1196ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  pShared->m_iLength = (dwAccess & FX_STREAMACCESS_Write) != 0 ? 0 : iLength;
1197ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (dwAccess & FX_STREAMACCESS_Text) {
1198ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return IFX_Stream::CreateTextStream(pShared, TRUE);
1199ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1200ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return pShared;
1201ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1202ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(IFX_Stream* pBaseStream,
1203ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_BOOL bReleaseStream) {
1204ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBaseStream != NULL);
1205ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CFGAS_FileRead(pBaseStream, bReleaseStream);
1206ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1207ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileRead::CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream)
1208ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_bReleaseStream(bReleaseStream), m_pStream(pStream) {
1209ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pStream != NULL);
1210ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1211ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileRead::~CFGAS_FileRead() {
1212ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bReleaseStream) {
1213ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream->Release();
1214ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1215ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1216ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFGAS_FileRead::GetSize() {
1217ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return (FX_FILESIZE)m_pStream->GetLength();
1218ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1219ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileRead::ReadBlock(void* buffer,
1220ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_FILESIZE offset,
1221ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  size_t size) {
1222ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Lock();
1223ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Seek(FX_STREAMSEEK_Begin, (int32_t)offset);
1224ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = m_pStream->ReadData((uint8_t*)buffer, (int32_t)size);
1225ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Unlock();
1226ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen == (int32_t)size;
1227ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1228ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1229ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileRead* FX_CreateFileRead(IFX_BufferRead* pBufferRead,
1230ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_FILESIZE iFileSize,
1231ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                FX_BOOL bReleaseStream) {
1232ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!pBufferRead) {
1233ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return NULL;
1234ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1235ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CFX_BufferAccImp(pBufferRead, iFileSize, bReleaseStream);
1236ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1237ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferAccImp::CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
1238ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_FILESIZE iFileSize,
1239ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                   FX_BOOL bReleaseStream)
1240ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pBufferRead(pBufferRead),
1241ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_bReleaseStream(bReleaseStream),
1242ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      m_iBufSize(iFileSize) {
1243ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pBufferRead);
1244ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1245ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFX_BufferAccImp::~CFX_BufferAccImp() {
1246ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bReleaseStream && m_pBufferRead) {
1247ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pBufferRead->Release();
1248ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1249ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1250ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFX_BufferAccImp::GetSize() {
1251ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pBufferRead) {
1252ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1253ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1254ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_iBufSize >= 0) {
1255ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return m_iBufSize;
1256ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1257ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pBufferRead->ReadNextBlock(TRUE)) {
1258ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return 0;
1259ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1260ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_iBufSize = (FX_FILESIZE)m_pBufferRead->GetBlockSize();
1261ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (!m_pBufferRead->IsEOF()) {
1262ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pBufferRead->ReadNextBlock(FALSE);
1263ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_iBufSize += (FX_FILESIZE)m_pBufferRead->GetBlockSize();
1264ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1265ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_iBufSize;
1266ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1267ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFX_BufferAccImp::ReadBlock(void* buffer,
1268ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_FILESIZE offset,
1269ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    size_t size) {
1270ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!m_pBufferRead) {
1271ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1272ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1273ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (!buffer || !size) {
1274ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return TRUE;
1275ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1276ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FILESIZE dwBufSize = GetSize();
1277ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (offset >= dwBufSize) {
1278ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1279ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1280ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size_t dwBlockSize = m_pBufferRead->GetBlockSize();
1281ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FX_FILESIZE dwBlockOffset = m_pBufferRead->GetBlockOffset();
1282ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (offset < dwBlockOffset) {
1283ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pBufferRead->ReadNextBlock(TRUE)) {
1284ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      return FALSE;
1285ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1286ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
1287ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
1288ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1289ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (offset < dwBlockOffset ||
1290ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann         offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
1291ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (m_pBufferRead->IsEOF() || !m_pBufferRead->ReadNextBlock(FALSE)) {
1292ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1293ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1294ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
1295ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
1296ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1297ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (offset < dwBlockOffset ||
1298ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      offset >= (FX_FILESIZE)(dwBlockOffset + dwBlockSize)) {
1299ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    return FALSE;
1300ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1301ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const uint8_t* pBuffer = m_pBufferRead->GetBlockBuffer();
1302ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  const FX_FILESIZE dwOffset = offset - dwBlockOffset;
1303ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size_t dwCopySize =
1304ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      std::min(size, static_cast<size_t>(dwBlockSize - dwOffset));
1305ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_memcpy(buffer, pBuffer + dwOffset, dwCopySize);
1306ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  offset = dwCopySize;
1307ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  size -= dwCopySize;
1308ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  while (size) {
1309ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    if (!m_pBufferRead->ReadNextBlock(FALSE)) {
1310ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann      break;
1311ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    }
1312ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockOffset = m_pBufferRead->GetBlockOffset();
1313ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwBlockSize = m_pBufferRead->GetBlockSize();
1314ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    pBuffer = m_pBufferRead->GetBlockBuffer();
1315ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    dwCopySize = std::min(size, dwBlockSize);
1316ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    FXSYS_memcpy(((uint8_t*)buffer) + offset, pBuffer, dwCopySize);
1317ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    offset += dwCopySize;
1318ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    size -= dwCopySize;
1319ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1320ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1321ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1322ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1323ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannIFX_FileWrite* FX_CreateFileWrite(IFX_Stream* pBaseStream,
1324ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                  FX_BOOL bReleaseStream) {
1325ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(pBaseStream != NULL);
1326ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return new CFGAS_FileWrite(pBaseStream, bReleaseStream);
1327ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1328ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann
1329ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileWrite::CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream)
1330ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    : m_pStream(pStream), m_bReleaseStream(bReleaseStream) {
1331ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  FXSYS_assert(m_pStream != NULL);
1332ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1333ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannCFGAS_FileWrite::~CFGAS_FileWrite() {
1334ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  if (m_bReleaseStream) {
1335ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann    m_pStream->Release();
1336ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  }
1337ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1338ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_FILESIZE CFGAS_FileWrite::GetSize() {
1339ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStream->GetLength();
1340ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1341ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::Flush() {
1342ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Flush();
1343ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return TRUE;
1344ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1345ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData, size_t size) {
1346ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return m_pStream->WriteData((const uint8_t*)pData, (int32_t)size) ==
1347ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann         (int32_t)size;
1348ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1349ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. MoltmannFX_BOOL CFGAS_FileWrite::WriteBlock(const void* pData,
1350ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    FX_FILESIZE offset,
1351ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann                                    size_t size) {
1352ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Lock();
1353ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Seek(FX_STREAMSEEK_Begin, offset);
1354ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  int32_t iLen = m_pStream->WriteData((uint8_t*)pData, (int32_t)size);
1355ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  m_pStream->Unlock();
1356ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann  return iLen == (int32_t)size;
1357ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann}
1358