Crypto++
files.h
1 #ifndef CRYPTOPP_FILES_H
2 #define CRYPTOPP_FILES_H
3 
4 #include "cryptlib.h"
5 #include "filters.h"
6 #include "argnames.h"
7 
8 #include <iostream>
9 #include <fstream>
10 
11 NAMESPACE_BEGIN(CryptoPP)
12 
13 //! file-based implementation of Store interface
14 class CRYPTOPP_DLL FileStore : public Store, private FilterPutSpaceHelper, public NotCopyable
15 {
16 public:
17  class Err : public Exception
18  {
19  public:
20  Err(const std::string &s) : Exception(IO_ERROR, s) {}
21  };
22  class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileStore: error opening file for reading: " + filename) {}};
23  class ReadErr : public Err {public: ReadErr() : Err("FileStore: error reading file") {}};
24 
25  FileStore() : m_stream(NULL) {}
26  FileStore(std::istream &in)
27  {StoreInitialize(MakeParameters(Name::InputStreamPointer(), &in));}
28  FileStore(const char *filename)
29  {StoreInitialize(MakeParameters(Name::InputFileName(), filename));}
30 #if defined(CRYPTOPP_UNIX_AVAILABLE) || _MSC_VER >= 1400
31  //! specify file with Unicode name. On non-Windows OS, this function assumes that setlocale() has been called.
32  FileStore(const wchar_t *filename)
33  {StoreInitialize(MakeParameters(Name::InputFileNameWide(), filename));}
34 #endif
35 
36  std::istream* GetStream() {return m_stream;}
37 
38  lword MaxRetrievable() const;
39  size_t TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true);
40  size_t CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end=LWORD_MAX, const std::string &channel=DEFAULT_CHANNEL, bool blocking=true) const;
41  lword Skip(lword skipMax=ULONG_MAX);
42 
43 private:
44  void StoreInitialize(const NameValuePairs &parameters);
45 
47  std::istream *m_stream;
48  byte *m_space;
49  size_t m_len;
50  bool m_waiting;
51 };
52 
53 //! file-based implementation of Source interface
54 class CRYPTOPP_DLL FileSource : public SourceTemplate<FileStore>
55 {
56 public:
57  typedef FileStore::Err Err;
60 
61  FileSource(BufferedTransformation *attachment = NULL)
62  : SourceTemplate<FileStore>(attachment) {}
63  FileSource(std::istream &in, bool pumpAll, BufferedTransformation *attachment = NULL)
64  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputStreamPointer(), &in));}
65  FileSource(const char *filename, bool pumpAll, BufferedTransformation *attachment = NULL, bool binary=true)
66  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputFileName(), filename)(Name::InputBinaryMode(), binary));}
67 #if defined(CRYPTOPP_UNIX_AVAILABLE) || _MSC_VER >= 1400
68  //! specify file with Unicode name. On non-Windows OS, this function assumes that setlocale() has been called.
69  FileSource(const wchar_t *filename, bool pumpAll, BufferedTransformation *attachment = NULL, bool binary=true)
70  : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputFileNameWide(), filename)(Name::InputBinaryMode(), binary));}
71 #endif
72 
73  std::istream* GetStream() {return m_store.GetStream();}
74 };
75 
76 //! file-based implementation of Sink interface
77 class CRYPTOPP_DLL FileSink : public Sink, public NotCopyable
78 {
79 public:
80  class Err : public Exception
81  {
82  public:
83  Err(const std::string &s) : Exception(IO_ERROR, s) {}
84  };
85  class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileSink: error opening file for writing: " + filename) {}};
86  class WriteErr : public Err {public: WriteErr() : Err("FileSink: error writing file") {}};
87 
88  FileSink() : m_stream(NULL) {}
89  FileSink(std::ostream &out)
90  {IsolatedInitialize(MakeParameters(Name::OutputStreamPointer(), &out));}
91  FileSink(const char *filename, bool binary=true)
92  {IsolatedInitialize(MakeParameters(Name::OutputFileName(), filename)(Name::OutputBinaryMode(), binary));}
93 #if defined(CRYPTOPP_UNIX_AVAILABLE) || _MSC_VER >= 1400
94  //! specify file with Unicode name. On non-Windows OS, this function assumes that setlocale() has been called.
95  FileSink(const wchar_t *filename, bool binary=true)
96  {IsolatedInitialize(MakeParameters(Name::OutputFileNameWide(), filename)(Name::OutputBinaryMode(), binary));}
97 #endif
98 
99  std::ostream* GetStream() {return m_stream;}
100 
101  void IsolatedInitialize(const NameValuePairs &parameters);
102  size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking);
103  bool IsolatedFlush(bool hardFlush, bool blocking);
104 
105 private:
107  std::ostream *m_stream;
108 };
109 
110 NAMESPACE_END
111 
112 #endif