int iGetStatus() { return *si;}
+ void iSetStatus( int status) { *si = status;}
+
void Copy(ListConnInfo* InputList) {
Clear();
if (InputList->Empty()) return;
: 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();
}
server->clients.push_front(this);
- startTime = time(0);
}
// - Mark the entire display as "dirty"
updates.add_changed(server->pb->getRect());
+ startTime = time(0);
}
void VNCSConnectionST::queryConnection(const char* userName)
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
char* getStartTime();
+ void setStatus(int status);
+ int getStatus();
+
private:
// SConnection callbacks
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
void setEconomicTranslate(bool et) { useEconomicTranslate = et; }
void getConnInfo(ListConnInfo * listConn);
+ void setConnStatus(ListConnInfo* listConn);
protected:
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)©Data);
+ 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;
}
}
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:
}
}
+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)©Data);
+}
+
ControlPanel::~ControlPanel()
{
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;
};
};
case 2:
thread.server.disconnectClients("IPC disconnect");
break;
+ case 3:
+ thread.server.setClientsStatus((rfb::ListConnInfo *)command->cbData);
+ break;
};
};
break;
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)
case GetClientsInfo:
vncServer.getConnInfo((ListConnInfo*)commandData);
break;
+ case SetClientsStatus:
+ vncServer.setConnStatus((ListConnInfo*)commandData);
+ break;
default:
vlog.error("unknown command %d queued", command);
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;