Merged the rdr library with VNC 4.1.1.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@333 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rdr/Exception.cxx b/rdr/Exception.cxx
index 5f7799f..1fcd154 100644
--- a/rdr/Exception.cxx
+++ b/rdr/Exception.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -17,7 +17,7 @@
  */
 #include <rdr/Exception.h>
 #ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN
+#include <tchar.h>
 #include <windows.h>
 #include <winsock2.h>
 #endif
@@ -25,7 +25,7 @@
 using namespace rdr;
 
 SystemException::SystemException(const char* s, int err_)
-  : Exception(s, "rdr::SystemException"), err(err_)
+  : Exception(s), err(err_)
 {
   strncat(str_, ": ", len-1-strlen(str_));
 #ifdef _WIN32
@@ -48,17 +48,26 @@
 		              str_+strlen(str_), len-strlen(str_), 0, 0);
     delete [] tmsg;
 #else
+    char* currStr = str_+strlen(str_);
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-                  0, err, 0, str_+strlen(str_), len-1-strlen(str_), 0);
+                  0, err, 0, currStr, len-1-strlen(str_), 0);
 #endif
+    int l = strlen(str_);
+    if ((l >= 2) && (str_[l-2] == '\r') && (str_[l-1] == '\n'))
+      str_[l-2] = 0;
   }
-    
+
 #else
   strncat(str_, strerror(err), len-1-strlen(str_));
 #endif
   strncat(str_, " (", len-1-strlen(str_));
   char buf[20];
-  sprintf(buf,"%d",err);
+#ifdef WIN32
+  if (err < 0)
+    sprintf(buf, "%x", err);
+  else
+#endif
+    sprintf(buf,"%d",err);
   strncat(str_, buf, len-1-strlen(str_));
   strncat(str_, ")", len-1-strlen(str_));
 }
diff --git a/rdr/Exception.h b/rdr/Exception.h
index 98b3f0e..1b92f77 100644
--- a/rdr/Exception.h
+++ b/rdr/Exception.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -27,18 +27,14 @@
   struct Exception {
     enum { len = 256 };
     char str_[len];
-    char type_[len];
-    Exception(const char* s=0, const char* e="rdr::Exception") {
+    Exception(const char* s=0) {
       str_[0] = 0;
       if (s)
         strncat(str_, s, len-1);
       else
         strcat(str_, "Exception");
-      type_[0] = 0;
-      strncat(type_, e, len-1);
     }
     virtual const char* str() const { return str_; }
-    virtual const char* type() const { return type_; }
   };
 
   struct SystemException : public Exception {
@@ -47,12 +43,15 @@
   }; 
 
   struct TimedOut : public Exception {
-    TimedOut(const char* s="Timed out") : Exception(s,"rdr::TimedOut") {}
+    TimedOut(const char* s="Timed out") : Exception(s) {}
   };
  
   struct EndOfStream : public Exception {
-    EndOfStream(const char* s="End of stream")
-      : Exception(s,"rdr::EndOfStream") {}
+    EndOfStream(const char* s="End of stream") : Exception(s) {}
+  };
+
+  struct FrameException : public Exception {
+    FrameException(const char* s="Frame exception") : Exception(s) {}
   };
 }
 
diff --git a/rdr/FdInStream.cxx b/rdr/FdInStream.cxx
index b65566d..f64f68e 100644
--- a/rdr/FdInStream.cxx
+++ b/rdr/FdInStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/FdInStream.h b/rdr/FdInStream.h
index d038b1b..5d9598c 100644
--- a/rdr/FdInStream.h
+++ b/rdr/FdInStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/FdOutStream.cxx b/rdr/FdOutStream.cxx
index a9075cc..e65133d 100644
--- a/rdr/FdOutStream.cxx
+++ b/rdr/FdOutStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/FdOutStream.h b/rdr/FdOutStream.h
index 5294b70..a3e2912 100644
--- a/rdr/FdOutStream.h
+++ b/rdr/FdOutStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/FixedMemOutStream.h b/rdr/FixedMemOutStream.h
index f149e60..e4ec52c 100644
--- a/rdr/FixedMemOutStream.h
+++ b/rdr/FixedMemOutStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/HexInStream.cxx b/rdr/HexInStream.cxx
index a454ca8..80f8a79 100644
--- a/rdr/HexInStream.cxx
+++ b/rdr/HexInStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/HexInStream.h b/rdr/HexInStream.h
index fbfc273..6bfb843 100644
--- a/rdr/HexInStream.h
+++ b/rdr/HexInStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/HexOutStream.cxx b/rdr/HexOutStream.cxx
index f82d9f5..9b0b6c4 100644
--- a/rdr/HexOutStream.cxx
+++ b/rdr/HexOutStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/HexOutStream.h b/rdr/HexOutStream.h
index 691a16b..10247e6 100644
--- a/rdr/HexOutStream.h
+++ b/rdr/HexOutStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/InStream.cxx b/rdr/InStream.cxx
index 13a6fa1..a413b6c 100644
--- a/rdr/InStream.cxx
+++ b/rdr/InStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/InStream.h b/rdr/InStream.h
index a3eeaad..6d22ac6 100644
--- a/rdr/InStream.h
+++ b/rdr/InStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/Makefile.in b/rdr/Makefile.in
index 9edf284..09fa554 100644
--- a/rdr/Makefile.in
+++ b/rdr/Makefile.in
@@ -1,6 +1,6 @@
 
 SRCS = Exception.cxx FdInStream.cxx FdOutStream.cxx InStream.cxx \
