]> source.dussan.org Git - tigervnc.git/commitdiff
The code which realizes functionality " Control of selected clients "
authorOleg Sheikin <olg@tightvnc.com>
Fri, 9 Dec 2005 10:59:12 +0000 (10:59 +0000)
committerOleg Sheikin <olg@tightvnc.com>
Fri, 9 Dec 2005 10:59:12 +0000 (10:59 +0000)
control group in Control Panel has been added.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@436 3789f03b-4d11-0410-bbf8-ca57d06f2519

rfb/ListConnInfo.h
rfb/VNCSConnectionST.cxx
rfb/VNCSConnectionST.h
rfb/VNCServerST.cxx
rfb/VNCServerST.h
winvnc/ControlPanel.cxx
winvnc/ControlPanel.h
winvnc/STrayIcon.cxx
winvnc/VNCServerWin32.cxx
winvnc/VNCServerWin32.h

index 029f2a49aec110a537b6416494026fb805629b88..e8ca60a265508d29f60736ad0ae9b8f6eb19b518 100644 (file)
@@ -79,6 +79,8 @@ namespace rfb {
 
     int iGetStatus() { return *si;}
 
+    void iSetStatus( int status) { *si = status;}
+
     void Copy(ListConnInfo* InputList) {
       Clear();
       if (InputList->Empty()) return;
index dce1a569a8f9fb6454d562349ef7423607e5820c..41e4eb3bd8d2821f1fe2d59a58f4b20b33a927a7 100644 (file)
@@ -34,7 +34,8 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
   : sock(s), reverseConnection(reverse), server(server_),
     image_getter(server->useEconomicTranslate),
     drawRenderedCursor(false), removeRenderedCursor(false),
-    pointerEventTime(0), accessRights(AccessDefault)
+    pointerEventTime(0), accessRights(AccessDefault),
+    startTime(time(0))
 {
   setStreams(&sock->inStream(), &sock->outStream());
   peerEndpoint.buf = sock->getPeerEndpoint();
@@ -56,7 +57,6 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
   }
 
   server->clients.push_front(this);
-  startTime = time(0);
 }
 
 
@@ -341,6 +341,7 @@ void VNCSConnectionST::authSuccess()
 
   // - Mark the entire display as "dirty"
   updates.add_changed(server->pb->getRect());
+  startTime = time(0);
 }
 
 void VNCSConnectionST::queryConnection(const char* userName)
@@ -674,3 +675,28 @@ char* VNCSConnectionST::getStartTime()
   result[24] = '\0';
   return result; 
 }
