update about dialog
[presencevnc] / src / vncclientthread.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2007-2008 Urs Wolfer <uwolfer @ kde.org>
4 **
5 ** This file is part of KDE.
6 **
7 ** This program is free software; you can redistribute it and/or modify
8 ** it under the terms of the GNU General Public License as published by
9 ** the Free Software Foundation; either version 2 of the License, or
10 ** (at your option) any later version.
11 **
12 ** This program is distributed in the hope that it will be useful,
13 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ** GNU General Public License for more details.
16 **
17 ** You should have received a copy of the GNU General Public License
18 ** along with this program; see the file COPYING. If not, write to
19 ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 ** Boston, MA 02110-1301, USA.
21 **
22 ****************************************************************************/
23
24 #ifndef VNCCLIENTTHREAD_H
25 #define VNCCLIENTTHREAD_H
26
27 #ifdef QTONLY
28 #include <QDebug>
29 #define kDebug(n) qDebug()
30 #define kBacktrace() ""
31 #define i18n tr
32 #else
33 #include <KDebug>
34 #include <KLocale>
35 #endif
36
37 #include "remoteview.h"
38
39 #include <QQueue>
40 #include <QThread>
41 #include <QImage>
42 #include <QMutex>
43
44 extern "C" {
45 #include <rfb/rfbclient.h>
46 }
47
48 class ClientEvent
49 {
50 public:
51     virtual ~ClientEvent();
52
53     virtual void fire(rfbClient*) = 0;
54 };
55
56 class KeyClientEvent : public ClientEvent
57 {
58 public:
59     KeyClientEvent(int key, int pressed)
60         : m_key(key), m_pressed(pressed) {}
61
62     void fire(rfbClient*);
63
64 private:
65     int m_key;
66     int m_pressed;
67 };
68
69 class PointerClientEvent : public ClientEvent
70 {
71 public:
72     PointerClientEvent(int x, int y, int buttonMask)
73         : m_x(x), m_y(y), m_buttonMask(buttonMask) {}
74
75     void fire(rfbClient*);
76
77 private:
78     int m_x;
79     int m_y;
80     int m_buttonMask;
81 };
82
83 class ClientCutEvent : public ClientEvent
84 {
85 public:
86     ClientCutEvent(const QString &text)
87         : text(text) {}
88
89     void fire(rfbClient*);
90
91 private:
92     QString text;
93 };
94
95 class VncClientThread: public QThread
96 {
97     Q_OBJECT
98
99 public:
100     explicit VncClientThread(QObject *parent = 0);
101     ~VncClientThread();
102     const QImage image(int x = 0, int y = 0, int w = 0, int h = 0);
103     void setImage(const QImage &img);
104     void emitUpdated(int x, int y, int w, int h);
105     void emitGotCut(const QString &text);
106     void stop();
107     void setHost(const QString &host);
108     void setPort(int port);
109     void setListenPort(int port) { listen_port = port; }
110     void setQuality(RemoteView::Quality quality);
111     void setPassword(const QString &password);
112     const QString password() const { return m_password; }
113
114     RemoteView::Quality quality() const;
115     uint8_t *frameBuffer;
116
117 signals:
118     void imageUpdated(int x, int y, int w, int h);
119     void gotCut(const QString &text);
120     void passwordRequest();
121     void outputErrorMessage(const QString &message);
122
123 public slots:
124     void mouseEvent(int x, int y, int buttonMask);
125     void keyEvent(int key, bool pressed);
126     void clientCut(const QString &text);
127
128 protected:
129     void run();
130
131 private:
132     static rfbBool newclient(rfbClient *cl);
133     static void updatefb(rfbClient *cl, int x, int y, int w, int h);
134     static void cuttext(rfbClient *cl, const char *text, int textlen);
135     static char* passwdHandler(rfbClient *cl);
136     static void outputHandler(const char *format, ...);
137
138     QImage m_image;
139     rfbClient *cl;
140     QString m_host;
141     QString m_password;
142     int m_port, listen_port;
143     QMutex mutex;
144     RemoteView::Quality m_quality;
145     QQueue<ClientEvent* > m_eventQueue;
146
147     volatile bool m_stopped;
148     volatile bool m_passwordError;
149
150 private slots:
151     void checkOutputErrorMessage();
152 };
153
154 #endif