-       NullOutStream.cxx RandomStream.cxx ZlibInStream.cxx ZlibOutStream.cxx \
+       RandomStream.cxx ZlibInStream.cxx ZlibOutStream.cxx \
        HexInStream.cxx HexOutStream.cxx
 
 OBJS = $(SRCS:.cxx=.o)
diff --git a/rdr/MemInStream.h b/rdr/MemInStream.h
index 2b05e3d..77ca3f3 100644
--- a/rdr/MemInStream.h
+++ b/rdr/MemInStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/MemOutStream.h b/rdr/MemOutStream.h
index 3456f5c..ee3e950 100644
--- a/rdr/MemOutStream.h
+++ b/rdr/MemOutStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -48,6 +48,7 @@
 
     int length() { return ptr - start; }
     void clear() { ptr = start; };
+    void clearAndZero() { memset(start, 0, ptr-start); clear(); }
     void reposition(int pos) { ptr = start + pos; }
 
     // data() returns a pointer to the buffer.
diff --git a/rdr/NullOutStream.cxx b/rdr/NullOutStream.cxx
deleted file mode 100644
index e940f2a..0000000
--- a/rdr/NullOutStream.cxx
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
- * 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 <rdr/NullOutStream.h>
-#include <rdr/Exception.h>
-
-using namespace rdr;
-
-static const int bufferSize = 1024;
-
-NullOutStream::NullOutStream()
-  : offset(0)
-{
-  start = ptr = new U8[bufferSize];
-  end = start + bufferSize;
-}
-
-NullOutStream::~NullOutStream()
-{
-  delete [] start;
-}
-
-int NullOutStream::length()
-{
-  return offset + ptr - start;
-}
-
-void NullOutStream::writeBytes(const void* data, int length)
-{
-  offset += length;
-}
-
-int NullOutStream::overrun(int itemSize, int nItems)
-{
-  if (itemSize > bufferSize)
-    throw Exception("NullOutStream overrun: max itemSize exceeded");
-
-  offset += ptr - start;
-  ptr = start;
-
-  if (itemSize * nItems > end - ptr)
-    nItems = (end - ptr) / itemSize;
-
-  return nItems;
-}
diff --git a/rdr/NullOutStream.h b/rdr/NullOutStream.h
deleted file mode 100644
index 84a56e5..0000000
--- a/rdr/NullOutStream.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
- * 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_NULLOUTSTREAM_H__
-#define __RDR_NULLOUTSTREAM_H__
-
-#include <rdr/OutStream.h>
-
-namespace rdr {
-
-  class NullOutStream : public OutStream {
-
-  public:
-    NullOutStream();
-    virtual ~NullOutStream();
-    int length();
-    void writeBytes(const void* data, int length);
-
-  private:
-    int overrun(int itemSize, int nItems);
-    int offset;
-    U8* start;
-  };
-
-}
-
-#endif
diff --git a/rdr/RandomStream.cxx b/rdr/RandomStream.cxx
index 7f62e09..7056c2c 100644
--- a/rdr/RandomStream.cxx
+++ b/rdr/RandomStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -25,6 +25,9 @@
 #include <errno.h>
 #else
 #define getpid() GetCurrentProcessId()
+#ifndef RFB_HAVE_WINCRYPT
+#pragma message("  NOTE: Not building WinCrypt-based RandomStream")
+#endif
 #endif
 
 using namespace rdr;
