mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62114 954022d7-b5bf-4e40-9824-e11837661b57
187 lines
5.1 KiB
C++
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;
|
|
}
|
|
};
|
|
}
|