trying to pinpoint crash on exit
[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 setQuality(RemoteView::Quality quality);
110     void setPassword(const QString &password) {
111         m_password = password;
112     }
113     const QString password() const {
114         return m_password;
115     }
116
117     RemoteView::Quality quality() const;
118     uint8_t *frameBuffer;
119
120 signals:
121     void imageUpdated(int x, int y, int w, int h);
122     void gotCut(const QString &text);
123     void passwordRequest();
124     void outputErrorMessage(const QString &message);
125
126 public slots:
127     void mouseEvent(int x, int y, int buttonMask);
128     void keyEvent(int key, bool pressed);
129     void clientCut(const QString &text);
130
131 protected:
132     void run();
133
134 private:
135     static rfbBool newclient(rfbClient *cl);
136     static void updatefb(rfbClient *cl, int x, int y, int w, int h);
137     static void cuttext(rfbClient *cl, const char *text, int textlen);
138     static char* passwdHandler(rfbClient *cl);
139     static void outputHandler(const char *format, ...);
140
141     QImage m_image;
142     rfbClient *cl;
143     QString m_host;
144     QString m_password;
145     int m_port;
146     QMutex mutex;
147     RemoteView::Quality m_quality;
148     QQueue<ClientEvent* > m_eventQueue;
149
150     volatile bool m_stopped;
151     volatile bool m_passwordError;
152         bool inMessageHandler;
153
154 private slots:
155     void checkOutputErrorMessage();
156 };
157
158 #endif