@@ -38,7 +41,7 @@
 {
   ptr = end = start = new U8[DEFAULT_BUF_LEN];
 
-#ifdef WIN32
+#ifdef RFB_HAVE_WINCRYPT
   provider = 0;
   if (!CryptAcquireContext(&provider, 0, 0, PROV_RSA_FULL, 0)) {
     if (GetLastError() == NTE_BAD_KEYSET) {
@@ -53,10 +56,14 @@
   }
   if (!provider) {
 #else
+#ifndef WIN32
   fp = fopen("/dev/urandom", "r");
   if (!fp)
     fp = fopen("/dev/random", "r");
   if (!fp) {
+#else
+  {
+#endif
 #endif
     fprintf(stderr,"RandomStream: warning: no OS supplied random source - using rand()\n");
     seed += (unsigned int) time(0) + getpid() + getpid() * 987654 + rand();
@@ -67,11 +74,11 @@
 RandomStream::~RandomStream() {
   delete [] start;
 
-#ifdef WIN32
-  if (provider) {
+#ifdef RFB_HAVE_WINCRYPT
+  if (provider)
     CryptReleaseContext(provider, 0);
-  }
-#else
+#endif
+#ifndef WIN32
   if (fp) fclose(fp);
 #endif
 }
@@ -93,20 +100,25 @@
 
   int length = start + DEFAULT_BUF_LEN - end;
 
-#ifdef WIN32
+#ifdef RFB_HAVE_WINCRYPT
   if (provider) {
     if (!CryptGenRandom(provider, length, (U8*)end))
       throw rdr::SystemException("unable to CryptGenRandom", GetLastError());
     end += length;
+  } else {
 #else
+#ifndef WIN32
   if (fp) {
     int n = fread((U8*)end, length, 1, fp);
     if (n != 1)
       throw rdr::SystemException("reading /dev/urandom or /dev/random failed",
                                  errno);
     end += length;
-#endif
   } else {
+#else
+  {
+#endif
+#endif
     for (int i=0; i<length; i++)
       *(U8*)end++ = (int) (256.0*rand()/(RAND_MAX+1.0));
   }
diff --git a/rdr/RandomStream.h b/rdr/RandomStream.h
index c4aaaa6..c33360d 100644
--- a/rdr/RandomStream.h
+++ b/rdr/RandomStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -23,12 +23,11 @@
 #include <rdr/InStream.h>
 
 #ifdef WIN32
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0400
-#endif
-#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <wincrypt.h>
+#ifdef WINCRYPT32API
+#define RFB_HAVE_WINCRYPT
+#endif
 #endif
 
 namespace rdr {
@@ -50,9 +49,10 @@
     int offset;
 
     static unsigned int seed;
-#ifdef WIN32
+#ifdef RFB_HAVE_WINCRYPT
     HCRYPTPROV provider;
-#else
+#endif
+#ifndef WIN32
     FILE* fp;
 #endif
 
diff --git a/rdr/SubstitutingInStream.h b/rdr/SubstitutingInStream.h
index 3a0559b..325b01c 100644
--- a/rdr/SubstitutingInStream.h
+++ b/rdr/SubstitutingInStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/ZlibInStream.cxx b/rdr/ZlibInStream.cxx
index 52e4dd3..6f3a7d0 100644
--- a/rdr/ZlibInStream.cxx
+++ b/rdr/ZlibInStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/ZlibInStream.h b/rdr/ZlibInStream.h
index 81eb161..c26b6d6 100644
--- a/rdr/ZlibInStream.h
+++ b/rdr/ZlibInStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/ZlibOutStream.cxx b/rdr/ZlibOutStream.cxx
index 6aadde1..181e356 100644
--- a/rdr/ZlibOutStream.cxx
+++ b/rdr/ZlibOutStream.cxx
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/ZlibOutStream.h b/rdr/ZlibOutStream.h
index e51db73..7d737c1 100644
--- a/rdr/ZlibOutStream.h
+++ b/rdr/ZlibOutStream.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
diff --git a/rdr/types.h b/rdr/types.h
index 3798c97..6421b13 100644
--- a/rdr/types.h
+++ b/rdr/types.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2004 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -51,6 +51,16 @@
     U16* buf;
   };
 
+  class U32Array {
+  public:
+    U32Array() : buf(0) {}
+    U32Array(U32* a) : buf(a) {} // note: assumes ownership
+    U32Array(int len) : buf(new U32[len]) {}
+    ~U32Array() { delete [] buf; }
+    U32* takeBuf() { U32* tmp = buf; buf = 0; return tmp; }
+    U32* buf;
+  };
+
 } // end of namespace rdr
 
 #endif
diff --git a/rfb/Exception.h b/rfb/Exception.h
index aa98271..7c2cbca 100644
--- a/rfb/Exception.h
+++ b/rfb/Exception.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 2002-2003 RealVNC Ltd.  All Rights Reserved.
- *    
+/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * 
  * 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
@@ -21,17 +21,17 @@
 #include <rdr/Exception.h>
 
 namespace rfb {
-  struct Exception : public rdr::Exception {
-    Exception(const char* s=0, const char* e="rfb::Exception")
-      : rdr::Exception(s,e) {}
-  };
+  typedef rdr::Exception Exception;
   struct AuthFailureException : public Exception {
     AuthFailureException(const char* s="Authentication failure")
-      : Exception(s,"rfb::AuthFailureException") {}
+      : Exception(s) {}
+  };
+  struct AuthCancelledException : public rfb::Exception {
+    AuthCancelledException(const char* s="Authentication cancelled")
+      : Exception(s) {}
   };
   struct ConnFailedException : public Exception {
-    ConnFailedException(const char* s="Connection failed")
-      : Exception(s,"rfb::ConnFailedException") {}
+    ConnFailedException(const char* s="Connection failed") : Exception(s) {}
   };
 }
 #endif