Files
core/Common/FileWriter.h
Elen.Subbotina 639f43fc77 RtfFile linux build
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62114 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 23:57:38 +03:00

187 lines
5.1 KiB
C++

#pragma once
#include "./DocxFormat/Source/SystemUtility/File.h"
namespace NFileWriter
{
//------------------------------------------------------------------------------------------------------
// CBufferedFileWriter
//------------------------------------------------------------------------------------------------------
// Àáñòðàêòíûé êëàññ, êîòîðûé ñîäåðæèò â ñåáå îáúÿâëåíèÿ ôóíêöèé
//------------------------------------------------------------------------------------------------------
class CFileWriter
{
public :
// Ïðèíèìàåò äàííûå íà çàïèñü
virtual void Write ( BYTE* lpData, LONG64 lDataLength ) = 0;
// Ôëàø ( äîïèñûâàåì âñå äàííûå )
virtual void Flush () = 0;
// Ñèê íà óêàçàííóþ ïîçèöèþ ïî ôàéëó
virtual void Seek ( LONG64 lPosition, DWORD dwFrom = 0 ) = 0;
// Òåêóùàÿ ïîçèöèÿ
virtual void GetPosition(ULONG64& nPos) = 0;
// Ðàçìåð çàïèñàííîãî ôàéëà
virtual void GetSize(ULONG64& nLen) = 0;
public :
// Êîíñòðóêòîð
CFileWriter ()
{
}
// Âèðòóàëüíûé äåñòðóêòîð
virtual ~CFileWriter ()
{
}
};
//------------------------------------------------------------------------------------------------------
// CBufferedFileWriter
//------------------------------------------------------------------------------------------------------
// Êëàññ, êîòîðûé çàíèìàåòñÿ çàïèñüþ ôàéëà íà äèñê
//------------------------------------------------------------------------------------------------------
class CBufferedFileWriter : public CFileWriter
{
private :
CFile m_oFile;
//HANDLE m_hFile; // Õåíäë íà ôàéë, â êîòîðûé èäåò çàïèñü
LONG64 m_lBufferSize; // Ðàçìåð áóôôåðà
BYTE* m_lpBuffer; // Ñàì áóôôåð
LONG64 m_lWritePointer; // Ïîçèöèÿ äëÿ çàïèñè äàííûõ â áóôôåð
public :
// Êîíñòðóêòîð ( îò èìåíè ôàéëà, ñàì êîíòðîë îòêðûâàåò ôàéë )
CBufferedFileWriter ( CString & sFileName, LONG64 lBufferSize = 10 * 1024 * 1024 ) : CFileWriter ()
{
if (m_oFile.CreateFile(sFileName) != S_OK)
// Åñëè íå ïîëó÷èëîñü îòêðûòü ôàéë
{
// Âûäàåì èñêëþ÷åíèå
throw 1;
}
// Êîïèðóåì äàííûå
m_lBufferSize = lBufferSize;
// Îáíóëÿåì ïåðåìåííûå
m_lWritePointer = 0;
// Âûäåëÿåì áóôåð.
m_lpBuffer = ( BYTE* ) new BYTE[ m_lBufferSize ];
// Åñëè áóôôåð íå âûäåëèëñÿ, âîçâðàùàåì Exception
if ( !m_lpBuffer )
{
// Âûäàåì èñêëþ÷åíèå
throw 1;
}
// Âñå îòëè÷íî!!!
}
// Äåñòðóêòîð
virtual ~CBufferedFileWriter ()
{
Flush();
m_oFile.CloseFile();
// Óäàëÿåì áóôôåð
RELEASEARRAYOBJECTS(m_lpBuffer);
}
// Ïðèíèìàåò äàííûå íà çàïèñü
virtual void Write ( BYTE* lpData, LONG64 lDataLength )
{
// Ïîêà ðàçìåð äàííûõ íå èñ÷åðïàí
while ( 0 < lDataLength )
{
// Ðàçìåð ñâîáîäíîé ïàìÿòè â áóôôåðå
LONG64 lBufferFreeLength = 0;
// Öèêë, ïîêà íå ïîÿâèòñÿ ñâîáîäíîå ìåñòî äëÿ çàïèñè
while ( 0 >= ( lBufferFreeLength = m_lBufferSize - m_lWritePointer ) )
{
// Ïèøåì äàííûå, åñëè íå ïîëó÷èëîñü, òî ãåíåðèðóåì èñêëþ÷åíèå
if ( false == WriteBuffer ( m_lBufferSize ) )
throw 1;
}
// Ïðîâåðÿåì äîñòàòî÷íî ëè ìåñòà, ÷òîáû çàïèñàòü âåñü ïðèøåäøèé áóôåð â ïàìÿòü
if ( lBufferFreeLength > lDataLength )
lBufferFreeLength = lDataLength;
// Êîïèðóåì äàííûå â áóôôåð
memcpy ( m_lpBuffer + m_lWritePointer, lpData, (size_t) lBufferFreeLength);
// Óìåíüøàåì ðàçìåð äàííûõ ðîâíî íà ñòîëüêî, ñêîëüêî çàïèñàëè â áóôôåð
lDataLength -= lBufferFreeLength;
// Ñäâèãàåì óêàçàòåëü íà ïðèøåäøèå äàííûå
lpData = lpData + lBufferFreeLength;
// Ñäâèãàåì ïîçèöèþ äëÿ çàïèñè äàííûõ â áóôôåð
m_lWritePointer += lBufferFreeLength;
}
}
// Ôëàø ( äîïèñûâàåì âñå äàííûå )
virtual void Flush ()
{
// Ïèøåì âñå äàííûå, êîòîðûå åñòü
if ( 0 < m_lWritePointer )
{
// Åñëè ïðèøëà îøèáêà, òî ãåíåðèðóåì èñêëþ÷åíèå
if ( false == WriteBuffer ( m_lWritePointer ) )
throw 1;
}
}
// Ñèê íà óêàçàííóþ ïîçèöèþ ïî ôàéëó
virtual void Seek ( LONG64 lPosition, DWORD dwFrom/* = FILE_CURRENT */)
{
// Äîïèøåì ñíà÷àëà âñå äàííûå
Flush ();
if (dwFrom == 1/*FILE_CURRENT*/)
{
dwFrom += m_oFile.GetPosition();
}
if (m_oFile.SetPosition(lPosition) != S_OK)
throw 1;
}
// Òåêóùàÿ ïîçèöèÿ
virtual void GetPosition(ULONG64& nPos)
{
nPos = m_oFile.GetPosition() + m_lWritePointer;
}
// Ðàçìåð çàïèñàííîãî ôàéëà
virtual void GetSize(ULONG64& nLen)
{
nLen = m_oFile.GetFileSize() + m_lWritePointer;
}
private :
// Ñàìà çàïèñü íà äèñê
bool WriteBuffer ( LONG64 lSize )
{
// Ïèøåì íà äèñê
if (m_oFile.WriteFile(m_lpBuffer, ( DWORD ) lSize) != S_OK)
{
// Åñëè ÷òî-òî ïðîèçîøëî íå òàê, âîçâðàùàåì FALSE
return false;
}
// Ñáðàñûâàåì â 0 óêàçàòåëü íà ïîçèöèþ äàííûõ â áóôôåðå
m_lWritePointer = 0;
return true;
}
};
}