+
+void VNCSConnectionST::setStatus(int status)
+{
+  switch (status) {
+  case 0:
+    accessRights = accessRights | AccessPtrEvents | AccessKeyEvents | AccessView;
+    break;
+  case 1:
+    accessRights = accessRights & !(AccessPtrEvents | AccessKeyEvents) | AccessView;
+    break;
+  case 2:
+    accessRights = accessRights & !(AccessPtrEvents | AccessKeyEvents | AccessView);
+    break;
+  }
+}
+int VNCSConnectionST::getStatus()
+{
+  if ((accessRights & (AccessPtrEvents | AccessKeyEvents | AccessView)) == 0x0007)
+    return 0;
+  if ((accessRights & (AccessPtrEvents | AccessKeyEvents | AccessView)) == 0x0001)
+    return 1;
+  if ((accessRights & (AccessPtrEvents | AccessKeyEvents | AccessView)) == 0x0000)
+    return 2;
+  return 4;
+}
\ No newline at end of file
index 784ac291293a0e25bc37514ff18a69504e46c8c4..b81c3a5123038ca3331872575284afb3f535b473 100644 (file)
@@ -105,6 +105,9 @@ namespace rfb {
 
     char* getStartTime();
 
+    void setStatus(int status);
+    int getStatus();
+
   private:
     // SConnection callbacks
 
index c25543d0f4ac56fa2e8359cdb7c2ecc6a06758ce..9e6c48021c3933fe86789e7d3811d2a663b13555 100644 (file)
@@ -513,9 +513,28 @@ void VNCServerST::getConnInfo(ListConnInfo * listConn)
   listConn->Clear();
   if (clients.empty())
     return;
-  int s=0;
   std::list<VNCSConnectionST*>::iterator i;
   for (i = clients.begin(); i != clients.end(); i++)
     listConn->addInfo((DWORD)(*i), (*i)->getSock()->getPeerAddress(),
-                      (*i)->getStartTime(), s++);
+                      (*i)->getStartTime(), (*i)->getStatus());
+}
+
+void VNCServerST::setConnStatus(ListConnInfo* listConn)
+{
+  if (listConn->Empty() || clients.empty()) return;
+  for (listConn->iBegin(); !listConn->iEnd(); listConn->iNext()) {
+    VNCSConnectionST* conn = (VNCSConnectionST*)listConn->iGetConn();
+    std::list<VNCSConnectionST*>::iterator i;
+    for (i = clients.begin(); i != clients.end(); i++) {
+      if ((*i) == conn) {
+        int status = listConn->iGetStatus();
+        if (status == 3) {
+          (*i)->close(0);
+        } else {
+          (*i)->setStatus(status);
+        }
+        break;
+      }
+    }
+  }
 }
\ No newline at end of file
index 596eaab932e91d48ffa3b860329d554d4d37d6e5..1cd208957d925a69f02cb51e5d130bcc5cbce030 100644 (file)
@@ -190,6 +190,7 @@ namespace rfb {
     void setEconomicTranslate(bool et) { useEconomicTranslate = et; }
 
     void getConnInfo(ListConnInfo * listConn);
+    void setConnStatus(ListConnInfo* listConn);
 
   protected:
 
index fb379d6c27512c6ec9b380b723af9af0e3663378..1f693063ae8faf4504f636701f703526ce4ebda6 100644 (file)
@@ -37,23 +37,35 @@ bool ControlPanel::onCommand(int cmd)
   case IDC_ADD_CLIENT:
     SendMessage(m_hSTIcon, WM_COMMAND, ID_CONNECT, 0);
     return false;
-  case IDC_KILL_SEL_CLIENT:
-    {
-      
-      return false;
-    }
   case IDC_KILL_ALL:
     {
-      COPYDATASTRUCT copyData;
-      copyData.dwData = 2;
-      copyData.lpData = 0;
-      copyData.cbData = 0;
-      SendMessage(m_hSTIcon, WM_COPYDATA, 0, (LPARAM)&copyData);
+      SendCommand(2, -1);
       return false;
     }
   case IDC_DISABLE_CLIENTS:
     {     
       
+      return false;
+    }
+  case IDC_KILL_SEL_CLIENT:
+    {     
+      SendCommand(3, 3);
+      return false;
+    }
+  case IDC_VIEW_ONLY:
+    {     
+      SendCommand(3, 1);
+      return false;
+    }
+  case IDC_FULL_CONTROL:
+    {     
+      SendCommand(3, 0);
+      return false;
+    }
+  case IDC_STOP_UPDATE:
+    {     
+      stop_updating = true;
+      EndDialog(handle, 0);
       return false;
     }
   }
@@ -92,6 +104,13 @@ BOOL ControlPanel::dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
     handle = hwnd;
     initDialog();
     return TRUE;
+  case WM_DESTROY:
+    if (stop_updating) {
+      stop_updating = false;
+      SendCommand(3, 2);
+    }
+    initDialog();
+    return TRUE;
   case WM_COMMAND:
     switch (LOWORD(wParam)) {
     case IDCANCEL:
@@ -117,6 +136,23 @@ void ControlPanel::getSelConnInfo()
   }
 }
 
