summaryrefslogtreecommitdiff
path: root/files.cpp
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-06 03:23:16 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2002-10-06 03:23:16 +0000
commit54aac9c52276331c818cebd420354c5e281d363a (patch)
treeb17efe5fa05ed03b0dff957ebafff5f0427bf02c /files.cpp
parent518ee466c969f557a66461999fce39c3d3eea352 (diff)
downloadcryptopp-54aac9c52276331c818cebd420354c5e281d363a.tar.gz
bug fixes
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@7 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'files.cpp')
-rw-r--r--files.cpp98
1 files changed, 48 insertions, 50 deletions
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 &parameters)
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 &parameters)
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<char>::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<char>::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<FileStore *>(this)->TransferTo2(target, copyMax, channel, blocking);
+ unsigned long copyMax = end-begin;
+ unsigned int blockedBytes = const_cast<FileStore *>(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 &parameters)
+void FileSink::IsolatedInitialize(const NameValuePairs &parameters)
{
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 &parameters)
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;
}