Пример #1
0
  void doProtocolInitialisation(int dx, int dy) throws IOException {
    rfb.writeClientInit();
    rfb.readServerInit();

    initializeBitmap(dx, dy);
    decoder.setPixelFormat(rfb);
  }
Пример #2
0
  public void processProtocol(VncCanvas vncCanvas, boolean useLocalCursor) throws Exception {
    boolean exitforloop = false;
    int msgType = 0;

    try {
      setEncodings(useLocalCursor);
      vncCanvas.writeFullUpdateRequest(false);

      //
      // main dispatch loop
      //
      while (maintainConnection) {
        exitforloop = false;
        if (!vncCanvas.useFull) {
          vncCanvas.syncScroll();
          // Read message type from the server.
          msgType = readServerMessageType();
          vncCanvas.doneWaiting();
        } else msgType = readServerMessageType();

        // Process the message depending on its type.
        switch (msgType) {
          case RfbProto.FramebufferUpdate:
            readFramebufferUpdate();

            for (int i = 0; i < updateNRects; i++) {
              readFramebufferUpdateRectHdr();

              switch (updateRectEncoding) {
                case RfbProto.EncodingTight:
                  decoder.handleTightRect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingPointerPos:
                  vncCanvas.softCursorMove(updateRectX, updateRectY);
                  break;
                case RfbProto.EncodingXCursor:
                case RfbProto.EncodingRichCursor:
                  decoder.handleCursorShapeUpdate(
                      this, updateRectEncoding, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingLastRect:
                  exitforloop = true;
                  break;
                case RfbProto.EncodingCopyRect:
                  decoder.handleCopyRect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingNewFBSize:
                  setFramebufferSize(updateRectW, updateRectH);
                  vncCanvas.updateFBSize();
                  exitforloop = true;
                  break;
                case RfbProto.EncodingRaw:
                  decoder.handleRawRect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingRRE:
                  decoder.handleRRERect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingCoRRE:
                  decoder.handleCoRRERect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingHextile:
                  decoder.handleHextileRect(
                      this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingZRLE:
                  decoder.handleZRLERect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                case RfbProto.EncodingZlib:
                  decoder.handleZlibRect(this, updateRectX, updateRectY, updateRectW, updateRectH);
                  break;
                default:
                  Log.e(
                      TAG,
                      "Unknown RFB rectangle encoding "
                          + updateRectEncoding
                          + " (0x"
                          + Integer.toHexString(updateRectEncoding)
                          + ")");
              }

              if (exitforloop) {
                exitforloop = false;
                break;
              }
            }

            if (decoder.isChangedColorModel()) {
              decoder.setPixelFormat(this);
              // setEncodings(useLocalCursor);
              vncCanvas.writeFullUpdateRequest(false);
            } else {
              // setEncodings(useLocalCursor);
              vncCanvas.writeFullUpdateRequest(true);
            }
            break;

          case RfbProto.SetColourMapEntries:
            throw new Exception("Can't handle SetColourMapEntries message");

          case RfbProto.Bell:
            vncCanvas.displayShortToastMessage("VNC Beep");
            break;

          case RfbProto.ServerCutText:
            vncCanvas.serverJustCutText = true;
            vncCanvas.setClipboardText(readServerCutText());
            break;

          case RfbProto.TextChat:
            // UltraVNC extension
            String msg = readTextChatMsg();
            if (msg != null && msg.length() > 0) {
              // TODO implement chat interface
            }
            break;

          default:
            throw new Exception("Unknown RFB message type " + msgType);
        }
      }
    } catch (Exception e) {
      closeSocket();
      throw e;
    } finally {
      closeSocket();
      Log.v(TAG, "Closing VNC Connection");
    }
    closeSocket();
  }