summaryrefslogtreecommitdiff
path: root/noncore/comm/keypebble/krfbdecoder.h
blob: 4ba01856e6199549b6ceab837036ee7c98a02539 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
// -*- c++ -*-

#ifndef KRFBDECODER_H
#define KRFBDECODER_H

#include <qobject.h>

class KRFBConnection;
class KRFBServerInfo;
class KRFBPixelFormat;
class KRFBBuffer;


typedef unsigned char CARD8;
typedef unsigned short CARD16;
typedef unsigned long CARD32;

/**
 * Negotiates the pixel format to be used then decodes the resulting
 * data stream.
 *
 * @author Richard Moore, rich@kde.org
 */
class KRFBDecoder : public QObject
{
  Q_OBJECT

public:
  friend class KRFBBuffer;

  enum State {
    AwaitingServerInit,
    AwaitingDesktopName,
    AwaitingUpdate,
    AwaitingRectHeader,
    AwaitingRawRectChunk,
    AwaitingCopyRectPos,
    AwaitingServerCutLength,
    AwaitingServerCutText,
    Idle,
    Error
  };

  /**
   * Create a KRFBDecoder that reads data from a logged in KRFBConnection
   * and sends its output to a KRFBBuffer.
   */
  KRFBDecoder( KRFBConnection *con );
  ~KRFBDecoder();

  void setBuffer( KRFBBuffer *buf ) { this->buf = buf; };
  void start();

  int toKeySym( QKeyEvent *k );

  //
  // Client -> Server messages
  //
  void sendUpdateRequest( bool incremental );
  void sendMouseEvent( QMouseEvent *e );
  void sendKeyPressEvent( QKeyEvent *e );
  void sendKeyReleaseEvent( QKeyEvent *e );
  void sendCutEvent( const QString &text );

protected:
  //
  // Initial format negotiation
  //
  void decidePixelFormat();
  void sendPixelFormat();
  void sendClientInit();
  void sendAllowedEncodings();

  //
  // Rectange processing
  //
  void handleRawRect();
  void handleCopyRect();
  void handleRRERect();
  void handleCoRRERect();
  void handleHexTileRect();

  void getRawRectChunk( int lines );

protected slots:
  void gotServerInit();
  void gotDesktopName();
  void gotUpdateHeader();
  void gotRectHeader();
  void gotRawRectChunk();
  void gotCopyRectPos();
  void gotServerCut();
  void gotServerCutLength();
  void gotServerCutText();
  void gotBell();

signals:
  void error( const QString & );
  void status( const QString & );

private:
  State currentState;

  // Used to store the state we were in before a cut or bell msg
  State oldState;

  // The number of rects we're expecting
  CARD16 noRects;

  //
  // Info about the current rect.
  //
  CARD16 x, y, w, h;
  int lines;
  CARD32 encoding;

  CARD32 serverCutTextLen;

  /** Where we draw the data (and the source of our events). */
  KRFBBuffer *buf;
  /** The connection to the server. */
  KRFBConnection *con;

  /** Info about the RFB server. */
  KRFBServerInfo *info;
  /** The pixel format we want. */
  KRFBPixelFormat *format;

  CARD8 buttonMask;
};

#endif // KRFBDECODER_H