aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/ClosedFileInputSource.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/ClosedFileInputSource.cc')
-rw-r--r--libqpdf/ClosedFileInputSource.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/libqpdf/ClosedFileInputSource.cc b/libqpdf/ClosedFileInputSource.cc
new file mode 100644
index 00000000..ea79a840
--- /dev/null
+++ b/libqpdf/ClosedFileInputSource.cc
@@ -0,0 +1,103 @@
+#include <qpdf/ClosedFileInputSource.hh>
+#include <qpdf/FileInputSource.hh>
+
+ClosedFileInputSource::Members::Members(char const* filename) :
+ filename(filename),
+ offset(0),
+ fis(0)
+{
+}
+
+ClosedFileInputSource::Members::~Members()
+{
+ if (fis)
+ {
+ delete fis;
+ }
+}
+
+ClosedFileInputSource::ClosedFileInputSource(char const* filename) :
+ m(new Members(filename))
+{
+}
+
+ClosedFileInputSource::~ClosedFileInputSource()
+{
+}
+
+void
+ClosedFileInputSource::before()
+{
+ if (0 == this->m->fis)
+ {
+ this->m->fis = new FileInputSource();
+ this->m->fis->setFilename(this->m->filename.c_str());
+ this->m->fis->seek(this->m->offset, SEEK_SET);
+ this->m->fis->setLastOffset(this->last_offset);
+ }
+}
+
+void
+ClosedFileInputSource::after()
+{
+ this->last_offset = this->m->fis->getLastOffset();
+ this->m->offset = this->m->fis->tell();
+ delete this->m->fis;
+ this->m->fis = 0;
+}
+
+qpdf_offset_t
+ClosedFileInputSource::findAndSkipNextEOL()
+{
+ before();
+ qpdf_offset_t r = this->m->fis->findAndSkipNextEOL();
+ after();
+ return r;
+}
+
+std::string const&
+ClosedFileInputSource::getName() const
+{
+ return this->m->filename;
+}
+
+qpdf_offset_t
+ClosedFileInputSource::tell()
+{
+ before();
+ qpdf_offset_t r = this->m->fis->tell();
+ after();
+ return r;
+}
+
+void
+ClosedFileInputSource::seek(qpdf_offset_t offset, int whence)
+{
+ before();
+ this->m->fis->seek(offset, whence);
+ after();
+}
+
+void
+ClosedFileInputSource::rewind()
+{
+ this->m->offset = 0;
+}
+
+size_t
+ClosedFileInputSource::read(char* buffer, size_t length)
+{
+ before();
+ size_t r = this->m->fis->read(buffer, length);
+ after();
+ return r;
+}
+
+void
+ClosedFileInputSource::unreadCh(char ch)
+{
+ before();
+ this->m->fis->unreadCh(ch);
+ // Don't call after -- the file has to stay open after this
+ // operation.
+}