diff options
author | Pierre Ossman <ossman@cendio.se> | 2018-10-08 16:03:01 +0200 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2018-11-09 17:16:04 +0100 |
commit | 025326dd94070ba790e4c1f8596b93ce96fd5be4 (patch) | |
tree | 5a4fae7fbeea807df67b0901c268e24e34005928 /win | |
parent | cd7931df76957ccadf0af258ff8515e520a90102 (diff) | |
download | tigervnc-025326dd94070ba790e4c1f8596b93ce96fd5be4.tar.gz tigervnc-025326dd94070ba790e4c1f8596b93ce96fd5be4.zip |
Move ListConnInfo to WinVNC directory
It is functionality specific to WinVNC, so move the code there
to make things more clear.
Diffstat (limited to 'win')
-rw-r--r-- | win/rfb_win32/SocketManager.cxx | 29 | ||||
-rw-r--r-- | win/rfb_win32/SocketManager.h | 4 | ||||
-rw-r--r-- | win/winvnc/ControlPanel.cxx | 9 | ||||
-rw-r--r-- | win/winvnc/ControlPanel.h | 12 | ||||
-rw-r--r-- | win/winvnc/ListConnInfo.h | 119 | ||||
-rw-r--r-- | win/winvnc/STrayIcon.cxx | 4 | ||||
-rw-r--r-- | win/winvnc/VNCServerWin32.cxx | 88 | ||||
-rw-r--r-- | win/winvnc/VNCServerWin32.h | 8 |
8 files changed, 253 insertions, 20 deletions
diff --git a/win/rfb_win32/SocketManager.cxx b/win/rfb_win32/SocketManager.cxx index 5b211a0d..aa469e53 100644 --- a/win/rfb_win32/SocketManager.cxx +++ b/win/rfb_win32/SocketManager.cxx @@ -78,6 +78,7 @@ void SocketManager::addListener(network::SocketListener* sock_, li.sock = sock_; li.server = srvr; li.notifier = acn; + li.disable = false; listeners[event] = li; } @@ -128,6 +129,32 @@ void SocketManager::remSocket(network::Socket* sock_) { throw rdr::Exception("Socket not registered"); } +bool SocketManager::getDisable(network::SocketServer* srvr) +{ + std::map<HANDLE,ListenInfo>::iterator i; + for (i=listeners.begin(); i!=listeners.end(); i++) { + if (i->second.server == srvr) { + return i->second.disable; + } + } + throw rdr::Exception("Listener not registered"); +} + +void SocketManager::setDisable(network::SocketServer* srvr, bool disable) +{ + bool found = false; + std::map<HANDLE,ListenInfo>::iterator i; + for (i=listeners.begin(); i!=listeners.end(); i++) { + if (i->second.server == srvr) { + i->second.disable = disable; + // There might be multiple sockets for the same server, so + // continue iterating + found = true; + } + } + if (!found) + throw rdr::Exception("Listener not registered"); +} int SocketManager::checkTimeouts() { int timeout = EventManager::checkTimeouts(); @@ -164,7 +191,7 @@ void SocketManager::processEvent(HANDLE event) { WSAEnumNetworkEvents(li.sock->getFd(), event, &network_events); if (network_events.lNetworkEvents & FD_ACCEPT) { network::Socket* new_sock = li.sock->accept(); - if (new_sock && li.server->getDisable()) { + if (new_sock && li.disable) { delete new_sock; new_sock = 0; } diff --git a/win/rfb_win32/SocketManager.h b/win/rfb_win32/SocketManager.h index c3c8fafd..e5ca02e6 100644 --- a/win/rfb_win32/SocketManager.h +++ b/win/rfb_win32/SocketManager.h @@ -65,6 +65,9 @@ namespace rfb { // the SocketServer. void addSocket(network::Socket* sock_, network::SocketServer* srvr, bool outgoing=true); + bool getDisable(network::SocketServer* srvr); + void setDisable(network::SocketServer* srvr, bool disable); + protected: virtual int checkTimeouts(); virtual void processEvent(HANDLE event); @@ -78,6 +81,7 @@ namespace rfb { network::SocketListener* sock; network::SocketServer* server; AddressChangeNotifier* notifier; + bool disable; }; std::map<HANDLE, ListenInfo> listeners; std::map<HANDLE, ConnInfo> connections; diff --git a/win/winvnc/ControlPanel.cxx b/win/winvnc/ControlPanel.cxx index ba6cab2c..e7262287 100644 --- a/win/winvnc/ControlPanel.cxx +++ b/win/winvnc/ControlPanel.cxx @@ -19,10 +19,9 @@ void ControlPanel::initDialog() { TCHAR *ColumnsStrings[] = { (TCHAR *) "IP address", - (TCHAR *) "Time connected", (TCHAR *) "Status" }; - InitLVColumns(IDC_LIST_CONNECTIONS, handle, 120, 3, ColumnsStrings, + InitLVColumns(IDC_LIST_CONNECTIONS, handle, 120, 2, ColumnsStrings, LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, LVS_EX_FULLROWSELECT, LVCFMT_LEFT); SendCommand(4, -1); @@ -74,7 +73,7 @@ bool ControlPanel::onCommand(int cmd) } -void ControlPanel::UpdateListView(rfb::ListConnInfo* LCInfo) +void ControlPanel::UpdateListView(ListConnInfo* LCInfo) { getSelConnInfo(); DeleteAllLVItem(IDC_LIST_CONNECTIONS, handle); @@ -85,12 +84,12 @@ void ControlPanel::UpdateListView(rfb::ListConnInfo* LCInfo) ListConn.Copy(LCInfo); - char* ItemString[3]; + char* ItemString[2]; int i = 0; for (ListConn.iBegin(); !ListConn.iEnd(); ListConn.iNext()) { ListConn.iGetCharInfo(ItemString); - InsertLVItem(IDC_LIST_CONNECTIONS, handle, i, (TCHAR **) ItemString, 3); + InsertLVItem(IDC_LIST_CONNECTIONS, handle, i, (TCHAR **) ItemString, 2); for (ListSelConn.iBegin(); !ListSelConn.iEnd(); ListSelConn.iNext()) { if (ListSelConn.iGetConn() == ListConn.iGetConn()) SelectLVItem(IDC_LIST_CONNECTIONS, handle, i); diff --git a/win/winvnc/ControlPanel.h b/win/winvnc/ControlPanel.h index 73b859f8..f64a6081 100644 --- a/win/winvnc/ControlPanel.h +++ b/win/winvnc/ControlPanel.h @@ -11,10 +11,10 @@ #include <list> #include <winvnc/resource.h> +#include <winvnc/ListConnInfo.h> #include <rfb_win32/Dialog.h> #include <rfb_win32/ListViewControl.h> #include <rfb_win32/Win32Util.h> -#include <rfb/ListConnInfo.h> namespace winvnc { @@ -27,19 +27,19 @@ namespace winvnc { virtual bool showDialog(); virtual void initDialog(); virtual bool onCommand(int cmd); - void UpdateListView(rfb::ListConnInfo* LCInfo); + void UpdateListView(ListConnInfo* LCInfo); HWND GetHandle() {return handle;}; void SendCommand(DWORD command, int data); ~ControlPanel(); - rfb::ListConnInfo ListConnStatus; + ListConnInfo ListConnStatus; protected: virtual BOOL dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void getSelConnInfo(); HWND m_hSTIcon; - rfb::ListConnInfo ListConn; - rfb::ListConnInfo ListSelConn; + ListConnInfo ListConn; + ListConnInfo ListSelConn; bool stop_updating; }; }; -#endif
\ No newline at end of file +#endif diff --git a/win/winvnc/ListConnInfo.h b/win/winvnc/ListConnInfo.h new file mode 100644 index 00000000..6ca5b7c7 --- /dev/null +++ b/win/winvnc/ListConnInfo.h @@ -0,0 +1,119 @@ +/* Copyright (C) 2002-2003 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. + */ + + +#ifndef __RFB_LISTCONNINFO_INCLUDED__ +#define __RFB_LISTCONNINFO_INCLUDED__ + +#include <list> + +#include <rfb/util.h> + +namespace winvnc { + + struct ListConnInfo { + ListConnInfo() : disableClients(false) {} + + void Clear() { + conn.clear(); + IP_address.clear(); + status.clear(); + } + + bool Empty() { return conn.empty();} + + void iBegin() { + ci = conn.begin(); + Ii = IP_address.begin(); + si = status.begin(); + } + + bool iEnd() { return ci == conn.end();} + + void iNext() { + ci++; + Ii++; + si++; + } + + void addInfo(void* Conn, char* IP, int Status) { + conn.push_back(Conn); + IP_address.push_back(rfb::strDup(IP)); + status.push_back(Status); + } + + void iGetCharInfo(char* buf[2]) { + buf[0] = *Ii; + switch (*si) { + case 0: + buf[1] = rfb::strDup("Full control"); + break; + case 1: + buf[1] = rfb::strDup("View only"); + break; + case 2: + buf[1] = rfb::strDup("Stop updating"); + break; + default: + buf[1] = rfb::strDup("Unknown"); + } + } + + void* iGetConn() { return *ci;} + + int iGetStatus() { return *si;} + + void iSetStatus(int istatus) { *si = istatus;} + + void Copy(ListConnInfo* InputList) { + Clear(); + if (InputList->Empty()) return; + for (InputList->iBegin(); !InputList->iEnd(); InputList->iNext()) { + iAdd(InputList); + } + setDisable(InputList->getDisable()); + } + + void iAdd (ListConnInfo* InputList) { + char* buf[2]; + InputList->iGetCharInfo(buf); + addInfo(InputList->iGetConn(), buf[0], InputList->iGetStatus()); + } + + void setDisable(bool disable) {disableClients = disable;} + + bool getDisable() {return disableClients;} + + void setAllStatus(int stat) { + std::list<int>::iterator st; + for (st = status.begin(); st != status.end(); st++) + *st = stat; + } + + private: + std::list<void*> conn; + std::list<char*> IP_address; + std::list<int> status; + std::list<void*>::iterator ci; + std::list<char*>::iterator Ii; + std::list<int>::iterator si; + bool disableClients; + }; +}; +#endif + diff --git a/win/winvnc/STrayIcon.cxx b/win/winvnc/STrayIcon.cxx index 05a38d6e..fa483ee0 100644 --- a/win/winvnc/STrayIcon.cxx +++ b/win/winvnc/STrayIcon.cxx @@ -184,7 +184,7 @@ public: case 2: return thread.server.disconnectClients("IPC disconnect") ? 1 : 0; case 3: - thread.server.setClientsStatus((rfb::ListConnInfo *)command->lpData); + thread.server.setClientsStatus((ListConnInfo *)command->lpData); case 4: thread.server.getClientsInfo(&LCInfo); CPanel->UpdateListView(&LCInfo); @@ -230,7 +230,7 @@ protected: LaunchProcess vncConnect; STrayIconThread& thread; ControlPanel * CPanel; - rfb::ListConnInfo LCInfo; + ListConnInfo LCInfo; }; diff --git a/win/winvnc/VNCServerWin32.cxx b/win/winvnc/VNCServerWin32.cxx index 771ef78a..03b1bca7 100644 --- a/win/winvnc/VNCServerWin32.cxx +++ b/win/winvnc/VNCServerWin32.cxx @@ -20,6 +20,7 @@ #include <winvnc/VNCServerWin32.h> #include <winvnc/resource.h> +#include <winvnc/ListConnInfo.h> #include <winvnc/STrayIcon.h> #include <os/Mutex.h> @@ -239,11 +240,11 @@ bool VNCServerWin32::addNewClient(const char* client) { return false; } -bool VNCServerWin32::getClientsInfo(rfb::ListConnInfo* LCInfo) { +bool VNCServerWin32::getClientsInfo(ListConnInfo* LCInfo) { return queueCommand(GetClientsInfo, LCInfo, 0); } -bool VNCServerWin32::setClientsStatus(rfb::ListConnInfo* LCInfo) { +bool VNCServerWin32::setClientsStatus(ListConnInfo* LCInfo) { return queueCommand(SetClientsStatus, LCInfo, 0); } @@ -307,10 +308,10 @@ void VNCServerWin32::processEvent(HANDLE event_) { sockMgr.addSocket((network::Socket*)commandData, &vncServer); break; case GetClientsInfo: - vncServer.getConnInfo((ListConnInfo*)commandData); + getConnInfo((ListConnInfo*)commandData); break; case SetClientsStatus: - vncServer.setConnStatus((ListConnInfo*)commandData); + setConnStatus((ListConnInfo*)commandData); break; case QueryConnectionComplete: @@ -339,3 +340,82 @@ void VNCServerWin32::processEvent(HANDLE event_) { } } +void VNCServerWin32::getConnInfo(ListConnInfo * listConn) +{ + std::list<network::Socket*> sockets; + std::list<network::Socket*>::iterator i; + + listConn->Clear(); + listConn->setDisable(sockMgr.getDisable(&vncServer)); + + vncServer.getSockets(&sockets); + + for (i = sockets.begin(); i != sockets.end(); i++) { + rfb::SConnection* conn; + int status; + + conn = vncServer.getConnection(*i); + if (!conn) + continue; + + if (conn->accessCheck(rfb::SConnection::AccessPtrEvents | + rfb::SConnection::AccessKeyEvents | + rfb::SConnection::AccessView)) + status = 0; + else if (conn->accessCheck(rfb::SConnection::AccessView)) + status = 1; + else + status = 2; + + listConn->addInfo((void*)(*i), (*i)->getPeerAddress(), status); + } +} + +void VNCServerWin32::setConnStatus(ListConnInfo* listConn) +{ + sockMgr.setDisable(&vncServer, listConn->getDisable()); + + if (listConn->Empty()) + return; + + for (listConn->iBegin(); !listConn->iEnd(); listConn->iNext()) { + network::Socket* sock; + rfb::SConnection* conn; + int status; + + sock = (network::Socket*)listConn->iGetConn(); + + conn = vncServer.getConnection(sock); + if (!conn) + continue; + + status = listConn->iGetStatus(); + if (status == 3) { + conn->close(0); + } else { + rfb::SConnection::AccessRights ar; + + ar = rfb::SConnection::AccessDefault; + + switch (status) { + case 0: + ar |= rfb::SConnection::AccessPtrEvents | + rfb::SConnection::AccessKeyEvents | + rfb::SConnection::AccessView; + break; + case 1: + ar |= rfb::SConnection::AccessView; + ar &= ~(rfb::SConnection::AccessPtrEvents | + rfb::SConnection::AccessKeyEvents); + break; + case 2: + ar &= ~(rfb::SConnection::AccessPtrEvents | + rfb::SConnection::AccessKeyEvents | + rfb::SConnection::AccessView); + break; + } + conn->setAccessRights(ar); + conn->framebufferUpdateRequest(vncServer.getPixelBuffer()->getRect(), false); + } + } +} diff --git a/win/winvnc/VNCServerWin32.h b/win/winvnc/VNCServerWin32.h index bd0cbbbf..1a737823 100644 --- a/win/winvnc/VNCServerWin32.h +++ b/win/winvnc/VNCServerWin32.h @@ -37,6 +37,7 @@ namespace os { namespace winvnc { + class ListConnInfo; class STrayIconThread; class VNCServerWin32 : rfb::win32::QueryConnectionHandler, @@ -73,9 +74,9 @@ namespace winvnc { // Where to read the configuration settings from static const TCHAR* RegConfigPath; - bool getClientsInfo(rfb::ListConnInfo* LCInfo); + bool getClientsInfo(ListConnInfo* LCInfo); - bool setClientsStatus(rfb::ListConnInfo* LCInfo); + bool setClientsStatus(ListConnInfo* LCInfo); protected: // QueryConnectionHandler interface @@ -96,6 +97,9 @@ namespace winvnc { // Used to perform queued commands virtual void processEvent(HANDLE event); + void getConnInfo(ListConnInfo * listConn); + void setConnStatus(ListConnInfo* listConn); + protected: // Perform a particular internal function in the server thread typedef enum {NoCommand, DisconnectClients, AddClient, QueryConnectionComplete, SetClientsStatus, GetClientsInfo} Command; |