diff options
Diffstat (limited to 'nsprpub/lib/prstreams/prstrms.h')
-rw-r--r-- | nsprpub/lib/prstreams/prstrms.h | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/nsprpub/lib/prstreams/prstrms.h b/nsprpub/lib/prstreams/prstrms.h new file mode 100644 index 000000000..319dbf9de --- /dev/null +++ b/nsprpub/lib/prstreams/prstrms.h @@ -0,0 +1,140 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* + * Robin J. Maxwell 11-22-96 + * Fredrik Roubert <roubert@google.com> 2010-07-23 + * Matt Austern <austern@google.com> 2010-07-23 + */ + +#ifndef _PRSTRMS_H +#define _PRSTRMS_H + +#include <cstddef> +#include <istream> +#include <ostream> +#include <streambuf> + +#include "prio.h" + +#ifdef _MSC_VER +// http://support.microsoft.com/kb/q168958/ +class PR_IMPLEMENT(std::_Mutex); +class PR_IMPLEMENT(std::ios_base); +#endif + + +class PR_IMPLEMENT(PRfilebuf): public std::streambuf +{ +public: + PRfilebuf(); + PRfilebuf(PRFileDesc *fd); + PRfilebuf(PRFileDesc *fd, char_type *ptr, std::streamsize len); + virtual ~PRfilebuf(); + + bool is_open() const { return _fd != NULL; } + + PRfilebuf *open( + const char *name, + std::ios_base::openmode flags, + PRIntn mode); + PRfilebuf *attach(PRFileDesc *fd); + PRfilebuf *close(); + +protected: + virtual std::streambuf *setbuf(char_type *ptr, std::streamsize len); + virtual pos_type seekoff( + off_type offset, + std::ios_base::seekdir dir, + std::ios_base::openmode flags); + virtual pos_type seekpos( + pos_type pos, + std::ios_base::openmode flags) { + return seekoff(pos, std::ios_base::beg, flags); + } + virtual int sync(); + virtual int_type underflow(); + virtual int_type overflow(int_type c = traits_type::eof()); + + // TODO: Override pbackfail(), showmanyc(), uflow(), xsgetn(), and xsputn(). + +private: + bool allocate(); + void setb(char_type *buf_base, char_type *buf_end, bool user_buf); + + PRFileDesc *_fd; + bool _opened; + bool _allocated; + bool _unbuffered; + bool _user_buf; + char_type *_buf_base; + char_type *_buf_end; +}; + + +class PR_IMPLEMENT(PRifstream): public std::istream +{ +public: + PRifstream(); + PRifstream(PRFileDesc *fd); + PRifstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); + PRifstream(const char *name, openmode flags = in, PRIntn mode = 0); + virtual ~PRifstream(); + + PRfilebuf *rdbuf() const { return &_filebuf; } + bool is_open() const { return _filebuf.is_open(); } + + void open(const char *name, openmode flags = in, PRIntn mode = 0); + void attach(PRFileDesc *fd); + void close(); + +private: + mutable PRfilebuf _filebuf; +}; + + +class PR_IMPLEMENT(PRofstream): public std::ostream +{ +public: + PRofstream(); + PRofstream(PRFileDesc *fd); + PRofstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); + PRofstream(const char *name, openmode flags = out, PRIntn mode = 0); + virtual ~PRofstream(); + + PRfilebuf *rdbuf() const { return &_filebuf; } + bool is_open() const { return _filebuf.is_open(); } + + void open(const char *name, openmode flags = out, PRIntn mode = 0); + void attach(PRFileDesc *fd); + void close(); + +private: + mutable PRfilebuf _filebuf; +}; + + +class PR_IMPLEMENT(PRfstream): public std::iostream +{ +public: + PRfstream(); + PRfstream(PRFileDesc *fd); + PRfstream(PRFileDesc *fd, char_type *ptr, std::streamsize len); + PRfstream(const char *name, openmode flags = in | out, PRIntn mode = 0); + virtual ~PRfstream(); + + PRfilebuf *rdbuf() const { return &_filebuf; } + bool is_open() const { return _filebuf.is_open(); } + + void open(const char *name, openmode flags = in | out, PRIntn mode = 0); + void attach(PRFileDesc *fd); + void close(); + +private: + mutable PRfilebuf _filebuf; +}; + + +#endif /* _PRSTRMS_H */ |