Crypto++  8.4
Free C++ class library of cryptographic schemes
files.h
Go to the documentation of this file.
1 // files.h - originally written and placed in the public domain by Wei Dai
2 
3 /// \file files.h
4 /// \brief Classes providing file-based library services
5 /// \since Crypto++ 1.0
6 
7 #ifndef CRYPTOPP_FILES_H
8 #define CRYPTOPP_FILES_H
9 
10 #include "cryptlib.h"
11 #include "filters.h"
12 #include "argnames.h"
13 #include "smartptr.h"
14 
15 #include <iostream>
16 #include <fstream>
17 
18 NAMESPACE_BEGIN(CryptoPP)
19 
20 /// \brief Implementation of Store interface
21 /// \details file-based implementation of Store interface
22 class CRYPTOPP_DLL FileStore : public Store, private FilterPutSpaceHelper, public NotCopyable
23 {
24 public:
25  /// \brief Exception thrown when file-based error is encountered
26  class Err : public Exception
27  {
28  public:
29  Err(const std::string &s) : Exception(IO_ERROR, s) {}
30  };
31  /// \brief Exception thrown when file-based open error is encountered
32  class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileStore: error opening file for reading: " + filename) {}};
33  /// \brief Exception thrown when file-based read error is encountered
34  class ReadErr : public Err {public: ReadErr() : Err("FileStore: error reading file") {}};
35 
36  /// \brief Construct a FileStore
37  FileStore() : m_stream(NULLPTR), m_space(NULLPTR), m_len(0), m_waiting(0) {}
38 
39  /// \brief Construct a FileStore
40  /// \param in an existing stream
41  FileStore(std::istream &in) : m_stream(NULLPTR), m_space(NULLPTR), m_len(0), m_waiting(0)
42  {StoreInitialize(MakeParameters(Name::InputStreamPointer(), &in));}
43 
44  /// \brief Construct a FileStore
45  /// \param filename the narrow name of the file to open
46  FileStore(const char *filename) : m_stream(NULLPTR), m_space(NULLPTR), m_len(0), m_waiting(0)
47  {StoreInitialize(MakeParameters(Name::InputFileName(), filename ? filename : ""));}
48 
49 #if defined(CRYPTOPP_UNIX_AVAILABLE) || defined(CRYPTOPP_DOXYGEN_PROCESSING) || _MSC_VER >= 1400
50  /// \brief Construct a FileStore
51  /// \param filename the Unicode name of the file to open
52  /// \details On non-Windows OS, this function assumes that setlocale() has been called.
53  FileStore(const wchar_t *filename)
54  {StoreInitialize(MakeParameters(Name::InputFileNameWide(), filename));}
55 #endif
56 
57  /// \brief Retrieves the internal stream
58  /// \return the internal stream pointer
59  std::istream* GetStream() {return m_stream;}
60 
61  /// \brief Retrieves the internal stream
62  /// \return the internal stream pointer
63  const std::istream* GetStream() const {return m_stream;}
64 
65  /// \brief Provides the number of bytes ready for retrieval
66  /// \return the number of bytes ready for retrieval
67  /// \details All retrieval functions return the actual number of bytes retrieved, which is
68  /// the lesser of the request number and MaxRetrievable()
70  size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true);
71  size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
72  lword Skip(lword skipMax=ULONG_MAX);
73 
74 private:
75  void StoreInitialize(const NameValuePairs &parameters);
76 
78  std::istream *m_stream;
79  byte *m_space;
80  size_t m_len;
81  bool m_waiting;
82 };
83 
84 /// \brief Implementation of Store interface
85 /// \details file-based implementation of Store interface
86 class CRYPTOPP_DLL FileSource : public SourceTemplate<FileStore>
87 {
88 public:
89  typedef FileStore::Err Err;
92 
93  /// \brief Construct a FileSource
94  FileSource(BufferedTransformation *attachment = NULLPTR)
95  : SourceTemplate<FileStore>(attachment) {}
96 
97  /// \brief Construct a FileSource
98  /// \param in an existing stream
99  /// \param pumpAll flag indicating if source data should be pumped to its attached transformation
100  /// \param attachment an optional attached transformation
101  FileSource(std::istream &in, bool pumpAll, BufferedTransformation *attachment = NULLPTR)
102  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputStreamPointer(), &in));}
103 
104  /// \brief Construct a FileSource
105  /// \param filename the narrow name of the file to open
106  /// \param pumpAll flag indicating if source data should be pumped to its attached transformation
107  /// \param attachment an optional attached transformation
108  /// \param binary flag indicating if the file is binary
109  FileSource(const char *filename, bool pumpAll, BufferedTransformation *attachment = NULLPTR, bool binary=true)
110  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputFileName(), filename)(Name::InputBinaryMode(), binary));}
111 
112 #if defined(CRYPTOPP_UNIX_AVAILABLE) || defined(CRYPTOPP_DOXYGEN_PROCESSING) || _MSC_VER >= 1400
113  /// \brief Construct a FileSource
114  /// \param filename the Unicode name of the file to open
115  /// \param pumpAll flag indicating if source data should be pumped to its attached transformation
116  /// \param attachment an optional attached transformation
117  /// \param binary flag indicating if the file is binary
118  /// \details On non-Windows OS, this function assumes that setlocale() has been called.
119  FileSource(const wchar_t *filename, bool pumpAll, BufferedTransformation *attachment = NULLPTR, bool binary=true)
120  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputFileNameWide(), filename)(Name::InputBinaryMode(), binary));}
121 #endif
122 
123  /// \brief Retrieves the internal stream
124  /// \return the internal stream pointer
125  std::istream* GetStream() {return m_store.GetStream();}
126 };
127 
128 /// \brief Implementation of Store interface
129 /// \details file-based implementation of Sink interface
130 class CRYPTOPP_DLL FileSink : public Sink, public NotCopyable
131 {
132 public:
133  /// \brief Exception thrown when file-based error is encountered
134  class Err : public Exception
135  {
136  public:
137  Err(const std::string &s) : Exception(IO_ERROR, s) {}
138  };
139  /// \brief Exception thrown when file-based open error is encountered
140  class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileSink: error opening file for writing: " + filename) {}};
141  /// \brief Exception thrown when file-based write error is encountered
142  class WriteErr : public Err {public: WriteErr() : Err("FileSink: error writing file") {}};
143 
144  /// \brief Construct a FileSink
145  FileSink() : m_stream(NULLPTR) {}
146 
147  /// \brief Construct a FileSink
148  /// \param out an existing stream
149  FileSink(std::ostream &out)
151 
152  /// \brief Construct a FileSink
153  /// \param filename the narrow name of the file to open
154  /// \param binary flag indicating if the file is binary
155  FileSink(const char *filename, bool binary=true)
157 
158 #if defined(CRYPTOPP_UNIX_AVAILABLE) || _MSC_VER >= 1400
159  /// \brief Construct a FileSink
160  /// \param filename the Unicode name of the file to open
161  /// \details On non-Windows OS, this function assumes that setlocale() has been called.
162  FileSink(const wchar_t *filename, bool binary=true)
164 #endif
165 
166  /// \brief Retrieves the internal stream
167  /// \return the internal stream pointer
168  std::ostream* GetStream() {return m_stream;}
169 
170  void IsolatedInitialize(const NameValuePairs &parameters);
171  size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking);
172  bool IsolatedFlush(bool hardFlush, bool blocking);
173 
174 private:
176  std::ostream *m_stream;
177 };
178 
179 NAMESPACE_END
180 
181 #endif
FileStore::Err
Exception thrown when file-based error is encountered.
Definition: files.h:27
Name::OutputBinaryMode
const char * OutputBinaryMode()
bool
Definition: argnames.h:65
MakeParameters
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
Definition: algparam.h:508
member_ptr< std::ifstream >
FilterPutSpaceHelper
Create a working space in a BufferedTransformation.
Definition: filters.h:171
Name::OutputStreamPointer
const char * OutputStreamPointer()
std::ostream *
Definition: argnames.h:64
FileStore::GetStream
std::istream * GetStream()
Retrieves the internal stream.
Definition: files.h:59
FileSource::FileSource
FileSource(std::istream &in, bool pumpAll, BufferedTransformation *attachment=NULL)
Construct a FileSource.
Definition: files.h:101
FileStore::OpenErr
Exception thrown when file-based open error is encountered.
Definition: files.h:32
FileSource::FileSource
FileSource(const char *filename, bool pumpAll, BufferedTransformation *attachment=NULL, bool binary=true)
Construct a FileSource.
Definition: files.h:109
BufferedTransformation::IsolatedInitialize
virtual void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
Definition: cryptlib.h:1799
Name::InputStreamPointer
const char * InputStreamPointer()
std::istream *
Definition: argnames.h:60
FileStore
Implementation of Store interface.
Definition: files.h:23
Name::OutputFileName
const char * OutputFileName()
const char *
Definition: argnames.h:62
FileStore::FileStore
FileStore()
Construct a FileStore.
Definition: files.h:37
Name::InputBinaryMode
const char * InputBinaryMode()
bool
Definition: argnames.h:61
FileSink::FileSink
FileSink()
Construct a FileSink.
Definition: files.h:145
BufferedTransformation
Interface for buffered transformations.
Definition: cryptlib.h:1635
Sink
Implementation of BufferedTransformation's attachment interface.
Definition: simple.h:479
Name::InputFileNameWide
const char * InputFileNameWide()
const wchar_t *
Definition: argnames.h:59
Store
Acts as a Source for pre-existing, static data.
Definition: simple.h:448
FileSink::GetStream
std::ostream * GetStream()
Retrieves the internal stream.
Definition: files.h:168
smartptr.h
Classes for automatic resource management.
DEFAULT_CHANNEL
const std::string DEFAULT_CHANNEL
Default channel for BufferedTransformation.
Definition: cryptlib.h:511
FileStore::FileStore
FileStore(const wchar_t *filename)
Construct a FileStore.
Definition: files.h:53
FileSink
Implementation of Store interface.
Definition: files.h:131
filters.h
Implementation of BufferedTransformation's attachment interface.
FileStore::FileStore
FileStore(const char *filename)
Construct a FileStore.
Definition: files.h:46
FileSink::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
argnames.h
Standard names for retrieving values by name when working with NameValuePairs.
Exception
Base class for all exceptions thrown by the library.
Definition: cryptlib.h:159
NotCopyable
Ensures an object is not copyable.
Definition: misc.h:237
FileSink::OpenErr
Exception thrown when file-based open error is encountered.
Definition: files.h:140
FileStore::FileStore
FileStore(std::istream &in)
Construct a FileStore.
Definition: files.h:41
FileSource::FileSource
FileSource(const wchar_t *filename, bool pumpAll, BufferedTransformation *attachment=NULL, bool binary=true)
Construct a FileSource.
Definition: files.h:119
FileSource::FileSource
FileSource(BufferedTransformation *attachment=NULL)
Construct a FileSource.
Definition: files.h:94
FileStore::Skip
lword Skip(lword skipMax=ULONG_MAX)
Discard skipMax bytes from the output buffer.
Name::OutputFileNameWide
const char * OutputFileNameWide()
const wchar_t *
Definition: argnames.h:63
FileStore::CopyRangeTo2
size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const
Copy bytes from this object to another BufferedTransformation.
FileSink::FileSink
FileSink(std::ostream &out)
Construct a FileSink.
Definition: files.h:149
lword
word64 lword
Large word type.
Definition: config_int.h:158
FileStore::MaxRetrievable
lword MaxRetrievable() const
Provides the number of bytes ready for retrieval.
FileSink::WriteErr
Exception thrown when file-based write error is encountered.
Definition: files.h:142
FileSource::GetStream
std::istream * GetStream()
Retrieves the internal stream.
Definition: files.h:125
CryptoPP
Crypto++ library namespace.
FileSink::FileSink
FileSink(const char *filename, bool binary=true)
Construct a FileSink.
Definition: files.h:155
FileSource
Implementation of Store interface.
Definition: files.h:87
FileStore::ReadErr
Exception thrown when file-based read error is encountered.
Definition: files.h:34
FileSink::Put2
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking)
Input multiple bytes for processing.
FileSink::IsolatedFlush
bool IsolatedFlush(bool hardFlush, bool blocking)
Flushes data buffered by this object, without signal propagation.
Name::InputFileName
const char * InputFileName()
const char *
Definition: argnames.h:58
SourceTemplate
Transform a Store into a Source.
Definition: filters.h:1429
FileStore::GetStream
const std::istream * GetStream() const
Retrieves the internal stream.
Definition: files.h:63
LWORD_MAX
const lword LWORD_MAX
Large word type max value.
Definition: config_int.h:164
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:322
cryptlib.h
Abstract base classes that provide a uniform interface to this library.
FileSink::Err
Exception thrown when file-based error is encountered.
Definition: files.h:135
FileStore::TransferTo2
size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true)
Transfer bytes from this object to another BufferedTransformation.