28#if !defined(_MEMORYFILESTREAMIMPL_H_INCLUDED_)
29#define _MEMORYFILESTREAMIMPL_H_INCLUDED_
35#ifdef OD_HAVE_UNISTD_FILE
39#ifdef OD_HAVE_WINDOWS_STORAGE_FILE
40#include <windows.storage.h>
43#ifdef OD_HAVE_WRL_FILE
44#include <wrl/client.h>
45#include <wrl/wrappers/corewrappers.h>
55#define TEMPFILE_PREFIX "tx$"
65 if (CoCreateGuid(&result) < 0)
67 tmpDir = tmpDir.
format(L
"%ls%llx%x%x.tmp", tmpDir.
c_str(), result.Data1, result.Data2, result.Data3);
71 ::GetTempFileName(tmpDir.
c_str(), !prefix.isEmpty() ?
OdString(prefix).c_str() : L
"tmp", 0, tmpFile);
82 strcat(tmpFile, (
const char*)dstBuf.
asArrayPtr());
84 strcat(tmpFile, !prefix.isEmpty() ? prefix.c_str() :
"tmp");
85#ifdef OD_HAVE_MKSTEMPS_FUNC
86 strcat(tmpFile,
"XXXXXX.tmp");
87 int fileDescriptor = mkstemps(tmpFile, 4);
89 strcat(tmpFile,
"XXXXXX");
90 int fileDescriptor = mkstemp(tmpFile);
92 if (fileDescriptor == -1)
97 close(fileDescriptor);
99 OdAnsiString ansiTmpFile(tmpFile);
145template <
class TBase = OdMemFileStreamDummyBase>
173 bool releaseDiskFile(
bool deleteIt)
176 if (deleteIt && !m_sTmpFileName.
isEmpty()) {
177#ifdef OD_HAVE_REMOVE_FUNC
178 remove(m_sTmpFileName);
180 DeleteFile(
OdString(m_sTmpFileName).c_str());
183 m_sTmpFileName.
empty();
203 releaseDiskFile(
true);
208 m_pHostAppServices = pHostAppServices;
216 inline void setBufferSize(
OdUInt32 pageSize) { m_dataBuffer.
resize(pageSize); };
235 inline PAGE* activePage()
const {
return m_activePage; };
242 inline void setActivePage(
PAGE* pPage) { m_activePage = pPage; };
250 inline bool isActivePage(
PAGE* pPage)
const {
return (pPage == m_activePage); };
258 inline bool isModified(
PAGE* pPage)
const {
return pPage->
m_modified; };
266 inline void setModified(
PAGE* pPage,
bool modified) { pPage->
m_modified = modified; };
304 void initializePage(
PAGE* pPage)
309 pPage->
m_data = dataBuffer(pPage);
310 setModified(pPage,
false);
311 setSaved(pPage,
false);
312 setFilePosition(pPage, 0);
324 if (m_pHostAppServices)
326 m_sTmpFileName = TmpFileHelper::getTempFile(m_pHostAppServices);
335 throw OdError(eNullObjectPointer);
344 bool savePage(
PAGE* pPage)
346 if (pPage && isSaved(pPage) && !isModified(pPage))
349 if (!pPage || diskFile().isNull())
359 setFilePosition(pPage, diskFile()->
tell());
361 diskFile()->putBytes(dataBuffer(pPage), dataSize(pPage));
363 setModified(pPage,
false);
364 setSaved(pPage,
true);
374 bool loadPage(
PAGE* pPage)
378 if (isActivePage(pPage) && !isModified(pPage))
381 if (isSaved(pPage) && !diskFile().isNull())
384 diskFile()->getBytes(dataBuffer(pPage), dataSize(pPage));
387 setModified(pPage,
false);
388 setActivePage(pPage);
397 bool ensurePage(
PAGE* pPage)
400 return isActivePage(pPage) ?
true : switchToPage(pPage);
410 bool switchToPage(
PAGE* pPage)
413 if (isActivePage(pPage))
415 savePage(activePage());
416 return loadPage(pPage);
428 return isActivePage(pPage) ?
true : savePage(activePage());
439 bool wasSaved = isSaved(pPage);
440 setModified(pPage,
false);
441 setSaved(pPage,
false);
442 if (!wasSaved || diskFile().isNull())
448 diskFile()->truncate();
453 PageSwitcher m_pageSwitcher;
627 m_pCurrPage = m_pFirstPage;
644 m_pLastPage = m_pCurrPage;
669template <
class TBase>
672 PAGE* pNext, *pCurr = m_pFirstPage;
677 if (pageSwitcher().activePage() == pCurr)
687template <
class TBase>
694 pageSwitcher().initializePage(pPage);
703 pageSwitcher().switchToPage(m_pCurrPage);
709 m_pFirstPage = m_pCurrPage = pPage;
711 pageSwitcher().switchToPage(m_pCurrPage);
717template <
class TBase>
733 m_nCurPos += leftInCurPage();
734 pageSwitcher().switchToPage(m_pCurrPage);
740template <
class TBase>
747 nNewPos = m_nEndPos +
offset;
750 nNewPos = m_nCurPos +
offset;
765 if(nNewPos != m_nCurPos)
767 if (nNewPos > m_nEndPos)
770 OdInt64 nFromEnd = m_nEndPos - nNewPos;
772 bool bForward =
false;
788 m_pCurrPage = m_pLastPage;
795 m_pCurrPage = m_pLastPage;
803 m_pCurrPage = m_pFirstPage;
811 m_pCurrPage = m_pFirstPage;
816 m_pCurrPage = m_pLastPage;
823 nNewPos = nNewPos / m_nPageDataSize * m_nPageDataSize ;
836 pageSwitcher().switchToPage(m_pCurrPage);
841template <
class TBase>
845 if(m_nCurPos < m_nEndPos)
847 pageSwitcher().ensurePage(m_pCurrPage);
848 OdUInt32 nPosInPage = posInCurPage();
849 ret = m_pCurrPage->
m_data[nPosInPage];
851 if ((nPosInPage + 1) == m_nPageDataSize)
861template <
class TBase>
867 OdUInt64 nNewPos = m_nCurPos + nLen;
868 if(nNewPos <= m_nEndPos)
874 pageSwitcher().ensurePage(m_pCurrPage);
875 ::memcpy(pDest, currPos(), nToCopy);
882 nToCopy =
odmin(m_nPageDataSize, nLen);
883 ::memcpy(pDest, m_pCurrPage->
m_data, nToCopy);
888 if(m_nCurPos && (m_nCurPos % m_nPageDataSize)==0)
897template <
class TBase>
904 pageSwitcher().ensurePage(m_pCurrPage);
905 pageSwitcher().setModified(m_pCurrPage,
true);
906 OdUInt64 nPosInPage = posInCurPage();
907 m_pCurrPage->
m_data[nPosInPage] = val;
909 m_nEndPos =
odmax(m_nCurPos, m_nEndPos);
910 if ((nPosInPage + 1) == m_nPageDataSize)
916template <
class TBase>
927 pageSwitcher().ensurePage(m_pCurrPage);
928 pageSwitcher().setModified(m_pCurrPage,
true);
929 ::memcpy(currPos(), pSrc, nToCopy);
936 pageSwitcher().setModified(m_pCurrPage,
true);
937 nToCopy =
odmin(m_nPageDataSize, nLen);
938 ::memcpy(m_pCurrPage->
m_data, pSrc, nToCopy);
942 m_nCurPos += nToCopy;
943 if(m_nCurPos && (m_nCurPos % m_nPageDataSize)==0)
947 m_nEndPos =
odmax(m_nCurPos, m_nEndPos);
ALLOCDLL_EXPORT void * odrxAlloc(size_t nBytes)
ALLOCDLL_EXPORT void odrxFree(void *pMemBlock)
FIRSTDLL_EXPORT OdRxSystemServices * odrxSystemServices()
const T * asArrayPtr() const
void reserve(size_type reserveLength)
void resize(size_type logicalLength, const T &value)
static void unicodeToUtf8(const OdChar *srcBuf, int srcSize, OdAnsiCharArray &dstBuf)
static bool utf8ToUnicode(const char *srcBuf, int srcSize, OdCharArray &dstBuf)
virtual OdString getTempPath() const
OdUInt64 seek(OdInt64 offset, OdDb::FilerSeekType whence)
void reserve(OdUInt64 nSize)
void putByte(OdUInt8 val)
void putBytes(const void *buffer, OdUInt32 nLen)
void setPageDataSize(OdUInt32 nPageSize)
OdUInt32 leftInCurPage() const
OdUInt64 curPageNo() const
void getBytes(void *buffer, OdUInt32 nLen)
void seekNextPage(bool bCreateNew=false)
void setAppServices(OdDbBaseHostAppServices *pHostAppServices)
OdUInt64 allocated() const
OdUInt32 posInCurPage() const
OdMemFileStreamImpl(OdUInt32 nPageDataSize=0x00200000)
const OdUInt8 * currPos() const
PageSwitcher & pageSwitcher()
OdUInt32 pageDataSize() const
virtual OdStreamBufPtr createFile(const OdString &filename, Oda::FileAccessMode accessMode=Oda::kFileRead, Oda::FileShareMode shareMode=Oda::kShareDenyNo, Oda::FileCreationDisposition creationDisposition=Oda::kOpenExisting)
OdString & format(const OdChar *formatString,...)
const OdChar * c_str() const
FIRSTDLL_EXPORT_STATIC static const OdString kEmpty
OdUInt64 m_nPageStartAddr