]> source.dussan.org Git - tigervnc.git/commitdiff
Add stream class to feed data from a file
authorPierre Ossman <ossman@cendio.se>
Wed, 4 Feb 2015 13:11:42 +0000 (14:11 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 13 Feb 2015 10:13:53 +0000 (11:13 +0100)
common/rdr/CMakeLists.txt
common/rdr/FileInStream.cxx [new file with mode: 0644]
common/rdr/FileInStream.h [new file with mode: 0644]

index cc45f9112fa94ded79d215da654699c87b654a13..989ba2f4bda57ab9a60952560a66e890f8e8f15d 100644 (file)
@@ -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 (file)
index 0000000..18a9169
--- /dev/null
@@ -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 (file)
index 0000000..ace04f3
--- /dev/null
@@ -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