+void ControlPanel::SendCommand(DWORD command, int data)
+{
+  COPYDATASTRUCT copyData;
+  copyData.dwData = command;
+  copyData.lpData = 0;
+  if (data != -1) {
+    getSelConnInfo();
+    ListConnStatus.Copy(&ListSelConn);
+    for (ListConnStatus.iBegin(); !ListConnStatus.iEnd(); ListConnStatus.iNext())
+      ListConnStatus.iSetStatus(data);
+    copyData.cbData = (DWORD)&ListConnStatus;
+  } else {
+    copyData.cbData = 0;
+  }
+  SendMessage(m_hSTIcon, WM_COPYDATA, 0, (LPARAM)&copyData);
+}
+
 ControlPanel::~ControlPanel()
 {
   
index f291b9e6bed15d03cdb4dd2b35d86c2c4f7a8f5f..73b859f880795884cbdafce2130038090ef56fe8 100644 (file)
@@ -22,19 +22,23 @@ namespace winvnc {
   public:
     ControlPanel(HWND hSTIcon) : Dialog(GetModuleHandle(0)), ListViewControl(){
       m_hSTIcon = hSTIcon;
+      stop_updating = false;
     };
     virtual bool showDialog();
     virtual void initDialog();
     virtual bool onCommand(int cmd);
     void UpdateListView(rfb::ListConnInfo* LCInfo);
     HWND GetHandle() {return handle;};
+    void SendCommand(DWORD command, int data);
     ~ControlPanel();
+    rfb::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;
+    bool stop_updating;
   };
 };
 
index 533c6a7150d6f987d3dd5379c7cd7d70340b8a21..c5cc3b219f532ee1553ee866b9e48ba5c8f14bf4 100644 (file)
@@ -168,6 +168,9 @@ public:
         case 2:
           thread.server.disconnectClients("IPC disconnect");
           break;
+        case 3:
+          thread.server.setClientsStatus((rfb::ListConnInfo *)command->cbData);
+          break;
         };
       };
       break;
index 7e562708162be77281cef82b870c744b690a0d94..30e9a72fedceb25512652191a265d9deeae95813 100644 (file)
@@ -274,6 +274,10 @@ bool VNCServerWin32::getClientsInfo(rfb::ListConnInfo* LCInfo) {
   return queueCommand(GetClientsInfo, LCInfo, 0);
 }
 
+bool VNCServerWin32::setClientsStatus(rfb::ListConnInfo* LCInfo) {
+  return queueCommand(SetClientsStatus, LCInfo, 0);
+}
+
 VNCServerST::queryResult VNCServerWin32::queryConnection(network::Socket* sock,
                                             const char* userName,
                                             char** reason)
@@ -336,6 +340,9 @@ void VNCServerWin32::doCommand() {
   case GetClientsInfo:
     vncServer.getConnInfo((ListConnInfo*)commandData); 
     break;
+  case SetClientsStatus:
+    vncServer.setConnStatus((ListConnInfo*)commandData); 
+    break;
 
   default:
     vlog.error("unknown command %d queued", command);
index f6c67235bb335ac2d545574c0d94b9c7bd339208..0af5fd5a209cccc4c5b6a1c2e159b68672a479c6 100644 (file)
@@ -69,13 +69,15 @@ namespace winvnc {
 
     bool getClientsInfo(rfb::ListConnInfo* LCInfo);
 
+    bool setClientsStatus(rfb::ListConnInfo* LCInfo);
+
     // Where to read the configuration settings from
     static const TCHAR* RegConfigPath;
 
   protected:
 
     // Perform a particular internal function in the server thread
-    typedef enum {NoCommand, DisconnectClients, AddClient, QueryConnectionComplete, GetClientsInfo} Command;
+    typedef enum {NoCommand, DisconnectClients, AddClient, QueryConnectionComplete, SetClientsStatus, GetClientsInfo} Command;
     bool queueCommand(Command cmd, const void* data, int len);
     void doCommand();
     Command command;