Skip to content
Commits on Source (22)
tigervnc-tags
*.[ao]
*.mo
*.la
*.lo
.deps
.libs
CMakeFiles
CMakeCache.txt
*.cmake
Makefile
Makefile.in
config.h
language:
- c++
- java
# Travis is still stuck on Ubuntu 14.04, which has a too old FLTK
before_install:
- wget http://fltk.org/pub/fltk/1.3.4/fltk-1.3.4-2-source.tar.gz
- tar -xvf fltk-1.3.4-2-source.tar.gz
- pushd fltk-1.3.4-2
- ./configure --prefix=/usr --enable-shared
- make -j2
- sudo make install
- popd
script:
- cmake . && make
- cd java && cmake . && make
......@@ -158,8 +158,8 @@ The following procedure will build both the TigerVNC Viewer and a
"legacy-friendly" version of the TigerVNC Server:
cd {build_directory}
sh {source_directory}/contrib/xorg/build-xorg init
sh {source_directory}/contrib/xorg/build-xorg build [additional CMake flags]
bash {source_directory}/contrib/xorg/build-xorg init
bash {source_directory}/contrib/xorg/build-xorg build [additional CMake flags]
build-xorg generates a version of Xvnc that has no external dependencies on the
X11 shared libraries or any other distribution-specific shared libraries. This
......
......@@ -2,7 +2,7 @@
# Setup
#
cmake_minimum_required(VERSION 2.8)
cmake_minimum_required(VERSION 2.8.11)
if(POLICY CMP0022)
cmake_policy(SET CMP0022 OLD)
endif()
......@@ -21,10 +21,10 @@ include(CheckCSourceRuns)
include(CMakeMacroLibtoolFile)
project(tigervnc)
set(VERSION 1.9.0)
set(VERSION 1.10.1)
# The RC version must always be four comma-separated numbers
set(RCVERSION 1,9,0,0)
set(RCVERSION 1,10,1,0)
# Installation paths
set(BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin")
......@@ -43,9 +43,7 @@ if(MSVC)
endif()
if(NOT BUILD_TIMESTAMP)
set(BUILD_TIMESTAMP "")
execute_process(COMMAND "date" "+%Y-%m-%d %H:%M" OUTPUT_VARIABLE BUILD_TIMESTAMP)
string(REGEX REPLACE "\n" "" BUILD_TIMESTAMP ${BUILD_TIMESTAMP})
STRING(TIMESTAMP BUILD_TIMESTAMP "%Y-%m-%d %H:%M" UTC)
endif()
# Default to optimised builds instead of debug ones. Our code has no bugs ;)
......@@ -76,8 +74,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat=2")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wformat=2")
# Make sure we catch these issues whilst developing
IF(CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=vla")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Werror=vla")
ENDIF()
option(ENABLE_ASAN "Enable address sanitizer support" OFF)
......
......@@ -34,7 +34,7 @@ Incomplete and generally out of date copyright list::
Copyright (C) 2009-2011 D. R. Commander
Copyright (C) 2009-2011 Pierre Ossman for Cendio AB
Copyright (C) 2004, 2009-2011 Red Hat, Inc.
Copyright (C) 2009-2018 TigerVNC Team
Copyright (C) 2009-2019 TigerVNC Team
All Rights Reserved.
This software is distributed under the GNU General Public Licence as published
......
......@@ -19,10 +19,7 @@ if(BUILD_STATIC)
set(BUILD_STATIC_GCC 1)
set(JPEG_LIBRARIES "-Wl,-Bstatic -ljpeg -Wl,-Bdynamic")
if(WIN32)
set(ZLIB_LIBRARIES "-Wl,-Bstatic -lz -Wl,-Bdynamic")
endif()
# gettext is included in libc on many unix systems
if(NOT LIBC_HAS_DGETTEXT)
......@@ -44,7 +41,7 @@ if(BUILD_STATIC)
set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -ltasn1")
endif()
if(NETTLE_LIBRARY)
set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -lnettle -lhogweed -lgmp")
set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -lhogweed -lnettle -lgmp")
endif()
if(GCRYPT_LIBRARY)
set(GNUTLS_LIBRARIES "${GNUTLS_LIBRARIES} -lgcrypt -lgpg-error")
......@@ -91,7 +88,7 @@ if(BUILD_STATIC)
if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
set(FLTK_LIBRARIES "${FLTK_LIBRARIES} ${X11_Xcursor_LIB} ${X11_Xfixes_LIB} -Wl,-Bstatic -lXft -Wl,-Bdynamic -lfontconfig -lXrender -lXext -R/usr/sfw/lib -L=/usr/sfw/lib -lfreetype -lsocket -lnsl")
else()
set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -Wl,-Bstatic -lXcursor -lXfixes -lXft -lfontconfig -lexpat -lfreetype -lpng -lbz2 -lXrender -lXext -lXinerama -Wl,-Bdynamic")
set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -Wl,-Bstatic -lXcursor -lXfixes -lXft -lfontconfig -lexpat -lfreetype -lpng -lbz2 -luuid -lXrender -lXext -lXinerama -Wl,-Bdynamic")
endif()
set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -lX11")
......
......@@ -144,15 +144,6 @@ namespace network {
// This is only necessary if the Socket has been put in non-blocking
// mode and needs this callback to flush the buffer.
virtual void processSocketWriteEvent(network::Socket* sock) = 0;
// checkTimeouts() allows the server to check socket timeouts, etc. The
// return value is the number of milliseconds to wait before
// checkTimeouts() should be called again. If this number is zero then
// there is no timeout and checkTimeouts() should be called the next time
// an event occurs.
virtual int checkTimeouts() = 0;
virtual bool getDisable() {return false;};
};
}
......
......@@ -736,7 +736,7 @@ char* TcpFilter::patternToStr(const TcpFilter::Pattern& p) {
buffer + 1, sizeof (buffer) - 2, NULL, 0, NI_NUMERICHOST);
strcat(buffer, "]");
addr.buf = rfb::strDup(buffer);
} else if (p.address.u.sa.sa_family == AF_UNSPEC)
} else
addr.buf = rfb::strDup("");
char action;
......
......@@ -56,7 +56,7 @@ using namespace rdr;
enum { DEFAULT_BUF_SIZE = 8192,
MIN_BULK_SIZE = 1024 };
FdInStream::FdInStream(int fd_, int timeoutms_, int bufSize_,
FdInStream::FdInStream(int fd_, int timeoutms_, size_t bufSize_,
bool closeWhenDone_)
: fd(fd_), closeWhenDone(closeWhenDone_),
timeoutms(timeoutms_), blockCallback(0),
......@@ -67,7 +67,7 @@ FdInStream::FdInStream(int fd_, int timeoutms_, int bufSize_,
}
FdInStream::FdInStream(int fd_, FdInStreamBlockCallback* blockCallback_,
int bufSize_)
size_t bufSize_)
: fd(fd_), timeoutms(0), blockCallback(blockCallback_),
timing(false), timeWaitedIn100us(5), timedKbits(0),
bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0)
......@@ -92,12 +92,12 @@ void FdInStream::setBlockCallback(FdInStreamBlockCallback* blockCallback_)
timeoutms = 0;
}
int FdInStream::pos()
size_t FdInStream::pos()
{
return offset + ptr - start;
}
void FdInStream::readBytes(void* data, int length)
void FdInStream::readBytes(void* data, size_t length)
{
if (length < MIN_BULK_SIZE) {
InStream::readBytes(data, length);
......@@ -106,7 +106,7 @@ void FdInStream::readBytes(void* data, int length)
U8* dataPtr = (U8*)data;
int n = end - ptr;
size_t n = end - ptr;
if (n > length) n = length;
memcpy(dataPtr, ptr, n);
......@@ -123,7 +123,7 @@ void FdInStream::readBytes(void* data, int length)
}
int FdInStream::overrun(int itemSize, int nItems, bool wait)
size_t FdInStream::overrun(size_t itemSize, size_t nItems, bool wait)
{
if (itemSize > bufSize)
throw Exception("FdInStream overrun: max itemSize exceeded");
......@@ -135,8 +135,8 @@ int FdInStream::overrun(int itemSize, int nItems, bool wait)
end -= ptr - start;
ptr = start;
int bytes_to_read;
while (end < start + itemSize) {
size_t bytes_to_read;
while ((size_t)(end - start) < itemSize) {
bytes_to_read = start + bufSize - end;
if (!timing) {
// When not timing, we must be careful not to read too much
......@@ -147,13 +147,15 @@ int FdInStream::overrun(int itemSize, int nItems, bool wait)
// bytes is ineffecient.
bytes_to_read = vncmin(bytes_to_read, vncmax(itemSize*nItems, 8));
}
int n = readWithTimeoutOrCallback((U8*)end, bytes_to_read, wait);
size_t n = readWithTimeoutOrCallback((U8*)end, bytes_to_read, wait);
if (n == 0) return 0;
end += n;
}
if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;
size_t nAvail;
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......@@ -171,7 +173,7 @@ int FdInStream::overrun(int itemSize, int nItems, bool wait)
// returning EINTR.
//
int FdInStream::readWithTimeoutOrCallback(void* buf, int len, bool wait)
size_t FdInStream::readWithTimeoutOrCallback(void* buf, size_t len, bool wait)
{
struct timeval before, after;
if (timing)
......@@ -215,20 +217,10 @@ int FdInStream::readWithTimeoutOrCallback(void* buf, int len, bool wait)
if (timing) {
gettimeofday(&after, 0);
// fprintf(stderr,"%d.%06d\n",(after.tv_sec - before.tv_sec),
// (after.tv_usec - before.tv_usec));
int newTimeWaited = ((after.tv_sec - before.tv_sec) * 10000 +
(after.tv_usec - before.tv_usec) / 100);
int newKbits = n * 8 / 1000;
// if (newTimeWaited == 0) {
// fprintf(stderr,"new kbps infinite t %d k %d\n",
// newTimeWaited, newKbits);
// } else {
// fprintf(stderr,"new kbps %d t %d k %d\n",
// newKbits * 10000 / newTimeWaited, newTimeWaited, newKbits);
// }
// limit rate to between 10kbit/s and 40Mbit/s
if (newTimeWaited > newKbits*1000) newTimeWaited = newKbits*1000;
......
......@@ -37,16 +37,17 @@ namespace rdr {
public:
FdInStream(int fd, int timeoutms=-1, int bufSize=0,
FdInStream(int fd, int timeoutms=-1, size_t bufSize=0,
bool closeWhenDone_=false);
FdInStream(int fd, FdInStreamBlockCallback* blockCallback, int bufSize=0);
FdInStream(int fd, FdInStreamBlockCallback* blockCallback,
size_t bufSize=0);
virtual ~FdInStream();
void setTimeout(int timeoutms);
void setBlockCallback(FdInStreamBlockCallback* blockCallback);
int getFd() { return fd; }
int pos();
void readBytes(void* data, int length);
size_t pos();
void readBytes(void* data, size_t length);
void startTiming();
void stopTiming();
......@@ -54,10 +55,10 @@ namespace rdr {
unsigned int timeWaited() { return timeWaitedIn100us; }
protected:
int overrun(int itemSize, int nItems, bool wait);
size_t overrun(size_t itemSize, size_t nItems, bool wait);
private:
int readWithTimeoutOrCallback(void* buf, int len, bool wait=true);
size_t readWithTimeoutOrCallback(void* buf, size_t len, bool wait=true);
int fd;
bool closeWhenDone;
......@@ -68,8 +69,8 @@ namespace rdr {
unsigned int timeWaitedIn100us;
unsigned int timedKbits;
int bufSize;
int offset;
size_t bufSize;
size_t offset;
U8* start;
};
......
......@@ -51,7 +51,7 @@ using namespace rdr;
enum { DEFAULT_BUF_SIZE = 16384 };
FdOutStream::FdOutStream(int fd_, bool blocking_, int timeoutms_, int bufSize_)
FdOutStream::FdOutStream(int fd_, bool blocking_, int timeoutms_, size_t bufSize_)
: fd(fd_), blocking(blocking_), timeoutms(timeoutms_),
bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_SIZE), offset(0)
{
......@@ -79,7 +79,7 @@ void FdOutStream::setBlocking(bool blocking_) {
blocking = blocking_;
}
int FdOutStream::length()
size_t FdOutStream::length()
{
return offset + ptr - sentUpTo;
}
......@@ -97,7 +97,7 @@ unsigned FdOutStream::getIdleTime()
void FdOutStream::flush()
{
while (sentUpTo < ptr) {
int n = writeWithTimeout((const void*) sentUpTo,
size_t n = writeWithTimeout((const void*) sentUpTo,
ptr - sentUpTo,
blocking? timeoutms : 0);
......@@ -120,7 +120,7 @@ void FdOutStream::flush()
}
int FdOutStream::overrun(int itemSize, int nItems)
size_t FdOutStream::overrun(size_t itemSize, size_t nItems)
{
if (itemSize > bufSize)
throw Exception("FdOutStream overrun: max itemSize exceeded");
......@@ -129,10 +129,10 @@ int FdOutStream::overrun(int itemSize, int nItems)
flush();
// Still not enough space?
if (itemSize > end - ptr) {
if (itemSize > (size_t)(end - ptr)) {
// Can we shuffle things around?
// (don't do this if it gains us less than 25%)
if ((sentUpTo - start > bufSize / 4) &&
if (((size_t)(sentUpTo - start) > bufSize / 4) &&
(itemSize < bufSize - (ptr - sentUpTo))) {
memmove(start, sentUpTo, ptr - sentUpTo);
ptr = start + (ptr - sentUpTo);
......@@ -149,9 +149,10 @@ int FdOutStream::overrun(int itemSize, int nItems)
}
}
// Can we fit all the items asked for?
if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;
size_t nAvail;
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......@@ -166,7 +167,7 @@ int FdOutStream::overrun(int itemSize, int nItems)
// select() and send() returning EINTR.
//
int FdOutStream::writeWithTimeout(const void* data, int length, int timeoutms)
size_t FdOutStream::writeWithTimeout(const void* data, size_t length, int timeoutms)
{
int n;
......
......@@ -34,7 +34,7 @@ namespace rdr {
public:
FdOutStream(int fd, bool blocking=true, int timeoutms=-1, int bufSize=0);
FdOutStream(int fd, bool blocking=true, int timeoutms=-1, size_t bufSize=0);
virtual ~FdOutStream();
void setTimeout(int timeoutms);
......@@ -42,20 +42,20 @@ namespace rdr {
int getFd() { return fd; }
void flush();
int length();
size_t length();
int bufferUsage();
unsigned getIdleTime();
private:
int overrun(int itemSize, int nItems);
int writeWithTimeout(const void* data, int length, int timeoutms);
size_t overrun(size_t itemSize, size_t nItems);
size_t writeWithTimeout(const void* data, size_t length, int timeoutms);
int fd;
bool blocking;
int timeoutms;
int bufSize;
int offset;
size_t bufSize;
size_t offset;
U8* start;
U8* sentUpTo;
struct timeval lastWrite;
......
......@@ -48,7 +48,7 @@ void FileInStream::reset(void) {
ptr = end = b;
}
int FileInStream::pos()
size_t FileInStream::pos()
{
if (!file)
throw Exception("File is not open");
......@@ -56,9 +56,9 @@ int FileInStream::pos()
return ftell(file) + ptr - b;
}
int FileInStream::overrun(int itemSize, int nItems, bool wait)
size_t FileInStream::overrun(size_t itemSize, size_t nItems, bool wait)
{
if (itemSize > (int)sizeof(b))
if (itemSize > sizeof(b))
throw Exception("FileInStream overrun: max itemSize exceeded");
if (end - ptr != 0)
......@@ -68,7 +68,7 @@ int FileInStream::overrun(int itemSize, int nItems, bool wait)
ptr = b;
while (end < b + itemSize) {
while ((size_t)(end - b) < itemSize) {
size_t n = fread((U8 *)end, b + sizeof(b) - end, 1, file);
if (n == 0) {
if (ferror(file))
......@@ -80,8 +80,10 @@ int FileInStream::overrun(int itemSize, int nItems, bool wait)
end += b + sizeof(b) - end;
}
if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;
size_t nAvail;
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......@@ -35,10 +35,10 @@ namespace rdr {
void reset(void);
int pos();
size_t pos();
protected:
int overrun(int itemSize, int nItems, bool wait = true);
size_t overrun(size_t itemSize, size_t nItems, bool wait = true);
private:
U8 b[131072];
......
......@@ -28,7 +28,7 @@ const int DEFAULT_BUF_LEN = 16384;
static inline int min(int a, int b) {return a<b ? a : b;}
HexInStream::HexInStream(InStream& is, int bufSize_)
HexInStream::HexInStream(InStream& is, size_t bufSize_)
: bufSize(bufSize_ ? bufSize_ : DEFAULT_BUF_LEN), offset(0), in_stream(is)
{
ptr = end = start = new U8[bufSize];
......@@ -50,8 +50,8 @@ bool HexInStream::readHexAndShift(char c, int* v) {
return true;
}
bool HexInStream::hexStrToBin(const char* s, char** data, int* length) {
int l=strlen(s);
bool HexInStream::hexStrToBin(const char* s, char** data, size_t* length) {
size_t l=strlen(s);
if ((l % 2) == 0) {
delete [] *data;
*data = 0; *length = 0;
......@@ -59,7 +59,7 @@ bool HexInStream::hexStrToBin(const char* s, char** data, int* length) {
return true;
*data = new char[l/2];
*length = l/2;
for(int i=0;i<l;i+=2) {
for(size_t i=0;i<l;i+=2) {
int byte = 0;
if (!readHexAndShift(s[i], &byte) ||
!readHexAndShift(s[i+1], &byte))
......@@ -76,11 +76,11 @@ decodeError:
}
int HexInStream::pos() {
size_t HexInStream::pos() {
return offset + ptr - start;
}
int HexInStream::overrun(int itemSize, int nItems, bool wait) {
size_t HexInStream::overrun(size_t itemSize, size_t nItems, bool wait) {
if (itemSize > bufSize)
throw Exception("HexInStream overrun: max itemSize exceeded");
......@@ -91,15 +91,15 @@ int HexInStream::overrun(int itemSize, int nItems, bool wait) {
offset += ptr - start;
ptr = start;
while (end < ptr + itemSize) {
int n = in_stream.check(2, 1, wait);
while ((size_t)(end - ptr) < itemSize) {
size_t n = in_stream.check(2, 1, wait);
if (n == 0) return 0;
const U8* iptr = in_stream.getptr();
const U8* eptr = in_stream.getend();
int length = min((eptr - iptr)/2, start + bufSize - end);
size_t length = min((eptr - iptr)/2, start + bufSize - end);
U8* optr = (U8*) end;
for (int i=0; i<length; i++) {
for (size_t i=0; i<length; i++) {
int v = 0;
readHexAndShift(iptr[i*2], &v);
readHexAndShift(iptr[i*2+1], &v);
......@@ -110,8 +110,10 @@ int HexInStream::overrun(int itemSize, int nItems, bool wait) {
end += length;
}
if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;
size_t nAvail;
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......@@ -26,21 +26,21 @@ namespace rdr {
class HexInStream : public InStream {
public:
HexInStream(InStream& is, int bufSize=0);
HexInStream(InStream& is, size_t bufSize=0);
virtual ~HexInStream();
int pos();
size_t pos();
static bool readHexAndShift(char c, int* v);
static bool hexStrToBin(const char* s, char** data, int* length);
static bool hexStrToBin(const char* s, char** data, size_t* length);
protected:
int overrun(int itemSize, int nItems, bool wait);
size_t overrun(size_t itemSize, size_t nItems, bool wait);
private:
int bufSize;
size_t bufSize;
U8* start;
int offset;
size_t offset;
InStream& in_stream;
};
......
......@@ -23,9 +23,9 @@ using namespace rdr;
const int DEFAULT_BUF_LEN = 16384;
static inline int min(int a, int b) {return a<b ? a : b;}
static inline size_t min(size_t a, size_t b) {return a<b ? a : b;}
HexOutStream::HexOutStream(OutStream& os, int buflen)
HexOutStream::HexOutStream(OutStream& os, size_t buflen)
: out_stream(os), offset(0), bufSize(buflen ? buflen : DEFAULT_BUF_LEN)
{
if (bufSize % 2)
......@@ -48,9 +48,9 @@ char HexOutStream::intToHex(int i) {
throw rdr::Exception("intToHex failed");
}
char* HexOutStream::binToHexStr(const char* data, int length) {
char* HexOutStream::binToHexStr(const char* data, size_t length) {
char* buffer = new char[length*2+1];
for (int i=0; i<length; i++) {
for (size_t i=0; i<length; i++) {
buffer[i*2] = intToHex((data[i] >> 4) & 15);
buffer[i*2+1] = intToHex((data[i] & 15));
if (!buffer[i*2] || !buffer[i*2+1]) {
......@@ -70,9 +70,9 @@ HexOutStream::writeBuffer() {
out_stream.check(2);
U8* optr = out_stream.getptr();
U8* oend = out_stream.getend();
int length = min(ptr-pos, (oend-optr)/2);
size_t length = min(ptr-pos, (oend-optr)/2);
for (int i=0; i<length; i++) {
for (size_t i=0; i<length; i++) {
optr[i*2] = intToHex((pos[i] >> 4) & 0xf);
optr[i*2+1] = intToHex(pos[i] & 0xf);
}
......@@ -84,7 +84,7 @@ HexOutStream::writeBuffer() {
ptr = start;
}
int HexOutStream::length()
size_t HexOutStream::length()
{
return offset + ptr - start;
}
......@@ -95,15 +95,17 @@ HexOutStream::flush() {
out_stream.flush();
}
int
HexOutStream::overrun(int itemSize, int nItems) {
size_t
HexOutStream::overrun(size_t itemSize, size_t nItems) {
if (itemSize > bufSize)
throw Exception("HexOutStream overrun: max itemSize exceeded");
writeBuffer();
if (itemSize * nItems > end - ptr)
nItems = (end - ptr) / itemSize;
size_t nAvail;
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......
......@@ -26,24 +26,24 @@ namespace rdr {
class HexOutStream : public OutStream {
public:
HexOutStream(OutStream& os, int buflen=0);
HexOutStream(OutStream& os, size_t buflen=0);
virtual ~HexOutStream();
void flush();
int length();
size_t length();
static char intToHex(int i);
static char* binToHexStr(const char* data, int length);
static char* binToHexStr(const char* data, size_t length);
private:
void writeBuffer();
int overrun(int itemSize, int nItems);
size_t overrun(size_t itemSize, size_t nItems);
OutStream& out_stream;
U8* start;
int offset;
int bufSize;
size_t offset;
size_t bufSize;
};
}
......
......@@ -41,14 +41,17 @@ namespace rdr {
// for the bytes, zero is returned if the bytes are not immediately
// available.
inline int check(int itemSize, int nItems=1, bool wait=true)
inline size_t check(size_t itemSize, size_t nItems=1, bool wait=true)
{
if (ptr + itemSize * nItems > end) {
if (ptr + itemSize > end)
size_t nAvail;
if (itemSize > (size_t)(end - ptr))
return overrun(itemSize, nItems, wait);
nItems = (end - ptr) / itemSize;
}
nAvail = (end - ptr) / itemSize;
if (nAvail < nItems)
return nAvail;
return nItems;
}
......@@ -56,7 +59,7 @@ namespace rdr {
// be read without blocking. It returns true if this is the case, false
// otherwise. The length must be "small" (less than the buffer size).
inline bool checkNoWait(int length) { return check(length, 1, false)!=0; }
inline bool checkNoWait(size_t length) { return check(length, 1, false)!=0; }
// readU/SN() methods read unsigned and signed N-bit integers.
......@@ -82,9 +85,9 @@ namespace rdr {
static U32 maxStringLength;
inline void skip(int bytes) {
inline void skip(size_t bytes) {
while (bytes > 0) {
int n = check(1, bytes);
size_t n = check(1, bytes);
ptr += n;
bytes -= n;
}
......@@ -92,14 +95,13 @@ namespace rdr {
// readBytes() reads an exact number of bytes.
void readBytes(void* data, int length) {
U8* dataPtr = (U8*)data;
U8* dataEnd = dataPtr + length;
while (dataPtr < dataEnd) {
int n = check(1, dataEnd - dataPtr);
memcpy(dataPtr, ptr, n);
void readBytes(void* data, size_t length) {
while (length > 0) {
size_t n = check(1, length);
memcpy(data, ptr, n);
ptr += n;
dataPtr += n;
data = (U8*)data + n;
length -= n;
}
}
......@@ -114,7 +116,7 @@ namespace rdr {
// pos() returns the position in the stream.
virtual int pos() = 0;
virtual size_t pos() = 0;
// getptr(), getend() and setptr() are "dirty" methods which allow you to
// manipulate the buffer directly. This is useful for a stream which is a
......@@ -133,7 +135,7 @@ namespace rdr {
// instead of blocking to wait for the bytes, zero is returned if the bytes
// are not immediately available.
virtual int overrun(int itemSize, int nItems, bool wait=true) = 0;
virtual size_t overrun(size_t itemSize, size_t nItems, bool wait=true) = 0;
protected:
......
......@@ -36,7 +36,7 @@ namespace rdr {
public:
MemInStream(const void* data, int len, bool deleteWhenDone_=false)
MemInStream(const void* data, size_t len, bool deleteWhenDone_=false)
: start((const U8*)data), deleteWhenDone(deleteWhenDone_)
{
ptr = start;
......@@ -48,12 +48,12 @@ namespace rdr {
delete [] start;
}
int pos() { return ptr - start; }
void reposition(int pos) { ptr = start + pos; }
size_t pos() { return ptr - start; }
void reposition(size_t pos) { ptr = start + pos; }
private:
int overrun(int itemSize, int nItems, bool wait) { throw EndOfStream(); }
size_t overrun(size_t itemSize, size_t nItems, bool wait) { throw EndOfStream(); }
const U8* start;
bool deleteWhenDone;
};
......