diff options
author | Pierre Ossman <ossman@cendio.se> | 2015-02-13 13:46:16 +0100 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2015-02-13 13:46:16 +0100 |
commit | f481203dc078287447b4367769c890ab7815d7cf (patch) | |
tree | 9966c58ac0bae953c99c0502f2b563b331eeda8e /common/rdr | |
parent | c4bc5a8f0eeacbebb50a2ef79c7b03b64586475a (diff) | |
parent | 4daa7b1172cd4606b60f8245831bc5aa155c4b9e (diff) | |
download | tigervnc-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.txt | 1 | ||||
-rw-r--r-- | common/rdr/FileInStream.cxx | 87 | ||||
-rw-r--r-- | common/rdr/FileInStream.h | 50 |
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 |