From 54aac9c52276331c818cebd420354c5e281d363a Mon Sep 17 00:00:00 2001 From: weidai Date: Sun, 6 Oct 2002 03:23:16 +0000 Subject: bug fixes git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@7 57ff6487-cd31-0410-9ec3-f628ee90f5f0 --- files.cpp | 98 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 50 deletions(-) (limited to 'files.cpp') diff --git a/files.cpp b/files.cpp index 01028c6..469e770 100644 --- a/files.cpp +++ b/files.cpp @@ -1,11 +1,11 @@ -// files.cpp - written and placed in the public domain by Wei Dai +// files.cpp - written and placed in the public domain by Wei Dai #include "pch.h" #include "files.h" NAMESPACE_BEGIN(CryptoPP) -using namespace std; +using namespace std; void Files_TestInstantiations() { @@ -20,7 +20,7 @@ void FileStore::StoreInitialize(const NameValuePairs ¶meters) if (parameters.GetValue("InputFileName", fileName)) { ios::openmode binary = parameters.GetValueWithDefault("InputBinaryMode", true) ? ios::binary : ios::openmode(0); - m_file.open(fileName, ios::in | binary); + m_file.open(fileName, ios::in | binary); if (!m_file) throw OpenErr(fileName); m_stream = &m_file; @@ -30,7 +30,7 @@ void FileStore::StoreInitialize(const NameValuePairs ¶meters) m_stream = NULL; parameters.GetValue("InputStreamPointer", m_stream); } - m_waiting = false; + m_waiting = false; } unsigned long FileStore::MaxRetrievable() const @@ -38,57 +38,42 @@ unsigned long FileStore::MaxRetrievable() const if (!m_stream) return 0; - streampos current = m_stream->tellg(); - streampos end = m_stream->seekg(0, ios::end).tellg(); + streampos current = m_stream->tellg(); + streampos end = m_stream->seekg(0, ios::end).tellg(); m_stream->seekg(current); return end-current; } -unsigned int FileStore::Peek(byte &outByte) const -{ - if (!m_stream) - return 0; - - int result = m_stream->peek(); - if (result == EOF) // GCC workaround: 2.95.2 doesn't have char_traits::eof() - return 0; - else - { - outByte = byte(result); - return 1; - } -} - -unsigned int FileStore::TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel, bool blocking) +unsigned int FileStore::TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel, bool blocking) { if (!m_stream) { - transferBytes = 0; + transferBytes = 0; return 0; } unsigned long size=transferBytes; - transferBytes = 0; + transferBytes = 0; if (m_waiting) goto output; - while (size && m_stream->good()) + while (size && m_stream->good()) { { unsigned int spaceSize = 1024; - m_space = HelpCreatePutSpace(target, channel, 1, (unsigned int)STDMIN(size, (unsigned long)UINT_MAX), spaceSize); + m_space = HelpCreatePutSpace(target, channel, 1, (unsigned int)STDMIN(size, (unsigned long)UINT_MAX), spaceSize); - m_stream->read((char *)m_space, STDMIN(size, (unsigned long)spaceSize)); + m_stream->read((char *)m_space, STDMIN(size, (unsigned long)spaceSize)); } - m_len = m_stream->gcount(); + m_len = m_stream->gcount(); unsigned int blockedBytes; output: - blockedBytes = target.ChannelPutModifiable2(channel, m_space, m_len, 0, blocking); - m_waiting = blockedBytes > 0; + blockedBytes = target.ChannelPutModifiable2(channel, m_space, m_len, 0, blocking); + m_waiting = blockedBytes > 0; if (m_waiting) return blockedBytes; - size -= m_len; + size -= m_len; transferBytes += m_len; } @@ -98,28 +83,41 @@ output: return 0; } -unsigned int FileStore::CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end, const std::string &channel, bool blocking) const +unsigned int FileStore::CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end, const std::string &channel, bool blocking) const { if (!m_stream) return 0; - // TODO: figure out what happens on cin - streampos current = m_stream->tellg(); - streampos endPosition = m_stream->seekg(0, ios::end).tellg(); - streampos newPosition = current + (streamoff)begin; + if (begin == 0 && end == 1) + { + int result = m_stream->peek(); + if (result == EOF) // GCC workaround: 2.95.2 doesn't have char_traits::eof() + return 0; + else + { + unsigned int blockedBytes = target.ChannelPut(channel, byte(result), blocking); + begin += 1-blockedBytes; + return blockedBytes; + } + } + + // TODO: figure out what happens on cin + streampos current = m_stream->tellg(); + streampos endPosition = m_stream->seekg(0, ios::end).tellg(); + streampos newPosition = current + (streamoff)begin; - if (newPosition >= endPosition) + if (newPosition >= endPosition) { m_stream->seekg(current); - return 0; // don't try to seek beyond the end of file + return 0; // don't try to seek beyond the end of file } m_stream->seekg(newPosition); - unsigned long total = 0; + unsigned long total = 0; try { assert(!m_waiting); - unsigned long copyMax = end-begin; - unsigned int blockedBytes = const_cast(this)->TransferTo2(target, copyMax, channel, blocking); + unsigned long copyMax = end-begin; + unsigned int blockedBytes = const_cast(this)->TransferTo2(target, copyMax, channel, blocking); begin += copyMax; if (blockedBytes) { @@ -139,13 +137,13 @@ unsigned int FileStore::CopyRangeTo2(BufferedTransformation &target, unsigned lo return 0; } -void FileSink::IsolatedInitialize(const NameValuePairs ¶meters) +void FileSink::IsolatedInitialize(const NameValuePairs ¶meters) { const char *fileName; if (parameters.GetValue("OutputFileName", fileName)) { - ios::openmode binary = parameters.GetValueWithDefault("OutputBinaryMode", true) ? ios::binary : ios::openmode(0); - m_file.open(fileName, ios::out | ios::trunc | binary); + ios::openmode binary = parameters.GetValueWithDefault("OutputBinaryMode", true) ? ios::binary : ios::openmode(0); + m_file.open(fileName, ios::out | ios::trunc | binary); if (!m_file) throw OpenErr(fileName); m_stream = &m_file; @@ -160,27 +158,27 @@ void FileSink::IsolatedInitialize(const NameValuePairs ¶meters) bool FileSink::IsolatedFlush(bool hardFlush, bool blocking) { if (!m_stream) - throw Err("FileSink: output stream not opened"); + throw Err("FileSink: output stream not opened"); m_stream->flush(); if (!m_stream->good()) - throw WriteErr(); + throw WriteErr(); return false; } -unsigned int FileSink::Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) +unsigned int FileSink::Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) { if (!m_stream) - throw Err("FileSink: output stream not opened"); + throw Err("FileSink: output stream not opened"); - m_stream->write((const char *)inString, length); + m_stream->write((const char *)inString, length); if (messageEnd) m_stream->flush(); if (!m_stream->good()) - throw WriteErr(); + throw WriteErr(); return 0; } -- cgit v1.2.1