Added RfbPlayer::processMsg().
It is used for processing the rfb protocol messages.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@135 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfbplayer/rfbplayer.cxx b/rfbplayer/rfbplayer.cxx
index 41f36ca..627de14 100644
--- a/rfbplayer/rfbplayer.cxx
+++ b/rfbplayer/rfbplayer.cxx
@@ -288,8 +288,8 @@
       break;
     case ID_STOP:
       if (getTimeOffset() != 0) {
-        setPaused(true);
         setPos(0);
+        setPaused(true);
       }
       tb.checkButton(ID_STOP, true);
       tb.checkButton(ID_PLAY, false);
@@ -688,9 +688,43 @@
 }
 
 void RfbPlayer::rewind() {
+  bool paused = isPaused();
   blankBuffer();
   newSession(fileName);
   skipHandshaking();
+  setSpeed(playbackSpeed);
+  setPaused(paused);
+}
+
+void RfbPlayer::processMsg() {
+  static long update_time = GetTickCount();
+  try {
+    if ((!isSeeking()) && ((GetTickCount() - update_time) > 250)) {
+      // Update pos in the toolbar 4 times in 1 second
+      updatePos();
+      update_time = GetTickCount();
+    }
+    RfbProto::processMsg();
+  } catch (rdr::Exception e) {
+    if (strcmp(e.str(), "[End Of File]") == 0) {
+      rewind();
+      setPaused(true);
+      tb.checkButton(ID_STOP, true);
+      tb.checkButton(ID_PAUSE, false);
+      tb.checkButton(ID_PLAY, false);
+      return;
+    }
+    // It's a special exception to perform backward seeking.
+    // We only rewind the stream and seek the offset
+    if (strcmp(e.str(), "[REWIND]") == 0) {
+      long initTime = getSeekOffset();
+      rewind();
+      setPos(initTime);
+    } else {
+      MessageBox(getMainHandle(), e.str(), e.type(), MB_OK | MB_ICONERROR);
+      return;
+    }
+  }
 }
 
 void RfbPlayer::serverInit() {
@@ -787,6 +821,7 @@
 void RfbPlayer::setSpeed(double speed) {
   serverInitTime = serverInitTime * getSpeed() / speed;
   is->setSpeed(speed);
+  playbackSpeed = speed;
 }
 
 double RfbPlayer::getSpeed() {
diff --git a/rfbplayer/rfbplayer.h b/rfbplayer/rfbplayer.h
index 062c715..e40265e 100644
--- a/rfbplayer/rfbplayer.h
+++ b/rfbplayer/rfbplayer.h
@@ -90,6 +90,7 @@
 
     // -=- RfbProto interface overrides
 
+    virtual void processMsg();
     virtual void serverInit();
     virtual void frameBufferUpdateEnd();
     virtual void setColourMapEntries(int first, int count, U16* rgbs);