Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members

# files.h

    00001 #ifndef CRYPTOPP_FILES_H
    00002 #define CRYPTOPP_FILES_H
    00003
    00004 #include "cryptlib.h"
    00005 #include "filters.h"
    00006 #include "argnames.h"
    00007
    00008 #include <iostream>
    00009 #include <fstream>
    00010
    00011 NAMESPACE_BEGIN(CryptoPP)
    00012
    00013 //! file-based implementation of Store interface
    00014 class CRYPTOPP_DLL FileStore : public Store, private FilterPutSpaceHelper, public NotCopyable
    00015 {
    00016 public:
    00017         class Err : public Exception
    00018         {
    00019         public:
    00020                 Err(const std::string &s) : Exception(IO_ERROR, s) {}
    00021         };
    00022         class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileStore: error opening file for reading: " + filename) {}};
    00023         class ReadErr : public Err {public: ReadErr() : Err("FileStore: error reading file") {}};
    00024
    00025         FileStore() : m_stream(NULL) {}
    00026         FileStore(std::istream &in)
    00027                 {StoreInitialize(MakeParameters(Name::InputStreamPointer(), &in));}
    00028         FileStore(const char *filename)
    00029                 {StoreInitialize(MakeParameters(Name::InputFileName(), filename));}
    00030
    00031         std::istream* GetStream() {return m_stream;}
    00032
    00033         unsigned long MaxRetrievable() const;
    00034         unsigned int TransferTo2(BufferedTransformation &target, unsigned long &transferBytes, const std::string &channel=NULL_CHANNEL, bool blocking=true);
    00035         unsigned int CopyRangeTo2(BufferedTransformation &target, unsigned long &begin, unsigned long end=ULONG_MAX, const std::string &channel=NULL_CHANNEL, bool blocking=true) const;
    00036         unsigned long Skip(unsigned long skipMax=ULONG_MAX);
    00037
    00038 private:
    00039         void StoreInitialize(const NameValuePairs &parameters);
    00040
    00041         member_ptr<std::ifstream> m_file;
    00042         std::istream *m_stream;
    00043         byte *m_space;
    00044         unsigned int m_len;
    00045         bool m_waiting;
    00046 };
    00047
    00048 //! file-based implementation of Source interface
    00049 class CRYPTOPP_DLL FileSource : public SourceTemplate<FileStore>
    00050 {
    00051 public:
    00052         typedef FileStore::Err Err;
    00053         typedef FileStore::OpenErr OpenErr;
    00054         typedef FileStore::ReadErr ReadErr;
    00055
    00056         FileSource(BufferedTransformation *attachment = NULL)
    00057                 : SourceTemplate<FileStore>(attachment) {}
    00058         FileSource(std::istream &in, bool pumpAll, BufferedTransformation *attachment = NULL)
    00059                 : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputStreamPointer(), &in));}
    00060         FileSource(const char *filename, bool pumpAll, BufferedTransformation *attachment = NULL, bool binary=true)
    00061                 : SourceTemplate<FileStore>(attachment) {SourceInitialize(pumpAll, MakeParameters(Name::InputFileName(), filename)(Name::InputBinaryMode(), binary));}
    00062
    00063         std::istream* GetStream() {return m_store.GetStream();}
    00064 };
    00065
    00066 //! file-based implementation of Sink interface
    00067 class CRYPTOPP_DLL FileSink : public Sink, public NotCopyable
    00068 {
    00069 public:
    00070         class Err : public Exception
    00071         {
    00072         public:
    00073                 Err(const std::string &s) : Exception(IO_ERROR, s) {}
    00074         };
    00075         class OpenErr : public Err {public: OpenErr(const std::string &filename) : Err("FileSink: error opening file for writing: " + filename) {}};
    00076         class WriteErr : public Err {public: WriteErr() : Err("FileSink: error writing file") {}};
    00077
    00078         FileSink() : m_stream(NULL) {}
    00079         FileSink(std::ostream &out)
    00080                 {IsolatedInitialize(MakeParameters(Name::OutputStreamPointer(), &out));}
    00081         FileSink(const char *filename, bool binary=true)
    00082                 {IsolatedInitialize(MakeParameters(Name::OutputFileName(), filename)("OutputBinaryMode", binary));}
    00083
    00084         std::ostream* GetStream() {return m_stream;}
    00085
    00086         void IsolatedInitialize(const NameValuePairs &parameters);
    00087         unsigned int Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking);
    00088         bool IsolatedFlush(bool hardFlush, bool blocking);
    00089
    00090 private:
    00091         member_ptr<std::ofstream> m_file;
    00092         std::ostream *m_stream;
    00093 };
    00094
    00095 NAMESPACE_END
    00096
    00097 #endif