Files
lib3mf/Source/Common/Platform/NMR_ExportStream_Encrypted.cpp
SaraP f8c998f6ff lib3mf :
- primo commit.
2021-09-07 16:50:23 +02:00

53 lines
1.8 KiB
C++

#include "Common/Platform/NMR_ExportStream_Encrypted.h"
#include "Common/NMR_Exception.h"
namespace NMR {
CExportStream_Encrypted::CExportStream_Encrypted(PExportStream pEncryptedStream, ContentEncryptionDescriptor context)
:m_pEncryptedStream(pEncryptedStream), m_pDecryptContext(context)
{
if (nullptr == pEncryptedStream)
throw CNMRException(NMR_ERROR_INVALIDPOINTER);
m_header.writeTo(m_pEncryptedStream);
}
nfBool CExportStream_Encrypted::seekPosition(nfUint64 position, nfBool bHasToSucceed)
{
return m_pEncryptedStream->seekPosition(position + m_header.headerSize(), bHasToSucceed);
}
nfBool CExportStream_Encrypted::seekForward(nfUint64 bytes, nfBool bHasToSucceed)
{
return m_pEncryptedStream->seekForward(bytes, bHasToSucceed);
}
nfBool CExportStream_Encrypted::seekFromEnd(nfUint64 bytes, nfBool bHasToSucceed)
{
if (m_pEncryptedStream->getPosition() + m_header.headerSize() >= bytes) {
return m_pEncryptedStream->seekFromEnd(bytes, bHasToSucceed);
} else if (bHasToSucceed) {
throw CNMRException(NMR_ERROR_COULDNOTSEEKSTREAM);
}
return false;
}
nfUint64 CExportStream_Encrypted::getPosition()
{
return m_pEncryptedStream->getPosition() - m_header.headerSize();
}
nfUint64 CExportStream_Encrypted::writeBuffer(const void * pBuffer, nfUint64 cbTotalBytesToWrite)
{
nfUint64 encryptedBytes = 0;
if (cbTotalBytesToWrite > 0) {
std::vector<nfByte> encryptBuffer(cbTotalBytesToWrite, 0);
encryptedBytes = m_pDecryptContext.m_fnCrypt(cbTotalBytesToWrite, (const nfByte *)pBuffer, encryptBuffer.data(), m_pDecryptContext.m_sDekDecryptData);
if (encryptedBytes > 0) {
auto writtenBytes = m_pEncryptedStream->writeBuffer(encryptBuffer.data(), encryptedBytes);
if (encryptedBytes != writtenBytes)
throw CNMRException(NMR_ERROR_CALCULATIONTERMINATED);
}
}
return encryptedBytes;
}
}