mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 05:24:10 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62078 954022d7-b5bf-4e40-9824-e11837661b57
1847 lines
49 KiB
C++
1847 lines
49 KiB
C++
#include "Streams.h"
|
||
|
||
#include "../../../Common/DocxFormat/Source/SystemUtility/File.h"
|
||
|
||
unsigned long MemStreamInWrite (StreamRecPtr pStream, const BYTE **ppBuffer, unsigned int *pnCount)
|
||
{
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
unsigned int nRSize = pAttr->nBufSize - pAttr->nWPos;
|
||
|
||
if ( *pnCount <= 0 )
|
||
return OK;
|
||
|
||
if ( nRSize >= *pnCount )
|
||
{
|
||
UtilsMemCpy( pAttr->pWPtr, *ppBuffer, *pnCount);
|
||
pAttr->pWPtr += *pnCount;
|
||
pAttr->nWPos += *pnCount;
|
||
*pnCount = 0;
|
||
}
|
||
else
|
||
{
|
||
if (nRSize > 0)
|
||
{
|
||
UtilsMemCpy( pAttr->pWPtr, *ppBuffer, nRSize);
|
||
*ppBuffer += nRSize;
|
||
*pnCount -= nRSize;
|
||
}
|
||
|
||
pAttr->pWPtr = (BYTE*)GetMem(pStream->oMMgr, pAttr->nBufSize);
|
||
if (NULL == pAttr->pWPtr)
|
||
return ErrorGetCode(pStream->oError);
|
||
|
||
if (OK != ListAdd(pAttr->pBuf, pAttr->pWPtr))
|
||
{
|
||
FreeMem(pStream->oMMgr, pAttr->pWPtr);
|
||
pAttr->pWPtr = NULL;
|
||
|
||
return ErrorGetCode(pStream->oError);
|
||
}
|
||
|
||
pAttr->nWPos = 0;
|
||
}
|
||
return OK;
|
||
}
|
||
|
||
unsigned long MemStreamWriteFunc (StreamRecPtr pStream, const BYTE *pBuffer, unsigned int nSize)
|
||
{
|
||
unsigned int nWSize = nSize;
|
||
|
||
if ( ErrorGetCode( pStream->oError ) != 0 )
|
||
return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
|
||
while ( nWSize > 0 )
|
||
{
|
||
unsigned long nRet = MemStreamInWrite( pStream, &pBuffer, &nWSize );
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
unsigned long MemStreamSeekFunc (StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
if ( SeekCur == eMode )
|
||
{
|
||
nPos += (pAttr->nRPtrIndex * pAttr->nBufSize );
|
||
nPos += pAttr->nRPos;
|
||
}
|
||
else if ( SeekEnd == eMode )
|
||
nPos = pStream->nSize - nPos;
|
||
|
||
if ( nPos > pStream->nSize || 0 == pStream->nSize )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF, 0);
|
||
|
||
pAttr->nRPtrIndex = nPos / pAttr->nBufSize;
|
||
pAttr->nRPos = nPos % pAttr->nBufSize;
|
||
pAttr->pRPtr = (BYTE*)ListItemAt(pAttr->pBuf, pAttr->nRPtrIndex);
|
||
|
||
if (eMode == SeekWrite)
|
||
{
|
||
pAttr->nWPos = nPos % pAttr->nBufSize;
|
||
pAttr->pWPtr = (BYTE*)ListItemAt(pAttr->pBuf, pAttr->nRPtrIndex);
|
||
|
||
if (pAttr->nRPtrIndex < pAttr->pBuf->nCount)
|
||
{
|
||
int baseInd = pAttr->nRPtrIndex + 1;
|
||
for (int i = baseInd; i < (int)pAttr->pBuf->nCount; ++i)
|
||
{
|
||
ListRemoveByIndex(pAttr->pBuf, baseInd);
|
||
}
|
||
}
|
||
|
||
if (NULL == pAttr->pWPtr)
|
||
{
|
||
SetError(pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT, 0);
|
||
return AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT;
|
||
}
|
||
|
||
pAttr->pWPtr += pAttr->nRPos;
|
||
pStream->nSize = nPos;
|
||
}
|
||
|
||
if (NULL == pAttr->pRPtr)
|
||
{
|
||
SetError(pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT, 0);
|
||
return AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT;
|
||
}
|
||
else
|
||
{
|
||
pAttr->pRPtr += pAttr->nRPos;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
BYTE* MemStreamGetBufPtr (StreamRecPtr pStream, unsigned int nIndex, unsigned int *pnLength)
|
||
{
|
||
BYTE *pRet = NULL;
|
||
MemStreamAttrRecPtr pAttr;
|
||
|
||
if ( StreamMemory != pStream->eType )
|
||
{
|
||
SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT, 0);
|
||
return NULL;
|
||
}
|
||
|
||
pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
pRet = (BYTE *)ListItemAt( pAttr->pBuf, nIndex );
|
||
|
||
if ( NULL == pRet )
|
||
{
|
||
SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_PARAMETER, 0);
|
||
*pnLength = 0;
|
||
return NULL;
|
||
}
|
||
|
||
*pnLength = ( pAttr->pBuf->nCount - 1 == nIndex) ? pAttr->nWPos : pAttr->nBufSize;
|
||
return pRet;
|
||
}
|
||
|
||
unsigned long MemStreamReadFunc (StreamRecPtr pStream, BYTE *pBuffer, unsigned int *pnSize)
|
||
{
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
unsigned int nBufSize = 0;
|
||
unsigned int nRLen = *pnSize;
|
||
|
||
*pnSize = 0;
|
||
|
||
unsigned int offset = 0;
|
||
|
||
while (nRLen > 0)
|
||
{
|
||
unsigned int nTmpLen;
|
||
|
||
if ( 0 == pAttr->pBuf->nCount )
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
|
||
if ( pAttr->pBuf->nCount - 1 > pAttr->nRPtrIndex )
|
||
nTmpLen = pAttr->nBufSize - pAttr->nRPos;
|
||
else if ( pAttr->pBuf->nCount - 1 == pAttr->nRPtrIndex )
|
||
nTmpLen = pAttr->nWPos - pAttr->nRPos;
|
||
else
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
|
||
if ( !pAttr->pRPtr )
|
||
pAttr->pRPtr = (BYTE*)ListItemAt( pAttr->pBuf, pAttr->nRPtrIndex );
|
||
|
||
if (nTmpLen >= nRLen)
|
||
{
|
||
UtilsMemCpy (pBuffer + offset, pAttr->pRPtr, nRLen);
|
||
|
||
pAttr->nRPos += nRLen;
|
||
*pnSize += nRLen;
|
||
pAttr->pRPtr += nRLen;
|
||
|
||
return OK;
|
||
}
|
||
else
|
||
{
|
||
UtilsMemCpy (pBuffer + offset, pAttr->pRPtr, nTmpLen);
|
||
offset += nTmpLen;
|
||
|
||
nRLen -= nTmpLen;
|
||
*pnSize += nTmpLen;
|
||
|
||
if (pAttr->nRPtrIndex == pAttr->pBuf->nCount - 1)
|
||
{
|
||
pAttr->pRPtr += nTmpLen;
|
||
pAttr->nRPos += nTmpLen;
|
||
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
|
||
pAttr->nRPtrIndex++;
|
||
pAttr->nRPos = 0;
|
||
pAttr->pRPtr = MemStreamGetBufPtr(pStream, pAttr->nRPtrIndex, &nBufSize);
|
||
}
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
int MemStreamTellFunc (StreamRecPtr pStream)
|
||
{
|
||
int nRet = 0;
|
||
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
nRet = pAttr->nRPtrIndex * pAttr->nBufSize;
|
||
nRet += pAttr->nRPos;
|
||
|
||
return nRet;
|
||
}
|
||
|
||
|
||
unsigned int MemStreamSizeFunc (StreamRecPtr pStream)
|
||
{
|
||
return pStream->nSize;
|
||
}
|
||
|
||
|
||
void MemStreamFreeData (StreamRecPtr pStream)
|
||
{
|
||
if ( !pStream || StreamMemory != pStream->eType )
|
||
return;
|
||
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
for (unsigned int nIndex = 0; nIndex < pAttr->pBuf->nCount; nIndex++)
|
||
FreeMem( pStream->oMMgr, ListItemAt( pAttr->pBuf, nIndex ) );
|
||
|
||
ListClear( pAttr->pBuf );
|
||
|
||
pStream->nSize = 0;
|
||
pAttr->nWPos = pAttr->nBufSize;
|
||
pAttr->pWPtr = NULL;
|
||
pAttr->nRPtrIndex = 0;
|
||
pAttr->nRPos = 0;
|
||
}
|
||
void MemStreamFreeFunc (StreamRecPtr pStream)
|
||
{
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
MemStreamFreeData(pStream);
|
||
ListFree( pAttr->pBuf );
|
||
FreeMem ( pStream->oMMgr, pAttr);
|
||
pStream->pAttr = NULL;
|
||
}
|
||
|
||
/*
|
||
* FileReaderReadFunc
|
||
*
|
||
* Reading data function for FileReader.
|
||
*
|
||
*/
|
||
unsigned long FileReaderReadFunc (StreamRecPtr pStream, BYTE *pBuffer, unsigned int *pnSize)
|
||
{
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
unsigned int nRSize = 0;
|
||
|
||
UtilsMemSet( pBuffer, 0, *pnSize );
|
||
|
||
nRSize = pFile->ReadFile( pBuffer, *pnSize);
|
||
|
||
if ( nRSize != *pnSize )
|
||
{
|
||
if (pFile->GetPosition() >= pFile->GetFileSize())
|
||
{
|
||
|
||
*pnSize = nRSize;
|
||
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
|
||
return SetError (pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
* FileReaderSeekFunc
|
||
*
|
||
* Seeking data function for FileReader.
|
||
*
|
||
* pStream : Указатель на объект StreamRecPtr.
|
||
* nPos : Новая позиция потока.
|
||
* eWhenceMode : Seeking mode
|
||
* SeekSet : По отношению к началу файла
|
||
* SeekCur : По отношению к текующей позиции в файле
|
||
* SeekEnd : По отношению к концу файла
|
||
*
|
||
* В случае успеха возвращает OK.
|
||
* В противном случае, возвращает AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR и Error_GetCode2()
|
||
*
|
||
*/
|
||
unsigned long FileReaderSeekFunc (StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
switch ( eMode )
|
||
{
|
||
case SeekCur:
|
||
nPos += pFile->GetPosition();
|
||
break;
|
||
case SeekEnd:
|
||
nPos = pFile->GetFileSize() - nPos;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
if ( 0 != pFile->SetPosition( nPos))
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
|
||
|
||
int FileStreamTellFunc (StreamRecPtr pStream)
|
||
{
|
||
int nRet = 0;
|
||
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
if ( ( nRet = pFile->GetPosition() ) < 0 )
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0);
|
||
}
|
||
|
||
return nRet;
|
||
}
|
||
|
||
|
||
unsigned int FileStreamSizeFunc (StreamRecPtr pStream)
|
||
{
|
||
int nSize = 0;
|
||
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
if ( ( nSize = pFile->GetFileSize() ) < 0 )
|
||
{
|
||
SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
return 0;
|
||
}
|
||
|
||
|
||
return (unsigned int)nSize;
|
||
}
|
||
|
||
|
||
unsigned long FileWriterWriteFunc (StreamRecPtr pStream, const BYTE *pBuffer, unsigned int nSize )
|
||
{
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
unsigned int nRet = pFile->WriteFile( (void*) pBuffer, nSize);
|
||
|
||
if ( nRet != S_OK)
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
}
|
||
return OK;
|
||
}
|
||
|
||
void FileStreamFreeFunc (StreamRecPtr pStream)
|
||
{
|
||
CFile* pFile = (CFile*)pStream->pAttr;
|
||
|
||
if ( pFile )
|
||
{
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
}
|
||
|
||
pStream->pAttr = NULL;
|
||
}
|
||
|
||
|
||
|
||
|
||
unsigned long TempFileStreamWriteFunc(StreamRecPtr pStream, const BYTE *pBuffer, unsigned int nSize )
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->CreateFile(pAttr->wsFilePath) != S_OK)//OpenOrCreate ??
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno );
|
||
}
|
||
|
||
// Смещаемся к текущей позиции для записи
|
||
pFile->SetPosition(pAttr->nWriterPos);
|
||
|
||
unsigned int nRet = pFile->WriteFile( (void*)pBuffer, nSize );
|
||
|
||
if ( nRet != nSize)
|
||
{
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
int nErrorNo = SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
return nErrorNo;
|
||
}
|
||
|
||
// Запоминаем новую текущую позицию для записи
|
||
pAttr->nWriterPos = pFile->GetPosition();
|
||
pAttr->nCurPos = pAttr->nWriterPos;
|
||
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
|
||
return OK;
|
||
}
|
||
unsigned long TempFileStreamReadFunc(StreamRecPtr pStream, BYTE *pBuffer, unsigned int *pnSize)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFile(pAttr->wsFilePath) != S_OK)
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno );
|
||
}
|
||
|
||
// Смещаемся к текущей позиции для чтения
|
||
pFile->SetPosition(pAttr->nReaderPos );
|
||
|
||
HRESULT hRes = 0;
|
||
|
||
UtilsMemSet( pBuffer, 0, *pnSize );
|
||
|
||
hRes = pFile->ReadFile( pBuffer,*pnSize);
|
||
|
||
*pnSize = pFile->GetPosition() - pAttr->nReaderPos;
|
||
|
||
if ( hRes != S_OK || (*pnSize) == 0)
|
||
{
|
||
if ( pFile->GetPosition() >= pFile->GetFileSize())
|
||
{
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
return SetError (pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, errno );
|
||
}
|
||
|
||
// Запоминаем новую текущую позицию для чтения
|
||
pAttr->nReaderPos = pFile->GetPosition();
|
||
pAttr->nCurPos = pAttr->nReaderPos;
|
||
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
|
||
return OK;
|
||
|
||
}
|
||
unsigned long TempFileStreamSeekFunc(StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
// Этой функцией лучше не пользоваться (лучше отдельно использовать TempFileStreamReaderSeek и TempFileStreamWriterSeek)
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
|
||
if ( SeekSet == eMode )
|
||
{
|
||
if ( pAttr->nCurPos == pAttr->nReaderPos )
|
||
pAttr->nReaderPos = nPos;
|
||
else if ( pAttr->nCurPos == pAttr->nWriterPos )
|
||
pAttr->nWriterPos = nPos;
|
||
|
||
pAttr->nCurPos = nPos;
|
||
}
|
||
else if ( SeekEnd == eMode )
|
||
{
|
||
unsigned int nSize = pStream->pSizeFn( pStream );
|
||
int nSetPos = nSize - nPos;
|
||
|
||
if ( pAttr->nCurPos == pAttr->nReaderPos )
|
||
pAttr->nReaderPos = nSetPos;
|
||
else if ( pAttr->nCurPos == pAttr->nWriterPos )
|
||
pAttr->nWriterPos = nSetPos;
|
||
|
||
pAttr->nCurPos = nSetPos;
|
||
}
|
||
else if ( SeekCur == eMode )
|
||
{
|
||
if ( pAttr->nCurPos == pAttr->nReaderPos )
|
||
pAttr->nReaderPos += nPos;
|
||
else if ( pAttr->nCurPos == pAttr->nWriterPos )
|
||
pAttr->nWriterPos += nPos;
|
||
|
||
pAttr->nCurPos += nPos;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
|
||
|
||
int TempFileStreamTellFunc(StreamRecPtr pStream)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
return pAttr->nCurPos;
|
||
}
|
||
|
||
|
||
unsigned int TempFileStreamSizeFunc(StreamRecPtr pStream)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFile(pAttr->wsFilePath) != S_OK)
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno );
|
||
}
|
||
|
||
int nSize = 0;
|
||
if ( (nSize = pFile->GetFileSize() ) < 0 )
|
||
{
|
||
delete pFile;
|
||
SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, 0 );
|
||
return 0;
|
||
}
|
||
|
||
delete pFile;
|
||
return (unsigned int)nSize;
|
||
}
|
||
|
||
|
||
void TempFileStreamFreeFunc(StreamRecPtr pStream)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
//::_wunlink( pAttr->wsFilePath );
|
||
|
||
FreeMem( pStream->oMMgr, pAttr );
|
||
pStream->pAttr = NULL;
|
||
}
|
||
unsigned long TempFileStreamReaderSeek(StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFile(pAttr->wsFilePath) != S_OK)
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno );
|
||
}
|
||
|
||
if ( 0 != pFile->SetPosition( pAttr->nReaderPos ) )
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, errno );
|
||
}
|
||
|
||
switch ( eMode )
|
||
{
|
||
case SeekCur:
|
||
nPos += pFile->GetPosition();
|
||
break;
|
||
case SeekEnd:
|
||
nPos = pFile->GetFileSize() - nPos;
|
||
break;
|
||
}
|
||
|
||
if ( S_OK != pFile->SetPosition( nPos ) )
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, errno );
|
||
}
|
||
|
||
int nCurPos = pFile->GetPosition();
|
||
|
||
pAttr->nReaderPos = nCurPos;
|
||
pAttr->nCurPos = nCurPos;
|
||
|
||
delete pFile;
|
||
return OK;
|
||
}
|
||
unsigned long TempFileStreamWriterSeek(StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFileRW(pAttr->wsFilePath) != S_OK)
|
||
{
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno );
|
||
}
|
||
|
||
if ( S_OK != pFile->SetPosition(pAttr->nWriterPos ) )
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, errno );
|
||
}
|
||
|
||
switch ( eMode )
|
||
{
|
||
case SeekCur:
|
||
nPos += pFile->GetPosition();
|
||
break;
|
||
case SeekEnd:
|
||
nPos = pFile->GetFileSize() - nPos;
|
||
break;
|
||
}
|
||
|
||
if ( 0 != pFile->SetPosition(nPos ) )
|
||
{
|
||
delete pFile;
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_IO_ERROR, errno );
|
||
}
|
||
|
||
int nCurPos = pFile->GetPosition();
|
||
|
||
pAttr->nWriterPos = nCurPos;
|
||
pAttr->nCurPos = nCurPos;
|
||
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
return S_OK;
|
||
}
|
||
// main functions
|
||
|
||
StreamRecPtr MemStreamNew (MMgr oMMgr, unsigned int nBufSize)
|
||
{
|
||
StreamRecPtr pStream;
|
||
|
||
// Создаем новый объект StreamRecPtr
|
||
pStream = (StreamRecPtr)GetMem( oMMgr, sizeof( StreamRec) );
|
||
|
||
if ( pStream )
|
||
{
|
||
// Создаем струкутуру атрибутов
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)GetMem( oMMgr, sizeof(MemStreamAttrRec) );
|
||
|
||
if ( !pAttr )
|
||
{
|
||
FreeMem( oMMgr, pStream);
|
||
return NULL;
|
||
}
|
||
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
UtilsMemSet( pAttr, 0, sizeof(MemStreamAttrRec) );
|
||
|
||
pAttr->pBuf = ListNew( oMMgr, DEF_ITEMS_PER_BLOCK );
|
||
|
||
if ( !pAttr->pBuf )
|
||
{
|
||
FreeMem( oMMgr, pStream );
|
||
FreeMem( oMMgr, pAttr );
|
||
return NULL;
|
||
}
|
||
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->eType = StreamMemory;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pAttr = pAttr;
|
||
pAttr->nBufSize = (nBufSize > 0) ? nBufSize : STREAM_BUF_SIZ;
|
||
pAttr->nWPos = pAttr->nBufSize;
|
||
|
||
pStream->pWriteFn = MemStreamWriteFunc;
|
||
pStream->pReadFn = (StreamReadFunc)MemStreamReadFunc;
|
||
pStream->pSeekFn = MemStreamSeekFunc;
|
||
pStream->pTellFn = MemStreamTellFunc;
|
||
pStream->pSizeFn = MemStreamSizeFunc;
|
||
pStream->pFreeFn = MemStreamFreeFunc;
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
|
||
unsigned int MemStreamGetBufSize (StreamRecPtr pStream)
|
||
{
|
||
if ( !pStream || StreamMemory != pStream->eType )
|
||
return 0;
|
||
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
return pAttr->nBufSize;
|
||
}
|
||
|
||
unsigned int MemStreamGetBufCount (StreamRecPtr pStream)
|
||
{
|
||
if ( !pStream || StreamMemory != pStream->eType )
|
||
return 0;
|
||
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
|
||
return pAttr->pBuf->nCount;
|
||
}
|
||
|
||
|
||
unsigned long MemStreamRewrite (StreamRecPtr pStream, BYTE *pBuf, unsigned int nSize)
|
||
{
|
||
MemStreamAttrRecPtr pAttr = (MemStreamAttrRecPtr)pStream->pAttr;
|
||
unsigned int nBufSize = 0;
|
||
unsigned int nRLen = nSize;
|
||
|
||
while ( nRLen > 0 )
|
||
{
|
||
unsigned int nTmpLen = 0;
|
||
|
||
if ( pAttr->pBuf->nCount <= pAttr->nRPtrIndex )
|
||
{
|
||
unsigned long nRet = MemStreamWriteFunc( pStream, pBuf, nRLen );
|
||
pAttr->nRPtrIndex = pAttr->pBuf->nCount;
|
||
pAttr->nRPos = pAttr->nWPos;
|
||
pAttr->pRPtr = pAttr->pWPtr;
|
||
return nRet;
|
||
}
|
||
else if ( pAttr->pBuf->nCount == pAttr->nRPtrIndex )
|
||
nTmpLen = pAttr->nWPos - pAttr->nRPos;
|
||
else
|
||
nTmpLen = pAttr->nBufSize - pAttr->nRPos;
|
||
|
||
if ( nTmpLen >= nRLen )
|
||
{
|
||
UtilsMemCpy( pAttr->pRPtr, pBuf, nRLen );
|
||
pAttr->nRPos += nRLen;
|
||
pAttr->pRPtr += nRLen;
|
||
return OK;
|
||
}
|
||
else
|
||
{
|
||
UtilsMemCpy( pAttr->pRPtr, pBuf, nTmpLen );
|
||
pBuf += nTmpLen;
|
||
nRLen -= nTmpLen;
|
||
pAttr->nRPtrIndex++;
|
||
|
||
if ( pAttr->pBuf->nCount > pAttr->nRPtrIndex )
|
||
{
|
||
pAttr->nRPos = 0;
|
||
pAttr->pRPtr = MemStreamGetBufPtr( pStream, pAttr->nRPtrIndex, &nBufSize );
|
||
}
|
||
}
|
||
}
|
||
return OK;
|
||
}
|
||
|
||
unsigned int StreamSize (StreamRecPtr pStream)
|
||
{
|
||
if ( pStream->pWriteFn )
|
||
return pStream->nSize;
|
||
|
||
if ( !( pStream->pSizeFn ) )
|
||
{
|
||
SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0);
|
||
return 0;
|
||
}
|
||
|
||
if ( 0 != ErrorGetCode(pStream->oError) )
|
||
return 0;
|
||
|
||
return pStream->pSizeFn( pStream );
|
||
}
|
||
|
||
unsigned long StreamSeek (StreamRecPtr pStream, int nPos, WhenceMode eMode)
|
||
{
|
||
if ( !( pStream->pSeekFn ) )
|
||
return SetError ( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0);
|
||
|
||
if ( 0 != ErrorGetCode( pStream->oError ) )
|
||
return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
|
||
return pStream->pSeekFn( pStream, nPos, eMode);
|
||
}
|
||
|
||
|
||
/*
|
||
* StreamRead
|
||
*
|
||
* pStream : Указатель на объект StreamRecPtr.
|
||
* pBuffer : Указатель на буфер данных.
|
||
* pnSize : Указатель на переменную, которая хранит размер буфера.
|
||
*
|
||
* Возращает OK в случае успеха. В противном случае, возвращает код
|
||
* ошибки, который возвращает функция чтения данного потока.
|
||
*
|
||
*/
|
||
unsigned long StreamRead (StreamRecPtr pStream, BYTE *pBuffer, unsigned int *pnSize)
|
||
{
|
||
if ( !( pStream->pReadFn ) )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0);
|
||
|
||
//
|
||
//if ( ErrorGetCode( pStream->oError) != NOERROR )
|
||
// return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
//
|
||
|
||
return pStream->pReadFn( pStream, pBuffer, pnSize );
|
||
}
|
||
|
||
|
||
/*
|
||
* StreamReadLn
|
||
*
|
||
* pStream : Указатель на объект StreamRecPtr.
|
||
* sBuffer : Указатель на буфер данных.
|
||
* pnSize : Указатель на переменную, которая хранит размер буфера.
|
||
*
|
||
* Читаем из потока, до тех пор пока либо буфер не закончится, либо
|
||
* не наткнемся на перенос строки.
|
||
*
|
||
*/
|
||
unsigned long StreamReadLn (StreamRecPtr pStream, char *sBuffer, unsigned int *nSize)
|
||
{
|
||
char sBuf[STREAM_BUF_SIZ];
|
||
|
||
unsigned int nRSize = *nSize;
|
||
unsigned int nReadSize = STREAM_BUF_SIZ;
|
||
|
||
if ( !pStream || !sBuffer || 0 == *nSize )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_PARAMETER, 0 );
|
||
|
||
if ( !( pStream->pSeekFn ) || !( pStream->pReadFn ) )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0 );
|
||
|
||
if ( nRSize < STREAM_BUF_SIZ )
|
||
nReadSize = nRSize;
|
||
|
||
*nSize = 0;
|
||
|
||
while ( nRSize > 1 )
|
||
{
|
||
char *pBuf = sBuf;
|
||
|
||
unsigned long nRet = StreamRead( pStream, (BYTE*)sBuf, &nReadSize );
|
||
|
||
if ( OK != nRet && 0 == nReadSize )
|
||
return nRet;
|
||
|
||
nRSize -= nReadSize;
|
||
|
||
while (nReadSize > 0)
|
||
{
|
||
if ( *pBuf == 0x0A || *pBuf == 0x0D )
|
||
{
|
||
*sBuffer = 0;
|
||
nReadSize--;
|
||
|
||
// отлавливаем переносы строк
|
||
if (*pBuf == 0x0D || nReadSize > 1)
|
||
{
|
||
pBuf++;
|
||
|
||
if (*pBuf == 0x0A)
|
||
nReadSize--;
|
||
}
|
||
|
||
if (nReadSize > 0)
|
||
return StreamSeek( pStream, 0 - nReadSize, SeekCur);
|
||
else
|
||
return OK;
|
||
}
|
||
|
||
*sBuffer++ = *pBuf++;
|
||
nReadSize--;
|
||
(*nSize)++;
|
||
}
|
||
|
||
if (nRSize < STREAM_BUF_SIZ)
|
||
nReadSize = nRSize;
|
||
else
|
||
nReadSize = STREAM_BUF_SIZ;
|
||
|
||
if (nRet == AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF)
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
|
||
*sBuffer = 0;
|
||
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_READLN_CONTINUE;
|
||
}
|
||
|
||
|
||
unsigned long StreamReadULong (StreamRecPtr pStream, unsigned int *pnValue)
|
||
{
|
||
unsigned long nRet = OK;
|
||
|
||
int nChar0 = 0, nChar1 = 0, nChar2 = 0, nChar3 = 0;
|
||
unsigned int unReadLen = 1;
|
||
|
||
if ( OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar0, &unReadLen ) ) || OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar1, &unReadLen ) ) ||
|
||
OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar2, &unReadLen ) ) || OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar3, &unReadLen ) ) )
|
||
{
|
||
return nRet;
|
||
}
|
||
|
||
if ( nChar0 == EOF || nChar1 == EOF || nChar2 == EOF || nChar3 == EOF )
|
||
{
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
*pnValue = (unsigned int)((nChar0 << 24) | (nChar1 << 16) | (nChar2 << 8) | nChar3);
|
||
|
||
return OK;
|
||
}
|
||
unsigned long StreamReadUByte (StreamRecPtr pStream, unsigned int *pnValue)
|
||
{
|
||
unsigned long nRet = OK;
|
||
unsigned int nReadLen = 1;
|
||
int nChar0 = 0;
|
||
|
||
if ( OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar0, &nReadLen ) ) )
|
||
{
|
||
return nRet;
|
||
}
|
||
|
||
if ( nChar0 == EOF )
|
||
{
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
*pnValue = (unsigned int)nChar0;
|
||
return OK;
|
||
}
|
||
unsigned long StreamReadByte (StreamRecPtr pStream, int *pnValue)
|
||
{
|
||
unsigned long nRet = OK;
|
||
unsigned int nReadLen = 1;
|
||
|
||
int nChar = 0;
|
||
|
||
if ( OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar, &nReadLen ) ) )
|
||
{
|
||
return nRet;
|
||
}
|
||
|
||
if ( nChar == EOF )
|
||
{
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
|
||
*pnValue = nChar;
|
||
if ( nChar & 0x80 )
|
||
{
|
||
*pnValue |= -1 - 0xff;
|
||
}
|
||
return OK;
|
||
}
|
||
unsigned long StreamReadUShort (StreamRecPtr pStream, unsigned int *pnValue)
|
||
{
|
||
unsigned long nRet = OK;
|
||
unsigned int nReadLen = 1;
|
||
int nChar0 = 0, nChar1 = 0;
|
||
|
||
if ( OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar0, &nReadLen ) ) || OK != ( nRet = StreamRead( pStream, (BYTE *)&nChar1, &nReadLen ) ) )
|
||
{
|
||
return nRet;
|
||
}
|
||
|
||
if ( nChar0 == EOF || nChar1 == EOF )
|
||
{
|
||
return AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF;
|
||
}
|
||
*pnValue = (unsigned int)((nChar0 << 8) | nChar1);
|
||
return OK;
|
||
}
|
||
|
||
|
||
/*
|
||
* StreamWrite
|
||
*
|
||
* pStream : Указатель на объект StreamRecPtr.
|
||
* pBuffer : Указатель на буфер для записи.
|
||
* nSize : Размер буфера для записи.
|
||
*
|
||
* Возращает OK в случае успеха. В противном случае, возвращает код
|
||
* ошибки, который возвращает функция записи данного потока.
|
||
*
|
||
*/
|
||
unsigned long StreamWrite (StreamRecPtr pStream, const BYTE *pBuffer, unsigned int nSize, bool bCalcCheckSum/* = false*/)
|
||
{
|
||
unsigned long nRet = 0;
|
||
|
||
if ( !( pStream->pWriteFn ) )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0);
|
||
|
||
//if ( NOERROR != ErrorGetCode( pStream->oError ) )
|
||
// return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
|
||
nRet = pStream->pWriteFn( pStream, pBuffer, nSize );
|
||
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
|
||
pStream->nSize += nSize;
|
||
|
||
if ( bCalcCheckSum )
|
||
{
|
||
CRC32 oCRC;
|
||
oCRC.ProcessCRC( (void*)pBuffer, nSize );
|
||
pStream->nCheckSum = oCRC.m_nCRC32;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
|
||
unsigned long StreamWriteToStreamWithDeflate( StreamRecPtr pSrc, StreamRecPtr pDst, EncryptRecPtr pEncrypt)
|
||
{
|
||
#ifndef NOZLIB
|
||
|
||
#define DEFLATE_BUF_SIZ ((int)(STREAM_BUF_SIZ * 1.1) + 13)
|
||
|
||
unsigned long nRet = OK;
|
||
bool bFlag = false;
|
||
|
||
z_stream pZStream;
|
||
Bytef inbuf[STREAM_BUF_SIZ];
|
||
Bytef otbuf[DEFLATE_BUF_SIZ];
|
||
BYTE ebuf[DEFLATE_BUF_SIZ];
|
||
|
||
/* initialize input stream */
|
||
nRet = StreamSeek (pSrc, 0, SeekSet);
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
|
||
/* initialize decompression stream. */
|
||
UtilsMemSet( &pZStream, 0x00, sizeof(z_stream) );
|
||
pZStream.next_out = otbuf;
|
||
pZStream.avail_out = DEFLATE_BUF_SIZ;
|
||
|
||
nRet = deflateInit_(&pZStream, Z_DEFAULT_COMPRESSION, ZLIB_VERSION, sizeof(z_stream) );
|
||
if ( Z_OK != nRet )
|
||
return SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_ZLIB_ERROR, nRet );
|
||
|
||
pZStream.next_in = inbuf;
|
||
pZStream.avail_in = 0;
|
||
|
||
for (;;)
|
||
{
|
||
unsigned int nSize = STREAM_BUF_SIZ;
|
||
|
||
nRet = StreamRead( pSrc, inbuf, &nSize);
|
||
|
||
pZStream.next_in = inbuf;
|
||
pZStream.avail_in = nSize;
|
||
|
||
if ( OK != nRet )
|
||
{
|
||
if ( AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF == nRet )
|
||
{
|
||
bFlag = true;
|
||
if ( 0 == nSize )
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
deflateEnd(&pZStream);
|
||
return nRet;
|
||
}
|
||
}
|
||
|
||
while ( pZStream.avail_in > 0 )
|
||
{
|
||
nRet = deflate(&pZStream, Z_NO_FLUSH);
|
||
if ( Z_OK != nRet && Z_STREAM_END != nRet )
|
||
{
|
||
deflateEnd(&pZStream);
|
||
return SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_ZLIB_ERROR, nRet );
|
||
}
|
||
|
||
if (pZStream.avail_out == 0)
|
||
{
|
||
if ( pEncrypt )
|
||
{
|
||
EncryptCryptBuf( pEncrypt, otbuf, ebuf, DEFLATE_BUF_SIZ);
|
||
nRet = StreamWrite( pDst, ebuf, DEFLATE_BUF_SIZ);
|
||
}
|
||
else
|
||
nRet = StreamWrite( pDst, otbuf, DEFLATE_BUF_SIZ);
|
||
if ( OK != nRet )
|
||
{
|
||
deflateEnd(&pZStream);
|
||
return SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_ZLIB_ERROR, nRet );
|
||
}
|
||
|
||
pZStream.next_out = otbuf;
|
||
pZStream.avail_out = DEFLATE_BUF_SIZ;
|
||
}
|
||
}
|
||
|
||
if ( bFlag )
|
||
break;
|
||
}
|
||
|
||
bFlag = false;
|
||
for (;;)
|
||
{
|
||
nRet = deflate(&pZStream, Z_FINISH );
|
||
if ( Z_OK != nRet && Z_STREAM_END != nRet )
|
||
{
|
||
deflateEnd(&pZStream);
|
||
return SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_ZLIB_ERROR, nRet);
|
||
}
|
||
|
||
if ( Z_STREAM_END == nRet )
|
||
bFlag = true;
|
||
|
||
if ( pZStream.avail_out < DEFLATE_BUF_SIZ )
|
||
{
|
||
unsigned int osize = DEFLATE_BUF_SIZ - pZStream.avail_out;
|
||
if ( pEncrypt )
|
||
{
|
||
EncryptCryptBuf( pEncrypt, otbuf, ebuf, osize);
|
||
nRet = StreamWrite( pDst, ebuf, osize);
|
||
}
|
||
else
|
||
nRet = StreamWrite( pDst, otbuf, osize);
|
||
if ( OK != nRet )
|
||
{
|
||
deflateEnd(&pZStream);
|
||
return SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_ZLIB_ERROR, nRet );
|
||
}
|
||
|
||
pZStream.next_out = otbuf;
|
||
pZStream.avail_out = DEFLATE_BUF_SIZ;
|
||
}
|
||
|
||
if ( bFlag )
|
||
break;
|
||
}
|
||
|
||
deflateEnd(&pZStream);
|
||
return OK;
|
||
#else /* NOZLIB */
|
||
return AVS_OFFICEPDFWRITER_ERROR_UNSUPPORTED_FUNC;
|
||
#endif /* NOZLIB */
|
||
}
|
||
|
||
|
||
unsigned long StreamWriteToStream (StreamRecPtr pSrc, StreamRecPtr pDst, unsigned int nFilter, EncryptRecPtr pEncrypt)
|
||
{
|
||
if ( 0 == StreamSize( pSrc ) )
|
||
return OK;
|
||
|
||
unsigned long nRet = 0;
|
||
|
||
BYTE pBuf[STREAM_BUF_SIZ];
|
||
BYTE pEBuf[STREAM_BUF_SIZ];
|
||
|
||
bool bFlag = false;
|
||
|
||
if ( !pDst || ! ( pDst->pWriteFn ) )
|
||
{
|
||
SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT, 0);
|
||
return AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT;
|
||
}
|
||
|
||
if ( NOERROR != ErrorGetCode( pSrc->oError ) || NOERROR != ErrorGetCode( pDst->oError ) )
|
||
return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
|
||
//#ifdef FILTER_FLATE_DECODE_ENABLED
|
||
|
||
if ( nFilter & STREAM_FILTER_FLATE_DECODE)
|
||
return StreamWriteToStreamWithDeflate( pSrc, pDst, pEncrypt);
|
||
//#endif
|
||
|
||
// инициализируем входящий поток
|
||
|
||
nRet = StreamSeek( pSrc, 0, SeekSet );
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
|
||
bFlag = false;
|
||
for (;;)
|
||
{
|
||
unsigned int nSize = STREAM_BUF_SIZ;
|
||
|
||
nRet = StreamRead( pSrc, pBuf, &nSize );
|
||
|
||
if ( OK != nRet )
|
||
{
|
||
if ( AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF == nRet )
|
||
{
|
||
bFlag = true;
|
||
if ( 0 == nSize )
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
return nRet;
|
||
}
|
||
}
|
||
|
||
if ( pEncrypt )
|
||
{
|
||
EncryptCryptBuf( pEncrypt, pBuf, pEBuf, nSize);
|
||
nRet = StreamWrite( pDst, pEBuf, nSize);
|
||
}
|
||
else
|
||
{
|
||
nRet = StreamWrite( pDst, pBuf, nSize);
|
||
}
|
||
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
|
||
if ( bFlag )
|
||
break;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
//unsigned long StreamWriteToStream (StreamRecPtr pSrc, StreamRecPtr pDst, unsigned int nFilter/*, EncryptRecPtr e*/)
|
||
//{
|
||
// unsigned long nRet = 0;
|
||
//
|
||
// BYTE pBuf[STREAM_BUF_SIZ];
|
||
// BYTE pEBuf[STREAM_BUF_SIZ];
|
||
//
|
||
// bool bFlag = false;
|
||
//
|
||
// if ( !pDst || ! ( pDst->pWriteFn ) )
|
||
// {
|
||
// SetError( pSrc->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT, 0);
|
||
// return AVS_OFFICEPDFWRITER_ERROR_INVALID_OBJECT;
|
||
// }
|
||
//
|
||
// if ( NOERROR != ErrorGetCode( pSrc->oError ) || NOERROR != ErrorGetCode( pDst->oError ) )
|
||
// return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
//
|
||
// // инициализируем входящий поток
|
||
//
|
||
// if ( 0 == StreamSize( pSrc ) )
|
||
// return OK;
|
||
//
|
||
// nRet = StreamSeek( pSrc, 0, SeekSet );
|
||
// if ( OK != nRet )
|
||
// return nRet;
|
||
//
|
||
// bFlag = false;
|
||
// for (;;)
|
||
// {
|
||
// unsigned int nSize = STREAM_BUF_SIZ;
|
||
//
|
||
// nRet = StreamRead( pSrc, pBuf, &nSize );
|
||
//
|
||
// if ( OK != nRet )
|
||
// {
|
||
// if ( AVS_OFFICEPDFWRITER_ERROR_STREAM_EOF == nRet )
|
||
// {
|
||
// bFlag = true;
|
||
// if ( 0 == nSize )
|
||
// break;
|
||
// }
|
||
// else
|
||
// {
|
||
// return nRet;
|
||
// }
|
||
// }
|
||
//
|
||
// // if ( e )
|
||
// //{
|
||
// // EncryptCryptBuf (e, pBuf, pEBuf, nSize);
|
||
// // nRet = StreamWrite( pDst, pEBuf, nSize);
|
||
// // }
|
||
// //else
|
||
// //{
|
||
// nRet = StreamWrite( pDst, pBuf, nSize);
|
||
// //}
|
||
//
|
||
// if ( OK != nRet )
|
||
// return nRet;
|
||
//
|
||
// if ( bFlag )
|
||
// break;
|
||
// }
|
||
//
|
||
// return OK;
|
||
//}
|
||
//
|
||
StreamRecPtr FileReaderNew (MMgr oMMgr, std::wstring & wsFileName)
|
||
{
|
||
StreamRecPtr pStream;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFile(std_string2string(wsFileName)) != S_OK)
|
||
{
|
||
delete pFile;
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
|
||
pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec) );
|
||
|
||
if ( pStream )
|
||
{
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->eType = StreamFile;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pReadFn = FileReaderReadFunc;
|
||
pStream->pSeekFn = FileReaderSeekFunc;
|
||
pStream->pTellFn = FileStreamTellFunc;
|
||
pStream->pSizeFn = FileStreamSizeFunc;
|
||
pStream->pFreeFn = FileStreamFreeFunc;
|
||
pStream->pAttr = pFile;
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
|
||
StreamRecPtr FileWriterNew (MMgr oMMgr, std::wstring & wsFileName, bool create_always)
|
||
{
|
||
StreamRecPtr pStream;
|
||
|
||
CFile *pFile = new CFile();
|
||
|
||
if (create_always == false)
|
||
{
|
||
if (pFile->OpenOrCreate(std_string2string(wsFileName)) != S_OK)
|
||
{
|
||
delete pFile;
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_WRITE_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (pFile->CreateFile(std_string2string(wsFileName)) != S_OK)
|
||
{
|
||
delete pFile;
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_WRITE_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec ) );
|
||
|
||
if (pStream)
|
||
{
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
|
||
pStream->pReadFn = FileReaderReadFunc;
|
||
pStream->pWriteFn = FileWriterWriteFunc;
|
||
pStream->pFreeFn = FileStreamFreeFunc;
|
||
pStream->pTellFn = FileStreamTellFunc;
|
||
pStream->pAttr = pFile;
|
||
pStream->eType = StreamFile;
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
|
||
StreamRecPtr TempFileStreamNew (MMgr oMMgr, std::wstring wsTempFilePath, unsigned int unCheckSum /*= 0*/)
|
||
{
|
||
if ( wsTempFilePath.length() < 1 )
|
||
{
|
||
CString wsTempFile;
|
||
if ( 0 == DocGetTempFile( oMMgr->pDoc, &wsTempFile ) )
|
||
{
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_WRITE_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
|
||
// Создаем временный файл (он создается с типом "wb+" как нам и надо)
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenOrCreate(wsTempFile) != S_OK)
|
||
{
|
||
delete pFile;
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_WRITE_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
// Закрываем файл, мы будем хранить путь к файлу, а не указатель на структуру pFile
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
|
||
StreamRecPtr pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec ) );
|
||
if ( pStream )
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)GetMem( oMMgr, sizeof( TempFileStreamAttrRec ) );
|
||
if ( !pAttr )
|
||
{
|
||
FreeMem( oMMgr, pStream );
|
||
return NULL;
|
||
}
|
||
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
UtilsMemSet( pAttr, 0, sizeof(TempFileStreamAttrRec) );
|
||
|
||
pAttr->nCurPos = 0;
|
||
pAttr->nReaderPos = 0;
|
||
pAttr->nWriterPos = 0;
|
||
memcpy(pAttr->wsFilePath, wsTempFile.GetBuffer(), wsTempFile.GetLength() * sizeof(wchar_t));
|
||
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->eType = StreamTempFile;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pAttr = pAttr;
|
||
|
||
pStream->pWriteFn = TempFileStreamWriteFunc;
|
||
pStream->pReadFn = TempFileStreamReadFunc;
|
||
pStream->pSeekFn = TempFileStreamSeekFunc;
|
||
pStream->pTellFn = TempFileStreamTellFunc;
|
||
pStream->pSizeFn = TempFileStreamSizeFunc;
|
||
pStream->pFreeFn = TempFileStreamFreeFunc;
|
||
}
|
||
else
|
||
{
|
||
// ::_wunlink( wsTempFile.GetBuffer() );
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
else
|
||
{
|
||
// Проверяем существует ли файл
|
||
CFile *pFile = new CFile();
|
||
|
||
if (pFile->OpenFile(std_string2string(wsTempFilePath)) != S_OK)
|
||
{
|
||
delete pFile;
|
||
SetError( oMMgr->oError, AVS_OFFICEPDFWRITER_ERROR_FILE_OPEN_ERROR, errno);
|
||
return NULL;
|
||
}
|
||
|
||
// определяем размер файла
|
||
long lFileSize = pFile->GetFileSize();
|
||
// Закрываем файл, мы будем хранить путь к файлу, а не указатель на структуру pFile
|
||
pFile->CloseFile();
|
||
delete pFile;
|
||
|
||
StreamRecPtr pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec ) );
|
||
if ( pStream )
|
||
{
|
||
TempFileStreamAttrRecPtr pAttr = (TempFileStreamAttrRecPtr)GetMem( oMMgr, sizeof( TempFileStreamAttrRec ) );
|
||
if ( !pAttr )
|
||
{
|
||
FreeMem( oMMgr, pStream );
|
||
return NULL;
|
||
}
|
||
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
UtilsMemSet( pAttr, 0, sizeof(TempFileStreamAttrRec) );
|
||
|
||
pAttr->nCurPos = 0;
|
||
pAttr->nReaderPos = 0;
|
||
pAttr->nWriterPos = 0;
|
||
memcpy(pAttr->wsFilePath, wsTempFilePath.c_str(), wsTempFilePath.length() * sizeof(wchar_t));
|
||
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->eType = StreamTempFile;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pAttr = pAttr;
|
||
|
||
pStream->pWriteFn = TempFileStreamWriteFunc;
|
||
pStream->pReadFn = TempFileStreamReadFunc;
|
||
pStream->pSeekFn = TempFileStreamSeekFunc;
|
||
pStream->pTellFn = TempFileStreamTellFunc;
|
||
pStream->pSizeFn = TempFileStreamSizeFunc;
|
||
pStream->pFreeFn = TempFileStreamFreeFunc;
|
||
|
||
pStream->nSize = lFileSize;
|
||
pStream->nCheckSum = unCheckSum;
|
||
}
|
||
else
|
||
{
|
||
// ::_wunlink( wsTempFilePath );
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
}
|
||
/*
|
||
* CallbackReaderNew
|
||
*
|
||
* Конструктор для CallbackReader.
|
||
*
|
||
* oMMgr : Указатель на объект MMgr.
|
||
* pReadFn : Указатель на функию пользователя для чтения данных.
|
||
* pSeekFn : Указатель на функию пользователя для поиска данных.
|
||
* pTellFn : Указатель на функию пользователя для определения текущего указателя файла.
|
||
* pSizeFn : Указатель на функию пользователя для определения размера файла.
|
||
* pData : Указатель на данные определенные пользователем.
|
||
*
|
||
* return: В случае успеха возвращает указатель на новый объект StreamRecPtr,
|
||
* в случае неудачи, возвращает NULL.
|
||
*
|
||
*/
|
||
StreamRecPtr CallbackReaderNew (MMgr oMMgr, StreamReadFunc pReadFn, StreamSeekFunc pSeekFn, StreamTellFunc pTellFn, StreamSizeFunc pSizeFn, void* pData)
|
||
{
|
||
StreamRecPtr pStream;
|
||
|
||
pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec) );
|
||
|
||
if ( pStream )
|
||
{
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pReadFn = pReadFn;
|
||
pStream->pSeekFn = pSeekFn;
|
||
pStream->pTellFn = pTellFn;
|
||
pStream->pSizeFn = pSizeFn;
|
||
pStream->pAttr = pData;
|
||
pStream->eType = StreamCallBack;
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
|
||
/*
|
||
* CallbackWriterNew
|
||
*
|
||
* Конструктор для CallbackWriter.
|
||
*
|
||
* oMMgr : Указатель на объект MMgr.
|
||
* pWriteFn : Указатель на функию пользователя для записи данных.
|
||
* pData : Указатель на данные определенные пользователем.
|
||
*
|
||
* return: В случае успеха возвращает указатель на новый объект StreamRecPtr,
|
||
* в случае неудачи, возвращает NULL.
|
||
*
|
||
*/
|
||
StreamRecPtr CallbackWriterNew (MMgr oMMgr, StreamWriteFunc pWriteFn, void* pData)
|
||
{
|
||
StreamRecPtr pStream;
|
||
|
||
pStream = (StreamRecPtr)GetMem( oMMgr, sizeof(StreamRec) );
|
||
|
||
if ( pStream )
|
||
{
|
||
UtilsMemSet( pStream, 0, sizeof(StreamRec) );
|
||
pStream->nSigBytes = STREAM_SIG_BYTES;
|
||
pStream->oError = oMMgr->oError;
|
||
pStream->oMMgr = oMMgr;
|
||
pStream->pWriteFn = pWriteFn;
|
||
pStream->pAttr = pData;
|
||
pStream->eType = StreamCallBack;
|
||
}
|
||
|
||
return pStream;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void StreamFree (StreamRecPtr pStream)
|
||
{
|
||
if (! pStream )
|
||
return;
|
||
|
||
if ( pStream->pFreeFn )
|
||
pStream->pFreeFn( pStream );
|
||
|
||
pStream->nSigBytes = 0;
|
||
|
||
FreeMem( pStream->oMMgr, pStream );
|
||
}
|
||
|
||
unsigned long StreamWriteChar (StreamRecPtr pStream, char cValue)
|
||
{
|
||
return StreamWrite( pStream, (BYTE*)&cValue, sizeof(char) );
|
||
}
|
||
|
||
|
||
|
||
|
||
unsigned long StreamWriteStr (StreamRecPtr pStream, const char *sValue)
|
||
{
|
||
unsigned int nLen = UtilsStrLen( sValue, -1 );
|
||
|
||
return StreamWrite( pStream, (BYTE*)sValue, nLen );
|
||
}
|
||
|
||
|
||
|
||
unsigned long StreamWriteUChar (StreamRecPtr pStream, BYTE nValue)
|
||
{
|
||
return StreamWrite( pStream, &nValue, sizeof(BYTE) );
|
||
}
|
||
|
||
unsigned long StreamWriteInt (StreamRecPtr pStream, int nValue)
|
||
{
|
||
char sBuf[INT_LEN + 1];
|
||
|
||
char* cCh = UtilsIToA( sBuf, nValue, sBuf + INT_LEN );
|
||
|
||
return StreamWrite( pStream, (BYTE*)sBuf, (unsigned int)(cCh - sBuf));
|
||
}
|
||
|
||
unsigned long StreamWriteUInt (StreamRecPtr pStream, unsigned int nValue)
|
||
{
|
||
return StreamWriteInt( pStream, (int)nValue);
|
||
}
|
||
|
||
unsigned long StreamWriteHex (StreamRecPtr pStream, int nValue, int nLen)
|
||
{
|
||
// Пишем заданное число в шестандцатиричной форме, параметр nLen отвечает за длину числа, (т.е. если надо дописываем нули перед числом)
|
||
char sBuffer[10];
|
||
if ( 2 == nLen )
|
||
{
|
||
#if defined(_WIN32) || defined(_WIN64)
|
||
_snprintf( sBuffer, sizeof(sBuffer), "%.2X", nValue );
|
||
#else
|
||
snprintf( sBuffer, sizeof(sBuffer), "%.2X", nValue );
|
||
#endif
|
||
}
|
||
else // 4 == nLen
|
||
{
|
||
#if defined(_WIN32) || defined(_WIN64)
|
||
_snprintf( sBuffer, sizeof(sBuffer), "%.4X", nValue );
|
||
#else
|
||
snprintf( sBuffer, sizeof(sBuffer), "%.4X", nValue );
|
||
#endif
|
||
}
|
||
return StreamWriteStr( pStream, sBuffer );
|
||
}
|
||
|
||
unsigned long StreamWriteReal (StreamRecPtr pStream, float fValue)
|
||
{
|
||
char sBuf[REAL_LEN + 1];
|
||
|
||
char* cCh = UtilsFToA( sBuf, fValue, sBuf + REAL_LEN);
|
||
|
||
return StreamWrite( pStream, (BYTE*)sBuf, (unsigned int)( cCh - sBuf ) );
|
||
}
|
||
|
||
int StreamTell (StreamRecPtr pStream)
|
||
{
|
||
if ( !( pStream->pTellFn ) )
|
||
return SetError( pStream->oError, AVS_OFFICEPDFWRITER_ERROR_INVALID_OPERATION, 0 );
|
||
|
||
if ( 0 != ErrorGetCode(pStream->oError) )
|
||
return AVS_OFFICEPDFWRITER_ERROR_THIS_FUNC_WAS_SKIPPED;
|
||
|
||
return pStream->pTellFn( pStream );
|
||
}
|
||
|
||
|
||
bool StreamEOF (StreamRecPtr pStream);
|
||
unsigned long StreamFlush (StreamRecPtr pStream);
|
||
unsigned long StreamWriteEscapeName (StreamRecPtr pStream, const char *sValue)
|
||
{
|
||
char sTmpChar[LIMIT_MAX_NAME_LEN * 3 + 2];
|
||
|
||
unsigned int nLen = 0;
|
||
|
||
const BYTE* pPos1;
|
||
char* pPos2;
|
||
|
||
nLen = UtilsStrLen( sValue, LIMIT_MAX_NAME_LEN );
|
||
pPos1 = (BYTE*)sValue;
|
||
pPos2 = sTmpChar;
|
||
|
||
*pPos2++ = '/';
|
||
|
||
for ( int nIndex = 0; nIndex < (int)nLen; nIndex++)
|
||
{
|
||
BYTE nChar = *pPos1++;
|
||
if ( NEEDS_ESCAPE( nChar ) )
|
||
{
|
||
*pPos2++ = '#';
|
||
*pPos2 = (char)(nChar >> 4);
|
||
|
||
if ( *pPos2 <= 9 )
|
||
*pPos2 += 0x30;
|
||
else
|
||
*pPos2 += 0x41 - 10;
|
||
|
||
pPos2++;
|
||
|
||
*pPos2 = (char)(nChar & 0x0f);
|
||
|
||
if ( *pPos2 <= 9 )
|
||
*pPos2 += 0x30;
|
||
else
|
||
*pPos2 += 0x41 - 10;
|
||
|
||
pPos2++;
|
||
}
|
||
else
|
||
*pPos2++ = nChar;
|
||
}
|
||
|
||
*pPos2 = 0;
|
||
|
||
return StreamWrite( pStream, (BYTE*)sTmpChar, UtilsStrLen( sTmpChar, -1 ) );
|
||
}
|
||
|
||
unsigned long StreamWriteEscapeText2(StreamRecPtr pStream, const BYTE *sText, unsigned int nLen)
|
||
{
|
||
char sBuf[TEXT_DEFAULT_LEN];
|
||
|
||
unsigned int nIndex = 0;
|
||
|
||
const BYTE* sTxt = sText;
|
||
unsigned long nRet = 0;
|
||
|
||
if ( !nLen )
|
||
return OK;
|
||
|
||
sBuf[nIndex++] = '(';
|
||
|
||
for (int nCounter = 0; nCounter < nLen; nCounter++)
|
||
{
|
||
BYTE nChar = (BYTE)*sTxt++;
|
||
|
||
if ( NEEDS_ESCAPE(nChar) )
|
||
{
|
||
sBuf[nIndex++] = '\\';
|
||
|
||
sBuf[nIndex] = nChar >> 6;
|
||
sBuf[nIndex] += 0x30;
|
||
nIndex++;
|
||
sBuf[nIndex] = (nChar & 0x38) >> 3;
|
||
sBuf[nIndex] += 0x30;
|
||
nIndex++;
|
||
sBuf[nIndex] = (nChar & 0x07);
|
||
sBuf[nIndex] += 0x30;
|
||
nIndex++;
|
||
}
|
||
else
|
||
sBuf[nIndex++] = nChar;
|
||
|
||
if ( nIndex > TEXT_DEFAULT_LEN - 4)
|
||
{
|
||
nRet = StreamWrite( pStream, (BYTE*)sBuf, nIndex );
|
||
if ( OK != nRet )
|
||
return nRet;
|
||
nIndex = 0;
|
||
}
|
||
}
|
||
sBuf[nIndex++] = ')';
|
||
|
||
nRet = StreamWrite( pStream, (BYTE*)sBuf, nIndex );
|
||
|
||
return nRet;
|
||
}
|
||
|
||
unsigned long StreamWriteEscapeText (StreamRecPtr pStream, const BYTE *sText, unsigned int nLen)
|
||
{
|
||
if ( NULL == sText ) nLen = 0;
|
||
|
||
return StreamWriteEscapeText2( pStream, sText, nLen );
|
||
}
|
||
|
||
|
||
unsigned long StreamWriteBinary (StreamRecPtr pStream, const BYTE *pData, unsigned int nLen, EncryptRecPtr pEncrypt)
|
||
{
|
||
char sBuf[TEXT_DEFAULT_LEN];
|
||
|
||
BYTE pEBuf[TEXT_DEFAULT_LEN];
|
||
BYTE *pBuf = NULL;
|
||
bool bFlag = false;
|
||
unsigned int nIndex = 0;
|
||
|
||
const BYTE* pBuffer = NULL;
|
||
unsigned long nRet = OK;
|
||
|
||
if ( pEncrypt )
|
||
{
|
||
if ( nLen <= TEXT_DEFAULT_LEN )
|
||
pBuf = pEBuf;
|
||
else
|
||
{
|
||
pBuf = (BYTE *)GetMem( pStream->oMMgr, nLen);
|
||
bFlag = true;
|
||
}
|
||
|
||
EncryptCryptBuf( pEncrypt, pData, pBuf, nLen);
|
||
pBuffer = pBuf;
|
||
}
|
||
else
|
||
{
|
||
pBuffer = pData;
|
||
}
|
||
|
||
for ( int nCounter = 0; nCounter < nLen; nCounter++, pBuffer++)
|
||
{
|
||
char nChar = *pBuffer >> 4;
|
||
|
||
if ( nChar <= 9 )
|
||
nChar += 0x30;
|
||
else
|
||
nChar += 0x41 - 10;
|
||
sBuf[nIndex++] = nChar;
|
||
|
||
nChar = *pBuffer & 0x0f;
|
||
if ( nChar <= 9 )
|
||
nChar += 0x30;
|
||
else
|
||
nChar += 0x41 - 10;
|
||
sBuf[nIndex++] = nChar;
|
||
|
||
if (nIndex > TEXT_DEFAULT_LEN - 2)
|
||
{
|
||
nRet = StreamWrite( pStream, (BYTE*)sBuf, nIndex );
|
||
if ( OK != nRet )
|
||
{
|
||
if ( bFlag )
|
||
FreeMem( pStream->oMMgr, pBuf);
|
||
return nRet;
|
||
}
|
||
nIndex = 0;
|
||
}
|
||
}
|
||
|
||
if ( nIndex > 0)
|
||
{
|
||
nRet = StreamWrite( pStream, (BYTE*)sBuf, nIndex );
|
||
}
|
||
|
||
if ( bFlag )
|
||
FreeMem( pStream->oMMgr, pBuf);
|
||
|
||
return nRet;
|
||
}
|
||
|
||
bool StreamValidate (StreamRecPtr pStream)
|
||
{
|
||
if ( !pStream || STREAM_SIG_BYTES != pStream->nSigBytes )
|
||
return false;
|
||
else
|
||
return true;
|
||
}
|