summaryrefslogtreecommitdiffstats
path: root/win/vncviewer/CConn.h
blob: d3b3b20632faa42072253828787d29fcf6d55b39 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
 * 
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this software; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
 * USA.
 */

// -=- CConn.h

// Windows-specific implementation of CConnection

#ifndef __RFB_WIN32_CCONN_H__
#define __RFB_WIN32_CCONN_H__

#include <network/Socket.h>
#include <rfb/CConnection.h>
#include <rfb/Cursor.h>
#include <rfb/UserMsgBox.h>
#include <rfb/UserPasswdGetter.h>
#include <rfb_win32/Registry.h>
#include <rfb_win32/Handle.h>
#include <vncviewer/InfoDialog.h>
#include <vncviewer/OptionsDialog.h>
#include <vncviewer/CConnOptions.h>
#include <vncviewer/DesktopWindow.h>
#include <list>


namespace rfb {

  namespace win32 {

    class CConn : public CConnection,
                  UserPasswdGetter,
                  DesktopWindow::Callback,
                  rdr::FdInStreamBlockCallback,
                  UserMsgBox
    {
    public:
      CConn();
      ~CConn();

      // - Start the VNC session on the supplied socket
      //   The socket must already be connected to a host
      bool initialise(network::Socket* s, bool reverse=false);

      // - Set/get the session options
      void applyOptions(CConnOptions& opt);
      const CConnOptions& getOptions() const { return options; };

      // - Show the options dialog for the connection
      void showOptionsDialog();

      // - Close the socket & set the reason for closure
      void close(const char* reason=0);
      bool isClosed() const { return isClosed_; }
      const char* closeReason() const { return closeReason_.buf; }

      // - Last received encoding, for the Info dialog
      int lastUsedEncoding() const { return lastUsedEncoding_; }

      // - Get at the DesktopWindow, if any
      DesktopWindow* getWindow() { return window; }

      // - Get at the underlying Socket
      network::Socket* getSocket() { return sock; }

      // - Get the server's preferred format
      const PixelFormat& getServerDefaultPF() const { return serverDefaultPF; }

      // - Display message box
      virtual bool showMsgBox(int flags, const char* title, const char* text);

      // Global user-config registry key
      static RegKey userConfigKey;

    protected:
      // InputHandler interface (via DesktopWindow::Callback)
      void keyEvent(rdr::U32 key, bool down);
      void pointerEvent(const Point& pos, int buttonMask);
      void clientCutText(const char* str, int len);

      // DesktopWindow::Callback interface
      void displayChanged();
      void paintCompleted() {}
      bool sysCommand(WPARAM wParam, LPARAM lParam);
      void closeWindow();
      void refreshMenu(bool enableSysCommands);

      // CConnection interface
      void setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs);
      void bell();
      void framebufferUpdateStart();
      void framebufferUpdateEnd();
      void setDesktopSize(int w, int h);
      void setExtendedDesktopSize(int reason, int result, int w, int h,
                                  const rfb::ScreenSet& layout);
      void setCursor(int w, int h, const Point& hotspot, void* data, void* mask);
      void setName(const char* name);
      void serverInit();
      void serverCutText(const char* str, rdr::U32 len);
      void beginRect(const Rect& r, int encoding);
      void endRect(const Rect& r, int encoding);
      void fillRect(const Rect& r, Pixel pix);
      void imageRect(const Rect& r, void* pixels);
      void copyRect(const Rect& r, int srcX, int srcY);

      // rdr::FdInStreamBlockCallback interface
      void blockCallback();

      // UserPasswdGetter interface
      // (overridden to allow a pre-supplied username & password)
      void getUserPasswd(char** user, char** password);

      // CConn-specific internal interface
      void autoSelectFormatAndEncoding();
      void requestNewUpdate();
      void calculateFullColourPF();

      // The desktop window
      DesktopWindow* window;

      // Info and Options dialogs
      OptionsDialog optionsDialog;
      InfoDialog infoDialog;

      // VNC Viewer options
      CConnOptions options;

      // Pixel format and encoding
      PixelFormat serverDefaultPF;
      PixelFormat fullColourPF;
      bool sameMachine;
      bool encodingChange;
      bool formatChange;
      int lastUsedEncoding_;

      // Networking and RFB protocol
      network::Socket* sock;
      Handle sockEvent;
      bool reverseConnection;
      bool requestUpdate;
      bool firstUpdate;
      bool pendingUpdate;

      // Debugging/logging
      std::list<Rect> debugRects;
      CharArray closeReason_;
      bool isClosed_;
    };

  };

};

#endif