Migrating to new directory structure adopted from the RealVNC's source tree. More changes will follow.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@591 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/win/rfbplayer/RfbProto.cxx b/win/rfbplayer/RfbProto.cxx
new file mode 100644
index 0000000..5a7ff7f
--- /dev/null
+++ b/win/rfbplayer/RfbProto.cxx
@@ -0,0 +1,142 @@
+/* Copyright (C) 2004 TightVNC Team. 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.
+ */
+
+// -=- RFB Protocol
+
+#include <rfb/Exception.h>
+#include <rfb/LogWriter.h>
+
+#include <rfbplayer/RfbProto.h>
+
+using namespace rfb;
+
+static LogWriter vlog("RfbProto");
+
+//
+// Constructor
+//
+
+RfbProto::RfbProto(char *fileName) {
+ is = NULL;
+ reader = NULL;
+ newSession(fileName);
+}
+
+//
+// Destructor
+//
+
+RfbProto::~RfbProto() {
+ if (is) delete is;
+ is = 0;
+ if (reader) delete reader;
+ reader = 0;
+}
+
+void RfbProto::newSession(char *fileName) {
+ // Close the previous session
+ if (is) {
+ delete is;
+ is = NULL;
+ delete reader;
+ reader = NULL;
+ }
+
+ // Begin the new session
+ if (fileName != NULL) {
+ is = new FbsInputStream(fileName);
+ reader = new CMsgReaderV3(this, is);
+ initialiseProtocol();
+ }
+}
+
+void RfbProto::initialiseProtocol() {
+ state_ = RFBSTATE_PROTOCOL_VERSION;
+}
+
+void RfbProto::processMsg()
+{
+ switch (state_) {
+
+ case RFBSTATE_PROTOCOL_VERSION: processVersionMsg(); break;
+ case RFBSTATE_SECURITY: processSecurityMsg(); break;
+ case RFBSTATE_INITIALISATION: processInitMsg(); break;
+ case RFBSTATE_NORMAL: reader->readMsg(); break;
+ default:
+ throw rfb::Exception("RfbProto::processMsg: invalid state");
+ }
+}
+
+void RfbProto::processVersionMsg()
+{
+ vlog.debug("reading protocol version");
+ memset(&cp, 0, sizeof(cp));
+ bool done;
+ if (!cp.readVersion(is, &done)) {
+ state_ = RFBSTATE_INVALID;
+ throw rfb::Exception("reading version failed: wrong file format?");
+ }
+ if (!done) return;
+
+ // The only official RFB protocol versions are currently 3.3, 3.7 and 3.8
+ if (!cp.isVersion(3,3) && !cp.isVersion(3,7) && !cp.isVersion(3,8)) {
+ char msg[256];
+ sprintf(msg,"File have unsupported RFB protocol version %d.%d",
+ cp.majorVersion, cp.minorVersion);
+ state_ = RFBSTATE_INVALID;
+ throw rfb::Exception(msg);
+ }
+
+ state_ = RFBSTATE_SECURITY;
+
+ vlog.info("Using RFB protocol version %d.%d",
+ cp.majorVersion, cp.minorVersion);
+}
+
+void RfbProto::processSecurityMsg()
+{
+ vlog.debug("processing security types message");
+
+ int secType = secTypeInvalid;
+
+ // legacy 3.3 server may only offer "vnc authentication" or "none"
+ secType = is->readU32();
+ if (secType == secTypeInvalid) {
+ int reasonLen = is->readU32();
+ char *reason = new char[reasonLen];
+ is->readBytes(reason, reasonLen);
+ throw rfb::Exception(reason);
+ }
+
+ if (secType != secTypeNone) {
+ throw rfb::Exception("Wrong authentication type in the session file");
+ }
+
+ state_ = RFBSTATE_INITIALISATION;
+}
+
+void RfbProto::processInitMsg() {
+ vlog.debug("reading server initialisation");
+ reader->readServerInit();
+}
+
+void RfbProto::serverInit()
+{
+ state_ = RFBSTATE_NORMAL;
+ vlog.debug("initialisation done");
+}