summaryrefslogtreecommitdiffstats
path: root/common/rdr
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2015-02-13 13:46:16 +0100
committerPierre Ossman <ossman@cendio.se>2015-02-13 13:46:16 +0100
commitf481203dc078287447b4367769c890ab7815d7cf (patch)
tree9966c58ac0bae953c99c0502f2b563b331eeda8e /common/rdr
parentc4bc5a8f0eeacbebb50a2ef79c7b03b64586475a (diff)
parent4daa7b1172cd4606b60f8245831bc5aa155c4b9e (diff)
downloadtigervnc-f481203dc078287447b4367769c890ab7815d7cf.tar.gz
tigervnc-f481203dc078287447b4367769c890ab7815d7cf.zip
Merge branch 'perf' of https://github.com/CendioOssman/tigervnc
Diffstat (limited to 'common/rdr')
-rw-r--r--common/rdr/CMakeLists.txt1
-rw-r--r--common/rdr/FileInStream.cxx87
-rw-r--r--common/rdr/FileInStream.h50
3 files changed, 138 insertions, 0 deletions
diff --git a/common/rdr/CMakeLists.txt b/common/rdr/CMakeLists.txt
index cc45f911..989ba2f4 100644
--- a/common/rdr/CMakeLists.txt
+++ b/common/rdr/CMakeLists.txt
@@ -4,6 +4,7 @@ add_library(rdr STATIC
Exception.cxx
FdInStream.cxx
FdOutStream.cxx
+ FileInStream.cxx
HexInStream.cxx
HexOutStream.cxx
InStream.cxx
diff --git a/common/rdr/FileInStream.cxx b/common/rdr/FileInStream.cxx
new file mode 100644
index 00000000..18a9169d
--- /dev/null
+++ b/common/rdr/FileInStream.cxx
@@ -0,0 +1,87 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
+ * Copyright (C) 2013 D. R. Commander. All Rights Reserved.
+ * Copyright 2015 Pierre Ossman for Cendio AB
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#include <errno.h>
+
+#include <rdr/Exception.h>
+#include <rdr/FileInStream.h>
+
+using namespace rdr;
+
+FileInStream::FileInStream(const char *fileName)
+{
+ file = fopen(fileName, "rb");
+ if (!file)
+ throw SystemException("fopen", errno);
+ ptr = end = b;
+}
+
+FileInStream::~FileInStream(void) {
+ if (file) {
+ fclose(file);
+ file = NULL;
+ }
+}
+
+void FileInStream::reset(void) {
+ if (!file)
+ throw Exception("File is not open");
+ if (fseek(file, 0, SEEK_SET) != 0)
+ throw SystemException("fseek", errno);
+ ptr = end = b;
+}
+
+int FileInStream::pos()
+{
+ if (!file)
+ throw Exception("File is not open");
+
+ return ftell(file) + ptr - b;
+}
+
+int FileInStream::overrun(int itemSize, int nItems, bool wait)
+{
+ if (itemSize > sizeof(b))
+ throw Exception("FileInStream overrun: max itemSize exceeded");
+
+ if (end - ptr != 0)
+ memmove(b, ptr, end - ptr);
+
+ end -= ptr - b;
+ ptr = b;
+
+
+ while (end < b + itemSize) {
+ size_t n = fread((U8 *)end, b + sizeof(b) - end, 1, file);
+ if (n < 1) {
+ if (n < 0 || ferror(file))
+ throw Exception(strerror(errno));
+ if (feof(file))
+ throw EndOfStream();
+ if (n == 0) { return 0; }
+ }
+ end += b + sizeof(b) - end;
+ }
+
+ if (itemSize * nItems > end - ptr)
+ nItems = (end - ptr) / itemSize;
+
+ return nItems;
+}
diff --git a/common/rdr/FileInStream.h b/common/rdr/FileInStream.h
new file mode 100644
index 00000000..ace04f37
--- /dev/null
+++ b/common/rdr/FileInStream.h
@@ -0,0 +1,50 @@
+/* Copyright (C) 2013 D. R. Commander. All Rights Reserved.
+ * Copyright 2015 Pierre Ossman for Cendio AB
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+#ifndef __RDR_FILEINSTREAM_H__
+#define __RDR_FILEINSTREAM_H__
+
+#include <stdio.h>
+
+#include <rdr/InStream.h>
+
+namespace rdr {
+
+ class FileInStream : public InStream {
+
+ public:
+
+ FileInStream(const char *fileName);
+ ~FileInStream(void);
+
+ void reset(void);
+
+ int pos();
+
+ protected:
+ int overrun(int itemSize, int nItems, bool wait = true);
+
+ private:
+ U8 b[131072];
+ FILE *file;
+ };
+
+} // end of namespace rdr
+
+#endif