diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bf9a9096..2ab391da 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,5 +21,5 @@ if (WIN32) endif() if ((NOT ${CMAKE_SYSTEM_NAME} MATCHES "IRIX") AND (NOT ${DISABLE_TESTS})) - add_subdirectory(test) + add_subdirectory(test) endif() diff --git a/src/cmd/CMakeLists.txt b/src/cmd/CMakeLists.txt index f44bdc52..6b6d07e4 100644 --- a/src/cmd/CMakeLists.txt +++ b/src/cmd/CMakeLists.txt @@ -19,6 +19,6 @@ add_subdirectory(synergys) add_subdirectory(syntool) if (BUILD_SERVICE) - add_subdirectory(synergyd) + add_subdirectory(synergyd) endif (BUILD_SERVICE) diff --git a/src/cmd/synergyc/CMakeLists.txt b/src/cmd/synergyc/CMakeLists.txt index e620e459..b43330db 100644 --- a/src/cmd/synergyc/CMakeLists.txt +++ b/src/cmd/synergyc/CMakeLists.txt @@ -15,57 +15,57 @@ # along with this program. If not, see . set(sources - synergyc.cpp + synergyc.cpp ) if (WIN32) - file(GLOB arch_headers "MSWindows*.h") - file(GLOB arch_sources "MSWindows*.cpp") - list(APPEND sources - resource.h - synergyc.ico - synergyc.rc - tb_error.ico - tb_idle.ico - tb_run.ico - tb_wait.ico - ) + file(GLOB arch_headers "MSWindows*.h") + file(GLOB arch_sources "MSWindows*.cpp") + list(APPEND sources + resource.h + synergyc.ico + synergyc.rc + tb_error.ico + tb_idle.ico + tb_run.ico + tb_wait.ico + ) elseif (APPLE) - file(GLOB arch_headers "OSX*.h") - file(GLOB arch_sources "OSX*.cpp") + file(GLOB arch_headers "OSX*.h") + file(GLOB arch_sources "OSX*.cpp") elseif (UNIX) - file(GLOB arch_headers "XWindows*.h") - file(GLOB arch_sources "XWindows*.cpp") + file(GLOB arch_headers "XWindows*.h") + file(GLOB arch_sources "XWindows*.cpp") endif() list(APPEND sources ${arch_sources}) list(APPEND headers ${arch_headers}) if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../lib/ + ../ + ../../lib/ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_executable(synergyc ${sources}) target_link_libraries(synergyc - arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS}) + arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS}) if (WIN32) else () - if (CONF_CPACK) - install(TARGETS - synergyc - COMPONENT core - DESTINATION bin) - endif() + if (CONF_CPACK) + install(TARGETS + synergyc + COMPONENT core + DESTINATION bin) + endif() endif() diff --git a/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.cpp b/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.cpp index fc3ed94e..adccae0d 100644 --- a/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.cpp +++ b/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.cpp @@ -35,342 +35,342 @@ const UINT MSWindowsClientTaskBarReceiver::s_stateToIconID[kMaxState] = { - IDI_TASKBAR_NOT_RUNNING, - IDI_TASKBAR_NOT_WORKING, - IDI_TASKBAR_NOT_CONNECTED, - IDI_TASKBAR_NOT_CONNECTED, - IDI_TASKBAR_CONNECTED + IDI_TASKBAR_NOT_RUNNING, + IDI_TASKBAR_NOT_WORKING, + IDI_TASKBAR_NOT_CONNECTED, + IDI_TASKBAR_NOT_CONNECTED, + IDI_TASKBAR_CONNECTED }; MSWindowsClientTaskBarReceiver::MSWindowsClientTaskBarReceiver( - HINSTANCE appInstance, const BufferedLogOutputter* logBuffer, IEventQueue* events) : - ClientTaskBarReceiver(events), - m_appInstance(appInstance), - m_window(NULL), - m_logBuffer(logBuffer) + HINSTANCE appInstance, const BufferedLogOutputter* logBuffer, IEventQueue* events) : + ClientTaskBarReceiver(events), + m_appInstance(appInstance), + m_window(NULL), + m_logBuffer(logBuffer) { - for (UInt32 i = 0; i < kMaxState; ++i) { - m_icon[i] = loadIcon(s_stateToIconID[i]); - } - m_menu = LoadMenu(m_appInstance, MAKEINTRESOURCE(IDR_TASKBAR)); + for (UInt32 i = 0; i < kMaxState; ++i) { + m_icon[i] = loadIcon(s_stateToIconID[i]); + } + m_menu = LoadMenu(m_appInstance, MAKEINTRESOURCE(IDR_TASKBAR)); - // don't create the window yet. we'll create it on demand. this - // has the side benefit of being created in the thread used for - // the task bar. that's good because it means the existence of - // the window won't prevent changing the main thread's desktop. + // don't create the window yet. we'll create it on demand. this + // has the side benefit of being created in the thread used for + // the task bar. that's good because it means the existence of + // the window won't prevent changing the main thread's desktop. - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } MSWindowsClientTaskBarReceiver::~MSWindowsClientTaskBarReceiver() { - cleanup(); + cleanup(); } void MSWindowsClientTaskBarReceiver::cleanup() { - ARCH->removeReceiver(this); - for (UInt32 i = 0; i < kMaxState; ++i) { - deleteIcon(m_icon[i]); - } - DestroyMenu(m_menu); - destroyWindow(); + ARCH->removeReceiver(this); + for (UInt32 i = 0; i < kMaxState; ++i) { + deleteIcon(m_icon[i]); + } + DestroyMenu(m_menu); + destroyWindow(); } void MSWindowsClientTaskBarReceiver::showStatus() { - // create the window - createWindow(); + // create the window + createWindow(); - // lock self while getting status - lock(); + // lock self while getting status + lock(); - // get the current status - std::string status = getToolTip(); + // get the current status + std::string status = getToolTip(); - // done getting status - unlock(); + // done getting status + unlock(); - // update dialog - HWND child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_STATUS); - SendMessage(child, WM_SETTEXT, 0, (LPARAM)status.c_str()); + // update dialog + HWND child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_STATUS); + SendMessage(child, WM_SETTEXT, 0, (LPARAM)status.c_str()); - if (!IsWindowVisible(m_window)) { - // position it by the mouse - POINT cursorPos; - GetCursorPos(&cursorPos); - RECT windowRect; - GetWindowRect(m_window, &windowRect); - int x = cursorPos.x; - int y = cursorPos.y; - int fw = GetSystemMetrics(SM_CXDLGFRAME); - int fh = GetSystemMetrics(SM_CYDLGFRAME); - int ww = windowRect.right - windowRect.left; - int wh = windowRect.bottom - windowRect.top; - int sw = GetSystemMetrics(SM_CXFULLSCREEN); - int sh = GetSystemMetrics(SM_CYFULLSCREEN); - if (fw < 1) { - fw = 1; - } - if (fh < 1) { - fh = 1; - } - if (x + ww - fw > sw) { - x -= ww - fw; - } - else { - x -= fw; - } - if (x < 0) { - x = 0; - } - if (y + wh - fh > sh) { - y -= wh - fh; - } - else { - y -= fh; - } - if (y < 0) { - y = 0; - } - SetWindowPos(m_window, HWND_TOPMOST, x, y, ww, wh, - SWP_SHOWWINDOW); - } + if (!IsWindowVisible(m_window)) { + // position it by the mouse + POINT cursorPos; + GetCursorPos(&cursorPos); + RECT windowRect; + GetWindowRect(m_window, &windowRect); + int x = cursorPos.x; + int y = cursorPos.y; + int fw = GetSystemMetrics(SM_CXDLGFRAME); + int fh = GetSystemMetrics(SM_CYDLGFRAME); + int ww = windowRect.right - windowRect.left; + int wh = windowRect.bottom - windowRect.top; + int sw = GetSystemMetrics(SM_CXFULLSCREEN); + int sh = GetSystemMetrics(SM_CYFULLSCREEN); + if (fw < 1) { + fw = 1; + } + if (fh < 1) { + fh = 1; + } + if (x + ww - fw > sw) { + x -= ww - fw; + } + else { + x -= fw; + } + if (x < 0) { + x = 0; + } + if (y + wh - fh > sh) { + y -= wh - fh; + } + else { + y -= fh; + } + if (y < 0) { + y = 0; + } + SetWindowPos(m_window, HWND_TOPMOST, x, y, ww, wh, + SWP_SHOWWINDOW); + } } void MSWindowsClientTaskBarReceiver::runMenu(int x, int y) { - // do popup menu. we need a window to pass to TrackPopupMenu(). - // the SetForegroundWindow() and SendMessage() calls around - // TrackPopupMenu() are to get the menu to be dismissed when - // another window gets activated and are just one of those - // win32 weirdnesses. - createWindow(); - SetForegroundWindow(m_window); - HMENU menu = GetSubMenu(m_menu, 0); - SetMenuDefaultItem(menu, IDC_TASKBAR_STATUS, FALSE); - HMENU logLevelMenu = GetSubMenu(menu, 3); - CheckMenuRadioItem(logLevelMenu, 0, 6, - CLOG->getFilter() - kERROR, MF_BYPOSITION); - int n = TrackPopupMenu(menu, - TPM_NONOTIFY | - TPM_RETURNCMD | - TPM_LEFTBUTTON | - TPM_RIGHTBUTTON, - x, y, 0, m_window, NULL); - SendMessage(m_window, WM_NULL, 0, 0); + // do popup menu. we need a window to pass to TrackPopupMenu(). + // the SetForegroundWindow() and SendMessage() calls around + // TrackPopupMenu() are to get the menu to be dismissed when + // another window gets activated and are just one of those + // win32 weirdnesses. + createWindow(); + SetForegroundWindow(m_window); + HMENU menu = GetSubMenu(m_menu, 0); + SetMenuDefaultItem(menu, IDC_TASKBAR_STATUS, FALSE); + HMENU logLevelMenu = GetSubMenu(menu, 3); + CheckMenuRadioItem(logLevelMenu, 0, 6, + CLOG->getFilter() - kERROR, MF_BYPOSITION); + int n = TrackPopupMenu(menu, + TPM_NONOTIFY | + TPM_RETURNCMD | + TPM_LEFTBUTTON | + TPM_RIGHTBUTTON, + x, y, 0, m_window, NULL); + SendMessage(m_window, WM_NULL, 0, 0); - // perform the requested operation - switch (n) { - case IDC_TASKBAR_STATUS: - showStatus(); - break; + // perform the requested operation + switch (n) { + case IDC_TASKBAR_STATUS: + showStatus(); + break; - case IDC_TASKBAR_LOG: - copyLog(); - break; + case IDC_TASKBAR_LOG: + copyLog(); + break; - case IDC_TASKBAR_SHOW_LOG: - ARCH->showConsole(true); - break; + case IDC_TASKBAR_SHOW_LOG: + ARCH->showConsole(true); + break; - case IDC_TASKBAR_LOG_LEVEL_ERROR: - CLOG->setFilter(kERROR); - break; + case IDC_TASKBAR_LOG_LEVEL_ERROR: + CLOG->setFilter(kERROR); + break; - case IDC_TASKBAR_LOG_LEVEL_WARNING: - CLOG->setFilter(kWARNING); - break; + case IDC_TASKBAR_LOG_LEVEL_WARNING: + CLOG->setFilter(kWARNING); + break; - case IDC_TASKBAR_LOG_LEVEL_NOTE: - CLOG->setFilter(kNOTE); - break; + case IDC_TASKBAR_LOG_LEVEL_NOTE: + CLOG->setFilter(kNOTE); + break; - case IDC_TASKBAR_LOG_LEVEL_INFO: - CLOG->setFilter(kINFO); - break; + case IDC_TASKBAR_LOG_LEVEL_INFO: + CLOG->setFilter(kINFO); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG: - CLOG->setFilter(kDEBUG); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG: + CLOG->setFilter(kDEBUG); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG1: - CLOG->setFilter(kDEBUG1); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG1: + CLOG->setFilter(kDEBUG1); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG2: - CLOG->setFilter(kDEBUG2); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG2: + CLOG->setFilter(kDEBUG2); + break; - case IDC_TASKBAR_QUIT: - quit(); - break; - } + case IDC_TASKBAR_QUIT: + quit(); + break; + } } void MSWindowsClientTaskBarReceiver::primaryAction() { - showStatus(); + showStatus(); } const IArchTaskBarReceiver::Icon MSWindowsClientTaskBarReceiver::getIcon() const { - return static_cast(m_icon[getStatus()]); + return static_cast(m_icon[getStatus()]); } void MSWindowsClientTaskBarReceiver::copyLog() const { - if (m_logBuffer != NULL) { - // collect log buffer - String data; - for (BufferedLogOutputter::const_iterator index = m_logBuffer->begin(); - index != m_logBuffer->end(); ++index) { - data += *index; - data += "\n"; - } + if (m_logBuffer != NULL) { + // collect log buffer + String data; + for (BufferedLogOutputter::const_iterator index = m_logBuffer->begin(); + index != m_logBuffer->end(); ++index) { + data += *index; + data += "\n"; + } - // copy log to clipboard - if (!data.empty()) { - MSWindowsClipboard clipboard(m_window); - clipboard.open(0); - clipboard.emptyUnowned(); - clipboard.add(IClipboard::kText, data); - clipboard.close(); - } - } + // copy log to clipboard + if (!data.empty()) { + MSWindowsClipboard clipboard(m_window); + clipboard.open(0); + clipboard.emptyUnowned(); + clipboard.add(IClipboard::kText, data); + clipboard.close(); + } + } } void MSWindowsClientTaskBarReceiver::onStatusChanged() { - if (IsWindowVisible(m_window)) { - showStatus(); - } + if (IsWindowVisible(m_window)) { + showStatus(); + } } HICON MSWindowsClientTaskBarReceiver::loadIcon(UINT id) { - HANDLE icon = LoadImage(m_appInstance, - MAKEINTRESOURCE(id), - IMAGE_ICON, - 0, 0, - LR_DEFAULTCOLOR); - return static_cast(icon); + HANDLE icon = LoadImage(m_appInstance, + MAKEINTRESOURCE(id), + IMAGE_ICON, + 0, 0, + LR_DEFAULTCOLOR); + return static_cast(icon); } void MSWindowsClientTaskBarReceiver::deleteIcon(HICON icon) { - if (icon != NULL) { - DestroyIcon(icon); - } + if (icon != NULL) { + DestroyIcon(icon); + } } void MSWindowsClientTaskBarReceiver::createWindow() { - // ignore if already created - if (m_window != NULL) { - return; - } + // ignore if already created + if (m_window != NULL) { + return; + } - // get the status dialog - m_window = CreateDialogParam(m_appInstance, - MAKEINTRESOURCE(IDD_TASKBAR_STATUS), - NULL, - (DLGPROC)&MSWindowsClientTaskBarReceiver::staticDlgProc, - reinterpret_cast( - static_cast(this))); + // get the status dialog + m_window = CreateDialogParam(m_appInstance, + MAKEINTRESOURCE(IDD_TASKBAR_STATUS), + NULL, + (DLGPROC)&MSWindowsClientTaskBarReceiver::staticDlgProc, + reinterpret_cast( + static_cast(this))); - // window should appear on top of everything, including (especially) - // the task bar. - LONG_PTR style = GetWindowLongPtr(m_window, GWL_EXSTYLE); - style |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST; - SetWindowLongPtr(m_window, GWL_EXSTYLE, style); + // window should appear on top of everything, including (especially) + // the task bar. + LONG_PTR style = GetWindowLongPtr(m_window, GWL_EXSTYLE); + style |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST; + SetWindowLongPtr(m_window, GWL_EXSTYLE, style); - // tell the task bar about this dialog - ArchTaskBarWindows::addDialog(m_window); + // tell the task bar about this dialog + ArchTaskBarWindows::addDialog(m_window); } void MSWindowsClientTaskBarReceiver::destroyWindow() { - if (m_window != NULL) { - ArchTaskBarWindows::removeDialog(m_window); - DestroyWindow(m_window); - m_window = NULL; - } + if (m_window != NULL) { + ArchTaskBarWindows::removeDialog(m_window); + DestroyWindow(m_window); + m_window = NULL; + } } BOOL MSWindowsClientTaskBarReceiver::dlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM) + UINT msg, WPARAM wParam, LPARAM) { - switch (msg) { - case WM_INITDIALOG: - // use default focus - return TRUE; + switch (msg) { + case WM_INITDIALOG: + // use default focus + return TRUE; - case WM_ACTIVATE: - // hide when another window is activated - if (LOWORD(wParam) == WA_INACTIVE) { - ShowWindow(hwnd, SW_HIDE); - } - break; - } - return FALSE; + case WM_ACTIVATE: + // hide when another window is activated + if (LOWORD(wParam) == WA_INACTIVE) { + ShowWindow(hwnd, SW_HIDE); + } + break; + } + return FALSE; } BOOL CALLBACK MSWindowsClientTaskBarReceiver::staticDlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam) + UINT msg, WPARAM wParam, LPARAM lParam) { - // if msg is WM_INITDIALOG, extract the MSWindowsClientTaskBarReceiver* - // and put it in the extra window data then forward the call. - MSWindowsClientTaskBarReceiver* self = NULL; - if (msg == WM_INITDIALOG) { - self = static_cast( - reinterpret_cast(lParam)); - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) lParam); - } - else { - // get the extra window data and forward the call - LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); - if (data != 0) { - self = (MSWindowsClientTaskBarReceiver*) data; - } - } + // if msg is WM_INITDIALOG, extract the MSWindowsClientTaskBarReceiver* + // and put it in the extra window data then forward the call. + MSWindowsClientTaskBarReceiver* self = NULL; + if (msg == WM_INITDIALOG) { + self = static_cast( + reinterpret_cast(lParam)); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) lParam); + } + else { + // get the extra window data and forward the call + LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (data != 0) { + self = (MSWindowsClientTaskBarReceiver*) data; + } + } - // forward the message - if (self != NULL) { - return self->dlgProc(hwnd, msg, wParam, lParam); - } - else { - return (msg == WM_INITDIALOG) ? TRUE : FALSE; - } + // forward the message + if (self != NULL) { + return self->dlgProc(hwnd, msg, wParam, lParam); + } + else { + return (msg == WM_INITDIALOG) ? TRUE : FALSE; + } } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - ArchMiscWindows::setIcons( - (HICON)LoadImage(ArchMiscWindows::instanceWin32(), - MAKEINTRESOURCE(IDI_SYNERGY), - IMAGE_ICON, - 32, 32, LR_SHARED), - (HICON)LoadImage(ArchMiscWindows::instanceWin32(), - MAKEINTRESOURCE(IDI_SYNERGY), - IMAGE_ICON, - 16, 16, LR_SHARED)); + ArchMiscWindows::setIcons( + (HICON)LoadImage(ArchMiscWindows::instanceWin32(), + MAKEINTRESOURCE(IDI_SYNERGY), + IMAGE_ICON, + 32, 32, LR_SHARED), + (HICON)LoadImage(ArchMiscWindows::instanceWin32(), + MAKEINTRESOURCE(IDI_SYNERGY), + IMAGE_ICON, + 16, 16, LR_SHARED)); - return new MSWindowsClientTaskBarReceiver( - MSWindowsScreen::getWindowInstance(), logBuffer, events); + return new MSWindowsClientTaskBarReceiver( + MSWindowsScreen::getWindowInstance(), logBuffer, events); } diff --git a/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.h b/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.h index f02a9950..0fa3c8fa 100644 --- a/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.h +++ b/src/cmd/synergyc/MSWindowsClientTaskBarReceiver.h @@ -29,40 +29,40 @@ class IEventQueue; //! Implementation of ClientTaskBarReceiver for Microsoft Windows class MSWindowsClientTaskBarReceiver : public ClientTaskBarReceiver { public: - MSWindowsClientTaskBarReceiver(HINSTANCE, const BufferedLogOutputter*, IEventQueue* events); - virtual ~MSWindowsClientTaskBarReceiver(); + MSWindowsClientTaskBarReceiver(HINSTANCE, const BufferedLogOutputter*, IEventQueue* events); + virtual ~MSWindowsClientTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; - void cleanup(); + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; + void cleanup(); protected: - void copyLog() const; + void copyLog() const; - // ClientTaskBarReceiver overrides - virtual void onStatusChanged(); + // ClientTaskBarReceiver overrides + virtual void onStatusChanged(); private: - HICON loadIcon(UINT); - void deleteIcon(HICON); - void createWindow(); - void destroyWindow(); + HICON loadIcon(UINT); + void deleteIcon(HICON); + void createWindow(); + void destroyWindow(); - BOOL dlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam); - static BOOL CALLBACK - staticDlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam); + BOOL dlgProc(HWND hwnd, + UINT msg, WPARAM wParam, LPARAM lParam); + static BOOL CALLBACK + staticDlgProc(HWND hwnd, + UINT msg, WPARAM wParam, LPARAM lParam); private: - HINSTANCE m_appInstance; - HWND m_window; - HMENU m_menu; - HICON m_icon[kMaxState]; - const BufferedLogOutputter* m_logBuffer; + HINSTANCE m_appInstance; + HWND m_window; + HMENU m_menu; + HICON m_icon[kMaxState]; + const BufferedLogOutputter* m_logBuffer; - static const UINT s_stateToIconID[]; + static const UINT s_stateToIconID[]; }; diff --git a/src/cmd/synergyc/OSXClientTaskBarReceiver.cpp b/src/cmd/synergyc/OSXClientTaskBarReceiver.cpp index 569df39f..39afe27a 100644 --- a/src/cmd/synergyc/OSXClientTaskBarReceiver.cpp +++ b/src/cmd/synergyc/OSXClientTaskBarReceiver.cpp @@ -28,42 +28,42 @@ OSXClientTaskBarReceiver::OSXClientTaskBarReceiver( IEventQueue* events) : ClientTaskBarReceiver(events) { - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } OSXClientTaskBarReceiver::~OSXClientTaskBarReceiver() { - ARCH->removeReceiver(this); + ARCH->removeReceiver(this); } void OSXClientTaskBarReceiver::showStatus() { - // do nothing + // do nothing } void OSXClientTaskBarReceiver::runMenu(int, int) { - // do nothing + // do nothing } void OSXClientTaskBarReceiver::primaryAction() { - // do nothing + // do nothing } const IArchTaskBarReceiver::Icon OSXClientTaskBarReceiver::getIcon() const { - return NULL; + return NULL; } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - return new OSXClientTaskBarReceiver(logBuffer, events); + return new OSXClientTaskBarReceiver(logBuffer, events); } diff --git a/src/cmd/synergyc/OSXClientTaskBarReceiver.h b/src/cmd/synergyc/OSXClientTaskBarReceiver.h index 5ab07a6b..a24856f8 100644 --- a/src/cmd/synergyc/OSXClientTaskBarReceiver.h +++ b/src/cmd/synergyc/OSXClientTaskBarReceiver.h @@ -26,12 +26,12 @@ class IEventQueue; //! Implementation of ClientTaskBarReceiver for OS X class OSXClientTaskBarReceiver : public ClientTaskBarReceiver { public: - OSXClientTaskBarReceiver(const BufferedLogOutputter*, IEventQueue* events); - virtual ~OSXClientTaskBarReceiver(); + OSXClientTaskBarReceiver(const BufferedLogOutputter*, IEventQueue* events); + virtual ~OSXClientTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; }; diff --git a/src/cmd/synergyc/XWindowsClientTaskBarReceiver.cpp b/src/cmd/synergyc/XWindowsClientTaskBarReceiver.cpp index 4cb5394d..6eda5e39 100644 --- a/src/cmd/synergyc/XWindowsClientTaskBarReceiver.cpp +++ b/src/cmd/synergyc/XWindowsClientTaskBarReceiver.cpp @@ -24,45 +24,45 @@ // CXWindowsClientTaskBarReceiver::CXWindowsClientTaskBarReceiver( - const BufferedLogOutputter*, - IEventQueue* events) : - ClientTaskBarReceiver(events) + const BufferedLogOutputter*, + IEventQueue* events) : + ClientTaskBarReceiver(events) { - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } CXWindowsClientTaskBarReceiver::~CXWindowsClientTaskBarReceiver() { - ARCH->removeReceiver(this); + ARCH->removeReceiver(this); } void CXWindowsClientTaskBarReceiver::showStatus() { - // do nothing + // do nothing } void CXWindowsClientTaskBarReceiver::runMenu(int, int) { - // do nothing + // do nothing } void CXWindowsClientTaskBarReceiver::primaryAction() { - // do nothing + // do nothing } const IArchTaskBarReceiver::Icon CXWindowsClientTaskBarReceiver::getIcon() const { - return NULL; + return NULL; } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - return new CXWindowsClientTaskBarReceiver(logBuffer, events); + return new CXWindowsClientTaskBarReceiver(logBuffer, events); } diff --git a/src/cmd/synergyc/XWindowsClientTaskBarReceiver.h b/src/cmd/synergyc/XWindowsClientTaskBarReceiver.h index 45a1bab8..fe87a706 100644 --- a/src/cmd/synergyc/XWindowsClientTaskBarReceiver.h +++ b/src/cmd/synergyc/XWindowsClientTaskBarReceiver.h @@ -26,13 +26,13 @@ class IEventQueue; //! Implementation of ClientTaskBarReceiver for X Windows class CXWindowsClientTaskBarReceiver : public ClientTaskBarReceiver { public: - CXWindowsClientTaskBarReceiver( - const BufferedLogOutputter*, IEventQueue* events); - virtual ~CXWindowsClientTaskBarReceiver(); + CXWindowsClientTaskBarReceiver( + const BufferedLogOutputter*, IEventQueue* events); + virtual ~CXWindowsClientTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; }; diff --git a/src/cmd/synergyc/synergyc.cpp b/src/cmd/synergyc/synergyc.cpp index 3b4ea57d..2a582adc 100644 --- a/src/cmd/synergyc/synergyc.cpp +++ b/src/cmd/synergyc/synergyc.cpp @@ -35,16 +35,16 @@ int main(int argc, char** argv) { #if SYSAPI_WIN32 - // record window instance for tray icon, etc - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // record window instance for tray icon, etc + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - - Arch arch; - arch.init(); + + Arch arch; + arch.init(); - Log log; - EventQueue events; + Log log; + EventQueue events; - ClientApp app(&events, createTaskBarReceiver); - return app.run(argc, argv); + ClientApp app(&events, createTaskBarReceiver); + return app.run(argc, argv); } diff --git a/src/cmd/synergyd/CMakeLists.txt b/src/cmd/synergyd/CMakeLists.txt index a63bee67..93784d90 100644 --- a/src/cmd/synergyd/CMakeLists.txt +++ b/src/cmd/synergyd/CMakeLists.txt @@ -18,14 +18,14 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") include_directories( - ../ - ../../lib/ + ../ + ../../lib/ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() if (WIN32) @@ -35,11 +35,11 @@ else() endif() target_link_libraries(synergyd - arch base common io ipc mt net platform synergy shared ${libs} ${OPENSSL_LIBS}) + arch base common io ipc mt net platform synergy shared ${libs} ${OPENSSL_LIBS}) if (CONF_CPACK) - install(TARGETS - synergyd - COMPONENT core - DESTINATION bin) + install(TARGETS + synergyd + COMPONENT core + DESTINATION bin) endif() diff --git a/src/cmd/synergyd/synergyd.cpp b/src/cmd/synergyd/synergyd.cpp index a0ad7449..74f3fd2f 100644 --- a/src/cmd/synergyd/synergyd.cpp +++ b/src/cmd/synergyd/synergyd.cpp @@ -25,8 +25,8 @@ int main(int argc, char** argv) { - DaemonApp app; - return app.run(argc, argv); + DaemonApp app; + return app.run(argc, argv); } #elif SYSAPI_WIN32 @@ -37,8 +37,8 @@ main(int argc, char** argv) int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { - DaemonApp app; - return app.run(__argc, __argv); + DaemonApp app; + return app.run(__argc, __argv); } #endif diff --git a/src/cmd/synergys/CMakeLists.txt b/src/cmd/synergys/CMakeLists.txt index 552f3cd6..e3c61fe7 100644 --- a/src/cmd/synergys/CMakeLists.txt +++ b/src/cmd/synergys/CMakeLists.txt @@ -15,57 +15,57 @@ # along with this program. If not, see . set(sources - synergys.cpp + synergys.cpp ) if (WIN32) - file(GLOB arch_headers "MSWindows*.h") - file(GLOB arch_sources "MSWindows*.cpp") - list(APPEND sources - resource.h - synergys.ico - synergys.rc - tb_error.ico - tb_idle.ico - tb_run.ico - tb_wait.ico - ) + file(GLOB arch_headers "MSWindows*.h") + file(GLOB arch_sources "MSWindows*.cpp") + list(APPEND sources + resource.h + synergys.ico + synergys.rc + tb_error.ico + tb_idle.ico + tb_run.ico + tb_wait.ico + ) elseif (APPLE) - file(GLOB arch_headers "OSX*.h") - file(GLOB arch_sources "OSX*.cpp") + file(GLOB arch_headers "OSX*.h") + file(GLOB arch_sources "OSX*.cpp") elseif (UNIX) - file(GLOB arch_headers "XWindows*.h") - file(GLOB arch_sources "XWindows*.cpp") + file(GLOB arch_headers "XWindows*.h") + file(GLOB arch_sources "XWindows*.cpp") endif() list(APPEND sources ${arch_sources}) list(APPEND headers ${arch_headers}) if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../lib/ + ../ + ../../lib/ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_executable(synergys ${sources}) target_link_libraries(synergys - arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS}) + arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS}) if (WIN32) else () - if (CONF_CPACK) - install(TARGETS - synergys - COMPONENT core - DESTINATION bin) - endif() + if (CONF_CPACK) + install(TARGETS + synergys + COMPONENT core + DESTINATION bin) + endif() endif() diff --git a/src/cmd/synergys/MSWindowsServerTaskBarReceiver.cpp b/src/cmd/synergys/MSWindowsServerTaskBarReceiver.cpp index b2d304a1..9620c39f 100644 --- a/src/cmd/synergys/MSWindowsServerTaskBarReceiver.cpp +++ b/src/cmd/synergys/MSWindowsServerTaskBarReceiver.cpp @@ -36,373 +36,373 @@ const UINT MSWindowsServerTaskBarReceiver::s_stateToIconID[kMaxState] = { - IDI_TASKBAR_NOT_RUNNING, - IDI_TASKBAR_NOT_WORKING, - IDI_TASKBAR_NOT_CONNECTED, - IDI_TASKBAR_CONNECTED + IDI_TASKBAR_NOT_RUNNING, + IDI_TASKBAR_NOT_WORKING, + IDI_TASKBAR_NOT_CONNECTED, + IDI_TASKBAR_CONNECTED }; MSWindowsServerTaskBarReceiver::MSWindowsServerTaskBarReceiver( - HINSTANCE appInstance, const BufferedLogOutputter* logBuffer, IEventQueue* events) : - ServerTaskBarReceiver(events), - m_events(events), - m_appInstance(appInstance), - m_window(NULL), - m_logBuffer(logBuffer) + HINSTANCE appInstance, const BufferedLogOutputter* logBuffer, IEventQueue* events) : + ServerTaskBarReceiver(events), + m_events(events), + m_appInstance(appInstance), + m_window(NULL), + m_logBuffer(logBuffer) { - for (UInt32 i = 0; i < kMaxState; ++i) { - m_icon[i] = loadIcon(s_stateToIconID[i]); - } - m_menu = LoadMenu(m_appInstance, MAKEINTRESOURCE(IDR_TASKBAR)); + for (UInt32 i = 0; i < kMaxState; ++i) { + m_icon[i] = loadIcon(s_stateToIconID[i]); + } + m_menu = LoadMenu(m_appInstance, MAKEINTRESOURCE(IDR_TASKBAR)); - // don't create the window yet. we'll create it on demand. this - // has the side benefit of being created in the thread used for - // the task bar. that's good because it means the existence of - // the window won't prevent changing the main thread's desktop. + // don't create the window yet. we'll create it on demand. this + // has the side benefit of being created in the thread used for + // the task bar. that's good because it means the existence of + // the window won't prevent changing the main thread's desktop. - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } void MSWindowsServerTaskBarReceiver::cleanup() { - ARCH->removeReceiver(this); - for (UInt32 i = 0; i < kMaxState; ++i) { - deleteIcon(m_icon[i]); - } - DestroyMenu(m_menu); - destroyWindow(); + ARCH->removeReceiver(this); + for (UInt32 i = 0; i < kMaxState; ++i) { + deleteIcon(m_icon[i]); + } + DestroyMenu(m_menu); + destroyWindow(); } MSWindowsServerTaskBarReceiver::~MSWindowsServerTaskBarReceiver() { - cleanup(); + cleanup(); } void MSWindowsServerTaskBarReceiver::showStatus() { - // create the window - createWindow(); + // create the window + createWindow(); - // lock self while getting status - lock(); + // lock self while getting status + lock(); - // get the current status - std::string status = getToolTip(); + // get the current status + std::string status = getToolTip(); - // get the connect clients, if any - const Clients& clients = getClients(); + // get the connect clients, if any + const Clients& clients = getClients(); - // done getting status - unlock(); + // done getting status + unlock(); - // update dialog - HWND child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_STATUS); - SendMessage(child, WM_SETTEXT, 0, (LPARAM)status.c_str()); - child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_CLIENTS); - SendMessage(child, LB_RESETCONTENT, 0, 0); - for (Clients::const_iterator index = clients.begin(); - index != clients.end(); ) { - const char* client = index->c_str(); - if (++index == clients.end()) { - SendMessage(child, LB_ADDSTRING, 0, (LPARAM)client); - } - else { - SendMessage(child, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)client); - } - } + // update dialog + HWND child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_STATUS); + SendMessage(child, WM_SETTEXT, 0, (LPARAM)status.c_str()); + child = GetDlgItem(m_window, IDC_TASKBAR_STATUS_CLIENTS); + SendMessage(child, LB_RESETCONTENT, 0, 0); + for (Clients::const_iterator index = clients.begin(); + index != clients.end(); ) { + const char* client = index->c_str(); + if (++index == clients.end()) { + SendMessage(child, LB_ADDSTRING, 0, (LPARAM)client); + } + else { + SendMessage(child, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)client); + } + } - if (!IsWindowVisible(m_window)) { - // position it by the mouse - POINT cursorPos; - GetCursorPos(&cursorPos); - RECT windowRect; - GetWindowRect(m_window, &windowRect); - int x = cursorPos.x; - int y = cursorPos.y; - int fw = GetSystemMetrics(SM_CXDLGFRAME); - int fh = GetSystemMetrics(SM_CYDLGFRAME); - int ww = windowRect.right - windowRect.left; - int wh = windowRect.bottom - windowRect.top; - int sw = GetSystemMetrics(SM_CXFULLSCREEN); - int sh = GetSystemMetrics(SM_CYFULLSCREEN); - if (fw < 1) { - fw = 1; - } - if (fh < 1) { - fh = 1; - } - if (x + ww - fw > sw) { - x -= ww - fw; - } - else { - x -= fw; - } - if (x < 0) { - x = 0; - } - if (y + wh - fh > sh) { - y -= wh - fh; - } - else { - y -= fh; - } - if (y < 0) { - y = 0; - } - SetWindowPos(m_window, HWND_TOPMOST, x, y, ww, wh, - SWP_SHOWWINDOW); - } + if (!IsWindowVisible(m_window)) { + // position it by the mouse + POINT cursorPos; + GetCursorPos(&cursorPos); + RECT windowRect; + GetWindowRect(m_window, &windowRect); + int x = cursorPos.x; + int y = cursorPos.y; + int fw = GetSystemMetrics(SM_CXDLGFRAME); + int fh = GetSystemMetrics(SM_CYDLGFRAME); + int ww = windowRect.right - windowRect.left; + int wh = windowRect.bottom - windowRect.top; + int sw = GetSystemMetrics(SM_CXFULLSCREEN); + int sh = GetSystemMetrics(SM_CYFULLSCREEN); + if (fw < 1) { + fw = 1; + } + if (fh < 1) { + fh = 1; + } + if (x + ww - fw > sw) { + x -= ww - fw; + } + else { + x -= fw; + } + if (x < 0) { + x = 0; + } + if (y + wh - fh > sh) { + y -= wh - fh; + } + else { + y -= fh; + } + if (y < 0) { + y = 0; + } + SetWindowPos(m_window, HWND_TOPMOST, x, y, ww, wh, + SWP_SHOWWINDOW); + } } void MSWindowsServerTaskBarReceiver::runMenu(int x, int y) { - // do popup menu. we need a window to pass to TrackPopupMenu(). - // the SetForegroundWindow() and SendMessage() calls around - // TrackPopupMenu() are to get the menu to be dismissed when - // another window gets activated and are just one of those - // win32 weirdnesses. - createWindow(); - SetForegroundWindow(m_window); - HMENU menu = GetSubMenu(m_menu, 0); - SetMenuDefaultItem(menu, IDC_TASKBAR_STATUS, FALSE); - HMENU logLevelMenu = GetSubMenu(menu, 3); - CheckMenuRadioItem(logLevelMenu, 0, 6, - CLOG->getFilter() - kERROR, MF_BYPOSITION); - int n = TrackPopupMenu(menu, - TPM_NONOTIFY | - TPM_RETURNCMD | - TPM_LEFTBUTTON | - TPM_RIGHTBUTTON, - x, y, 0, m_window, NULL); - SendMessage(m_window, WM_NULL, 0, 0); + // do popup menu. we need a window to pass to TrackPopupMenu(). + // the SetForegroundWindow() and SendMessage() calls around + // TrackPopupMenu() are to get the menu to be dismissed when + // another window gets activated and are just one of those + // win32 weirdnesses. + createWindow(); + SetForegroundWindow(m_window); + HMENU menu = GetSubMenu(m_menu, 0); + SetMenuDefaultItem(menu, IDC_TASKBAR_STATUS, FALSE); + HMENU logLevelMenu = GetSubMenu(menu, 3); + CheckMenuRadioItem(logLevelMenu, 0, 6, + CLOG->getFilter() - kERROR, MF_BYPOSITION); + int n = TrackPopupMenu(menu, + TPM_NONOTIFY | + TPM_RETURNCMD | + TPM_LEFTBUTTON | + TPM_RIGHTBUTTON, + x, y, 0, m_window, NULL); + SendMessage(m_window, WM_NULL, 0, 0); - // perform the requested operation - switch (n) { - case IDC_TASKBAR_STATUS: - showStatus(); - break; + // perform the requested operation + switch (n) { + case IDC_TASKBAR_STATUS: + showStatus(); + break; - case IDC_TASKBAR_LOG: - copyLog(); - break; + case IDC_TASKBAR_LOG: + copyLog(); + break; - case IDC_TASKBAR_SHOW_LOG: - ARCH->showConsole(true); - break; + case IDC_TASKBAR_SHOW_LOG: + ARCH->showConsole(true); + break; - case IDC_RELOAD_CONFIG: - m_events->addEvent(Event(m_events->forServerApp().reloadConfig(), - m_events->getSystemTarget())); - break; + case IDC_RELOAD_CONFIG: + m_events->addEvent(Event(m_events->forServerApp().reloadConfig(), + m_events->getSystemTarget())); + break; - case IDC_FORCE_RECONNECT: - m_events->addEvent(Event(m_events->forServerApp().forceReconnect(), - m_events->getSystemTarget())); - break; + case IDC_FORCE_RECONNECT: + m_events->addEvent(Event(m_events->forServerApp().forceReconnect(), + m_events->getSystemTarget())); + break; - case ID_SYNERGY_RESETSERVER: - m_events->addEvent(Event(m_events->forServerApp().resetServer(), - m_events->getSystemTarget())); - break; + case ID_SYNERGY_RESETSERVER: + m_events->addEvent(Event(m_events->forServerApp().resetServer(), + m_events->getSystemTarget())); + break; - case IDC_TASKBAR_LOG_LEVEL_ERROR: - CLOG->setFilter(kERROR); - break; + case IDC_TASKBAR_LOG_LEVEL_ERROR: + CLOG->setFilter(kERROR); + break; - case IDC_TASKBAR_LOG_LEVEL_WARNING: - CLOG->setFilter(kWARNING); - break; + case IDC_TASKBAR_LOG_LEVEL_WARNING: + CLOG->setFilter(kWARNING); + break; - case IDC_TASKBAR_LOG_LEVEL_NOTE: - CLOG->setFilter(kNOTE); - break; + case IDC_TASKBAR_LOG_LEVEL_NOTE: + CLOG->setFilter(kNOTE); + break; - case IDC_TASKBAR_LOG_LEVEL_INFO: - CLOG->setFilter(kINFO); - break; + case IDC_TASKBAR_LOG_LEVEL_INFO: + CLOG->setFilter(kINFO); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG: - CLOG->setFilter(kDEBUG); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG: + CLOG->setFilter(kDEBUG); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG1: - CLOG->setFilter(kDEBUG1); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG1: + CLOG->setFilter(kDEBUG1); + break; - case IDC_TASKBAR_LOG_LEVEL_DEBUG2: - CLOG->setFilter(kDEBUG2); - break; + case IDC_TASKBAR_LOG_LEVEL_DEBUG2: + CLOG->setFilter(kDEBUG2); + break; - case IDC_TASKBAR_QUIT: - quit(); - break; - } + case IDC_TASKBAR_QUIT: + quit(); + break; + } } void MSWindowsServerTaskBarReceiver::primaryAction() { - showStatus(); + showStatus(); } const IArchTaskBarReceiver::Icon MSWindowsServerTaskBarReceiver::getIcon() const { - return static_cast(m_icon[getStatus()]); + return static_cast(m_icon[getStatus()]); } void MSWindowsServerTaskBarReceiver::copyLog() const { - if (m_logBuffer != NULL) { - // collect log buffer - String data; - for (BufferedLogOutputter::const_iterator index = m_logBuffer->begin(); - index != m_logBuffer->end(); ++index) { - data += *index; - data += "\n"; - } + if (m_logBuffer != NULL) { + // collect log buffer + String data; + for (BufferedLogOutputter::const_iterator index = m_logBuffer->begin(); + index != m_logBuffer->end(); ++index) { + data += *index; + data += "\n"; + } - // copy log to clipboard - if (!data.empty()) { - MSWindowsClipboard clipboard(m_window); - clipboard.open(0); - clipboard.emptyUnowned(); - clipboard.add(IClipboard::kText, data); - clipboard.close(); - } - } + // copy log to clipboard + if (!data.empty()) { + MSWindowsClipboard clipboard(m_window); + clipboard.open(0); + clipboard.emptyUnowned(); + clipboard.add(IClipboard::kText, data); + clipboard.close(); + } + } } void MSWindowsServerTaskBarReceiver::onStatusChanged() { - if (IsWindowVisible(m_window)) { - showStatus(); - } + if (IsWindowVisible(m_window)) { + showStatus(); + } } HICON MSWindowsServerTaskBarReceiver::loadIcon(UINT id) { - HANDLE icon = LoadImage(m_appInstance, - MAKEINTRESOURCE(id), - IMAGE_ICON, - 0, 0, - LR_DEFAULTCOLOR); - return static_cast(icon); + HANDLE icon = LoadImage(m_appInstance, + MAKEINTRESOURCE(id), + IMAGE_ICON, + 0, 0, + LR_DEFAULTCOLOR); + return static_cast(icon); } void MSWindowsServerTaskBarReceiver::deleteIcon(HICON icon) { - if (icon != NULL) { - DestroyIcon(icon); - } + if (icon != NULL) { + DestroyIcon(icon); + } } void MSWindowsServerTaskBarReceiver::createWindow() { - // ignore if already created - if (m_window != NULL) { - return; - } + // ignore if already created + if (m_window != NULL) { + return; + } - // get the status dialog - m_window = CreateDialogParam(m_appInstance, - MAKEINTRESOURCE(IDD_TASKBAR_STATUS), - NULL, - (DLGPROC)&MSWindowsServerTaskBarReceiver::staticDlgProc, - reinterpret_cast( - static_cast(this))); + // get the status dialog + m_window = CreateDialogParam(m_appInstance, + MAKEINTRESOURCE(IDD_TASKBAR_STATUS), + NULL, + (DLGPROC)&MSWindowsServerTaskBarReceiver::staticDlgProc, + reinterpret_cast( + static_cast(this))); - // window should appear on top of everything, including (especially) - // the task bar. - LONG_PTR style = GetWindowLongPtr(m_window, GWL_EXSTYLE); - style |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST; - SetWindowLongPtr(m_window, GWL_EXSTYLE, style); + // window should appear on top of everything, including (especially) + // the task bar. + LONG_PTR style = GetWindowLongPtr(m_window, GWL_EXSTYLE); + style |= WS_EX_TOOLWINDOW | WS_EX_TOPMOST; + SetWindowLongPtr(m_window, GWL_EXSTYLE, style); - // tell the task bar about this dialog - ArchTaskBarWindows::addDialog(m_window); + // tell the task bar about this dialog + ArchTaskBarWindows::addDialog(m_window); } void MSWindowsServerTaskBarReceiver::destroyWindow() { - if (m_window != NULL) { - ArchTaskBarWindows::removeDialog(m_window); - DestroyWindow(m_window); - m_window = NULL; - } + if (m_window != NULL) { + ArchTaskBarWindows::removeDialog(m_window); + DestroyWindow(m_window); + m_window = NULL; + } } BOOL MSWindowsServerTaskBarReceiver::dlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM) + UINT msg, WPARAM wParam, LPARAM) { - switch (msg) { - case WM_INITDIALOG: - // use default focus - return TRUE; + switch (msg) { + case WM_INITDIALOG: + // use default focus + return TRUE; - case WM_ACTIVATE: - // hide when another window is activated - if (LOWORD(wParam) == WA_INACTIVE) { - ShowWindow(hwnd, SW_HIDE); - } - break; - } - return FALSE; + case WM_ACTIVATE: + // hide when another window is activated + if (LOWORD(wParam) == WA_INACTIVE) { + ShowWindow(hwnd, SW_HIDE); + } + break; + } + return FALSE; } BOOL CALLBACK MSWindowsServerTaskBarReceiver::staticDlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam) + UINT msg, WPARAM wParam, LPARAM lParam) { - // if msg is WM_INITDIALOG, extract the MSWindowsServerTaskBarReceiver* - // and put it in the extra window data then forward the call. - MSWindowsServerTaskBarReceiver* self = NULL; - if (msg == WM_INITDIALOG) { - self = static_cast( - reinterpret_cast(lParam)); - SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam); - } - else { - // get the extra window data and forward the call - LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); - if (data != 0) { - self = static_cast( - reinterpret_cast(data)); - } - } + // if msg is WM_INITDIALOG, extract the MSWindowsServerTaskBarReceiver* + // and put it in the extra window data then forward the call. + MSWindowsServerTaskBarReceiver* self = NULL; + if (msg == WM_INITDIALOG) { + self = static_cast( + reinterpret_cast(lParam)); + SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam); + } + else { + // get the extra window data and forward the call + LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); + if (data != 0) { + self = static_cast( + reinterpret_cast(data)); + } + } - // forward the message - if (self != NULL) { - return self->dlgProc(hwnd, msg, wParam, lParam); - } - else { - return (msg == WM_INITDIALOG) ? TRUE : FALSE; - } + // forward the message + if (self != NULL) { + return self->dlgProc(hwnd, msg, wParam, lParam); + } + else { + return (msg == WM_INITDIALOG) ? TRUE : FALSE; + } } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - ArchMiscWindows::setIcons( - (HICON)LoadImage(ArchMiscWindows::instanceWin32(), - MAKEINTRESOURCE(IDI_SYNERGY), - IMAGE_ICON, - 32, 32, LR_SHARED), - (HICON)LoadImage(ArchMiscWindows::instanceWin32(), - MAKEINTRESOURCE(IDI_SYNERGY), - IMAGE_ICON, - 16, 16, LR_SHARED)); + ArchMiscWindows::setIcons( + (HICON)LoadImage(ArchMiscWindows::instanceWin32(), + MAKEINTRESOURCE(IDI_SYNERGY), + IMAGE_ICON, + 32, 32, LR_SHARED), + (HICON)LoadImage(ArchMiscWindows::instanceWin32(), + MAKEINTRESOURCE(IDI_SYNERGY), + IMAGE_ICON, + 16, 16, LR_SHARED)); - return new MSWindowsServerTaskBarReceiver( - MSWindowsScreen::getWindowInstance(), logBuffer, events); + return new MSWindowsServerTaskBarReceiver( + MSWindowsScreen::getWindowInstance(), logBuffer, events); } diff --git a/src/cmd/synergys/MSWindowsServerTaskBarReceiver.h b/src/cmd/synergys/MSWindowsServerTaskBarReceiver.h index 15c11078..07f03366 100644 --- a/src/cmd/synergys/MSWindowsServerTaskBarReceiver.h +++ b/src/cmd/synergys/MSWindowsServerTaskBarReceiver.h @@ -29,41 +29,41 @@ class IEventQueue; //! Implementation of ServerTaskBarReceiver for Microsoft Windows class MSWindowsServerTaskBarReceiver : public ServerTaskBarReceiver { public: - MSWindowsServerTaskBarReceiver(HINSTANCE, const BufferedLogOutputter*, IEventQueue* events); - virtual ~MSWindowsServerTaskBarReceiver(); + MSWindowsServerTaskBarReceiver(HINSTANCE, const BufferedLogOutputter*, IEventQueue* events); + virtual ~MSWindowsServerTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; - void cleanup(); + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; + void cleanup(); protected: - void copyLog() const; + void copyLog() const; - // ServerTaskBarReceiver overrides - virtual void onStatusChanged(); + // ServerTaskBarReceiver overrides + virtual void onStatusChanged(); private: - HICON loadIcon(UINT); - void deleteIcon(HICON); - void createWindow(); - void destroyWindow(); + HICON loadIcon(UINT); + void deleteIcon(HICON); + void createWindow(); + void destroyWindow(); - BOOL dlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam); - static BOOL CALLBACK - staticDlgProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam); + BOOL dlgProc(HWND hwnd, + UINT msg, WPARAM wParam, LPARAM lParam); + static BOOL CALLBACK + staticDlgProc(HWND hwnd, + UINT msg, WPARAM wParam, LPARAM lParam); private: - HINSTANCE m_appInstance; - HWND m_window; - HMENU m_menu; - HICON m_icon[kMaxState]; - const BufferedLogOutputter* m_logBuffer; - IEventQueue* m_events; + HINSTANCE m_appInstance; + HWND m_window; + HMENU m_menu; + HICON m_icon[kMaxState]; + const BufferedLogOutputter* m_logBuffer; + IEventQueue* m_events; - static const UINT s_stateToIconID[]; + static const UINT s_stateToIconID[]; }; diff --git a/src/cmd/synergys/OSXServerTaskBarReceiver.cpp b/src/cmd/synergys/OSXServerTaskBarReceiver.cpp index d919f76f..e7741a03 100644 --- a/src/cmd/synergys/OSXServerTaskBarReceiver.cpp +++ b/src/cmd/synergys/OSXServerTaskBarReceiver.cpp @@ -24,44 +24,44 @@ // OSXServerTaskBarReceiver::OSXServerTaskBarReceiver( - const BufferedLogOutputter*, IEventQueue* events) : + const BufferedLogOutputter*, IEventQueue* events) : ServerTaskBarReceiver(events) { - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } OSXServerTaskBarReceiver::~OSXServerTaskBarReceiver() { - ARCH->removeReceiver(this); + ARCH->removeReceiver(this); } void OSXServerTaskBarReceiver::showStatus() { - // do nothing + // do nothing } void OSXServerTaskBarReceiver::runMenu(int, int) { - // do nothing + // do nothing } void OSXServerTaskBarReceiver::primaryAction() { - // do nothing + // do nothing } const IArchTaskBarReceiver::Icon OSXServerTaskBarReceiver::getIcon() const { - return NULL; + return NULL; } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - return new OSXServerTaskBarReceiver(logBuffer, events); + return new OSXServerTaskBarReceiver(logBuffer, events); } diff --git a/src/cmd/synergys/OSXServerTaskBarReceiver.h b/src/cmd/synergys/OSXServerTaskBarReceiver.h index 1943c65a..c230ee53 100644 --- a/src/cmd/synergys/OSXServerTaskBarReceiver.h +++ b/src/cmd/synergys/OSXServerTaskBarReceiver.h @@ -25,12 +25,12 @@ class BufferedLogOutputter; //! Implementation of ServerTaskBarReceiver for OS X class OSXServerTaskBarReceiver : public ServerTaskBarReceiver { public: - OSXServerTaskBarReceiver(const BufferedLogOutputter*, IEventQueue* events); - virtual ~OSXServerTaskBarReceiver(); + OSXServerTaskBarReceiver(const BufferedLogOutputter*, IEventQueue* events); + virtual ~OSXServerTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; }; diff --git a/src/cmd/synergys/XWindowsServerTaskBarReceiver.cpp b/src/cmd/synergys/XWindowsServerTaskBarReceiver.cpp index f0e69fde..2e07e587 100644 --- a/src/cmd/synergys/XWindowsServerTaskBarReceiver.cpp +++ b/src/cmd/synergys/XWindowsServerTaskBarReceiver.cpp @@ -24,44 +24,44 @@ // CXWindowsServerTaskBarReceiver::CXWindowsServerTaskBarReceiver( - const BufferedLogOutputter*, IEventQueue* events) : - ServerTaskBarReceiver(events) + const BufferedLogOutputter*, IEventQueue* events) : + ServerTaskBarReceiver(events) { - // add ourself to the task bar - ARCH->addReceiver(this); + // add ourself to the task bar + ARCH->addReceiver(this); } CXWindowsServerTaskBarReceiver::~CXWindowsServerTaskBarReceiver() { - ARCH->removeReceiver(this); + ARCH->removeReceiver(this); } void CXWindowsServerTaskBarReceiver::showStatus() { - // do nothing + // do nothing } void CXWindowsServerTaskBarReceiver::runMenu(int, int) { - // do nothing + // do nothing } void CXWindowsServerTaskBarReceiver::primaryAction() { - // do nothing + // do nothing } const IArchTaskBarReceiver::Icon CXWindowsServerTaskBarReceiver::getIcon() const { - return NULL; + return NULL; } IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events) { - return new CXWindowsServerTaskBarReceiver(logBuffer, events); + return new CXWindowsServerTaskBarReceiver(logBuffer, events); } diff --git a/src/cmd/synergys/XWindowsServerTaskBarReceiver.h b/src/cmd/synergys/XWindowsServerTaskBarReceiver.h index 34a0dc26..351fe80a 100644 --- a/src/cmd/synergys/XWindowsServerTaskBarReceiver.h +++ b/src/cmd/synergys/XWindowsServerTaskBarReceiver.h @@ -26,13 +26,13 @@ class IEventQueue; //! Implementation of ServerTaskBarReceiver for X Windows class CXWindowsServerTaskBarReceiver : public ServerTaskBarReceiver { public: - CXWindowsServerTaskBarReceiver( - const BufferedLogOutputter*, IEventQueue* events); - virtual ~CXWindowsServerTaskBarReceiver(); + CXWindowsServerTaskBarReceiver( + const BufferedLogOutputter*, IEventQueue* events); + virtual ~CXWindowsServerTaskBarReceiver(); - // IArchTaskBarReceiver overrides - virtual void showStatus(); - virtual void runMenu(int x, int y); - virtual void primaryAction(); - virtual const Icon getIcon() const; + // IArchTaskBarReceiver overrides + virtual void showStatus(); + virtual void runMenu(int x, int y); + virtual void primaryAction(); + virtual const Icon getIcon() const; }; diff --git a/src/cmd/synergys/synergys.cpp b/src/cmd/synergys/synergys.cpp index 97258f85..e1e787f7 100644 --- a/src/cmd/synergys/synergys.cpp +++ b/src/cmd/synergys/synergys.cpp @@ -35,16 +35,16 @@ int main(int argc, char** argv) { #if SYSAPI_WIN32 - // record window instance for tray icon, etc - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // record window instance for tray icon, etc + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - - Arch arch; - arch.init(); + + Arch arch; + arch.init(); - Log log; - EventQueue events; + Log log; + EventQueue events; - ServerApp app(&events, createTaskBarReceiver); - return app.run(argc, argv); + ServerApp app(&events, createTaskBarReceiver); + return app.run(argc, argv); } diff --git a/src/cmd/syntool/CMakeLists.txt b/src/cmd/syntool/CMakeLists.txt index e79ea4a9..b3c497f4 100644 --- a/src/cmd/syntool/CMakeLists.txt +++ b/src/cmd/syntool/CMakeLists.txt @@ -17,26 +17,26 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") include_directories( - ../ - ../../lib/ + ../ + ../../lib/ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_executable(syntool ${sources}) target_link_libraries(syntool - synergy arch base client common io ipc mt net platform server ${libs} ${OPENSSL_LIBS}) + synergy arch base client common io ipc mt net platform server ${libs} ${OPENSSL_LIBS}) if (WIN32) else () - if (CONF_CPACK) - install(TARGETS - syntool - COMPONENT core - DESTINATION bin) - endif() + if (CONF_CPACK) + install(TARGETS + syntool + COMPONENT core + DESTINATION bin) + endif() endif() diff --git a/src/cmd/syntool/syntool.cpp b/src/cmd/syntool/syntool.cpp index c93d4256..cf3d8e99 100644 --- a/src/cmd/syntool/syntool.cpp +++ b/src/cmd/syntool/syntool.cpp @@ -22,10 +22,10 @@ int main(int argc, char** argv) { #if SYSAPI_WIN32 - // record window instance for tray icon, etc - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // record window instance for tray icon, etc + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - ToolApp app; - return app.run(argc, argv); + ToolApp app; + return app.run(argc, argv); } diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 3ef5c65b..23088f98 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -10,21 +10,21 @@ file (GLOB LEGACY_GUI_SOURCE_FILES src/*.cpp src/*.h) file (GLOB LEGACY_GUI_UI_FILES res/*.ui) add_executable (synergyx - ${LEGACY_GUI_SOURCE_FILES} - ${LEGACY_GUI_UI_FILES} - res/Synergy.qrc + ${LEGACY_GUI_SOURCE_FILES} + ${LEGACY_GUI_UI_FILES} + res/Synergy.qrc ) include_directories (../lib/shared ./src) if (WIN32) - include_directories ($ENV{BONJOUR_SDK_HOME}/Include) - find_library (DNSSD_LIB dnssd.lib - HINTS ENV BONJOUR_SDK_HOME - PATH_SUFFIXES "Lib/x64") + include_directories ($ENV{BONJOUR_SDK_HOME}/Include) + find_library (DNSSD_LIB dnssd.lib + HINTS ENV BONJOUR_SDK_HOME + PATH_SUFFIXES "Lib/x64") endif() qt5_use_modules (synergyx Widgets Network) target_link_libraries (synergyx ${DNSSD_LIB} shared) set_target_properties (synergyx PROPERTIES - LINK_FLAGS "/NODEFAULTLIB:LIBCMT") + LINK_FLAGS "/NODEFAULTLIB:LIBCMT") diff --git a/src/gui/src/AboutDialog.h b/src/gui/src/AboutDialog.h index 8e1d966f..bb53125b 100644 --- a/src/gui/src/AboutDialog.h +++ b/src/gui/src/AboutDialog.h @@ -30,13 +30,13 @@ class QString; class AboutDialog : public QDialog, public Ui::AboutDialogBase { - Q_OBJECT + Q_OBJECT - public: - AboutDialog(QWidget* parent, const QString& synergyApp = QString()); + public: + AboutDialog(QWidget* parent, const QString& synergyApp = QString()); - private: - VersionChecker m_versionChecker; + private: + VersionChecker m_versionChecker; }; #endif diff --git a/src/gui/src/Action.cpp b/src/gui/src/Action.cpp index e4930e10..5d3792ef 100644 --- a/src/gui/src/Action.cpp +++ b/src/gui/src/Action.cpp @@ -23,128 +23,128 @@ const char* Action::m_ActionTypeNames[] = { - "keyDown", "keyUp", "keystroke", - "switchToScreen", "switchInDirection", "lockCursorToScreen", - "mouseDown", "mouseUp", "mousebutton" + "keyDown", "keyUp", "keystroke", + "switchToScreen", "switchInDirection", "lockCursorToScreen", + "mouseDown", "mouseUp", "mousebutton" }; const char* Action::m_SwitchDirectionNames[] = { "left", "right", "up", "down" }; const char* Action::m_LockCursorModeNames[] = { "toggle", "on", "off" }; Action::Action() : - m_KeySequence(), - m_Type(keystroke), - m_TypeScreenNames(), - m_SwitchScreenName(), - m_SwitchDirection(switchLeft), - m_LockCursorMode(lockCursorToggle), - m_ActiveOnRelease(false), - m_HasScreens(false) + m_KeySequence(), + m_Type(keystroke), + m_TypeScreenNames(), + m_SwitchScreenName(), + m_SwitchDirection(switchLeft), + m_LockCursorMode(lockCursorToggle), + m_ActiveOnRelease(false), + m_HasScreens(false) { } QString Action::text() const { - QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]) + "("; + QString text = QString(m_ActionTypeNames[keySequence().isMouseButton() ? type() + 6 : type() ]) + "("; - switch (type()) - { - case keyDown: - case keyUp: - case keystroke: - { - text += keySequence().toString(); + switch (type()) + { + case keyDown: + case keyUp: + case keystroke: + { + text += keySequence().toString(); - if (!keySequence().isMouseButton()) - { - const QStringList& screens = typeScreenNames(); - if (haveScreens() && !screens.isEmpty()) - { - text += ","; + if (!keySequence().isMouseButton()) + { + const QStringList& screens = typeScreenNames(); + if (haveScreens() && !screens.isEmpty()) + { + text += ","; - for (int i = 0; i < screens.size(); i++) - { - text += screens[i]; - if (i != screens.size() - 1) - text += ":"; - } - } - else - text += ",*"; - } - } - break; + for (int i = 0; i < screens.size(); i++) + { + text += screens[i]; + if (i != screens.size() - 1) + text += ":"; + } + } + else + text += ",*"; + } + } + break; - case switchToScreen: - text += switchScreenName(); - break; + case switchToScreen: + text += switchScreenName(); + break; - case switchInDirection: - text += m_SwitchDirectionNames[m_SwitchDirection]; - break; + case switchInDirection: + text += m_SwitchDirectionNames[m_SwitchDirection]; + break; - case lockCursorToScreen: - text += m_LockCursorModeNames[m_LockCursorMode]; - break; + case lockCursorToScreen: + text += m_LockCursorModeNames[m_LockCursorMode]; + break; - default: - Q_ASSERT(0); - break; - } + default: + Q_ASSERT(0); + break; + } - text += ")"; + text += ")"; - return text; + return text; } void Action::loadSettings(QSettings& settings) { - keySequence().loadSettings(settings); - setType(settings.value("type", keyDown).toInt()); + keySequence().loadSettings(settings); + setType(settings.value("type", keyDown).toInt()); - typeScreenNames().clear(); - int numTypeScreens = settings.beginReadArray("typeScreenNames"); - for (int i = 0; i < numTypeScreens; i++) - { - settings.setArrayIndex(i); - typeScreenNames().append(settings.value("typeScreenName").toString()); - } - settings.endArray(); + typeScreenNames().clear(); + int numTypeScreens = settings.beginReadArray("typeScreenNames"); + for (int i = 0; i < numTypeScreens; i++) + { + settings.setArrayIndex(i); + typeScreenNames().append(settings.value("typeScreenName").toString()); + } + settings.endArray(); - setSwitchScreenName(settings.value("switchScreenName").toString()); - setSwitchDirection(settings.value("switchInDirection", switchLeft).toInt()); - setLockCursorMode(settings.value("lockCursorToScreen", lockCursorToggle).toInt()); - setActiveOnRelease(settings.value("activeOnRelease", false).toBool()); - setHaveScreens(settings.value("hasScreens", false).toBool()); + setSwitchScreenName(settings.value("switchScreenName").toString()); + setSwitchDirection(settings.value("switchInDirection", switchLeft).toInt()); + setLockCursorMode(settings.value("lockCursorToScreen", lockCursorToggle).toInt()); + setActiveOnRelease(settings.value("activeOnRelease", false).toBool()); + setHaveScreens(settings.value("hasScreens", false).toBool()); } void Action::saveSettings(QSettings& settings) const { - keySequence().saveSettings(settings); - settings.setValue("type", type()); + keySequence().saveSettings(settings); + settings.setValue("type", type()); - settings.beginWriteArray("typeScreenNames"); - for (int i = 0; i < typeScreenNames().size(); i++) - { - settings.setArrayIndex(i); - settings.setValue("typeScreenName", typeScreenNames()[i]); - } - settings.endArray(); + settings.beginWriteArray("typeScreenNames"); + for (int i = 0; i < typeScreenNames().size(); i++) + { + settings.setArrayIndex(i); + settings.setValue("typeScreenName", typeScreenNames()[i]); + } + settings.endArray(); - settings.setValue("switchScreenName", switchScreenName()); - settings.setValue("switchInDirection", switchDirection()); - settings.setValue("lockCursorToScreen", lockCursorMode()); - settings.setValue("activeOnRelease", activeOnRelease()); - settings.setValue("hasScreens", haveScreens()); + settings.setValue("switchScreenName", switchScreenName()); + settings.setValue("switchInDirection", switchDirection()); + settings.setValue("lockCursorToScreen", lockCursorMode()); + settings.setValue("activeOnRelease", activeOnRelease()); + settings.setValue("hasScreens", haveScreens()); } QTextStream& operator<<(QTextStream& outStream, const Action& action) { - if (action.activeOnRelease()) - outStream << ";"; + if (action.activeOnRelease()) + outStream << ";"; - outStream << action.text(); + outStream << action.text(); - return outStream; + return outStream; } diff --git a/src/gui/src/Action.h b/src/gui/src/Action.h index 18845df4..dea98df6 100644 --- a/src/gui/src/Action.h +++ b/src/gui/src/Action.h @@ -32,54 +32,54 @@ class QTextStream; class Action { - friend class ActionDialog; - friend QTextStream& operator<<(QTextStream& outStream, const Action& action); + friend class ActionDialog; + friend QTextStream& operator<<(QTextStream& outStream, const Action& action); - public: - enum ActionType { keyDown, keyUp, keystroke, switchToScreen, switchInDirection, lockCursorToScreen, mouseDown, mouseUp, mousebutton }; - enum SwitchDirection { switchLeft, switchRight, switchUp, switchDown }; - enum LockCursorMode { lockCursorToggle, lockCursonOn, lockCursorOff }; + public: + enum ActionType { keyDown, keyUp, keystroke, switchToScreen, switchInDirection, lockCursorToScreen, mouseDown, mouseUp, mousebutton }; + enum SwitchDirection { switchLeft, switchRight, switchUp, switchDown }; + enum LockCursorMode { lockCursorToggle, lockCursonOn, lockCursorOff }; - public: - Action(); + public: + Action(); - public: - QString text() const; - const KeySequence& keySequence() const { return m_KeySequence; } - void loadSettings(QSettings& settings); - void saveSettings(QSettings& settings) const; - int type() const { return m_Type; } - const QStringList& typeScreenNames() const { return m_TypeScreenNames; } - const QString& switchScreenName() const { return m_SwitchScreenName; } - int switchDirection() const { return m_SwitchDirection; } - int lockCursorMode() const { return m_LockCursorMode; } - bool activeOnRelease() const { return m_ActiveOnRelease; } - bool haveScreens() const { return m_HasScreens; } + public: + QString text() const; + const KeySequence& keySequence() const { return m_KeySequence; } + void loadSettings(QSettings& settings); + void saveSettings(QSettings& settings) const; + int type() const { return m_Type; } + const QStringList& typeScreenNames() const { return m_TypeScreenNames; } + const QString& switchScreenName() const { return m_SwitchScreenName; } + int switchDirection() const { return m_SwitchDirection; } + int lockCursorMode() const { return m_LockCursorMode; } + bool activeOnRelease() const { return m_ActiveOnRelease; } + bool haveScreens() const { return m_HasScreens; } - protected: - KeySequence& keySequence() { return m_KeySequence; } - void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; } - void setType(int t) { m_Type = t; } - QStringList& typeScreenNames() { return m_TypeScreenNames; } - void setSwitchScreenName(const QString& n) { m_SwitchScreenName = n; } - void setSwitchDirection(int d) { m_SwitchDirection = d; } - void setLockCursorMode(int m) { m_LockCursorMode = m; } - void setActiveOnRelease(bool b) { m_ActiveOnRelease = b; } - void setHaveScreens(bool b) { m_HasScreens = b; } + protected: + KeySequence& keySequence() { return m_KeySequence; } + void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; } + void setType(int t) { m_Type = t; } + QStringList& typeScreenNames() { return m_TypeScreenNames; } + void setSwitchScreenName(const QString& n) { m_SwitchScreenName = n; } + void setSwitchDirection(int d) { m_SwitchDirection = d; } + void setLockCursorMode(int m) { m_LockCursorMode = m; } + void setActiveOnRelease(bool b) { m_ActiveOnRelease = b; } + void setHaveScreens(bool b) { m_HasScreens = b; } - private: - KeySequence m_KeySequence; - int m_Type; - QStringList m_TypeScreenNames; - QString m_SwitchScreenName; - int m_SwitchDirection; - int m_LockCursorMode; - bool m_ActiveOnRelease; - bool m_HasScreens; + private: + KeySequence m_KeySequence; + int m_Type; + QStringList m_TypeScreenNames; + QString m_SwitchScreenName; + int m_SwitchDirection; + int m_LockCursorMode; + bool m_ActiveOnRelease; + bool m_HasScreens; - static const char* m_ActionTypeNames[]; - static const char* m_SwitchDirectionNames[]; - static const char* m_LockCursorModeNames[]; + static const char* m_ActionTypeNames[]; + static const char* m_SwitchDirectionNames[]; + static const char* m_LockCursorModeNames[]; }; typedef QList ActionList; diff --git a/src/gui/src/ActionDialog.cpp b/src/gui/src/ActionDialog.cpp index 3fc951fc..94950338 100644 --- a/src/gui/src/ActionDialog.cpp +++ b/src/gui/src/ActionDialog.cpp @@ -27,83 +27,83 @@ #include ActionDialog::ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::ActionDialogBase(), - m_ServerConfig(config), - m_Hotkey(hotkey), - m_Action(action), - m_pButtonGroupType(new QButtonGroup(this)) + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::ActionDialogBase(), + m_ServerConfig(config), + m_Hotkey(hotkey), + m_Action(action), + m_pButtonGroupType(new QButtonGroup(this)) { - setupUi(this); + setupUi(this); - // work around Qt Designer's lack of a QButtonGroup; we need it to get - // at the button id of the checked radio button - QRadioButton* const typeButtons[] = { m_pRadioPress, m_pRadioRelease, m_pRadioPressAndRelease, m_pRadioSwitchToScreen, m_pRadioSwitchInDirection, m_pRadioLockCursorToScreen }; + // work around Qt Designer's lack of a QButtonGroup; we need it to get + // at the button id of the checked radio button + QRadioButton* const typeButtons[] = { m_pRadioPress, m_pRadioRelease, m_pRadioPressAndRelease, m_pRadioSwitchToScreen, m_pRadioSwitchInDirection, m_pRadioLockCursorToScreen }; - for (unsigned int i = 0; i < sizeof(typeButtons) / sizeof(typeButtons[0]); i++) - m_pButtonGroupType->addButton(typeButtons[i], i); + for (unsigned int i = 0; i < sizeof(typeButtons) / sizeof(typeButtons[0]); i++) + m_pButtonGroupType->addButton(typeButtons[i], i); - m_pKeySequenceWidgetHotkey->setText(m_Action.keySequence().toString()); - m_pKeySequenceWidgetHotkey->setKeySequence(m_Action.keySequence()); - m_pButtonGroupType->button(m_Action.type())->setChecked(true); - m_pComboSwitchInDirection->setCurrentIndex(m_Action.switchDirection()); - m_pComboLockCursorToScreen->setCurrentIndex(m_Action.lockCursorMode()); + m_pKeySequenceWidgetHotkey->setText(m_Action.keySequence().toString()); + m_pKeySequenceWidgetHotkey->setKeySequence(m_Action.keySequence()); + m_pButtonGroupType->button(m_Action.type())->setChecked(true); + m_pComboSwitchInDirection->setCurrentIndex(m_Action.switchDirection()); + m_pComboLockCursorToScreen->setCurrentIndex(m_Action.lockCursorMode()); - if (m_Action.activeOnRelease()) - m_pRadioHotkeyReleased->setChecked(true); - else - m_pRadioHotkeyPressed->setChecked(true); + if (m_Action.activeOnRelease()) + m_pRadioHotkeyReleased->setChecked(true); + else + m_pRadioHotkeyPressed->setChecked(true); - m_pGroupBoxScreens->setChecked(m_Action.haveScreens()); + m_pGroupBoxScreens->setChecked(m_Action.haveScreens()); - int idx = 0; - foreach(const Screen& screen, serverConfig().screens()) - if (!screen.isNull()) - { - QListWidgetItem *pListItem = new QListWidgetItem(screen.name()); - m_pListScreens->addItem(pListItem); - if (m_Action.typeScreenNames().indexOf(screen.name()) != -1) - m_pListScreens->setCurrentItem(pListItem); + int idx = 0; + foreach(const Screen& screen, serverConfig().screens()) + if (!screen.isNull()) + { + QListWidgetItem *pListItem = new QListWidgetItem(screen.name()); + m_pListScreens->addItem(pListItem); + if (m_Action.typeScreenNames().indexOf(screen.name()) != -1) + m_pListScreens->setCurrentItem(pListItem); - m_pComboSwitchToScreen->addItem(screen.name()); - if (screen.name() == m_Action.switchScreenName()) - m_pComboSwitchToScreen->setCurrentIndex(idx); + m_pComboSwitchToScreen->addItem(screen.name()); + if (screen.name() == m_Action.switchScreenName()) + m_pComboSwitchToScreen->setCurrentIndex(idx); - idx++; - } + idx++; + } } void ActionDialog::accept() { - if (!sequenceWidget()->valid() && m_pButtonGroupType->checkedId() >= 0 && m_pButtonGroupType->checkedId() < 3) - return; + if (!sequenceWidget()->valid() && m_pButtonGroupType->checkedId() >= 0 && m_pButtonGroupType->checkedId() < 3) + return; - m_Action.setKeySequence(sequenceWidget()->keySequence()); - m_Action.setType(m_pButtonGroupType->checkedId()); - m_Action.setHaveScreens(m_pGroupBoxScreens->isChecked()); + m_Action.setKeySequence(sequenceWidget()->keySequence()); + m_Action.setType(m_pButtonGroupType->checkedId()); + m_Action.setHaveScreens(m_pGroupBoxScreens->isChecked()); - m_Action.typeScreenNames().clear(); - foreach(const QListWidgetItem* pItem, m_pListScreens->selectedItems()) - m_Action.typeScreenNames().append(pItem->text()); + m_Action.typeScreenNames().clear(); + foreach(const QListWidgetItem* pItem, m_pListScreens->selectedItems()) + m_Action.typeScreenNames().append(pItem->text()); - m_Action.setSwitchScreenName(m_pComboSwitchToScreen->currentText()); - m_Action.setSwitchDirection(m_pComboSwitchInDirection->currentIndex()); - m_Action.setLockCursorMode(m_pComboLockCursorToScreen->currentIndex()); - m_Action.setActiveOnRelease(m_pRadioHotkeyReleased->isChecked()); + m_Action.setSwitchScreenName(m_pComboSwitchToScreen->currentText()); + m_Action.setSwitchDirection(m_pComboSwitchInDirection->currentIndex()); + m_Action.setLockCursorMode(m_pComboLockCursorToScreen->currentIndex()); + m_Action.setActiveOnRelease(m_pRadioHotkeyReleased->isChecked()); - QDialog::accept(); + QDialog::accept(); } void ActionDialog::on_m_pKeySequenceWidgetHotkey_keySequenceChanged() { - if (sequenceWidget()->keySequence().isMouseButton()) - { - m_pGroupBoxScreens->setEnabled(false); - m_pListScreens->setEnabled(false); - } - else - { - m_pGroupBoxScreens->setEnabled(true); - m_pListScreens->setEnabled(true); - } + if (sequenceWidget()->keySequence().isMouseButton()) + { + m_pGroupBoxScreens->setEnabled(false); + m_pListScreens->setEnabled(false); + } + else + { + m_pGroupBoxScreens->setEnabled(true); + m_pListScreens->setEnabled(true); + } } diff --git a/src/gui/src/ActionDialog.h b/src/gui/src/ActionDialog.h index 882d907f..34e4e856 100644 --- a/src/gui/src/ActionDialog.h +++ b/src/gui/src/ActionDialog.h @@ -32,25 +32,25 @@ class ServerConfig; class ActionDialog : public QDialog, public Ui::ActionDialogBase { - Q_OBJECT + Q_OBJECT - public: - ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action); + public: + ActionDialog(QWidget* parent, ServerConfig& config, Hotkey& hotkey, Action& action); - protected slots: - void accept(); - void on_m_pKeySequenceWidgetHotkey_keySequenceChanged(); + protected slots: + void accept(); + void on_m_pKeySequenceWidgetHotkey_keySequenceChanged(); - protected: - const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; } - const ServerConfig& serverConfig() const { return m_ServerConfig; } + protected: + const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; } + const ServerConfig& serverConfig() const { return m_ServerConfig; } - private: - const ServerConfig& m_ServerConfig; - Hotkey& m_Hotkey; - Action& m_Action; + private: + const ServerConfig& m_ServerConfig; + Hotkey& m_Hotkey; + Action& m_Action; - QButtonGroup* m_pButtonGroupType; + QButtonGroup* m_pButtonGroupType; }; #endif diff --git a/src/gui/src/ActivationDialog.cpp b/src/gui/src/ActivationDialog.cpp index 6035dfa8..1956ccb0 100644 --- a/src/gui/src/ActivationDialog.cpp +++ b/src/gui/src/ActivationDialog.cpp @@ -15,109 +15,109 @@ #include ActivationDialog::ActivationDialog(QWidget* parent, AppConfig& appConfig, - LicenseManager& licenseManager) : - QDialog(parent), - ui(new Ui::ActivationDialog), - m_appConfig(&appConfig), - m_LicenseManager (&licenseManager) + LicenseManager& licenseManager) : + QDialog(parent), + ui(new Ui::ActivationDialog), + m_appConfig(&appConfig), + m_LicenseManager (&licenseManager) { - ui->setupUi(this); - refreshSerialKey(); - time_t currentTime = ::time(0); - if (!m_LicenseManager->serialKey().isExpired(currentTime)) { - ui->m_trialWidget->hide(); - } + ui->setupUi(this); + refreshSerialKey(); + time_t currentTime = ::time(0); + if (!m_LicenseManager->serialKey().isExpired(currentTime)) { + ui->m_trialWidget->hide(); + } } void ActivationDialog::refreshSerialKey() { - ui->m_pTextEditSerialKey->setText(m_appConfig->serialKey()); - ui->m_pTextEditSerialKey->setFocus(); - ui->m_pTextEditSerialKey->moveCursor(QTextCursor::End); - ui->m_trialLabel->setText(tr("

Your trial has " - "expired. Buy now!" - "

") - .arg (m_appConfig->serialKey())); + ui->m_pTextEditSerialKey->setText(m_appConfig->serialKey()); + ui->m_pTextEditSerialKey->setFocus(); + ui->m_pTextEditSerialKey->moveCursor(QTextCursor::End); + ui->m_trialLabel->setText(tr("

Your trial has " + "expired. Buy now!" + "

") + .arg (m_appConfig->serialKey())); } ActivationDialog::~ActivationDialog() { - delete ui; + delete ui; } void ActivationDialog::reject() { - if (m_LicenseManager->activeEdition() == kUnregistered) { - CancelActivationDialog cancelActivationDialog(this); - if (QDialog::Accepted == cancelActivationDialog.exec()) { - m_LicenseManager->skipActivation(); - m_appConfig->activationHasRun(true); - m_appConfig->saveSettings(); - } else { - return; - } - } - QDialog::reject(); + if (m_LicenseManager->activeEdition() == kUnregistered) { + CancelActivationDialog cancelActivationDialog(this); + if (QDialog::Accepted == cancelActivationDialog.exec()) { + m_LicenseManager->skipActivation(); + m_appConfig->activationHasRun(true); + m_appConfig->saveSettings(); + } else { + return; + } + } + QDialog::reject(); } void ActivationDialog::accept() { - QMessageBox message; - m_appConfig->activationHasRun(true); - m_appConfig->saveSettings(); + QMessageBox message; + m_appConfig->activationHasRun(true); + m_appConfig->saveSettings(); - std::pair result; - try { - SerialKey serialKey (ui->m_pTextEditSerialKey->toPlainText(). - trimmed().toStdString()); - result = m_LicenseManager->setSerialKey(serialKey); - } - catch (std::exception& e) { - message.critical(this, "Unknown Error", - tr("An error occurred while trying to activate Synergy. " - "Please contact the helpdesk, and provide the " - "following information:\n\n%1").arg(e.what())); - refreshSerialKey(); - return; - } + std::pair result; + try { + SerialKey serialKey (ui->m_pTextEditSerialKey->toPlainText(). + trimmed().toStdString()); + result = m_LicenseManager->setSerialKey(serialKey); + } + catch (std::exception& e) { + message.critical(this, "Unknown Error", + tr("An error occurred while trying to activate Synergy. " + "Please contact the helpdesk, and provide the " + "following information:\n\n%1").arg(e.what())); + refreshSerialKey(); + return; + } - if (!result.first) { - message.critical(this, "Activation failed", - tr("%1").arg(result.second)); - refreshSerialKey(); - return; - } + if (!result.first) { + message.critical(this, "Activation failed", + tr("%1").arg(result.second)); + refreshSerialKey(); + return; + } - m_LicenseManager->notifyActivation("serial:" + m_appConfig->serialKey()); - Edition edition = m_LicenseManager->activeEdition(); - time_t daysLeft = m_LicenseManager->serialKey().daysLeft(::time(0)); - if (edition != kUnregistered) { - QString thanksMessage = tr("Thanks for trying %1! %5\n\n%2 day%3 of " - "your trial remain%4"). - arg (m_LicenseManager->getEditionName(edition)). - arg (daysLeft). - arg ((daysLeft == 1) ? "" : "s"). - arg ((daysLeft == 1) ? "s" : ""); + m_LicenseManager->notifyActivation("serial:" + m_appConfig->serialKey()); + Edition edition = m_LicenseManager->activeEdition(); + time_t daysLeft = m_LicenseManager->serialKey().daysLeft(::time(0)); + if (edition != kUnregistered) { + QString thanksMessage = tr("Thanks for trying %1! %5\n\n%2 day%3 of " + "your trial remain%4"). + arg (m_LicenseManager->getEditionName(edition)). + arg (daysLeft). + arg ((daysLeft == 1) ? "" : "s"). + arg ((daysLeft == 1) ? "s" : ""); - if (edition == kPro) { - thanksMessage = thanksMessage.arg("If you're using SSL, " - "remember to activate all of your devices."); - } else { - thanksMessage = thanksMessage.arg(""); - } + if (edition == kPro) { + thanksMessage = thanksMessage.arg("If you're using SSL, " + "remember to activate all of your devices."); + } else { + thanksMessage = thanksMessage.arg(""); + } - if (m_LicenseManager->serialKey().isTrial()) { - message.information(this, "Thanks!", thanksMessage); - } - else { - message.information(this, "Activated!", - tr("Thanks for activating %1!").arg - (m_LicenseManager->getEditionName(edition))); - } - } + if (m_LicenseManager->serialKey().isTrial()) { + message.information(this, "Thanks!", thanksMessage); + } + else { + message.information(this, "Activated!", + tr("Thanks for activating %1!").arg + (m_LicenseManager->getEditionName(edition))); + } + } - QDialog::accept(); + QDialog::accept(); } diff --git a/src/gui/src/ActivationDialog.h b/src/gui/src/ActivationDialog.h index 1cc45933..0644bfc9 100644 --- a/src/gui/src/ActivationDialog.h +++ b/src/gui/src/ActivationDialog.h @@ -12,24 +12,24 @@ class AppConfig; class ActivationDialog : public QDialog { - Q_OBJECT + Q_OBJECT public: - ActivationDialog(QWidget *parent, AppConfig& appConfig, - LicenseManager& licenseManager); - ~ActivationDialog(); + ActivationDialog(QWidget *parent, AppConfig& appConfig, + LicenseManager& licenseManager); + ~ActivationDialog(); public slots: - void reject(); - void accept(); + void reject(); + void accept(); protected: - void refreshSerialKey(); + void refreshSerialKey(); private: - Ui::ActivationDialog *ui; - AppConfig* m_appConfig; - LicenseManager* m_LicenseManager; + Ui::ActivationDialog *ui; + AppConfig* m_appConfig; + LicenseManager* m_LicenseManager; }; #endif // ACTIVATIONDIALOG_H diff --git a/src/gui/src/ActivationNotifier.cpp b/src/gui/src/ActivationNotifier.cpp index 0786d90c..cfe99810 100644 --- a/src/gui/src/ActivationNotifier.cpp +++ b/src/gui/src/ActivationNotifier.cpp @@ -20,41 +20,41 @@ #include "CoreInterface.h" ActivationNotifier::ActivationNotifier(QObject *parent) : - QObject(parent) + QObject(parent) { } void ActivationNotifier::setIdentity(QString identity) { - m_Identity = identity; + m_Identity = identity; } void ActivationNotifier::setUpdateInfo(QString const& fromVersion, - QString const& toVersion, - QString const& serialKey) + QString const& toVersion, + QString const& serialKey) { - m_fromVersion = fromVersion; - m_toVersion = toVersion; - m_serialKey = serialKey; + m_fromVersion = fromVersion; + m_toVersion = toVersion; + m_serialKey = serialKey; } void ActivationNotifier::notify() { - CoreInterface coreInterface; - try { - coreInterface.notifyActivation(m_Identity); - } - catch (...) { - // catch all exceptions and fails silently - } + CoreInterface coreInterface; + try { + coreInterface.notifyActivation(m_Identity); + } + catch (...) { + // catch all exceptions and fails silently + } } void ActivationNotifier::notifyUpdate() { - try { - CoreInterface coreInterface; - coreInterface.notifyUpdate(m_fromVersion, m_toVersion, - m_serialKey); - } catch (...) { - } + try { + CoreInterface coreInterface; + coreInterface.notifyUpdate(m_fromVersion, m_toVersion, + m_serialKey); + } catch (...) { + } } diff --git a/src/gui/src/ActivationNotifier.h b/src/gui/src/ActivationNotifier.h index 2ac216c7..36ac76f4 100644 --- a/src/gui/src/ActivationNotifier.h +++ b/src/gui/src/ActivationNotifier.h @@ -24,24 +24,24 @@ class ActivationNotifier : public QObject { Q_OBJECT public: - explicit ActivationNotifier(QObject *parent = 0); + explicit ActivationNotifier(QObject *parent = 0); - void setIdentity(QString identity); - void setUpdateInfo(QString const& fromVersion, - QString const& toVersion, QString const& serialKey); + void setIdentity(QString identity); + void setUpdateInfo(QString const& fromVersion, + QString const& toVersion, QString const& serialKey); public slots: - void notify(); - void notifyUpdate(); + void notify(); + void notifyUpdate(); signals: - void finished(); + void finished(); private: - QString m_Identity; - QString m_fromVersion; - QString m_toVersion; - QString m_serialKey; + QString m_Identity; + QString m_fromVersion; + QString m_toVersion; + QString m_serialKey; }; #endif // ACTIVATIONNOTIFIER_H diff --git a/src/gui/src/AddClientDialog.cpp b/src/gui/src/AddClientDialog.cpp index f14253b7..fd2f1d10 100644 --- a/src/gui/src/AddClientDialog.cpp +++ b/src/gui/src/AddClientDialog.cpp @@ -22,108 +22,108 @@ #include AddClientDialog::AddClientDialog(const QString& clientName, QWidget* parent) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::AddClientDialog(), - m_AddResult(kAddClientIgnore), - m_IgnoreAutoConfigClient(false) + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::AddClientDialog(), + m_AddResult(kAddClientIgnore), + m_IgnoreAutoConfigClient(false) { - setupUi(this); + setupUi(this); - m_pLabelHead->setText("A client wants to connect. " - "Please choose a location for " + clientName + "."); + m_pLabelHead->setText("A client wants to connect. " + "Please choose a location for " + clientName + "."); - QIcon icon(":res/icons/64x64/video-display.png"); - QSize IconSize(32,32); + QIcon icon(":res/icons/64x64/video-display.png"); + QSize IconSize(32,32); - m_pButtonLeft = new QPushButton(this); - m_pButtonLeft->setIcon(icon); - m_pButtonLeft->setIconSize(IconSize); - gridLayout->addWidget(m_pButtonLeft, 2, 0, 1, 1, Qt::AlignCenter); - connect(m_pButtonLeft, SIGNAL(clicked()), this, SLOT(handleButtonLeft())); + m_pButtonLeft = new QPushButton(this); + m_pButtonLeft->setIcon(icon); + m_pButtonLeft->setIconSize(IconSize); + gridLayout->addWidget(m_pButtonLeft, 2, 0, 1, 1, Qt::AlignCenter); + connect(m_pButtonLeft, SIGNAL(clicked()), this, SLOT(handleButtonLeft())); - m_pButtonUp = new QPushButton(this); - m_pButtonUp->setIcon(icon); - m_pButtonUp->setIconSize(IconSize); - gridLayout->addWidget(m_pButtonUp, 1, 1, 1, 1, Qt::AlignCenter); - connect(m_pButtonUp, SIGNAL(clicked()), this, SLOT(handleButtonUp())); + m_pButtonUp = new QPushButton(this); + m_pButtonUp->setIcon(icon); + m_pButtonUp->setIconSize(IconSize); + gridLayout->addWidget(m_pButtonUp, 1, 1, 1, 1, Qt::AlignCenter); + connect(m_pButtonUp, SIGNAL(clicked()), this, SLOT(handleButtonUp())); - m_pButtonRight = new QPushButton(this); - m_pButtonRight->setIcon(icon); - m_pButtonRight->setIconSize(IconSize); - gridLayout->addWidget(m_pButtonRight, 2, 2, 1, 1, Qt::AlignCenter); - connect(m_pButtonRight, SIGNAL(clicked()), this, SLOT(handleButtonRight())); + m_pButtonRight = new QPushButton(this); + m_pButtonRight->setIcon(icon); + m_pButtonRight->setIconSize(IconSize); + gridLayout->addWidget(m_pButtonRight, 2, 2, 1, 1, Qt::AlignCenter); + connect(m_pButtonRight, SIGNAL(clicked()), this, SLOT(handleButtonRight())); - m_pButtonDown = new QPushButton(this); - m_pButtonDown->setIcon(icon); - m_pButtonDown->setIconSize(IconSize); - gridLayout->addWidget(m_pButtonDown, 3, 1, 1, 1, Qt::AlignCenter); - connect(m_pButtonDown, SIGNAL(clicked()), this, SLOT(handleButtonDown())); + m_pButtonDown = new QPushButton(this); + m_pButtonDown->setIcon(icon); + m_pButtonDown->setIconSize(IconSize); + gridLayout->addWidget(m_pButtonDown, 3, 1, 1, 1, Qt::AlignCenter); + connect(m_pButtonDown, SIGNAL(clicked()), this, SLOT(handleButtonDown())); - m_pLabelCenter = new QLabel(this); - m_pLabelCenter->setPixmap(QPixmap(":res/icons/64x64/video-display.png")); - gridLayout->addWidget(m_pLabelCenter, 2, 1, 1, 1, Qt::AlignCenter); + m_pLabelCenter = new QLabel(this); + m_pLabelCenter->setPixmap(QPixmap(":res/icons/64x64/video-display.png")); + gridLayout->addWidget(m_pLabelCenter, 2, 1, 1, 1, Qt::AlignCenter); #if defined(Q_OS_MAC) - m_pDialogButtonBox->setLayoutDirection(Qt::RightToLeft); + m_pDialogButtonBox->setLayoutDirection(Qt::RightToLeft); #endif - QPushButton* advanced = m_pDialogButtonBox->addButton("Advanced", - QDialogButtonBox::HelpRole); - connect(advanced, SIGNAL(clicked()), this, SLOT(handleButtonAdvanced())); + QPushButton* advanced = m_pDialogButtonBox->addButton("Advanced", + QDialogButtonBox::HelpRole); + connect(advanced, SIGNAL(clicked()), this, SLOT(handleButtonAdvanced())); } AddClientDialog::~AddClientDialog() { - delete m_pButtonUp; - delete m_pButtonDown; - delete m_pButtonLeft; - delete m_pButtonRight; - delete m_pLabelCenter; + delete m_pButtonUp; + delete m_pButtonDown; + delete m_pButtonLeft; + delete m_pButtonRight; + delete m_pLabelCenter; } void AddClientDialog::changeEvent(QEvent *e) { - QDialog::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - retranslateUi(this); - break; - default: - break; - } + QDialog::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + retranslateUi(this); + break; + default: + break; + } } void AddClientDialog::handleButtonLeft() { - m_AddResult = kAddClientLeft; - close(); + m_AddResult = kAddClientLeft; + close(); } void AddClientDialog::handleButtonUp() { - m_AddResult = kAddClientUp; - close(); + m_AddResult = kAddClientUp; + close(); } void AddClientDialog::handleButtonRight() { - m_AddResult = kAddClientRight; - close(); + m_AddResult = kAddClientRight; + close(); } void AddClientDialog::handleButtonDown() { - m_AddResult = kAddClientDown; - close(); + m_AddResult = kAddClientDown; + close(); } void AddClientDialog::handleButtonAdvanced() { - m_AddResult = kAddClientOther; - close(); + m_AddResult = kAddClientOther; + close(); } void AddClientDialog::on_m_pCheckBoxIgnoreClient_toggled(bool checked) { - m_IgnoreAutoConfigClient = checked; + m_IgnoreAutoConfigClient = checked; } diff --git a/src/gui/src/AddClientDialog.h b/src/gui/src/AddClientDialog.h index 6b562376..0563ddc7 100644 --- a/src/gui/src/AddClientDialog.h +++ b/src/gui/src/AddClientDialog.h @@ -26,43 +26,43 @@ class QPushButton; class QLabel; enum { - kAddClientRight, - kAddClientLeft, - kAddClientUp, - kAddClientDown, - kAddClientOther, - kAddClientIgnore + kAddClientRight, + kAddClientLeft, + kAddClientUp, + kAddClientDown, + kAddClientOther, + kAddClientIgnore }; class AddClientDialog : public QDialog, public Ui::AddClientDialog { - Q_OBJECT + Q_OBJECT public: - AddClientDialog(const QString& clientName, QWidget* parent = 0); - ~AddClientDialog(); + AddClientDialog(const QString& clientName, QWidget* parent = 0); + ~AddClientDialog(); - int addResult() { return m_AddResult; } - bool ignoreAutoConfigClient() { return m_IgnoreAutoConfigClient; } + int addResult() { return m_AddResult; } + bool ignoreAutoConfigClient() { return m_IgnoreAutoConfigClient; } protected: - void changeEvent(QEvent *e); + void changeEvent(QEvent *e); private slots: - void on_m_pCheckBoxIgnoreClient_toggled(bool checked); - void handleButtonLeft(); - void handleButtonUp(); - void handleButtonRight(); - void handleButtonDown(); - void handleButtonAdvanced(); + void on_m_pCheckBoxIgnoreClient_toggled(bool checked); + void handleButtonLeft(); + void handleButtonUp(); + void handleButtonRight(); + void handleButtonDown(); + void handleButtonAdvanced(); private: - QPushButton* m_pButtonLeft; - QPushButton* m_pButtonUp; - QPushButton* m_pButtonRight; - QPushButton* m_pButtonDown; - QLabel* m_pLabelCenter; - int m_AddResult; - bool m_IgnoreAutoConfigClient; + QPushButton* m_pButtonLeft; + QPushButton* m_pButtonUp; + QPushButton* m_pButtonRight; + QPushButton* m_pButtonDown; + QLabel* m_pLabelCenter; + int m_AddResult; + bool m_IgnoreAutoConfigClient; }; #endif // ADDCLIENTDIALOG_H diff --git a/src/gui/src/AppConfig.cpp b/src/gui/src/AppConfig.cpp index 85e4a110..84e2e3d9 100644 --- a/src/gui/src/AppConfig.cpp +++ b/src/gui/src/AppConfig.cpp @@ -39,38 +39,38 @@ const ElevateMode defaultElevateMode = ElevateAsNeeded; static const char* logLevelNames[] = { - "ERROR", - "WARNING", - "NOTE", - "INFO", - "DEBUG", - "DEBUG1", - "DEBUG2" + "ERROR", + "WARNING", + "NOTE", + "INFO", + "DEBUG", + "DEBUG1", + "DEBUG2" }; AppConfig::AppConfig(QSettings* settings) : - m_pSettings(settings), - m_ScreenName(), - m_Port(24800), - m_Interface(), - m_LogLevel(0), - m_WizardLastRun(0), - m_ProcessMode(DEFAULT_PROCESS_MODE), - m_AutoConfig(true), - m_ElevateMode(defaultElevateMode), - m_AutoConfigPrompted(false), - m_CryptoEnabled(false), - m_AutoHide(false), - m_LastExpiringWarningTime(0) + m_pSettings(settings), + m_ScreenName(), + m_Port(24800), + m_Interface(), + m_LogLevel(0), + m_WizardLastRun(0), + m_ProcessMode(DEFAULT_PROCESS_MODE), + m_AutoConfig(true), + m_ElevateMode(defaultElevateMode), + m_AutoConfigPrompted(false), + m_CryptoEnabled(false), + m_AutoHide(false), + m_LastExpiringWarningTime(0) { - Q_ASSERT(m_pSettings); + Q_ASSERT(m_pSettings); - loadSettings(); + loadSettings(); } AppConfig::~AppConfig() { - saveSettings(); + saveSettings(); } const QString &AppConfig::screenName() const { return m_ScreenName; } @@ -88,44 +88,44 @@ const QString &AppConfig::logFilename() const { return m_LogFilename; } QString AppConfig::synergyLogDir() const { #if defined(Q_OS_WIN) - // on windows, we want to log to program files - return synergyProgramDir() + "log/"; + // on windows, we want to log to program files + return synergyProgramDir() + "log/"; #else - // on unix, we'll log to the standard log dir - return "/var/log/"; + // on unix, we'll log to the standard log dir + return "/var/log/"; #endif } QString AppConfig::synergyProgramDir() const { - // synergy binaries should be in the same dir. - return QCoreApplication::applicationDirPath() + "/"; + // synergy binaries should be in the same dir. + return QCoreApplication::applicationDirPath() + "/"; } void AppConfig::persistLogDir() { - QDir dir = synergyLogDir(); + QDir dir = synergyLogDir(); - // persist the log directory - if (!dir.exists()) - { - dir.mkpath(dir.path()); - } + // persist the log directory + if (!dir.exists()) + { + dir.mkpath(dir.path()); + } } const QString AppConfig::logFilenameCmd() const { - QString filename = m_LogFilename; + QString filename = m_LogFilename; #if defined(Q_OS_WIN) - // wrap in quotes in case username contains spaces. - filename = QString("\"%1\"").arg(filename); + // wrap in quotes in case username contains spaces. + filename = QString("\"%1\"").arg(filename); #endif - return filename; + return filename; } QString AppConfig::logLevelText() const { - return logLevelNames[logLevel()]; + return logLevelNames[logLevel()]; } ProcessMode AppConfig::processMode() const { return m_ProcessMode; } @@ -140,78 +140,78 @@ bool AppConfig::autoConfig() const { return m_AutoConfig; } void AppConfig::loadSettings() { - m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString(); - m_Port = settings().value("port", 24800).toInt(); - m_Interface = settings().value("interface").toString(); - m_LogLevel = settings().value("logLevel", 3).toInt(); // level 3: INFO - m_LogToFile = settings().value("logToFile", false).toBool(); - m_LogFilename = settings().value("logFilename", synergyLogDir() + "synergy.log").toString(); - m_WizardLastRun = settings().value("wizardLastRun", 0).toInt(); - m_Language = settings().value("language", QLocale::system().name()).toString(); - m_StartedBefore = settings().value("startedBefore", false).toBool(); - m_AutoConfig = settings().value("autoConfig", true).toBool(); - QVariant elevateMode = settings().value("elevateModeEnum"); - if (!elevateMode.isValid()) { - elevateMode = settings().value ("elevateMode", - QVariant(static_cast(defaultElevateMode))); - } - m_ElevateMode = static_cast(elevateMode.toInt()); - m_AutoConfigPrompted = settings().value("autoConfigPrompted", false).toBool(); - m_Edition = static_cast(settings().value("edition", kUnregistered).toInt()); - m_ActivateEmail = settings().value("activateEmail", "").toString(); - m_CryptoEnabled = settings().value("cryptoEnabled", true).toBool(); - m_AutoHide = settings().value("autoHide", false).toBool(); - m_Serialkey = settings().value("serialKey", "").toString().trimmed(); - m_lastVersion = settings().value("lastVersion", "Unknown").toString(); - m_LastExpiringWarningTime = settings().value("lastExpiringWarningTime", 0).toInt(); - m_ActivationHasRun = settings().value("activationHasRun", false).toBool(); + m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString(); + m_Port = settings().value("port", 24800).toInt(); + m_Interface = settings().value("interface").toString(); + m_LogLevel = settings().value("logLevel", 3).toInt(); // level 3: INFO + m_LogToFile = settings().value("logToFile", false).toBool(); + m_LogFilename = settings().value("logFilename", synergyLogDir() + "synergy.log").toString(); + m_WizardLastRun = settings().value("wizardLastRun", 0).toInt(); + m_Language = settings().value("language", QLocale::system().name()).toString(); + m_StartedBefore = settings().value("startedBefore", false).toBool(); + m_AutoConfig = settings().value("autoConfig", true).toBool(); + QVariant elevateMode = settings().value("elevateModeEnum"); + if (!elevateMode.isValid()) { + elevateMode = settings().value ("elevateMode", + QVariant(static_cast(defaultElevateMode))); + } + m_ElevateMode = static_cast(elevateMode.toInt()); + m_AutoConfigPrompted = settings().value("autoConfigPrompted", false).toBool(); + m_Edition = static_cast(settings().value("edition", kUnregistered).toInt()); + m_ActivateEmail = settings().value("activateEmail", "").toString(); + m_CryptoEnabled = settings().value("cryptoEnabled", true).toBool(); + m_AutoHide = settings().value("autoHide", false).toBool(); + m_Serialkey = settings().value("serialKey", "").toString().trimmed(); + m_lastVersion = settings().value("lastVersion", "Unknown").toString(); + m_LastExpiringWarningTime = settings().value("lastExpiringWarningTime", 0).toInt(); + m_ActivationHasRun = settings().value("activationHasRun", false).toBool(); } void AppConfig::saveSettings() { - settings().setValue("screenName", m_ScreenName); - settings().setValue("port", m_Port); - settings().setValue("interface", m_Interface); - settings().setValue("logLevel", m_LogLevel); - settings().setValue("logToFile", m_LogToFile); - settings().setValue("logFilename", m_LogFilename); - settings().setValue("wizardLastRun", kWizardVersion); - settings().setValue("language", m_Language); - settings().setValue("startedBefore", m_StartedBefore); - settings().setValue("autoConfig", m_AutoConfig); - // Refer to enum ElevateMode declaration for insight in to why this - // flag is mapped this way - settings().setValue("elevateMode", m_ElevateMode == ElevateAlways); - settings().setValue("elevateModeEnum", static_cast(m_ElevateMode)); - settings().setValue("autoConfigPrompted", m_AutoConfigPrompted); - settings().setValue("edition", m_Edition); - settings().setValue("cryptoEnabled", m_CryptoEnabled); - settings().setValue("autoHide", m_AutoHide); - settings().setValue("serialKey", m_Serialkey); - settings().setValue("lastVersion", m_lastVersion); - settings().setValue("lastExpiringWarningTime", m_LastExpiringWarningTime); - settings().setValue("activationHasRun", m_ActivationHasRun); - settings().sync(); + settings().setValue("screenName", m_ScreenName); + settings().setValue("port", m_Port); + settings().setValue("interface", m_Interface); + settings().setValue("logLevel", m_LogLevel); + settings().setValue("logToFile", m_LogToFile); + settings().setValue("logFilename", m_LogFilename); + settings().setValue("wizardLastRun", kWizardVersion); + settings().setValue("language", m_Language); + settings().setValue("startedBefore", m_StartedBefore); + settings().setValue("autoConfig", m_AutoConfig); + // Refer to enum ElevateMode declaration for insight in to why this + // flag is mapped this way + settings().setValue("elevateMode", m_ElevateMode == ElevateAlways); + settings().setValue("elevateModeEnum", static_cast(m_ElevateMode)); + settings().setValue("autoConfigPrompted", m_AutoConfigPrompted); + settings().setValue("edition", m_Edition); + settings().setValue("cryptoEnabled", m_CryptoEnabled); + settings().setValue("autoHide", m_AutoHide); + settings().setValue("serialKey", m_Serialkey); + settings().setValue("lastVersion", m_lastVersion); + settings().setValue("lastExpiringWarningTime", m_LastExpiringWarningTime); + settings().setValue("activationHasRun", m_ActivationHasRun); + settings().sync(); } bool AppConfig::activationHasRun() const { - return m_ActivationHasRun; + return m_ActivationHasRun; } AppConfig& AppConfig::activationHasRun(bool value) { - m_ActivationHasRun = value; - return *this; + m_ActivationHasRun = value; + return *this; } QString AppConfig::lastVersion() const { - return m_lastVersion; + return m_lastVersion; } void AppConfig::setLastVersion(QString version) { - m_lastVersion = version; + m_lastVersion = version; } QSettings &AppConfig::settings() { return *m_pSettings; } @@ -238,31 +238,31 @@ void AppConfig::setElevateMode(ElevateMode em) { m_ElevateMode = em; } void AppConfig::setAutoConfig(bool autoConfig) { - m_AutoConfig = autoConfig; + m_AutoConfig = autoConfig; } bool AppConfig::autoConfigPrompted() { return m_AutoConfigPrompted; } void AppConfig::setAutoConfigPrompted(bool prompted) { - m_AutoConfigPrompted = prompted; + m_AutoConfigPrompted = prompted; } void AppConfig::setEdition(Edition e) { - m_Edition = e; + m_Edition = e; } Edition AppConfig::edition() const { return m_Edition; } QString AppConfig::setSerialKey(QString serial) { - using std::swap; - swap (serial, m_Serialkey); - return serial; + using std::swap; + swap (serial, m_Serialkey); + return serial; } void AppConfig::clearSerialKey() { - m_Serialkey.clear(); + m_Serialkey.clear(); } QString AppConfig::serialKey() { return m_Serialkey; } @@ -277,16 +277,16 @@ QString AppConfig::synergycName() const { return m_SynergycName; } ElevateMode AppConfig::elevateMode() { - return m_ElevateMode; + return m_ElevateMode; } void AppConfig::setCryptoEnabled(bool e) { - m_CryptoEnabled = e; - emit sslToggled(e); + m_CryptoEnabled = e; + emit sslToggled(e); } bool AppConfig::getCryptoEnabled() const { - return (edition() == kPro) && m_CryptoEnabled; + return (edition() == kPro) && m_CryptoEnabled; } void AppConfig::setAutoHide(bool b) { m_AutoHide = b; } diff --git a/src/gui/src/AppConfig.h b/src/gui/src/AppConfig.h index 9ca9ab16..1c9d6d53 100644 --- a/src/gui/src/AppConfig.h +++ b/src/gui/src/AppConfig.h @@ -46,114 +46,114 @@ class QSettings; class SettingsDialog; enum ProcessMode { - Service, - Desktop + Service, + Desktop }; class AppConfig: public QObject { - Q_OBJECT + Q_OBJECT - friend class SettingsDialog; - friend class MainWindow; - friend class SetupWizard; + friend class SettingsDialog; + friend class MainWindow; + friend class SetupWizard; - public: - AppConfig(QSettings* settings); - ~AppConfig(); + public: + AppConfig(QSettings* settings); + ~AppConfig(); - public: - const QString& screenName() const; - int port() const; - const QString& networkInterface() const; - int logLevel() const; - bool logToFile() const; - const QString& logFilename() const; - const QString logFilenameCmd() const; - QString logLevelText() const; - ProcessMode processMode() const; - bool wizardShouldRun() const; - const QString& language() const; - bool startedBefore() const; - bool autoConfig() const; - void setAutoConfig(bool autoConfig); - bool autoConfigPrompted(); - void setAutoConfigPrompted(bool prompted); - void setEdition(Edition); - Edition edition() const; - QString setSerialKey(QString serial); - void clearSerialKey(); - QString serialKey(); - int lastExpiringWarningTime() const; - void setLastExpiringWarningTime(int t); + public: + const QString& screenName() const; + int port() const; + const QString& networkInterface() const; + int logLevel() const; + bool logToFile() const; + const QString& logFilename() const; + const QString logFilenameCmd() const; + QString logLevelText() const; + ProcessMode processMode() const; + bool wizardShouldRun() const; + const QString& language() const; + bool startedBefore() const; + bool autoConfig() const; + void setAutoConfig(bool autoConfig); + bool autoConfigPrompted(); + void setAutoConfigPrompted(bool prompted); + void setEdition(Edition); + Edition edition() const; + QString setSerialKey(QString serial); + void clearSerialKey(); + QString serialKey(); + int lastExpiringWarningTime() const; + void setLastExpiringWarningTime(int t); - QString synergysName() const; - QString synergycName() const; - QString synergyProgramDir() const; - QString synergyLogDir() const; + QString synergysName() const; + QString synergycName() const; + QString synergyProgramDir() const; + QString synergyLogDir() const; - bool detectPath(const QString& name, QString& path); - void persistLogDir(); - ElevateMode elevateMode(); + bool detectPath(const QString& name, QString& path); + void persistLogDir(); + ElevateMode elevateMode(); - void setCryptoEnabled(bool e); - bool getCryptoEnabled() const; + void setCryptoEnabled(bool e); + bool getCryptoEnabled() const; - void setAutoHide(bool b); - bool getAutoHide(); + void setAutoHide(bool b); + bool getAutoHide(); - bool activationHasRun() const; - AppConfig& activationHasRun(bool value); + bool activationHasRun() const; + AppConfig& activationHasRun(bool value); - QString lastVersion() const; + QString lastVersion() const; - void saveSettings(); - void setLastVersion(QString version); + void saveSettings(); + void setLastVersion(QString version); protected: - QSettings& settings(); - void setScreenName(const QString& s); - void setPort(int i); - void setNetworkInterface(const QString& s); - void setLogLevel(int i); - void setLogToFile(bool b); - void setLogFilename(const QString& s); - void setWizardHasRun(); - void setLanguage(const QString language); - void setStartedBefore(bool b); - void setElevateMode(ElevateMode em); - void loadSettings(); + QSettings& settings(); + void setScreenName(const QString& s); + void setPort(int i); + void setNetworkInterface(const QString& s); + void setLogLevel(int i); + void setLogToFile(bool b); + void setLogFilename(const QString& s); + void setWizardHasRun(); + void setLanguage(const QString language); + void setStartedBefore(bool b); + void setElevateMode(ElevateMode em); + void loadSettings(); - private: - QSettings* m_pSettings; - QString m_ScreenName; - int m_Port; - QString m_Interface; - int m_LogLevel; - bool m_LogToFile; - QString m_LogFilename; - int m_WizardLastRun; - ProcessMode m_ProcessMode; - QString m_Language; - bool m_StartedBefore; - bool m_AutoConfig; - ElevateMode m_ElevateMode; - bool m_AutoConfigPrompted; - Edition m_Edition; - QString m_ActivateEmail; - bool m_CryptoEnabled; - bool m_AutoHide; - QString m_Serialkey; - QString m_lastVersion; - int m_LastExpiringWarningTime; - bool m_ActivationHasRun; + private: + QSettings* m_pSettings; + QString m_ScreenName; + int m_Port; + QString m_Interface; + int m_LogLevel; + bool m_LogToFile; + QString m_LogFilename; + int m_WizardLastRun; + ProcessMode m_ProcessMode; + QString m_Language; + bool m_StartedBefore; + bool m_AutoConfig; + ElevateMode m_ElevateMode; + bool m_AutoConfigPrompted; + Edition m_Edition; + QString m_ActivateEmail; + bool m_CryptoEnabled; + bool m_AutoHide; + QString m_Serialkey; + QString m_lastVersion; + int m_LastExpiringWarningTime; + bool m_ActivationHasRun; - static const char m_SynergysName[]; - static const char m_SynergycName[]; - static const char m_SynergyLogDir[]; + static const char m_SynergysName[]; + static const char m_SynergycName[]; + static const char m_SynergyLogDir[]; - signals: - void sslToggled(bool enabled); + signals: + void sslToggled(bool enabled); }; #endif diff --git a/src/gui/src/BaseConfig.cpp b/src/gui/src/BaseConfig.cpp index 5df0f008..8def4f7b 100644 --- a/src/gui/src/BaseConfig.cpp +++ b/src/gui/src/BaseConfig.cpp @@ -20,27 +20,27 @@ const char* BaseConfig::m_ModifierNames[] = { - "shift", - "ctrl", - "alt", - "meta", - "super", - "none" + "shift", + "ctrl", + "alt", + "meta", + "super", + "none" }; const char* BaseConfig::m_FixNames[] = { - "halfDuplexCapsLock", - "halfDuplexNumLock", - "halfDuplexScrollLock", - "xtestIsXineramaUnaware" + "halfDuplexCapsLock", + "halfDuplexNumLock", + "halfDuplexScrollLock", + "xtestIsXineramaUnaware" }; const char* BaseConfig::m_SwitchCornerNames[] = { - "top-left", - "top-right", - "bottom-left", - "bottom-right" + "top-left", + "top-right", + "bottom-left", + "bottom-right" }; diff --git a/src/gui/src/BaseConfig.h b/src/gui/src/BaseConfig.h index 006f945c..f6f38834 100644 --- a/src/gui/src/BaseConfig.h +++ b/src/gui/src/BaseConfig.h @@ -26,66 +26,66 @@ class BaseConfig { - public: - enum Modifier { DefaultMod = -1, Shift, Ctrl, Alt, Meta, Super, None, NumModifiers }; - enum SwitchCorner { TopLeft, TopRight, BottomLeft, BottomRight, NumSwitchCorners }; - enum Fix { CapsLock, NumLock, ScrollLock, XTest, NumFixes }; + public: + enum Modifier { DefaultMod = -1, Shift, Ctrl, Alt, Meta, Super, None, NumModifiers }; + enum SwitchCorner { TopLeft, TopRight, BottomLeft, BottomRight, NumSwitchCorners }; + enum Fix { CapsLock, NumLock, ScrollLock, XTest, NumFixes }; - protected: - BaseConfig() {} - virtual ~BaseConfig() {} + protected: + BaseConfig() {} + virtual ~BaseConfig() {} - protected: - template - void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt) - { - int entries = settings.beginReadArray(arrayName + "Array"); - array.clear(); - for (int i = 0; i < entries; i++) - { - settings.setArrayIndex(i); - QVariant v = settings.value(arrayName, deflt); - array.append(v.value()); - } - settings.endArray(); - } + protected: + template + void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt) + { + int entries = settings.beginReadArray(arrayName + "Array"); + array.clear(); + for (int i = 0; i < entries; i++) + { + settings.setArrayIndex(i); + QVariant v = settings.value(arrayName, deflt); + array.append(v.value()); + } + settings.endArray(); + } - template - void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt, int entries) - { - Q_ASSERT(array.size() >= entries); - settings.beginReadArray(arrayName + "Array"); - for (int i = 0; i < entries; i++) - { - settings.setArrayIndex(i); - QVariant v = settings.value(arrayName, deflt); - array[i] = v.value(); - } - settings.endArray(); - } + template + void readSettings(QSettings& settings, T1& array, const QString& arrayName, const T2& deflt, int entries) + { + Q_ASSERT(array.size() >= entries); + settings.beginReadArray(arrayName + "Array"); + for (int i = 0; i < entries; i++) + { + settings.setArrayIndex(i); + QVariant v = settings.value(arrayName, deflt); + array[i] = v.value(); + } + settings.endArray(); + } - template - void writeSettings(QSettings& settings, const T& array, const QString& arrayName) const - { - settings.beginWriteArray(arrayName + "Array"); - for (int i = 0; i < array.size(); i++) - { - settings.setArrayIndex(i); - settings.setValue(arrayName, array[i]); - } - settings.endArray(); - } + template + void writeSettings(QSettings& settings, const T& array, const QString& arrayName) const + { + settings.beginWriteArray(arrayName + "Array"); + for (int i = 0; i < array.size(); i++) + { + settings.setArrayIndex(i); + settings.setValue(arrayName, array[i]); + } + settings.endArray(); + } - public: - static const char* modifierName(int idx) { return m_ModifierNames[idx]; } - static const char* fixName(int idx) { return m_FixNames[idx]; } - static const char* switchCornerName(int idx) { return m_SwitchCornerNames[idx]; } + public: + static const char* modifierName(int idx) { return m_ModifierNames[idx]; } + static const char* fixName(int idx) { return m_FixNames[idx]; } + static const char* switchCornerName(int idx) { return m_SwitchCornerNames[idx]; } - private: - static const char* m_ModifierNames[]; - static const char* m_FixNames[]; - static const char* m_SwitchCornerNames[]; + private: + static const char* m_ModifierNames[]; + static const char* m_FixNames[]; + static const char* m_SwitchCornerNames[]; }; #endif diff --git a/src/gui/src/CancelActivationDialog.cpp b/src/gui/src/CancelActivationDialog.cpp index 074b76bb..3397309e 100644 --- a/src/gui/src/CancelActivationDialog.cpp +++ b/src/gui/src/CancelActivationDialog.cpp @@ -2,13 +2,13 @@ #include "ui_CancelActivationDialog.h" CancelActivationDialog::CancelActivationDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::CancelActivationDialog) + QDialog(parent), + ui(new Ui::CancelActivationDialog) { - ui->setupUi(this); + ui->setupUi(this); } CancelActivationDialog::~CancelActivationDialog() { - delete ui; + delete ui; } diff --git a/src/gui/src/CancelActivationDialog.h b/src/gui/src/CancelActivationDialog.h index b90af083..bd387186 100644 --- a/src/gui/src/CancelActivationDialog.h +++ b/src/gui/src/CancelActivationDialog.h @@ -9,14 +9,14 @@ class CancelActivationDialog; class CancelActivationDialog : public QDialog { - Q_OBJECT - + Q_OBJECT + public: - explicit CancelActivationDialog(QWidget *parent = 0); - ~CancelActivationDialog(); - + explicit CancelActivationDialog(QWidget *parent = 0); + ~CancelActivationDialog(); + private: - Ui::CancelActivationDialog *ui; + Ui::CancelActivationDialog *ui; }; #endif // CANCELACTIVATIONDIALOG_H diff --git a/src/gui/src/CommandProcess.cpp b/src/gui/src/CommandProcess.cpp index 96f00e6b..361d14fe 100644 --- a/src/gui/src/CommandProcess.cpp +++ b/src/gui/src/CommandProcess.cpp @@ -21,43 +21,43 @@ #include CommandProcess::CommandProcess(QString cmd, QStringList arguments, QString input) : - m_Command(cmd), - m_Arguments(arguments), - m_Input(input) + m_Command(cmd), + m_Arguments(arguments), + m_Input(input) { } QString CommandProcess::run() { - QProcess process; - process.setReadChannel(QProcess::StandardOutput); - process.start(m_Command, m_Arguments); - bool success = process.waitForStarted(); + QProcess process; + process.setReadChannel(QProcess::StandardOutput); + process.start(m_Command, m_Arguments); + bool success = process.waitForStarted(); - QString output, error; - if (success) - { - if (!m_Input.isEmpty()) { - process.write(m_Input.toStdString().c_str()); - } + QString output, error; + if (success) + { + if (!m_Input.isEmpty()) { + process.write(m_Input.toStdString().c_str()); + } - if (process.waitForFinished()) { - output = process.readAllStandardOutput().trimmed(); - error = process.readAllStandardError().trimmed(); - } - } + if (process.waitForFinished()) { + output = process.readAllStandardOutput().trimmed(); + error = process.readAllStandardError().trimmed(); + } + } - int code = process.exitCode(); - if (!error.isEmpty() || !success || code != 0) - { - throw std::runtime_error( - QString("Code: %1\nError: %2") - .arg(process.exitCode()) - .arg(error.isEmpty() ? "Unknown" : error) - .toStdString()); - } + int code = process.exitCode(); + if (!error.isEmpty() || !success || code != 0) + { + throw std::runtime_error( + QString("Code: %1\nError: %2") + .arg(process.exitCode()) + .arg(error.isEmpty() ? "Unknown" : error) + .toStdString()); + } - emit finished(); + emit finished(); - return output; + return output; } diff --git a/src/gui/src/CommandProcess.h b/src/gui/src/CommandProcess.h index 6808ac14..62397907 100644 --- a/src/gui/src/CommandProcess.h +++ b/src/gui/src/CommandProcess.h @@ -23,21 +23,21 @@ class CommandProcess : public QObject { - Q_OBJECT + Q_OBJECT public: - CommandProcess(QString cmd, QStringList arguments, QString input = ""); + CommandProcess(QString cmd, QStringList arguments, QString input = ""); signals: - void finished(); + void finished(); public slots: - QString run(); + QString run(); private: - QString m_Command; - QStringList m_Arguments; - QString m_Input; + QString m_Command; + QStringList m_Arguments; + QString m_Input; }; #endif // COMMANDTHREAD_H diff --git a/src/gui/src/CoreInterface.cpp b/src/gui/src/CoreInterface.cpp index e560fc45..ef3dc326 100644 --- a/src/gui/src/CoreInterface.cpp +++ b/src/gui/src/CoreInterface.cpp @@ -40,57 +40,57 @@ CoreInterface::CoreInterface() QString CoreInterface::getProfileDir() { - QStringList args("--get-profile-dir"); - return run(args); + QStringList args("--get-profile-dir"); + return run(args); } QString CoreInterface::getInstalledDir() { - QStringList args("--get-installed-dir"); - return run(args); + QStringList args("--get-installed-dir"); + return run(args); } QString CoreInterface::getArch() { - QStringList args("--get-arch"); - return run(args); + QStringList args("--get-arch"); + return run(args); } QString CoreInterface::getSerialKeyFilePath() { - QString filename = getProfileDir() + QDir::separator() + kSerialKeyFilename; - return filename; + QString filename = getProfileDir() + QDir::separator() + kSerialKeyFilename; + return filename; } QString CoreInterface::notifyUpdate (QString const& fromVersion, - QString const& toVersion, - QString const& serialKey) { - QStringList args("--notify-update"); - QString input(fromVersion + ":" + toVersion + ":" + serialKey); - input.append("\n"); - return run(args, input); + QString const& toVersion, + QString const& serialKey) { + QStringList args("--notify-update"); + QString input(fromVersion + ":" + toVersion + ":" + serialKey); + input.append("\n"); + return run(args, input); } QString CoreInterface::notifyActivation(const QString& identity) { - QStringList args("--notify-activation"); + QStringList args("--notify-activation"); - QString input(identity + ":" + hash(getFirstMacAddress())); - QString os= getOSInformation(); - if (!os.isEmpty()) { - input.append(":").append(os); - } - input.append("\n"); + QString input(identity + ":" + hash(getFirstMacAddress())); + QString os= getOSInformation(); + if (!os.isEmpty()) { + input.append(":").append(os); + } + input.append("\n"); - return run(args, input); + return run(args, input); } QString CoreInterface::run(const QStringList& args, const QString& input) { - QString program( - QCoreApplication::applicationDirPath() - + "/" + kCoreBinary); + QString program( + QCoreApplication::applicationDirPath() + + "/" + kCoreBinary); - CommandProcess commandProcess(program, args, input); - return commandProcess.run(); + CommandProcess commandProcess(program, args, input); + return commandProcess.run(); } diff --git a/src/gui/src/CoreInterface.h b/src/gui/src/CoreInterface.h index 98a84f57..45ae47d1 100644 --- a/src/gui/src/CoreInterface.h +++ b/src/gui/src/CoreInterface.h @@ -22,15 +22,15 @@ class CoreInterface { public: - CoreInterface(); + CoreInterface(); - QString getProfileDir(); - QString getInstalledDir(); - QString getArch(); - QString getSerialKeyFilePath(); - QString notifyActivation(const QString& identity); - QString notifyUpdate (QString const& fromVersion, - QString const& toVersion, - QString const& serialKey); - QString run(const QStringList& args, const QString& input = ""); + QString getProfileDir(); + QString getInstalledDir(); + QString getArch(); + QString getSerialKeyFilePath(); + QString notifyActivation(const QString& identity); + QString notifyUpdate (QString const& fromVersion, + QString const& toVersion, + QString const& serialKey); + QString run(const QStringList& args, const QString& input = ""); }; diff --git a/src/gui/src/DataDownloader.cpp b/src/gui/src/DataDownloader.cpp index d8820363..50e5a1b2 100644 --- a/src/gui/src/DataDownloader.cpp +++ b/src/gui/src/DataDownloader.cpp @@ -18,11 +18,11 @@ #include "DataDownloader.h" DataDownloader::DataDownloader(QObject* parent) : - QObject(parent), - m_IsFinished(false) + QObject(parent), + m_IsFinished(false) { - connect(&m_NetworkManager, SIGNAL(finished(QNetworkReply*)), - SLOT(complete(QNetworkReply*))); + connect(&m_NetworkManager, SIGNAL(finished(QNetworkReply*)), + SLOT(complete(QNetworkReply*))); } DataDownloader::~DataDownloader() @@ -31,27 +31,27 @@ DataDownloader::~DataDownloader() void DataDownloader::complete(QNetworkReply* reply) { - m_Data = reply->readAll(); - reply->deleteLater(); + m_Data = reply->readAll(); + reply->deleteLater(); - if (!m_Data.isEmpty()) { - m_IsFinished = true; - emit isComplete(); - } + if (!m_Data.isEmpty()) { + m_IsFinished = true; + emit isComplete(); + } } QByteArray DataDownloader::data() const { - return m_Data; + return m_Data; } void DataDownloader::cancel() { - m_pReply->abort(); + m_pReply->abort(); } void DataDownloader::download(QUrl url) { - QNetworkRequest request(url); - m_pReply = m_NetworkManager.get(request); + QNetworkRequest request(url); + m_pReply = m_NetworkManager.get(request); } diff --git a/src/gui/src/DataDownloader.h b/src/gui/src/DataDownloader.h index 07802583..7eb7d3ed 100644 --- a/src/gui/src/DataDownloader.h +++ b/src/gui/src/DataDownloader.h @@ -26,28 +26,28 @@ class DataDownloader : public QObject { - Q_OBJECT + Q_OBJECT public: - explicit DataDownloader(QObject* parent = 0); - virtual ~DataDownloader(); + explicit DataDownloader(QObject* parent = 0); + virtual ~DataDownloader(); - QByteArray data() const; - void cancel(); - void download(QUrl url); - bool isFinished() const { return m_IsFinished; } + QByteArray data() const; + void cancel(); + void download(QUrl url); + bool isFinished() const { return m_IsFinished; } signals: - void isComplete(); + void isComplete(); private slots: - void complete(QNetworkReply* reply); + void complete(QNetworkReply* reply); private: - QNetworkAccessManager m_NetworkManager; - QByteArray m_Data; - QNetworkReply* m_pReply; - bool m_IsFinished; + QNetworkAccessManager m_NetworkManager; + QByteArray m_Data; + QNetworkReply* m_pReply; + bool m_IsFinished; }; #endif // DATADOWNLOADER_H diff --git a/src/gui/src/FailedLoginDialog.cpp b/src/gui/src/FailedLoginDialog.cpp index 07ec6bdc..ba53ce45 100644 --- a/src/gui/src/FailedLoginDialog.cpp +++ b/src/gui/src/FailedLoginDialog.cpp @@ -2,14 +2,14 @@ #include "ui_FailedLoginDialog.h" FailedLoginDialog::FailedLoginDialog(QWidget *parent, QString message): - QDialog(parent), - ui(new Ui::FailedLoginDialog) + QDialog(parent), + ui(new Ui::FailedLoginDialog) { - ui->setupUi(this); - ui->messageLabel->setText(ui->messageLabel->text().arg(message)); + ui->setupUi(this); + ui->messageLabel->setText(ui->messageLabel->text().arg(message)); } FailedLoginDialog::~FailedLoginDialog() { - delete ui; + delete ui; } diff --git a/src/gui/src/FailedLoginDialog.h b/src/gui/src/FailedLoginDialog.h index 2eb67634..d15bd706 100644 --- a/src/gui/src/FailedLoginDialog.h +++ b/src/gui/src/FailedLoginDialog.h @@ -10,14 +10,14 @@ class FailedLoginDialog; class FailedLoginDialog : public QDialog { - Q_OBJECT - + Q_OBJECT + public: - explicit FailedLoginDialog(QWidget *parent = 0, QString message = ""); - ~FailedLoginDialog(); - + explicit FailedLoginDialog(QWidget *parent = 0, QString message = ""); + ~FailedLoginDialog(); + private: - Ui::FailedLoginDialog *ui; + Ui::FailedLoginDialog *ui; }; #endif // FAILEDLOGINDIALOG_H diff --git a/src/gui/src/Fingerprint.cpp b/src/gui/src/Fingerprint.cpp index ba711924..c9d331e6 100644 --- a/src/gui/src/Fingerprint.cpp +++ b/src/gui/src/Fingerprint.cpp @@ -29,121 +29,121 @@ static const char kTrustedClientsFilename[] = "TrustedClients.txt"; Fingerprint::Fingerprint(const QString& filename) { - m_Filename = filename; + m_Filename = filename; } void Fingerprint::trust(const QString& fingerprintText, bool append) { - Fingerprint::persistDirectory(); + Fingerprint::persistDirectory(); - QIODevice::OpenMode openMode; - if (append) { - openMode = QIODevice::Append; - } - else { - openMode = QIODevice::WriteOnly; - } + QIODevice::OpenMode openMode; + if (append) { + openMode = QIODevice::Append; + } + else { + openMode = QIODevice::WriteOnly; + } - QFile file(filePath()); - if (file.open(openMode)) - { - QTextStream out(&file); - out << fingerprintText << "\n"; - file.close(); - } + QFile file(filePath()); + if (file.open(openMode)) + { + QTextStream out(&file); + out << fingerprintText << "\n"; + file.close(); + } } bool Fingerprint::fileExists() const { - QString dirName = Fingerprint::directoryPath(); - if (!QDir(dirName).exists()) { - return false; - } + QString dirName = Fingerprint::directoryPath(); + if (!QDir(dirName).exists()) { + return false; + } - QFile file(filePath()); - return file.exists(); + QFile file(filePath()); + return file.exists(); } bool Fingerprint::isTrusted(const QString& fingerprintText) { - QStringList list = readList(); - foreach (QString trusted, list) - { - if (trusted == fingerprintText) { - return true; - } - } - return false; + QStringList list = readList(); + foreach (QString trusted, list) + { + if (trusted == fingerprintText) { + return true; + } + } + return false; } QStringList Fingerprint::readList(const int readTo) { - QStringList list; + QStringList list; - QString dirName = Fingerprint::directoryPath(); - if (!QDir(dirName).exists()) { - return list; - } + QString dirName = Fingerprint::directoryPath(); + if (!QDir(dirName).exists()) { + return list; + } - QFile file(filePath()); + QFile file(filePath()); - if (file.open(QIODevice::ReadOnly)) - { - QTextStream in(&file); - while (!in.atEnd()) - { - list.append(in.readLine()); - if (list.size() == readTo) { - break; - } - } - file.close(); - } + if (file.open(QIODevice::ReadOnly)) + { + QTextStream in(&file); + while (!in.atEnd()) + { + list.append(in.readLine()); + if (list.size() == readTo) { + break; + } + } + file.close(); + } - return list; + return list; } QString Fingerprint::readFirst() { - QStringList list = readList(1); - return list.at(0); + QStringList list = readList(1); + return list.at(0); } QString Fingerprint::filePath() const { - QString dir = Fingerprint::directoryPath(); - return QString("%1/%2").arg(dir).arg(m_Filename); + QString dir = Fingerprint::directoryPath(); + return QString("%1/%2").arg(dir).arg(m_Filename); } void Fingerprint::persistDirectory() { - QDir dir(Fingerprint::directoryPath()); - if (!dir.exists()) { - dir.mkpath("."); - } + QDir dir(Fingerprint::directoryPath()); + if (!dir.exists()) { + dir.mkpath("."); + } } QString Fingerprint::directoryPath() { - CoreInterface coreInterface; - QString profileDir = coreInterface.getProfileDir(); + CoreInterface coreInterface; + QString profileDir = coreInterface.getProfileDir(); - return QString("%1/%2") - .arg(profileDir) - .arg(kDirName); + return QString("%1/%2") + .arg(profileDir) + .arg(kDirName); } Fingerprint Fingerprint::local() { - return Fingerprint(kLocalFilename); + return Fingerprint(kLocalFilename); } Fingerprint Fingerprint::trustedServers() { - return Fingerprint(kTrustedServersFilename); + return Fingerprint(kTrustedServersFilename); } Fingerprint Fingerprint::trustedClients() { - return Fingerprint(kTrustedClientsFilename); + return Fingerprint(kTrustedClientsFilename); } diff --git a/src/gui/src/Fingerprint.h b/src/gui/src/Fingerprint.h index e53ffd3c..24e10984 100644 --- a/src/gui/src/Fingerprint.h +++ b/src/gui/src/Fingerprint.h @@ -22,25 +22,25 @@ class Fingerprint { private: - Fingerprint(const QString& filename); + Fingerprint(const QString& filename); public: - void trust(const QString& fingerprintText, bool append = true); - bool isTrusted(const QString& fingerprintText); - QStringList readList(const int readTo = -1); - QString readFirst(); - QString filePath() const; - bool fileExists() const; + void trust(const QString& fingerprintText, bool append = true); + bool isTrusted(const QString& fingerprintText); + QStringList readList(const int readTo = -1); + QString readFirst(); + QString filePath() const; + bool fileExists() const; public: - static Fingerprint local(); - static Fingerprint trustedServers(); - static Fingerprint trustedClients(); - static QString directoryPath(); - static QString localFingerprint(); - static bool localFingerprintExists(); - static void persistDirectory(); + static Fingerprint local(); + static Fingerprint trustedServers(); + static Fingerprint trustedClients(); + static QString directoryPath(); + static QString localFingerprint(); + static bool localFingerprintExists(); + static void persistDirectory(); private: - QString m_Filename; + QString m_Filename; }; diff --git a/src/gui/src/Hotkey.cpp b/src/gui/src/Hotkey.cpp index bc3938b6..d2234130 100644 --- a/src/gui/src/Hotkey.cpp +++ b/src/gui/src/Hotkey.cpp @@ -21,55 +21,55 @@ #include Hotkey::Hotkey() : - m_KeySequence(), - m_Actions() + m_KeySequence(), + m_Actions() { } QString Hotkey::text() const { - QString text = keySequence().toString(); + QString text = keySequence().toString(); - if (keySequence().isMouseButton()) - return "mousebutton(" + text + ")"; + if (keySequence().isMouseButton()) + return "mousebutton(" + text + ")"; - return "keystroke(" + text + ")"; + return "keystroke(" + text + ")"; } void Hotkey::loadSettings(QSettings& settings) { - keySequence().loadSettings(settings); + keySequence().loadSettings(settings); - actions().clear(); - int num = settings.beginReadArray("actions"); - for (int i = 0; i < num; i++) - { - settings.setArrayIndex(i); - Action a; - a.loadSettings(settings); - actions().append(a); - } + actions().clear(); + int num = settings.beginReadArray("actions"); + for (int i = 0; i < num; i++) + { + settings.setArrayIndex(i); + Action a; + a.loadSettings(settings); + actions().append(a); + } - settings.endArray(); + settings.endArray(); } void Hotkey::saveSettings(QSettings& settings) const { - keySequence().saveSettings(settings); + keySequence().saveSettings(settings); - settings.beginWriteArray("actions"); - for (int i = 0; i < actions().size(); i++) - { - settings.setArrayIndex(i); - actions()[i].saveSettings(settings); - } - settings.endArray(); + settings.beginWriteArray("actions"); + for (int i = 0; i < actions().size(); i++) + { + settings.setArrayIndex(i); + actions()[i].saveSettings(settings); + } + settings.endArray(); } QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey) { - for (int i = 0; i < hotkey.actions().size(); i++) - outStream << "\t" << hotkey.text() << " = " << hotkey.actions()[i] << endl; + for (int i = 0; i < hotkey.actions().size(); i++) + outStream << "\t" << hotkey.text() << " = " << hotkey.actions()[i] << endl; - return outStream; + return outStream; } diff --git a/src/gui/src/Hotkey.h b/src/gui/src/Hotkey.h index 2ea0f4ab..cc32a432 100644 --- a/src/gui/src/Hotkey.h +++ b/src/gui/src/Hotkey.h @@ -33,30 +33,30 @@ class QSettings; class Hotkey { - friend class HotkeyDialog; - friend class ServerConfigDialog; - friend QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey); + friend class HotkeyDialog; + friend class ServerConfigDialog; + friend QTextStream& operator<<(QTextStream& outStream, const Hotkey& hotkey); - public: - Hotkey(); + public: + Hotkey(); - public: - QString text() const; - const KeySequence& keySequence() const { return m_KeySequence; } - const ActionList& actions() const { return m_Actions; } + public: + QString text() const; + const KeySequence& keySequence() const { return m_KeySequence; } + const ActionList& actions() const { return m_Actions; } - void loadSettings(QSettings& settings); - void saveSettings(QSettings& settings) const; + void loadSettings(QSettings& settings); + void saveSettings(QSettings& settings) const; - protected: - KeySequence& keySequence() { return m_KeySequence; } - void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; } - ActionList& actions() { return m_Actions; } + protected: + KeySequence& keySequence() { return m_KeySequence; } + void setKeySequence(const KeySequence& seq) { m_KeySequence = seq; } + ActionList& actions() { return m_Actions; } - private: - KeySequence m_KeySequence; - ActionList m_Actions; + private: + KeySequence m_KeySequence; + ActionList m_Actions; }; typedef QList HotkeyList; diff --git a/src/gui/src/HotkeyDialog.cpp b/src/gui/src/HotkeyDialog.cpp index c072fdcc..5c08d38f 100644 --- a/src/gui/src/HotkeyDialog.cpp +++ b/src/gui/src/HotkeyDialog.cpp @@ -22,20 +22,20 @@ #include HotkeyDialog::HotkeyDialog (QWidget* parent, Hotkey& hotkey) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::HotkeyDialogBase(), - m_Hotkey(hotkey) + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::HotkeyDialogBase(), + m_Hotkey(hotkey) { - setupUi(this); + setupUi(this); - m_pKeySequenceWidgetHotkey->setText(m_Hotkey.text()); + m_pKeySequenceWidgetHotkey->setText(m_Hotkey.text()); } void HotkeyDialog::accept() { - if (!sequenceWidget()->valid()) - return; + if (!sequenceWidget()->valid()) + return; - hotkey().setKeySequence(sequenceWidget()->keySequence()); - QDialog::accept(); + hotkey().setKeySequence(sequenceWidget()->keySequence()); + QDialog::accept(); } diff --git a/src/gui/src/HotkeyDialog.h b/src/gui/src/HotkeyDialog.h index a7b3c2e3..efea813f 100644 --- a/src/gui/src/HotkeyDialog.h +++ b/src/gui/src/HotkeyDialog.h @@ -27,23 +27,23 @@ class HotkeyDialog : public QDialog, public Ui::HotkeyDialogBase { - Q_OBJECT + Q_OBJECT - public: - HotkeyDialog(QWidget* parent, Hotkey& hotkey); + public: + HotkeyDialog(QWidget* parent, Hotkey& hotkey); - public: - const Hotkey& hotkey() const { return m_Hotkey; } + public: + const Hotkey& hotkey() const { return m_Hotkey; } - protected slots: - void accept(); + protected slots: + void accept(); - protected: - const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; } - Hotkey& hotkey() { return m_Hotkey; } + protected: + const KeySequenceWidget* sequenceWidget() const { return m_pKeySequenceWidgetHotkey; } + Hotkey& hotkey() { return m_Hotkey; } - private: - Hotkey& m_Hotkey; + private: + Hotkey& m_Hotkey; }; #endif diff --git a/src/gui/src/Ipc.cpp b/src/gui/src/Ipc.cpp index 6cc3e97c..3f4afbc7 100644 --- a/src/gui/src/Ipc.cpp +++ b/src/gui/src/Ipc.cpp @@ -20,7 +20,7 @@ #include "Ipc.h" -const char* kIpcMsgHello = "IHEL%1i"; -const char* kIpcMsgLogLine = "ILOG%s"; -const char* kIpcMsgCommand = "ICMD%s%1i"; -const char* kIpcMsgShutdown = "ISDN"; +const char* kIpcMsgHello = "IHEL%1i"; +const char* kIpcMsgLogLine = "ILOG%s"; +const char* kIpcMsgCommand = "ICMD%s%1i"; +const char* kIpcMsgShutdown = "ISDN"; diff --git a/src/gui/src/Ipc.h b/src/gui/src/Ipc.h index 8b86b069..9e627595 100644 --- a/src/gui/src/Ipc.h +++ b/src/gui/src/Ipc.h @@ -24,19 +24,19 @@ #define IPC_PORT 24801 enum qIpcMessageType { - kIpcHello, - kIpcLogLine, - kIpcCommand, - kIpcShutdown, + kIpcHello, + kIpcLogLine, + kIpcCommand, + kIpcShutdown, }; enum qIpcClientType { - kIpcClientUnknown, - kIpcClientGui, - kIpcClientNode, + kIpcClientUnknown, + kIpcClientGui, + kIpcClientNode, }; -extern const char* kIpcMsgHello; -extern const char* kIpcMsgLogLine; -extern const char* kIpcMsgCommand; -extern const char* kIpcMsgShutdown; +extern const char* kIpcMsgHello; +extern const char* kIpcMsgLogLine; +extern const char* kIpcMsgCommand; +extern const char* kIpcMsgShutdown; diff --git a/src/gui/src/IpcClient.cpp b/src/gui/src/IpcClient.cpp index 941a79d2..2322bc3d 100644 --- a/src/gui/src/IpcClient.cpp +++ b/src/gui/src/IpcClient.cpp @@ -29,12 +29,12 @@ IpcClient::IpcClient() : m_ReaderStarted(false), m_Enabled(false) { - m_Socket = new QTcpSocket(this); - connect(m_Socket, SIGNAL(connected()), this, SLOT(connected())); - connect(m_Socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); + m_Socket = new QTcpSocket(this); + connect(m_Socket, SIGNAL(connected()), this, SLOT(connected())); + connect(m_Socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError))); - m_Reader = new IpcReader(m_Socket); - connect(m_Reader, SIGNAL(readLogLine(const QString&)), this, SLOT(handleReadLogLine(const QString&))); + m_Reader = new IpcReader(m_Socket); + connect(m_Reader, SIGNAL(readLogLine(const QString&)), this, SLOT(handleReadLogLine(const QString&))); } IpcClient::~IpcClient() @@ -43,104 +43,104 @@ IpcClient::~IpcClient() void IpcClient::connected() { - sendHello(); - infoMessage("connection established"); + sendHello(); + infoMessage("connection established"); } void IpcClient::connectToHost() { - m_Enabled = true; + m_Enabled = true; - infoMessage("connecting to service..."); - m_Socket->connectToHost(QHostAddress(QHostAddress::LocalHost), IPC_PORT); + infoMessage("connecting to service..."); + m_Socket->connectToHost(QHostAddress(QHostAddress::LocalHost), IPC_PORT); - if (!m_ReaderStarted) { - m_Reader->start(); - m_ReaderStarted = true; - } + if (!m_ReaderStarted) { + m_Reader->start(); + m_ReaderStarted = true; + } } void IpcClient::disconnectFromHost() { - infoMessage("service disconnect"); - m_Reader->stop(); - m_Socket->close(); + infoMessage("service disconnect"); + m_Reader->stop(); + m_Socket->close(); } void IpcClient::error(QAbstractSocket::SocketError error) { - QString text; - switch (error) { - case 0: text = "connection refused"; break; - case 1: text = "remote host closed"; break; - default: text = QString("code=%1").arg(error); break; - } + QString text; + switch (error) { + case 0: text = "connection refused"; break; + case 1: text = "remote host closed"; break; + default: text = QString("code=%1").arg(error); break; + } - errorMessage(QString("ipc connection error, %1").arg(text)); + errorMessage(QString("ipc connection error, %1").arg(text)); - QTimer::singleShot(1000, this, SLOT(retryConnect())); + QTimer::singleShot(1000, this, SLOT(retryConnect())); } void IpcClient::retryConnect() { - if (m_Enabled) { - connectToHost(); - } + if (m_Enabled) { + connectToHost(); + } } void IpcClient::sendHello() { - QDataStream stream(m_Socket); - stream.writeRawData(kIpcMsgHello, 4); + QDataStream stream(m_Socket); + stream.writeRawData(kIpcMsgHello, 4); - char typeBuf[1]; - typeBuf[0] = kIpcClientGui; - stream.writeRawData(typeBuf, 1); + char typeBuf[1]; + typeBuf[0] = kIpcClientGui; + stream.writeRawData(typeBuf, 1); } void IpcClient::sendCommand(const QString& command, ElevateMode const elevate) { - QDataStream stream(m_Socket); + QDataStream stream(m_Socket); - stream.writeRawData(kIpcMsgCommand, 4); + stream.writeRawData(kIpcMsgCommand, 4); - std::string stdStringCommand = command.toStdString(); - const char* charCommand = stdStringCommand.c_str(); - int length = strlen(charCommand); + std::string stdStringCommand = command.toStdString(); + const char* charCommand = stdStringCommand.c_str(); + int length = strlen(charCommand); - char lenBuf[4]; - intToBytes(length, lenBuf, 4); - stream.writeRawData(lenBuf, 4); - stream.writeRawData(charCommand, length); + char lenBuf[4]; + intToBytes(length, lenBuf, 4); + stream.writeRawData(lenBuf, 4); + stream.writeRawData(charCommand, length); - char elevateBuf[1]; + char elevateBuf[1]; // Refer to enum ElevateMode documentation for why this flag is mapped this way - elevateBuf[0] = (elevate == ElevateAlways) ? 1 : 0; - stream.writeRawData(elevateBuf, 1); + elevateBuf[0] = (elevate == ElevateAlways) ? 1 : 0; + stream.writeRawData(elevateBuf, 1); } void IpcClient::handleReadLogLine(const QString& text) { - readLogLine(text); + readLogLine(text); } // TODO: qt must have a built in way of converting int to bytes. void IpcClient::intToBytes(int value, char *buffer, int size) { - if (size == 1) { - buffer[0] = value & 0xff; - } - else if (size == 2) { - buffer[0] = (value >> 8) & 0xff; - buffer[1] = value & 0xff; - } - else if (size == 4) { - buffer[0] = (value >> 24) & 0xff; - buffer[1] = (value >> 16) & 0xff; - buffer[2] = (value >> 8) & 0xff; - buffer[3] = value & 0xff; - } - else { - // TODO: other sizes, if needed. - } + if (size == 1) { + buffer[0] = value & 0xff; + } + else if (size == 2) { + buffer[0] = (value >> 8) & 0xff; + buffer[1] = value & 0xff; + } + else if (size == 4) { + buffer[0] = (value >> 24) & 0xff; + buffer[1] = (value >> 16) & 0xff; + buffer[2] = (value >> 8) & 0xff; + buffer[3] = value & 0xff; + } + else { + // TODO: other sizes, if needed. + } } diff --git a/src/gui/src/IpcClient.h b/src/gui/src/IpcClient.h index e6761176..ea4b4506 100644 --- a/src/gui/src/IpcClient.h +++ b/src/gui/src/IpcClient.h @@ -28,36 +28,36 @@ class IpcReader; class IpcClient : public QObject { - Q_OBJECT + Q_OBJECT public: - IpcClient(); - virtual ~IpcClient(); + IpcClient(); + virtual ~IpcClient(); - void sendHello(); - void sendCommand(const QString& command, ElevateMode elevate); - void connectToHost(); - void disconnectFromHost(); + void sendHello(); + void sendCommand(const QString& command, ElevateMode elevate); + void connectToHost(); + void disconnectFromHost(); public slots: - void retryConnect(); + void retryConnect(); private: - void intToBytes(int value, char* buffer, int size); + void intToBytes(int value, char* buffer, int size); private slots: - void connected(); - void error(QAbstractSocket::SocketError error); - void handleReadLogLine(const QString& text); + void connected(); + void error(QAbstractSocket::SocketError error); + void handleReadLogLine(const QString& text); signals: - void readLogLine(const QString& text); - void infoMessage(const QString& text); - void errorMessage(const QString& text); + void readLogLine(const QString& text); + void infoMessage(const QString& text); + void errorMessage(const QString& text); private: - QTcpSocket* m_Socket; - IpcReader* m_Reader; - bool m_ReaderStarted; - bool m_Enabled; + QTcpSocket* m_Socket; + IpcReader* m_Reader; + bool m_ReaderStarted; + bool m_Enabled; }; diff --git a/src/gui/src/IpcReader.cpp b/src/gui/src/IpcReader.cpp index a2a78de7..323a4103 100644 --- a/src/gui/src/IpcReader.cpp +++ b/src/gui/src/IpcReader.cpp @@ -34,98 +34,98 @@ IpcReader::~IpcReader() void IpcReader::start() { - connect(m_Socket, SIGNAL(readyRead()), this, SLOT(read())); + connect(m_Socket, SIGNAL(readyRead()), this, SLOT(read())); } void IpcReader::stop() { - disconnect(m_Socket, SIGNAL(readyRead()), this, SLOT(read())); + disconnect(m_Socket, SIGNAL(readyRead()), this, SLOT(read())); } void IpcReader::read() { - QMutexLocker locker(&m_Mutex); - std::cout << "ready read" << std::endl; + QMutexLocker locker(&m_Mutex); + std::cout << "ready read" << std::endl; - while (m_Socket->bytesAvailable()) { - std::cout << "bytes available" << std::endl; + while (m_Socket->bytesAvailable()) { + std::cout << "bytes available" << std::endl; - char codeBuf[5]; - readStream(codeBuf, 4); - codeBuf[4] = 0; - std::cout << "ipc read: " << codeBuf << std::endl; + char codeBuf[5]; + readStream(codeBuf, 4); + codeBuf[4] = 0; + std::cout << "ipc read: " << codeBuf << std::endl; - if (memcmp(codeBuf, kIpcMsgLogLine, 4) == 0) { - std::cout << "reading log line" << std::endl; + if (memcmp(codeBuf, kIpcMsgLogLine, 4) == 0) { + std::cout << "reading log line" << std::endl; - char lenBuf[4]; - readStream(lenBuf, 4); - int len = bytesToInt(lenBuf, 4); + char lenBuf[4]; + readStream(lenBuf, 4); + int len = bytesToInt(lenBuf, 4); - char* data = new char[len]; - readStream(data, len); - QString line = QString::fromUtf8(data, len); - delete[] data; + char* data = new char[len]; + readStream(data, len); + QString line = QString::fromUtf8(data, len); + delete[] data; - readLogLine(line); - } - else { - std::cerr << "aborting, message invalid" << std::endl; - return; - } - } + readLogLine(line); + } + else { + std::cerr << "aborting, message invalid" << std::endl; + return; + } + } - std::cout << "read done" << std::endl; + std::cout << "read done" << std::endl; } bool IpcReader::readStream(char* buffer, int length) { - std::cout << "reading stream" << std::endl; + std::cout << "reading stream" << std::endl; - int read = 0; - while (read < length) { - int ask = length - read; - if (m_Socket->bytesAvailable() < ask) { - std::cout << "buffer too short, waiting" << std::endl; - m_Socket->waitForReadyRead(-1); - } + int read = 0; + while (read < length) { + int ask = length - read; + if (m_Socket->bytesAvailable() < ask) { + std::cout << "buffer too short, waiting" << std::endl; + m_Socket->waitForReadyRead(-1); + } - int got = m_Socket->read(buffer, ask); - read += got; + int got = m_Socket->read(buffer, ask); + read += got; - std::cout << "> ask=" << ask << " got=" << got - << " read=" << read << std::endl; + std::cout << "> ask=" << ask << " got=" << got + << " read=" << read << std::endl; - if (got == -1) { - std::cout << "socket ended, aborting" << std::endl; - return false; - } - else if (length - read > 0) { - std::cout << "more remains, seek to " << got << std::endl; - buffer += got; - } - } - return true; + if (got == -1) { + std::cout << "socket ended, aborting" << std::endl; + return false; + } + else if (length - read > 0) { + std::cout << "more remains, seek to " << got << std::endl; + buffer += got; + } + } + return true; } int IpcReader::bytesToInt(const char *buffer, int size) { - if (size == 1) { - return (unsigned char)buffer[0]; - } - else if (size == 2) { - return - (((unsigned char)buffer[0]) << 8) + - (unsigned char)buffer[1]; - } - else if (size == 4) { - return - (((unsigned char)buffer[0]) << 24) + - (((unsigned char)buffer[1]) << 16) + - (((unsigned char)buffer[2]) << 8) + - (unsigned char)buffer[3]; - } - else { - return 0; - } + if (size == 1) { + return (unsigned char)buffer[0]; + } + else if (size == 2) { + return + (((unsigned char)buffer[0]) << 8) + + (unsigned char)buffer[1]; + } + else if (size == 4) { + return + (((unsigned char)buffer[0]) << 24) + + (((unsigned char)buffer[1]) << 16) + + (((unsigned char)buffer[2]) << 8) + + (unsigned char)buffer[3]; + } + else { + return 0; + } } diff --git a/src/gui/src/IpcReader.h b/src/gui/src/IpcReader.h index e4f7c75c..8a3e7c09 100644 --- a/src/gui/src/IpcReader.h +++ b/src/gui/src/IpcReader.h @@ -25,25 +25,25 @@ class QTcpSocket; class IpcReader : public QObject { - Q_OBJECT; + Q_OBJECT; public: - IpcReader(QTcpSocket* socket); - virtual ~IpcReader(); - void start(); - void stop(); + IpcReader(QTcpSocket* socket); + virtual ~IpcReader(); + void start(); + void stop(); signals: - void readLogLine(const QString& text); + void readLogLine(const QString& text); private: - bool readStream(char* buffer, int length); - int bytesToInt(const char* buffer, int size); + bool readStream(char* buffer, int length); + int bytesToInt(const char* buffer, int size); private slots: - void read(); + void read(); private: - QTcpSocket* m_Socket; - QMutex m_Mutex; + QTcpSocket* m_Socket; + QMutex m_Mutex; }; diff --git a/src/gui/src/KeySequence.cpp b/src/gui/src/KeySequence.cpp index 6548a83f..8783609d 100644 --- a/src/gui/src/KeySequence.cpp +++ b/src/gui/src/KeySequence.cpp @@ -25,213 +25,213 @@ // and is heavily modified for QSynergy static const struct { - int key; - const char* name; + int key; + const char* name; } keyname[] = { - { Qt::Key_Space, "Space" }, - { Qt::Key_Escape, "Escape" }, - { Qt::Key_Tab, "Tab" }, - { Qt::Key_Backtab, "LeftTab" }, - { Qt::Key_Backspace, "BackSpace" }, - { Qt::Key_Return, "Return" }, - { Qt::Key_Insert, "Insert" }, - { Qt::Key_Delete, "Delete" }, - { Qt::Key_Pause, "Pause" }, - { Qt::Key_Print, "Print" }, - { Qt::Key_SysReq, "SysReq" }, - { Qt::Key_Home, "Home" }, - { Qt::Key_End, "End" }, - { Qt::Key_Left, "Left" }, - { Qt::Key_Up, "Up" }, - { Qt::Key_Right, "Right" }, - { Qt::Key_Down, "Down" }, - { Qt::Key_PageUp, "PageUp" }, - { Qt::Key_PageDown, "PageDown" }, - { Qt::Key_CapsLock, "CapsLock" }, - { Qt::Key_NumLock, "NumLock" }, - { Qt::Key_ScrollLock, "ScrollLock" }, - { Qt::Key_Menu, "Menu" }, - { Qt::Key_Help, "Help" }, - { Qt::Key_Enter, "KP_Enter" }, - { Qt::Key_Clear, "Clear" }, + { Qt::Key_Space, "Space" }, + { Qt::Key_Escape, "Escape" }, + { Qt::Key_Tab, "Tab" }, + { Qt::Key_Backtab, "LeftTab" }, + { Qt::Key_Backspace, "BackSpace" }, + { Qt::Key_Return, "Return" }, + { Qt::Key_Insert, "Insert" }, + { Qt::Key_Delete, "Delete" }, + { Qt::Key_Pause, "Pause" }, + { Qt::Key_Print, "Print" }, + { Qt::Key_SysReq, "SysReq" }, + { Qt::Key_Home, "Home" }, + { Qt::Key_End, "End" }, + { Qt::Key_Left, "Left" }, + { Qt::Key_Up, "Up" }, + { Qt::Key_Right, "Right" }, + { Qt::Key_Down, "Down" }, + { Qt::Key_PageUp, "PageUp" }, + { Qt::Key_PageDown, "PageDown" }, + { Qt::Key_CapsLock, "CapsLock" }, + { Qt::Key_NumLock, "NumLock" }, + { Qt::Key_ScrollLock, "ScrollLock" }, + { Qt::Key_Menu, "Menu" }, + { Qt::Key_Help, "Help" }, + { Qt::Key_Enter, "KP_Enter" }, + { Qt::Key_Clear, "Clear" }, - { Qt::Key_Back, "WWWBack" }, - { Qt::Key_Forward, "WWWForward" }, - { Qt::Key_Stop, "WWWStop" }, - { Qt::Key_Refresh, "WWWRefresh" }, - { Qt::Key_VolumeDown, "AudioDown" }, - { Qt::Key_VolumeMute, "AudioMute" }, - { Qt::Key_VolumeUp, "AudioUp" }, - { Qt::Key_MediaPlay, "AudioPlay" }, - { Qt::Key_MediaStop, "AudioStop" }, - { Qt::Key_MediaPrevious,"AudioPrev" }, - { Qt::Key_MediaNext, "AudioNext" }, - { Qt::Key_HomePage, "WWWHome" }, - { Qt::Key_Favorites, "WWWFavorites" }, - { Qt::Key_Search, "WWWSearch" }, - { Qt::Key_Standby, "Sleep" }, - { Qt::Key_LaunchMail, "AppMail" }, - { Qt::Key_LaunchMedia, "AppMedia" }, - { Qt::Key_Launch0, "AppUser1" }, - { Qt::Key_Launch1, "AppUser2" }, - { Qt::Key_Select, "Select" }, + { Qt::Key_Back, "WWWBack" }, + { Qt::Key_Forward, "WWWForward" }, + { Qt::Key_Stop, "WWWStop" }, + { Qt::Key_Refresh, "WWWRefresh" }, + { Qt::Key_VolumeDown, "AudioDown" }, + { Qt::Key_VolumeMute, "AudioMute" }, + { Qt::Key_VolumeUp, "AudioUp" }, + { Qt::Key_MediaPlay, "AudioPlay" }, + { Qt::Key_MediaStop, "AudioStop" }, + { Qt::Key_MediaPrevious,"AudioPrev" }, + { Qt::Key_MediaNext, "AudioNext" }, + { Qt::Key_HomePage, "WWWHome" }, + { Qt::Key_Favorites, "WWWFavorites" }, + { Qt::Key_Search, "WWWSearch" }, + { Qt::Key_Standby, "Sleep" }, + { Qt::Key_LaunchMail, "AppMail" }, + { Qt::Key_LaunchMedia, "AppMedia" }, + { Qt::Key_Launch0, "AppUser1" }, + { Qt::Key_Launch1, "AppUser2" }, + { Qt::Key_Select, "Select" }, - { 0, 0 } + { 0, 0 } }; KeySequence::KeySequence() : - m_Sequence(), - m_Modifiers(0), - m_IsValid(false) + m_Sequence(), + m_Modifiers(0), + m_IsValid(false) { } bool KeySequence::isMouseButton() const { - return !m_Sequence.isEmpty() && m_Sequence.last() < Qt::Key_Space; + return !m_Sequence.isEmpty() && m_Sequence.last() < Qt::Key_Space; } QString KeySequence::toString() const { - QString result; + QString result; - for (int i = 0; i < m_Sequence.size(); i++) - { - result += keyToString(m_Sequence[i]); + for (int i = 0; i < m_Sequence.size(); i++) + { + result += keyToString(m_Sequence[i]); - if (i != m_Sequence.size() - 1) - result += "+"; - } + if (i != m_Sequence.size() - 1) + result += "+"; + } - return result; + return result; } bool KeySequence::appendMouseButton(int button) { - return appendKey(button, 0); + return appendKey(button, 0); } bool KeySequence::appendKey(int key, int modifiers) { - if (m_Sequence.size() == 4) - return true; + if (m_Sequence.size() == 4) + return true; - switch(key) - { - case Qt::Key_AltGr: - return false; + switch(key) + { + case Qt::Key_AltGr: + return false; - case Qt::Key_Control: - case Qt::Key_Alt: - case Qt::Key_Shift: - case Qt::Key_Meta: - case Qt::Key_Menu: - { - int mod = modifiers & (~m_Modifiers); - if (mod) - { - m_Sequence.append(mod); - m_Modifiers |= mod; - } - } - break; + case Qt::Key_Control: + case Qt::Key_Alt: + case Qt::Key_Shift: + case Qt::Key_Meta: + case Qt::Key_Menu: + { + int mod = modifiers & (~m_Modifiers); + if (mod) + { + m_Sequence.append(mod); + m_Modifiers |= mod; + } + } + break; - default: - // see if we can handle this key, if not, don't accept it - if (keyToString(key).isEmpty()) - break; + default: + // see if we can handle this key, if not, don't accept it + if (keyToString(key).isEmpty()) + break; - m_Sequence.append(key); - setValid(true); - return true; - } + m_Sequence.append(key); + setValid(true); + return true; + } - return false; + return false; } void KeySequence::loadSettings(QSettings& settings) { - sequence().clear(); - int num = settings.beginReadArray("keys"); - for (int i = 0; i < num; i++) - { - settings.setArrayIndex(i); - sequence().append(settings.value("key", 0).toInt()); - } - settings.endArray(); + sequence().clear(); + int num = settings.beginReadArray("keys"); + for (int i = 0; i < num; i++) + { + settings.setArrayIndex(i); + sequence().append(settings.value("key", 0).toInt()); + } + settings.endArray(); - setModifiers(0); - setValid(true); + setModifiers(0); + setValid(true); } void KeySequence::saveSettings(QSettings& settings) const { - settings.beginWriteArray("keys"); - for (int i = 0; i < sequence().size(); i++) - { - settings.setArrayIndex(i); - settings.setValue("key", sequence()[i]); - } - settings.endArray(); + settings.beginWriteArray("keys"); + for (int i = 0; i < sequence().size(); i++) + { + settings.setArrayIndex(i); + settings.setValue("key", sequence()[i]); + } + settings.endArray(); } QString KeySequence::keyToString(int key) { - // nothing there? - if (key == 0) - return ""; + // nothing there? + if (key == 0) + return ""; - // a hack to handle mouse buttons as if they were keys - if (key < Qt::Key_Space) - { - switch(key) - { - case Qt::LeftButton: return "1"; - case Qt::RightButton: return "2"; - case Qt::MidButton: return "3"; - } + // a hack to handle mouse buttons as if they were keys + if (key < Qt::Key_Space) + { + switch(key) + { + case Qt::LeftButton: return "1"; + case Qt::RightButton: return "2"; + case Qt::MidButton: return "3"; + } - return "4"; // qt only knows three mouse buttons, so assume it's an unknown fourth one - } + return "4"; // qt only knows three mouse buttons, so assume it's an unknown fourth one + } - // modifiers? - if (key & Qt::ShiftModifier) - return "Shift"; + // modifiers? + if (key & Qt::ShiftModifier) + return "Shift"; - if (key & Qt::ControlModifier) - return "Control"; + if (key & Qt::ControlModifier) + return "Control"; - if (key & Qt::AltModifier) - return "Alt"; + if (key & Qt::AltModifier) + return "Alt"; - if (key & Qt::MetaModifier) - return "Meta"; + if (key & Qt::MetaModifier) + return "Meta"; - // treat key pad like normal keys (FIXME: we should have another lookup table for keypad keys instead) - key &= ~Qt::KeypadModifier; + // treat key pad like normal keys (FIXME: we should have another lookup table for keypad keys instead) + key &= ~Qt::KeypadModifier; - // a printable 7 bit character? - if (key < 0x80 && key != Qt::Key_Space) - return QChar(key & 0x7f).toLower(); + // a printable 7 bit character? + if (key < 0x80 && key != Qt::Key_Space) + return QChar(key & 0x7f).toLower(); - // a function key? - if (key >= Qt::Key_F1 && key <= Qt::Key_F35) - return QString::fromUtf8("F%1").arg(key - Qt::Key_F1 + 1); + // a function key? + if (key >= Qt::Key_F1 && key <= Qt::Key_F35) + return QString::fromUtf8("F%1").arg(key - Qt::Key_F1 + 1); - // a special key? - int i=0; - while (keyname[i].name) - { - if (key == keyname[i].key) - return QString::fromUtf8(keyname[i].name); - i++; - } + // a special key? + int i=0; + while (keyname[i].name) + { + if (key == keyname[i].key) + return QString::fromUtf8(keyname[i].name); + i++; + } - // representable in ucs2? - if (key < 0x10000) - return QString("\\u%1").arg(QChar(key).toLower().unicode(), 4, 16, QChar('0')); + // representable in ucs2? + if (key < 0x10000) + return QString("\\u%1").arg(QChar(key).toLower().unicode(), 4, 16, QChar('0')); - // give up, synergy probably won't handle this - return ""; + // give up, synergy probably won't handle this + return ""; } diff --git a/src/gui/src/KeySequence.h b/src/gui/src/KeySequence.h index 3797b05d..79f49c3a 100644 --- a/src/gui/src/KeySequence.h +++ b/src/gui/src/KeySequence.h @@ -27,31 +27,31 @@ class QSettings; class KeySequence { - public: - KeySequence(); + public: + KeySequence(); - public: - QString toString() const; - bool appendKey(int modifiers, int key); - bool appendMouseButton(int button); - bool isMouseButton() const; - bool valid() const { return m_IsValid; } - int modifiers() const { return m_Modifiers; } - void saveSettings(QSettings& settings) const; - void loadSettings(QSettings& settings); - const QList& sequence() const { return m_Sequence; } + public: + QString toString() const; + bool appendKey(int modifiers, int key); + bool appendMouseButton(int button); + bool isMouseButton() const; + bool valid() const { return m_IsValid; } + int modifiers() const { return m_Modifiers; } + void saveSettings(QSettings& settings) const; + void loadSettings(QSettings& settings); + const QList& sequence() const { return m_Sequence; } - private: - void setValid(bool b) { m_IsValid = b; } - void setModifiers(int i) { m_Modifiers = i; } - QList& sequence() { return m_Sequence; } + private: + void setValid(bool b) { m_IsValid = b; } + void setModifiers(int i) { m_Modifiers = i; } + QList& sequence() { return m_Sequence; } - private: - QList m_Sequence; - int m_Modifiers; - bool m_IsValid; + private: + QList m_Sequence; + int m_Modifiers; + bool m_IsValid; - static QString keyToString(int key); + static QString keyToString(int key); }; #endif diff --git a/src/gui/src/KeySequenceWidget.cpp b/src/gui/src/KeySequenceWidget.cpp index b3fa517d..c4ca4356 100644 --- a/src/gui/src/KeySequenceWidget.cpp +++ b/src/gui/src/KeySequenceWidget.cpp @@ -22,124 +22,124 @@ #include KeySequenceWidget::KeySequenceWidget(QWidget* parent, const KeySequence& seq) : - QPushButton(parent), - m_KeySequence(seq), - m_BackupSequence(seq), - m_Status(Stopped), - m_MousePrefix("mousebutton("), - m_MousePostfix(")"), - m_KeyPrefix("keystroke("), - m_KeyPostfix(")") + QPushButton(parent), + m_KeySequence(seq), + m_BackupSequence(seq), + m_Status(Stopped), + m_MousePrefix("mousebutton("), + m_MousePostfix(")"), + m_KeyPrefix("keystroke("), + m_KeyPostfix(")") { - setFocusPolicy(Qt::NoFocus); - updateOutput(); + setFocusPolicy(Qt::NoFocus); + updateOutput(); } void KeySequenceWidget::setKeySequence(const KeySequence& seq) { - keySequence() = seq; - backupSequence() = seq; + keySequence() = seq; + backupSequence() = seq; - setStatus(Stopped); - updateOutput(); + setStatus(Stopped); + updateOutput(); } void KeySequenceWidget::mousePressEvent(QMouseEvent* event) { - event->accept(); + event->accept(); - if (status() == Stopped) - { - startRecording(); - return; - } + if (status() == Stopped) + { + startRecording(); + return; + } - if (m_KeySequence.appendMouseButton(event->button())) - stopRecording(); + if (m_KeySequence.appendMouseButton(event->button())) + stopRecording(); - updateOutput(); + updateOutput(); } void KeySequenceWidget::startRecording() { - keySequence() = KeySequence(); - setDown(true); - setFocus(); - grabKeyboard(); - setStatus(Recording); + keySequence() = KeySequence(); + setDown(true); + setFocus(); + grabKeyboard(); + setStatus(Recording); } void KeySequenceWidget::stopRecording() { - if (!keySequence().valid()) - { - keySequence() = backupSequence(); - updateOutput(); - } + if (!keySequence().valid()) + { + keySequence() = backupSequence(); + updateOutput(); + } - setDown(false); - focusNextChild(); - releaseKeyboard(); - setStatus(Stopped); - emit keySequenceChanged(); + setDown(false); + focusNextChild(); + releaseKeyboard(); + setStatus(Stopped); + emit keySequenceChanged(); } bool KeySequenceWidget::event(QEvent* event) { - if (status() == Recording) - { - switch(event->type()) - { - case QEvent::KeyPress: - keyPressEvent(static_cast(event)); - return true; + if (status() == Recording) + { + switch(event->type()) + { + case QEvent::KeyPress: + keyPressEvent(static_cast(event)); + return true; - case QEvent::MouseButtonRelease: - event->accept(); - return true; + case QEvent::MouseButtonRelease: + event->accept(); + return true; - case QEvent::ShortcutOverride: - event->accept(); - return true; + case QEvent::ShortcutOverride: + event->accept(); + return true; - case QEvent::FocusOut: - stopRecording(); - if (!valid()) - { - keySequence() = backupSequence(); - updateOutput(); - } - break; + case QEvent::FocusOut: + stopRecording(); + if (!valid()) + { + keySequence() = backupSequence(); + updateOutput(); + } + break; - default: - break; - } - } + default: + break; + } + } - return QPushButton::event(event); + return QPushButton::event(event); } void KeySequenceWidget::keyPressEvent(QKeyEvent* event) { - event->accept(); + event->accept(); - if (status() == Stopped) - return; + if (status() == Stopped) + return; - if (m_KeySequence.appendKey(event->key(), event->modifiers())) - stopRecording(); + if (m_KeySequence.appendKey(event->key(), event->modifiers())) + stopRecording(); - updateOutput(); + updateOutput(); } void KeySequenceWidget::updateOutput() { - QString s; + QString s; - if (m_KeySequence.isMouseButton()) - s = mousePrefix() + m_KeySequence.toString() + mousePostfix(); - else - s = keyPrefix() + m_KeySequence.toString() + keyPostfix(); + if (m_KeySequence.isMouseButton()) + s = mousePrefix() + m_KeySequence.toString() + mousePostfix(); + else + s = keyPrefix() + m_KeySequence.toString() + keyPostfix(); - setText(s); + setText(s); } diff --git a/src/gui/src/KeySequenceWidget.h b/src/gui/src/KeySequenceWidget.h index f9fea8f7..ecd81b94 100644 --- a/src/gui/src/KeySequenceWidget.h +++ b/src/gui/src/KeySequenceWidget.h @@ -26,55 +26,55 @@ class KeySequenceWidget : public QPushButton { - Q_OBJECT + Q_OBJECT - public: - KeySequenceWidget(QWidget* parent, const KeySequence& seq = KeySequence()); + public: + KeySequenceWidget(QWidget* parent, const KeySequence& seq = KeySequence()); - signals: - void keySequenceChanged(); + signals: + void keySequenceChanged(); - public: - const QString& mousePrefix() const { return m_MousePrefix; } - const QString& mousePostfix() const { return m_MousePostfix; } - const QString& keyPrefix() const { return m_KeyPrefix; } - const QString& keyPostfix() const { return m_KeyPostfix; } + public: + const QString& mousePrefix() const { return m_MousePrefix; } + const QString& mousePostfix() const { return m_MousePostfix; } + const QString& keyPrefix() const { return m_KeyPrefix; } + const QString& keyPostfix() const { return m_KeyPostfix; } - void setMousePrefix(const QString& s) { m_MousePrefix = s; } - void setMousePostfix(const QString& s) { m_MousePostfix = s; } - void setKeyPrefix(const QString& s) { m_KeyPrefix = s; } - void setKeyPostfix(const QString& s) { m_KeyPostfix = s; } + void setMousePrefix(const QString& s) { m_MousePrefix = s; } + void setMousePostfix(const QString& s) { m_MousePostfix = s; } + void setKeyPrefix(const QString& s) { m_KeyPrefix = s; } + void setKeyPostfix(const QString& s) { m_KeyPostfix = s; } - const KeySequence& keySequence() const { return m_KeySequence; } - const KeySequence& backupSequence() const { return m_BackupSequence; } - void setKeySequence(const KeySequence& seq); + const KeySequence& keySequence() const { return m_KeySequence; } + const KeySequence& backupSequence() const { return m_BackupSequence; } + void setKeySequence(const KeySequence& seq); - bool valid() const { return keySequence().valid(); } + bool valid() const { return keySequence().valid(); } - protected: - void mousePressEvent(QMouseEvent*); - void keyPressEvent(QKeyEvent*); - bool event(QEvent* event); - void appendToSequence(int key); - void updateOutput(); - void startRecording(); - void stopRecording(); - KeySequence& keySequence() { return m_KeySequence; } - KeySequence& backupSequence() { return m_BackupSequence; } + protected: + void mousePressEvent(QMouseEvent*); + void keyPressEvent(QKeyEvent*); + bool event(QEvent* event); + void appendToSequence(int key); + void updateOutput(); + void startRecording(); + void stopRecording(); + KeySequence& keySequence() { return m_KeySequence; } + KeySequence& backupSequence() { return m_BackupSequence; } - private: - enum Status { Stopped, Recording }; - void setStatus(Status s) { m_Status = s; } - Status status() const { return m_Status; } + private: + enum Status { Stopped, Recording }; + void setStatus(Status s) { m_Status = s; } + Status status() const { return m_Status; } - private: - KeySequence m_KeySequence; - KeySequence m_BackupSequence; - Status m_Status; - QString m_MousePrefix; - QString m_MousePostfix; - QString m_KeyPrefix; - QString m_KeyPostfix; + private: + KeySequence m_KeySequence; + KeySequence m_BackupSequence; + Status m_Status; + QString m_MousePrefix; + QString m_MousePostfix; + QString m_KeyPrefix; + QString m_KeyPostfix; }; #endif diff --git a/src/gui/src/LicenseManager.h b/src/gui/src/LicenseManager.h index 7ece4e23..d5c77b16 100644 --- a/src/gui/src/LicenseManager.h +++ b/src/gui/src/LicenseManager.h @@ -26,28 +26,28 @@ class AppConfig; class LicenseManager: public QObject { - Q_OBJECT + Q_OBJECT public: - LicenseManager(AppConfig* appConfig); - std::pair setSerialKey(SerialKey serialKey, - bool acceptExpired = false); - void refresh(); - Edition activeEdition() const; - QString activeEditionName() const; - SerialKey serialKey() const; - void skipActivation(); - void notifyUpdate(QString fromVersion, QString toVersion); - static QString getEditionName(Edition edition, bool trial = false); - void notifyActivation(QString identity); + LicenseManager(AppConfig* appConfig); + std::pair setSerialKey(SerialKey serialKey, + bool acceptExpired = false); + void refresh(); + Edition activeEdition() const; + QString activeEditionName() const; + SerialKey serialKey() const; + void skipActivation(); + void notifyUpdate(QString fromVersion, QString toVersion); + static QString getEditionName(Edition edition, bool trial = false); + void notifyActivation(QString identity); private: - AppConfig* m_AppConfig; - SerialKey m_serialKey; + AppConfig* m_AppConfig; + SerialKey m_serialKey; signals: - void serialKeyChanged (SerialKey) const; - void editionChanged (Edition) const; - void beginTrial (bool expiring) const; - void endTrial (bool expired) const; + void serialKeyChanged (SerialKey) const; + void editionChanged (Edition) const; + void beginTrial (bool expiring) const; + void endTrial (bool expired) const; }; diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index 7466a144..19291aac 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -70,1270 +70,1270 @@ static const QString synergyConfigFilter(QObject::tr("Synergy Configurations (*. static const char* synergyIconFiles[] = { - ":/res/icons/16x16/synergy-disconnected.png", - ":/res/icons/16x16/synergy-disconnected.png", - ":/res/icons/16x16/synergy-connected.png", - ":/res/icons/16x16/synergy-transfering.png" + ":/res/icons/16x16/synergy-disconnected.png", + ":/res/icons/16x16/synergy-disconnected.png", + ":/res/icons/16x16/synergy-connected.png", + ":/res/icons/16x16/synergy-transfering.png" }; MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig, - LicenseManager& licenseManager) : - m_Settings(settings), - m_AppConfig(&appConfig), - m_LicenseManager(&licenseManager), - m_pSynergy(NULL), - m_SynergyState(synergyDisconnected), - m_ServerConfig(&m_Settings, 5, 3, m_AppConfig->screenName(), this), - m_pTempConfigFile(NULL), - m_pTrayIcon(NULL), - m_pTrayIconMenu(NULL), - m_AlreadyHidden(false), - m_pMenuBar(NULL), - m_pMenuFile(NULL), - m_pMenuEdit(NULL), - m_pMenuWindow(NULL), - m_pMenuHelp(NULL), - m_pZeroconfService(NULL), - m_pDataDownloader(NULL), - m_DownloadMessageBox(NULL), - m_pCancelButton(NULL), - m_SuppressAutoConfigWarning(false), - m_BonjourInstall(NULL), - m_SuppressEmptyServerWarning(false), - m_ExpectedRunningState(kStopped), - m_pSslCertificate(NULL), - m_ActivationDialogRunning(false) + LicenseManager& licenseManager) : + m_Settings(settings), + m_AppConfig(&appConfig), + m_LicenseManager(&licenseManager), + m_pSynergy(NULL), + m_SynergyState(synergyDisconnected), + m_ServerConfig(&m_Settings, 5, 3, m_AppConfig->screenName(), this), + m_pTempConfigFile(NULL), + m_pTrayIcon(NULL), + m_pTrayIconMenu(NULL), + m_AlreadyHidden(false), + m_pMenuBar(NULL), + m_pMenuFile(NULL), + m_pMenuEdit(NULL), + m_pMenuWindow(NULL), + m_pMenuHelp(NULL), + m_pZeroconfService(NULL), + m_pDataDownloader(NULL), + m_DownloadMessageBox(NULL), + m_pCancelButton(NULL), + m_SuppressAutoConfigWarning(false), + m_BonjourInstall(NULL), + m_SuppressEmptyServerWarning(false), + m_ExpectedRunningState(kStopped), + m_pSslCertificate(NULL), + m_ActivationDialogRunning(false) { - setupUi(this); + setupUi(this); - createMenuBar(); - loadSettings(); - initConnections(); + createMenuBar(); + loadSettings(); + initConnections(); - m_pWidgetUpdate->hide(); - m_VersionChecker.setApp(appPath(appConfig.synergycName())); - m_pLabelScreenName->setText(getScreenName()); - m_pLabelIpAddresses->setText(getIPAddresses()); + m_pWidgetUpdate->hide(); + m_VersionChecker.setApp(appPath(appConfig.synergycName())); + m_pLabelScreenName->setText(getScreenName()); + m_pLabelIpAddresses->setText(getIPAddresses()); #if defined(Q_OS_WIN) - // ipc must always be enabled, so that we can disable command when switching to desktop mode. - connect(&m_IpcClient, SIGNAL(readLogLine(const QString&)), this, SLOT(appendLogRaw(const QString&))); - connect(&m_IpcClient, SIGNAL(errorMessage(const QString&)), this, SLOT(appendLogError(const QString&))); - connect(&m_IpcClient, SIGNAL(infoMessage(const QString&)), this, SLOT(appendLogInfo(const QString&))); - m_IpcClient.connectToHost(); + // ipc must always be enabled, so that we can disable command when switching to desktop mode. + connect(&m_IpcClient, SIGNAL(readLogLine(const QString&)), this, SLOT(appendLogRaw(const QString&))); + connect(&m_IpcClient, SIGNAL(errorMessage(const QString&)), this, SLOT(appendLogError(const QString&))); + connect(&m_IpcClient, SIGNAL(infoMessage(const QString&)), this, SLOT(appendLogInfo(const QString&))); + m_IpcClient.connectToHost(); #endif - // change default size based on os + // change default size based on os #if defined(Q_OS_MAC) - resize(720, 550); - setMinimumSize(size()); + resize(720, 550); + setMinimumSize(size()); #elif defined(Q_OS_LINUX) - resize(700, 530); - setMinimumSize(size()); + resize(700, 530); + setMinimumSize(size()); #endif - m_SuppressAutoConfigWarning = true; - m_pCheckBoxAutoConfig->setChecked(appConfig.autoConfig()); - m_SuppressAutoConfigWarning = false; + m_SuppressAutoConfigWarning = true; + m_pCheckBoxAutoConfig->setChecked(appConfig.autoConfig()); + m_SuppressAutoConfigWarning = false; - m_pComboServerList->hide(); - m_pLabelPadlock->hide(); - m_trialWidget->hide(); + m_pComboServerList->hide(); + m_pLabelPadlock->hide(); + m_trialWidget->hide(); - connect (this, SIGNAL(windowShown()), - this, SLOT(on_windowShown()), Qt::QueuedConnection); + connect (this, SIGNAL(windowShown()), + this, SLOT(on_windowShown()), Qt::QueuedConnection); - connect (m_LicenseManager, SIGNAL(editionChanged(Edition)), - this, SLOT(setEdition(Edition)), Qt::QueuedConnection); + connect (m_LicenseManager, SIGNAL(editionChanged(Edition)), + this, SLOT(setEdition(Edition)), Qt::QueuedConnection); - connect (m_LicenseManager, SIGNAL(beginTrial(bool)), - this, SLOT(beginTrial(bool)), Qt::QueuedConnection); + connect (m_LicenseManager, SIGNAL(beginTrial(bool)), + this, SLOT(beginTrial(bool)), Qt::QueuedConnection); - connect (m_LicenseManager, SIGNAL(endTrial(bool)), - this, SLOT(endTrial(bool)), Qt::QueuedConnection); + connect (m_LicenseManager, SIGNAL(endTrial(bool)), + this, SLOT(endTrial(bool)), Qt::QueuedConnection); - connect (m_AppConfig, SIGNAL(sslToggled(bool)), - this, SLOT(sslToggled(bool)), Qt::QueuedConnection); + connect (m_AppConfig, SIGNAL(sslToggled(bool)), + this, SLOT(sslToggled(bool)), Qt::QueuedConnection); - setWindowTitle (m_LicenseManager->activeEditionName()); - m_LicenseManager->refresh(); + setWindowTitle (m_LicenseManager->activeEditionName()); + m_LicenseManager->refresh(); - QString lastVersion = m_AppConfig->lastVersion(); - QString currentVersion = m_VersionChecker.getVersion(); - if (lastVersion != currentVersion) { - m_AppConfig->setLastVersion (currentVersion); - m_AppConfig->saveSettings(); - m_LicenseManager->notifyUpdate (lastVersion, currentVersion); - } + QString lastVersion = m_AppConfig->lastVersion(); + QString currentVersion = m_VersionChecker.getVersion(); + if (lastVersion != currentVersion) { + m_AppConfig->setLastVersion (currentVersion); + m_AppConfig->saveSettings(); + m_LicenseManager->notifyUpdate (lastVersion, currentVersion); + } } MainWindow::~MainWindow() { - if (appConfig().processMode() == Desktop) { - m_ExpectedRunningState = kStopped; - stopDesktop(); - } + if (appConfig().processMode() == Desktop) { + m_ExpectedRunningState = kStopped; + stopDesktop(); + } - saveSettings(); + saveSettings(); - delete m_pZeroconfService; + delete m_pZeroconfService; - if (m_DownloadMessageBox != NULL) { - delete m_DownloadMessageBox; - } + if (m_DownloadMessageBox != NULL) { + delete m_DownloadMessageBox; + } - if (m_BonjourInstall != NULL) { - delete m_BonjourInstall; - } + if (m_BonjourInstall != NULL) { + delete m_BonjourInstall; + } - delete m_pSslCertificate; + delete m_pSslCertificate; } void MainWindow::open() { - createTrayIcon(); + createTrayIcon(); - if (!autoHide()) { - showNormal(); - } + if (!autoHide()) { + showNormal(); + } - m_VersionChecker.checkLatest(); + m_VersionChecker.checkLatest(); - if (!appConfig().autoConfigPrompted()) { - promptAutoConfig(); - } + if (!appConfig().autoConfigPrompted()) { + promptAutoConfig(); + } - // only start if user has previously started. this stops the gui from - // auto hiding before the user has configured synergy (which of course - // confuses first time users, who think synergy has crashed). - if (appConfig().startedBefore() && appConfig().processMode() == Desktop) { - m_SuppressEmptyServerWarning = true; - startSynergy(); - m_SuppressEmptyServerWarning = false; - } + // only start if user has previously started. this stops the gui from + // auto hiding before the user has configured synergy (which of course + // confuses first time users, who think synergy has crashed). + if (appConfig().startedBefore() && appConfig().processMode() == Desktop) { + m_SuppressEmptyServerWarning = true; + startSynergy(); + m_SuppressEmptyServerWarning = false; + } } void MainWindow::onModeChanged(bool startDesktop, bool applyService) { - if (appConfig().processMode() == Service) - { - // ensure that the apply button actually does something, since desktop - // mode screws around with connecting/disconnecting the action. - disconnect(m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); - connect(m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); + if (appConfig().processMode() == Service) + { + // ensure that the apply button actually does something, since desktop + // mode screws around with connecting/disconnecting the action. + disconnect(m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); + connect(m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); - if (applyService) - { - stopDesktop(); - startSynergy(); - } - } - else if ((appConfig().processMode() == Desktop) && startDesktop) - { - stopService(); - startSynergy(); - } + if (applyService) + { + stopDesktop(); + startSynergy(); + } + } + else if ((appConfig().processMode() == Desktop) && startDesktop) + { + stopService(); + startSynergy(); + } } void MainWindow::setStatus(const QString &status) { - m_pStatusLabel->setText(status); + m_pStatusLabel->setText(status); } void MainWindow::createTrayIcon() { - m_pTrayIconMenu = new QMenu(this); + m_pTrayIconMenu = new QMenu(this); - m_pTrayIconMenu->addAction(m_pActionStartSynergy); - m_pTrayIconMenu->addAction(m_pActionStopSynergy); - m_pTrayIconMenu->addSeparator(); + m_pTrayIconMenu->addAction(m_pActionStartSynergy); + m_pTrayIconMenu->addAction(m_pActionStopSynergy); + m_pTrayIconMenu->addSeparator(); - m_pTrayIconMenu->addAction(m_pActionMinimize); - m_pTrayIconMenu->addAction(m_pActionRestore); - m_pTrayIconMenu->addSeparator(); - m_pTrayIconMenu->addAction(m_pActionQuit); + m_pTrayIconMenu->addAction(m_pActionMinimize); + m_pTrayIconMenu->addAction(m_pActionRestore); + m_pTrayIconMenu->addSeparator(); + m_pTrayIconMenu->addAction(m_pActionQuit); - m_pTrayIcon = new QSystemTrayIcon(this); - m_pTrayIcon->setContextMenu(m_pTrayIconMenu); + m_pTrayIcon = new QSystemTrayIcon(this); + m_pTrayIcon->setContextMenu(m_pTrayIconMenu); - connect(m_pTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))); + connect(m_pTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), + this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason))); - setIcon(synergyDisconnected); + setIcon(synergyDisconnected); - m_pTrayIcon->show(); + m_pTrayIcon->show(); } void MainWindow::retranslateMenuBar() { - m_pMenuFile->setTitle(tr("&File")); - m_pMenuEdit->setTitle(tr("&Edit")); - m_pMenuWindow->setTitle(tr("&Window")); - m_pMenuHelp->setTitle(tr("&Help")); + m_pMenuFile->setTitle(tr("&File")); + m_pMenuEdit->setTitle(tr("&Edit")); + m_pMenuWindow->setTitle(tr("&Window")); + m_pMenuHelp->setTitle(tr("&Help")); } void MainWindow::createMenuBar() { - m_pMenuBar = new QMenuBar(this); - m_pMenuFile = new QMenu("", m_pMenuBar); - m_pMenuEdit = new QMenu("", m_pMenuBar); - m_pMenuWindow = new QMenu("", m_pMenuBar); - m_pMenuHelp = new QMenu("", m_pMenuBar); - retranslateMenuBar(); + m_pMenuBar = new QMenuBar(this); + m_pMenuFile = new QMenu("", m_pMenuBar); + m_pMenuEdit = new QMenu("", m_pMenuBar); + m_pMenuWindow = new QMenu("", m_pMenuBar); + m_pMenuHelp = new QMenu("", m_pMenuBar); + retranslateMenuBar(); - m_pMenuBar->addAction(m_pMenuFile->menuAction()); - m_pMenuBar->addAction(m_pMenuEdit->menuAction()); + m_pMenuBar->addAction(m_pMenuFile->menuAction()); + m_pMenuBar->addAction(m_pMenuEdit->menuAction()); #if !defined(Q_OS_MAC) - m_pMenuBar->addAction(m_pMenuWindow->menuAction()); + m_pMenuBar->addAction(m_pMenuWindow->menuAction()); #endif - m_pMenuBar->addAction(m_pMenuHelp->menuAction()); + m_pMenuBar->addAction(m_pMenuHelp->menuAction()); - m_pMenuFile->addAction(m_pActionStartSynergy); - m_pMenuFile->addAction(m_pActionStopSynergy); - m_pMenuFile->addSeparator(); - m_pMenuFile->addAction(m_pActivate); - m_pMenuFile->addSeparator(); - m_pMenuFile->addAction(m_pActionSave); - m_pMenuFile->addSeparator(); - m_pMenuFile->addAction(m_pActionQuit); - m_pMenuEdit->addAction(m_pActionSettings); - m_pMenuWindow->addAction(m_pActionMinimize); - m_pMenuWindow->addAction(m_pActionRestore); - m_pMenuHelp->addAction(m_pActionAbout); + m_pMenuFile->addAction(m_pActionStartSynergy); + m_pMenuFile->addAction(m_pActionStopSynergy); + m_pMenuFile->addSeparator(); + m_pMenuFile->addAction(m_pActivate); + m_pMenuFile->addSeparator(); + m_pMenuFile->addAction(m_pActionSave); + m_pMenuFile->addSeparator(); + m_pMenuFile->addAction(m_pActionQuit); + m_pMenuEdit->addAction(m_pActionSettings); + m_pMenuWindow->addAction(m_pActionMinimize); + m_pMenuWindow->addAction(m_pActionRestore); + m_pMenuHelp->addAction(m_pActionAbout); - setMenuBar(m_pMenuBar); + setMenuBar(m_pMenuBar); } void MainWindow::loadSettings() { - // the next two must come BEFORE loading groupServerChecked and groupClientChecked or - // disabling and/or enabling the right widgets won't automatically work - m_pRadioExternalConfig->setChecked(settings().value("useExternalConfig", false).toBool()); - m_pRadioInternalConfig->setChecked(settings().value("useInternalConfig", true).toBool()); + // the next two must come BEFORE loading groupServerChecked and groupClientChecked or + // disabling and/or enabling the right widgets won't automatically work + m_pRadioExternalConfig->setChecked(settings().value("useExternalConfig", false).toBool()); + m_pRadioInternalConfig->setChecked(settings().value("useInternalConfig", true).toBool()); - m_pGroupServer->setChecked(settings().value("groupServerChecked", false).toBool()); - m_pLineEditConfigFile->setText(settings().value("configFile", QDir::homePath() + "/" + synergyConfigName).toString()); - m_pGroupClient->setChecked(settings().value("groupClientChecked", true).toBool()); - m_pLineEditHostname->setText(settings().value("serverHostname").toString()); + m_pGroupServer->setChecked(settings().value("groupServerChecked", false).toBool()); + m_pLineEditConfigFile->setText(settings().value("configFile", QDir::homePath() + "/" + synergyConfigName).toString()); + m_pGroupClient->setChecked(settings().value("groupClientChecked", true).toBool()); + m_pLineEditHostname->setText(settings().value("serverHostname").toString()); } void MainWindow::initConnections() { - connect(m_pActionMinimize, SIGNAL(triggered()), this, SLOT(hide())); - connect(m_pActionRestore, SIGNAL(triggered()), this, SLOT(showNormal())); - connect(m_pActionStartSynergy, SIGNAL(triggered()), this, SLOT(startSynergy())); - connect(m_pActionStopSynergy, SIGNAL(triggered()), this, SLOT(stopSynergy())); - connect(m_pActionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); - connect(&m_VersionChecker, SIGNAL(updateFound(const QString&)), this, SLOT(updateFound(const QString&))); + connect(m_pActionMinimize, SIGNAL(triggered()), this, SLOT(hide())); + connect(m_pActionRestore, SIGNAL(triggered()), this, SLOT(showNormal())); + connect(m_pActionStartSynergy, SIGNAL(triggered()), this, SLOT(startSynergy())); + connect(m_pActionStopSynergy, SIGNAL(triggered()), this, SLOT(stopSynergy())); + connect(m_pActionQuit, SIGNAL(triggered()), qApp, SLOT(quit())); + connect(&m_VersionChecker, SIGNAL(updateFound(const QString&)), this, SLOT(updateFound(const QString&))); } void MainWindow::saveSettings() { - // program settings - settings().setValue("groupServerChecked", m_pGroupServer->isChecked()); - settings().setValue("useExternalConfig", m_pRadioExternalConfig->isChecked()); - settings().setValue("configFile", m_pLineEditConfigFile->text()); - settings().setValue("useInternalConfig", m_pRadioInternalConfig->isChecked()); - settings().setValue("groupClientChecked", m_pGroupClient->isChecked()); - settings().setValue("serverHostname", m_pLineEditHostname->text()); + // program settings + settings().setValue("groupServerChecked", m_pGroupServer->isChecked()); + settings().setValue("useExternalConfig", m_pRadioExternalConfig->isChecked()); + settings().setValue("configFile", m_pLineEditConfigFile->text()); + settings().setValue("useInternalConfig", m_pRadioInternalConfig->isChecked()); + settings().setValue("groupClientChecked", m_pGroupClient->isChecked()); + settings().setValue("serverHostname", m_pLineEditHostname->text()); - settings().sync(); + settings().sync(); } void MainWindow::setIcon(qSynergyState state) { - QIcon icon; - icon.addFile(synergyIconFiles[state]); + QIcon icon; + icon.addFile(synergyIconFiles[state]); - if (m_pTrayIcon) - m_pTrayIcon->setIcon(icon); + if (m_pTrayIcon) + m_pTrayIcon->setIcon(icon); } void MainWindow::trayActivated(QSystemTrayIcon::ActivationReason reason) { #ifndef Q_OS_WIN - if (reason == QSystemTrayIcon::DoubleClick) - { - if (isVisible()) - { - hide(); - } - else - { - showNormal(); - activateWindow(); - } - } + if (reason == QSystemTrayIcon::DoubleClick) + { + if (isVisible()) + { + hide(); + } + else + { + showNormal(); + activateWindow(); + } + } #endif } void MainWindow::logOutput() { - if (m_pSynergy) - { - QString text(m_pSynergy->readAllStandardOutput()); - foreach(QString line, text.split(QRegExp("\r|\n|\r\n"))) - { - if (!line.isEmpty()) - { - appendLogRaw(line); - } - } - } + if (m_pSynergy) + { + QString text(m_pSynergy->readAllStandardOutput()); + foreach(QString line, text.split(QRegExp("\r|\n|\r\n"))) + { + if (!line.isEmpty()) + { + appendLogRaw(line); + } + } + } } void MainWindow::logError() { - if (m_pSynergy) - { - appendLogRaw(m_pSynergy->readAllStandardError()); - } + if (m_pSynergy) + { + appendLogRaw(m_pSynergy->readAllStandardError()); + } } void MainWindow::updateFound(const QString &version) { - m_pWidgetUpdate->show(); - m_pLabelUpdate->setText( - tr("

Your version of Synergy is out of date. " - "Version %1 is now available to " - "download.

") - .arg(version).arg(DOWNLOAD_URL)); + m_pWidgetUpdate->show(); + m_pLabelUpdate->setText( + tr("

Your version of Synergy is out of date. " + "Version %1 is now available to " + "download.

") + .arg(version).arg(DOWNLOAD_URL)); } void MainWindow::appendLogInfo(const QString& text) { - appendLogRaw(getTimeStamp() + " INFO: " + text); + appendLogRaw(getTimeStamp() + " INFO: " + text); } void MainWindow::appendLogDebug(const QString& text) { - if (appConfig().logLevel() >= 4) { - appendLogRaw(getTimeStamp() + " DEBUG: " + text); - } + if (appConfig().logLevel() >= 4) { + appendLogRaw(getTimeStamp() + " DEBUG: " + text); + } } void MainWindow::appendLogError(const QString& text) { - appendLogRaw(getTimeStamp() + " ERROR: " + text); + appendLogRaw(getTimeStamp() + " ERROR: " + text); } void MainWindow::appendLogRaw(const QString& text) { - foreach(QString line, text.split(QRegExp("\r|\n|\r\n"))) { - if (!line.isEmpty()) { - m_pLogOutput->append(line); - updateFromLogLine(line); - } - } + foreach(QString line, text.split(QRegExp("\r|\n|\r\n"))) { + if (!line.isEmpty()) { + m_pLogOutput->append(line); + updateFromLogLine(line); + } + } } void MainWindow::updateFromLogLine(const QString &line) { - // TODO: this code makes Andrew cry - checkConnected(line); - checkFingerprint(line); - checkLicense(line); + // TODO: this code makes Andrew cry + checkConnected(line); + checkFingerprint(line); + checkLicense(line); } void MainWindow::checkConnected(const QString& line) { - // TODO: implement ipc connection state messages to replace this hack. - if (line.contains("started server") || - line.contains("connected to server") || - line.contains("watchdog status: ok")) - { - setSynergyState(synergyConnected); + // TODO: implement ipc connection state messages to replace this hack. + if (line.contains("started server") || + line.contains("connected to server") || + line.contains("watchdog status: ok")) + { + setSynergyState(synergyConnected); - if (!appConfig().startedBefore() && isVisible()) { - QMessageBox::information( - this, "Synergy", - tr("Synergy is now connected. You can close the " - "config window and Synergy will remain connected in " - "the background.")); + if (!appConfig().startedBefore() && isVisible()) { + QMessageBox::information( + this, "Synergy", + tr("Synergy is now connected. You can close the " + "config window and Synergy will remain connected in " + "the background.")); - appConfig().setStartedBefore(true); - appConfig().saveSettings(); - } - } + appConfig().setStartedBefore(true); + appConfig().saveSettings(); + } + } } void MainWindow::checkLicense(const QString &line) { - if (line.contains("trial has expired")) { - licenseManager().refresh(); - raiseActivationDialog(); - } + if (line.contains("trial has expired")) { + licenseManager().refresh(); + raiseActivationDialog(); + } } void MainWindow::checkFingerprint(const QString& line) { - QRegExp fingerprintRegex(".*server fingerprint: ([A-F0-9:]+)"); - if (!fingerprintRegex.exactMatch(line)) { - return; - } + QRegExp fingerprintRegex(".*server fingerprint: ([A-F0-9:]+)"); + if (!fingerprintRegex.exactMatch(line)) { + return; + } - QString fingerprint = fingerprintRegex.cap(1); - if (Fingerprint::trustedServers().isTrusted(fingerprint)) { - return; - } + QString fingerprint = fingerprintRegex.cap(1); + if (Fingerprint::trustedServers().isTrusted(fingerprint)) { + return; + } - static bool messageBoxAlreadyShown = false; + static bool messageBoxAlreadyShown = false; - if (!messageBoxAlreadyShown) { - stopSynergy(); + if (!messageBoxAlreadyShown) { + stopSynergy(); - messageBoxAlreadyShown = true; - QMessageBox::StandardButton fingerprintReply = - QMessageBox::information( - this, tr("Security question"), - tr("Do you trust this fingerprint?\n\n" - "%1\n\n" - "This is a server fingerprint. You should compare this " - "fingerprint to the one on your server's screen. If the " - "two don't match exactly, then it's probably not the server " - "you're expecting (it could be a malicious user).\n\n" - "To automatically trust this fingerprint for future " - "connections, click Yes. To reject this fingerprint and " - "disconnect from the server, click No.") - .arg(fingerprint), - QMessageBox::Yes | QMessageBox::No); + messageBoxAlreadyShown = true; + QMessageBox::StandardButton fingerprintReply = + QMessageBox::information( + this, tr("Security question"), + tr("Do you trust this fingerprint?\n\n" + "%1\n\n" + "This is a server fingerprint. You should compare this " + "fingerprint to the one on your server's screen. If the " + "two don't match exactly, then it's probably not the server " + "you're expecting (it could be a malicious user).\n\n" + "To automatically trust this fingerprint for future " + "connections, click Yes. To reject this fingerprint and " + "disconnect from the server, click No.") + .arg(fingerprint), + QMessageBox::Yes | QMessageBox::No); - if (fingerprintReply == QMessageBox::Yes) { - // restart core process after trusting fingerprint. - Fingerprint::trustedServers().trust(fingerprint); - startSynergy(); - } + if (fingerprintReply == QMessageBox::Yes) { + // restart core process after trusting fingerprint. + Fingerprint::trustedServers().trust(fingerprint); + startSynergy(); + } - messageBoxAlreadyShown = false; - } + messageBoxAlreadyShown = false; + } } bool MainWindow::autoHide() { - if ((appConfig().processMode() == Desktop) && - appConfig().getAutoHide()) { - hide(); - return true; - } + if ((appConfig().processMode() == Desktop) && + appConfig().getAutoHide()) { + hide(); + return true; + } - return false; + return false; } QString MainWindow::getTimeStamp() { - QDateTime current = QDateTime::currentDateTime(); - return '[' + current.toString(Qt::ISODate) + ']'; + QDateTime current = QDateTime::currentDateTime(); + return '[' + current.toString(Qt::ISODate) + ']'; } void MainWindow::restartSynergy() { - stopSynergy(); - startSynergy(); + stopSynergy(); + startSynergy(); } void MainWindow::proofreadInfo() { - setEdition(m_AppConfig->edition()); // Why is this here? + setEdition(m_AppConfig->edition()); // Why is this here? - int oldState = m_SynergyState; - m_SynergyState = synergyDisconnected; - setSynergyState((qSynergyState)oldState); + int oldState = m_SynergyState; + m_SynergyState = synergyDisconnected; + setSynergyState((qSynergyState)oldState); } void MainWindow::showEvent(QShowEvent* event) { - QMainWindow::showEvent(event); - emit windowShown(); + QMainWindow::showEvent(event); + emit windowShown(); } void MainWindow::clearLog() { - m_pLogOutput->clear(); + m_pLogOutput->clear(); } void MainWindow::startSynergy() { - SerialKey serialKey = m_LicenseManager->serialKey(); - time_t currentTime = ::time(0); - if (serialKey.isExpired(currentTime)) { - if (QDialog::Rejected == raiseActivationDialog()) { - return; - } - } + SerialKey serialKey = m_LicenseManager->serialKey(); + time_t currentTime = ::time(0); + if (serialKey.isExpired(currentTime)) { + if (QDialog::Rejected == raiseActivationDialog()) { + return; + } + } - bool desktopMode = appConfig().processMode() == Desktop; - bool serviceMode = appConfig().processMode() == Service; + bool desktopMode = appConfig().processMode() == Desktop; + bool serviceMode = appConfig().processMode() == Service; - appendLogDebug("starting process"); - m_ExpectedRunningState = kStarted; - setSynergyState(synergyConnecting); + appendLogDebug("starting process"); + m_ExpectedRunningState = kStarted; + setSynergyState(synergyConnecting); - QString app; - QStringList args; + QString app; + QStringList args; - args << "-f" << "--no-tray" << "--debug" << appConfig().logLevelText(); + args << "-f" << "--no-tray" << "--debug" << appConfig().logLevelText(); - args << "--name" << getScreenName(); + args << "--name" << getScreenName(); - if (desktopMode) - { - setSynergyProcess(new QProcess(this)); - } - else - { - // tell client/server to talk to daemon through ipc. - args << "--ipc"; + if (desktopMode) + { + setSynergyProcess(new QProcess(this)); + } + else + { + // tell client/server to talk to daemon through ipc. + args << "--ipc"; #if defined(Q_OS_WIN) - // tell the client/server to shut down when a ms windows desk - // is switched; this is because we may need to elevate or not - // based on which desk the user is in (login always needs - // elevation, where as default desk does not). - // Note that this is only enabled when synergy is set to elevate - // 'as needed' (e.g. on a UAC dialog popup) in order to prevent - // unnecessary restarts when synergy was started elevated or - // when it is not allowed to elevate. In these cases restarting - // the server is fruitless. - if (appConfig().elevateMode() == ElevateAsNeeded) { - args << "--stop-on-desk-switch"; - } + // tell the client/server to shut down when a ms windows desk + // is switched; this is because we may need to elevate or not + // based on which desk the user is in (login always needs + // elevation, where as default desk does not). + // Note that this is only enabled when synergy is set to elevate + // 'as needed' (e.g. on a UAC dialog popup) in order to prevent + // unnecessary restarts when synergy was started elevated or + // when it is not allowed to elevate. In these cases restarting + // the server is fruitless. + if (appConfig().elevateMode() == ElevateAsNeeded) { + args << "--stop-on-desk-switch"; + } #endif - } + } #ifndef Q_OS_LINUX - if (m_ServerConfig.enableDragAndDrop()) { - args << "--enable-drag-drop"; - } + if (m_ServerConfig.enableDragAndDrop()) { + args << "--enable-drag-drop"; + } #endif - if (m_AppConfig->getCryptoEnabled()) { - args << "--enable-crypto"; - } + if (m_AppConfig->getCryptoEnabled()) { + args << "--enable-crypto"; + } #if defined(Q_OS_WIN) - // on windows, the profile directory changes depending on the user that - // launched the process (e.g. when launched with elevation). setting the - // profile dir on launch ensures it uses the same profile dir is used - // no matter how its relaunched. - args << "--profile-dir" << getProfileRootForArg(); + // on windows, the profile directory changes depending on the user that + // launched the process (e.g. when launched with elevation). setting the + // profile dir on launch ensures it uses the same profile dir is used + // no matter how its relaunched. + args << "--profile-dir" << getProfileRootForArg(); #endif - if ((synergyType() == synergyClient && !clientArgs(args, app)) - || (synergyType() == synergyServer && !serverArgs(args, app))) - { - stopSynergy(); - return; - } + if ((synergyType() == synergyClient && !clientArgs(args, app)) + || (synergyType() == synergyServer && !serverArgs(args, app))) + { + stopSynergy(); + return; + } - if (desktopMode) - { - connect(synergyProcess(), SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(synergyFinished(int, QProcess::ExitStatus))); - connect(synergyProcess(), SIGNAL(readyReadStandardOutput()), this, SLOT(logOutput())); - connect(synergyProcess(), SIGNAL(readyReadStandardError()), this, SLOT(logError())); - } + if (desktopMode) + { + connect(synergyProcess(), SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(synergyFinished(int, QProcess::ExitStatus))); + connect(synergyProcess(), SIGNAL(readyReadStandardOutput()), this, SLOT(logOutput())); + connect(synergyProcess(), SIGNAL(readyReadStandardError()), this, SLOT(logError())); + } - // put a space between last log output and new instance. - if (!m_pLogOutput->toPlainText().isEmpty()) - appendLogRaw(""); + // put a space between last log output and new instance. + if (!m_pLogOutput->toPlainText().isEmpty()) + appendLogRaw(""); - appendLogInfo("starting " + QString(synergyType() == synergyServer ? "server" : "client")); + appendLogInfo("starting " + QString(synergyType() == synergyServer ? "server" : "client")); - qDebug() << args; + qDebug() << args; - // show command if debug log level... - if (appConfig().logLevel() >= 4) { - appendLogInfo(QString("command: %1 %2").arg(app, args.join(" "))); - } + // show command if debug log level... + if (appConfig().logLevel() >= 4) { + appendLogInfo(QString("command: %1 %2").arg(app, args.join(" "))); + } - appendLogInfo("config file: " + configFilename()); - appendLogInfo("log level: " + appConfig().logLevelText()); + appendLogInfo("config file: " + configFilename()); + appendLogInfo("log level: " + appConfig().logLevelText()); - if (appConfig().logToFile()) - appendLogInfo("log file: " + appConfig().logFilename()); + if (appConfig().logToFile()) + appendLogInfo("log file: " + appConfig().logFilename()); - if (desktopMode) - { - synergyProcess()->start(app, args); - if (!synergyProcess()->waitForStarted()) - { - show(); - QMessageBox::warning(this, tr("Program can not be started"), QString(tr("The executable

%1

could not be successfully started, although it does exist. Please check if you have sufficient permissions to run this program.").arg(app))); - return; - } - } + if (desktopMode) + { + synergyProcess()->start(app, args); + if (!synergyProcess()->waitForStarted()) + { + show(); + QMessageBox::warning(this, tr("Program can not be started"), QString(tr("The executable

%1

could not be successfully started, although it does exist. Please check if you have sufficient permissions to run this program.").arg(app))); + return; + } + } - if (serviceMode) - { - QString command(app + " " + args.join(" ")); - m_IpcClient.sendCommand(command, appConfig().elevateMode()); - } + if (serviceMode) + { + QString command(app + " " + args.join(" ")); + m_IpcClient.sendCommand(command, appConfig().elevateMode()); + } } void MainWindow::sslToggled (bool enabled) { - if (enabled) { - m_pSslCertificate = new SslCertificate(this); - m_pSslCertificate->generateCertificate(); - } - updateLocalFingerprint(); + if (enabled) { + m_pSslCertificate = new SslCertificate(this); + m_pSslCertificate->generateCertificate(); + } + updateLocalFingerprint(); } bool MainWindow::clientArgs(QStringList& args, QString& app) { - app = appPath(appConfig().synergycName()); + app = appPath(appConfig().synergycName()); - if (!QFile::exists(app)) - { - show(); - QMessageBox::warning(this, tr("Synergy client not found"), - tr("The executable for the synergy client does not exist.")); - return false; - } + if (!QFile::exists(app)) + { + show(); + QMessageBox::warning(this, tr("Synergy client not found"), + tr("The executable for the synergy client does not exist.")); + return false; + } #if defined(Q_OS_WIN) - // wrap in quotes so a malicious user can't start \Program.exe as admin. - app = QString("\"%1\"").arg(app); + // wrap in quotes so a malicious user can't start \Program.exe as admin. + app = QString("\"%1\"").arg(app); #endif - if (appConfig().logToFile()) - { - appConfig().persistLogDir(); - args << "--log" << appConfig().logFilenameCmd(); - } + if (appConfig().logToFile()) + { + appConfig().persistLogDir(); + args << "--log" << appConfig().logFilenameCmd(); + } - // check auto config first, if it is disabled or no server detected, - // use line edit host name if it is not empty - if (m_pCheckBoxAutoConfig->isChecked()) { - if (m_pComboServerList->count() != 0) { - QString serverIp = m_pComboServerList->currentText(); - args << serverIp + ":" + QString::number(appConfig().port()); - return true; - } - } + // check auto config first, if it is disabled or no server detected, + // use line edit host name if it is not empty + if (m_pCheckBoxAutoConfig->isChecked()) { + if (m_pComboServerList->count() != 0) { + QString serverIp = m_pComboServerList->currentText(); + args << serverIp + ":" + QString::number(appConfig().port()); + return true; + } + } - if (m_pLineEditHostname->text().isEmpty()) { - show(); - if (!m_SuppressEmptyServerWarning) { - QMessageBox::warning(this, tr("Hostname is empty"), - tr("Please fill in a hostname for the synergy client to connect to.")); - } - return false; - } + if (m_pLineEditHostname->text().isEmpty()) { + show(); + if (!m_SuppressEmptyServerWarning) { + QMessageBox::warning(this, tr("Hostname is empty"), + tr("Please fill in a hostname for the synergy client to connect to.")); + } + return false; + } - args << m_pLineEditHostname->text() + ":" + QString::number(appConfig().port()); + args << m_pLineEditHostname->text() + ":" + QString::number(appConfig().port()); - return true; + return true; } QString MainWindow::configFilename() { - QString filename; - if (m_pRadioInternalConfig->isChecked()) - { - // TODO: no need to use a temporary file, since we need it to - // be permenant (since it'll be used for Windows services, etc). - m_pTempConfigFile = new QTemporaryFile(); - if (!m_pTempConfigFile->open()) - { - QMessageBox::critical(this, tr("Cannot write configuration file"), tr("The temporary configuration file required to start synergy can not be written.")); - return ""; - } + QString filename; + if (m_pRadioInternalConfig->isChecked()) + { + // TODO: no need to use a temporary file, since we need it to + // be permenant (since it'll be used for Windows services, etc). + m_pTempConfigFile = new QTemporaryFile(); + if (!m_pTempConfigFile->open()) + { + QMessageBox::critical(this, tr("Cannot write configuration file"), tr("The temporary configuration file required to start synergy can not be written.")); + return ""; + } - serverConfig().save(*m_pTempConfigFile); - filename = m_pTempConfigFile->fileName(); + serverConfig().save(*m_pTempConfigFile); + filename = m_pTempConfigFile->fileName(); - m_pTempConfigFile->close(); - } - else - { - if (!QFile::exists(m_pLineEditConfigFile->text())) - { - if (QMessageBox::warning(this, tr("Configuration filename invalid"), - tr("You have not filled in a valid configuration file for the synergy server. " - "Do you want to browse for the configuration file now?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes - || !on_m_pButtonBrowseConfigFile_clicked()) - return ""; - } + m_pTempConfigFile->close(); + } + else + { + if (!QFile::exists(m_pLineEditConfigFile->text())) + { + if (QMessageBox::warning(this, tr("Configuration filename invalid"), + tr("You have not filled in a valid configuration file for the synergy server. " + "Do you want to browse for the configuration file now?"), QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes + || !on_m_pButtonBrowseConfigFile_clicked()) + return ""; + } - filename = m_pLineEditConfigFile->text(); - } - return filename; + filename = m_pLineEditConfigFile->text(); + } + return filename; } QString MainWindow::address() { - QString i = appConfig().networkInterface(); - return (!i.isEmpty() ? i : "") + ":" + QString::number(appConfig().port()); + QString i = appConfig().networkInterface(); + return (!i.isEmpty() ? i : "") + ":" + QString::number(appConfig().port()); } QString MainWindow::appPath(const QString& name) { - return appConfig().synergyProgramDir() + name; + return appConfig().synergyProgramDir() + name; } bool MainWindow::serverArgs(QStringList& args, QString& app) { - app = appPath(appConfig().synergysName()); + app = appPath(appConfig().synergysName()); - if (!QFile::exists(app)) - { - QMessageBox::warning(this, tr("Synergy server not found"), - tr("The executable for the synergy server does not exist.")); - return false; - } + if (!QFile::exists(app)) + { + QMessageBox::warning(this, tr("Synergy server not found"), + tr("The executable for the synergy server does not exist.")); + return false; + } #if defined(Q_OS_WIN) - // wrap in quotes so a malicious user can't start \Program.exe as admin. - app = QString("\"%1\"").arg(app); + // wrap in quotes so a malicious user can't start \Program.exe as admin. + app = QString("\"%1\"").arg(app); #endif - if (appConfig().logToFile()) - { - appConfig().persistLogDir(); + if (appConfig().logToFile()) + { + appConfig().persistLogDir(); - args << "--log" << appConfig().logFilenameCmd(); - } + args << "--log" << appConfig().logFilenameCmd(); + } - QString configFilename = this->configFilename(); + QString configFilename = this->configFilename(); #if defined(Q_OS_WIN) - // wrap in quotes in case username contains spaces. - configFilename = QString("\"%1\"").arg(configFilename); + // wrap in quotes in case username contains spaces. + configFilename = QString("\"%1\"").arg(configFilename); #endif - args << "-c" << configFilename << "--address" << address(); + args << "-c" << configFilename << "--address" << address(); - if (!appConfig().serialKey().isEmpty()) { - args << "--serial-key" << appConfig().serialKey(); - } + if (!appConfig().serialKey().isEmpty()) { + args << "--serial-key" << appConfig().serialKey(); + } - return true; + return true; } void MainWindow::stopSynergy() { - appendLogDebug("stopping process"); + appendLogDebug("stopping process"); - m_ExpectedRunningState = kStopped; + m_ExpectedRunningState = kStopped; - if (appConfig().processMode() == Service) - { - stopService(); - } - else if (appConfig().processMode() == Desktop) - { - stopDesktop(); - } + if (appConfig().processMode() == Service) + { + stopService(); + } + else if (appConfig().processMode() == Desktop) + { + stopDesktop(); + } - setSynergyState(synergyDisconnected); + setSynergyState(synergyDisconnected); - // HACK: deleting the object deletes the physical file, which is - // bad, since it could be in use by the Windows service! - //delete m_pTempConfigFile; - m_pTempConfigFile = NULL; + // HACK: deleting the object deletes the physical file, which is + // bad, since it could be in use by the Windows service! + //delete m_pTempConfigFile; + m_pTempConfigFile = NULL; - // reset so that new connects cause auto-hide. - m_AlreadyHidden = false; + // reset so that new connects cause auto-hide. + m_AlreadyHidden = false; } void MainWindow::stopService() { - // send empty command to stop service from laucning anything. - m_IpcClient.sendCommand("", appConfig().elevateMode()); + // send empty command to stop service from laucning anything. + m_IpcClient.sendCommand("", appConfig().elevateMode()); } void MainWindow::stopDesktop() { - QMutexLocker locker(&m_StopDesktopMutex); - if (!synergyProcess()) { - return; - } + QMutexLocker locker(&m_StopDesktopMutex); + if (!synergyProcess()) { + return; + } - appendLogInfo("stopping synergy desktop process"); + appendLogInfo("stopping synergy desktop process"); - if (synergyProcess()->isOpen()) { - synergyProcess()->close(); - } + if (synergyProcess()->isOpen()) { + synergyProcess()->close(); + } - delete synergyProcess(); - setSynergyProcess(NULL); + delete synergyProcess(); + setSynergyProcess(NULL); } void MainWindow::synergyFinished(int exitCode, QProcess::ExitStatus) { - if (exitCode == 0) { - appendLogInfo(QString("process exited normally")); - } - else { - appendLogError(QString("process exited with error code: %1").arg(exitCode)); - } + if (exitCode == 0) { + appendLogInfo(QString("process exited normally")); + } + else { + appendLogError(QString("process exited with error code: %1").arg(exitCode)); + } - if (m_ExpectedRunningState == kStarted) { - QTimer::singleShot(1000, this, SLOT(startSynergy())); - appendLogInfo(QString("detected process not running, auto restarting")); - } - else { - setSynergyState(synergyDisconnected); - } + if (m_ExpectedRunningState == kStarted) { + QTimer::singleShot(1000, this, SLOT(startSynergy())); + appendLogInfo(QString("detected process not running, auto restarting")); + } + else { + setSynergyState(synergyDisconnected); + } } void MainWindow::setSynergyState(qSynergyState state) { - if (synergyState() == state) - return; + if (synergyState() == state) + return; - if (state == synergyConnected || state == synergyConnecting) - { - disconnect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); - connect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger())); - m_pButtonToggleStart->setText(tr("&Stop")); - m_pButtonApply->setEnabled(true); - } - else if (state == synergyDisconnected) - { - disconnect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger())); - connect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); - m_pButtonToggleStart->setText(tr("&Start")); - m_pButtonApply->setEnabled(false); - } + if (state == synergyConnected || state == synergyConnecting) + { + disconnect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); + connect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger())); + m_pButtonToggleStart->setText(tr("&Stop")); + m_pButtonApply->setEnabled(true); + } + else if (state == synergyDisconnected) + { + disconnect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStopSynergy, SLOT(trigger())); + connect (m_pButtonToggleStart, SIGNAL(clicked()), m_pActionStartSynergy, SLOT(trigger())); + m_pButtonToggleStart->setText(tr("&Start")); + m_pButtonApply->setEnabled(false); + } - bool connected = false; - if (state == synergyConnected || state == synergyTransfering) { - connected = true; - } + bool connected = false; + if (state == synergyConnected || state == synergyTransfering) { + connected = true; + } - m_pActionStartSynergy->setEnabled(!connected); - m_pActionStopSynergy->setEnabled(connected); + m_pActionStartSynergy->setEnabled(!connected); + m_pActionStopSynergy->setEnabled(connected); - switch (state) - { - case synergyConnected: { - if (m_AppConfig->getCryptoEnabled()) { - m_pLabelPadlock->show(); - } - else { - m_pLabelPadlock->hide(); - } + switch (state) + { + case synergyConnected: { + if (m_AppConfig->getCryptoEnabled()) { + m_pLabelPadlock->show(); + } + else { + m_pLabelPadlock->hide(); + } - setStatus(tr("Synergy is running.")); + setStatus(tr("Synergy is running.")); - break; - } - case synergyConnecting: - m_pLabelPadlock->hide(); - setStatus(tr("Synergy is starting.")); - break; - case synergyDisconnected: - m_pLabelPadlock->hide(); - setStatus(tr("Synergy is not running.")); - break; - case synergyTransfering: - break; - } + break; + } + case synergyConnecting: + m_pLabelPadlock->hide(); + setStatus(tr("Synergy is starting.")); + break; + case synergyDisconnected: + m_pLabelPadlock->hide(); + setStatus(tr("Synergy is not running.")); + break; + case synergyTransfering: + break; + } - setIcon(state); + setIcon(state); - m_SynergyState = state; + m_SynergyState = state; } void MainWindow::setVisible(bool visible) { - QMainWindow::setVisible(visible); - m_pActionMinimize->setEnabled(visible); - m_pActionRestore->setEnabled(!visible); + QMainWindow::setVisible(visible); + m_pActionMinimize->setEnabled(visible); + m_pActionRestore->setEnabled(!visible); #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 // lion - // dock hide only supported on lion :( - ProcessSerialNumber psn = { 0, kCurrentProcess }; - GetCurrentProcess(&psn); - if (visible) - TransformProcessType(&psn, kProcessTransformToForegroundApplication); - else - TransformProcessType(&psn, kProcessTransformToBackgroundApplication); + // dock hide only supported on lion :( + ProcessSerialNumber psn = { 0, kCurrentProcess }; + GetCurrentProcess(&psn); + if (visible) + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + else + TransformProcessType(&psn, kProcessTransformToBackgroundApplication); #endif } QString MainWindow::getIPAddresses() { - QList addresses = QNetworkInterface::allAddresses(); + QList addresses = QNetworkInterface::allAddresses(); - bool hinted = false; - QString result; - for (int i = 0; i < addresses.size(); i++) { - if (addresses[i].protocol() == QAbstractSocket::IPv4Protocol && - addresses[i] != QHostAddress(QHostAddress::LocalHost)) { + bool hinted = false; + QString result; + for (int i = 0; i < addresses.size(); i++) { + if (addresses[i].protocol() == QAbstractSocket::IPv4Protocol && + addresses[i] != QHostAddress(QHostAddress::LocalHost)) { - QString address = addresses[i].toString(); - QString format = "%1, "; + QString address = addresses[i].toString(); + QString format = "%1, "; - // usually 192.168.x.x is a useful ip for the user, so indicate - // this by making it bold. - if (!hinted && address.startsWith("192.168")) { - hinted = true; - format = "%1, "; - } + // usually 192.168.x.x is a useful ip for the user, so indicate + // this by making it bold. + if (!hinted && address.startsWith("192.168")) { + hinted = true; + format = "%1, "; + } - result += format.arg(address); - } - } + result += format.arg(address); + } + } - if (result == "") { - return tr("Unknown"); - } + if (result == "") { + return tr("Unknown"); + } - // remove trailing comma. - result.chop(2); + // remove trailing comma. + result.chop(2); - return result; + return result; } QString MainWindow::getScreenName() { - if (appConfig().screenName() == "") { - return QHostInfo::localHostName(); - } - else { - return appConfig().screenName(); - } + if (appConfig().screenName() == "") { + return QHostInfo::localHostName(); + } + else { + return appConfig().screenName(); + } } void MainWindow::changeEvent(QEvent* event) { - if (event != 0) - { - switch (event->type()) - { - case QEvent::LanguageChange: - { - retranslateUi(this); - retranslateMenuBar(); + if (event != 0) + { + switch (event->type()) + { + case QEvent::LanguageChange: + { + retranslateUi(this); + retranslateMenuBar(); - proofreadInfo(); + proofreadInfo(); - break; - } - default: - QMainWindow::changeEvent(event); - } - } + break; + } + default: + QMainWindow::changeEvent(event); + } + } } void MainWindow::updateZeroconfService() { - QMutexLocker locker(&m_UpdateZeroconfMutex); + QMutexLocker locker(&m_UpdateZeroconfMutex); - if (isBonjourRunning()) { - if (!m_AppConfig->wizardShouldRun()) { - if (m_pZeroconfService) { - delete m_pZeroconfService; - m_pZeroconfService = NULL; - } + if (isBonjourRunning()) { + if (!m_AppConfig->wizardShouldRun()) { + if (m_pZeroconfService) { + delete m_pZeroconfService; + m_pZeroconfService = NULL; + } - if (m_AppConfig->autoConfig() || synergyType() == synergyServer) { - m_pZeroconfService = new ZeroconfService(this); - } - } - } + if (m_AppConfig->autoConfig() || synergyType() == synergyServer) { + m_pZeroconfService = new ZeroconfService(this); + } + } + } } void MainWindow::serverDetected(const QString name) { - if (m_pComboServerList->findText(name) == -1) { - // Note: the first added item triggers startSynergy - m_pComboServerList->addItem(name); - } + if (m_pComboServerList->findText(name) == -1) { + // Note: the first added item triggers startSynergy + m_pComboServerList->addItem(name); + } - if (m_pComboServerList->count() > 1) { - m_pComboServerList->show(); - } + if (m_pComboServerList->count() > 1) { + m_pComboServerList->show(); + } } void MainWindow::setEdition(Edition edition) { - setWindowTitle(m_LicenseManager->getEditionName (edition)); - if (m_AppConfig->getCryptoEnabled()) { - m_pSslCertificate = new SslCertificate(this); - m_pSslCertificate->generateCertificate(); - } - updateLocalFingerprint(); - saveSettings(); + setWindowTitle(m_LicenseManager->getEditionName (edition)); + if (m_AppConfig->getCryptoEnabled()) { + m_pSslCertificate = new SslCertificate(this); + m_pSslCertificate->generateCertificate(); + } + updateLocalFingerprint(); + saveSettings(); } void MainWindow::beginTrial(bool isExpiring) { - //Hack - //if (isExpiring) { - time_t daysLeft = m_LicenseManager->serialKey().daysLeft(::time(0)); - QString expiringNotice ("

%1 day%3 of " - "your %2 trial remain%5. " - "Buy now!" - "

"); - expiringNotice = expiringNotice - .arg (daysLeft) - .arg (LicenseManager::getEditionName - (m_LicenseManager->activeEdition())) - .arg ((daysLeft == 1) ? "" : "s") - .arg (QString::fromStdString - (m_LicenseManager->serialKey().toString())) - .arg ((daysLeft == 1) ? "s" : ""); - this->m_trialLabel->setText(expiringNotice); - this->m_trialWidget->show(); - //} - setWindowTitle (m_LicenseManager->activeEditionName()); + //Hack + //if (isExpiring) { + time_t daysLeft = m_LicenseManager->serialKey().daysLeft(::time(0)); + QString expiringNotice ("

%1 day%3 of " + "your %2 trial remain%5. " + "Buy now!" + "

"); + expiringNotice = expiringNotice + .arg (daysLeft) + .arg (LicenseManager::getEditionName + (m_LicenseManager->activeEdition())) + .arg ((daysLeft == 1) ? "" : "s") + .arg (QString::fromStdString + (m_LicenseManager->serialKey().toString())) + .arg ((daysLeft == 1) ? "s" : ""); + this->m_trialLabel->setText(expiringNotice); + this->m_trialWidget->show(); + //} + setWindowTitle (m_LicenseManager->activeEditionName()); } void MainWindow::endTrial(bool isExpired) { - if (isExpired) { - QString expiredNotice ( - "

Your %1 trial has expired. " - "" - "Buy now!

" - ); - expiredNotice = expiredNotice - .arg(LicenseManager::getEditionName - (m_LicenseManager->activeEdition())) - .arg(QString::fromStdString - (m_LicenseManager->serialKey().toString())); + if (isExpired) { + QString expiredNotice ( + "

Your %1 trial has expired. " + "" + "Buy now!

" + ); + expiredNotice = expiredNotice + .arg(LicenseManager::getEditionName + (m_LicenseManager->activeEdition())) + .arg(QString::fromStdString + (m_LicenseManager->serialKey().toString())); - this->m_trialLabel->setText(expiredNotice); - this->m_trialWidget->show(); - stopSynergy(); - m_AppConfig->activationHasRun(false); - } else { - this->m_trialWidget->hide(); - } - setWindowTitle (m_LicenseManager->activeEditionName()); + this->m_trialLabel->setText(expiredNotice); + this->m_trialWidget->show(); + stopSynergy(); + m_AppConfig->activationHasRun(false); + } else { + this->m_trialWidget->hide(); + } + setWindowTitle (m_LicenseManager->activeEditionName()); } void MainWindow::updateLocalFingerprint() { - if (m_AppConfig->getCryptoEnabled() && Fingerprint::local().fileExists()) { - m_pLabelFingerprint->setVisible(true); - m_pLabelLocalFingerprint->setVisible(true); - m_pLabelLocalFingerprint->setText(Fingerprint::local().readFirst()); - } - else { - m_pLabelFingerprint->setVisible(false); - m_pLabelLocalFingerprint->setVisible(false); - } + if (m_AppConfig->getCryptoEnabled() && Fingerprint::local().fileExists()) { + m_pLabelFingerprint->setVisible(true); + m_pLabelLocalFingerprint->setVisible(true); + m_pLabelLocalFingerprint->setText(Fingerprint::local().readFirst()); + } + else { + m_pLabelFingerprint->setVisible(false); + m_pLabelLocalFingerprint->setVisible(false); + } } LicenseManager& MainWindow::licenseManager() const { - return *m_LicenseManager; + return *m_LicenseManager; } void MainWindow::on_m_pGroupClient_toggled(bool on) { - m_pGroupServer->setChecked(!on); - if (on) { - updateZeroconfService(); - } + m_pGroupServer->setChecked(!on); + if (on) { + updateZeroconfService(); + } } void MainWindow::on_m_pGroupServer_toggled(bool on) { - m_pGroupClient->setChecked(!on); - if (on) { - updateZeroconfService(); - } + m_pGroupClient->setChecked(!on); + if (on) { + updateZeroconfService(); + } } bool MainWindow::on_m_pButtonBrowseConfigFile_clicked() { - QString fileName = QFileDialog::getOpenFileName(this, tr("Browse for a synergys config file"), QString(), synergyConfigFilter); + QString fileName = QFileDialog::getOpenFileName(this, tr("Browse for a synergys config file"), QString(), synergyConfigFilter); - if (!fileName.isEmpty()) - { - m_pLineEditConfigFile->setText(fileName); - return true; - } + if (!fileName.isEmpty()) + { + m_pLineEditConfigFile->setText(fileName); + return true; + } - return false; + return false; } bool MainWindow::on_m_pActionSave_triggered() { - QString fileName = QFileDialog::getSaveFileName(this, tr("Save configuration as...")); + QString fileName = QFileDialog::getSaveFileName(this, tr("Save configuration as...")); - if (!fileName.isEmpty() && !serverConfig().save(fileName)) - { - QMessageBox::warning(this, tr("Save failed"), tr("Could not save configuration to file.")); - return true; - } + if (!fileName.isEmpty() && !serverConfig().save(fileName)) + { + QMessageBox::warning(this, tr("Save failed"), tr("Could not save configuration to file.")); + return true; + } - return false; + return false; } void MainWindow::on_m_pActionAbout_triggered() { - AboutDialog dlg(this, appPath(appConfig().synergycName())); - dlg.exec(); + AboutDialog dlg(this, appPath(appConfig().synergycName())); + dlg.exec(); } void MainWindow::on_m_pActionSettings_triggered() { - ProcessMode lastProcessMode = appConfig().processMode(); + ProcessMode lastProcessMode = appConfig().processMode(); - SettingsDialog dlg(this, appConfig()); - dlg.exec(); + SettingsDialog dlg(this, appConfig()); + dlg.exec(); - if (lastProcessMode != appConfig().processMode()) - { - onModeChanged(true, true); - } + if (lastProcessMode != appConfig().processMode()) + { + onModeChanged(true, true); + } } void MainWindow::autoAddScreen(const QString name) { - if (!m_ServerConfig.ignoreAutoConfigClient()) { - if (m_ActivationDialogRunning) { - // TODO: refactor this code - // add this screen to the pending list and check this list until - // users finish activation dialog - m_PendingClientNames.append(name); - return; - } + if (!m_ServerConfig.ignoreAutoConfigClient()) { + if (m_ActivationDialogRunning) { + // TODO: refactor this code + // add this screen to the pending list and check this list until + // users finish activation dialog + m_PendingClientNames.append(name); + return; + } - int r = m_ServerConfig.autoAddScreen(name); - if (r != kAutoAddScreenOk) { - switch (r) { - case kAutoAddScreenManualServer: - showConfigureServer( - tr("Please add the server (%1) to the grid.") - .arg(appConfig().screenName())); - break; + int r = m_ServerConfig.autoAddScreen(name); + if (r != kAutoAddScreenOk) { + switch (r) { + case kAutoAddScreenManualServer: + showConfigureServer( + tr("Please add the server (%1) to the grid.") + .arg(appConfig().screenName())); + break; - case kAutoAddScreenManualClient: - showConfigureServer( - tr("Please drag the new client screen (%1) " - "to the desired position on the grid.") - .arg(name)); - break; - } - } - else { - restartSynergy(); - } - } + case kAutoAddScreenManualClient: + showConfigureServer( + tr("Please drag the new client screen (%1) " + "to the desired position on the grid.") + .arg(name)); + break; + } + } + else { + restartSynergy(); + } + } } void MainWindow::showConfigureServer(const QString& message) { - ServerConfigDialog dlg(this, serverConfig(), appConfig().screenName()); - dlg.message(message); - dlg.exec(); + ServerConfigDialog dlg(this, serverConfig(), appConfig().screenName()); + dlg.message(message); + dlg.exec(); } void MainWindow::on_m_pButtonConfigureServer_clicked() { - showConfigureServer(); + showConfigureServer(); } void MainWindow::on_m_pActivate_triggered() { - raiseActivationDialog(); + raiseActivationDialog(); } void MainWindow::on_m_pButtonApply_clicked() { - restartSynergy(); + restartSynergy(); } #if defined(Q_OS_WIN) bool MainWindow::isServiceRunning(QString name) { - SC_HANDLE hSCManager; - hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if (hSCManager == NULL) { - appendLogError("failed to open a service controller manager, error: " + - GetLastError()); - return false; - } + SC_HANDLE hSCManager; + hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); + if (hSCManager == NULL) { + appendLogError("failed to open a service controller manager, error: " + + GetLastError()); + return false; + } - auto array = name.toLocal8Bit(); - SC_HANDLE hService = OpenService(hSCManager, array.data(), SERVICE_QUERY_STATUS); + auto array = name.toLocal8Bit(); + SC_HANDLE hService = OpenService(hSCManager, array.data(), SERVICE_QUERY_STATUS); - if (hService == NULL) { - appendLogDebug("failed to open service: " + name); - return false; - } + if (hService == NULL) { + appendLogDebug("failed to open service: " + name); + return false; + } - SERVICE_STATUS status; - if (QueryServiceStatus(hService, &status)) { - if (status.dwCurrentState == SERVICE_RUNNING) { - return true; - } - } + SERVICE_STATUS status; + if (QueryServiceStatus(hService, &status)) { + if (status.dwCurrentState == SERVICE_RUNNING) { + return true; + } + } #else bool MainWindow::isServiceRunning() { #endif - return false; + return false; } bool MainWindow::isBonjourRunning() { - bool result = false; + bool result = false; #if defined(Q_OS_WIN) - result = isServiceRunning("Bonjour Service"); + result = isServiceRunning("Bonjour Service"); #else - result = true; + result = true; #endif - return result; + return result; } void MainWindow::downloadBonjour() { #if defined(Q_OS_WIN) - QUrl url; - int arch = getProcessorArch(); - if (arch == kProcessorArchWin32) { - url.setUrl(bonjourBaseUrl + bonjourFilename32); - appendLogInfo("downloading 32-bit Bonjour"); - } - else if (arch == kProcessorArchWin64) { - url.setUrl(bonjourBaseUrl + bonjourFilename64); - appendLogInfo("downloading 64-bit Bonjour"); - } - else { - QMessageBox::critical( - this, tr("Synergy"), - tr("Failed to detect system architecture.")); - return; - } + QUrl url; + int arch = getProcessorArch(); + if (arch == kProcessorArchWin32) { + url.setUrl(bonjourBaseUrl + bonjourFilename32); + appendLogInfo("downloading 32-bit Bonjour"); + } + else if (arch == kProcessorArchWin64) { + url.setUrl(bonjourBaseUrl + bonjourFilename64); + appendLogInfo("downloading 64-bit Bonjour"); + } + else { + QMessageBox::critical( + this, tr("Synergy"), + tr("Failed to detect system architecture.")); + return; + } - if (m_pDataDownloader == NULL) { - m_pDataDownloader = new DataDownloader(this); - connect(m_pDataDownloader, SIGNAL(isComplete()), SLOT(installBonjour())); - } + if (m_pDataDownloader == NULL) { + m_pDataDownloader = new DataDownloader(this); + connect(m_pDataDownloader, SIGNAL(isComplete()), SLOT(installBonjour())); + } - m_pDataDownloader->download(url); + m_pDataDownloader->download(url); - if (m_DownloadMessageBox == NULL) { - m_DownloadMessageBox = new QMessageBox(this); - m_DownloadMessageBox->setWindowTitle("Synergy"); - m_DownloadMessageBox->setIcon(QMessageBox::Information); - m_DownloadMessageBox->setText("Installing Bonjour, please wait..."); - m_DownloadMessageBox->setStandardButtons(0); - m_pCancelButton = m_DownloadMessageBox->addButton( - tr("Cancel"), QMessageBox::RejectRole); - } + if (m_DownloadMessageBox == NULL) { + m_DownloadMessageBox = new QMessageBox(this); + m_DownloadMessageBox->setWindowTitle("Synergy"); + m_DownloadMessageBox->setIcon(QMessageBox::Information); + m_DownloadMessageBox->setText("Installing Bonjour, please wait..."); + m_DownloadMessageBox->setStandardButtons(0); + m_pCancelButton = m_DownloadMessageBox->addButton( + tr("Cancel"), QMessageBox::RejectRole); + } - m_DownloadMessageBox->exec(); + m_DownloadMessageBox->exec(); - if (m_DownloadMessageBox->clickedButton() == m_pCancelButton) { - m_pDataDownloader->cancel(); - } + if (m_DownloadMessageBox->clickedButton() == m_pCancelButton) { + m_pDataDownloader->cancel(); + } #endif } @@ -1343,159 +1343,159 @@ void MainWindow::installBonjour() #if QT_VERSION >= 0x050000 QString tempLocation = QStandardPaths::writableLocation(QStandardPaths::TempLocation); #else - QString tempLocation = QDesktopServices::storageLocation( - QDesktopServices::TempLocation); + QString tempLocation = QDesktopServices::storageLocation( + QDesktopServices::TempLocation); #endif - QString filename = tempLocation; - filename.append("\\").append(bonjourTargetFilename); - QFile file(filename); - if (!file.open(QIODevice::WriteOnly)) { - m_DownloadMessageBox->hide(); + QString filename = tempLocation; + filename.append("\\").append(bonjourTargetFilename); + QFile file(filename); + if (!file.open(QIODevice::WriteOnly)) { + m_DownloadMessageBox->hide(); - QMessageBox::warning( - this, "Synergy", - tr("Failed to download Bonjour installer to location: %1") - .arg(tempLocation)); - return; - } + QMessageBox::warning( + this, "Synergy", + tr("Failed to download Bonjour installer to location: %1") + .arg(tempLocation)); + return; + } - file.write(m_pDataDownloader->data()); - file.close(); + file.write(m_pDataDownloader->data()); + file.close(); - QStringList arguments; - arguments.append("/i"); - QString winFilename = QDir::toNativeSeparators(filename); - arguments.append(winFilename); - arguments.append("/passive"); - if (m_BonjourInstall == NULL) { - m_BonjourInstall = new CommandProcess("msiexec", arguments); - } + QStringList arguments; + arguments.append("/i"); + QString winFilename = QDir::toNativeSeparators(filename); + arguments.append(winFilename); + arguments.append("/passive"); + if (m_BonjourInstall == NULL) { + m_BonjourInstall = new CommandProcess("msiexec", arguments); + } - QThread* thread = new QThread; - connect(m_BonjourInstall, SIGNAL(finished()), this, - SLOT(bonjourInstallFinished())); - connect(m_BonjourInstall, SIGNAL(finished()), thread, SLOT(quit())); - connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + QThread* thread = new QThread; + connect(m_BonjourInstall, SIGNAL(finished()), this, + SLOT(bonjourInstallFinished())); + connect(m_BonjourInstall, SIGNAL(finished()), thread, SLOT(quit())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - m_BonjourInstall->moveToThread(thread); - thread->start(); + m_BonjourInstall->moveToThread(thread); + thread->start(); - QMetaObject::invokeMethod(m_BonjourInstall, "run", Qt::QueuedConnection); + QMetaObject::invokeMethod(m_BonjourInstall, "run", Qt::QueuedConnection); - m_DownloadMessageBox->hide(); + m_DownloadMessageBox->hide(); #endif } void MainWindow::promptAutoConfig() { - if (!isBonjourRunning()) { - int r = QMessageBox::question( - this, tr("Synergy"), - tr("Do you want to enable auto config and install Bonjour?\n\n" - "This feature helps you establish the connection."), - QMessageBox::Yes | QMessageBox::No); + if (!isBonjourRunning()) { + int r = QMessageBox::question( + this, tr("Synergy"), + tr("Do you want to enable auto config and install Bonjour?\n\n" + "This feature helps you establish the connection."), + QMessageBox::Yes | QMessageBox::No); - if (r == QMessageBox::Yes) { - m_AppConfig->setAutoConfig(true); - downloadBonjour(); - } - else { - m_AppConfig->setAutoConfig(false); - m_pCheckBoxAutoConfig->setChecked(false); - } - } + if (r == QMessageBox::Yes) { + m_AppConfig->setAutoConfig(true); + downloadBonjour(); + } + else { + m_AppConfig->setAutoConfig(false); + m_pCheckBoxAutoConfig->setChecked(false); + } + } - m_AppConfig->setAutoConfigPrompted(true); + m_AppConfig->setAutoConfigPrompted(true); } void MainWindow::on_m_pComboServerList_currentIndexChanged(QString ) { - if (m_pComboServerList->count() != 0) { - restartSynergy(); - } + if (m_pComboServerList->count() != 0) { + restartSynergy(); + } } void MainWindow::on_m_pCheckBoxAutoConfig_toggled(bool checked) { - if (!isBonjourRunning() && checked) { - if (!m_SuppressAutoConfigWarning) { - int r = QMessageBox::information( - this, tr("Synergy"), - tr("Auto config feature requires Bonjour.\n\n" - "Do you want to install Bonjour?"), - QMessageBox::Yes | QMessageBox::No); + if (!isBonjourRunning() && checked) { + if (!m_SuppressAutoConfigWarning) { + int r = QMessageBox::information( + this, tr("Synergy"), + tr("Auto config feature requires Bonjour.\n\n" + "Do you want to install Bonjour?"), + QMessageBox::Yes | QMessageBox::No); - if (r == QMessageBox::Yes) { - downloadBonjour(); - } - } + if (r == QMessageBox::Yes) { + downloadBonjour(); + } + } - m_pCheckBoxAutoConfig->setChecked(false); - return; - } + m_pCheckBoxAutoConfig->setChecked(false); + return; + } - m_pLineEditHostname->setDisabled(checked); - appConfig().setAutoConfig(checked); - updateZeroconfService(); + m_pLineEditHostname->setDisabled(checked); + appConfig().setAutoConfig(checked); + updateZeroconfService(); - if (!checked) { - m_pComboServerList->clear(); - m_pComboServerList->hide(); - } + if (!checked) { + m_pComboServerList->clear(); + m_pComboServerList->hide(); + } } void MainWindow::bonjourInstallFinished() { - appendLogInfo("Bonjour install finished"); + appendLogInfo("Bonjour install finished"); - m_pCheckBoxAutoConfig->setChecked(true); + m_pCheckBoxAutoConfig->setChecked(true); } int MainWindow::raiseActivationDialog() { - if (m_ActivationDialogRunning) { - return QDialog::Rejected; - } - ActivationDialog activationDialog (this, appConfig(), licenseManager()); - m_ActivationDialogRunning = true; - connect (&activationDialog, SIGNAL(finished(int)), - this, SLOT(on_activationDialogFinish()), Qt::QueuedConnection); - int result = activationDialog.exec(); - m_ActivationDialogRunning = false; - if (!m_PendingClientNames.empty()) { - foreach (const QString& name, m_PendingClientNames) { - autoAddScreen(name); - } + if (m_ActivationDialogRunning) { + return QDialog::Rejected; + } + ActivationDialog activationDialog (this, appConfig(), licenseManager()); + m_ActivationDialogRunning = true; + connect (&activationDialog, SIGNAL(finished(int)), + this, SLOT(on_activationDialogFinish()), Qt::QueuedConnection); + int result = activationDialog.exec(); + m_ActivationDialogRunning = false; + if (!m_PendingClientNames.empty()) { + foreach (const QString& name, m_PendingClientNames) { + autoAddScreen(name); + } - m_PendingClientNames.clear(); - } - if (result == QDialog::Accepted) { - restartSynergy(); - } - return result; + m_PendingClientNames.clear(); + } + if (result == QDialog::Accepted) { + restartSynergy(); + } + return result; } void MainWindow::on_windowShown() { - time_t currentTime = ::time(0); - if (!m_AppConfig->activationHasRun() - && ((m_AppConfig->edition() == kUnregistered) || - (m_LicenseManager->serialKey().isExpired(currentTime)))) { - raiseActivationDialog(); - } + time_t currentTime = ::time(0); + if (!m_AppConfig->activationHasRun() + && ((m_AppConfig->edition() == kUnregistered) || + (m_LicenseManager->serialKey().isExpired(currentTime)))) { + raiseActivationDialog(); + } } QString MainWindow::getProfileRootForArg() { - CoreInterface coreInterface; - QString dir = coreInterface.getProfileDir(); + CoreInterface coreInterface; + QString dir = coreInterface.getProfileDir(); - // HACK: strip our app name since we're returning the root dir. + // HACK: strip our app name since we're returning the root dir. #if defined(Q_OS_WIN) - dir.replace("\\Synergy", ""); + dir.replace("\\Synergy", ""); #else - dir.replace("/.synergy", ""); + dir.replace("/.synergy", ""); #endif - return QString("\"%1\"").arg(dir); + return QString("\"%1\"").arg(dir); } diff --git a/src/gui/src/MainWindow.h b/src/gui/src/MainWindow.h index 2ca3e711..75920caa 100644 --- a/src/gui/src/MainWindow.h +++ b/src/gui/src/MainWindow.h @@ -62,179 +62,179 @@ class LicenseManager; class MainWindow : public QMainWindow, public Ui::MainWindowBase { - Q_OBJECT + Q_OBJECT - friend class QSynergyApplication; - friend class SetupWizard; - friend class ActivationDialog; - friend class SettingsDialog; + friend class QSynergyApplication; + friend class SetupWizard; + friend class ActivationDialog; + friend class SettingsDialog; - public: - enum qSynergyState - { - synergyDisconnected, - synergyConnecting, - synergyConnected, - synergyTransfering - }; + public: + enum qSynergyState + { + synergyDisconnected, + synergyConnecting, + synergyConnected, + synergyTransfering + }; - enum qSynergyType - { - synergyClient, - synergyServer - }; + enum qSynergyType + { + synergyClient, + synergyServer + }; - enum qLevel { - Error, - Info - }; + enum qLevel { + Error, + Info + }; - enum qRuningState { - kStarted, - kStopped - }; + enum qRuningState { + kStarted, + kStopped + }; - public: - MainWindow(QSettings& settings, AppConfig& appConfig, - LicenseManager& licenseManager); - ~MainWindow(); + public: + MainWindow(QSettings& settings, AppConfig& appConfig, + LicenseManager& licenseManager); + ~MainWindow(); - public: - void setVisible(bool visible); - int synergyType() const { return m_pGroupClient->isChecked() ? synergyClient : synergyServer; } - int synergyState() const { return m_SynergyState; } - QString hostname() const { return m_pLineEditHostname->text(); } - QString configFilename(); - QString address(); - QString appPath(const QString& name); - void open(); - void clearLog(); - VersionChecker& versionChecker() { return m_VersionChecker; } - QString getScreenName(); - ServerConfig& serverConfig() { return m_ServerConfig; } - void showConfigureServer(const QString& message); - void showConfigureServer() { showConfigureServer(""); } - void autoAddScreen(const QString name); - void updateZeroconfService(); - void serverDetected(const QString name); - void updateLocalFingerprint(); - LicenseManager& licenseManager() const; + public: + void setVisible(bool visible); + int synergyType() const { return m_pGroupClient->isChecked() ? synergyClient : synergyServer; } + int synergyState() const { return m_SynergyState; } + QString hostname() const { return m_pLineEditHostname->text(); } + QString configFilename(); + QString address(); + QString appPath(const QString& name); + void open(); + void clearLog(); + VersionChecker& versionChecker() { return m_VersionChecker; } + QString getScreenName(); + ServerConfig& serverConfig() { return m_ServerConfig; } + void showConfigureServer(const QString& message); + void showConfigureServer() { showConfigureServer(""); } + void autoAddScreen(const QString name); + void updateZeroconfService(); + void serverDetected(const QString name); + void updateLocalFingerprint(); + LicenseManager& licenseManager() const; - int raiseActivationDialog(); + int raiseActivationDialog(); public slots: - void setEdition(Edition edition); - void beginTrial(bool isExpiring); - void endTrial(bool isExpired); - void appendLogRaw(const QString& text); - void appendLogInfo(const QString& text); - void appendLogDebug(const QString& text); - void appendLogError(const QString& text); - void startSynergy(); + void setEdition(Edition edition); + void beginTrial(bool isExpiring); + void endTrial(bool isExpired); + void appendLogRaw(const QString& text); + void appendLogInfo(const QString& text); + void appendLogDebug(const QString& text); + void appendLogError(const QString& text); + void startSynergy(); - protected slots: - void sslToggled(bool enabled); - void on_m_pGroupClient_toggled(bool on); - void on_m_pGroupServer_toggled(bool on); - bool on_m_pButtonBrowseConfigFile_clicked(); - void on_m_pButtonConfigureServer_clicked(); - bool on_m_pActionSave_triggered(); - void on_m_pActionAbout_triggered(); - void on_m_pActionSettings_triggered(); - void on_m_pActivate_triggered(); - void synergyFinished(int exitCode, QProcess::ExitStatus); - void trayActivated(QSystemTrayIcon::ActivationReason reason); - void stopSynergy(); - void logOutput(); - void logError(); - void updateFound(const QString& version); - void bonjourInstallFinished(); + protected slots: + void sslToggled(bool enabled); + void on_m_pGroupClient_toggled(bool on); + void on_m_pGroupServer_toggled(bool on); + bool on_m_pButtonBrowseConfigFile_clicked(); + void on_m_pButtonConfigureServer_clicked(); + bool on_m_pActionSave_triggered(); + void on_m_pActionAbout_triggered(); + void on_m_pActionSettings_triggered(); + void on_m_pActivate_triggered(); + void synergyFinished(int exitCode, QProcess::ExitStatus); + void trayActivated(QSystemTrayIcon::ActivationReason reason); + void stopSynergy(); + void logOutput(); + void logError(); + void updateFound(const QString& version); + void bonjourInstallFinished(); - protected: - QSettings& settings() { return m_Settings; } - AppConfig& appConfig() { return *m_AppConfig; } - QProcess* synergyProcess() { return m_pSynergy; } - void setSynergyProcess(QProcess* p) { m_pSynergy = p; } - void initConnections(); - void createMenuBar(); - void createStatusBar(); - void createTrayIcon(); - void loadSettings(); - void saveSettings(); - void setIcon(qSynergyState state); - void setSynergyState(qSynergyState state); - bool checkForApp(int which, QString& app); - bool clientArgs(QStringList& args, QString& app); - bool serverArgs(QStringList& args, QString& app); - void setStatus(const QString& status); - void sendIpcMessage(qIpcMessageType type, const char* buffer, bool showErrors); - void onModeChanged(bool startDesktop, bool applyService); - void updateFromLogLine(const QString& line); - QString getIPAddresses(); - void stopService(); - void stopDesktop(); - void changeEvent(QEvent* event); - void retranslateMenuBar(); + protected: + QSettings& settings() { return m_Settings; } + AppConfig& appConfig() { return *m_AppConfig; } + QProcess* synergyProcess() { return m_pSynergy; } + void setSynergyProcess(QProcess* p) { m_pSynergy = p; } + void initConnections(); + void createMenuBar(); + void createStatusBar(); + void createTrayIcon(); + void loadSettings(); + void saveSettings(); + void setIcon(qSynergyState state); + void setSynergyState(qSynergyState state); + bool checkForApp(int which, QString& app); + bool clientArgs(QStringList& args, QString& app); + bool serverArgs(QStringList& args, QString& app); + void setStatus(const QString& status); + void sendIpcMessage(qIpcMessageType type, const char* buffer, bool showErrors); + void onModeChanged(bool startDesktop, bool applyService); + void updateFromLogLine(const QString& line); + QString getIPAddresses(); + void stopService(); + void stopDesktop(); + void changeEvent(QEvent* event); + void retranslateMenuBar(); #if defined(Q_OS_WIN) - bool isServiceRunning(QString name); + bool isServiceRunning(QString name); #else - bool isServiceRunning(); + bool isServiceRunning(); #endif - bool isBonjourRunning(); - void downloadBonjour(); - void promptAutoConfig(); - QString getProfileRootForArg(); - void checkConnected(const QString& line); - void checkLicense(const QString& line); - void checkFingerprint(const QString& line); - bool autoHide(); - QString getTimeStamp(); - void restartSynergy(); - void proofreadInfo(); + bool isBonjourRunning(); + void downloadBonjour(); + void promptAutoConfig(); + QString getProfileRootForArg(); + void checkConnected(const QString& line); + void checkLicense(const QString& line); + void checkFingerprint(const QString& line); + bool autoHide(); + QString getTimeStamp(); + void restartSynergy(); + void proofreadInfo(); - void showEvent (QShowEvent*); + void showEvent (QShowEvent*); - private: - QSettings& m_Settings; - AppConfig* m_AppConfig; - LicenseManager* m_LicenseManager; - QProcess* m_pSynergy; - int m_SynergyState; - ServerConfig m_ServerConfig; - QTemporaryFile* m_pTempConfigFile; - QSystemTrayIcon* m_pTrayIcon; - QMenu* m_pTrayIconMenu; - bool m_AlreadyHidden; - VersionChecker m_VersionChecker; - IpcClient m_IpcClient; - QMenuBar* m_pMenuBar; - QMenu* m_pMenuFile; - QMenu* m_pMenuEdit; - QMenu* m_pMenuWindow; - QMenu* m_pMenuHelp; - ZeroconfService* m_pZeroconfService; - DataDownloader* m_pDataDownloader; - QMessageBox* m_DownloadMessageBox; - QAbstractButton* m_pCancelButton; - QMutex m_UpdateZeroconfMutex; - bool m_SuppressAutoConfigWarning; - CommandProcess* m_BonjourInstall; - bool m_SuppressEmptyServerWarning; - qRuningState m_ExpectedRunningState; - QMutex m_StopDesktopMutex; - SslCertificate* m_pSslCertificate; - bool m_ActivationDialogRunning; - QStringList m_PendingClientNames; + private: + QSettings& m_Settings; + AppConfig* m_AppConfig; + LicenseManager* m_LicenseManager; + QProcess* m_pSynergy; + int m_SynergyState; + ServerConfig m_ServerConfig; + QTemporaryFile* m_pTempConfigFile; + QSystemTrayIcon* m_pTrayIcon; + QMenu* m_pTrayIconMenu; + bool m_AlreadyHidden; + VersionChecker m_VersionChecker; + IpcClient m_IpcClient; + QMenuBar* m_pMenuBar; + QMenu* m_pMenuFile; + QMenu* m_pMenuEdit; + QMenu* m_pMenuWindow; + QMenu* m_pMenuHelp; + ZeroconfService* m_pZeroconfService; + DataDownloader* m_pDataDownloader; + QMessageBox* m_DownloadMessageBox; + QAbstractButton* m_pCancelButton; + QMutex m_UpdateZeroconfMutex; + bool m_SuppressAutoConfigWarning; + CommandProcess* m_BonjourInstall; + bool m_SuppressEmptyServerWarning; + qRuningState m_ExpectedRunningState; + QMutex m_StopDesktopMutex; + SslCertificate* m_pSslCertificate; + bool m_ActivationDialogRunning; + QStringList m_PendingClientNames; private slots: - void on_m_pCheckBoxAutoConfig_toggled(bool checked); - void on_m_pComboServerList_currentIndexChanged(QString ); - void on_m_pButtonApply_clicked(); - void installBonjour(); - void on_windowShown(); + void on_m_pCheckBoxAutoConfig_toggled(bool checked); + void on_m_pComboServerList_currentIndexChanged(QString ); + void on_m_pButtonApply_clicked(); + void installBonjour(); + void on_windowShown(); signals: - void windowShown(); + void windowShown(); }; #endif diff --git a/src/gui/src/NewScreenWidget.cpp b/src/gui/src/NewScreenWidget.cpp index e5f39a66..7873e8b1 100644 --- a/src/gui/src/NewScreenWidget.cpp +++ b/src/gui/src/NewScreenWidget.cpp @@ -23,26 +23,26 @@ #include NewScreenWidget::NewScreenWidget(QWidget* parent) : - QLabel(parent) + QLabel(parent) { } void NewScreenWidget::mousePressEvent(QMouseEvent* event) { - Screen newScreen(tr("Unnamed")); + Screen newScreen(tr("Unnamed")); - QByteArray itemData; - QDataStream dataStream(&itemData, QIODevice::WriteOnly); - dataStream << -1 << -1 << newScreen; + QByteArray itemData; + QDataStream dataStream(&itemData, QIODevice::WriteOnly); + dataStream << -1 << -1 << newScreen; - QMimeData* pMimeData = new QMimeData; - pMimeData->setData(ScreenSetupModel::mimeType(), itemData); + QMimeData* pMimeData = new QMimeData; + pMimeData->setData(ScreenSetupModel::mimeType(), itemData); - QDrag* pDrag = new QDrag(this); - pDrag->setMimeData(pMimeData); - pDrag->setPixmap(*pixmap()); - pDrag->setHotSpot(event->pos()); + QDrag* pDrag = new QDrag(this); + pDrag->setMimeData(pMimeData); + pDrag->setPixmap(*pixmap()); + pDrag->setHotSpot(event->pos()); - pDrag->exec(Qt::CopyAction, Qt::CopyAction); + pDrag->exec(Qt::CopyAction, Qt::CopyAction); } diff --git a/src/gui/src/NewScreenWidget.h b/src/gui/src/NewScreenWidget.h index c45030ad..67ff44f6 100644 --- a/src/gui/src/NewScreenWidget.h +++ b/src/gui/src/NewScreenWidget.h @@ -27,13 +27,13 @@ class QWidget; class NewScreenWidget : public QLabel { - Q_OBJECT + Q_OBJECT - public: - NewScreenWidget(QWidget* parent); + public: + NewScreenWidget(QWidget* parent); - protected: - void mousePressEvent(QMouseEvent* event); + protected: + void mousePressEvent(QMouseEvent* event); }; #endif diff --git a/src/gui/src/ProcessorArch.h b/src/gui/src/ProcessorArch.h index 43bf3126..cb2d30fc 100644 --- a/src/gui/src/ProcessorArch.h +++ b/src/gui/src/ProcessorArch.h @@ -18,11 +18,11 @@ #pragma once enum qProcessorArch { - kProcessorArchWin32, - kProcessorArchWin64, - kProcessorArchMac32, - kProcessorArchMac64, - kProcessorArchLinux32, - kProcessorArchLinux64, - kProcessorArchUnknown + kProcessorArchWin32, + kProcessorArchWin64, + kProcessorArchMac32, + kProcessorArchMac64, + kProcessorArchLinux32, + kProcessorArchLinux64, + kProcessorArchUnknown }; diff --git a/src/gui/src/QSynergyApplication.cpp b/src/gui/src/QSynergyApplication.cpp index 27705f32..969d2a4b 100644 --- a/src/gui/src/QSynergyApplication.cpp +++ b/src/gui/src/QSynergyApplication.cpp @@ -25,48 +25,48 @@ QSynergyApplication* QSynergyApplication::s_Instance = NULL; QSynergyApplication::QSynergyApplication(int& argc, char** argv) : - QApplication(argc, argv), - m_Translator(NULL) + QApplication(argc, argv), + m_Translator(NULL) { - s_Instance = this; + s_Instance = this; } QSynergyApplication::~QSynergyApplication() { - delete m_Translator; + delete m_Translator; } void QSynergyApplication::commitData(QSessionManager&) { - foreach(QWidget* widget, topLevelWidgets()) - { - MainWindow* mainWindow = qobject_cast(widget); - if (mainWindow) - mainWindow->saveSettings(); - } + foreach(QWidget* widget, topLevelWidgets()) + { + MainWindow* mainWindow = qobject_cast(widget); + if (mainWindow) + mainWindow->saveSettings(); + } } QSynergyApplication* QSynergyApplication::getInstance() { - return s_Instance; + return s_Instance; } void QSynergyApplication::switchTranslator(QString lang) { - if (m_Translator != NULL) - { - removeTranslator(m_Translator); - delete m_Translator; - } + if (m_Translator != NULL) + { + removeTranslator(m_Translator); + delete m_Translator; + } - QResource locale(":/res/lang/gui_" + lang + ".qm"); - m_Translator = new QTranslator(); - m_Translator->load(locale.data(), locale.size()); - installTranslator(m_Translator); + QResource locale(":/res/lang/gui_" + lang + ".qm"); + m_Translator = new QTranslator(); + m_Translator->load(locale.data(), locale.size()); + installTranslator(m_Translator); } void QSynergyApplication::setTranslator(QTranslator* translator) { - m_Translator = translator; - installTranslator(m_Translator); + m_Translator = translator; + installTranslator(m_Translator); } diff --git a/src/gui/src/QSynergyApplication.h b/src/gui/src/QSynergyApplication.h index 091ba852..26c3be5e 100644 --- a/src/gui/src/QSynergyApplication.h +++ b/src/gui/src/QSynergyApplication.h @@ -26,21 +26,21 @@ class QSessionManager; class QSynergyApplication : public QApplication { - public: - QSynergyApplication(int& argc, char** argv); - ~QSynergyApplication(); + public: + QSynergyApplication(int& argc, char** argv); + ~QSynergyApplication(); - public: - void commitData(QSessionManager& manager); - void switchTranslator(QString lang); - void setTranslator(QTranslator* translator); + public: + void commitData(QSessionManager& manager); + void switchTranslator(QString lang); + void setTranslator(QTranslator* translator); - static QSynergyApplication* getInstance(); + static QSynergyApplication* getInstance(); - private: - QTranslator* m_Translator; + private: + QTranslator* m_Translator; - static QSynergyApplication* s_Instance; + static QSynergyApplication* s_Instance; }; #endif diff --git a/src/gui/src/QUtility.cpp b/src/gui/src/QUtility.cpp index 9e086f8d..87cfceee 100644 --- a/src/gui/src/QUtility.cpp +++ b/src/gui/src/QUtility.cpp @@ -32,85 +32,85 @@ void setIndexFromItemData(QComboBox* comboBox, const QVariant& itemData) { - for (int i = 0; i < comboBox->count(); ++i) - { - if (comboBox->itemData(i) == itemData) - { - comboBox->setCurrentIndex(i); - return; - } - } + for (int i = 0; i < comboBox->count(); ++i) + { + if (comboBox->itemData(i) == itemData) + { + comboBox->setCurrentIndex(i); + return; + } + } } QString hash(const QString& string) { - QByteArray data = string.toUtf8(); - QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5); - return hash.toHex(); + QByteArray data = string.toUtf8(); + QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Md5); + return hash.toHex(); } QString getFirstMacAddress() { - QString mac; - foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces()) - { - mac = interface.hardwareAddress(); - if (mac.size() != 0) - { - break; - } - } - return mac; + QString mac; + foreach (const QNetworkInterface &interface, QNetworkInterface::allInterfaces()) + { + mac = interface.hardwareAddress(); + if (mac.size() != 0) + { + break; + } + } + return mac; } qProcessorArch getProcessorArch() { #if defined(Q_OS_WIN) - SYSTEM_INFO systemInfo; - GetNativeSystemInfo(&systemInfo); + SYSTEM_INFO systemInfo; + GetNativeSystemInfo(&systemInfo); - switch (systemInfo.wProcessorArchitecture) { - case PROCESSOR_ARCHITECTURE_INTEL: - return kProcessorArchWin32; - case PROCESSOR_ARCHITECTURE_IA64: - return kProcessorArchWin64; - case PROCESSOR_ARCHITECTURE_AMD64: - return kProcessorArchWin64; - default: - return kProcessorArchUnknown; - } + switch (systemInfo.wProcessorArchitecture) { + case PROCESSOR_ARCHITECTURE_INTEL: + return kProcessorArchWin32; + case PROCESSOR_ARCHITECTURE_IA64: + return kProcessorArchWin64; + case PROCESSOR_ARCHITECTURE_AMD64: + return kProcessorArchWin64; + default: + return kProcessorArchUnknown; + } #endif #if defined(Q_OS_LINUX) #ifdef __i386__ - return kProcessorArchLinux32; + return kProcessorArchLinux32; #else - return kProcessorArchLinux64; + return kProcessorArchLinux64; #endif #endif - return kProcessorArchUnknown; + return kProcessorArchUnknown; } QString getOSInformation() { - QString result; + QString result; #if defined(Q_OS_LINUX) - result = "Linux"; - try { - QStringList arguments; - arguments.append("/etc/os-release"); - CommandProcess cp("/bin/cat", arguments); - QString output = cp.run(); + result = "Linux"; + try { + QStringList arguments; + arguments.append("/etc/os-release"); + CommandProcess cp("/bin/cat", arguments); + QString output = cp.run(); - QRegExp resultRegex(".*PRETTY_NAME=\"([^\"]+)\".*"); - if (resultRegex.exactMatch(output)) { - result = resultRegex.cap(1); - } - } catch (...) { - } + QRegExp resultRegex(".*PRETTY_NAME=\"([^\"]+)\".*"); + if (resultRegex.exactMatch(output)) { + result = resultRegex.cap(1); + } + } catch (...) { + } #endif - return result; + return result; } diff --git a/src/gui/src/Screen.cpp b/src/gui/src/Screen.cpp index ca6727d6..3ec07caa 100644 --- a/src/gui/src/Screen.cpp +++ b/src/gui/src/Screen.cpp @@ -22,126 +22,126 @@ #include Screen::Screen() : - m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")), - m_Swapped(false) + m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")), + m_Swapped(false) { - init(); + init(); } Screen::Screen(const QString& name) : - m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")), - m_Swapped(false) + m_Pixmap(QPixmap(":res/icons/64x64/video-display.png")), + m_Swapped(false) { - init(); - setName(name); + init(); + setName(name); } void Screen::init() { - name().clear(); - aliases().clear(); - modifiers().clear(); - switchCorners().clear(); - fixes().clear(); - setSwitchCornerSize(0); + name().clear(); + aliases().clear(); + modifiers().clear(); + switchCorners().clear(); + fixes().clear(); + setSwitchCornerSize(0); - // m_Modifiers, m_SwitchCorners and m_Fixes are QLists we use like fixed-size arrays, - // thus we need to make sure to fill them with the required number of elements. - for (int i = 0; i < NumModifiers; i++) - modifiers() << i; + // m_Modifiers, m_SwitchCorners and m_Fixes are QLists we use like fixed-size arrays, + // thus we need to make sure to fill them with the required number of elements. + for (int i = 0; i < NumModifiers; i++) + modifiers() << i; - for (int i = 0; i < NumSwitchCorners; i++) - switchCorners() << false; + for (int i = 0; i < NumSwitchCorners; i++) + switchCorners() << false; - for (int i = 0; i < NumFixes; i++) - fixes() << false; + for (int i = 0; i < NumFixes; i++) + fixes() << false; } void Screen::loadSettings(QSettings& settings) { - setName(settings.value("name").toString()); + setName(settings.value("name").toString()); - if (name().isEmpty()) - return; + if (name().isEmpty()) + return; - setSwitchCornerSize(settings.value("switchCornerSize").toInt()); + setSwitchCornerSize(settings.value("switchCornerSize").toInt()); - readSettings(settings, aliases(), "alias", QString("")); - readSettings(settings, modifiers(), "modifier", static_cast(DefaultMod), NumModifiers); - readSettings(settings, switchCorners(), "switchCorner", false, NumSwitchCorners); - readSettings(settings, fixes(), "fix", false, NumFixes); + readSettings(settings, aliases(), "alias", QString("")); + readSettings(settings, modifiers(), "modifier", static_cast(DefaultMod), NumModifiers); + readSettings(settings, switchCorners(), "switchCorner", false, NumSwitchCorners); + readSettings(settings, fixes(), "fix", false, NumFixes); } void Screen::saveSettings(QSettings& settings) const { - settings.setValue("name", name()); + settings.setValue("name", name()); - if (name().isEmpty()) - return; + if (name().isEmpty()) + return; - settings.setValue("switchCornerSize", switchCornerSize()); + settings.setValue("switchCornerSize", switchCornerSize()); - writeSettings(settings, aliases(), "alias"); - writeSettings(settings, modifiers(), "modifier"); - writeSettings(settings, switchCorners(), "switchCorner"); - writeSettings(settings, fixes(), "fix"); + writeSettings(settings, aliases(), "alias"); + writeSettings(settings, modifiers(), "modifier"); + writeSettings(settings, switchCorners(), "switchCorner"); + writeSettings(settings, fixes(), "fix"); } QTextStream& Screen::writeScreensSection(QTextStream& outStream) const { - outStream << "\t" << name() << ":" << endl; + outStream << "\t" << name() << ":" << endl; - for (int i = 0; i < modifiers().size(); i++) - if (modifier(i) != i) - outStream << "\t\t" << modifierName(i) << " = " << modifierName(modifier(i)) << endl; + for (int i = 0; i < modifiers().size(); i++) + if (modifier(i) != i) + outStream << "\t\t" << modifierName(i) << " = " << modifierName(modifier(i)) << endl; - for (int i = 0; i < fixes().size(); i++) - outStream << "\t\t" << fixName(i) << " = " << (fixes()[i] ? "true" : "false") << endl; + for (int i = 0; i < fixes().size(); i++) + outStream << "\t\t" << fixName(i) << " = " << (fixes()[i] ? "true" : "false") << endl; - outStream << "\t\t" << "switchCorners = none "; - for (int i = 0; i < switchCorners().size(); i++) - if (switchCorners()[i]) - outStream << "+" << switchCornerName(i) << " "; - outStream << endl; + outStream << "\t\t" << "switchCorners = none "; + for (int i = 0; i < switchCorners().size(); i++) + if (switchCorners()[i]) + outStream << "+" << switchCornerName(i) << " "; + outStream << endl; - outStream << "\t\t" << "switchCornerSize = " << switchCornerSize() << endl; + outStream << "\t\t" << "switchCornerSize = " << switchCornerSize() << endl; - return outStream; + return outStream; } QTextStream& Screen::writeAliasesSection(QTextStream& outStream) const { - if (!aliases().isEmpty()) - { - outStream << "\t" << name() << ":" << endl; + if (!aliases().isEmpty()) + { + outStream << "\t" << name() << ":" << endl; - foreach (const QString& alias, aliases()) - outStream << "\t\t" << alias << endl; - } + foreach (const QString& alias, aliases()) + outStream << "\t\t" << alias << endl; + } - return outStream; + return outStream; } QDataStream& operator<<(QDataStream& outStream, const Screen& screen) { - return outStream - << screen.name() - << screen.switchCornerSize() - << screen.aliases() - << screen.modifiers() - << screen.switchCorners() - << screen.fixes() - ; + return outStream + << screen.name() + << screen.switchCornerSize() + << screen.aliases() + << screen.modifiers() + << screen.switchCorners() + << screen.fixes() + ; } QDataStream& operator>>(QDataStream& inStream, Screen& screen) { - return inStream - >> screen.m_Name - >> screen.m_SwitchCornerSize - >> screen.m_Aliases - >> screen.m_Modifiers - >> screen.m_SwitchCorners - >> screen.m_Fixes - ; + return inStream + >> screen.m_Name + >> screen.m_SwitchCornerSize + >> screen.m_Aliases + >> screen.m_Modifiers + >> screen.m_SwitchCorners + >> screen.m_Fixes + ; } diff --git a/src/gui/src/Screen.h b/src/gui/src/Screen.h index d5aa3edc..8ae823fe 100644 --- a/src/gui/src/Screen.h +++ b/src/gui/src/Screen.h @@ -34,66 +34,66 @@ class ScreenSettingsDialog; class Screen : public BaseConfig { - friend QDataStream& operator<<(QDataStream& outStream, const Screen& screen); - friend QDataStream& operator>>(QDataStream& inStream, Screen& screen); - friend class ScreenSettingsDialog; - friend class ScreenSetupModel; - friend class ScreenSetupView; + friend QDataStream& operator<<(QDataStream& outStream, const Screen& screen); + friend QDataStream& operator>>(QDataStream& inStream, Screen& screen); + friend class ScreenSettingsDialog; + friend class ScreenSetupModel; + friend class ScreenSetupView; - public: - Screen(); - Screen(const QString& name); + public: + Screen(); + Screen(const QString& name); - public: - const QPixmap* pixmap() const { return &m_Pixmap; } - const QString& name() const { return m_Name; } - const QStringList& aliases() const { return m_Aliases; } + public: + const QPixmap* pixmap() const { return &m_Pixmap; } + const QString& name() const { return m_Name; } + const QStringList& aliases() const { return m_Aliases; } - bool isNull() const { return m_Name.isEmpty(); } - int modifier(int m) const { return m_Modifiers[m] == DefaultMod ? m : m_Modifiers[m]; } - const QList& modifiers() const { return m_Modifiers; } - bool switchCorner(int c) const { return m_SwitchCorners[c]; } - const QList& switchCorners() const { return m_SwitchCorners; } - int switchCornerSize() const { return m_SwitchCornerSize; } - bool fix(Fix f) const { return m_Fixes[f]; } - const QList& fixes() const { return m_Fixes; } + bool isNull() const { return m_Name.isEmpty(); } + int modifier(int m) const { return m_Modifiers[m] == DefaultMod ? m : m_Modifiers[m]; } + const QList& modifiers() const { return m_Modifiers; } + bool switchCorner(int c) const { return m_SwitchCorners[c]; } + const QList& switchCorners() const { return m_SwitchCorners; } + int switchCornerSize() const { return m_SwitchCornerSize; } + bool fix(Fix f) const { return m_Fixes[f]; } + const QList& fixes() const { return m_Fixes; } - void loadSettings(QSettings& settings); - void saveSettings(QSettings& settings) const; - QTextStream& writeScreensSection(QTextStream& outStream) const; - QTextStream& writeAliasesSection(QTextStream& outStream) const; + void loadSettings(QSettings& settings); + void saveSettings(QSettings& settings) const; + QTextStream& writeScreensSection(QTextStream& outStream) const; + QTextStream& writeAliasesSection(QTextStream& outStream) const; - bool swapped() const { return m_Swapped; } - QString& name() { return m_Name; } - void setName(const QString& name) { m_Name = name; } + bool swapped() const { return m_Swapped; } + QString& name() { return m_Name; } + void setName(const QString& name) { m_Name = name; } - protected: - void init(); - QPixmap* pixmap() { return &m_Pixmap; } + protected: + void init(); + QPixmap* pixmap() { return &m_Pixmap; } - void setPixmap(const QPixmap& pixmap) { m_Pixmap = pixmap; } - QStringList& aliases() { return m_Aliases; } - void setModifier(int m, int n) { m_Modifiers[m] = n; } - QList& modifiers() { return m_Modifiers; } - void addAlias(const QString& alias) { m_Aliases.append(alias); } - void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; } - QList& switchCorners() { return m_SwitchCorners; } - void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; } - void setFix(int f, bool on) { m_Fixes[f] = on; } - QList& fixes() { return m_Fixes; } - void setSwapped(bool on) { m_Swapped = on; } + void setPixmap(const QPixmap& pixmap) { m_Pixmap = pixmap; } + QStringList& aliases() { return m_Aliases; } + void setModifier(int m, int n) { m_Modifiers[m] = n; } + QList& modifiers() { return m_Modifiers; } + void addAlias(const QString& alias) { m_Aliases.append(alias); } + void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; } + QList& switchCorners() { return m_SwitchCorners; } + void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; } + void setFix(int f, bool on) { m_Fixes[f] = on; } + QList& fixes() { return m_Fixes; } + void setSwapped(bool on) { m_Swapped = on; } - private: - QPixmap m_Pixmap; - QString m_Name; + private: + QPixmap m_Pixmap; + QString m_Name; - QStringList m_Aliases; - QList m_Modifiers; - QList m_SwitchCorners; - int m_SwitchCornerSize; - QList m_Fixes; + QStringList m_Aliases; + QList m_Modifiers; + QList m_SwitchCorners; + int m_SwitchCornerSize; + QList m_Fixes; - bool m_Swapped; + bool m_Swapped; }; typedef QList ScreenList; diff --git a/src/gui/src/ScreenSettingsDialog.cpp b/src/gui/src/ScreenSettingsDialog.cpp index 05f769d1..740137a3 100644 --- a/src/gui/src/ScreenSettingsDialog.cpp +++ b/src/gui/src/ScreenSettingsDialog.cpp @@ -24,114 +24,114 @@ #include ScreenSettingsDialog::ScreenSettingsDialog(QWidget* parent, Screen* pScreen) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::ScreenSettingsDialogBase(), - m_pScreen(pScreen) + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::ScreenSettingsDialogBase(), + m_pScreen(pScreen) { - setupUi(this); + setupUi(this); - QRegExp validScreenName("[a-z0-9\\._-]{,255}", Qt::CaseInsensitive); + QRegExp validScreenName("[a-z0-9\\._-]{,255}", Qt::CaseInsensitive); - m_pLineEditName->setText(m_pScreen->name()); - m_pLineEditName->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); - m_pLineEditName->selectAll(); + m_pLineEditName->setText(m_pScreen->name()); + m_pLineEditName->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); + m_pLineEditName->selectAll(); - m_pLineEditAlias->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); + m_pLineEditAlias->setValidator(new QRegExpValidator(validScreenName, m_pLineEditName)); - for (int i = 0; i < m_pScreen->aliases().count(); i++) - new QListWidgetItem(m_pScreen->aliases()[i], m_pListAliases); + for (int i = 0; i < m_pScreen->aliases().count(); i++) + new QListWidgetItem(m_pScreen->aliases()[i], m_pListAliases); - m_pComboBoxShift->setCurrentIndex(m_pScreen->modifier(Screen::Shift)); - m_pComboBoxCtrl->setCurrentIndex(m_pScreen->modifier(Screen::Ctrl)); - m_pComboBoxAlt->setCurrentIndex(m_pScreen->modifier(Screen::Alt)); - m_pComboBoxMeta->setCurrentIndex(m_pScreen->modifier(Screen::Meta)); - m_pComboBoxSuper->setCurrentIndex(m_pScreen->modifier(Screen::Super)); + m_pComboBoxShift->setCurrentIndex(m_pScreen->modifier(Screen::Shift)); + m_pComboBoxCtrl->setCurrentIndex(m_pScreen->modifier(Screen::Ctrl)); + m_pComboBoxAlt->setCurrentIndex(m_pScreen->modifier(Screen::Alt)); + m_pComboBoxMeta->setCurrentIndex(m_pScreen->modifier(Screen::Meta)); + m_pComboBoxSuper->setCurrentIndex(m_pScreen->modifier(Screen::Super)); - m_pCheckBoxCornerTopLeft->setChecked(m_pScreen->switchCorner(Screen::TopLeft)); - m_pCheckBoxCornerTopRight->setChecked(m_pScreen->switchCorner(Screen::TopRight)); - m_pCheckBoxCornerBottomLeft->setChecked(m_pScreen->switchCorner(Screen::BottomLeft)); - m_pCheckBoxCornerBottomRight->setChecked(m_pScreen->switchCorner(Screen::BottomRight)); - m_pSpinBoxSwitchCornerSize->setValue(m_pScreen->switchCornerSize()); + m_pCheckBoxCornerTopLeft->setChecked(m_pScreen->switchCorner(Screen::TopLeft)); + m_pCheckBoxCornerTopRight->setChecked(m_pScreen->switchCorner(Screen::TopRight)); + m_pCheckBoxCornerBottomLeft->setChecked(m_pScreen->switchCorner(Screen::BottomLeft)); + m_pCheckBoxCornerBottomRight->setChecked(m_pScreen->switchCorner(Screen::BottomRight)); + m_pSpinBoxSwitchCornerSize->setValue(m_pScreen->switchCornerSize()); - m_pCheckBoxCapsLock->setChecked(m_pScreen->fix(Screen::CapsLock)); - m_pCheckBoxNumLock->setChecked(m_pScreen->fix(Screen::NumLock)); - m_pCheckBoxScrollLock->setChecked(m_pScreen->fix(Screen::ScrollLock)); - m_pCheckBoxXTest->setChecked(m_pScreen->fix(Screen::XTest)); + m_pCheckBoxCapsLock->setChecked(m_pScreen->fix(Screen::CapsLock)); + m_pCheckBoxNumLock->setChecked(m_pScreen->fix(Screen::NumLock)); + m_pCheckBoxScrollLock->setChecked(m_pScreen->fix(Screen::ScrollLock)); + m_pCheckBoxXTest->setChecked(m_pScreen->fix(Screen::XTest)); } void ScreenSettingsDialog::accept() { - if (m_pLineEditName->text().isEmpty()) - { - QMessageBox::warning( - this, tr("Screen name is empty"), - tr("The screen name cannot be empty. " - "Please either fill in a name or cancel the dialog.")); - return; - } + if (m_pLineEditName->text().isEmpty()) + { + QMessageBox::warning( + this, tr("Screen name is empty"), + tr("The screen name cannot be empty. " + "Please either fill in a name or cancel the dialog.")); + return; + } - m_pScreen->init(); + m_pScreen->init(); - m_pScreen->setName(m_pLineEditName->text()); + m_pScreen->setName(m_pLineEditName->text()); - for (int i = 0; i < m_pListAliases->count(); i++) - { - QString alias(m_pListAliases->item(i)->text()); - if (alias == m_pLineEditName->text()) - { - QMessageBox::warning( - this, tr("Screen name matches alias"), - tr("The screen name cannot be the same as an alias. " - "Please either remove the alias or change the screen name.")); - return; - } - m_pScreen->addAlias(alias); - } + for (int i = 0; i < m_pListAliases->count(); i++) + { + QString alias(m_pListAliases->item(i)->text()); + if (alias == m_pLineEditName->text()) + { + QMessageBox::warning( + this, tr("Screen name matches alias"), + tr("The screen name cannot be the same as an alias. " + "Please either remove the alias or change the screen name.")); + return; + } + m_pScreen->addAlias(alias); + } - m_pScreen->setModifier(Screen::Shift, m_pComboBoxShift->currentIndex()); - m_pScreen->setModifier(Screen::Ctrl, m_pComboBoxCtrl->currentIndex()); - m_pScreen->setModifier(Screen::Alt, m_pComboBoxAlt->currentIndex()); - m_pScreen->setModifier(Screen::Meta, m_pComboBoxMeta->currentIndex()); - m_pScreen->setModifier(Screen::Super, m_pComboBoxSuper->currentIndex()); + m_pScreen->setModifier(Screen::Shift, m_pComboBoxShift->currentIndex()); + m_pScreen->setModifier(Screen::Ctrl, m_pComboBoxCtrl->currentIndex()); + m_pScreen->setModifier(Screen::Alt, m_pComboBoxAlt->currentIndex()); + m_pScreen->setModifier(Screen::Meta, m_pComboBoxMeta->currentIndex()); + m_pScreen->setModifier(Screen::Super, m_pComboBoxSuper->currentIndex()); - m_pScreen->setSwitchCorner(Screen::TopLeft, m_pCheckBoxCornerTopLeft->isChecked()); - m_pScreen->setSwitchCorner(Screen::TopRight, m_pCheckBoxCornerTopRight->isChecked()); - m_pScreen->setSwitchCorner(Screen::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked()); - m_pScreen->setSwitchCorner(Screen::BottomRight, m_pCheckBoxCornerBottomRight->isChecked()); - m_pScreen->setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value()); + m_pScreen->setSwitchCorner(Screen::TopLeft, m_pCheckBoxCornerTopLeft->isChecked()); + m_pScreen->setSwitchCorner(Screen::TopRight, m_pCheckBoxCornerTopRight->isChecked()); + m_pScreen->setSwitchCorner(Screen::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked()); + m_pScreen->setSwitchCorner(Screen::BottomRight, m_pCheckBoxCornerBottomRight->isChecked()); + m_pScreen->setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value()); - m_pScreen->setFix(Screen::CapsLock, m_pCheckBoxCapsLock->isChecked()); - m_pScreen->setFix(Screen::NumLock, m_pCheckBoxNumLock->isChecked()); - m_pScreen->setFix(Screen::ScrollLock, m_pCheckBoxScrollLock->isChecked()); - m_pScreen->setFix(Screen::XTest, m_pCheckBoxXTest->isChecked()); + m_pScreen->setFix(Screen::CapsLock, m_pCheckBoxCapsLock->isChecked()); + m_pScreen->setFix(Screen::NumLock, m_pCheckBoxNumLock->isChecked()); + m_pScreen->setFix(Screen::ScrollLock, m_pCheckBoxScrollLock->isChecked()); + m_pScreen->setFix(Screen::XTest, m_pCheckBoxXTest->isChecked()); - QDialog::accept(); + QDialog::accept(); } void ScreenSettingsDialog::on_m_pButtonAddAlias_clicked() { - if (!m_pLineEditAlias->text().isEmpty() && m_pListAliases->findItems(m_pLineEditAlias->text(), Qt::MatchFixedString).isEmpty()) - { - new QListWidgetItem(m_pLineEditAlias->text(), m_pListAliases); - m_pLineEditAlias->clear(); - } + if (!m_pLineEditAlias->text().isEmpty() && m_pListAliases->findItems(m_pLineEditAlias->text(), Qt::MatchFixedString).isEmpty()) + { + new QListWidgetItem(m_pLineEditAlias->text(), m_pListAliases); + m_pLineEditAlias->clear(); + } } void ScreenSettingsDialog::on_m_pLineEditAlias_textChanged(const QString& text) { - m_pButtonAddAlias->setEnabled(!text.isEmpty()); + m_pButtonAddAlias->setEnabled(!text.isEmpty()); } void ScreenSettingsDialog::on_m_pButtonRemoveAlias_clicked() { - QList items = m_pListAliases->selectedItems(); + QList items = m_pListAliases->selectedItems(); - for (int i = 0; i < items.count(); i++) - delete items[i]; + for (int i = 0; i < items.count(); i++) + delete items[i]; } void ScreenSettingsDialog::on_m_pListAliases_itemSelectionChanged() { - m_pButtonRemoveAlias->setEnabled(!m_pListAliases->selectedItems().isEmpty()); + m_pButtonRemoveAlias->setEnabled(!m_pListAliases->selectedItems().isEmpty()); } diff --git a/src/gui/src/ScreenSettingsDialog.h b/src/gui/src/ScreenSettingsDialog.h index aa470837..620acc84 100644 --- a/src/gui/src/ScreenSettingsDialog.h +++ b/src/gui/src/ScreenSettingsDialog.h @@ -31,22 +31,22 @@ class Screen; class ScreenSettingsDialog : public QDialog, public Ui::ScreenSettingsDialogBase { - Q_OBJECT + Q_OBJECT - public: - ScreenSettingsDialog(QWidget* parent, Screen* pScreen = NULL); + public: + ScreenSettingsDialog(QWidget* parent, Screen* pScreen = NULL); - public slots: - void accept(); + public slots: + void accept(); - private slots: - void on_m_pButtonAddAlias_clicked(); - void on_m_pButtonRemoveAlias_clicked(); - void on_m_pLineEditAlias_textChanged(const QString& text); - void on_m_pListAliases_itemSelectionChanged(); + private slots: + void on_m_pButtonAddAlias_clicked(); + void on_m_pButtonRemoveAlias_clicked(); + void on_m_pLineEditAlias_textChanged(const QString& text); + void on_m_pListAliases_itemSelectionChanged(); - private: - Screen* m_pScreen; + private: + Screen* m_pScreen; }; #endif diff --git a/src/gui/src/ScreenSetupModel.cpp b/src/gui/src/ScreenSetupModel.cpp index 919b0770..40e93c87 100644 --- a/src/gui/src/ScreenSetupModel.cpp +++ b/src/gui/src/ScreenSetupModel.cpp @@ -25,119 +25,119 @@ const QString ScreenSetupModel::m_MimeType = "application/x-qsynergy-screen"; ScreenSetupModel::ScreenSetupModel(ScreenList& screens, int numColumns, int numRows) : - QAbstractTableModel(NULL), - m_Screens(screens), - m_NumColumns(numColumns), - m_NumRows(numRows) + QAbstractTableModel(NULL), + m_Screens(screens), + m_NumColumns(numColumns), + m_NumRows(numRows) { - if (m_NumColumns * m_NumRows > screens.size()) - qFatal("Not enough elements (%u) in screens QList for %d columns and %d rows", screens.size(), m_NumColumns, m_NumRows); + if (m_NumColumns * m_NumRows > screens.size()) + qFatal("Not enough elements (%u) in screens QList for %d columns and %d rows", screens.size(), m_NumColumns, m_NumRows); } QVariant ScreenSetupModel::data(const QModelIndex& index, int role) const { - if (index.isValid() && index.row() < m_NumRows && index.column() < m_NumColumns) - { - switch(role) - { - case Qt::DecorationRole: - if (screen(index).isNull()) - break; - return QIcon(*screen(index).pixmap()); + if (index.isValid() && index.row() < m_NumRows && index.column() < m_NumColumns) + { + switch(role) + { + case Qt::DecorationRole: + if (screen(index).isNull()) + break; + return QIcon(*screen(index).pixmap()); - case Qt::ToolTipRole: - if (screen(index).isNull()) - break; - return QString(tr( - "
Screen: %1
" - "
Double click to edit settings" - "
Drag screen to the trashcan to remove it")).arg(screen(index).name()); + case Qt::ToolTipRole: + if (screen(index).isNull()) + break; + return QString(tr( + "
Screen: %1
" + "
Double click to edit settings" + "
Drag screen to the trashcan to remove it")).arg(screen(index).name()); - case Qt::DisplayRole: - if (screen(index).isNull()) - break; - return screen(index).name(); - } - } + case Qt::DisplayRole: + if (screen(index).isNull()) + break; + return screen(index).name(); + } + } - return QVariant(); + return QVariant(); } Qt::ItemFlags ScreenSetupModel::flags(const QModelIndex& index) const { - if (!index.isValid() || index.row() >= m_NumRows || index.column() >= m_NumColumns) - return 0; + if (!index.isValid() || index.row() >= m_NumRows || index.column() >= m_NumColumns) + return 0; - if (!screen(index).isNull()) - return Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled; + if (!screen(index).isNull()) + return Qt::ItemIsEnabled | Qt::ItemIsDragEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled; - return Qt::ItemIsDropEnabled; + return Qt::ItemIsDropEnabled; } Qt::DropActions ScreenSetupModel::supportedDropActions() const { - return Qt::MoveAction | Qt::CopyAction; + return Qt::MoveAction | Qt::CopyAction; } QStringList ScreenSetupModel::mimeTypes() const { - return QStringList() << m_MimeType; + return QStringList() << m_MimeType; } QMimeData* ScreenSetupModel::mimeData(const QModelIndexList& indexes) const { - QMimeData* pMimeData = new QMimeData(); - QByteArray encodedData; + QMimeData* pMimeData = new QMimeData(); + QByteArray encodedData; - QDataStream stream(&encodedData, QIODevice::WriteOnly); + QDataStream stream(&encodedData, QIODevice::WriteOnly); - foreach (const QModelIndex& index, indexes) - if (index.isValid()) - stream << index.column() << index.row() << screen(index); + foreach (const QModelIndex& index, indexes) + if (index.isValid()) + stream << index.column() << index.row() << screen(index); - pMimeData->setData(m_MimeType, encodedData); + pMimeData->setData(m_MimeType, encodedData); - return pMimeData; + return pMimeData; } bool ScreenSetupModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) { - if (action == Qt::IgnoreAction) - return true; + if (action == Qt::IgnoreAction) + return true; - if (!data->hasFormat(m_MimeType)) - return false; + if (!data->hasFormat(m_MimeType)) + return false; - if (!parent.isValid() || row != -1 || column != -1) - return false; + if (!parent.isValid() || row != -1 || column != -1) + return false; - QByteArray encodedData = data->data(m_MimeType); - QDataStream stream(&encodedData, QIODevice::ReadOnly); + QByteArray encodedData = data->data(m_MimeType); + QDataStream stream(&encodedData, QIODevice::ReadOnly); - int sourceColumn = -1; - int sourceRow = -1; + int sourceColumn = -1; + int sourceRow = -1; - stream >> sourceColumn; - stream >> sourceRow; + stream >> sourceColumn; + stream >> sourceRow; - // don't drop screen onto itself - if (sourceColumn == parent.column() && sourceRow == parent.row()) - return false; + // don't drop screen onto itself + if (sourceColumn == parent.column() && sourceRow == parent.row()) + return false; - Screen droppedScreen; - stream >> droppedScreen; + Screen droppedScreen; + stream >> droppedScreen; - Screen oldScreen = screen(parent.column(), parent.row()); - if (!oldScreen.isNull() && sourceColumn != -1 && sourceRow != -1) - { - // mark the screen so it isn't deleted after the dragndrop succeeded - // see ScreenSetupView::startDrag() - oldScreen.setSwapped(true); - screen(sourceColumn, sourceRow) = oldScreen; - } + Screen oldScreen = screen(parent.column(), parent.row()); + if (!oldScreen.isNull() && sourceColumn != -1 && sourceRow != -1) + { + // mark the screen so it isn't deleted after the dragndrop succeeded + // see ScreenSetupView::startDrag() + oldScreen.setSwapped(true); + screen(sourceColumn, sourceRow) = oldScreen; + } - screen(parent.column(), parent.row()) = droppedScreen; + screen(parent.column(), parent.row()) = droppedScreen; - return true; + return true; } diff --git a/src/gui/src/ScreenSetupModel.h b/src/gui/src/ScreenSetupModel.h index f8c9cabe..726c6ed8 100644 --- a/src/gui/src/ScreenSetupModel.h +++ b/src/gui/src/ScreenSetupModel.h @@ -32,39 +32,39 @@ class ServerConfigDialog; class ScreenSetupModel : public QAbstractTableModel { - Q_OBJECT + Q_OBJECT - friend class ScreenSetupView; - friend class ServerConfigDialog; + friend class ScreenSetupView; + friend class ServerConfigDialog; - public: - ScreenSetupModel(ScreenList& screens, int numColumns, int numRows); + public: + ScreenSetupModel(ScreenList& screens, int numColumns, int numRows); - public: - static const QString& mimeType() { return m_MimeType; } - QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; - int rowCount() const { return m_NumRows; } - int columnCount() const { return m_NumColumns; } - int rowCount(const QModelIndex&) const { return rowCount(); } - int columnCount(const QModelIndex&) const { return columnCount(); } - Qt::DropActions supportedDropActions() const; - Qt::ItemFlags flags(const QModelIndex& index) const; - QStringList mimeTypes() const; - QMimeData* mimeData(const QModelIndexList& indexes) const; + public: + static const QString& mimeType() { return m_MimeType; } + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + int rowCount() const { return m_NumRows; } + int columnCount() const { return m_NumColumns; } + int rowCount(const QModelIndex&) const { return rowCount(); } + int columnCount(const QModelIndex&) const { return columnCount(); } + Qt::DropActions supportedDropActions() const; + Qt::ItemFlags flags(const QModelIndex& index) const; + QStringList mimeTypes() const; + QMimeData* mimeData(const QModelIndexList& indexes) const; - protected: - bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); - const Screen& screen(const QModelIndex& index) const { return screen(index.column(), index.row()); } - Screen& screen(const QModelIndex& index) { return screen(index.column(), index.row()); } - const Screen& screen(int column, int row) const { return m_Screens[row * m_NumColumns + column]; } - Screen& screen(int column, int row) { return m_Screens[row * m_NumColumns + column]; } + protected: + bool dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); + const Screen& screen(const QModelIndex& index) const { return screen(index.column(), index.row()); } + Screen& screen(const QModelIndex& index) { return screen(index.column(), index.row()); } + const Screen& screen(int column, int row) const { return m_Screens[row * m_NumColumns + column]; } + Screen& screen(int column, int row) { return m_Screens[row * m_NumColumns + column]; } - private: - ScreenList& m_Screens; - const int m_NumColumns; - const int m_NumRows; + private: + ScreenList& m_Screens; + const int m_NumColumns; + const int m_NumRows; - static const QString m_MimeType; + static const QString m_MimeType; }; #endif diff --git a/src/gui/src/ScreenSetupView.cpp b/src/gui/src/ScreenSetupView.cpp index d86ab499..a06dc269 100644 --- a/src/gui/src/ScreenSetupView.cpp +++ b/src/gui/src/ScreenSetupView.cpp @@ -24,138 +24,138 @@ #include ScreenSetupView::ScreenSetupView(QWidget* parent) : - QTableView(parent) + QTableView(parent) { - setDropIndicatorShown(true); - setDragDropMode(DragDrop); - setSelectionMode(SingleSelection); + setDropIndicatorShown(true); + setDragDropMode(DragDrop); + setSelectionMode(SingleSelection); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setIconSize(QSize(64, 64)); - horizontalHeader()->hide(); - verticalHeader()->hide(); + setIconSize(QSize(64, 64)); + horizontalHeader()->hide(); + verticalHeader()->hide(); } void ScreenSetupView::setModel(ScreenSetupModel* model) { - QTableView::setModel(model); - setTableSize(); + QTableView::setModel(model); + setTableSize(); } ScreenSetupModel* ScreenSetupView::model() const { - return qobject_cast(QTableView::model()); + return qobject_cast(QTableView::model()); } void ScreenSetupView::setTableSize() { - for (int i = 0; i < model()->columnCount(); i++) - setColumnWidth(i, width() / model()->columnCount()); + for (int i = 0; i < model()->columnCount(); i++) + setColumnWidth(i, width() / model()->columnCount()); - for (int i = 0; i < model()->rowCount(); i++) - setRowHeight(i, height() / model()->rowCount()); + for (int i = 0; i < model()->rowCount(); i++) + setRowHeight(i, height() / model()->rowCount()); } void ScreenSetupView::resizeEvent(QResizeEvent* event) { - setTableSize(); - event->ignore(); + setTableSize(); + event->ignore(); } void ScreenSetupView::mouseDoubleClickEvent(QMouseEvent* event) { - if (event->buttons() & Qt::LeftButton) - { - int col = columnAt(event->pos().x()); - int row = rowAt(event->pos().y()); + if (event->buttons() & Qt::LeftButton) + { + int col = columnAt(event->pos().x()); + int row = rowAt(event->pos().y()); - if (!model()->screen(col, row).isNull()) - { - ScreenSettingsDialog dlg(this, &model()->screen(col, row)); - dlg.exec(); - } - } - else - event->ignore(); + if (!model()->screen(col, row).isNull()) + { + ScreenSettingsDialog dlg(this, &model()->screen(col, row)); + dlg.exec(); + } + } + else + event->ignore(); } void ScreenSetupView::dragEnterEvent(QDragEnterEvent* event) { - // we accept anything that enters us by a drag as long as the - // mime type is okay. anything else is dealt with in dragMoveEvent() - if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) - event->accept(); - else - event->ignore(); + // we accept anything that enters us by a drag as long as the + // mime type is okay. anything else is dealt with in dragMoveEvent() + if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) + event->accept(); + else + event->ignore(); } void ScreenSetupView::dragMoveEvent(QDragMoveEvent* event) { - if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) - { - // where does the event come from? myself or someone else? - if (event->source() == this) - { - // myself is ok, but then it must be a move action, never a copy - event->setDropAction(Qt::MoveAction); - event->accept(); - } - else - { - int col = columnAt(event->pos().x()); - int row = rowAt(event->pos().y()); + if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) + { + // where does the event come from? myself or someone else? + if (event->source() == this) + { + // myself is ok, but then it must be a move action, never a copy + event->setDropAction(Qt::MoveAction); + event->accept(); + } + else + { + int col = columnAt(event->pos().x()); + int row = rowAt(event->pos().y()); - // a drop from outside is not allowed if there's a screen already there. - if (!model()->screen(col, row).isNull()) - event->ignore(); - else - event->acceptProposedAction(); - } - } - else - event->ignore(); + // a drop from outside is not allowed if there's a screen already there. + if (!model()->screen(col, row).isNull()) + event->ignore(); + else + event->acceptProposedAction(); + } + } + else + event->ignore(); } // this is reimplemented from QAbstractItemView::startDrag() void ScreenSetupView::startDrag(Qt::DropActions) { - QModelIndexList indexes = selectedIndexes(); + QModelIndexList indexes = selectedIndexes(); - if (indexes.count() != 1) - return; + if (indexes.count() != 1) + return; - QMimeData* pData = model()->mimeData(indexes); - if (pData == NULL) - return; + QMimeData* pData = model()->mimeData(indexes); + if (pData == NULL) + return; - QPixmap pixmap = *model()->screen(indexes[0]).pixmap(); - QDrag* pDrag = new QDrag(this); - pDrag->setPixmap(pixmap); - pDrag->setMimeData(pData); - pDrag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2)); + QPixmap pixmap = *model()->screen(indexes[0]).pixmap(); + QDrag* pDrag = new QDrag(this); + pDrag->setPixmap(pixmap); + pDrag->setMimeData(pData); + pDrag->setHotSpot(QPoint(pixmap.width() / 2, pixmap.height() / 2)); - if (pDrag->exec(Qt::MoveAction, Qt::MoveAction) == Qt::MoveAction) - { - selectionModel()->clear(); + if (pDrag->exec(Qt::MoveAction, Qt::MoveAction) == Qt::MoveAction) + { + selectionModel()->clear(); - // make sure to only delete the drag source if screens weren't swapped - // see ScreenSetupModel::dropMimeData - if (!model()->screen(indexes[0]).swapped()) - model()->screen(indexes[0]) = Screen(); - else - model()->screen(indexes[0]).setSwapped(false); - } + // make sure to only delete the drag source if screens weren't swapped + // see ScreenSetupModel::dropMimeData + if (!model()->screen(indexes[0]).swapped()) + model()->screen(indexes[0]) = Screen(); + else + model()->screen(indexes[0]).setSwapped(false); + } } QStyleOptionViewItem ScreenSetupView::viewOptions() const { - QStyleOptionViewItem option = QTableView::viewOptions(); - option.showDecorationSelected = true; - option.decorationPosition = QStyleOptionViewItem::Top; - option.displayAlignment = Qt::AlignCenter; - option.textElideMode = Qt::ElideMiddle; - return option; + QStyleOptionViewItem option = QTableView::viewOptions(); + option.showDecorationSelected = true; + option.decorationPosition = QStyleOptionViewItem::Top; + option.displayAlignment = Qt::AlignCenter; + option.textElideMode = Qt::ElideMiddle; + return option; } diff --git a/src/gui/src/ScreenSetupView.h b/src/gui/src/ScreenSetupView.h index 9a515d39..a4f04923 100644 --- a/src/gui/src/ScreenSetupView.h +++ b/src/gui/src/ScreenSetupView.h @@ -33,24 +33,24 @@ class ScreenSetupModel; class ScreenSetupView : public QTableView { - Q_OBJECT + Q_OBJECT - public: - ScreenSetupView(QWidget* parent); + public: + ScreenSetupView(QWidget* parent); - public: - void setModel(ScreenSetupModel* model); - ScreenSetupModel* model() const; + public: + void setModel(ScreenSetupModel* model); + ScreenSetupModel* model() const; - protected: - void mouseDoubleClickEvent(QMouseEvent*); - void setTableSize(); - void resizeEvent(QResizeEvent*); - void dragEnterEvent(QDragEnterEvent* event); - void dragMoveEvent(QDragMoveEvent* event); - void startDrag(Qt::DropActions supportedActions); - QStyleOptionViewItem viewOptions() const; - void scrollTo(const QModelIndex&, ScrollHint) {} + protected: + void mouseDoubleClickEvent(QMouseEvent*); + void setTableSize(); + void resizeEvent(QResizeEvent*); + void dragEnterEvent(QDragEnterEvent* event); + void dragMoveEvent(QDragMoveEvent* event); + void startDrag(Qt::DropActions supportedActions); + QStyleOptionViewItem viewOptions() const; + void scrollTo(const QModelIndex&, ScrollHint) {} }; #endif diff --git a/src/gui/src/ServerConfig.cpp b/src/gui/src/ServerConfig.cpp index 0f2267a3..8ced4148 100644 --- a/src/gui/src/ServerConfig.cpp +++ b/src/gui/src/ServerConfig.cpp @@ -28,376 +28,376 @@ static const struct { - int x; - int y; - const char* name; + int x; + int y; + const char* name; } neighbourDirs[] = { - { 1, 0, "right" }, - { -1, 0, "left" }, - { 0, -1, "up" }, - { 0, 1, "down" }, + { 1, 0, "right" }, + { -1, 0, "left" }, + { 0, -1, "up" }, + { 0, 1, "down" }, }; const int serverDefaultIndex = 7; ServerConfig::ServerConfig(QSettings* settings, int numColumns, int numRows , - QString serverName, MainWindow* mainWindow) : - m_pSettings(settings), - m_Screens(), - m_NumColumns(numColumns), - m_NumRows(numRows), - m_ServerName(serverName), - m_IgnoreAutoConfigClient(false), - m_EnableDragAndDrop(false), - m_ClipboardSharing(true), - m_pMainWindow(mainWindow) + QString serverName, MainWindow* mainWindow) : + m_pSettings(settings), + m_Screens(), + m_NumColumns(numColumns), + m_NumRows(numRows), + m_ServerName(serverName), + m_IgnoreAutoConfigClient(false), + m_EnableDragAndDrop(false), + m_ClipboardSharing(true), + m_pMainWindow(mainWindow) { - Q_ASSERT(m_pSettings); + Q_ASSERT(m_pSettings); - loadSettings(); + loadSettings(); } ServerConfig::~ServerConfig() { - saveSettings(); + saveSettings(); } bool ServerConfig::save(const QString& fileName) const { - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) - return false; + QFile file(fileName); + if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) + return false; - save(file); - file.close(); + save(file); + file.close(); - return true; + return true; } void ServerConfig::save(QFile& file) const { - QTextStream outStream(&file); - outStream << *this; + QTextStream outStream(&file); + outStream << *this; } void ServerConfig::init() { - switchCorners().clear(); - screens().clear(); + switchCorners().clear(); + screens().clear(); - // m_NumSwitchCorners is used as a fixed size array. See Screen::init() - for (int i = 0; i < NumSwitchCorners; i++) - switchCorners() << false; + // m_NumSwitchCorners is used as a fixed size array. See Screen::init() + for (int i = 0; i < NumSwitchCorners; i++) + switchCorners() << false; - // There must always be screen objects for each cell in the screens QList. Unused screens - // are identified by having an empty name. - for (int i = 0; i < numColumns() * numRows(); i++) - addScreen(Screen()); + // There must always be screen objects for each cell in the screens QList. Unused screens + // are identified by having an empty name. + for (int i = 0; i < numColumns() * numRows(); i++) + addScreen(Screen()); } void ServerConfig::saveSettings() { - settings().beginGroup("internalConfig"); - settings().remove(""); + settings().beginGroup("internalConfig"); + settings().remove(""); - settings().setValue("numColumns", numColumns()); - settings().setValue("numRows", numRows()); + settings().setValue("numColumns", numColumns()); + settings().setValue("numRows", numRows()); - settings().setValue("hasHeartbeat", hasHeartbeat()); - settings().setValue("heartbeat", heartbeat()); - settings().setValue("relativeMouseMoves", relativeMouseMoves()); - settings().setValue("screenSaverSync", screenSaverSync()); - settings().setValue("win32KeepForeground", win32KeepForeground()); - settings().setValue("hasSwitchDelay", hasSwitchDelay()); - settings().setValue("switchDelay", switchDelay()); - settings().setValue("hasSwitchDoubleTap", hasSwitchDoubleTap()); - settings().setValue("switchDoubleTap", switchDoubleTap()); - settings().setValue("switchCornerSize", switchCornerSize()); - settings().setValue("ignoreAutoConfigClient", ignoreAutoConfigClient()); - settings().setValue("enableDragAndDrop", enableDragAndDrop()); + settings().setValue("hasHeartbeat", hasHeartbeat()); + settings().setValue("heartbeat", heartbeat()); + settings().setValue("relativeMouseMoves", relativeMouseMoves()); + settings().setValue("screenSaverSync", screenSaverSync()); + settings().setValue("win32KeepForeground", win32KeepForeground()); + settings().setValue("hasSwitchDelay", hasSwitchDelay()); + settings().setValue("switchDelay", switchDelay()); + settings().setValue("hasSwitchDoubleTap", hasSwitchDoubleTap()); + settings().setValue("switchDoubleTap", switchDoubleTap()); + settings().setValue("switchCornerSize", switchCornerSize()); + settings().setValue("ignoreAutoConfigClient", ignoreAutoConfigClient()); + settings().setValue("enableDragAndDrop", enableDragAndDrop()); - writeSettings(settings(), switchCorners(), "switchCorner"); + writeSettings(settings(), switchCorners(), "switchCorner"); - settings().beginWriteArray("screens"); - for (int i = 0; i < screens().size(); i++) - { - settings().setArrayIndex(i); - screens()[i].saveSettings(settings()); - } - settings().endArray(); + settings().beginWriteArray("screens"); + for (int i = 0; i < screens().size(); i++) + { + settings().setArrayIndex(i); + screens()[i].saveSettings(settings()); + } + settings().endArray(); - settings().beginWriteArray("hotkeys"); - for (int i = 0; i < hotkeys().size(); i++) - { - settings().setArrayIndex(i); - hotkeys()[i].saveSettings(settings()); - } - settings().endArray(); + settings().beginWriteArray("hotkeys"); + for (int i = 0; i < hotkeys().size(); i++) + { + settings().setArrayIndex(i); + hotkeys()[i].saveSettings(settings()); + } + settings().endArray(); - settings().endGroup(); + settings().endGroup(); } void ServerConfig::loadSettings() { - settings().beginGroup("internalConfig"); + settings().beginGroup("internalConfig"); - setNumColumns(settings().value("numColumns", 5).toInt()); - setNumRows(settings().value("numRows", 3).toInt()); + setNumColumns(settings().value("numColumns", 5).toInt()); + setNumRows(settings().value("numRows", 3).toInt()); - // we need to know the number of columns and rows before we can set up ourselves - init(); + // we need to know the number of columns and rows before we can set up ourselves + init(); - haveHeartbeat(settings().value("hasHeartbeat", false).toBool()); - setHeartbeat(settings().value("heartbeat", 5000).toInt()); - setRelativeMouseMoves(settings().value("relativeMouseMoves", false).toBool()); - setScreenSaverSync(settings().value("screenSaverSync", true).toBool()); - setWin32KeepForeground(settings().value("win32KeepForeground", false).toBool()); - haveSwitchDelay(settings().value("hasSwitchDelay", false).toBool()); - setSwitchDelay(settings().value("switchDelay", 250).toInt()); - haveSwitchDoubleTap(settings().value("hasSwitchDoubleTap", false).toBool()); - setSwitchDoubleTap(settings().value("switchDoubleTap", 250).toInt()); - setSwitchCornerSize(settings().value("switchCornerSize").toInt()); - setIgnoreAutoConfigClient(settings().value("ignoreAutoConfigClient").toBool()); - setEnableDragAndDrop(settings().value("enableDragAndDrop", true).toBool()); + haveHeartbeat(settings().value("hasHeartbeat", false).toBool()); + setHeartbeat(settings().value("heartbeat", 5000).toInt()); + setRelativeMouseMoves(settings().value("relativeMouseMoves", false).toBool()); + setScreenSaverSync(settings().value("screenSaverSync", true).toBool()); + setWin32KeepForeground(settings().value("win32KeepForeground", false).toBool()); + haveSwitchDelay(settings().value("hasSwitchDelay", false).toBool()); + setSwitchDelay(settings().value("switchDelay", 250).toInt()); + haveSwitchDoubleTap(settings().value("hasSwitchDoubleTap", false).toBool()); + setSwitchDoubleTap(settings().value("switchDoubleTap", 250).toInt()); + setSwitchCornerSize(settings().value("switchCornerSize").toInt()); + setIgnoreAutoConfigClient(settings().value("ignoreAutoConfigClient").toBool()); + setEnableDragAndDrop(settings().value("enableDragAndDrop", true).toBool()); - readSettings(settings(), switchCorners(), "switchCorner", false, NumSwitchCorners); + readSettings(settings(), switchCorners(), "switchCorner", false, NumSwitchCorners); - int numScreens = settings().beginReadArray("screens"); - Q_ASSERT(numScreens <= screens().size()); - for (int i = 0; i < numScreens; i++) - { - settings().setArrayIndex(i); - screens()[i].loadSettings(settings()); - } - settings().endArray(); + int numScreens = settings().beginReadArray("screens"); + Q_ASSERT(numScreens <= screens().size()); + for (int i = 0; i < numScreens; i++) + { + settings().setArrayIndex(i); + screens()[i].loadSettings(settings()); + } + settings().endArray(); - int numHotkeys = settings().beginReadArray("hotkeys"); - for (int i = 0; i < numHotkeys; i++) - { - settings().setArrayIndex(i); - Hotkey h; - h.loadSettings(settings()); - hotkeys().append(h); - } - settings().endArray(); + int numHotkeys = settings().beginReadArray("hotkeys"); + for (int i = 0; i < numHotkeys; i++) + { + settings().setArrayIndex(i); + Hotkey h; + h.loadSettings(settings()); + hotkeys().append(h); + } + settings().endArray(); - settings().endGroup(); + settings().endGroup(); } int ServerConfig::adjacentScreenIndex(int idx, int deltaColumn, int deltaRow) const { - if (screens()[idx].isNull()) - return -1; + if (screens()[idx].isNull()) + return -1; - // if we're at the left or right end of the table, don't find results going further left or right - if ((deltaColumn > 0 && (idx+1) % numColumns() == 0) - || (deltaColumn < 0 && idx % numColumns() == 0)) - return -1; + // if we're at the left or right end of the table, don't find results going further left or right + if ((deltaColumn > 0 && (idx+1) % numColumns() == 0) + || (deltaColumn < 0 && idx % numColumns() == 0)) + return -1; - int arrayPos = idx + deltaColumn + deltaRow * numColumns(); + int arrayPos = idx + deltaColumn + deltaRow * numColumns(); - if (arrayPos >= screens().size() || arrayPos < 0) - return -1; + if (arrayPos >= screens().size() || arrayPos < 0) + return -1; - return arrayPos; + return arrayPos; } QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config) { - outStream << "section: screens" << endl; + outStream << "section: screens" << endl; - foreach (const Screen& s, config.screens()) - if (!s.isNull()) - s.writeScreensSection(outStream); + foreach (const Screen& s, config.screens()) + if (!s.isNull()) + s.writeScreensSection(outStream); - outStream << "end" << endl << endl; + outStream << "end" << endl << endl; - outStream << "section: aliases" << endl; + outStream << "section: aliases" << endl; - foreach (const Screen& s, config.screens()) - if (!s.isNull()) - s.writeAliasesSection(outStream); + foreach (const Screen& s, config.screens()) + if (!s.isNull()) + s.writeAliasesSection(outStream); - outStream << "end" << endl << endl; + outStream << "end" << endl << endl; - outStream << "section: links" << endl; + outStream << "section: links" << endl; - for (int i = 0; i < config.screens().size(); i++) - if (!config.screens()[i].isNull()) - { - outStream << "\t" << config.screens()[i].name() << ":" << endl; + for (int i = 0; i < config.screens().size(); i++) + if (!config.screens()[i].isNull()) + { + outStream << "\t" << config.screens()[i].name() << ":" << endl; - for (unsigned int j = 0; j < sizeof(neighbourDirs) / sizeof(neighbourDirs[0]); j++) - { - int idx = config.adjacentScreenIndex(i, neighbourDirs[j].x, neighbourDirs[j].y); - if (idx != -1 && !config.screens()[idx].isNull()) - outStream << "\t\t" << neighbourDirs[j].name << " = " << config.screens()[idx].name() << endl; - } - } + for (unsigned int j = 0; j < sizeof(neighbourDirs) / sizeof(neighbourDirs[0]); j++) + { + int idx = config.adjacentScreenIndex(i, neighbourDirs[j].x, neighbourDirs[j].y); + if (idx != -1 && !config.screens()[idx].isNull()) + outStream << "\t\t" << neighbourDirs[j].name << " = " << config.screens()[idx].name() << endl; + } + } - outStream << "end" << endl << endl; + outStream << "end" << endl << endl; - outStream << "section: options" << endl; + outStream << "section: options" << endl; - if (config.hasHeartbeat()) - outStream << "\t" << "heartbeat = " << config.heartbeat() << endl; + if (config.hasHeartbeat()) + outStream << "\t" << "heartbeat = " << config.heartbeat() << endl; - outStream << "\t" << "relativeMouseMoves = " << (config.relativeMouseMoves() ? "true" : "false") << endl; - outStream << "\t" << "screenSaverSync = " << (config.screenSaverSync() ? "true" : "false") << endl; - outStream << "\t" << "win32KeepForeground = " << (config.win32KeepForeground() ? "true" : "false") << endl; - outStream << "\t" << "clipboardSharing = " << (config.clipboardSharing() ? "true" : "false") << endl; + outStream << "\t" << "relativeMouseMoves = " << (config.relativeMouseMoves() ? "true" : "false") << endl; + outStream << "\t" << "screenSaverSync = " << (config.screenSaverSync() ? "true" : "false") << endl; + outStream << "\t" << "win32KeepForeground = " << (config.win32KeepForeground() ? "true" : "false") << endl; + outStream << "\t" << "clipboardSharing = " << (config.clipboardSharing() ? "true" : "false") << endl; - if (config.hasSwitchDelay()) - outStream << "\t" << "switchDelay = " << config.switchDelay() << endl; + if (config.hasSwitchDelay()) + outStream << "\t" << "switchDelay = " << config.switchDelay() << endl; - if (config.hasSwitchDoubleTap()) - outStream << "\t" << "switchDoubleTap = " << config.switchDoubleTap() << endl; + if (config.hasSwitchDoubleTap()) + outStream << "\t" << "switchDoubleTap = " << config.switchDoubleTap() << endl; - outStream << "\t" << "switchCorners = none "; - for (int i = 0; i < config.switchCorners().size(); i++) - if (config.switchCorners()[i]) - outStream << "+" << config.switchCornerName(i) << " "; - outStream << endl; + outStream << "\t" << "switchCorners = none "; + for (int i = 0; i < config.switchCorners().size(); i++) + if (config.switchCorners()[i]) + outStream << "+" << config.switchCornerName(i) << " "; + outStream << endl; - outStream << "\t" << "switchCornerSize = " << config.switchCornerSize() << endl; + outStream << "\t" << "switchCornerSize = " << config.switchCornerSize() << endl; - foreach(const Hotkey& hotkey, config.hotkeys()) - outStream << hotkey; + foreach(const Hotkey& hotkey, config.hotkeys()) + outStream << hotkey; - outStream << "end" << endl << endl; + outStream << "end" << endl << endl; - return outStream; + return outStream; } int ServerConfig::numScreens() const { - int rval = 0; + int rval = 0; - foreach(const Screen& s, screens()) - if (!s.isNull()) - rval++; + foreach(const Screen& s, screens()) + if (!s.isNull()) + rval++; - return rval; + return rval; } int ServerConfig::autoAddScreen(const QString name) { - int serverIndex = -1; - int targetIndex = -1; - if (!findScreenName(m_ServerName, serverIndex)) { - if (!fixNoServer(m_ServerName, serverIndex)) { - return kAutoAddScreenManualServer; - } - } - if (findScreenName(name, targetIndex)) { - // already exists. - return kAutoAddScreenIgnore; - } + int serverIndex = -1; + int targetIndex = -1; + if (!findScreenName(m_ServerName, serverIndex)) { + if (!fixNoServer(m_ServerName, serverIndex)) { + return kAutoAddScreenManualServer; + } + } + if (findScreenName(name, targetIndex)) { + // already exists. + return kAutoAddScreenIgnore; + } - int result = showAddClientDialog(name); + int result = showAddClientDialog(name); - if (result == kAddClientIgnore) { - return kAutoAddScreenIgnore; - } + if (result == kAddClientIgnore) { + return kAutoAddScreenIgnore; + } - if (result == kAddClientOther) { - addToFirstEmptyGrid(name); - return kAutoAddScreenManualClient; - } + if (result == kAddClientOther) { + addToFirstEmptyGrid(name); + return kAutoAddScreenManualClient; + } - bool success = false; - int startIndex = serverIndex; - int offset = 1; - int dirIndex = 0; + bool success = false; + int startIndex = serverIndex; + int offset = 1; + int dirIndex = 0; - if (result == kAddClientLeft) { - offset = -1; - dirIndex = 1; - } - else if (result == kAddClientUp) { - offset = -5; - dirIndex = 2; - } - else if (result == kAddClientDown) { - offset = 5; - dirIndex = 3; - } + if (result == kAddClientLeft) { + offset = -1; + dirIndex = 1; + } + else if (result == kAddClientUp) { + offset = -5; + dirIndex = 2; + } + else if (result == kAddClientDown) { + offset = 5; + dirIndex = 3; + } - int idx = adjacentScreenIndex(startIndex, neighbourDirs[dirIndex].x, - neighbourDirs[dirIndex].y); - while (idx != -1) { - if (screens()[idx].isNull()) { - m_Screens[idx].setName(name); - success = true; - break; - } + int idx = adjacentScreenIndex(startIndex, neighbourDirs[dirIndex].x, + neighbourDirs[dirIndex].y); + while (idx != -1) { + if (screens()[idx].isNull()) { + m_Screens[idx].setName(name); + success = true; + break; + } - startIndex += offset; - idx = adjacentScreenIndex(startIndex, neighbourDirs[dirIndex].x, - neighbourDirs[dirIndex].y); - } + startIndex += offset; + idx = adjacentScreenIndex(startIndex, neighbourDirs[dirIndex].x, + neighbourDirs[dirIndex].y); + } - if (!success) { - addToFirstEmptyGrid(name); - return kAutoAddScreenManualClient; - } + if (!success) { + addToFirstEmptyGrid(name); + return kAutoAddScreenManualClient; + } - saveSettings(); - return kAutoAddScreenOk; + saveSettings(); + return kAutoAddScreenOk; } bool ServerConfig::findScreenName(const QString& name, int& index) { - bool found = false; - for (int i = 0; i < screens().size(); i++) { - if (!screens()[i].isNull() && - screens()[i].name().compare(name) == 0) { - index = i; - found = true; - break; - } - } - return found; + bool found = false; + for (int i = 0; i < screens().size(); i++) { + if (!screens()[i].isNull() && + screens()[i].name().compare(name) == 0) { + index = i; + found = true; + break; + } + } + return found; } bool ServerConfig::fixNoServer(const QString& name, int& index) { - bool fixed = false; - if (screens()[serverDefaultIndex].isNull()) { - m_Screens[serverDefaultIndex].setName(name); - index = serverDefaultIndex; - fixed = true; - } + bool fixed = false; + if (screens()[serverDefaultIndex].isNull()) { + m_Screens[serverDefaultIndex].setName(name); + index = serverDefaultIndex; + fixed = true; + } - return fixed; + return fixed; } int ServerConfig::showAddClientDialog(const QString& clientName) { - int result = kAddClientIgnore; + int result = kAddClientIgnore; - if (!m_pMainWindow->isActiveWindow()) { - m_pMainWindow->showNormal(); - m_pMainWindow->activateWindow(); - } + if (!m_pMainWindow->isActiveWindow()) { + m_pMainWindow->showNormal(); + m_pMainWindow->activateWindow(); + } - AddClientDialog addClientDialog(clientName, m_pMainWindow); - addClientDialog.exec(); - result = addClientDialog.addResult(); - m_IgnoreAutoConfigClient = addClientDialog.ignoreAutoConfigClient(); + AddClientDialog addClientDialog(clientName, m_pMainWindow); + addClientDialog.exec(); + result = addClientDialog.addResult(); + m_IgnoreAutoConfigClient = addClientDialog.ignoreAutoConfigClient(); - return result; + return result; } void::ServerConfig::addToFirstEmptyGrid(const QString &clientName) { - for (int i = 0; i < screens().size(); i++) { - if (screens()[i].isNull()) { - m_Screens[i].setName(clientName); - break; - } - } + for (int i = 0; i < screens().size(); i++) { + if (screens()[i].isNull()) { + m_Screens[i].setName(clientName); + break; + } + } } diff --git a/src/gui/src/ServerConfig.h b/src/gui/src/ServerConfig.h index 136c5f2b..e9b685c5 100644 --- a/src/gui/src/ServerConfig.h +++ b/src/gui/src/ServerConfig.h @@ -35,106 +35,106 @@ class MainWindow; class ServerConfig : public BaseConfig { - friend class ServerConfigDialog; - friend QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config); + friend class ServerConfigDialog; + friend QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config); - public: - ServerConfig(QSettings* settings, int numColumns, int numRows, - QString serverName, MainWindow* mainWindow); - ~ServerConfig(); + public: + ServerConfig(QSettings* settings, int numColumns, int numRows, + QString serverName, MainWindow* mainWindow); + ~ServerConfig(); - public: - const ScreenList& screens() const { return m_Screens; } - int numColumns() const { return m_NumColumns; } - int numRows() const { return m_NumRows; } - bool hasHeartbeat() const { return m_HasHeartbeat; } - int heartbeat() const { return m_Heartbeat; } - bool relativeMouseMoves() const { return m_RelativeMouseMoves; } - bool screenSaverSync() const { return m_ScreenSaverSync; } - bool win32KeepForeground() const { return m_Win32KeepForeground; } - bool hasSwitchDelay() const { return m_HasSwitchDelay; } - int switchDelay() const { return m_SwitchDelay; } - bool hasSwitchDoubleTap() const { return m_HasSwitchDoubleTap; } - int switchDoubleTap() const { return m_SwitchDoubleTap; } - bool switchCorner(int c) const { return m_SwitchCorners[c]; } - int switchCornerSize() const { return m_SwitchCornerSize; } - const QList& switchCorners() const { return m_SwitchCorners; } - const HotkeyList& hotkeys() const { return m_Hotkeys; } - bool ignoreAutoConfigClient() const { return m_IgnoreAutoConfigClient; } - bool enableDragAndDrop() const { return m_EnableDragAndDrop; } - bool clipboardSharing() const { return m_ClipboardSharing; } + public: + const ScreenList& screens() const { return m_Screens; } + int numColumns() const { return m_NumColumns; } + int numRows() const { return m_NumRows; } + bool hasHeartbeat() const { return m_HasHeartbeat; } + int heartbeat() const { return m_Heartbeat; } + bool relativeMouseMoves() const { return m_RelativeMouseMoves; } + bool screenSaverSync() const { return m_ScreenSaverSync; } + bool win32KeepForeground() const { return m_Win32KeepForeground; } + bool hasSwitchDelay() const { return m_HasSwitchDelay; } + int switchDelay() const { return m_SwitchDelay; } + bool hasSwitchDoubleTap() const { return m_HasSwitchDoubleTap; } + int switchDoubleTap() const { return m_SwitchDoubleTap; } + bool switchCorner(int c) const { return m_SwitchCorners[c]; } + int switchCornerSize() const { return m_SwitchCornerSize; } + const QList& switchCorners() const { return m_SwitchCorners; } + const HotkeyList& hotkeys() const { return m_Hotkeys; } + bool ignoreAutoConfigClient() const { return m_IgnoreAutoConfigClient; } + bool enableDragAndDrop() const { return m_EnableDragAndDrop; } + bool clipboardSharing() const { return m_ClipboardSharing; } - void saveSettings(); - void loadSettings(); - bool save(const QString& fileName) const; - void save(QFile& file) const; - int numScreens() const; - int autoAddScreen(const QString name); + void saveSettings(); + void loadSettings(); + bool save(const QString& fileName) const; + void save(QFile& file) const; + int numScreens() const; + int autoAddScreen(const QString name); - protected: - QSettings& settings() { return *m_pSettings; } - ScreenList& screens() { return m_Screens; } - void setScreens(const ScreenList& screens) { m_Screens = screens; } - void addScreen(const Screen& screen) { m_Screens.append(screen); } - void setNumColumns(int n) { m_NumColumns = n; } - void setNumRows(int n) { m_NumRows = n; } - void haveHeartbeat(bool on) { m_HasHeartbeat = on; } - void setHeartbeat(int val) { m_Heartbeat = val; } - void setRelativeMouseMoves(bool on) { m_RelativeMouseMoves = on; } - void setScreenSaverSync(bool on) { m_ScreenSaverSync = on; } - void setWin32KeepForeground(bool on) { m_Win32KeepForeground = on; } - void haveSwitchDelay(bool on) { m_HasSwitchDelay = on; } - void setSwitchDelay(int val) { m_SwitchDelay = val; } - void haveSwitchDoubleTap(bool on) { m_HasSwitchDoubleTap = on; } - void setSwitchDoubleTap(int val) { m_SwitchDoubleTap = val; } - void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; } - void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; } - void setIgnoreAutoConfigClient(bool on) { m_IgnoreAutoConfigClient = on; } - void setEnableDragAndDrop(bool on) { m_EnableDragAndDrop = on; } - void setClipboardSharing(bool on) { m_ClipboardSharing = on; } - QList& switchCorners() { return m_SwitchCorners; } - HotkeyList& hotkeys() { return m_Hotkeys; } + protected: + QSettings& settings() { return *m_pSettings; } + ScreenList& screens() { return m_Screens; } + void setScreens(const ScreenList& screens) { m_Screens = screens; } + void addScreen(const Screen& screen) { m_Screens.append(screen); } + void setNumColumns(int n) { m_NumColumns = n; } + void setNumRows(int n) { m_NumRows = n; } + void haveHeartbeat(bool on) { m_HasHeartbeat = on; } + void setHeartbeat(int val) { m_Heartbeat = val; } + void setRelativeMouseMoves(bool on) { m_RelativeMouseMoves = on; } + void setScreenSaverSync(bool on) { m_ScreenSaverSync = on; } + void setWin32KeepForeground(bool on) { m_Win32KeepForeground = on; } + void haveSwitchDelay(bool on) { m_HasSwitchDelay = on; } + void setSwitchDelay(int val) { m_SwitchDelay = val; } + void haveSwitchDoubleTap(bool on) { m_HasSwitchDoubleTap = on; } + void setSwitchDoubleTap(int val) { m_SwitchDoubleTap = val; } + void setSwitchCorner(int c, bool on) { m_SwitchCorners[c] = on; } + void setSwitchCornerSize(int val) { m_SwitchCornerSize = val; } + void setIgnoreAutoConfigClient(bool on) { m_IgnoreAutoConfigClient = on; } + void setEnableDragAndDrop(bool on) { m_EnableDragAndDrop = on; } + void setClipboardSharing(bool on) { m_ClipboardSharing = on; } + QList& switchCorners() { return m_SwitchCorners; } + HotkeyList& hotkeys() { return m_Hotkeys; } - void init(); - int adjacentScreenIndex(int idx, int deltaColumn, int deltaRow) const; + void init(); + int adjacentScreenIndex(int idx, int deltaColumn, int deltaRow) const; - private: - bool findScreenName(const QString& name, int& index); - bool fixNoServer(const QString& name, int& index); - int showAddClientDialog(const QString& clientName); - void addToFirstEmptyGrid(const QString& clientName); + private: + bool findScreenName(const QString& name, int& index); + bool fixNoServer(const QString& name, int& index); + int showAddClientDialog(const QString& clientName); + void addToFirstEmptyGrid(const QString& clientName); - private: - QSettings* m_pSettings; - ScreenList m_Screens; - int m_NumColumns; - int m_NumRows; - bool m_HasHeartbeat; - int m_Heartbeat; - bool m_RelativeMouseMoves; - bool m_ScreenSaverSync; - bool m_Win32KeepForeground; - bool m_HasSwitchDelay; - int m_SwitchDelay; - bool m_HasSwitchDoubleTap; - int m_SwitchDoubleTap; - int m_SwitchCornerSize; - QList m_SwitchCorners; - HotkeyList m_Hotkeys; - QString m_ServerName; - bool m_IgnoreAutoConfigClient; - bool m_EnableDragAndDrop; - bool m_ClipboardSharing; - MainWindow* m_pMainWindow; + private: + QSettings* m_pSettings; + ScreenList m_Screens; + int m_NumColumns; + int m_NumRows; + bool m_HasHeartbeat; + int m_Heartbeat; + bool m_RelativeMouseMoves; + bool m_ScreenSaverSync; + bool m_Win32KeepForeground; + bool m_HasSwitchDelay; + int m_SwitchDelay; + bool m_HasSwitchDoubleTap; + int m_SwitchDoubleTap; + int m_SwitchCornerSize; + QList m_SwitchCorners; + HotkeyList m_Hotkeys; + QString m_ServerName; + bool m_IgnoreAutoConfigClient; + bool m_EnableDragAndDrop; + bool m_ClipboardSharing; + MainWindow* m_pMainWindow; }; QTextStream& operator<<(QTextStream& outStream, const ServerConfig& config); enum { - kAutoAddScreenOk, - kAutoAddScreenManualServer, - kAutoAddScreenManualClient, - kAutoAddScreenIgnore + kAutoAddScreenOk, + kAutoAddScreenManualServer, + kAutoAddScreenManualClient, + kAutoAddScreenIgnore }; #endif diff --git a/src/gui/src/ServerConfigDialog.cpp b/src/gui/src/ServerConfigDialog.cpp index c6691286..6fc10248 100644 --- a/src/gui/src/ServerConfigDialog.cpp +++ b/src/gui/src/ServerConfigDialog.cpp @@ -26,194 +26,194 @@ #include ServerConfigDialog::ServerConfigDialog(QWidget* parent, ServerConfig& config, const QString& defaultScreenName) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::ServerConfigDialogBase(), - m_OrigServerConfig(config), - m_ServerConfig(config), - m_ScreenSetupModel(serverConfig().screens(), serverConfig().numColumns(), serverConfig().numRows()), - m_Message("") + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::ServerConfigDialogBase(), + m_OrigServerConfig(config), + m_ServerConfig(config), + m_ScreenSetupModel(serverConfig().screens(), serverConfig().numColumns(), serverConfig().numRows()), + m_Message("") { - setupUi(this); + setupUi(this); - m_pCheckBoxHeartbeat->setChecked(serverConfig().hasHeartbeat()); - m_pSpinBoxHeartbeat->setValue(serverConfig().heartbeat()); + m_pCheckBoxHeartbeat->setChecked(serverConfig().hasHeartbeat()); + m_pSpinBoxHeartbeat->setValue(serverConfig().heartbeat()); - m_pCheckBoxRelativeMouseMoves->setChecked(serverConfig().relativeMouseMoves()); - m_pCheckBoxScreenSaverSync->setChecked(serverConfig().screenSaverSync()); - m_pCheckBoxWin32KeepForeground->setChecked(serverConfig().win32KeepForeground()); + m_pCheckBoxRelativeMouseMoves->setChecked(serverConfig().relativeMouseMoves()); + m_pCheckBoxScreenSaverSync->setChecked(serverConfig().screenSaverSync()); + m_pCheckBoxWin32KeepForeground->setChecked(serverConfig().win32KeepForeground()); - m_pCheckBoxSwitchDelay->setChecked(serverConfig().hasSwitchDelay()); - m_pSpinBoxSwitchDelay->setValue(serverConfig().switchDelay()); + m_pCheckBoxSwitchDelay->setChecked(serverConfig().hasSwitchDelay()); + m_pSpinBoxSwitchDelay->setValue(serverConfig().switchDelay()); - m_pCheckBoxSwitchDoubleTap->setChecked(serverConfig().hasSwitchDoubleTap()); - m_pSpinBoxSwitchDoubleTap->setValue(serverConfig().switchDoubleTap()); + m_pCheckBoxSwitchDoubleTap->setChecked(serverConfig().hasSwitchDoubleTap()); + m_pSpinBoxSwitchDoubleTap->setValue(serverConfig().switchDoubleTap()); - m_pCheckBoxCornerTopLeft->setChecked(serverConfig().switchCorner(BaseConfig::TopLeft)); - m_pCheckBoxCornerTopRight->setChecked(serverConfig().switchCorner(BaseConfig::TopRight)); - m_pCheckBoxCornerBottomLeft->setChecked(serverConfig().switchCorner(BaseConfig::BottomLeft)); - m_pCheckBoxCornerBottomRight->setChecked(serverConfig().switchCorner(BaseConfig::BottomRight)); - m_pSpinBoxSwitchCornerSize->setValue(serverConfig().switchCornerSize()); + m_pCheckBoxCornerTopLeft->setChecked(serverConfig().switchCorner(BaseConfig::TopLeft)); + m_pCheckBoxCornerTopRight->setChecked(serverConfig().switchCorner(BaseConfig::TopRight)); + m_pCheckBoxCornerBottomLeft->setChecked(serverConfig().switchCorner(BaseConfig::BottomLeft)); + m_pCheckBoxCornerBottomRight->setChecked(serverConfig().switchCorner(BaseConfig::BottomRight)); + m_pSpinBoxSwitchCornerSize->setValue(serverConfig().switchCornerSize()); - m_pCheckBoxIgnoreAutoConfigClient->setChecked(serverConfig().ignoreAutoConfigClient()); + m_pCheckBoxIgnoreAutoConfigClient->setChecked(serverConfig().ignoreAutoConfigClient()); - m_pCheckBoxEnableDragAndDrop->setChecked(serverConfig().enableDragAndDrop()); + m_pCheckBoxEnableDragAndDrop->setChecked(serverConfig().enableDragAndDrop()); - m_pCheckBoxEnableClipboard->setChecked(serverConfig().clipboardSharing()); + m_pCheckBoxEnableClipboard->setChecked(serverConfig().clipboardSharing()); - foreach(const Hotkey& hotkey, serverConfig().hotkeys()) - m_pListHotkeys->addItem(hotkey.text()); + foreach(const Hotkey& hotkey, serverConfig().hotkeys()) + m_pListHotkeys->addItem(hotkey.text()); - m_pScreenSetupView->setModel(&m_ScreenSetupModel); + m_pScreenSetupView->setModel(&m_ScreenSetupModel); - if (serverConfig().numScreens() == 0) - model().screen(serverConfig().numColumns() / 2, serverConfig().numRows() / 2) = Screen(defaultScreenName); + if (serverConfig().numScreens() == 0) + model().screen(serverConfig().numColumns() / 2, serverConfig().numRows() / 2) = Screen(defaultScreenName); } void ServerConfigDialog::showEvent(QShowEvent* event) { - QDialog::show(); + QDialog::show(); - if (!m_Message.isEmpty()) - { - // TODO: ideally this massage box should pop up after the dialog is shown - QMessageBox::information(this, tr("Configure server"), m_Message); - } + if (!m_Message.isEmpty()) + { + // TODO: ideally this massage box should pop up after the dialog is shown + QMessageBox::information(this, tr("Configure server"), m_Message); + } } void ServerConfigDialog::accept() { - serverConfig().haveHeartbeat(m_pCheckBoxHeartbeat->isChecked()); - serverConfig().setHeartbeat(m_pSpinBoxHeartbeat->value()); + serverConfig().haveHeartbeat(m_pCheckBoxHeartbeat->isChecked()); + serverConfig().setHeartbeat(m_pSpinBoxHeartbeat->value()); - serverConfig().setRelativeMouseMoves(m_pCheckBoxRelativeMouseMoves->isChecked()); - serverConfig().setScreenSaverSync(m_pCheckBoxScreenSaverSync->isChecked()); - serverConfig().setWin32KeepForeground(m_pCheckBoxWin32KeepForeground->isChecked()); + serverConfig().setRelativeMouseMoves(m_pCheckBoxRelativeMouseMoves->isChecked()); + serverConfig().setScreenSaverSync(m_pCheckBoxScreenSaverSync->isChecked()); + serverConfig().setWin32KeepForeground(m_pCheckBoxWin32KeepForeground->isChecked()); - serverConfig().haveSwitchDelay(m_pCheckBoxSwitchDelay->isChecked()); - serverConfig().setSwitchDelay(m_pSpinBoxSwitchDelay->value()); + serverConfig().haveSwitchDelay(m_pCheckBoxSwitchDelay->isChecked()); + serverConfig().setSwitchDelay(m_pSpinBoxSwitchDelay->value()); - serverConfig().haveSwitchDoubleTap(m_pCheckBoxSwitchDoubleTap->isChecked()); - serverConfig().setSwitchDoubleTap(m_pSpinBoxSwitchDoubleTap->value()); + serverConfig().haveSwitchDoubleTap(m_pCheckBoxSwitchDoubleTap->isChecked()); + serverConfig().setSwitchDoubleTap(m_pSpinBoxSwitchDoubleTap->value()); - serverConfig().setSwitchCorner(BaseConfig::TopLeft, m_pCheckBoxCornerTopLeft->isChecked()); - serverConfig().setSwitchCorner(BaseConfig::TopRight, m_pCheckBoxCornerTopRight->isChecked()); - serverConfig().setSwitchCorner(BaseConfig::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked()); - serverConfig().setSwitchCorner(BaseConfig::BottomRight, m_pCheckBoxCornerBottomRight->isChecked()); - serverConfig().setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value()); - serverConfig().setIgnoreAutoConfigClient(m_pCheckBoxIgnoreAutoConfigClient->isChecked()); - serverConfig().setEnableDragAndDrop(m_pCheckBoxEnableDragAndDrop->isChecked()); - serverConfig().setClipboardSharing(m_pCheckBoxEnableClipboard->isChecked()); + serverConfig().setSwitchCorner(BaseConfig::TopLeft, m_pCheckBoxCornerTopLeft->isChecked()); + serverConfig().setSwitchCorner(BaseConfig::TopRight, m_pCheckBoxCornerTopRight->isChecked()); + serverConfig().setSwitchCorner(BaseConfig::BottomLeft, m_pCheckBoxCornerBottomLeft->isChecked()); + serverConfig().setSwitchCorner(BaseConfig::BottomRight, m_pCheckBoxCornerBottomRight->isChecked()); + serverConfig().setSwitchCornerSize(m_pSpinBoxSwitchCornerSize->value()); + serverConfig().setIgnoreAutoConfigClient(m_pCheckBoxIgnoreAutoConfigClient->isChecked()); + serverConfig().setEnableDragAndDrop(m_pCheckBoxEnableDragAndDrop->isChecked()); + serverConfig().setClipboardSharing(m_pCheckBoxEnableClipboard->isChecked()); - // now that the dialog has been accepted, copy the new server config to the original one, - // which is a reference to the one in MainWindow. - setOrigServerConfig(serverConfig()); + // now that the dialog has been accepted, copy the new server config to the original one, + // which is a reference to the one in MainWindow. + setOrigServerConfig(serverConfig()); - QDialog::accept(); + QDialog::accept(); } void ServerConfigDialog::on_m_pButtonNewHotkey_clicked() { - Hotkey hotkey; - HotkeyDialog dlg(this, hotkey); - if (dlg.exec() == QDialog::Accepted) - { - serverConfig().hotkeys().append(hotkey); - m_pListHotkeys->addItem(hotkey.text()); - } + Hotkey hotkey; + HotkeyDialog dlg(this, hotkey); + if (dlg.exec() == QDialog::Accepted) + { + serverConfig().hotkeys().append(hotkey); + m_pListHotkeys->addItem(hotkey.text()); + } } void ServerConfigDialog::on_m_pButtonEditHotkey_clicked() { - int idx = m_pListHotkeys->currentRow(); - Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); - Hotkey& hotkey = serverConfig().hotkeys()[idx]; - HotkeyDialog dlg(this, hotkey); - if (dlg.exec() == QDialog::Accepted) - m_pListHotkeys->currentItem()->setText(hotkey.text()); + int idx = m_pListHotkeys->currentRow(); + Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); + Hotkey& hotkey = serverConfig().hotkeys()[idx]; + HotkeyDialog dlg(this, hotkey); + if (dlg.exec() == QDialog::Accepted) + m_pListHotkeys->currentItem()->setText(hotkey.text()); } void ServerConfigDialog::on_m_pButtonRemoveHotkey_clicked() { - int idx = m_pListHotkeys->currentRow(); - Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); - serverConfig().hotkeys().removeAt(idx); - m_pListActions->clear(); - delete m_pListHotkeys->item(idx); + int idx = m_pListHotkeys->currentRow(); + Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); + serverConfig().hotkeys().removeAt(idx); + m_pListActions->clear(); + delete m_pListHotkeys->item(idx); } void ServerConfigDialog::on_m_pListHotkeys_itemSelectionChanged() { - bool itemsSelected = !m_pListHotkeys->selectedItems().isEmpty(); - m_pButtonEditHotkey->setEnabled(itemsSelected); - m_pButtonRemoveHotkey->setEnabled(itemsSelected); - m_pButtonNewAction->setEnabled(itemsSelected); + bool itemsSelected = !m_pListHotkeys->selectedItems().isEmpty(); + m_pButtonEditHotkey->setEnabled(itemsSelected); + m_pButtonRemoveHotkey->setEnabled(itemsSelected); + m_pButtonNewAction->setEnabled(itemsSelected); - if (itemsSelected && serverConfig().hotkeys().size() > 0) - { - m_pListActions->clear(); + if (itemsSelected && serverConfig().hotkeys().size() > 0) + { + m_pListActions->clear(); - int idx = m_pListHotkeys->row(m_pListHotkeys->selectedItems()[0]); + int idx = m_pListHotkeys->row(m_pListHotkeys->selectedItems()[0]); - // There's a bug somewhere around here: We get idx == 1 right after we deleted the next to last item, so idx can - // only possibly be 0. GDB shows we got called indirectly from the delete line in - // on_m_pButtonRemoveHotkey_clicked() above, but the delete is of course necessary and seems correct. - // The while() is a generalized workaround for all that and shouldn't be required. - while (idx >= 0 && idx >= serverConfig().hotkeys().size()) - idx--; + // There's a bug somewhere around here: We get idx == 1 right after we deleted the next to last item, so idx can + // only possibly be 0. GDB shows we got called indirectly from the delete line in + // on_m_pButtonRemoveHotkey_clicked() above, but the delete is of course necessary and seems correct. + // The while() is a generalized workaround for all that and shouldn't be required. + while (idx >= 0 && idx >= serverConfig().hotkeys().size()) + idx--; - Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); + Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); - const Hotkey& hotkey = serverConfig().hotkeys()[idx]; - foreach(const Action& action, hotkey.actions()) - m_pListActions->addItem(action.text()); - } + const Hotkey& hotkey = serverConfig().hotkeys()[idx]; + foreach(const Action& action, hotkey.actions()) + m_pListActions->addItem(action.text()); + } } void ServerConfigDialog::on_m_pButtonNewAction_clicked() { - int idx = m_pListHotkeys->currentRow(); - Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); - Hotkey& hotkey = serverConfig().hotkeys()[idx]; + int idx = m_pListHotkeys->currentRow(); + Q_ASSERT(idx >= 0 && idx < serverConfig().hotkeys().size()); + Hotkey& hotkey = serverConfig().hotkeys()[idx]; - Action action; - ActionDialog dlg(this, serverConfig(), hotkey, action); - if (dlg.exec() == QDialog::Accepted) - { - hotkey.actions().append(action); - m_pListActions->addItem(action.text()); - } + Action action; + ActionDialog dlg(this, serverConfig(), hotkey, action); + if (dlg.exec() == QDialog::Accepted) + { + hotkey.actions().append(action); + m_pListActions->addItem(action.text()); + } } void ServerConfigDialog::on_m_pButtonEditAction_clicked() { - int idxHotkey = m_pListHotkeys->currentRow(); - Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size()); - Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey]; + int idxHotkey = m_pListHotkeys->currentRow(); + Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size()); + Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey]; - int idxAction = m_pListActions->currentRow(); - Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size()); - Action& action = hotkey.actions()[idxAction]; + int idxAction = m_pListActions->currentRow(); + Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size()); + Action& action = hotkey.actions()[idxAction]; - ActionDialog dlg(this, serverConfig(), hotkey, action); - if (dlg.exec() == QDialog::Accepted) - m_pListActions->currentItem()->setText(action.text()); + ActionDialog dlg(this, serverConfig(), hotkey, action); + if (dlg.exec() == QDialog::Accepted) + m_pListActions->currentItem()->setText(action.text()); } void ServerConfigDialog::on_m_pButtonRemoveAction_clicked() { - int idxHotkey = m_pListHotkeys->currentRow(); - Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size()); - Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey]; + int idxHotkey = m_pListHotkeys->currentRow(); + Q_ASSERT(idxHotkey >= 0 && idxHotkey < serverConfig().hotkeys().size()); + Hotkey& hotkey = serverConfig().hotkeys()[idxHotkey]; - int idxAction = m_pListActions->currentRow(); - Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size()); + int idxAction = m_pListActions->currentRow(); + Q_ASSERT(idxAction >= 0 && idxAction < hotkey.actions().size()); - hotkey.actions().removeAt(idxAction); - delete m_pListActions->currentItem(); + hotkey.actions().removeAt(idxAction); + delete m_pListActions->currentItem(); } void ServerConfigDialog::on_m_pListActions_itemSelectionChanged() { - m_pButtonEditAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); - m_pButtonRemoveAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); + m_pButtonEditAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); + m_pButtonRemoveAction->setEnabled(!m_pListActions->selectedItems().isEmpty()); } diff --git a/src/gui/src/ServerConfigDialog.h b/src/gui/src/ServerConfigDialog.h index b0e224db..37543bda 100644 --- a/src/gui/src/ServerConfigDialog.h +++ b/src/gui/src/ServerConfigDialog.h @@ -29,37 +29,37 @@ class ServerConfigDialog : public QDialog, public Ui::ServerConfigDialogBase { - Q_OBJECT + Q_OBJECT - public: - ServerConfigDialog(QWidget* parent, ServerConfig& config, const QString& defaultScreenName); + public: + ServerConfigDialog(QWidget* parent, ServerConfig& config, const QString& defaultScreenName); - public slots: - void accept(); - void showEvent(QShowEvent* event); - void message(const QString& message) { m_Message = message; } + public slots: + void accept(); + void showEvent(QShowEvent* event); + void message(const QString& message) { m_Message = message; } - protected slots: - void on_m_pButtonNewHotkey_clicked(); - void on_m_pListHotkeys_itemSelectionChanged(); - void on_m_pButtonEditHotkey_clicked(); - void on_m_pButtonRemoveHotkey_clicked(); + protected slots: + void on_m_pButtonNewHotkey_clicked(); + void on_m_pListHotkeys_itemSelectionChanged(); + void on_m_pButtonEditHotkey_clicked(); + void on_m_pButtonRemoveHotkey_clicked(); - void on_m_pButtonNewAction_clicked(); - void on_m_pListActions_itemSelectionChanged(); - void on_m_pButtonEditAction_clicked(); - void on_m_pButtonRemoveAction_clicked(); + void on_m_pButtonNewAction_clicked(); + void on_m_pListActions_itemSelectionChanged(); + void on_m_pButtonEditAction_clicked(); + void on_m_pButtonRemoveAction_clicked(); - protected: - ServerConfig& serverConfig() { return m_ServerConfig; } - void setOrigServerConfig(const ServerConfig& s) { m_OrigServerConfig = s; } - ScreenSetupModel& model() { return m_ScreenSetupModel; } + protected: + ServerConfig& serverConfig() { return m_ServerConfig; } + void setOrigServerConfig(const ServerConfig& s) { m_OrigServerConfig = s; } + ScreenSetupModel& model() { return m_ScreenSetupModel; } - private: - ServerConfig& m_OrigServerConfig; - ServerConfig m_ServerConfig; - ScreenSetupModel m_ScreenSetupModel; - QString m_Message; + private: + ServerConfig& m_OrigServerConfig; + ServerConfig m_ServerConfig; + ScreenSetupModel m_ScreenSetupModel; + QString m_Message; }; #endif diff --git a/src/gui/src/SettingsDialog.cpp b/src/gui/src/SettingsDialog.cpp index c8ecdc13..9ed7a0d3 100644 --- a/src/gui/src/SettingsDialog.cpp +++ b/src/gui/src/SettingsDialog.cpp @@ -36,120 +36,120 @@ static const char networkSecurity[] = "ns"; SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) : - QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), - Ui::SettingsDialogBase(), + QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), + Ui::SettingsDialogBase(), m_appConfig(config) { - setupUi(this); + setupUi(this); - m_Locale.fillLanguageComboBox(m_pComboLanguage); + m_Locale.fillLanguageComboBox(m_pComboLanguage); - m_pLineEditScreenName->setText(appConfig().screenName()); - m_pSpinBoxPort->setValue(appConfig().port()); - m_pLineEditInterface->setText(appConfig().networkInterface()); - m_pComboLogLevel->setCurrentIndex(appConfig().logLevel()); - m_pCheckBoxLogToFile->setChecked(appConfig().logToFile()); - m_pLineEditLogFilename->setText(appConfig().logFilename()); - setIndexFromItemData(m_pComboLanguage, appConfig().language()); - m_pCheckBoxAutoHide->setChecked(appConfig().getAutoHide()); + m_pLineEditScreenName->setText(appConfig().screenName()); + m_pSpinBoxPort->setValue(appConfig().port()); + m_pLineEditInterface->setText(appConfig().networkInterface()); + m_pComboLogLevel->setCurrentIndex(appConfig().logLevel()); + m_pCheckBoxLogToFile->setChecked(appConfig().logToFile()); + m_pLineEditLogFilename->setText(appConfig().logFilename()); + setIndexFromItemData(m_pComboLanguage, appConfig().language()); + m_pCheckBoxAutoHide->setChecked(appConfig().getAutoHide()); #if defined(Q_OS_WIN) m_pComboElevate->setCurrentIndex(static_cast(appConfig().elevateMode())); - m_pCheckBoxAutoHide->hide(); + m_pCheckBoxAutoHide->hide(); #else - // elevate checkbox is only useful on ms windows. - m_pLabelElevate->hide(); - m_pComboElevate->hide(); + // elevate checkbox is only useful on ms windows. + m_pLabelElevate->hide(); + m_pComboElevate->hide(); #endif - m_pCheckBoxEnableCrypto->setChecked(m_appConfig.getCryptoEnabled()); - m_pCheckBoxEnableCrypto->setEnabled(m_appConfig.edition() == kPro); + m_pCheckBoxEnableCrypto->setChecked(m_appConfig.getCryptoEnabled()); + m_pCheckBoxEnableCrypto->setEnabled(m_appConfig.edition() == kPro); } void SettingsDialog::accept() { - appConfig().setScreenName(m_pLineEditScreenName->text()); - appConfig().setPort(m_pSpinBoxPort->value()); - appConfig().setNetworkInterface(m_pLineEditInterface->text()); - appConfig().setLogLevel(m_pComboLogLevel->currentIndex()); - appConfig().setLogToFile(m_pCheckBoxLogToFile->isChecked()); - appConfig().setLogFilename(m_pLineEditLogFilename->text()); - appConfig().setLanguage(m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()); + appConfig().setScreenName(m_pLineEditScreenName->text()); + appConfig().setPort(m_pSpinBoxPort->value()); + appConfig().setNetworkInterface(m_pLineEditInterface->text()); + appConfig().setLogLevel(m_pComboLogLevel->currentIndex()); + appConfig().setLogToFile(m_pCheckBoxLogToFile->isChecked()); + appConfig().setLogFilename(m_pLineEditLogFilename->text()); + appConfig().setLanguage(m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()); appConfig().setElevateMode(static_cast(m_pComboElevate->currentIndex())); - appConfig().setAutoHide(m_pCheckBoxAutoHide->isChecked()); - appConfig().saveSettings(); - QDialog::accept(); + appConfig().setAutoHide(m_pCheckBoxAutoHide->isChecked()); + appConfig().saveSettings(); + QDialog::accept(); } void SettingsDialog::reject() { - if (appConfig().language() != m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()) { - QSynergyApplication::getInstance()->switchTranslator(appConfig().language()); - } + if (appConfig().language() != m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()) { + QSynergyApplication::getInstance()->switchTranslator(appConfig().language()); + } - QDialog::reject(); + QDialog::reject(); } void SettingsDialog::changeEvent(QEvent* event) { - if (event != 0) - { - switch (event->type()) - { - case QEvent::LanguageChange: - { - int logLevelIndex = m_pComboLogLevel->currentIndex(); + if (event != 0) + { + switch (event->type()) + { + case QEvent::LanguageChange: + { + int logLevelIndex = m_pComboLogLevel->currentIndex(); - m_pComboLanguage->blockSignals(true); - retranslateUi(this); - m_pComboLanguage->blockSignals(false); + m_pComboLanguage->blockSignals(true); + retranslateUi(this); + m_pComboLanguage->blockSignals(false); - m_pComboLogLevel->setCurrentIndex(logLevelIndex); - break; - } + m_pComboLogLevel->setCurrentIndex(logLevelIndex); + break; + } - default: - QDialog::changeEvent(event); - } - } + default: + QDialog::changeEvent(event); + } + } } void SettingsDialog::on_m_pCheckBoxLogToFile_stateChanged(int i) { - bool checked = i == 2; + bool checked = i == 2; - m_pLineEditLogFilename->setEnabled(checked); - m_pButtonBrowseLog->setEnabled(checked); + m_pLineEditLogFilename->setEnabled(checked); + m_pButtonBrowseLog->setEnabled(checked); } void SettingsDialog::on_m_pButtonBrowseLog_clicked() { - QString fileName = QFileDialog::getSaveFileName( - this, tr("Save log file to..."), - m_pLineEditLogFilename->text(), - "Logs (*.log *.txt)"); + QString fileName = QFileDialog::getSaveFileName( + this, tr("Save log file to..."), + m_pLineEditLogFilename->text(), + "Logs (*.log *.txt)"); - if (!fileName.isEmpty()) - { - m_pLineEditLogFilename->setText(fileName); - } + if (!fileName.isEmpty()) + { + m_pLineEditLogFilename->setText(fileName); + } } void SettingsDialog::on_m_pComboLanguage_currentIndexChanged(int index) { - QString ietfCode = m_pComboLanguage->itemData(index).toString(); - QSynergyApplication::getInstance()->switchTranslator(ietfCode); + QString ietfCode = m_pComboLanguage->itemData(index).toString(); + QSynergyApplication::getInstance()->switchTranslator(ietfCode); } void SettingsDialog::on_m_pCheckBoxEnableCrypto_toggled(bool checked) { - m_appConfig.setCryptoEnabled(checked); - m_appConfig.saveSettings(); - if (checked) { - SslCertificate sslCertificate; - sslCertificate.generateCertificate(); - MainWindow& mainWindow = dynamic_cast (*this->parent()); - mainWindow.updateLocalFingerprint(); - } + m_appConfig.setCryptoEnabled(checked); + m_appConfig.saveSettings(); + if (checked) { + SslCertificate sslCertificate; + sslCertificate.generateCertificate(); + MainWindow& mainWindow = dynamic_cast (*this->parent()); + mainWindow.updateLocalFingerprint(); + } } diff --git a/src/gui/src/SettingsDialog.h b/src/gui/src/SettingsDialog.h index 841ffff8..298197aa 100644 --- a/src/gui/src/SettingsDialog.h +++ b/src/gui/src/SettingsDialog.h @@ -29,29 +29,29 @@ class AppConfig; class SettingsDialog : public QDialog, public Ui::SettingsDialogBase { - Q_OBJECT + Q_OBJECT - public: - SettingsDialog(QWidget* parent, AppConfig& config); - static QString browseForSynergyc(QWidget* parent, const QString& programDir, const QString& synergycName); - static QString browseForSynergys(QWidget* parent, const QString& programDir, const QString& synergysName); + public: + SettingsDialog(QWidget* parent, AppConfig& config); + static QString browseForSynergyc(QWidget* parent, const QString& programDir, const QString& synergycName); + static QString browseForSynergys(QWidget* parent, const QString& programDir, const QString& synergysName); - protected: - void accept(); - void reject(); - void changeEvent(QEvent* event); - AppConfig& appConfig() { return m_appConfig; } + protected: + void accept(); + void reject(); + void changeEvent(QEvent* event); + AppConfig& appConfig() { return m_appConfig; } - private: - AppConfig& m_appConfig; - SynergyLocale m_Locale; - CoreInterface m_CoreInterface; + private: + AppConfig& m_appConfig; + SynergyLocale m_Locale; + CoreInterface m_CoreInterface; - private slots: - void on_m_pCheckBoxEnableCrypto_toggled(bool checked); - void on_m_pComboLanguage_currentIndexChanged(int index); - void on_m_pCheckBoxLogToFile_stateChanged(int ); - void on_m_pButtonBrowseLog_clicked(); + private slots: + void on_m_pCheckBoxEnableCrypto_toggled(bool checked); + void on_m_pComboLanguage_currentIndexChanged(int index); + void on_m_pCheckBoxLogToFile_stateChanged(int ); + void on_m_pButtonBrowseLog_clicked(); }; #endif diff --git a/src/gui/src/SetupWizard.cpp b/src/gui/src/SetupWizard.cpp index da3ff8c3..5ee02108 100644 --- a/src/gui/src/SetupWizard.cpp +++ b/src/gui/src/SetupWizard.cpp @@ -27,34 +27,34 @@ #include SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) : - m_MainWindow(mainWindow), - m_StartMain(startMain) + m_MainWindow(mainWindow), + m_StartMain(startMain) { - setupUi(this); + setupUi(this); #if defined(Q_OS_MAC) - // the mac style needs a little more room because of the - // graphic on the left. - resize(600, 500); - setMinimumSize(size()); + // the mac style needs a little more room because of the + // graphic on the left. + resize(600, 500); + setMinimumSize(size()); #elif defined(Q_OS_WIN) - // when areo is disabled on windows, the next/back buttons - // are hidden (must be a qt bug) -- resizing the window - // to +1 of the original height seems to fix this. - // NOTE: calling setMinimumSize after this will break - // it again, so don't do that. - resize(size().width(), size().height() + 1); + // when areo is disabled on windows, the next/back buttons + // are hidden (must be a qt bug) -- resizing the window + // to +1 of the original height seems to fix this. + // NOTE: calling setMinimumSize after this will break + // it again, so don't do that. + resize(size().width(), size().height() + 1); #endif - connect(m_pServerRadioButton, SIGNAL(toggled(bool)), m_MainWindow.m_pGroupServer, SLOT(setChecked(bool))); - connect(m_pClientRadioButton, SIGNAL(toggled(bool)), m_MainWindow.m_pGroupClient, SLOT(setChecked(bool))); + connect(m_pServerRadioButton, SIGNAL(toggled(bool)), m_MainWindow.m_pGroupServer, SLOT(setChecked(bool))); + connect(m_pClientRadioButton, SIGNAL(toggled(bool)), m_MainWindow.m_pGroupClient, SLOT(setChecked(bool))); - m_Locale.fillLanguageComboBox(m_pComboLanguage); - setIndexFromItemData(m_pComboLanguage, m_MainWindow.appConfig().language()); + m_Locale.fillLanguageComboBox(m_pComboLanguage); + setIndexFromItemData(m_pComboLanguage, m_MainWindow.appConfig().language()); } SetupWizard::~SetupWizard() @@ -62,91 +62,91 @@ SetupWizard::~SetupWizard() } bool SetupWizard::validateCurrentPage() -{ - QMessageBox message; - message.setWindowTitle(tr("Setup Synergy")); - message.setIcon(QMessageBox::Information); +{ + QMessageBox message; + message.setWindowTitle(tr("Setup Synergy")); + message.setIcon(QMessageBox::Information); - if (currentPage() == m_pNodePage) - { - bool result = m_pClientRadioButton->isChecked() || - m_pServerRadioButton->isChecked(); + if (currentPage() == m_pNodePage) + { + bool result = m_pClientRadioButton->isChecked() || + m_pServerRadioButton->isChecked(); - if (!result) - { - message.setText(tr("Please select an option.")); - message.exec(); - return false; - } - } + if (!result) + { + message.setText(tr("Please select an option.")); + message.exec(); + return false; + } + } - return true; + return true; } void SetupWizard::changeEvent(QEvent* event) { - if (event != 0) - { - switch (event->type()) - { - case QEvent::LanguageChange: - { - m_pComboLanguage->blockSignals(true); - retranslateUi(this); - m_pComboLanguage->blockSignals(false); - break; - } + if (event != 0) + { + switch (event->type()) + { + case QEvent::LanguageChange: + { + m_pComboLanguage->blockSignals(true); + retranslateUi(this); + m_pComboLanguage->blockSignals(false); + break; + } - default: - QWizard::changeEvent(event); - } - } + default: + QWizard::changeEvent(event); + } + } } void SetupWizard::accept() { - AppConfig& appConfig = m_MainWindow.appConfig(); + AppConfig& appConfig = m_MainWindow.appConfig(); - appConfig.setLanguage(m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()); + appConfig.setLanguage(m_pComboLanguage->itemData(m_pComboLanguage->currentIndex()).toString()); - appConfig.setWizardHasRun(); - appConfig.saveSettings(); + appConfig.setWizardHasRun(); + appConfig.saveSettings(); - QSettings& settings = m_MainWindow.settings(); - if (m_pServerRadioButton->isChecked()) - { - settings.setValue("groupServerChecked", true); - settings.setValue("groupClientChecked", false); - } - if (m_pClientRadioButton->isChecked()) - { - settings.setValue("groupClientChecked", true); - settings.setValue("groupServerChecked", false); - } + QSettings& settings = m_MainWindow.settings(); + if (m_pServerRadioButton->isChecked()) + { + settings.setValue("groupServerChecked", true); + settings.setValue("groupClientChecked", false); + } + if (m_pClientRadioButton->isChecked()) + { + settings.setValue("groupClientChecked", true); + settings.setValue("groupServerChecked", false); + } - QWizard::accept(); + QWizard::accept(); - if (m_StartMain) - { - m_MainWindow.updateZeroconfService(); - m_MainWindow.open(); - } + if (m_StartMain) + { + m_MainWindow.updateZeroconfService(); + m_MainWindow.open(); + } } void SetupWizard::reject() { - QSynergyApplication::getInstance()->switchTranslator(m_MainWindow.appConfig().language()); + QSynergyApplication::getInstance()->switchTranslator(m_MainWindow.appConfig().language()); - if (m_StartMain) - { - m_MainWindow.open(); - } + if (m_StartMain) + { + m_MainWindow.open(); + } - QWizard::reject(); + QWizard::reject(); } void SetupWizard::on_m_pComboLanguage_currentIndexChanged(int index) { - QString ietfCode = m_pComboLanguage->itemData(index).toString(); - QSynergyApplication::getInstance()->switchTranslator(ietfCode); + QString ietfCode = m_pComboLanguage->itemData(index).toString(); + QSynergyApplication::getInstance()->switchTranslator(ietfCode); } diff --git a/src/gui/src/SetupWizard.h b/src/gui/src/SetupWizard.h index 009939b2..5e3173ea 100644 --- a/src/gui/src/SetupWizard.h +++ b/src/gui/src/SetupWizard.h @@ -27,27 +27,27 @@ class MainWindow; class SetupWizard : public QWizard, public Ui::SetupWizardBase { - Q_OBJECT + Q_OBJECT public: - enum { - kMaximiumLoginAttemps = 3 - }; + enum { + kMaximiumLoginAttemps = 3 + }; public: - SetupWizard(MainWindow& mainWindow, bool startMain); - virtual ~SetupWizard(); - bool validateCurrentPage(); + SetupWizard(MainWindow& mainWindow, bool startMain); + virtual ~SetupWizard(); + bool validateCurrentPage(); protected: - void changeEvent(QEvent* event); - void accept(); - void reject(); + void changeEvent(QEvent* event); + void accept(); + void reject(); private: - MainWindow& m_MainWindow; - bool m_StartMain; - SynergyLocale m_Locale; + MainWindow& m_MainWindow; + bool m_StartMain; + SynergyLocale m_Locale; private slots: - void on_m_pComboLanguage_currentIndexChanged(int index); + void on_m_pComboLanguage_currentIndexChanged(int index); }; diff --git a/src/gui/src/SslCertificate.cpp b/src/gui/src/SslCertificate.cpp index a669c5f6..f8180a9a 100644 --- a/src/gui/src/SslCertificate.cpp +++ b/src/gui/src/SslCertificate.cpp @@ -35,144 +35,144 @@ static const char kConfigFile[] = "OpenSSL\\synergy.conf"; #endif SslCertificate::SslCertificate(QObject *parent) : - QObject(parent) + QObject(parent) { - m_ProfileDir = m_CoreInterface.getProfileDir(); - if (m_ProfileDir.isEmpty()) { - emit error(tr("Failed to get profile directory.")); - } + m_ProfileDir = m_CoreInterface.getProfileDir(); + if (m_ProfileDir.isEmpty()) { + emit error(tr("Failed to get profile directory.")); + } } bool SslCertificate::runTool(const QStringList& args) { - QString program; + QString program; #if defined(Q_OS_WIN) - program = QCoreApplication::applicationDirPath(); - program.append("\\").append(kWinOpenSslBinary); + program = QCoreApplication::applicationDirPath(); + program.append("\\").append(kWinOpenSslBinary); #else - program = kUnixOpenSslCommand; + program = kUnixOpenSslCommand; #endif - QStringList environment; + QStringList environment; #if defined(Q_OS_WIN) - environment << QString("OPENSSL_CONF=%1\\%2") - .arg(QCoreApplication::applicationDirPath()) - .arg(kConfigFile); + environment << QString("OPENSSL_CONF=%1\\%2") + .arg(QCoreApplication::applicationDirPath()) + .arg(kConfigFile); #endif - QProcess process; - process.setEnvironment(environment); - process.start(program, args); + QProcess process; + process.setEnvironment(environment); + process.start(program, args); - bool success = process.waitForStarted(); + bool success = process.waitForStarted(); - QString standardError; - if (success && process.waitForFinished()) - { - m_ToolOutput = process.readAllStandardOutput().trimmed(); - standardError = process.readAllStandardError().trimmed(); - } + QString standardError; + if (success && process.waitForFinished()) + { + m_ToolOutput = process.readAllStandardOutput().trimmed(); + standardError = process.readAllStandardError().trimmed(); + } - int code = process.exitCode(); - if (!success || code != 0) - { - emit error( - QString("SSL tool failed: %1\n\nCode: %2\nError: %3") - .arg(program) - .arg(process.exitCode()) - .arg(standardError.isEmpty() ? "Unknown" : standardError)); - return false; - } + int code = process.exitCode(); + if (!success || code != 0) + { + emit error( + QString("SSL tool failed: %1\n\nCode: %2\nError: %3") + .arg(program) + .arg(process.exitCode()) + .arg(standardError.isEmpty() ? "Unknown" : standardError)); + return false; + } - return true; + return true; } void SslCertificate::generateCertificate() { - QString sslDirPath = QString("%1%2%3") - .arg(m_ProfileDir) - .arg(QDir::separator()) - .arg(kSslDir); + QString sslDirPath = QString("%1%2%3") + .arg(m_ProfileDir) + .arg(QDir::separator()) + .arg(kSslDir); - QString filename = QString("%1%2%3") - .arg(sslDirPath) - .arg(QDir::separator()) - .arg(kCertificateFilename); + QString filename = QString("%1%2%3") + .arg(sslDirPath) + .arg(QDir::separator()) + .arg(kCertificateFilename); - QFile file(filename); - if (!file.exists()) { - QStringList arguments; + QFile file(filename); + if (!file.exists()) { + QStringList arguments; - // self signed certificate - arguments.append("req"); - arguments.append("-x509"); - arguments.append("-nodes"); + // self signed certificate + arguments.append("req"); + arguments.append("-x509"); + arguments.append("-nodes"); - // valide duration - arguments.append("-days"); - arguments.append(kCertificateLifetime); + // valide duration + arguments.append("-days"); + arguments.append(kCertificateLifetime); - // subject information - arguments.append("-subj"); + // subject information + arguments.append("-subj"); - QString subInfo(kCertificateSubjectInfo); - arguments.append(subInfo); + QString subInfo(kCertificateSubjectInfo); + arguments.append(subInfo); - // private key - arguments.append("-newkey"); - arguments.append("rsa:1024"); + // private key + arguments.append("-newkey"); + arguments.append("rsa:1024"); - QDir sslDir(sslDirPath); - if (!sslDir.exists()) { - sslDir.mkpath("."); - } + QDir sslDir(sslDirPath); + if (!sslDir.exists()) { + sslDir.mkpath("."); + } - // key output filename - arguments.append("-keyout"); - arguments.append(filename); + // key output filename + arguments.append("-keyout"); + arguments.append(filename); - // certificate output filename - arguments.append("-out"); - arguments.append(filename); + // certificate output filename + arguments.append("-out"); + arguments.append(filename); - if (!runTool(arguments)) { - return; - } + if (!runTool(arguments)) { + return; + } - emit info(tr("SSL certificate generated.")); - } + emit info(tr("SSL certificate generated.")); + } - generateFingerprint(filename); + generateFingerprint(filename); - emit generateFinished(); + emit generateFinished(); } void SslCertificate::generateFingerprint(const QString& certificateFilename) { - QStringList arguments; - arguments.append("x509"); - arguments.append("-fingerprint"); - arguments.append("-sha1"); - arguments.append("-noout"); - arguments.append("-in"); - arguments.append(certificateFilename); + QStringList arguments; + arguments.append("x509"); + arguments.append("-fingerprint"); + arguments.append("-sha1"); + arguments.append("-noout"); + arguments.append("-in"); + arguments.append(certificateFilename); - if (!runTool(arguments)) { - return; - } + if (!runTool(arguments)) { + return; + } - // find the fingerprint from the tool output - int i = m_ToolOutput.indexOf("="); - if (i != -1) { - i++; - QString fingerprint = m_ToolOutput.mid( - i, m_ToolOutput.size() - i); + // find the fingerprint from the tool output + int i = m_ToolOutput.indexOf("="); + if (i != -1) { + i++; + QString fingerprint = m_ToolOutput.mid( + i, m_ToolOutput.size() - i); - Fingerprint::local().trust(fingerprint, false); - emit info(tr("SSL fingerprint generated.")); - } - else { - emit error(tr("Failed to find SSL fingerprint.")); - } + Fingerprint::local().trust(fingerprint, false); + emit info(tr("SSL fingerprint generated.")); + } + else { + emit error(tr("Failed to find SSL fingerprint.")); + } } diff --git a/src/gui/src/SslCertificate.h b/src/gui/src/SslCertificate.h index 4455f9bf..6683269d 100644 --- a/src/gui/src/SslCertificate.h +++ b/src/gui/src/SslCertificate.h @@ -26,22 +26,22 @@ class SslCertificate : public QObject Q_OBJECT public: - explicit SslCertificate(QObject *parent = 0); + explicit SslCertificate(QObject *parent = 0); public slots: - void generateCertificate(); + void generateCertificate(); signals: - void error(QString e); - void info(QString i); - void generateFinished(); + void error(QString e); + void info(QString i); + void generateFinished(); private: - bool runTool(const QStringList& args); - void generateFingerprint(const QString& certificateFilename); + bool runTool(const QStringList& args); + void generateFingerprint(const QString& certificateFilename); private: - QString m_ProfileDir; - QString m_ToolOutput; - CoreInterface m_CoreInterface; + QString m_ProfileDir; + QString m_ToolOutput; + CoreInterface m_CoreInterface; }; diff --git a/src/gui/src/SynergyLocale.cpp b/src/gui/src/SynergyLocale.cpp index fa980ed4..488cd0f0 100644 --- a/src/gui/src/SynergyLocale.cpp +++ b/src/gui/src/SynergyLocale.cpp @@ -23,46 +23,46 @@ SynergyLocale::SynergyLocale() { - loadLanguages(); + loadLanguages(); } void SynergyLocale::loadLanguages() { - QResource resource(":/res/lang/Languages.xml"); - QByteArray bytes(reinterpret_cast(resource.data()), resource.size()); - QXmlStreamReader xml(bytes); + QResource resource(":/res/lang/Languages.xml"); + QByteArray bytes(reinterpret_cast(resource.data()), resource.size()); + QXmlStreamReader xml(bytes); - while (!xml.atEnd()) - { - QXmlStreamReader::TokenType token = xml.readNext(); - if (xml.hasError()) - { - qCritical() << xml.errorString(); - throw std::exception(); - } + while (!xml.atEnd()) + { + QXmlStreamReader::TokenType token = xml.readNext(); + if (xml.hasError()) + { + qCritical() << xml.errorString(); + throw std::exception(); + } - if (xml.name() == "language" && token == QXmlStreamReader::StartElement) - { - QXmlStreamAttributes attributes = xml.attributes(); - addLanguage( - attributes.value("ietfCode").toString(), - attributes.value("name").toString()); - } - } + if (xml.name() == "language" && token == QXmlStreamReader::StartElement) + { + QXmlStreamAttributes attributes = xml.attributes(); + addLanguage( + attributes.value("ietfCode").toString(), + attributes.value("name").toString()); + } + } } void SynergyLocale::addLanguage(const QString& ietfCode, const QString& name) { - m_Languages.push_back(SynergyLocale::Language(ietfCode, name)); + m_Languages.push_back(SynergyLocale::Language(ietfCode, name)); } void SynergyLocale::fillLanguageComboBox(QComboBox* comboBox) { - comboBox->blockSignals(true); - QVector::iterator it; - for (it = m_Languages.begin(); it != m_Languages.end(); ++it) - { - comboBox->addItem((*it).m_Name, (*it).m_IetfCode); - } - comboBox->blockSignals(false); + comboBox->blockSignals(true); + QVector::iterator it; + for (it = m_Languages.begin(); it != m_Languages.end(); ++it) + { + comboBox->addItem((*it).m_Name, (*it).m_IetfCode); + } + comboBox->blockSignals(false); } diff --git a/src/gui/src/SynergyLocale.h b/src/gui/src/SynergyLocale.h index 68bd2d7a..beaa4f7d 100644 --- a/src/gui/src/SynergyLocale.h +++ b/src/gui/src/SynergyLocale.h @@ -23,26 +23,26 @@ class SynergyLocale { - class Language - { - public: - Language() { } - Language(const QString& IetfCode, const QString& name) - : m_IetfCode(IetfCode), m_Name(name) { } + class Language + { + public: + Language() { } + Language(const QString& IetfCode, const QString& name) + : m_IetfCode(IetfCode), m_Name(name) { } - public: - QString m_IetfCode; - QString m_Name; - }; + public: + QString m_IetfCode; + QString m_Name; + }; public: - SynergyLocale(); - void fillLanguageComboBox(QComboBox* comboBox); + SynergyLocale(); + void fillLanguageComboBox(QComboBox* comboBox); private: - void loadLanguages(); - void addLanguage(const QString& IetfCode, const QString& name); + void loadLanguages(); + void addLanguage(const QString& IetfCode, const QString& name); private: - QVector m_Languages; + QVector m_Languages; }; diff --git a/src/gui/src/TrashScreenWidget.cpp b/src/gui/src/TrashScreenWidget.cpp index a632bbe9..9d980d97 100644 --- a/src/gui/src/TrashScreenWidget.cpp +++ b/src/gui/src/TrashScreenWidget.cpp @@ -24,20 +24,20 @@ void TrashScreenWidget::dragEnterEvent(QDragEnterEvent* event) { - if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) - { - event->setDropAction(Qt::MoveAction); - event->accept(); - } - else - event->ignore(); + if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) + { + event->setDropAction(Qt::MoveAction); + event->accept(); + } + else + event->ignore(); } void TrashScreenWidget::dropEvent(QDropEvent* event) { - if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) - event->acceptProposedAction(); - else - event->ignore(); + if (event->mimeData()->hasFormat(ScreenSetupModel::mimeType())) + event->acceptProposedAction(); + else + event->ignore(); } diff --git a/src/gui/src/TrashScreenWidget.h b/src/gui/src/TrashScreenWidget.h index 16aa3f07..524b39ee 100644 --- a/src/gui/src/TrashScreenWidget.h +++ b/src/gui/src/TrashScreenWidget.h @@ -28,14 +28,14 @@ class QDropEvent; class TrashScreenWidget : public QLabel { - Q_OBJECT + Q_OBJECT - public: - TrashScreenWidget(QWidget* parent) : QLabel(parent) {} + public: + TrashScreenWidget(QWidget* parent) : QLabel(parent) {} - public: - void dragEnterEvent(QDragEnterEvent* event); - void dropEvent(QDropEvent* event); + public: + void dragEnterEvent(QDragEnterEvent* event); + void dropEvent(QDropEvent* event); }; #endif diff --git a/src/gui/src/VersionChecker.cpp b/src/gui/src/VersionChecker.cpp index 4ce27433..214f2ec5 100644 --- a/src/gui/src/VersionChecker.cpp +++ b/src/gui/src/VersionChecker.cpp @@ -29,79 +29,79 @@ VersionChecker::VersionChecker() { - m_manager = new QNetworkAccessManager(this); + m_manager = new QNetworkAccessManager(this); - connect(m_manager, SIGNAL(finished(QNetworkReply*)), - this, SLOT(replyFinished(QNetworkReply*))); + connect(m_manager, SIGNAL(finished(QNetworkReply*)), + this, SLOT(replyFinished(QNetworkReply*))); } VersionChecker::~VersionChecker() { - delete m_manager; + delete m_manager; } void VersionChecker::checkLatest() { - m_manager->get(QNetworkRequest(QUrl(VERSION_URL))); + m_manager->get(QNetworkRequest(QUrl(VERSION_URL))); } void VersionChecker::replyFinished(QNetworkReply* reply) { - QString newestVersion = QString(reply->readAll()); - if (!newestVersion.isEmpty()) - { - QString currentVersion = getVersion(); - if (currentVersion != "Unknown") { - if (compareVersions(currentVersion, newestVersion) > 0) - emit updateFound(newestVersion); - } - } + QString newestVersion = QString(reply->readAll()); + if (!newestVersion.isEmpty()) + { + QString currentVersion = getVersion(); + if (currentVersion != "Unknown") { + if (compareVersions(currentVersion, newestVersion) > 0) + emit updateFound(newestVersion); + } + } } int VersionChecker::compareVersions(const QString& left, const QString& right) { - if (left.compare(right) == 0) - return 0; // versions are same. + if (left.compare(right) == 0) + return 0; // versions are same. - QStringList leftSplit = left.split(QRegExp("\\.")); - if (leftSplit.size() != 3) - return 1; // assume right wins. + QStringList leftSplit = left.split(QRegExp("\\.")); + if (leftSplit.size() != 3) + return 1; // assume right wins. - QStringList rightSplit = right.split(QRegExp("\\.")); - if (rightSplit.size() != 3) - return -1; // assume left wins. + QStringList rightSplit = right.split(QRegExp("\\.")); + if (rightSplit.size() != 3) + return -1; // assume left wins. - int leftMajor = leftSplit.at(0).toInt(); - int leftMinor = leftSplit.at(1).toInt(); - int leftRev = leftSplit.at(2).toInt(); + int leftMajor = leftSplit.at(0).toInt(); + int leftMinor = leftSplit.at(1).toInt(); + int leftRev = leftSplit.at(2).toInt(); - int rightMajor = rightSplit.at(0).toInt(); - int rightMinor = rightSplit.at(1).toInt(); - int rightRev = rightSplit.at(2).toInt(); + int rightMajor = rightSplit.at(0).toInt(); + int rightMinor = rightSplit.at(1).toInt(); + int rightRev = rightSplit.at(2).toInt(); - bool rightWins = - (rightMajor > leftMajor) || - ((rightMajor >= leftMajor) && (rightMinor > leftMinor)) || - ((rightMajor >= leftMajor) && (rightMinor >= leftMinor) && (rightRev > leftRev)); + bool rightWins = + (rightMajor > leftMajor) || + ((rightMajor >= leftMajor) && (rightMinor > leftMinor)) || + ((rightMajor >= leftMajor) && (rightMinor >= leftMinor) && (rightRev > leftRev)); - return rightWins ? 1 : -1; + return rightWins ? 1 : -1; } QString VersionChecker::getVersion() { - QProcess process; - process.start(m_app, QStringList() << "--version"); + QProcess process; + process.start(m_app, QStringList() << "--version"); - process.setReadChannel(QProcess::StandardOutput); - if (process.waitForStarted() && process.waitForFinished()) - { - QRegExp rx(VERSION_REGEX); - QString text = process.readLine(); - if (rx.indexIn(text) != -1) - { - return rx.cap(1); - } - } + process.setReadChannel(QProcess::StandardOutput); + if (process.waitForStarted() && process.waitForFinished()) + { + QRegExp rx(VERSION_REGEX); + QString text = process.readLine(); + if (rx.indexIn(text) != -1) + { + return rx.cap(1); + } + } - return tr("Unknown"); + return tr("Unknown"); } diff --git a/src/gui/src/VersionChecker.h b/src/gui/src/VersionChecker.h index ae2ff33e..9f49cc37 100644 --- a/src/gui/src/VersionChecker.h +++ b/src/gui/src/VersionChecker.h @@ -26,19 +26,19 @@ class QNetworkReply; class VersionChecker : public QObject { - Q_OBJECT + Q_OBJECT public: - VersionChecker(); - virtual ~VersionChecker(); - void checkLatest(); - QString getVersion(); - void setApp(const QString& app) { m_app = app; } - int compareVersions(const QString& left, const QString& right); + VersionChecker(); + virtual ~VersionChecker(); + void checkLatest(); + QString getVersion(); + void setApp(const QString& app) { m_app = app; } + int compareVersions(const QString& left, const QString& right); public slots: - void replyFinished(QNetworkReply* reply); + void replyFinished(QNetworkReply* reply); signals: - void updateFound(const QString& version); + void updateFound(const QString& version); private: - QNetworkAccessManager* m_manager; - QString m_app; + QNetworkAccessManager* m_manager; + QString m_app; }; diff --git a/src/gui/src/WebClient.cpp b/src/gui/src/WebClient.cpp index 1d21dc82..c8e5a4a8 100644 --- a/src/gui/src/WebClient.cpp +++ b/src/gui/src/WebClient.cpp @@ -27,58 +27,58 @@ bool WebClient::getEdition (int& edition, QString& errorOut) { - QString responseJson = request(); - - /* TODO: This is horrible and should be ripped out as soon as we move - * to Qt 5. See issue #5630 - */ + QString responseJson = request(); + + /* TODO: This is horrible and should be ripped out as soon as we move + * to Qt 5. See issue #5630 + */ - QRegExp resultRegex(".*\"result\".*:.*(true|false).*"); - if (resultRegex.exactMatch (responseJson)) { - QString boolString = resultRegex.cap(1); - if (boolString == "true") { - QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*"); - if (editionRegex.exactMatch(responseJson)) { - QString e = editionRegex.cap(1); - edition = e.toInt(); - return true; - } else { - throw std::runtime_error ("Unrecognised server response."); - } - } else { - errorOut = tr("Login failed. Invalid email address or password."); - return false; - } - } else { - QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*"); - if (errorRegex.exactMatch (responseJson)) { - errorOut = errorRegex.cap(1).replace("\\n", "\n"); - return false; - } else { - throw std::runtime_error ("Unrecognised server response."); - } - } + QRegExp resultRegex(".*\"result\".*:.*(true|false).*"); + if (resultRegex.exactMatch (responseJson)) { + QString boolString = resultRegex.cap(1); + if (boolString == "true") { + QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*"); + if (editionRegex.exactMatch(responseJson)) { + QString e = editionRegex.cap(1); + edition = e.toInt(); + return true; + } else { + throw std::runtime_error ("Unrecognised server response."); + } + } else { + errorOut = tr("Login failed. Invalid email address or password."); + return false; + } + } else { + QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*"); + if (errorRegex.exactMatch (responseJson)) { + errorOut = errorRegex.cap(1).replace("\\n", "\n"); + return false; + } else { + throw std::runtime_error ("Unrecognised server response."); + } + } } bool WebClient::setEmail (QString email, QString& errorOut) { - if (email.isEmpty()) { - errorOut = tr("Your email address cannot be left blank."); - return false; - } - m_Email = email; - return true; + if (email.isEmpty()) { + errorOut = tr("Your email address cannot be left blank."); + return false; + } + m_Email = email; + return true; } bool WebClient::setPassword (QString password, QString&) { - m_Password = password; - return true; + m_Password = password; + return true; } QString WebClient::request() { - QStringList args("--login-auth"); - QString credentials (m_Email + ":" + hash(m_Password) + "\n"); - return m_CoreInterface.run (args, credentials); + QStringList args("--login-auth"); + QString credentials (m_Email + ":" + hash(m_Password) + "\n"); + return m_CoreInterface.run (args, credentials); } diff --git a/src/gui/src/WebClient.h b/src/gui/src/WebClient.h index 7ff6e2be..2280031e 100644 --- a/src/gui/src/WebClient.h +++ b/src/gui/src/WebClient.h @@ -29,21 +29,21 @@ class QStringList; class WebClient : public QObject { - Q_OBJECT + Q_OBJECT public: - bool getEdition (int& edition, QString& errorOut); - bool setEmail (QString email, QString& errorOut); - bool setPassword (QString password, QString& errorOut); + bool getEdition (int& edition, QString& errorOut); + bool setEmail (QString email, QString& errorOut); + bool setPassword (QString password, QString& errorOut); signals: - void error(QString e); + void error(QString e); private: - QString request(); - - QString m_Email; - QString m_Password; - CoreInterface m_CoreInterface; + QString request(); + + QString m_Email; + QString m_Password; + CoreInterface m_CoreInterface; }; #endif // WEBCLIENT_H diff --git a/src/gui/src/ZeroconfBrowser.cpp b/src/gui/src/ZeroconfBrowser.cpp index e3a71afe..00764ce5 100644 --- a/src/gui/src/ZeroconfBrowser.cpp +++ b/src/gui/src/ZeroconfBrowser.cpp @@ -20,73 +20,73 @@ #include ZeroconfBrowser::ZeroconfBrowser(QObject* parent) : - QObject(parent), - m_DnsServiceRef(0), - m_pSocket(0) + QObject(parent), + m_DnsServiceRef(0), + m_pSocket(0) { } ZeroconfBrowser::~ZeroconfBrowser() { - if (m_pSocket) { - delete m_pSocket; - } + if (m_pSocket) { + delete m_pSocket; + } - if (m_DnsServiceRef) { - DNSServiceRefDeallocate(m_DnsServiceRef); - m_DnsServiceRef = 0; - } + if (m_DnsServiceRef) { + DNSServiceRefDeallocate(m_DnsServiceRef); + m_DnsServiceRef = 0; + } } void ZeroconfBrowser::browseForType(const QString& type) { - DNSServiceErrorType err = DNSServiceBrowse(&m_DnsServiceRef, 0, 0, - type.toUtf8().constData(), 0, browseReply, this); + DNSServiceErrorType err = DNSServiceBrowse(&m_DnsServiceRef, 0, 0, + type.toUtf8().constData(), 0, browseReply, this); - if (err != kDNSServiceErr_NoError) { - emit error(err); - } - else { - int sockFD = DNSServiceRefSockFD(m_DnsServiceRef); - if (sockFD == -1) { - emit error(kDNSServiceErr_Invalid); - } - else { - m_pSocket = new QSocketNotifier(sockFD, QSocketNotifier::Read, this); - connect(m_pSocket, SIGNAL(activated(int)), this, - SLOT(socketReadyRead())); - } - } + if (err != kDNSServiceErr_NoError) { + emit error(err); + } + else { + int sockFD = DNSServiceRefSockFD(m_DnsServiceRef); + if (sockFD == -1) { + emit error(kDNSServiceErr_Invalid); + } + else { + m_pSocket = new QSocketNotifier(sockFD, QSocketNotifier::Read, this); + connect(m_pSocket, SIGNAL(activated(int)), this, + SLOT(socketReadyRead())); + } + } } void ZeroconfBrowser::socketReadyRead() { - DNSServiceErrorType err = DNSServiceProcessResult(m_DnsServiceRef); - if (err != kDNSServiceErr_NoError) { - emit error(err); - } + DNSServiceErrorType err = DNSServiceProcessResult(m_DnsServiceRef); + if (err != kDNSServiceErr_NoError) { + emit error(err); + } } void ZeroconfBrowser::browseReply(DNSServiceRef, DNSServiceFlags flags, - quint32, DNSServiceErrorType errorCode, const char* serviceName, - const char* regType, const char* replyDomain, void* context) + quint32, DNSServiceErrorType errorCode, const char* serviceName, + const char* regType, const char* replyDomain, void* context) { - ZeroconfBrowser* browser = static_cast(context); - if (errorCode != kDNSServiceErr_NoError) { - emit browser->error(errorCode); - } - else { - ZeroconfRecord record(serviceName, regType, replyDomain); - if (flags & kDNSServiceFlagsAdd) { - if (!browser->m_Records.contains(record)) { - browser->m_Records.append(record); - } - } - else { - browser->m_Records.removeAll(record); - } - if (!(flags & kDNSServiceFlagsMoreComing)) { - emit browser->currentRecordsChanged(browser->m_Records); - } - } + ZeroconfBrowser* browser = static_cast(context); + if (errorCode != kDNSServiceErr_NoError) { + emit browser->error(errorCode); + } + else { + ZeroconfRecord record(serviceName, regType, replyDomain); + if (flags & kDNSServiceFlagsAdd) { + if (!browser->m_Records.contains(record)) { + browser->m_Records.append(record); + } + } + else { + browser->m_Records.removeAll(record); + } + if (!(flags & kDNSServiceFlagsMoreComing)) { + emit browser->currentRecordsChanged(browser->m_Records); + } + } } diff --git a/src/gui/src/ZeroconfBrowser.h b/src/gui/src/ZeroconfBrowser.h index d0856283..c15a24bf 100644 --- a/src/gui/src/ZeroconfBrowser.h +++ b/src/gui/src/ZeroconfBrowser.h @@ -28,30 +28,30 @@ class QSocketNotifier; class ZeroconfBrowser : public QObject { - Q_OBJECT + Q_OBJECT public: - ZeroconfBrowser(QObject* parent = 0); - ~ZeroconfBrowser(); - void browseForType(const QString& type); - inline QList currentRecords() const { return m_Records; } - inline QString serviceType() const { return m_BrowsingType; } + ZeroconfBrowser(QObject* parent = 0); + ~ZeroconfBrowser(); + void browseForType(const QString& type); + inline QList currentRecords() const { return m_Records; } + inline QString serviceType() const { return m_BrowsingType; } signals: - void currentRecordsChanged(const QList& list); - void error(DNSServiceErrorType err); + void currentRecordsChanged(const QList& list); + void error(DNSServiceErrorType err); private slots: - void socketReadyRead(); + void socketReadyRead(); private: - static void DNSSD_API browseReply(DNSServiceRef, DNSServiceFlags flags, - quint32, DNSServiceErrorType errorCode, const char* serviceName, - const char* regType, const char* replyDomain, void* context); + static void DNSSD_API browseReply(DNSServiceRef, DNSServiceFlags flags, + quint32, DNSServiceErrorType errorCode, const char* serviceName, + const char* regType, const char* replyDomain, void* context); private: - DNSServiceRef m_DnsServiceRef; - QSocketNotifier* m_pSocket; - QList m_Records; - QString m_BrowsingType; + DNSServiceRef m_DnsServiceRef; + QSocketNotifier* m_pSocket; + QList m_Records; + QString m_BrowsingType; }; diff --git a/src/gui/src/ZeroconfRecord.h b/src/gui/src/ZeroconfRecord.h index 2540435a..0da155a1 100644 --- a/src/gui/src/ZeroconfRecord.h +++ b/src/gui/src/ZeroconfRecord.h @@ -23,28 +23,28 @@ class ZeroconfRecord { public: - ZeroconfRecord() {} - ZeroconfRecord(const QString& name, const QString& regType, - const QString& domain) - : serviceName(name), registeredType(regType), replyDomain(domain) - {} - ZeroconfRecord(const char* name, const char* regType, const char* domain) - { - serviceName = QString::fromUtf8(name); - registeredType = QString::fromUtf8(regType); - replyDomain = QString::fromUtf8(domain); - } + ZeroconfRecord() {} + ZeroconfRecord(const QString& name, const QString& regType, + const QString& domain) + : serviceName(name), registeredType(regType), replyDomain(domain) + {} + ZeroconfRecord(const char* name, const char* regType, const char* domain) + { + serviceName = QString::fromUtf8(name); + registeredType = QString::fromUtf8(regType); + replyDomain = QString::fromUtf8(domain); + } - bool operator==(const ZeroconfRecord& other) const { - return serviceName == other.serviceName - && registeredType == other.registeredType - && replyDomain == other.replyDomain; - } + bool operator==(const ZeroconfRecord& other) const { + return serviceName == other.serviceName + && registeredType == other.registeredType + && replyDomain == other.replyDomain; + } public: - QString serviceName; - QString registeredType; - QString replyDomain; + QString serviceName; + QString registeredType; + QString replyDomain; }; Q_DECLARE_METATYPE(ZeroconfRecord) diff --git a/src/gui/src/ZeroconfRegister.cpp b/src/gui/src/ZeroconfRegister.cpp index 5b4ae34a..3e7e3c75 100644 --- a/src/gui/src/ZeroconfRegister.cpp +++ b/src/gui/src/ZeroconfRegister.cpp @@ -20,75 +20,75 @@ #include ZeroconfRegister::ZeroconfRegister(QObject* parent) : - QObject(parent), - m_DnsServiceRef(0), - m_pSocket(0) + QObject(parent), + m_DnsServiceRef(0), + m_pSocket(0) { } ZeroconfRegister::~ZeroconfRegister() { - if (m_pSocket) { - delete m_pSocket; - } + if (m_pSocket) { + delete m_pSocket; + } - if (m_DnsServiceRef) { - DNSServiceRefDeallocate(m_DnsServiceRef); - m_DnsServiceRef = 0; - } + if (m_DnsServiceRef) { + DNSServiceRefDeallocate(m_DnsServiceRef); + m_DnsServiceRef = 0; + } } void ZeroconfRegister::registerService(const ZeroconfRecord& record, - quint16 servicePort) + quint16 servicePort) { - if (m_DnsServiceRef) { - qWarning("Warning: Already registered a service for this object"); - return; - } + if (m_DnsServiceRef) { + qWarning("Warning: Already registered a service for this object"); + return; + } - quint16 bigEndianPort = servicePort; + quint16 bigEndianPort = servicePort; #if Q_BYTE_ORDER == Q_LITTLE_ENDIAN - { - bigEndianPort = 0 | ((servicePort & 0x00ff) << 8) | ((servicePort & 0xff00) >> 8); - } + { + bigEndianPort = 0 | ((servicePort & 0x00ff) << 8) | ((servicePort & 0xff00) >> 8); + } #endif - DNSServiceErrorType err = DNSServiceRegister(&m_DnsServiceRef, - kDNSServiceFlagsNoAutoRename, 0, - record.serviceName.toUtf8().constData(), - record.registeredType.toUtf8().constData(), - record.replyDomain.isEmpty() ? 0 : record.replyDomain.toUtf8().constData(), - 0, bigEndianPort, 0, 0, registerService, this); + DNSServiceErrorType err = DNSServiceRegister(&m_DnsServiceRef, + kDNSServiceFlagsNoAutoRename, 0, + record.serviceName.toUtf8().constData(), + record.registeredType.toUtf8().constData(), + record.replyDomain.isEmpty() ? 0 : record.replyDomain.toUtf8().constData(), + 0, bigEndianPort, 0, 0, registerService, this); - if (err != kDNSServiceErr_NoError) { - emit error(err); - } - else { - int sockfd = DNSServiceRefSockFD(m_DnsServiceRef); - if (sockfd == -1) { - emit error(kDNSServiceErr_Invalid); - } - else { - m_pSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); - connect(m_pSocket, SIGNAL(activated(int)), this, SLOT(socketReadyRead())); - } - } + if (err != kDNSServiceErr_NoError) { + emit error(err); + } + else { + int sockfd = DNSServiceRefSockFD(m_DnsServiceRef); + if (sockfd == -1) { + emit error(kDNSServiceErr_Invalid); + } + else { + m_pSocket = new QSocketNotifier(sockfd, QSocketNotifier::Read, this); + connect(m_pSocket, SIGNAL(activated(int)), this, SLOT(socketReadyRead())); + } + } } void ZeroconfRegister::socketReadyRead() { - DNSServiceErrorType err = DNSServiceProcessResult(m_DnsServiceRef); - if (err != kDNSServiceErr_NoError) { - emit error(err); - } + DNSServiceErrorType err = DNSServiceProcessResult(m_DnsServiceRef); + if (err != kDNSServiceErr_NoError) { + emit error(err); + } } void ZeroconfRegister::registerService(DNSServiceRef, DNSServiceFlags, - DNSServiceErrorType errorCode, const char* name, const char* regtype, - const char* domain, void* data) + DNSServiceErrorType errorCode, const char* name, const char* regtype, + const char* domain, void* data) { - ZeroconfRegister* serviceRegister = static_cast(data); - if (errorCode != kDNSServiceErr_NoError) { - emit serviceRegister->error(errorCode); - } + ZeroconfRegister* serviceRegister = static_cast(data); + if (errorCode != kDNSServiceErr_NoError) { + emit serviceRegister->error(errorCode); + } } diff --git a/src/gui/src/ZeroconfRegister.h b/src/gui/src/ZeroconfRegister.h index 0eba89a1..05487e12 100644 --- a/src/gui/src/ZeroconfRegister.h +++ b/src/gui/src/ZeroconfRegister.h @@ -33,29 +33,29 @@ class QSocketNotifier; class ZeroconfRegister : public QObject { - Q_OBJECT + Q_OBJECT public: - ZeroconfRegister(QObject* parent = 0); - ~ZeroconfRegister(); + ZeroconfRegister(QObject* parent = 0); + ~ZeroconfRegister(); - void registerService(const ZeroconfRecord& record, quint16 servicePort); - inline ZeroconfRecord registeredRecord() const { return finalRecord; } + void registerService(const ZeroconfRecord& record, quint16 servicePort); + inline ZeroconfRecord registeredRecord() const { return finalRecord; } signals: - void error(DNSServiceErrorType error); - void serviceRegistered(const ZeroconfRecord& record); + void error(DNSServiceErrorType error); + void serviceRegistered(const ZeroconfRecord& record); private slots: - void socketReadyRead(); + void socketReadyRead(); private: - static void DNSSD_API registerService(DNSServiceRef sdRef, - DNSServiceFlags, DNSServiceErrorType errorCode, const char* name, - const char* regtype, const char* domain, void* context); + static void DNSSD_API registerService(DNSServiceRef sdRef, + DNSServiceFlags, DNSServiceErrorType errorCode, const char* name, + const char* regtype, const char* domain, void* context); private: - DNSServiceRef m_DnsServiceRef; - QSocketNotifier* m_pSocket; - ZeroconfRecord finalRecord; + DNSServiceRef m_DnsServiceRef; + QSocketNotifier* m_pSocket; + ZeroconfRecord finalRecord; }; diff --git a/src/gui/src/ZeroconfServer.cpp b/src/gui/src/ZeroconfServer.cpp index 982b597a..d3d98518 100644 --- a/src/gui/src/ZeroconfServer.cpp +++ b/src/gui/src/ZeroconfServer.cpp @@ -21,13 +21,13 @@ #include ZeroconfServer::ZeroconfServer(QObject* parent) : - QTcpServer(parent) + QTcpServer(parent) { } void ZeroconfServer::incomingConnection(int socketDescriptor) { - ZeroconfThread* thread = new ZeroconfThread(socketDescriptor, this); - connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - thread->start(); + ZeroconfThread* thread = new ZeroconfThread(socketDescriptor, this); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + thread->start(); } diff --git a/src/gui/src/ZeroconfServer.h b/src/gui/src/ZeroconfServer.h index e490b3a8..01e713d7 100644 --- a/src/gui/src/ZeroconfServer.h +++ b/src/gui/src/ZeroconfServer.h @@ -24,14 +24,14 @@ class ZeroconfRegister; class ZeroconfServer : public QTcpServer { - Q_OBJECT + Q_OBJECT public: - ZeroconfServer(QObject* parent = 0); + ZeroconfServer(QObject* parent = 0); protected: - void incomingConnection(int socketDescriptor); + void incomingConnection(int socketDescriptor); private: - QStringList fortunes; + QStringList fortunes; }; diff --git a/src/gui/src/ZeroconfService.cpp b/src/gui/src/ZeroconfService.cpp index e48c2aa8..5ecc5773 100644 --- a/src/gui/src/ZeroconfService.cpp +++ b/src/gui/src/ZeroconfService.cpp @@ -28,137 +28,137 @@ #include static const QStringList preferedIPAddress( - QStringList() << - "192.168." << - "10." << - "172."); + QStringList() << + "192.168." << + "10." << + "172."); const char* ZeroconfService:: m_ServerServiceName = "_synergyServerZeroconf._tcp"; const char* ZeroconfService:: m_ClientServiceName = "_synergyClientZeroconf._tcp"; ZeroconfService::ZeroconfService(MainWindow* mainWindow) : - m_pMainWindow(mainWindow), - m_pZeroconfBrowser(0), - m_pZeroconfRegister(0), - m_ServiceRegistered(false) + m_pMainWindow(mainWindow), + m_pZeroconfBrowser(0), + m_pZeroconfRegister(0), + m_ServiceRegistered(false) { - if (m_pMainWindow->synergyType() == MainWindow::synergyServer) { - if (registerService(true)) { - m_pZeroconfBrowser = new ZeroconfBrowser(this); - connect(m_pZeroconfBrowser, SIGNAL( - currentRecordsChanged(const QList&)), - this, SLOT(clientDetected(const QList&))); - m_pZeroconfBrowser->browseForType( - QLatin1String(m_ClientServiceName)); - } - } - else { - m_pZeroconfBrowser = new ZeroconfBrowser(this); - connect(m_pZeroconfBrowser, SIGNAL( - currentRecordsChanged(const QList&)), - this, SLOT(serverDetected(const QList&))); - m_pZeroconfBrowser->browseForType( - QLatin1String(m_ServerServiceName)); - } + if (m_pMainWindow->synergyType() == MainWindow::synergyServer) { + if (registerService(true)) { + m_pZeroconfBrowser = new ZeroconfBrowser(this); + connect(m_pZeroconfBrowser, SIGNAL( + currentRecordsChanged(const QList&)), + this, SLOT(clientDetected(const QList&))); + m_pZeroconfBrowser->browseForType( + QLatin1String(m_ClientServiceName)); + } + } + else { + m_pZeroconfBrowser = new ZeroconfBrowser(this); + connect(m_pZeroconfBrowser, SIGNAL( + currentRecordsChanged(const QList&)), + this, SLOT(serverDetected(const QList&))); + m_pZeroconfBrowser->browseForType( + QLatin1String(m_ServerServiceName)); + } - connect(m_pZeroconfBrowser, SIGNAL(error(DNSServiceErrorType)), - this, SLOT(errorHandle(DNSServiceErrorType))); + connect(m_pZeroconfBrowser, SIGNAL(error(DNSServiceErrorType)), + this, SLOT(errorHandle(DNSServiceErrorType))); } ZeroconfService::~ZeroconfService() { - if (m_pZeroconfBrowser) { - delete m_pZeroconfBrowser; - } - if (m_pZeroconfRegister) { - delete m_pZeroconfRegister; - } + if (m_pZeroconfBrowser) { + delete m_pZeroconfBrowser; + } + if (m_pZeroconfRegister) { + delete m_pZeroconfRegister; + } } void ZeroconfService::serverDetected(const QList& list) { - foreach (ZeroconfRecord record, list) { - registerService(false); - m_pMainWindow->appendLogInfo(tr("zeroconf server detected: %1").arg( - record.serviceName)); - m_pMainWindow->serverDetected(record.serviceName); - } + foreach (ZeroconfRecord record, list) { + registerService(false); + m_pMainWindow->appendLogInfo(tr("zeroconf server detected: %1").arg( + record.serviceName)); + m_pMainWindow->serverDetected(record.serviceName); + } } void ZeroconfService::clientDetected(const QList& list) { - foreach (ZeroconfRecord record, list) { - m_pMainWindow->appendLogInfo(tr("zeroconf client detected: %1").arg( - record.serviceName)); - m_pMainWindow->autoAddScreen(record.serviceName); - } + foreach (ZeroconfRecord record, list) { + m_pMainWindow->appendLogInfo(tr("zeroconf client detected: %1").arg( + record.serviceName)); + m_pMainWindow->autoAddScreen(record.serviceName); + } } void ZeroconfService::errorHandle(DNSServiceErrorType errorCode) { - QMessageBox::critical(0, tr("Zero configuration service"), - tr("Error code: %1.").arg(errorCode)); + QMessageBox::critical(0, tr("Zero configuration service"), + tr("Error code: %1.").arg(errorCode)); } QString ZeroconfService::getLocalIPAddresses() { - QStringList addresses; - foreach (const QHostAddress& address, QNetworkInterface::allAddresses()) { - if (address.protocol() == QAbstractSocket::IPv4Protocol && - address != QHostAddress(QHostAddress::LocalHost)) { - addresses.append(address.toString()); - } - } + QStringList addresses; + foreach (const QHostAddress& address, QNetworkInterface::allAddresses()) { + if (address.protocol() == QAbstractSocket::IPv4Protocol && + address != QHostAddress(QHostAddress::LocalHost)) { + addresses.append(address.toString()); + } + } - foreach (const QString& preferedIP, preferedIPAddress) { - foreach (const QString& address, addresses) { - if (address.startsWith(preferedIP)) { - return address; - } - } - } + foreach (const QString& preferedIP, preferedIPAddress) { + foreach (const QString& address, addresses) { + if (address.startsWith(preferedIP)) { + return address; + } + } + } - return ""; + return ""; } bool ZeroconfService::registerService(bool server) { - bool result = true; + bool result = true; - if (!m_ServiceRegistered) { - if (!m_zeroconfServer.listen()) { - QMessageBox::critical(0, tr("Zero configuration service"), - tr("Unable to start the zeroconf: %1.") - .arg(m_zeroconfServer.errorString())); - result = false; - } - else { - m_pZeroconfRegister = new ZeroconfRegister(this); - if (server) { - QString localIP = getLocalIPAddresses(); - if (localIP.isEmpty()) { - QMessageBox::warning(m_pMainWindow, tr("Synergy"), - tr("Failed to get local IP address. " - "Please manually type in server address " - "on your clients")); - } - else { - m_pZeroconfRegister->registerService( - ZeroconfRecord(tr("%1").arg(localIP), - QLatin1String(m_ServerServiceName), QString()), - m_zeroconfServer.serverPort()); - } - } - else { - m_pZeroconfRegister->registerService( - ZeroconfRecord(tr("%1").arg(m_pMainWindow->getScreenName()), - QLatin1String(m_ClientServiceName), QString()), - m_zeroconfServer.serverPort()); - } + if (!m_ServiceRegistered) { + if (!m_zeroconfServer.listen()) { + QMessageBox::critical(0, tr("Zero configuration service"), + tr("Unable to start the zeroconf: %1.") + .arg(m_zeroconfServer.errorString())); + result = false; + } + else { + m_pZeroconfRegister = new ZeroconfRegister(this); + if (server) { + QString localIP = getLocalIPAddresses(); + if (localIP.isEmpty()) { + QMessageBox::warning(m_pMainWindow, tr("Synergy"), + tr("Failed to get local IP address. " + "Please manually type in server address " + "on your clients")); + } + else { + m_pZeroconfRegister->registerService( + ZeroconfRecord(tr("%1").arg(localIP), + QLatin1String(m_ServerServiceName), QString()), + m_zeroconfServer.serverPort()); + } + } + else { + m_pZeroconfRegister->registerService( + ZeroconfRecord(tr("%1").arg(m_pMainWindow->getScreenName()), + QLatin1String(m_ClientServiceName), QString()), + m_zeroconfServer.serverPort()); + } - m_ServiceRegistered = true; - } - } + m_ServiceRegistered = true; + } + } - return result; + return result; } diff --git a/src/gui/src/ZeroconfService.h b/src/gui/src/ZeroconfService.h index 8f9aa6db..17fe3bf7 100644 --- a/src/gui/src/ZeroconfService.h +++ b/src/gui/src/ZeroconfService.h @@ -30,28 +30,28 @@ class MainWindow; class ZeroconfService : public QObject { - Q_OBJECT + Q_OBJECT public: - ZeroconfService(MainWindow* mainWindow); - ~ZeroconfService(); + ZeroconfService(MainWindow* mainWindow); + ~ZeroconfService(); private slots: - void serverDetected(const QList& list); - void clientDetected(const QList& list); - void errorHandle(DNSServiceErrorType errorCode); + void serverDetected(const QList& list); + void clientDetected(const QList& list); + void errorHandle(DNSServiceErrorType errorCode); private: - QString getLocalIPAddresses(); - bool registerService(bool server); + QString getLocalIPAddresses(); + bool registerService(bool server); private: - MainWindow* m_pMainWindow; - ZeroconfServer m_zeroconfServer; - ZeroconfBrowser* m_pZeroconfBrowser; - ZeroconfRegister* m_pZeroconfRegister; - bool m_ServiceRegistered; + MainWindow* m_pMainWindow; + ZeroconfServer m_zeroconfServer; + ZeroconfBrowser* m_pZeroconfBrowser; + ZeroconfRegister* m_pZeroconfRegister; + bool m_ServiceRegistered; - static const char* m_ServerServiceName; - static const char* m_ClientServiceName; + static const char* m_ServerServiceName; + static const char* m_ClientServiceName; }; diff --git a/src/gui/src/ZeroconfThread.cpp b/src/gui/src/ZeroconfThread.cpp index e2b7ac28..48e9fd8a 100644 --- a/src/gui/src/ZeroconfThread.cpp +++ b/src/gui/src/ZeroconfThread.cpp @@ -20,19 +20,19 @@ #include ZeroconfThread::ZeroconfThread(int socketDescriptor, QObject* parent) : - QThread(parent), - m_SocketDescriptor(socketDescriptor) + QThread(parent), + m_SocketDescriptor(socketDescriptor) { } void ZeroconfThread::run() { - QTcpSocket tcpSocket; - if (!tcpSocket.setSocketDescriptor(m_SocketDescriptor)) { - emit error(tcpSocket.error()); - return; - } + QTcpSocket tcpSocket; + if (!tcpSocket.setSocketDescriptor(m_SocketDescriptor)) { + emit error(tcpSocket.error()); + return; + } - tcpSocket.disconnectFromHost(); - tcpSocket.waitForDisconnected(); + tcpSocket.disconnectFromHost(); + tcpSocket.waitForDisconnected(); } diff --git a/src/gui/src/ZeroconfThread.h b/src/gui/src/ZeroconfThread.h index ef28498b..b2e7485e 100644 --- a/src/gui/src/ZeroconfThread.h +++ b/src/gui/src/ZeroconfThread.h @@ -22,17 +22,17 @@ class ZeroconfThread : public QThread { - Q_OBJECT + Q_OBJECT public: - ZeroconfThread(int socketDescriptor, QObject* parent); + ZeroconfThread(int socketDescriptor, QObject* parent); - void run(); + void run(); signals: - void error(QTcpSocket::SocketError socketError); + void error(QTcpSocket::SocketError socketError); private: - int m_SocketDescriptor; - QString m_Text; + int m_SocketDescriptor; + QString m_Text; }; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index f53d9db8..7b78bc96 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -28,5 +28,5 @@ add_subdirectory(synergy) add_subdirectory(shared) if (WIN32) - add_subdirectory(synwinhk) + add_subdirectory(synwinhk) endif() diff --git a/src/lib/arch/Arch.cpp b/src/lib/arch/Arch.cpp index 0c38d956..5eb0025d 100644 --- a/src/lib/arch/Arch.cpp +++ b/src/lib/arch/Arch.cpp @@ -22,39 +22,39 @@ // Arch // -Arch* Arch::s_instance = NULL; +Arch* Arch::s_instance = NULL; Arch::Arch() { - assert(s_instance == NULL); - s_instance = this; + assert(s_instance == NULL); + s_instance = this; } Arch::Arch(Arch* arch) { - s_instance = arch; + s_instance = arch; } Arch::~Arch() { #if SYSAPI_WIN32 - ArchMiscWindows::cleanup(); + ArchMiscWindows::cleanup(); #endif } void Arch::init() { - ARCH_NETWORK::init(); + ARCH_NETWORK::init(); #if SYSAPI_WIN32 - ARCH_TASKBAR::init(); - ArchMiscWindows::init(); + ARCH_TASKBAR::init(); + ArchMiscWindows::init(); #endif } Arch* Arch::getInstance() { - assert(s_instance != NULL); - return s_instance; + assert(s_instance != NULL); + return s_instance; } diff --git a/src/lib/arch/Arch.h b/src/lib/arch/Arch.h index 42be6eb8..0b6740a6 100644 --- a/src/lib/arch/Arch.h +++ b/src/lib/arch/Arch.h @@ -38,41 +38,41 @@ #include "common/common.h" #if SYSAPI_WIN32 -# include "arch/win32/ArchConsoleWindows.h" -# include "arch/win32/ArchDaemonWindows.h" -# include "arch/win32/ArchFileWindows.h" -# include "arch/win32/ArchLogWindows.h" -# include "arch/win32/ArchMiscWindows.h" -# include "arch/win32/ArchMultithreadWindows.h" -# include "arch/win32/ArchNetworkWinsock.h" -# include "arch/win32/ArchSleepWindows.h" -# include "arch/win32/ArchStringWindows.h" -# include "arch/win32/ArchSystemWindows.h" -# include "arch/win32/ArchTaskBarWindows.h" -# include "arch/win32/ArchTimeWindows.h" -# include "arch/win32/ArchInternetWindows.h" +# include "arch/win32/ArchConsoleWindows.h" +# include "arch/win32/ArchDaemonWindows.h" +# include "arch/win32/ArchFileWindows.h" +# include "arch/win32/ArchLogWindows.h" +# include "arch/win32/ArchMiscWindows.h" +# include "arch/win32/ArchMultithreadWindows.h" +# include "arch/win32/ArchNetworkWinsock.h" +# include "arch/win32/ArchSleepWindows.h" +# include "arch/win32/ArchStringWindows.h" +# include "arch/win32/ArchSystemWindows.h" +# include "arch/win32/ArchTaskBarWindows.h" +# include "arch/win32/ArchTimeWindows.h" +# include "arch/win32/ArchInternetWindows.h" #elif SYSAPI_UNIX -# include "arch/unix/ArchConsoleUnix.h" -# include "arch/unix/ArchDaemonUnix.h" -# include "arch/unix/ArchFileUnix.h" -# include "arch/unix/ArchLogUnix.h" -# if HAVE_PTHREAD -# include "arch/unix/ArchMultithreadPosix.h" -# endif -# include "arch/unix/ArchNetworkBSD.h" -# include "arch/unix/ArchSleepUnix.h" -# include "arch/unix/ArchStringUnix.h" -# include "arch/unix/ArchSystemUnix.h" -# include "arch/unix/ArchTaskBarXWindows.h" -# include "arch/unix/ArchTimeUnix.h" -# include "arch/unix/ArchInternetUnix.h" +# include "arch/unix/ArchConsoleUnix.h" +# include "arch/unix/ArchDaemonUnix.h" +# include "arch/unix/ArchFileUnix.h" +# include "arch/unix/ArchLogUnix.h" +# if HAVE_PTHREAD +# include "arch/unix/ArchMultithreadPosix.h" +# endif +# include "arch/unix/ArchNetworkBSD.h" +# include "arch/unix/ArchSleepUnix.h" +# include "arch/unix/ArchStringUnix.h" +# include "arch/unix/ArchSystemUnix.h" +# include "arch/unix/ArchTaskBarXWindows.h" +# include "arch/unix/ArchTimeUnix.h" +# include "arch/unix/ArchInternetUnix.h" #endif /*! \def ARCH This macro evaluates to the singleton Arch object. */ -#define ARCH (Arch::getInstance()) +#define ARCH (Arch::getInstance()) //! Delegating implementation of architecture dependent interfaces /*! @@ -85,60 +85,60 @@ exactly one of these objects before attempting to call any method, typically at the beginning of \c main(). */ class Arch : public ARCH_CONSOLE, - public ARCH_DAEMON, - public ARCH_FILE, - public ARCH_LOG, - public ARCH_MULTITHREAD, - public ARCH_NETWORK, - public ARCH_SLEEP, - public ARCH_STRING, - public ARCH_SYSTEM, - public ARCH_TASKBAR, - public ARCH_TIME { + public ARCH_DAEMON, + public ARCH_FILE, + public ARCH_LOG, + public ARCH_MULTITHREAD, + public ARCH_NETWORK, + public ARCH_SLEEP, + public ARCH_STRING, + public ARCH_SYSTEM, + public ARCH_TASKBAR, + public ARCH_TIME { public: - Arch(); - Arch(Arch* arch); - virtual ~Arch(); + Arch(); + Arch(Arch* arch); + virtual ~Arch(); - //! Call init on other arch classes. - /*! - Some arch classes depend on others to exist first. When init is called - these clases will have ARCH available for use. - */ - virtual void init(); + //! Call init on other arch classes. + /*! + Some arch classes depend on others to exist first. When init is called + these clases will have ARCH available for use. + */ + virtual void init(); - // - // accessors - // + // + // accessors + // - //! Return the singleton instance - /*! - The client must have instantiated exactly once Arch object before - calling this function. - */ - static Arch* getInstance(); + //! Return the singleton instance + /*! + The client must have instantiated exactly once Arch object before + calling this function. + */ + static Arch* getInstance(); - static void setInstance(Arch* s) { s_instance = s; } + static void setInstance(Arch* s) { s_instance = s; } - ARCH_INTERNET& internet() const { return (ARCH_INTERNET&)m_internet; } + ARCH_INTERNET& internet() const { return (ARCH_INTERNET&)m_internet; } private: - static Arch* s_instance; - ARCH_INTERNET m_internet; + static Arch* s_instance; + ARCH_INTERNET m_internet; }; //! Convenience object to lock/unlock an arch mutex class ArchMutexLock { public: - ArchMutexLock(ArchMutex mutex) : m_mutex(mutex) - { - ARCH->lockMutex(m_mutex); - } - ~ArchMutexLock() - { - ARCH->unlockMutex(m_mutex); - } + ArchMutexLock(ArchMutex mutex) : m_mutex(mutex) + { + ARCH->lockMutex(m_mutex); + } + ~ArchMutexLock() + { + ARCH->unlockMutex(m_mutex); + } private: - ArchMutex m_mutex; + ArchMutex m_mutex; }; diff --git a/src/lib/arch/ArchConsoleStd.cpp b/src/lib/arch/ArchConsoleStd.cpp index 615fc7f1..44814ba8 100644 --- a/src/lib/arch/ArchConsoleStd.cpp +++ b/src/lib/arch/ArchConsoleStd.cpp @@ -24,10 +24,10 @@ void ArchConsoleStd::writeConsole(ELevel level, const char* str) { - if ((level >= kFATAL) && (level <= kWARNING)) - std::cerr << str << std::endl; - else - std::cout << str << std::endl; + if ((level >= kFATAL) && (level <= kWARNING)) + std::cerr << str << std::endl; + else + std::cout << str << std::endl; - std::cout.flush(); + std::cout.flush(); } \ No newline at end of file diff --git a/src/lib/arch/ArchConsoleStd.h b/src/lib/arch/ArchConsoleStd.h index 3dd5259a..0bc7d2ef 100644 --- a/src/lib/arch/ArchConsoleStd.h +++ b/src/lib/arch/ArchConsoleStd.h @@ -23,12 +23,12 @@ //! Cross platform implementation of IArchConsole class ArchConsoleStd : public IArchConsole { public: - ArchConsoleStd() { } - virtual ~ArchConsoleStd() { } + ArchConsoleStd() { } + virtual ~ArchConsoleStd() { } - // IArchConsole overrides - virtual void openConsole(const char* title) { } - virtual void closeConsole() { } - virtual void showConsole(bool) { } - virtual void writeConsole(ELevel level, const char*); + // IArchConsole overrides + virtual void openConsole(const char* title) { } + virtual void closeConsole() { } + virtual void showConsole(bool) { } + virtual void writeConsole(ELevel level, const char*); }; diff --git a/src/lib/arch/ArchDaemonNone.cpp b/src/lib/arch/ArchDaemonNone.cpp index 234d6d02..71210632 100644 --- a/src/lib/arch/ArchDaemonNone.cpp +++ b/src/lib/arch/ArchDaemonNone.cpp @@ -24,48 +24,48 @@ ArchDaemonNone::ArchDaemonNone() { - // do nothing + // do nothing } ArchDaemonNone::~ArchDaemonNone() { - // do nothing + // do nothing } void ArchDaemonNone::installDaemon(const char*, - const char*, - const char*, - const char*, - const char*) + const char*, + const char*, + const char*, + const char*) { - // do nothing + // do nothing } void ArchDaemonNone::uninstallDaemon(const char*) { - // do nothing + // do nothing } int ArchDaemonNone::daemonize(const char* name, DaemonFunc func) { - // simply forward the call to func. obviously, this doesn't - // do any daemonizing. - return func(1, &name); + // simply forward the call to func. obviously, this doesn't + // do any daemonizing. + return func(1, &name); } bool ArchDaemonNone::canInstallDaemon(const char*) { - return false; + return false; } bool ArchDaemonNone::isDaemonInstalled(const char*) { - return false; + return false; } void @@ -81,5 +81,5 @@ ArchDaemonNone::uninstallDaemon() std::string ArchDaemonNone::commandLine() const { - return ""; + return ""; } diff --git a/src/lib/arch/ArchDaemonNone.h b/src/lib/arch/ArchDaemonNone.h index aee22fb5..decb5aa2 100644 --- a/src/lib/arch/ArchDaemonNone.h +++ b/src/lib/arch/ArchDaemonNone.h @@ -31,20 +31,20 @@ function and returns its result. */ class ArchDaemonNone : public IArchDaemon { public: - ArchDaemonNone(); - virtual ~ArchDaemonNone(); + ArchDaemonNone(); + virtual ~ArchDaemonNone(); - // IArchDaemon overrides - virtual void installDaemon(const char* name, - const char* description, - const char* pathname, - const char* commandLine, - const char* dependencies); - virtual void uninstallDaemon(const char* name); - virtual int daemonize(const char* name, DaemonFunc func); - virtual bool canInstallDaemon(const char* name); - virtual bool isDaemonInstalled(const char* name); - virtual void installDaemon(); - virtual void uninstallDaemon(); - virtual std::string commandLine() const; + // IArchDaemon overrides + virtual void installDaemon(const char* name, + const char* description, + const char* pathname, + const char* commandLine, + const char* dependencies); + virtual void uninstallDaemon(const char* name); + virtual int daemonize(const char* name, DaemonFunc func); + virtual bool canInstallDaemon(const char* name); + virtual bool isDaemonInstalled(const char* name); + virtual void installDaemon(); + virtual void uninstallDaemon(); + virtual std::string commandLine() const; }; diff --git a/src/lib/arch/CMakeLists.txt b/src/lib/arch/CMakeLists.txt index 51545718..0784a667 100644 --- a/src/lib/arch/CMakeLists.txt +++ b/src/lib/arch/CMakeLists.txt @@ -18,37 +18,37 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() # arch if (WIN32) - file(GLOB arch_headers "win32/*.h") - file(GLOB arch_sources "win32/*.cpp") + file(GLOB arch_headers "win32/*.h") + file(GLOB arch_sources "win32/*.cpp") elseif (UNIX) - file(GLOB arch_headers "unix/*.h") - file(GLOB arch_sources "unix/*.cpp") + file(GLOB arch_headers "unix/*.h") + file(GLOB arch_sources "unix/*.cpp") endif() list(APPEND sources ${arch_sources}) list(APPEND headers ${arch_headers}) if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(arch STATIC ${sources}) if (UNIX) - target_link_libraries(arch dl ${libs}) + target_link_libraries(arch dl ${libs}) endif() diff --git a/src/lib/arch/IArchConsole.h b/src/lib/arch/IArchConsole.h index d1acd192..3c009a2f 100644 --- a/src/lib/arch/IArchConsole.h +++ b/src/lib/arch/IArchConsole.h @@ -28,39 +28,39 @@ synergy. Each architecture must implement this interface. */ class IArchConsole : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Open the console - /*! - Opens the console for writing. The console is opened automatically - on the first write so calling this method is optional. Uses \c title - for the console's title if appropriate for the architecture. Calling - this method on an already open console must have no effect. - */ - virtual void openConsole(const char* title) = 0; + //! Open the console + /*! + Opens the console for writing. The console is opened automatically + on the first write so calling this method is optional. Uses \c title + for the console's title if appropriate for the architecture. Calling + this method on an already open console must have no effect. + */ + virtual void openConsole(const char* title) = 0; - //! Close the console - /*! - Close the console. Calling this method on an already closed console - must have no effect. - */ - virtual void closeConsole() = 0; + //! Close the console + /*! + Close the console. Calling this method on an already closed console + must have no effect. + */ + virtual void closeConsole() = 0; - //! Show the console - /*! - Causes the console to become visible. This generally only makes sense - for a console in a graphical user interface. Other implementations - will do nothing. Iff \p showIfEmpty is \c false then the implementation - may optionally only show the console if it's not empty. - */ - virtual void showConsole(bool showIfEmpty) = 0; + //! Show the console + /*! + Causes the console to become visible. This generally only makes sense + for a console in a graphical user interface. Other implementations + will do nothing. Iff \p showIfEmpty is \c false then the implementation + may optionally only show the console if it's not empty. + */ + virtual void showConsole(bool showIfEmpty) = 0; - //! Write to the console - /*! - Writes the given string to the console, opening it if necessary. - */ - virtual void writeConsole(ELevel, const char*) = 0; + //! Write to the console + /*! + Writes the given string to the console, opening it if necessary. + */ + virtual void writeConsole(ELevel, const char*) = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchDaemon.h b/src/lib/arch/IArchDaemon.h index 4ee1fc0d..5db49f10 100644 --- a/src/lib/arch/IArchDaemon.h +++ b/src/lib/arch/IArchDaemon.h @@ -29,100 +29,100 @@ implement this interface. */ class IArchDaemon : public IInterface { public: - typedef int (*DaemonFunc)(int argc, const char** argv); + typedef int (*DaemonFunc)(int argc, const char** argv); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Install daemon - /*! - Install a daemon. \c name is the name of the daemon passed to the - system and \c description is a short human readable description of - the daemon. \c pathname is the path to the daemon executable. - \c commandLine should \b not include the name of program as the - first argument. If \c allUsers is true then the daemon will be - installed to start at boot time, otherwise it will be installed to - start when the current user logs in. If \p dependencies is not NULL - then it's a concatenation of NUL terminated other daemon names - followed by a NUL; the daemon will be configured to startup after - the listed daemons. Throws an \c XArchDaemon exception on failure. - */ - virtual void installDaemon(const char* name, - const char* description, - const char* pathname, - const char* commandLine, - const char* dependencies) = 0; + //! Install daemon + /*! + Install a daemon. \c name is the name of the daemon passed to the + system and \c description is a short human readable description of + the daemon. \c pathname is the path to the daemon executable. + \c commandLine should \b not include the name of program as the + first argument. If \c allUsers is true then the daemon will be + installed to start at boot time, otherwise it will be installed to + start when the current user logs in. If \p dependencies is not NULL + then it's a concatenation of NUL terminated other daemon names + followed by a NUL; the daemon will be configured to startup after + the listed daemons. Throws an \c XArchDaemon exception on failure. + */ + virtual void installDaemon(const char* name, + const char* description, + const char* pathname, + const char* commandLine, + const char* dependencies) = 0; - //! Uninstall daemon - /*! - Uninstall a daemon. Throws an \c XArchDaemon on failure. - */ - virtual void uninstallDaemon(const char* name) = 0; + //! Uninstall daemon + /*! + Uninstall a daemon. Throws an \c XArchDaemon on failure. + */ + virtual void uninstallDaemon(const char* name) = 0; - //! Install daemon - /*! - Installs the default daemon. - */ - virtual void installDaemon() = 0; - - //! Uninstall daemon - /*! - Uninstalls the default daemon. - */ - virtual void uninstallDaemon() = 0; + //! Install daemon + /*! + Installs the default daemon. + */ + virtual void installDaemon() = 0; + + //! Uninstall daemon + /*! + Uninstalls the default daemon. + */ + virtual void uninstallDaemon() = 0; - //! Daemonize the process - /*! - Daemonize. Throw XArchDaemonFailed on error. \c name is the name - of the daemon. Once daemonized, \c func is invoked and daemonize - returns when and what it does. - - Exactly what happens when daemonizing depends on the platform. -
    -
  • unix: - Detaches from terminal. \c func gets passed one argument, the - name passed to daemonize(). -
  • win32: - Becomes a service. Argument 0 is the name of the service - and the rest are the arguments passed to StartService(). - \c func is only called when the service is actually started. - \c func must call \c ArchMiscWindows::runDaemon() to finally - becoming a service. The \c runFunc function passed to \c runDaemon() - must call \c ArchMiscWindows::daemonRunning(true) when it - enters the main loop (i.e. after initialization) and - \c ArchMiscWindows::daemonRunning(false) when it leaves - the main loop. The \c stopFunc function passed to \c runDaemon() - is called when the daemon must exit the main loop and it must cause - \c runFunc to return. \c func should return what \c runDaemon() - returns. \c func or \c runFunc can call - \c ArchMiscWindows::daemonFailed() to indicate startup failure. -
- */ - virtual int daemonize(const char* name, DaemonFunc func) = 0; + //! Daemonize the process + /*! + Daemonize. Throw XArchDaemonFailed on error. \c name is the name + of the daemon. Once daemonized, \c func is invoked and daemonize + returns when and what it does. + + Exactly what happens when daemonizing depends on the platform. +
    +
  • unix: + Detaches from terminal. \c func gets passed one argument, the + name passed to daemonize(). +
  • win32: + Becomes a service. Argument 0 is the name of the service + and the rest are the arguments passed to StartService(). + \c func is only called when the service is actually started. + \c func must call \c ArchMiscWindows::runDaemon() to finally + becoming a service. The \c runFunc function passed to \c runDaemon() + must call \c ArchMiscWindows::daemonRunning(true) when it + enters the main loop (i.e. after initialization) and + \c ArchMiscWindows::daemonRunning(false) when it leaves + the main loop. The \c stopFunc function passed to \c runDaemon() + is called when the daemon must exit the main loop and it must cause + \c runFunc to return. \c func should return what \c runDaemon() + returns. \c func or \c runFunc can call + \c ArchMiscWindows::daemonFailed() to indicate startup failure. +
+ */ + virtual int daemonize(const char* name, DaemonFunc func) = 0; - //! Check if user has permission to install the daemon - /*! - Returns true iff the caller has permission to install or - uninstall the daemon. Note that even if this method returns - true it's possible that installing/uninstalling the service - may still fail. This method ignores whether or not the - service is already installed. - */ - virtual bool canInstallDaemon(const char* name) = 0; + //! Check if user has permission to install the daemon + /*! + Returns true iff the caller has permission to install or + uninstall the daemon. Note that even if this method returns + true it's possible that installing/uninstalling the service + may still fail. This method ignores whether or not the + service is already installed. + */ + virtual bool canInstallDaemon(const char* name) = 0; - //! Check if the daemon is installed - /*! - Returns true iff the daemon is installed. - */ - virtual bool isDaemonInstalled(const char* name) = 0; + //! Check if the daemon is installed + /*! + Returns true iff the daemon is installed. + */ + virtual bool isDaemonInstalled(const char* name) = 0; - //@} + //@} - //! Get the command line - /*! - Gets the command line with which the application was started. - */ - virtual std::string commandLine() const = 0; + //! Get the command line + /*! + Gets the command line with which the application was started. + */ + virtual std::string commandLine() const = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchFile.h b/src/lib/arch/IArchFile.h index bcbba6e0..7a5ea6ad 100644 --- a/src/lib/arch/IArchFile.h +++ b/src/lib/arch/IArchFile.h @@ -29,77 +29,77 @@ synergy. Each architecture must implement this interface. */ class IArchFile : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Extract base name - /*! - Find the base name in the given \c pathname. - */ - virtual const char* getBasename(const char* pathname) = 0; + //! Extract base name + /*! + Find the base name in the given \c pathname. + */ + virtual const char* getBasename(const char* pathname) = 0; - //! Get user's home directory - /*! - Returns the user's home directory. Returns the empty string if - this cannot be determined. - */ - virtual std::string getUserDirectory() = 0; + //! Get user's home directory + /*! + Returns the user's home directory. Returns the empty string if + this cannot be determined. + */ + virtual std::string getUserDirectory() = 0; - //! Get system directory - /*! - Returns the ussystem configuration file directory. - */ - virtual std::string getSystemDirectory() = 0; + //! Get system directory + /*! + Returns the ussystem configuration file directory. + */ + virtual std::string getSystemDirectory() = 0; - //! Get installed directory - /*! - Returns the directory in which Synergy is installed. - */ - virtual std::string getInstalledDirectory() = 0; + //! Get installed directory + /*! + Returns the directory in which Synergy is installed. + */ + virtual std::string getInstalledDirectory() = 0; - //! Get log directory - /*! - Returns the log file directory. - */ - virtual std::string getLogDirectory() = 0; + //! Get log directory + /*! + Returns the log file directory. + */ + virtual std::string getLogDirectory() = 0; - //! Get plugins directory - /*! - Returns the plugin files directory. If no plugin directory is set, - this will return the plugin folder within the user's profile. - */ - virtual std::string getPluginDirectory() = 0; + //! Get plugins directory + /*! + Returns the plugin files directory. If no plugin directory is set, + this will return the plugin folder within the user's profile. + */ + virtual std::string getPluginDirectory() = 0; - //! Get user's profile directory - /*! - Returns the user's profile directory. If no profile directory is set, - this will return the user's profile according to the operating system, - which will depend on which user launched the program. - */ - virtual std::string getProfileDirectory() = 0; + //! Get user's profile directory + /*! + Returns the user's profile directory. If no profile directory is set, + this will return the user's profile according to the operating system, + which will depend on which user launched the program. + */ + virtual std::string getProfileDirectory() = 0; - //! Concatenate path components - /*! - Concatenate pathname components with a directory separator - between them. This should not check if the resulting path - is longer than allowed by the system; we'll rely on the - system calls to tell us that. - */ - virtual std::string concatPath( - const std::string& prefix, - const std::string& suffix) = 0; - - //@} - //! Set the user's profile directory - /* - Returns the user's profile directory. - */ - virtual void setProfileDirectory(const String& s) = 0; + //! Concatenate path components + /*! + Concatenate pathname components with a directory separator + between them. This should not check if the resulting path + is longer than allowed by the system; we'll rely on the + system calls to tell us that. + */ + virtual std::string concatPath( + const std::string& prefix, + const std::string& suffix) = 0; + + //@} + //! Set the user's profile directory + /* + Returns the user's profile directory. + */ + virtual void setProfileDirectory(const String& s) = 0; - //@} - //! Set the user's plugin directory - /* - Returns the user's plugin directory. - */ - virtual void setPluginDirectory(const String& s) = 0; + //@} + //! Set the user's plugin directory + /* + Returns the user's plugin directory. + */ + virtual void setPluginDirectory(const String& s) = 0; }; diff --git a/src/lib/arch/IArchLog.h b/src/lib/arch/IArchLog.h index 9f24b668..94197b88 100644 --- a/src/lib/arch/IArchLog.h +++ b/src/lib/arch/IArchLog.h @@ -28,36 +28,36 @@ synergy. Each architecture must implement this interface. */ class IArchLog : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Open the log - /*! - Opens the log for writing. The log must be opened before being - written to. - */ - virtual void openLog(const char* name) = 0; + //! Open the log + /*! + Opens the log for writing. The log must be opened before being + written to. + */ + virtual void openLog(const char* name) = 0; - //! Close the log - /*! - Close the log. - */ - virtual void closeLog() = 0; + //! Close the log + /*! + Close the log. + */ + virtual void closeLog() = 0; - //! Show the log - /*! - Causes the log to become visible. This generally only makes sense - for a log in a graphical user interface. Other implementations - will do nothing. Iff \p showIfEmpty is \c false then the implementation - may optionally only show the log if it's not empty. - */ - virtual void showLog(bool showIfEmpty) = 0; + //! Show the log + /*! + Causes the log to become visible. This generally only makes sense + for a log in a graphical user interface. Other implementations + will do nothing. Iff \p showIfEmpty is \c false then the implementation + may optionally only show the log if it's not empty. + */ + virtual void showLog(bool showIfEmpty) = 0; - //! Write to the log - /*! - Writes the given string to the log with the given level. - */ - virtual void writeLog(ELevel, const char*) = 0; + //! Write to the log + /*! + Writes the given string to the log with the given level. + */ + virtual void writeLog(ELevel, const char*) = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchMultithread.h b/src/lib/arch/IArchMultithread.h index f4f00a91..9ad7a15b 100644 --- a/src/lib/arch/IArchMultithread.h +++ b/src/lib/arch/IArchMultithread.h @@ -70,204 +70,204 @@ synergy. Each architecture must implement this interface. */ class IArchMultithread : public IInterface { public: - //! Type of thread entry point - typedef void* (*ThreadFunc)(void*); - //! Type of thread identifier - typedef unsigned int ThreadID; - //! Types of signals - /*! - Not all platforms support all signals. Unsupported signals are - ignored. - */ - enum ESignal { - kINTERRUPT, //!< Interrupt (e.g. Ctrl+C) - kTERMINATE, //!< Terminate (e.g. Ctrl+Break) - kHANGUP, //!< Hangup (SIGHUP) - kUSER, //!< User (SIGUSR2) - kNUM_SIGNALS - }; - //! Type of signal handler function - typedef void (*SignalFunc)(ESignal, void* userData); + //! Type of thread entry point + typedef void* (*ThreadFunc)(void*); + //! Type of thread identifier + typedef unsigned int ThreadID; + //! Types of signals + /*! + Not all platforms support all signals. Unsupported signals are + ignored. + */ + enum ESignal { + kINTERRUPT, //!< Interrupt (e.g. Ctrl+C) + kTERMINATE, //!< Terminate (e.g. Ctrl+Break) + kHANGUP, //!< Hangup (SIGHUP) + kUSER, //!< User (SIGUSR2) + kNUM_SIGNALS + }; + //! Type of signal handler function + typedef void (*SignalFunc)(ESignal, void* userData); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - // - // condition variable methods - // + // + // condition variable methods + // - //! Create a condition variable - /*! - The condition variable is an opaque data type. - */ - virtual ArchCond newCondVar() = 0; + //! Create a condition variable + /*! + The condition variable is an opaque data type. + */ + virtual ArchCond newCondVar() = 0; - //! Destroy a condition variable - virtual void closeCondVar(ArchCond) = 0; + //! Destroy a condition variable + virtual void closeCondVar(ArchCond) = 0; - //! Signal a condition variable - /*! - Signalling a condition variable releases one waiting thread. - */ - virtual void signalCondVar(ArchCond) = 0; + //! Signal a condition variable + /*! + Signalling a condition variable releases one waiting thread. + */ + virtual void signalCondVar(ArchCond) = 0; - //! Broadcast a condition variable - /*! - Broadcasting a condition variable releases all waiting threads. - */ - virtual void broadcastCondVar(ArchCond) = 0; + //! Broadcast a condition variable + /*! + Broadcasting a condition variable releases all waiting threads. + */ + virtual void broadcastCondVar(ArchCond) = 0; - //! Wait on a condition variable - /*! - Wait on a conditation variable for up to \c timeout seconds. - If \c timeout is < 0 then there is no timeout. The mutex must - be locked when this method is called. The mutex is unlocked - during the wait and locked again before returning. Returns - true if the condition variable was signalled and false on - timeout. + //! Wait on a condition variable + /*! + Wait on a conditation variable for up to \c timeout seconds. + If \c timeout is < 0 then there is no timeout. The mutex must + be locked when this method is called. The mutex is unlocked + during the wait and locked again before returning. Returns + true if the condition variable was signalled and false on + timeout. - (Cancellation point) - */ - virtual bool waitCondVar(ArchCond, ArchMutex, double timeout) = 0; + (Cancellation point) + */ + virtual bool waitCondVar(ArchCond, ArchMutex, double timeout) = 0; - // - // mutex methods - // + // + // mutex methods + // - //! Create a recursive mutex - /*! - Creates a recursive mutex. A thread may lock a recursive mutex - when it already holds a lock on that mutex. The mutex is an - opaque data type. - */ - virtual ArchMutex newMutex() = 0; + //! Create a recursive mutex + /*! + Creates a recursive mutex. A thread may lock a recursive mutex + when it already holds a lock on that mutex. The mutex is an + opaque data type. + */ + virtual ArchMutex newMutex() = 0; - //! Destroy a mutex - virtual void closeMutex(ArchMutex) = 0; + //! Destroy a mutex + virtual void closeMutex(ArchMutex) = 0; - //! Lock a mutex - virtual void lockMutex(ArchMutex) = 0; + //! Lock a mutex + virtual void lockMutex(ArchMutex) = 0; - //! Unlock a mutex - virtual void unlockMutex(ArchMutex) = 0; + //! Unlock a mutex + virtual void unlockMutex(ArchMutex) = 0; - // - // thread methods - // + // + // thread methods + // - //! Start a new thread - /*! - Creates and starts a new thread, using \c func as the entry point - and passing it \c userData. The thread is an opaque data type. - */ - virtual ArchThread newThread(ThreadFunc func, void* userData) = 0; + //! Start a new thread + /*! + Creates and starts a new thread, using \c func as the entry point + and passing it \c userData. The thread is an opaque data type. + */ + virtual ArchThread newThread(ThreadFunc func, void* userData) = 0; - //! Get a reference to the calling thread - /*! - Returns a thread representing the current (i.e. calling) thread. - */ - virtual ArchThread newCurrentThread() = 0; + //! Get a reference to the calling thread + /*! + Returns a thread representing the current (i.e. calling) thread. + */ + virtual ArchThread newCurrentThread() = 0; - //! Copy a thread object - /*! - Returns a reference to to thread referred to by \c thread. - */ - virtual ArchThread copyThread(ArchThread thread) = 0; + //! Copy a thread object + /*! + Returns a reference to to thread referred to by \c thread. + */ + virtual ArchThread copyThread(ArchThread thread) = 0; - //! Release a thread reference - /*! - Deletes the given thread object. This does not destroy the thread - the object referred to, even if there are no remaining references. - Use cancelThread() and waitThread() to stop a thread and wait for - it to exit. - */ - virtual void closeThread(ArchThread) = 0; + //! Release a thread reference + /*! + Deletes the given thread object. This does not destroy the thread + the object referred to, even if there are no remaining references. + Use cancelThread() and waitThread() to stop a thread and wait for + it to exit. + */ + virtual void closeThread(ArchThread) = 0; - //! Force a thread to exit - /*! - Causes \c thread to exit when it next calls a cancellation point. - A thread avoids cancellation as long as it nevers calls a - cancellation point. Once it begins the cancellation process it - must always let cancellation go to completion but may take as - long as necessary to clean up. - */ - virtual void cancelThread(ArchThread thread) = 0; + //! Force a thread to exit + /*! + Causes \c thread to exit when it next calls a cancellation point. + A thread avoids cancellation as long as it nevers calls a + cancellation point. Once it begins the cancellation process it + must always let cancellation go to completion but may take as + long as necessary to clean up. + */ + virtual void cancelThread(ArchThread thread) = 0; - //! Change thread priority - /*! - Changes the priority of \c thread by \c n. If \c n is positive - the thread has a lower priority and if negative a higher priority. - Some architectures may not support either or both directions. - */ - virtual void setPriorityOfThread(ArchThread, int n) = 0; + //! Change thread priority + /*! + Changes the priority of \c thread by \c n. If \c n is positive + the thread has a lower priority and if negative a higher priority. + Some architectures may not support either or both directions. + */ + virtual void setPriorityOfThread(ArchThread, int n) = 0; - //! Cancellation point - /*! - This method does nothing but is a cancellation point. Clients - can make their own functions cancellation points by calling this - method at appropriate times. + //! Cancellation point + /*! + This method does nothing but is a cancellation point. Clients + can make their own functions cancellation points by calling this + method at appropriate times. - (Cancellation point) - */ - virtual void testCancelThread() = 0; + (Cancellation point) + */ + virtual void testCancelThread() = 0; - //! Wait for a thread to exit - /*! - Waits for up to \c timeout seconds for \c thread to exit (normally - or by cancellation). Waits forever if \c timeout < 0. Returns - true if the thread exited, false otherwise. Waiting on the current - thread returns immediately with false. + //! Wait for a thread to exit + /*! + Waits for up to \c timeout seconds for \c thread to exit (normally + or by cancellation). Waits forever if \c timeout < 0. Returns + true if the thread exited, false otherwise. Waiting on the current + thread returns immediately with false. - (Cancellation point) - */ - virtual bool wait(ArchThread thread, double timeout) = 0; + (Cancellation point) + */ + virtual bool wait(ArchThread thread, double timeout) = 0; - //! Compare threads - /*! - Returns true iff two thread objects refer to the same thread. - Note that comparing thread objects directly is meaningless. - */ - virtual bool isSameThread(ArchThread, ArchThread) = 0; + //! Compare threads + /*! + Returns true iff two thread objects refer to the same thread. + Note that comparing thread objects directly is meaningless. + */ + virtual bool isSameThread(ArchThread, ArchThread) = 0; - //! Test if thread exited - /*! - Returns true iff \c thread has exited. - */ - virtual bool isExitedThread(ArchThread thread) = 0; + //! Test if thread exited + /*! + Returns true iff \c thread has exited. + */ + virtual bool isExitedThread(ArchThread thread) = 0; - //! Returns the exit code of a thread - /*! - Waits indefinitely for \c thread to exit (if it hasn't yet) then - returns the thread's exit code. + //! Returns the exit code of a thread + /*! + Waits indefinitely for \c thread to exit (if it hasn't yet) then + returns the thread's exit code. - (Cancellation point) - */ - virtual void* getResultOfThread(ArchThread thread) = 0; + (Cancellation point) + */ + virtual void* getResultOfThread(ArchThread thread) = 0; - //! Returns an ID for a thread - /*! - Returns some ID number for \c thread. This is for logging purposes. - All thread objects referring to the same thread return the same ID. - However, clients should us isSameThread() to compare thread objects - instead of comparing IDs. - */ - virtual ThreadID getIDOfThread(ArchThread thread) = 0; + //! Returns an ID for a thread + /*! + Returns some ID number for \c thread. This is for logging purposes. + All thread objects referring to the same thread return the same ID. + However, clients should us isSameThread() to compare thread objects + instead of comparing IDs. + */ + virtual ThreadID getIDOfThread(ArchThread thread) = 0; - //! Set the interrupt handler - /*! - Sets the function to call on receipt of an external interrupt. - By default and when \p func is NULL, the main thread is cancelled. - */ - virtual void setSignalHandler(ESignal, SignalFunc func, - void* userData) = 0; + //! Set the interrupt handler + /*! + Sets the function to call on receipt of an external interrupt. + By default and when \p func is NULL, the main thread is cancelled. + */ + virtual void setSignalHandler(ESignal, SignalFunc func, + void* userData) = 0; - //! Invoke the signal handler - /*! - Invokes the signal handler for \p signal, if any. If no handler - cancels the main thread for \c kINTERRUPT and \c kTERMINATE and - ignores the call otherwise. - */ - virtual void raiseSignal(ESignal signal) = 0; + //! Invoke the signal handler + /*! + Invokes the signal handler for \p signal, if any. If no handler + cancels the main thread for \c kINTERRUPT and \c kTERMINATE and + ignores the call otherwise. + */ + virtual void raiseSignal(ESignal signal) = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchNetwork.h b/src/lib/arch/IArchNetwork.h index fa7e65ab..d71f8d88 100644 --- a/src/lib/arch/IArchNetwork.h +++ b/src/lib/arch/IArchNetwork.h @@ -60,223 +60,223 @@ synergy. Each architecture must implement this interface. */ class IArchNetwork : public IInterface { public: - //! Supported address families - enum EAddressFamily { - kUNKNOWN, - kINET, - }; + //! Supported address families + enum EAddressFamily { + kUNKNOWN, + kINET, + }; - //! Supported socket types - enum ESocketType { - kDGRAM, - kSTREAM - }; + //! Supported socket types + enum ESocketType { + kDGRAM, + kSTREAM + }; - //! Events for \c poll() - /*! - Events for \c poll() are bitmasks and can be combined using the - bitwise operators. - */ - enum { - kPOLLIN = 1, //!< Socket is readable - kPOLLOUT = 2, //!< Socket is writable - kPOLLERR = 4, //!< The socket is in an error state - kPOLLNVAL = 8 //!< The socket is invalid - }; + //! Events for \c poll() + /*! + Events for \c poll() are bitmasks and can be combined using the + bitwise operators. + */ + enum { + kPOLLIN = 1, //!< Socket is readable + kPOLLOUT = 2, //!< Socket is writable + kPOLLERR = 4, //!< The socket is in an error state + kPOLLNVAL = 8 //!< The socket is invalid + }; - //! A socket query for \c poll() - class PollEntry { - public: - //! The socket to query - ArchSocket m_socket; + //! A socket query for \c poll() + class PollEntry { + public: + //! The socket to query + ArchSocket m_socket; - //! The events to query for - /*! - The events to query for can be any combination of kPOLLIN and - kPOLLOUT. - */ - unsigned short m_events; + //! The events to query for + /*! + The events to query for can be any combination of kPOLLIN and + kPOLLOUT. + */ + unsigned short m_events; - //! The result events - unsigned short m_revents; - }; + //! The result events + unsigned short m_revents; + }; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Create a new socket - /*! - The socket is an opaque data type. - */ - virtual ArchSocket newSocket(EAddressFamily, ESocketType) = 0; + //! Create a new socket + /*! + The socket is an opaque data type. + */ + virtual ArchSocket newSocket(EAddressFamily, ESocketType) = 0; - //! Copy a socket object - /*! - Returns a reference to to socket referred to by \c s. - */ - virtual ArchSocket copySocket(ArchSocket s) = 0; + //! Copy a socket object + /*! + Returns a reference to to socket referred to by \c s. + */ + virtual ArchSocket copySocket(ArchSocket s) = 0; - //! Release a socket reference - /*! - Deletes the given socket object. This does not destroy the socket - the object referred to until there are no remaining references for - the socket. - */ - virtual void closeSocket(ArchSocket s) = 0; + //! Release a socket reference + /*! + Deletes the given socket object. This does not destroy the socket + the object referred to until there are no remaining references for + the socket. + */ + virtual void closeSocket(ArchSocket s) = 0; - //! Close socket for further reads - /*! - Calling this disallows future reads on socket \c s. - */ - virtual void closeSocketForRead(ArchSocket s) = 0; + //! Close socket for further reads + /*! + Calling this disallows future reads on socket \c s. + */ + virtual void closeSocketForRead(ArchSocket s) = 0; - //! Close socket for further writes - /*! - Calling this disallows future writes on socket \c s. - */ - virtual void closeSocketForWrite(ArchSocket s) = 0; + //! Close socket for further writes + /*! + Calling this disallows future writes on socket \c s. + */ + virtual void closeSocketForWrite(ArchSocket s) = 0; - //! Bind socket to address - /*! - Binds socket \c s to the address \c addr. - */ - virtual void bindSocket(ArchSocket s, ArchNetAddress addr) = 0; + //! Bind socket to address + /*! + Binds socket \c s to the address \c addr. + */ + virtual void bindSocket(ArchSocket s, ArchNetAddress addr) = 0; - //! Listen for connections on socket - /*! - Causes the socket \c s to begin listening for incoming connections. - */ - virtual void listenOnSocket(ArchSocket s) = 0; + //! Listen for connections on socket + /*! + Causes the socket \c s to begin listening for incoming connections. + */ + virtual void listenOnSocket(ArchSocket s) = 0; - //! Accept connection on socket - /*! - Accepts a connection on socket \c s, returning a new socket for the - connection and filling in \c addr with the address of the remote - end. \c addr may be NULL if the remote address isn't required. - The original socket \c s is unaffected and remains in the listening - state. The new socket shares most of the properties of \c s except - it's not in the listening state and it's connected. Returns NULL - if there are no pending connection requests. - */ - virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr) = 0; + //! Accept connection on socket + /*! + Accepts a connection on socket \c s, returning a new socket for the + connection and filling in \c addr with the address of the remote + end. \c addr may be NULL if the remote address isn't required. + The original socket \c s is unaffected and remains in the listening + state. The new socket shares most of the properties of \c s except + it's not in the listening state and it's connected. Returns NULL + if there are no pending connection requests. + */ + virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr) = 0; - //! Connect socket - /*! - Connects the socket \c s to the remote address \c addr. Returns - true if the connection succeed immediately, false if the connection - is in progress, and throws if the connection failed immediately. - If it returns false, \c pollSocket() can be used to wait on the - socket for writing to detect when the connection finally succeeds - or fails. - */ - virtual bool connectSocket(ArchSocket s, ArchNetAddress addr) = 0; + //! Connect socket + /*! + Connects the socket \c s to the remote address \c addr. Returns + true if the connection succeed immediately, false if the connection + is in progress, and throws if the connection failed immediately. + If it returns false, \c pollSocket() can be used to wait on the + socket for writing to detect when the connection finally succeeds + or fails. + */ + virtual bool connectSocket(ArchSocket s, ArchNetAddress addr) = 0; - //! Check socket state - /*! - Tests the state of \c num sockets for readability and/or writability. - Waits up to \c timeout seconds for some socket to become readable - and/or writable (or indefinitely if \c timeout < 0). Returns the - number of sockets that were readable (if readability was being - queried) or writable (if writablility was being queried) and sets - the \c m_revents members of the entries. \c kPOLLERR and \c kPOLLNVAL - are set in \c m_revents as appropriate. If a socket indicates - \c kPOLLERR then \c throwErrorOnSocket() can be used to determine - the type of error. Returns 0 immediately regardless of the \c timeout - if no valid sockets are selected for testing. + //! Check socket state + /*! + Tests the state of \c num sockets for readability and/or writability. + Waits up to \c timeout seconds for some socket to become readable + and/or writable (or indefinitely if \c timeout < 0). Returns the + number of sockets that were readable (if readability was being + queried) or writable (if writablility was being queried) and sets + the \c m_revents members of the entries. \c kPOLLERR and \c kPOLLNVAL + are set in \c m_revents as appropriate. If a socket indicates + \c kPOLLERR then \c throwErrorOnSocket() can be used to determine + the type of error. Returns 0 immediately regardless of the \c timeout + if no valid sockets are selected for testing. - (Cancellation point) - */ - virtual int pollSocket(PollEntry[], int num, double timeout) = 0; + (Cancellation point) + */ + virtual int pollSocket(PollEntry[], int num, double timeout) = 0; - //! Unblock thread in pollSocket() - /*! - Cause a thread that's in a pollSocket() call to return. This - call may return before the thread is unblocked. If the thread is - not in a pollSocket() call this call has no effect. - */ - virtual void unblockPollSocket(ArchThread thread) = 0; + //! Unblock thread in pollSocket() + /*! + Cause a thread that's in a pollSocket() call to return. This + call may return before the thread is unblocked. If the thread is + not in a pollSocket() call this call has no effect. + */ + virtual void unblockPollSocket(ArchThread thread) = 0; - //! Read data from socket - /*! - Read up to \c len bytes from socket \c s in \c buf and return the - number of bytes read. The number of bytes can be less than \c len - if not enough data is available. Returns 0 if the remote end has - disconnected and/or there is no more queued received data. - */ - virtual size_t readSocket(ArchSocket s, void* buf, size_t len) = 0; + //! Read data from socket + /*! + Read up to \c len bytes from socket \c s in \c buf and return the + number of bytes read. The number of bytes can be less than \c len + if not enough data is available. Returns 0 if the remote end has + disconnected and/or there is no more queued received data. + */ + virtual size_t readSocket(ArchSocket s, void* buf, size_t len) = 0; - //! Write data from socket - /*! - Write up to \c len bytes to socket \c s from \c buf and return the - number of bytes written. The number of bytes can be less than - \c len if the remote end disconnected or the internal buffers fill - up. - */ - virtual size_t writeSocket(ArchSocket s, - const void* buf, size_t len) = 0; + //! Write data from socket + /*! + Write up to \c len bytes to socket \c s from \c buf and return the + number of bytes written. The number of bytes can be less than + \c len if the remote end disconnected or the internal buffers fill + up. + */ + virtual size_t writeSocket(ArchSocket s, + const void* buf, size_t len) = 0; - //! Check error on socket - /*! - If the socket \c s is in an error state then throws an appropriate - XArchNetwork exception. - */ - virtual void throwErrorOnSocket(ArchSocket s) = 0; + //! Check error on socket + /*! + If the socket \c s is in an error state then throws an appropriate + XArchNetwork exception. + */ + virtual void throwErrorOnSocket(ArchSocket s) = 0; - //! Turn Nagle algorithm on or off on socket - /*! - Set socket to send messages immediately (true) or to collect small - messages into one packet (false). Returns the previous state. - */ - virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay) = 0; + //! Turn Nagle algorithm on or off on socket + /*! + Set socket to send messages immediately (true) or to collect small + messages into one packet (false). Returns the previous state. + */ + virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay) = 0; - //! Turn address reuse on or off on socket - /*! - Allows the address this socket is bound to to be reused while in the - TIME_WAIT state. Returns the previous state. - */ - virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse) = 0; + //! Turn address reuse on or off on socket + /*! + Allows the address this socket is bound to to be reused while in the + TIME_WAIT state. Returns the previous state. + */ + virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse) = 0; - //! Return local host's name - virtual std::string getHostName() = 0; + //! Return local host's name + virtual std::string getHostName() = 0; - //! Create an "any" network address - virtual ArchNetAddress newAnyAddr(EAddressFamily) = 0; + //! Create an "any" network address + virtual ArchNetAddress newAnyAddr(EAddressFamily) = 0; - //! Copy a network address - virtual ArchNetAddress copyAddr(ArchNetAddress) = 0; + //! Copy a network address + virtual ArchNetAddress copyAddr(ArchNetAddress) = 0; - //! Convert a name to a network address - virtual ArchNetAddress nameToAddr(const std::string&) = 0; + //! Convert a name to a network address + virtual ArchNetAddress nameToAddr(const std::string&) = 0; - //! Destroy a network address - virtual void closeAddr(ArchNetAddress) = 0; + //! Destroy a network address + virtual void closeAddr(ArchNetAddress) = 0; - //! Convert an address to a host name - virtual std::string addrToName(ArchNetAddress) = 0; + //! Convert an address to a host name + virtual std::string addrToName(ArchNetAddress) = 0; - //! Convert an address to a string - virtual std::string addrToString(ArchNetAddress) = 0; + //! Convert an address to a string + virtual std::string addrToString(ArchNetAddress) = 0; - //! Get an address's family - virtual EAddressFamily getAddrFamily(ArchNetAddress) = 0; + //! Get an address's family + virtual EAddressFamily getAddrFamily(ArchNetAddress) = 0; - //! Set the port of an address - virtual void setAddrPort(ArchNetAddress, int port) = 0; + //! Set the port of an address + virtual void setAddrPort(ArchNetAddress, int port) = 0; - //! Get the port of an address - virtual int getAddrPort(ArchNetAddress) = 0; + //! Get the port of an address + virtual int getAddrPort(ArchNetAddress) = 0; - //! Test addresses for equality - virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress) = 0; + //! Test addresses for equality + virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress) = 0; - //! Test for the "any" address - /*! - Returns true if \c addr is the "any" address. \c newAnyAddr() - returns an "any" address. - */ - virtual bool isAnyAddr(ArchNetAddress addr) = 0; + //! Test for the "any" address + /*! + Returns true if \c addr is the "any" address. \c newAnyAddr() + returns an "any" address. + */ + virtual bool isAnyAddr(ArchNetAddress addr) = 0; - //@} + //@} - virtual void init() = 0; + virtual void init() = 0; }; diff --git a/src/lib/arch/IArchSleep.h b/src/lib/arch/IArchSleep.h index 4b63e8f3..4a18a041 100644 --- a/src/lib/arch/IArchSleep.h +++ b/src/lib/arch/IArchSleep.h @@ -27,18 +27,18 @@ synergy. Each architecture must implement this interface. */ class IArchSleep : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Sleep - /*! - Blocks the calling thread for \c timeout seconds. If - \c timeout < 0.0 then the call returns immediately. If \c timeout - == 0.0 then the calling thread yields the CPU. + //! Sleep + /*! + Blocks the calling thread for \c timeout seconds. If + \c timeout < 0.0 then the call returns immediately. If \c timeout + == 0.0 then the calling thread yields the CPU. - (cancellation point) - */ - virtual void sleep(double timeout) = 0; + (cancellation point) + */ + virtual void sleep(double timeout) = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchString.cpp b/src/lib/arch/IArchString.cpp index ce0242ec..05cc2dfb 100644 --- a/src/lib/arch/IArchString.cpp +++ b/src/lib/arch/IArchString.cpp @@ -32,158 +32,158 @@ static ArchMutex s_mutex = NULL; IArchString::~IArchString() { - if (s_mutex != NULL) { - ARCH->closeMutex(s_mutex); - s_mutex = NULL; - } + if (s_mutex != NULL) { + ARCH->closeMutex(s_mutex); + s_mutex = NULL; + } } int IArchString::convStringWCToMB(char* dst, - const wchar_t* src, UInt32 n, bool* errors) + const wchar_t* src, UInt32 n, bool* errors) { - int len = 0; + int len = 0; - bool dummyErrors; - if (errors == NULL) { - errors = &dummyErrors; - } + bool dummyErrors; + if (errors == NULL) { + errors = &dummyErrors; + } - if (s_mutex == NULL) { - s_mutex = ARCH->newMutex(); - } + if (s_mutex == NULL) { + s_mutex = ARCH->newMutex(); + } - ARCH->lockMutex(s_mutex); + ARCH->lockMutex(s_mutex); - if (dst == NULL) { - char dummy[MB_LEN_MAX]; - for (const wchar_t* scan = src; n > 0; ++scan, --n) { - int mblen = wctomb(dummy, *scan); - if (mblen == -1) { - *errors = true; - mblen = 1; - } - len += mblen; - } - int mblen = wctomb(dummy, L'\0'); - if (mblen != -1) { - len += mblen - 1; - } - } - else { - char* dst0 = dst; - for (const wchar_t* scan = src; n > 0; ++scan, --n) { - int mblen = wctomb(dst, *scan); - if (mblen == -1) { - *errors = true; - *dst++ = '?'; - } - else { - dst += mblen; - } - } - int mblen = wctomb(dst, L'\0'); - if (mblen != -1) { - // don't include nul terminator - dst += mblen - 1; - } - len = (int)(dst - dst0); - } - ARCH->unlockMutex(s_mutex); + if (dst == NULL) { + char dummy[MB_LEN_MAX]; + for (const wchar_t* scan = src; n > 0; ++scan, --n) { + int mblen = wctomb(dummy, *scan); + if (mblen == -1) { + *errors = true; + mblen = 1; + } + len += mblen; + } + int mblen = wctomb(dummy, L'\0'); + if (mblen != -1) { + len += mblen - 1; + } + } + else { + char* dst0 = dst; + for (const wchar_t* scan = src; n > 0; ++scan, --n) { + int mblen = wctomb(dst, *scan); + if (mblen == -1) { + *errors = true; + *dst++ = '?'; + } + else { + dst += mblen; + } + } + int mblen = wctomb(dst, L'\0'); + if (mblen != -1) { + // don't include nul terminator + dst += mblen - 1; + } + len = (int)(dst - dst0); + } + ARCH->unlockMutex(s_mutex); - return len; + return len; } int IArchString::convStringMBToWC(wchar_t* dst, - const char* src, UInt32 n, bool* errors) + const char* src, UInt32 n, bool* errors) { - int len = 0; - wchar_t dummy; + int len = 0; + wchar_t dummy; - bool dummyErrors; - if (errors == NULL) { - errors = &dummyErrors; - } + bool dummyErrors; + if (errors == NULL) { + errors = &dummyErrors; + } - if (s_mutex == NULL) { - s_mutex = ARCH->newMutex(); - } + if (s_mutex == NULL) { + s_mutex = ARCH->newMutex(); + } - ARCH->lockMutex(s_mutex); + ARCH->lockMutex(s_mutex); - if (dst == NULL) { - for (const char* scan = src; n > 0; ) { - int mblen = mbtowc(&dummy, scan, n); - switch (mblen) { - case -2: - // incomplete last character. convert to unknown character. - *errors = true; - len += 1; - n = 0; - break; + if (dst == NULL) { + for (const char* scan = src; n > 0; ) { + int mblen = mbtowc(&dummy, scan, n); + switch (mblen) { + case -2: + // incomplete last character. convert to unknown character. + *errors = true; + len += 1; + n = 0; + break; - case -1: - // invalid character. count one unknown character and - // start at the next byte. - *errors = true; - len += 1; - scan += 1; - n -= 1; - break; + case -1: + // invalid character. count one unknown character and + // start at the next byte. + *errors = true; + len += 1; + scan += 1; + n -= 1; + break; - case 0: - len += 1; - scan += 1; - n -= 1; - break; + case 0: + len += 1; + scan += 1; + n -= 1; + break; - default: - // normal character - len += 1; - scan += mblen; - n -= mblen; - break; - } - } - } - else { - wchar_t* dst0 = dst; - for (const char* scan = src; n > 0; ++dst) { - int mblen = mbtowc(dst, scan, n); - switch (mblen) { - case -2: - // incomplete character. convert to unknown character. - *errors = true; - *dst = (wchar_t)0xfffd; - n = 0; - break; + default: + // normal character + len += 1; + scan += mblen; + n -= mblen; + break; + } + } + } + else { + wchar_t* dst0 = dst; + for (const char* scan = src; n > 0; ++dst) { + int mblen = mbtowc(dst, scan, n); + switch (mblen) { + case -2: + // incomplete character. convert to unknown character. + *errors = true; + *dst = (wchar_t)0xfffd; + n = 0; + break; - case -1: - // invalid character. count one unknown character and - // start at the next byte. - *errors = true; - *dst = (wchar_t)0xfffd; - scan += 1; - n -= 1; - break; + case -1: + // invalid character. count one unknown character and + // start at the next byte. + *errors = true; + *dst = (wchar_t)0xfffd; + scan += 1; + n -= 1; + break; - case 0: - *dst = (wchar_t)0x0000; - scan += 1; - n -= 1; - break; + case 0: + *dst = (wchar_t)0x0000; + scan += 1; + n -= 1; + break; - default: - // normal character - scan += mblen; - n -= mblen; - break; - } - } - len = (int)(dst - dst0); - } - ARCH->unlockMutex(s_mutex); + default: + // normal character + scan += mblen; + n -= mblen; + break; + } + } + len = (int)(dst - dst0); + } + ARCH->unlockMutex(s_mutex); - return len; + return len; } diff --git a/src/lib/arch/IArchString.h b/src/lib/arch/IArchString.h index 074ec02b..62ae5c0c 100644 --- a/src/lib/arch/IArchString.h +++ b/src/lib/arch/IArchString.h @@ -30,43 +30,43 @@ synergy. Each architecture must implement this interface. */ class IArchString : public IInterface { public: - virtual ~IArchString(); + virtual ~IArchString(); - //! Wide character encodings - /*! - The known wide character encodings - */ - enum EWideCharEncoding { - kUCS2, //!< The UCS-2 encoding - kUCS4, //!< The UCS-4 encoding - kUTF16, //!< The UTF-16 encoding - kUTF32 //!< The UTF-32 encoding - }; + //! Wide character encodings + /*! + The known wide character encodings + */ + enum EWideCharEncoding { + kUCS2, //!< The UCS-2 encoding + kUCS4, //!< The UCS-4 encoding + kUTF16, //!< The UTF-16 encoding + kUTF32 //!< The UTF-32 encoding + }; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! printf() to limited size buffer with va_list - /*! - This method is equivalent to vsprintf() except it will not write - more than \c n bytes to the buffer, returning -1 if the output - was truncated and the number of bytes written not including the - trailing NUL otherwise. - */ - virtual int vsnprintf(char* str, - int size, const char* fmt, va_list ap); + //! printf() to limited size buffer with va_list + /*! + This method is equivalent to vsprintf() except it will not write + more than \c n bytes to the buffer, returning -1 if the output + was truncated and the number of bytes written not including the + trailing NUL otherwise. + */ + virtual int vsnprintf(char* str, + int size, const char* fmt, va_list ap); - //! Convert multibyte string to wide character string - virtual int convStringMBToWC(wchar_t*, - const char*, UInt32 n, bool* errors); + //! Convert multibyte string to wide character string + virtual int convStringMBToWC(wchar_t*, + const char*, UInt32 n, bool* errors); - //! Convert wide character string to multibyte string - virtual int convStringWCToMB(char*, - const wchar_t*, UInt32 n, bool* errors); + //! Convert wide character string to multibyte string + virtual int convStringWCToMB(char*, + const wchar_t*, UInt32 n, bool* errors); - //! Return the architecture's native wide character encoding - virtual EWideCharEncoding - getWideCharEncoding() = 0; + //! Return the architecture's native wide character encoding + virtual EWideCharEncoding + getWideCharEncoding() = 0; - //@} + //@} }; diff --git a/src/lib/arch/IArchSystem.h b/src/lib/arch/IArchSystem.h index 0a05b6e6..dbff79be 100644 --- a/src/lib/arch/IArchSystem.h +++ b/src/lib/arch/IArchSystem.h @@ -27,40 +27,40 @@ This interface defines operations for querying system info. */ class IArchSystem : public IInterface { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Identify the OS - /*! - Returns a string identifying the operating system. - */ - virtual std::string getOSName() const = 0; + //! Identify the OS + /*! + Returns a string identifying the operating system. + */ + virtual std::string getOSName() const = 0; - //! Identify the platform - /*! - Returns a string identifying the platform this OS is running on. - */ - virtual std::string getPlatformName() const = 0; - //@} + //! Identify the platform + /*! + Returns a string identifying the platform this OS is running on. + */ + virtual std::string getPlatformName() const = 0; + //@} - //! Get a Synergy setting - /*! - Reads a Synergy setting from the system. - */ - virtual std::string setting(const std::string& valueName) const = 0; - //@} + //! Get a Synergy setting + /*! + Reads a Synergy setting from the system. + */ + virtual std::string setting(const std::string& valueName) const = 0; + //@} - //! Set a Synergy setting - /*! - Writes a Synergy setting from the system. - */ - virtual void setting(const std::string& valueName, const std::string& valueString) const = 0; - //@} + //! Set a Synergy setting + /*! + Writes a Synergy setting from the system. + */ + virtual void setting(const std::string& valueName, const std::string& valueString) const = 0; + //@} - //! Get the pathnames of the libraries used by Synergy - /* - Returns a string containing the full path names of all loaded libraries at the point it is called. - */ - virtual std::string getLibsUsed(void) const = 0; - //@} + //! Get the pathnames of the libraries used by Synergy + /* + Returns a string containing the full path names of all loaded libraries at the point it is called. + */ + virtual std::string getLibsUsed(void) const = 0; + //@} }; diff --git a/src/lib/arch/IArchTaskBar.h b/src/lib/arch/IArchTaskBar.h index 82912380..abf48fd3 100644 --- a/src/lib/arch/IArchTaskBar.h +++ b/src/lib/arch/IArchTaskBar.h @@ -30,34 +30,34 @@ though each operation can be a no-op. */ class IArchTaskBar : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Add a receiver - /*! - Add a receiver object to be notified of user and application - events. This should be called before other methods. When - the receiver is added to the task bar, its icon appears on - the task bar. - */ - virtual void addReceiver(IArchTaskBarReceiver*) = 0; + //! Add a receiver + /*! + Add a receiver object to be notified of user and application + events. This should be called before other methods. When + the receiver is added to the task bar, its icon appears on + the task bar. + */ + virtual void addReceiver(IArchTaskBarReceiver*) = 0; - //! Remove a receiver - /*! - Remove a receiver object from the task bar. This removes the - icon from the task bar. - */ - virtual void removeReceiver(IArchTaskBarReceiver*) = 0; + //! Remove a receiver + /*! + Remove a receiver object from the task bar. This removes the + icon from the task bar. + */ + virtual void removeReceiver(IArchTaskBarReceiver*) = 0; - //! Update a receiver - /*! - Updates the display of the receiver on the task bar. This - should be called when the receiver appearance may have changed - (e.g. it's icon or tool tip has changed). - */ - virtual void updateReceiver(IArchTaskBarReceiver*) = 0; + //! Update a receiver + /*! + Updates the display of the receiver on the task bar. This + should be called when the receiver appearance may have changed + (e.g. it's icon or tool tip has changed). + */ + virtual void updateReceiver(IArchTaskBarReceiver*) = 0; - //@} + //@} - virtual void init() = 0; + virtual void init() = 0; }; diff --git a/src/lib/arch/IArchTaskBarReceiver.h b/src/lib/arch/IArchTaskBarReceiver.h index 2da51fa9..aa6fc7f5 100644 --- a/src/lib/arch/IArchTaskBarReceiver.h +++ b/src/lib/arch/IArchTaskBarReceiver.h @@ -32,67 +32,67 @@ though each operation can be a no-op. */ class IArchTaskBarReceiver : public IInterface { public: - // Icon data is architecture dependent - typedef void* Icon; + // Icon data is architecture dependent + typedef void* Icon; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Show status window - /*! - Open a window displaying current status. This should return - immediately without waiting for the window to be closed. - */ - virtual void showStatus() = 0; + //! Show status window + /*! + Open a window displaying current status. This should return + immediately without waiting for the window to be closed. + */ + virtual void showStatus() = 0; - //! Popup menu - /*! - Popup a menu of operations at or around \c x,y and perform the - chosen operation. - */ - virtual void runMenu(int x, int y) = 0; + //! Popup menu + /*! + Popup a menu of operations at or around \c x,y and perform the + chosen operation. + */ + virtual void runMenu(int x, int y) = 0; - //! Perform primary action - /*! - Perform the primary (default) action. - */ - virtual void primaryAction() = 0; + //! Perform primary action + /*! + Perform the primary (default) action. + */ + virtual void primaryAction() = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Lock receiver - /*! - Locks the receiver from changing state. The receiver should be - locked when querying it's state to ensure consistent results. - Each call to \c lock() must have a matching \c unlock() and - locks cannot be nested. - */ - virtual void lock() const = 0; + //! Lock receiver + /*! + Locks the receiver from changing state. The receiver should be + locked when querying it's state to ensure consistent results. + Each call to \c lock() must have a matching \c unlock() and + locks cannot be nested. + */ + virtual void lock() const = 0; - //! Unlock receiver - virtual void unlock() const = 0; + //! Unlock receiver + virtual void unlock() const = 0; - //! Get icon - /*! - Returns the icon to display in the task bar. The interface - to set the icon is left to subclasses. Getting and setting - the icon must be thread safe. - */ - virtual const Icon getIcon() const = 0; + //! Get icon + /*! + Returns the icon to display in the task bar. The interface + to set the icon is left to subclasses. Getting and setting + the icon must be thread safe. + */ + virtual const Icon getIcon() const = 0; - //! Get tooltip - /*! - Returns the tool tip to display in the task bar. The interface - to set the tooltip is left to sublclasses. Getting and setting - the icon must be thread safe. - */ - virtual std::string getToolTip() const = 0; + //! Get tooltip + /*! + Returns the tool tip to display in the task bar. The interface + to set the tooltip is left to sublclasses. Getting and setting + the icon must be thread safe. + */ + virtual std::string getToolTip() const = 0; - virtual void updateStatus(INode*, const String& errorMsg) = 0; + virtual void updateStatus(INode*, const String& errorMsg) = 0; - virtual void cleanup() {} + virtual void cleanup() {} - //@} + //@} }; diff --git a/src/lib/arch/IArchTime.h b/src/lib/arch/IArchTime.h index 2ed170af..e59baf43 100644 --- a/src/lib/arch/IArchTime.h +++ b/src/lib/arch/IArchTime.h @@ -27,15 +27,15 @@ synergy. Each architecture must implement this interface. */ class IArchTime : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Get the current time - /*! - Returns the number of seconds since some arbitrary starting time. - This should return as high a precision as reasonable. - */ - virtual double time() = 0; + //! Get the current time + /*! + Returns the number of seconds since some arbitrary starting time. + This should return as high a precision as reasonable. + */ + virtual double time() = 0; - //@} + //@} }; diff --git a/src/lib/arch/XArch.h b/src/lib/arch/XArch.h index ef01affb..62245270 100644 --- a/src/lib/arch/XArch.h +++ b/src/lib/arch/XArch.h @@ -44,7 +44,7 @@ exceptions. Put this in your catch (...) handler after necessary cleanup but before leaving or returning from the handler. */ #define RETHROW_XTHREAD \ - try { throw; } catch (XThread&) { throw; } catch (...) { } + try { throw; } catch (XThread&) { throw; } catch (...) { } //! Lazy error message string evaluation /*! @@ -55,26 +55,26 @@ string for that error code. */ class XArchEval { public: - XArchEval() { } - virtual ~XArchEval() _NOEXCEPT { } - - virtual std::string eval() const = 0; + XArchEval() { } + virtual ~XArchEval() _NOEXCEPT { } + + virtual std::string eval() const = 0; }; //! Generic exception architecture dependent library class XArch : public std::runtime_error { public: - XArch(XArchEval* adopted) : std::runtime_error(adopted->eval()) { delete adopted; } - XArch(const std::string& msg) : std::runtime_error(msg) { } - virtual ~XArch() _NOEXCEPT { } + XArch(XArchEval* adopted) : std::runtime_error(adopted->eval()) { delete adopted; } + XArch(const std::string& msg) : std::runtime_error(msg) { } + virtual ~XArch() _NOEXCEPT { } }; // Macro to declare XArch derived types -#define XARCH_SUBCLASS(name_, super_) \ -class name_ : public super_ { \ -public: \ - name_(XArchEval* adoptedEvaluator) : super_(adoptedEvaluator) { } \ - name_(const std::string& msg) : super_(msg) { } \ +#define XARCH_SUBCLASS(name_, super_) \ +class name_ : public super_ { \ +public: \ + name_(XArchEval* adoptedEvaluator) : super_(adoptedEvaluator) { } \ + name_(const std::string& msg) : super_(msg) { } \ } //! Generic network exception diff --git a/src/lib/arch/multibyte.h b/src/lib/arch/multibyte.h index 88f421b9..3ab48a3a 100644 --- a/src/lib/arch/multibyte.h +++ b/src/lib/arch/multibyte.h @@ -25,32 +25,32 @@ #include #include #if HAVE_LOCALE_H -# include +# include #endif #if HAVE_WCHAR_H || defined(_MSC_VER) -# include +# include #elif __APPLE__ - // wtf? Darwin puts mbtowc() et al. in stdlib -# include + // wtf? Darwin puts mbtowc() et al. in stdlib +# include #else - // platform apparently has no wchar_t support. provide dummy - // implementations. hopefully at least the C++ compiler has - // a built-in wchar_t type. + // platform apparently has no wchar_t support. provide dummy + // implementations. hopefully at least the C++ compiler has + // a built-in wchar_t type. static inline int mbtowc(wchar_t* dst, const char* src, int n) { - *dst = static_cast(*src); - return 1; + *dst = static_cast(*src); + return 1; } static inline int wctomb(char* dst, wchar_t src) { - *dst = static_cast(src); - return 1; + *dst = static_cast(src); + return 1; } #endif diff --git a/src/lib/arch/unix/ArchConsoleUnix.h b/src/lib/arch/unix/ArchConsoleUnix.h index fb868301..718c2dc6 100644 --- a/src/lib/arch/unix/ArchConsoleUnix.h +++ b/src/lib/arch/unix/ArchConsoleUnix.h @@ -24,6 +24,6 @@ class ArchConsoleUnix : public ArchConsoleStd { public: - ArchConsoleUnix(); - virtual ~ArchConsoleUnix(); + ArchConsoleUnix(); + virtual ~ArchConsoleUnix(); }; diff --git a/src/lib/arch/unix/ArchDaemonUnix.cpp b/src/lib/arch/unix/ArchDaemonUnix.cpp index f12ee8f1..9041e1a0 100644 --- a/src/lib/arch/unix/ArchDaemonUnix.cpp +++ b/src/lib/arch/unix/ArchDaemonUnix.cpp @@ -34,12 +34,12 @@ ArchDaemonUnix::ArchDaemonUnix() { - // do nothing + // do nothing } ArchDaemonUnix::~ArchDaemonUnix() { - // do nothing + // do nothing } @@ -51,17 +51,17 @@ ArchDaemonUnix::~ArchDaemonUnix() int execSelfNonDaemonized() { - extern char** NXArgv; - char** selfArgv = NXArgv; - - setenv("_SYNERGY_DAEMONIZED", "", 1); - - execvp(selfArgv[0], selfArgv); - return 0; + extern char** NXArgv; + char** selfArgv = NXArgv; + + setenv("_SYNERGY_DAEMONIZED", "", 1); + + execvp(selfArgv[0], selfArgv); + return 0; } bool alreadyDaemonized() { - return getenv("_SYNERGY_DAEMONIZED") != NULL; + return getenv("_SYNERGY_DAEMONIZED") != NULL; } #endif @@ -70,63 +70,63 @@ int ArchDaemonUnix::daemonize(const char* name, DaemonFunc func) { #ifdef __APPLE__ - if (alreadyDaemonized()) - return func(1, &name); + if (alreadyDaemonized()) + return func(1, &name); #endif - - // fork so shell thinks we're done and so we're not a process - // group leader - switch (fork()) { - case -1: - // failed - throw XArchDaemonFailed(new XArchEvalUnix(errno)); + + // fork so shell thinks we're done and so we're not a process + // group leader + switch (fork()) { + case -1: + // failed + throw XArchDaemonFailed(new XArchEvalUnix(errno)); - case 0: - // child - break; + case 0: + // child + break; - default: - // parent exits - exit(0); - } + default: + // parent exits + exit(0); + } - // become leader of a new session - setsid(); - + // become leader of a new session + setsid(); + #ifndef __APPLE__ - // NB: don't run chdir on apple; causes strange behaviour. - // chdir to root so we don't keep mounted filesystems points busy - // TODO: this is a bit of a hack - can we find a better solution? - int chdirErr = chdir("/"); - if (chdirErr) - // NB: file logging actually isn't working at this point! - LOG((CLOG_ERR "chdir error: %i", chdirErr)); + // NB: don't run chdir on apple; causes strange behaviour. + // chdir to root so we don't keep mounted filesystems points busy + // TODO: this is a bit of a hack - can we find a better solution? + int chdirErr = chdir("/"); + if (chdirErr) + // NB: file logging actually isn't working at this point! + LOG((CLOG_ERR "chdir error: %i", chdirErr)); #endif - // mask off permissions for any but owner - umask(077); + // mask off permissions for any but owner + umask(077); - // close open files. we only expect stdin, stdout, stderr to be open. - close(0); - close(1); - close(2); + // close open files. we only expect stdin, stdout, stderr to be open. + close(0); + close(1); + close(2); - // attach file descriptors 0, 1, 2 to /dev/null so inadvertent use - // of standard I/O safely goes in the bit bucket. - open("/dev/null", O_RDONLY); - open("/dev/null", O_RDWR); - - int dupErr = dup(1); + // attach file descriptors 0, 1, 2 to /dev/null so inadvertent use + // of standard I/O safely goes in the bit bucket. + open("/dev/null", O_RDONLY); + open("/dev/null", O_RDWR); + + int dupErr = dup(1); - if (dupErr < 0) { - // NB: file logging actually isn't working at this point! - LOG((CLOG_ERR "dup error: %i", dupErr)); - } - + if (dupErr < 0) { + // NB: file logging actually isn't working at this point! + LOG((CLOG_ERR "dup error: %i", dupErr)); + } + #ifdef __APPLE__ - return execSelfNonDaemonized(); + return execSelfNonDaemonized(); #endif - - // invoke function - return func(1, &name); + + // invoke function + return func(1, &name); } diff --git a/src/lib/arch/unix/ArchDaemonUnix.h b/src/lib/arch/unix/ArchDaemonUnix.h index f315d923..0098a090 100644 --- a/src/lib/arch/unix/ArchDaemonUnix.h +++ b/src/lib/arch/unix/ArchDaemonUnix.h @@ -26,11 +26,11 @@ //! Unix implementation of IArchDaemon class ArchDaemonUnix : public ArchDaemonNone { public: - ArchDaemonUnix(); - virtual ~ArchDaemonUnix(); + ArchDaemonUnix(); + virtual ~ArchDaemonUnix(); - // IArchDaemon overrides - virtual int daemonize(const char* name, DaemonFunc func); + // IArchDaemon overrides + virtual int daemonize(const char* name, DaemonFunc func); }; #define CONFIG_FILE "/etc/synergy/synergyd.conf" diff --git a/src/lib/arch/unix/ArchFileUnix.cpp b/src/lib/arch/unix/ArchFileUnix.cpp index 9dcc0b07..4558720c 100644 --- a/src/lib/arch/unix/ArchFileUnix.cpp +++ b/src/lib/arch/unix/ArchFileUnix.cpp @@ -30,134 +30,134 @@ ArchFileUnix::ArchFileUnix() { - // do nothing + // do nothing } ArchFileUnix::~ArchFileUnix() { - // do nothing + // do nothing } const char* ArchFileUnix::getBasename(const char* pathname) { - if (pathname == NULL) { - return NULL; - } + if (pathname == NULL) { + return NULL; + } - const char* basename = strrchr(pathname, '/'); - if (basename != NULL) { - return basename + 1; - } - else { - return pathname; - } + const char* basename = strrchr(pathname, '/'); + if (basename != NULL) { + return basename + 1; + } + else { + return pathname; + } } std::string ArchFileUnix::getUserDirectory() { - char* buffer = NULL; - std::string dir; + char* buffer = NULL; + std::string dir; #if HAVE_GETPWUID_R - struct passwd pwent; - struct passwd* pwentp; + struct passwd pwent; + struct passwd* pwentp; #if defined(_SC_GETPW_R_SIZE_MAX) - long size = sysconf(_SC_GETPW_R_SIZE_MAX); - if (size == -1) { - size = BUFSIZ; - } + long size = sysconf(_SC_GETPW_R_SIZE_MAX); + if (size == -1) { + size = BUFSIZ; + } #else - long size = BUFSIZ; + long size = BUFSIZ; #endif - buffer = new char[size]; - getpwuid_r(getuid(), &pwent, buffer, size, &pwentp); + buffer = new char[size]; + getpwuid_r(getuid(), &pwent, buffer, size, &pwentp); #else - struct passwd* pwentp = getpwuid(getuid()); + struct passwd* pwentp = getpwuid(getuid()); #endif - if (pwentp != NULL && pwentp->pw_dir != NULL) { - dir = pwentp->pw_dir; - } - delete[] buffer; - return dir; + if (pwentp != NULL && pwentp->pw_dir != NULL) { + dir = pwentp->pw_dir; + } + delete[] buffer; + return dir; } std::string ArchFileUnix::getSystemDirectory() { - return "/etc"; + return "/etc"; } std::string ArchFileUnix::getInstalledDirectory() { #if WINAPI_XWINDOWS - return "/usr/bin"; + return "/usr/bin"; #else - return "/Applications/Synergy.app/Contents/MacOS"; + return "/Applications/Synergy.app/Contents/MacOS"; #endif } std::string ArchFileUnix::getLogDirectory() { - return "/var/log"; + return "/var/log"; } std::string ArchFileUnix::getPluginDirectory() { - if (!m_pluginDirectory.empty()) { - return m_pluginDirectory; - } + if (!m_pluginDirectory.empty()) { + return m_pluginDirectory; + } #if WINAPI_XWINDOWS - return getProfileDirectory().append("/plugins"); + return getProfileDirectory().append("/plugins"); #else - return getProfileDirectory().append("/Plugins"); + return getProfileDirectory().append("/Plugins"); #endif } std::string ArchFileUnix::getProfileDirectory() { - String dir; - if (!m_profileDirectory.empty()) { - dir = m_profileDirectory; - } - else { + String dir; + if (!m_profileDirectory.empty()) { + dir = m_profileDirectory; + } + else { #if WINAPI_XWINDOWS - dir = getUserDirectory().append("/.synergy"); + dir = getUserDirectory().append("/.synergy"); #else - dir = getUserDirectory().append("/Library/Synergy"); + dir = getUserDirectory().append("/Library/Synergy"); #endif - } - return dir; + } + return dir; } std::string ArchFileUnix::concatPath(const std::string& prefix, - const std::string& suffix) + const std::string& suffix) { - std::string path; - path.reserve(prefix.size() + 1 + suffix.size()); - path += prefix; - if (path.size() == 0 || path[path.size() - 1] != '/') { - path += '/'; - } - path += suffix; - return path; + std::string path; + path.reserve(prefix.size() + 1 + suffix.size()); + path += prefix; + if (path.size() == 0 || path[path.size() - 1] != '/') { + path += '/'; + } + path += suffix; + return path; } void ArchFileUnix::setProfileDirectory(const String& s) { - m_profileDirectory = s; + m_profileDirectory = s; } void ArchFileUnix::setPluginDirectory(const String& s) { - m_pluginDirectory = s; + m_pluginDirectory = s; } diff --git a/src/lib/arch/unix/ArchFileUnix.h b/src/lib/arch/unix/ArchFileUnix.h index cbf78668..fe58f802 100644 --- a/src/lib/arch/unix/ArchFileUnix.h +++ b/src/lib/arch/unix/ArchFileUnix.h @@ -25,23 +25,23 @@ //! Unix implementation of IArchFile class ArchFileUnix : public IArchFile { public: - ArchFileUnix(); - virtual ~ArchFileUnix(); + ArchFileUnix(); + virtual ~ArchFileUnix(); - // IArchFile overrides - virtual const char* getBasename(const char* pathname); - virtual std::string getUserDirectory(); - virtual std::string getSystemDirectory(); - virtual std::string getInstalledDirectory(); - virtual std::string getLogDirectory(); - virtual std::string getPluginDirectory(); - virtual std::string getProfileDirectory(); - virtual std::string concatPath(const std::string& prefix, - const std::string& suffix); - virtual void setProfileDirectory(const String& s); - virtual void setPluginDirectory(const String& s); + // IArchFile overrides + virtual const char* getBasename(const char* pathname); + virtual std::string getUserDirectory(); + virtual std::string getSystemDirectory(); + virtual std::string getInstalledDirectory(); + virtual std::string getLogDirectory(); + virtual std::string getPluginDirectory(); + virtual std::string getProfileDirectory(); + virtual std::string concatPath(const std::string& prefix, + const std::string& suffix); + virtual void setProfileDirectory(const String& s); + virtual void setPluginDirectory(const String& s); private: - String m_profileDirectory; - String m_pluginDirectory; + String m_profileDirectory; + String m_pluginDirectory; }; diff --git a/src/lib/arch/unix/ArchInternetUnix.cpp b/src/lib/arch/unix/ArchInternetUnix.cpp index fe4a39ba..06326ed6 100644 --- a/src/lib/arch/unix/ArchInternetUnix.cpp +++ b/src/lib/arch/unix/ArchInternetUnix.cpp @@ -26,13 +26,13 @@ class CurlFacade { public: - CurlFacade(); - ~CurlFacade(); - String get(const String& url); - String urlEncode(const String& url); + CurlFacade(); + ~CurlFacade(); + String get(const String& url); + String urlEncode(const String& url); private: - CURL* m_curl; + CURL* m_curl; }; // @@ -42,15 +42,15 @@ private: String ArchInternetUnix::get(const String& url) { - CurlFacade curl; - return curl.get(url); + CurlFacade curl; + return curl.get(url); } String ArchInternetUnix::urlEncode(const String& url) { - CurlFacade curl; - return curl.urlEncode(url); + CurlFacade curl; + return curl.urlEncode(url); } // @@ -65,62 +65,62 @@ curlWriteCallback(void *contents, size_t size, size_t nmemb, void *userp) } CurlFacade::CurlFacade() : - m_curl(NULL) + m_curl(NULL) { - CURLcode init = curl_global_init(CURL_GLOBAL_ALL); - if (init != CURLE_OK) { - throw XArch("CURL global init failed."); - } + CURLcode init = curl_global_init(CURL_GLOBAL_ALL); + if (init != CURLE_OK) { + throw XArch("CURL global init failed."); + } - m_curl = curl_easy_init(); - if (m_curl == NULL) { - throw XArch("CURL easy init failed."); - } + m_curl = curl_easy_init(); + if (m_curl == NULL) { + throw XArch("CURL easy init failed."); + } } CurlFacade::~CurlFacade() { - if (m_curl != NULL) { - curl_easy_cleanup(m_curl); - } + if (m_curl != NULL) { + curl_easy_cleanup(m_curl); + } - curl_global_cleanup(); + curl_global_cleanup(); } String CurlFacade::get(const String& url) { - curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str()); - curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curlWriteCallback); + curl_easy_setopt(m_curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curlWriteCallback); - std::stringstream userAgent; - userAgent << "Synergy "; - userAgent << kVersion; - curl_easy_setopt(m_curl, CURLOPT_USERAGENT, userAgent.str().c_str()); - - std::string result; - curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &result); - - CURLcode code = curl_easy_perform(m_curl); - if (code != CURLE_OK) { - LOG((CLOG_ERR "curl perform error: %s", curl_easy_strerror(code))); - throw XArch("CURL perform failed."); - } - + std::stringstream userAgent; + userAgent << "Synergy "; + userAgent << kVersion; + curl_easy_setopt(m_curl, CURLOPT_USERAGENT, userAgent.str().c_str()); + + std::string result; + curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &result); + + CURLcode code = curl_easy_perform(m_curl); + if (code != CURLE_OK) { + LOG((CLOG_ERR "curl perform error: %s", curl_easy_strerror(code))); + throw XArch("CURL perform failed."); + } + return result; } String CurlFacade::urlEncode(const String& url) { - char* resultCStr = curl_easy_escape(m_curl, url.c_str(), 0); + char* resultCStr = curl_easy_escape(m_curl, url.c_str(), 0); - if (resultCStr == NULL) { - throw XArch("CURL escape failed."); - } - - std::string result(resultCStr); - curl_free(resultCStr); + if (resultCStr == NULL) { + throw XArch("CURL escape failed."); + } + + std::string result(resultCStr); + curl_free(resultCStr); - return result; + return result; } diff --git a/src/lib/arch/unix/ArchInternetUnix.h b/src/lib/arch/unix/ArchInternetUnix.h index 13581fcc..6fcf2b59 100644 --- a/src/lib/arch/unix/ArchInternetUnix.h +++ b/src/lib/arch/unix/ArchInternetUnix.h @@ -23,6 +23,6 @@ class ArchInternetUnix { public: - String get(const String& url); - String urlEncode(const String& url); + String get(const String& url); + String urlEncode(const String& url); }; diff --git a/src/lib/arch/unix/ArchLogUnix.cpp b/src/lib/arch/unix/ArchLogUnix.cpp index f5e116ee..070e0272 100644 --- a/src/lib/arch/unix/ArchLogUnix.cpp +++ b/src/lib/arch/unix/ArchLogUnix.cpp @@ -26,59 +26,59 @@ ArchLogUnix::ArchLogUnix() { - // do nothing + // do nothing } ArchLogUnix::~ArchLogUnix() { - // do nothing + // do nothing } void ArchLogUnix::openLog(const char* name) { - openlog(name, 0, LOG_DAEMON); + openlog(name, 0, LOG_DAEMON); } void ArchLogUnix::closeLog() { - closelog(); + closelog(); } void ArchLogUnix::showLog(bool) { - // do nothing + // do nothing } void ArchLogUnix::writeLog(ELevel level, const char* msg) { - // convert level - int priority; - switch (level) { - case kERROR: - priority = LOG_ERR; - break; + // convert level + int priority; + switch (level) { + case kERROR: + priority = LOG_ERR; + break; - case kWARNING: - priority = LOG_WARNING; - break; + case kWARNING: + priority = LOG_WARNING; + break; - case kNOTE: - priority = LOG_NOTICE; - break; + case kNOTE: + priority = LOG_NOTICE; + break; - case kINFO: - priority = LOG_INFO; - break; + case kINFO: + priority = LOG_INFO; + break; - default: - priority = LOG_DEBUG; - break; - } + default: + priority = LOG_DEBUG; + break; + } - // log it - syslog(priority, "%s", msg); + // log it + syslog(priority, "%s", msg); } diff --git a/src/lib/arch/unix/ArchLogUnix.h b/src/lib/arch/unix/ArchLogUnix.h index d5fe1d8e..08f04fd4 100644 --- a/src/lib/arch/unix/ArchLogUnix.h +++ b/src/lib/arch/unix/ArchLogUnix.h @@ -25,12 +25,12 @@ //! Unix implementation of IArchLog class ArchLogUnix : public IArchLog { public: - ArchLogUnix(); - virtual ~ArchLogUnix(); + ArchLogUnix(); + virtual ~ArchLogUnix(); - // IArchLog overrides - virtual void openLog(const char* name); - virtual void closeLog(); - virtual void showLog(bool); - virtual void writeLog(ELevel, const char*); + // IArchLog overrides + virtual void openLog(const char* name); + virtual void closeLog(); + virtual void showLog(bool); + virtual void writeLog(ELevel, const char*); }; diff --git a/src/lib/arch/unix/ArchMultithreadPosix.cpp b/src/lib/arch/unix/ArchMultithreadPosix.cpp index 33da29b4..23a348aa 100644 --- a/src/lib/arch/unix/ArchMultithreadPosix.cpp +++ b/src/lib/arch/unix/ArchMultithreadPosix.cpp @@ -23,39 +23,39 @@ #include #if TIME_WITH_SYS_TIME -# include -# include +# include +# include #else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif #endif #include #define SIGWAKEUP SIGUSR1 #if !HAVE_PTHREAD_SIGNAL - // boy, is this platform broken. forget about pthread signal - // handling and let signals through to every process. synergy - // will not terminate cleanly when it gets SIGTERM or SIGINT. -# define pthread_sigmask sigprocmask -# define pthread_kill(tid_, sig_) kill(0, (sig_)) -# define sigwait(set_, sig_) -# undef HAVE_POSIX_SIGWAIT -# define HAVE_POSIX_SIGWAIT 1 + // boy, is this platform broken. forget about pthread signal + // handling and let signals through to every process. synergy + // will not terminate cleanly when it gets SIGTERM or SIGINT. +# define pthread_sigmask sigprocmask +# define pthread_kill(tid_, sig_) kill(0, (sig_)) +# define sigwait(set_, sig_) +# undef HAVE_POSIX_SIGWAIT +# define HAVE_POSIX_SIGWAIT 1 #endif static void setSignalSet(sigset_t* sigset) { - sigemptyset(sigset); - sigaddset(sigset, SIGHUP); - sigaddset(sigset, SIGINT); - sigaddset(sigset, SIGTERM); - sigaddset(sigset, SIGUSR2); + sigemptyset(sigset); + sigaddset(sigset, SIGHUP); + sigaddset(sigset, SIGINT); + sigaddset(sigset, SIGTERM); + sigaddset(sigset, SIGUSR2); } // @@ -64,33 +64,33 @@ setSignalSet(sigset_t* sigset) class ArchThreadImpl { public: - ArchThreadImpl(); + ArchThreadImpl(); public: - int m_refCount; - IArchMultithread::ThreadID m_id; - pthread_t m_thread; - IArchMultithread::ThreadFunc m_func; - void* m_userData; - bool m_cancel; - bool m_cancelling; - bool m_exited; - void* m_result; - void* m_networkData; + int m_refCount; + IArchMultithread::ThreadID m_id; + pthread_t m_thread; + IArchMultithread::ThreadFunc m_func; + void* m_userData; + bool m_cancel; + bool m_cancelling; + bool m_exited; + void* m_result; + void* m_networkData; }; ArchThreadImpl::ArchThreadImpl() : - m_refCount(1), - m_id(0), - m_func(NULL), - m_userData(NULL), - m_cancel(false), - m_cancelling(false), - m_exited(false), - m_result(NULL), - m_networkData(NULL) + m_refCount(1), + m_id(0), + m_func(NULL), + m_userData(NULL), + m_cancel(false), + m_cancelling(false), + m_exited(false), + m_result(NULL), + m_networkData(NULL) { - // do nothing + // do nothing } @@ -98,715 +98,715 @@ ArchThreadImpl::ArchThreadImpl() : // ArchMultithreadPosix // -ArchMultithreadPosix* ArchMultithreadPosix::s_instance = NULL; +ArchMultithreadPosix* ArchMultithreadPosix::s_instance = NULL; ArchMultithreadPosix::ArchMultithreadPosix() : - m_newThreadCalled(false), - m_nextID(0) + m_newThreadCalled(false), + m_nextID(0) { - assert(s_instance == NULL); + assert(s_instance == NULL); - s_instance = this; + s_instance = this; - // no signal handlers - for (size_t i = 0; i < kNUM_SIGNALS; ++i) { - m_signalFunc[i] = NULL; - m_signalUserData[i] = NULL; - } + // no signal handlers + for (size_t i = 0; i < kNUM_SIGNALS; ++i) { + m_signalFunc[i] = NULL; + m_signalUserData[i] = NULL; + } - // create mutex for thread list - m_threadMutex = newMutex(); + // create mutex for thread list + m_threadMutex = newMutex(); - // create thread for calling (main) thread and add it to our - // list. no need to lock the mutex since we're the only thread. - m_mainThread = new ArchThreadImpl; - m_mainThread->m_thread = pthread_self(); - insert(m_mainThread); + // create thread for calling (main) thread and add it to our + // list. no need to lock the mutex since we're the only thread. + m_mainThread = new ArchThreadImpl; + m_mainThread->m_thread = pthread_self(); + insert(m_mainThread); - // install SIGWAKEUP handler. this causes SIGWAKEUP to interrupt - // system calls. we use that when cancelling a thread to force it - // to wake up immediately if it's blocked in a system call. we - // won't need this until another thread is created but it's fine - // to install it now. - struct sigaction act; - sigemptyset(&act.sa_mask); + // install SIGWAKEUP handler. this causes SIGWAKEUP to interrupt + // system calls. we use that when cancelling a thread to force it + // to wake up immediately if it's blocked in a system call. we + // won't need this until another thread is created but it's fine + // to install it now. + struct sigaction act; + sigemptyset(&act.sa_mask); # if defined(SA_INTERRUPT) - act.sa_flags = SA_INTERRUPT; + act.sa_flags = SA_INTERRUPT; # else - act.sa_flags = 0; + act.sa_flags = 0; # endif - act.sa_handler = &threadCancel; - sigaction(SIGWAKEUP, &act, NULL); + act.sa_handler = &threadCancel; + sigaction(SIGWAKEUP, &act, NULL); - // set desired signal dispositions. let SIGWAKEUP through but - // ignore SIGPIPE (we'll handle EPIPE). - sigset_t sigset; - sigemptyset(&sigset); - sigaddset(&sigset, SIGWAKEUP); - pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); - sigemptyset(&sigset); - sigaddset(&sigset, SIGPIPE); - pthread_sigmask(SIG_BLOCK, &sigset, NULL); + // set desired signal dispositions. let SIGWAKEUP through but + // ignore SIGPIPE (we'll handle EPIPE). + sigset_t sigset; + sigemptyset(&sigset); + sigaddset(&sigset, SIGWAKEUP); + pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); + sigemptyset(&sigset); + sigaddset(&sigset, SIGPIPE); + pthread_sigmask(SIG_BLOCK, &sigset, NULL); } ArchMultithreadPosix::~ArchMultithreadPosix() { - assert(s_instance != NULL); + assert(s_instance != NULL); - closeMutex(m_threadMutex); - s_instance = NULL; + closeMutex(m_threadMutex); + s_instance = NULL; } void ArchMultithreadPosix::setNetworkDataForCurrentThread(void* data) { - lockMutex(m_threadMutex); - ArchThreadImpl* thread = find(pthread_self()); - thread->m_networkData = data; - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + ArchThreadImpl* thread = find(pthread_self()); + thread->m_networkData = data; + unlockMutex(m_threadMutex); } void* ArchMultithreadPosix::getNetworkDataForThread(ArchThread thread) { - lockMutex(m_threadMutex); - void* data = thread->m_networkData; - unlockMutex(m_threadMutex); - return data; + lockMutex(m_threadMutex); + void* data = thread->m_networkData; + unlockMutex(m_threadMutex); + return data; } ArchMultithreadPosix* ArchMultithreadPosix::getInstance() { - return s_instance; + return s_instance; } ArchCond ArchMultithreadPosix::newCondVar() { - ArchCondImpl* cond = new ArchCondImpl; - int status = pthread_cond_init(&cond->m_cond, NULL); - (void)status; - assert(status == 0); - return cond; + ArchCondImpl* cond = new ArchCondImpl; + int status = pthread_cond_init(&cond->m_cond, NULL); + (void)status; + assert(status == 0); + return cond; } void ArchMultithreadPosix::closeCondVar(ArchCond cond) { - int status = pthread_cond_destroy(&cond->m_cond); - (void)status; - assert(status == 0); - delete cond; + int status = pthread_cond_destroy(&cond->m_cond); + (void)status; + assert(status == 0); + delete cond; } void ArchMultithreadPosix::signalCondVar(ArchCond cond) { - int status = pthread_cond_signal(&cond->m_cond); - (void)status; - assert(status == 0); + int status = pthread_cond_signal(&cond->m_cond); + (void)status; + assert(status == 0); } void ArchMultithreadPosix::broadcastCondVar(ArchCond cond) { - int status = pthread_cond_broadcast(&cond->m_cond); - (void)status; - assert(status == 0); + int status = pthread_cond_broadcast(&cond->m_cond); + (void)status; + assert(status == 0); } bool ArchMultithreadPosix::waitCondVar(ArchCond cond, - ArchMutex mutex, double timeout) + ArchMutex mutex, double timeout) { - // we can't wait on a condition variable and also wake it up for - // cancellation since we don't use posix cancellation. so we - // must wake up periodically to check for cancellation. we - // can't simply go back to waiting after the check since the - // condition may have changed and we'll have lost the signal. - // so we have to return to the caller. since the caller will - // always check for spurious wakeups the only drawback here is - // performance: we're waking up a lot more than desired. - static const double maxCancellationLatency = 0.1; - if (timeout < 0.0 || timeout > maxCancellationLatency) { - timeout = maxCancellationLatency; - } + // we can't wait on a condition variable and also wake it up for + // cancellation since we don't use posix cancellation. so we + // must wake up periodically to check for cancellation. we + // can't simply go back to waiting after the check since the + // condition may have changed and we'll have lost the signal. + // so we have to return to the caller. since the caller will + // always check for spurious wakeups the only drawback here is + // performance: we're waking up a lot more than desired. + static const double maxCancellationLatency = 0.1; + if (timeout < 0.0 || timeout > maxCancellationLatency) { + timeout = maxCancellationLatency; + } - // see if we should cancel this thread - testCancelThread(); + // see if we should cancel this thread + testCancelThread(); - // get final time - struct timeval now; - gettimeofday(&now, NULL); - struct timespec finalTime; - finalTime.tv_sec = now.tv_sec; - finalTime.tv_nsec = now.tv_usec * 1000; - long timeout_sec = (long)timeout; - long timeout_nsec = (long)(1.0e+9 * (timeout - timeout_sec)); - finalTime.tv_sec += timeout_sec; - finalTime.tv_nsec += timeout_nsec; - if (finalTime.tv_nsec >= 1000000000) { - finalTime.tv_nsec -= 1000000000; - finalTime.tv_sec += 1; - } + // get final time + struct timeval now; + gettimeofday(&now, NULL); + struct timespec finalTime; + finalTime.tv_sec = now.tv_sec; + finalTime.tv_nsec = now.tv_usec * 1000; + long timeout_sec = (long)timeout; + long timeout_nsec = (long)(1.0e+9 * (timeout - timeout_sec)); + finalTime.tv_sec += timeout_sec; + finalTime.tv_nsec += timeout_nsec; + if (finalTime.tv_nsec >= 1000000000) { + finalTime.tv_nsec -= 1000000000; + finalTime.tv_sec += 1; + } - // wait - int status = pthread_cond_timedwait(&cond->m_cond, - &mutex->m_mutex, &finalTime); + // wait + int status = pthread_cond_timedwait(&cond->m_cond, + &mutex->m_mutex, &finalTime); - // check for cancel again - testCancelThread(); + // check for cancel again + testCancelThread(); - switch (status) { - case 0: - // success - return true; + switch (status) { + case 0: + // success + return true; - case ETIMEDOUT: - return false; + case ETIMEDOUT: + return false; - default: - assert(0 && "condition variable wait error"); - return false; - } + default: + assert(0 && "condition variable wait error"); + return false; + } } ArchMutex ArchMultithreadPosix::newMutex() { - pthread_mutexattr_t attr; - int status = pthread_mutexattr_init(&attr); - assert(status == 0); - ArchMutexImpl* mutex = new ArchMutexImpl; - status = pthread_mutex_init(&mutex->m_mutex, &attr); - assert(status == 0); - return mutex; + pthread_mutexattr_t attr; + int status = pthread_mutexattr_init(&attr); + assert(status == 0); + ArchMutexImpl* mutex = new ArchMutexImpl; + status = pthread_mutex_init(&mutex->m_mutex, &attr); + assert(status == 0); + return mutex; } void ArchMultithreadPosix::closeMutex(ArchMutex mutex) { - int status = pthread_mutex_destroy(&mutex->m_mutex); - (void)status; - assert(status == 0); - delete mutex; + int status = pthread_mutex_destroy(&mutex->m_mutex); + (void)status; + assert(status == 0); + delete mutex; } void ArchMultithreadPosix::lockMutex(ArchMutex mutex) { - int status = pthread_mutex_lock(&mutex->m_mutex); + int status = pthread_mutex_lock(&mutex->m_mutex); - switch (status) { - case 0: - // success - return; + switch (status) { + case 0: + // success + return; - case EDEADLK: - assert(0 && "lock already owned"); - break; + case EDEADLK: + assert(0 && "lock already owned"); + break; - case EAGAIN: - assert(0 && "too many recursive locks"); - break; + case EAGAIN: + assert(0 && "too many recursive locks"); + break; - default: - assert(0 && "unexpected error"); - break; - } + default: + assert(0 && "unexpected error"); + break; + } } void ArchMultithreadPosix::unlockMutex(ArchMutex mutex) { - int status = pthread_mutex_unlock(&mutex->m_mutex); + int status = pthread_mutex_unlock(&mutex->m_mutex); - switch (status) { - case 0: - // success - return; + switch (status) { + case 0: + // success + return; - case EPERM: - assert(0 && "thread doesn't own a lock"); - break; + case EPERM: + assert(0 && "thread doesn't own a lock"); + break; - default: - assert(0 && "unexpected error"); - break; - } + default: + assert(0 && "unexpected error"); + break; + } } ArchThread ArchMultithreadPosix::newThread(ThreadFunc func, void* data) { - assert(func != NULL); + assert(func != NULL); - // initialize signal handler. we do this here instead of the - // constructor so we can avoid daemonizing (using fork()) - // when there are multiple threads. clients can safely - // use condition variables and mutexes before creating a - // new thread and they can safely use the only thread - // they have access to, the main thread, so they really - // can't tell the difference. - if (!m_newThreadCalled) { - m_newThreadCalled = true; + // initialize signal handler. we do this here instead of the + // constructor so we can avoid daemonizing (using fork()) + // when there are multiple threads. clients can safely + // use condition variables and mutexes before creating a + // new thread and they can safely use the only thread + // they have access to, the main thread, so they really + // can't tell the difference. + if (!m_newThreadCalled) { + m_newThreadCalled = true; #if HAVE_PTHREAD_SIGNAL - startSignalHandler(); + startSignalHandler(); #endif - } + } - lockMutex(m_threadMutex); + lockMutex(m_threadMutex); - // create thread impl for new thread - ArchThreadImpl* thread = new ArchThreadImpl; - thread->m_func = func; - thread->m_userData = data; + // create thread impl for new thread + ArchThreadImpl* thread = new ArchThreadImpl; + thread->m_func = func; + thread->m_userData = data; - // create the thread. pthread_create() on RedHat 7.2 smp fails - // if passed a NULL attr so use a default attr. - pthread_attr_t attr; - int status = pthread_attr_init(&attr); - if (status == 0) { - status = pthread_create(&thread->m_thread, &attr, - &ArchMultithreadPosix::threadFunc, thread); - pthread_attr_destroy(&attr); - } + // create the thread. pthread_create() on RedHat 7.2 smp fails + // if passed a NULL attr so use a default attr. + pthread_attr_t attr; + int status = pthread_attr_init(&attr); + if (status == 0) { + status = pthread_create(&thread->m_thread, &attr, + &ArchMultithreadPosix::threadFunc, thread); + pthread_attr_destroy(&attr); + } - // check if thread was started - if (status != 0) { - // failed to start thread so clean up - delete thread; - thread = NULL; - } - else { - // add thread to list - insert(thread); + // check if thread was started + if (status != 0) { + // failed to start thread so clean up + delete thread; + thread = NULL; + } + else { + // add thread to list + insert(thread); - // increment ref count to account for the thread itself - refThread(thread); - } + // increment ref count to account for the thread itself + refThread(thread); + } - // note that the child thread will wait until we release this mutex - unlockMutex(m_threadMutex); + // note that the child thread will wait until we release this mutex + unlockMutex(m_threadMutex); - return thread; + return thread; } ArchThread ArchMultithreadPosix::newCurrentThread() { - lockMutex(m_threadMutex); - ArchThreadImpl* thread = find(pthread_self()); - unlockMutex(m_threadMutex); - assert(thread != NULL); - return thread; + lockMutex(m_threadMutex); + ArchThreadImpl* thread = find(pthread_self()); + unlockMutex(m_threadMutex); + assert(thread != NULL); + return thread; } void ArchMultithreadPosix::closeThread(ArchThread thread) { - assert(thread != NULL); + assert(thread != NULL); - // decrement ref count and clean up thread if no more references - if (--thread->m_refCount == 0) { - // detach from thread (unless it's the main thread) - if (thread->m_func != NULL) { - pthread_detach(thread->m_thread); - } + // decrement ref count and clean up thread if no more references + if (--thread->m_refCount == 0) { + // detach from thread (unless it's the main thread) + if (thread->m_func != NULL) { + pthread_detach(thread->m_thread); + } - // remove thread from list - lockMutex(m_threadMutex); - assert(findNoRef(thread->m_thread) == thread); - erase(thread); - unlockMutex(m_threadMutex); + // remove thread from list + lockMutex(m_threadMutex); + assert(findNoRef(thread->m_thread) == thread); + erase(thread); + unlockMutex(m_threadMutex); - // done with thread - delete thread; - } + // done with thread + delete thread; + } } ArchThread ArchMultithreadPosix::copyThread(ArchThread thread) { - refThread(thread); - return thread; + refThread(thread); + return thread; } void ArchMultithreadPosix::cancelThread(ArchThread thread) { - assert(thread != NULL); + assert(thread != NULL); - // set cancel and wakeup flags if thread can be cancelled - bool wakeup = false; - lockMutex(m_threadMutex); - if (!thread->m_exited && !thread->m_cancelling) { - thread->m_cancel = true; - wakeup = true; - } - unlockMutex(m_threadMutex); + // set cancel and wakeup flags if thread can be cancelled + bool wakeup = false; + lockMutex(m_threadMutex); + if (!thread->m_exited && !thread->m_cancelling) { + thread->m_cancel = true; + wakeup = true; + } + unlockMutex(m_threadMutex); - // force thread to exit system calls if wakeup is true - if (wakeup) { - pthread_kill(thread->m_thread, SIGWAKEUP); - } + // force thread to exit system calls if wakeup is true + if (wakeup) { + pthread_kill(thread->m_thread, SIGWAKEUP); + } } void ArchMultithreadPosix::setPriorityOfThread(ArchThread thread, int /*n*/) { - assert(thread != NULL); + assert(thread != NULL); - // FIXME + // FIXME } void ArchMultithreadPosix::testCancelThread() { - // find current thread - lockMutex(m_threadMutex); - ArchThreadImpl* thread = findNoRef(pthread_self()); - unlockMutex(m_threadMutex); + // find current thread + lockMutex(m_threadMutex); + ArchThreadImpl* thread = findNoRef(pthread_self()); + unlockMutex(m_threadMutex); - // test cancel on thread - testCancelThreadImpl(thread); + // test cancel on thread + testCancelThreadImpl(thread); } bool ArchMultithreadPosix::wait(ArchThread target, double timeout) { - assert(target != NULL); + assert(target != NULL); - lockMutex(m_threadMutex); + lockMutex(m_threadMutex); - // find current thread - ArchThreadImpl* self = findNoRef(pthread_self()); + // find current thread + ArchThreadImpl* self = findNoRef(pthread_self()); - // ignore wait if trying to wait on ourself - if (target == self) { - unlockMutex(m_threadMutex); - return false; - } + // ignore wait if trying to wait on ourself + if (target == self) { + unlockMutex(m_threadMutex); + return false; + } - // ref the target so it can't go away while we're watching it - refThread(target); + // ref the target so it can't go away while we're watching it + refThread(target); - unlockMutex(m_threadMutex); + unlockMutex(m_threadMutex); - try { - // do first test regardless of timeout - testCancelThreadImpl(self); - if (isExitedThread(target)) { - closeThread(target); - return true; - } + try { + // do first test regardless of timeout + testCancelThreadImpl(self); + if (isExitedThread(target)) { + closeThread(target); + return true; + } - // wait and repeat test if there's a timeout - if (timeout != 0.0) { - const double start = ARCH->time(); - do { - // wait a little - ARCH->sleep(0.05); + // wait and repeat test if there's a timeout + if (timeout != 0.0) { + const double start = ARCH->time(); + do { + // wait a little + ARCH->sleep(0.05); - // repeat test - testCancelThreadImpl(self); - if (isExitedThread(target)) { - closeThread(target); - return true; - } + // repeat test + testCancelThreadImpl(self); + if (isExitedThread(target)) { + closeThread(target); + return true; + } - // repeat wait and test until timed out - } while (timeout < 0.0 || (ARCH->time() - start) <= timeout); - } + // repeat wait and test until timed out + } while (timeout < 0.0 || (ARCH->time() - start) <= timeout); + } - closeThread(target); - return false; - } - catch (...) { - closeThread(target); - throw; - } + closeThread(target); + return false; + } + catch (...) { + closeThread(target); + throw; + } } bool ArchMultithreadPosix::isSameThread(ArchThread thread1, ArchThread thread2) { - return (thread1 == thread2); + return (thread1 == thread2); } bool ArchMultithreadPosix::isExitedThread(ArchThread thread) { - lockMutex(m_threadMutex); - bool exited = thread->m_exited; - unlockMutex(m_threadMutex); - return exited; + lockMutex(m_threadMutex); + bool exited = thread->m_exited; + unlockMutex(m_threadMutex); + return exited; } void* ArchMultithreadPosix::getResultOfThread(ArchThread thread) { - lockMutex(m_threadMutex); - void* result = thread->m_result; - unlockMutex(m_threadMutex); - return result; + lockMutex(m_threadMutex); + void* result = thread->m_result; + unlockMutex(m_threadMutex); + return result; } IArchMultithread::ThreadID ArchMultithreadPosix::getIDOfThread(ArchThread thread) { - return thread->m_id; + return thread->m_id; } void ArchMultithreadPosix::setSignalHandler( - ESignal signal, SignalFunc func, void* userData) + ESignal signal, SignalFunc func, void* userData) { - lockMutex(m_threadMutex); - m_signalFunc[signal] = func; - m_signalUserData[signal] = userData; - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + m_signalFunc[signal] = func; + m_signalUserData[signal] = userData; + unlockMutex(m_threadMutex); } void ArchMultithreadPosix::raiseSignal(ESignal signal) { - lockMutex(m_threadMutex); - if (m_signalFunc[signal] != NULL) { - m_signalFunc[signal](signal, m_signalUserData[signal]); - pthread_kill(m_mainThread->m_thread, SIGWAKEUP); - } - else if (signal == kINTERRUPT || signal == kTERMINATE) { - ARCH->cancelThread(m_mainThread); - } - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + if (m_signalFunc[signal] != NULL) { + m_signalFunc[signal](signal, m_signalUserData[signal]); + pthread_kill(m_mainThread->m_thread, SIGWAKEUP); + } + else if (signal == kINTERRUPT || signal == kTERMINATE) { + ARCH->cancelThread(m_mainThread); + } + unlockMutex(m_threadMutex); } void ArchMultithreadPosix::startSignalHandler() { - // set signal mask. the main thread blocks these signals and - // the signal handler thread will listen for them. - sigset_t sigset, oldsigset; - setSignalSet(&sigset); - pthread_sigmask(SIG_BLOCK, &sigset, &oldsigset); + // set signal mask. the main thread blocks these signals and + // the signal handler thread will listen for them. + sigset_t sigset, oldsigset; + setSignalSet(&sigset); + pthread_sigmask(SIG_BLOCK, &sigset, &oldsigset); - // fire up the INT and TERM signal handler thread. we could - // instead arrange to catch and handle these signals but - // we'd be unable to cancel the main thread since no pthread - // calls are allowed in a signal handler. - pthread_attr_t attr; - int status = pthread_attr_init(&attr); - if (status == 0) { - status = pthread_create(&m_signalThread, &attr, - &ArchMultithreadPosix::threadSignalHandler, - NULL); - pthread_attr_destroy(&attr); - } - if (status != 0) { - // can't create thread to wait for signal so don't block - // the signals. - pthread_sigmask(SIG_UNBLOCK, &oldsigset, NULL); - } + // fire up the INT and TERM signal handler thread. we could + // instead arrange to catch and handle these signals but + // we'd be unable to cancel the main thread since no pthread + // calls are allowed in a signal handler. + pthread_attr_t attr; + int status = pthread_attr_init(&attr); + if (status == 0) { + status = pthread_create(&m_signalThread, &attr, + &ArchMultithreadPosix::threadSignalHandler, + NULL); + pthread_attr_destroy(&attr); + } + if (status != 0) { + // can't create thread to wait for signal so don't block + // the signals. + pthread_sigmask(SIG_UNBLOCK, &oldsigset, NULL); + } } ArchThreadImpl* ArchMultithreadPosix::find(pthread_t thread) { - ArchThreadImpl* impl = findNoRef(thread); - if (impl != NULL) { - refThread(impl); - } - return impl; + ArchThreadImpl* impl = findNoRef(thread); + if (impl != NULL) { + refThread(impl); + } + return impl; } ArchThreadImpl* ArchMultithreadPosix::findNoRef(pthread_t thread) { - // linear search - for (ThreadList::const_iterator index = m_threadList.begin(); - index != m_threadList.end(); ++index) { - if ((*index)->m_thread == thread) { - return *index; - } - } - return NULL; + // linear search + for (ThreadList::const_iterator index = m_threadList.begin(); + index != m_threadList.end(); ++index) { + if ((*index)->m_thread == thread) { + return *index; + } + } + return NULL; } void ArchMultithreadPosix::insert(ArchThreadImpl* thread) { - assert(thread != NULL); + assert(thread != NULL); - // thread shouldn't already be on the list - assert(findNoRef(thread->m_thread) == NULL); + // thread shouldn't already be on the list + assert(findNoRef(thread->m_thread) == NULL); - // set thread id. note that we don't worry about m_nextID - // wrapping back to 0 and duplicating thread ID's since the - // likelihood of synergy running that long is vanishingly - // small. - thread->m_id = ++m_nextID; + // set thread id. note that we don't worry about m_nextID + // wrapping back to 0 and duplicating thread ID's since the + // likelihood of synergy running that long is vanishingly + // small. + thread->m_id = ++m_nextID; - // append to list - m_threadList.push_back(thread); + // append to list + m_threadList.push_back(thread); } void ArchMultithreadPosix::erase(ArchThreadImpl* thread) { - for (ThreadList::iterator index = m_threadList.begin(); - index != m_threadList.end(); ++index) { - if (*index == thread) { - m_threadList.erase(index); - break; - } - } + for (ThreadList::iterator index = m_threadList.begin(); + index != m_threadList.end(); ++index) { + if (*index == thread) { + m_threadList.erase(index); + break; + } + } } void ArchMultithreadPosix::refThread(ArchThreadImpl* thread) { - assert(thread != NULL); - assert(findNoRef(thread->m_thread) != NULL); - ++thread->m_refCount; + assert(thread != NULL); + assert(findNoRef(thread->m_thread) != NULL); + ++thread->m_refCount; } void ArchMultithreadPosix::testCancelThreadImpl(ArchThreadImpl* thread) { - assert(thread != NULL); + assert(thread != NULL); - // update cancel state - lockMutex(m_threadMutex); - bool cancel = false; - if (thread->m_cancel && !thread->m_cancelling) { - thread->m_cancelling = true; - thread->m_cancel = false; - cancel = true; - } - unlockMutex(m_threadMutex); + // update cancel state + lockMutex(m_threadMutex); + bool cancel = false; + if (thread->m_cancel && !thread->m_cancelling) { + thread->m_cancelling = true; + thread->m_cancel = false; + cancel = true; + } + unlockMutex(m_threadMutex); - // unwind thread's stack if cancelling - if (cancel) { - throw XThreadCancel(); - } + // unwind thread's stack if cancelling + if (cancel) { + throw XThreadCancel(); + } } void* ArchMultithreadPosix::threadFunc(void* vrep) { - // get the thread - ArchThreadImpl* thread = static_cast(vrep); + // get the thread + ArchThreadImpl* thread = static_cast(vrep); - // setup pthreads - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); + // setup pthreads + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); + pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); - // run thread - s_instance->doThreadFunc(thread); + // run thread + s_instance->doThreadFunc(thread); - // terminate the thread - return NULL; + // terminate the thread + return NULL; } void ArchMultithreadPosix::doThreadFunc(ArchThread thread) { - // default priority is slightly below normal - setPriorityOfThread(thread, 1); + // default priority is slightly below normal + setPriorityOfThread(thread, 1); - // wait for parent to initialize this object - lockMutex(m_threadMutex); - unlockMutex(m_threadMutex); + // wait for parent to initialize this object + lockMutex(m_threadMutex); + unlockMutex(m_threadMutex); - void* result = NULL; - try { - // go - result = (*thread->m_func)(thread->m_userData); - } + void* result = NULL; + try { + // go + result = (*thread->m_func)(thread->m_userData); + } - catch (XThreadCancel&) { - // client called cancel() - } - catch (...) { - // note -- don't catch (...) to avoid masking bugs - lockMutex(m_threadMutex); - thread->m_exited = true; - unlockMutex(m_threadMutex); - closeThread(thread); - throw; - } + catch (XThreadCancel&) { + // client called cancel() + } + catch (...) { + // note -- don't catch (...) to avoid masking bugs + lockMutex(m_threadMutex); + thread->m_exited = true; + unlockMutex(m_threadMutex); + closeThread(thread); + throw; + } - // thread has exited - lockMutex(m_threadMutex); - thread->m_result = result; - thread->m_exited = true; - unlockMutex(m_threadMutex); + // thread has exited + lockMutex(m_threadMutex); + thread->m_result = result; + thread->m_exited = true; + unlockMutex(m_threadMutex); - // done with thread - closeThread(thread); + // done with thread + closeThread(thread); } void ArchMultithreadPosix::threadCancel(int) { - // do nothing + // do nothing } void* ArchMultithreadPosix::threadSignalHandler(void*) { - // detach - pthread_detach(pthread_self()); + // detach + pthread_detach(pthread_self()); - // add signal to mask - sigset_t sigset; - setSignalSet(&sigset); + // add signal to mask + sigset_t sigset; + setSignalSet(&sigset); - // also wait on SIGABRT. on linux (others?) this thread (process) - // will persist after all the other threads evaporate due to an - // assert unless we wait on SIGABRT. that means our resources (like - // the socket we're listening on) are not released and never will be - // until the lingering thread is killed. i don't know why sigwait() - // should protect the thread from being killed. note that sigwait() - // doesn't actually return if we receive SIGABRT and, for some - // reason, we don't have to block SIGABRT. - sigaddset(&sigset, SIGABRT); + // also wait on SIGABRT. on linux (others?) this thread (process) + // will persist after all the other threads evaporate due to an + // assert unless we wait on SIGABRT. that means our resources (like + // the socket we're listening on) are not released and never will be + // until the lingering thread is killed. i don't know why sigwait() + // should protect the thread from being killed. note that sigwait() + // doesn't actually return if we receive SIGABRT and, for some + // reason, we don't have to block SIGABRT. + sigaddset(&sigset, SIGABRT); - // we exit the loop via thread cancellation in sigwait() - for (;;) { - // wait + // we exit the loop via thread cancellation in sigwait() + for (;;) { + // wait #if HAVE_POSIX_SIGWAIT - int signal = 0; - sigwait(&sigset, &signal); + int signal = 0; + sigwait(&sigset, &signal); #else - sigwait(&sigset); + sigwait(&sigset); #endif - // if we get here then the signal was raised - switch (signal) { - case SIGINT: - ARCH->raiseSignal(kINTERRUPT); - break; + // if we get here then the signal was raised + switch (signal) { + case SIGINT: + ARCH->raiseSignal(kINTERRUPT); + break; - case SIGTERM: - ARCH->raiseSignal(kTERMINATE); - break; + case SIGTERM: + ARCH->raiseSignal(kTERMINATE); + break; - case SIGHUP: - ARCH->raiseSignal(kHANGUP); - break; + case SIGHUP: + ARCH->raiseSignal(kHANGUP); + break; - case SIGUSR2: - ARCH->raiseSignal(kUSER); - break; + case SIGUSR2: + ARCH->raiseSignal(kUSER); + break; - default: - // ignore - break; - } - } + default: + // ignore + break; + } + } - return NULL; + return NULL; } diff --git a/src/lib/arch/unix/ArchMultithreadPosix.h b/src/lib/arch/unix/ArchMultithreadPosix.h index c23a0ab4..983b7ff1 100644 --- a/src/lib/arch/unix/ArchMultithreadPosix.h +++ b/src/lib/arch/unix/ArchMultithreadPosix.h @@ -27,89 +27,89 @@ class ArchCondImpl { public: - pthread_cond_t m_cond; + pthread_cond_t m_cond; }; class ArchMutexImpl { public: - pthread_mutex_t m_mutex; + pthread_mutex_t m_mutex; }; //! Posix implementation of IArchMultithread class ArchMultithreadPosix : public IArchMultithread { public: - ArchMultithreadPosix(); - virtual ~ArchMultithreadPosix(); + ArchMultithreadPosix(); + virtual ~ArchMultithreadPosix(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - void setNetworkDataForCurrentThread(void*); + void setNetworkDataForCurrentThread(void*); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - void* getNetworkDataForThread(ArchThread); + void* getNetworkDataForThread(ArchThread); - static ArchMultithreadPosix* getInstance(); + static ArchMultithreadPosix* getInstance(); - //@} + //@} - // IArchMultithread overrides - virtual ArchCond newCondVar(); - virtual void closeCondVar(ArchCond); - virtual void signalCondVar(ArchCond); - virtual void broadcastCondVar(ArchCond); - virtual bool waitCondVar(ArchCond, ArchMutex, double timeout); - virtual ArchMutex newMutex(); - virtual void closeMutex(ArchMutex); - virtual void lockMutex(ArchMutex); - virtual void unlockMutex(ArchMutex); - virtual ArchThread newThread(ThreadFunc, void*); - virtual ArchThread newCurrentThread(); - virtual ArchThread copyThread(ArchThread); - virtual void closeThread(ArchThread); - virtual void cancelThread(ArchThread); - virtual void setPriorityOfThread(ArchThread, int n); - virtual void testCancelThread(); - virtual bool wait(ArchThread, double timeout); - virtual bool isSameThread(ArchThread, ArchThread); - virtual bool isExitedThread(ArchThread); - virtual void* getResultOfThread(ArchThread); - virtual ThreadID getIDOfThread(ArchThread); - virtual void setSignalHandler(ESignal, SignalFunc, void*); - virtual void raiseSignal(ESignal); + // IArchMultithread overrides + virtual ArchCond newCondVar(); + virtual void closeCondVar(ArchCond); + virtual void signalCondVar(ArchCond); + virtual void broadcastCondVar(ArchCond); + virtual bool waitCondVar(ArchCond, ArchMutex, double timeout); + virtual ArchMutex newMutex(); + virtual void closeMutex(ArchMutex); + virtual void lockMutex(ArchMutex); + virtual void unlockMutex(ArchMutex); + virtual ArchThread newThread(ThreadFunc, void*); + virtual ArchThread newCurrentThread(); + virtual ArchThread copyThread(ArchThread); + virtual void closeThread(ArchThread); + virtual void cancelThread(ArchThread); + virtual void setPriorityOfThread(ArchThread, int n); + virtual void testCancelThread(); + virtual bool wait(ArchThread, double timeout); + virtual bool isSameThread(ArchThread, ArchThread); + virtual bool isExitedThread(ArchThread); + virtual void* getResultOfThread(ArchThread); + virtual ThreadID getIDOfThread(ArchThread); + virtual void setSignalHandler(ESignal, SignalFunc, void*); + virtual void raiseSignal(ESignal); private: - void startSignalHandler(); + void startSignalHandler(); - ArchThreadImpl* find(pthread_t thread); - ArchThreadImpl* findNoRef(pthread_t thread); - void insert(ArchThreadImpl* thread); - void erase(ArchThreadImpl* thread); + ArchThreadImpl* find(pthread_t thread); + ArchThreadImpl* findNoRef(pthread_t thread); + void insert(ArchThreadImpl* thread); + void erase(ArchThreadImpl* thread); - void refThread(ArchThreadImpl* rep); - void testCancelThreadImpl(ArchThreadImpl* rep); + void refThread(ArchThreadImpl* rep); + void testCancelThreadImpl(ArchThreadImpl* rep); - void doThreadFunc(ArchThread thread); - static void* threadFunc(void* vrep); - static void threadCancel(int); - static void* threadSignalHandler(void* vrep); + void doThreadFunc(ArchThread thread); + static void* threadFunc(void* vrep); + static void threadCancel(int); + static void* threadSignalHandler(void* vrep); private: - typedef std::list ThreadList; + typedef std::list ThreadList; - static ArchMultithreadPosix* s_instance; + static ArchMultithreadPosix* s_instance; - bool m_newThreadCalled; + bool m_newThreadCalled; - ArchMutex m_threadMutex; - ArchThread m_mainThread; - ThreadList m_threadList; - ThreadID m_nextID; + ArchMutex m_threadMutex; + ArchThread m_mainThread; + ThreadList m_threadList; + ThreadID m_nextID; - pthread_t m_signalThread; - SignalFunc m_signalFunc[kNUM_SIGNALS]; - void* m_signalUserData[kNUM_SIGNALS]; + pthread_t m_signalThread; + SignalFunc m_signalFunc[kNUM_SIGNALS]; + void* m_signalUserData[kNUM_SIGNALS]; }; diff --git a/src/lib/arch/unix/ArchNetworkBSD.cpp b/src/lib/arch/unix/ArchNetworkBSD.cpp index 8913313e..5c80a7ad 100644 --- a/src/lib/arch/unix/ArchNetworkBSD.cpp +++ b/src/lib/arch/unix/ArchNetworkBSD.cpp @@ -23,12 +23,12 @@ #include "arch/Arch.h" #if HAVE_UNISTD_H -# include +# include #endif #include #include #if !defined(TCP_NODELAY) -# include +# include #endif #include #include @@ -36,27 +36,27 @@ #include #if HAVE_POLL -# include +# include #else -# if HAVE_SYS_SELECT_H -# include -# endif -# if HAVE_SYS_TIME_H -# include -# endif +# if HAVE_SYS_SELECT_H +# include +# endif +# if HAVE_SYS_TIME_H +# include +# endif #endif #if !HAVE_INET_ATON -# include +# include #endif static const int s_family[] = { - PF_UNSPEC, - PF_INET + PF_UNSPEC, + PF_INET }; static const int s_type[] = { - SOCK_DGRAM, - SOCK_STREAM + SOCK_DGRAM, + SOCK_STREAM }; #if !HAVE_INET_ATON @@ -66,19 +66,19 @@ static in_addr_t inet_aton(const char* cp, struct in_addr* inp) { - unsigned int a, b, c, d; - if (sscanf(cp, "%u.%u.%u.%u", &a, &b, &c, &d) != 4) { - return 0; - } - if (a >= 256 || b >= 256 || c >= 256 || d >= 256) { - return 0; - } - unsigned char* incp = (unsigned char*)inp; - incp[0] = (unsigned char)(a & 0xffu); - incp[1] = (unsigned char)(b & 0xffu); - incp[2] = (unsigned char)(c & 0xffu); - incp[3] = (unsigned char)(d & 0xffu); - return inp->s_addr; + unsigned int a, b, c, d; + if (sscanf(cp, "%u.%u.%u.%u", &a, &b, &c, &d) != 4) { + return 0; + } + if (a >= 256 || b >= 256 || c >= 256 || d >= 256) { + return 0; + } + unsigned char* incp = (unsigned char*)inp; + incp[0] = (unsigned char)(a & 0xffu); + incp[1] = (unsigned char)(b & 0xffu); + incp[2] = (unsigned char)(c & 0xffu); + incp[3] = (unsigned char)(d & 0xffu); + return inp->s_addr; } #endif @@ -92,190 +92,190 @@ ArchNetworkBSD::ArchNetworkBSD() ArchNetworkBSD::~ArchNetworkBSD() { - ARCH->closeMutex(m_mutex); + ARCH->closeMutex(m_mutex); } void ArchNetworkBSD::init() { - // create mutex to make some calls thread safe - m_mutex = ARCH->newMutex(); + // create mutex to make some calls thread safe + m_mutex = ARCH->newMutex(); } ArchSocket ArchNetworkBSD::newSocket(EAddressFamily family, ESocketType type) { - // create socket - int fd = socket(s_family[family], s_type[type], 0); - if (fd == -1) { - throwError(errno); - } - try { - setBlockingOnSocket(fd, false); - } - catch (...) { - close(fd); - throw; - } + // create socket + int fd = socket(s_family[family], s_type[type], 0); + if (fd == -1) { + throwError(errno); + } + try { + setBlockingOnSocket(fd, false); + } + catch (...) { + close(fd); + throw; + } - // allocate socket object - ArchSocketImpl* newSocket = new ArchSocketImpl; - newSocket->m_fd = fd; - newSocket->m_refCount = 1; - return newSocket; + // allocate socket object + ArchSocketImpl* newSocket = new ArchSocketImpl; + newSocket->m_fd = fd; + newSocket->m_refCount = 1; + return newSocket; } ArchSocket ArchNetworkBSD::copySocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // ref the socket and return it - ARCH->lockMutex(m_mutex); - ++s->m_refCount; - ARCH->unlockMutex(m_mutex); - return s; + // ref the socket and return it + ARCH->lockMutex(m_mutex); + ++s->m_refCount; + ARCH->unlockMutex(m_mutex); + return s; } void ArchNetworkBSD::closeSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // unref the socket and note if it should be released - ARCH->lockMutex(m_mutex); - const bool doClose = (--s->m_refCount == 0); - ARCH->unlockMutex(m_mutex); + // unref the socket and note if it should be released + ARCH->lockMutex(m_mutex); + const bool doClose = (--s->m_refCount == 0); + ARCH->unlockMutex(m_mutex); - // close the socket if necessary - if (doClose) { - if (close(s->m_fd) == -1) { - // close failed. restore the last ref and throw. - int err = errno; - ARCH->lockMutex(m_mutex); - ++s->m_refCount; - ARCH->unlockMutex(m_mutex); - throwError(err); - } - delete s; - } + // close the socket if necessary + if (doClose) { + if (close(s->m_fd) == -1) { + // close failed. restore the last ref and throw. + int err = errno; + ARCH->lockMutex(m_mutex); + ++s->m_refCount; + ARCH->unlockMutex(m_mutex); + throwError(err); + } + delete s; + } } void ArchNetworkBSD::closeSocketForRead(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - if (shutdown(s->m_fd, 0) == -1) { - if (errno != ENOTCONN) { - throwError(errno); - } - } + if (shutdown(s->m_fd, 0) == -1) { + if (errno != ENOTCONN) { + throwError(errno); + } + } } void ArchNetworkBSD::closeSocketForWrite(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - if (shutdown(s->m_fd, 1) == -1) { - if (errno != ENOTCONN) { - throwError(errno); - } - } + if (shutdown(s->m_fd, 1) == -1) { + if (errno != ENOTCONN) { + throwError(errno); + } + } } void ArchNetworkBSD::bindSocket(ArchSocket s, ArchNetAddress addr) { - assert(s != NULL); - assert(addr != NULL); + assert(s != NULL); + assert(addr != NULL); - if (bind(s->m_fd, &addr->m_addr, addr->m_len) == -1) { - throwError(errno); - } + if (bind(s->m_fd, &addr->m_addr, addr->m_len) == -1) { + throwError(errno); + } } void ArchNetworkBSD::listenOnSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // hardcoding backlog - if (listen(s->m_fd, 3) == -1) { - throwError(errno); - } + // hardcoding backlog + if (listen(s->m_fd, 3) == -1) { + throwError(errno); + } } ArchSocket ArchNetworkBSD::acceptSocket(ArchSocket s, ArchNetAddress* addr) { - assert(s != NULL); + assert(s != NULL); - // if user passed NULL in addr then use scratch space - ArchNetAddress dummy; - if (addr == NULL) { - addr = &dummy; - } + // if user passed NULL in addr then use scratch space + ArchNetAddress dummy; + if (addr == NULL) { + addr = &dummy; + } - // create new socket and address - ArchSocketImpl* newSocket = new ArchSocketImpl; - *addr = new ArchNetAddressImpl; + // create new socket and address + ArchSocketImpl* newSocket = new ArchSocketImpl; + *addr = new ArchNetAddressImpl; - // accept on socket - ACCEPT_TYPE_ARG3 len = (ACCEPT_TYPE_ARG3)((*addr)->m_len); - int fd = accept(s->m_fd, &(*addr)->m_addr, &len); - (*addr)->m_len = (socklen_t)len; - if (fd == -1) { - int err = errno; - delete newSocket; - delete *addr; - *addr = NULL; - if (err == EAGAIN) { - return NULL; - } - throwError(err); - } + // accept on socket + ACCEPT_TYPE_ARG3 len = (ACCEPT_TYPE_ARG3)((*addr)->m_len); + int fd = accept(s->m_fd, &(*addr)->m_addr, &len); + (*addr)->m_len = (socklen_t)len; + if (fd == -1) { + int err = errno; + delete newSocket; + delete *addr; + *addr = NULL; + if (err == EAGAIN) { + return NULL; + } + throwError(err); + } - try { - setBlockingOnSocket(fd, false); - } - catch (...) { - close(fd); - delete newSocket; - delete *addr; - *addr = NULL; - throw; - } + try { + setBlockingOnSocket(fd, false); + } + catch (...) { + close(fd); + delete newSocket; + delete *addr; + *addr = NULL; + throw; + } - // initialize socket - newSocket->m_fd = fd; - newSocket->m_refCount = 1; + // initialize socket + newSocket->m_fd = fd; + newSocket->m_refCount = 1; - // discard address if not requested - if (addr == &dummy) { - ARCH->closeAddr(dummy); - } + // discard address if not requested + if (addr == &dummy) { + ARCH->closeAddr(dummy); + } - return newSocket; + return newSocket; } bool ArchNetworkBSD::connectSocket(ArchSocket s, ArchNetAddress addr) { - assert(s != NULL); - assert(addr != NULL); + assert(s != NULL); + assert(addr != NULL); - if (connect(s->m_fd, &addr->m_addr, addr->m_len) == -1) { - if (errno == EISCONN) { - return true; - } - if (errno == EINPROGRESS) { - return false; - } - throwError(errno); - } - return true; + if (connect(s->m_fd, &addr->m_addr, addr->m_len) == -1) { + if (errno == EISCONN) { + return true; + } + if (errno == EINPROGRESS) { + return false; + } + throwError(errno); + } + return true; } #if HAVE_POLL @@ -283,91 +283,91 @@ ArchNetworkBSD::connectSocket(ArchSocket s, ArchNetAddress addr) int ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) { - assert(pe != NULL || num == 0); + assert(pe != NULL || num == 0); - // return if nothing to do - if (num == 0) { - if (timeout > 0.0) { - ARCH->sleep(timeout); - } - return 0; - } + // return if nothing to do + if (num == 0) { + if (timeout > 0.0) { + ARCH->sleep(timeout); + } + return 0; + } - // allocate space for translated query - struct pollfd* pfd = new struct pollfd[1 + num]; + // allocate space for translated query + struct pollfd* pfd = new struct pollfd[1 + num]; - // translate query - for (int i = 0; i < num; ++i) { - pfd[i].fd = (pe[i].m_socket == NULL) ? -1 : pe[i].m_socket->m_fd; - pfd[i].events = 0; - if ((pe[i].m_events & kPOLLIN) != 0) { - pfd[i].events |= POLLIN; - } - if ((pe[i].m_events & kPOLLOUT) != 0) { - pfd[i].events |= POLLOUT; - } - } - int n = num; + // translate query + for (int i = 0; i < num; ++i) { + pfd[i].fd = (pe[i].m_socket == NULL) ? -1 : pe[i].m_socket->m_fd; + pfd[i].events = 0; + if ((pe[i].m_events & kPOLLIN) != 0) { + pfd[i].events |= POLLIN; + } + if ((pe[i].m_events & kPOLLOUT) != 0) { + pfd[i].events |= POLLOUT; + } + } + int n = num; - // add the unblock pipe - const int* unblockPipe = getUnblockPipe(); - if (unblockPipe != NULL) { - pfd[n].fd = unblockPipe[0]; - pfd[n].events = POLLIN; - ++n; - } + // add the unblock pipe + const int* unblockPipe = getUnblockPipe(); + if (unblockPipe != NULL) { + pfd[n].fd = unblockPipe[0]; + pfd[n].events = POLLIN; + ++n; + } - // prepare timeout - int t = (timeout < 0.0) ? -1 : static_cast(1000.0 * timeout); + // prepare timeout + int t = (timeout < 0.0) ? -1 : static_cast(1000.0 * timeout); - // do the poll - n = poll(pfd, n, t); + // do the poll + n = poll(pfd, n, t); - // reset the unblock pipe - if (n > 0 && unblockPipe != NULL && (pfd[num].revents & POLLIN) != 0) { - // the unblock event was signalled. flush the pipe. - char dummy[100]; - int ignore; + // reset the unblock pipe + if (n > 0 && unblockPipe != NULL && (pfd[num].revents & POLLIN) != 0) { + // the unblock event was signalled. flush the pipe. + char dummy[100]; + int ignore; - do { - ignore = read(unblockPipe[0], dummy, sizeof(dummy)); - } while (errno != EAGAIN); + do { + ignore = read(unblockPipe[0], dummy, sizeof(dummy)); + } while (errno != EAGAIN); - // don't count this unblock pipe in return value - --n; - } + // don't count this unblock pipe in return value + --n; + } - // handle results - if (n == -1) { - if (errno == EINTR) { - // interrupted system call - ARCH->testCancelThread(); - delete[] pfd; - return 0; - } - delete[] pfd; - throwError(errno); - } + // handle results + if (n == -1) { + if (errno == EINTR) { + // interrupted system call + ARCH->testCancelThread(); + delete[] pfd; + return 0; + } + delete[] pfd; + throwError(errno); + } - // translate back - for (int i = 0; i < num; ++i) { - pe[i].m_revents = 0; - if ((pfd[i].revents & POLLIN) != 0) { - pe[i].m_revents |= kPOLLIN; - } - if ((pfd[i].revents & POLLOUT) != 0) { - pe[i].m_revents |= kPOLLOUT; - } - if ((pfd[i].revents & POLLERR) != 0) { - pe[i].m_revents |= kPOLLERR; - } - if ((pfd[i].revents & POLLNVAL) != 0) { - pe[i].m_revents |= kPOLLNVAL; - } - } + // translate back + for (int i = 0; i < num; ++i) { + pe[i].m_revents = 0; + if ((pfd[i].revents & POLLIN) != 0) { + pe[i].m_revents |= kPOLLIN; + } + if ((pfd[i].revents & POLLOUT) != 0) { + pe[i].m_revents |= kPOLLOUT; + } + if ((pfd[i].revents & POLLERR) != 0) { + pe[i].m_revents |= kPOLLERR; + } + if ((pfd[i].revents & POLLNVAL) != 0) { + pe[i].m_revents |= kPOLLNVAL; + } + } - delete[] pfd; - return n; + delete[] pfd; + return n; } #else @@ -375,123 +375,123 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) int ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) { - int i, n; + int i, n; - // prepare sets for select - n = 0; - fd_set readSet, writeSet, errSet; - fd_set* readSetP = NULL; - fd_set* writeSetP = NULL; - fd_set* errSetP = NULL; - FD_ZERO(&readSet); - FD_ZERO(&writeSet); - FD_ZERO(&errSet); - for (i = 0; i < num; ++i) { - // reset return flags - pe[i].m_revents = 0; + // prepare sets for select + n = 0; + fd_set readSet, writeSet, errSet; + fd_set* readSetP = NULL; + fd_set* writeSetP = NULL; + fd_set* errSetP = NULL; + FD_ZERO(&readSet); + FD_ZERO(&writeSet); + FD_ZERO(&errSet); + for (i = 0; i < num; ++i) { + // reset return flags + pe[i].m_revents = 0; - // set invalid flag if socket is bogus then go to next socket - if (pe[i].m_socket == NULL) { - pe[i].m_revents |= kPOLLNVAL; - continue; - } + // set invalid flag if socket is bogus then go to next socket + if (pe[i].m_socket == NULL) { + pe[i].m_revents |= kPOLLNVAL; + continue; + } - int fdi = pe[i].m_socket->m_fd; - if (pe[i].m_events & kPOLLIN) { - FD_SET(pe[i].m_socket->m_fd, &readSet); - readSetP = &readSet; - if (fdi > n) { - n = fdi; - } - } - if (pe[i].m_events & kPOLLOUT) { - FD_SET(pe[i].m_socket->m_fd, &writeSet); - writeSetP = &writeSet; - if (fdi > n) { - n = fdi; - } - } - if (true) { - FD_SET(pe[i].m_socket->m_fd, &errSet); - errSetP = &errSet; - if (fdi > n) { - n = fdi; - } - } - } + int fdi = pe[i].m_socket->m_fd; + if (pe[i].m_events & kPOLLIN) { + FD_SET(pe[i].m_socket->m_fd, &readSet); + readSetP = &readSet; + if (fdi > n) { + n = fdi; + } + } + if (pe[i].m_events & kPOLLOUT) { + FD_SET(pe[i].m_socket->m_fd, &writeSet); + writeSetP = &writeSet; + if (fdi > n) { + n = fdi; + } + } + if (true) { + FD_SET(pe[i].m_socket->m_fd, &errSet); + errSetP = &errSet; + if (fdi > n) { + n = fdi; + } + } + } - // add the unblock pipe - const int* unblockPipe = getUnblockPipe(); - if (unblockPipe != NULL) { - FD_SET(unblockPipe[0], &readSet); - readSetP = &readSet; - if (unblockPipe[0] > n) { - n = unblockPipe[0]; - } - } + // add the unblock pipe + const int* unblockPipe = getUnblockPipe(); + if (unblockPipe != NULL) { + FD_SET(unblockPipe[0], &readSet); + readSetP = &readSet; + if (unblockPipe[0] > n) { + n = unblockPipe[0]; + } + } - // if there are no sockets then don't block forever - if (n == 0 && timeout < 0.0) { - timeout = 0.0; - } + // if there are no sockets then don't block forever + if (n == 0 && timeout < 0.0) { + timeout = 0.0; + } - // prepare timeout for select - struct timeval timeout2; - struct timeval* timeout2P; - if (timeout < 0.0) { - timeout2P = NULL; - } - else { - timeout2P = &timeout2; - timeout2.tv_sec = static_cast(timeout); - timeout2.tv_usec = static_cast(1.0e+6 * - (timeout - timeout2.tv_sec)); - } + // prepare timeout for select + struct timeval timeout2; + struct timeval* timeout2P; + if (timeout < 0.0) { + timeout2P = NULL; + } + else { + timeout2P = &timeout2; + timeout2.tv_sec = static_cast(timeout); + timeout2.tv_usec = static_cast(1.0e+6 * + (timeout - timeout2.tv_sec)); + } - // do the select - n = select((SELECT_TYPE_ARG1) n + 1, - SELECT_TYPE_ARG234 readSetP, - SELECT_TYPE_ARG234 writeSetP, - SELECT_TYPE_ARG234 errSetP, - SELECT_TYPE_ARG5 timeout2P); + // do the select + n = select((SELECT_TYPE_ARG1) n + 1, + SELECT_TYPE_ARG234 readSetP, + SELECT_TYPE_ARG234 writeSetP, + SELECT_TYPE_ARG234 errSetP, + SELECT_TYPE_ARG5 timeout2P); - // reset the unblock pipe - if (n > 0 && unblockPipe != NULL && FD_ISSET(unblockPipe[0], &readSet)) { - // the unblock event was signalled. flush the pipe. - char dummy[100]; - do { - read(unblockPipe[0], dummy, sizeof(dummy)); - } while (errno != EAGAIN); - } + // reset the unblock pipe + if (n > 0 && unblockPipe != NULL && FD_ISSET(unblockPipe[0], &readSet)) { + // the unblock event was signalled. flush the pipe. + char dummy[100]; + do { + read(unblockPipe[0], dummy, sizeof(dummy)); + } while (errno != EAGAIN); + } - // handle results - if (n == -1) { - if (errno == EINTR) { - // interrupted system call - ARCH->testCancelThread(); - return 0; - } - throwError(errno); - } - n = 0; - for (i = 0; i < num; ++i) { - if (pe[i].m_socket != NULL) { - if (FD_ISSET(pe[i].m_socket->m_fd, &readSet)) { - pe[i].m_revents |= kPOLLIN; - } - if (FD_ISSET(pe[i].m_socket->m_fd, &writeSet)) { - pe[i].m_revents |= kPOLLOUT; - } - if (FD_ISSET(pe[i].m_socket->m_fd, &errSet)) { - pe[i].m_revents |= kPOLLERR; - } - } - if (pe[i].m_revents != 0) { - ++n; - } - } + // handle results + if (n == -1) { + if (errno == EINTR) { + // interrupted system call + ARCH->testCancelThread(); + return 0; + } + throwError(errno); + } + n = 0; + for (i = 0; i < num; ++i) { + if (pe[i].m_socket != NULL) { + if (FD_ISSET(pe[i].m_socket->m_fd, &readSet)) { + pe[i].m_revents |= kPOLLIN; + } + if (FD_ISSET(pe[i].m_socket->m_fd, &writeSet)) { + pe[i].m_revents |= kPOLLOUT; + } + if (FD_ISSET(pe[i].m_socket->m_fd, &errSet)) { + pe[i].m_revents |= kPOLLERR; + } + } + if (pe[i].m_revents != 0) { + ++n; + } + } - return n; + return n; } #endif @@ -499,490 +499,490 @@ ArchNetworkBSD::pollSocket(PollEntry pe[], int num, double timeout) void ArchNetworkBSD::unblockPollSocket(ArchThread thread) { - const int* unblockPipe = getUnblockPipeForThread(thread); - if (unblockPipe != NULL) { - char dummy = 0; - int ignore; + const int* unblockPipe = getUnblockPipeForThread(thread); + if (unblockPipe != NULL) { + char dummy = 0; + int ignore; - ignore = write(unblockPipe[1], &dummy, 1); - } + ignore = write(unblockPipe[1], &dummy, 1); + } } size_t ArchNetworkBSD::readSocket(ArchSocket s, void* buf, size_t len) { - assert(s != NULL); + assert(s != NULL); - ssize_t n = read(s->m_fd, buf, len); - if (n == -1) { - if (errno == EINTR || errno == EAGAIN) { - return 0; - } - throwError(errno); - } - return n; + ssize_t n = read(s->m_fd, buf, len); + if (n == -1) { + if (errno == EINTR || errno == EAGAIN) { + return 0; + } + throwError(errno); + } + return n; } size_t ArchNetworkBSD::writeSocket(ArchSocket s, const void* buf, size_t len) { - assert(s != NULL); + assert(s != NULL); - ssize_t n = write(s->m_fd, buf, len); - if (n == -1) { - if (errno == EINTR || errno == EAGAIN) { - return 0; - } - throwError(errno); - } - return n; + ssize_t n = write(s->m_fd, buf, len); + if (n == -1) { + if (errno == EINTR || errno == EAGAIN) { + return 0; + } + throwError(errno); + } + return n; } void ArchNetworkBSD::throwErrorOnSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // get the error from the socket layer - int err = 0; - socklen_t size = (socklen_t)sizeof(err); - if (getsockopt(s->m_fd, SOL_SOCKET, SO_ERROR, - (optval_t*)&err, &size) == -1) { - err = errno; - } + // get the error from the socket layer + int err = 0; + socklen_t size = (socklen_t)sizeof(err); + if (getsockopt(s->m_fd, SOL_SOCKET, SO_ERROR, + (optval_t*)&err, &size) == -1) { + err = errno; + } - // throw if there's an error - if (err != 0) { - throwError(err); - } + // throw if there's an error + if (err != 0) { + throwError(err); + } } void ArchNetworkBSD::setBlockingOnSocket(int fd, bool blocking) { - assert(fd != -1); + assert(fd != -1); - int mode = fcntl(fd, F_GETFL, 0); - if (mode == -1) { - throwError(errno); - } - if (blocking) { - mode &= ~O_NONBLOCK; - } - else { - mode |= O_NONBLOCK; - } - if (fcntl(fd, F_SETFL, mode) == -1) { - throwError(errno); - } + int mode = fcntl(fd, F_GETFL, 0); + if (mode == -1) { + throwError(errno); + } + if (blocking) { + mode &= ~O_NONBLOCK; + } + else { + mode |= O_NONBLOCK; + } + if (fcntl(fd, F_SETFL, mode) == -1) { + throwError(errno); + } } bool ArchNetworkBSD::setNoDelayOnSocket(ArchSocket s, bool noDelay) { - assert(s != NULL); + assert(s != NULL); - // get old state - int oflag; - socklen_t size = (socklen_t)sizeof(oflag); - if (getsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, - (optval_t*)&oflag, &size) == -1) { - throwError(errno); - } + // get old state + int oflag; + socklen_t size = (socklen_t)sizeof(oflag); + if (getsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, + (optval_t*)&oflag, &size) == -1) { + throwError(errno); + } - int flag = noDelay ? 1 : 0; - size = (socklen_t)sizeof(flag); - if (setsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, - (optval_t*)&flag, size) == -1) { - throwError(errno); - } + int flag = noDelay ? 1 : 0; + size = (socklen_t)sizeof(flag); + if (setsockopt(s->m_fd, IPPROTO_TCP, TCP_NODELAY, + (optval_t*)&flag, size) == -1) { + throwError(errno); + } - return (oflag != 0); + return (oflag != 0); } bool ArchNetworkBSD::setReuseAddrOnSocket(ArchSocket s, bool reuse) { - assert(s != NULL); + assert(s != NULL); - // get old state - int oflag; - socklen_t size = (socklen_t)sizeof(oflag); - if (getsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, - (optval_t*)&oflag, &size) == -1) { - throwError(errno); - } + // get old state + int oflag; + socklen_t size = (socklen_t)sizeof(oflag); + if (getsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, + (optval_t*)&oflag, &size) == -1) { + throwError(errno); + } - int flag = reuse ? 1 : 0; - size = (socklen_t)sizeof(flag); - if (setsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, - (optval_t*)&flag, size) == -1) { - throwError(errno); - } + int flag = reuse ? 1 : 0; + size = (socklen_t)sizeof(flag); + if (setsockopt(s->m_fd, SOL_SOCKET, SO_REUSEADDR, + (optval_t*)&flag, size) == -1) { + throwError(errno); + } - return (oflag != 0); + return (oflag != 0); } std::string ArchNetworkBSD::getHostName() { - char name[256]; - if (gethostname(name, sizeof(name)) == -1) { - name[0] = '\0'; - } - else { - name[sizeof(name) - 1] = '\0'; - } - return name; + char name[256]; + if (gethostname(name, sizeof(name)) == -1) { + name[0] = '\0'; + } + else { + name[sizeof(name) - 1] = '\0'; + } + return name; } ArchNetAddress ArchNetworkBSD::newAnyAddr(EAddressFamily family) { - // allocate address - ArchNetAddressImpl* addr = new ArchNetAddressImpl; + // allocate address + ArchNetAddressImpl* addr = new ArchNetAddressImpl; - // fill it in - switch (family) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - ipAddr->sin_family = AF_INET; - ipAddr->sin_port = 0; - ipAddr->sin_addr.s_addr = INADDR_ANY; - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); - break; - } + // fill it in + switch (family) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + ipAddr->sin_family = AF_INET; + ipAddr->sin_port = 0; + ipAddr->sin_addr.s_addr = INADDR_ANY; + addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + break; + } - default: - delete addr; - assert(0 && "invalid family"); - } + default: + delete addr; + assert(0 && "invalid family"); + } - return addr; + return addr; } ArchNetAddress ArchNetworkBSD::copyAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - // allocate and copy address - return new ArchNetAddressImpl(*addr); + // allocate and copy address + return new ArchNetAddressImpl(*addr); } ArchNetAddress ArchNetworkBSD::nameToAddr(const std::string& name) { - // allocate address - ArchNetAddressImpl* addr = new ArchNetAddressImpl; + // allocate address + ArchNetAddressImpl* addr = new ArchNetAddressImpl; - // try to convert assuming an IPv4 dot notation address - struct sockaddr_in inaddr; - memset(&inaddr, 0, sizeof(inaddr)); - if (inet_aton(name.c_str(), &inaddr.sin_addr) != 0) { - // it's a dot notation address - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); - inaddr.sin_family = AF_INET; - inaddr.sin_port = 0; - memcpy(&addr->m_addr, &inaddr, addr->m_len); - } + // try to convert assuming an IPv4 dot notation address + struct sockaddr_in inaddr; + memset(&inaddr, 0, sizeof(inaddr)); + if (inet_aton(name.c_str(), &inaddr.sin_addr) != 0) { + // it's a dot notation address + addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + inaddr.sin_family = AF_INET; + inaddr.sin_port = 0; + memcpy(&addr->m_addr, &inaddr, addr->m_len); + } - else { - // mutexed address lookup (ugh) - ARCH->lockMutex(m_mutex); - struct hostent* info = gethostbyname(name.c_str()); - if (info == NULL) { - ARCH->unlockMutex(m_mutex); - delete addr; - throwNameError(h_errno); - } + else { + // mutexed address lookup (ugh) + ARCH->lockMutex(m_mutex); + struct hostent* info = gethostbyname(name.c_str()); + if (info == NULL) { + ARCH->unlockMutex(m_mutex); + delete addr; + throwNameError(h_errno); + } - // copy over address (only IPv4 currently supported) - if (info->h_addrtype == AF_INET) { - addr->m_len = (socklen_t)sizeof(struct sockaddr_in); - inaddr.sin_family = info->h_addrtype; - inaddr.sin_port = 0; - memcpy(&inaddr.sin_addr, info->h_addr_list[0], - sizeof(inaddr.sin_addr)); - memcpy(&addr->m_addr, &inaddr, addr->m_len); - } - else { - ARCH->unlockMutex(m_mutex); - delete addr; - throw XArchNetworkNameUnsupported( - "The requested name is valid but " - "does not have a supported address family"); - } + // copy over address (only IPv4 currently supported) + if (info->h_addrtype == AF_INET) { + addr->m_len = (socklen_t)sizeof(struct sockaddr_in); + inaddr.sin_family = info->h_addrtype; + inaddr.sin_port = 0; + memcpy(&inaddr.sin_addr, info->h_addr_list[0], + sizeof(inaddr.sin_addr)); + memcpy(&addr->m_addr, &inaddr, addr->m_len); + } + else { + ARCH->unlockMutex(m_mutex); + delete addr; + throw XArchNetworkNameUnsupported( + "The requested name is valid but " + "does not have a supported address family"); + } - // done with static buffer - ARCH->unlockMutex(m_mutex); - } + // done with static buffer + ARCH->unlockMutex(m_mutex); + } - return addr; + return addr; } void ArchNetworkBSD::closeAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - delete addr; + delete addr; } std::string ArchNetworkBSD::addrToName(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - // mutexed name lookup (ugh) - ARCH->lockMutex(m_mutex); - struct hostent* info = gethostbyaddr(&addr->m_addr, - addr->m_len, addr->m_addr.sa_family); - if (info == NULL) { - ARCH->unlockMutex(m_mutex); - throwNameError(h_errno); - } + // mutexed name lookup (ugh) + ARCH->lockMutex(m_mutex); + struct hostent* info = gethostbyaddr(&addr->m_addr, + addr->m_len, addr->m_addr.sa_family); + if (info == NULL) { + ARCH->unlockMutex(m_mutex); + throwNameError(h_errno); + } - // save (primary) name - std::string name = info->h_name; + // save (primary) name + std::string name = info->h_name; - // done with static buffer - ARCH->unlockMutex(m_mutex); + // done with static buffer + ARCH->unlockMutex(m_mutex); - return name; + return name; } std::string ArchNetworkBSD::addrToString(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - ARCH->lockMutex(m_mutex); - std::string s = inet_ntoa(ipAddr->sin_addr); - ARCH->unlockMutex(m_mutex); - return s; - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + ARCH->lockMutex(m_mutex); + std::string s = inet_ntoa(ipAddr->sin_addr); + ARCH->unlockMutex(m_mutex); + return s; + } - default: - assert(0 && "unknown address family"); - return ""; - } + default: + assert(0 && "unknown address family"); + return ""; + } } IArchNetwork::EAddressFamily ArchNetworkBSD::getAddrFamily(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (addr->m_addr.sa_family) { - case AF_INET: - return kINET; + switch (addr->m_addr.sa_family) { + case AF_INET: + return kINET; - default: - return kUNKNOWN; - } + default: + return kUNKNOWN; + } } void ArchNetworkBSD::setAddrPort(ArchNetAddress addr, int port) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - ipAddr->sin_port = htons(port); - break; - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + ipAddr->sin_port = htons(port); + break; + } - default: - assert(0 && "unknown address family"); - break; - } + default: + assert(0 && "unknown address family"); + break; + } } int ArchNetworkBSD::getAddrPort(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - return ntohs(ipAddr->sin_port); - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + return ntohs(ipAddr->sin_port); + } - default: - assert(0 && "unknown address family"); - return 0; - } + default: + assert(0 && "unknown address family"); + return 0; + } } bool ArchNetworkBSD::isAnyAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - return (ipAddr->sin_addr.s_addr == INADDR_ANY && - addr->m_len == (socklen_t)sizeof(struct sockaddr_in)); - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + return (ipAddr->sin_addr.s_addr == INADDR_ANY && + addr->m_len == (socklen_t)sizeof(struct sockaddr_in)); + } - default: - assert(0 && "unknown address family"); - return true; - } + default: + assert(0 && "unknown address family"); + return true; + } } bool ArchNetworkBSD::isEqualAddr(ArchNetAddress a, ArchNetAddress b) { - return (a->m_len == b->m_len && - memcmp(&a->m_addr, &b->m_addr, a->m_len) == 0); + return (a->m_len == b->m_len && + memcmp(&a->m_addr, &b->m_addr, a->m_len) == 0); } const int* ArchNetworkBSD::getUnblockPipe() { - ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance(); - ArchThread thread = mt->newCurrentThread(); - const int* p = getUnblockPipeForThread(thread); - ARCH->closeThread(thread); - return p; + ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance(); + ArchThread thread = mt->newCurrentThread(); + const int* p = getUnblockPipeForThread(thread); + ARCH->closeThread(thread); + return p; } const int* ArchNetworkBSD::getUnblockPipeForThread(ArchThread thread) { - ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance(); - int* unblockPipe = (int*)mt->getNetworkDataForThread(thread); - if (unblockPipe == NULL) { - unblockPipe = new int[2]; - if (pipe(unblockPipe) != -1) { - try { - setBlockingOnSocket(unblockPipe[0], false); - mt->setNetworkDataForCurrentThread(unblockPipe); - } - catch (...) { - delete[] unblockPipe; - unblockPipe = NULL; - } - } - else { - delete[] unblockPipe; - unblockPipe = NULL; - } - } - return unblockPipe; + ArchMultithreadPosix* mt = ArchMultithreadPosix::getInstance(); + int* unblockPipe = (int*)mt->getNetworkDataForThread(thread); + if (unblockPipe == NULL) { + unblockPipe = new int[2]; + if (pipe(unblockPipe) != -1) { + try { + setBlockingOnSocket(unblockPipe[0], false); + mt->setNetworkDataForCurrentThread(unblockPipe); + } + catch (...) { + delete[] unblockPipe; + unblockPipe = NULL; + } + } + else { + delete[] unblockPipe; + unblockPipe = NULL; + } + } + return unblockPipe; } void ArchNetworkBSD::throwError(int err) { - switch (err) { - case EINTR: - ARCH->testCancelThread(); - throw XArchNetworkInterrupted(new XArchEvalUnix(err)); + switch (err) { + case EINTR: + ARCH->testCancelThread(); + throw XArchNetworkInterrupted(new XArchEvalUnix(err)); - case EACCES: - case EPERM: - throw XArchNetworkAccess(new XArchEvalUnix(err)); + case EACCES: + case EPERM: + throw XArchNetworkAccess(new XArchEvalUnix(err)); - case ENFILE: - case EMFILE: - case ENODEV: - case ENOBUFS: - case ENOMEM: - case ENETDOWN: + case ENFILE: + case EMFILE: + case ENODEV: + case ENOBUFS: + case ENOMEM: + case ENETDOWN: #if defined(ENOSR) - case ENOSR: + case ENOSR: #endif - throw XArchNetworkResource(new XArchEvalUnix(err)); + throw XArchNetworkResource(new XArchEvalUnix(err)); - case EPROTOTYPE: - case EPROTONOSUPPORT: - case EAFNOSUPPORT: - case EPFNOSUPPORT: - case ESOCKTNOSUPPORT: - case EINVAL: - case ENOPROTOOPT: - case EOPNOTSUPP: - case ESHUTDOWN: + case EPROTOTYPE: + case EPROTONOSUPPORT: + case EAFNOSUPPORT: + case EPFNOSUPPORT: + case ESOCKTNOSUPPORT: + case EINVAL: + case ENOPROTOOPT: + case EOPNOTSUPP: + case ESHUTDOWN: #if defined(ENOPKG) - case ENOPKG: + case ENOPKG: #endif - throw XArchNetworkSupport(new XArchEvalUnix(err)); + throw XArchNetworkSupport(new XArchEvalUnix(err)); - case EIO: - throw XArchNetworkIO(new XArchEvalUnix(err)); + case EIO: + throw XArchNetworkIO(new XArchEvalUnix(err)); - case EADDRNOTAVAIL: - throw XArchNetworkNoAddress(new XArchEvalUnix(err)); + case EADDRNOTAVAIL: + throw XArchNetworkNoAddress(new XArchEvalUnix(err)); - case EADDRINUSE: - throw XArchNetworkAddressInUse(new XArchEvalUnix(err)); + case EADDRINUSE: + throw XArchNetworkAddressInUse(new XArchEvalUnix(err)); - case EHOSTUNREACH: - case ENETUNREACH: - throw XArchNetworkNoRoute(new XArchEvalUnix(err)); + case EHOSTUNREACH: + case ENETUNREACH: + throw XArchNetworkNoRoute(new XArchEvalUnix(err)); - case ENOTCONN: - throw XArchNetworkNotConnected(new XArchEvalUnix(err)); + case ENOTCONN: + throw XArchNetworkNotConnected(new XArchEvalUnix(err)); - case EPIPE: - throw XArchNetworkShutdown(new XArchEvalUnix(err)); + case EPIPE: + throw XArchNetworkShutdown(new XArchEvalUnix(err)); - case ECONNABORTED: - case ECONNRESET: - throw XArchNetworkDisconnected(new XArchEvalUnix(err)); + case ECONNABORTED: + case ECONNRESET: + throw XArchNetworkDisconnected(new XArchEvalUnix(err)); - case ECONNREFUSED: - throw XArchNetworkConnectionRefused(new XArchEvalUnix(err)); + case ECONNREFUSED: + throw XArchNetworkConnectionRefused(new XArchEvalUnix(err)); - case EHOSTDOWN: - case ETIMEDOUT: - throw XArchNetworkTimedOut(new XArchEvalUnix(err)); + case EHOSTDOWN: + case ETIMEDOUT: + throw XArchNetworkTimedOut(new XArchEvalUnix(err)); - default: - throw XArchNetwork(new XArchEvalUnix(err)); - } + default: + throw XArchNetwork(new XArchEvalUnix(err)); + } } void ArchNetworkBSD::throwNameError(int err) { - static const char* s_msg[] = { - "The specified host is unknown", - "The requested name is valid but does not have an IP address", - "A non-recoverable name server error occurred", - "A temporary error occurred on an authoritative name server", - "An unknown name server error occurred" - }; + static const char* s_msg[] = { + "The specified host is unknown", + "The requested name is valid but does not have an IP address", + "A non-recoverable name server error occurred", + "A temporary error occurred on an authoritative name server", + "An unknown name server error occurred" + }; - switch (err) { - case HOST_NOT_FOUND: - throw XArchNetworkNameUnknown(s_msg[0]); + switch (err) { + case HOST_NOT_FOUND: + throw XArchNetworkNameUnknown(s_msg[0]); - case NO_DATA: - throw XArchNetworkNameNoAddress(s_msg[1]); + case NO_DATA: + throw XArchNetworkNameNoAddress(s_msg[1]); - case NO_RECOVERY: - throw XArchNetworkNameFailure(s_msg[2]); + case NO_RECOVERY: + throw XArchNetworkNameFailure(s_msg[2]); - case TRY_AGAIN: - throw XArchNetworkNameUnavailable(s_msg[3]); + case TRY_AGAIN: + throw XArchNetworkNameUnavailable(s_msg[3]); - default: - throw XArchNetworkName(s_msg[4]); - } + default: + throw XArchNetworkName(s_msg[4]); + } } diff --git a/src/lib/arch/unix/ArchNetworkBSD.h b/src/lib/arch/unix/ArchNetworkBSD.h index 7aab1e44..32a22cfd 100644 --- a/src/lib/arch/unix/ArchNetworkBSD.h +++ b/src/lib/arch/unix/ArchNetworkBSD.h @@ -22,10 +22,10 @@ #include "arch/IArchMultithread.h" #if HAVE_SYS_TYPES_H -# include +# include #endif #if HAVE_SYS_SOCKET_H -# include +# include #endif #if !HAVE_SOCKLEN_T @@ -41,64 +41,64 @@ typedef char optval_t; class ArchSocketImpl { public: - int m_fd; - int m_refCount; + int m_fd; + int m_refCount; }; class ArchNetAddressImpl { public: - ArchNetAddressImpl() : m_len(sizeof(m_addr)) { } + ArchNetAddressImpl() : m_len(sizeof(m_addr)) { } public: - struct sockaddr m_addr; - socklen_t m_len; + struct sockaddr m_addr; + socklen_t m_len; }; //! Berkeley (BSD) sockets implementation of IArchNetwork class ArchNetworkBSD : public IArchNetwork { public: - ArchNetworkBSD(); - virtual ~ArchNetworkBSD(); + ArchNetworkBSD(); + virtual ~ArchNetworkBSD(); - virtual void init(); + virtual void init(); - // IArchNetwork overrides - virtual ArchSocket newSocket(EAddressFamily, ESocketType); - virtual ArchSocket copySocket(ArchSocket s); virtual void closeSocket(ArchSocket s); - virtual void closeSocketForRead(ArchSocket s); - virtual void closeSocketForWrite(ArchSocket s); - virtual void bindSocket(ArchSocket s, ArchNetAddress addr); - virtual void listenOnSocket(ArchSocket s); - virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr); - virtual bool connectSocket(ArchSocket s, ArchNetAddress name); - virtual int pollSocket(PollEntry[], int num, double timeout); - virtual void unblockPollSocket(ArchThread thread); - virtual size_t readSocket(ArchSocket s, void* buf, size_t len); - virtual size_t writeSocket(ArchSocket s, - const void* buf, size_t len); - virtual void throwErrorOnSocket(ArchSocket); - virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay); - virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse); - virtual std::string getHostName(); - virtual ArchNetAddress newAnyAddr(EAddressFamily); - virtual ArchNetAddress copyAddr(ArchNetAddress); - virtual ArchNetAddress nameToAddr(const std::string&); - virtual void closeAddr(ArchNetAddress); - virtual std::string addrToName(ArchNetAddress); - virtual std::string addrToString(ArchNetAddress); - virtual EAddressFamily getAddrFamily(ArchNetAddress); - virtual void setAddrPort(ArchNetAddress, int port); - virtual int getAddrPort(ArchNetAddress); - virtual bool isAnyAddr(ArchNetAddress); - virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress); + // IArchNetwork overrides + virtual ArchSocket newSocket(EAddressFamily, ESocketType); + virtual ArchSocket copySocket(ArchSocket s); virtual void closeSocket(ArchSocket s); + virtual void closeSocketForRead(ArchSocket s); + virtual void closeSocketForWrite(ArchSocket s); + virtual void bindSocket(ArchSocket s, ArchNetAddress addr); + virtual void listenOnSocket(ArchSocket s); + virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr); + virtual bool connectSocket(ArchSocket s, ArchNetAddress name); + virtual int pollSocket(PollEntry[], int num, double timeout); + virtual void unblockPollSocket(ArchThread thread); + virtual size_t readSocket(ArchSocket s, void* buf, size_t len); + virtual size_t writeSocket(ArchSocket s, + const void* buf, size_t len); + virtual void throwErrorOnSocket(ArchSocket); + virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay); + virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse); + virtual std::string getHostName(); + virtual ArchNetAddress newAnyAddr(EAddressFamily); + virtual ArchNetAddress copyAddr(ArchNetAddress); + virtual ArchNetAddress nameToAddr(const std::string&); + virtual void closeAddr(ArchNetAddress); + virtual std::string addrToName(ArchNetAddress); + virtual std::string addrToString(ArchNetAddress); + virtual EAddressFamily getAddrFamily(ArchNetAddress); + virtual void setAddrPort(ArchNetAddress, int port); + virtual int getAddrPort(ArchNetAddress); + virtual bool isAnyAddr(ArchNetAddress); + virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress); private: - const int* getUnblockPipe(); - const int* getUnblockPipeForThread(ArchThread); - void setBlockingOnSocket(int fd, bool blocking); - void throwError(int); - void throwNameError(int); + const int* getUnblockPipe(); + const int* getUnblockPipeForThread(ArchThread); + void setBlockingOnSocket(int fd, bool blocking); + void throwError(int); + void throwNameError(int); private: - ArchMutex m_mutex; + ArchMutex m_mutex; }; diff --git a/src/lib/arch/unix/ArchSleepUnix.cpp b/src/lib/arch/unix/ArchSleepUnix.cpp index a271b96d..ad093c30 100644 --- a/src/lib/arch/unix/ArchSleepUnix.cpp +++ b/src/lib/arch/unix/ArchSleepUnix.cpp @@ -21,25 +21,25 @@ #include "arch/Arch.h" #if TIME_WITH_SYS_TIME -# include -# include +# include +# include #else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif #endif #if !HAVE_NANOSLEEP -# if HAVE_SYS_SELECT_H -# include -# endif -# if HAVE_SYS_TYPES_H -# include -# endif -# if HAVE_UNISTD_H -# include -# endif +# if HAVE_SYS_SELECT_H +# include +# endif +# if HAVE_SYS_TYPES_H +# include +# endif +# if HAVE_UNISTD_H +# include +# endif #endif // @@ -48,47 +48,47 @@ ArchSleepUnix::ArchSleepUnix() { - // do nothing + // do nothing } ArchSleepUnix::~ArchSleepUnix() { - // do nothing + // do nothing } void ArchSleepUnix::sleep(double timeout) { - ARCH->testCancelThread(); - if (timeout < 0.0) { - return; - } + ARCH->testCancelThread(); + if (timeout < 0.0) { + return; + } #if HAVE_NANOSLEEP - // prep timeout - struct timespec t; - t.tv_sec = (long)timeout; - t.tv_nsec = (long)(1.0e+9 * (timeout - (double)t.tv_sec)); + // prep timeout + struct timespec t; + t.tv_sec = (long)timeout; + t.tv_nsec = (long)(1.0e+9 * (timeout - (double)t.tv_sec)); - // wait - while (nanosleep(&t, &t) < 0) - ARCH->testCancelThread(); + // wait + while (nanosleep(&t, &t) < 0) + ARCH->testCancelThread(); #else - /* emulate nanosleep() with select() */ - double startTime = ARCH->time(); - double timeLeft = timeout; - while (timeLeft > 0.0) { - struct timeval timeout2; - timeout2.tv_sec = static_cast(timeLeft); - timeout2.tv_usec = static_cast(1.0e+6 * (timeLeft - - timeout2.tv_sec)); - select((SELECT_TYPE_ARG1) 0, - SELECT_TYPE_ARG234 NULL, - SELECT_TYPE_ARG234 NULL, - SELECT_TYPE_ARG234 NULL, - SELECT_TYPE_ARG5 &timeout2); - ARCH->testCancelThread(); - timeLeft = timeout - (ARCH->time() - startTime); - } + /* emulate nanosleep() with select() */ + double startTime = ARCH->time(); + double timeLeft = timeout; + while (timeLeft > 0.0) { + struct timeval timeout2; + timeout2.tv_sec = static_cast(timeLeft); + timeout2.tv_usec = static_cast(1.0e+6 * (timeLeft - + timeout2.tv_sec)); + select((SELECT_TYPE_ARG1) 0, + SELECT_TYPE_ARG234 NULL, + SELECT_TYPE_ARG234 NULL, + SELECT_TYPE_ARG234 NULL, + SELECT_TYPE_ARG5 &timeout2); + ARCH->testCancelThread(); + timeLeft = timeout - (ARCH->time() - startTime); + } #endif } diff --git a/src/lib/arch/unix/ArchSleepUnix.h b/src/lib/arch/unix/ArchSleepUnix.h index 6be92e93..0027549b 100644 --- a/src/lib/arch/unix/ArchSleepUnix.h +++ b/src/lib/arch/unix/ArchSleepUnix.h @@ -25,9 +25,9 @@ //! Unix implementation of IArchSleep class ArchSleepUnix : public IArchSleep { public: - ArchSleepUnix(); - virtual ~ArchSleepUnix(); + ArchSleepUnix(); + virtual ~ArchSleepUnix(); - // IArchSleep overrides - virtual void sleep(double timeout); + // IArchSleep overrides + virtual void sleep(double timeout); }; diff --git a/src/lib/arch/unix/ArchStringUnix.cpp b/src/lib/arch/unix/ArchStringUnix.cpp index 4eecdde2..fbb3e098 100644 --- a/src/lib/arch/unix/ArchStringUnix.cpp +++ b/src/lib/arch/unix/ArchStringUnix.cpp @@ -38,5 +38,5 @@ ArchStringUnix::~ArchStringUnix() IArchString::EWideCharEncoding ArchStringUnix::getWideCharEncoding() { - return kUCS4; + return kUCS4; } diff --git a/src/lib/arch/unix/ArchStringUnix.h b/src/lib/arch/unix/ArchStringUnix.h index bea1153b..ce5c5531 100644 --- a/src/lib/arch/unix/ArchStringUnix.h +++ b/src/lib/arch/unix/ArchStringUnix.h @@ -25,10 +25,10 @@ //! Unix implementation of IArchString class ArchStringUnix : public IArchString { public: - ArchStringUnix(); - virtual ~ArchStringUnix(); + ArchStringUnix(); + virtual ~ArchStringUnix(); - // IArchString overrides - virtual EWideCharEncoding - getWideCharEncoding(); + // IArchString overrides + virtual EWideCharEncoding + getWideCharEncoding(); }; diff --git a/src/lib/arch/unix/ArchSystemUnix.cpp b/src/lib/arch/unix/ArchSystemUnix.cpp index 5bcea619..e877f23e 100644 --- a/src/lib/arch/unix/ArchSystemUnix.cpp +++ b/src/lib/arch/unix/ArchSystemUnix.cpp @@ -26,46 +26,46 @@ ArchSystemUnix::ArchSystemUnix() { - // do nothing + // do nothing } ArchSystemUnix::~ArchSystemUnix() { - // do nothing + // do nothing } std::string ArchSystemUnix::getOSName() const { #if defined(HAVE_SYS_UTSNAME_H) - struct utsname info; - if (uname(&info) == 0) { - std::string msg; - msg += info.sysname; - msg += " "; - msg += info.release; - return msg; - } + struct utsname info; + if (uname(&info) == 0) { + std::string msg; + msg += info.sysname; + msg += " "; + msg += info.release; + return msg; + } #endif - return "Unix"; + return "Unix"; } std::string ArchSystemUnix::getPlatformName() const { #if defined(HAVE_SYS_UTSNAME_H) - struct utsname info; - if (uname(&info) == 0) { - return std::string(info.machine); - } + struct utsname info; + if (uname(&info) == 0) { + return std::string(info.machine); + } #endif - return "unknown"; + return "unknown"; } std::string ArchSystemUnix::setting(const std::string&) const { - return ""; + return ""; } void @@ -76,5 +76,5 @@ ArchSystemUnix::setting(const std::string&, const std::string&) const std::string ArchSystemUnix::getLibsUsed(void) const { - return "not implemented.\nuse lsof on shell"; + return "not implemented.\nuse lsof on shell"; } diff --git a/src/lib/arch/unix/ArchSystemUnix.h b/src/lib/arch/unix/ArchSystemUnix.h index 622f9ee6..f7c64218 100644 --- a/src/lib/arch/unix/ArchSystemUnix.h +++ b/src/lib/arch/unix/ArchSystemUnix.h @@ -25,14 +25,14 @@ //! Unix implementation of IArchString class ArchSystemUnix : public IArchSystem { public: - ArchSystemUnix(); - virtual ~ArchSystemUnix(); + ArchSystemUnix(); + virtual ~ArchSystemUnix(); - // IArchSystem overrides - virtual std::string getOSName() const; - virtual std::string getPlatformName() const; - virtual std::string setting(const std::string&) const; - virtual void setting(const std::string&, const std::string&) const; - virtual std::string getLibsUsed(void) const; + // IArchSystem overrides + virtual std::string getOSName() const; + virtual std::string getPlatformName() const; + virtual std::string setting(const std::string&) const; + virtual void setting(const std::string&, const std::string&) const; + virtual std::string getLibsUsed(void) const; }; diff --git a/src/lib/arch/unix/ArchTaskBarXWindows.cpp b/src/lib/arch/unix/ArchTaskBarXWindows.cpp index 9b05d208..85d8fe79 100644 --- a/src/lib/arch/unix/ArchTaskBarXWindows.cpp +++ b/src/lib/arch/unix/ArchTaskBarXWindows.cpp @@ -24,28 +24,28 @@ ArchTaskBarXWindows::ArchTaskBarXWindows() { - // do nothing + // do nothing } ArchTaskBarXWindows::~ArchTaskBarXWindows() { - // do nothing + // do nothing } void ArchTaskBarXWindows::addReceiver(IArchTaskBarReceiver* /*receiver*/) { - // do nothing + // do nothing } void ArchTaskBarXWindows::removeReceiver(IArchTaskBarReceiver* /*receiver*/) { - // do nothing + // do nothing } void ArchTaskBarXWindows::updateReceiver(IArchTaskBarReceiver* /*receiver*/) { - // do nothing + // do nothing } diff --git a/src/lib/arch/unix/ArchTaskBarXWindows.h b/src/lib/arch/unix/ArchTaskBarXWindows.h index c772c379..2bd7c569 100644 --- a/src/lib/arch/unix/ArchTaskBarXWindows.h +++ b/src/lib/arch/unix/ArchTaskBarXWindows.h @@ -25,11 +25,11 @@ //! X11 implementation of IArchTaskBar class ArchTaskBarXWindows : public IArchTaskBar { public: - ArchTaskBarXWindows(); - virtual ~ArchTaskBarXWindows(); + ArchTaskBarXWindows(); + virtual ~ArchTaskBarXWindows(); - // IArchTaskBar overrides - virtual void addReceiver(IArchTaskBarReceiver*); - virtual void removeReceiver(IArchTaskBarReceiver*); - virtual void updateReceiver(IArchTaskBarReceiver*); + // IArchTaskBar overrides + virtual void addReceiver(IArchTaskBarReceiver*); + virtual void removeReceiver(IArchTaskBarReceiver*); + virtual void updateReceiver(IArchTaskBarReceiver*); }; diff --git a/src/lib/arch/unix/ArchTimeUnix.cpp b/src/lib/arch/unix/ArchTimeUnix.cpp index 74eb3d3f..cc5d7a38 100644 --- a/src/lib/arch/unix/ArchTimeUnix.cpp +++ b/src/lib/arch/unix/ArchTimeUnix.cpp @@ -19,14 +19,14 @@ #include "arch/unix/ArchTimeUnix.h" #if TIME_WITH_SYS_TIME -# include -# include +# include +# include #else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif #endif // @@ -35,18 +35,18 @@ ArchTimeUnix::ArchTimeUnix() { - // do nothing + // do nothing } ArchTimeUnix::~ArchTimeUnix() { - // do nothing + // do nothing } double ArchTimeUnix::time() { - struct timeval t; - gettimeofday(&t, NULL); - return (double)t.tv_sec + 1.0e-6 * (double)t.tv_usec; + struct timeval t; + gettimeofday(&t, NULL); + return (double)t.tv_sec + 1.0e-6 * (double)t.tv_usec; } diff --git a/src/lib/arch/unix/ArchTimeUnix.h b/src/lib/arch/unix/ArchTimeUnix.h index f7fa82fc..770bf32e 100644 --- a/src/lib/arch/unix/ArchTimeUnix.h +++ b/src/lib/arch/unix/ArchTimeUnix.h @@ -25,9 +25,9 @@ //! Generic Unix implementation of IArchTime class ArchTimeUnix : public IArchTime { public: - ArchTimeUnix(); - virtual ~ArchTimeUnix(); + ArchTimeUnix(); + virtual ~ArchTimeUnix(); - // IArchTime overrides - virtual double time(); + // IArchTime overrides + virtual double time(); }; diff --git a/src/lib/arch/unix/XArchUnix.cpp b/src/lib/arch/unix/XArchUnix.cpp index fee9e016..5178bbfe 100644 --- a/src/lib/arch/unix/XArchUnix.cpp +++ b/src/lib/arch/unix/XArchUnix.cpp @@ -27,6 +27,6 @@ std::string XArchEvalUnix::eval() const { - // FIXME -- not thread safe - return strerror(m_error); + // FIXME -- not thread safe + return strerror(m_error); } diff --git a/src/lib/arch/unix/XArchUnix.h b/src/lib/arch/unix/XArchUnix.h index 5bdc1056..53c9f5b1 100644 --- a/src/lib/arch/unix/XArchUnix.h +++ b/src/lib/arch/unix/XArchUnix.h @@ -23,11 +23,11 @@ //! Lazy error message string evaluation for unix class XArchEvalUnix : public XArchEval { public: - XArchEvalUnix(int error) : m_error(error) { } - virtual ~XArchEvalUnix() _NOEXCEPT { } + XArchEvalUnix(int error) : m_error(error) { } + virtual ~XArchEvalUnix() _NOEXCEPT { } - virtual std::string eval() const; + virtual std::string eval() const; private: - int m_error; + int m_error; }; diff --git a/src/lib/arch/vsnprintf.h b/src/lib/arch/vsnprintf.h index a3b14d96..f6216ee8 100644 --- a/src/lib/arch/vsnprintf.h +++ b/src/lib/arch/vsnprintf.h @@ -21,17 +21,17 @@ #if HAVE_VSNPRINTF #if !defined(ARCH_VSNPRINTF) -# define ARCH_VSNPRINTF vsnprintf +# define ARCH_VSNPRINTF vsnprintf #endif int IArchString::vsnprintf(char* str, int size, const char* fmt, va_list ap) { - int n = ::ARCH_VSNPRINTF(str, size, fmt, ap); - if (n > size) { - n = -1; - } - return n; + int n = ::ARCH_VSNPRINTF(str, size, fmt, ap); + if (n > size) { + n = -1; + } + return n; } #elif SYSAPI_UNIX // !HAVE_VSNPRINTF @@ -41,23 +41,23 @@ IArchString::vsnprintf(char* str, int size, const char* fmt, va_list ap) int IArchString::vsnprintf(char* str, int size, const char* fmt, va_list ap) { - static FILE* bitbucket = fopen("/dev/null", "w"); - if (bitbucket == NULL) { - // uh oh - if (size > 0) { - str[0] = '\0'; - } - return 0; - } - else { - // count the characters using the bitbucket - int n = vfprintf(bitbucket, fmt, ap); - if (n + 1 <= size) { - // it'll fit so print it into str - vsprintf(str, fmt, ap); - } - return n; - } + static FILE* bitbucket = fopen("/dev/null", "w"); + if (bitbucket == NULL) { + // uh oh + if (size > 0) { + str[0] = '\0'; + } + return 0; + } + else { + // count the characters using the bitbucket + int n = vfprintf(bitbucket, fmt, ap); + if (n + 1 <= size) { + // it'll fit so print it into str + vsprintf(str, fmt, ap); + } + return n; + } } #else // !HAVE_VSNPRINTF && !SYSAPI_UNIX diff --git a/src/lib/arch/win32/ArchConsoleWindows.h b/src/lib/arch/win32/ArchConsoleWindows.h index ca264c89..4342de30 100644 --- a/src/lib/arch/win32/ArchConsoleWindows.h +++ b/src/lib/arch/win32/ArchConsoleWindows.h @@ -24,6 +24,6 @@ class ArchConsoleWindows : public ArchConsoleStd { public: - ArchConsoleWindows(); - virtual ~ArchConsoleWindows(); + ArchConsoleWindows(); + virtual ~ArchConsoleWindows(); }; diff --git a/src/lib/arch/win32/ArchDaemonWindows.cpp b/src/lib/arch/win32/ArchDaemonWindows.cpp index ea6d6cca..9c29be35 100644 --- a/src/lib/arch/win32/ArchDaemonWindows.cpp +++ b/src/lib/arch/win32/ArchDaemonWindows.cpp @@ -28,685 +28,685 @@ // ArchDaemonWindows // -ArchDaemonWindows* ArchDaemonWindows::s_daemon = NULL; +ArchDaemonWindows* ArchDaemonWindows::s_daemon = NULL; ArchDaemonWindows::ArchDaemonWindows() : m_daemonThreadID(0) { - m_quitMessage = RegisterWindowMessage("SynergyDaemonExit"); + m_quitMessage = RegisterWindowMessage("SynergyDaemonExit"); } ArchDaemonWindows::~ArchDaemonWindows() { - // do nothing + // do nothing } int ArchDaemonWindows::runDaemon(RunFunc runFunc) { - assert(s_daemon != NULL); - return s_daemon->doRunDaemon(runFunc); + assert(s_daemon != NULL); + return s_daemon->doRunDaemon(runFunc); } void ArchDaemonWindows::daemonRunning(bool running) { - if (s_daemon != NULL) { - s_daemon->doDaemonRunning(running); - } + if (s_daemon != NULL) { + s_daemon->doDaemonRunning(running); + } } UINT ArchDaemonWindows::getDaemonQuitMessage() { - if (s_daemon != NULL) { - return s_daemon->doGetDaemonQuitMessage(); - } - else { - return 0; - } + if (s_daemon != NULL) { + return s_daemon->doGetDaemonQuitMessage(); + } + else { + return 0; + } } void ArchDaemonWindows::daemonFailed(int result) { - assert(s_daemon != NULL); - throw XArchDaemonRunFailed(result); + assert(s_daemon != NULL); + throw XArchDaemonRunFailed(result); } void ArchDaemonWindows::installDaemon(const char* name, - const char* description, - const char* pathname, - const char* commandLine, - const char* dependencies) + const char* description, + const char* pathname, + const char* commandLine, + const char* dependencies) { - // open service manager - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); - if (mgr == NULL) { - // can't open service manager - throw XArchDaemonInstallFailed(new XArchEvalWindows); - } + // open service manager + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); + if (mgr == NULL) { + // can't open service manager + throw XArchDaemonInstallFailed(new XArchEvalWindows); + } - // create the service - SC_HANDLE service = CreateService( - mgr, - name, - name, - 0, - SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, - SERVICE_AUTO_START, - SERVICE_ERROR_NORMAL, - pathname, - NULL, - NULL, - dependencies, - NULL, - NULL); + // create the service + SC_HANDLE service = CreateService( + mgr, + name, + name, + 0, + SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + pathname, + NULL, + NULL, + dependencies, + NULL, + NULL); - if (service == NULL) { - // can't create service - DWORD err = GetLastError(); - if (err != ERROR_SERVICE_EXISTS) { - CloseServiceHandle(mgr); - throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); - } - } - else { - // done with service (but only try to close if not null) - CloseServiceHandle(service); - } + if (service == NULL) { + // can't create service + DWORD err = GetLastError(); + if (err != ERROR_SERVICE_EXISTS) { + CloseServiceHandle(mgr); + throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); + } + } + else { + // done with service (but only try to close if not null) + CloseServiceHandle(service); + } - // done with manager - CloseServiceHandle(mgr); + // done with manager + CloseServiceHandle(mgr); - // open the registry key for this service - HKEY key = openNTServicesKey(); - key = ArchMiscWindows::addKey(key, name); - if (key == NULL) { - // can't open key - DWORD err = GetLastError(); - try { - uninstallDaemon(name); - } - catch (...) { - // ignore - } - throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); - } + // open the registry key for this service + HKEY key = openNTServicesKey(); + key = ArchMiscWindows::addKey(key, name); + if (key == NULL) { + // can't open key + DWORD err = GetLastError(); + try { + uninstallDaemon(name); + } + catch (...) { + // ignore + } + throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); + } - // set the description - ArchMiscWindows::setValue(key, _T("Description"), description); + // set the description + ArchMiscWindows::setValue(key, _T("Description"), description); - // set command line - key = ArchMiscWindows::addKey(key, _T("Parameters")); - if (key == NULL) { - // can't open key - DWORD err = GetLastError(); - ArchMiscWindows::closeKey(key); - try { - uninstallDaemon(name); - } - catch (...) { - // ignore - } - throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); - } - ArchMiscWindows::setValue(key, _T("CommandLine"), commandLine); + // set command line + key = ArchMiscWindows::addKey(key, _T("Parameters")); + if (key == NULL) { + // can't open key + DWORD err = GetLastError(); + ArchMiscWindows::closeKey(key); + try { + uninstallDaemon(name); + } + catch (...) { + // ignore + } + throw XArchDaemonInstallFailed(new XArchEvalWindows(err)); + } + ArchMiscWindows::setValue(key, _T("CommandLine"), commandLine); - // done with registry - ArchMiscWindows::closeKey(key); + // done with registry + ArchMiscWindows::closeKey(key); } void ArchDaemonWindows::uninstallDaemon(const char* name) { - // remove parameters for this service. ignore failures. - HKEY key = openNTServicesKey(); - key = ArchMiscWindows::openKey(key, name); - if (key != NULL) { - ArchMiscWindows::deleteKey(key, _T("Parameters")); - ArchMiscWindows::closeKey(key); - } + // remove parameters for this service. ignore failures. + HKEY key = openNTServicesKey(); + key = ArchMiscWindows::openKey(key, name); + if (key != NULL) { + ArchMiscWindows::deleteKey(key, _T("Parameters")); + ArchMiscWindows::closeKey(key); + } - // open service manager - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); - if (mgr == NULL) { - // can't open service manager - throw XArchDaemonUninstallFailed(new XArchEvalWindows); - } + // open service manager + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); + if (mgr == NULL) { + // can't open service manager + throw XArchDaemonUninstallFailed(new XArchEvalWindows); + } - // open the service. oddly, you must open a service to delete it. - SC_HANDLE service = OpenService(mgr, name, DELETE | SERVICE_STOP); - if (service == NULL) { - DWORD err = GetLastError(); - CloseServiceHandle(mgr); - if (err != ERROR_SERVICE_DOES_NOT_EXIST) { - throw XArchDaemonUninstallFailed(new XArchEvalWindows(err)); - } - throw XArchDaemonUninstallNotInstalled(new XArchEvalWindows(err)); - } + // open the service. oddly, you must open a service to delete it. + SC_HANDLE service = OpenService(mgr, name, DELETE | SERVICE_STOP); + if (service == NULL) { + DWORD err = GetLastError(); + CloseServiceHandle(mgr); + if (err != ERROR_SERVICE_DOES_NOT_EXIST) { + throw XArchDaemonUninstallFailed(new XArchEvalWindows(err)); + } + throw XArchDaemonUninstallNotInstalled(new XArchEvalWindows(err)); + } - // stop the service. we don't care if we fail. - SERVICE_STATUS status; - ControlService(service, SERVICE_CONTROL_STOP, &status); + // stop the service. we don't care if we fail. + SERVICE_STATUS status; + ControlService(service, SERVICE_CONTROL_STOP, &status); - // delete the service - const bool okay = (DeleteService(service) == 0); - const DWORD err = GetLastError(); + // delete the service + const bool okay = (DeleteService(service) == 0); + const DWORD err = GetLastError(); - // clean up - CloseServiceHandle(service); - CloseServiceHandle(mgr); + // clean up + CloseServiceHandle(service); + CloseServiceHandle(mgr); - // give windows a chance to remove the service before - // we check if it still exists. - ARCH->sleep(1); + // give windows a chance to remove the service before + // we check if it still exists. + ARCH->sleep(1); - // handle failure. ignore error if service isn't installed anymore. - if (!okay && isDaemonInstalled(name)) { - if (err == ERROR_SUCCESS) { - // this seems to occur even though the uninstall was successful. - // it could be a timing issue, i.e., isDaemonInstalled is - // called too soon. i've added a sleep to try and stop this. - return; - } - if (err == ERROR_IO_PENDING) { - // this seems to be a spurious error - return; - } - if (err != ERROR_SERVICE_MARKED_FOR_DELETE) { - throw XArchDaemonUninstallFailed(new XArchEvalWindows(err)); - } - throw XArchDaemonUninstallNotInstalled(new XArchEvalWindows(err)); - } + // handle failure. ignore error if service isn't installed anymore. + if (!okay && isDaemonInstalled(name)) { + if (err == ERROR_SUCCESS) { + // this seems to occur even though the uninstall was successful. + // it could be a timing issue, i.e., isDaemonInstalled is + // called too soon. i've added a sleep to try and stop this. + return; + } + if (err == ERROR_IO_PENDING) { + // this seems to be a spurious error + return; + } + if (err != ERROR_SERVICE_MARKED_FOR_DELETE) { + throw XArchDaemonUninstallFailed(new XArchEvalWindows(err)); + } + throw XArchDaemonUninstallNotInstalled(new XArchEvalWindows(err)); + } } int ArchDaemonWindows::daemonize(const char* name, DaemonFunc func) { - assert(name != NULL); - assert(func != NULL); + assert(name != NULL); + assert(func != NULL); - // save daemon function - m_daemonFunc = func; + // save daemon function + m_daemonFunc = func; - // construct the service entry - SERVICE_TABLE_ENTRY entry[2]; - entry[0].lpServiceName = const_cast(name); - entry[0].lpServiceProc = &ArchDaemonWindows::serviceMainEntry; - entry[1].lpServiceName = NULL; - entry[1].lpServiceProc = NULL; + // construct the service entry + SERVICE_TABLE_ENTRY entry[2]; + entry[0].lpServiceName = const_cast(name); + entry[0].lpServiceProc = &ArchDaemonWindows::serviceMainEntry; + entry[1].lpServiceName = NULL; + entry[1].lpServiceProc = NULL; - // hook us up to the service control manager. this won't return - // (if successful) until the processes have terminated. - s_daemon = this; - if (StartServiceCtrlDispatcher(entry) == 0) { - // StartServiceCtrlDispatcher failed - s_daemon = NULL; - throw XArchDaemonFailed(new XArchEvalWindows); - } + // hook us up to the service control manager. this won't return + // (if successful) until the processes have terminated. + s_daemon = this; + if (StartServiceCtrlDispatcher(entry) == 0) { + // StartServiceCtrlDispatcher failed + s_daemon = NULL; + throw XArchDaemonFailed(new XArchEvalWindows); + } - s_daemon = NULL; - return m_daemonResult; + s_daemon = NULL; + return m_daemonResult; } bool ArchDaemonWindows::canInstallDaemon(const char* /*name*/) { - // check if we can open service manager for write - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); - if (mgr == NULL) { - return false; - } - CloseServiceHandle(mgr); + // check if we can open service manager for write + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_WRITE); + if (mgr == NULL) { + return false; + } + CloseServiceHandle(mgr); - // check if we can open the registry key - HKEY key = openNTServicesKey(); - ArchMiscWindows::closeKey(key); + // check if we can open the registry key + HKEY key = openNTServicesKey(); + ArchMiscWindows::closeKey(key); - return (key != NULL); + return (key != NULL); } bool ArchDaemonWindows::isDaemonInstalled(const char* name) { - // open service manager - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); - if (mgr == NULL) { - return false; - } + // open service manager + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); + if (mgr == NULL) { + return false; + } - // open the service - SC_HANDLE service = OpenService(mgr, name, GENERIC_READ); + // open the service + SC_HANDLE service = OpenService(mgr, name, GENERIC_READ); - // clean up - if (service != NULL) { - CloseServiceHandle(service); - } - CloseServiceHandle(mgr); + // clean up + if (service != NULL) { + CloseServiceHandle(service); + } + CloseServiceHandle(mgr); - return (service != NULL); + return (service != NULL); } HKEY ArchDaemonWindows::openNTServicesKey() { - static const char* s_keyNames[] = { - _T("SYSTEM"), - _T("CurrentControlSet"), - _T("Services"), - NULL - }; + static const char* s_keyNames[] = { + _T("SYSTEM"), + _T("CurrentControlSet"), + _T("Services"), + NULL + }; - return ArchMiscWindows::addKey(HKEY_LOCAL_MACHINE, s_keyNames); + return ArchMiscWindows::addKey(HKEY_LOCAL_MACHINE, s_keyNames); } bool ArchDaemonWindows::isRunState(DWORD state) { - switch (state) { - case SERVICE_START_PENDING: - case SERVICE_CONTINUE_PENDING: - case SERVICE_RUNNING: - return true; + switch (state) { + case SERVICE_START_PENDING: + case SERVICE_CONTINUE_PENDING: + case SERVICE_RUNNING: + return true; - default: - return false; - } + default: + return false; + } } int ArchDaemonWindows::doRunDaemon(RunFunc run) { - // should only be called from DaemonFunc - assert(m_serviceMutex != NULL); - assert(run != NULL); + // should only be called from DaemonFunc + assert(m_serviceMutex != NULL); + assert(run != NULL); - // create message queue for this thread - MSG dummy; - PeekMessage(&dummy, NULL, 0, 0, PM_NOREMOVE); + // create message queue for this thread + MSG dummy; + PeekMessage(&dummy, NULL, 0, 0, PM_NOREMOVE); - int result = 0; - ARCH->lockMutex(m_serviceMutex); - m_daemonThreadID = GetCurrentThreadId(); - while (m_serviceState != SERVICE_STOPPED) { - // wait until we're told to start - while (!isRunState(m_serviceState) && - m_serviceState != SERVICE_STOP_PENDING) { - ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); - } + int result = 0; + ARCH->lockMutex(m_serviceMutex); + m_daemonThreadID = GetCurrentThreadId(); + while (m_serviceState != SERVICE_STOPPED) { + // wait until we're told to start + while (!isRunState(m_serviceState) && + m_serviceState != SERVICE_STOP_PENDING) { + ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); + } - // run unless told to stop - if (m_serviceState != SERVICE_STOP_PENDING) { - ARCH->unlockMutex(m_serviceMutex); - try { - result = run(); - } - catch (...) { - ARCH->lockMutex(m_serviceMutex); - setStatusError(0); - m_serviceState = SERVICE_STOPPED; - setStatus(m_serviceState); - ARCH->broadcastCondVar(m_serviceCondVar); - ARCH->unlockMutex(m_serviceMutex); - throw; - } - ARCH->lockMutex(m_serviceMutex); - } + // run unless told to stop + if (m_serviceState != SERVICE_STOP_PENDING) { + ARCH->unlockMutex(m_serviceMutex); + try { + result = run(); + } + catch (...) { + ARCH->lockMutex(m_serviceMutex); + setStatusError(0); + m_serviceState = SERVICE_STOPPED; + setStatus(m_serviceState); + ARCH->broadcastCondVar(m_serviceCondVar); + ARCH->unlockMutex(m_serviceMutex); + throw; + } + ARCH->lockMutex(m_serviceMutex); + } - // notify of new state - if (m_serviceState == SERVICE_PAUSE_PENDING) { - m_serviceState = SERVICE_PAUSED; - } - else { - m_serviceState = SERVICE_STOPPED; - } - setStatus(m_serviceState); - ARCH->broadcastCondVar(m_serviceCondVar); - } - ARCH->unlockMutex(m_serviceMutex); - return result; + // notify of new state + if (m_serviceState == SERVICE_PAUSE_PENDING) { + m_serviceState = SERVICE_PAUSED; + } + else { + m_serviceState = SERVICE_STOPPED; + } + setStatus(m_serviceState); + ARCH->broadcastCondVar(m_serviceCondVar); + } + ARCH->unlockMutex(m_serviceMutex); + return result; } void ArchDaemonWindows::doDaemonRunning(bool running) { - ARCH->lockMutex(m_serviceMutex); - if (running) { - m_serviceState = SERVICE_RUNNING; - setStatus(m_serviceState); - ARCH->broadcastCondVar(m_serviceCondVar); - } - ARCH->unlockMutex(m_serviceMutex); + ARCH->lockMutex(m_serviceMutex); + if (running) { + m_serviceState = SERVICE_RUNNING; + setStatus(m_serviceState); + ARCH->broadcastCondVar(m_serviceCondVar); + } + ARCH->unlockMutex(m_serviceMutex); } UINT ArchDaemonWindows::doGetDaemonQuitMessage() { - return m_quitMessage; + return m_quitMessage; } void ArchDaemonWindows::setStatus(DWORD state) { - setStatus(state, 0, 0); + setStatus(state, 0, 0); } void ArchDaemonWindows::setStatus(DWORD state, DWORD step, DWORD waitHint) { - assert(s_daemon != NULL); + assert(s_daemon != NULL); - SERVICE_STATUS status; - status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | - SERVICE_INTERACTIVE_PROCESS; - status.dwCurrentState = state; - status.dwControlsAccepted = SERVICE_ACCEPT_STOP | - SERVICE_ACCEPT_PAUSE_CONTINUE | - SERVICE_ACCEPT_SHUTDOWN; - status.dwWin32ExitCode = NO_ERROR; - status.dwServiceSpecificExitCode = 0; - status.dwCheckPoint = step; - status.dwWaitHint = waitHint; - SetServiceStatus(s_daemon->m_statusHandle, &status); + SERVICE_STATUS status; + status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | + SERVICE_INTERACTIVE_PROCESS; + status.dwCurrentState = state; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP | + SERVICE_ACCEPT_PAUSE_CONTINUE | + SERVICE_ACCEPT_SHUTDOWN; + status.dwWin32ExitCode = NO_ERROR; + status.dwServiceSpecificExitCode = 0; + status.dwCheckPoint = step; + status.dwWaitHint = waitHint; + SetServiceStatus(s_daemon->m_statusHandle, &status); } void ArchDaemonWindows::setStatusError(DWORD error) { - assert(s_daemon != NULL); + assert(s_daemon != NULL); - SERVICE_STATUS status; - status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | - SERVICE_INTERACTIVE_PROCESS; - status.dwCurrentState = SERVICE_STOPPED; - status.dwControlsAccepted = SERVICE_ACCEPT_STOP | - SERVICE_ACCEPT_PAUSE_CONTINUE | - SERVICE_ACCEPT_SHUTDOWN; - status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - status.dwServiceSpecificExitCode = error; - status.dwCheckPoint = 0; - status.dwWaitHint = 0; - SetServiceStatus(s_daemon->m_statusHandle, &status); + SERVICE_STATUS status; + status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | + SERVICE_INTERACTIVE_PROCESS; + status.dwCurrentState = SERVICE_STOPPED; + status.dwControlsAccepted = SERVICE_ACCEPT_STOP | + SERVICE_ACCEPT_PAUSE_CONTINUE | + SERVICE_ACCEPT_SHUTDOWN; + status.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; + status.dwServiceSpecificExitCode = error; + status.dwCheckPoint = 0; + status.dwWaitHint = 0; + SetServiceStatus(s_daemon->m_statusHandle, &status); } void ArchDaemonWindows::serviceMain(DWORD argc, LPTSTR* argvIn) { - typedef std::vector ArgList; - typedef std::vector Arguments; - const char** argv = const_cast(argvIn); + typedef std::vector ArgList; + typedef std::vector Arguments; + const char** argv = const_cast(argvIn); - // create synchronization objects - m_serviceMutex = ARCH->newMutex(); - m_serviceCondVar = ARCH->newCondVar(); - - // register our service handler function - m_statusHandle = RegisterServiceCtrlHandler(argv[0], - &ArchDaemonWindows::serviceHandlerEntry); - if (m_statusHandle == 0) { - // cannot start as service - m_daemonResult = -1; - ARCH->closeCondVar(m_serviceCondVar); - ARCH->closeMutex(m_serviceMutex); - return; - } + // create synchronization objects + m_serviceMutex = ARCH->newMutex(); + m_serviceCondVar = ARCH->newCondVar(); + + // register our service handler function + m_statusHandle = RegisterServiceCtrlHandler(argv[0], + &ArchDaemonWindows::serviceHandlerEntry); + if (m_statusHandle == 0) { + // cannot start as service + m_daemonResult = -1; + ARCH->closeCondVar(m_serviceCondVar); + ARCH->closeMutex(m_serviceMutex); + return; + } - // tell service control manager that we're starting - m_serviceState = SERVICE_START_PENDING; - setStatus(m_serviceState, 0, 10000); + // tell service control manager that we're starting + m_serviceState = SERVICE_START_PENDING; + setStatus(m_serviceState, 0, 10000); - std::string commandLine; + std::string commandLine; - // if no arguments supplied then try getting them from the registry. - // the first argument doesn't count because it's the service name. - Arguments args; - ArgList myArgv; - if (argc <= 1) { - // read command line - HKEY key = openNTServicesKey(); - key = ArchMiscWindows::openKey(key, argvIn[0]); - key = ArchMiscWindows::openKey(key, _T("Parameters")); - if (key != NULL) { - commandLine = ArchMiscWindows::readValueString(key, - _T("CommandLine")); - } + // if no arguments supplied then try getting them from the registry. + // the first argument doesn't count because it's the service name. + Arguments args; + ArgList myArgv; + if (argc <= 1) { + // read command line + HKEY key = openNTServicesKey(); + key = ArchMiscWindows::openKey(key, argvIn[0]); + key = ArchMiscWindows::openKey(key, _T("Parameters")); + if (key != NULL) { + commandLine = ArchMiscWindows::readValueString(key, + _T("CommandLine")); + } - // if the command line isn't empty then parse and use it - if (!commandLine.empty()) { - // parse, honoring double quoted substrings - std::string::size_type i = commandLine.find_first_not_of(" \t"); - while (i != std::string::npos && i != commandLine.size()) { - // find end of string - std::string::size_type e; - if (commandLine[i] == '\"') { - // quoted. find closing quote. - ++i; - e = commandLine.find("\"", i); + // if the command line isn't empty then parse and use it + if (!commandLine.empty()) { + // parse, honoring double quoted substrings + std::string::size_type i = commandLine.find_first_not_of(" \t"); + while (i != std::string::npos && i != commandLine.size()) { + // find end of string + std::string::size_type e; + if (commandLine[i] == '\"') { + // quoted. find closing quote. + ++i; + e = commandLine.find("\"", i); - // whitespace must follow closing quote - if (e == std::string::npos || - (e + 1 != commandLine.size() && - commandLine[e + 1] != ' ' && - commandLine[e + 1] != '\t')) { - args.clear(); - break; - } + // whitespace must follow closing quote + if (e == std::string::npos || + (e + 1 != commandLine.size() && + commandLine[e + 1] != ' ' && + commandLine[e + 1] != '\t')) { + args.clear(); + break; + } - // extract - args.push_back(commandLine.substr(i, e - i)); - i = e + 1; - } - else { - // unquoted. find next whitespace. - e = commandLine.find_first_of(" \t", i); - if (e == std::string::npos) { - e = commandLine.size(); - } + // extract + args.push_back(commandLine.substr(i, e - i)); + i = e + 1; + } + else { + // unquoted. find next whitespace. + e = commandLine.find_first_of(" \t", i); + if (e == std::string::npos) { + e = commandLine.size(); + } - // extract - args.push_back(commandLine.substr(i, e - i)); - i = e + 1; - } + // extract + args.push_back(commandLine.substr(i, e - i)); + i = e + 1; + } - // next argument - i = commandLine.find_first_not_of(" \t", i); - } + // next argument + i = commandLine.find_first_not_of(" \t", i); + } - // service name goes first - myArgv.push_back(argv[0]); + // service name goes first + myArgv.push_back(argv[0]); - // get pointers - for (size_t j = 0; j < args.size(); ++j) { - myArgv.push_back(args[j].c_str()); - } + // get pointers + for (size_t j = 0; j < args.size(); ++j) { + myArgv.push_back(args[j].c_str()); + } - // adjust argc/argv - argc = (DWORD)myArgv.size(); - argv = &myArgv[0]; - } - } + // adjust argc/argv + argc = (DWORD)myArgv.size(); + argv = &myArgv[0]; + } + } - m_commandLine = commandLine; + m_commandLine = commandLine; - try { - // invoke daemon function - m_daemonResult = m_daemonFunc(static_cast(argc), argv); - } - catch (XArchDaemonRunFailed& e) { - setStatusError(e.m_result); - m_daemonResult = -1; - } - catch (...) { - setStatusError(1); - m_daemonResult = -1; - } + try { + // invoke daemon function + m_daemonResult = m_daemonFunc(static_cast(argc), argv); + } + catch (XArchDaemonRunFailed& e) { + setStatusError(e.m_result); + m_daemonResult = -1; + } + catch (...) { + setStatusError(1); + m_daemonResult = -1; + } - // clean up - ARCH->closeCondVar(m_serviceCondVar); - ARCH->closeMutex(m_serviceMutex); + // clean up + ARCH->closeCondVar(m_serviceCondVar); + ARCH->closeMutex(m_serviceMutex); - // we're going to exit now, so set status to stopped - m_serviceState = SERVICE_STOPPED; - setStatus(m_serviceState, 0, 10000); + // we're going to exit now, so set status to stopped + m_serviceState = SERVICE_STOPPED; + setStatus(m_serviceState, 0, 10000); } void WINAPI ArchDaemonWindows::serviceMainEntry(DWORD argc, LPTSTR* argv) { - s_daemon->serviceMain(argc, argv); + s_daemon->serviceMain(argc, argv); } void ArchDaemonWindows::serviceHandler(DWORD ctrl) { - assert(m_serviceMutex != NULL); - assert(m_serviceCondVar != NULL); + assert(m_serviceMutex != NULL); + assert(m_serviceCondVar != NULL); - ARCH->lockMutex(m_serviceMutex); + ARCH->lockMutex(m_serviceMutex); - // ignore request if service is already stopped - if (s_daemon == NULL || m_serviceState == SERVICE_STOPPED) { - if (s_daemon != NULL) { - setStatus(m_serviceState); - } - ARCH->unlockMutex(m_serviceMutex); - return; - } + // ignore request if service is already stopped + if (s_daemon == NULL || m_serviceState == SERVICE_STOPPED) { + if (s_daemon != NULL) { + setStatus(m_serviceState); + } + ARCH->unlockMutex(m_serviceMutex); + return; + } - switch (ctrl) { - case SERVICE_CONTROL_PAUSE: - m_serviceState = SERVICE_PAUSE_PENDING; - setStatus(m_serviceState, 0, 5000); - PostThreadMessage(m_daemonThreadID, m_quitMessage, 0, 0); - while (isRunState(m_serviceState)) { - ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); - } - break; + switch (ctrl) { + case SERVICE_CONTROL_PAUSE: + m_serviceState = SERVICE_PAUSE_PENDING; + setStatus(m_serviceState, 0, 5000); + PostThreadMessage(m_daemonThreadID, m_quitMessage, 0, 0); + while (isRunState(m_serviceState)) { + ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); + } + break; - case SERVICE_CONTROL_CONTINUE: - // FIXME -- maybe should flush quit messages from queue - m_serviceState = SERVICE_CONTINUE_PENDING; - setStatus(m_serviceState, 0, 5000); - ARCH->broadcastCondVar(m_serviceCondVar); - break; + case SERVICE_CONTROL_CONTINUE: + // FIXME -- maybe should flush quit messages from queue + m_serviceState = SERVICE_CONTINUE_PENDING; + setStatus(m_serviceState, 0, 5000); + ARCH->broadcastCondVar(m_serviceCondVar); + break; - case SERVICE_CONTROL_STOP: - case SERVICE_CONTROL_SHUTDOWN: - m_serviceState = SERVICE_STOP_PENDING; - setStatus(m_serviceState, 0, 5000); - PostThreadMessage(m_daemonThreadID, m_quitMessage, 0, 0); - ARCH->broadcastCondVar(m_serviceCondVar); - while (isRunState(m_serviceState)) { - ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); - } - break; + case SERVICE_CONTROL_STOP: + case SERVICE_CONTROL_SHUTDOWN: + m_serviceState = SERVICE_STOP_PENDING; + setStatus(m_serviceState, 0, 5000); + PostThreadMessage(m_daemonThreadID, m_quitMessage, 0, 0); + ARCH->broadcastCondVar(m_serviceCondVar); + while (isRunState(m_serviceState)) { + ARCH->waitCondVar(m_serviceCondVar, m_serviceMutex, -1.0); + } + break; - default: - // unknown service command - // fall through + default: + // unknown service command + // fall through - case SERVICE_CONTROL_INTERROGATE: - setStatus(m_serviceState); - break; - } + case SERVICE_CONTROL_INTERROGATE: + setStatus(m_serviceState); + break; + } - ARCH->unlockMutex(m_serviceMutex); + ARCH->unlockMutex(m_serviceMutex); } void WINAPI ArchDaemonWindows::serviceHandlerEntry(DWORD ctrl) { - s_daemon->serviceHandler(ctrl); + s_daemon->serviceHandler(ctrl); } void ArchDaemonWindows::start(const char* name) { - // open service manager - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); - if (mgr == NULL) { - throw XArchDaemonFailed(new XArchEvalWindows()); - } + // open service manager + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); + if (mgr == NULL) { + throw XArchDaemonFailed(new XArchEvalWindows()); + } - // open the service - SC_HANDLE service = OpenService( - mgr, name, SERVICE_START); + // open the service + SC_HANDLE service = OpenService( + mgr, name, SERVICE_START); - if (service == NULL) { - CloseServiceHandle(mgr); - throw XArchDaemonFailed(new XArchEvalWindows()); - } + if (service == NULL) { + CloseServiceHandle(mgr); + throw XArchDaemonFailed(new XArchEvalWindows()); + } - // start the service - if (!StartService(service, 0, NULL)) { - throw XArchDaemonFailed(new XArchEvalWindows()); - } + // start the service + if (!StartService(service, 0, NULL)) { + throw XArchDaemonFailed(new XArchEvalWindows()); + } } void ArchDaemonWindows::stop(const char* name) { - // open service manager - SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); - if (mgr == NULL) { - throw XArchDaemonFailed(new XArchEvalWindows()); - } + // open service manager + SC_HANDLE mgr = OpenSCManager(NULL, NULL, GENERIC_READ); + if (mgr == NULL) { + throw XArchDaemonFailed(new XArchEvalWindows()); + } - // open the service - SC_HANDLE service = OpenService( - mgr, name, - SERVICE_STOP | SERVICE_QUERY_STATUS); + // open the service + SC_HANDLE service = OpenService( + mgr, name, + SERVICE_STOP | SERVICE_QUERY_STATUS); - if (service == NULL) { - CloseServiceHandle(mgr); - throw XArchDaemonFailed(new XArchEvalWindows()); - } + if (service == NULL) { + CloseServiceHandle(mgr); + throw XArchDaemonFailed(new XArchEvalWindows()); + } - // ask the service to stop, asynchronously - SERVICE_STATUS ss; - if (!ControlService(service, SERVICE_CONTROL_STOP, &ss)) { - DWORD dwErrCode = GetLastError(); - if (dwErrCode != ERROR_SERVICE_NOT_ACTIVE) { - throw XArchDaemonFailed(new XArchEvalWindows()); - } - } + // ask the service to stop, asynchronously + SERVICE_STATUS ss; + if (!ControlService(service, SERVICE_CONTROL_STOP, &ss)) { + DWORD dwErrCode = GetLastError(); + if (dwErrCode != ERROR_SERVICE_NOT_ACTIVE) { + throw XArchDaemonFailed(new XArchEvalWindows()); + } + } } void ArchDaemonWindows::installDaemon() { - // install default daemon if not already installed. - if (!isDaemonInstalled(DEFAULT_DAEMON_NAME)) { - char path[MAX_PATH]; - GetModuleFileName(ArchMiscWindows::instanceWin32(), path, MAX_PATH); - - // wrap in quotes so a malicious user can't start \Program.exe as admin. - std::stringstream ss; - ss << '"'; - ss << path; - ss << '"'; + // install default daemon if not already installed. + if (!isDaemonInstalled(DEFAULT_DAEMON_NAME)) { + char path[MAX_PATH]; + GetModuleFileName(ArchMiscWindows::instanceWin32(), path, MAX_PATH); + + // wrap in quotes so a malicious user can't start \Program.exe as admin. + std::stringstream ss; + ss << '"'; + ss << path; + ss << '"'; - installDaemon(DEFAULT_DAEMON_NAME, DEFAULT_DAEMON_INFO, ss.str().c_str(), "", ""); - } + installDaemon(DEFAULT_DAEMON_NAME, DEFAULT_DAEMON_INFO, ss.str().c_str(), "", ""); + } - start(DEFAULT_DAEMON_NAME); + start(DEFAULT_DAEMON_NAME); } void ArchDaemonWindows::uninstallDaemon() { - // remove legacy services if installed. - if (isDaemonInstalled(LEGACY_SERVER_DAEMON_NAME)) { - uninstallDaemon(LEGACY_SERVER_DAEMON_NAME); - } - if (isDaemonInstalled(LEGACY_CLIENT_DAEMON_NAME)) { - uninstallDaemon(LEGACY_CLIENT_DAEMON_NAME); - } + // remove legacy services if installed. + if (isDaemonInstalled(LEGACY_SERVER_DAEMON_NAME)) { + uninstallDaemon(LEGACY_SERVER_DAEMON_NAME); + } + if (isDaemonInstalled(LEGACY_CLIENT_DAEMON_NAME)) { + uninstallDaemon(LEGACY_CLIENT_DAEMON_NAME); + } - // remove new service if installed. - if (isDaemonInstalled(DEFAULT_DAEMON_NAME)) { - uninstallDaemon(DEFAULT_DAEMON_NAME); - } + // remove new service if installed. + if (isDaemonInstalled(DEFAULT_DAEMON_NAME)) { + uninstallDaemon(DEFAULT_DAEMON_NAME); + } } diff --git a/src/lib/arch/win32/ArchDaemonWindows.h b/src/lib/arch/win32/ArchDaemonWindows.h index 2079c850..a3be9a58 100644 --- a/src/lib/arch/win32/ArchDaemonWindows.h +++ b/src/lib/arch/win32/ArchDaemonWindows.h @@ -31,112 +31,112 @@ //! Win32 implementation of IArchDaemon class ArchDaemonWindows : public IArchDaemon { public: - typedef int (*RunFunc)(void); + typedef int (*RunFunc)(void); - ArchDaemonWindows(); - virtual ~ArchDaemonWindows(); + ArchDaemonWindows(); + virtual ~ArchDaemonWindows(); - //! Run the daemon - /*! - When the client calls \c daemonize(), the \c DaemonFunc should call this - function after initialization and argument parsing to perform the - daemon processing. The \c runFunc should perform the daemon's - main loop, calling \c daemonRunning(true) when it enters the main loop - (i.e. after initialization) and \c daemonRunning(false) when it leaves - the main loop. The \c runFunc is called in a new thread and when the - daemon must exit the main loop due to some external control the - getDaemonQuitMessage() is posted to the thread. This function returns - what \c runFunc returns. \c runFunc should call \c daemonFailed() if - the daemon fails. - */ - static int runDaemon(RunFunc runFunc); + //! Run the daemon + /*! + When the client calls \c daemonize(), the \c DaemonFunc should call this + function after initialization and argument parsing to perform the + daemon processing. The \c runFunc should perform the daemon's + main loop, calling \c daemonRunning(true) when it enters the main loop + (i.e. after initialization) and \c daemonRunning(false) when it leaves + the main loop. The \c runFunc is called in a new thread and when the + daemon must exit the main loop due to some external control the + getDaemonQuitMessage() is posted to the thread. This function returns + what \c runFunc returns. \c runFunc should call \c daemonFailed() if + the daemon fails. + */ + static int runDaemon(RunFunc runFunc); - //! Indicate daemon is in main loop - /*! - The \c runFunc passed to \c runDaemon() should call this function - to indicate when it has entered (\c running is \c true) or exited - (\c running is \c false) the main loop. - */ - static void daemonRunning(bool running); + //! Indicate daemon is in main loop + /*! + The \c runFunc passed to \c runDaemon() should call this function + to indicate when it has entered (\c running is \c true) or exited + (\c running is \c false) the main loop. + */ + static void daemonRunning(bool running); - //! Indicate failure of running daemon - /*! - The \c runFunc passed to \c runDaemon() should call this function - to indicate failure. \c result is returned by \c daemonize(). - */ - static void daemonFailed(int result); + //! Indicate failure of running daemon + /*! + The \c runFunc passed to \c runDaemon() should call this function + to indicate failure. \c result is returned by \c daemonize(). + */ + static void daemonFailed(int result); - //! Get daemon quit message - /*! - The windows NT daemon tells daemon thread to exit by posting this - message to it. The thread must, of course, have a message queue - for this to work. - */ - static UINT getDaemonQuitMessage(); + //! Get daemon quit message + /*! + The windows NT daemon tells daemon thread to exit by posting this + message to it. The thread must, of course, have a message queue + for this to work. + */ + static UINT getDaemonQuitMessage(); - // IArchDaemon overrides - virtual void installDaemon(const char* name, - const char* description, - const char* pathname, - const char* commandLine, - const char* dependencies); - virtual void uninstallDaemon(const char* name); - virtual void installDaemon(); - virtual void uninstallDaemon(); - virtual int daemonize(const char* name, DaemonFunc func); - virtual bool canInstallDaemon(const char* name); - virtual bool isDaemonInstalled(const char* name); - std::string commandLine() const { return m_commandLine; } + // IArchDaemon overrides + virtual void installDaemon(const char* name, + const char* description, + const char* pathname, + const char* commandLine, + const char* dependencies); + virtual void uninstallDaemon(const char* name); + virtual void installDaemon(); + virtual void uninstallDaemon(); + virtual int daemonize(const char* name, DaemonFunc func); + virtual bool canInstallDaemon(const char* name); + virtual bool isDaemonInstalled(const char* name); + std::string commandLine() const { return m_commandLine; } private: - static HKEY openNTServicesKey(); + static HKEY openNTServicesKey(); - int doRunDaemon(RunFunc runFunc); - void doDaemonRunning(bool running); - UINT doGetDaemonQuitMessage(); + int doRunDaemon(RunFunc runFunc); + void doDaemonRunning(bool running); + UINT doGetDaemonQuitMessage(); - static void setStatus(DWORD state); - static void setStatus(DWORD state, DWORD step, DWORD waitHint); - static void setStatusError(DWORD error); + static void setStatus(DWORD state); + static void setStatus(DWORD state, DWORD step, DWORD waitHint); + static void setStatusError(DWORD error); - static bool isRunState(DWORD state); + static bool isRunState(DWORD state); - void serviceMain(DWORD, LPTSTR*); - static void WINAPI serviceMainEntry(DWORD, LPTSTR*); + void serviceMain(DWORD, LPTSTR*); + static void WINAPI serviceMainEntry(DWORD, LPTSTR*); - void serviceHandler(DWORD ctrl); - static void WINAPI serviceHandlerEntry(DWORD ctrl); + void serviceHandler(DWORD ctrl); + static void WINAPI serviceHandlerEntry(DWORD ctrl); - void start(const char* name); - void stop(const char* name); + void start(const char* name); + void stop(const char* name); private: - class XArchDaemonRunFailed { - public: - XArchDaemonRunFailed(int result) : m_result(result) { } + class XArchDaemonRunFailed { + public: + XArchDaemonRunFailed(int result) : m_result(result) { } - public: - int m_result; - }; + public: + int m_result; + }; private: - static ArchDaemonWindows* s_daemon; + static ArchDaemonWindows* s_daemon; - ArchMutex m_serviceMutex; - ArchCond m_serviceCondVar; - DWORD m_serviceState; - bool m_serviceHandlerWaiting; - bool m_serviceRunning; + ArchMutex m_serviceMutex; + ArchCond m_serviceCondVar; + DWORD m_serviceState; + bool m_serviceHandlerWaiting; + bool m_serviceRunning; - DWORD m_daemonThreadID; - DaemonFunc m_daemonFunc; - int m_daemonResult; + DWORD m_daemonThreadID; + DaemonFunc m_daemonFunc; + int m_daemonResult; - SERVICE_STATUS_HANDLE m_statusHandle; + SERVICE_STATUS_HANDLE m_statusHandle; - UINT m_quitMessage; + UINT m_quitMessage; - std::string m_commandLine; + std::string m_commandLine; }; #define DEFAULT_DAEMON_NAME _T("Synergy") @@ -146,9 +146,9 @@ private: #define LEGACY_CLIENT_DAEMON_NAME _T("Synergy Client") static const TCHAR* const g_daemonKeyPath[] = { - _T("SOFTWARE"), - _T("The Synergy Project"), - _T("Synergy"), - _T("Service"), - NULL + _T("SOFTWARE"), + _T("The Synergy Project"), + _T("Synergy"), + _T("Service"), + NULL }; diff --git a/src/lib/arch/win32/ArchFileWindows.cpp b/src/lib/arch/win32/ArchFileWindows.cpp index 373df72c..38679c1b 100644 --- a/src/lib/arch/win32/ArchFileWindows.cpp +++ b/src/lib/arch/win32/ArchFileWindows.cpp @@ -30,174 +30,174 @@ ArchFileWindows::ArchFileWindows() { - // do nothing + // do nothing } ArchFileWindows::~ArchFileWindows() { - // do nothing + // do nothing } const char* ArchFileWindows::getBasename(const char* pathname) { - if (pathname == NULL) { - return NULL; - } + if (pathname == NULL) { + return NULL; + } - // check for last slash - const char* basename = strrchr(pathname, '/'); - if (basename != NULL) { - ++basename; - } - else { - basename = pathname; - } + // check for last slash + const char* basename = strrchr(pathname, '/'); + if (basename != NULL) { + ++basename; + } + else { + basename = pathname; + } - // check for last backslash - const char* basename2 = strrchr(pathname, '\\'); - if (basename2 != NULL && basename2 > basename) { - basename = basename2 + 1; - } + // check for last backslash + const char* basename2 = strrchr(pathname, '\\'); + if (basename2 != NULL && basename2 > basename) { + basename = basename2 + 1; + } - return basename; + return basename; } std::string ArchFileWindows::getUserDirectory() { - // try %HOMEPATH% - TCHAR dir[MAX_PATH]; - DWORD size = sizeof(dir) / sizeof(TCHAR); - DWORD result = GetEnvironmentVariable(_T("HOMEPATH"), dir, size); - if (result != 0 && result <= size) { - // sanity check -- if dir doesn't appear to start with a - // drive letter and isn't a UNC name then don't use it - // FIXME -- allow UNC names - if (dir[0] != '\0' && (dir[1] == ':' || - ((dir[0] == '\\' || dir[0] == '/') && - (dir[1] == '\\' || dir[1] == '/')))) { - return dir; - } - } + // try %HOMEPATH% + TCHAR dir[MAX_PATH]; + DWORD size = sizeof(dir) / sizeof(TCHAR); + DWORD result = GetEnvironmentVariable(_T("HOMEPATH"), dir, size); + if (result != 0 && result <= size) { + // sanity check -- if dir doesn't appear to start with a + // drive letter and isn't a UNC name then don't use it + // FIXME -- allow UNC names + if (dir[0] != '\0' && (dir[1] == ':' || + ((dir[0] == '\\' || dir[0] == '/') && + (dir[1] == '\\' || dir[1] == '/')))) { + return dir; + } + } - // get the location of the personal files. that's as close to - // a home directory as we're likely to find. - ITEMIDLIST* idl; - if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &idl))) { - TCHAR* path = NULL; - if (SHGetPathFromIDList(idl, dir)) { - DWORD attr = GetFileAttributes(dir); - if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) - path = dir; - } + // get the location of the personal files. that's as close to + // a home directory as we're likely to find. + ITEMIDLIST* idl; + if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &idl))) { + TCHAR* path = NULL; + if (SHGetPathFromIDList(idl, dir)) { + DWORD attr = GetFileAttributes(dir); + if (attr != 0xffffffff && (attr & FILE_ATTRIBUTE_DIRECTORY) != 0) + path = dir; + } - IMalloc* shalloc; - if (SUCCEEDED(SHGetMalloc(&shalloc))) { - shalloc->Free(idl); - shalloc->Release(); - } + IMalloc* shalloc; + if (SUCCEEDED(SHGetMalloc(&shalloc))) { + shalloc->Free(idl); + shalloc->Release(); + } - if (path != NULL) { - return path; - } - } + if (path != NULL) { + return path; + } + } - // use root of C drive as a default - return "C:"; + // use root of C drive as a default + return "C:"; } std::string ArchFileWindows::getSystemDirectory() { - // get windows directory - char dir[MAX_PATH]; - if (GetWindowsDirectory(dir, sizeof(dir)) != 0) { - return dir; - } - else { - // can't get it. use C:\ as a default. - return "C:"; - } + // get windows directory + char dir[MAX_PATH]; + if (GetWindowsDirectory(dir, sizeof(dir)) != 0) { + return dir; + } + else { + // can't get it. use C:\ as a default. + return "C:"; + } } std::string ArchFileWindows::getInstalledDirectory() { - char fileNameBuffer[MAX_PATH]; - GetModuleFileName(NULL, fileNameBuffer, MAX_PATH); - std::string fileName(fileNameBuffer); - size_t lastSlash = fileName.find_last_of("\\"); - fileName = fileName.substr(0, lastSlash); + char fileNameBuffer[MAX_PATH]; + GetModuleFileName(NULL, fileNameBuffer, MAX_PATH); + std::string fileName(fileNameBuffer); + size_t lastSlash = fileName.find_last_of("\\"); + fileName = fileName.substr(0, lastSlash); - return fileName; + return fileName; } std::string ArchFileWindows::getLogDirectory() { - return getInstalledDirectory(); + return getInstalledDirectory(); } std::string ArchFileWindows::getPluginDirectory() { - if (!m_pluginDirectory.empty()) { - return m_pluginDirectory; - } + if (!m_pluginDirectory.empty()) { + return m_pluginDirectory; + } - std::string dir = getProfileDirectory(); - dir.append("\\Plugins"); - return dir; + std::string dir = getProfileDirectory(); + dir.append("\\Plugins"); + return dir; } std::string ArchFileWindows::getProfileDirectory() { - String dir; - if (!m_profileDirectory.empty()) { - dir = m_profileDirectory; - } - else { - TCHAR result[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, result))) { - dir = result; - } - else { - dir = getUserDirectory(); - } - } + String dir; + if (!m_profileDirectory.empty()) { + dir = m_profileDirectory; + } + else { + TCHAR result[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, result))) { + dir = result; + } + else { + dir = getUserDirectory(); + } + } - // HACK: append program name, this seems wrong. - dir.append("\\Synergy"); + // HACK: append program name, this seems wrong. + dir.append("\\Synergy"); - return dir; + return dir; } std::string ArchFileWindows::concatPath(const std::string& prefix, - const std::string& suffix) + const std::string& suffix) { - std::string path; - path.reserve(prefix.size() + 1 + suffix.size()); - path += prefix; - if (path.size() == 0 || - (path[path.size() - 1] != '\\' && - path[path.size() - 1] != '/')) { - path += '\\'; - } - path += suffix; - return path; + std::string path; + path.reserve(prefix.size() + 1 + suffix.size()); + path += prefix; + if (path.size() == 0 || + (path[path.size() - 1] != '\\' && + path[path.size() - 1] != '/')) { + path += '\\'; + } + path += suffix; + return path; } void ArchFileWindows::setProfileDirectory(const String& s) { - m_profileDirectory = s; + m_profileDirectory = s; } void ArchFileWindows::setPluginDirectory(const String& s) { - m_pluginDirectory = s; + m_pluginDirectory = s; } diff --git a/src/lib/arch/win32/ArchFileWindows.h b/src/lib/arch/win32/ArchFileWindows.h index cdb8e4a2..be1bdf81 100644 --- a/src/lib/arch/win32/ArchFileWindows.h +++ b/src/lib/arch/win32/ArchFileWindows.h @@ -25,23 +25,23 @@ //! Win32 implementation of IArchFile class ArchFileWindows : public IArchFile { public: - ArchFileWindows(); - virtual ~ArchFileWindows(); + ArchFileWindows(); + virtual ~ArchFileWindows(); - // IArchFile overrides - virtual const char* getBasename(const char* pathname); - virtual std::string getUserDirectory(); - virtual std::string getSystemDirectory(); - virtual std::string getInstalledDirectory(); - virtual std::string getLogDirectory(); - virtual std::string getPluginDirectory(); - virtual std::string getProfileDirectory(); - virtual std::string concatPath(const std::string& prefix, - const std::string& suffix); - virtual void setProfileDirectory(const String& s); - virtual void setPluginDirectory(const String& s); + // IArchFile overrides + virtual const char* getBasename(const char* pathname); + virtual std::string getUserDirectory(); + virtual std::string getSystemDirectory(); + virtual std::string getInstalledDirectory(); + virtual std::string getLogDirectory(); + virtual std::string getPluginDirectory(); + virtual std::string getProfileDirectory(); + virtual std::string concatPath(const std::string& prefix, + const std::string& suffix); + virtual void setProfileDirectory(const String& s); + virtual void setPluginDirectory(const String& s); private: - String m_profileDirectory; - String m_pluginDirectory; + String m_profileDirectory; + String m_pluginDirectory; }; diff --git a/src/lib/arch/win32/ArchInternetWindows.cpp b/src/lib/arch/win32/ArchInternetWindows.cpp index ca649117..5844d15d 100644 --- a/src/lib/arch/win32/ArchInternetWindows.cpp +++ b/src/lib/arch/win32/ArchInternetWindows.cpp @@ -25,29 +25,29 @@ #include struct WinINetUrl { - String m_scheme; - String m_host; - String m_path; - INTERNET_PORT m_port; - DWORD m_flags; + String m_scheme; + String m_host; + String m_path; + INTERNET_PORT m_port; + DWORD m_flags; }; class WinINetRequest { public: - WinINetRequest(const String& url); - ~WinINetRequest(); + WinINetRequest(const String& url); + ~WinINetRequest(); - String send(); - void openSession(); - void connect(); - void openRequest(); + String send(); + void openSession(); + void connect(); + void openRequest(); private: - HINTERNET m_session; - HINTERNET m_connect; - HINTERNET m_request; - WinINetUrl m_url; - bool m_used; + HINTERNET m_session; + HINTERNET m_connect; + HINTERNET m_request; + WinINetUrl m_url; + bool m_used; }; // @@ -57,29 +57,29 @@ private: String ArchInternetWindows::get(const String& url) { - WinINetRequest request(url); - return request.send(); + WinINetRequest request(url); + return request.send(); } String ArchInternetWindows::urlEncode(const String& url) { - TCHAR buffer[1024]; - DWORD bufferSize = sizeof(buffer); + TCHAR buffer[1024]; + DWORD bufferSize = sizeof(buffer); - if (UrlEscape(url.c_str(), buffer, &bufferSize, URL_ESCAPE_UNSAFE) != S_OK) { - throw XArch(new XArchEvalWindows()); - } + if (UrlEscape(url.c_str(), buffer, &bufferSize, URL_ESCAPE_UNSAFE) != S_OK) { + throw XArch(new XArchEvalWindows()); + } - String result(buffer); + String result(buffer); - // the win32 url encoding funcitons are pretty useless (to us) and only - // escape "unsafe" chars, but not + or =, so we need to replace these - // manually (and probably many other chars). - synergy::string::findReplaceAll(result, "+", "%2B"); - synergy::string::findReplaceAll(result, "=", "%3D"); + // the win32 url encoding funcitons are pretty useless (to us) and only + // escape "unsafe" chars, but not + or =, so we need to replace these + // manually (and probably many other chars). + synergy::string::findReplaceAll(result, "+", "%2B"); + synergy::string::findReplaceAll(result, "=", "%3D"); - return result; + return result; } // @@ -89,112 +89,112 @@ ArchInternetWindows::urlEncode(const String& url) static WinINetUrl parseUrl(const String& url); WinINetRequest::WinINetRequest(const String& url) : - m_session(NULL), - m_connect(NULL), - m_request(NULL), - m_used(false), - m_url(parseUrl(url)) + m_session(NULL), + m_connect(NULL), + m_request(NULL), + m_used(false), + m_url(parseUrl(url)) { } WinINetRequest::~WinINetRequest() { - if (m_request != NULL) { - InternetCloseHandle(m_request); - } + if (m_request != NULL) { + InternetCloseHandle(m_request); + } - if (m_connect != NULL) { - InternetCloseHandle(m_connect); - } + if (m_connect != NULL) { + InternetCloseHandle(m_connect); + } - if (m_session != NULL) { - InternetCloseHandle(m_session); - } + if (m_session != NULL) { + InternetCloseHandle(m_session); + } } String WinINetRequest::send() { - if (m_used) { - throw XArch("class is one time use."); - } - m_used = true; + if (m_used) { + throw XArch("class is one time use."); + } + m_used = true; - openSession(); - connect(); - openRequest(); - - String headers("Content-Type: text/html"); - if (!HttpSendRequest(m_request, headers.c_str(), (DWORD)headers.length(), NULL, NULL)) { - throw XArch(new XArchEvalWindows()); - } - - std::stringstream result; - CHAR buffer[1025]; + openSession(); + connect(); + openRequest(); + + String headers("Content-Type: text/html"); + if (!HttpSendRequest(m_request, headers.c_str(), (DWORD)headers.length(), NULL, NULL)) { + throw XArch(new XArchEvalWindows()); + } + + std::stringstream result; + CHAR buffer[1025]; DWORD read = 0; - while (InternetReadFile(m_request, buffer, sizeof(buffer) - 1, &read) && (read != 0)) { - buffer[read] = 0; - result << buffer; - read = 0; - } + while (InternetReadFile(m_request, buffer, sizeof(buffer) - 1, &read) && (read != 0)) { + buffer[read] = 0; + result << buffer; + read = 0; + } - return result.str(); + return result.str(); } void WinINetRequest::openSession() { - std::stringstream userAgent; - userAgent << "Synergy "; - userAgent << kVersion; + std::stringstream userAgent; + userAgent << "Synergy "; + userAgent << kVersion; m_session = InternetOpen( - userAgent.str().c_str(), - INTERNET_OPEN_TYPE_PRECONFIG, - NULL, - NULL, - NULL); + userAgent.str().c_str(), + INTERNET_OPEN_TYPE_PRECONFIG, + NULL, + NULL, + NULL); - if (m_session == NULL) { - throw XArch(new XArchEvalWindows()); - } + if (m_session == NULL) { + throw XArch(new XArchEvalWindows()); + } } void WinINetRequest::connect() { - m_connect = InternetConnect( - m_session, - m_url.m_host.c_str(), - m_url.m_port, - NULL, - NULL, - INTERNET_SERVICE_HTTP, - NULL, - NULL); - - if (m_connect == NULL) { - throw XArch(new XArchEvalWindows()); - } + m_connect = InternetConnect( + m_session, + m_url.m_host.c_str(), + m_url.m_port, + NULL, + NULL, + INTERNET_SERVICE_HTTP, + NULL, + NULL); + + if (m_connect == NULL) { + throw XArch(new XArchEvalWindows()); + } } void WinINetRequest::openRequest() { - m_request = HttpOpenRequest( - m_connect, - "GET", - m_url.m_path.c_str(), - HTTP_VERSION, - NULL, - NULL, - m_url.m_flags, - NULL); + m_request = HttpOpenRequest( + m_connect, + "GET", + m_url.m_path.c_str(), + HTTP_VERSION, + NULL, + NULL, + m_url.m_flags, + NULL); - if (m_request == NULL) { - throw XArch(new XArchEvalWindows()); - } + if (m_request == NULL) { + throw XArch(new XArchEvalWindows()); + } } // nb: i tried to use InternetCrackUrl here, but couldn't quite get that to @@ -203,22 +203,22 @@ WinINetRequest::openRequest() static WinINetUrl parseUrl(const String& url) { - WinINetUrl parsed; + WinINetUrl parsed; - size_t schemeEnd = url.find("://"); - size_t hostEnd = url.find('/', schemeEnd + 3); + size_t schemeEnd = url.find("://"); + size_t hostEnd = url.find('/', schemeEnd + 3); - parsed.m_scheme = url.substr(0, schemeEnd); - parsed.m_host = url.substr(schemeEnd + 3, hostEnd - (schemeEnd + 3)); - parsed.m_path = url.substr(hostEnd); + parsed.m_scheme = url.substr(0, schemeEnd); + parsed.m_host = url.substr(schemeEnd + 3, hostEnd - (schemeEnd + 3)); + parsed.m_path = url.substr(hostEnd); - parsed.m_port = INTERNET_DEFAULT_HTTP_PORT; - parsed.m_flags = 0; + parsed.m_port = INTERNET_DEFAULT_HTTP_PORT; + parsed.m_flags = 0; - if (parsed.m_scheme.find("https") != String::npos) { - parsed.m_port = INTERNET_DEFAULT_HTTPS_PORT; - parsed.m_flags = INTERNET_FLAG_SECURE; - } + if (parsed.m_scheme.find("https") != String::npos) { + parsed.m_port = INTERNET_DEFAULT_HTTPS_PORT; + parsed.m_flags = INTERNET_FLAG_SECURE; + } - return parsed; + return parsed; } diff --git a/src/lib/arch/win32/ArchInternetWindows.h b/src/lib/arch/win32/ArchInternetWindows.h index 5f14b875..3fda3334 100644 --- a/src/lib/arch/win32/ArchInternetWindows.h +++ b/src/lib/arch/win32/ArchInternetWindows.h @@ -23,6 +23,6 @@ class ArchInternetWindows { public: - String get(const String& url); - String urlEncode(const String& url); + String get(const String& url); + String urlEncode(const String& url); }; diff --git a/src/lib/arch/win32/ArchLogWindows.cpp b/src/lib/arch/win32/ArchLogWindows.cpp index f6637144..f9b24bd0 100644 --- a/src/lib/arch/win32/ArchLogWindows.cpp +++ b/src/lib/arch/win32/ArchLogWindows.cpp @@ -27,69 +27,69 @@ ArchLogWindows::ArchLogWindows() : m_eventLog(NULL) { - // do nothing + // do nothing } ArchLogWindows::~ArchLogWindows() { - // do nothing + // do nothing } void ArchLogWindows::openLog(const char* name) { - if (m_eventLog == NULL) { - m_eventLog = RegisterEventSource(NULL, name); - } + if (m_eventLog == NULL) { + m_eventLog = RegisterEventSource(NULL, name); + } } void ArchLogWindows::closeLog() { - if (m_eventLog != NULL) { - DeregisterEventSource(m_eventLog); - m_eventLog = NULL; - } + if (m_eventLog != NULL) { + DeregisterEventSource(m_eventLog); + m_eventLog = NULL; + } } void ArchLogWindows::showLog(bool) { - // do nothing + // do nothing } void ArchLogWindows::writeLog(ELevel level, const char* msg) { - if (m_eventLog != NULL) { - // convert priority - WORD type; - switch (level) { - case kERROR: - type = EVENTLOG_ERROR_TYPE; - break; + if (m_eventLog != NULL) { + // convert priority + WORD type; + switch (level) { + case kERROR: + type = EVENTLOG_ERROR_TYPE; + break; - case kWARNING: - type = EVENTLOG_WARNING_TYPE; - break; + case kWARNING: + type = EVENTLOG_WARNING_TYPE; + break; - default: - type = EVENTLOG_INFORMATION_TYPE; - break; - } + default: + type = EVENTLOG_INFORMATION_TYPE; + break; + } - // log it - // FIXME -- win32 wants to use a message table to look up event - // strings. log messages aren't organized that way so we'll - // just dump our string into the raw data section of the event - // so users can at least see the message. note that we use our - // level as the event category. - ReportEvent(m_eventLog, type, static_cast(level), - 0, // event ID - NULL, - 0, - (DWORD)strlen(msg) + 1, // raw data size - NULL, - const_cast(msg));// raw data - } + // log it + // FIXME -- win32 wants to use a message table to look up event + // strings. log messages aren't organized that way so we'll + // just dump our string into the raw data section of the event + // so users can at least see the message. note that we use our + // level as the event category. + ReportEvent(m_eventLog, type, static_cast(level), + 0, // event ID + NULL, + 0, + (DWORD)strlen(msg) + 1, // raw data size + NULL, + const_cast(msg));// raw data + } } diff --git a/src/lib/arch/win32/ArchLogWindows.h b/src/lib/arch/win32/ArchLogWindows.h index 3104492b..68e1ab05 100644 --- a/src/lib/arch/win32/ArchLogWindows.h +++ b/src/lib/arch/win32/ArchLogWindows.h @@ -28,15 +28,15 @@ //! Win32 implementation of IArchLog class ArchLogWindows : public IArchLog { public: - ArchLogWindows(); - virtual ~ArchLogWindows(); + ArchLogWindows(); + virtual ~ArchLogWindows(); - // IArchLog overrides - virtual void openLog(const char* name); - virtual void closeLog(); - virtual void showLog(bool showIfEmpty); - virtual void writeLog(ELevel, const char*); + // IArchLog overrides + virtual void openLog(const char* name); + virtual void closeLog(); + virtual void showLog(bool showIfEmpty); + virtual void writeLog(ELevel, const char*); private: - HANDLE m_eventLog; + HANDLE m_eventLog; }; diff --git a/src/lib/arch/win32/ArchMiscWindows.cpp b/src/lib/arch/win32/ArchMiscWindows.cpp index d70861d2..782d21e8 100644 --- a/src/lib/arch/win32/ArchMiscWindows.cpp +++ b/src/lib/arch/win32/ArchMiscWindows.cpp @@ -45,480 +45,480 @@ typedef DWORD EXECUTION_STATE; // ArchMiscWindows::Dialogs* ArchMiscWindows::s_dialogs = NULL; -DWORD ArchMiscWindows::s_busyState = 0; -ArchMiscWindows::STES_t ArchMiscWindows::s_stes = NULL; -HICON ArchMiscWindows::s_largeIcon = NULL; -HICON ArchMiscWindows::s_smallIcon = NULL; -HINSTANCE ArchMiscWindows::s_instanceWin32 = NULL; +DWORD ArchMiscWindows::s_busyState = 0; +ArchMiscWindows::STES_t ArchMiscWindows::s_stes = NULL; +HICON ArchMiscWindows::s_largeIcon = NULL; +HICON ArchMiscWindows::s_smallIcon = NULL; +HINSTANCE ArchMiscWindows::s_instanceWin32 = NULL; void ArchMiscWindows::cleanup() { - delete s_dialogs; + delete s_dialogs; } void ArchMiscWindows::init() { - // stop windows system error dialogs from showing. - SetErrorMode(SEM_FAILCRITICALERRORS); + // stop windows system error dialogs from showing. + SetErrorMode(SEM_FAILCRITICALERRORS); - s_dialogs = new Dialogs; + s_dialogs = new Dialogs; } void ArchMiscWindows::setIcons(HICON largeIcon, HICON smallIcon) { - s_largeIcon = largeIcon; - s_smallIcon = smallIcon; + s_largeIcon = largeIcon; + s_smallIcon = smallIcon; } void ArchMiscWindows::getIcons(HICON& largeIcon, HICON& smallIcon) { - largeIcon = s_largeIcon; - smallIcon = s_smallIcon; + largeIcon = s_largeIcon; + smallIcon = s_smallIcon; } int ArchMiscWindows::runDaemon(RunFunc runFunc) { - return ArchDaemonWindows::runDaemon(runFunc); + return ArchDaemonWindows::runDaemon(runFunc); } void ArchMiscWindows::daemonRunning(bool running) { - ArchDaemonWindows::daemonRunning(running); + ArchDaemonWindows::daemonRunning(running); } void ArchMiscWindows::daemonFailed(int result) { - ArchDaemonWindows::daemonFailed(result); + ArchDaemonWindows::daemonFailed(result); } UINT ArchMiscWindows::getDaemonQuitMessage() { - return ArchDaemonWindows::getDaemonQuitMessage(); + return ArchDaemonWindows::getDaemonQuitMessage(); } HKEY ArchMiscWindows::openKey(HKEY key, const TCHAR* keyName) { - return openKey(key, keyName, false); + return openKey(key, keyName, false); } HKEY ArchMiscWindows::openKey(HKEY key, const TCHAR* const* keyNames) { - return openKey(key, keyNames, false); + return openKey(key, keyNames, false); } HKEY ArchMiscWindows::addKey(HKEY key, const TCHAR* keyName) { - return openKey(key, keyName, true); + return openKey(key, keyName, true); } HKEY ArchMiscWindows::addKey(HKEY key, const TCHAR* const* keyNames) { - return openKey(key, keyNames, true); + return openKey(key, keyNames, true); } HKEY ArchMiscWindows::openKey(HKEY key, const TCHAR* keyName, bool create) { - // ignore if parent is NULL - if (key == NULL) { - return NULL; - } + // ignore if parent is NULL + if (key == NULL) { + return NULL; + } - // open next key - HKEY newKey; - LONG result = RegOpenKeyEx(key, keyName, 0, - KEY_WRITE | KEY_QUERY_VALUE, &newKey); - if (result != ERROR_SUCCESS && create) { - DWORD disp; - result = RegCreateKeyEx(key, keyName, 0, TEXT(""), - 0, KEY_WRITE | KEY_QUERY_VALUE, - NULL, &newKey, &disp); - } - if (result != ERROR_SUCCESS) { - RegCloseKey(key); - return NULL; - } + // open next key + HKEY newKey; + LONG result = RegOpenKeyEx(key, keyName, 0, + KEY_WRITE | KEY_QUERY_VALUE, &newKey); + if (result != ERROR_SUCCESS && create) { + DWORD disp; + result = RegCreateKeyEx(key, keyName, 0, TEXT(""), + 0, KEY_WRITE | KEY_QUERY_VALUE, + NULL, &newKey, &disp); + } + if (result != ERROR_SUCCESS) { + RegCloseKey(key); + return NULL; + } - // switch to new key - RegCloseKey(key); - return newKey; + // switch to new key + RegCloseKey(key); + return newKey; } HKEY ArchMiscWindows::openKey(HKEY key, const TCHAR* const* keyNames, bool create) { - for (size_t i = 0; key != NULL && keyNames[i] != NULL; ++i) { - // open next key - key = openKey(key, keyNames[i], create); - } - return key; + for (size_t i = 0; key != NULL && keyNames[i] != NULL; ++i) { + // open next key + key = openKey(key, keyNames[i], create); + } + return key; } void ArchMiscWindows::closeKey(HKEY key) { - assert(key != NULL); - if (key==NULL) return; - RegCloseKey(key); + assert(key != NULL); + if (key==NULL) return; + RegCloseKey(key); } void ArchMiscWindows::deleteKey(HKEY key, const TCHAR* name) { - assert(key != NULL); - assert(name != NULL); - if (key==NULL || name==NULL) return; - RegDeleteKey(key, name); + assert(key != NULL); + assert(name != NULL); + if (key==NULL || name==NULL) return; + RegDeleteKey(key, name); } void ArchMiscWindows::deleteValue(HKEY key, const TCHAR* name) { - assert(key != NULL); - assert(name != NULL); - if (key==NULL || name==NULL) return; - RegDeleteValue(key, name); + assert(key != NULL); + assert(name != NULL); + if (key==NULL || name==NULL) return; + RegDeleteValue(key, name); } bool ArchMiscWindows::hasValue(HKEY key, const TCHAR* name) { - DWORD type; - LONG result = RegQueryValueEx(key, name, 0, &type, NULL, NULL); - return (result == ERROR_SUCCESS && - (type == REG_DWORD || type == REG_SZ)); + DWORD type; + LONG result = RegQueryValueEx(key, name, 0, &type, NULL, NULL); + return (result == ERROR_SUCCESS && + (type == REG_DWORD || type == REG_SZ)); } ArchMiscWindows::EValueType ArchMiscWindows::typeOfValue(HKEY key, const TCHAR* name) { - DWORD type; - LONG result = RegQueryValueEx(key, name, 0, &type, NULL, NULL); - if (result != ERROR_SUCCESS) { - return kNO_VALUE; - } - switch (type) { - case REG_DWORD: - return kUINT; + DWORD type; + LONG result = RegQueryValueEx(key, name, 0, &type, NULL, NULL); + if (result != ERROR_SUCCESS) { + return kNO_VALUE; + } + switch (type) { + case REG_DWORD: + return kUINT; - case REG_SZ: - return kSTRING; + case REG_SZ: + return kSTRING; - case REG_BINARY: - return kBINARY; + case REG_BINARY: + return kBINARY; - default: - return kUNKNOWN; - } + default: + return kUNKNOWN; + } } void ArchMiscWindows::setValue(HKEY key, - const TCHAR* name, const std::string& value) + const TCHAR* name, const std::string& value) { - assert(key != NULL); - if (key == NULL) { - // TODO: throw exception - return; - } - RegSetValueEx(key, name, 0, REG_SZ, - reinterpret_cast(value.c_str()), - (DWORD)value.size() + 1); + assert(key != NULL); + if (key == NULL) { + // TODO: throw exception + return; + } + RegSetValueEx(key, name, 0, REG_SZ, + reinterpret_cast(value.c_str()), + (DWORD)value.size() + 1); } void ArchMiscWindows::setValue(HKEY key, const TCHAR* name, DWORD value) { - assert(key != NULL); - if (key == NULL) { - // TODO: throw exception - return; - } - RegSetValueEx(key, name, 0, REG_DWORD, - reinterpret_cast(&value), - sizeof(DWORD)); + assert(key != NULL); + if (key == NULL) { + // TODO: throw exception + return; + } + RegSetValueEx(key, name, 0, REG_DWORD, + reinterpret_cast(&value), + sizeof(DWORD)); } void ArchMiscWindows::setValueBinary(HKEY key, - const TCHAR* name, const std::string& value) + const TCHAR* name, const std::string& value) { - assert(key != NULL); - assert(name != NULL); - if (key == NULL || name == NULL) { - // TODO: throw exception - return; - } - RegSetValueEx(key, name, 0, REG_BINARY, - reinterpret_cast(value.data()), - (DWORD)value.size()); + assert(key != NULL); + assert(name != NULL); + if (key == NULL || name == NULL) { + // TODO: throw exception + return; + } + RegSetValueEx(key, name, 0, REG_BINARY, + reinterpret_cast(value.data()), + (DWORD)value.size()); } std::string ArchMiscWindows::readBinaryOrString(HKEY key, const TCHAR* name, DWORD type) { - // get the size of the string - DWORD actualType; - DWORD size = 0; - LONG result = RegQueryValueEx(key, name, 0, &actualType, NULL, &size); - if (result != ERROR_SUCCESS || actualType != type) { - return std::string(); - } + // get the size of the string + DWORD actualType; + DWORD size = 0; + LONG result = RegQueryValueEx(key, name, 0, &actualType, NULL, &size); + if (result != ERROR_SUCCESS || actualType != type) { + return std::string(); + } - // if zero size then return empty string - if (size == 0) { - return std::string(); - } + // if zero size then return empty string + if (size == 0) { + return std::string(); + } - // allocate space - char* buffer = new char[size]; + // allocate space + char* buffer = new char[size]; - // read it - result = RegQueryValueEx(key, name, 0, &actualType, - reinterpret_cast(buffer), &size); - if (result != ERROR_SUCCESS || actualType != type) { - delete[] buffer; - return std::string(); - } + // read it + result = RegQueryValueEx(key, name, 0, &actualType, + reinterpret_cast(buffer), &size); + if (result != ERROR_SUCCESS || actualType != type) { + delete[] buffer; + return std::string(); + } - // clean up and return value - if (type == REG_SZ && buffer[size - 1] == '\0') { - // don't include terminating nul; std::string will add one. - --size; - } - std::string value(buffer, size); - delete[] buffer; - return value; + // clean up and return value + if (type == REG_SZ && buffer[size - 1] == '\0') { + // don't include terminating nul; std::string will add one. + --size; + } + std::string value(buffer, size); + delete[] buffer; + return value; } std::string ArchMiscWindows::readValueString(HKEY key, const TCHAR* name) { - return readBinaryOrString(key, name, REG_SZ); + return readBinaryOrString(key, name, REG_SZ); } std::string ArchMiscWindows::readValueBinary(HKEY key, const TCHAR* name) { - return readBinaryOrString(key, name, REG_BINARY); + return readBinaryOrString(key, name, REG_BINARY); } DWORD ArchMiscWindows::readValueInt(HKEY key, const TCHAR* name) { - DWORD type; - DWORD value; - DWORD size = sizeof(value); - LONG result = RegQueryValueEx(key, name, 0, &type, - reinterpret_cast(&value), &size); - if (result != ERROR_SUCCESS || type != REG_DWORD) { - return 0; - } - return value; + DWORD type; + DWORD value; + DWORD size = sizeof(value); + LONG result = RegQueryValueEx(key, name, 0, &type, + reinterpret_cast(&value), &size); + if (result != ERROR_SUCCESS || type != REG_DWORD) { + return 0; + } + return value; } void ArchMiscWindows::addDialog(HWND hwnd) { - s_dialogs->insert(hwnd); + s_dialogs->insert(hwnd); } void ArchMiscWindows::removeDialog(HWND hwnd) { - s_dialogs->erase(hwnd); + s_dialogs->erase(hwnd); } bool ArchMiscWindows::processDialog(MSG* msg) { - for (Dialogs::const_iterator index = s_dialogs->begin(); - index != s_dialogs->end(); ++index) { - if (IsDialogMessage(*index, msg)) { - return true; - } - } - return false; + for (Dialogs::const_iterator index = s_dialogs->begin(); + index != s_dialogs->end(); ++index) { + if (IsDialogMessage(*index, msg)) { + return true; + } + } + return false; } void ArchMiscWindows::addBusyState(DWORD busyModes) { - s_busyState |= busyModes; - setThreadExecutionState(s_busyState); + s_busyState |= busyModes; + setThreadExecutionState(s_busyState); } void ArchMiscWindows::removeBusyState(DWORD busyModes) { - s_busyState &= ~busyModes; - setThreadExecutionState(s_busyState); + s_busyState &= ~busyModes; + setThreadExecutionState(s_busyState); } void ArchMiscWindows::setThreadExecutionState(DWORD busyModes) { - // look up function dynamically so we work on older systems - if (s_stes == NULL) { - HINSTANCE kernel = LoadLibrary("kernel32.dll"); - if (kernel != NULL) { - s_stes = reinterpret_cast(GetProcAddress(kernel, - "SetThreadExecutionState")); - } - if (s_stes == NULL) { - s_stes = &ArchMiscWindows::dummySetThreadExecutionState; - } - } + // look up function dynamically so we work on older systems + if (s_stes == NULL) { + HINSTANCE kernel = LoadLibrary("kernel32.dll"); + if (kernel != NULL) { + s_stes = reinterpret_cast(GetProcAddress(kernel, + "SetThreadExecutionState")); + } + if (s_stes == NULL) { + s_stes = &ArchMiscWindows::dummySetThreadExecutionState; + } + } - // convert to STES form - EXECUTION_STATE state = 0; - if ((busyModes & kSYSTEM) != 0) { - state |= ES_SYSTEM_REQUIRED; - } - if ((busyModes & kDISPLAY) != 0) { - state |= ES_DISPLAY_REQUIRED; - } - if (state != 0) { - state |= ES_CONTINUOUS; - } + // convert to STES form + EXECUTION_STATE state = 0; + if ((busyModes & kSYSTEM) != 0) { + state |= ES_SYSTEM_REQUIRED; + } + if ((busyModes & kDISPLAY) != 0) { + state |= ES_DISPLAY_REQUIRED; + } + if (state != 0) { + state |= ES_CONTINUOUS; + } - // do it - s_stes(state); + // do it + s_stes(state); } DWORD ArchMiscWindows::dummySetThreadExecutionState(DWORD) { - // do nothing - return 0; + // do nothing + return 0; } void ArchMiscWindows::wakeupDisplay() { - // We can't use ::setThreadExecutionState here because it sets - // ES_CONTINUOUS, which we don't want. + // We can't use ::setThreadExecutionState here because it sets + // ES_CONTINUOUS, which we don't want. - if (s_stes == NULL) { - HINSTANCE kernel = LoadLibrary("kernel32.dll"); - if (kernel != NULL) { - s_stes = reinterpret_cast(GetProcAddress(kernel, - "SetThreadExecutionState")); - } - if (s_stes == NULL) { - s_stes = &ArchMiscWindows::dummySetThreadExecutionState; - } - } + if (s_stes == NULL) { + HINSTANCE kernel = LoadLibrary("kernel32.dll"); + if (kernel != NULL) { + s_stes = reinterpret_cast(GetProcAddress(kernel, + "SetThreadExecutionState")); + } + if (s_stes == NULL) { + s_stes = &ArchMiscWindows::dummySetThreadExecutionState; + } + } - s_stes(ES_DISPLAY_REQUIRED); + s_stes(ES_DISPLAY_REQUIRED); - // restore the original execution states - setThreadExecutionState(s_busyState); + // restore the original execution states + setThreadExecutionState(s_busyState); } bool ArchMiscWindows::wasLaunchedAsService() { - String name; - if (!getParentProcessName(name)) { - LOG((CLOG_ERR "cannot determine if process was launched as service")); - return false; - } + String name; + if (!getParentProcessName(name)) { + LOG((CLOG_ERR "cannot determine if process was launched as service")); + return false; + } - return (name == SERVICE_LAUNCHER); + return (name == SERVICE_LAUNCHER); } bool ArchMiscWindows::getParentProcessName(String &name) -{ - PROCESSENTRY32 parentEntry; - if (!getParentProcessEntry(parentEntry)){ - LOG((CLOG_ERR "could not get entry for parent process")); - return false; - } +{ + PROCESSENTRY32 parentEntry; + if (!getParentProcessEntry(parentEntry)){ + LOG((CLOG_ERR "could not get entry for parent process")); + return false; + } - name = parentEntry.szExeFile; - return true; + name = parentEntry.szExeFile; + return true; } BOOL WINAPI ArchMiscWindows::getSelfProcessEntry(PROCESSENTRY32& entry) { - // get entry from current PID - return getProcessEntry(entry, GetCurrentProcessId()); + // get entry from current PID + return getProcessEntry(entry, GetCurrentProcessId()); } BOOL WINAPI ArchMiscWindows::getParentProcessEntry(PROCESSENTRY32& entry) { - // get the current process, so we can get parent PID - PROCESSENTRY32 selfEntry; - if (!getSelfProcessEntry(selfEntry)) { - return FALSE; - } + // get the current process, so we can get parent PID + PROCESSENTRY32 selfEntry; + if (!getSelfProcessEntry(selfEntry)) { + return FALSE; + } - // get entry from parent PID - return getProcessEntry(entry, selfEntry.th32ParentProcessID); + // get entry from parent PID + return getProcessEntry(entry, selfEntry.th32ParentProcessID); } BOOL WINAPI ArchMiscWindows::getProcessEntry(PROCESSENTRY32& entry, DWORD processID) { - // first we need to take a snapshot of the running processes - HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (snapshot == INVALID_HANDLE_VALUE) { - LOG((CLOG_ERR "could not get process snapshot (error: %i)", - GetLastError())); - return FALSE; - } + // first we need to take a snapshot of the running processes + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) { + LOG((CLOG_ERR "could not get process snapshot (error: %i)", + GetLastError())); + return FALSE; + } - entry.dwSize = sizeof(PROCESSENTRY32); + entry.dwSize = sizeof(PROCESSENTRY32); - // get the first process, and if we can't do that then it's - // unlikely we can go any further - BOOL gotEntry = Process32First(snapshot, &entry); - if (!gotEntry) { - LOG((CLOG_ERR "could not get first process entry (error: %i)", - GetLastError())); - return FALSE; - } + // get the first process, and if we can't do that then it's + // unlikely we can go any further + BOOL gotEntry = Process32First(snapshot, &entry); + if (!gotEntry) { + LOG((CLOG_ERR "could not get first process entry (error: %i)", + GetLastError())); + return FALSE; + } - while(gotEntry) { + while(gotEntry) { - if (entry.th32ProcessID == processID) { - // found current process - return TRUE; - } + if (entry.th32ProcessID == processID) { + // found current process + return TRUE; + } - // now move on to the next entry (when we reach end, loop will stop) - gotEntry = Process32Next(snapshot, &entry); - } + // now move on to the next entry (when we reach end, loop will stop) + gotEntry = Process32Next(snapshot, &entry); + } - return FALSE; + return FALSE; } HINSTANCE ArchMiscWindows::instanceWin32() { - assert(s_instanceWin32 != NULL); - return s_instanceWin32; + assert(s_instanceWin32 != NULL); + return s_instanceWin32; } void ArchMiscWindows::setInstanceWin32(HINSTANCE instance) { - assert(instance != NULL); - s_instanceWin32 = instance; + assert(instance != NULL); + s_instanceWin32 = instance; } \ No newline at end of file diff --git a/src/lib/arch/win32/ArchMiscWindows.h b/src/lib/arch/win32/ArchMiscWindows.h index 94b379ad..7758abaf 100644 --- a/src/lib/arch/win32/ArchMiscWindows.h +++ b/src/lib/arch/win32/ArchMiscWindows.h @@ -30,173 +30,173 @@ //! Miscellaneous win32 functions. class ArchMiscWindows { public: - enum EValueType { - kUNKNOWN, - kNO_VALUE, - kUINT, - kSTRING, - kBINARY - }; - enum EBusyModes { - kIDLE = 0x0000, - kSYSTEM = 0x0001, - kDISPLAY = 0x0002 - }; + enum EValueType { + kUNKNOWN, + kNO_VALUE, + kUINT, + kSTRING, + kBINARY + }; + enum EBusyModes { + kIDLE = 0x0000, + kSYSTEM = 0x0001, + kDISPLAY = 0x0002 + }; - typedef int (*RunFunc)(void); + typedef int (*RunFunc)(void); - //! Initialize - static void init(); + //! Initialize + static void init(); - //! Delete memory - static void cleanup(); + //! Delete memory + static void cleanup(); - //! Set the application icons - /*! - Set the application icons. - */ - static void setIcons(HICON largeIcon, HICON smallIcon); + //! Set the application icons + /*! + Set the application icons. + */ + static void setIcons(HICON largeIcon, HICON smallIcon); - //! Get the application icons - /*! - Get the application icons. - */ - static void getIcons(HICON& largeIcon, HICON& smallIcon); + //! Get the application icons + /*! + Get the application icons. + */ + static void getIcons(HICON& largeIcon, HICON& smallIcon); - //! Run the daemon - /*! - Delegates to ArchDaemonWindows. - */ - static int runDaemon(RunFunc runFunc); + //! Run the daemon + /*! + Delegates to ArchDaemonWindows. + */ + static int runDaemon(RunFunc runFunc); - //! Indicate daemon is in main loop - /*! - Delegates to ArchDaemonWindows. - */ - static void daemonRunning(bool running); + //! Indicate daemon is in main loop + /*! + Delegates to ArchDaemonWindows. + */ + static void daemonRunning(bool running); - //! Indicate failure of running daemon - /*! - Delegates to ArchDaemonWindows. - */ - static void daemonFailed(int result); + //! Indicate failure of running daemon + /*! + Delegates to ArchDaemonWindows. + */ + static void daemonFailed(int result); - //! Get daemon quit message - /*! - Delegates to ArchDaemonWindows. - */ - static UINT getDaemonQuitMessage(); + //! Get daemon quit message + /*! + Delegates to ArchDaemonWindows. + */ + static UINT getDaemonQuitMessage(); - //! Open and return a registry key, closing the parent key - static HKEY openKey(HKEY parent, const TCHAR* child); + //! Open and return a registry key, closing the parent key + static HKEY openKey(HKEY parent, const TCHAR* child); - //! Open and return a registry key, closing the parent key - static HKEY openKey(HKEY parent, const TCHAR* const* keyPath); + //! Open and return a registry key, closing the parent key + static HKEY openKey(HKEY parent, const TCHAR* const* keyPath); - //! Open/create and return a registry key, closing the parent key - static HKEY addKey(HKEY parent, const TCHAR* child); + //! Open/create and return a registry key, closing the parent key + static HKEY addKey(HKEY parent, const TCHAR* child); - //! Open/create and return a registry key, closing the parent key - static HKEY addKey(HKEY parent, const TCHAR* const* keyPath); + //! Open/create and return a registry key, closing the parent key + static HKEY addKey(HKEY parent, const TCHAR* const* keyPath); - //! Close a key - static void closeKey(HKEY); + //! Close a key + static void closeKey(HKEY); - //! Delete a key (which should have no subkeys) - static void deleteKey(HKEY parent, const TCHAR* name); + //! Delete a key (which should have no subkeys) + static void deleteKey(HKEY parent, const TCHAR* name); - //! Delete a value - static void deleteValue(HKEY parent, const TCHAR* name); + //! Delete a value + static void deleteValue(HKEY parent, const TCHAR* name); - //! Test if a value exists - static bool hasValue(HKEY key, const TCHAR* name); + //! Test if a value exists + static bool hasValue(HKEY key, const TCHAR* name); - //! Get type of value - static EValueType typeOfValue(HKEY key, const TCHAR* name); + //! Get type of value + static EValueType typeOfValue(HKEY key, const TCHAR* name); - //! Set a string value in the registry - static void setValue(HKEY key, const TCHAR* name, - const std::string& value); + //! Set a string value in the registry + static void setValue(HKEY key, const TCHAR* name, + const std::string& value); - //! Set a DWORD value in the registry - static void setValue(HKEY key, const TCHAR* name, DWORD value); + //! Set a DWORD value in the registry + static void setValue(HKEY key, const TCHAR* name, DWORD value); - //! Set a BINARY value in the registry - /*! - Sets the \p name value of \p key to \p value.data(). - */ - static void setValueBinary(HKEY key, const TCHAR* name, - const std::string& value); + //! Set a BINARY value in the registry + /*! + Sets the \p name value of \p key to \p value.data(). + */ + static void setValueBinary(HKEY key, const TCHAR* name, + const std::string& value); - //! Read a string value from the registry - static std::string readValueString(HKEY, const TCHAR* name); + //! Read a string value from the registry + static std::string readValueString(HKEY, const TCHAR* name); - //! Read a DWORD value from the registry - static DWORD readValueInt(HKEY, const TCHAR* name); + //! Read a DWORD value from the registry + static DWORD readValueInt(HKEY, const TCHAR* name); - //! Read a BINARY value from the registry - static std::string readValueBinary(HKEY, const TCHAR* name); + //! Read a BINARY value from the registry + static std::string readValueBinary(HKEY, const TCHAR* name); - //! Add a dialog - static void addDialog(HWND); + //! Add a dialog + static void addDialog(HWND); - //! Remove a dialog - static void removeDialog(HWND); + //! Remove a dialog + static void removeDialog(HWND); - //! Process dialog message - /*! - Checks if the message is destined for a dialog. If so the message - is passed to the dialog and returns true, otherwise returns false. - */ - static bool processDialog(MSG*); + //! Process dialog message + /*! + Checks if the message is destined for a dialog. If so the message + is passed to the dialog and returns true, otherwise returns false. + */ + static bool processDialog(MSG*); - //! Disable power saving - static void addBusyState(DWORD busyModes); + //! Disable power saving + static void addBusyState(DWORD busyModes); - //! Enable power saving - static void removeBusyState(DWORD busyModes); + //! Enable power saving + static void removeBusyState(DWORD busyModes); - //! Briefly interrupt power saving - static void wakeupDisplay(); + //! Briefly interrupt power saving + static void wakeupDisplay(); - //! Returns true if this process was launched via NT service host. - static bool wasLaunchedAsService(); + //! Returns true if this process was launched via NT service host. + static bool wasLaunchedAsService(); - //! Returns true if we got the parent process name. - static bool getParentProcessName(String &name); + //! Returns true if we got the parent process name. + static bool getParentProcessName(String &name); - static HINSTANCE instanceWin32(); + static HINSTANCE instanceWin32(); - static void setInstanceWin32(HINSTANCE instance); - - static BOOL WINAPI getProcessEntry(PROCESSENTRY32& entry, DWORD processID); - static BOOL WINAPI getSelfProcessEntry(PROCESSENTRY32& entry); - static BOOL WINAPI getParentProcessEntry(PROCESSENTRY32& entry); + static void setInstanceWin32(HINSTANCE instance); + + static BOOL WINAPI getProcessEntry(PROCESSENTRY32& entry, DWORD processID); + static BOOL WINAPI getSelfProcessEntry(PROCESSENTRY32& entry); + static BOOL WINAPI getParentProcessEntry(PROCESSENTRY32& entry); private: - //! Open and return a registry key, closing the parent key - static HKEY openKey(HKEY parent, const TCHAR* child, bool create); + //! Open and return a registry key, closing the parent key + static HKEY openKey(HKEY parent, const TCHAR* child, bool create); - //! Open and return a registry key, closing the parent key - static HKEY openKey(HKEY parent, const TCHAR* const* keyPath, - bool create); + //! Open and return a registry key, closing the parent key + static HKEY openKey(HKEY parent, const TCHAR* const* keyPath, + bool create); - //! Read a string value from the registry - static std::string readBinaryOrString(HKEY, const TCHAR* name, DWORD type); + //! Read a string value from the registry + static std::string readBinaryOrString(HKEY, const TCHAR* name, DWORD type); - //! Set thread busy state - static void setThreadExecutionState(DWORD); + //! Set thread busy state + static void setThreadExecutionState(DWORD); - static DWORD WINAPI dummySetThreadExecutionState(DWORD); + static DWORD WINAPI dummySetThreadExecutionState(DWORD); private: - typedef std::set Dialogs; - typedef DWORD (WINAPI *STES_t)(DWORD); + typedef std::set Dialogs; + typedef DWORD (WINAPI *STES_t)(DWORD); - static Dialogs* s_dialogs; - static DWORD s_busyState; - static STES_t s_stes; - static HICON s_largeIcon; - static HICON s_smallIcon; - static HINSTANCE s_instanceWin32; + static Dialogs* s_dialogs; + static DWORD s_busyState; + static STES_t s_stes; + static HICON s_largeIcon; + static HICON s_smallIcon; + static HINSTANCE s_instanceWin32; }; diff --git a/src/lib/arch/win32/ArchMultithreadWindows.cpp b/src/lib/arch/win32/ArchMultithreadWindows.cpp index 3c131780..063f44f0 100644 --- a/src/lib/arch/win32/ArchMultithreadWindows.cpp +++ b/src/lib/arch/win32/ArchMultithreadWindows.cpp @@ -17,7 +17,7 @@ */ #if defined(_MSC_VER) && !defined(_MT) -# error multithreading compile option is required +# error multithreading compile option is required #endif #include "arch/win32/ArchMultithreadWindows.h" @@ -42,40 +42,40 @@ class ArchThreadImpl { public: - ArchThreadImpl(); - ~ArchThreadImpl(); + ArchThreadImpl(); + ~ArchThreadImpl(); public: - int m_refCount; - HANDLE m_thread; - DWORD m_id; - IArchMultithread::ThreadFunc m_func; - void* m_userData; - HANDLE m_cancel; - bool m_cancelling; - HANDLE m_exit; - void* m_result; - void* m_networkData; + int m_refCount; + HANDLE m_thread; + DWORD m_id; + IArchMultithread::ThreadFunc m_func; + void* m_userData; + HANDLE m_cancel; + bool m_cancelling; + HANDLE m_exit; + void* m_result; + void* m_networkData; }; ArchThreadImpl::ArchThreadImpl() : - m_refCount(1), - m_thread(NULL), - m_id(0), - m_func(NULL), - m_userData(NULL), - m_cancelling(false), - m_result(NULL), - m_networkData(NULL) + m_refCount(1), + m_thread(NULL), + m_id(0), + m_func(NULL), + m_userData(NULL), + m_cancelling(false), + m_result(NULL), + m_networkData(NULL) { - m_exit = CreateEvent(NULL, TRUE, FALSE, NULL); - m_cancel = CreateEvent(NULL, TRUE, FALSE, NULL); + m_exit = CreateEvent(NULL, TRUE, FALSE, NULL); + m_cancel = CreateEvent(NULL, TRUE, FALSE, NULL); } ArchThreadImpl::~ArchThreadImpl() { - CloseHandle(m_exit); - CloseHandle(m_cancel); + CloseHandle(m_exit); + CloseHandle(m_cancel); } @@ -83,622 +83,622 @@ ArchThreadImpl::~ArchThreadImpl() // ArchMultithreadWindows // -ArchMultithreadWindows* ArchMultithreadWindows::s_instance = NULL; +ArchMultithreadWindows* ArchMultithreadWindows::s_instance = NULL; ArchMultithreadWindows::ArchMultithreadWindows() { - assert(s_instance == NULL); - s_instance = this; + assert(s_instance == NULL); + s_instance = this; - // no signal handlers - for (size_t i = 0; i < kNUM_SIGNALS; ++i) { - m_signalFunc[i] = NULL; - m_signalUserData[i] = NULL; - } + // no signal handlers + for (size_t i = 0; i < kNUM_SIGNALS; ++i) { + m_signalFunc[i] = NULL; + m_signalUserData[i] = NULL; + } - // create mutex for thread list - m_threadMutex = newMutex(); + // create mutex for thread list + m_threadMutex = newMutex(); - // create thread for calling (main) thread and add it to our - // list. no need to lock the mutex since we're the only thread. - m_mainThread = new ArchThreadImpl; - m_mainThread->m_thread = NULL; - m_mainThread->m_id = GetCurrentThreadId(); - insert(m_mainThread); + // create thread for calling (main) thread and add it to our + // list. no need to lock the mutex since we're the only thread. + m_mainThread = new ArchThreadImpl; + m_mainThread->m_thread = NULL; + m_mainThread->m_id = GetCurrentThreadId(); + insert(m_mainThread); } ArchMultithreadWindows::~ArchMultithreadWindows() { - s_instance = NULL; + s_instance = NULL; - // clean up thread list - for (ThreadList::iterator index = m_threadList.begin(); - index != m_threadList.end(); ++index) { - delete *index; - } + // clean up thread list + for (ThreadList::iterator index = m_threadList.begin(); + index != m_threadList.end(); ++index) { + delete *index; + } - // done with mutex - delete m_threadMutex; + // done with mutex + delete m_threadMutex; } void ArchMultithreadWindows::setNetworkDataForCurrentThread(void* data) { - lockMutex(m_threadMutex); - ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); - thread->m_networkData = data; - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); + thread->m_networkData = data; + unlockMutex(m_threadMutex); } void* ArchMultithreadWindows::getNetworkDataForThread(ArchThread thread) { - lockMutex(m_threadMutex); - void* data = thread->m_networkData; - unlockMutex(m_threadMutex); - return data; + lockMutex(m_threadMutex); + void* data = thread->m_networkData; + unlockMutex(m_threadMutex); + return data; } HANDLE ArchMultithreadWindows::getCancelEventForCurrentThread() { - lockMutex(m_threadMutex); - ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); - unlockMutex(m_threadMutex); - return thread->m_cancel; + lockMutex(m_threadMutex); + ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); + unlockMutex(m_threadMutex); + return thread->m_cancel; } ArchMultithreadWindows* ArchMultithreadWindows::getInstance() { - return s_instance; + return s_instance; } ArchCond ArchMultithreadWindows::newCondVar() { - ArchCondImpl* cond = new ArchCondImpl; - cond->m_events[ArchCondImpl::kSignal] = CreateEvent(NULL, - FALSE, FALSE, NULL); - cond->m_events[ArchCondImpl::kBroadcast] = CreateEvent(NULL, - TRUE, FALSE, NULL); - cond->m_waitCountMutex = newMutex(); - cond->m_waitCount = 0; - return cond; + ArchCondImpl* cond = new ArchCondImpl; + cond->m_events[ArchCondImpl::kSignal] = CreateEvent(NULL, + FALSE, FALSE, NULL); + cond->m_events[ArchCondImpl::kBroadcast] = CreateEvent(NULL, + TRUE, FALSE, NULL); + cond->m_waitCountMutex = newMutex(); + cond->m_waitCount = 0; + return cond; } void ArchMultithreadWindows::closeCondVar(ArchCond cond) { - CloseHandle(cond->m_events[ArchCondImpl::kSignal]); - CloseHandle(cond->m_events[ArchCondImpl::kBroadcast]); - closeMutex(cond->m_waitCountMutex); - delete cond; + CloseHandle(cond->m_events[ArchCondImpl::kSignal]); + CloseHandle(cond->m_events[ArchCondImpl::kBroadcast]); + closeMutex(cond->m_waitCountMutex); + delete cond; } void ArchMultithreadWindows::signalCondVar(ArchCond cond) { - // is anybody waiting? - lockMutex(cond->m_waitCountMutex); - const bool hasWaiter = (cond->m_waitCount > 0); - unlockMutex(cond->m_waitCountMutex); + // is anybody waiting? + lockMutex(cond->m_waitCountMutex); + const bool hasWaiter = (cond->m_waitCount > 0); + unlockMutex(cond->m_waitCountMutex); - // wake one thread if anybody is waiting - if (hasWaiter) { - SetEvent(cond->m_events[ArchCondImpl::kSignal]); - } + // wake one thread if anybody is waiting + if (hasWaiter) { + SetEvent(cond->m_events[ArchCondImpl::kSignal]); + } } void ArchMultithreadWindows::broadcastCondVar(ArchCond cond) { - // is anybody waiting? - lockMutex(cond->m_waitCountMutex); - const bool hasWaiter = (cond->m_waitCount > 0); - unlockMutex(cond->m_waitCountMutex); + // is anybody waiting? + lockMutex(cond->m_waitCountMutex); + const bool hasWaiter = (cond->m_waitCount > 0); + unlockMutex(cond->m_waitCountMutex); - // wake all threads if anybody is waiting - if (hasWaiter) { - SetEvent(cond->m_events[ArchCondImpl::kBroadcast]); - } + // wake all threads if anybody is waiting + if (hasWaiter) { + SetEvent(cond->m_events[ArchCondImpl::kBroadcast]); + } } bool ArchMultithreadWindows::waitCondVar(ArchCond cond, - ArchMutex mutex, double timeout) + ArchMutex mutex, double timeout) { - // prepare to wait - const DWORD winTimeout = (timeout < 0.0) ? INFINITE : - static_cast(1000.0 * timeout); + // prepare to wait + const DWORD winTimeout = (timeout < 0.0) ? INFINITE : + static_cast(1000.0 * timeout); - // make a list of the condition variable events and the cancel event - // for the current thread. - HANDLE handles[4]; - handles[0] = cond->m_events[ArchCondImpl::kSignal]; - handles[1] = cond->m_events[ArchCondImpl::kBroadcast]; - handles[2] = getCancelEventForCurrentThread(); + // make a list of the condition variable events and the cancel event + // for the current thread. + HANDLE handles[4]; + handles[0] = cond->m_events[ArchCondImpl::kSignal]; + handles[1] = cond->m_events[ArchCondImpl::kBroadcast]; + handles[2] = getCancelEventForCurrentThread(); - // update waiter count - lockMutex(cond->m_waitCountMutex); - ++cond->m_waitCount; - unlockMutex(cond->m_waitCountMutex); + // update waiter count + lockMutex(cond->m_waitCountMutex); + ++cond->m_waitCount; + unlockMutex(cond->m_waitCountMutex); - // release mutex. this should be atomic with the wait so that it's - // impossible for another thread to signal us between the unlock and - // the wait, which would lead to a lost signal on broadcasts. - // however, we're using a manual reset event for broadcasts which - // stays set until we reset it, so we don't lose the broadcast. - unlockMutex(mutex); + // release mutex. this should be atomic with the wait so that it's + // impossible for another thread to signal us between the unlock and + // the wait, which would lead to a lost signal on broadcasts. + // however, we're using a manual reset event for broadcasts which + // stays set until we reset it, so we don't lose the broadcast. + unlockMutex(mutex); - // wait for a signal or broadcast - DWORD result = WaitForMultipleObjects(3, handles, FALSE, winTimeout); + // wait for a signal or broadcast + DWORD result = WaitForMultipleObjects(3, handles, FALSE, winTimeout); - // cancel takes priority - if (result != WAIT_OBJECT_0 + 2 && - WaitForSingleObject(handles[2], 0) == WAIT_OBJECT_0) { - result = WAIT_OBJECT_0 + 2; - } + // cancel takes priority + if (result != WAIT_OBJECT_0 + 2 && + WaitForSingleObject(handles[2], 0) == WAIT_OBJECT_0) { + result = WAIT_OBJECT_0 + 2; + } - // update the waiter count and check if we're the last waiter - lockMutex(cond->m_waitCountMutex); - --cond->m_waitCount; - const bool last = (result == WAIT_OBJECT_0 + 1 && cond->m_waitCount == 0); - unlockMutex(cond->m_waitCountMutex); + // update the waiter count and check if we're the last waiter + lockMutex(cond->m_waitCountMutex); + --cond->m_waitCount; + const bool last = (result == WAIT_OBJECT_0 + 1 && cond->m_waitCount == 0); + unlockMutex(cond->m_waitCountMutex); - // reset the broadcast event if we're the last waiter - if (last) { - ResetEvent(cond->m_events[ArchCondImpl::kBroadcast]); - } + // reset the broadcast event if we're the last waiter + if (last) { + ResetEvent(cond->m_events[ArchCondImpl::kBroadcast]); + } - // reacquire the mutex - lockMutex(mutex); + // reacquire the mutex + lockMutex(mutex); - // cancel thread if necessary - if (result == WAIT_OBJECT_0 + 2) { - ARCH->testCancelThread(); - } + // cancel thread if necessary + if (result == WAIT_OBJECT_0 + 2) { + ARCH->testCancelThread(); + } - // return success or failure - return (result == WAIT_OBJECT_0 + 0 || - result == WAIT_OBJECT_0 + 1); + // return success or failure + return (result == WAIT_OBJECT_0 + 0 || + result == WAIT_OBJECT_0 + 1); } ArchMutex ArchMultithreadWindows::newMutex() { - ArchMutexImpl* mutex = new ArchMutexImpl; - InitializeCriticalSection(&mutex->m_mutex); - return mutex; + ArchMutexImpl* mutex = new ArchMutexImpl; + InitializeCriticalSection(&mutex->m_mutex); + return mutex; } void ArchMultithreadWindows::closeMutex(ArchMutex mutex) { - DeleteCriticalSection(&mutex->m_mutex); - delete mutex; + DeleteCriticalSection(&mutex->m_mutex); + delete mutex; } void ArchMultithreadWindows::lockMutex(ArchMutex mutex) { - EnterCriticalSection(&mutex->m_mutex); + EnterCriticalSection(&mutex->m_mutex); } void ArchMultithreadWindows::unlockMutex(ArchMutex mutex) { - LeaveCriticalSection(&mutex->m_mutex); + LeaveCriticalSection(&mutex->m_mutex); } ArchThread ArchMultithreadWindows::newThread(ThreadFunc func, void* data) { - lockMutex(m_threadMutex); + lockMutex(m_threadMutex); - // create thread impl for new thread - ArchThreadImpl* thread = new ArchThreadImpl; - thread->m_func = func; - thread->m_userData = data; + // create thread impl for new thread + ArchThreadImpl* thread = new ArchThreadImpl; + thread->m_func = func; + thread->m_userData = data; - // create thread - unsigned int id = 0; - thread->m_thread = reinterpret_cast(_beginthreadex(NULL, 0, - threadFunc, (void*)thread, 0, &id)); - thread->m_id = static_cast(id); + // create thread + unsigned int id = 0; + thread->m_thread = reinterpret_cast(_beginthreadex(NULL, 0, + threadFunc, (void*)thread, 0, &id)); + thread->m_id = static_cast(id); - // check if thread was started - if (thread->m_thread == 0) { - // failed to start thread so clean up - delete thread; - thread = NULL; - } - else { - // add thread to list - insert(thread); + // check if thread was started + if (thread->m_thread == 0) { + // failed to start thread so clean up + delete thread; + thread = NULL; + } + else { + // add thread to list + insert(thread); - // increment ref count to account for the thread itself - refThread(thread); - } + // increment ref count to account for the thread itself + refThread(thread); + } - // note that the child thread will wait until we release this mutex - unlockMutex(m_threadMutex); + // note that the child thread will wait until we release this mutex + unlockMutex(m_threadMutex); - return thread; + return thread; } ArchThread ArchMultithreadWindows::newCurrentThread() { - lockMutex(m_threadMutex); - ArchThreadImpl* thread = find(GetCurrentThreadId()); - unlockMutex(m_threadMutex); - assert(thread != NULL); - return thread; + lockMutex(m_threadMutex); + ArchThreadImpl* thread = find(GetCurrentThreadId()); + unlockMutex(m_threadMutex); + assert(thread != NULL); + return thread; } void ArchMultithreadWindows::closeThread(ArchThread thread) { - assert(thread != NULL); + assert(thread != NULL); - // decrement ref count and clean up thread if no more references - if (--thread->m_refCount == 0) { - // close the handle (main thread has a NULL handle) - if (thread->m_thread != NULL) { - CloseHandle(thread->m_thread); - } + // decrement ref count and clean up thread if no more references + if (--thread->m_refCount == 0) { + // close the handle (main thread has a NULL handle) + if (thread->m_thread != NULL) { + CloseHandle(thread->m_thread); + } - // remove thread from list - lockMutex(m_threadMutex); - assert(findNoRefOrCreate(thread->m_id) == thread); - erase(thread); - unlockMutex(m_threadMutex); + // remove thread from list + lockMutex(m_threadMutex); + assert(findNoRefOrCreate(thread->m_id) == thread); + erase(thread); + unlockMutex(m_threadMutex); - // done with thread - delete thread; - } + // done with thread + delete thread; + } } ArchThread ArchMultithreadWindows::copyThread(ArchThread thread) { - refThread(thread); - return thread; + refThread(thread); + return thread; } void ArchMultithreadWindows::cancelThread(ArchThread thread) { - assert(thread != NULL); + assert(thread != NULL); - // set cancel flag - SetEvent(thread->m_cancel); + // set cancel flag + SetEvent(thread->m_cancel); } void ArchMultithreadWindows::setPriorityOfThread(ArchThread thread, int n) { - struct PriorityInfo { - public: - DWORD m_class; - int m_level; - }; - static const PriorityInfo s_pClass[] = { - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_IDLE }, - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, - { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, - { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, - { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, - { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, - { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, - { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, - { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, - { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, - { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, - { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, - { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_IDLE }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, - { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_TIME_CRITICAL} - }; + struct PriorityInfo { + public: + DWORD m_class; + int m_level; + }; + static const PriorityInfo s_pClass[] = { + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_IDLE }, + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, + { IDLE_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, + { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, + { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, + { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, + { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, + { NORMAL_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, + { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, + { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, + { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, + { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, + { HIGH_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_IDLE }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_LOWEST }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_BELOW_NORMAL }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_NORMAL }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_ABOVE_NORMAL }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_HIGHEST }, + { REALTIME_PRIORITY_CLASS, THREAD_PRIORITY_TIME_CRITICAL} + }; #if defined(_DEBUG) - // don't use really high priorities when debugging - static const size_t s_pMax = 13; + // don't use really high priorities when debugging + static const size_t s_pMax = 13; #else - static const size_t s_pMax = sizeof(s_pClass) / sizeof(s_pClass[0]) - 1; + static const size_t s_pMax = sizeof(s_pClass) / sizeof(s_pClass[0]) - 1; #endif - static const size_t s_pBase = 8; // index of normal priority + static const size_t s_pBase = 8; // index of normal priority - assert(thread != NULL); + assert(thread != NULL); - size_t index; - if (n > 0 && s_pBase < (size_t)n) { - // lowest priority - index = 0; - } - else { - index = (size_t)((int)s_pBase - n); - if (index > s_pMax) { - // highest priority - index = s_pMax; - } - } - SetPriorityClass(GetCurrentProcess(), s_pClass[index].m_class); - SetThreadPriority(thread->m_thread, s_pClass[index].m_level); + size_t index; + if (n > 0 && s_pBase < (size_t)n) { + // lowest priority + index = 0; + } + else { + index = (size_t)((int)s_pBase - n); + if (index > s_pMax) { + // highest priority + index = s_pMax; + } + } + SetPriorityClass(GetCurrentProcess(), s_pClass[index].m_class); + SetThreadPriority(thread->m_thread, s_pClass[index].m_level); } void ArchMultithreadWindows::testCancelThread() { - // find current thread - lockMutex(m_threadMutex); - ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); - unlockMutex(m_threadMutex); + // find current thread + lockMutex(m_threadMutex); + ArchThreadImpl* thread = findNoRef(GetCurrentThreadId()); + unlockMutex(m_threadMutex); - // test cancel on thread - testCancelThreadImpl(thread); + // test cancel on thread + testCancelThreadImpl(thread); } bool ArchMultithreadWindows::wait(ArchThread target, double timeout) { - assert(target != NULL); + assert(target != NULL); - lockMutex(m_threadMutex); + lockMutex(m_threadMutex); - // find current thread - ArchThreadImpl* self = findNoRef(GetCurrentThreadId()); + // find current thread + ArchThreadImpl* self = findNoRef(GetCurrentThreadId()); - // ignore wait if trying to wait on ourself - if (target == self) { - unlockMutex(m_threadMutex); - return false; - } + // ignore wait if trying to wait on ourself + if (target == self) { + unlockMutex(m_threadMutex); + return false; + } - // ref the target so it can't go away while we're watching it - refThread(target); + // ref the target so it can't go away while we're watching it + refThread(target); - unlockMutex(m_threadMutex); + unlockMutex(m_threadMutex); - // convert timeout - DWORD t; - if (timeout < 0.0) { - t = INFINITE; - } - else { - t = (DWORD)(1000.0 * timeout); - } + // convert timeout + DWORD t; + if (timeout < 0.0) { + t = INFINITE; + } + else { + t = (DWORD)(1000.0 * timeout); + } - // wait for this thread to be cancelled or woken up or for the - // target thread to terminate. - HANDLE handles[2]; - handles[0] = target->m_exit; - handles[1] = self->m_cancel; - DWORD result = WaitForMultipleObjects(2, handles, FALSE, t); + // wait for this thread to be cancelled or woken up or for the + // target thread to terminate. + HANDLE handles[2]; + handles[0] = target->m_exit; + handles[1] = self->m_cancel; + DWORD result = WaitForMultipleObjects(2, handles, FALSE, t); - // cancel takes priority - if (result != WAIT_OBJECT_0 + 1 && - WaitForSingleObject(handles[1], 0) == WAIT_OBJECT_0) { - result = WAIT_OBJECT_0 + 1; - } + // cancel takes priority + if (result != WAIT_OBJECT_0 + 1 && + WaitForSingleObject(handles[1], 0) == WAIT_OBJECT_0) { + result = WAIT_OBJECT_0 + 1; + } - // release target - closeThread(target); + // release target + closeThread(target); - // handle result - switch (result) { - case WAIT_OBJECT_0 + 0: - // target thread terminated - return true; + // handle result + switch (result) { + case WAIT_OBJECT_0 + 0: + // target thread terminated + return true; - case WAIT_OBJECT_0 + 1: - // this thread was cancelled. does not return. - testCancelThreadImpl(self); + case WAIT_OBJECT_0 + 1: + // this thread was cancelled. does not return. + testCancelThreadImpl(self); - default: - // timeout or error - return false; - } + default: + // timeout or error + return false; + } } bool ArchMultithreadWindows::isSameThread(ArchThread thread1, ArchThread thread2) { - return (thread1 == thread2); + return (thread1 == thread2); } bool ArchMultithreadWindows::isExitedThread(ArchThread thread) { - // poll exit event - return (WaitForSingleObject(thread->m_exit, 0) == WAIT_OBJECT_0); + // poll exit event + return (WaitForSingleObject(thread->m_exit, 0) == WAIT_OBJECT_0); } void* ArchMultithreadWindows::getResultOfThread(ArchThread thread) { - lockMutex(m_threadMutex); - void* result = thread->m_result; - unlockMutex(m_threadMutex); - return result; + lockMutex(m_threadMutex); + void* result = thread->m_result; + unlockMutex(m_threadMutex); + return result; } IArchMultithread::ThreadID ArchMultithreadWindows::getIDOfThread(ArchThread thread) { - return static_cast(thread->m_id); + return static_cast(thread->m_id); } void ArchMultithreadWindows::setSignalHandler( - ESignal signal, SignalFunc func, void* userData) + ESignal signal, SignalFunc func, void* userData) { - lockMutex(m_threadMutex); - m_signalFunc[signal] = func; - m_signalUserData[signal] = userData; - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + m_signalFunc[signal] = func; + m_signalUserData[signal] = userData; + unlockMutex(m_threadMutex); } void ArchMultithreadWindows::raiseSignal(ESignal signal) { - lockMutex(m_threadMutex); - if (m_signalFunc[signal] != NULL) { - m_signalFunc[signal](signal, m_signalUserData[signal]); - ARCH->unblockPollSocket(m_mainThread); - } - else if (signal == kINTERRUPT || signal == kTERMINATE) { - ARCH->cancelThread(m_mainThread); - } - unlockMutex(m_threadMutex); + lockMutex(m_threadMutex); + if (m_signalFunc[signal] != NULL) { + m_signalFunc[signal](signal, m_signalUserData[signal]); + ARCH->unblockPollSocket(m_mainThread); + } + else if (signal == kINTERRUPT || signal == kTERMINATE) { + ARCH->cancelThread(m_mainThread); + } + unlockMutex(m_threadMutex); } ArchThreadImpl* ArchMultithreadWindows::find(DWORD id) { - ArchThreadImpl* impl = findNoRef(id); - if (impl != NULL) { - refThread(impl); - } - return impl; + ArchThreadImpl* impl = findNoRef(id); + if (impl != NULL) { + refThread(impl); + } + return impl; } ArchThreadImpl* ArchMultithreadWindows::findNoRef(DWORD id) { - ArchThreadImpl* impl = findNoRefOrCreate(id); - if (impl == NULL) { - // create thread for calling thread which isn't in our list and - // add it to the list. this won't normally happen but it can if - // the system calls us under a new thread, like it does when we - // run as a service. - impl = new ArchThreadImpl; - impl->m_thread = NULL; - impl->m_id = GetCurrentThreadId(); - insert(impl); - } - return impl; + ArchThreadImpl* impl = findNoRefOrCreate(id); + if (impl == NULL) { + // create thread for calling thread which isn't in our list and + // add it to the list. this won't normally happen but it can if + // the system calls us under a new thread, like it does when we + // run as a service. + impl = new ArchThreadImpl; + impl->m_thread = NULL; + impl->m_id = GetCurrentThreadId(); + insert(impl); + } + return impl; } ArchThreadImpl* ArchMultithreadWindows::findNoRefOrCreate(DWORD id) { - // linear search - for (ThreadList::const_iterator index = m_threadList.begin(); - index != m_threadList.end(); ++index) { - if ((*index)->m_id == id) { - return *index; - } - } - return NULL; + // linear search + for (ThreadList::const_iterator index = m_threadList.begin(); + index != m_threadList.end(); ++index) { + if ((*index)->m_id == id) { + return *index; + } + } + return NULL; } void ArchMultithreadWindows::insert(ArchThreadImpl* thread) { - assert(thread != NULL); + assert(thread != NULL); - // thread shouldn't already be on the list - assert(findNoRefOrCreate(thread->m_id) == NULL); + // thread shouldn't already be on the list + assert(findNoRefOrCreate(thread->m_id) == NULL); - // append to list - m_threadList.push_back(thread); + // append to list + m_threadList.push_back(thread); } void ArchMultithreadWindows::erase(ArchThreadImpl* thread) { - for (ThreadList::iterator index = m_threadList.begin(); - index != m_threadList.end(); ++index) { - if (*index == thread) { - m_threadList.erase(index); - break; - } - } + for (ThreadList::iterator index = m_threadList.begin(); + index != m_threadList.end(); ++index) { + if (*index == thread) { + m_threadList.erase(index); + break; + } + } } void ArchMultithreadWindows::refThread(ArchThreadImpl* thread) { - assert(thread != NULL); - assert(findNoRefOrCreate(thread->m_id) != NULL); - ++thread->m_refCount; + assert(thread != NULL); + assert(findNoRefOrCreate(thread->m_id) != NULL); + ++thread->m_refCount; } void ArchMultithreadWindows::testCancelThreadImpl(ArchThreadImpl* thread) { - assert(thread != NULL); + assert(thread != NULL); - // poll cancel event. return if not set. - const DWORD result = WaitForSingleObject(thread->m_cancel, 0); - if (result != WAIT_OBJECT_0) { - return; - } + // poll cancel event. return if not set. + const DWORD result = WaitForSingleObject(thread->m_cancel, 0); + if (result != WAIT_OBJECT_0) { + return; + } - // update cancel state - lockMutex(m_threadMutex); - bool cancel = !thread->m_cancelling; - thread->m_cancelling = true; - ResetEvent(thread->m_cancel); - unlockMutex(m_threadMutex); + // update cancel state + lockMutex(m_threadMutex); + bool cancel = !thread->m_cancelling; + thread->m_cancelling = true; + ResetEvent(thread->m_cancel); + unlockMutex(m_threadMutex); - // unwind thread's stack if cancelling - if (cancel) { - throw XThreadCancel(); - } + // unwind thread's stack if cancelling + if (cancel) { + throw XThreadCancel(); + } } unsigned int __stdcall ArchMultithreadWindows::threadFunc(void* vrep) { - // get the thread - ArchThreadImpl* thread = static_cast(vrep); + // get the thread + ArchThreadImpl* thread = static_cast(vrep); - // run thread - s_instance->doThreadFunc(thread); + // run thread + s_instance->doThreadFunc(thread); - // terminate the thread - return 0; + // terminate the thread + return 0; } void ArchMultithreadWindows::doThreadFunc(ArchThread thread) { - // wait for parent to initialize this object - lockMutex(m_threadMutex); - unlockMutex(m_threadMutex); + // wait for parent to initialize this object + lockMutex(m_threadMutex); + unlockMutex(m_threadMutex); - void* result = NULL; - try { - // go - result = (*thread->m_func)(thread->m_userData); - } + void* result = NULL; + try { + // go + result = (*thread->m_func)(thread->m_userData); + } - catch (XThreadCancel&) { - // client called cancel() - } - catch (...) { - // note -- don't catch (...) to avoid masking bugs - SetEvent(thread->m_exit); - closeThread(thread); - throw; - } + catch (XThreadCancel&) { + // client called cancel() + } + catch (...) { + // note -- don't catch (...) to avoid masking bugs + SetEvent(thread->m_exit); + closeThread(thread); + throw; + } - // thread has exited - lockMutex(m_threadMutex); - thread->m_result = result; - unlockMutex(m_threadMutex); - SetEvent(thread->m_exit); + // thread has exited + lockMutex(m_threadMutex); + thread->m_result = result; + unlockMutex(m_threadMutex); + SetEvent(thread->m_exit); - // done with thread - closeThread(thread); + // done with thread + closeThread(thread); } diff --git a/src/lib/arch/win32/ArchMultithreadWindows.h b/src/lib/arch/win32/ArchMultithreadWindows.h index bc98019c..ac4daa57 100644 --- a/src/lib/arch/win32/ArchMultithreadWindows.h +++ b/src/lib/arch/win32/ArchMultithreadWindows.h @@ -28,89 +28,89 @@ class ArchCondImpl { public: - enum { kSignal = 0, kBroadcast }; + enum { kSignal = 0, kBroadcast }; - HANDLE m_events[2]; - mutable int m_waitCount; - ArchMutex m_waitCountMutex; + HANDLE m_events[2]; + mutable int m_waitCount; + ArchMutex m_waitCountMutex; }; class ArchMutexImpl { public: - CRITICAL_SECTION m_mutex; + CRITICAL_SECTION m_mutex; }; //! Win32 implementation of IArchMultithread class ArchMultithreadWindows : public IArchMultithread { public: - ArchMultithreadWindows(); - virtual ~ArchMultithreadWindows(); + ArchMultithreadWindows(); + virtual ~ArchMultithreadWindows(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - void setNetworkDataForCurrentThread(void*); + void setNetworkDataForCurrentThread(void*); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - HANDLE getCancelEventForCurrentThread(); + HANDLE getCancelEventForCurrentThread(); - void* getNetworkDataForThread(ArchThread); + void* getNetworkDataForThread(ArchThread); - static ArchMultithreadWindows* getInstance(); + static ArchMultithreadWindows* getInstance(); - //@} + //@} - // IArchMultithread overrides - virtual ArchCond newCondVar(); - virtual void closeCondVar(ArchCond); - virtual void signalCondVar(ArchCond); - virtual void broadcastCondVar(ArchCond); - virtual bool waitCondVar(ArchCond, ArchMutex, double timeout); - virtual ArchMutex newMutex(); - virtual void closeMutex(ArchMutex); - virtual void lockMutex(ArchMutex); - virtual void unlockMutex(ArchMutex); - virtual ArchThread newThread(ThreadFunc, void*); - virtual ArchThread newCurrentThread(); - virtual ArchThread copyThread(ArchThread); - virtual void closeThread(ArchThread); - virtual void cancelThread(ArchThread); - virtual void setPriorityOfThread(ArchThread, int n); - virtual void testCancelThread(); - virtual bool wait(ArchThread, double timeout); - virtual bool isSameThread(ArchThread, ArchThread); - virtual bool isExitedThread(ArchThread); - virtual void* getResultOfThread(ArchThread); - virtual ThreadID getIDOfThread(ArchThread); - virtual void setSignalHandler(ESignal, SignalFunc, void*); - virtual void raiseSignal(ESignal); + // IArchMultithread overrides + virtual ArchCond newCondVar(); + virtual void closeCondVar(ArchCond); + virtual void signalCondVar(ArchCond); + virtual void broadcastCondVar(ArchCond); + virtual bool waitCondVar(ArchCond, ArchMutex, double timeout); + virtual ArchMutex newMutex(); + virtual void closeMutex(ArchMutex); + virtual void lockMutex(ArchMutex); + virtual void unlockMutex(ArchMutex); + virtual ArchThread newThread(ThreadFunc, void*); + virtual ArchThread newCurrentThread(); + virtual ArchThread copyThread(ArchThread); + virtual void closeThread(ArchThread); + virtual void cancelThread(ArchThread); + virtual void setPriorityOfThread(ArchThread, int n); + virtual void testCancelThread(); + virtual bool wait(ArchThread, double timeout); + virtual bool isSameThread(ArchThread, ArchThread); + virtual bool isExitedThread(ArchThread); + virtual void* getResultOfThread(ArchThread); + virtual ThreadID getIDOfThread(ArchThread); + virtual void setSignalHandler(ESignal, SignalFunc, void*); + virtual void raiseSignal(ESignal); private: - ArchThreadImpl* find(DWORD id); - ArchThreadImpl* findNoRef(DWORD id); - ArchThreadImpl* findNoRefOrCreate(DWORD id); - void insert(ArchThreadImpl* thread); - void erase(ArchThreadImpl* thread); + ArchThreadImpl* find(DWORD id); + ArchThreadImpl* findNoRef(DWORD id); + ArchThreadImpl* findNoRefOrCreate(DWORD id); + void insert(ArchThreadImpl* thread); + void erase(ArchThreadImpl* thread); - void refThread(ArchThreadImpl* rep); - void testCancelThreadImpl(ArchThreadImpl* rep); + void refThread(ArchThreadImpl* rep); + void testCancelThreadImpl(ArchThreadImpl* rep); - void doThreadFunc(ArchThread thread); - static unsigned int __stdcall threadFunc(void* vrep); + void doThreadFunc(ArchThread thread); + static unsigned int __stdcall threadFunc(void* vrep); private: - typedef std::list ThreadList; + typedef std::list ThreadList; - static ArchMultithreadWindows* s_instance; + static ArchMultithreadWindows* s_instance; - ArchMutex m_threadMutex; + ArchMutex m_threadMutex; - ThreadList m_threadList; - ArchThread m_mainThread; + ThreadList m_threadList; + ArchThread m_mainThread; - SignalFunc m_signalFunc[kNUM_SIGNALS]; - void* m_signalUserData[kNUM_SIGNALS]; + SignalFunc m_signalFunc[kNUM_SIGNALS]; + void* m_signalUserData[kNUM_SIGNALS]; }; diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp index b1470aa2..24310402 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.cpp +++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp @@ -25,12 +25,12 @@ #include static const int s_family[] = { - PF_UNSPEC, - PF_INET + PF_UNSPEC, + PF_INET }; static const int s_type[] = { - SOCK_DGRAM, - SOCK_STREAM + SOCK_DGRAM, + SOCK_STREAM }; static SOCKET (PASCAL FAR *accept_winsock)(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen); @@ -69,26 +69,26 @@ static int (PASCAL FAR *WSAEnumNetworkEvents_winsock)(SOCKET, WSAEVENT, LPWSANET #define setfunc(var, name, type) var = (type)netGetProcAddress(module, #name) -static HMODULE s_networkModule = NULL; +static HMODULE s_networkModule = NULL; static FARPROC netGetProcAddress(HMODULE module, LPCSTR name) { - FARPROC func = ::GetProcAddress(module, name); - if (!func) { - throw XArchNetworkSupport(""); - } - return func; + FARPROC func = ::GetProcAddress(module, name); + if (!func) { + throw XArchNetworkSupport(""); + } + return func; } ArchNetAddressImpl* ArchNetAddressImpl::alloc(size_t size) { - size_t totalSize = size + ADDR_HDR_SIZE; - ArchNetAddressImpl* addr = (ArchNetAddressImpl*)malloc(totalSize); - addr->m_len = (int)size; - return addr; + size_t totalSize = size + ADDR_HDR_SIZE; + ArchNetAddressImpl* addr = (ArchNetAddressImpl*)malloc(totalSize); + addr->m_len = (int)size; + return addr; } @@ -97,856 +97,856 @@ ArchNetAddressImpl::alloc(size_t size) // ArchNetworkWinsock::ArchNetworkWinsock() : - m_mutex(NULL) + m_mutex(NULL) { } ArchNetworkWinsock::~ArchNetworkWinsock() { - if (s_networkModule != NULL) { - WSACleanup_winsock(); - ::FreeLibrary(s_networkModule); + if (s_networkModule != NULL) { + WSACleanup_winsock(); + ::FreeLibrary(s_networkModule); - WSACleanup_winsock = NULL; - s_networkModule = NULL; - } - if (m_mutex != NULL) { - ARCH->closeMutex(m_mutex); - } + WSACleanup_winsock = NULL; + s_networkModule = NULL; + } + if (m_mutex != NULL) { + ARCH->closeMutex(m_mutex); + } - EventList::iterator it; - for (it = m_unblockEvents.begin(); it != m_unblockEvents.end(); it++) { - delete *it; - } + EventList::iterator it; + for (it = m_unblockEvents.begin(); it != m_unblockEvents.end(); it++) { + delete *it; + } } void ArchNetworkWinsock::init() { - static const char* s_library[] = { "ws2_32.dll" }; + static const char* s_library[] = { "ws2_32.dll" }; - assert(WSACleanup_winsock == NULL); - assert(s_networkModule == NULL); + assert(WSACleanup_winsock == NULL); + assert(s_networkModule == NULL); - // try each winsock library - for (size_t i = 0; i < sizeof(s_library) / sizeof(s_library[0]); ++i) { - try { - initModule((HMODULE)::LoadLibrary(s_library[i])); - m_mutex = ARCH->newMutex(); - return; - } - catch (XArchNetwork&) { - // ignore - } - } + // try each winsock library + for (size_t i = 0; i < sizeof(s_library) / sizeof(s_library[0]); ++i) { + try { + initModule((HMODULE)::LoadLibrary(s_library[i])); + m_mutex = ARCH->newMutex(); + return; + } + catch (XArchNetwork&) { + // ignore + } + } - // can't initialize any library - throw XArchNetworkSupport("Cannot load winsock library"); + // can't initialize any library + throw XArchNetworkSupport("Cannot load winsock library"); } void ArchNetworkWinsock::initModule(HMODULE module) { - if (module == NULL) { - throw XArchNetworkSupport(""); - } + if (module == NULL) { + throw XArchNetworkSupport(""); + } - // get startup function address - int (PASCAL FAR *startup)(WORD, LPWSADATA); - setfunc(startup, WSAStartup, int(PASCAL FAR*)(WORD, LPWSADATA)); + // get startup function address + int (PASCAL FAR *startup)(WORD, LPWSADATA); + setfunc(startup, WSAStartup, int(PASCAL FAR*)(WORD, LPWSADATA)); - // startup network library - WORD version = MAKEWORD(2 /*major*/, 0 /*minor*/); - WSADATA data; - int err = startup(version, &data); - if (data.wVersion != version) { - throw XArchNetworkSupport(new XArchEvalWinsock(err)); - } - if (err != 0) { - // some other initialization error - throwError(err); - } + // startup network library + WORD version = MAKEWORD(2 /*major*/, 0 /*minor*/); + WSADATA data; + int err = startup(version, &data); + if (data.wVersion != version) { + throw XArchNetworkSupport(new XArchEvalWinsock(err)); + } + if (err != 0) { + // some other initialization error + throwError(err); + } - // get function addresses - setfunc(accept_winsock, accept, SOCKET (PASCAL FAR *)(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)); - setfunc(bind_winsock, bind, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *addr, int namelen)); - setfunc(close_winsock, closesocket, int (PASCAL FAR *)(SOCKET s)); - setfunc(connect_winsock, connect, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *name, int namelen)); - setfunc(gethostname_winsock, gethostname, int (PASCAL FAR *)(char FAR * name, int namelen)); - setfunc(getsockerror_winsock, WSAGetLastError, int (PASCAL FAR *)(void)); - setfunc(getsockopt_winsock, getsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, void FAR * optval, int FAR *optlen)); - setfunc(htons_winsock, htons, u_short (PASCAL FAR *)(u_short v)); - setfunc(inet_ntoa_winsock, inet_ntoa, char FAR * (PASCAL FAR *)(struct in_addr in)); - setfunc(inet_addr_winsock, inet_addr, unsigned long (PASCAL FAR *)(const char FAR * cp)); - setfunc(ioctl_winsock, ioctlsocket, int (PASCAL FAR *)(SOCKET s, int cmd, void FAR *)); - setfunc(listen_winsock, listen, int (PASCAL FAR *)(SOCKET s, int backlog)); - setfunc(ntohs_winsock, ntohs, u_short (PASCAL FAR *)(u_short v)); - setfunc(recv_winsock, recv, int (PASCAL FAR *)(SOCKET s, void FAR * buf, int len, int flags)); - setfunc(select_winsock, select, int (PASCAL FAR *)(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout)); - setfunc(send_winsock, send, int (PASCAL FAR *)(SOCKET s, const void FAR * buf, int len, int flags)); - setfunc(setsockopt_winsock, setsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, const void FAR * optval, int optlen)); - setfunc(shutdown_winsock, shutdown, int (PASCAL FAR *)(SOCKET s, int how)); - setfunc(socket_winsock, socket, SOCKET (PASCAL FAR *)(int af, int type, int protocol)); - setfunc(gethostbyaddr_winsock, gethostbyaddr, struct hostent FAR * (PASCAL FAR *)(const char FAR * addr, int len, int type)); - setfunc(gethostbyname_winsock, gethostbyname, struct hostent FAR * (PASCAL FAR *)(const char FAR * name)); - setfunc(WSACleanup_winsock, WSACleanup, int (PASCAL FAR *)(void)); - setfunc(WSAFDIsSet_winsock, __WSAFDIsSet, int (PASCAL FAR *)(SOCKET, fd_set FAR *)); - setfunc(WSACreateEvent_winsock, WSACreateEvent, WSAEVENT (PASCAL FAR *)(void)); - setfunc(WSACloseEvent_winsock, WSACloseEvent, BOOL (PASCAL FAR *)(WSAEVENT)); - setfunc(WSASetEvent_winsock, WSASetEvent, BOOL (PASCAL FAR *)(WSAEVENT)); - setfunc(WSAResetEvent_winsock, WSAResetEvent, BOOL (PASCAL FAR *)(WSAEVENT)); - setfunc(WSAEventSelect_winsock, WSAEventSelect, int (PASCAL FAR *)(SOCKET, WSAEVENT, long)); - setfunc(WSAWaitForMultipleEvents_winsock, WSAWaitForMultipleEvents, DWORD (PASCAL FAR *)(DWORD, const WSAEVENT FAR*, BOOL, DWORD, BOOL)); - setfunc(WSAEnumNetworkEvents_winsock, WSAEnumNetworkEvents, int (PASCAL FAR *)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS)); + // get function addresses + setfunc(accept_winsock, accept, SOCKET (PASCAL FAR *)(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen)); + setfunc(bind_winsock, bind, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *addr, int namelen)); + setfunc(close_winsock, closesocket, int (PASCAL FAR *)(SOCKET s)); + setfunc(connect_winsock, connect, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *name, int namelen)); + setfunc(gethostname_winsock, gethostname, int (PASCAL FAR *)(char FAR * name, int namelen)); + setfunc(getsockerror_winsock, WSAGetLastError, int (PASCAL FAR *)(void)); + setfunc(getsockopt_winsock, getsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, void FAR * optval, int FAR *optlen)); + setfunc(htons_winsock, htons, u_short (PASCAL FAR *)(u_short v)); + setfunc(inet_ntoa_winsock, inet_ntoa, char FAR * (PASCAL FAR *)(struct in_addr in)); + setfunc(inet_addr_winsock, inet_addr, unsigned long (PASCAL FAR *)(const char FAR * cp)); + setfunc(ioctl_winsock, ioctlsocket, int (PASCAL FAR *)(SOCKET s, int cmd, void FAR *)); + setfunc(listen_winsock, listen, int (PASCAL FAR *)(SOCKET s, int backlog)); + setfunc(ntohs_winsock, ntohs, u_short (PASCAL FAR *)(u_short v)); + setfunc(recv_winsock, recv, int (PASCAL FAR *)(SOCKET s, void FAR * buf, int len, int flags)); + setfunc(select_winsock, select, int (PASCAL FAR *)(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout)); + setfunc(send_winsock, send, int (PASCAL FAR *)(SOCKET s, const void FAR * buf, int len, int flags)); + setfunc(setsockopt_winsock, setsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, const void FAR * optval, int optlen)); + setfunc(shutdown_winsock, shutdown, int (PASCAL FAR *)(SOCKET s, int how)); + setfunc(socket_winsock, socket, SOCKET (PASCAL FAR *)(int af, int type, int protocol)); + setfunc(gethostbyaddr_winsock, gethostbyaddr, struct hostent FAR * (PASCAL FAR *)(const char FAR * addr, int len, int type)); + setfunc(gethostbyname_winsock, gethostbyname, struct hostent FAR * (PASCAL FAR *)(const char FAR * name)); + setfunc(WSACleanup_winsock, WSACleanup, int (PASCAL FAR *)(void)); + setfunc(WSAFDIsSet_winsock, __WSAFDIsSet, int (PASCAL FAR *)(SOCKET, fd_set FAR *)); + setfunc(WSACreateEvent_winsock, WSACreateEvent, WSAEVENT (PASCAL FAR *)(void)); + setfunc(WSACloseEvent_winsock, WSACloseEvent, BOOL (PASCAL FAR *)(WSAEVENT)); + setfunc(WSASetEvent_winsock, WSASetEvent, BOOL (PASCAL FAR *)(WSAEVENT)); + setfunc(WSAResetEvent_winsock, WSAResetEvent, BOOL (PASCAL FAR *)(WSAEVENT)); + setfunc(WSAEventSelect_winsock, WSAEventSelect, int (PASCAL FAR *)(SOCKET, WSAEVENT, long)); + setfunc(WSAWaitForMultipleEvents_winsock, WSAWaitForMultipleEvents, DWORD (PASCAL FAR *)(DWORD, const WSAEVENT FAR*, BOOL, DWORD, BOOL)); + setfunc(WSAEnumNetworkEvents_winsock, WSAEnumNetworkEvents, int (PASCAL FAR *)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS)); - s_networkModule = module; + s_networkModule = module; } ArchSocket ArchNetworkWinsock::newSocket(EAddressFamily family, ESocketType type) { - // create socket - SOCKET fd = socket_winsock(s_family[family], s_type[type], 0); - if (fd == INVALID_SOCKET) { - throwError(getsockerror_winsock()); - } - try { - setBlockingOnSocket(fd, false); - } - catch (...) { - close_winsock(fd); - throw; - } + // create socket + SOCKET fd = socket_winsock(s_family[family], s_type[type], 0); + if (fd == INVALID_SOCKET) { + throwError(getsockerror_winsock()); + } + try { + setBlockingOnSocket(fd, false); + } + catch (...) { + close_winsock(fd); + throw; + } - // allocate socket object - ArchSocketImpl* socket = new ArchSocketImpl; - socket->m_socket = fd; - socket->m_refCount = 1; - socket->m_event = WSACreateEvent_winsock(); - socket->m_pollWrite = true; - return socket; + // allocate socket object + ArchSocketImpl* socket = new ArchSocketImpl; + socket->m_socket = fd; + socket->m_refCount = 1; + socket->m_event = WSACreateEvent_winsock(); + socket->m_pollWrite = true; + return socket; } ArchSocket ArchNetworkWinsock::copySocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // ref the socket and return it - ARCH->lockMutex(m_mutex); - ++s->m_refCount; - ARCH->unlockMutex(m_mutex); - return s; + // ref the socket and return it + ARCH->lockMutex(m_mutex); + ++s->m_refCount; + ARCH->unlockMutex(m_mutex); + return s; } void ArchNetworkWinsock::closeSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // unref the socket and note if it should be released - ARCH->lockMutex(m_mutex); - const bool doClose = (--s->m_refCount == 0); - ARCH->unlockMutex(m_mutex); + // unref the socket and note if it should be released + ARCH->lockMutex(m_mutex); + const bool doClose = (--s->m_refCount == 0); + ARCH->unlockMutex(m_mutex); - // close the socket if necessary - if (doClose) { - if (close_winsock(s->m_socket) == SOCKET_ERROR) { - // close failed. restore the last ref and throw. - int err = getsockerror_winsock(); - ARCH->lockMutex(m_mutex); - ++s->m_refCount; - ARCH->unlockMutex(m_mutex); - throwError(err); - } - WSACloseEvent_winsock(s->m_event); - delete s; - } + // close the socket if necessary + if (doClose) { + if (close_winsock(s->m_socket) == SOCKET_ERROR) { + // close failed. restore the last ref and throw. + int err = getsockerror_winsock(); + ARCH->lockMutex(m_mutex); + ++s->m_refCount; + ARCH->unlockMutex(m_mutex); + throwError(err); + } + WSACloseEvent_winsock(s->m_event); + delete s; + } } void ArchNetworkWinsock::closeSocketForRead(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - if (shutdown_winsock(s->m_socket, SD_RECEIVE) == SOCKET_ERROR) { - if (getsockerror_winsock() != WSAENOTCONN) { - throwError(getsockerror_winsock()); - } - } + if (shutdown_winsock(s->m_socket, SD_RECEIVE) == SOCKET_ERROR) { + if (getsockerror_winsock() != WSAENOTCONN) { + throwError(getsockerror_winsock()); + } + } } void ArchNetworkWinsock::closeSocketForWrite(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - if (shutdown_winsock(s->m_socket, SD_SEND) == SOCKET_ERROR) { - if (getsockerror_winsock() != WSAENOTCONN) { - throwError(getsockerror_winsock()); - } - } + if (shutdown_winsock(s->m_socket, SD_SEND) == SOCKET_ERROR) { + if (getsockerror_winsock() != WSAENOTCONN) { + throwError(getsockerror_winsock()); + } + } } void ArchNetworkWinsock::bindSocket(ArchSocket s, ArchNetAddress addr) { - assert(s != NULL); - assert(addr != NULL); + assert(s != NULL); + assert(addr != NULL); - if (bind_winsock(s->m_socket, &addr->m_addr, addr->m_len) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + if (bind_winsock(s->m_socket, &addr->m_addr, addr->m_len) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } } void ArchNetworkWinsock::listenOnSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // hardcoding backlog - if (listen_winsock(s->m_socket, 3) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + // hardcoding backlog + if (listen_winsock(s->m_socket, 3) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } } ArchSocket ArchNetworkWinsock::acceptSocket(ArchSocket s, ArchNetAddress* addr) { - assert(s != NULL); + assert(s != NULL); - // create new socket and temporary address - ArchSocketImpl* socket = new ArchSocketImpl; - ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr)); + // create new socket and temporary address + ArchSocketImpl* socket = new ArchSocketImpl; + ArchNetAddress tmp = ArchNetAddressImpl::alloc(sizeof(struct sockaddr)); - // accept on socket - SOCKET fd = accept_winsock(s->m_socket, &tmp->m_addr, &tmp->m_len); - if (fd == INVALID_SOCKET) { - int err = getsockerror_winsock(); - delete socket; - free(tmp); - *addr = NULL; - if (err == WSAEWOULDBLOCK) { - return NULL; - } - throwError(err); - } + // accept on socket + SOCKET fd = accept_winsock(s->m_socket, &tmp->m_addr, &tmp->m_len); + if (fd == INVALID_SOCKET) { + int err = getsockerror_winsock(); + delete socket; + free(tmp); + *addr = NULL; + if (err == WSAEWOULDBLOCK) { + return NULL; + } + throwError(err); + } - try { - setBlockingOnSocket(fd, false); - } - catch (...) { - close_winsock(fd); - delete socket; - free(tmp); - *addr = NULL; - throw; - } + try { + setBlockingOnSocket(fd, false); + } + catch (...) { + close_winsock(fd); + delete socket; + free(tmp); + *addr = NULL; + throw; + } - // initialize socket - socket->m_socket = fd; - socket->m_refCount = 1; - socket->m_event = WSACreateEvent_winsock(); - socket->m_pollWrite = true; + // initialize socket + socket->m_socket = fd; + socket->m_refCount = 1; + socket->m_event = WSACreateEvent_winsock(); + socket->m_pollWrite = true; - // copy address if requested - if (addr != NULL) { - *addr = ARCH->copyAddr(tmp); - } + // copy address if requested + if (addr != NULL) { + *addr = ARCH->copyAddr(tmp); + } - free(tmp); - return socket; + free(tmp); + return socket; } bool ArchNetworkWinsock::connectSocket(ArchSocket s, ArchNetAddress addr) { - assert(s != NULL); - assert(addr != NULL); + assert(s != NULL); + assert(addr != NULL); - if (connect_winsock(s->m_socket, &addr->m_addr, - addr->m_len) == SOCKET_ERROR) { - if (getsockerror_winsock() == WSAEISCONN) { - return true; - } - if (getsockerror_winsock() == WSAEWOULDBLOCK) { - return false; - } - throwError(getsockerror_winsock()); - } - return true; + if (connect_winsock(s->m_socket, &addr->m_addr, + addr->m_len) == SOCKET_ERROR) { + if (getsockerror_winsock() == WSAEISCONN) { + return true; + } + if (getsockerror_winsock() == WSAEWOULDBLOCK) { + return false; + } + throwError(getsockerror_winsock()); + } + return true; } int ArchNetworkWinsock::pollSocket(PollEntry pe[], int num, double timeout) { - int i; - DWORD n; + int i; + DWORD n; - // prepare sockets and wait list - bool canWrite = false; - WSAEVENT* events = (WSAEVENT*)alloca((num + 1) * sizeof(WSAEVENT)); - for (i = 0, n = 0; i < num; ++i) { - // reset return flags - pe[i].m_revents = 0; + // prepare sockets and wait list + bool canWrite = false; + WSAEVENT* events = (WSAEVENT*)alloca((num + 1) * sizeof(WSAEVENT)); + for (i = 0, n = 0; i < num; ++i) { + // reset return flags + pe[i].m_revents = 0; - // set invalid flag if socket is bogus then go to next socket - if (pe[i].m_socket == NULL) { - pe[i].m_revents |= kPOLLNVAL; - continue; - } + // set invalid flag if socket is bogus then go to next socket + if (pe[i].m_socket == NULL) { + pe[i].m_revents |= kPOLLNVAL; + continue; + } - // select desired events - long socketEvents = 0; - if ((pe[i].m_events & kPOLLIN) != 0) { - socketEvents |= FD_READ | FD_ACCEPT | FD_CLOSE; - } - if ((pe[i].m_events & kPOLLOUT) != 0) { - socketEvents |= FD_WRITE | FD_CONNECT | FD_CLOSE; + // select desired events + long socketEvents = 0; + if ((pe[i].m_events & kPOLLIN) != 0) { + socketEvents |= FD_READ | FD_ACCEPT | FD_CLOSE; + } + if ((pe[i].m_events & kPOLLOUT) != 0) { + socketEvents |= FD_WRITE | FD_CONNECT | FD_CLOSE; - // if m_pollWrite is false then we assume the socket is - // writable. winsock doesn't signal writability except - // when the state changes from unwritable. - if (!pe[i].m_socket->m_pollWrite) { - canWrite = true; - pe[i].m_revents |= kPOLLOUT; - } - } + // if m_pollWrite is false then we assume the socket is + // writable. winsock doesn't signal writability except + // when the state changes from unwritable. + if (!pe[i].m_socket->m_pollWrite) { + canWrite = true; + pe[i].m_revents |= kPOLLOUT; + } + } - // if no events then ignore socket - if (socketEvents == 0) { - continue; - } + // if no events then ignore socket + if (socketEvents == 0) { + continue; + } - // select socket for desired events - WSAEventSelect_winsock(pe[i].m_socket->m_socket, - pe[i].m_socket->m_event, socketEvents); + // select socket for desired events + WSAEventSelect_winsock(pe[i].m_socket->m_socket, + pe[i].m_socket->m_event, socketEvents); - // add socket event to wait list - events[n++] = pe[i].m_socket->m_event; - } + // add socket event to wait list + events[n++] = pe[i].m_socket->m_event; + } - // if no sockets then return immediately - if (n == 0) { - return 0; - } + // if no sockets then return immediately + if (n == 0) { + return 0; + } - // add the unblock event - ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); - ArchThread thread = mt->newCurrentThread(); - WSAEVENT* unblockEvent = (WSAEVENT*)mt->getNetworkDataForThread(thread); - ARCH->closeThread(thread); - if (unblockEvent == NULL) { - unblockEvent = new WSAEVENT; - m_unblockEvents.push_back(unblockEvent); - *unblockEvent = WSACreateEvent_winsock(); - mt->setNetworkDataForCurrentThread(unblockEvent); - } - events[n++] = *unblockEvent; + // add the unblock event + ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); + ArchThread thread = mt->newCurrentThread(); + WSAEVENT* unblockEvent = (WSAEVENT*)mt->getNetworkDataForThread(thread); + ARCH->closeThread(thread); + if (unblockEvent == NULL) { + unblockEvent = new WSAEVENT; + m_unblockEvents.push_back(unblockEvent); + *unblockEvent = WSACreateEvent_winsock(); + mt->setNetworkDataForCurrentThread(unblockEvent); + } + events[n++] = *unblockEvent; - // prepare timeout - DWORD t = (timeout < 0.0) ? INFINITE : (DWORD)(1000.0 * timeout); - if (canWrite) { - // if we know we can write then don't block - t = 0; - } + // prepare timeout + DWORD t = (timeout < 0.0) ? INFINITE : (DWORD)(1000.0 * timeout); + if (canWrite) { + // if we know we can write then don't block + t = 0; + } - // wait - DWORD result = WSAWaitForMultipleEvents_winsock(n, events, FALSE, t, FALSE); + // wait + DWORD result = WSAWaitForMultipleEvents_winsock(n, events, FALSE, t, FALSE); - // reset the unblock event - WSAResetEvent_winsock(*unblockEvent); + // reset the unblock event + WSAResetEvent_winsock(*unblockEvent); - // handle results - if (result == WSA_WAIT_FAILED) { - if (getsockerror_winsock() == WSAEINTR) { - // interrupted system call - ARCH->testCancelThread(); - return 0; - } - throwError(getsockerror_winsock()); - } - if (result == WSA_WAIT_TIMEOUT && !canWrite) { - return 0; - } - if (result == WSA_WAIT_EVENT_0 + n - 1) { - // the unblock event was signalled - return 0; - } - for (i = 0, n = 0; i < num; ++i) { - // skip events we didn't check - if (pe[i].m_socket == NULL || - (pe[i].m_events & (kPOLLIN | kPOLLOUT)) == 0) { - continue; - } + // handle results + if (result == WSA_WAIT_FAILED) { + if (getsockerror_winsock() == WSAEINTR) { + // interrupted system call + ARCH->testCancelThread(); + return 0; + } + throwError(getsockerror_winsock()); + } + if (result == WSA_WAIT_TIMEOUT && !canWrite) { + return 0; + } + if (result == WSA_WAIT_EVENT_0 + n - 1) { + // the unblock event was signalled + return 0; + } + for (i = 0, n = 0; i < num; ++i) { + // skip events we didn't check + if (pe[i].m_socket == NULL || + (pe[i].m_events & (kPOLLIN | kPOLLOUT)) == 0) { + continue; + } - // get events - WSANETWORKEVENTS info; - if (WSAEnumNetworkEvents_winsock(pe[i].m_socket->m_socket, - pe[i].m_socket->m_event, &info) == SOCKET_ERROR) { - continue; - } - if ((info.lNetworkEvents & FD_READ) != 0) { - pe[i].m_revents |= kPOLLIN; - } - if ((info.lNetworkEvents & FD_ACCEPT) != 0) { - pe[i].m_revents |= kPOLLIN; - } - if ((info.lNetworkEvents & FD_WRITE) != 0) { - pe[i].m_revents |= kPOLLOUT; + // get events + WSANETWORKEVENTS info; + if (WSAEnumNetworkEvents_winsock(pe[i].m_socket->m_socket, + pe[i].m_socket->m_event, &info) == SOCKET_ERROR) { + continue; + } + if ((info.lNetworkEvents & FD_READ) != 0) { + pe[i].m_revents |= kPOLLIN; + } + if ((info.lNetworkEvents & FD_ACCEPT) != 0) { + pe[i].m_revents |= kPOLLIN; + } + if ((info.lNetworkEvents & FD_WRITE) != 0) { + pe[i].m_revents |= kPOLLOUT; - // socket is now writable so don't bothing polling for - // writable until it becomes unwritable. - pe[i].m_socket->m_pollWrite = false; - } - if ((info.lNetworkEvents & FD_CONNECT) != 0) { - if (info.iErrorCode[FD_CONNECT_BIT] != 0) { - pe[i].m_revents |= kPOLLERR; - } - else { - pe[i].m_revents |= kPOLLOUT; - pe[i].m_socket->m_pollWrite = false; - } - } - if ((info.lNetworkEvents & FD_CLOSE) != 0) { - if (info.iErrorCode[FD_CLOSE_BIT] != 0) { - pe[i].m_revents |= kPOLLERR; - } - else { - if ((pe[i].m_events & kPOLLIN) != 0) { - pe[i].m_revents |= kPOLLIN; - } - if ((pe[i].m_events & kPOLLOUT) != 0) { - pe[i].m_revents |= kPOLLOUT; - } - } - } - if (pe[i].m_revents != 0) { - ++n; - } - } + // socket is now writable so don't bothing polling for + // writable until it becomes unwritable. + pe[i].m_socket->m_pollWrite = false; + } + if ((info.lNetworkEvents & FD_CONNECT) != 0) { + if (info.iErrorCode[FD_CONNECT_BIT] != 0) { + pe[i].m_revents |= kPOLLERR; + } + else { + pe[i].m_revents |= kPOLLOUT; + pe[i].m_socket->m_pollWrite = false; + } + } + if ((info.lNetworkEvents & FD_CLOSE) != 0) { + if (info.iErrorCode[FD_CLOSE_BIT] != 0) { + pe[i].m_revents |= kPOLLERR; + } + else { + if ((pe[i].m_events & kPOLLIN) != 0) { + pe[i].m_revents |= kPOLLIN; + } + if ((pe[i].m_events & kPOLLOUT) != 0) { + pe[i].m_revents |= kPOLLOUT; + } + } + } + if (pe[i].m_revents != 0) { + ++n; + } + } - return (int)n; + return (int)n; } void ArchNetworkWinsock::unblockPollSocket(ArchThread thread) { - // set the unblock event - ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); - WSAEVENT* unblockEvent = (WSAEVENT*)mt->getNetworkDataForThread(thread); - if (unblockEvent != NULL) { - WSASetEvent_winsock(*unblockEvent); - } + // set the unblock event + ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); + WSAEVENT* unblockEvent = (WSAEVENT*)mt->getNetworkDataForThread(thread); + if (unblockEvent != NULL) { + WSASetEvent_winsock(*unblockEvent); + } } size_t ArchNetworkWinsock::readSocket(ArchSocket s, void* buf, size_t len) { - assert(s != NULL); + assert(s != NULL); - int n = recv_winsock(s->m_socket, buf, (int)len, 0); - if (n == SOCKET_ERROR) { - int err = getsockerror_winsock(); - if (err == WSAEINTR || err == WSAEWOULDBLOCK) { - return 0; - } - throwError(err); - } - return static_cast(n); + int n = recv_winsock(s->m_socket, buf, (int)len, 0); + if (n == SOCKET_ERROR) { + int err = getsockerror_winsock(); + if (err == WSAEINTR || err == WSAEWOULDBLOCK) { + return 0; + } + throwError(err); + } + return static_cast(n); } size_t ArchNetworkWinsock::writeSocket(ArchSocket s, const void* buf, size_t len) { - assert(s != NULL); + assert(s != NULL); - int n = send_winsock(s->m_socket, buf, (int)len, 0); - if (n == SOCKET_ERROR) { - int err = getsockerror_winsock(); - if (err == WSAEINTR) { - return 0; - } - if (err == WSAEWOULDBLOCK) { - s->m_pollWrite = true; - return 0; - } - throwError(err); - } - return static_cast(n); + int n = send_winsock(s->m_socket, buf, (int)len, 0); + if (n == SOCKET_ERROR) { + int err = getsockerror_winsock(); + if (err == WSAEINTR) { + return 0; + } + if (err == WSAEWOULDBLOCK) { + s->m_pollWrite = true; + return 0; + } + throwError(err); + } + return static_cast(n); } void ArchNetworkWinsock::throwErrorOnSocket(ArchSocket s) { - assert(s != NULL); + assert(s != NULL); - // get the error from the socket layer - int err = 0; - int size = sizeof(err); - if (getsockopt_winsock(s->m_socket, SOL_SOCKET, - SO_ERROR, &err, &size) == SOCKET_ERROR) { - err = getsockerror_winsock(); - } + // get the error from the socket layer + int err = 0; + int size = sizeof(err); + if (getsockopt_winsock(s->m_socket, SOL_SOCKET, + SO_ERROR, &err, &size) == SOCKET_ERROR) { + err = getsockerror_winsock(); + } - // throw if there's an error - if (err != 0) { - throwError(err); - } + // throw if there's an error + if (err != 0) { + throwError(err); + } } void ArchNetworkWinsock::setBlockingOnSocket(SOCKET s, bool blocking) { - assert(s != 0); + assert(s != 0); - int flag = blocking ? 0 : 1; - if (ioctl_winsock(s, FIONBIO, &flag) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + int flag = blocking ? 0 : 1; + if (ioctl_winsock(s, FIONBIO, &flag) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } } bool ArchNetworkWinsock::setNoDelayOnSocket(ArchSocket s, bool noDelay) { - assert(s != NULL); + assert(s != NULL); - // get old state - BOOL oflag; - int size = sizeof(oflag); - if (getsockopt_winsock(s->m_socket, IPPROTO_TCP, - TCP_NODELAY, &oflag, &size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + // get old state + BOOL oflag; + int size = sizeof(oflag); + if (getsockopt_winsock(s->m_socket, IPPROTO_TCP, + TCP_NODELAY, &oflag, &size) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } - // set new state - BOOL flag = noDelay ? 1 : 0; - size = sizeof(flag); - if (setsockopt_winsock(s->m_socket, IPPROTO_TCP, - TCP_NODELAY, &flag, size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + // set new state + BOOL flag = noDelay ? 1 : 0; + size = sizeof(flag); + if (setsockopt_winsock(s->m_socket, IPPROTO_TCP, + TCP_NODELAY, &flag, size) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } - return (oflag != 0); + return (oflag != 0); } bool ArchNetworkWinsock::setReuseAddrOnSocket(ArchSocket s, bool reuse) { - assert(s != NULL); + assert(s != NULL); - // get old state - BOOL oflag; - int size = sizeof(oflag); - if (getsockopt_winsock(s->m_socket, SOL_SOCKET, - SO_REUSEADDR, &oflag, &size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + // get old state + BOOL oflag; + int size = sizeof(oflag); + if (getsockopt_winsock(s->m_socket, SOL_SOCKET, + SO_REUSEADDR, &oflag, &size) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } - // set new state - BOOL flag = reuse ? 1 : 0; - size = sizeof(flag); - if (setsockopt_winsock(s->m_socket, SOL_SOCKET, - SO_REUSEADDR, &flag, size) == SOCKET_ERROR) { - throwError(getsockerror_winsock()); - } + // set new state + BOOL flag = reuse ? 1 : 0; + size = sizeof(flag); + if (setsockopt_winsock(s->m_socket, SOL_SOCKET, + SO_REUSEADDR, &flag, size) == SOCKET_ERROR) { + throwError(getsockerror_winsock()); + } - return (oflag != 0); + return (oflag != 0); } std::string ArchNetworkWinsock::getHostName() { - char name[256]; - if (gethostname_winsock(name, sizeof(name)) == -1) { - name[0] = '\0'; - } - else { - name[sizeof(name) - 1] = '\0'; - } - return name; + char name[256]; + if (gethostname_winsock(name, sizeof(name)) == -1) { + name[0] = '\0'; + } + else { + name[sizeof(name) - 1] = '\0'; + } + return name; } ArchNetAddress ArchNetworkWinsock::newAnyAddr(EAddressFamily family) { - ArchNetAddressImpl* addr = NULL; - switch (family) { - case kINET: { - addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); - struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); - ipAddr->sin_family = AF_INET; - ipAddr->sin_port = 0; - ipAddr->sin_addr.s_addr = INADDR_ANY; - break; - } + ArchNetAddressImpl* addr = NULL; + switch (family) { + case kINET: { + addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); + struct sockaddr_in* ipAddr = TYPED_ADDR(struct sockaddr_in, addr); + ipAddr->sin_family = AF_INET; + ipAddr->sin_port = 0; + ipAddr->sin_addr.s_addr = INADDR_ANY; + break; + } - default: - assert(0 && "invalid family"); - } - return addr; + default: + assert(0 && "invalid family"); + } + return addr; } ArchNetAddress ArchNetworkWinsock::copyAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - ArchNetAddressImpl* copy = ArchNetAddressImpl::alloc(addr->m_len); - memcpy(TYPED_ADDR(void, copy), TYPED_ADDR(void, addr), addr->m_len); - return copy; + ArchNetAddressImpl* copy = ArchNetAddressImpl::alloc(addr->m_len); + memcpy(TYPED_ADDR(void, copy), TYPED_ADDR(void, addr), addr->m_len); + return copy; } ArchNetAddress ArchNetworkWinsock::nameToAddr(const std::string& name) { - // allocate address - ArchNetAddressImpl* addr = NULL; + // allocate address + ArchNetAddressImpl* addr = NULL; - // try to convert assuming an IPv4 dot notation address - struct sockaddr_in inaddr; - memset(&inaddr, 0, sizeof(inaddr)); - inaddr.sin_family = AF_INET; - inaddr.sin_port = 0; - inaddr.sin_addr.s_addr = inet_addr_winsock(name.c_str()); - if (inaddr.sin_addr.s_addr != INADDR_NONE) { - // it's a dot notation address - addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); - memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); - } + // try to convert assuming an IPv4 dot notation address + struct sockaddr_in inaddr; + memset(&inaddr, 0, sizeof(inaddr)); + inaddr.sin_family = AF_INET; + inaddr.sin_port = 0; + inaddr.sin_addr.s_addr = inet_addr_winsock(name.c_str()); + if (inaddr.sin_addr.s_addr != INADDR_NONE) { + // it's a dot notation address + addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); + memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); + } - else { - // address lookup - struct hostent* info = gethostbyname_winsock(name.c_str()); - if (info == NULL) { - throwNameError(getsockerror_winsock()); - } + else { + // address lookup + struct hostent* info = gethostbyname_winsock(name.c_str()); + if (info == NULL) { + throwNameError(getsockerror_winsock()); + } - // copy over address (only IPv4 currently supported) - if (info->h_addrtype == AF_INET) { - addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); - memcpy(&inaddr.sin_addr, info->h_addr_list[0], - sizeof(inaddr.sin_addr)); - memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); - } - else { - throw XArchNetworkNameUnsupported( - "The requested name is valid but " - "does not have a supported address family"); - } - } + // copy over address (only IPv4 currently supported) + if (info->h_addrtype == AF_INET) { + addr = ArchNetAddressImpl::alloc(sizeof(struct sockaddr_in)); + memcpy(&inaddr.sin_addr, info->h_addr_list[0], + sizeof(inaddr.sin_addr)); + memcpy(TYPED_ADDR(void, addr), &inaddr, addr->m_len); + } + else { + throw XArchNetworkNameUnsupported( + "The requested name is valid but " + "does not have a supported address family"); + } + } - return addr; + return addr; } void ArchNetworkWinsock::closeAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - free(addr); + free(addr); } std::string ArchNetworkWinsock::addrToName(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - // name lookup - struct hostent* info = gethostbyaddr_winsock( - reinterpret_cast(&addr->m_addr), - addr->m_len, addr->m_addr.sa_family); - if (info == NULL) { - throwNameError(getsockerror_winsock()); - } + // name lookup + struct hostent* info = gethostbyaddr_winsock( + reinterpret_cast(&addr->m_addr), + addr->m_len, addr->m_addr.sa_family); + if (info == NULL) { + throwNameError(getsockerror_winsock()); + } - // return (primary) name - return info->h_name; + // return (primary) name + return info->h_name; } std::string ArchNetworkWinsock::addrToString(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - return inet_ntoa_winsock(ipAddr->sin_addr); - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + return inet_ntoa_winsock(ipAddr->sin_addr); + } - default: - assert(0 && "unknown address family"); - return ""; - } + default: + assert(0 && "unknown address family"); + return ""; + } } IArchNetwork::EAddressFamily ArchNetworkWinsock::getAddrFamily(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (addr->m_addr.sa_family) { - case AF_INET: - return kINET; + switch (addr->m_addr.sa_family) { + case AF_INET: + return kINET; - default: - return kUNKNOWN; - } + default: + return kUNKNOWN; + } } void ArchNetworkWinsock::setAddrPort(ArchNetAddress addr, int port) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - ipAddr->sin_port = htons_winsock(port); - break; - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + ipAddr->sin_port = htons_winsock(port); + break; + } - default: - assert(0 && "unknown address family"); - break; - } + default: + assert(0 && "unknown address family"); + break; + } } int ArchNetworkWinsock::getAddrPort(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - return ntohs_winsock(ipAddr->sin_port); - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + return ntohs_winsock(ipAddr->sin_port); + } - default: - assert(0 && "unknown address family"); - return 0; - } + default: + assert(0 && "unknown address family"); + return 0; + } } bool ArchNetworkWinsock::isAnyAddr(ArchNetAddress addr) { - assert(addr != NULL); + assert(addr != NULL); - switch (getAddrFamily(addr)) { - case kINET: { - struct sockaddr_in* ipAddr = - reinterpret_cast(&addr->m_addr); - return (addr->m_len == sizeof(struct sockaddr_in) && - ipAddr->sin_addr.s_addr == INADDR_ANY); - } + switch (getAddrFamily(addr)) { + case kINET: { + struct sockaddr_in* ipAddr = + reinterpret_cast(&addr->m_addr); + return (addr->m_len == sizeof(struct sockaddr_in) && + ipAddr->sin_addr.s_addr == INADDR_ANY); + } - default: - assert(0 && "unknown address family"); - return true; - } + default: + assert(0 && "unknown address family"); + return true; + } } bool ArchNetworkWinsock::isEqualAddr(ArchNetAddress a, ArchNetAddress b) { - return (a == b || (a->m_len == b->m_len && - memcmp(&a->m_addr, &b->m_addr, a->m_len) == 0)); + return (a == b || (a->m_len == b->m_len && + memcmp(&a->m_addr, &b->m_addr, a->m_len) == 0)); } void ArchNetworkWinsock::throwError(int err) { - switch (err) { - case WSAEACCES: - throw XArchNetworkAccess(new XArchEvalWinsock(err)); + switch (err) { + case WSAEACCES: + throw XArchNetworkAccess(new XArchEvalWinsock(err)); - case WSAEMFILE: - case WSAENOBUFS: - case WSAENETDOWN: - throw XArchNetworkResource(new XArchEvalWinsock(err)); + case WSAEMFILE: + case WSAENOBUFS: + case WSAENETDOWN: + throw XArchNetworkResource(new XArchEvalWinsock(err)); - case WSAEPROTOTYPE: - case WSAEPROTONOSUPPORT: - case WSAEAFNOSUPPORT: - case WSAEPFNOSUPPORT: - case WSAESOCKTNOSUPPORT: - case WSAEINVAL: - case WSAENOPROTOOPT: - case WSAEOPNOTSUPP: - case WSAESHUTDOWN: - case WSANOTINITIALISED: - case WSAVERNOTSUPPORTED: - case WSASYSNOTREADY: - throw XArchNetworkSupport(new XArchEvalWinsock(err)); + case WSAEPROTOTYPE: + case WSAEPROTONOSUPPORT: + case WSAEAFNOSUPPORT: + case WSAEPFNOSUPPORT: + case WSAESOCKTNOSUPPORT: + case WSAEINVAL: + case WSAENOPROTOOPT: + case WSAEOPNOTSUPP: + case WSAESHUTDOWN: + case WSANOTINITIALISED: + case WSAVERNOTSUPPORTED: + case WSASYSNOTREADY: + throw XArchNetworkSupport(new XArchEvalWinsock(err)); - case WSAEADDRNOTAVAIL: - throw XArchNetworkNoAddress(new XArchEvalWinsock(err)); + case WSAEADDRNOTAVAIL: + throw XArchNetworkNoAddress(new XArchEvalWinsock(err)); - case WSAEADDRINUSE: - throw XArchNetworkAddressInUse(new XArchEvalWinsock(err)); + case WSAEADDRINUSE: + throw XArchNetworkAddressInUse(new XArchEvalWinsock(err)); - case WSAEHOSTUNREACH: - case WSAENETUNREACH: - throw XArchNetworkNoRoute(new XArchEvalWinsock(err)); + case WSAEHOSTUNREACH: + case WSAENETUNREACH: + throw XArchNetworkNoRoute(new XArchEvalWinsock(err)); - case WSAENOTCONN: - throw XArchNetworkNotConnected(new XArchEvalWinsock(err)); + case WSAENOTCONN: + throw XArchNetworkNotConnected(new XArchEvalWinsock(err)); - case WSAEDISCON: - throw XArchNetworkShutdown(new XArchEvalWinsock(err)); + case WSAEDISCON: + throw XArchNetworkShutdown(new XArchEvalWinsock(err)); - case WSAENETRESET: - case WSAECONNABORTED: - case WSAECONNRESET: - throw XArchNetworkDisconnected(new XArchEvalWinsock(err)); + case WSAENETRESET: + case WSAECONNABORTED: + case WSAECONNRESET: + throw XArchNetworkDisconnected(new XArchEvalWinsock(err)); - case WSAECONNREFUSED: - throw XArchNetworkConnectionRefused(new XArchEvalWinsock(err)); + case WSAECONNREFUSED: + throw XArchNetworkConnectionRefused(new XArchEvalWinsock(err)); - case WSAEHOSTDOWN: - case WSAETIMEDOUT: - throw XArchNetworkTimedOut(new XArchEvalWinsock(err)); + case WSAEHOSTDOWN: + case WSAETIMEDOUT: + throw XArchNetworkTimedOut(new XArchEvalWinsock(err)); - case WSAHOST_NOT_FOUND: - throw XArchNetworkNameUnknown(new XArchEvalWinsock(err)); + case WSAHOST_NOT_FOUND: + throw XArchNetworkNameUnknown(new XArchEvalWinsock(err)); - case WSANO_DATA: - throw XArchNetworkNameNoAddress(new XArchEvalWinsock(err)); + case WSANO_DATA: + throw XArchNetworkNameNoAddress(new XArchEvalWinsock(err)); - case WSANO_RECOVERY: - throw XArchNetworkNameFailure(new XArchEvalWinsock(err)); + case WSANO_RECOVERY: + throw XArchNetworkNameFailure(new XArchEvalWinsock(err)); - case WSATRY_AGAIN: - throw XArchNetworkNameUnavailable(new XArchEvalWinsock(err)); + case WSATRY_AGAIN: + throw XArchNetworkNameUnavailable(new XArchEvalWinsock(err)); - default: - throw XArchNetwork(new XArchEvalWinsock(err)); - } + default: + throw XArchNetwork(new XArchEvalWinsock(err)); + } } void ArchNetworkWinsock::throwNameError(int err) { - switch (err) { - case WSAHOST_NOT_FOUND: - throw XArchNetworkNameUnknown(new XArchEvalWinsock(err)); + switch (err) { + case WSAHOST_NOT_FOUND: + throw XArchNetworkNameUnknown(new XArchEvalWinsock(err)); - case WSANO_DATA: - throw XArchNetworkNameNoAddress(new XArchEvalWinsock(err)); + case WSANO_DATA: + throw XArchNetworkNameNoAddress(new XArchEvalWinsock(err)); - case WSANO_RECOVERY: - throw XArchNetworkNameFailure(new XArchEvalWinsock(err)); + case WSANO_RECOVERY: + throw XArchNetworkNameFailure(new XArchEvalWinsock(err)); - case WSATRY_AGAIN: - throw XArchNetworkNameUnavailable(new XArchEvalWinsock(err)); + case WSATRY_AGAIN: + throw XArchNetworkNameUnavailable(new XArchEvalWinsock(err)); - default: - throw XArchNetworkName(new XArchEvalWinsock(err)); - } + default: + throw XArchNetworkName(new XArchEvalWinsock(err)); + } } diff --git a/src/lib/arch/win32/ArchNetworkWinsock.h b/src/lib/arch/win32/ArchNetworkWinsock.h index f2c2aee0..4c2e8573 100644 --- a/src/lib/arch/win32/ArchNetworkWinsock.h +++ b/src/lib/arch/win32/ArchNetworkWinsock.h @@ -34,73 +34,73 @@ class ArchSocketImpl { public: - SOCKET m_socket; - int m_refCount; - WSAEVENT m_event; - bool m_pollWrite; + SOCKET m_socket; + int m_refCount; + WSAEVENT m_event; + bool m_pollWrite; }; class ArchNetAddressImpl { public: - static ArchNetAddressImpl* alloc(size_t); + static ArchNetAddressImpl* alloc(size_t); public: - int m_len; - struct sockaddr m_addr; + int m_len; + struct sockaddr m_addr; }; -#define ADDR_HDR_SIZE offsetof(ArchNetAddressImpl, m_addr) +#define ADDR_HDR_SIZE offsetof(ArchNetAddressImpl, m_addr) #define TYPED_ADDR(type_, addr_) (reinterpret_cast(&addr_->m_addr)) //! Win32 implementation of IArchNetwork class ArchNetworkWinsock : public IArchNetwork { public: - ArchNetworkWinsock(); - virtual ~ArchNetworkWinsock(); + ArchNetworkWinsock(); + virtual ~ArchNetworkWinsock(); - virtual void init(); + virtual void init(); - // IArchNetwork overrides - virtual ArchSocket newSocket(EAddressFamily, ESocketType); - virtual ArchSocket copySocket(ArchSocket s); - virtual void closeSocket(ArchSocket s); - virtual void closeSocketForRead(ArchSocket s); - virtual void closeSocketForWrite(ArchSocket s); - virtual void bindSocket(ArchSocket s, ArchNetAddress addr); - virtual void listenOnSocket(ArchSocket s); - virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr); - virtual bool connectSocket(ArchSocket s, ArchNetAddress name); - virtual int pollSocket(PollEntry[], int num, double timeout); - virtual void unblockPollSocket(ArchThread thread); - virtual size_t readSocket(ArchSocket s, void* buf, size_t len); - virtual size_t writeSocket(ArchSocket s, - const void* buf, size_t len); - virtual void throwErrorOnSocket(ArchSocket); - virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay); - virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse); - virtual std::string getHostName(); - virtual ArchNetAddress newAnyAddr(EAddressFamily); - virtual ArchNetAddress copyAddr(ArchNetAddress); - virtual ArchNetAddress nameToAddr(const std::string&); - virtual void closeAddr(ArchNetAddress); - virtual std::string addrToName(ArchNetAddress); - virtual std::string addrToString(ArchNetAddress); - virtual EAddressFamily getAddrFamily(ArchNetAddress); - virtual void setAddrPort(ArchNetAddress, int port); - virtual int getAddrPort(ArchNetAddress); - virtual bool isAnyAddr(ArchNetAddress); - virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress); + // IArchNetwork overrides + virtual ArchSocket newSocket(EAddressFamily, ESocketType); + virtual ArchSocket copySocket(ArchSocket s); + virtual void closeSocket(ArchSocket s); + virtual void closeSocketForRead(ArchSocket s); + virtual void closeSocketForWrite(ArchSocket s); + virtual void bindSocket(ArchSocket s, ArchNetAddress addr); + virtual void listenOnSocket(ArchSocket s); + virtual ArchSocket acceptSocket(ArchSocket s, ArchNetAddress* addr); + virtual bool connectSocket(ArchSocket s, ArchNetAddress name); + virtual int pollSocket(PollEntry[], int num, double timeout); + virtual void unblockPollSocket(ArchThread thread); + virtual size_t readSocket(ArchSocket s, void* buf, size_t len); + virtual size_t writeSocket(ArchSocket s, + const void* buf, size_t len); + virtual void throwErrorOnSocket(ArchSocket); + virtual bool setNoDelayOnSocket(ArchSocket, bool noDelay); + virtual bool setReuseAddrOnSocket(ArchSocket, bool reuse); + virtual std::string getHostName(); + virtual ArchNetAddress newAnyAddr(EAddressFamily); + virtual ArchNetAddress copyAddr(ArchNetAddress); + virtual ArchNetAddress nameToAddr(const std::string&); + virtual void closeAddr(ArchNetAddress); + virtual std::string addrToName(ArchNetAddress); + virtual std::string addrToString(ArchNetAddress); + virtual EAddressFamily getAddrFamily(ArchNetAddress); + virtual void setAddrPort(ArchNetAddress, int port); + virtual int getAddrPort(ArchNetAddress); + virtual bool isAnyAddr(ArchNetAddress); + virtual bool isEqualAddr(ArchNetAddress, ArchNetAddress); private: - void initModule(HMODULE); + void initModule(HMODULE); - void setBlockingOnSocket(SOCKET, bool blocking); + void setBlockingOnSocket(SOCKET, bool blocking); - void throwError(int); - void throwNameError(int); + void throwError(int); + void throwNameError(int); private: - typedef std::list EventList; + typedef std::list EventList; - ArchMutex m_mutex; - EventList m_unblockEvents; + ArchMutex m_mutex; + EventList m_unblockEvents; }; diff --git a/src/lib/arch/win32/ArchSleepWindows.cpp b/src/lib/arch/win32/ArchSleepWindows.cpp index 6b1c9a71..67e48784 100644 --- a/src/lib/arch/win32/ArchSleepWindows.cpp +++ b/src/lib/arch/win32/ArchSleepWindows.cpp @@ -26,36 +26,36 @@ ArchSleepWindows::ArchSleepWindows() { - // do nothing + // do nothing } ArchSleepWindows::~ArchSleepWindows() { - // do nothing + // do nothing } void ArchSleepWindows::sleep(double timeout) { - ARCH->testCancelThread(); - if (timeout < 0.0) { - return; - } + ARCH->testCancelThread(); + if (timeout < 0.0) { + return; + } - // get the cancel event from the current thread. this only - // works if we're using the windows multithread object but - // this is windows so that's pretty certain; we'll get a - // link error if we're not, though. - ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); - if (mt != NULL) { - HANDLE cancelEvent = mt->getCancelEventForCurrentThread(); - WaitForSingleObject(cancelEvent, (DWORD)(1000.0 * timeout)); - if (timeout == 0.0) { - Sleep(0); - } - } - else { - Sleep((DWORD)(1000.0 * timeout)); - } - ARCH->testCancelThread(); + // get the cancel event from the current thread. this only + // works if we're using the windows multithread object but + // this is windows so that's pretty certain; we'll get a + // link error if we're not, though. + ArchMultithreadWindows* mt = ArchMultithreadWindows::getInstance(); + if (mt != NULL) { + HANDLE cancelEvent = mt->getCancelEventForCurrentThread(); + WaitForSingleObject(cancelEvent, (DWORD)(1000.0 * timeout)); + if (timeout == 0.0) { + Sleep(0); + } + } + else { + Sleep((DWORD)(1000.0 * timeout)); + } + ARCH->testCancelThread(); } diff --git a/src/lib/arch/win32/ArchSleepWindows.h b/src/lib/arch/win32/ArchSleepWindows.h index 957e06ef..d78cf6ed 100644 --- a/src/lib/arch/win32/ArchSleepWindows.h +++ b/src/lib/arch/win32/ArchSleepWindows.h @@ -25,9 +25,9 @@ //! Win32 implementation of IArchSleep class ArchSleepWindows : public IArchSleep { public: - ArchSleepWindows(); - virtual ~ArchSleepWindows(); + ArchSleepWindows(); + virtual ~ArchSleepWindows(); - // IArchSleep overrides - virtual void sleep(double timeout); + // IArchSleep overrides + virtual void sleep(double timeout); }; diff --git a/src/lib/arch/win32/ArchStringWindows.cpp b/src/lib/arch/win32/ArchStringWindows.cpp index a5736070..85ab66ca 100644 --- a/src/lib/arch/win32/ArchStringWindows.cpp +++ b/src/lib/arch/win32/ArchStringWindows.cpp @@ -42,5 +42,5 @@ ArchStringWindows::~ArchStringWindows() IArchString::EWideCharEncoding ArchStringWindows::getWideCharEncoding() { - return kUTF16; + return kUTF16; } diff --git a/src/lib/arch/win32/ArchStringWindows.h b/src/lib/arch/win32/ArchStringWindows.h index db943b95..c273cd67 100644 --- a/src/lib/arch/win32/ArchStringWindows.h +++ b/src/lib/arch/win32/ArchStringWindows.h @@ -25,10 +25,10 @@ //! Win32 implementation of IArchString class ArchStringWindows : public IArchString { public: - ArchStringWindows(); - virtual ~ArchStringWindows(); + ArchStringWindows(); + virtual ~ArchStringWindows(); - // IArchString overrides - virtual EWideCharEncoding - getWideCharEncoding(); + // IArchString overrides + virtual EWideCharEncoding + getWideCharEncoding(); }; diff --git a/src/lib/arch/win32/ArchSystemWindows.cpp b/src/lib/arch/win32/ArchSystemWindows.cpp index a415ad44..d63ba336 100644 --- a/src/lib/arch/win32/ArchSystemWindows.cpp +++ b/src/lib/arch/win32/ArchSystemWindows.cpp @@ -27,9 +27,9 @@ #include static const char* s_settingsKeyNames[] = { - _T("SOFTWARE"), - _T("Synergy"), - NULL + _T("SOFTWARE"), + _T("Synergy"), + NULL }; // @@ -38,52 +38,52 @@ static const char* s_settingsKeyNames[] = { ArchSystemWindows::ArchSystemWindows() { - // do nothing + // do nothing } ArchSystemWindows::~ArchSystemWindows() { - // do nothing + // do nothing } std::string ArchSystemWindows::getOSName() const { - std::string osName ("Microsoft Windows "); - static const TCHAR* const windowsVersionKeyNames[] = { - _T("SOFTWARE"), - _T("Microsoft"), - _T("Windows NT"), - _T("CurrentVersion"), - NULL - }; + std::string osName ("Microsoft Windows "); + static const TCHAR* const windowsVersionKeyNames[] = { + _T("SOFTWARE"), + _T("Microsoft"), + _T("Windows NT"), + _T("CurrentVersion"), + NULL + }; - HKEY key = ArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, windowsVersionKeyNames); - if (key == NULL) { - return osName; - } + HKEY key = ArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, windowsVersionKeyNames); + if (key == NULL) { + return osName; + } - std::string productName = ArchMiscWindows::readValueString(key, "ProductName"); - if (osName.empty()) { - return osName; - } + std::string productName = ArchMiscWindows::readValueString(key, "ProductName"); + if (osName.empty()) { + return osName; + } - return "Microsoft " + productName; + return "Microsoft " + productName; } std::string ArchSystemWindows::getPlatformName() const { #ifdef _X86_ - if (isWOW64()) - return "x86 (WOW64)"; - else - return "x86"; + if (isWOW64()) + return "x86 (WOW64)"; + else + return "x86"; #else #ifdef _AMD64_ - return "x64"; + return "x64"; #else - return "Unknown"; + return "Unknown"; #endif #endif } @@ -91,42 +91,42 @@ ArchSystemWindows::getPlatformName() const std::string ArchSystemWindows::setting(const std::string& valueName) const { - HKEY key = ArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, s_settingsKeyNames); - if (key == NULL) - return ""; + HKEY key = ArchMiscWindows::openKey(HKEY_LOCAL_MACHINE, s_settingsKeyNames); + if (key == NULL) + return ""; - return ArchMiscWindows::readValueString(key, valueName.c_str()); + return ArchMiscWindows::readValueString(key, valueName.c_str()); } void ArchSystemWindows::setting(const std::string& valueName, const std::string& valueString) const { - HKEY key = ArchMiscWindows::addKey(HKEY_LOCAL_MACHINE, s_settingsKeyNames); - if (key == NULL) - throw XArch(std::string("could not access registry key: ") + valueName); - ArchMiscWindows::setValue(key, valueName.c_str(), valueString.c_str()); + HKEY key = ArchMiscWindows::addKey(HKEY_LOCAL_MACHINE, s_settingsKeyNames); + if (key == NULL) + throw XArch(std::string("could not access registry key: ") + valueName); + ArchMiscWindows::setValue(key, valueName.c_str(), valueString.c_str()); } bool ArchSystemWindows::isWOW64() const { #if WINVER >= _WIN32_WINNT_WINXP - typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - HMODULE hModule = GetModuleHandle(TEXT("kernel32")); - if (!hModule) return FALSE; + typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + HMODULE hModule = GetModuleHandle(TEXT("kernel32")); + if (!hModule) return FALSE; - LPFN_ISWOW64PROCESS fnIsWow64Process = - (LPFN_ISWOW64PROCESS) GetProcAddress(hModule, "IsWow64Process"); + LPFN_ISWOW64PROCESS fnIsWow64Process = + (LPFN_ISWOW64PROCESS) GetProcAddress(hModule, "IsWow64Process"); - BOOL bIsWow64 = FALSE; - if (NULL != fnIsWow64Process && - fnIsWow64Process(GetCurrentProcess(), &bIsWow64) && - bIsWow64) - { - return true; - } + BOOL bIsWow64 = FALSE; + if (NULL != fnIsWow64Process && + fnIsWow64Process(GetCurrentProcess(), &bIsWow64) && + bIsWow64) + { + return true; + } #endif - return false; + return false; } #pragma comment(lib, "psapi") @@ -137,26 +137,26 @@ ArchSystemWindows::getLibsUsed(void) const HANDLE hProcess; DWORD cbNeeded; unsigned int i; - char hex[16]; + char hex[16]; - DWORD pid = GetCurrentProcessId(); + DWORD pid = GetCurrentProcessId(); - std::string msg = "pid:" + std::to_string((_ULonglong)pid) + "\n"; + std::string msg = "pid:" + std::to_string((_ULonglong)pid) + "\n"; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if (NULL == hProcess) { return msg; - } + } if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) { TCHAR szModName[MAX_PATH]; if (GetModuleFileNameEx(hProcess, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) { - sprintf(hex, "(0x%08llX)", reinterpret_cast(hMods[i])); - msg += szModName; - msg.append(hex); - msg.append("\n"); + sprintf(hex, "(0x%08llX)", reinterpret_cast(hMods[i])); + msg += szModName; + msg.append(hex); + msg.append("\n"); } } } diff --git a/src/lib/arch/win32/ArchSystemWindows.h b/src/lib/arch/win32/ArchSystemWindows.h index ed6fcd52..0d3df4ac 100644 --- a/src/lib/arch/win32/ArchSystemWindows.h +++ b/src/lib/arch/win32/ArchSystemWindows.h @@ -25,15 +25,15 @@ //! Win32 implementation of IArchString class ArchSystemWindows : public IArchSystem { public: - ArchSystemWindows(); - virtual ~ArchSystemWindows(); + ArchSystemWindows(); + virtual ~ArchSystemWindows(); - // IArchSystem overrides - virtual std::string getOSName() const; - virtual std::string getPlatformName() const; - virtual std::string setting(const std::string& valueName) const; - virtual void setting(const std::string& valueName, const std::string& valueString) const; - virtual std::string getLibsUsed(void) const; + // IArchSystem overrides + virtual std::string getOSName() const; + virtual std::string getPlatformName() const; + virtual std::string setting(const std::string& valueName) const; + virtual void setting(const std::string& valueName, const std::string& valueString) const; + virtual std::string getLibsUsed(void) const; - bool isWOW64() const; + bool isWOW64() const; }; diff --git a/src/lib/arch/win32/ArchTaskBarWindows.cpp b/src/lib/arch/win32/ArchTaskBarWindows.cpp index f87a595b..3ec3b21b 100644 --- a/src/lib/arch/win32/ArchTaskBarWindows.cpp +++ b/src/lib/arch/win32/ArchTaskBarWindows.cpp @@ -26,485 +26,485 @@ #include #include -static const UINT kAddReceiver = WM_USER + 10; -static const UINT kRemoveReceiver = WM_USER + 11; -static const UINT kUpdateReceiver = WM_USER + 12; -static const UINT kNotifyReceiver = WM_USER + 13; -static const UINT kFirstReceiverID = WM_USER + 14; +static const UINT kAddReceiver = WM_USER + 10; +static const UINT kRemoveReceiver = WM_USER + 11; +static const UINT kUpdateReceiver = WM_USER + 12; +static const UINT kNotifyReceiver = WM_USER + 13; +static const UINT kFirstReceiverID = WM_USER + 14; // // ArchTaskBarWindows // -ArchTaskBarWindows* ArchTaskBarWindows::s_instance = NULL; +ArchTaskBarWindows* ArchTaskBarWindows::s_instance = NULL; ArchTaskBarWindows::ArchTaskBarWindows() : - m_nextID(kFirstReceiverID), - m_thread(NULL), - m_condVar(NULL), - m_mutex(NULL) + m_nextID(kFirstReceiverID), + m_thread(NULL), + m_condVar(NULL), + m_mutex(NULL) { - // save the singleton instance - s_instance = this; + // save the singleton instance + s_instance = this; } ArchTaskBarWindows::~ArchTaskBarWindows() { - if (m_thread != NULL) { - PostMessage(m_hwnd, WM_QUIT, 0, 0); - ARCH->wait(m_thread, -1.0); - ARCH->closeThread(m_thread); - } - if (m_condVar != NULL) { - ARCH->closeCondVar(m_condVar); - } - if (m_mutex != NULL) { - ARCH->closeMutex(m_mutex); - } - s_instance = NULL; + if (m_thread != NULL) { + PostMessage(m_hwnd, WM_QUIT, 0, 0); + ARCH->wait(m_thread, -1.0); + ARCH->closeThread(m_thread); + } + if (m_condVar != NULL) { + ARCH->closeCondVar(m_condVar); + } + if (m_mutex != NULL) { + ARCH->closeMutex(m_mutex); + } + s_instance = NULL; } void ArchTaskBarWindows::init() { - // we need a mutex - m_mutex = ARCH->newMutex(); + // we need a mutex + m_mutex = ARCH->newMutex(); - // and a condition variable which uses the above mutex - m_ready = false; - m_condVar = ARCH->newCondVar(); + // and a condition variable which uses the above mutex + m_ready = false; + m_condVar = ARCH->newCondVar(); - // we're going to want to get a result from the thread we're - // about to create to know if it initialized successfully. - // so we lock the condition variable. - ARCH->lockMutex(m_mutex); + // we're going to want to get a result from the thread we're + // about to create to know if it initialized successfully. + // so we lock the condition variable. + ARCH->lockMutex(m_mutex); - // open a window and run an event loop in a separate thread. - // this has to happen in a separate thread because if we - // create a window on the current desktop with the current - // thread then the current thread won't be able to switch - // desktops if it needs to. - m_thread = ARCH->newThread(&ArchTaskBarWindows::threadEntry, this); + // open a window and run an event loop in a separate thread. + // this has to happen in a separate thread because if we + // create a window on the current desktop with the current + // thread then the current thread won't be able to switch + // desktops if it needs to. + m_thread = ARCH->newThread(&ArchTaskBarWindows::threadEntry, this); - // wait for child thread - while (!m_ready) { - ARCH->waitCondVar(m_condVar, m_mutex, -1.0); - } + // wait for child thread + while (!m_ready) { + ARCH->waitCondVar(m_condVar, m_mutex, -1.0); + } - // ready - ARCH->unlockMutex(m_mutex); + // ready + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::addDialog(HWND hwnd) { - ArchMiscWindows::addDialog(hwnd); + ArchMiscWindows::addDialog(hwnd); } void ArchTaskBarWindows::removeDialog(HWND hwnd) { - ArchMiscWindows::removeDialog(hwnd); + ArchMiscWindows::removeDialog(hwnd); } void ArchTaskBarWindows::addReceiver(IArchTaskBarReceiver* receiver) { - // ignore bogus receiver - if (receiver == NULL) { - return; - } + // ignore bogus receiver + if (receiver == NULL) { + return; + } - // add receiver if necessary - ReceiverToInfoMap::iterator index = m_receivers.find(receiver); - if (index == m_receivers.end()) { - // add it, creating a new message ID for it - ReceiverInfo info; - info.m_id = getNextID(); - index = m_receivers.insert(std::make_pair(receiver, info)).first; + // add receiver if necessary + ReceiverToInfoMap::iterator index = m_receivers.find(receiver); + if (index == m_receivers.end()) { + // add it, creating a new message ID for it + ReceiverInfo info; + info.m_id = getNextID(); + index = m_receivers.insert(std::make_pair(receiver, info)).first; - // add ID to receiver mapping - m_idTable.insert(std::make_pair(info.m_id, index)); - } + // add ID to receiver mapping + m_idTable.insert(std::make_pair(info.m_id, index)); + } - // add receiver - PostMessage(m_hwnd, kAddReceiver, index->second.m_id, 0); + // add receiver + PostMessage(m_hwnd, kAddReceiver, index->second.m_id, 0); } void ArchTaskBarWindows::removeReceiver(IArchTaskBarReceiver* receiver) { - // find receiver - ReceiverToInfoMap::iterator index = m_receivers.find(receiver); - if (index == m_receivers.end()) { - return; - } + // find receiver + ReceiverToInfoMap::iterator index = m_receivers.find(receiver); + if (index == m_receivers.end()) { + return; + } - // remove icon. wait for this to finish before returning. - SendMessage(m_hwnd, kRemoveReceiver, index->second.m_id, 0); + // remove icon. wait for this to finish before returning. + SendMessage(m_hwnd, kRemoveReceiver, index->second.m_id, 0); - // recycle the ID - recycleID(index->second.m_id); + // recycle the ID + recycleID(index->second.m_id); - // discard - m_idTable.erase(index->second.m_id); - m_receivers.erase(index); + // discard + m_idTable.erase(index->second.m_id); + m_receivers.erase(index); } void ArchTaskBarWindows::updateReceiver(IArchTaskBarReceiver* receiver) { - // find receiver - ReceiverToInfoMap::const_iterator index = m_receivers.find(receiver); - if (index == m_receivers.end()) { - return; - } + // find receiver + ReceiverToInfoMap::const_iterator index = m_receivers.find(receiver); + if (index == m_receivers.end()) { + return; + } - // update icon and tool tip - PostMessage(m_hwnd, kUpdateReceiver, index->second.m_id, 0); + // update icon and tool tip + PostMessage(m_hwnd, kUpdateReceiver, index->second.m_id, 0); } UINT ArchTaskBarWindows::getNextID() { - if (m_oldIDs.empty()) { - return m_nextID++; - } - UINT id = m_oldIDs.back(); - m_oldIDs.pop_back(); - return id; + if (m_oldIDs.empty()) { + return m_nextID++; + } + UINT id = m_oldIDs.back(); + m_oldIDs.pop_back(); + return id; } void ArchTaskBarWindows::recycleID(UINT id) { - m_oldIDs.push_back(id); + m_oldIDs.push_back(id); } void ArchTaskBarWindows::addIcon(UINT id) { - ARCH->lockMutex(m_mutex); - CIDToReceiverMap::const_iterator index = m_idTable.find(id); - if (index != m_idTable.end()) { - modifyIconNoLock(index->second, NIM_ADD); - } - ARCH->unlockMutex(m_mutex); + ARCH->lockMutex(m_mutex); + CIDToReceiverMap::const_iterator index = m_idTable.find(id); + if (index != m_idTable.end()) { + modifyIconNoLock(index->second, NIM_ADD); + } + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::removeIcon(UINT id) { - ARCH->lockMutex(m_mutex); - removeIconNoLock(id); - ARCH->unlockMutex(m_mutex); + ARCH->lockMutex(m_mutex); + removeIconNoLock(id); + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::updateIcon(UINT id) { - ARCH->lockMutex(m_mutex); - CIDToReceiverMap::const_iterator index = m_idTable.find(id); - if (index != m_idTable.end()) { - modifyIconNoLock(index->second, NIM_MODIFY); - } - ARCH->unlockMutex(m_mutex); + ARCH->lockMutex(m_mutex); + CIDToReceiverMap::const_iterator index = m_idTable.find(id); + if (index != m_idTable.end()) { + modifyIconNoLock(index->second, NIM_MODIFY); + } + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::addAllIcons() { - ARCH->lockMutex(m_mutex); - for (ReceiverToInfoMap::const_iterator index = m_receivers.begin(); - index != m_receivers.end(); ++index) { - modifyIconNoLock(index, NIM_ADD); - } - ARCH->unlockMutex(m_mutex); + ARCH->lockMutex(m_mutex); + for (ReceiverToInfoMap::const_iterator index = m_receivers.begin(); + index != m_receivers.end(); ++index) { + modifyIconNoLock(index, NIM_ADD); + } + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::removeAllIcons() { - ARCH->lockMutex(m_mutex); - for (ReceiverToInfoMap::const_iterator index = m_receivers.begin(); - index != m_receivers.end(); ++index) { - removeIconNoLock(index->second.m_id); - } - ARCH->unlockMutex(m_mutex); + ARCH->lockMutex(m_mutex); + for (ReceiverToInfoMap::const_iterator index = m_receivers.begin(); + index != m_receivers.end(); ++index) { + removeIconNoLock(index->second.m_id); + } + ARCH->unlockMutex(m_mutex); } void ArchTaskBarWindows::modifyIconNoLock( - ReceiverToInfoMap::const_iterator index, DWORD taskBarMessage) + ReceiverToInfoMap::const_iterator index, DWORD taskBarMessage) { - // get receiver - UINT id = index->second.m_id; - IArchTaskBarReceiver* receiver = index->first; + // get receiver + UINT id = index->second.m_id; + IArchTaskBarReceiver* receiver = index->first; - // lock receiver so icon and tool tip are guaranteed to be consistent - receiver->lock(); + // lock receiver so icon and tool tip are guaranteed to be consistent + receiver->lock(); - // get icon data - HICON icon = static_cast( - const_cast(receiver->getIcon())); + // get icon data + HICON icon = static_cast( + const_cast(receiver->getIcon())); - // get tool tip - std::string toolTip = receiver->getToolTip(); + // get tool tip + std::string toolTip = receiver->getToolTip(); - // done querying - receiver->unlock(); + // done querying + receiver->unlock(); - // prepare to add icon - NOTIFYICONDATA data; - data.cbSize = sizeof(NOTIFYICONDATA); - data.hWnd = m_hwnd; - data.uID = id; - data.uFlags = NIF_MESSAGE; - data.uCallbackMessage = kNotifyReceiver; - data.hIcon = icon; - if (icon != NULL) { - data.uFlags |= NIF_ICON; - } - if (!toolTip.empty()) { - strncpy(data.szTip, toolTip.c_str(), sizeof(data.szTip)); - data.szTip[sizeof(data.szTip) - 1] = '\0'; - data.uFlags |= NIF_TIP; - } - else { - data.szTip[0] = '\0'; - } + // prepare to add icon + NOTIFYICONDATA data; + data.cbSize = sizeof(NOTIFYICONDATA); + data.hWnd = m_hwnd; + data.uID = id; + data.uFlags = NIF_MESSAGE; + data.uCallbackMessage = kNotifyReceiver; + data.hIcon = icon; + if (icon != NULL) { + data.uFlags |= NIF_ICON; + } + if (!toolTip.empty()) { + strncpy(data.szTip, toolTip.c_str(), sizeof(data.szTip)); + data.szTip[sizeof(data.szTip) - 1] = '\0'; + data.uFlags |= NIF_TIP; + } + else { + data.szTip[0] = '\0'; + } - // add icon - if (Shell_NotifyIcon(taskBarMessage, &data) == 0) { - // failed - } + // add icon + if (Shell_NotifyIcon(taskBarMessage, &data) == 0) { + // failed + } } void ArchTaskBarWindows::removeIconNoLock(UINT id) { - NOTIFYICONDATA data; - data.cbSize = sizeof(NOTIFYICONDATA); - data.hWnd = m_hwnd; - data.uID = id; - if (Shell_NotifyIcon(NIM_DELETE, &data) == 0) { - // failed - } + NOTIFYICONDATA data; + data.cbSize = sizeof(NOTIFYICONDATA); + data.hWnd = m_hwnd; + data.uID = id; + if (Shell_NotifyIcon(NIM_DELETE, &data) == 0) { + // failed + } } void ArchTaskBarWindows::handleIconMessage( - IArchTaskBarReceiver* receiver, LPARAM lParam) + IArchTaskBarReceiver* receiver, LPARAM lParam) { - // process message - switch (lParam) { - case WM_LBUTTONDOWN: - receiver->showStatus(); - break; + // process message + switch (lParam) { + case WM_LBUTTONDOWN: + receiver->showStatus(); + break; - case WM_LBUTTONDBLCLK: - receiver->primaryAction(); - break; + case WM_LBUTTONDBLCLK: + receiver->primaryAction(); + break; - case WM_RBUTTONUP: { - POINT p; - GetCursorPos(&p); - receiver->runMenu(p.x, p.y); - break; - } + case WM_RBUTTONUP: { + POINT p; + GetCursorPos(&p); + receiver->runMenu(p.x, p.y); + break; + } - case WM_MOUSEMOVE: - // currently unused - break; + case WM_MOUSEMOVE: + // currently unused + break; - default: - // unused - break; - } + default: + // unused + break; + } } bool ArchTaskBarWindows::processDialogs(MSG* msg) { - // only one thread can be in this method on any particular object - // at any given time. that's not a problem since only our event - // loop calls this method and there's just one of those. + // only one thread can be in this method on any particular object + // at any given time. that's not a problem since only our event + // loop calls this method and there's just one of those. - ARCH->lockMutex(m_mutex); + ARCH->lockMutex(m_mutex); - // remove removed dialogs - m_dialogs.erase(false); + // remove removed dialogs + m_dialogs.erase(false); - // merge added dialogs into the dialog list - for (Dialogs::const_iterator index = m_addedDialogs.begin(); - index != m_addedDialogs.end(); ++index) { - m_dialogs.insert(std::make_pair(index->first, index->second)); - } - m_addedDialogs.clear(); + // merge added dialogs into the dialog list + for (Dialogs::const_iterator index = m_addedDialogs.begin(); + index != m_addedDialogs.end(); ++index) { + m_dialogs.insert(std::make_pair(index->first, index->second)); + } + m_addedDialogs.clear(); - ARCH->unlockMutex(m_mutex); + ARCH->unlockMutex(m_mutex); - // check message against all dialogs until one handles it. - // note that we don't hold a lock while checking because - // the message is processed and may make calls to this - // object. that's okay because addDialog() and - // removeDialog() don't change the map itself (just the - // values of some elements). - ARCH->lockMutex(m_mutex); - for (Dialogs::const_iterator index = m_dialogs.begin(); - index != m_dialogs.end(); ++index) { - if (index->second) { - ARCH->unlockMutex(m_mutex); - if (IsDialogMessage(index->first, msg)) { - return true; - } - ARCH->lockMutex(m_mutex); - } - } - ARCH->unlockMutex(m_mutex); + // check message against all dialogs until one handles it. + // note that we don't hold a lock while checking because + // the message is processed and may make calls to this + // object. that's okay because addDialog() and + // removeDialog() don't change the map itself (just the + // values of some elements). + ARCH->lockMutex(m_mutex); + for (Dialogs::const_iterator index = m_dialogs.begin(); + index != m_dialogs.end(); ++index) { + if (index->second) { + ARCH->unlockMutex(m_mutex); + if (IsDialogMessage(index->first, msg)) { + return true; + } + ARCH->lockMutex(m_mutex); + } + } + ARCH->unlockMutex(m_mutex); - return false; + return false; } LRESULT ArchTaskBarWindows::wndProc(HWND hwnd, - UINT msg, WPARAM wParam, LPARAM lParam) + UINT msg, WPARAM wParam, LPARAM lParam) { - switch (msg) { - case kNotifyReceiver: { - // lookup receiver - CIDToReceiverMap::const_iterator index = m_idTable.find((UINT)wParam); - if (index != m_idTable.end()) { - IArchTaskBarReceiver* receiver = index->second->first; - handleIconMessage(receiver, lParam); - return 0; - } - break; - } + switch (msg) { + case kNotifyReceiver: { + // lookup receiver + CIDToReceiverMap::const_iterator index = m_idTable.find((UINT)wParam); + if (index != m_idTable.end()) { + IArchTaskBarReceiver* receiver = index->second->first; + handleIconMessage(receiver, lParam); + return 0; + } + break; + } - case kAddReceiver: - addIcon((UINT)wParam); - break; + case kAddReceiver: + addIcon((UINT)wParam); + break; - case kRemoveReceiver: - removeIcon((UINT)wParam); - break; + case kRemoveReceiver: + removeIcon((UINT)wParam); + break; - case kUpdateReceiver: - updateIcon((UINT)wParam); - break; + case kUpdateReceiver: + updateIcon((UINT)wParam); + break; - default: - if (msg == m_taskBarRestart) { - // task bar was recreated so re-add our icons - addAllIcons(); - } - break; - } + default: + if (msg == m_taskBarRestart) { + // task bar was recreated so re-add our icons + addAllIcons(); + } + break; + } - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProc(hwnd, msg, wParam, lParam); } LRESULT CALLBACK ArchTaskBarWindows::staticWndProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) + WPARAM wParam, LPARAM lParam) { - // if msg is WM_NCCREATE, extract the ArchTaskBarWindows* and put - // it in the extra window data then forward the call. - ArchTaskBarWindows* self = NULL; - if (msg == WM_NCCREATE) { - CREATESTRUCT* createInfo; - createInfo = reinterpret_cast(lParam); - self = static_cast( - createInfo->lpCreateParams); - SetWindowLongPtr(hwnd, 0, reinterpret_cast(createInfo->lpCreateParams)); - } - else { - // get the extra window data and forward the call - LONG_PTR data = GetWindowLongPtr(hwnd, 0); - if (data != 0) { - self = static_cast(reinterpret_cast(data)); - } - } + // if msg is WM_NCCREATE, extract the ArchTaskBarWindows* and put + // it in the extra window data then forward the call. + ArchTaskBarWindows* self = NULL; + if (msg == WM_NCCREATE) { + CREATESTRUCT* createInfo; + createInfo = reinterpret_cast(lParam); + self = static_cast( + createInfo->lpCreateParams); + SetWindowLongPtr(hwnd, 0, reinterpret_cast(createInfo->lpCreateParams)); + } + else { + // get the extra window data and forward the call + LONG_PTR data = GetWindowLongPtr(hwnd, 0); + if (data != 0) { + self = static_cast(reinterpret_cast(data)); + } + } - // forward the message - if (self != NULL) { - return self->wndProc(hwnd, msg, wParam, lParam); - } - else { - return DefWindowProc(hwnd, msg, wParam, lParam); - } + // forward the message + if (self != NULL) { + return self->wndProc(hwnd, msg, wParam, lParam); + } + else { + return DefWindowProc(hwnd, msg, wParam, lParam); + } } void ArchTaskBarWindows::threadMainLoop() { - // register the task bar restart message - m_taskBarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); + // register the task bar restart message + m_taskBarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); - // register a window class - LPCTSTR className = TEXT("SynergyTaskBar"); - WNDCLASSEX classInfo; - classInfo.cbSize = sizeof(classInfo); - classInfo.style = CS_NOCLOSE; - classInfo.lpfnWndProc = &ArchTaskBarWindows::staticWndProc; - classInfo.cbClsExtra = 0; - classInfo.cbWndExtra = sizeof(ArchTaskBarWindows*); - classInfo.hInstance = instanceWin32(); - classInfo.hIcon = NULL; - classInfo.hCursor = NULL; - classInfo.hbrBackground = NULL; - classInfo.lpszMenuName = NULL; - classInfo.lpszClassName = className; - classInfo.hIconSm = NULL; - ATOM windowClass = RegisterClassEx(&classInfo); + // register a window class + LPCTSTR className = TEXT("SynergyTaskBar"); + WNDCLASSEX classInfo; + classInfo.cbSize = sizeof(classInfo); + classInfo.style = CS_NOCLOSE; + classInfo.lpfnWndProc = &ArchTaskBarWindows::staticWndProc; + classInfo.cbClsExtra = 0; + classInfo.cbWndExtra = sizeof(ArchTaskBarWindows*); + classInfo.hInstance = instanceWin32(); + classInfo.hIcon = NULL; + classInfo.hCursor = NULL; + classInfo.hbrBackground = NULL; + classInfo.lpszMenuName = NULL; + classInfo.lpszClassName = className; + classInfo.hIconSm = NULL; + ATOM windowClass = RegisterClassEx(&classInfo); - // create window - m_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, - className, - TEXT("Synergy Task Bar"), - WS_POPUP, - 0, 0, 1, 1, - NULL, - NULL, - instanceWin32(), - static_cast(this)); + // create window + m_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, + className, + TEXT("Synergy Task Bar"), + WS_POPUP, + 0, 0, 1, 1, + NULL, + NULL, + instanceWin32(), + static_cast(this)); - // signal ready - ARCH->lockMutex(m_mutex); - m_ready = true; - ARCH->broadcastCondVar(m_condVar); - ARCH->unlockMutex(m_mutex); + // signal ready + ARCH->lockMutex(m_mutex); + m_ready = true; + ARCH->broadcastCondVar(m_condVar); + ARCH->unlockMutex(m_mutex); - // handle failure - if (m_hwnd == NULL) { - UnregisterClass(className, instanceWin32()); - return; - } + // handle failure + if (m_hwnd == NULL) { + UnregisterClass(className, instanceWin32()); + return; + } - // main loop - MSG msg; - while (GetMessage(&msg, NULL, 0, 0)) { - if (!processDialogs(&msg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } + // main loop + MSG msg; + while (GetMessage(&msg, NULL, 0, 0)) { + if (!processDialogs(&msg)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } - // clean up - removeAllIcons(); - DestroyWindow(m_hwnd); - UnregisterClass(className, instanceWin32()); + // clean up + removeAllIcons(); + DestroyWindow(m_hwnd); + UnregisterClass(className, instanceWin32()); } void* ArchTaskBarWindows::threadEntry(void* self) { - static_cast(self)->threadMainLoop(); - return NULL; + static_cast(self)->threadMainLoop(); + return NULL; } HINSTANCE ArchTaskBarWindows::instanceWin32() { - return ArchMiscWindows::instanceWin32(); + return ArchMiscWindows::instanceWin32(); } \ No newline at end of file diff --git a/src/lib/arch/win32/ArchTaskBarWindows.h b/src/lib/arch/win32/ArchTaskBarWindows.h index b6de6eb2..2df7f46d 100644 --- a/src/lib/arch/win32/ArchTaskBarWindows.h +++ b/src/lib/arch/win32/ArchTaskBarWindows.h @@ -31,84 +31,84 @@ //! Win32 implementation of IArchTaskBar class ArchTaskBarWindows : public IArchTaskBar { public: - ArchTaskBarWindows(); - virtual ~ArchTaskBarWindows(); + ArchTaskBarWindows(); + virtual ~ArchTaskBarWindows(); - virtual void init(); + virtual void init(); - //! Add a dialog window - /*! - Tell the task bar event loop about a dialog. Win32 annoyingly - requires messages destined for modeless dialog boxes to be - dispatched differently than other messages. - */ - static void addDialog(HWND); + //! Add a dialog window + /*! + Tell the task bar event loop about a dialog. Win32 annoyingly + requires messages destined for modeless dialog boxes to be + dispatched differently than other messages. + */ + static void addDialog(HWND); - //! Remove a dialog window - /*! - Remove a dialog window added via \c addDialog(). - */ - static void removeDialog(HWND); + //! Remove a dialog window + /*! + Remove a dialog window added via \c addDialog(). + */ + static void removeDialog(HWND); - // IArchTaskBar overrides - virtual void addReceiver(IArchTaskBarReceiver*); - virtual void removeReceiver(IArchTaskBarReceiver*); - virtual void updateReceiver(IArchTaskBarReceiver*); + // IArchTaskBar overrides + virtual void addReceiver(IArchTaskBarReceiver*); + virtual void removeReceiver(IArchTaskBarReceiver*); + virtual void updateReceiver(IArchTaskBarReceiver*); private: - class ReceiverInfo { - public: - UINT m_id; - }; + class ReceiverInfo { + public: + UINT m_id; + }; - typedef std::map ReceiverToInfoMap; - typedef std::map CIDToReceiverMap; - typedef std::vector CIDStack; - typedef std::map Dialogs; + typedef std::map ReceiverToInfoMap; + typedef std::map CIDToReceiverMap; + typedef std::vector CIDStack; + typedef std::map Dialogs; - UINT getNextID(); - void recycleID(UINT); + UINT getNextID(); + void recycleID(UINT); - void addIcon(UINT); - void removeIcon(UINT); - void updateIcon(UINT); - void addAllIcons(); - void removeAllIcons(); - void modifyIconNoLock(ReceiverToInfoMap::const_iterator, - DWORD taskBarMessage); - void removeIconNoLock(UINT id); - void handleIconMessage(IArchTaskBarReceiver*, LPARAM); + void addIcon(UINT); + void removeIcon(UINT); + void updateIcon(UINT); + void addAllIcons(); + void removeAllIcons(); + void modifyIconNoLock(ReceiverToInfoMap::const_iterator, + DWORD taskBarMessage); + void removeIconNoLock(UINT id); + void handleIconMessage(IArchTaskBarReceiver*, LPARAM); - bool processDialogs(MSG*); - LRESULT wndProc(HWND, UINT, WPARAM, LPARAM); - static LRESULT CALLBACK - staticWndProc(HWND, UINT, WPARAM, LPARAM); - void threadMainLoop(); - static void* threadEntry(void*); + bool processDialogs(MSG*); + LRESULT wndProc(HWND, UINT, WPARAM, LPARAM); + static LRESULT CALLBACK + staticWndProc(HWND, UINT, WPARAM, LPARAM); + void threadMainLoop(); + static void* threadEntry(void*); - HINSTANCE instanceWin32(); + HINSTANCE instanceWin32(); private: - static ArchTaskBarWindows* s_instance; + static ArchTaskBarWindows* s_instance; - // multithread data - ArchMutex m_mutex; - ArchCond m_condVar; - bool m_ready; - int m_result; - ArchThread m_thread; + // multithread data + ArchMutex m_mutex; + ArchCond m_condVar; + bool m_ready; + int m_result; + ArchThread m_thread; - // child thread data - HWND m_hwnd; - UINT m_taskBarRestart; + // child thread data + HWND m_hwnd; + UINT m_taskBarRestart; - // shared data - ReceiverToInfoMap m_receivers; - CIDToReceiverMap m_idTable; - CIDStack m_oldIDs; - UINT m_nextID; + // shared data + ReceiverToInfoMap m_receivers; + CIDToReceiverMap m_idTable; + CIDStack m_oldIDs; + UINT m_nextID; - // dialogs - Dialogs m_dialogs; - Dialogs m_addedDialogs; + // dialogs + Dialogs m_dialogs; + Dialogs m_addedDialogs; }; diff --git a/src/lib/arch/win32/ArchTimeWindows.cpp b/src/lib/arch/win32/ArchTimeWindows.cpp index cf48c2a2..389e07a4 100644 --- a/src/lib/arch/win32/ArchTimeWindows.cpp +++ b/src/lib/arch/win32/ArchTimeWindows.cpp @@ -35,9 +35,9 @@ typedef WINMMAPI DWORD (WINAPI *PTimeGetTime)(void); -static double s_freq = 0.0; -static HINSTANCE s_mmInstance = NULL; -static PTimeGetTime s_tgt = NULL; +static double s_freq = 0.0; +static HINSTANCE s_mmInstance = NULL; +static PTimeGetTime s_tgt = NULL; // @@ -46,44 +46,44 @@ static PTimeGetTime s_tgt = NULL; ArchTimeWindows::ArchTimeWindows() { - assert(s_freq == 0.0 || s_mmInstance == NULL); + assert(s_freq == 0.0 || s_mmInstance == NULL); - LARGE_INTEGER freq; - if (QueryPerformanceFrequency(&freq) && freq.QuadPart != 0) { - s_freq = 1.0 / static_cast(freq.QuadPart); - } - else { - // load winmm.dll and get timeGetTime - s_mmInstance = LoadLibrary("winmm"); - if (s_mmInstance != NULL) { - s_tgt = (PTimeGetTime)GetProcAddress(s_mmInstance, "timeGetTime"); - } - } + LARGE_INTEGER freq; + if (QueryPerformanceFrequency(&freq) && freq.QuadPart != 0) { + s_freq = 1.0 / static_cast(freq.QuadPart); + } + else { + // load winmm.dll and get timeGetTime + s_mmInstance = LoadLibrary("winmm"); + if (s_mmInstance != NULL) { + s_tgt = (PTimeGetTime)GetProcAddress(s_mmInstance, "timeGetTime"); + } + } } ArchTimeWindows::~ArchTimeWindows() { - s_freq = 0.0; - if (s_mmInstance == NULL) { - FreeLibrary(static_cast(s_mmInstance)); - s_tgt = NULL; - s_mmInstance = NULL; - } + s_freq = 0.0; + if (s_mmInstance == NULL) { + FreeLibrary(static_cast(s_mmInstance)); + s_tgt = NULL; + s_mmInstance = NULL; + } } double ArchTimeWindows::time() { - // get time. we try three ways, in order of descending precision - if (s_freq != 0.0) { - LARGE_INTEGER c; - QueryPerformanceCounter(&c); - return s_freq * static_cast(c.QuadPart); - } - else if (s_tgt != NULL) { - return 0.001 * static_cast(s_tgt()); - } - else { - return 0.001 * static_cast(GetTickCount()); - } + // get time. we try three ways, in order of descending precision + if (s_freq != 0.0) { + LARGE_INTEGER c; + QueryPerformanceCounter(&c); + return s_freq * static_cast(c.QuadPart); + } + else if (s_tgt != NULL) { + return 0.001 * static_cast(s_tgt()); + } + else { + return 0.001 * static_cast(GetTickCount()); + } } diff --git a/src/lib/arch/win32/ArchTimeWindows.h b/src/lib/arch/win32/ArchTimeWindows.h index 38fe7335..5a6336c5 100644 --- a/src/lib/arch/win32/ArchTimeWindows.h +++ b/src/lib/arch/win32/ArchTimeWindows.h @@ -25,9 +25,9 @@ //! Win32 implementation of IArchTime class ArchTimeWindows : public IArchTime { public: - ArchTimeWindows(); - virtual ~ArchTimeWindows(); + ArchTimeWindows(); + virtual ~ArchTimeWindows(); - // IArchTime overrides - virtual double time(); + // IArchTime overrides + virtual double time(); }; diff --git a/src/lib/arch/win32/XArchWindows.cpp b/src/lib/arch/win32/XArchWindows.cpp index 6ef82470..d4ec26be 100644 --- a/src/lib/arch/win32/XArchWindows.cpp +++ b/src/lib/arch/win32/XArchWindows.cpp @@ -27,22 +27,22 @@ std::string XArchEvalWindows::eval() const throw() { - char* cmsg; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_IGNORE_INSERTS | - FORMAT_MESSAGE_FROM_SYSTEM, - 0, - m_error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&cmsg, - 0, - NULL) == 0) { - cmsg = NULL; - return synergy::string::sprintf("Unknown error, code %d", m_error); - } - std::string smsg(cmsg); - LocalFree(cmsg); - return smsg; + char* cmsg; + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + 0, + m_error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&cmsg, + 0, + NULL) == 0) { + cmsg = NULL; + return synergy::string::sprintf("Unknown error, code %d", m_error); + } + std::string smsg(cmsg); + LocalFree(cmsg); + return smsg; } @@ -53,68 +53,68 @@ XArchEvalWindows::eval() const throw() std::string XArchEvalWinsock::eval() const throw() { - // built-in windows function for looking up error message strings - // may not look up network error messages correctly. we'll have - // to do it ourself. - static const struct { int m_code; const char* m_msg; } s_netErrorCodes[] = { - /* 10004 */{WSAEINTR, "The (blocking) call was canceled via WSACancelBlockingCall"}, - /* 10009 */{WSAEBADF, "Bad file handle"}, - /* 10013 */{WSAEACCES, "The requested address is a broadcast address, but the appropriate flag was not set"}, - /* 10014 */{WSAEFAULT, "WSAEFAULT"}, - /* 10022 */{WSAEINVAL, "WSAEINVAL"}, - /* 10024 */{WSAEMFILE, "No more file descriptors available"}, - /* 10035 */{WSAEWOULDBLOCK, "Socket is marked as non-blocking and no connections are present or the receive operation would block"}, - /* 10036 */{WSAEINPROGRESS, "A blocking Windows Sockets operation is in progress"}, - /* 10037 */{WSAEALREADY, "The asynchronous routine being canceled has already completed"}, - /* 10038 */{WSAENOTSOCK, "At least on descriptor is not a socket"}, - /* 10039 */{WSAEDESTADDRREQ, "A destination address is required"}, - /* 10040 */{WSAEMSGSIZE, "The datagram was too large to fit into the specified buffer and was truncated"}, - /* 10041 */{WSAEPROTOTYPE, "The specified protocol is the wrong type for this socket"}, - /* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"}, - /* 10043 */{WSAEPROTONOSUPPORT,"The specified protocol is not supported"}, - /* 10044 */{WSAESOCKTNOSUPPORT,"The specified socket type is not supported by this address family"}, - /* 10045 */{WSAEOPNOTSUPP, "The referenced socket is not a type that supports that operation"}, - /* 10046 */{WSAEPFNOSUPPORT, "BSD: Protocol family not supported"}, - /* 10047 */{WSAEAFNOSUPPORT, "The specified address family is not supported"}, - /* 10048 */{WSAEADDRINUSE, "The specified address is already in use"}, - /* 10049 */{WSAEADDRNOTAVAIL, "The specified address is not available from the local machine"}, - /* 10050 */{WSAENETDOWN, "The Windows Sockets implementation has detected that the network subsystem has failed"}, - /* 10051 */{WSAENETUNREACH, "The network can't be reached from this host at this time"}, - /* 10052 */{WSAENETRESET, "The connection must be reset because the Windows Sockets implementation dropped it"}, - /* 10053 */{WSAECONNABORTED, "The virtual circuit was aborted due to timeout or other failure"}, - /* 10054 */{WSAECONNRESET, "The virtual circuit was reset by the remote side"}, - /* 10055 */{WSAENOBUFS, "No buffer space is available or a buffer deadlock has occured. The socket cannot be created"}, - /* 10056 */{WSAEISCONN, "The socket is already connected"}, - /* 10057 */{WSAENOTCONN, "The socket is not connected"}, - /* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"}, - /* 10059 */{WSAETOOMANYREFS, "BSD: Too many references"}, - /* 10060 */{WSAETIMEDOUT, "Attempt to connect timed out without establishing a connection"}, - /* 10061 */{WSAECONNREFUSED, "Connection was refused"}, - /* 10062 */{WSAELOOP, "Undocumented WinSock error code used in BSD"}, - /* 10063 */{WSAENAMETOOLONG, "Undocumented WinSock error code used in BSD"}, - /* 10064 */{WSAEHOSTDOWN, "Undocumented WinSock error code used in BSD"}, - /* 10065 */{WSAEHOSTUNREACH, "No route to host"}, - /* 10066 */{WSAENOTEMPTY, "Undocumented WinSock error code"}, - /* 10067 */{WSAEPROCLIM, "Undocumented WinSock error code"}, - /* 10068 */{WSAEUSERS, "Undocumented WinSock error code"}, - /* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"}, - /* 10070 */{WSAESTALE, "Undocumented WinSock error code"}, - /* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"}, - /* 10091 */{WSASYSNOTREADY, "Underlying network subsytem is not ready for network communication"}, - /* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"}, - /* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"}, - /* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"}, - /* 11001 */{WSAHOST_NOT_FOUND, "The specified host is unknown"}, - /* 11002 */{WSATRY_AGAIN, "A temporary error occurred on an authoritative name server"}, - /* 11003 */{WSANO_RECOVERY, "A non-recoverable name server error occurred"}, - /* 11004 */{WSANO_DATA, "The requested name is valid but does not have an IP address"}, - /* end */{0, NULL} - }; + // built-in windows function for looking up error message strings + // may not look up network error messages correctly. we'll have + // to do it ourself. + static const struct { int m_code; const char* m_msg; } s_netErrorCodes[] = { + /* 10004 */{WSAEINTR, "The (blocking) call was canceled via WSACancelBlockingCall"}, + /* 10009 */{WSAEBADF, "Bad file handle"}, + /* 10013 */{WSAEACCES, "The requested address is a broadcast address, but the appropriate flag was not set"}, + /* 10014 */{WSAEFAULT, "WSAEFAULT"}, + /* 10022 */{WSAEINVAL, "WSAEINVAL"}, + /* 10024 */{WSAEMFILE, "No more file descriptors available"}, + /* 10035 */{WSAEWOULDBLOCK, "Socket is marked as non-blocking and no connections are present or the receive operation would block"}, + /* 10036 */{WSAEINPROGRESS, "A blocking Windows Sockets operation is in progress"}, + /* 10037 */{WSAEALREADY, "The asynchronous routine being canceled has already completed"}, + /* 10038 */{WSAENOTSOCK, "At least on descriptor is not a socket"}, + /* 10039 */{WSAEDESTADDRREQ, "A destination address is required"}, + /* 10040 */{WSAEMSGSIZE, "The datagram was too large to fit into the specified buffer and was truncated"}, + /* 10041 */{WSAEPROTOTYPE, "The specified protocol is the wrong type for this socket"}, + /* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"}, + /* 10043 */{WSAEPROTONOSUPPORT,"The specified protocol is not supported"}, + /* 10044 */{WSAESOCKTNOSUPPORT,"The specified socket type is not supported by this address family"}, + /* 10045 */{WSAEOPNOTSUPP, "The referenced socket is not a type that supports that operation"}, + /* 10046 */{WSAEPFNOSUPPORT, "BSD: Protocol family not supported"}, + /* 10047 */{WSAEAFNOSUPPORT, "The specified address family is not supported"}, + /* 10048 */{WSAEADDRINUSE, "The specified address is already in use"}, + /* 10049 */{WSAEADDRNOTAVAIL, "The specified address is not available from the local machine"}, + /* 10050 */{WSAENETDOWN, "The Windows Sockets implementation has detected that the network subsystem has failed"}, + /* 10051 */{WSAENETUNREACH, "The network can't be reached from this host at this time"}, + /* 10052 */{WSAENETRESET, "The connection must be reset because the Windows Sockets implementation dropped it"}, + /* 10053 */{WSAECONNABORTED, "The virtual circuit was aborted due to timeout or other failure"}, + /* 10054 */{WSAECONNRESET, "The virtual circuit was reset by the remote side"}, + /* 10055 */{WSAENOBUFS, "No buffer space is available or a buffer deadlock has occured. The socket cannot be created"}, + /* 10056 */{WSAEISCONN, "The socket is already connected"}, + /* 10057 */{WSAENOTCONN, "The socket is not connected"}, + /* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"}, + /* 10059 */{WSAETOOMANYREFS, "BSD: Too many references"}, + /* 10060 */{WSAETIMEDOUT, "Attempt to connect timed out without establishing a connection"}, + /* 10061 */{WSAECONNREFUSED, "Connection was refused"}, + /* 10062 */{WSAELOOP, "Undocumented WinSock error code used in BSD"}, + /* 10063 */{WSAENAMETOOLONG, "Undocumented WinSock error code used in BSD"}, + /* 10064 */{WSAEHOSTDOWN, "Undocumented WinSock error code used in BSD"}, + /* 10065 */{WSAEHOSTUNREACH, "No route to host"}, + /* 10066 */{WSAENOTEMPTY, "Undocumented WinSock error code"}, + /* 10067 */{WSAEPROCLIM, "Undocumented WinSock error code"}, + /* 10068 */{WSAEUSERS, "Undocumented WinSock error code"}, + /* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"}, + /* 10070 */{WSAESTALE, "Undocumented WinSock error code"}, + /* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"}, + /* 10091 */{WSASYSNOTREADY, "Underlying network subsytem is not ready for network communication"}, + /* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"}, + /* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"}, + /* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"}, + /* 11001 */{WSAHOST_NOT_FOUND, "The specified host is unknown"}, + /* 11002 */{WSATRY_AGAIN, "A temporary error occurred on an authoritative name server"}, + /* 11003 */{WSANO_RECOVERY, "A non-recoverable name server error occurred"}, + /* 11004 */{WSANO_DATA, "The requested name is valid but does not have an IP address"}, + /* end */{0, NULL} + }; - for (unsigned int i = 0; s_netErrorCodes[i].m_code != 0; ++i) { - if (s_netErrorCodes[i].m_code == m_error) { - return s_netErrorCodes[i].m_msg; - } - } - return "Unknown error"; + for (unsigned int i = 0; s_netErrorCodes[i].m_code != 0; ++i) { + if (s_netErrorCodes[i].m_code == m_error) { + return s_netErrorCodes[i].m_msg; + } + } + return "Unknown error"; } diff --git a/src/lib/arch/win32/XArchWindows.h b/src/lib/arch/win32/XArchWindows.h index bc7e3a39..29351259 100644 --- a/src/lib/arch/win32/XArchWindows.h +++ b/src/lib/arch/win32/XArchWindows.h @@ -26,24 +26,24 @@ //! Lazy error message string evaluation for windows class XArchEvalWindows : public XArchEval { public: - XArchEvalWindows() : m_error(GetLastError()) { } - XArchEvalWindows(DWORD error) : m_error(error) { } - virtual ~XArchEvalWindows() { } + XArchEvalWindows() : m_error(GetLastError()) { } + XArchEvalWindows(DWORD error) : m_error(error) { } + virtual ~XArchEvalWindows() { } - virtual std::string eval() const; + virtual std::string eval() const; private: - DWORD m_error; + DWORD m_error; }; //! Lazy error message string evaluation for winsock class XArchEvalWinsock : public XArchEval { public: - XArchEvalWinsock(int error) : m_error(error) { } - virtual ~XArchEvalWinsock() { } + XArchEvalWinsock(int error) : m_error(error) { } + virtual ~XArchEvalWinsock() { } - virtual std::string eval() const; + virtual std::string eval() const; private: - int m_error; + int m_error; }; diff --git a/src/lib/base/CMakeLists.txt b/src/lib/base/CMakeLists.txt index b17cc3dd..d632cb53 100644 --- a/src/lib/base/CMakeLists.txt +++ b/src/lib/base/CMakeLists.txt @@ -18,21 +18,21 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(base STATIC ${sources}) if (UNIX) - target_link_libraries(base common) + target_link_libraries(base common) endif() diff --git a/src/lib/base/ELevel.h b/src/lib/base/ELevel.h index f6d304e4..89c1a223 100644 --- a/src/lib/base/ELevel.h +++ b/src/lib/base/ELevel.h @@ -23,16 +23,16 @@ The logging priority levels in order of highest to lowest priority. */ enum ELevel { - kPRINT = -1, //!< For print only (no file or time) - kFATAL, //!< For fatal errors - kERROR, //!< For serious errors - kWARNING, //!< For minor errors and warnings - kNOTE, //!< For messages about notable events - kINFO, //!< For informational messages - kDEBUG, //!< For important debugging messages - kDEBUG1, //!< For verbosity +1 debugging messages - kDEBUG2, //!< For verbosity +2 debugging messages - kDEBUG3, //!< For verbosity +3 debugging messages - kDEBUG4, //!< For verbosity +4 debugging messages - kDEBUG5 //!< For verbosity +5 debugging messages + kPRINT = -1, //!< For print only (no file or time) + kFATAL, //!< For fatal errors + kERROR, //!< For serious errors + kWARNING, //!< For minor errors and warnings + kNOTE, //!< For messages about notable events + kINFO, //!< For informational messages + kDEBUG, //!< For important debugging messages + kDEBUG1, //!< For verbosity +1 debugging messages + kDEBUG2, //!< For verbosity +2 debugging messages + kDEBUG3, //!< For verbosity +3 debugging messages + kDEBUG4, //!< For verbosity +4 debugging messages + kDEBUG5 //!< For verbosity +5 debugging messages }; diff --git a/src/lib/base/Event.cpp b/src/lib/base/Event.cpp index 89b6174b..9e12664c 100644 --- a/src/lib/base/Event.cpp +++ b/src/lib/base/Event.cpp @@ -24,77 +24,77 @@ // Event::Event() : - m_type(kUnknown), - m_target(NULL), - m_data(NULL), - m_flags(0), - m_dataObject(nullptr) + m_type(kUnknown), + m_target(NULL), + m_data(NULL), + m_flags(0), + m_dataObject(nullptr) { - // do nothing + // do nothing } Event::Event(Type type, void* target, void* data, Flags flags) : - m_type(type), - m_target(target), - m_data(data), - m_flags(flags), - m_dataObject(nullptr) + m_type(type), + m_target(target), + m_data(data), + m_flags(flags), + m_dataObject(nullptr) { - // do nothing + // do nothing } Event::Type Event::getType() const { - return m_type; + return m_type; } void* Event::getTarget() const { - return m_target; + return m_target; } void* Event::getData() const { - return m_data; + return m_data; } EventData* Event::getDataObject() const { - return m_dataObject; + return m_dataObject; } Event::Flags Event::getFlags() const { - return m_flags; + return m_flags; } void Event::deleteData(const Event& event) { - switch (event.getType()) { - case kUnknown: - case kQuit: - case kSystem: - case kTimer: - break; + switch (event.getType()) { + case kUnknown: + case kQuit: + case kSystem: + case kTimer: + break; - default: - if ((event.getFlags() & kDontFreeData) == 0) { - free(event.getData()); - delete event.getDataObject(); - } - break; - } + default: + if ((event.getFlags() & kDontFreeData) == 0) { + free(event.getData()); + delete event.getDataObject(); + } + break; + } } void Event::setDataObject(EventData* dataObject) { - assert(m_dataObject == nullptr); - m_dataObject = dataObject; + assert(m_dataObject == nullptr); + m_dataObject = dataObject; } diff --git a/src/lib/base/Event.h b/src/lib/base/Event.h index 652aab62..7e6c292c 100644 --- a/src/lib/base/Event.h +++ b/src/lib/base/Event.h @@ -23,8 +23,8 @@ class EventData { public: - EventData() { } - virtual ~EventData() { } + EventData() { } + virtual ~EventData() { } }; //! Event @@ -33,94 +33,94 @@ A \c Event holds an event type and a pointer to event data. */ class Event { public: - typedef UInt32 Type; - enum { - kUnknown, //!< The event type is unknown - kQuit, //!< The quit event - kSystem, //!< The data points to a system event type - kTimer, //!< The data points to timer info - kLast //!< Must be last - }; + typedef UInt32 Type; + enum { + kUnknown, //!< The event type is unknown + kQuit, //!< The quit event + kSystem, //!< The data points to a system event type + kTimer, //!< The data points to timer info + kLast //!< Must be last + }; - typedef UInt32 Flags; - enum { - kNone = 0x00, //!< No flags - kDeliverImmediately = 0x01, //!< Dispatch and free event immediately - kDontFreeData = 0x02 //!< Don't free data in deleteData - }; + typedef UInt32 Flags; + enum { + kNone = 0x00, //!< No flags + kDeliverImmediately = 0x01, //!< Dispatch and free event immediately + kDontFreeData = 0x02 //!< Don't free data in deleteData + }; - Event(); + Event(); - //! Create \c Event with data (POD) - /*! - The \p data must be POD (plain old data) allocated by malloc(), - which means it cannot have a constructor, destructor or be - composed of any types that do. For non-POD (normal C++ objects - use \c setDataObject(). - \p target is the intended recipient of the event. - \p flags is any combination of \c Flags. - */ - Event(Type type, void* target = NULL, void* data = NULL, - Flags flags = kNone); + //! Create \c Event with data (POD) + /*! + The \p data must be POD (plain old data) allocated by malloc(), + which means it cannot have a constructor, destructor or be + composed of any types that do. For non-POD (normal C++ objects + use \c setDataObject(). + \p target is the intended recipient of the event. + \p flags is any combination of \c Flags. + */ + Event(Type type, void* target = NULL, void* data = NULL, + Flags flags = kNone); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Release event data - /*! - Deletes event data for the given event (using free()). - */ - static void deleteData(const Event&); - - //! Set data (non-POD) - /*! - Set non-POD (non plain old data), where delete is called when the event - is deleted, and the destructor is called. - */ - void setDataObject(EventData* dataObject); + //! Release event data + /*! + Deletes event data for the given event (using free()). + */ + static void deleteData(const Event&); + + //! Set data (non-POD) + /*! + Set non-POD (non plain old data), where delete is called when the event + is deleted, and the destructor is called. + */ + void setDataObject(EventData* dataObject); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get event type - /*! - Returns the event type. - */ - Type getType() const; + //! Get event type + /*! + Returns the event type. + */ + Type getType() const; - //! Get the event target - /*! - Returns the event target. - */ - void* getTarget() const; + //! Get the event target + /*! + Returns the event target. + */ + void* getTarget() const; - //! Get the event data (POD). - /*! - Returns the event data (POD). - */ - void* getData() const; + //! Get the event data (POD). + /*! + Returns the event data (POD). + */ + void* getData() const; - //! Get the event data (non-POD) - /*! - Returns the event data (non-POD). The difference between this and - \c getData() is that when delete is called on this data, so non-POD - (non plain old data) dtor is called. - */ - EventData* getDataObject() const; + //! Get the event data (non-POD) + /*! + Returns the event data (non-POD). The difference between this and + \c getData() is that when delete is called on this data, so non-POD + (non plain old data) dtor is called. + */ + EventData* getDataObject() const; - //! Get event flags - /*! - Returns the event flags. - */ - Flags getFlags() const; - - //@} + //! Get event flags + /*! + Returns the event flags. + */ + Flags getFlags() const; + + //@} private: - Type m_type; - void* m_target; - void* m_data; - Flags m_flags; - EventData* m_dataObject; + Type m_type; + void* m_target; + void* m_data; + Flags m_flags; + EventData* m_dataObject; }; diff --git a/src/lib/base/EventQueue.cpp b/src/lib/base/EventQueue.cpp index 5f15293f..dfdebe20 100644 --- a/src/lib/base/EventQueue.cpp +++ b/src/lib/base/EventQueue.cpp @@ -54,8 +54,8 @@ static void interrupt(Arch::ESignal, void* data) { - EventQueue* events = static_cast(data); - events->addEvent(Event(Event::kQuit)); + EventQueue* events = static_cast(data); + events->addEvent(Event(Event::kQuit)); } @@ -64,512 +64,512 @@ interrupt(Arch::ESignal, void* data) // EventQueue::EventQueue() : - m_systemTarget(0), - m_nextType(Event::kLast), - m_typesForClient(NULL), - m_typesForIStream(NULL), - m_typesForIpcClient(NULL), - m_typesForIpcClientProxy(NULL), - m_typesForIpcServer(NULL), - m_typesForIpcServerProxy(NULL), - m_typesForIDataSocket(NULL), - m_typesForIListenSocket(NULL), - m_typesForISocket(NULL), - m_typesForOSXScreen(NULL), - m_typesForClientListener(NULL), - m_typesForClientProxy(NULL), - m_typesForClientProxyUnknown(NULL), - m_typesForServer(NULL), - m_typesForServerApp(NULL), - m_typesForIKeyState(NULL), - m_typesForIPrimaryScreen(NULL), - m_typesForIScreen(NULL), - m_typesForClipboard(NULL), - m_typesForFile(NULL), - m_readyMutex(new Mutex), - m_readyCondVar(new CondVar(m_readyMutex, false)) + m_systemTarget(0), + m_nextType(Event::kLast), + m_typesForClient(NULL), + m_typesForIStream(NULL), + m_typesForIpcClient(NULL), + m_typesForIpcClientProxy(NULL), + m_typesForIpcServer(NULL), + m_typesForIpcServerProxy(NULL), + m_typesForIDataSocket(NULL), + m_typesForIListenSocket(NULL), + m_typesForISocket(NULL), + m_typesForOSXScreen(NULL), + m_typesForClientListener(NULL), + m_typesForClientProxy(NULL), + m_typesForClientProxyUnknown(NULL), + m_typesForServer(NULL), + m_typesForServerApp(NULL), + m_typesForIKeyState(NULL), + m_typesForIPrimaryScreen(NULL), + m_typesForIScreen(NULL), + m_typesForClipboard(NULL), + m_typesForFile(NULL), + m_readyMutex(new Mutex), + m_readyCondVar(new CondVar(m_readyMutex, false)) { - m_mutex = ARCH->newMutex(); - ARCH->setSignalHandler(Arch::kINTERRUPT, &interrupt, this); - ARCH->setSignalHandler(Arch::kTERMINATE, &interrupt, this); - m_buffer = new SimpleEventQueueBuffer; + m_mutex = ARCH->newMutex(); + ARCH->setSignalHandler(Arch::kINTERRUPT, &interrupt, this); + ARCH->setSignalHandler(Arch::kTERMINATE, &interrupt, this); + m_buffer = new SimpleEventQueueBuffer; } EventQueue::~EventQueue() { - delete m_buffer; - delete m_readyCondVar; - delete m_readyMutex; - - ARCH->setSignalHandler(Arch::kINTERRUPT, NULL, NULL); - ARCH->setSignalHandler(Arch::kTERMINATE, NULL, NULL); - ARCH->closeMutex(m_mutex); + delete m_buffer; + delete m_readyCondVar; + delete m_readyMutex; + + ARCH->setSignalHandler(Arch::kINTERRUPT, NULL, NULL); + ARCH->setSignalHandler(Arch::kTERMINATE, NULL, NULL); + ARCH->closeMutex(m_mutex); } void EventQueue::loop() { - m_buffer->init(); - { - Lock lock(m_readyMutex); - *m_readyCondVar = true; - m_readyCondVar->signal(); - } - LOG((CLOG_DEBUG "event queue is ready")); - while (!m_pending.empty()) { - LOG((CLOG_DEBUG "add pending events to buffer")); - Event& event = m_pending.front(); - addEventToBuffer(event); - m_pending.pop(); - } - - Event event; - getEvent(event); - while (event.getType() != Event::kQuit) { - dispatchEvent(event); - Event::deleteData(event); - getEvent(event); - } + m_buffer->init(); + { + Lock lock(m_readyMutex); + *m_readyCondVar = true; + m_readyCondVar->signal(); + } + LOG((CLOG_DEBUG "event queue is ready")); + while (!m_pending.empty()) { + LOG((CLOG_DEBUG "add pending events to buffer")); + Event& event = m_pending.front(); + addEventToBuffer(event); + m_pending.pop(); + } + + Event event; + getEvent(event); + while (event.getType() != Event::kQuit) { + dispatchEvent(event); + Event::deleteData(event); + getEvent(event); + } } Event::Type EventQueue::registerTypeOnce(Event::Type& type, const char* name) { - ArchMutexLock lock(m_mutex); - if (type == Event::kUnknown) { - m_typeMap.insert(std::make_pair(m_nextType, name)); - m_nameMap.insert(std::make_pair(name, m_nextType)); - LOG((CLOG_DEBUG1 "registered event type %s as %d", name, m_nextType)); - type = m_nextType++; - } - return type; + ArchMutexLock lock(m_mutex); + if (type == Event::kUnknown) { + m_typeMap.insert(std::make_pair(m_nextType, name)); + m_nameMap.insert(std::make_pair(name, m_nextType)); + LOG((CLOG_DEBUG1 "registered event type %s as %d", name, m_nextType)); + type = m_nextType++; + } + return type; } const char* EventQueue::getTypeName(Event::Type type) { - switch (type) { - case Event::kUnknown: - return "nil"; + switch (type) { + case Event::kUnknown: + return "nil"; - case Event::kQuit: - return "quit"; + case Event::kQuit: + return "quit"; - case Event::kSystem: - return "system"; + case Event::kSystem: + return "system"; - case Event::kTimer: - return "timer"; + case Event::kTimer: + return "timer"; - default: - TypeMap::const_iterator i = m_typeMap.find(type); - if (i == m_typeMap.end()) { - return ""; - } - else { - return i->second; - } - } + default: + TypeMap::const_iterator i = m_typeMap.find(type); + if (i == m_typeMap.end()) { + return ""; + } + else { + return i->second; + } + } } void EventQueue::adoptBuffer(IEventQueueBuffer* buffer) { - ArchMutexLock lock(m_mutex); + ArchMutexLock lock(m_mutex); - LOG((CLOG_DEBUG "adopting new buffer")); + LOG((CLOG_DEBUG "adopting new buffer")); - if (m_events.size() != 0) { - // this can come as a nasty surprise to programmers expecting - // their events to be raised, only to have them deleted. - LOG((CLOG_DEBUG "discarding %d event(s)", m_events.size())); - } + if (m_events.size() != 0) { + // this can come as a nasty surprise to programmers expecting + // their events to be raised, only to have them deleted. + LOG((CLOG_DEBUG "discarding %d event(s)", m_events.size())); + } - // discard old buffer and old events - delete m_buffer; - for (EventTable::iterator i = m_events.begin(); i != m_events.end(); ++i) { - Event::deleteData(i->second); - } - m_events.clear(); - m_oldEventIDs.clear(); + // discard old buffer and old events + delete m_buffer; + for (EventTable::iterator i = m_events.begin(); i != m_events.end(); ++i) { + Event::deleteData(i->second); + } + m_events.clear(); + m_oldEventIDs.clear(); - // use new buffer - m_buffer = buffer; - if (m_buffer == NULL) { - m_buffer = new SimpleEventQueueBuffer; - } + // use new buffer + m_buffer = buffer; + if (m_buffer == NULL) { + m_buffer = new SimpleEventQueueBuffer; + } } bool EventQueue::getEvent(Event& event, double timeout) { - Stopwatch timer(true); + Stopwatch timer(true); retry: - // if no events are waiting then handle timers and then wait - while (m_buffer->isEmpty()) { - // handle timers first - if (hasTimerExpired(event)) { - return true; - } + // if no events are waiting then handle timers and then wait + while (m_buffer->isEmpty()) { + // handle timers first + if (hasTimerExpired(event)) { + return true; + } - // get time remaining in timeout - double timeLeft = timeout - timer.getTime(); - if (timeout >= 0.0 && timeLeft <= 0.0) { - return false; - } + // get time remaining in timeout + double timeLeft = timeout - timer.getTime(); + if (timeout >= 0.0 && timeLeft <= 0.0) { + return false; + } - // get time until next timer expires. if there is a timer - // and it'll expire before the client's timeout then use - // that duration for our timeout instead. - double timerTimeout = getNextTimerTimeout(); - if (timeout < 0.0 || (timerTimeout >= 0.0 && timerTimeout < timeLeft)) { - timeLeft = timerTimeout; - } + // get time until next timer expires. if there is a timer + // and it'll expire before the client's timeout then use + // that duration for our timeout instead. + double timerTimeout = getNextTimerTimeout(); + if (timeout < 0.0 || (timerTimeout >= 0.0 && timerTimeout < timeLeft)) { + timeLeft = timerTimeout; + } - // wait for an event - m_buffer->waitForEvent(timeLeft); - } + // wait for an event + m_buffer->waitForEvent(timeLeft); + } - // get the event - UInt32 dataID; - IEventQueueBuffer::Type type = m_buffer->getEvent(event, dataID); - switch (type) { - case IEventQueueBuffer::kNone: - if (timeout < 0.0 || timeout <= timer.getTime()) { - // don't want to fail if client isn't expecting that - // so if getEvent() fails with an infinite timeout - // then just try getting another event. - goto retry; - } - return false; + // get the event + UInt32 dataID; + IEventQueueBuffer::Type type = m_buffer->getEvent(event, dataID); + switch (type) { + case IEventQueueBuffer::kNone: + if (timeout < 0.0 || timeout <= timer.getTime()) { + // don't want to fail if client isn't expecting that + // so if getEvent() fails with an infinite timeout + // then just try getting another event. + goto retry; + } + return false; - case IEventQueueBuffer::kSystem: - return true; + case IEventQueueBuffer::kSystem: + return true; - case IEventQueueBuffer::kUser: - { - ArchMutexLock lock(m_mutex); - event = removeEvent(dataID); - return true; - } + case IEventQueueBuffer::kUser: + { + ArchMutexLock lock(m_mutex); + event = removeEvent(dataID); + return true; + } - default: - assert(0 && "invalid event type"); - return false; - } + default: + assert(0 && "invalid event type"); + return false; + } } bool EventQueue::dispatchEvent(const Event& event) { - void* target = event.getTarget(); - IEventJob* job = getHandler(event.getType(), target); - if (job == NULL) { - job = getHandler(Event::kUnknown, target); - } - if (job != NULL) { - job->run(event); - return true; - } - return false; + void* target = event.getTarget(); + IEventJob* job = getHandler(event.getType(), target); + if (job == NULL) { + job = getHandler(Event::kUnknown, target); + } + if (job != NULL) { + job->run(event); + return true; + } + return false; } void EventQueue::addEvent(const Event& event) { - // discard bogus event types - switch (event.getType()) { - case Event::kUnknown: - case Event::kSystem: - case Event::kTimer: - return; + // discard bogus event types + switch (event.getType()) { + case Event::kUnknown: + case Event::kSystem: + case Event::kTimer: + return; - default: - break; - } - - if ((event.getFlags() & Event::kDeliverImmediately) != 0) { - dispatchEvent(event); - Event::deleteData(event); - } - else if (!(*m_readyCondVar)) { - m_pending.push(event); - } - else { - addEventToBuffer(event); - } + default: + break; + } + + if ((event.getFlags() & Event::kDeliverImmediately) != 0) { + dispatchEvent(event); + Event::deleteData(event); + } + else if (!(*m_readyCondVar)) { + m_pending.push(event); + } + else { + addEventToBuffer(event); + } } void EventQueue::addEventToBuffer(const Event& event) { - ArchMutexLock lock(m_mutex); - - // store the event's data locally - UInt32 eventID = saveEvent(event); - - // add it - if (!m_buffer->addEvent(eventID)) { - // failed to send event - removeEvent(eventID); - Event::deleteData(event); - } + ArchMutexLock lock(m_mutex); + + // store the event's data locally + UInt32 eventID = saveEvent(event); + + // add it + if (!m_buffer->addEvent(eventID)) { + // failed to send event + removeEvent(eventID); + Event::deleteData(event); + } } EventQueueTimer* EventQueue::newTimer(double duration, void* target) { - assert(duration > 0.0); + assert(duration > 0.0); - EventQueueTimer* timer = m_buffer->newTimer(duration, false); - if (target == NULL) { - target = timer; - } - ArchMutexLock lock(m_mutex); - m_timers.insert(timer); - // initial duration is requested duration plus whatever's on - // the clock currently because the latter will be subtracted - // the next time we check for timers. - m_timerQueue.push(Timer(timer, duration, - duration + m_time.getTime(), target, false)); - return timer; + EventQueueTimer* timer = m_buffer->newTimer(duration, false); + if (target == NULL) { + target = timer; + } + ArchMutexLock lock(m_mutex); + m_timers.insert(timer); + // initial duration is requested duration plus whatever's on + // the clock currently because the latter will be subtracted + // the next time we check for timers. + m_timerQueue.push(Timer(timer, duration, + duration + m_time.getTime(), target, false)); + return timer; } EventQueueTimer* EventQueue::newOneShotTimer(double duration, void* target) { - assert(duration > 0.0); + assert(duration > 0.0); - EventQueueTimer* timer = m_buffer->newTimer(duration, true); - if (target == NULL) { - target = timer; - } - ArchMutexLock lock(m_mutex); - m_timers.insert(timer); - // initial duration is requested duration plus whatever's on - // the clock currently because the latter will be subtracted - // the next time we check for timers. - m_timerQueue.push(Timer(timer, duration, - duration + m_time.getTime(), target, true)); - return timer; + EventQueueTimer* timer = m_buffer->newTimer(duration, true); + if (target == NULL) { + target = timer; + } + ArchMutexLock lock(m_mutex); + m_timers.insert(timer); + // initial duration is requested duration plus whatever's on + // the clock currently because the latter will be subtracted + // the next time we check for timers. + m_timerQueue.push(Timer(timer, duration, + duration + m_time.getTime(), target, true)); + return timer; } void EventQueue::deleteTimer(EventQueueTimer* timer) { - ArchMutexLock lock(m_mutex); - for (TimerQueue::iterator index = m_timerQueue.begin(); - index != m_timerQueue.end(); ++index) { - if (index->getTimer() == timer) { - m_timerQueue.erase(index); - break; - } - } - Timers::iterator index = m_timers.find(timer); - if (index != m_timers.end()) { - m_timers.erase(index); - } - m_buffer->deleteTimer(timer); + ArchMutexLock lock(m_mutex); + for (TimerQueue::iterator index = m_timerQueue.begin(); + index != m_timerQueue.end(); ++index) { + if (index->getTimer() == timer) { + m_timerQueue.erase(index); + break; + } + } + Timers::iterator index = m_timers.find(timer); + if (index != m_timers.end()) { + m_timers.erase(index); + } + m_buffer->deleteTimer(timer); } void EventQueue::adoptHandler(Event::Type type, void* target, IEventJob* handler) { - ArchMutexLock lock(m_mutex); - IEventJob*& job = m_handlers[target][type]; - delete job; - job = handler; + ArchMutexLock lock(m_mutex); + IEventJob*& job = m_handlers[target][type]; + delete job; + job = handler; } void EventQueue::removeHandler(Event::Type type, void* target) { - IEventJob* handler = NULL; - { - ArchMutexLock lock(m_mutex); - HandlerTable::iterator index = m_handlers.find(target); - if (index != m_handlers.end()) { - TypeHandlerTable& typeHandlers = index->second; - TypeHandlerTable::iterator index2 = typeHandlers.find(type); - if (index2 != typeHandlers.end()) { - handler = index2->second; - typeHandlers.erase(index2); - } - } - } - delete handler; + IEventJob* handler = NULL; + { + ArchMutexLock lock(m_mutex); + HandlerTable::iterator index = m_handlers.find(target); + if (index != m_handlers.end()) { + TypeHandlerTable& typeHandlers = index->second; + TypeHandlerTable::iterator index2 = typeHandlers.find(type); + if (index2 != typeHandlers.end()) { + handler = index2->second; + typeHandlers.erase(index2); + } + } + } + delete handler; } void EventQueue::removeHandlers(void* target) { - std::vector handlers; - { - ArchMutexLock lock(m_mutex); - HandlerTable::iterator index = m_handlers.find(target); - if (index != m_handlers.end()) { - // copy to handlers array and clear table for target - TypeHandlerTable& typeHandlers = index->second; - for (TypeHandlerTable::iterator index2 = typeHandlers.begin(); - index2 != typeHandlers.end(); ++index2) { - handlers.push_back(index2->second); - } - typeHandlers.clear(); - } - } + std::vector handlers; + { + ArchMutexLock lock(m_mutex); + HandlerTable::iterator index = m_handlers.find(target); + if (index != m_handlers.end()) { + // copy to handlers array and clear table for target + TypeHandlerTable& typeHandlers = index->second; + for (TypeHandlerTable::iterator index2 = typeHandlers.begin(); + index2 != typeHandlers.end(); ++index2) { + handlers.push_back(index2->second); + } + typeHandlers.clear(); + } + } - // delete handlers - for (std::vector::iterator index = handlers.begin(); - index != handlers.end(); ++index) { - delete *index; - } + // delete handlers + for (std::vector::iterator index = handlers.begin(); + index != handlers.end(); ++index) { + delete *index; + } } bool EventQueue::isEmpty() const { - return (m_buffer->isEmpty() && getNextTimerTimeout() != 0.0); + return (m_buffer->isEmpty() && getNextTimerTimeout() != 0.0); } IEventJob* EventQueue::getHandler(Event::Type type, void* target) const { - ArchMutexLock lock(m_mutex); - HandlerTable::const_iterator index = m_handlers.find(target); - if (index != m_handlers.end()) { - const TypeHandlerTable& typeHandlers = index->second; - TypeHandlerTable::const_iterator index2 = typeHandlers.find(type); - if (index2 != typeHandlers.end()) { - return index2->second; - } - } - return NULL; + ArchMutexLock lock(m_mutex); + HandlerTable::const_iterator index = m_handlers.find(target); + if (index != m_handlers.end()) { + const TypeHandlerTable& typeHandlers = index->second; + TypeHandlerTable::const_iterator index2 = typeHandlers.find(type); + if (index2 != typeHandlers.end()) { + return index2->second; + } + } + return NULL; } UInt32 EventQueue::saveEvent(const Event& event) { - // choose id - UInt32 id; - if (!m_oldEventIDs.empty()) { - // reuse an id - id = m_oldEventIDs.back(); - m_oldEventIDs.pop_back(); - } - else { - // make a new id - id = static_cast(m_events.size()); - } + // choose id + UInt32 id; + if (!m_oldEventIDs.empty()) { + // reuse an id + id = m_oldEventIDs.back(); + m_oldEventIDs.pop_back(); + } + else { + // make a new id + id = static_cast(m_events.size()); + } - // save data - m_events[id] = event; - return id; + // save data + m_events[id] = event; + return id; } Event EventQueue::removeEvent(UInt32 eventID) { - // look up id - EventTable::iterator index = m_events.find(eventID); - if (index == m_events.end()) { - return Event(); - } + // look up id + EventTable::iterator index = m_events.find(eventID); + if (index == m_events.end()) { + return Event(); + } - // get data - Event event = index->second; - m_events.erase(index); + // get data + Event event = index->second; + m_events.erase(index); - // save old id for reuse - m_oldEventIDs.push_back(eventID); + // save old id for reuse + m_oldEventIDs.push_back(eventID); - return event; + return event; } bool EventQueue::hasTimerExpired(Event& event) { - // return true if there's a timer in the timer priority queue that - // has expired. if returning true then fill in event appropriately - // and reset and reinsert the timer. - if (m_timerQueue.empty()) { - return false; - } + // return true if there's a timer in the timer priority queue that + // has expired. if returning true then fill in event appropriately + // and reset and reinsert the timer. + if (m_timerQueue.empty()) { + return false; + } - // get time elapsed since last check - const double time = m_time.getTime(); - m_time.reset(); + // get time elapsed since last check + const double time = m_time.getTime(); + m_time.reset(); - // countdown elapsed time - for (TimerQueue::iterator index = m_timerQueue.begin(); - index != m_timerQueue.end(); ++index) { - (*index) -= time; - } + // countdown elapsed time + for (TimerQueue::iterator index = m_timerQueue.begin(); + index != m_timerQueue.end(); ++index) { + (*index) -= time; + } - // done if no timers are expired - if (m_timerQueue.top() > 0.0) { - return false; - } + // done if no timers are expired + if (m_timerQueue.top() > 0.0) { + return false; + } - // remove timer from queue - Timer timer = m_timerQueue.top(); - m_timerQueue.pop(); + // remove timer from queue + Timer timer = m_timerQueue.top(); + m_timerQueue.pop(); - // prepare event and reset the timer's clock - timer.fillEvent(m_timerEvent); - event = Event(Event::kTimer, timer.getTarget(), &m_timerEvent); - timer.reset(); + // prepare event and reset the timer's clock + timer.fillEvent(m_timerEvent); + event = Event(Event::kTimer, timer.getTarget(), &m_timerEvent); + timer.reset(); - // reinsert timer into queue if it's not a one-shot - if (!timer.isOneShot()) { - m_timerQueue.push(timer); - } + // reinsert timer into queue if it's not a one-shot + if (!timer.isOneShot()) { + m_timerQueue.push(timer); + } - return true; + return true; } double EventQueue::getNextTimerTimeout() const { - // return -1 if no timers, 0 if the top timer has expired, otherwise - // the time until the top timer in the timer priority queue will - // expire. - if (m_timerQueue.empty()) { - return -1.0; - } - if (m_timerQueue.top() <= 0.0) { - return 0.0; - } - return m_timerQueue.top(); + // return -1 if no timers, 0 if the top timer has expired, otherwise + // the time until the top timer in the timer priority queue will + // expire. + if (m_timerQueue.empty()) { + return -1.0; + } + if (m_timerQueue.top() <= 0.0) { + return 0.0; + } + return m_timerQueue.top(); } Event::Type EventQueue::getRegisteredType(const String& name) const { - NameMap::const_iterator found = m_nameMap.find(name); - if (found != m_nameMap.end()) - return found->second; + NameMap::const_iterator found = m_nameMap.find(name); + if (found != m_nameMap.end()) + return found->second; - return Event::kUnknown; + return Event::kUnknown; } void* EventQueue::getSystemTarget() { - // any unique arbitrary pointer will do - return &m_systemTarget; + // any unique arbitrary pointer will do + return &m_systemTarget; } void EventQueue::waitForReady() const { - double timeout = ARCH->time() + 10; - Lock lock(m_readyMutex); - - while (!m_readyCondVar->wait()) { - if (ARCH->time() > timeout) { - throw std::runtime_error("event queue is not ready within 5 sec"); - } - } + double timeout = ARCH->time() + 10; + Lock lock(m_readyMutex); + + while (!m_readyCondVar->wait()) { + if (ARCH->time() > timeout) { + throw std::runtime_error("event queue is not ready within 5 sec"); + } + } } // @@ -577,69 +577,69 @@ EventQueue::waitForReady() const // EventQueue::Timer::Timer(EventQueueTimer* timer, double timeout, - double initialTime, void* target, bool oneShot) : - m_timer(timer), - m_timeout(timeout), - m_target(target), - m_oneShot(oneShot), - m_time(initialTime) + double initialTime, void* target, bool oneShot) : + m_timer(timer), + m_timeout(timeout), + m_target(target), + m_oneShot(oneShot), + m_time(initialTime) { - assert(m_timeout > 0.0); + assert(m_timeout > 0.0); } EventQueue::Timer::~Timer() { - // do nothing + // do nothing } void EventQueue::Timer::reset() { - m_time = m_timeout; + m_time = m_timeout; } EventQueue::Timer& EventQueue::Timer::operator-=(double dt) { - m_time -= dt; - return *this; + m_time -= dt; + return *this; } EventQueue::Timer::operator double() const { - return m_time; + return m_time; } bool EventQueue::Timer::isOneShot() const { - return m_oneShot; + return m_oneShot; } EventQueueTimer* EventQueue::Timer::getTimer() const { - return m_timer; + return m_timer; } void* EventQueue::Timer::getTarget() const { - return m_target; + return m_target; } void EventQueue::Timer::fillEvent(TimerEvent& event) const { - event.m_timer = m_timer; - event.m_count = 0; - if (m_time <= 0.0) { - event.m_count = static_cast((m_timeout - m_time) / m_timeout); - } + event.m_timer = m_timer; + event.m_count = 0; + if (m_time <= 0.0) { + event.m_count = static_cast((m_timeout - m_time) / m_timeout); + } } bool EventQueue::Timer::operator<(const Timer& t) const { - return m_time < t.m_time; + return m_time < t.m_time; } diff --git a/src/lib/base/EventQueue.h b/src/lib/base/EventQueue.h index a0b15539..4a390b8d 100644 --- a/src/lib/base/EventQueue.h +++ b/src/lib/base/EventQueue.h @@ -38,160 +38,160 @@ delegates the platform dependent parts to a subclass. */ class EventQueue : public IEventQueue { public: - EventQueue(); - virtual ~EventQueue(); + EventQueue(); + virtual ~EventQueue(); - // IEventQueue overrides - virtual void loop(); - virtual void adoptBuffer(IEventQueueBuffer*); - virtual bool getEvent(Event& event, double timeout = -1.0); - virtual bool dispatchEvent(const Event& event); - virtual void addEvent(const Event& event); - virtual EventQueueTimer* - newTimer(double duration, void* target); - virtual EventQueueTimer* - newOneShotTimer(double duration, void* target); - virtual void deleteTimer(EventQueueTimer*); - virtual void adoptHandler(Event::Type type, - void* target, IEventJob* handler); - virtual void removeHandler(Event::Type type, void* target); - virtual void removeHandlers(void* target); - virtual Event::Type - registerTypeOnce(Event::Type& type, const char* name); - virtual bool isEmpty() const; - virtual IEventJob* getHandler(Event::Type type, void* target) const; - virtual const char* getTypeName(Event::Type type); - virtual Event::Type - getRegisteredType(const String& name) const; - void* getSystemTarget(); - virtual void waitForReady() const; + // IEventQueue overrides + virtual void loop(); + virtual void adoptBuffer(IEventQueueBuffer*); + virtual bool getEvent(Event& event, double timeout = -1.0); + virtual bool dispatchEvent(const Event& event); + virtual void addEvent(const Event& event); + virtual EventQueueTimer* + newTimer(double duration, void* target); + virtual EventQueueTimer* + newOneShotTimer(double duration, void* target); + virtual void deleteTimer(EventQueueTimer*); + virtual void adoptHandler(Event::Type type, + void* target, IEventJob* handler); + virtual void removeHandler(Event::Type type, void* target); + virtual void removeHandlers(void* target); + virtual Event::Type + registerTypeOnce(Event::Type& type, const char* name); + virtual bool isEmpty() const; + virtual IEventJob* getHandler(Event::Type type, void* target) const; + virtual const char* getTypeName(Event::Type type); + virtual Event::Type + getRegisteredType(const String& name) const; + void* getSystemTarget(); + virtual void waitForReady() const; private: - UInt32 saveEvent(const Event& event); - Event removeEvent(UInt32 eventID); - bool hasTimerExpired(Event& event); - double getNextTimerTimeout() const; - void addEventToBuffer(const Event& event); - + UInt32 saveEvent(const Event& event); + Event removeEvent(UInt32 eventID); + bool hasTimerExpired(Event& event); + double getNextTimerTimeout() const; + void addEventToBuffer(const Event& event); + private: - class Timer { - public: - Timer(EventQueueTimer*, double timeout, double initialTime, - void* target, bool oneShot); - ~Timer(); + class Timer { + public: + Timer(EventQueueTimer*, double timeout, double initialTime, + void* target, bool oneShot); + ~Timer(); - void reset(); + void reset(); - Timer& operator-=(double); + Timer& operator-=(double); - operator double() const; + operator double() const; - bool isOneShot() const; - EventQueueTimer* - getTimer() const; - void* getTarget() const; - void fillEvent(TimerEvent&) const; + bool isOneShot() const; + EventQueueTimer* + getTimer() const; + void* getTarget() const; + void fillEvent(TimerEvent&) const; - bool operator<(const Timer&) const; + bool operator<(const Timer&) const; - private: - EventQueueTimer* m_timer; - double m_timeout; - void* m_target; - bool m_oneShot; - double m_time; - }; + private: + EventQueueTimer* m_timer; + double m_timeout; + void* m_target; + bool m_oneShot; + double m_time; + }; - typedef std::set Timers; - typedef PriorityQueue TimerQueue; - typedef std::map EventTable; - typedef std::vector EventIDList; - typedef std::map TypeMap; - typedef std::map NameMap; - typedef std::map TypeHandlerTable; - typedef std::map HandlerTable; + typedef std::set Timers; + typedef PriorityQueue TimerQueue; + typedef std::map EventTable; + typedef std::vector EventIDList; + typedef std::map TypeMap; + typedef std::map NameMap; + typedef std::map TypeHandlerTable; + typedef std::map HandlerTable; - int m_systemTarget; - ArchMutex m_mutex; + int m_systemTarget; + ArchMutex m_mutex; - // registered events - Event::Type m_nextType; - TypeMap m_typeMap; - NameMap m_nameMap; + // registered events + Event::Type m_nextType; + TypeMap m_typeMap; + NameMap m_nameMap; - // buffer of events - IEventQueueBuffer* m_buffer; + // buffer of events + IEventQueueBuffer* m_buffer; - // saved events - EventTable m_events; - EventIDList m_oldEventIDs; + // saved events + EventTable m_events; + EventIDList m_oldEventIDs; - // timers - Stopwatch m_time; - Timers m_timers; - TimerQueue m_timerQueue; - TimerEvent m_timerEvent; + // timers + Stopwatch m_time; + Timers m_timers; + TimerQueue m_timerQueue; + TimerEvent m_timerEvent; - // event handlers - HandlerTable m_handlers; + // event handlers + HandlerTable m_handlers; public: - // - // Event type providers. - // - ClientEvents& forClient(); - IStreamEvents& forIStream(); - IpcClientEvents& forIpcClient(); - IpcClientProxyEvents& forIpcClientProxy(); - IpcServerEvents& forIpcServer(); - IpcServerProxyEvents& forIpcServerProxy(); - IDataSocketEvents& forIDataSocket(); - IListenSocketEvents& forIListenSocket(); - ISocketEvents& forISocket(); - OSXScreenEvents& forOSXScreen(); - ClientListenerEvents& forClientListener(); - ClientProxyEvents& forClientProxy(); - ClientProxyUnknownEvents& forClientProxyUnknown(); - ServerEvents& forServer(); - ServerAppEvents& forServerApp(); - IKeyStateEvents& forIKeyState(); - IPrimaryScreenEvents& forIPrimaryScreen(); - IScreenEvents& forIScreen(); - ClipboardEvents& forClipboard(); - FileEvents& forFile(); + // + // Event type providers. + // + ClientEvents& forClient(); + IStreamEvents& forIStream(); + IpcClientEvents& forIpcClient(); + IpcClientProxyEvents& forIpcClientProxy(); + IpcServerEvents& forIpcServer(); + IpcServerProxyEvents& forIpcServerProxy(); + IDataSocketEvents& forIDataSocket(); + IListenSocketEvents& forIListenSocket(); + ISocketEvents& forISocket(); + OSXScreenEvents& forOSXScreen(); + ClientListenerEvents& forClientListener(); + ClientProxyEvents& forClientProxy(); + ClientProxyUnknownEvents& forClientProxyUnknown(); + ServerEvents& forServer(); + ServerAppEvents& forServerApp(); + IKeyStateEvents& forIKeyState(); + IPrimaryScreenEvents& forIPrimaryScreen(); + IScreenEvents& forIScreen(); + ClipboardEvents& forClipboard(); + FileEvents& forFile(); private: - ClientEvents* m_typesForClient; - IStreamEvents* m_typesForIStream; - IpcClientEvents* m_typesForIpcClient; - IpcClientProxyEvents* m_typesForIpcClientProxy; - IpcServerEvents* m_typesForIpcServer; - IpcServerProxyEvents* m_typesForIpcServerProxy; - IDataSocketEvents* m_typesForIDataSocket; - IListenSocketEvents* m_typesForIListenSocket; - ISocketEvents* m_typesForISocket; - OSXScreenEvents* m_typesForOSXScreen; - ClientListenerEvents* m_typesForClientListener; - ClientProxyEvents* m_typesForClientProxy; - ClientProxyUnknownEvents* m_typesForClientProxyUnknown; - ServerEvents* m_typesForServer; - ServerAppEvents* m_typesForServerApp; - IKeyStateEvents* m_typesForIKeyState; - IPrimaryScreenEvents* m_typesForIPrimaryScreen; - IScreenEvents* m_typesForIScreen; - ClipboardEvents* m_typesForClipboard; - FileEvents* m_typesForFile; - Mutex* m_readyMutex; - CondVar* m_readyCondVar; - std::queue m_pending; + ClientEvents* m_typesForClient; + IStreamEvents* m_typesForIStream; + IpcClientEvents* m_typesForIpcClient; + IpcClientProxyEvents* m_typesForIpcClientProxy; + IpcServerEvents* m_typesForIpcServer; + IpcServerProxyEvents* m_typesForIpcServerProxy; + IDataSocketEvents* m_typesForIDataSocket; + IListenSocketEvents* m_typesForIListenSocket; + ISocketEvents* m_typesForISocket; + OSXScreenEvents* m_typesForOSXScreen; + ClientListenerEvents* m_typesForClientListener; + ClientProxyEvents* m_typesForClientProxy; + ClientProxyUnknownEvents* m_typesForClientProxyUnknown; + ServerEvents* m_typesForServer; + ServerAppEvents* m_typesForServerApp; + IKeyStateEvents* m_typesForIKeyState; + IPrimaryScreenEvents* m_typesForIPrimaryScreen; + IScreenEvents* m_typesForIScreen; + ClipboardEvents* m_typesForClipboard; + FileEvents* m_typesForFile; + Mutex* m_readyMutex; + CondVar* m_readyCondVar; + std::queue m_pending; }; -#define EVENT_TYPE_ACCESSOR(type_) \ -type_##Events& \ -EventQueue::for##type_() { \ - if (m_typesFor##type_ == NULL) { \ - m_typesFor##type_ = new type_##Events(); \ - m_typesFor##type_->setEvents(dynamic_cast(this)); \ - } \ - return *m_typesFor##type_; \ +#define EVENT_TYPE_ACCESSOR(type_) \ +type_##Events& \ +EventQueue::for##type_() { \ + if (m_typesFor##type_ == NULL) { \ + m_typesFor##type_ = new type_##Events(); \ + m_typesFor##type_->setEvents(dynamic_cast(this)); \ + } \ + return *m_typesFor##type_; \ } diff --git a/src/lib/base/EventTypes.cpp b/src/lib/base/EventTypes.cpp index 2fd9d56d..6f1370fe 100644 --- a/src/lib/base/EventTypes.cpp +++ b/src/lib/base/EventTypes.cpp @@ -22,21 +22,21 @@ #include EventTypes::EventTypes() : - m_events(NULL) + m_events(NULL) { } IEventQueue* EventTypes::getEvents() const { - assert(m_events != NULL); - return m_events; + assert(m_events != NULL); + return m_events; } void EventTypes::setEvents(IEventQueue* events) { - m_events = events; + m_events = events; } // diff --git a/src/lib/base/EventTypes.h b/src/lib/base/EventTypes.h index 29409624..1d0b61e8 100644 --- a/src/lib/base/EventTypes.h +++ b/src/lib/base/EventTypes.h @@ -23,732 +23,732 @@ class IEventQueue; class EventTypes { public: - EventTypes(); - void setEvents(IEventQueue* events); + EventTypes(); + void setEvents(IEventQueue* events); protected: - IEventQueue* getEvents() const; + IEventQueue* getEvents() const; private: - IEventQueue* m_events; + IEventQueue* m_events; }; -#define REGISTER_EVENT(type_, name_) \ -Event::Type \ -type_##Events::name_() \ -{ \ - return getEvents()->registerTypeOnce(m_##name_, __FUNCTION__); \ +#define REGISTER_EVENT(type_, name_) \ +Event::Type \ +type_##Events::name_() \ +{ \ + return getEvents()->registerTypeOnce(m_##name_, __FUNCTION__); \ } class ClientEvents : public EventTypes { public: - ClientEvents() : - m_connected(Event::kUnknown), - m_connectionFailed(Event::kUnknown), - m_disconnected(Event::kUnknown) { } + ClientEvents() : + m_connected(Event::kUnknown), + m_connectionFailed(Event::kUnknown), + m_disconnected(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get connected event type - /*! - Returns the connected event type. This is sent when the client has - successfully connected to the server. - */ - Event::Type connected(); + //! Get connected event type + /*! + Returns the connected event type. This is sent when the client has + successfully connected to the server. + */ + Event::Type connected(); - //! Get connection failed event type - /*! - Returns the connection failed event type. This is sent when the - server fails for some reason. The event data is a FailInfo*. - */ - Event::Type connectionFailed(); + //! Get connection failed event type + /*! + Returns the connection failed event type. This is sent when the + server fails for some reason. The event data is a FailInfo*. + */ + Event::Type connectionFailed(); - //! Get disconnected event type - /*! - Returns the disconnected event type. This is sent when the client - has disconnected from the server (and only after having successfully - connected). - */ - Event::Type disconnected(); + //! Get disconnected event type + /*! + Returns the disconnected event type. This is sent when the client + has disconnected from the server (and only after having successfully + connected). + */ + Event::Type disconnected(); - //@} + //@} private: - Event::Type m_connected; - Event::Type m_connectionFailed; - Event::Type m_disconnected; + Event::Type m_connected; + Event::Type m_connectionFailed; + Event::Type m_disconnected; }; class IStreamEvents : public EventTypes { public: - IStreamEvents() : - m_inputReady(Event::kUnknown), - m_outputFlushed(Event::kUnknown), - m_outputError(Event::kUnknown), - m_inputShutdown(Event::kUnknown), - m_outputShutdown(Event::kUnknown) { } + IStreamEvents() : + m_inputReady(Event::kUnknown), + m_outputFlushed(Event::kUnknown), + m_outputError(Event::kUnknown), + m_inputShutdown(Event::kUnknown), + m_outputShutdown(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get input ready event type - /*! - Returns the input ready event type. A stream sends this event - when \c read() will return with data. - */ - Event::Type inputReady(); + //! Get input ready event type + /*! + Returns the input ready event type. A stream sends this event + when \c read() will return with data. + */ + Event::Type inputReady(); - //! Get output flushed event type - /*! - Returns the output flushed event type. A stream sends this event - when the output buffer has been flushed. If there have been no - writes since the event was posted, calling \c shutdownOutput() or - \c close() will not discard any data and \c flush() will return - immediately. - */ - Event::Type outputFlushed(); + //! Get output flushed event type + /*! + Returns the output flushed event type. A stream sends this event + when the output buffer has been flushed. If there have been no + writes since the event was posted, calling \c shutdownOutput() or + \c close() will not discard any data and \c flush() will return + immediately. + */ + Event::Type outputFlushed(); - //! Get output error event type - /*! - Returns the output error event type. A stream sends this event - when a write has failed. - */ - Event::Type outputError(); + //! Get output error event type + /*! + Returns the output error event type. A stream sends this event + when a write has failed. + */ + Event::Type outputError(); - //! Get input shutdown event type - /*! - Returns the input shutdown event type. This is sent when the - input side of the stream has shutdown. When the input has - shutdown, no more data will ever be available to read. - */ - Event::Type inputShutdown(); + //! Get input shutdown event type + /*! + Returns the input shutdown event type. This is sent when the + input side of the stream has shutdown. When the input has + shutdown, no more data will ever be available to read. + */ + Event::Type inputShutdown(); - //! Get output shutdown event type - /*! - Returns the output shutdown event type. This is sent when the - output side of the stream has shutdown. When the output has - shutdown, no more data can ever be written to the stream. Any - attempt to do so will generate a output error event. - */ - Event::Type outputShutdown(); + //! Get output shutdown event type + /*! + Returns the output shutdown event type. This is sent when the + output side of the stream has shutdown. When the output has + shutdown, no more data can ever be written to the stream. Any + attempt to do so will generate a output error event. + */ + Event::Type outputShutdown(); - //@} - + //@} + private: - Event::Type m_inputReady; - Event::Type m_outputFlushed; - Event::Type m_outputError; - Event::Type m_inputShutdown; - Event::Type m_outputShutdown; + Event::Type m_inputReady; + Event::Type m_outputFlushed; + Event::Type m_outputError; + Event::Type m_inputShutdown; + Event::Type m_outputShutdown; }; class IpcClientEvents : public EventTypes { public: - IpcClientEvents() : - m_connected(Event::kUnknown), - m_messageReceived(Event::kUnknown) { } + IpcClientEvents() : + m_connected(Event::kUnknown), + m_messageReceived(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Raised when the socket is connected. - Event::Type connected(); + //! Raised when the socket is connected. + Event::Type connected(); - //! Raised when a message is received. - Event::Type messageReceived(); + //! Raised when a message is received. + Event::Type messageReceived(); - //@} - + //@} + private: - Event::Type m_connected; - Event::Type m_messageReceived; + Event::Type m_connected; + Event::Type m_messageReceived; }; class IpcClientProxyEvents : public EventTypes { public: - IpcClientProxyEvents() : - m_messageReceived(Event::kUnknown), - m_disconnected(Event::kUnknown) { } + IpcClientProxyEvents() : + m_messageReceived(Event::kUnknown), + m_disconnected(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Raised when the server receives a message from a client. - Event::Type messageReceived(); + //! Raised when the server receives a message from a client. + Event::Type messageReceived(); - //! Raised when the client disconnects from the server. - Event::Type disconnected(); - - //@} + //! Raised when the client disconnects from the server. + Event::Type disconnected(); + + //@} private: - Event::Type m_messageReceived; - Event::Type m_disconnected; + Event::Type m_messageReceived; + Event::Type m_disconnected; }; class IpcServerEvents : public EventTypes { public: - IpcServerEvents() : - m_clientConnected(Event::kUnknown), - m_messageReceived(Event::kUnknown) { } + IpcServerEvents() : + m_clientConnected(Event::kUnknown), + m_messageReceived(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Raised when we have created the client proxy. - Event::Type clientConnected(); - - //! Raised when a message is received through a client proxy. - Event::Type messageReceived(); + //! Raised when we have created the client proxy. + Event::Type clientConnected(); + + //! Raised when a message is received through a client proxy. + Event::Type messageReceived(); - //@} + //@} private: - Event::Type m_clientConnected; - Event::Type m_messageReceived; + Event::Type m_clientConnected; + Event::Type m_messageReceived; }; class IpcServerProxyEvents : public EventTypes { public: - IpcServerProxyEvents() : - m_messageReceived(Event::kUnknown) { } + IpcServerProxyEvents() : + m_messageReceived(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Raised when the client receives a message from the server. - Event::Type messageReceived(); + //! Raised when the client receives a message from the server. + Event::Type messageReceived(); - //@} + //@} private: - Event::Type m_messageReceived; + Event::Type m_messageReceived; }; class IDataSocketEvents : public EventTypes { public: - IDataSocketEvents() : - m_connected(Event::kUnknown), - m_secureConnected(Event::kUnknown), - m_connectionFailed(Event::kUnknown) { } + IDataSocketEvents() : + m_connected(Event::kUnknown), + m_secureConnected(Event::kUnknown), + m_connectionFailed(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get connected event type - /*! - Returns the socket connected event type. A socket sends this - event when a remote connection has been established. - */ - Event::Type connected(); - - //! Get secure connected event type - /*! - Returns the secure socket connected event type. A secure socket sends - this event when a remote connection has been established. - */ - Event::Type secureConnected(); + //! Get connected event type + /*! + Returns the socket connected event type. A socket sends this + event when a remote connection has been established. + */ + Event::Type connected(); + + //! Get secure connected event type + /*! + Returns the secure socket connected event type. A secure socket sends + this event when a remote connection has been established. + */ + Event::Type secureConnected(); - //! Get connection failed event type - /*! - Returns the socket connection failed event type. A socket sends - this event when an attempt to connect to a remote port has failed. - The data is a pointer to a ConnectionFailedInfo. - */ - Event::Type connectionFailed(); + //! Get connection failed event type + /*! + Returns the socket connection failed event type. A socket sends + this event when an attempt to connect to a remote port has failed. + The data is a pointer to a ConnectionFailedInfo. + */ + Event::Type connectionFailed(); - //@} + //@} private: - Event::Type m_connected; - Event::Type m_secureConnected; - Event::Type m_connectionFailed; + Event::Type m_connected; + Event::Type m_secureConnected; + Event::Type m_connectionFailed; }; class IListenSocketEvents : public EventTypes { public: - IListenSocketEvents() : - m_connecting(Event::kUnknown) { } + IListenSocketEvents() : + m_connecting(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get connecting event type - /*! - Returns the socket connecting event type. A socket sends this - event when a remote connection is waiting to be accepted. - */ - Event::Type connecting(); + //! Get connecting event type + /*! + Returns the socket connecting event type. A socket sends this + event when a remote connection is waiting to be accepted. + */ + Event::Type connecting(); - //@} + //@} private: - Event::Type m_connecting; + Event::Type m_connecting; }; class ISocketEvents : public EventTypes { public: - ISocketEvents() : - m_disconnected(Event::kUnknown), - m_stopRetry(Event::kUnknown) { } + ISocketEvents() : + m_disconnected(Event::kUnknown), + m_stopRetry(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get disconnected event type - /*! - Returns the socket disconnected event type. A socket sends this - event when the remote side of the socket has disconnected or - shutdown both input and output. - */ - Event::Type disconnected(); + //! Get disconnected event type + /*! + Returns the socket disconnected event type. A socket sends this + event when the remote side of the socket has disconnected or + shutdown both input and output. + */ + Event::Type disconnected(); - //! Get stop retry event type - /*! - Returns the stop retry event type. This is sent when the client - doesn't want to reconnect after it disconnects from the server. - */ - Event::Type stopRetry(); + //! Get stop retry event type + /*! + Returns the stop retry event type. This is sent when the client + doesn't want to reconnect after it disconnects from the server. + */ + Event::Type stopRetry(); - //@} + //@} private: - Event::Type m_disconnected; - Event::Type m_stopRetry; + Event::Type m_disconnected; + Event::Type m_stopRetry; }; class OSXScreenEvents : public EventTypes { public: - OSXScreenEvents() : - m_confirmSleep(Event::kUnknown) { } + OSXScreenEvents() : + m_confirmSleep(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - Event::Type confirmSleep(); + Event::Type confirmSleep(); - //@} + //@} private: - Event::Type m_confirmSleep; + Event::Type m_confirmSleep; }; class ClientListenerEvents : public EventTypes { public: - ClientListenerEvents() : - m_accepted(Event::kUnknown), - m_connected(Event::kUnknown) { } + ClientListenerEvents() : + m_accepted(Event::kUnknown), + m_connected(Event::kUnknown) { } - //! @name accessors - //@{ - - //! Get accepted event type - /*! - Returns the accepted event type. This is sent whenever a server - accepts a client. - */ - Event::Type accepted(); - - //! Get connected event type - /*! - Returns the connected event type. This is sent whenever a - a client connects. - */ - Event::Type connected(); + //! @name accessors + //@{ + + //! Get accepted event type + /*! + Returns the accepted event type. This is sent whenever a server + accepts a client. + */ + Event::Type accepted(); + + //! Get connected event type + /*! + Returns the connected event type. This is sent whenever a + a client connects. + */ + Event::Type connected(); - //@} + //@} private: - Event::Type m_accepted; - Event::Type m_connected; + Event::Type m_accepted; + Event::Type m_connected; }; class ClientProxyEvents : public EventTypes { public: - ClientProxyEvents() : - m_ready(Event::kUnknown), - m_disconnected(Event::kUnknown) { } + ClientProxyEvents() : + m_ready(Event::kUnknown), + m_disconnected(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get ready event type - /*! - Returns the ready event type. This is sent when the client has - completed the initial handshake. Until it is sent, the client is - not fully connected. - */ - Event::Type ready(); + //! Get ready event type + /*! + Returns the ready event type. This is sent when the client has + completed the initial handshake. Until it is sent, the client is + not fully connected. + */ + Event::Type ready(); - //! Get disconnect event type - /*! - Returns the disconnect event type. This is sent when the client - disconnects or is disconnected. The target is getEventTarget(). - */ - Event::Type disconnected(); + //! Get disconnect event type + /*! + Returns the disconnect event type. This is sent when the client + disconnects or is disconnected. The target is getEventTarget(). + */ + Event::Type disconnected(); - //@} + //@} private: - Event::Type m_ready; - Event::Type m_disconnected; + Event::Type m_ready; + Event::Type m_disconnected; }; class ClientProxyUnknownEvents : public EventTypes { public: - ClientProxyUnknownEvents() : - m_success(Event::kUnknown), - m_failure(Event::kUnknown) { } + ClientProxyUnknownEvents() : + m_success(Event::kUnknown), + m_failure(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get success event type - /*! - Returns the success event type. This is sent when the client has - correctly responded to the hello message. The target is this. - */ - Event::Type success(); + //! Get success event type + /*! + Returns the success event type. This is sent when the client has + correctly responded to the hello message. The target is this. + */ + Event::Type success(); - //! Get failure event type - /*! - Returns the failure event type. This is sent when a client fails - to correctly respond to the hello message. The target is this. - */ - Event::Type failure(); + //! Get failure event type + /*! + Returns the failure event type. This is sent when a client fails + to correctly respond to the hello message. The target is this. + */ + Event::Type failure(); - //@} - + //@} + private: - Event::Type m_success; - Event::Type m_failure; + Event::Type m_success; + Event::Type m_failure; }; class ServerEvents : public EventTypes { public: - ServerEvents() : - m_error(Event::kUnknown), - m_connected(Event::kUnknown), - m_disconnected(Event::kUnknown), - m_switchToScreen(Event::kUnknown), - m_switchInDirection(Event::kUnknown), - m_keyboardBroadcast(Event::kUnknown), - m_lockCursorToScreen(Event::kUnknown), - m_screenSwitched(Event::kUnknown) { } + ServerEvents() : + m_error(Event::kUnknown), + m_connected(Event::kUnknown), + m_disconnected(Event::kUnknown), + m_switchToScreen(Event::kUnknown), + m_switchInDirection(Event::kUnknown), + m_keyboardBroadcast(Event::kUnknown), + m_lockCursorToScreen(Event::kUnknown), + m_screenSwitched(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get error event type - /*! - Returns the error event type. This is sent when the server fails - for some reason. - */ - Event::Type error(); + //! Get error event type + /*! + Returns the error event type. This is sent when the server fails + for some reason. + */ + Event::Type error(); - //! Get connected event type - /*! - Returns the connected event type. This is sent when a client screen - has connected. The event data is a \c ScreenConnectedInfo* that - indicates the connected screen. - */ - Event::Type connected(); + //! Get connected event type + /*! + Returns the connected event type. This is sent when a client screen + has connected. The event data is a \c ScreenConnectedInfo* that + indicates the connected screen. + */ + Event::Type connected(); - //! Get disconnected event type - /*! - Returns the disconnected event type. This is sent when all the - clients have disconnected. - */ - Event::Type disconnected(); + //! Get disconnected event type + /*! + Returns the disconnected event type. This is sent when all the + clients have disconnected. + */ + Event::Type disconnected(); - //! Get switch to screen event type - /*! - Returns the switch to screen event type. The server responds to this - by switching screens. The event data is a \c SwitchToScreenInfo* - that indicates the target screen. - */ - Event::Type switchToScreen(); + //! Get switch to screen event type + /*! + Returns the switch to screen event type. The server responds to this + by switching screens. The event data is a \c SwitchToScreenInfo* + that indicates the target screen. + */ + Event::Type switchToScreen(); - //! Get switch in direction event type - /*! - Returns the switch in direction event type. The server responds to this - by switching screens. The event data is a \c SwitchInDirectionInfo* - that indicates the target direction. - */ - Event::Type switchInDirection(); + //! Get switch in direction event type + /*! + Returns the switch in direction event type. The server responds to this + by switching screens. The event data is a \c SwitchInDirectionInfo* + that indicates the target direction. + */ + Event::Type switchInDirection(); - //! Get keyboard broadcast event type - /*! - Returns the keyboard broadcast event type. The server responds - to this by turning on keyboard broadcasting or turning it off. The - event data is a \c KeyboardBroadcastInfo*. - */ - Event::Type keyboardBroadcast(); + //! Get keyboard broadcast event type + /*! + Returns the keyboard broadcast event type. The server responds + to this by turning on keyboard broadcasting or turning it off. The + event data is a \c KeyboardBroadcastInfo*. + */ + Event::Type keyboardBroadcast(); - //! Get lock cursor event type - /*! - Returns the lock cursor event type. The server responds to this - by locking the cursor to the active screen or unlocking it. The - event data is a \c LockCursorToScreenInfo*. - */ - Event::Type lockCursorToScreen(); + //! Get lock cursor event type + /*! + Returns the lock cursor event type. The server responds to this + by locking the cursor to the active screen or unlocking it. The + event data is a \c LockCursorToScreenInfo*. + */ + Event::Type lockCursorToScreen(); - //! Get screen switched event type - /*! - Returns the screen switched event type. This is raised when the - screen has been switched to a client. - */ - Event::Type screenSwitched(); + //! Get screen switched event type + /*! + Returns the screen switched event type. This is raised when the + screen has been switched to a client. + */ + Event::Type screenSwitched(); - //@} - + //@} + private: - Event::Type m_error; - Event::Type m_connected; - Event::Type m_disconnected; - Event::Type m_switchToScreen; - Event::Type m_switchInDirection; - Event::Type m_keyboardBroadcast; - Event::Type m_lockCursorToScreen; - Event::Type m_screenSwitched; + Event::Type m_error; + Event::Type m_connected; + Event::Type m_disconnected; + Event::Type m_switchToScreen; + Event::Type m_switchInDirection; + Event::Type m_keyboardBroadcast; + Event::Type m_lockCursorToScreen; + Event::Type m_screenSwitched; }; class ServerAppEvents : public EventTypes { public: - ServerAppEvents() : - m_reloadConfig(Event::kUnknown), - m_forceReconnect(Event::kUnknown), - m_resetServer(Event::kUnknown) { } - - //! @name accessors - //@{ - - Event::Type reloadConfig(); - Event::Type forceReconnect(); - Event::Type resetServer(); + ServerAppEvents() : + m_reloadConfig(Event::kUnknown), + m_forceReconnect(Event::kUnknown), + m_resetServer(Event::kUnknown) { } + + //! @name accessors + //@{ + + Event::Type reloadConfig(); + Event::Type forceReconnect(); + Event::Type resetServer(); - //@} - + //@} + private: - Event::Type m_reloadConfig; - Event::Type m_forceReconnect; - Event::Type m_resetServer; + Event::Type m_reloadConfig; + Event::Type m_forceReconnect; + Event::Type m_resetServer; }; class IKeyStateEvents : public EventTypes { public: - IKeyStateEvents() : - m_keyDown(Event::kUnknown), - m_keyUp(Event::kUnknown), - m_keyRepeat(Event::kUnknown) { } + IKeyStateEvents() : + m_keyDown(Event::kUnknown), + m_keyUp(Event::kUnknown), + m_keyRepeat(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get key down event type. Event data is KeyInfo*, count == 1. - Event::Type keyDown(); + //! Get key down event type. Event data is KeyInfo*, count == 1. + Event::Type keyDown(); - //! Get key up event type. Event data is KeyInfo*, count == 1. - Event::Type keyUp(); + //! Get key up event type. Event data is KeyInfo*, count == 1. + Event::Type keyUp(); - //! Get key repeat event type. Event data is KeyInfo*. - Event::Type keyRepeat(); + //! Get key repeat event type. Event data is KeyInfo*. + Event::Type keyRepeat(); - //@} - + //@} + private: - Event::Type m_keyDown; - Event::Type m_keyUp; - Event::Type m_keyRepeat; + Event::Type m_keyDown; + Event::Type m_keyUp; + Event::Type m_keyRepeat; }; class IPrimaryScreenEvents : public EventTypes { public: - IPrimaryScreenEvents() : - m_buttonDown(Event::kUnknown), - m_buttonUp(Event::kUnknown), - m_motionOnPrimary(Event::kUnknown), - m_motionOnSecondary(Event::kUnknown), - m_wheel(Event::kUnknown), - m_screensaverActivated(Event::kUnknown), - m_screensaverDeactivated(Event::kUnknown), - m_hotKeyDown(Event::kUnknown), - m_hotKeyUp(Event::kUnknown), - m_fakeInputBegin(Event::kUnknown), - m_fakeInputEnd(Event::kUnknown) { } + IPrimaryScreenEvents() : + m_buttonDown(Event::kUnknown), + m_buttonUp(Event::kUnknown), + m_motionOnPrimary(Event::kUnknown), + m_motionOnSecondary(Event::kUnknown), + m_wheel(Event::kUnknown), + m_screensaverActivated(Event::kUnknown), + m_screensaverDeactivated(Event::kUnknown), + m_hotKeyDown(Event::kUnknown), + m_hotKeyUp(Event::kUnknown), + m_fakeInputBegin(Event::kUnknown), + m_fakeInputEnd(Event::kUnknown) { } - //! @name accessors - //@{ - - //! button down event type. Event data is ButtonInfo*. - Event::Type buttonDown(); + //! @name accessors + //@{ + + //! button down event type. Event data is ButtonInfo*. + Event::Type buttonDown(); - //! button up event type. Event data is ButtonInfo*. - Event::Type buttonUp(); + //! button up event type. Event data is ButtonInfo*. + Event::Type buttonUp(); - //! mouse motion on the primary screen event type - /*! - Event data is MotionInfo* and the values are an absolute position. - */ - Event::Type motionOnPrimary(); + //! mouse motion on the primary screen event type + /*! + Event data is MotionInfo* and the values are an absolute position. + */ + Event::Type motionOnPrimary(); - //! mouse motion on a secondary screen event type - /*! - Event data is MotionInfo* and the values are motion deltas not - absolute coordinates. - */ - Event::Type motionOnSecondary(); + //! mouse motion on a secondary screen event type + /*! + Event data is MotionInfo* and the values are motion deltas not + absolute coordinates. + */ + Event::Type motionOnSecondary(); - //! mouse wheel event type. Event data is WheelInfo*. - Event::Type wheel(); + //! mouse wheel event type. Event data is WheelInfo*. + Event::Type wheel(); - //! screensaver activated event type - Event::Type screensaverActivated(); + //! screensaver activated event type + Event::Type screensaverActivated(); - //! screensaver deactivated event type - Event::Type screensaverDeactivated(); + //! screensaver deactivated event type + Event::Type screensaverDeactivated(); - //! hot key down event type. Event data is HotKeyInfo*. - Event::Type hotKeyDown(); + //! hot key down event type. Event data is HotKeyInfo*. + Event::Type hotKeyDown(); - //! hot key up event type. Event data is HotKeyInfo*. - Event::Type hotKeyUp(); + //! hot key up event type. Event data is HotKeyInfo*. + Event::Type hotKeyUp(); - //! start of fake input event type - Event::Type fakeInputBegin(); + //! start of fake input event type + Event::Type fakeInputBegin(); - //! end of fake input event type - Event::Type fakeInputEnd(); + //! end of fake input event type + Event::Type fakeInputEnd(); - //@} + //@} private: - Event::Type m_buttonDown; - Event::Type m_buttonUp; - Event::Type m_motionOnPrimary; - Event::Type m_motionOnSecondary; - Event::Type m_wheel; - Event::Type m_screensaverActivated; - Event::Type m_screensaverDeactivated; - Event::Type m_hotKeyDown; - Event::Type m_hotKeyUp; - Event::Type m_fakeInputBegin; - Event::Type m_fakeInputEnd; + Event::Type m_buttonDown; + Event::Type m_buttonUp; + Event::Type m_motionOnPrimary; + Event::Type m_motionOnSecondary; + Event::Type m_wheel; + Event::Type m_screensaverActivated; + Event::Type m_screensaverDeactivated; + Event::Type m_hotKeyDown; + Event::Type m_hotKeyUp; + Event::Type m_fakeInputBegin; + Event::Type m_fakeInputEnd; }; class IScreenEvents : public EventTypes { public: - IScreenEvents() : - m_error(Event::kUnknown), - m_shapeChanged(Event::kUnknown), - m_suspend(Event::kUnknown), - m_resume(Event::kUnknown) { } + IScreenEvents() : + m_error(Event::kUnknown), + m_shapeChanged(Event::kUnknown), + m_suspend(Event::kUnknown), + m_resume(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get error event type - /*! - Returns the error event type. This is sent whenever the screen has - failed for some reason (e.g. the X Windows server died). - */ - Event::Type error(); + //! Get error event type + /*! + Returns the error event type. This is sent whenever the screen has + failed for some reason (e.g. the X Windows server died). + */ + Event::Type error(); - //! Get shape changed event type - /*! - Returns the shape changed event type. This is sent whenever the - screen's shape changes. - */ - Event::Type shapeChanged(); + //! Get shape changed event type + /*! + Returns the shape changed event type. This is sent whenever the + screen's shape changes. + */ + Event::Type shapeChanged(); - //! Get suspend event type - /*! - Returns the suspend event type. This is sent whenever the system goes - to sleep or a user session is deactivated (fast user switching). - */ - Event::Type suspend(); - - //! Get resume event type - /*! - Returns the resume event type. This is sent whenever the system wakes - up or a user session is activated (fast user switching). - */ - Event::Type resume(); + //! Get suspend event type + /*! + Returns the suspend event type. This is sent whenever the system goes + to sleep or a user session is deactivated (fast user switching). + */ + Event::Type suspend(); + + //! Get resume event type + /*! + Returns the resume event type. This is sent whenever the system wakes + up or a user session is activated (fast user switching). + */ + Event::Type resume(); - //@} - + //@} + private: - Event::Type m_error; - Event::Type m_shapeChanged; - Event::Type m_suspend; - Event::Type m_resume; + Event::Type m_error; + Event::Type m_shapeChanged; + Event::Type m_suspend; + Event::Type m_resume; }; class ClipboardEvents : public EventTypes { public: - ClipboardEvents() : - m_clipboardGrabbed(Event::kUnknown), - m_clipboardChanged(Event::kUnknown), - m_clipboardSending(Event::kUnknown) { } + ClipboardEvents() : + m_clipboardGrabbed(Event::kUnknown), + m_clipboardChanged(Event::kUnknown), + m_clipboardSending(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get clipboard grabbed event type - /*! - Returns the clipboard grabbed event type. This is sent whenever the - clipboard is grabbed by some other application so we don't own it - anymore. The data is a pointer to a ClipboardInfo. - */ - Event::Type clipboardGrabbed(); + //! Get clipboard grabbed event type + /*! + Returns the clipboard grabbed event type. This is sent whenever the + clipboard is grabbed by some other application so we don't own it + anymore. The data is a pointer to a ClipboardInfo. + */ + Event::Type clipboardGrabbed(); - //! Get clipboard changed event type - /*! - Returns the clipboard changed event type. This is sent whenever the - contents of the clipboard has changed. The data is a pointer to a - IScreen::ClipboardInfo. - */ - Event::Type clipboardChanged(); + //! Get clipboard changed event type + /*! + Returns the clipboard changed event type. This is sent whenever the + contents of the clipboard has changed. The data is a pointer to a + IScreen::ClipboardInfo. + */ + Event::Type clipboardChanged(); - //! Clipboard sending event type - /*! - Returns the clipboard sending event type. This is used to send - clipboard chunks. - */ - Event::Type clipboardSending(); + //! Clipboard sending event type + /*! + Returns the clipboard sending event type. This is used to send + clipboard chunks. + */ + Event::Type clipboardSending(); - //@} + //@} private: - Event::Type m_clipboardGrabbed; - Event::Type m_clipboardChanged; - Event::Type m_clipboardSending; + Event::Type m_clipboardGrabbed; + Event::Type m_clipboardChanged; + Event::Type m_clipboardSending; }; class FileEvents : public EventTypes { public: - FileEvents() : - m_fileChunkSending(Event::kUnknown), - m_fileRecieveCompleted(Event::kUnknown), - m_keepAlive(Event::kUnknown) { } + FileEvents() : + m_fileChunkSending(Event::kUnknown), + m_fileRecieveCompleted(Event::kUnknown), + m_keepAlive(Event::kUnknown) { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Sending a file chunk - Event::Type fileChunkSending(); + //! Sending a file chunk + Event::Type fileChunkSending(); - //! Completed receiving a file - Event::Type fileRecieveCompleted(); + //! Completed receiving a file + Event::Type fileRecieveCompleted(); - //! Send a keep alive - Event::Type keepAlive(); + //! Send a keep alive + Event::Type keepAlive(); - //@} + //@} private: - Event::Type m_fileChunkSending; - Event::Type m_fileRecieveCompleted; - Event::Type m_keepAlive; + Event::Type m_fileChunkSending; + Event::Type m_fileRecieveCompleted; + Event::Type m_keepAlive; }; diff --git a/src/lib/base/FunctionEventJob.cpp b/src/lib/base/FunctionEventJob.cpp index dbd461c1..88ea35c6 100644 --- a/src/lib/base/FunctionEventJob.cpp +++ b/src/lib/base/FunctionEventJob.cpp @@ -23,22 +23,22 @@ // FunctionEventJob::FunctionEventJob( - void (*func)(const Event&, void*), void* arg) : - m_func(func), - m_arg(arg) + void (*func)(const Event&, void*), void* arg) : + m_func(func), + m_arg(arg) { - // do nothing + // do nothing } FunctionEventJob::~FunctionEventJob() { - // do nothing + // do nothing } void FunctionEventJob::run(const Event& event) { - if (m_func != NULL) { - m_func(event, m_arg); - } + if (m_func != NULL) { + m_func(event, m_arg); + } } diff --git a/src/lib/base/FunctionEventJob.h b/src/lib/base/FunctionEventJob.h index 5e7bf650..05f30cab 100644 --- a/src/lib/base/FunctionEventJob.h +++ b/src/lib/base/FunctionEventJob.h @@ -26,14 +26,14 @@ An event job class that invokes a function. */ class FunctionEventJob : public IEventJob { public: - //! run() invokes \c func(arg) - FunctionEventJob(void (*func)(const Event&, void*), void* arg = NULL); - virtual ~FunctionEventJob(); + //! run() invokes \c func(arg) + FunctionEventJob(void (*func)(const Event&, void*), void* arg = NULL); + virtual ~FunctionEventJob(); - // IEventJob overrides - virtual void run(const Event&); + // IEventJob overrides + virtual void run(const Event&); private: - void (*m_func)(const Event&, void*); - void* m_arg; + void (*m_func)(const Event&, void*); + void* m_arg; }; diff --git a/src/lib/base/FunctionJob.cpp b/src/lib/base/FunctionJob.cpp index 74b17a06..10b06c44 100644 --- a/src/lib/base/FunctionJob.cpp +++ b/src/lib/base/FunctionJob.cpp @@ -23,21 +23,21 @@ // FunctionJob::FunctionJob(void (*func)(void*), void* arg) : - m_func(func), - m_arg(arg) + m_func(func), + m_arg(arg) { - // do nothing + // do nothing } FunctionJob::~FunctionJob() { - // do nothing + // do nothing } void FunctionJob::run() { - if (m_func != NULL) { - m_func(m_arg); - } + if (m_func != NULL) { + m_func(m_arg); + } } diff --git a/src/lib/base/FunctionJob.h b/src/lib/base/FunctionJob.h index 2f7c3091..1f8aea97 100644 --- a/src/lib/base/FunctionJob.h +++ b/src/lib/base/FunctionJob.h @@ -26,14 +26,14 @@ A job class that invokes a function. */ class FunctionJob : public IJob { public: - //! run() invokes \c func(arg) - FunctionJob(void (*func)(void*), void* arg = NULL); - virtual ~FunctionJob(); + //! run() invokes \c func(arg) + FunctionJob(void (*func)(void*), void* arg = NULL); + virtual ~FunctionJob(); - // IJob overrides - virtual void run(); + // IJob overrides + virtual void run(); private: - void (*m_func)(void*); - void* m_arg; + void (*m_func)(void*); + void* m_arg; }; diff --git a/src/lib/base/IEventJob.h b/src/lib/base/IEventJob.h index e668228a..8d3c5ed3 100644 --- a/src/lib/base/IEventJob.h +++ b/src/lib/base/IEventJob.h @@ -28,6 +28,6 @@ An event job is an interface for executing a event handler. */ class IEventJob : public IInterface { public: - //! Run the job - virtual void run(const Event&) = 0; + //! Run the job + virtual void run(const Event&) = 0; }; diff --git a/src/lib/base/IEventQueue.h b/src/lib/base/IEventQueue.h index 9d838de7..82b27108 100644 --- a/src/lib/base/IEventQueue.h +++ b/src/lib/base/IEventQueue.h @@ -60,192 +60,192 @@ timers which generate events periodically. */ class IEventQueue : public IInterface { public: - class TimerEvent { - public: - EventQueueTimer* m_timer; //!< The timer - UInt32 m_count; //!< Number of repeats - }; + class TimerEvent { + public: + EventQueueTimer* m_timer; //!< The timer + UInt32 m_count; //!< Number of repeats + }; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Loop the event queue until quit - /*! - Dequeues and dispatches events until the kQuit event is found. - */ - virtual void loop() = 0; + //! Loop the event queue until quit + /*! + Dequeues and dispatches events until the kQuit event is found. + */ + virtual void loop() = 0; - //! Set the buffer - /*! - Replace the current event queue buffer. Any queued events are - discarded. The queue takes ownership of the buffer. - */ - virtual void adoptBuffer(IEventQueueBuffer*) = 0; + //! Set the buffer + /*! + Replace the current event queue buffer. Any queued events are + discarded. The queue takes ownership of the buffer. + */ + virtual void adoptBuffer(IEventQueueBuffer*) = 0; - //! Remove event from queue - /*! - Returns the next event on the queue into \p event. If no event is - available then blocks for up to \p timeout seconds, or forever if - \p timeout is negative. Returns true iff an event was available. - */ - virtual bool getEvent(Event& event, double timeout = -1.0) = 0; + //! Remove event from queue + /*! + Returns the next event on the queue into \p event. If no event is + available then blocks for up to \p timeout seconds, or forever if + \p timeout is negative. Returns true iff an event was available. + */ + virtual bool getEvent(Event& event, double timeout = -1.0) = 0; - //! Dispatch an event - /*! - Looks up the dispatcher for the event's target and invokes it. - Returns true iff a dispatcher exists for the target. - */ - virtual bool dispatchEvent(const Event& event) = 0; + //! Dispatch an event + /*! + Looks up the dispatcher for the event's target and invokes it. + Returns true iff a dispatcher exists for the target. + */ + virtual bool dispatchEvent(const Event& event) = 0; - //! Add event to queue - /*! - Adds \p event to the end of the queue. - */ - virtual void addEvent(const Event& event) = 0; + //! Add event to queue + /*! + Adds \p event to the end of the queue. + */ + virtual void addEvent(const Event& event) = 0; - //! Create a recurring timer - /*! - Creates and returns a timer. An event is returned after \p duration - seconds and the timer is reset to countdown again. When a timer event - is returned the data points to a \c TimerEvent. The client must pass - the returned timer to \c deleteTimer() (whether or not the timer has - expired) to release the timer. The returned timer event uses the - given \p target. If \p target is NULL it uses the returned timer as - the target. + //! Create a recurring timer + /*! + Creates and returns a timer. An event is returned after \p duration + seconds and the timer is reset to countdown again. When a timer event + is returned the data points to a \c TimerEvent. The client must pass + the returned timer to \c deleteTimer() (whether or not the timer has + expired) to release the timer. The returned timer event uses the + given \p target. If \p target is NULL it uses the returned timer as + the target. - Events for a single timer don't accumulate in the queue, even if the - client reading events can't keep up. Instead, the \c m_count member - of the \c TimerEvent indicates how many events for the timer would - have been put on the queue since the last event for the timer was - removed (or since the timer was added). - */ - virtual EventQueueTimer* - newTimer(double duration, void* target) = 0; + Events for a single timer don't accumulate in the queue, even if the + client reading events can't keep up. Instead, the \c m_count member + of the \c TimerEvent indicates how many events for the timer would + have been put on the queue since the last event for the timer was + removed (or since the timer was added). + */ + virtual EventQueueTimer* + newTimer(double duration, void* target) = 0; - //! Create a one-shot timer - /*! - Creates and returns a one-shot timer. An event is returned when - the timer expires and the timer is removed from further handling. - When a timer event is returned the data points to a \c TimerEvent. - The c_count member of the \c TimerEvent is always 1. The client - must pass the returned timer to \c deleteTimer() (whether or not the - timer has expired) to release the timer. The returned timer event - uses the given \p target. If \p target is NULL it uses the returned - timer as the target. - */ - virtual EventQueueTimer* - newOneShotTimer(double duration, - void* target) = 0; + //! Create a one-shot timer + /*! + Creates and returns a one-shot timer. An event is returned when + the timer expires and the timer is removed from further handling. + When a timer event is returned the data points to a \c TimerEvent. + The c_count member of the \c TimerEvent is always 1. The client + must pass the returned timer to \c deleteTimer() (whether or not the + timer has expired) to release the timer. The returned timer event + uses the given \p target. If \p target is NULL it uses the returned + timer as the target. + */ + virtual EventQueueTimer* + newOneShotTimer(double duration, + void* target) = 0; - //! Destroy a timer - /*! - Destroys a previously created timer. The timer is removed from the - queue and will not generate event, even if the timer has expired. - */ - virtual void deleteTimer(EventQueueTimer*) = 0; + //! Destroy a timer + /*! + Destroys a previously created timer. The timer is removed from the + queue and will not generate event, even if the timer has expired. + */ + virtual void deleteTimer(EventQueueTimer*) = 0; - //! Register an event handler for an event type - /*! - Registers an event handler for \p type and \p target. The \p handler - is adopted. Any existing handler for the type,target pair is deleted. - \c dispatchEvent() will invoke \p handler for any event for \p target - of type \p type. If no such handler exists it will use the handler - for \p target and type \p kUnknown if it exists. - */ - virtual void adoptHandler(Event::Type type, - void* target, IEventJob* handler) = 0; + //! Register an event handler for an event type + /*! + Registers an event handler for \p type and \p target. The \p handler + is adopted. Any existing handler for the type,target pair is deleted. + \c dispatchEvent() will invoke \p handler for any event for \p target + of type \p type. If no such handler exists it will use the handler + for \p target and type \p kUnknown if it exists. + */ + virtual void adoptHandler(Event::Type type, + void* target, IEventJob* handler) = 0; - //! Unregister an event handler for an event type - /*! - Unregisters an event handler for the \p type, \p target pair and - deletes it. - */ - virtual void removeHandler(Event::Type type, void* target) = 0; + //! Unregister an event handler for an event type + /*! + Unregisters an event handler for the \p type, \p target pair and + deletes it. + */ + virtual void removeHandler(Event::Type type, void* target) = 0; - //! Unregister all event handlers for an event target - /*! - Unregisters all event handlers for the \p target and deletes them. - */ - virtual void removeHandlers(void* target) = 0; + //! Unregister all event handlers for an event target + /*! + Unregisters all event handlers for the \p target and deletes them. + */ + virtual void removeHandlers(void* target) = 0; - //! Creates a new event type - /*! - If \p type contains \c kUnknown then it is set to a unique event - type id otherwise it is left alone. The final value of \p type - is returned. - */ - virtual Event::Type - registerTypeOnce(Event::Type& type, - const char* name) = 0; + //! Creates a new event type + /*! + If \p type contains \c kUnknown then it is set to a unique event + type id otherwise it is left alone. The final value of \p type + is returned. + */ + virtual Event::Type + registerTypeOnce(Event::Type& type, + const char* name) = 0; - //! Wait for event queue to become ready - /*! - Blocks on the current thread until the event queue is ready for events to - be added. - */ - virtual void waitForReady() const = 0; - - //@} - //! @name accessors - //@{ + //! Wait for event queue to become ready + /*! + Blocks on the current thread until the event queue is ready for events to + be added. + */ + virtual void waitForReady() const = 0; + + //@} + //! @name accessors + //@{ - //! Test if queue is empty - /*! - Returns true iff the queue has no events in it, including timer - events. - */ - virtual bool isEmpty() const = 0; + //! Test if queue is empty + /*! + Returns true iff the queue has no events in it, including timer + events. + */ + virtual bool isEmpty() const = 0; - //! Get an event handler - /*! - Finds and returns the event handler for the \p type, \p target pair - if it exists, otherwise it returns NULL. - */ - virtual IEventJob* getHandler(Event::Type type, void* target) const = 0; + //! Get an event handler + /*! + Finds and returns the event handler for the \p type, \p target pair + if it exists, otherwise it returns NULL. + */ + virtual IEventJob* getHandler(Event::Type type, void* target) const = 0; - //! Get name for event - /*! - Returns the name for the event \p type. This is primarily for - debugging. - */ - virtual const char* getTypeName(Event::Type type) = 0; + //! Get name for event + /*! + Returns the name for the event \p type. This is primarily for + debugging. + */ + virtual const char* getTypeName(Event::Type type) = 0; - //! Get an event type by name - /*! - Returns the registered type for an event for a given name. - */ - virtual Event::Type getRegisteredType(const String& name) const = 0; + //! Get an event type by name + /*! + Returns the registered type for an event for a given name. + */ + virtual Event::Type getRegisteredType(const String& name) const = 0; - //! Get the system event type target - /*! - Returns the target to use for dispatching \c Event::kSystem events. - */ - virtual void* getSystemTarget() = 0; + //! Get the system event type target + /*! + Returns the target to use for dispatching \c Event::kSystem events. + */ + virtual void* getSystemTarget() = 0; - //@} - - // - // Event type providers. - // + //@} + + // + // Event type providers. + // - virtual ClientEvents& forClient() = 0; - virtual IStreamEvents& forIStream() = 0; - virtual IpcClientEvents& forIpcClient() = 0; - virtual IpcClientProxyEvents& forIpcClientProxy() = 0; - virtual IpcServerEvents& forIpcServer() = 0; - virtual IpcServerProxyEvents& forIpcServerProxy() = 0; - virtual IDataSocketEvents& forIDataSocket() = 0; - virtual IListenSocketEvents& forIListenSocket() = 0; - virtual ISocketEvents& forISocket() = 0; - virtual OSXScreenEvents& forOSXScreen() = 0; - virtual ClientListenerEvents& forClientListener() = 0; - virtual ClientProxyEvents& forClientProxy() = 0; - virtual ClientProxyUnknownEvents& forClientProxyUnknown() = 0; - virtual ServerEvents& forServer() = 0; - virtual ServerAppEvents& forServerApp() = 0; - virtual IKeyStateEvents& forIKeyState() = 0; - virtual IPrimaryScreenEvents& forIPrimaryScreen() = 0; - virtual IScreenEvents& forIScreen() = 0; - virtual ClipboardEvents& forClipboard() = 0; - virtual FileEvents& forFile() = 0; + virtual ClientEvents& forClient() = 0; + virtual IStreamEvents& forIStream() = 0; + virtual IpcClientEvents& forIpcClient() = 0; + virtual IpcClientProxyEvents& forIpcClientProxy() = 0; + virtual IpcServerEvents& forIpcServer() = 0; + virtual IpcServerProxyEvents& forIpcServerProxy() = 0; + virtual IDataSocketEvents& forIDataSocket() = 0; + virtual IListenSocketEvents& forIListenSocket() = 0; + virtual ISocketEvents& forISocket() = 0; + virtual OSXScreenEvents& forOSXScreen() = 0; + virtual ClientListenerEvents& forClientListener() = 0; + virtual ClientProxyEvents& forClientProxy() = 0; + virtual ClientProxyUnknownEvents& forClientProxyUnknown() = 0; + virtual ServerEvents& forServer() = 0; + virtual ServerAppEvents& forServerApp() = 0; + virtual IKeyStateEvents& forIKeyState() = 0; + virtual IPrimaryScreenEvents& forIPrimaryScreen() = 0; + virtual IScreenEvents& forIScreen() = 0; + virtual ClipboardEvents& forClipboard() = 0; + virtual FileEvents& forFile() = 0; }; diff --git a/src/lib/base/IEventQueueBuffer.h b/src/lib/base/IEventQueueBuffer.h index 5b1fc7e7..67132e88 100644 --- a/src/lib/base/IEventQueueBuffer.h +++ b/src/lib/base/IEventQueueBuffer.h @@ -30,72 +30,72 @@ An event queue buffer provides a queue of events for an IEventQueue. */ class IEventQueueBuffer : public IInterface { public: - enum Type { - kNone, //!< No event is available - kSystem, //!< Event is a system event - kUser //!< Event is a user event - }; + enum Type { + kNone, //!< No event is available + kSystem, //!< Event is a system event + kUser //!< Event is a user event + }; - //! @name manipulators - //@{ - - //! Initialize - /*! - Useful for platform-specific initialisation from a specific thread. - */ - virtual void init() = 0; + //! @name manipulators + //@{ + + //! Initialize + /*! + Useful for platform-specific initialisation from a specific thread. + */ + virtual void init() = 0; - //! Block waiting for an event - /*! - Wait for an event in the event queue buffer for up to \p timeout - seconds. - */ - virtual void waitForEvent(double timeout) = 0; + //! Block waiting for an event + /*! + Wait for an event in the event queue buffer for up to \p timeout + seconds. + */ + virtual void waitForEvent(double timeout) = 0; - //! Get the next event - /*! - Get the next event from the buffer. Return kNone if no event is - available. If a system event is next, return kSystem and fill in - event. The event data in a system event can point to a static - buffer (because Event::deleteData() will not attempt to delete - data in a kSystem event). Otherwise, return kUser and fill in - \p dataID with the value passed to \c addEvent(). - */ - virtual Type getEvent(Event& event, UInt32& dataID) = 0; + //! Get the next event + /*! + Get the next event from the buffer. Return kNone if no event is + available. If a system event is next, return kSystem and fill in + event. The event data in a system event can point to a static + buffer (because Event::deleteData() will not attempt to delete + data in a kSystem event). Otherwise, return kUser and fill in + \p dataID with the value passed to \c addEvent(). + */ + virtual Type getEvent(Event& event, UInt32& dataID) = 0; - //! Post an event - /*! - Add the given event to the end of the queue buffer. This is a user - event and \c getEvent() must be able to identify it as such and - return \p dataID. This method must cause \c waitForEvent() to - return at some future time if it's blocked waiting on an event. - */ - virtual bool addEvent(UInt32 dataID) = 0; + //! Post an event + /*! + Add the given event to the end of the queue buffer. This is a user + event and \c getEvent() must be able to identify it as such and + return \p dataID. This method must cause \c waitForEvent() to + return at some future time if it's blocked waiting on an event. + */ + virtual bool addEvent(UInt32 dataID) = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Check if event queue buffer is empty - /*! - Return true iff the event queue buffer is empty. - */ - virtual bool isEmpty() const = 0; + //! Check if event queue buffer is empty + /*! + Return true iff the event queue buffer is empty. + */ + virtual bool isEmpty() const = 0; - //! Create a timer object - /*! - Create and return a timer object. The object is opaque and is - used only by the buffer but it must be a valid object (i.e. - not NULL). - */ - virtual EventQueueTimer* - newTimer(double duration, bool oneShot) const = 0; + //! Create a timer object + /*! + Create and return a timer object. The object is opaque and is + used only by the buffer but it must be a valid object (i.e. + not NULL). + */ + virtual EventQueueTimer* + newTimer(double duration, bool oneShot) const = 0; - //! Destroy a timer object - /*! - Destroy a timer object previously returned by \c newTimer(). - */ - virtual void deleteTimer(EventQueueTimer*) const = 0; + //! Destroy a timer object + /*! + Destroy a timer object previously returned by \c newTimer(). + */ + virtual void deleteTimer(EventQueueTimer*) const = 0; - //@} + //@} }; diff --git a/src/lib/base/IJob.h b/src/lib/base/IJob.h index 5e12ae07..4a276797 100644 --- a/src/lib/base/IJob.h +++ b/src/lib/base/IJob.h @@ -26,6 +26,6 @@ A job is an interface for executing some function. */ class IJob : public IInterface { public: - //! Run the job - virtual void run() = 0; + //! Run the job + virtual void run() = 0; }; diff --git a/src/lib/base/ILogOutputter.h b/src/lib/base/ILogOutputter.h index 3719976c..28563a24 100644 --- a/src/lib/base/ILogOutputter.h +++ b/src/lib/base/ILogOutputter.h @@ -30,40 +30,40 @@ directly or indirectly. */ class ILogOutputter : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Open the outputter - /*! - Opens the outputter for writing. Calling this method on an - already open outputter must have no effect. - */ - virtual void open(const char* title) = 0; + //! Open the outputter + /*! + Opens the outputter for writing. Calling this method on an + already open outputter must have no effect. + */ + virtual void open(const char* title) = 0; - //! Close the outputter - /*! - Close the outputter. Calling this method on an already closed - outputter must have no effect. - */ - virtual void close() = 0; + //! Close the outputter + /*! + Close the outputter. Calling this method on an already closed + outputter must have no effect. + */ + virtual void close() = 0; - //! Show the outputter - /*! - Causes the output to become visible. This generally only makes sense - for a logger in a graphical user interface. Other implementations - will do nothing. Iff \p showIfEmpty is \c false then the implementation - may optionally only show the log if it's not empty. - */ - virtual void show(bool showIfEmpty) = 0; + //! Show the outputter + /*! + Causes the output to become visible. This generally only makes sense + for a logger in a graphical user interface. Other implementations + will do nothing. Iff \p showIfEmpty is \c false then the implementation + may optionally only show the log if it's not empty. + */ + virtual void show(bool showIfEmpty) = 0; - //! Write a message with level - /*! - Writes \c message, which has the given \c level, to a log. - If this method returns true then Log will stop passing the - message to all outputters in the outputter chain, otherwise - it continues. Most implementations should return true. - */ - virtual bool write(ELevel level, const char* message) = 0; + //! Write a message with level + /*! + Writes \c message, which has the given \c level, to a log. + If this method returns true then Log will stop passing the + message to all outputters in the outputter chain, otherwise + it continues. Most implementations should return true. + */ + virtual bool write(ELevel level, const char* message) = 0; - //@} + //@} }; diff --git a/src/lib/base/Log.cpp b/src/lib/base/Log.cpp index 67f7d819..3a8351b8 100644 --- a/src/lib/base/Log.cpp +++ b/src/lib/base/Log.cpp @@ -9,11 +9,11 @@ * * This package 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 + * 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 program. If not, see . + * along with this program. If not, see . */ #include "arch/Arch.h" @@ -29,18 +29,18 @@ #include // names of priorities -static const char* g_priority[] = { - "FATAL", - "ERROR", - "WARNING", - "NOTE", - "INFO", - "DEBUG", - "DEBUG1", - "DEBUG2", - "DEBUG3", - "DEBUG4", - "DEBUG5" +static const char* g_priority[] = { + "FATAL", + "ERROR", + "WARNING", + "NOTE", + "INFO", + "DEBUG", + "DEBUG1", + "DEBUG2", + "DEBUG3", + "DEBUG4", + "DEBUG5" }; // number of priorities @@ -48,262 +48,262 @@ static const int g_numPriority = (int)(sizeof(g_priority) / sizeof(g_priority[0] // the default priority #ifndef NDEBUG -static const int g_defaultMaxPriority = kDEBUG; +static const int g_defaultMaxPriority = kDEBUG; #else -static const int g_defaultMaxPriority = kINFO; +static const int g_defaultMaxPriority = kINFO; #endif // // Log // -Log* Log::s_log = NULL; +Log* Log::s_log = NULL; Log::Log() { - assert(s_log == NULL); + assert(s_log == NULL); - // create mutex for multithread safe operation - m_mutex = ARCH->newMutex(); + // create mutex for multithread safe operation + m_mutex = ARCH->newMutex(); - // other initalization - m_maxPriority = g_defaultMaxPriority; - m_maxNewlineLength = 0; - insert(new ConsoleLogOutputter); + // other initalization + m_maxPriority = g_defaultMaxPriority; + m_maxNewlineLength = 0; + insert(new ConsoleLogOutputter); - s_log = this; + s_log = this; } Log::Log(Log* src) { - s_log = src; + s_log = src; } Log::~Log() { - // clean up - for (OutputterList::iterator index = m_outputters.begin(); - index != m_outputters.end(); ++index) { - delete *index; - } - for (OutputterList::iterator index = m_alwaysOutputters.begin(); - index != m_alwaysOutputters.end(); ++index) { - delete *index; - } - ARCH->closeMutex(m_mutex); + // clean up + for (OutputterList::iterator index = m_outputters.begin(); + index != m_outputters.end(); ++index) { + delete *index; + } + for (OutputterList::iterator index = m_alwaysOutputters.begin(); + index != m_alwaysOutputters.end(); ++index) { + delete *index; + } + ARCH->closeMutex(m_mutex); } Log* Log::getInstance() { - assert(s_log != NULL); - return s_log; + assert(s_log != NULL); + return s_log; } const char* Log::getFilterName() const { - return getFilterName(getFilter()); + return getFilterName(getFilter()); } const char* Log::getFilterName(int level) const { - if (level < 0) { - return "Message"; - } - return g_priority[level]; + if (level < 0) { + return "Message"; + } + return g_priority[level]; } void Log::print(const char* file, int line, const char* fmt, ...) { - // check if fmt begins with a priority argument - ELevel priority = kINFO; - if ((strlen(fmt) > 2) && (fmt[0] == '%' && fmt[1] == 'z')) { + // check if fmt begins with a priority argument + ELevel priority = kINFO; + if ((strlen(fmt) > 2) && (fmt[0] == '%' && fmt[1] == 'z')) { - // 060 in octal is 0 (48 in decimal), so subtracting this converts ascii - // number it a true number. we could use atoi instead, but this is how - // it was done originally. - priority = (ELevel)(fmt[2] - '\060'); + // 060 in octal is 0 (48 in decimal), so subtracting this converts ascii + // number it a true number. we could use atoi instead, but this is how + // it was done originally. + priority = (ELevel)(fmt[2] - '\060'); - // move the pointer on past the debug priority char - fmt += 3; - } + // move the pointer on past the debug priority char + fmt += 3; + } - // done if below priority threshold - if (priority > getFilter()) { - return; - } + // done if below priority threshold + if (priority > getFilter()) { + return; + } - // compute prefix padding length - char stack[1024]; + // compute prefix padding length + char stack[1024]; - // compute suffix padding length - int sPad = m_maxNewlineLength; + // compute suffix padding length + int sPad = m_maxNewlineLength; - // print to buffer, leaving space for a newline at the end and prefix - // at the beginning. - char* buffer = stack; - int len = (int)(sizeof(stack) / sizeof(stack[0])); - while (true) { - // try printing into the buffer - va_list args; - va_start(args, fmt); - int n = ARCH->vsnprintf(buffer, len - sPad, fmt, args); - va_end(args); + // print to buffer, leaving space for a newline at the end and prefix + // at the beginning. + char* buffer = stack; + int len = (int)(sizeof(stack) / sizeof(stack[0])); + while (true) { + // try printing into the buffer + va_list args; + va_start(args, fmt); + int n = ARCH->vsnprintf(buffer, len - sPad, fmt, args); + va_end(args); - // if the buffer wasn't big enough then make it bigger and try again - if (n < 0 || n > (int)len) { - if (buffer != stack) { - delete[] buffer; - } - len *= 2; - buffer = new char[len]; - } + // if the buffer wasn't big enough then make it bigger and try again + if (n < 0 || n > (int)len) { + if (buffer != stack) { + delete[] buffer; + } + len *= 2; + buffer = new char[len]; + } - // if the buffer was big enough then continue - else { - break; - } - } + // if the buffer was big enough then continue + else { + break; + } + } - // print the prefix to the buffer. leave space for priority label. - // do not prefix time and file for kPRINT (CLOG_PRINT) - if (priority != kPRINT) { + // print the prefix to the buffer. leave space for priority label. + // do not prefix time and file for kPRINT (CLOG_PRINT) + if (priority != kPRINT) { - struct tm *tm; - char timestamp[50]; - time_t t; - time(&t); - tm = localtime(&t); - sprintf(timestamp, "%04i-%02i-%02iT%02i:%02i:%02i", tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); + struct tm *tm; + char timestamp[50]; + time_t t; + time(&t); + tm = localtime(&t); + sprintf(timestamp, "%04i-%02i-%02iT%02i:%02i:%02i", tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); - // square brackets, spaces, comma and null terminator take about 10 - int size = 10; - size += strlen(timestamp); - size += strlen(g_priority[priority]); - size += strlen(buffer); + // square brackets, spaces, comma and null terminator take about 10 + int size = 10; + size += strlen(timestamp); + size += strlen(g_priority[priority]); + size += strlen(buffer); #ifndef NDEBUG - size += strlen(file); - // assume there is no file contains over 100k lines of code - size += 6; + size += strlen(file); + // assume there is no file contains over 100k lines of code + size += 6; #endif - char* message = new char[size]; + char* message = new char[size]; #ifndef NDEBUG - sprintf(message, "[%s] %s: %s\n\t%s,%d", timestamp, g_priority[priority], buffer, file, line); + sprintf(message, "[%s] %s: %s\n\t%s,%d", timestamp, g_priority[priority], buffer, file, line); #else - sprintf(message, "[%s] %s: %s", timestamp, g_priority[priority], buffer); + sprintf(message, "[%s] %s: %s", timestamp, g_priority[priority], buffer); #endif - output(priority, message); - delete[] message; - } else { - output(priority, buffer); - } + output(priority, message); + delete[] message; + } else { + output(priority, buffer); + } - // clean up - if (buffer != stack) { - delete[] buffer; - } + // clean up + if (buffer != stack) { + delete[] buffer; + } } void Log::insert(ILogOutputter* outputter, bool alwaysAtHead) { - assert(outputter != NULL); + assert(outputter != NULL); - ArchMutexLock lock(m_mutex); - if (alwaysAtHead) { - m_alwaysOutputters.push_front(outputter); - } - else { - m_outputters.push_front(outputter); - } + ArchMutexLock lock(m_mutex); + if (alwaysAtHead) { + m_alwaysOutputters.push_front(outputter); + } + else { + m_outputters.push_front(outputter); + } - outputter->open(kAppVersion); + outputter->open(kAppVersion); - // Issue 41 - // don't show log unless user requests it, as some users find this - // feature irritating (i.e. when they lose network connectivity). - // in windows the log window can be displayed by selecting "show log" - // from the synergy system tray icon. - // if this causes problems for other architectures, then a different - // work around should be attempted. - //outputter->show(false); + // Issue 41 + // don't show log unless user requests it, as some users find this + // feature irritating (i.e. when they lose network connectivity). + // in windows the log window can be displayed by selecting "show log" + // from the synergy system tray icon. + // if this causes problems for other architectures, then a different + // work around should be attempted. + //outputter->show(false); } void Log::remove(ILogOutputter* outputter) { - ArchMutexLock lock(m_mutex); - m_outputters.remove(outputter); - m_alwaysOutputters.remove(outputter); + ArchMutexLock lock(m_mutex); + m_outputters.remove(outputter); + m_alwaysOutputters.remove(outputter); } void Log::pop_front(bool alwaysAtHead) { - ArchMutexLock lock(m_mutex); - OutputterList* list = alwaysAtHead ? &m_alwaysOutputters : &m_outputters; - if (!list->empty()) { - delete list->front(); - list->pop_front(); - } + ArchMutexLock lock(m_mutex); + OutputterList* list = alwaysAtHead ? &m_alwaysOutputters : &m_outputters; + if (!list->empty()) { + delete list->front(); + list->pop_front(); + } } bool Log::setFilter(const char* maxPriority) { - if (maxPriority != NULL) { - for (int i = 0; i < g_numPriority; ++i) { - if (strcmp(maxPriority, g_priority[i]) == 0) { - setFilter(i); - return true; - } - } - return false; - } - return true; + if (maxPriority != NULL) { + for (int i = 0; i < g_numPriority; ++i) { + if (strcmp(maxPriority, g_priority[i]) == 0) { + setFilter(i); + return true; + } + } + return false; + } + return true; } void Log::setFilter(int maxPriority) { - ArchMutexLock lock(m_mutex); - m_maxPriority = maxPriority; + ArchMutexLock lock(m_mutex); + m_maxPriority = maxPriority; } int Log::getFilter() const { - ArchMutexLock lock(m_mutex); - return m_maxPriority; + ArchMutexLock lock(m_mutex); + return m_maxPriority; } void Log::output(ELevel priority, char* msg) { - assert(priority >= -1 && priority < g_numPriority); - assert(msg != NULL); - if (!msg) return; + assert(priority >= -1 && priority < g_numPriority); + assert(msg != NULL); + if (!msg) return; - ArchMutexLock lock(m_mutex); + ArchMutexLock lock(m_mutex); - OutputterList::const_iterator i; + OutputterList::const_iterator i; - for (i = m_alwaysOutputters.begin(); i != m_alwaysOutputters.end(); ++i) { + for (i = m_alwaysOutputters.begin(); i != m_alwaysOutputters.end(); ++i) { - // write to outputter - (*i)->write(priority, msg); - } + // write to outputter + (*i)->write(priority, msg); + } - for (i = m_outputters.begin(); i != m_outputters.end(); ++i) { + for (i = m_outputters.begin(); i != m_outputters.end(); ++i) { - // write to outputter and break out of loop if it returns false - if (!(*i)->write(priority, msg)) { - break; - } - } + // write to outputter and break out of loop if it returns false + if (!(*i)->write(priority, msg)) { + break; + } + } } diff --git a/src/lib/base/Log.h b/src/lib/base/Log.h index 87ad1fdc..b54e82f5 100644 --- a/src/lib/base/Log.h +++ b/src/lib/base/Log.h @@ -40,103 +40,103 @@ LOGC() provide convenient access. */ class Log { public: - Log(); - Log(Log* src); - ~Log(); + Log(); + Log(Log* src); + ~Log(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Add an outputter to the head of the list - /*! - Inserts an outputter to the head of the outputter list. When the - logger writes a message, it goes to the outputter at the head of - the outputter list. If that outputter's \c write() method returns - true then it also goes to the next outputter, as so on until an - outputter returns false or there are no more outputters. Outputters - still in the outputter list when the log is destroyed will be - deleted. If \c alwaysAtHead is true then the outputter is always - called before all outputters with \c alwaysAtHead false and the - return value of the outputter is ignored. + //! Add an outputter to the head of the list + /*! + Inserts an outputter to the head of the outputter list. When the + logger writes a message, it goes to the outputter at the head of + the outputter list. If that outputter's \c write() method returns + true then it also goes to the next outputter, as so on until an + outputter returns false or there are no more outputters. Outputters + still in the outputter list when the log is destroyed will be + deleted. If \c alwaysAtHead is true then the outputter is always + called before all outputters with \c alwaysAtHead false and the + return value of the outputter is ignored. - By default, the logger has one outputter installed which writes to - the console. - */ - void insert(ILogOutputter* adopted, - bool alwaysAtHead = false); + By default, the logger has one outputter installed which writes to + the console. + */ + void insert(ILogOutputter* adopted, + bool alwaysAtHead = false); - //! Remove an outputter from the list - /*! - Removes the first occurrence of the given outputter from the - outputter list. It does nothing if the outputter is not in the - list. The outputter is not deleted. - */ - void remove(ILogOutputter* orphaned); + //! Remove an outputter from the list + /*! + Removes the first occurrence of the given outputter from the + outputter list. It does nothing if the outputter is not in the + list. The outputter is not deleted. + */ + void remove(ILogOutputter* orphaned); - //! Remove the outputter from the head of the list - /*! - Removes and deletes the outputter at the head of the outputter list. - This does nothing if the outputter list is empty. Only removes - outputters that were inserted with the matching \c alwaysAtHead. - */ - void pop_front(bool alwaysAtHead = false); + //! Remove the outputter from the head of the list + /*! + Removes and deletes the outputter at the head of the outputter list. + This does nothing if the outputter list is empty. Only removes + outputters that were inserted with the matching \c alwaysAtHead. + */ + void pop_front(bool alwaysAtHead = false); - //! Set the minimum priority filter. - /*! - Set the filter. Messages below this priority are discarded. - The default priority is 4 (INFO) (unless built without NDEBUG - in which case it's 5 (DEBUG)). setFilter(const char*) returns - true if the priority \c name was recognized; if \c name is NULL - then it simply returns true. - */ - bool setFilter(const char* name); - - //! Set the minimum priority filter (by ordinal). - void setFilter(int); + //! Set the minimum priority filter. + /*! + Set the filter. Messages below this priority are discarded. + The default priority is 4 (INFO) (unless built without NDEBUG + in which case it's 5 (DEBUG)). setFilter(const char*) returns + true if the priority \c name was recognized; if \c name is NULL + then it simply returns true. + */ + bool setFilter(const char* name); + + //! Set the minimum priority filter (by ordinal). + void setFilter(int); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Print a log message - /*! - Print a log message using the printf-like \c format and arguments - preceded by the filename and line number. If \c file is NULL then - neither the file nor the line are printed. - */ - void print(const char* file, int line, - const char* format, ...); + //! Print a log message + /*! + Print a log message using the printf-like \c format and arguments + preceded by the filename and line number. If \c file is NULL then + neither the file nor the line are printed. + */ + void print(const char* file, int line, + const char* format, ...); - //! Get the minimum priority level. - int getFilter() const; + //! Get the minimum priority level. + int getFilter() const; - //! Get the filter name of the current filter level. - const char* getFilterName() const; + //! Get the filter name of the current filter level. + const char* getFilterName() const; - //! Get the filter name of a specified filter level. - const char* getFilterName(int level) const; + //! Get the filter name of a specified filter level. + const char* getFilterName(int level) const; - //! Get the singleton instance of the log - static Log* getInstance(); + //! Get the singleton instance of the log + static Log* getInstance(); - //! Get the console filter level (messages above this are not sent to console). - int getConsoleMaxLevel() const { return kDEBUG2; } + //! Get the console filter level (messages above this are not sent to console). + int getConsoleMaxLevel() const { return kDEBUG2; } - //@} + //@} private: - void output(ELevel priority, char* msg); + void output(ELevel priority, char* msg); private: - typedef std::list OutputterList; + typedef std::list OutputterList; - static Log* s_log; + static Log* s_log; - ArchMutex m_mutex; - OutputterList m_outputters; - OutputterList m_alwaysOutputters; - int m_maxNewlineLength; - int m_maxPriority; + ArchMutex m_mutex; + OutputterList m_outputters; + OutputterList m_alwaysOutputters; + int m_maxNewlineLength; + int m_maxPriority; }; /*! @@ -183,13 +183,13 @@ otherwise it expands to a call that doesn't. #define LOGC(_a1, _a2) #define CLOG_TRACE #elif defined(NDEBUG) -#define LOG(_a1) CLOG->print _a1 -#define LOGC(_a1, _a2) if (_a1) CLOG->print _a2 -#define CLOG_TRACE NULL, 0, +#define LOG(_a1) CLOG->print _a1 +#define LOGC(_a1, _a2) if (_a1) CLOG->print _a2 +#define CLOG_TRACE NULL, 0, #else -#define LOG(_a1) CLOG->print _a1 -#define LOGC(_a1, _a2) if (_a1) CLOG->print _a2 -#define CLOG_TRACE __FILE__, __LINE__, +#define LOG(_a1) CLOG->print _a1 +#define LOGC(_a1, _a2) if (_a1) CLOG->print _a2 +#define CLOG_TRACE __FILE__, __LINE__, #endif // the CLOG_* defines are line and file plus %z and an octal number (060=0, @@ -197,15 +197,15 @@ otherwise it expands to a call that doesn't. // end, then we resort to using non-numerical chars. this still works (since // to deduce the number we subtract octal \060, so '/' is -1, and ':' is 10 -#define CLOG_PRINT CLOG_TRACE "%z\057" // char is '/' -#define CLOG_CRIT CLOG_TRACE "%z\060" // char is '0' -#define CLOG_ERR CLOG_TRACE "%z\061" -#define CLOG_WARN CLOG_TRACE "%z\062" -#define CLOG_NOTE CLOG_TRACE "%z\063" -#define CLOG_INFO CLOG_TRACE "%z\064" -#define CLOG_DEBUG CLOG_TRACE "%z\065" -#define CLOG_DEBUG1 CLOG_TRACE "%z\066" -#define CLOG_DEBUG2 CLOG_TRACE "%z\067" -#define CLOG_DEBUG3 CLOG_TRACE "%z\070" -#define CLOG_DEBUG4 CLOG_TRACE "%z\071" // char is '9' -#define CLOG_DEBUG5 CLOG_TRACE "%z\072" // char is ':' +#define CLOG_PRINT CLOG_TRACE "%z\057" // char is '/' +#define CLOG_CRIT CLOG_TRACE "%z\060" // char is '0' +#define CLOG_ERR CLOG_TRACE "%z\061" +#define CLOG_WARN CLOG_TRACE "%z\062" +#define CLOG_NOTE CLOG_TRACE "%z\063" +#define CLOG_INFO CLOG_TRACE "%z\064" +#define CLOG_DEBUG CLOG_TRACE "%z\065" +#define CLOG_DEBUG1 CLOG_TRACE "%z\066" +#define CLOG_DEBUG2 CLOG_TRACE "%z\067" +#define CLOG_DEBUG3 CLOG_TRACE "%z\070" +#define CLOG_DEBUG4 CLOG_TRACE "%z\071" // char is '9' +#define CLOG_DEBUG5 CLOG_TRACE "%z\072" // char is ':' diff --git a/src/lib/base/PriorityQueue.h b/src/lib/base/PriorityQueue.h index 239a872e..31f68794 100644 --- a/src/lib/base/PriorityQueue.h +++ b/src/lib/base/PriorityQueue.h @@ -31,108 +31,108 @@ it sorts by std::greater, it has a forward iterator through the elements */ template , #if defined(_MSC_VER) - class Compare = std::greater > + class Compare = std::greater > #else - class Compare = std::greater > + class Compare = std::greater > #endif class PriorityQueue { public: - typedef typename Container::value_type value_type; - typedef typename Container::size_type size_type; - typedef typename Container::iterator iterator; - typedef typename Container::const_iterator const_iterator; - typedef Container container_type; + typedef typename Container::value_type value_type; + typedef typename Container::size_type size_type; + typedef typename Container::iterator iterator; + typedef typename Container::const_iterator const_iterator; + typedef Container container_type; - PriorityQueue() { } - PriorityQueue(Container& swappedIn) { swap(swappedIn); } - ~PriorityQueue() { } + PriorityQueue() { } + PriorityQueue(Container& swappedIn) { swap(swappedIn); } + ~PriorityQueue() { } - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Add element - void push(const value_type& v) - { - c.push_back(v); - std::push_heap(c.begin(), c.end(), comp); - } + //! Add element + void push(const value_type& v) + { + c.push_back(v); + std::push_heap(c.begin(), c.end(), comp); + } - //! Remove head element - void pop() - { - std::pop_heap(c.begin(), c.end(), comp); - c.pop_back(); - } + //! Remove head element + void pop() + { + std::pop_heap(c.begin(), c.end(), comp); + c.pop_back(); + } - //! Erase element - void erase(iterator i) - { - c.erase(i); - std::make_heap(c.begin(), c.end(), comp); - } + //! Erase element + void erase(iterator i) + { + c.erase(i); + std::make_heap(c.begin(), c.end(), comp); + } - //! Get start iterator - iterator begin() - { - return c.begin(); - } + //! Get start iterator + iterator begin() + { + return c.begin(); + } - //! Get end iterator - iterator end() - { - return c.end(); - } + //! Get end iterator + iterator end() + { + return c.end(); + } - //! Swap contents with another priority queue - void swap(PriorityQueue& q) - { - c.swap(q.c); - } + //! Swap contents with another priority queue + void swap(PriorityQueue& q) + { + c.swap(q.c); + } - //! Swap contents with another container - void swap(Container& c2) - { - c.swap(c2); - std::make_heap(c.begin(), c.end(), comp); - } + //! Swap contents with another container + void swap(Container& c2) + { + c.swap(c2); + std::make_heap(c.begin(), c.end(), comp); + } - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Returns true if there are no elements - bool empty() const - { - return c.empty(); - } + //! Returns true if there are no elements + bool empty() const + { + return c.empty(); + } - //! Returns the number of elements - size_type size() const - { - return c.size(); - } + //! Returns the number of elements + size_type size() const + { + return c.size(); + } - //! Returns the head element - const value_type& top() const - { - return c.front(); - } + //! Returns the head element + const value_type& top() const + { + return c.front(); + } - //! Get start iterator - const_iterator begin() const - { - return c.begin(); - } + //! Get start iterator + const_iterator begin() const + { + return c.begin(); + } - //! Get end iterator - const_iterator end() const - { - return c.end(); - } + //! Get end iterator + const_iterator end() const + { + return c.end(); + } - //@} + //@} private: - Container c; - Compare comp; + Container c; + Compare comp; }; diff --git a/src/lib/base/SimpleEventQueueBuffer.cpp b/src/lib/base/SimpleEventQueueBuffer.cpp index dc3cf266..66463478 100644 --- a/src/lib/base/SimpleEventQueueBuffer.cpp +++ b/src/lib/base/SimpleEventQueueBuffer.cpp @@ -26,74 +26,74 @@ SimpleEventQueueBuffer::SimpleEventQueueBuffer() { - m_queueMutex = ARCH->newMutex(); - m_queueReadyCond = ARCH->newCondVar(); - m_queueReady = false; + m_queueMutex = ARCH->newMutex(); + m_queueReadyCond = ARCH->newCondVar(); + m_queueReady = false; } SimpleEventQueueBuffer::~SimpleEventQueueBuffer() { - ARCH->closeCondVar(m_queueReadyCond); - ARCH->closeMutex(m_queueMutex); + ARCH->closeCondVar(m_queueReadyCond); + ARCH->closeMutex(m_queueMutex); } void SimpleEventQueueBuffer::waitForEvent(double timeout) { - ArchMutexLock lock(m_queueMutex); - Stopwatch timer(true); - while (!m_queueReady) { - double timeLeft = timeout; - if (timeLeft >= 0.0) { - timeLeft -= timer.getTime(); - if (timeLeft < 0.0) { - return; - } - } - ARCH->waitCondVar(m_queueReadyCond, m_queueMutex, timeLeft); - } + ArchMutexLock lock(m_queueMutex); + Stopwatch timer(true); + while (!m_queueReady) { + double timeLeft = timeout; + if (timeLeft >= 0.0) { + timeLeft -= timer.getTime(); + if (timeLeft < 0.0) { + return; + } + } + ARCH->waitCondVar(m_queueReadyCond, m_queueMutex, timeLeft); + } } IEventQueueBuffer::Type SimpleEventQueueBuffer::getEvent(Event&, UInt32& dataID) { - ArchMutexLock lock(m_queueMutex); - if (!m_queueReady) { - return kNone; - } - dataID = m_queue.back(); - m_queue.pop_back(); - m_queueReady = !m_queue.empty(); - return kUser; + ArchMutexLock lock(m_queueMutex); + if (!m_queueReady) { + return kNone; + } + dataID = m_queue.back(); + m_queue.pop_back(); + m_queueReady = !m_queue.empty(); + return kUser; } bool SimpleEventQueueBuffer::addEvent(UInt32 dataID) { - ArchMutexLock lock(m_queueMutex); - m_queue.push_front(dataID); - if (!m_queueReady) { - m_queueReady = true; - ARCH->broadcastCondVar(m_queueReadyCond); - } - return true; + ArchMutexLock lock(m_queueMutex); + m_queue.push_front(dataID); + if (!m_queueReady) { + m_queueReady = true; + ARCH->broadcastCondVar(m_queueReadyCond); + } + return true; } bool SimpleEventQueueBuffer::isEmpty() const { - ArchMutexLock lock(m_queueMutex); - return !m_queueReady; + ArchMutexLock lock(m_queueMutex); + return !m_queueReady; } EventQueueTimer* SimpleEventQueueBuffer::newTimer(double, bool) const { - return new EventQueueTimer; + return new EventQueueTimer; } void SimpleEventQueueBuffer::deleteTimer(EventQueueTimer* timer) const { - delete timer; + delete timer; } diff --git a/src/lib/base/SimpleEventQueueBuffer.h b/src/lib/base/SimpleEventQueueBuffer.h index dbe1e19b..d4f9efb1 100644 --- a/src/lib/base/SimpleEventQueueBuffer.h +++ b/src/lib/base/SimpleEventQueueBuffer.h @@ -28,31 +28,31 @@ An event queue buffer provides a queue of events for an IEventQueue. */ class SimpleEventQueueBuffer : public IEventQueueBuffer { public: - SimpleEventQueueBuffer(); - ~SimpleEventQueueBuffer(); + SimpleEventQueueBuffer(); + ~SimpleEventQueueBuffer(); - // IEventQueueBuffer overrides - void init() { } - virtual void waitForEvent(double timeout); - virtual Type getEvent(Event& event, UInt32& dataID); - virtual bool addEvent(UInt32 dataID); - virtual bool isEmpty() const; - virtual EventQueueTimer* - newTimer(double duration, bool oneShot) const; - virtual void deleteTimer(EventQueueTimer*) const; + // IEventQueueBuffer overrides + void init() { } + virtual void waitForEvent(double timeout); + virtual Type getEvent(Event& event, UInt32& dataID); + virtual bool addEvent(UInt32 dataID); + virtual bool isEmpty() const; + virtual EventQueueTimer* + newTimer(double duration, bool oneShot) const; + virtual void deleteTimer(EventQueueTimer*) const; private: - typedef std::deque EventDeque; + typedef std::deque EventDeque; - ArchMutex m_queueMutex; - ArchCond m_queueReadyCond; - bool m_queueReady; - EventDeque m_queue; + ArchMutex m_queueMutex; + ArchCond m_queueReadyCond; + bool m_queueReady; + EventDeque m_queue; }; class EventQueueTimer { public: - EventQueueTimer() { } - virtual ~EventQueueTimer() { } + EventQueueTimer() { } + virtual ~EventQueueTimer() { } }; diff --git a/src/lib/base/Stopwatch.cpp b/src/lib/base/Stopwatch.cpp index adaa7454..f5dee045 100644 --- a/src/lib/base/Stopwatch.cpp +++ b/src/lib/base/Stopwatch.cpp @@ -24,107 +24,107 @@ // Stopwatch::Stopwatch(bool triggered) : - m_mark(0.0), - m_triggered(triggered), - m_stopped(triggered) + m_mark(0.0), + m_triggered(triggered), + m_stopped(triggered) { - if (!triggered) { - m_mark = ARCH->time(); - } + if (!triggered) { + m_mark = ARCH->time(); + } } Stopwatch::~Stopwatch() { - // do nothing + // do nothing } double Stopwatch::reset() { - if (m_stopped) { - const double dt = m_mark; - m_mark = 0.0; - return dt; - } - else { - const double t = ARCH->time(); - const double dt = t - m_mark; - m_mark = t; - return dt; - } + if (m_stopped) { + const double dt = m_mark; + m_mark = 0.0; + return dt; + } + else { + const double t = ARCH->time(); + const double dt = t - m_mark; + m_mark = t; + return dt; + } } void Stopwatch::stop() { - if (m_stopped) { - return; - } + if (m_stopped) { + return; + } - // save the elapsed time - m_mark = ARCH->time() - m_mark; - m_stopped = true; + // save the elapsed time + m_mark = ARCH->time() - m_mark; + m_stopped = true; } void Stopwatch::start() { - m_triggered = false; - if (!m_stopped) { - return; - } + m_triggered = false; + if (!m_stopped) { + return; + } - // set the mark such that it reports the time elapsed at stop() - m_mark = ARCH->time() - m_mark; - m_stopped = false; + // set the mark such that it reports the time elapsed at stop() + m_mark = ARCH->time() - m_mark; + m_stopped = false; } void Stopwatch::setTrigger() { - stop(); - m_triggered = true; + stop(); + m_triggered = true; } double Stopwatch::getTime() { - if (m_triggered) { - const double dt = m_mark; - start(); - return dt; - } - else if (m_stopped) { - return m_mark; - } - else { - return ARCH->time() - m_mark; - } + if (m_triggered) { + const double dt = m_mark; + start(); + return dt; + } + else if (m_stopped) { + return m_mark; + } + else { + return ARCH->time() - m_mark; + } } Stopwatch::operator double() { - return getTime(); + return getTime(); } bool Stopwatch::isStopped() const { - return m_stopped; + return m_stopped; } double Stopwatch::getTime() const { - if (m_stopped) { - return m_mark; - } - else { - return ARCH->time() - m_mark; - } + if (m_stopped) { + return m_mark; + } + else { + return ARCH->time() - m_mark; + } } Stopwatch::operator double() const { - return getTime(); + return getTime(); } diff --git a/src/lib/base/Stopwatch.h b/src/lib/base/Stopwatch.h index 71be8885..49ec627c 100644 --- a/src/lib/base/Stopwatch.h +++ b/src/lib/base/Stopwatch.h @@ -27,83 +27,83 @@ should use this class. */ class Stopwatch { public: - /*! - The default constructor does an implicit reset() or setTrigger(). - If triggered == false then the clock starts ticking. - */ - Stopwatch(bool triggered = false); - ~Stopwatch(); + /*! + The default constructor does an implicit reset() or setTrigger(). + If triggered == false then the clock starts ticking. + */ + Stopwatch(bool triggered = false); + ~Stopwatch(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Reset the timer to zero - /*! - Set the start time to the current time, returning the time since - the last reset. This does not remove the trigger if it's set nor - does it start a stopped clock. If the clock is stopped then - subsequent reset()'s will return 0. - */ - double reset(); + //! Reset the timer to zero + /*! + Set the start time to the current time, returning the time since + the last reset. This does not remove the trigger if it's set nor + does it start a stopped clock. If the clock is stopped then + subsequent reset()'s will return 0. + */ + double reset(); - //! Stop the timer - /*! - Stop the stopwatch. The time interval while stopped is not - counted by the stopwatch. stop() does not remove the trigger. - Has no effect if already stopped. - */ - void stop(); + //! Stop the timer + /*! + Stop the stopwatch. The time interval while stopped is not + counted by the stopwatch. stop() does not remove the trigger. + Has no effect if already stopped. + */ + void stop(); - //! Start the timer - /*! - Start the stopwatch. start() removes the trigger, even if the - stopwatch was already started. - */ - void start(); + //! Start the timer + /*! + Start the stopwatch. start() removes the trigger, even if the + stopwatch was already started. + */ + void start(); - //! Stop the timer and set the trigger - /*! - setTrigger() stops the clock like stop() except there's an - implicit start() the next time (non-const) getTime() is called. - This is useful when you want the clock to start the first time - you check it. - */ - void setTrigger(); + //! Stop the timer and set the trigger + /*! + setTrigger() stops the clock like stop() except there's an + implicit start() the next time (non-const) getTime() is called. + This is useful when you want the clock to start the first time + you check it. + */ + void setTrigger(); - //! Get elapsed time - /*! - Returns the time since the last reset() (or calls reset() and - returns zero if the trigger is set). - */ - double getTime(); - //! Same as getTime() - operator double(); - //@} - //! @name accessors - //@{ + //! Get elapsed time + /*! + Returns the time since the last reset() (or calls reset() and + returns zero if the trigger is set). + */ + double getTime(); + //! Same as getTime() + operator double(); + //@} + //! @name accessors + //@{ - //! Check if timer is stopped - /*! - Returns true if the stopwatch is stopped. - */ - bool isStopped() const; + //! Check if timer is stopped + /*! + Returns true if the stopwatch is stopped. + */ + bool isStopped() const; - // return the time since the last reset(). - //! Get elapsed time - /*! - Returns the time since the last reset(). This cannot trigger the - stopwatch to start and will not clear the trigger. - */ - double getTime() const; - //! Same as getTime() const - operator double() const; - //@} + // return the time since the last reset(). + //! Get elapsed time + /*! + Returns the time since the last reset(). This cannot trigger the + stopwatch to start and will not clear the trigger. + */ + double getTime() const; + //! Same as getTime() const + operator double() const; + //@} private: - double getClock() const; + double getClock() const; private: - double m_mark; - bool m_triggered; - bool m_stopped; + double m_mark; + bool m_triggered; + bool m_stopped; }; diff --git a/src/lib/base/String.cpp b/src/lib/base/String.cpp index ab5124db..e1da621f 100644 --- a/src/lib/base/String.cpp +++ b/src/lib/base/String.cpp @@ -37,213 +37,213 @@ namespace string { String format(const char* fmt, ...) { - va_list args; - va_start(args, fmt); - String result = vformat(fmt, args); - va_end(args); - return result; + va_list args; + va_start(args, fmt); + String result = vformat(fmt, args); + va_end(args); + return result; } String vformat(const char* fmt, va_list args) { - // find highest indexed substitution and the locations of substitutions - std::vector pos; - std::vector width; - std::vector index; - int maxIndex = 0; - for (const char* scan = fmt; *scan != '\0'; ++scan) { - if (*scan == '%') { - ++scan; - if (*scan == '\0') { - break; - } - else if (*scan == '%') { - // literal - index.push_back(0); - pos.push_back(static_cast(scan - 1 - fmt)); - width.push_back(2); - } - else if (*scan == '{') { - // get argument index - char* end; - int i = static_cast(strtol(scan + 1, &end, 10)); - if (*end != '}') { - // invalid index -- ignore - scan = end - 1; - } - else { - index.push_back(i); - pos.push_back(static_cast(scan - 1 - fmt)); - width.push_back(static_cast(end - scan + 2)); - if (i > maxIndex) { - maxIndex = i; - } - scan = end; - } - } - else { - // improper escape -- ignore - } - } - } + // find highest indexed substitution and the locations of substitutions + std::vector pos; + std::vector width; + std::vector index; + int maxIndex = 0; + for (const char* scan = fmt; *scan != '\0'; ++scan) { + if (*scan == '%') { + ++scan; + if (*scan == '\0') { + break; + } + else if (*scan == '%') { + // literal + index.push_back(0); + pos.push_back(static_cast(scan - 1 - fmt)); + width.push_back(2); + } + else if (*scan == '{') { + // get argument index + char* end; + int i = static_cast(strtol(scan + 1, &end, 10)); + if (*end != '}') { + // invalid index -- ignore + scan = end - 1; + } + else { + index.push_back(i); + pos.push_back(static_cast(scan - 1 - fmt)); + width.push_back(static_cast(end - scan + 2)); + if (i > maxIndex) { + maxIndex = i; + } + scan = end; + } + } + else { + // improper escape -- ignore + } + } + } - // get args - std::vector value; - std::vector length; - value.push_back("%"); - length.push_back(1); - for (int i = 0; i < maxIndex; ++i) { - const char* arg = va_arg(args, const char*); - size_t len = strlen(arg); - value.push_back(arg); - length.push_back(len); - } + // get args + std::vector value; + std::vector length; + value.push_back("%"); + length.push_back(1); + for (int i = 0; i < maxIndex; ++i) { + const char* arg = va_arg(args, const char*); + size_t len = strlen(arg); + value.push_back(arg); + length.push_back(len); + } - // compute final length - size_t resultLength = strlen(fmt); - const int n = static_cast(pos.size()); - for (int i = 0; i < n; ++i) { - resultLength -= width[i]; - resultLength += length[index[i]]; - } + // compute final length + size_t resultLength = strlen(fmt); + const int n = static_cast(pos.size()); + for (int i = 0; i < n; ++i) { + resultLength -= width[i]; + resultLength += length[index[i]]; + } - // substitute - String result; - result.reserve(resultLength); - size_t src = 0; - for (int i = 0; i < n; ++i) { - result.append(fmt + src, pos[i] - src); - result.append(value[index[i]]); - src = pos[i] + width[i]; - } - result.append(fmt + src); + // substitute + String result; + result.reserve(resultLength); + size_t src = 0; + for (int i = 0; i < n; ++i) { + result.append(fmt + src, pos[i] - src); + result.append(value[index[i]]); + src = pos[i] + width[i]; + } + result.append(fmt + src); - return result; + return result; } String sprintf(const char* fmt, ...) { - char tmp[1024]; - char* buffer = tmp; - int len = (int)(sizeof(tmp) / sizeof(tmp[0])); - String result; - while (buffer != NULL) { - // try printing into the buffer - va_list args; - va_start(args, fmt); - int n = ARCH->vsnprintf(buffer, len, fmt, args); - va_end(args); + char tmp[1024]; + char* buffer = tmp; + int len = (int)(sizeof(tmp) / sizeof(tmp[0])); + String result; + while (buffer != NULL) { + // try printing into the buffer + va_list args; + va_start(args, fmt); + int n = ARCH->vsnprintf(buffer, len, fmt, args); + va_end(args); - // if the buffer wasn't big enough then make it bigger and try again - if (n < 0 || n > len) { - if (buffer != tmp) { - delete[] buffer; - } - len *= 2; - buffer = new char[len]; - } + // if the buffer wasn't big enough then make it bigger and try again + if (n < 0 || n > len) { + if (buffer != tmp) { + delete[] buffer; + } + len *= 2; + buffer = new char[len]; + } - // if it was big enough then save the string and don't try again - else { - result = buffer; - if (buffer != tmp) { - delete[] buffer; - } - buffer = NULL; - } - } + // if it was big enough then save the string and don't try again + else { + result = buffer; + if (buffer != tmp) { + delete[] buffer; + } + buffer = NULL; + } + } - return result; + return result; } void findReplaceAll( - String& subject, - const String& find, - const String& replace) + String& subject, + const String& find, + const String& replace) { - size_t pos = 0; - while ((pos = subject.find(find, pos)) != String::npos) { - subject.replace(pos, find.length(), replace); - pos += replace.length(); - } + size_t pos = 0; + while ((pos = subject.find(find, pos)) != String::npos) { + subject.replace(pos, find.length(), replace); + pos += replace.length(); + } } String removeFileExt(String filename) { - size_t dot = filename.find_last_of('.'); + size_t dot = filename.find_last_of('.'); - if (dot == String::npos) { - return filename; - } + if (dot == String::npos) { + return filename; + } - return filename.substr(0, dot); + return filename.substr(0, dot); } void toHex(String& subject, int width, const char fill) { - std::stringstream ss; - ss << std::hex; - for (unsigned int i = 0; i < subject.length(); i++) { - ss << std::setw(width) << std::setfill(fill) << (int)(unsigned char)subject[i]; - } + std::stringstream ss; + ss << std::hex; + for (unsigned int i = 0; i < subject.length(); i++) { + ss << std::setw(width) << std::setfill(fill) << (int)(unsigned char)subject[i]; + } - subject = ss.str(); + subject = ss.str(); } void uppercase(String& subject) { - std::transform(subject.begin(), subject.end(), subject.begin(), ::toupper); + std::transform(subject.begin(), subject.end(), subject.begin(), ::toupper); } void removeChar(String& subject, const char c) { - subject.erase(std::remove(subject.begin(), subject.end(), c), subject.end()); + subject.erase(std::remove(subject.begin(), subject.end(), c), subject.end()); } String sizeTypeToString(size_t n) { - std::stringstream ss; - ss << n; - return ss.str(); + std::stringstream ss; + ss << n; + return ss.str(); } size_t stringToSizeType(String string) { - std::istringstream iss(string); - size_t value; - iss >> value; - return value; + std::istringstream iss(string); + size_t value; + iss >> value; + return value; } std::vector splitString(String string, const char c) { - std::vector results; + std::vector results; - size_t head = 0; - size_t separator = string.find(c); - while (separator != String::npos) { - if (head!=separator) { - results.push_back(string.substr(head, separator - head)); - } - head = separator + 1; - separator = string.find(c, head); - } + size_t head = 0; + size_t separator = string.find(c); + while (separator != String::npos) { + if (head!=separator) { + results.push_back(string.substr(head, separator - head)); + } + head = separator + 1; + separator = string.find(c, head); + } - if (head < string.size()) { - results.push_back(string.substr(head, string.size() - head)); - } + if (head < string.size()) { + results.push_back(string.substr(head, string.size() - head)); + } - return results; + return results; } // @@ -252,41 +252,41 @@ splitString(String string, const char c) bool CaselessCmp::cmpEqual( - const String::value_type& a, - const String::value_type& b) + const String::value_type& a, + const String::value_type& b) { - // should use std::tolower but not in all versions of libstdc++ have it - return tolower(a) == tolower(b); + // should use std::tolower but not in all versions of libstdc++ have it + return tolower(a) == tolower(b); } bool CaselessCmp::cmpLess( - const String::value_type& a, - const String::value_type& b) + const String::value_type& a, + const String::value_type& b) { - // should use std::tolower but not in all versions of libstdc++ have it - return tolower(a) < tolower(b); + // should use std::tolower but not in all versions of libstdc++ have it + return tolower(a) < tolower(b); } bool CaselessCmp::less(const String& a, const String& b) { - return std::lexicographical_compare( - a.begin(), a.end(), - b.begin(), b.end(), - &synergy::string::CaselessCmp::cmpLess); + return std::lexicographical_compare( + a.begin(), a.end(), + b.begin(), b.end(), + &synergy::string::CaselessCmp::cmpLess); } bool CaselessCmp::equal(const String& a, const String& b) { - return !(less(a, b) || less(b, a)); + return !(less(a, b) || less(b, a)); } bool CaselessCmp::operator()(const String& a, const String& b) const { - return less(a, b); + return less(a, b); } } diff --git a/src/lib/base/String.h b/src/lib/base/String.h index 1b22df9b..92d70712 100644 --- a/src/lib/base/String.h +++ b/src/lib/base/String.h @@ -112,23 +112,23 @@ std::vector splitString(String string, const char c); This class provides case-insensitve comparison functions. */ class CaselessCmp { - public: - //! Same as less() - bool operator()(const String& a, const String& b) const; + public: + //! Same as less() + bool operator()(const String& a, const String& b) const; - //! Returns true iff \c a is lexicographically less than \c b - static bool less(const String& a, const String& b); + //! Returns true iff \c a is lexicographically less than \c b + static bool less(const String& a, const String& b); - //! Returns true iff \c a is lexicographically equal to \c b - static bool equal(const String& a, const String& b); + //! Returns true iff \c a is lexicographically equal to \c b + static bool equal(const String& a, const String& b); - //! Returns true iff \c a is lexicographically less than \c b - static bool cmpLess(const String::value_type& a, - const String::value_type& b); + //! Returns true iff \c a is lexicographically less than \c b + static bool cmpLess(const String::value_type& a, + const String::value_type& b); - //! Returns true iff \c a is lexicographically equal to \c b - static bool cmpEqual(const String::value_type& a, - const String::value_type& b); + //! Returns true iff \c a is lexicographically equal to \c b + static bool cmpEqual(const String::value_type& a, + const String::value_type& b); }; } diff --git a/src/lib/base/TMethodEventJob.h b/src/lib/base/TMethodEventJob.h index 3062bcb5..f50270e3 100644 --- a/src/lib/base/TMethodEventJob.h +++ b/src/lib/base/TMethodEventJob.h @@ -27,37 +27,37 @@ An event job class that invokes a member function. template class TMethodEventJob : public IEventJob { public: - //! run(event) invokes \c object->method(event, arg) - TMethodEventJob(T* object, - void (T::*method)(const Event&, void*), - void* arg = NULL); - virtual ~TMethodEventJob(); + //! run(event) invokes \c object->method(event, arg) + TMethodEventJob(T* object, + void (T::*method)(const Event&, void*), + void* arg = NULL); + virtual ~TMethodEventJob(); - // IJob overrides - virtual void run(const Event&); + // IJob overrides + virtual void run(const Event&); private: - T* m_object; - void (T::*m_method)(const Event&, void*); - void* m_arg; + T* m_object; + void (T::*m_method)(const Event&, void*); + void* m_arg; }; template inline TMethodEventJob::TMethodEventJob(T* object, - void (T::*method)(const Event&, void*), void* arg) : - m_object(object), - m_method(method), - m_arg(arg) + void (T::*method)(const Event&, void*), void* arg) : + m_object(object), + m_method(method), + m_arg(arg) { - // do nothing + // do nothing } template inline TMethodEventJob::~TMethodEventJob() { - // do nothing + // do nothing } template @@ -65,7 +65,7 @@ inline void TMethodEventJob::run(const Event& event) { - if (m_object != NULL) { - (m_object->*m_method)(event, m_arg); - } + if (m_object != NULL) { + (m_object->*m_method)(event, m_arg); + } } diff --git a/src/lib/base/TMethodJob.h b/src/lib/base/TMethodJob.h index e837e1ae..6d38ce04 100644 --- a/src/lib/base/TMethodJob.h +++ b/src/lib/base/TMethodJob.h @@ -27,34 +27,34 @@ A job class that invokes a member function. template class TMethodJob : public IJob { public: - //! run() invokes \c object->method(arg) - TMethodJob(T* object, void (T::*method)(void*), void* arg = NULL); - virtual ~TMethodJob(); + //! run() invokes \c object->method(arg) + TMethodJob(T* object, void (T::*method)(void*), void* arg = NULL); + virtual ~TMethodJob(); - // IJob overrides - virtual void run(); + // IJob overrides + virtual void run(); private: - T* m_object; - void (T::*m_method)(void*); - void* m_arg; + T* m_object; + void (T::*m_method)(void*); + void* m_arg; }; template inline TMethodJob::TMethodJob(T* object, void (T::*method)(void*), void* arg) : - m_object(object), - m_method(method), - m_arg(arg) + m_object(object), + m_method(method), + m_arg(arg) { - // do nothing + // do nothing } template inline TMethodJob::~TMethodJob() { - // do nothing + // do nothing } template @@ -62,7 +62,7 @@ inline void TMethodJob::run() { - if (m_object != NULL) { - (m_object->*m_method)(m_arg); - } + if (m_object != NULL) { + (m_object->*m_method)(m_arg); + } } diff --git a/src/lib/base/Unicode.cpp b/src/lib/base/Unicode.cpp index ad7a266d..ea814eae 100644 --- a/src/lib/base/Unicode.cpp +++ b/src/lib/base/Unicode.cpp @@ -30,19 +30,19 @@ static UInt16 decode16(const UInt8* n, bool byteSwapped) { - union x16 { - UInt8 n8[2]; - UInt16 n16; - } c; - if (byteSwapped) { - c.n8[0] = n[1]; - c.n8[1] = n[0]; - } - else { - c.n8[0] = n[0]; - c.n8[1] = n[1]; - } - return c.n16; + union x16 { + UInt8 n8[2]; + UInt16 n16; + } c; + if (byteSwapped) { + c.n8[0] = n[1]; + c.n8[1] = n[0]; + } + else { + c.n8[0] = n[0]; + c.n8[1] = n[1]; + } + return c.n16; } inline @@ -50,23 +50,23 @@ static UInt32 decode32(const UInt8* n, bool byteSwapped) { - union x32 { - UInt8 n8[4]; - UInt32 n32; - } c; - if (byteSwapped) { - c.n8[0] = n[3]; - c.n8[1] = n[2]; - c.n8[2] = n[1]; - c.n8[3] = n[0]; - } - else { - c.n8[0] = n[0]; - c.n8[1] = n[1]; - c.n8[2] = n[2]; - c.n8[3] = n[3]; - } - return c.n32; + union x32 { + UInt8 n8[4]; + UInt32 n32; + } c; + if (byteSwapped) { + c.n8[0] = n[3]; + c.n8[1] = n[2]; + c.n8[2] = n[1]; + c.n8[3] = n[0]; + } + else { + c.n8[0] = n[0]; + c.n8[1] = n[1]; + c.n8[2] = n[2]; + c.n8[3] = n[3]; + } + return c.n32; } inline @@ -74,9 +74,9 @@ static void resetError(bool* errors) { - if (errors != NULL) { - *errors = false; - } + if (errors != NULL) { + *errors = false; + } } inline @@ -84,9 +84,9 @@ static void setError(bool* errors) { - if (errors != NULL) { - *errors = true; - } + if (errors != NULL) { + *errors = true; + } } @@ -94,691 +94,691 @@ setError(bool* errors) // Unicode // -UInt32 Unicode::s_invalid = 0x0000ffff; -UInt32 Unicode::s_replacement = 0x0000fffd; +UInt32 Unicode::s_invalid = 0x0000ffff; +UInt32 Unicode::s_replacement = 0x0000fffd; bool Unicode::isUTF8(const String& src) { - // convert and test each character - const UInt8* data = reinterpret_cast(src.c_str()); - for (UInt32 n = (UInt32)src.size(); n > 0; ) { - if (fromUTF8(data, n) == s_invalid) { - return false; - } - } - return true; + // convert and test each character + const UInt8* data = reinterpret_cast(src.c_str()); + for (UInt32 n = (UInt32)src.size(); n > 0; ) { + if (fromUTF8(data, n) == s_invalid) { + return false; + } + } + return true; } String Unicode::UTF8ToUCS2(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // get size of input string and reserve some space in output - UInt32 n = (UInt32)src.size(); - String dst; - dst.reserve(2 * n); + // get size of input string and reserve some space in output + UInt32 n = (UInt32)src.size(); + String dst; + dst.reserve(2 * n); - // convert each character - const UInt8* data = reinterpret_cast(src.c_str()); - while (n > 0) { - UInt32 c = fromUTF8(data, n); - if (c == s_invalid) { - c = s_replacement; - } - else if (c >= 0x00010000) { - setError(errors); - c = s_replacement; - } - UInt16 ucs2 = static_cast(c); - dst.append(reinterpret_cast(&ucs2), 2); - } + // convert each character + const UInt8* data = reinterpret_cast(src.c_str()); + while (n > 0) { + UInt32 c = fromUTF8(data, n); + if (c == s_invalid) { + c = s_replacement; + } + else if (c >= 0x00010000) { + setError(errors); + c = s_replacement; + } + UInt16 ucs2 = static_cast(c); + dst.append(reinterpret_cast(&ucs2), 2); + } - return dst; + return dst; } String Unicode::UTF8ToUCS4(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // get size of input string and reserve some space in output - UInt32 n = (UInt32)src.size(); - String dst; - dst.reserve(4 * n); + // get size of input string and reserve some space in output + UInt32 n = (UInt32)src.size(); + String dst; + dst.reserve(4 * n); - // convert each character - const UInt8* data = reinterpret_cast(src.c_str()); - while (n > 0) { - UInt32 c = fromUTF8(data, n); - if (c == s_invalid) { - c = s_replacement; - } - dst.append(reinterpret_cast(&c), 4); - } + // convert each character + const UInt8* data = reinterpret_cast(src.c_str()); + while (n > 0) { + UInt32 c = fromUTF8(data, n); + if (c == s_invalid) { + c = s_replacement; + } + dst.append(reinterpret_cast(&c), 4); + } - return dst; + return dst; } String Unicode::UTF8ToUTF16(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // get size of input string and reserve some space in output - UInt32 n = (UInt32)src.size(); - String dst; - dst.reserve(2 * n); + // get size of input string and reserve some space in output + UInt32 n = (UInt32)src.size(); + String dst; + dst.reserve(2 * n); - // convert each character - const UInt8* data = reinterpret_cast(src.c_str()); - while (n > 0) { - UInt32 c = fromUTF8(data, n); - if (c == s_invalid) { - c = s_replacement; - } - else if (c >= 0x00110000) { - setError(errors); - c = s_replacement; - } - if (c < 0x00010000) { - UInt16 ucs2 = static_cast(c); - dst.append(reinterpret_cast(&ucs2), 2); - } - else { - c -= 0x00010000; - UInt16 utf16h = static_cast((c >> 10) + 0xd800); - UInt16 utf16l = static_cast((c & 0x03ff) + 0xdc00); - dst.append(reinterpret_cast(&utf16h), 2); - dst.append(reinterpret_cast(&utf16l), 2); - } - } + // convert each character + const UInt8* data = reinterpret_cast(src.c_str()); + while (n > 0) { + UInt32 c = fromUTF8(data, n); + if (c == s_invalid) { + c = s_replacement; + } + else if (c >= 0x00110000) { + setError(errors); + c = s_replacement; + } + if (c < 0x00010000) { + UInt16 ucs2 = static_cast(c); + dst.append(reinterpret_cast(&ucs2), 2); + } + else { + c -= 0x00010000; + UInt16 utf16h = static_cast((c >> 10) + 0xd800); + UInt16 utf16l = static_cast((c & 0x03ff) + 0xdc00); + dst.append(reinterpret_cast(&utf16h), 2); + dst.append(reinterpret_cast(&utf16l), 2); + } + } - return dst; + return dst; } String Unicode::UTF8ToUTF32(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // get size of input string and reserve some space in output - UInt32 n = (UInt32)src.size(); - String dst; - dst.reserve(4 * n); + // get size of input string and reserve some space in output + UInt32 n = (UInt32)src.size(); + String dst; + dst.reserve(4 * n); - // convert each character - const UInt8* data = reinterpret_cast(src.c_str()); - while (n > 0) { - UInt32 c = fromUTF8(data, n); - if (c == s_invalid) { - c = s_replacement; - } - else if (c >= 0x00110000) { - setError(errors); - c = s_replacement; - } - dst.append(reinterpret_cast(&c), 4); - } + // convert each character + const UInt8* data = reinterpret_cast(src.c_str()); + while (n > 0) { + UInt32 c = fromUTF8(data, n); + if (c == s_invalid) { + c = s_replacement; + } + else if (c >= 0x00110000) { + setError(errors); + c = s_replacement; + } + dst.append(reinterpret_cast(&c), 4); + } - return dst; + return dst; } String Unicode::UTF8ToText(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert to wide char - UInt32 size; - wchar_t* tmp = UTF8ToWideChar(src, size, errors); + // convert to wide char + UInt32 size; + wchar_t* tmp = UTF8ToWideChar(src, size, errors); - // convert string to multibyte - int len = ARCH->convStringWCToMB(NULL, tmp, size, errors); - char* mbs = new char[len + 1]; - ARCH->convStringWCToMB(mbs, tmp, size, errors); - String text(mbs, len); + // convert string to multibyte + int len = ARCH->convStringWCToMB(NULL, tmp, size, errors); + char* mbs = new char[len + 1]; + ARCH->convStringWCToMB(mbs, tmp, size, errors); + String text(mbs, len); - // clean up - delete[] mbs; - delete[] tmp; + // clean up + delete[] mbs; + delete[] tmp; - return text; + return text; } String Unicode::UCS2ToUTF8(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert - UInt32 n = (UInt32)src.size() >> 1; - return doUCS2ToUTF8(reinterpret_cast(src.data()), n, errors); + // convert + UInt32 n = (UInt32)src.size() >> 1; + return doUCS2ToUTF8(reinterpret_cast(src.data()), n, errors); } String Unicode::UCS4ToUTF8(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert - UInt32 n = (UInt32)src.size() >> 2; - return doUCS4ToUTF8(reinterpret_cast(src.data()), n, errors); + // convert + UInt32 n = (UInt32)src.size() >> 2; + return doUCS4ToUTF8(reinterpret_cast(src.data()), n, errors); } String Unicode::UTF16ToUTF8(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert - UInt32 n = (UInt32)src.size() >> 1; - return doUTF16ToUTF8(reinterpret_cast(src.data()), n, errors); + // convert + UInt32 n = (UInt32)src.size() >> 1; + return doUTF16ToUTF8(reinterpret_cast(src.data()), n, errors); } String Unicode::UTF32ToUTF8(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert - UInt32 n = (UInt32)src.size() >> 2; - return doUTF32ToUTF8(reinterpret_cast(src.data()), n, errors); + // convert + UInt32 n = (UInt32)src.size() >> 2; + return doUTF32ToUTF8(reinterpret_cast(src.data()), n, errors); } String Unicode::textToUTF8(const String& src, bool* errors) { - // default to success - resetError(errors); + // default to success + resetError(errors); - // convert string to wide characters - UInt32 n = (UInt32)src.size(); - int len = ARCH->convStringMBToWC(NULL, src.c_str(), n, errors); - wchar_t* wcs = new wchar_t[len + 1]; - ARCH->convStringMBToWC(wcs, src.c_str(), n, errors); + // convert string to wide characters + UInt32 n = (UInt32)src.size(); + int len = ARCH->convStringMBToWC(NULL, src.c_str(), n, errors); + wchar_t* wcs = new wchar_t[len + 1]; + ARCH->convStringMBToWC(wcs, src.c_str(), n, errors); - // convert to UTF8 - String utf8 = wideCharToUTF8(wcs, len, errors); + // convert to UTF8 + String utf8 = wideCharToUTF8(wcs, len, errors); - // clean up - delete[] wcs; + // clean up + delete[] wcs; - return utf8; + return utf8; } wchar_t* Unicode::UTF8ToWideChar(const String& src, UInt32& size, bool* errors) { - // convert to platform's wide character encoding - String tmp; - switch (ARCH->getWideCharEncoding()) { - case IArchString::kUCS2: - tmp = UTF8ToUCS2(src, errors); - size = (UInt32)tmp.size() >> 1; - break; + // convert to platform's wide character encoding + String tmp; + switch (ARCH->getWideCharEncoding()) { + case IArchString::kUCS2: + tmp = UTF8ToUCS2(src, errors); + size = (UInt32)tmp.size() >> 1; + break; - case IArchString::kUCS4: - tmp = UTF8ToUCS4(src, errors); - size = (UInt32)tmp.size() >> 2; - break; + case IArchString::kUCS4: + tmp = UTF8ToUCS4(src, errors); + size = (UInt32)tmp.size() >> 2; + break; - case IArchString::kUTF16: - tmp = UTF8ToUTF16(src, errors); - size = (UInt32)tmp.size() >> 1; - break; + case IArchString::kUTF16: + tmp = UTF8ToUTF16(src, errors); + size = (UInt32)tmp.size() >> 1; + break; - case IArchString::kUTF32: - tmp = UTF8ToUTF32(src, errors); - size = (UInt32)tmp.size() >> 2; - break; + case IArchString::kUTF32: + tmp = UTF8ToUTF32(src, errors); + size = (UInt32)tmp.size() >> 2; + break; - default: - assert(0 && "unknown wide character encoding"); - } + default: + assert(0 && "unknown wide character encoding"); + } - // copy to a wchar_t array - wchar_t* dst = new wchar_t[size]; - ::memcpy(dst, tmp.data(), sizeof(wchar_t) * size); - return dst; + // copy to a wchar_t array + wchar_t* dst = new wchar_t[size]; + ::memcpy(dst, tmp.data(), sizeof(wchar_t) * size); + return dst; } String Unicode::wideCharToUTF8(const wchar_t* src, UInt32 size, bool* errors) { - // convert from platform's wide character encoding. - // note -- this must include a wide nul character (independent of - // the String's nul character). - switch (ARCH->getWideCharEncoding()) { - case IArchString::kUCS2: - return doUCS2ToUTF8(reinterpret_cast(src), size, errors); + // convert from platform's wide character encoding. + // note -- this must include a wide nul character (independent of + // the String's nul character). + switch (ARCH->getWideCharEncoding()) { + case IArchString::kUCS2: + return doUCS2ToUTF8(reinterpret_cast(src), size, errors); - case IArchString::kUCS4: - return doUCS4ToUTF8(reinterpret_cast(src), size, errors); + case IArchString::kUCS4: + return doUCS4ToUTF8(reinterpret_cast(src), size, errors); - case IArchString::kUTF16: - return doUTF16ToUTF8(reinterpret_cast(src), size, errors); + case IArchString::kUTF16: + return doUTF16ToUTF8(reinterpret_cast(src), size, errors); - case IArchString::kUTF32: - return doUTF32ToUTF8(reinterpret_cast(src), size, errors); + case IArchString::kUTF32: + return doUTF32ToUTF8(reinterpret_cast(src), size, errors); - default: - assert(0 && "unknown wide character encoding"); - return String(); - } + default: + assert(0 && "unknown wide character encoding"); + return String(); + } } String Unicode::doUCS2ToUTF8(const UInt8* data, UInt32 n, bool* errors) { - // make some space - String dst; - dst.reserve(n); + // make some space + String dst; + dst.reserve(n); - // check if first character is 0xfffe or 0xfeff - bool byteSwapped = false; - if (n >= 1) { - switch (decode16(data, false)) { - case 0x0000feff: - data += 2; - --n; - break; + // check if first character is 0xfffe or 0xfeff + bool byteSwapped = false; + if (n >= 1) { + switch (decode16(data, false)) { + case 0x0000feff: + data += 2; + --n; + break; - case 0x0000fffe: - byteSwapped = true; - data += 2; - --n; - break; + case 0x0000fffe: + byteSwapped = true; + data += 2; + --n; + break; - default: - break; - } - } + default: + break; + } + } - // convert each character - for (; n > 0; data += 2, --n) { - UInt32 c = decode16(data, byteSwapped); - toUTF8(dst, c, errors); - } + // convert each character + for (; n > 0; data += 2, --n) { + UInt32 c = decode16(data, byteSwapped); + toUTF8(dst, c, errors); + } - return dst; + return dst; } String Unicode::doUCS4ToUTF8(const UInt8* data, UInt32 n, bool* errors) { - // make some space - String dst; - dst.reserve(n); + // make some space + String dst; + dst.reserve(n); - // check if first character is 0xfffe or 0xfeff - bool byteSwapped = false; - if (n >= 1) { - switch (decode32(data, false)) { - case 0x0000feff: - data += 4; - --n; - break; + // check if first character is 0xfffe or 0xfeff + bool byteSwapped = false; + if (n >= 1) { + switch (decode32(data, false)) { + case 0x0000feff: + data += 4; + --n; + break; - case 0x0000fffe: - byteSwapped = true; - data += 4; - --n; - break; + case 0x0000fffe: + byteSwapped = true; + data += 4; + --n; + break; - default: - break; - } - } + default: + break; + } + } - // convert each character - for (; n > 0; data += 4, --n) { - UInt32 c = decode32(data, byteSwapped); - toUTF8(dst, c, errors); - } + // convert each character + for (; n > 0; data += 4, --n) { + UInt32 c = decode32(data, byteSwapped); + toUTF8(dst, c, errors); + } - return dst; + return dst; } String Unicode::doUTF16ToUTF8(const UInt8* data, UInt32 n, bool* errors) { - // make some space - String dst; - dst.reserve(n); + // make some space + String dst; + dst.reserve(n); - // check if first character is 0xfffe or 0xfeff - bool byteSwapped = false; - if (n >= 1) { - switch (decode16(data, false)) { - case 0x0000feff: - data += 2; - --n; - break; + // check if first character is 0xfffe or 0xfeff + bool byteSwapped = false; + if (n >= 1) { + switch (decode16(data, false)) { + case 0x0000feff: + data += 2; + --n; + break; - case 0x0000fffe: - byteSwapped = true; - data += 2; - --n; - break; + case 0x0000fffe: + byteSwapped = true; + data += 2; + --n; + break; - default: - break; - } - } + default: + break; + } + } - // convert each character - for (; n > 0; data += 2, --n) { - UInt32 c = decode16(data, byteSwapped); - if (c < 0x0000d800 || c > 0x0000dfff) { - toUTF8(dst, c, errors); - } - else if (n == 1) { - // error -- missing second word - setError(errors); - toUTF8(dst, s_replacement, NULL); - } - else if (c >= 0x0000d800 && c <= 0x0000dbff) { - UInt32 c2 = decode16(data, byteSwapped); - data += 2; - --n; - if (c2 < 0x0000dc00 || c2 > 0x0000dfff) { - // error -- [d800,dbff] not followed by [dc00,dfff] - setError(errors); - toUTF8(dst, s_replacement, NULL); - } - else { - c = (((c - 0x0000d800) << 10) | (c2 - 0x0000dc00)) + 0x00010000; - toUTF8(dst, c, errors); - } - } - else { - // error -- [dc00,dfff] without leading [d800,dbff] - setError(errors); - toUTF8(dst, s_replacement, NULL); - } - } + // convert each character + for (; n > 0; data += 2, --n) { + UInt32 c = decode16(data, byteSwapped); + if (c < 0x0000d800 || c > 0x0000dfff) { + toUTF8(dst, c, errors); + } + else if (n == 1) { + // error -- missing second word + setError(errors); + toUTF8(dst, s_replacement, NULL); + } + else if (c >= 0x0000d800 && c <= 0x0000dbff) { + UInt32 c2 = decode16(data, byteSwapped); + data += 2; + --n; + if (c2 < 0x0000dc00 || c2 > 0x0000dfff) { + // error -- [d800,dbff] not followed by [dc00,dfff] + setError(errors); + toUTF8(dst, s_replacement, NULL); + } + else { + c = (((c - 0x0000d800) << 10) | (c2 - 0x0000dc00)) + 0x00010000; + toUTF8(dst, c, errors); + } + } + else { + // error -- [dc00,dfff] without leading [d800,dbff] + setError(errors); + toUTF8(dst, s_replacement, NULL); + } + } - return dst; + return dst; } String Unicode::doUTF32ToUTF8(const UInt8* data, UInt32 n, bool* errors) { - // make some space - String dst; - dst.reserve(n); + // make some space + String dst; + dst.reserve(n); - // check if first character is 0xfffe or 0xfeff - bool byteSwapped = false; - if (n >= 1) { - switch (decode32(data, false)) { - case 0x0000feff: - data += 4; - --n; - break; + // check if first character is 0xfffe or 0xfeff + bool byteSwapped = false; + if (n >= 1) { + switch (decode32(data, false)) { + case 0x0000feff: + data += 4; + --n; + break; - case 0x0000fffe: - byteSwapped = true; - data += 4; - --n; - break; + case 0x0000fffe: + byteSwapped = true; + data += 4; + --n; + break; - default: - break; - } - } + default: + break; + } + } - // convert each character - for (; n > 0; data += 4, --n) { - UInt32 c = decode32(data, byteSwapped); - if (c >= 0x00110000) { - setError(errors); - c = s_replacement; - } - toUTF8(dst, c, errors); - } + // convert each character + for (; n > 0; data += 4, --n) { + UInt32 c = decode32(data, byteSwapped); + if (c >= 0x00110000) { + setError(errors); + c = s_replacement; + } + toUTF8(dst, c, errors); + } - return dst; + return dst; } UInt32 Unicode::fromUTF8(const UInt8*& data, UInt32& n) { - assert(data != NULL); - assert(n != 0); + assert(data != NULL); + assert(n != 0); - // compute character encoding length, checking for overlong - // sequences (i.e. characters that don't use the shortest - // possible encoding). - UInt32 size; - if (data[0] < 0x80) { - // 0xxxxxxx - size = 1; - } - else if (data[0] < 0xc0) { - // 10xxxxxx -- in the middle of a multibyte character. counts - // as one invalid character. - --n; - ++data; - return s_invalid; - } - else if (data[0] < 0xe0) { - // 110xxxxx - size = 2; - } - else if (data[0] < 0xf0) { - // 1110xxxx - size = 3; - } - else if (data[0] < 0xf8) { - // 11110xxx - size = 4; - } - else if (data[0] < 0xfc) { - // 111110xx - size = 5; - } - else if (data[0] < 0xfe) { - // 1111110x - size = 6; - } - else { - // invalid sequence. dunno how many bytes to skip so skip one. - --n; - ++data; - return s_invalid; - } + // compute character encoding length, checking for overlong + // sequences (i.e. characters that don't use the shortest + // possible encoding). + UInt32 size; + if (data[0] < 0x80) { + // 0xxxxxxx + size = 1; + } + else if (data[0] < 0xc0) { + // 10xxxxxx -- in the middle of a multibyte character. counts + // as one invalid character. + --n; + ++data; + return s_invalid; + } + else if (data[0] < 0xe0) { + // 110xxxxx + size = 2; + } + else if (data[0] < 0xf0) { + // 1110xxxx + size = 3; + } + else if (data[0] < 0xf8) { + // 11110xxx + size = 4; + } + else if (data[0] < 0xfc) { + // 111110xx + size = 5; + } + else if (data[0] < 0xfe) { + // 1111110x + size = 6; + } + else { + // invalid sequence. dunno how many bytes to skip so skip one. + --n; + ++data; + return s_invalid; + } - // make sure we have enough data - if (size > n) { - data += n; - n = 0; - return s_invalid; - } + // make sure we have enough data + if (size > n) { + data += n; + n = 0; + return s_invalid; + } - // extract character - UInt32 c; - switch (size) { - case 1: - c = static_cast(data[0]); - break; + // extract character + UInt32 c; + switch (size) { + case 1: + c = static_cast(data[0]); + break; - case 2: - c = ((static_cast(data[0]) & 0x1f) << 6) | - ((static_cast(data[1]) & 0x3f) ); - break; + case 2: + c = ((static_cast(data[0]) & 0x1f) << 6) | + ((static_cast(data[1]) & 0x3f) ); + break; - case 3: - c = ((static_cast(data[0]) & 0x0f) << 12) | - ((static_cast(data[1]) & 0x3f) << 6) | - ((static_cast(data[2]) & 0x3f) ); - break; + case 3: + c = ((static_cast(data[0]) & 0x0f) << 12) | + ((static_cast(data[1]) & 0x3f) << 6) | + ((static_cast(data[2]) & 0x3f) ); + break; - case 4: - c = ((static_cast(data[0]) & 0x07) << 18) | - ((static_cast(data[1]) & 0x3f) << 12) | - ((static_cast(data[1]) & 0x3f) << 6) | - ((static_cast(data[1]) & 0x3f) ); - break; + case 4: + c = ((static_cast(data[0]) & 0x07) << 18) | + ((static_cast(data[1]) & 0x3f) << 12) | + ((static_cast(data[1]) & 0x3f) << 6) | + ((static_cast(data[1]) & 0x3f) ); + break; - case 5: - c = ((static_cast(data[0]) & 0x03) << 24) | - ((static_cast(data[1]) & 0x3f) << 18) | - ((static_cast(data[1]) & 0x3f) << 12) | - ((static_cast(data[1]) & 0x3f) << 6) | - ((static_cast(data[1]) & 0x3f) ); - break; + case 5: + c = ((static_cast(data[0]) & 0x03) << 24) | + ((static_cast(data[1]) & 0x3f) << 18) | + ((static_cast(data[1]) & 0x3f) << 12) | + ((static_cast(data[1]) & 0x3f) << 6) | + ((static_cast(data[1]) & 0x3f) ); + break; - case 6: - c = ((static_cast(data[0]) & 0x01) << 30) | - ((static_cast(data[1]) & 0x3f) << 24) | - ((static_cast(data[1]) & 0x3f) << 18) | - ((static_cast(data[1]) & 0x3f) << 12) | - ((static_cast(data[1]) & 0x3f) << 6) | - ((static_cast(data[1]) & 0x3f) ); - break; + case 6: + c = ((static_cast(data[0]) & 0x01) << 30) | + ((static_cast(data[1]) & 0x3f) << 24) | + ((static_cast(data[1]) & 0x3f) << 18) | + ((static_cast(data[1]) & 0x3f) << 12) | + ((static_cast(data[1]) & 0x3f) << 6) | + ((static_cast(data[1]) & 0x3f) ); + break; - default: - assert(0 && "invalid size"); - return s_invalid; - } + default: + assert(0 && "invalid size"); + return s_invalid; + } - // check that all bytes after the first have the pattern 10xxxxxx. - // truncated sequences are treated as a single malformed character. - bool truncated = false; - switch (size) { - case 6: - if ((data[5] & 0xc0) != 0x80) { - truncated = true; - size = 5; - } - // fall through + // check that all bytes after the first have the pattern 10xxxxxx. + // truncated sequences are treated as a single malformed character. + bool truncated = false; + switch (size) { + case 6: + if ((data[5] & 0xc0) != 0x80) { + truncated = true; + size = 5; + } + // fall through - case 5: - if ((data[4] & 0xc0) != 0x80) { - truncated = true; - size = 4; - } - // fall through + case 5: + if ((data[4] & 0xc0) != 0x80) { + truncated = true; + size = 4; + } + // fall through - case 4: - if ((data[3] & 0xc0) != 0x80) { - truncated = true; - size = 3; - } - // fall through + case 4: + if ((data[3] & 0xc0) != 0x80) { + truncated = true; + size = 3; + } + // fall through - case 3: - if ((data[2] & 0xc0) != 0x80) { - truncated = true; - size = 2; - } - // fall through + case 3: + if ((data[2] & 0xc0) != 0x80) { + truncated = true; + size = 2; + } + // fall through - case 2: - if ((data[1] & 0xc0) != 0x80) { - truncated = true; - size = 1; - } - } + case 2: + if ((data[1] & 0xc0) != 0x80) { + truncated = true; + size = 1; + } + } - // update parameters - data += size; - n -= size; + // update parameters + data += size; + n -= size; - // invalid if sequence was truncated - if (truncated) { - return s_invalid; - } + // invalid if sequence was truncated + if (truncated) { + return s_invalid; + } - // check for characters that didn't use the smallest possible encoding - static UInt32 s_minChar[] = { - 0, - 0x00000000, - 0x00000080, - 0x00000800, - 0x00010000, - 0x00200000, - 0x04000000 - }; - if (c < s_minChar[size]) { - return s_invalid; - } + // check for characters that didn't use the smallest possible encoding + static UInt32 s_minChar[] = { + 0, + 0x00000000, + 0x00000080, + 0x00000800, + 0x00010000, + 0x00200000, + 0x04000000 + }; + if (c < s_minChar[size]) { + return s_invalid; + } - // check for characters not in ISO-10646 - if (c >= 0x0000d800 && c <= 0x0000dfff) { - return s_invalid; - } - if (c >= 0x0000fffe && c <= 0x0000ffff) { - return s_invalid; - } + // check for characters not in ISO-10646 + if (c >= 0x0000d800 && c <= 0x0000dfff) { + return s_invalid; + } + if (c >= 0x0000fffe && c <= 0x0000ffff) { + return s_invalid; + } - return c; + return c; } void Unicode::toUTF8(String& dst, UInt32 c, bool* errors) { - UInt8 data[6]; + UInt8 data[6]; - // handle characters outside the valid range - if ((c >= 0x0000d800 && c <= 0x0000dfff) || c >= 0x80000000) { - setError(errors); - c = s_replacement; - } + // handle characters outside the valid range + if ((c >= 0x0000d800 && c <= 0x0000dfff) || c >= 0x80000000) { + setError(errors); + c = s_replacement; + } - // convert to UTF-8 - if (c < 0x00000080) { - data[0] = static_cast(c); - dst.append(reinterpret_cast(data), 1); - } - else if (c < 0x00000800) { - data[0] = static_cast(((c >> 6) & 0x0000001f) + 0xc0); - data[1] = static_cast((c & 0x0000003f) + 0x80); - dst.append(reinterpret_cast(data), 2); - } - else if (c < 0x00010000) { - data[0] = static_cast(((c >> 12) & 0x0000000f) + 0xe0); - data[1] = static_cast(((c >> 6) & 0x0000003f) + 0x80); - data[2] = static_cast((c & 0x0000003f) + 0x80); - dst.append(reinterpret_cast(data), 3); - } - else if (c < 0x00200000) { - data[0] = static_cast(((c >> 18) & 0x00000007) + 0xf0); - data[1] = static_cast(((c >> 12) & 0x0000003f) + 0x80); - data[2] = static_cast(((c >> 6) & 0x0000003f) + 0x80); - data[3] = static_cast((c & 0x0000003f) + 0x80); - dst.append(reinterpret_cast(data), 4); - } - else if (c < 0x04000000) { - data[0] = static_cast(((c >> 24) & 0x00000003) + 0xf8); - data[1] = static_cast(((c >> 18) & 0x0000003f) + 0x80); - data[2] = static_cast(((c >> 12) & 0x0000003f) + 0x80); - data[3] = static_cast(((c >> 6) & 0x0000003f) + 0x80); - data[4] = static_cast((c & 0x0000003f) + 0x80); - dst.append(reinterpret_cast(data), 5); - } - else if (c < 0x80000000) { - data[0] = static_cast(((c >> 30) & 0x00000001) + 0xfc); - data[1] = static_cast(((c >> 24) & 0x0000003f) + 0x80); - data[2] = static_cast(((c >> 18) & 0x0000003f) + 0x80); - data[3] = static_cast(((c >> 12) & 0x0000003f) + 0x80); - data[4] = static_cast(((c >> 6) & 0x0000003f) + 0x80); - data[5] = static_cast((c & 0x0000003f) + 0x80); - dst.append(reinterpret_cast(data), 6); - } - else { - assert(0 && "character out of range"); - } + // convert to UTF-8 + if (c < 0x00000080) { + data[0] = static_cast(c); + dst.append(reinterpret_cast(data), 1); + } + else if (c < 0x00000800) { + data[0] = static_cast(((c >> 6) & 0x0000001f) + 0xc0); + data[1] = static_cast((c & 0x0000003f) + 0x80); + dst.append(reinterpret_cast(data), 2); + } + else if (c < 0x00010000) { + data[0] = static_cast(((c >> 12) & 0x0000000f) + 0xe0); + data[1] = static_cast(((c >> 6) & 0x0000003f) + 0x80); + data[2] = static_cast((c & 0x0000003f) + 0x80); + dst.append(reinterpret_cast(data), 3); + } + else if (c < 0x00200000) { + data[0] = static_cast(((c >> 18) & 0x00000007) + 0xf0); + data[1] = static_cast(((c >> 12) & 0x0000003f) + 0x80); + data[2] = static_cast(((c >> 6) & 0x0000003f) + 0x80); + data[3] = static_cast((c & 0x0000003f) + 0x80); + dst.append(reinterpret_cast(data), 4); + } + else if (c < 0x04000000) { + data[0] = static_cast(((c >> 24) & 0x00000003) + 0xf8); + data[1] = static_cast(((c >> 18) & 0x0000003f) + 0x80); + data[2] = static_cast(((c >> 12) & 0x0000003f) + 0x80); + data[3] = static_cast(((c >> 6) & 0x0000003f) + 0x80); + data[4] = static_cast((c & 0x0000003f) + 0x80); + dst.append(reinterpret_cast(data), 5); + } + else if (c < 0x80000000) { + data[0] = static_cast(((c >> 30) & 0x00000001) + 0xfc); + data[1] = static_cast(((c >> 24) & 0x0000003f) + 0x80); + data[2] = static_cast(((c >> 18) & 0x0000003f) + 0x80); + data[3] = static_cast(((c >> 12) & 0x0000003f) + 0x80); + data[4] = static_cast(((c >> 6) & 0x0000003f) + 0x80); + data[5] = static_cast((c & 0x0000003f) + 0x80); + dst.append(reinterpret_cast(data), 6); + } + else { + assert(0 && "character out of range"); + } } diff --git a/src/lib/base/Unicode.h b/src/lib/base/Unicode.h index 5df7016a..b92b665b 100644 --- a/src/lib/base/Unicode.h +++ b/src/lib/base/Unicode.h @@ -28,117 +28,117 @@ encodings and the current locale encoding. */ class Unicode { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Test UTF-8 string for validity - /*! - Returns true iff the string contains a valid sequence of UTF-8 - encoded characters. - */ - static bool isUTF8(const String&); + //! Test UTF-8 string for validity + /*! + Returns true iff the string contains a valid sequence of UTF-8 + encoded characters. + */ + static bool isUTF8(const String&); - //! Convert from UTF-8 to UCS-2 encoding - /*! - Convert from UTF-8 to UCS-2. If errors is not NULL then *errors - is set to true iff any character could not be encoded in UCS-2. - Decoding errors do not set *errors. - */ - static String UTF8ToUCS2(const String&, bool* errors = NULL); + //! Convert from UTF-8 to UCS-2 encoding + /*! + Convert from UTF-8 to UCS-2. If errors is not NULL then *errors + is set to true iff any character could not be encoded in UCS-2. + Decoding errors do not set *errors. + */ + static String UTF8ToUCS2(const String&, bool* errors = NULL); - //! Convert from UTF-8 to UCS-4 encoding - /*! - Convert from UTF-8 to UCS-4. If errors is not NULL then *errors - is set to true iff any character could not be encoded in UCS-4. - Decoding errors do not set *errors. - */ - static String UTF8ToUCS4(const String&, bool* errors = NULL); + //! Convert from UTF-8 to UCS-4 encoding + /*! + Convert from UTF-8 to UCS-4. If errors is not NULL then *errors + is set to true iff any character could not be encoded in UCS-4. + Decoding errors do not set *errors. + */ + static String UTF8ToUCS4(const String&, bool* errors = NULL); - //! Convert from UTF-8 to UTF-16 encoding - /*! - Convert from UTF-8 to UTF-16. If errors is not NULL then *errors - is set to true iff any character could not be encoded in UTF-16. - Decoding errors do not set *errors. - */ - static String UTF8ToUTF16(const String&, bool* errors = NULL); + //! Convert from UTF-8 to UTF-16 encoding + /*! + Convert from UTF-8 to UTF-16. If errors is not NULL then *errors + is set to true iff any character could not be encoded in UTF-16. + Decoding errors do not set *errors. + */ + static String UTF8ToUTF16(const String&, bool* errors = NULL); - //! Convert from UTF-8 to UTF-32 encoding - /*! - Convert from UTF-8 to UTF-32. If errors is not NULL then *errors - is set to true iff any character could not be encoded in UTF-32. - Decoding errors do not set *errors. - */ - static String UTF8ToUTF32(const String&, bool* errors = NULL); + //! Convert from UTF-8 to UTF-32 encoding + /*! + Convert from UTF-8 to UTF-32. If errors is not NULL then *errors + is set to true iff any character could not be encoded in UTF-32. + Decoding errors do not set *errors. + */ + static String UTF8ToUTF32(const String&, bool* errors = NULL); - //! Convert from UTF-8 to the current locale encoding - /*! - Convert from UTF-8 to the current locale encoding. If errors is not - NULL then *errors is set to true iff any character could not be encoded. - Decoding errors do not set *errors. - */ - static String UTF8ToText(const String&, bool* errors = NULL); + //! Convert from UTF-8 to the current locale encoding + /*! + Convert from UTF-8 to the current locale encoding. If errors is not + NULL then *errors is set to true iff any character could not be encoded. + Decoding errors do not set *errors. + */ + static String UTF8ToText(const String&, bool* errors = NULL); - //! Convert from UCS-2 to UTF-8 - /*! - Convert from UCS-2 to UTF-8. If errors is not NULL then *errors is - set to true iff any character could not be decoded. - */ - static String UCS2ToUTF8(const String&, bool* errors = NULL); + //! Convert from UCS-2 to UTF-8 + /*! + Convert from UCS-2 to UTF-8. If errors is not NULL then *errors is + set to true iff any character could not be decoded. + */ + static String UCS2ToUTF8(const String&, bool* errors = NULL); - //! Convert from UCS-4 to UTF-8 - /*! - Convert from UCS-4 to UTF-8. If errors is not NULL then *errors is - set to true iff any character could not be decoded. - */ - static String UCS4ToUTF8(const String&, bool* errors = NULL); + //! Convert from UCS-4 to UTF-8 + /*! + Convert from UCS-4 to UTF-8. If errors is not NULL then *errors is + set to true iff any character could not be decoded. + */ + static String UCS4ToUTF8(const String&, bool* errors = NULL); - //! Convert from UTF-16 to UTF-8 - /*! - Convert from UTF-16 to UTF-8. If errors is not NULL then *errors is - set to true iff any character could not be decoded. - */ - static String UTF16ToUTF8(const String&, bool* errors = NULL); + //! Convert from UTF-16 to UTF-8 + /*! + Convert from UTF-16 to UTF-8. If errors is not NULL then *errors is + set to true iff any character could not be decoded. + */ + static String UTF16ToUTF8(const String&, bool* errors = NULL); - //! Convert from UTF-32 to UTF-8 - /*! - Convert from UTF-32 to UTF-8. If errors is not NULL then *errors is - set to true iff any character could not be decoded. - */ - static String UTF32ToUTF8(const String&, bool* errors = NULL); + //! Convert from UTF-32 to UTF-8 + /*! + Convert from UTF-32 to UTF-8. If errors is not NULL then *errors is + set to true iff any character could not be decoded. + */ + static String UTF32ToUTF8(const String&, bool* errors = NULL); - //! Convert from the current locale encoding to UTF-8 - /*! - Convert from the current locale encoding to UTF-8. If errors is not - NULL then *errors is set to true iff any character could not be decoded. - */ - static String textToUTF8(const String&, bool* errors = NULL); + //! Convert from the current locale encoding to UTF-8 + /*! + Convert from the current locale encoding to UTF-8. If errors is not + NULL then *errors is set to true iff any character could not be decoded. + */ + static String textToUTF8(const String&, bool* errors = NULL); - //@} + //@} private: - // convert UTF8 to wchar_t string (using whatever encoding is native - // to the platform). caller must delete[] the returned string. the - // string is *not* nul terminated; the length (in characters) is - // returned in size. - static wchar_t* UTF8ToWideChar(const String&, - UInt32& size, bool* errors); + // convert UTF8 to wchar_t string (using whatever encoding is native + // to the platform). caller must delete[] the returned string. the + // string is *not* nul terminated; the length (in characters) is + // returned in size. + static wchar_t* UTF8ToWideChar(const String&, + UInt32& size, bool* errors); - // convert nul terminated wchar_t string (in platform's native - // encoding) to UTF8. - static String wideCharToUTF8(const wchar_t*, - UInt32 size, bool* errors); + // convert nul terminated wchar_t string (in platform's native + // encoding) to UTF8. + static String wideCharToUTF8(const wchar_t*, + UInt32 size, bool* errors); - // internal conversion to UTF8 - static String doUCS2ToUTF8(const UInt8* src, UInt32 n, bool* errors); - static String doUCS4ToUTF8(const UInt8* src, UInt32 n, bool* errors); - static String doUTF16ToUTF8(const UInt8* src, UInt32 n, bool* errors); - static String doUTF32ToUTF8(const UInt8* src, UInt32 n, bool* errors); + // internal conversion to UTF8 + static String doUCS2ToUTF8(const UInt8* src, UInt32 n, bool* errors); + static String doUCS4ToUTF8(const UInt8* src, UInt32 n, bool* errors); + static String doUTF16ToUTF8(const UInt8* src, UInt32 n, bool* errors); + static String doUTF32ToUTF8(const UInt8* src, UInt32 n, bool* errors); - // convert characters to/from UTF8 - static UInt32 fromUTF8(const UInt8*& src, UInt32& size); - static void toUTF8(String& dst, UInt32 c, bool* errors); + // convert characters to/from UTF8 + static UInt32 fromUTF8(const UInt8*& src, UInt32& size); + static void toUTF8(String& dst, UInt32 c, bool* errors); private: - static UInt32 s_invalid; - static UInt32 s_replacement; + static UInt32 s_invalid; + static UInt32 s_replacement; }; diff --git a/src/lib/base/XBase.cpp b/src/lib/base/XBase.cpp index a20114de..ee4b5665 100644 --- a/src/lib/base/XBase.cpp +++ b/src/lib/base/XBase.cpp @@ -27,50 +27,50 @@ // XBase::XBase() : - std::runtime_error("") + std::runtime_error("") { - // do nothing + // do nothing } XBase::XBase(const String& msg) : - std::runtime_error(msg) + std::runtime_error(msg) { - // do nothing + // do nothing } XBase::~XBase() _NOEXCEPT { - // do nothing + // do nothing } const char* XBase::what() const _NOEXCEPT { - const char* what = std::runtime_error::what(); - if (strlen(what) == 0) { - m_what = getWhat(); - return m_what.c_str(); - } - return what; + const char* what = std::runtime_error::what(); + if (strlen(what) == 0) { + m_what = getWhat(); + return m_what.c_str(); + } + return what; } String XBase::format(const char* /*id*/, const char* fmt, ...) const throw() { - // FIXME -- lookup message string using id as an index. set - // fmt to that string if it exists. + // FIXME -- lookup message string using id as an index. set + // fmt to that string if it exists. - // format - String result; - va_list args; - va_start(args, fmt); - try { - result = synergy::string::vformat(fmt, args); - } - catch (...) { - // ignore - } - va_end(args); + // format + String result; + va_list args; + va_start(args, fmt); + try { + result = synergy::string::vformat(fmt, args); + } + catch (...) { + // ignore + } + va_end(args); - return result; + return result; } diff --git a/src/lib/base/XBase.h b/src/lib/base/XBase.h index ffa249cf..33da3bc4 100644 --- a/src/lib/base/XBase.h +++ b/src/lib/base/XBase.h @@ -27,29 +27,29 @@ This is the base class of most exception types. */ class XBase : public std::runtime_error { public: - //! Use getWhat() as the result of what() - XBase(); - //! Use \c msg as the result of what() - XBase(const String& msg); - virtual ~XBase() _NOEXCEPT; + //! Use getWhat() as the result of what() + XBase(); + //! Use \c msg as the result of what() + XBase(const String& msg); + virtual ~XBase() _NOEXCEPT; - //! Reason for exception - virtual const char* what() const _NOEXCEPT; + //! Reason for exception + virtual const char* what() const _NOEXCEPT; protected: - //! Get a human readable string describing the exception - virtual String getWhat() const throw() { return ""; } + //! Get a human readable string describing the exception + virtual String getWhat() const throw() { return ""; } - //! Format a string - /*! - Looks up a message format using \c id, using \c defaultFormat if - no format can be found, then replaces positional parameters in - the format string and returns the result. - */ - virtual String format(const char* id, - const char* defaultFormat, ...) const throw(); + //! Format a string + /*! + Looks up a message format using \c id, using \c defaultFormat if + no format can be found, then replaces positional parameters in + the format string and returns the result. + */ + virtual String format(const char* id, + const char* defaultFormat, ...) const throw(); private: - mutable String m_what; + mutable String m_what; }; /*! @@ -58,12 +58,12 @@ Convenience macro to subclass from XBase (or a subclass of it), providing the c'tor taking a const String&. getWhat() is not declared. */ -#define XBASE_SUBCLASS(name_, super_) \ -class name_ : public super_ { \ -public: \ - name_() : super_() { } \ - name_(const String& msg) : super_(msg) { } \ - virtual ~name_() _NOEXCEPT { } \ +#define XBASE_SUBCLASS(name_, super_) \ +class name_ : public super_ { \ +public: \ + name_() : super_() { } \ + name_(const String& msg) : super_(msg) { } \ + virtual ~name_() _NOEXCEPT { } \ } /*! @@ -72,15 +72,15 @@ Convenience macro to subclass from XBase (or a subclass of it), providing the c'tor taking a const String&. getWhat() must be implemented. */ -#define XBASE_SUBCLASS_WHAT(name_, super_) \ -class name_ : public super_ { \ -public: \ - name_() : super_() { } \ - name_(const String& msg) : super_(msg) { } \ - virtual ~name_() _NOEXCEPT { } \ - \ -protected: \ - virtual String getWhat() const throw(); \ +#define XBASE_SUBCLASS_WHAT(name_, super_) \ +class name_ : public super_ { \ +public: \ + name_() : super_() { } \ + name_(const String& msg) : super_(msg) { } \ + virtual ~name_() _NOEXCEPT { } \ + \ +protected: \ + virtual String getWhat() const throw(); \ } /*! @@ -91,35 +91,35 @@ to call getWhat() when first called; getWhat() can format the error message and can call what() to get the message passed to the c'tor. */ -#define XBASE_SUBCLASS_FORMAT(name_, super_) \ -class name_ : public super_ { \ -private: \ - enum EState { kFirst, kFormat, kDone }; \ - \ -public: \ - name_() : super_(), m_state(kDone) { } \ - name_(const String& msg) : super_(msg), m_state(kFirst) { } \ - virtual ~name_() _NOEXCEPT { } \ - \ - virtual const char* what() const _NOEXCEPT \ - { \ - if (m_state == kFirst) { \ - m_state = kFormat; \ - m_formatted = getWhat(); \ - m_state = kDone; \ - } \ - if (m_state == kDone) { \ - return m_formatted.c_str(); \ - } \ - else { \ - return super_::what(); \ - } \ - } \ - \ -protected: \ - virtual String getWhat() const throw(); \ - \ -private: \ - mutable EState m_state; \ - mutable std::string m_formatted; \ +#define XBASE_SUBCLASS_FORMAT(name_, super_) \ +class name_ : public super_ { \ +private: \ + enum EState { kFirst, kFormat, kDone }; \ + \ +public: \ + name_() : super_(), m_state(kDone) { } \ + name_(const String& msg) : super_(msg), m_state(kFirst) { } \ + virtual ~name_() _NOEXCEPT { } \ + \ + virtual const char* what() const _NOEXCEPT \ + { \ + if (m_state == kFirst) { \ + m_state = kFormat; \ + m_formatted = getWhat(); \ + m_state = kDone; \ + } \ + if (m_state == kDone) { \ + return m_formatted.c_str(); \ + } \ + else { \ + return super_::what(); \ + } \ + } \ + \ +protected: \ + virtual String getWhat() const throw(); \ + \ +private: \ + mutable EState m_state; \ + mutable std::string m_formatted; \ } diff --git a/src/lib/base/log_outputters.cpp b/src/lib/base/log_outputters.cpp index 0dcd608c..514e0fa3 100644 --- a/src/lib/base/log_outputters.cpp +++ b/src/lib/base/log_outputters.cpp @@ -23,7 +23,7 @@ #include enum EFileLogOutputter { - kFileSizeLimit = 1024 // kb + kFileSizeLimit = 1024 // kb }; // @@ -32,36 +32,36 @@ enum EFileLogOutputter { StopLogOutputter::StopLogOutputter() { - // do nothing + // do nothing } StopLogOutputter::~StopLogOutputter() { - // do nothing + // do nothing } void StopLogOutputter::open(const char*) { - // do nothing + // do nothing } void StopLogOutputter::close() { - // do nothing + // do nothing } void StopLogOutputter::show(bool) { - // do nothing + // do nothing } bool StopLogOutputter::write(ELevel, const char*) { - return false; + return false; } @@ -80,26 +80,26 @@ ConsoleLogOutputter::~ConsoleLogOutputter() void ConsoleLogOutputter::open(const char* title) { - ARCH->openConsole(title); + ARCH->openConsole(title); } void ConsoleLogOutputter::close() { - ARCH->closeConsole(); + ARCH->closeConsole(); } void ConsoleLogOutputter::show(bool showIfEmpty) { - ARCH->showConsole(showIfEmpty); + ARCH->showConsole(showIfEmpty); } bool ConsoleLogOutputter::write(ELevel level, const char* msg) { - ARCH->writeConsole(level, msg); - return true; + ARCH->writeConsole(level, msg); + return true; } void @@ -115,37 +115,37 @@ ConsoleLogOutputter::flush() SystemLogOutputter::SystemLogOutputter() { - // do nothing + // do nothing } SystemLogOutputter::~SystemLogOutputter() { - // do nothing + // do nothing } void SystemLogOutputter::open(const char* title) { - ARCH->openLog(title); + ARCH->openLog(title); } void SystemLogOutputter::close() { - ARCH->closeLog(); + ARCH->closeLog(); } void SystemLogOutputter::show(bool showIfEmpty) { - ARCH->showLog(showIfEmpty); + ARCH->showLog(showIfEmpty); } bool SystemLogOutputter::write(ELevel level, const char* msg) { - ARCH->writeLog(level, msg); - return true; + ARCH->writeLog(level, msg); + return true; } // @@ -153,26 +153,26 @@ SystemLogOutputter::write(ELevel level, const char* msg) // SystemLogger::SystemLogger(const char* title, bool blockConsole) : - m_stop(NULL) + m_stop(NULL) { - // redirect log messages - if (blockConsole) { - m_stop = new StopLogOutputter; - CLOG->insert(m_stop); - } - m_syslog = new SystemLogOutputter; - m_syslog->open(title); - CLOG->insert(m_syslog); + // redirect log messages + if (blockConsole) { + m_stop = new StopLogOutputter; + CLOG->insert(m_stop); + } + m_syslog = new SystemLogOutputter; + m_syslog->open(title); + CLOG->insert(m_syslog); } SystemLogger::~SystemLogger() { - CLOG->remove(m_syslog); - delete m_syslog; - if (m_stop != NULL) { - CLOG->remove(m_stop); - delete m_stop; - } + CLOG->remove(m_syslog); + delete m_syslog; + if (m_stop != NULL) { + CLOG->remove(m_stop); + delete m_stop; + } } @@ -181,55 +181,55 @@ SystemLogger::~SystemLogger() // BufferedLogOutputter::BufferedLogOutputter(UInt32 maxBufferSize) : - m_maxBufferSize(maxBufferSize) + m_maxBufferSize(maxBufferSize) { - // do nothing + // do nothing } BufferedLogOutputter::~BufferedLogOutputter() { - // do nothing + // do nothing } BufferedLogOutputter::const_iterator BufferedLogOutputter::begin() const { - return m_buffer.begin(); + return m_buffer.begin(); } BufferedLogOutputter::const_iterator BufferedLogOutputter::end() const { - return m_buffer.end(); + return m_buffer.end(); } void BufferedLogOutputter::open(const char*) { - // do nothing + // do nothing } void BufferedLogOutputter::close() { - // remove all elements from the buffer - m_buffer.clear(); + // remove all elements from the buffer + m_buffer.clear(); } void BufferedLogOutputter::show(bool) { - // do nothing + // do nothing } bool BufferedLogOutputter::write(ELevel, const char* message) { - while (m_buffer.size() >= m_maxBufferSize) { - m_buffer.pop_front(); - } - m_buffer.push_back(String(message)); - return true; + while (m_buffer.size() >= m_maxBufferSize) { + m_buffer.pop_front(); + } + m_buffer.push_back(String(message)); + return true; } @@ -239,7 +239,7 @@ BufferedLogOutputter::write(ELevel, const char* message) FileLogOutputter::FileLogOutputter(const char* logFile) { - setLogFilename(logFile); + setLogFilename(logFile); } FileLogOutputter::~FileLogOutputter() @@ -249,35 +249,35 @@ FileLogOutputter::~FileLogOutputter() void FileLogOutputter::setLogFilename(const char* logFile) { - assert(logFile != NULL); - m_fileName = logFile; + assert(logFile != NULL); + m_fileName = logFile; } bool FileLogOutputter::write(ELevel level, const char *message) { - bool moveFile = false; + bool moveFile = false; - std::ofstream m_handle; - m_handle.open(m_fileName.c_str(), std::fstream::app); - if (m_handle.is_open() && m_handle.fail() != true) { - m_handle << message << std::endl; + std::ofstream m_handle; + m_handle.open(m_fileName.c_str(), std::fstream::app); + if (m_handle.is_open() && m_handle.fail() != true) { + m_handle << message << std::endl; - // when file size exceeds limits, move to 'old log' filename. - size_t p = m_handle.tellp(); - if (p > (kFileSizeLimit * 1024)) { - moveFile = true; - } - } - m_handle.close(); + // when file size exceeds limits, move to 'old log' filename. + size_t p = m_handle.tellp(); + if (p > (kFileSizeLimit * 1024)) { + moveFile = true; + } + } + m_handle.close(); - if (moveFile) { - String oldLogFilename = synergy::string::sprintf("%s.1", m_fileName.c_str()); - remove(oldLogFilename.c_str()); - rename(m_fileName.c_str(), oldLogFilename.c_str()); - } + if (moveFile) { + String oldLogFilename = synergy::string::sprintf("%s.1", m_fileName.c_str()); + remove(oldLogFilename.c_str()); + rename(m_fileName.c_str(), oldLogFilename.c_str()); + } - return true; + return true; } void @@ -295,43 +295,43 @@ FileLogOutputter::show(bool showIfEmpty) {} MesssageBoxLogOutputter::MesssageBoxLogOutputter() { - // do nothing + // do nothing } MesssageBoxLogOutputter::~MesssageBoxLogOutputter() { - // do nothing + // do nothing } void MesssageBoxLogOutputter::open(const char* title) { - // do nothing + // do nothing } void MesssageBoxLogOutputter::close() { - // do nothing + // do nothing } void MesssageBoxLogOutputter::show(bool showIfEmpty) { - // do nothing + // do nothing } bool MesssageBoxLogOutputter::write(ELevel level, const char* msg) { - // don't spam user with messages. - if (level > kERROR) { - return true; - } + // don't spam user with messages. + if (level > kERROR) { + return true; + } #if SYSAPI_WIN32 - MessageBox(NULL, msg, CLOG->getFilterName(level), MB_OK); + MessageBox(NULL, msg, CLOG->getFilterName(level), MB_OK); #endif - return true; + return true; } diff --git a/src/lib/base/log_outputters.h b/src/lib/base/log_outputters.h index b5f6a456..fb94c02e 100644 --- a/src/lib/base/log_outputters.h +++ b/src/lib/base/log_outputters.h @@ -35,14 +35,14 @@ this to prevent already inserted outputters from writing. */ class StopLogOutputter : public ILogOutputter { public: - StopLogOutputter(); - virtual ~StopLogOutputter(); + StopLogOutputter(); + virtual ~StopLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); }; //! Write log to console @@ -52,15 +52,15 @@ message is ignored. */ class ConsoleLogOutputter : public ILogOutputter { public: - ConsoleLogOutputter(); - virtual ~ConsoleLogOutputter(); + ConsoleLogOutputter(); + virtual ~ConsoleLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); - virtual void flush(); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); + virtual void flush(); }; //! Write log to file @@ -71,19 +71,19 @@ message is ignored. class FileLogOutputter : public ILogOutputter { public: - FileLogOutputter(const char* logFile); - virtual ~FileLogOutputter(); + FileLogOutputter(const char* logFile); + virtual ~FileLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); - void setLogFilename(const char* title); + void setLogFilename(const char* title); private: - std::string m_fileName; + std::string m_fileName; }; //! Write log to system log @@ -92,14 +92,14 @@ This outputter writes output to the system log. */ class SystemLogOutputter : public ILogOutputter { public: - SystemLogOutputter(); - virtual ~SystemLogOutputter(); + SystemLogOutputter(); + virtual ~SystemLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); }; //! Write log to system log only @@ -112,12 +112,12 @@ the scope. */ class SystemLogger { public: - SystemLogger(const char* title, bool blockConsole); - ~SystemLogger(); + SystemLogger(const char* title, bool blockConsole); + ~SystemLogger(); private: - ILogOutputter* m_syslog; - ILogOutputter* m_stop; + ILogOutputter* m_syslog; + ILogOutputter* m_stop; }; //! Save log history @@ -126,33 +126,33 @@ This outputter records the last N log messages. */ class BufferedLogOutputter : public ILogOutputter { private: - typedef std::deque Buffer; + typedef std::deque Buffer; public: - typedef Buffer::const_iterator const_iterator; + typedef Buffer::const_iterator const_iterator; - BufferedLogOutputter(UInt32 maxBufferSize); - virtual ~BufferedLogOutputter(); + BufferedLogOutputter(UInt32 maxBufferSize); + virtual ~BufferedLogOutputter(); - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get start of buffer - const_iterator begin() const; + //! Get start of buffer + const_iterator begin() const; - //! Get end of buffer - const_iterator end() const; + //! Get end of buffer + const_iterator end() const; - //@} + //@} - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); private: - UInt32 m_maxBufferSize; - Buffer m_buffer; + UInt32 m_maxBufferSize; + Buffer m_buffer; }; //! Write log to message box @@ -161,12 +161,12 @@ The level for each message is ignored. */ class MesssageBoxLogOutputter : public ILogOutputter { public: - MesssageBoxLogOutputter(); - virtual ~MesssageBoxLogOutputter(); + MesssageBoxLogOutputter(); + virtual ~MesssageBoxLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); }; diff --git a/src/lib/client/CMakeLists.txt b/src/lib/client/CMakeLists.txt index 29f3759f..4cbbe6b0 100644 --- a/src/lib/client/CMakeLists.txt +++ b/src/lib/client/CMakeLists.txt @@ -18,23 +18,23 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../../ext + ../ + ../../../ext ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(client STATIC ${sources}) if (UNIX) - target_link_libraries(client synergy io) + target_link_libraries(client synergy io) endif() diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index e0ef9e8b..b37aa558 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -50,785 +50,785 @@ // Client::Client( - IEventQueue* events, - const String& name, const NetworkAddress& address, - ISocketFactory* socketFactory, - synergy::Screen* screen, - ClientArgs const& args) : - m_mock(false), - m_name(name), - m_serverAddress(address), - m_socketFactory(socketFactory), - m_screen(screen), - m_stream(NULL), - m_timer(NULL), - m_server(NULL), - m_ready(false), - m_active(false), - m_suspended(false), - m_connectOnResume(false), - m_events(events), - m_sendFileThread(NULL), - m_writeToDropDirThread(NULL), - m_socket(NULL), - m_useSecureNetwork(args.m_enableCrypto), - m_args(args), - m_enableClipboard(true) + IEventQueue* events, + const String& name, const NetworkAddress& address, + ISocketFactory* socketFactory, + synergy::Screen* screen, + ClientArgs const& args) : + m_mock(false), + m_name(name), + m_serverAddress(address), + m_socketFactory(socketFactory), + m_screen(screen), + m_stream(NULL), + m_timer(NULL), + m_server(NULL), + m_ready(false), + m_active(false), + m_suspended(false), + m_connectOnResume(false), + m_events(events), + m_sendFileThread(NULL), + m_writeToDropDirThread(NULL), + m_socket(NULL), + m_useSecureNetwork(args.m_enableCrypto), + m_args(args), + m_enableClipboard(true) { - assert(m_socketFactory != NULL); - assert(m_screen != NULL); + assert(m_socketFactory != NULL); + assert(m_screen != NULL); - // register suspend/resume event handlers - m_events->adoptHandler(m_events->forIScreen().suspend(), - getEventTarget(), - new TMethodEventJob(this, - &Client::handleSuspend)); - m_events->adoptHandler(m_events->forIScreen().resume(), - getEventTarget(), - new TMethodEventJob(this, - &Client::handleResume)); + // register suspend/resume event handlers + m_events->adoptHandler(m_events->forIScreen().suspend(), + getEventTarget(), + new TMethodEventJob(this, + &Client::handleSuspend)); + m_events->adoptHandler(m_events->forIScreen().resume(), + getEventTarget(), + new TMethodEventJob(this, + &Client::handleResume)); - if (m_args.m_enableDragDrop) { - m_events->adoptHandler(m_events->forFile().fileChunkSending(), - this, - new TMethodEventJob(this, - &Client::handleFileChunkSending)); - m_events->adoptHandler(m_events->forFile().fileRecieveCompleted(), - this, - new TMethodEventJob(this, - &Client::handleFileRecieveCompleted)); - } + if (m_args.m_enableDragDrop) { + m_events->adoptHandler(m_events->forFile().fileChunkSending(), + this, + new TMethodEventJob(this, + &Client::handleFileChunkSending)); + m_events->adoptHandler(m_events->forFile().fileRecieveCompleted(), + this, + new TMethodEventJob(this, + &Client::handleFileRecieveCompleted)); + } } Client::~Client() { - if (m_mock) { - return; - } + if (m_mock) { + return; + } - m_events->removeHandler(m_events->forIScreen().suspend(), - getEventTarget()); - m_events->removeHandler(m_events->forIScreen().resume(), - getEventTarget()); + m_events->removeHandler(m_events->forIScreen().suspend(), + getEventTarget()); + m_events->removeHandler(m_events->forIScreen().resume(), + getEventTarget()); - cleanupTimer(); - cleanupScreen(); - cleanupConnecting(); - cleanupConnection(); - delete m_socketFactory; + cleanupTimer(); + cleanupScreen(); + cleanupConnecting(); + cleanupConnection(); + delete m_socketFactory; } void Client::connect() { - if (m_stream != NULL) { - return; - } - if (m_suspended) { - m_connectOnResume = true; - return; - } + if (m_stream != NULL) { + return; + } + if (m_suspended) { + m_connectOnResume = true; + return; + } - try { - // resolve the server hostname. do this every time we connect - // in case we couldn't resolve the address earlier or the address - // has changed (which can happen frequently if this is a laptop - // being shuttled between various networks). patch by Brent - // Priddy. - m_serverAddress.resolve(); - - // m_serverAddress will be null if the hostname address is not reolved - if (m_serverAddress.getAddress() != NULL) { - // to help users troubleshoot, show server host name (issue: 60) - LOG((CLOG_NOTE "connecting to '%s': %s:%i", - m_serverAddress.getHostname().c_str(), - ARCH->addrToString(m_serverAddress.getAddress()).c_str(), - m_serverAddress.getPort())); - } + try { + // resolve the server hostname. do this every time we connect + // in case we couldn't resolve the address earlier or the address + // has changed (which can happen frequently if this is a laptop + // being shuttled between various networks). patch by Brent + // Priddy. + m_serverAddress.resolve(); + + // m_serverAddress will be null if the hostname address is not reolved + if (m_serverAddress.getAddress() != NULL) { + // to help users troubleshoot, show server host name (issue: 60) + LOG((CLOG_NOTE "connecting to '%s': %s:%i", + m_serverAddress.getHostname().c_str(), + ARCH->addrToString(m_serverAddress.getAddress()).c_str(), + m_serverAddress.getPort())); + } - // create the socket - IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork); - m_socket = dynamic_cast(socket); + // create the socket + IDataSocket* socket = m_socketFactory->create(m_useSecureNetwork); + m_socket = dynamic_cast(socket); - // filter socket messages, including a packetizing filter - m_stream = socket; - m_stream = new PacketStreamFilter(m_events, m_stream, true); + // filter socket messages, including a packetizing filter + m_stream = socket; + m_stream = new PacketStreamFilter(m_events, m_stream, true); - // connect - LOG((CLOG_DEBUG1 "connecting to server")); - setupConnecting(); - setupTimer(); - socket->connect(m_serverAddress); - } - catch (XBase& e) { - cleanupTimer(); - cleanupConnecting(); - cleanupStream(); - LOG((CLOG_DEBUG1 "connection failed")); - sendConnectionFailedEvent(e.what()); - return; - } + // connect + LOG((CLOG_DEBUG1 "connecting to server")); + setupConnecting(); + setupTimer(); + socket->connect(m_serverAddress); + } + catch (XBase& e) { + cleanupTimer(); + cleanupConnecting(); + cleanupStream(); + LOG((CLOG_DEBUG1 "connection failed")); + sendConnectionFailedEvent(e.what()); + return; + } } void Client::disconnect(const char* msg) { - m_connectOnResume = false; - cleanupTimer(); - cleanupScreen(); - cleanupConnecting(); - cleanupConnection(); - if (msg != NULL) { - sendConnectionFailedEvent(msg); - } - else { - sendEvent(m_events->forClient().disconnected(), NULL); - } + m_connectOnResume = false; + cleanupTimer(); + cleanupScreen(); + cleanupConnecting(); + cleanupConnection(); + if (msg != NULL) { + sendConnectionFailedEvent(msg); + } + else { + sendEvent(m_events->forClient().disconnected(), NULL); + } } void Client::handshakeComplete() { - m_ready = true; - m_screen->enable(); - sendEvent(m_events->forClient().connected(), NULL); + m_ready = true; + m_screen->enable(); + sendEvent(m_events->forClient().connected(), NULL); } bool Client::isConnected() const { - return (m_server != NULL); + return (m_server != NULL); } bool Client::isConnecting() const { - return (m_timer != NULL); + return (m_timer != NULL); } NetworkAddress Client::getServerAddress() const { - return m_serverAddress; + return m_serverAddress; } void* Client::getEventTarget() const { - return m_screen->getEventTarget(); + return m_screen->getEventTarget(); } bool Client::getClipboard(ClipboardID id, IClipboard* clipboard) const { - return m_screen->getClipboard(id, clipboard); + return m_screen->getClipboard(id, clipboard); } void Client::getShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) const { - m_screen->getShape(x, y, w, h); + m_screen->getShape(x, y, w, h); } void Client::getCursorPos(SInt32& x, SInt32& y) const { - m_screen->getCursorPos(x, y); + m_screen->getCursorPos(x, y); } void Client::enter(SInt32 xAbs, SInt32 yAbs, UInt32, KeyModifierMask mask, bool) { - m_active = true; - m_screen->mouseMove(xAbs, yAbs); - m_screen->enter(mask); + m_active = true; + m_screen->mouseMove(xAbs, yAbs); + m_screen->enter(mask); - if (m_sendFileThread != NULL) { - StreamChunker::interruptFile(); - m_sendFileThread = NULL; - } + if (m_sendFileThread != NULL) { + StreamChunker::interruptFile(); + m_sendFileThread = NULL; + } } bool Client::leave() { - m_active = false; + m_active = false; - m_screen->leave(); - - if (m_enableClipboard) { - // send clipboards that we own and that have changed - for (ClipboardID id = 0; id < kClipboardEnd; ++id) { - if (m_ownClipboard[id]) { - sendClipboard(id); - } - } - } + m_screen->leave(); + + if (m_enableClipboard) { + // send clipboards that we own and that have changed + for (ClipboardID id = 0; id < kClipboardEnd; ++id) { + if (m_ownClipboard[id]) { + sendClipboard(id); + } + } + } - return true; + return true; } void Client::setClipboard(ClipboardID id, const IClipboard* clipboard) { - m_screen->setClipboard(id, clipboard); - m_ownClipboard[id] = false; - m_sentClipboard[id] = false; + m_screen->setClipboard(id, clipboard); + m_ownClipboard[id] = false; + m_sentClipboard[id] = false; } void Client::grabClipboard(ClipboardID id) { - m_screen->grabClipboard(id); - m_ownClipboard[id] = false; - m_sentClipboard[id] = false; + m_screen->grabClipboard(id); + m_ownClipboard[id] = false; + m_sentClipboard[id] = false; } void Client::setClipboardDirty(ClipboardID, bool) { - assert(0 && "shouldn't be called"); + assert(0 && "shouldn't be called"); } void Client::keyDown(KeyID id, KeyModifierMask mask, KeyButton button) { - m_screen->keyDown(id, mask, button); + m_screen->keyDown(id, mask, button); } void Client::keyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button) + SInt32 count, KeyButton button) { - m_screen->keyRepeat(id, mask, count, button); + m_screen->keyRepeat(id, mask, count, button); } void Client::keyUp(KeyID id, KeyModifierMask mask, KeyButton button) { - m_screen->keyUp(id, mask, button); + m_screen->keyUp(id, mask, button); } void Client::mouseDown(ButtonID id) { - m_screen->mouseDown(id); + m_screen->mouseDown(id); } void Client::mouseUp(ButtonID id) { - m_screen->mouseUp(id); + m_screen->mouseUp(id); } void Client::mouseMove(SInt32 x, SInt32 y) { - m_screen->mouseMove(x, y); + m_screen->mouseMove(x, y); } void Client::mouseRelativeMove(SInt32 dx, SInt32 dy) { - m_screen->mouseRelativeMove(dx, dy); + m_screen->mouseRelativeMove(dx, dy); } void Client::mouseWheel(SInt32 xDelta, SInt32 yDelta) { - m_screen->mouseWheel(xDelta, yDelta); + m_screen->mouseWheel(xDelta, yDelta); } void Client::screensaver(bool activate) { - m_screen->screensaver(activate); + m_screen->screensaver(activate); } void Client::resetOptions() { - m_screen->resetOptions(); + m_screen->resetOptions(); } void Client::setOptions(const OptionsList& options) { - for (OptionsList::const_iterator index = options.begin(); - index != options.end(); ++index) { - const OptionID id = *index; - if (id == kOptionClipboardSharing) { - index++; - if (*index == static_cast(false)) { - LOG((CLOG_NOTE "clipboard sharing is disabled")); - } - m_enableClipboard = *index; + for (OptionsList::const_iterator index = options.begin(); + index != options.end(); ++index) { + const OptionID id = *index; + if (id == kOptionClipboardSharing) { + index++; + if (*index == static_cast(false)) { + LOG((CLOG_NOTE "clipboard sharing is disabled")); + } + m_enableClipboard = *index; - break; - } - } + break; + } + } - m_screen->setOptions(options); + m_screen->setOptions(options); } String Client::getName() const { - return m_name; + return m_name; } void Client::sendClipboard(ClipboardID id) { - // note -- m_mutex must be locked on entry - assert(m_screen != NULL); - assert(m_server != NULL); + // note -- m_mutex must be locked on entry + assert(m_screen != NULL); + assert(m_server != NULL); - // get clipboard data. set the clipboard time to the last - // clipboard time before getting the data from the screen - // as the screen may detect an unchanged clipboard and - // avoid copying the data. - Clipboard clipboard; - if (clipboard.open(m_timeClipboard[id])) { - clipboard.close(); - } - m_screen->getClipboard(id, &clipboard); + // get clipboard data. set the clipboard time to the last + // clipboard time before getting the data from the screen + // as the screen may detect an unchanged clipboard and + // avoid copying the data. + Clipboard clipboard; + if (clipboard.open(m_timeClipboard[id])) { + clipboard.close(); + } + m_screen->getClipboard(id, &clipboard); - // check time - if (m_timeClipboard[id] == 0 || - clipboard.getTime() != m_timeClipboard[id]) { - // save new time - m_timeClipboard[id] = clipboard.getTime(); + // check time + if (m_timeClipboard[id] == 0 || + clipboard.getTime() != m_timeClipboard[id]) { + // save new time + m_timeClipboard[id] = clipboard.getTime(); - // marshall the data - String data = clipboard.marshall(); + // marshall the data + String data = clipboard.marshall(); - // save and send data if different or not yet sent - if (!m_sentClipboard[id] || data != m_dataClipboard[id]) { - m_sentClipboard[id] = true; - m_dataClipboard[id] = data; - m_server->onClipboardChanged(id, &clipboard); - } - } + // save and send data if different or not yet sent + if (!m_sentClipboard[id] || data != m_dataClipboard[id]) { + m_sentClipboard[id] = true; + m_dataClipboard[id] = data; + m_server->onClipboardChanged(id, &clipboard); + } + } } void Client::sendEvent(Event::Type type, void* data) { - m_events->addEvent(Event(type, getEventTarget(), data)); + m_events->addEvent(Event(type, getEventTarget(), data)); } void Client::sendConnectionFailedEvent(const char* msg) { - FailInfo* info = new FailInfo(msg); - info->m_retry = true; - Event event(m_events->forClient().connectionFailed(), getEventTarget(), info, Event::kDontFreeData); - m_events->addEvent(event); + FailInfo* info = new FailInfo(msg); + info->m_retry = true; + Event event(m_events->forClient().connectionFailed(), getEventTarget(), info, Event::kDontFreeData); + m_events->addEvent(event); } void Client::sendFileChunk(const void* data) { - FileChunk* chunk = static_cast(const_cast(data)); - LOG((CLOG_DEBUG1 "send file chunk")); - assert(m_server != NULL); + FileChunk* chunk = static_cast(const_cast(data)); + LOG((CLOG_DEBUG1 "send file chunk")); + assert(m_server != NULL); - // relay - m_server->fileChunkSending(chunk->m_chunk[0], &chunk->m_chunk[1], chunk->m_dataSize); + // relay + m_server->fileChunkSending(chunk->m_chunk[0], &chunk->m_chunk[1], chunk->m_dataSize); } void Client::setupConnecting() { - assert(m_stream != NULL); + assert(m_stream != NULL); - if (m_args.m_enableCrypto) { - m_events->adoptHandler(m_events->forIDataSocket().secureConnected(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleConnected)); - } - else { - m_events->adoptHandler(m_events->forIDataSocket().connected(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleConnected)); - } + if (m_args.m_enableCrypto) { + m_events->adoptHandler(m_events->forIDataSocket().secureConnected(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleConnected)); + } + else { + m_events->adoptHandler(m_events->forIDataSocket().connected(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleConnected)); + } - m_events->adoptHandler(m_events->forIDataSocket().connectionFailed(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleConnectionFailed)); + m_events->adoptHandler(m_events->forIDataSocket().connectionFailed(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleConnectionFailed)); } void Client::setupConnection() { - assert(m_stream != NULL); + assert(m_stream != NULL); - m_events->adoptHandler(m_events->forISocket().disconnected(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleDisconnected)); - m_events->adoptHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleHello)); - m_events->adoptHandler(m_events->forIStream().outputError(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleOutputError)); - m_events->adoptHandler(m_events->forIStream().inputShutdown(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleDisconnected)); - m_events->adoptHandler(m_events->forIStream().outputShutdown(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &Client::handleDisconnected)); + m_events->adoptHandler(m_events->forISocket().disconnected(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleDisconnected)); + m_events->adoptHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleHello)); + m_events->adoptHandler(m_events->forIStream().outputError(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleOutputError)); + m_events->adoptHandler(m_events->forIStream().inputShutdown(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleDisconnected)); + m_events->adoptHandler(m_events->forIStream().outputShutdown(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleDisconnected)); - m_events->adoptHandler(m_events->forISocket().stopRetry(), - m_stream->getEventTarget(), - new TMethodEventJob(this, &Client::handleStopRetry)); + m_events->adoptHandler(m_events->forISocket().stopRetry(), + m_stream->getEventTarget(), + new TMethodEventJob(this, &Client::handleStopRetry)); } void Client::setupScreen() { - assert(m_server == NULL); + assert(m_server == NULL); - m_ready = false; - m_server = new ServerProxy(this, m_stream, m_events); - m_events->adoptHandler(m_events->forIScreen().shapeChanged(), - getEventTarget(), - new TMethodEventJob(this, - &Client::handleShapeChanged)); - m_events->adoptHandler(m_events->forClipboard().clipboardGrabbed(), - getEventTarget(), - new TMethodEventJob(this, - &Client::handleClipboardGrabbed)); + m_ready = false; + m_server = new ServerProxy(this, m_stream, m_events); + m_events->adoptHandler(m_events->forIScreen().shapeChanged(), + getEventTarget(), + new TMethodEventJob(this, + &Client::handleShapeChanged)); + m_events->adoptHandler(m_events->forClipboard().clipboardGrabbed(), + getEventTarget(), + new TMethodEventJob(this, + &Client::handleClipboardGrabbed)); } void Client::setupTimer() { - assert(m_timer == NULL); + assert(m_timer == NULL); - m_timer = m_events->newOneShotTimer(15.0, NULL); - m_events->adoptHandler(Event::kTimer, m_timer, - new TMethodEventJob(this, - &Client::handleConnectTimeout)); + m_timer = m_events->newOneShotTimer(15.0, NULL); + m_events->adoptHandler(Event::kTimer, m_timer, + new TMethodEventJob(this, + &Client::handleConnectTimeout)); } void Client::cleanupConnecting() { - if (m_stream != NULL) { - m_events->removeHandler(m_events->forIDataSocket().connected(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIDataSocket().connectionFailed(), - m_stream->getEventTarget()); - } + if (m_stream != NULL) { + m_events->removeHandler(m_events->forIDataSocket().connected(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIDataSocket().connectionFailed(), + m_stream->getEventTarget()); + } } void Client::cleanupConnection() { - if (m_stream != NULL) { - m_events->removeHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputError(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().inputShutdown(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputShutdown(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forISocket().disconnected(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forISocket().stopRetry(), - m_stream->getEventTarget()); - cleanupStream(); - } + if (m_stream != NULL) { + m_events->removeHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputError(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().inputShutdown(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputShutdown(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forISocket().disconnected(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forISocket().stopRetry(), + m_stream->getEventTarget()); + cleanupStream(); + } } void Client::cleanupScreen() { - if (m_server != NULL) { - if (m_ready) { - m_screen->disable(); - m_ready = false; - } - m_events->removeHandler(m_events->forIScreen().shapeChanged(), - getEventTarget()); - m_events->removeHandler(m_events->forClipboard().clipboardGrabbed(), - getEventTarget()); - delete m_server; - m_server = NULL; - } + if (m_server != NULL) { + if (m_ready) { + m_screen->disable(); + m_ready = false; + } + m_events->removeHandler(m_events->forIScreen().shapeChanged(), + getEventTarget()); + m_events->removeHandler(m_events->forClipboard().clipboardGrabbed(), + getEventTarget()); + delete m_server; + m_server = NULL; + } } void Client::cleanupTimer() { - if (m_timer != NULL) { - m_events->removeHandler(Event::kTimer, m_timer); - m_events->deleteTimer(m_timer); - m_timer = NULL; - } + if (m_timer != NULL) { + m_events->removeHandler(Event::kTimer, m_timer); + m_events->deleteTimer(m_timer); + m_timer = NULL; + } } void Client::cleanupStream() { - delete m_stream; - m_stream = NULL; + delete m_stream; + m_stream = NULL; } void Client::handleConnected(const Event&, void*) { - LOG((CLOG_DEBUG1 "connected; wait for hello")); - cleanupConnecting(); - setupConnection(); + LOG((CLOG_DEBUG1 "connected; wait for hello")); + cleanupConnecting(); + setupConnection(); - // reset clipboard state - for (ClipboardID id = 0; id < kClipboardEnd; ++id) { - m_ownClipboard[id] = false; - m_sentClipboard[id] = false; - m_timeClipboard[id] = 0; - } + // reset clipboard state + for (ClipboardID id = 0; id < kClipboardEnd; ++id) { + m_ownClipboard[id] = false; + m_sentClipboard[id] = false; + m_timeClipboard[id] = 0; + } } void Client::handleConnectionFailed(const Event& event, void*) { - IDataSocket::ConnectionFailedInfo* info = - static_cast(event.getData()); + IDataSocket::ConnectionFailedInfo* info = + static_cast(event.getData()); - cleanupTimer(); - cleanupConnecting(); - cleanupStream(); - LOG((CLOG_DEBUG1 "connection failed")); - sendConnectionFailedEvent(info->m_what.c_str()); - delete info; + cleanupTimer(); + cleanupConnecting(); + cleanupStream(); + LOG((CLOG_DEBUG1 "connection failed")); + sendConnectionFailedEvent(info->m_what.c_str()); + delete info; } void Client::handleConnectTimeout(const Event&, void*) { - cleanupTimer(); - cleanupConnecting(); - cleanupConnection(); - cleanupStream(); - LOG((CLOG_DEBUG1 "connection timed out")); - sendConnectionFailedEvent("Timed out"); + cleanupTimer(); + cleanupConnecting(); + cleanupConnection(); + cleanupStream(); + LOG((CLOG_DEBUG1 "connection timed out")); + sendConnectionFailedEvent("Timed out"); } void Client::handleOutputError(const Event&, void*) { - cleanupTimer(); - cleanupScreen(); - cleanupConnection(); - LOG((CLOG_WARN "error sending to server")); - sendEvent(m_events->forClient().disconnected(), NULL); + cleanupTimer(); + cleanupScreen(); + cleanupConnection(); + LOG((CLOG_WARN "error sending to server")); + sendEvent(m_events->forClient().disconnected(), NULL); } void Client::handleDisconnected(const Event&, void*) { - cleanupTimer(); - cleanupScreen(); - cleanupConnection(); - LOG((CLOG_DEBUG1 "disconnected")); - sendEvent(m_events->forClient().disconnected(), NULL); + cleanupTimer(); + cleanupScreen(); + cleanupConnection(); + LOG((CLOG_DEBUG1 "disconnected")); + sendEvent(m_events->forClient().disconnected(), NULL); } void Client::handleShapeChanged(const Event&, void*) { - LOG((CLOG_DEBUG "resolution changed")); - m_server->onInfoChanged(); + LOG((CLOG_DEBUG "resolution changed")); + m_server->onInfoChanged(); } void Client::handleClipboardGrabbed(const Event& event, void*) { - if (!m_enableClipboard) { - return; - } + if (!m_enableClipboard) { + return; + } - const IScreen::ClipboardInfo* info = - static_cast(event.getData()); + const IScreen::ClipboardInfo* info = + static_cast(event.getData()); - // grab ownership - m_server->onGrabClipboard(info->m_id); + // grab ownership + m_server->onGrabClipboard(info->m_id); - // we now own the clipboard and it has not been sent to the server - m_ownClipboard[info->m_id] = true; - m_sentClipboard[info->m_id] = false; - m_timeClipboard[info->m_id] = 0; + // we now own the clipboard and it has not been sent to the server + m_ownClipboard[info->m_id] = true; + m_sentClipboard[info->m_id] = false; + m_timeClipboard[info->m_id] = 0; - // if we're not the active screen then send the clipboard now, - // otherwise we'll wait until we leave. - if (!m_active) { - sendClipboard(info->m_id); - } + // if we're not the active screen then send the clipboard now, + // otherwise we'll wait until we leave. + if (!m_active) { + sendClipboard(info->m_id); + } } void Client::handleHello(const Event&, void*) { - SInt16 major, minor; - if (!ProtocolUtil::readf(m_stream, kMsgHello, &major, &minor)) { - sendConnectionFailedEvent("Protocol error from server, check encryption settings"); - cleanupTimer(); - cleanupConnection(); - return; - } + SInt16 major, minor; + if (!ProtocolUtil::readf(m_stream, kMsgHello, &major, &minor)) { + sendConnectionFailedEvent("Protocol error from server, check encryption settings"); + cleanupTimer(); + cleanupConnection(); + return; + } - // check versions - LOG((CLOG_DEBUG1 "got hello version %d.%d", major, minor)); - if (major < kProtocolMajorVersion || - (major == kProtocolMajorVersion && minor < kProtocolMinorVersion)) { - sendConnectionFailedEvent(XIncompatibleClient(major, minor).what()); - cleanupTimer(); - cleanupConnection(); - return; - } + // check versions + LOG((CLOG_DEBUG1 "got hello version %d.%d", major, minor)); + if (major < kProtocolMajorVersion || + (major == kProtocolMajorVersion && minor < kProtocolMinorVersion)) { + sendConnectionFailedEvent(XIncompatibleClient(major, minor).what()); + cleanupTimer(); + cleanupConnection(); + return; + } - // say hello back - LOG((CLOG_DEBUG1 "say hello version %d.%d", kProtocolMajorVersion, kProtocolMinorVersion)); - ProtocolUtil::writef(m_stream, kMsgHelloBack, - kProtocolMajorVersion, - kProtocolMinorVersion, &m_name); + // say hello back + LOG((CLOG_DEBUG1 "say hello version %d.%d", kProtocolMajorVersion, kProtocolMinorVersion)); + ProtocolUtil::writef(m_stream, kMsgHelloBack, + kProtocolMajorVersion, + kProtocolMinorVersion, &m_name); - // now connected but waiting to complete handshake - setupScreen(); - cleanupTimer(); + // now connected but waiting to complete handshake + setupScreen(); + cleanupTimer(); - // make sure we process any remaining messages later. we won't - // receive another event for already pending messages so we fake - // one. - if (m_stream->isReady()) { - m_events->addEvent(Event(m_events->forIStream().inputReady(), - m_stream->getEventTarget())); - } + // make sure we process any remaining messages later. we won't + // receive another event for already pending messages so we fake + // one. + if (m_stream->isReady()) { + m_events->addEvent(Event(m_events->forIStream().inputReady(), + m_stream->getEventTarget())); + } } void Client::handleSuspend(const Event&, void*) { - LOG((CLOG_INFO "suspend")); - m_suspended = true; - bool wasConnected = isConnected(); - disconnect(NULL); - m_connectOnResume = wasConnected; + LOG((CLOG_INFO "suspend")); + m_suspended = true; + bool wasConnected = isConnected(); + disconnect(NULL); + m_connectOnResume = wasConnected; } void Client::handleResume(const Event&, void*) { - LOG((CLOG_INFO "resume")); - m_suspended = false; - if (m_connectOnResume) { - m_connectOnResume = false; - connect(); - } + LOG((CLOG_INFO "resume")); + m_suspended = false; + if (m_connectOnResume) { + m_connectOnResume = false; + connect(); + } } void Client::handleFileChunkSending(const Event& event, void*) { - sendFileChunk(event.getData()); + sendFileChunk(event.getData()); } void Client::handleFileRecieveCompleted(const Event& event, void*) { - onFileRecieveCompleted(); + onFileRecieveCompleted(); } void Client::onFileRecieveCompleted() { - if (isReceivedFileSizeValid()) { - m_writeToDropDirThread = new Thread( - new TMethodJob( - this, &Client::writeToDropDirThread)); - } + if (isReceivedFileSizeValid()) { + m_writeToDropDirThread = new Thread( + new TMethodJob( + this, &Client::writeToDropDirThread)); + } } void Client::handleStopRetry(const Event&, void*) { - m_args.m_restartable = false; + m_args.m_restartable = false; } void Client::writeToDropDirThread(void*) { - LOG((CLOG_DEBUG "starting write to drop dir thread")); + LOG((CLOG_DEBUG "starting write to drop dir thread")); - while (m_screen->isFakeDraggingStarted()) { - ARCH->sleep(.1f); - } - - DropHelper::writeToDir(m_screen->getDropTarget(), m_dragFileList, - m_receivedFileData); + while (m_screen->isFakeDraggingStarted()) { + ARCH->sleep(.1f); + } + + DropHelper::writeToDir(m_screen->getDropTarget(), m_dragFileList, + m_receivedFileData); } void Client::dragInfoReceived(UInt32 fileNum, String data) { - // TODO: fix duplicate function from CServer - if (!m_args.m_enableDragDrop) { - LOG((CLOG_DEBUG "drag drop not enabled, ignoring drag info.")); - return; - } + // TODO: fix duplicate function from CServer + if (!m_args.m_enableDragDrop) { + LOG((CLOG_DEBUG "drag drop not enabled, ignoring drag info.")); + return; + } - DragInformation::parseDragInfo(m_dragFileList, fileNum, data); - - m_screen->startDraggingFiles(m_dragFileList); + DragInformation::parseDragInfo(m_dragFileList, fileNum, data); + + m_screen->startDraggingFiles(m_dragFileList); } bool Client::isReceivedFileSizeValid() { - return m_expectedFileSize == m_receivedFileData.size(); + return m_expectedFileSize == m_receivedFileData.size(); } void Client::sendFileToServer(const char* filename) { - if (m_sendFileThread != NULL) { - StreamChunker::interruptFile(); - } - - m_sendFileThread = new Thread( - new TMethodJob( - this, &Client::sendFileThread, - static_cast(const_cast(filename)))); + if (m_sendFileThread != NULL) { + StreamChunker::interruptFile(); + } + + m_sendFileThread = new Thread( + new TMethodJob( + this, &Client::sendFileThread, + static_cast(const_cast(filename)))); } void Client::sendFileThread(void* filename) { - try { - char* name = static_cast(filename); - StreamChunker::sendFile(name, m_events, this); - } - catch (std::runtime_error error) { - LOG((CLOG_ERR "failed sending file chunks: %s", error.what())); - } + try { + char* name = static_cast(filename); + StreamChunker::sendFile(name, m_events, this); + } + catch (std::runtime_error error) { + LOG((CLOG_ERR "failed sending file chunks: %s", error.what())); + } - m_sendFileThread = NULL; + m_sendFileThread = NULL; } void Client::sendDragInfo(UInt32 fileCount, String& info, size_t size) { - m_server->sendDragInfo(fileCount, info.c_str(), size); + m_server->sendDragInfo(fileCount, info.c_str(), size); } diff --git a/src/lib/client/Client.h b/src/lib/client/Client.h index 22740be0..02b5fa9a 100644 --- a/src/lib/client/Client.h +++ b/src/lib/client/Client.h @@ -44,184 +44,184 @@ This class implements the top-level client algorithms for synergy. */ class Client : public IClient, public INode { public: - class FailInfo { - public: - FailInfo(const char* what) : m_retry(false), m_what(what) { } - bool m_retry; - String m_what; - }; + class FailInfo { + public: + FailInfo(const char* what) : m_retry(false), m_what(what) { } + bool m_retry; + String m_what; + }; public: - /*! - This client will attempt to connect to the server using \p name - as its name and \p address as the server's address and \p factory - to create the socket. \p screen is the local screen. - */ - Client(IEventQueue* events, const String& name, - const NetworkAddress& address, ISocketFactory* socketFactory, - synergy::Screen* screen, ClientArgs const& args); + /*! + This client will attempt to connect to the server using \p name + as its name and \p address as the server's address and \p factory + to create the socket. \p screen is the local screen. + */ + Client(IEventQueue* events, const String& name, + const NetworkAddress& address, ISocketFactory* socketFactory, + synergy::Screen* screen, ClientArgs const& args); - ~Client(); + ~Client(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Connect to server - /*! - Starts an attempt to connect to the server. This is ignored if - the client is trying to connect or is already connected. - */ - void connect(); + //! Connect to server + /*! + Starts an attempt to connect to the server. This is ignored if + the client is trying to connect or is already connected. + */ + void connect(); - //! Disconnect - /*! - Disconnects from the server with an optional error message. - */ - void disconnect(const char* msg); + //! Disconnect + /*! + Disconnects from the server with an optional error message. + */ + void disconnect(const char* msg); - //! Notify of handshake complete - /*! - Notifies the client that the connection handshake has completed. - */ - virtual void handshakeComplete(); + //! Notify of handshake complete + /*! + Notifies the client that the connection handshake has completed. + */ + virtual void handshakeComplete(); - //! Received drag information - void dragInfoReceived(UInt32 fileNum, String data); + //! Received drag information + void dragInfoReceived(UInt32 fileNum, String data); - //! Create a new thread and use it to send file to Server - void sendFileToServer(const char* filename); - - //! Send dragging file information back to server - void sendDragInfo(UInt32 fileCount, String& info, size_t size); + //! Create a new thread and use it to send file to Server + void sendFileToServer(const char* filename); + + //! Send dragging file information back to server + void sendDragInfo(UInt32 fileCount, String& info, size_t size); - - //@} - //! @name accessors - //@{ + + //@} + //! @name accessors + //@{ - //! Test if connected - /*! - Returns true iff the client is successfully connected to the server. - */ - bool isConnected() const; + //! Test if connected + /*! + Returns true iff the client is successfully connected to the server. + */ + bool isConnected() const; - //! Test if connecting - /*! - Returns true iff the client is currently attempting to connect to - the server. - */ - bool isConnecting() const; + //! Test if connecting + /*! + Returns true iff the client is currently attempting to connect to + the server. + */ + bool isConnecting() const; - //! Get address of server - /*! - Returns the address of the server the client is connected (or wants - to connect) to. - */ - NetworkAddress getServerAddress() const; - - //! Return true if recieved file size is valid - bool isReceivedFileSizeValid(); + //! Get address of server + /*! + Returns the address of the server the client is connected (or wants + to connect) to. + */ + NetworkAddress getServerAddress() const; + + //! Return true if recieved file size is valid + bool isReceivedFileSizeValid(); - //! Return expected file size - size_t& getExpectedFileSize() { return m_expectedFileSize; } + //! Return expected file size + size_t& getExpectedFileSize() { return m_expectedFileSize; } - //! Return received file data - String& getReceivedFileData() { return m_receivedFileData; } + //! Return received file data + String& getReceivedFileData() { return m_receivedFileData; } - //! Return drag file list - DragFileList getDragFileList() { return m_dragFileList; } + //! Return drag file list + DragFileList getDragFileList() { return m_dragFileList; } - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IClient overrides - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver); - virtual bool leave(); - virtual void setClipboard(ClipboardID, const IClipboard*); - virtual void grabClipboard(ClipboardID); - virtual void setClipboardDirty(ClipboardID, bool); - virtual void keyDown(KeyID, KeyModifierMask, KeyButton); - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton); - virtual void keyUp(KeyID, KeyModifierMask, KeyButton); - virtual void mouseDown(ButtonID); - virtual void mouseUp(ButtonID); - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual String getName() const; + // IClient overrides + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver); + virtual bool leave(); + virtual void setClipboard(ClipboardID, const IClipboard*); + virtual void grabClipboard(ClipboardID); + virtual void setClipboardDirty(ClipboardID, bool); + virtual void keyDown(KeyID, KeyModifierMask, KeyButton); + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton); + virtual void keyUp(KeyID, KeyModifierMask, KeyButton); + virtual void mouseDown(ButtonID); + virtual void mouseUp(ButtonID); + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual String getName() const; private: - void sendClipboard(ClipboardID); - void sendEvent(Event::Type, void*); - void sendConnectionFailedEvent(const char* msg); - void sendFileChunk(const void* data); - void sendFileThread(void*); - void writeToDropDirThread(void*); - void setupConnecting(); - void setupConnection(); - void setupScreen(); - void setupTimer(); - void cleanupConnecting(); - void cleanupConnection(); - void cleanupScreen(); - void cleanupTimer(); - void cleanupStream(); - void handleConnected(const Event&, void*); - void handleConnectionFailed(const Event&, void*); - void handleConnectTimeout(const Event&, void*); - void handleOutputError(const Event&, void*); - void handleDisconnected(const Event&, void*); - void handleShapeChanged(const Event&, void*); - void handleClipboardGrabbed(const Event&, void*); - void handleHello(const Event&, void*); - void handleSuspend(const Event& event, void*); - void handleResume(const Event& event, void*); - void handleFileChunkSending(const Event&, void*); - void handleFileRecieveCompleted(const Event&, void*); - void handleStopRetry(const Event&, void*); - void onFileRecieveCompleted(); - void sendClipboardThread(void*); + void sendClipboard(ClipboardID); + void sendEvent(Event::Type, void*); + void sendConnectionFailedEvent(const char* msg); + void sendFileChunk(const void* data); + void sendFileThread(void*); + void writeToDropDirThread(void*); + void setupConnecting(); + void setupConnection(); + void setupScreen(); + void setupTimer(); + void cleanupConnecting(); + void cleanupConnection(); + void cleanupScreen(); + void cleanupTimer(); + void cleanupStream(); + void handleConnected(const Event&, void*); + void handleConnectionFailed(const Event&, void*); + void handleConnectTimeout(const Event&, void*); + void handleOutputError(const Event&, void*); + void handleDisconnected(const Event&, void*); + void handleShapeChanged(const Event&, void*); + void handleClipboardGrabbed(const Event&, void*); + void handleHello(const Event&, void*); + void handleSuspend(const Event& event, void*); + void handleResume(const Event& event, void*); + void handleFileChunkSending(const Event&, void*); + void handleFileRecieveCompleted(const Event&, void*); + void handleStopRetry(const Event&, void*); + void onFileRecieveCompleted(); + void sendClipboardThread(void*); public: - bool m_mock; + bool m_mock; private: - String m_name; - NetworkAddress m_serverAddress; - ISocketFactory* m_socketFactory; - synergy::Screen* m_screen; - synergy::IStream* m_stream; - EventQueueTimer* m_timer; - ServerProxy* m_server; - bool m_ready; - bool m_active; - bool m_suspended; - bool m_connectOnResume; - bool m_ownClipboard[kClipboardEnd]; - bool m_sentClipboard[kClipboardEnd]; - IClipboard::Time m_timeClipboard[kClipboardEnd]; - String m_dataClipboard[kClipboardEnd]; - IEventQueue* m_events; - std::size_t m_expectedFileSize; - String m_receivedFileData; - DragFileList m_dragFileList; - String m_dragFileExt; - Thread* m_sendFileThread; - Thread* m_writeToDropDirThread; - TCPSocket* m_socket; - bool m_useSecureNetwork; - ClientArgs m_args; - bool m_enableClipboard; + String m_name; + NetworkAddress m_serverAddress; + ISocketFactory* m_socketFactory; + synergy::Screen* m_screen; + synergy::IStream* m_stream; + EventQueueTimer* m_timer; + ServerProxy* m_server; + bool m_ready; + bool m_active; + bool m_suspended; + bool m_connectOnResume; + bool m_ownClipboard[kClipboardEnd]; + bool m_sentClipboard[kClipboardEnd]; + IClipboard::Time m_timeClipboard[kClipboardEnd]; + String m_dataClipboard[kClipboardEnd]; + IEventQueue* m_events; + std::size_t m_expectedFileSize; + String m_receivedFileData; + DragFileList m_dragFileList; + String m_dragFileExt; + Thread* m_sendFileThread; + Thread* m_writeToDropDirThread; + TCPSocket* m_socket; + bool m_useSecureNetwork; + ClientArgs m_args; + bool m_enableClipboard; }; diff --git a/src/lib/client/ServerProxy.cpp b/src/lib/client/ServerProxy.cpp index bf11dd38..ae5d9fc5 100644 --- a/src/lib/client/ServerProxy.cpp +++ b/src/lib/client/ServerProxy.cpp @@ -39,870 +39,870 @@ // ServerProxy::ServerProxy(Client* client, synergy::IStream* stream, IEventQueue* events) : - m_client(client), - m_stream(stream), - m_seqNum(0), - m_compressMouse(false), - m_compressMouseRelative(false), - m_xMouse(0), - m_yMouse(0), - m_dxMouse(0), - m_dyMouse(0), - m_ignoreMouse(false), - m_keepAliveAlarm(0.0), - m_keepAliveAlarmTimer(NULL), - m_parser(&ServerProxy::parseHandshakeMessage), - m_events(events) + m_client(client), + m_stream(stream), + m_seqNum(0), + m_compressMouse(false), + m_compressMouseRelative(false), + m_xMouse(0), + m_yMouse(0), + m_dxMouse(0), + m_dyMouse(0), + m_ignoreMouse(false), + m_keepAliveAlarm(0.0), + m_keepAliveAlarmTimer(NULL), + m_parser(&ServerProxy::parseHandshakeMessage), + m_events(events) { - assert(m_client != NULL); - assert(m_stream != NULL); + assert(m_client != NULL); + assert(m_stream != NULL); - // initialize modifier translation table - for (KeyModifierID id = 0; id < kKeyModifierIDLast; ++id) - m_modifierTranslationTable[id] = id; + // initialize modifier translation table + for (KeyModifierID id = 0; id < kKeyModifierIDLast; ++id) + m_modifierTranslationTable[id] = id; - // handle data on stream - m_events->adoptHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &ServerProxy::handleData)); + // handle data on stream + m_events->adoptHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &ServerProxy::handleData)); - m_events->adoptHandler(m_events->forClipboard().clipboardSending(), - this, - new TMethodEventJob(this, - &ServerProxy::handleClipboardSendingEvent)); + m_events->adoptHandler(m_events->forClipboard().clipboardSending(), + this, + new TMethodEventJob(this, + &ServerProxy::handleClipboardSendingEvent)); - // send heartbeat - setKeepAliveRate(kKeepAliveRate); + // send heartbeat + setKeepAliveRate(kKeepAliveRate); } ServerProxy::~ServerProxy() { - setKeepAliveRate(-1.0); - m_events->removeHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget()); + setKeepAliveRate(-1.0); + m_events->removeHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget()); } void ServerProxy::resetKeepAliveAlarm() { - if (m_keepAliveAlarmTimer != NULL) { - m_events->removeHandler(Event::kTimer, m_keepAliveAlarmTimer); - m_events->deleteTimer(m_keepAliveAlarmTimer); - m_keepAliveAlarmTimer = NULL; - } - if (m_keepAliveAlarm > 0.0) { - m_keepAliveAlarmTimer = - m_events->newOneShotTimer(m_keepAliveAlarm, NULL); - m_events->adoptHandler(Event::kTimer, m_keepAliveAlarmTimer, - new TMethodEventJob(this, - &ServerProxy::handleKeepAliveAlarm)); - } + if (m_keepAliveAlarmTimer != NULL) { + m_events->removeHandler(Event::kTimer, m_keepAliveAlarmTimer); + m_events->deleteTimer(m_keepAliveAlarmTimer); + m_keepAliveAlarmTimer = NULL; + } + if (m_keepAliveAlarm > 0.0) { + m_keepAliveAlarmTimer = + m_events->newOneShotTimer(m_keepAliveAlarm, NULL); + m_events->adoptHandler(Event::kTimer, m_keepAliveAlarmTimer, + new TMethodEventJob(this, + &ServerProxy::handleKeepAliveAlarm)); + } } void ServerProxy::setKeepAliveRate(double rate) { - m_keepAliveAlarm = rate * kKeepAlivesUntilDeath; - resetKeepAliveAlarm(); + m_keepAliveAlarm = rate * kKeepAlivesUntilDeath; + resetKeepAliveAlarm(); } void ServerProxy::handleData(const Event&, void*) { - // handle messages until there are no more. first read message code. - UInt8 code[4]; - UInt32 n = m_stream->read(code, 4); - while (n != 0) { - // verify we got an entire code - if (n != 4) { - LOG((CLOG_ERR "incomplete message from server: %d bytes", n)); - m_client->disconnect("incomplete message from server"); - return; - } + // handle messages until there are no more. first read message code. + UInt8 code[4]; + UInt32 n = m_stream->read(code, 4); + while (n != 0) { + // verify we got an entire code + if (n != 4) { + LOG((CLOG_ERR "incomplete message from server: %d bytes", n)); + m_client->disconnect("incomplete message from server"); + return; + } - // parse message - LOG((CLOG_DEBUG2 "msg from server: %c%c%c%c", code[0], code[1], code[2], code[3])); - switch ((this->*m_parser)(code)) { - case kOkay: - break; + // parse message + LOG((CLOG_DEBUG2 "msg from server: %c%c%c%c", code[0], code[1], code[2], code[3])); + switch ((this->*m_parser)(code)) { + case kOkay: + break; - case kUnknown: - LOG((CLOG_ERR "invalid message from server: %c%c%c%c", code[0], code[1], code[2], code[3])); - m_client->disconnect("invalid message from server"); - return; + case kUnknown: + LOG((CLOG_ERR "invalid message from server: %c%c%c%c", code[0], code[1], code[2], code[3])); + m_client->disconnect("invalid message from server"); + return; - case kDisconnect: - return; - } + case kDisconnect: + return; + } - // next message - n = m_stream->read(code, 4); - } + // next message + n = m_stream->read(code, 4); + } - flushCompressedMouse(); + flushCompressedMouse(); } ServerProxy::EResult ServerProxy::parseHandshakeMessage(const UInt8* code) { - if (memcmp(code, kMsgQInfo, 4) == 0) { - queryInfo(); - } + if (memcmp(code, kMsgQInfo, 4) == 0) { + queryInfo(); + } - else if (memcmp(code, kMsgCInfoAck, 4) == 0) { - infoAcknowledgment(); - } + else if (memcmp(code, kMsgCInfoAck, 4) == 0) { + infoAcknowledgment(); + } - else if (memcmp(code, kMsgDSetOptions, 4) == 0) { - setOptions(); + else if (memcmp(code, kMsgDSetOptions, 4) == 0) { + setOptions(); - // handshake is complete - m_parser = &ServerProxy::parseMessage; - m_client->handshakeComplete(); - } + // handshake is complete + m_parser = &ServerProxy::parseMessage; + m_client->handshakeComplete(); + } - else if (memcmp(code, kMsgCResetOptions, 4) == 0) { - resetOptions(); - } + else if (memcmp(code, kMsgCResetOptions, 4) == 0) { + resetOptions(); + } - else if (memcmp(code, kMsgCKeepAlive, 4) == 0) { - // echo keep alives and reset alarm - ProtocolUtil::writef(m_stream, kMsgCKeepAlive); - resetKeepAliveAlarm(); - } + else if (memcmp(code, kMsgCKeepAlive, 4) == 0) { + // echo keep alives and reset alarm + ProtocolUtil::writef(m_stream, kMsgCKeepAlive); + resetKeepAliveAlarm(); + } - else if (memcmp(code, kMsgCNoop, 4) == 0) { - // accept and discard no-op - } + else if (memcmp(code, kMsgCNoop, 4) == 0) { + // accept and discard no-op + } - else if (memcmp(code, kMsgCClose, 4) == 0) { - // server wants us to hangup - LOG((CLOG_DEBUG1 "recv close")); - m_client->disconnect(NULL); - return kDisconnect; - } + else if (memcmp(code, kMsgCClose, 4) == 0) { + // server wants us to hangup + LOG((CLOG_DEBUG1 "recv close")); + m_client->disconnect(NULL); + return kDisconnect; + } - else if (memcmp(code, kMsgEIncompatible, 4) == 0) { - SInt32 major, minor; - ProtocolUtil::readf(m_stream, - kMsgEIncompatible + 4, &major, &minor); - LOG((CLOG_ERR "server has incompatible version %d.%d", major, minor)); - m_client->disconnect("server has incompatible version"); - return kDisconnect; - } + else if (memcmp(code, kMsgEIncompatible, 4) == 0) { + SInt32 major, minor; + ProtocolUtil::readf(m_stream, + kMsgEIncompatible + 4, &major, &minor); + LOG((CLOG_ERR "server has incompatible version %d.%d", major, minor)); + m_client->disconnect("server has incompatible version"); + return kDisconnect; + } - else if (memcmp(code, kMsgEBusy, 4) == 0) { - LOG((CLOG_ERR "server already has a connected client with name \"%s\"", m_client->getName().c_str())); - m_client->disconnect("server already has a connected client with our name"); - return kDisconnect; - } + else if (memcmp(code, kMsgEBusy, 4) == 0) { + LOG((CLOG_ERR "server already has a connected client with name \"%s\"", m_client->getName().c_str())); + m_client->disconnect("server already has a connected client with our name"); + return kDisconnect; + } - else if (memcmp(code, kMsgEUnknown, 4) == 0) { - LOG((CLOG_ERR "server refused client with name \"%s\"", m_client->getName().c_str())); - m_client->disconnect("server refused client with our name"); - return kDisconnect; - } + else if (memcmp(code, kMsgEUnknown, 4) == 0) { + LOG((CLOG_ERR "server refused client with name \"%s\"", m_client->getName().c_str())); + m_client->disconnect("server refused client with our name"); + return kDisconnect; + } - else if (memcmp(code, kMsgEBad, 4) == 0) { - LOG((CLOG_ERR "server disconnected due to a protocol error")); - m_client->disconnect("server reported a protocol error"); - return kDisconnect; - } - else { - return kUnknown; - } + else if (memcmp(code, kMsgEBad, 4) == 0) { + LOG((CLOG_ERR "server disconnected due to a protocol error")); + m_client->disconnect("server reported a protocol error"); + return kDisconnect; + } + else { + return kUnknown; + } - return kOkay; + return kOkay; } ServerProxy::EResult ServerProxy::parseMessage(const UInt8* code) { - if (memcmp(code, kMsgDMouseMove, 4) == 0) { - mouseMove(); - } + if (memcmp(code, kMsgDMouseMove, 4) == 0) { + mouseMove(); + } - else if (memcmp(code, kMsgDMouseRelMove, 4) == 0) { - mouseRelativeMove(); - } + else if (memcmp(code, kMsgDMouseRelMove, 4) == 0) { + mouseRelativeMove(); + } - else if (memcmp(code, kMsgDMouseWheel, 4) == 0) { - mouseWheel(); - } + else if (memcmp(code, kMsgDMouseWheel, 4) == 0) { + mouseWheel(); + } - else if (memcmp(code, kMsgDKeyDown, 4) == 0) { - keyDown(); - } + else if (memcmp(code, kMsgDKeyDown, 4) == 0) { + keyDown(); + } - else if (memcmp(code, kMsgDKeyUp, 4) == 0) { - keyUp(); - } + else if (memcmp(code, kMsgDKeyUp, 4) == 0) { + keyUp(); + } - else if (memcmp(code, kMsgDMouseDown, 4) == 0) { - mouseDown(); - } + else if (memcmp(code, kMsgDMouseDown, 4) == 0) { + mouseDown(); + } - else if (memcmp(code, kMsgDMouseUp, 4) == 0) { - mouseUp(); - } + else if (memcmp(code, kMsgDMouseUp, 4) == 0) { + mouseUp(); + } - else if (memcmp(code, kMsgDKeyRepeat, 4) == 0) { - keyRepeat(); - } + else if (memcmp(code, kMsgDKeyRepeat, 4) == 0) { + keyRepeat(); + } - else if (memcmp(code, kMsgCKeepAlive, 4) == 0) { - // echo keep alives and reset alarm - ProtocolUtil::writef(m_stream, kMsgCKeepAlive); - resetKeepAliveAlarm(); - } + else if (memcmp(code, kMsgCKeepAlive, 4) == 0) { + // echo keep alives and reset alarm + ProtocolUtil::writef(m_stream, kMsgCKeepAlive); + resetKeepAliveAlarm(); + } - else if (memcmp(code, kMsgCNoop, 4) == 0) { - // accept and discard no-op - } + else if (memcmp(code, kMsgCNoop, 4) == 0) { + // accept and discard no-op + } - else if (memcmp(code, kMsgCEnter, 4) == 0) { - enter(); - } + else if (memcmp(code, kMsgCEnter, 4) == 0) { + enter(); + } - else if (memcmp(code, kMsgCLeave, 4) == 0) { - leave(); - } + else if (memcmp(code, kMsgCLeave, 4) == 0) { + leave(); + } - else if (memcmp(code, kMsgCClipboard, 4) == 0) { - grabClipboard(); - } + else if (memcmp(code, kMsgCClipboard, 4) == 0) { + grabClipboard(); + } - else if (memcmp(code, kMsgCScreenSaver, 4) == 0) { - screensaver(); - } + else if (memcmp(code, kMsgCScreenSaver, 4) == 0) { + screensaver(); + } - else if (memcmp(code, kMsgQInfo, 4) == 0) { - queryInfo(); - } + else if (memcmp(code, kMsgQInfo, 4) == 0) { + queryInfo(); + } - else if (memcmp(code, kMsgCInfoAck, 4) == 0) { - infoAcknowledgment(); - } + else if (memcmp(code, kMsgCInfoAck, 4) == 0) { + infoAcknowledgment(); + } - else if (memcmp(code, kMsgDClipboard, 4) == 0) { - setClipboard(); - } + else if (memcmp(code, kMsgDClipboard, 4) == 0) { + setClipboard(); + } - else if (memcmp(code, kMsgCResetOptions, 4) == 0) { - resetOptions(); - } + else if (memcmp(code, kMsgCResetOptions, 4) == 0) { + resetOptions(); + } - else if (memcmp(code, kMsgDSetOptions, 4) == 0) { - setOptions(); - } + else if (memcmp(code, kMsgDSetOptions, 4) == 0) { + setOptions(); + } - else if (memcmp(code, kMsgDFileTransfer, 4) == 0) { - fileChunkReceived(); - } - else if (memcmp(code, kMsgDDragInfo, 4) == 0) { - dragInfoReceived(); - } + else if (memcmp(code, kMsgDFileTransfer, 4) == 0) { + fileChunkReceived(); + } + else if (memcmp(code, kMsgDDragInfo, 4) == 0) { + dragInfoReceived(); + } - else if (memcmp(code, kMsgCClose, 4) == 0) { - // server wants us to hangup - LOG((CLOG_DEBUG1 "recv close")); - m_client->disconnect(NULL); - return kDisconnect; - } - else if (memcmp(code, kMsgEBad, 4) == 0) { - LOG((CLOG_ERR "server disconnected due to a protocol error")); - m_client->disconnect("server reported a protocol error"); - return kDisconnect; - } - else { - return kUnknown; - } + else if (memcmp(code, kMsgCClose, 4) == 0) { + // server wants us to hangup + LOG((CLOG_DEBUG1 "recv close")); + m_client->disconnect(NULL); + return kDisconnect; + } + else if (memcmp(code, kMsgEBad, 4) == 0) { + LOG((CLOG_ERR "server disconnected due to a protocol error")); + m_client->disconnect("server reported a protocol error"); + return kDisconnect; + } + else { + return kUnknown; + } - // send a reply. this is intended to work around a delay when - // running a linux server and an OS X (any BSD?) client. the - // client waits to send an ACK (if the system control flag - // net.inet.tcp.delayed_ack is 1) in hopes of piggybacking it - // on a data packet. we provide that packet here. i don't - // know why a delayed ACK should cause the server to wait since - // TCP_NODELAY is enabled. - ProtocolUtil::writef(m_stream, kMsgCNoop); + // send a reply. this is intended to work around a delay when + // running a linux server and an OS X (any BSD?) client. the + // client waits to send an ACK (if the system control flag + // net.inet.tcp.delayed_ack is 1) in hopes of piggybacking it + // on a data packet. we provide that packet here. i don't + // know why a delayed ACK should cause the server to wait since + // TCP_NODELAY is enabled. + ProtocolUtil::writef(m_stream, kMsgCNoop); - return kOkay; + return kOkay; } void ServerProxy::handleKeepAliveAlarm(const Event&, void*) { - LOG((CLOG_NOTE "server is dead")); - m_client->disconnect("server is not responding"); + LOG((CLOG_NOTE "server is dead")); + m_client->disconnect("server is not responding"); } void ServerProxy::onInfoChanged() { - // ignore mouse motion until we receive acknowledgment of our info - // change message. - m_ignoreMouse = true; + // ignore mouse motion until we receive acknowledgment of our info + // change message. + m_ignoreMouse = true; - // send info update - queryInfo(); + // send info update + queryInfo(); } bool ServerProxy::onGrabClipboard(ClipboardID id) { - LOG((CLOG_DEBUG1 "sending clipboard %d changed", id)); - ProtocolUtil::writef(m_stream, kMsgCClipboard, id, m_seqNum); - return true; + LOG((CLOG_DEBUG1 "sending clipboard %d changed", id)); + ProtocolUtil::writef(m_stream, kMsgCClipboard, id, m_seqNum); + return true; } void ServerProxy::onClipboardChanged(ClipboardID id, const IClipboard* clipboard) { - String data = IClipboard::marshall(clipboard); - LOG((CLOG_DEBUG "sending clipboard %d seqnum=%d", id, m_seqNum)); + String data = IClipboard::marshall(clipboard); + LOG((CLOG_DEBUG "sending clipboard %d seqnum=%d", id, m_seqNum)); - StreamChunker::sendClipboard(data, data.size(), id, m_seqNum, m_events, this); + StreamChunker::sendClipboard(data, data.size(), id, m_seqNum, m_events, this); } void ServerProxy::flushCompressedMouse() { - if (m_compressMouse) { - m_compressMouse = false; - m_client->mouseMove(m_xMouse, m_yMouse); - } - if (m_compressMouseRelative) { - m_compressMouseRelative = false; - m_client->mouseRelativeMove(m_dxMouse, m_dyMouse); - m_dxMouse = 0; - m_dyMouse = 0; - } + if (m_compressMouse) { + m_compressMouse = false; + m_client->mouseMove(m_xMouse, m_yMouse); + } + if (m_compressMouseRelative) { + m_compressMouseRelative = false; + m_client->mouseRelativeMove(m_dxMouse, m_dyMouse); + m_dxMouse = 0; + m_dyMouse = 0; + } } void ServerProxy::sendInfo(const ClientInfo& info) { - LOG((CLOG_DEBUG1 "sending info shape=%d,%d %dx%d", info.m_x, info.m_y, info.m_w, info.m_h)); - ProtocolUtil::writef(m_stream, kMsgDInfo, - info.m_x, info.m_y, - info.m_w, info.m_h, 0, - info.m_mx, info.m_my); + LOG((CLOG_DEBUG1 "sending info shape=%d,%d %dx%d", info.m_x, info.m_y, info.m_w, info.m_h)); + ProtocolUtil::writef(m_stream, kMsgDInfo, + info.m_x, info.m_y, + info.m_w, info.m_h, 0, + info.m_mx, info.m_my); } KeyID ServerProxy::translateKey(KeyID id) const { - static const KeyID s_translationTable[kKeyModifierIDLast][2] = { - { kKeyNone, kKeyNone }, - { kKeyShift_L, kKeyShift_R }, - { kKeyControl_L, kKeyControl_R }, - { kKeyAlt_L, kKeyAlt_R }, - { kKeyMeta_L, kKeyMeta_R }, - { kKeySuper_L, kKeySuper_R }, - { kKeyAltGr, kKeyAltGr} - }; + static const KeyID s_translationTable[kKeyModifierIDLast][2] = { + { kKeyNone, kKeyNone }, + { kKeyShift_L, kKeyShift_R }, + { kKeyControl_L, kKeyControl_R }, + { kKeyAlt_L, kKeyAlt_R }, + { kKeyMeta_L, kKeyMeta_R }, + { kKeySuper_L, kKeySuper_R }, + { kKeyAltGr, kKeyAltGr} + }; - KeyModifierID id2 = kKeyModifierIDNull; - UInt32 side = 0; - switch (id) { - case kKeyShift_L: - id2 = kKeyModifierIDShift; - side = 0; - break; + KeyModifierID id2 = kKeyModifierIDNull; + UInt32 side = 0; + switch (id) { + case kKeyShift_L: + id2 = kKeyModifierIDShift; + side = 0; + break; - case kKeyShift_R: - id2 = kKeyModifierIDShift; - side = 1; - break; + case kKeyShift_R: + id2 = kKeyModifierIDShift; + side = 1; + break; - case kKeyControl_L: - id2 = kKeyModifierIDControl; - side = 0; - break; + case kKeyControl_L: + id2 = kKeyModifierIDControl; + side = 0; + break; - case kKeyControl_R: - id2 = kKeyModifierIDControl; - side = 1; - break; + case kKeyControl_R: + id2 = kKeyModifierIDControl; + side = 1; + break; - case kKeyAlt_L: - id2 = kKeyModifierIDAlt; - side = 0; - break; + case kKeyAlt_L: + id2 = kKeyModifierIDAlt; + side = 0; + break; - case kKeyAlt_R: - id2 = kKeyModifierIDAlt; - side = 1; - break; + case kKeyAlt_R: + id2 = kKeyModifierIDAlt; + side = 1; + break; - case kKeyAltGr: - id2 = kKeyModifierIDAltGr; - side = 1; // there is only one alt gr key on the right side - break; + case kKeyAltGr: + id2 = kKeyModifierIDAltGr; + side = 1; // there is only one alt gr key on the right side + break; - case kKeyMeta_L: - id2 = kKeyModifierIDMeta; - side = 0; - break; + case kKeyMeta_L: + id2 = kKeyModifierIDMeta; + side = 0; + break; - case kKeyMeta_R: - id2 = kKeyModifierIDMeta; - side = 1; - break; + case kKeyMeta_R: + id2 = kKeyModifierIDMeta; + side = 1; + break; - case kKeySuper_L: - id2 = kKeyModifierIDSuper; - side = 0; - break; + case kKeySuper_L: + id2 = kKeyModifierIDSuper; + side = 0; + break; - case kKeySuper_R: - id2 = kKeyModifierIDSuper; - side = 1; - break; - } + case kKeySuper_R: + id2 = kKeyModifierIDSuper; + side = 1; + break; + } - if (id2 != kKeyModifierIDNull) { - return s_translationTable[m_modifierTranslationTable[id2]][side]; - } - else { - return id; - } + if (id2 != kKeyModifierIDNull) { + return s_translationTable[m_modifierTranslationTable[id2]][side]; + } + else { + return id; + } } KeyModifierMask ServerProxy::translateModifierMask(KeyModifierMask mask) const { - static const KeyModifierMask s_masks[kKeyModifierIDLast] = { - 0x0000, - KeyModifierShift, - KeyModifierControl, - KeyModifierAlt, - KeyModifierMeta, - KeyModifierSuper, - KeyModifierAltGr - }; + static const KeyModifierMask s_masks[kKeyModifierIDLast] = { + 0x0000, + KeyModifierShift, + KeyModifierControl, + KeyModifierAlt, + KeyModifierMeta, + KeyModifierSuper, + KeyModifierAltGr + }; - KeyModifierMask newMask = mask & ~(KeyModifierShift | - KeyModifierControl | - KeyModifierAlt | - KeyModifierMeta | - KeyModifierSuper | - KeyModifierAltGr ); - if ((mask & KeyModifierShift) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDShift]]; - } - if ((mask & KeyModifierControl) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDControl]]; - } - if ((mask & KeyModifierAlt) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDAlt]]; - } - if ((mask & KeyModifierAltGr) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDAltGr]]; - } - if ((mask & KeyModifierMeta) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDMeta]]; - } - if ((mask & KeyModifierSuper) != 0) { - newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDSuper]]; - } - return newMask; + KeyModifierMask newMask = mask & ~(KeyModifierShift | + KeyModifierControl | + KeyModifierAlt | + KeyModifierMeta | + KeyModifierSuper | + KeyModifierAltGr ); + if ((mask & KeyModifierShift) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDShift]]; + } + if ((mask & KeyModifierControl) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDControl]]; + } + if ((mask & KeyModifierAlt) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDAlt]]; + } + if ((mask & KeyModifierAltGr) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDAltGr]]; + } + if ((mask & KeyModifierMeta) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDMeta]]; + } + if ((mask & KeyModifierSuper) != 0) { + newMask |= s_masks[m_modifierTranslationTable[kKeyModifierIDSuper]]; + } + return newMask; } void ServerProxy::enter() { - // parse - SInt16 x, y; - UInt16 mask; - UInt32 seqNum; - ProtocolUtil::readf(m_stream, kMsgCEnter + 4, &x, &y, &seqNum, &mask); - LOG((CLOG_DEBUG1 "recv enter, %d,%d %d %04x", x, y, seqNum, mask)); + // parse + SInt16 x, y; + UInt16 mask; + UInt32 seqNum; + ProtocolUtil::readf(m_stream, kMsgCEnter + 4, &x, &y, &seqNum, &mask); + LOG((CLOG_DEBUG1 "recv enter, %d,%d %d %04x", x, y, seqNum, mask)); - // discard old compressed mouse motion, if any - m_compressMouse = false; - m_compressMouseRelative = false; - m_dxMouse = 0; - m_dyMouse = 0; - m_seqNum = seqNum; + // discard old compressed mouse motion, if any + m_compressMouse = false; + m_compressMouseRelative = false; + m_dxMouse = 0; + m_dyMouse = 0; + m_seqNum = seqNum; - // forward - m_client->enter(x, y, seqNum, static_cast(mask), false); + // forward + m_client->enter(x, y, seqNum, static_cast(mask), false); } void ServerProxy::leave() { - // parse - LOG((CLOG_DEBUG1 "recv leave")); + // parse + LOG((CLOG_DEBUG1 "recv leave")); - // send last mouse motion - flushCompressedMouse(); + // send last mouse motion + flushCompressedMouse(); - // forward - m_client->leave(); + // forward + m_client->leave(); } void ServerProxy::setClipboard() { - // parse - static String dataCached; - ClipboardID id; - UInt32 seq; - - int r = ClipboardChunk::assemble(m_stream, dataCached, id, seq); + // parse + static String dataCached; + ClipboardID id; + UInt32 seq; + + int r = ClipboardChunk::assemble(m_stream, dataCached, id, seq); - if (r == kStart) { - size_t size = ClipboardChunk::getExpectedSize(); - LOG((CLOG_DEBUG "receiving clipboard %d size=%d", id, size)); - } - else if (r == kFinish) { - LOG((CLOG_DEBUG "received clipboard %d size=%d", id, dataCached.size())); - - // forward - Clipboard clipboard; - clipboard.unmarshall(dataCached, 0); - m_client->setClipboard(id, &clipboard); + if (r == kStart) { + size_t size = ClipboardChunk::getExpectedSize(); + LOG((CLOG_DEBUG "receiving clipboard %d size=%d", id, size)); + } + else if (r == kFinish) { + LOG((CLOG_DEBUG "received clipboard %d size=%d", id, dataCached.size())); + + // forward + Clipboard clipboard; + clipboard.unmarshall(dataCached, 0); + m_client->setClipboard(id, &clipboard); - LOG((CLOG_INFO "clipboard was updated")); - } + LOG((CLOG_INFO "clipboard was updated")); + } } void ServerProxy::grabClipboard() { - // parse - ClipboardID id; - UInt32 seqNum; - ProtocolUtil::readf(m_stream, kMsgCClipboard + 4, &id, &seqNum); - LOG((CLOG_DEBUG "recv grab clipboard %d", id)); + // parse + ClipboardID id; + UInt32 seqNum; + ProtocolUtil::readf(m_stream, kMsgCClipboard + 4, &id, &seqNum); + LOG((CLOG_DEBUG "recv grab clipboard %d", id)); - // validate - if (id >= kClipboardEnd) { - return; - } + // validate + if (id >= kClipboardEnd) { + return; + } - // forward - m_client->grabClipboard(id); + // forward + m_client->grabClipboard(id); } void ServerProxy::keyDown() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - UInt16 id, mask, button; - ProtocolUtil::readf(m_stream, kMsgDKeyDown + 4, &id, &mask, &button); - LOG((CLOG_DEBUG1 "recv key down id=0x%08x, mask=0x%04x, button=0x%04x", id, mask, button)); + // parse + UInt16 id, mask, button; + ProtocolUtil::readf(m_stream, kMsgDKeyDown + 4, &id, &mask, &button); + LOG((CLOG_DEBUG1 "recv key down id=0x%08x, mask=0x%04x, button=0x%04x", id, mask, button)); - // translate - KeyID id2 = translateKey(static_cast(id)); - KeyModifierMask mask2 = translateModifierMask( - static_cast(mask)); - if (id2 != static_cast(id) || - mask2 != static_cast(mask)) - LOG((CLOG_DEBUG1 "key down translated to id=0x%08x, mask=0x%04x", id2, mask2)); + // translate + KeyID id2 = translateKey(static_cast(id)); + KeyModifierMask mask2 = translateModifierMask( + static_cast(mask)); + if (id2 != static_cast(id) || + mask2 != static_cast(mask)) + LOG((CLOG_DEBUG1 "key down translated to id=0x%08x, mask=0x%04x", id2, mask2)); - // forward - m_client->keyDown(id2, mask2, button); + // forward + m_client->keyDown(id2, mask2, button); } void ServerProxy::keyRepeat() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - UInt16 id, mask, count, button; - ProtocolUtil::readf(m_stream, kMsgDKeyRepeat + 4, - &id, &mask, &count, &button); - LOG((CLOG_DEBUG1 "recv key repeat id=0x%08x, mask=0x%04x, count=%d, button=0x%04x", id, mask, count, button)); + // parse + UInt16 id, mask, count, button; + ProtocolUtil::readf(m_stream, kMsgDKeyRepeat + 4, + &id, &mask, &count, &button); + LOG((CLOG_DEBUG1 "recv key repeat id=0x%08x, mask=0x%04x, count=%d, button=0x%04x", id, mask, count, button)); - // translate - KeyID id2 = translateKey(static_cast(id)); - KeyModifierMask mask2 = translateModifierMask( - static_cast(mask)); - if (id2 != static_cast(id) || - mask2 != static_cast(mask)) - LOG((CLOG_DEBUG1 "key repeat translated to id=0x%08x, mask=0x%04x", id2, mask2)); + // translate + KeyID id2 = translateKey(static_cast(id)); + KeyModifierMask mask2 = translateModifierMask( + static_cast(mask)); + if (id2 != static_cast(id) || + mask2 != static_cast(mask)) + LOG((CLOG_DEBUG1 "key repeat translated to id=0x%08x, mask=0x%04x", id2, mask2)); - // forward - m_client->keyRepeat(id2, mask2, count, button); + // forward + m_client->keyRepeat(id2, mask2, count, button); } void ServerProxy::keyUp() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - UInt16 id, mask, button; - ProtocolUtil::readf(m_stream, kMsgDKeyUp + 4, &id, &mask, &button); - LOG((CLOG_DEBUG1 "recv key up id=0x%08x, mask=0x%04x, button=0x%04x", id, mask, button)); + // parse + UInt16 id, mask, button; + ProtocolUtil::readf(m_stream, kMsgDKeyUp + 4, &id, &mask, &button); + LOG((CLOG_DEBUG1 "recv key up id=0x%08x, mask=0x%04x, button=0x%04x", id, mask, button)); - // translate - KeyID id2 = translateKey(static_cast(id)); - KeyModifierMask mask2 = translateModifierMask( - static_cast(mask)); - if (id2 != static_cast(id) || - mask2 != static_cast(mask)) - LOG((CLOG_DEBUG1 "key up translated to id=0x%08x, mask=0x%04x", id2, mask2)); + // translate + KeyID id2 = translateKey(static_cast(id)); + KeyModifierMask mask2 = translateModifierMask( + static_cast(mask)); + if (id2 != static_cast(id) || + mask2 != static_cast(mask)) + LOG((CLOG_DEBUG1 "key up translated to id=0x%08x, mask=0x%04x", id2, mask2)); - // forward - m_client->keyUp(id2, mask2, button); + // forward + m_client->keyUp(id2, mask2, button); } void ServerProxy::mouseDown() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - SInt8 id; - ProtocolUtil::readf(m_stream, kMsgDMouseDown + 4, &id); - LOG((CLOG_DEBUG1 "recv mouse down id=%d", id)); + // parse + SInt8 id; + ProtocolUtil::readf(m_stream, kMsgDMouseDown + 4, &id); + LOG((CLOG_DEBUG1 "recv mouse down id=%d", id)); - // forward - m_client->mouseDown(static_cast(id)); + // forward + m_client->mouseDown(static_cast(id)); } void ServerProxy::mouseUp() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - SInt8 id; - ProtocolUtil::readf(m_stream, kMsgDMouseUp + 4, &id); - LOG((CLOG_DEBUG1 "recv mouse up id=%d", id)); + // parse + SInt8 id; + ProtocolUtil::readf(m_stream, kMsgDMouseUp + 4, &id); + LOG((CLOG_DEBUG1 "recv mouse up id=%d", id)); - // forward - m_client->mouseUp(static_cast(id)); + // forward + m_client->mouseUp(static_cast(id)); } void ServerProxy::mouseMove() { - // parse - bool ignore; - SInt16 x, y; - ProtocolUtil::readf(m_stream, kMsgDMouseMove + 4, &x, &y); + // parse + bool ignore; + SInt16 x, y; + ProtocolUtil::readf(m_stream, kMsgDMouseMove + 4, &x, &y); - // note if we should ignore the move - ignore = m_ignoreMouse; + // note if we should ignore the move + ignore = m_ignoreMouse; - // compress mouse motion events if more input follows - if (!ignore && !m_compressMouse && m_stream->isReady()) { - m_compressMouse = true; - } + // compress mouse motion events if more input follows + if (!ignore && !m_compressMouse && m_stream->isReady()) { + m_compressMouse = true; + } - // if compressing then ignore the motion but record it - if (m_compressMouse) { - m_compressMouseRelative = false; - ignore = true; - m_xMouse = x; - m_yMouse = y; - m_dxMouse = 0; - m_dyMouse = 0; - } - LOG((CLOG_DEBUG2 "recv mouse move %d,%d", x, y)); + // if compressing then ignore the motion but record it + if (m_compressMouse) { + m_compressMouseRelative = false; + ignore = true; + m_xMouse = x; + m_yMouse = y; + m_dxMouse = 0; + m_dyMouse = 0; + } + LOG((CLOG_DEBUG2 "recv mouse move %d,%d", x, y)); - // forward - if (!ignore) { - m_client->mouseMove(x, y); - } + // forward + if (!ignore) { + m_client->mouseMove(x, y); + } } void ServerProxy::mouseRelativeMove() { - // parse - bool ignore; - SInt16 dx, dy; - ProtocolUtil::readf(m_stream, kMsgDMouseRelMove + 4, &dx, &dy); + // parse + bool ignore; + SInt16 dx, dy; + ProtocolUtil::readf(m_stream, kMsgDMouseRelMove + 4, &dx, &dy); - // note if we should ignore the move - ignore = m_ignoreMouse; + // note if we should ignore the move + ignore = m_ignoreMouse; - // compress mouse motion events if more input follows - if (!ignore && !m_compressMouseRelative && m_stream->isReady()) { - m_compressMouseRelative = true; - } + // compress mouse motion events if more input follows + if (!ignore && !m_compressMouseRelative && m_stream->isReady()) { + m_compressMouseRelative = true; + } - // if compressing then ignore the motion but record it - if (m_compressMouseRelative) { - ignore = true; - m_dxMouse += dx; - m_dyMouse += dy; - } - LOG((CLOG_DEBUG2 "recv mouse relative move %d,%d", dx, dy)); + // if compressing then ignore the motion but record it + if (m_compressMouseRelative) { + ignore = true; + m_dxMouse += dx; + m_dyMouse += dy; + } + LOG((CLOG_DEBUG2 "recv mouse relative move %d,%d", dx, dy)); - // forward - if (!ignore) { - m_client->mouseRelativeMove(dx, dy); - } + // forward + if (!ignore) { + m_client->mouseRelativeMove(dx, dy); + } } void ServerProxy::mouseWheel() { - // get mouse up to date - flushCompressedMouse(); + // get mouse up to date + flushCompressedMouse(); - // parse - SInt16 xDelta, yDelta; - ProtocolUtil::readf(m_stream, kMsgDMouseWheel + 4, &xDelta, &yDelta); - LOG((CLOG_DEBUG2 "recv mouse wheel %+d,%+d", xDelta, yDelta)); + // parse + SInt16 xDelta, yDelta; + ProtocolUtil::readf(m_stream, kMsgDMouseWheel + 4, &xDelta, &yDelta); + LOG((CLOG_DEBUG2 "recv mouse wheel %+d,%+d", xDelta, yDelta)); - // forward - m_client->mouseWheel(xDelta, yDelta); + // forward + m_client->mouseWheel(xDelta, yDelta); } void ServerProxy::screensaver() { - // parse - SInt8 on; - ProtocolUtil::readf(m_stream, kMsgCScreenSaver + 4, &on); - LOG((CLOG_DEBUG1 "recv screen saver on=%d", on)); + // parse + SInt8 on; + ProtocolUtil::readf(m_stream, kMsgCScreenSaver + 4, &on); + LOG((CLOG_DEBUG1 "recv screen saver on=%d", on)); - // forward - m_client->screensaver(on != 0); + // forward + m_client->screensaver(on != 0); } void ServerProxy::resetOptions() { - // parse - LOG((CLOG_DEBUG1 "recv reset options")); + // parse + LOG((CLOG_DEBUG1 "recv reset options")); - // forward - m_client->resetOptions(); + // forward + m_client->resetOptions(); - // reset keep alive - setKeepAliveRate(kKeepAliveRate); + // reset keep alive + setKeepAliveRate(kKeepAliveRate); - // reset modifier translation table - for (KeyModifierID id = 0; id < kKeyModifierIDLast; ++id) { - m_modifierTranslationTable[id] = id; - } + // reset modifier translation table + for (KeyModifierID id = 0; id < kKeyModifierIDLast; ++id) { + m_modifierTranslationTable[id] = id; + } } void ServerProxy::setOptions() { - // parse - OptionsList options; - ProtocolUtil::readf(m_stream, kMsgDSetOptions + 4, &options); - LOG((CLOG_DEBUG1 "recv set options size=%d", options.size())); + // parse + OptionsList options; + ProtocolUtil::readf(m_stream, kMsgDSetOptions + 4, &options); + LOG((CLOG_DEBUG1 "recv set options size=%d", options.size())); - // forward - m_client->setOptions(options); + // forward + m_client->setOptions(options); - // update modifier table - for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { - KeyModifierID id = kKeyModifierIDNull; - if (options[i] == kOptionModifierMapForShift) { - id = kKeyModifierIDShift; - } - else if (options[i] == kOptionModifierMapForControl) { - id = kKeyModifierIDControl; - } - else if (options[i] == kOptionModifierMapForAlt) { - id = kKeyModifierIDAlt; - } - else if (options[i] == kOptionModifierMapForAltGr) { - id = kKeyModifierIDAltGr; - } - else if (options[i] == kOptionModifierMapForMeta) { - id = kKeyModifierIDMeta; - } - else if (options[i] == kOptionModifierMapForSuper) { - id = kKeyModifierIDSuper; - } - else if (options[i] == kOptionHeartbeat) { - // update keep alive - setKeepAliveRate(1.0e-3 * static_cast(options[i + 1])); - } + // update modifier table + for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { + KeyModifierID id = kKeyModifierIDNull; + if (options[i] == kOptionModifierMapForShift) { + id = kKeyModifierIDShift; + } + else if (options[i] == kOptionModifierMapForControl) { + id = kKeyModifierIDControl; + } + else if (options[i] == kOptionModifierMapForAlt) { + id = kKeyModifierIDAlt; + } + else if (options[i] == kOptionModifierMapForAltGr) { + id = kKeyModifierIDAltGr; + } + else if (options[i] == kOptionModifierMapForMeta) { + id = kKeyModifierIDMeta; + } + else if (options[i] == kOptionModifierMapForSuper) { + id = kKeyModifierIDSuper; + } + else if (options[i] == kOptionHeartbeat) { + // update keep alive + setKeepAliveRate(1.0e-3 * static_cast(options[i + 1])); + } - if (id != kKeyModifierIDNull) { - m_modifierTranslationTable[id] = - static_cast(options[i + 1]); - LOG((CLOG_DEBUG1 "modifier %d mapped to %d", id, m_modifierTranslationTable[id])); - } - } + if (id != kKeyModifierIDNull) { + m_modifierTranslationTable[id] = + static_cast(options[i + 1]); + LOG((CLOG_DEBUG1 "modifier %d mapped to %d", id, m_modifierTranslationTable[id])); + } + } } void ServerProxy::queryInfo() { - ClientInfo info; - m_client->getShape(info.m_x, info.m_y, info.m_w, info.m_h); - m_client->getCursorPos(info.m_mx, info.m_my); - sendInfo(info); + ClientInfo info; + m_client->getShape(info.m_x, info.m_y, info.m_w, info.m_h); + m_client->getCursorPos(info.m_mx, info.m_my); + sendInfo(info); } void ServerProxy::infoAcknowledgment() { - LOG((CLOG_DEBUG1 "recv info acknowledgment")); - m_ignoreMouse = false; + LOG((CLOG_DEBUG1 "recv info acknowledgment")); + m_ignoreMouse = false; } void ServerProxy::fileChunkReceived() { - int result = FileChunk::assemble( - m_stream, - m_client->getReceivedFileData(), - m_client->getExpectedFileSize()); + int result = FileChunk::assemble( + m_stream, + m_client->getReceivedFileData(), + m_client->getExpectedFileSize()); - if (result == kFinish) { - m_events->addEvent(Event(m_events->forFile().fileRecieveCompleted(), m_client)); - } - else if (result == kStart) { - if (m_client->getDragFileList().size() > 0) { - String filename = m_client->getDragFileList().at(0).getFilename(); - LOG((CLOG_DEBUG "start receiving %s", filename.c_str())); - } - } + if (result == kFinish) { + m_events->addEvent(Event(m_events->forFile().fileRecieveCompleted(), m_client)); + } + else if (result == kStart) { + if (m_client->getDragFileList().size() > 0) { + String filename = m_client->getDragFileList().at(0).getFilename(); + LOG((CLOG_DEBUG "start receiving %s", filename.c_str())); + } + } } void ServerProxy::dragInfoReceived() { - // parse - UInt32 fileNum = 0; - String content; - ProtocolUtil::readf(m_stream, kMsgDDragInfo + 4, &fileNum, &content); + // parse + UInt32 fileNum = 0; + String content; + ProtocolUtil::readf(m_stream, kMsgDDragInfo + 4, &fileNum, &content); - m_client->dragInfoReceived(fileNum, content); + m_client->dragInfoReceived(fileNum, content); } void ServerProxy::handleClipboardSendingEvent(const Event& event, void*) { - ClipboardChunk::send(m_stream, event.getData()); + ClipboardChunk::send(m_stream, event.getData()); } void ServerProxy::fileChunkSending(UInt8 mark, char* data, size_t dataSize) { - FileChunk::send(m_stream, mark, data, dataSize); + FileChunk::send(m_stream, mark, data, dataSize); } void ServerProxy::sendDragInfo(UInt32 fileCount, const char* info, size_t size) { - String data(info, size); - ProtocolUtil::writef(m_stream, kMsgDDragInfo, fileCount, &data); + String data(info, size); + ProtocolUtil::writef(m_stream, kMsgDDragInfo, fileCount, &data); } diff --git a/src/lib/client/ServerProxy.h b/src/lib/client/ServerProxy.h index d90b9735..a9f217a1 100644 --- a/src/lib/client/ServerProxy.h +++ b/src/lib/client/ServerProxy.h @@ -38,96 +38,96 @@ to the server and messages from the server to calls on the client. */ class ServerProxy { public: - /*! - Process messages from the server on \p stream and forward to - \p client. - */ - ServerProxy(Client* client, synergy::IStream* stream, IEventQueue* events); - ~ServerProxy(); + /*! + Process messages from the server on \p stream and forward to + \p client. + */ + ServerProxy(Client* client, synergy::IStream* stream, IEventQueue* events); + ~ServerProxy(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - void onInfoChanged(); - bool onGrabClipboard(ClipboardID); - void onClipboardChanged(ClipboardID, const IClipboard*); + void onInfoChanged(); + bool onGrabClipboard(ClipboardID); + void onClipboardChanged(ClipboardID, const IClipboard*); - //@} + //@} - // sending file chunk to server - void fileChunkSending(UInt8 mark, char* data, size_t dataSize); + // sending file chunk to server + void fileChunkSending(UInt8 mark, char* data, size_t dataSize); - // sending dragging information to server - void sendDragInfo(UInt32 fileCount, const char* info, size_t size); - + // sending dragging information to server + void sendDragInfo(UInt32 fileCount, const char* info, size_t size); + #ifdef TEST_ENV - void handleDataForTest() { handleData(Event(), NULL); } + void handleDataForTest() { handleData(Event(), NULL); } #endif protected: - enum EResult { kOkay, kUnknown, kDisconnect }; - EResult parseHandshakeMessage(const UInt8* code); - EResult parseMessage(const UInt8* code); + enum EResult { kOkay, kUnknown, kDisconnect }; + EResult parseHandshakeMessage(const UInt8* code); + EResult parseMessage(const UInt8* code); private: - // if compressing mouse motion then send the last motion now - void flushCompressedMouse(); + // if compressing mouse motion then send the last motion now + void flushCompressedMouse(); - void sendInfo(const ClientInfo&); + void sendInfo(const ClientInfo&); - void resetKeepAliveAlarm(); - void setKeepAliveRate(double); + void resetKeepAliveAlarm(); + void setKeepAliveRate(double); - // modifier key translation - KeyID translateKey(KeyID) const; - KeyModifierMask translateModifierMask(KeyModifierMask) const; + // modifier key translation + KeyID translateKey(KeyID) const; + KeyModifierMask translateModifierMask(KeyModifierMask) const; - // event handlers - void handleData(const Event&, void*); - void handleKeepAliveAlarm(const Event&, void*); + // event handlers + void handleData(const Event&, void*); + void handleKeepAliveAlarm(const Event&, void*); - // message handlers - void enter(); - void leave(); - void setClipboard(); - void grabClipboard(); - void keyDown(); - void keyRepeat(); - void keyUp(); - void mouseDown(); - void mouseUp(); - void mouseMove(); - void mouseRelativeMove(); - void mouseWheel(); - void screensaver(); - void resetOptions(); - void setOptions(); - void queryInfo(); - void infoAcknowledgment(); - void fileChunkReceived(); - void dragInfoReceived(); - void handleClipboardSendingEvent(const Event&, void*); + // message handlers + void enter(); + void leave(); + void setClipboard(); + void grabClipboard(); + void keyDown(); + void keyRepeat(); + void keyUp(); + void mouseDown(); + void mouseUp(); + void mouseMove(); + void mouseRelativeMove(); + void mouseWheel(); + void screensaver(); + void resetOptions(); + void setOptions(); + void queryInfo(); + void infoAcknowledgment(); + void fileChunkReceived(); + void dragInfoReceived(); + void handleClipboardSendingEvent(const Event&, void*); private: - typedef EResult (ServerProxy::*MessageParser)(const UInt8*); + typedef EResult (ServerProxy::*MessageParser)(const UInt8*); - Client* m_client; - synergy::IStream* m_stream; + Client* m_client; + synergy::IStream* m_stream; - UInt32 m_seqNum; + UInt32 m_seqNum; - bool m_compressMouse; - bool m_compressMouseRelative; - SInt32 m_xMouse, m_yMouse; - SInt32 m_dxMouse, m_dyMouse; + bool m_compressMouse; + bool m_compressMouseRelative; + SInt32 m_xMouse, m_yMouse; + SInt32 m_dxMouse, m_dyMouse; - bool m_ignoreMouse; + bool m_ignoreMouse; - KeyModifierID m_modifierTranslationTable[kKeyModifierIDLast]; + KeyModifierID m_modifierTranslationTable[kKeyModifierIDLast]; - double m_keepAliveAlarm; - EventQueueTimer* m_keepAliveAlarmTimer; + double m_keepAliveAlarm; + EventQueueTimer* m_keepAliveAlarmTimer; - MessageParser m_parser; - IEventQueue* m_events; + MessageParser m_parser; + IEventQueue* m_events; }; diff --git a/src/lib/common/CMakeLists.txt b/src/lib/common/CMakeLists.txt index eed06727..9e593747 100644 --- a/src/lib/common/CMakeLists.txt +++ b/src/lib/common/CMakeLists.txt @@ -18,17 +18,17 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(common STATIC ${sources}) diff --git a/src/lib/common/IInterface.h b/src/lib/common/IInterface.h index 89cd58ad..606c21f1 100644 --- a/src/lib/common/IInterface.h +++ b/src/lib/common/IInterface.h @@ -27,6 +27,6 @@ only pure virtual methods. */ class IInterface { public: - //! Interface destructor does nothing - virtual ~IInterface() { } + //! Interface destructor does nothing + virtual ~IInterface() { } }; diff --git a/src/lib/common/basic_types.h b/src/lib/common/basic_types.h index 7e9437e2..38c03998 100644 --- a/src/lib/common/basic_types.h +++ b/src/lib/common/basic_types.h @@ -25,40 +25,40 @@ // #if !defined(TYPE_OF_SIZE_1) -# if SIZEOF_CHAR == 1 -# define TYPE_OF_SIZE_1 char -# endif +# if SIZEOF_CHAR == 1 +# define TYPE_OF_SIZE_1 char +# endif #endif #if !defined(TYPE_OF_SIZE_2) -# if SIZEOF_INT == 2 -# define TYPE_OF_SIZE_2 int -# else -# define TYPE_OF_SIZE_2 short -# endif +# if SIZEOF_INT == 2 +# define TYPE_OF_SIZE_2 int +# else +# define TYPE_OF_SIZE_2 short +# endif #endif #if !defined(TYPE_OF_SIZE_4) - // Carbon defines SInt32 and UInt32 in terms of long -# if SIZEOF_INT == 4 && !defined(__APPLE__) -# define TYPE_OF_SIZE_4 int -# else -# define TYPE_OF_SIZE_4 long -# endif + // Carbon defines SInt32 and UInt32 in terms of long +# if SIZEOF_INT == 4 && !defined(__APPLE__) +# define TYPE_OF_SIZE_4 int +# else +# define TYPE_OF_SIZE_4 long +# endif #endif - // + // // verify existence of required types // #if !defined(TYPE_OF_SIZE_1) -# error No 1 byte integer type +# error No 1 byte integer type #endif #if !defined(TYPE_OF_SIZE_2) -# error No 2 byte integer type +# error No 2 byte integer type #endif #if !defined(TYPE_OF_SIZE_4) -# error No 4 byte integer type +# error No 4 byte integer type #endif @@ -75,12 +75,12 @@ #if defined(__APPLE__) #include #else -typedef signed TYPE_OF_SIZE_1 SInt8; -typedef signed TYPE_OF_SIZE_2 SInt16; -typedef signed TYPE_OF_SIZE_4 SInt32; -typedef unsigned TYPE_OF_SIZE_1 UInt8; -typedef unsigned TYPE_OF_SIZE_2 UInt16; -typedef unsigned TYPE_OF_SIZE_4 UInt32; +typedef signed TYPE_OF_SIZE_1 SInt8; +typedef signed TYPE_OF_SIZE_2 SInt16; +typedef signed TYPE_OF_SIZE_4 SInt32; +typedef unsigned TYPE_OF_SIZE_1 UInt8; +typedef unsigned TYPE_OF_SIZE_2 UInt16; +typedef unsigned TYPE_OF_SIZE_4 UInt32; #endif #endif // diff --git a/src/lib/common/common.h b/src/lib/common/common.h index 6e870951..7237eeb6 100644 --- a/src/lib/common/common.h +++ b/src/lib/common/common.h @@ -21,108 +21,108 @@ // this file should be included, directly or indirectly by every other. #if HAVE_CONFIG_H -# include "config.h" +# include "config.h" - // don't use poll() on mac -# if defined(__APPLE__) -# undef HAVE_POLL -# endif + // don't use poll() on mac +# if defined(__APPLE__) +# undef HAVE_POLL +# endif #else - // we may not have run configure on win32 -# if defined(_WIN32) -# define SYSAPI_WIN32 1 -# define WINAPI_MSWINDOWS 1 -# endif + // we may not have run configure on win32 +# if defined(_WIN32) +# define SYSAPI_WIN32 1 +# define WINAPI_MSWINDOWS 1 +# endif - // we may not have run configure on OS X -# if defined(__APPLE__) -# define SYSAPI_UNIX 1 -# define WINAPI_CARBON 1 + // we may not have run configure on OS X +# if defined(__APPLE__) +# define SYSAPI_UNIX 1 +# define WINAPI_CARBON 1 -# define HAVE_CXX_BOOL 1 -# define HAVE_CXX_CASTS 1 -# define HAVE_CXX_EXCEPTIONS 1 -# define HAVE_CXX_MUTABLE 1 -# define HAVE_CXX_STDLIB 1 -# define HAVE_GETPWUID_R 1 -# define HAVE_GMTIME_R 1 -# define HAVE_INET_ATON 1 -# define HAVE_INTTYPES_H 1 -# define HAVE_ISTREAM 1 -# define HAVE_MEMORY_H 1 -# define HAVE_NANOSLEEP 1 -# define HAVE_OSTREAM 1 -# define HAVE_POSIX_SIGWAIT 1 -# define HAVE_PTHREAD 1 -# define HAVE_PTHREAD_SIGNAL 1 -# include -# include -# if defined(_SOCKLEN_T) -# define HAVE_SOCKLEN_T 1 -# endif -# define HAVE_SSTREAM 1 -# define HAVE_STDINT_H 1 -# define HAVE_STDLIB_H 1 -# define HAVE_STRINGS_H 1 -# define HAVE_STRING_H 1 -# define HAVE_SYS_SELECT_H 1 -# define HAVE_SYS_SOCKET_H 1 -# define HAVE_SYS_STAT_H 1 -# define HAVE_SYS_TIME_H 1 -# define HAVE_SYS_TYPES_H 1 -# define HAVE_SYS_UTSNAME_H 1 -# define HAVE_UNISTD_H 1 -# define HAVE_VSNPRINTF 1 +# define HAVE_CXX_BOOL 1 +# define HAVE_CXX_CASTS 1 +# define HAVE_CXX_EXCEPTIONS 1 +# define HAVE_CXX_MUTABLE 1 +# define HAVE_CXX_STDLIB 1 +# define HAVE_GETPWUID_R 1 +# define HAVE_GMTIME_R 1 +# define HAVE_INET_ATON 1 +# define HAVE_INTTYPES_H 1 +# define HAVE_ISTREAM 1 +# define HAVE_MEMORY_H 1 +# define HAVE_NANOSLEEP 1 +# define HAVE_OSTREAM 1 +# define HAVE_POSIX_SIGWAIT 1 +# define HAVE_PTHREAD 1 +# define HAVE_PTHREAD_SIGNAL 1 +# include +# include +# if defined(_SOCKLEN_T) +# define HAVE_SOCKLEN_T 1 +# endif +# define HAVE_SSTREAM 1 +# define HAVE_STDINT_H 1 +# define HAVE_STDLIB_H 1 +# define HAVE_STRINGS_H 1 +# define HAVE_STRING_H 1 +# define HAVE_SYS_SELECT_H 1 +# define HAVE_SYS_SOCKET_H 1 +# define HAVE_SYS_STAT_H 1 +# define HAVE_SYS_TIME_H 1 +# define HAVE_SYS_TYPES_H 1 +# define HAVE_SYS_UTSNAME_H 1 +# define HAVE_UNISTD_H 1 +# define HAVE_VSNPRINTF 1 /* disable this so we can build with the 10.2.8 SDK */ -/*# define HAVE_WCHAR_H 1*/ +/*# define HAVE_WCHAR_H 1*/ -# define SELECT_TYPE_ARG1 int -# define SELECT_TYPE_ARG234 (fd_set *) -# define SELECT_TYPE_ARG5 (struct timeval *) -# define SIZEOF_CHAR 1 -# define SIZEOF_INT 4 -# define SIZEOF_LONG 4 -# define SIZEOF_SHORT 2 -# define STDC_HEADERS 1 -# define TIME_WITH_SYS_TIME 1 -# define X_DISPLAY_MISSING 1 -# endif +# define SELECT_TYPE_ARG1 int +# define SELECT_TYPE_ARG234 (fd_set *) +# define SELECT_TYPE_ARG5 (struct timeval *) +# define SIZEOF_CHAR 1 +# define SIZEOF_INT 4 +# define SIZEOF_LONG 4 +# define SIZEOF_SHORT 2 +# define STDC_HEADERS 1 +# define TIME_WITH_SYS_TIME 1 +# define X_DISPLAY_MISSING 1 +# endif #endif // VC++ specific #if (_MSC_VER >= 1200) - // work around for statement scoping bug -# define for if (false) { } else for + // work around for statement scoping bug +# define for if (false) { } else for - // turn off bonehead warnings -# pragma warning(disable: 4786) // identifier truncated in debug info -# pragma warning(disable: 4514) // unreferenced inline function removed + // turn off bonehead warnings +# pragma warning(disable: 4786) // identifier truncated in debug info +# pragma warning(disable: 4514) // unreferenced inline function removed - // this one's a little too aggressive -# pragma warning(disable: 4127) // conditional expression is constant + // this one's a little too aggressive +# pragma warning(disable: 4127) // conditional expression is constant - // Code Analysis -# pragma warning(disable: 6011) + // Code Analysis +# pragma warning(disable: 6011) - // emitted incorrectly under release build in some circumstances -# if defined(NDEBUG) -# pragma warning(disable: 4702) // unreachable code -# pragma warning(disable: 4701) // variable maybe used uninitialized -# endif + // emitted incorrectly under release build in some circumstances +# if defined(NDEBUG) +# pragma warning(disable: 4702) // unreachable code +# pragma warning(disable: 4701) // variable maybe used uninitialized +# endif #endif // (_MSC_VER >= 1200) // VC++ has built-in sized types #if defined(_MSC_VER) -# include -# define TYPE_OF_SIZE_1 __int8 -# define TYPE_OF_SIZE_2 __int16 -# define TYPE_OF_SIZE_4 __int32 +# include +# define TYPE_OF_SIZE_1 __int8 +# define TYPE_OF_SIZE_2 __int16 +# define TYPE_OF_SIZE_4 __int32 #else -# define SIZE_OF_CHAR 1 -# define SIZE_OF_SHORT 2 -# define SIZE_OF_INT 4 -# define SIZE_OF_LONG 4 +# define SIZE_OF_CHAR 1 +# define SIZE_OF_SHORT 2 +# define SIZE_OF_INT 4 +# define SIZE_OF_LONG 4 #endif // FIXME -- including fp.h from Carbon.h causes a undefined symbol error @@ -130,7 +130,7 @@ // math functions we define __FP__, the include guard macro for fp.h, to // prevent fp.h from being included. #if defined(__APPLE__) -# define __FP__ +# define __FP__ #endif // define NULL @@ -138,7 +138,7 @@ // if not c++0x, future proof code by allowing use of nullptr #ifndef nullptr -# define nullptr NULL +# define nullptr NULL #endif // make assert available since we use it a lot @@ -147,10 +147,10 @@ #include enum { - kExitSuccess = 0, // successful completion - kExitFailed = 1, // general failure - kExitTerminated = 2, // killed by signal - kExitArgs = 3, // bad arguments - kExitConfig = 4, // cannot read configuration - kExitSubscription = 5 // subscription error + kExitSuccess = 0, // successful completion + kExitFailed = 1, // general failure + kExitTerminated = 2, // killed by signal + kExitArgs = 3, // bad arguments + kExitConfig = 4, // cannot read configuration + kExitSubscription = 5 // subscription error }; diff --git a/src/lib/common/stdexcept.h b/src/lib/common/stdexcept.h index 518d4676..5be8049d 100644 --- a/src/lib/common/stdexcept.h +++ b/src/lib/common/stdexcept.h @@ -19,5 +19,5 @@ // apple declares _NOEXCEPT #ifndef _NOEXCEPT -# define _NOEXCEPT throw() +# define _NOEXCEPT throw() #endif diff --git a/src/lib/common/stdpre.h b/src/lib/common/stdpre.h index fff089b9..3a028b60 100644 --- a/src/lib/common/stdpre.h +++ b/src/lib/common/stdpre.h @@ -17,15 +17,15 @@ */ #if defined(_MSC_VER) -#pragma warning(disable: 4786) // identifier truncated -#pragma warning(disable: 4514) // unreferenced inline -#pragma warning(disable: 4710) // not inlined -#pragma warning(disable: 4663) // C++ change, template specialization -#pragma warning(disable: 4503) // decorated name length too long +#pragma warning(disable: 4786) // identifier truncated +#pragma warning(disable: 4514) // unreferenced inline +#pragma warning(disable: 4710) // not inlined +#pragma warning(disable: 4663) // C++ change, template specialization +#pragma warning(disable: 4503) // decorated name length too long #pragma warning(push, 3) -#pragma warning(disable: 4018) // signed/unsigned mismatch +#pragma warning(disable: 4018) // signed/unsigned mismatch #pragma warning(disable: 4284) -#pragma warning(disable: 4146) // unary minus on unsigned value -#pragma warning(disable: 4127) // conditional expression is constant -#pragma warning(disable: 4701) // variable possibly used uninitialized +#pragma warning(disable: 4146) // unary minus on unsigned value +#pragma warning(disable: 4127) // conditional expression is constant +#pragma warning(disable: 4701) // variable possibly used uninitialized #endif diff --git a/src/lib/common/stdsstream.h b/src/lib/common/stdsstream.h index 7f17bed8..8011ba98 100644 --- a/src/lib/common/stdsstream.h +++ b/src/lib/common/stdsstream.h @@ -63,15 +63,15 @@ namespace std class stringbuf : public streambuf { public: - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; explicit stringbuf(int which=ios::in|ios::out) : streambuf(), mode(static_cast(which)), - stream(NULL), stream_len(0) + stream(NULL), stream_len(0) { stringbuf_init(); } @@ -79,14 +79,14 @@ namespace std explicit stringbuf(const string &str, int which=ios::in|ios::out) : streambuf(), mode(static_cast(which)), - stream(NULL), stream_len(0) + stream(NULL), stream_len(0) { if (mode & (ios::in|ios::out)) - { - stream_len = str.size(); - stream = new char_type[stream_len]; - str.copy(stream, stream_len); - } + { + stream_len = str.size(); + stream = new char_type[stream_len]; + str.copy(stream, stream_len); + } stringbuf_init(); } @@ -100,9 +100,9 @@ namespace std str() const { if (pbase() != 0) - return string(stream, pptr()-pbase()); + return string(stream, pptr()-pbase()); else - return string(); + return string(); } void @@ -128,24 +128,24 @@ namespace std { int res; if (mode & ios::out) - { - if (c != EOF) - { - streamsize old_stream_len = stream_len; - stream_len += 1; - char_type* new_stream = new char_type[stream_len]; - memcpy(new_stream, stream, old_stream_len); - delete[] stream; - stream = new_stream; - stringbuf_sync(gptr()-eback(), pptr()-pbase()); - sputc(c); - res = c; - } - else - res = EOF; - } + { + if (c != EOF) + { + streamsize old_stream_len = stream_len; + stream_len += 1; + char_type* new_stream = new char_type[stream_len]; + memcpy(new_stream, stream, old_stream_len); + delete[] stream; + stream = new_stream; + stringbuf_sync(gptr()-eback(), pptr()-pbase()); + sputc(c); + res = c; + } else - res = 0; + res = EOF; + } + else + res = 0; return res; } @@ -153,13 +153,13 @@ namespace std setbuf(char_type* s, streamsize n) { if (n != 0) - { - delete[] stream; - stream = new char_type[n]; - memcpy(stream, s, n); - stream_len = n; - stringbuf_sync(0, 0); - } + { + delete[] stream; + stream = new char_type[n]; + memcpy(stream, s, n); + stream_len = n; + stringbuf_sync(0, 0); + } return this; } @@ -172,50 +172,50 @@ namespace std bool testboth = testin && testout && way != ios::cur; if (stream_len && ((testin != testout) || testboth)) - { - char_type* beg = stream; - char_type* curi = NULL; - char_type* curo = NULL; - char_type* endi = NULL; - char_type* endo = NULL; + { + char_type* beg = stream; + char_type* curi = NULL; + char_type* curo = NULL; + char_type* endi = NULL; + char_type* endo = NULL; - if (testin) - { - curi = gptr(); - endi = egptr(); - } - if (testout) - { - curo = pptr(); - endo = epptr(); - } + if (testin) + { + curi = gptr(); + endi = egptr(); + } + if (testout) + { + curo = pptr(); + endo = epptr(); + } - off_type newoffi = 0; - off_type newoffo = 0; - if (way == ios::beg) - { - newoffi = beg - curi; - newoffo = beg - curo; - } - else if (way == ios::end) - { - newoffi = endi - curi; - newoffo = endo - curo; - } + off_type newoffi = 0; + off_type newoffo = 0; + if (way == ios::beg) + { + newoffi = beg - curi; + newoffo = beg - curo; + } + else if (way == ios::end) + { + newoffi = endi - curi; + newoffo = endo - curo; + } - if (testin && newoffi + off + curi - beg >= 0 && - endi - beg >= newoffi + off + curi - beg) - { - gbump(newoffi + off); - ret = pos_type(newoffi + off + curi); - } - if (testout && newoffo + off + curo - beg >= 0 && - endo - beg >= newoffo + off + curo - beg) - { - pbump(newoffo + off); - ret = pos_type(newoffo + off + curo); - } - } + if (testin && newoffi + off + curi - beg >= 0 && + endi - beg >= newoffi + off + curi - beg) + { + gbump(newoffi + off); + ret = pos_type(newoffi + off + curi); + } + if (testout && newoffo + off + curo - beg >= 0 && + endo - beg >= newoffo + off + curo - beg) + { + pbump(newoffo + off); + ret = pos_type(newoffo + off + curo); + } + } return ret; } @@ -231,34 +231,34 @@ namespace std stringbuf_sync(streamsize i, streamsize o) { if (mode & ios::in) - setg(stream, stream + i, stream + stream_len); + setg(stream, stream + i, stream + stream_len); if (mode & ios::out) - { - setp(stream, stream + stream_len); - pbump(o); - } + { + setp(stream, stream + stream_len); + pbump(o); + } } void stringbuf_init() { if (mode & ios::ate) - stringbuf_sync(0, stream_len); + stringbuf_sync(0, stream_len); else - stringbuf_sync(0, 0); + stringbuf_sync(0, 0); } private: - ios::open_mode mode; - char_type* stream; - streamsize stream_len; + ios::open_mode mode; + char_type* stream; + streamsize stream_len; }; class istringstream : public istream { public: - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; explicit istringstream(int which=ios::in) @@ -292,10 +292,10 @@ namespace std class ostringstream : public ostream { public: - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; explicit ostringstream(int which=ios::out) @@ -329,10 +329,10 @@ namespace std class stringstream : public iostream { public: - typedef char char_type; - typedef int int_type; - typedef streampos pos_type; - typedef streamoff off_type; + typedef char char_type; + typedef int int_type; + typedef streampos pos_type; + typedef streamoff off_type; explicit stringstream(int which=ios::out|ios::in) diff --git a/src/lib/io/CMakeLists.txt b/src/lib/io/CMakeLists.txt index acee7356..bcd87c5a 100644 --- a/src/lib/io/CMakeLists.txt +++ b/src/lib/io/CMakeLists.txt @@ -18,17 +18,17 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(io STATIC ${sources}) diff --git a/src/lib/io/IStream.h b/src/lib/io/IStream.h index 3ebd04e4..905004a6 100644 --- a/src/lib/io/IStream.h +++ b/src/lib/io/IStream.h @@ -33,88 +33,88 @@ Defines the interface for all streams. */ class IStream : public IInterface { public: - IStream() { } + IStream() { } - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Close the stream - /*! - Closes the stream. Pending input data and buffered output data - are discarded. Use \c flush() before \c close() to send buffered - output data. Attempts to \c read() after a close return 0, - attempts to \c write() generate output error events, and attempts - to \c flush() return immediately. - */ - virtual void close() = 0; + //! Close the stream + /*! + Closes the stream. Pending input data and buffered output data + are discarded. Use \c flush() before \c close() to send buffered + output data. Attempts to \c read() after a close return 0, + attempts to \c write() generate output error events, and attempts + to \c flush() return immediately. + */ + virtual void close() = 0; - //! Read from stream - /*! - Read up to \p n bytes into \p buffer, returning the number read - (zero if no data is available or input is shutdown). \p buffer - may be NULL in which case the data is discarded. - */ - virtual UInt32 read(void* buffer, UInt32 n) = 0; + //! Read from stream + /*! + Read up to \p n bytes into \p buffer, returning the number read + (zero if no data is available or input is shutdown). \p buffer + may be NULL in which case the data is discarded. + */ + virtual UInt32 read(void* buffer, UInt32 n) = 0; - //! Write to stream - /*! - Write \c n bytes from \c buffer to the stream. If this can't - complete immediately it will block. Data may be buffered in - order to return more quickly. A output error event is generated - when writing fails. - */ - virtual void write(const void* buffer, UInt32 n) = 0; + //! Write to stream + /*! + Write \c n bytes from \c buffer to the stream. If this can't + complete immediately it will block. Data may be buffered in + order to return more quickly. A output error event is generated + when writing fails. + */ + virtual void write(const void* buffer, UInt32 n) = 0; - //! Flush the stream - /*! - Waits until all buffered data has been written to the stream. - */ - virtual void flush() = 0; + //! Flush the stream + /*! + Waits until all buffered data has been written to the stream. + */ + virtual void flush() = 0; - //! Shutdown input - /*! - Shutdown the input side of the stream. Any pending input data is - discarded and further reads immediately return 0. - */ - virtual void shutdownInput() = 0; + //! Shutdown input + /*! + Shutdown the input side of the stream. Any pending input data is + discarded and further reads immediately return 0. + */ + virtual void shutdownInput() = 0; - //! Shutdown output - /*! - Shutdown the output side of the stream. Any buffered output data - is discarded and further writes generate output error events. Use - \c flush() before \c shutdownOutput() to send buffered output data. - */ - virtual void shutdownOutput() = 0; + //! Shutdown output + /*! + Shutdown the output side of the stream. Any buffered output data + is discarded and further writes generate output error events. Use + \c flush() before \c shutdownOutput() to send buffered output data. + */ + virtual void shutdownOutput() = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get event target - /*! - Returns the event target for events generated by this stream. It - should be the source stream in a chain of stream filters. - */ - virtual void* getEventTarget() const = 0; + //! Get event target + /*! + Returns the event target for events generated by this stream. It + should be the source stream in a chain of stream filters. + */ + virtual void* getEventTarget() const = 0; - //! Test if \c read() will succeed - /*! - Returns true iff an immediate \c read() will return data. This - may or may not be the same as \c getSize() > 0, depending on the - stream type. - */ - virtual bool isReady() const = 0; + //! Test if \c read() will succeed + /*! + Returns true iff an immediate \c read() will return data. This + may or may not be the same as \c getSize() > 0, depending on the + stream type. + */ + virtual bool isReady() const = 0; - //! Get bytes available to read - /*! - Returns a conservative estimate of the available bytes to read - (i.e. a number not greater than the actual number of bytes). - Some streams may not be able to determine this and will always - return zero. - */ - virtual UInt32 getSize() const = 0; + //! Get bytes available to read + /*! + Returns a conservative estimate of the available bytes to read + (i.e. a number not greater than the actual number of bytes). + Some streams may not be able to determine this and will always + return zero. + */ + virtual UInt32 getSize() const = 0; - //@} + //@} }; } diff --git a/src/lib/io/StreamBuffer.cpp b/src/lib/io/StreamBuffer.cpp index 80903ada..f8b3b010 100644 --- a/src/lib/io/StreamBuffer.cpp +++ b/src/lib/io/StreamBuffer.cpp @@ -22,125 +22,125 @@ // StreamBuffer // -const UInt32 StreamBuffer::kChunkSize = 4096; +const UInt32 StreamBuffer::kChunkSize = 4096; StreamBuffer::StreamBuffer() : - m_size(0), - m_headUsed(0) + m_size(0), + m_headUsed(0) { - // do nothing + // do nothing } StreamBuffer::~StreamBuffer() { - // do nothing + // do nothing } const void* StreamBuffer::peek(UInt32 n) { - assert(n <= m_size); + assert(n <= m_size); - // if requesting no data then return NULL so we don't try to access - // an empty list. - if (n == 0) { - return NULL; - } + // if requesting no data then return NULL so we don't try to access + // an empty list. + if (n == 0) { + return NULL; + } - // reserve space in first chunk - ChunkList::iterator head = m_chunks.begin(); - head->reserve(n + m_headUsed); + // reserve space in first chunk + ChunkList::iterator head = m_chunks.begin(); + head->reserve(n + m_headUsed); - // consolidate chunks into the first chunk until it has n bytes - ChunkList::iterator scan = head; - ++scan; - while (head->size() - m_headUsed < n && scan != m_chunks.end()) { - head->insert(head->end(), scan->begin(), scan->end()); - scan = m_chunks.erase(scan); - } + // consolidate chunks into the first chunk until it has n bytes + ChunkList::iterator scan = head; + ++scan; + while (head->size() - m_headUsed < n && scan != m_chunks.end()) { + head->insert(head->end(), scan->begin(), scan->end()); + scan = m_chunks.erase(scan); + } - return static_cast(&(head->begin()[m_headUsed])); + return static_cast(&(head->begin()[m_headUsed])); } void StreamBuffer::pop(UInt32 n) { - // discard all chunks if n is greater than or equal to m_size - if (n >= m_size) { - m_size = 0; - m_headUsed = 0; - m_chunks.clear(); - return; - } + // discard all chunks if n is greater than or equal to m_size + if (n >= m_size) { + m_size = 0; + m_headUsed = 0; + m_chunks.clear(); + return; + } - // update size - m_size -= n; + // update size + m_size -= n; - // discard chunks until more than n bytes would've been discarded - ChunkList::iterator scan = m_chunks.begin(); - assert(scan != m_chunks.end()); - while (scan->size() - m_headUsed <= n) { - n -= (UInt32)scan->size() - m_headUsed; - m_headUsed = 0; - scan = m_chunks.erase(scan); - assert(scan != m_chunks.end()); - } + // discard chunks until more than n bytes would've been discarded + ChunkList::iterator scan = m_chunks.begin(); + assert(scan != m_chunks.end()); + while (scan->size() - m_headUsed <= n) { + n -= (UInt32)scan->size() - m_headUsed; + m_headUsed = 0; + scan = m_chunks.erase(scan); + assert(scan != m_chunks.end()); + } - // remove left over bytes from the head chunk - if (n > 0) { - m_headUsed += n; - } + // remove left over bytes from the head chunk + if (n > 0) { + m_headUsed += n; + } } void StreamBuffer::write(const void* vdata, UInt32 n) { - assert(vdata != NULL); + assert(vdata != NULL); - // ignore if no data, otherwise update size - if (n == 0) { - return; - } - m_size += n; + // ignore if no data, otherwise update size + if (n == 0) { + return; + } + m_size += n; - // cast data to bytes - const UInt8* data = static_cast(vdata); + // cast data to bytes + const UInt8* data = static_cast(vdata); - // point to last chunk if it has space, otherwise append an empty chunk - ChunkList::iterator scan = m_chunks.end(); - if (scan != m_chunks.begin()) { - --scan; - if (scan->size() >= kChunkSize) { - ++scan; - } - } - if (scan == m_chunks.end()) { - scan = m_chunks.insert(scan, Chunk()); - } + // point to last chunk if it has space, otherwise append an empty chunk + ChunkList::iterator scan = m_chunks.end(); + if (scan != m_chunks.begin()) { + --scan; + if (scan->size() >= kChunkSize) { + ++scan; + } + } + if (scan == m_chunks.end()) { + scan = m_chunks.insert(scan, Chunk()); + } - // append data in chunks - while (n > 0) { - // choose number of bytes for next chunk - assert(scan->size() <= kChunkSize); - UInt32 count = kChunkSize - (UInt32)scan->size(); - if (count > n) - count = n; + // append data in chunks + while (n > 0) { + // choose number of bytes for next chunk + assert(scan->size() <= kChunkSize); + UInt32 count = kChunkSize - (UInt32)scan->size(); + if (count > n) + count = n; - // transfer data - scan->insert(scan->end(), data, data + count); - n -= count; - data += count; + // transfer data + scan->insert(scan->end(), data, data + count); + n -= count; + data += count; - // append another empty chunk if we're not done yet - if (n > 0) { - ++scan; - scan = m_chunks.insert(scan, Chunk()); - } - } + // append another empty chunk if we're not done yet + if (n > 0) { + ++scan; + scan = m_chunks.insert(scan, Chunk()); + } + } } UInt32 StreamBuffer::getSize() const { - return m_size; + return m_size; } diff --git a/src/lib/io/StreamBuffer.h b/src/lib/io/StreamBuffer.h index f7f09b64..db218cc0 100644 --- a/src/lib/io/StreamBuffer.h +++ b/src/lib/io/StreamBuffer.h @@ -28,52 +28,52 @@ This class maintains a FIFO (first-in, last-out) buffer of bytes. */ class StreamBuffer { public: - StreamBuffer(); - ~StreamBuffer(); + StreamBuffer(); + ~StreamBuffer(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Read data without removing from buffer - /*! - Return a pointer to memory with the next \c n bytes in the buffer - (which must be <= getSize()). The caller must not modify the returned - memory nor delete it. - */ - const void* peek(UInt32 n); + //! Read data without removing from buffer + /*! + Return a pointer to memory with the next \c n bytes in the buffer + (which must be <= getSize()). The caller must not modify the returned + memory nor delete it. + */ + const void* peek(UInt32 n); - //! Discard data - /*! - Discards the next \c n bytes. If \c n >= getSize() then the buffer - is cleared. - */ - void pop(UInt32 n); + //! Discard data + /*! + Discards the next \c n bytes. If \c n >= getSize() then the buffer + is cleared. + */ + void pop(UInt32 n); - //! Write data to buffer - /*! - Appends \c n bytes from \c data to the buffer. - */ - void write(const void* data, UInt32 n); + //! Write data to buffer + /*! + Appends \c n bytes from \c data to the buffer. + */ + void write(const void* data, UInt32 n); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get size of buffer - /*! - Returns the number of bytes in the buffer. - */ - UInt32 getSize() const; + //! Get size of buffer + /*! + Returns the number of bytes in the buffer. + */ + UInt32 getSize() const; - //@} + //@} private: - static const UInt32 kChunkSize; + static const UInt32 kChunkSize; - typedef std::vector Chunk; - typedef std::list ChunkList; + typedef std::vector Chunk; + typedef std::list ChunkList; - ChunkList m_chunks; - UInt32 m_size; - UInt32 m_headUsed; + ChunkList m_chunks; + UInt32 m_size; + UInt32 m_headUsed; }; diff --git a/src/lib/io/StreamFilter.cpp b/src/lib/io/StreamFilter.cpp index 468aff84..ceefb89e 100644 --- a/src/lib/io/StreamFilter.cpp +++ b/src/lib/io/StreamFilter.cpp @@ -25,94 +25,94 @@ // StreamFilter::StreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream) : - m_stream(stream), - m_adopted(adoptStream), - m_events(events) + m_stream(stream), + m_adopted(adoptStream), + m_events(events) { - // replace handlers for m_stream - m_events->removeHandlers(m_stream->getEventTarget()); - m_events->adoptHandler(Event::kUnknown, m_stream->getEventTarget(), - new TMethodEventJob(this, - &StreamFilter::handleUpstreamEvent)); + // replace handlers for m_stream + m_events->removeHandlers(m_stream->getEventTarget()); + m_events->adoptHandler(Event::kUnknown, m_stream->getEventTarget(), + new TMethodEventJob(this, + &StreamFilter::handleUpstreamEvent)); } StreamFilter::~StreamFilter() { - m_events->removeHandler(Event::kUnknown, m_stream->getEventTarget()); - if (m_adopted) { - delete m_stream; - } + m_events->removeHandler(Event::kUnknown, m_stream->getEventTarget()); + if (m_adopted) { + delete m_stream; + } } void StreamFilter::close() { - getStream()->close(); + getStream()->close(); } UInt32 StreamFilter::read(void* buffer, UInt32 n) { - return getStream()->read(buffer, n); + return getStream()->read(buffer, n); } void StreamFilter::write(const void* buffer, UInt32 n) { - getStream()->write(buffer, n); + getStream()->write(buffer, n); } void StreamFilter::flush() { - getStream()->flush(); + getStream()->flush(); } void StreamFilter::shutdownInput() { - getStream()->shutdownInput(); + getStream()->shutdownInput(); } void StreamFilter::shutdownOutput() { - getStream()->shutdownOutput(); + getStream()->shutdownOutput(); } void* StreamFilter::getEventTarget() const { - return const_cast(static_cast(this)); + return const_cast(static_cast(this)); } bool StreamFilter::isReady() const { - return getStream()->isReady(); + return getStream()->isReady(); } UInt32 StreamFilter::getSize() const { - return getStream()->getSize(); + return getStream()->getSize(); } synergy::IStream* StreamFilter::getStream() const { - return m_stream; + return m_stream; } void StreamFilter::filterEvent(const Event& event) { - m_events->dispatchEvent(Event(event.getType(), - getEventTarget(), event.getData())); + m_events->dispatchEvent(Event(event.getType(), + getEventTarget(), event.getData())); } void StreamFilter::handleUpstreamEvent(const Event& event, void*) { - filterEvent(event); + filterEvent(event); } diff --git a/src/lib/io/StreamFilter.h b/src/lib/io/StreamFilter.h index 62640910..bf820ad7 100644 --- a/src/lib/io/StreamFilter.h +++ b/src/lib/io/StreamFilter.h @@ -28,46 +28,46 @@ to the wrapped stream, typically performing some filtering. */ class StreamFilter : public synergy::IStream { public: - /*! - Create a wrapper around \c stream. Iff \c adoptStream is true then - this object takes ownership of the stream and will delete it in the - d'tor. - */ - StreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream = true); - virtual ~StreamFilter(); + /*! + Create a wrapper around \c stream. Iff \c adoptStream is true then + this object takes ownership of the stream and will delete it in the + d'tor. + */ + StreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream = true); + virtual ~StreamFilter(); - // IStream overrides - // These all just forward to the underlying stream except getEventTarget. - // Override as necessary. getEventTarget returns a pointer to this. - virtual void close(); - virtual UInt32 read(void* buffer, UInt32 n); - virtual void write(const void* buffer, UInt32 n); - virtual void flush(); - virtual void shutdownInput(); - virtual void shutdownOutput(); - virtual void* getEventTarget() const; - virtual bool isReady() const; - virtual UInt32 getSize() const; + // IStream overrides + // These all just forward to the underlying stream except getEventTarget. + // Override as necessary. getEventTarget returns a pointer to this. + virtual void close(); + virtual UInt32 read(void* buffer, UInt32 n); + virtual void write(const void* buffer, UInt32 n); + virtual void flush(); + virtual void shutdownInput(); + virtual void shutdownOutput(); + virtual void* getEventTarget() const; + virtual bool isReady() const; + virtual UInt32 getSize() const; - //! Get the stream - /*! - Returns the stream passed to the c'tor. - */ - synergy::IStream* getStream() const; + //! Get the stream + /*! + Returns the stream passed to the c'tor. + */ + synergy::IStream* getStream() const; protected: - //! Handle events from source stream - /*! - Does the event filtering. The default simply dispatches an event - identical except using this object as the event target. - */ - virtual void filterEvent(const Event&); + //! Handle events from source stream + /*! + Does the event filtering. The default simply dispatches an event + identical except using this object as the event target. + */ + virtual void filterEvent(const Event&); private: - void handleUpstreamEvent(const Event&, void*); + void handleUpstreamEvent(const Event&, void*); private: - synergy::IStream* m_stream; - bool m_adopted; - IEventQueue* m_events; + synergy::IStream* m_stream; + bool m_adopted; + IEventQueue* m_events; }; diff --git a/src/lib/io/XIO.cpp b/src/lib/io/XIO.cpp index d51616c3..5ff04fc4 100644 --- a/src/lib/io/XIO.cpp +++ b/src/lib/io/XIO.cpp @@ -25,7 +25,7 @@ String XIOClosed::getWhat() const throw() { - return format("XIOClosed", "already closed"); + return format("XIOClosed", "already closed"); } @@ -36,7 +36,7 @@ XIOClosed::getWhat() const throw() String XIOEndOfStream::getWhat() const throw() { - return format("XIOEndOfStream", "reached end of stream"); + return format("XIOEndOfStream", "reached end of stream"); } @@ -47,5 +47,5 @@ XIOEndOfStream::getWhat() const throw() String XIOWouldBlock::getWhat() const throw() { - return format("XIOWouldBlock", "stream operation would block"); + return format("XIOWouldBlock", "stream operation would block"); } diff --git a/src/lib/ipc/CMakeLists.txt b/src/lib/ipc/CMakeLists.txt index 23c26cb0..6438033b 100644 --- a/src/lib/ipc/CMakeLists.txt +++ b/src/lib/ipc/CMakeLists.txt @@ -18,21 +18,21 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(ipc STATIC ${sources}) if (UNIX) - target_link_libraries(ipc arch base common mt io net synergy) + target_link_libraries(ipc arch base common mt io net synergy) endif() diff --git a/src/lib/ipc/Ipc.cpp b/src/lib/ipc/Ipc.cpp index 6f8b8547..c0667714 100644 --- a/src/lib/ipc/Ipc.cpp +++ b/src/lib/ipc/Ipc.cpp @@ -18,7 +18,7 @@ #include "ipc/Ipc.h" -const char* kIpcMsgHello = "IHEL%1i"; -const char* kIpcMsgLogLine = "ILOG%s"; -const char* kIpcMsgCommand = "ICMD%s%1i"; -const char* kIpcMsgShutdown = "ISDN"; +const char* kIpcMsgHello = "IHEL%1i"; +const char* kIpcMsgLogLine = "ILOG%s"; +const char* kIpcMsgCommand = "ICMD%s%1i"; +const char* kIpcMsgShutdown = "ISDN"; diff --git a/src/lib/ipc/Ipc.h b/src/lib/ipc/Ipc.h index a6fbb521..b4a4e201 100644 --- a/src/lib/ipc/Ipc.h +++ b/src/lib/ipc/Ipc.h @@ -22,31 +22,31 @@ #define IPC_PORT 24801 enum EIpcMessage { - kIpcHello, - kIpcLogLine, - kIpcCommand, - kIpcShutdown, + kIpcHello, + kIpcLogLine, + kIpcCommand, + kIpcShutdown, }; enum EIpcClientType { - kIpcClientUnknown, - kIpcClientGui, - kIpcClientNode, + kIpcClientUnknown, + kIpcClientGui, + kIpcClientNode, }; // handshake: node/gui -> daemon // $1 = type, the client identifies it's self as gui or node (synergyc/s). -extern const char* kIpcMsgHello; +extern const char* kIpcMsgHello; // log line: daemon -> gui // $1 = aggregate log lines collected from synergys/c or the daemon itself. -extern const char* kIpcMsgLogLine; +extern const char* kIpcMsgLogLine; // command: gui -> daemon // $1 = command; the command for the daemon to launch, typically the full // path to synergys/c. $2 = true when process must be elevated on ms windows. -extern const char* kIpcMsgCommand; +extern const char* kIpcMsgCommand; // shutdown: daemon -> node // the daemon tells synergys/c to shut down gracefully. -extern const char* kIpcMsgShutdown; +extern const char* kIpcMsgShutdown; diff --git a/src/lib/ipc/IpcClient.cpp b/src/lib/ipc/IpcClient.cpp index 896df8d5..22726abc 100644 --- a/src/lib/ipc/IpcClient.cpp +++ b/src/lib/ipc/IpcClient.cpp @@ -27,27 +27,27 @@ // IpcClient::IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : - m_serverAddress(NetworkAddress(IPC_HOST, IPC_PORT)), - m_socket(events, socketMultiplexer), - m_server(nullptr), - m_events(events) + m_serverAddress(NetworkAddress(IPC_HOST, IPC_PORT)), + m_socket(events, socketMultiplexer), + m_server(nullptr), + m_events(events) { - init(); + init(); } IpcClient::IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port) : - m_serverAddress(NetworkAddress(IPC_HOST, port)), - m_socket(events, socketMultiplexer), - m_server(nullptr), - m_events(events) + m_serverAddress(NetworkAddress(IPC_HOST, port)), + m_socket(events, socketMultiplexer), + m_server(nullptr), + m_events(events) { - init(); + init(); } void IpcClient::init() { - m_serverAddress.resolve(); + m_serverAddress.resolve(); } IpcClient::~IpcClient() @@ -57,52 +57,52 @@ IpcClient::~IpcClient() void IpcClient::connect() { - m_events->adoptHandler( - m_events->forIDataSocket().connected(), m_socket.getEventTarget(), - new TMethodEventJob( - this, &IpcClient::handleConnected)); + m_events->adoptHandler( + m_events->forIDataSocket().connected(), m_socket.getEventTarget(), + new TMethodEventJob( + this, &IpcClient::handleConnected)); - m_socket.connect(m_serverAddress); - m_server = new IpcServerProxy(m_socket, m_events); + m_socket.connect(m_serverAddress); + m_server = new IpcServerProxy(m_socket, m_events); - m_events->adoptHandler( - m_events->forIpcServerProxy().messageReceived(), m_server, - new TMethodEventJob( - this, &IpcClient::handleMessageReceived)); + m_events->adoptHandler( + m_events->forIpcServerProxy().messageReceived(), m_server, + new TMethodEventJob( + this, &IpcClient::handleMessageReceived)); } void IpcClient::disconnect() { - m_events->removeHandler(m_events->forIDataSocket().connected(), m_socket.getEventTarget()); - m_events->removeHandler(m_events->forIpcServerProxy().messageReceived(), m_server); + m_events->removeHandler(m_events->forIDataSocket().connected(), m_socket.getEventTarget()); + m_events->removeHandler(m_events->forIpcServerProxy().messageReceived(), m_server); - m_server->disconnect(); - delete m_server; - m_server = nullptr; + m_server->disconnect(); + delete m_server; + m_server = nullptr; } void IpcClient::send(const IpcMessage& message) { - assert(m_server != nullptr); - m_server->send(message); + assert(m_server != nullptr); + m_server->send(message); } void IpcClient::handleConnected(const Event&, void*) { - m_events->addEvent(Event( - m_events->forIpcClient().connected(), this, m_server, Event::kDontFreeData)); + m_events->addEvent(Event( + m_events->forIpcClient().connected(), this, m_server, Event::kDontFreeData)); - IpcHelloMessage message(kIpcClientNode); - send(message); + IpcHelloMessage message(kIpcClientNode); + send(message); } void IpcClient::handleMessageReceived(const Event& e, void*) { - Event event(m_events->forIpcClient().messageReceived(), this); - event.setDataObject(e.getDataObject()); - m_events->addEvent(event); + Event event(m_events->forIpcClient().messageReceived(), this); + event.setDataObject(e.getDataObject()); + m_events->addEvent(event); } diff --git a/src/lib/ipc/IpcClient.h b/src/lib/ipc/IpcClient.h index 415176bb..fb31a26d 100644 --- a/src/lib/ipc/IpcClient.h +++ b/src/lib/ipc/IpcClient.h @@ -33,32 +33,32 @@ class SocketMultiplexer; */ class IpcClient { public: - IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port); - virtual ~IpcClient(); + IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + IpcClient(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port); + virtual ~IpcClient(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Connects to the IPC server at localhost. - void connect(); - - //! Disconnects from the IPC server. - void disconnect(); + //! Connects to the IPC server at localhost. + void connect(); + + //! Disconnects from the IPC server. + void disconnect(); - //! Sends a message to the server. - void send(const IpcMessage& message); + //! Sends a message to the server. + void send(const IpcMessage& message); - //@} + //@} private: - void init(); - void handleConnected(const Event&, void*); - void handleMessageReceived(const Event&, void*); + void init(); + void handleConnected(const Event&, void*); + void handleMessageReceived(const Event&, void*); private: - NetworkAddress m_serverAddress; - TCPSocket m_socket; - IpcServerProxy* m_server; - IEventQueue* m_events; + NetworkAddress m_serverAddress; + TCPSocket m_socket; + IpcServerProxy* m_server; + IEventQueue* m_events; }; diff --git a/src/lib/ipc/IpcClientProxy.cpp b/src/lib/ipc/IpcClientProxy.cpp index 5ede6a05..bbebf9a8 100644 --- a/src/lib/ipc/IpcClientProxy.cpp +++ b/src/lib/ipc/IpcClientProxy.cpp @@ -31,164 +31,164 @@ // IpcClientProxy::IpcClientProxy(synergy::IStream& stream, IEventQueue* events) : - m_stream(stream), - m_clientType(kIpcClientUnknown), - m_disconnecting(false), - m_readMutex(ARCH->newMutex()), - m_writeMutex(ARCH->newMutex()), - m_events(events) + m_stream(stream), + m_clientType(kIpcClientUnknown), + m_disconnecting(false), + m_readMutex(ARCH->newMutex()), + m_writeMutex(ARCH->newMutex()), + m_events(events) { - m_events->adoptHandler( - m_events->forIStream().inputReady(), stream.getEventTarget(), - new TMethodEventJob( - this, &IpcClientProxy::handleData)); + m_events->adoptHandler( + m_events->forIStream().inputReady(), stream.getEventTarget(), + new TMethodEventJob( + this, &IpcClientProxy::handleData)); - m_events->adoptHandler( - m_events->forIStream().outputError(), stream.getEventTarget(), - new TMethodEventJob( - this, &IpcClientProxy::handleWriteError)); + m_events->adoptHandler( + m_events->forIStream().outputError(), stream.getEventTarget(), + new TMethodEventJob( + this, &IpcClientProxy::handleWriteError)); - m_events->adoptHandler( - m_events->forIStream().inputShutdown(), stream.getEventTarget(), - new TMethodEventJob( - this, &IpcClientProxy::handleDisconnect)); + m_events->adoptHandler( + m_events->forIStream().inputShutdown(), stream.getEventTarget(), + new TMethodEventJob( + this, &IpcClientProxy::handleDisconnect)); - m_events->adoptHandler( - m_events->forIStream().outputShutdown(), stream.getEventTarget(), - new TMethodEventJob( - this, &IpcClientProxy::handleWriteError)); + m_events->adoptHandler( + m_events->forIStream().outputShutdown(), stream.getEventTarget(), + new TMethodEventJob( + this, &IpcClientProxy::handleWriteError)); } IpcClientProxy::~IpcClientProxy() { - m_events->removeHandler( - m_events->forIStream().inputReady(), m_stream.getEventTarget()); - m_events->removeHandler( - m_events->forIStream().outputError(), m_stream.getEventTarget()); - m_events->removeHandler( - m_events->forIStream().inputShutdown(), m_stream.getEventTarget()); - m_events->removeHandler( - m_events->forIStream().outputShutdown(), m_stream.getEventTarget()); - - // don't delete the stream while it's being used. - ARCH->lockMutex(m_readMutex); - ARCH->lockMutex(m_writeMutex); - delete &m_stream; - ARCH->unlockMutex(m_readMutex); - ARCH->unlockMutex(m_writeMutex); + m_events->removeHandler( + m_events->forIStream().inputReady(), m_stream.getEventTarget()); + m_events->removeHandler( + m_events->forIStream().outputError(), m_stream.getEventTarget()); + m_events->removeHandler( + m_events->forIStream().inputShutdown(), m_stream.getEventTarget()); + m_events->removeHandler( + m_events->forIStream().outputShutdown(), m_stream.getEventTarget()); + + // don't delete the stream while it's being used. + ARCH->lockMutex(m_readMutex); + ARCH->lockMutex(m_writeMutex); + delete &m_stream; + ARCH->unlockMutex(m_readMutex); + ARCH->unlockMutex(m_writeMutex); - ARCH->closeMutex(m_readMutex); - ARCH->closeMutex(m_writeMutex); + ARCH->closeMutex(m_readMutex); + ARCH->closeMutex(m_writeMutex); } void IpcClientProxy::handleDisconnect(const Event&, void*) { - disconnect(); - LOG((CLOG_DEBUG "ipc client disconnected")); + disconnect(); + LOG((CLOG_DEBUG "ipc client disconnected")); } void IpcClientProxy::handleWriteError(const Event&, void*) { - disconnect(); - LOG((CLOG_DEBUG "ipc client write error")); + disconnect(); + LOG((CLOG_DEBUG "ipc client write error")); } void IpcClientProxy::handleData(const Event&, void*) { - // don't allow the dtor to destroy the stream while we're using it. - ArchMutexLock lock(m_readMutex); + // don't allow the dtor to destroy the stream while we're using it. + ArchMutexLock lock(m_readMutex); - LOG((CLOG_DEBUG "start ipc handle data")); + LOG((CLOG_DEBUG "start ipc handle data")); - UInt8 code[4]; - UInt32 n = m_stream.read(code, 4); - while (n != 0) { + UInt8 code[4]; + UInt32 n = m_stream.read(code, 4); + while (n != 0) { - LOG((CLOG_DEBUG "ipc read: %c%c%c%c", - code[0], code[1], code[2], code[3])); + LOG((CLOG_DEBUG "ipc read: %c%c%c%c", + code[0], code[1], code[2], code[3])); - IpcMessage* m = nullptr; - if (memcmp(code, kIpcMsgHello, 4) == 0) { - m = parseHello(); - } - else if (memcmp(code, kIpcMsgCommand, 4) == 0) { - m = parseCommand(); - } - else { - LOG((CLOG_ERR "invalid ipc message")); - disconnect(); - } + IpcMessage* m = nullptr; + if (memcmp(code, kIpcMsgHello, 4) == 0) { + m = parseHello(); + } + else if (memcmp(code, kIpcMsgCommand, 4) == 0) { + m = parseCommand(); + } + else { + LOG((CLOG_ERR "invalid ipc message")); + disconnect(); + } - // don't delete with this event; the data is passed to a new event. - Event e(m_events->forIpcClientProxy().messageReceived(), this, NULL, Event::kDontFreeData); - e.setDataObject(m); - m_events->addEvent(e); + // don't delete with this event; the data is passed to a new event. + Event e(m_events->forIpcClientProxy().messageReceived(), this, NULL, Event::kDontFreeData); + e.setDataObject(m); + m_events->addEvent(e); - n = m_stream.read(code, 4); - } + n = m_stream.read(code, 4); + } - LOG((CLOG_DEBUG "finished ipc handle data")); + LOG((CLOG_DEBUG "finished ipc handle data")); } void IpcClientProxy::send(const IpcMessage& message) { - // don't allow other threads to write until we've finished the entire - // message. stream write is locked, but only for that single write. - // also, don't allow the dtor to destroy the stream while we're using it. - ArchMutexLock lock(m_writeMutex); + // don't allow other threads to write until we've finished the entire + // message. stream write is locked, but only for that single write. + // also, don't allow the dtor to destroy the stream while we're using it. + ArchMutexLock lock(m_writeMutex); - LOG((CLOG_DEBUG4 "ipc write: %d", message.type())); + LOG((CLOG_DEBUG4 "ipc write: %d", message.type())); - switch (message.type()) { - case kIpcLogLine: { - const IpcLogLineMessage& llm = static_cast(message); - const String logLine = llm.logLine(); - ProtocolUtil::writef(&m_stream, kIpcMsgLogLine, &logLine); - break; - } - - case kIpcShutdown: - ProtocolUtil::writef(&m_stream, kIpcMsgShutdown); - break; + switch (message.type()) { + case kIpcLogLine: { + const IpcLogLineMessage& llm = static_cast(message); + const String logLine = llm.logLine(); + ProtocolUtil::writef(&m_stream, kIpcMsgLogLine, &logLine); + break; + } + + case kIpcShutdown: + ProtocolUtil::writef(&m_stream, kIpcMsgShutdown); + break; - default: - LOG((CLOG_ERR "ipc message not supported: %d", message.type())); - break; - } + default: + LOG((CLOG_ERR "ipc message not supported: %d", message.type())); + break; + } } IpcHelloMessage* IpcClientProxy::parseHello() { - UInt8 type; - ProtocolUtil::readf(&m_stream, kIpcMsgHello + 4, &type); + UInt8 type; + ProtocolUtil::readf(&m_stream, kIpcMsgHello + 4, &type); - m_clientType = static_cast(type); + m_clientType = static_cast(type); - // must be deleted by event handler. - return new IpcHelloMessage(m_clientType); + // must be deleted by event handler. + return new IpcHelloMessage(m_clientType); } IpcCommandMessage* IpcClientProxy::parseCommand() { - String command; - UInt8 elevate; - ProtocolUtil::readf(&m_stream, kIpcMsgCommand + 4, &command, &elevate); + String command; + UInt8 elevate; + ProtocolUtil::readf(&m_stream, kIpcMsgCommand + 4, &command, &elevate); - // must be deleted by event handler. - return new IpcCommandMessage(command, elevate != 0); + // must be deleted by event handler. + return new IpcCommandMessage(command, elevate != 0); } void IpcClientProxy::disconnect() { - LOG((CLOG_DEBUG "ipc disconnect, closing stream")); - m_disconnecting = true; - m_stream.close(); - m_events->addEvent(Event(m_events->forIpcClientProxy().disconnected(), this)); + LOG((CLOG_DEBUG "ipc disconnect, closing stream")); + m_disconnecting = true; + m_stream.close(); + m_events->addEvent(Event(m_events->forIpcClientProxy().disconnected(), this)); } diff --git a/src/lib/ipc/IpcClientProxy.h b/src/lib/ipc/IpcClientProxy.h index cdbdcc50..d9a22e13 100644 --- a/src/lib/ipc/IpcClientProxy.h +++ b/src/lib/ipc/IpcClientProxy.h @@ -30,26 +30,26 @@ class IpcHelloMessage; class IEventQueue; class IpcClientProxy { - friend class IpcServer; + friend class IpcServer; public: - IpcClientProxy(synergy::IStream& stream, IEventQueue* events); - virtual ~IpcClientProxy(); + IpcClientProxy(synergy::IStream& stream, IEventQueue* events); + virtual ~IpcClientProxy(); private: - void send(const IpcMessage& message); - void handleData(const Event&, void*); - void handleDisconnect(const Event&, void*); - void handleWriteError(const Event&, void*); - IpcHelloMessage* parseHello(); - IpcCommandMessage* parseCommand(); - void disconnect(); - + void send(const IpcMessage& message); + void handleData(const Event&, void*); + void handleDisconnect(const Event&, void*); + void handleWriteError(const Event&, void*); + IpcHelloMessage* parseHello(); + IpcCommandMessage* parseCommand(); + void disconnect(); + private: - synergy::IStream& m_stream; - EIpcClientType m_clientType; - bool m_disconnecting; - ArchMutex m_readMutex; - ArchMutex m_writeMutex; - IEventQueue* m_events; + synergy::IStream& m_stream; + EIpcClientType m_clientType; + bool m_disconnecting; + ArchMutex m_readMutex; + ArchMutex m_writeMutex; + IEventQueue* m_events; }; diff --git a/src/lib/ipc/IpcLogOutputter.cpp b/src/lib/ipc/IpcLogOutputter.cpp index 9cf8e65d..f215750a 100644 --- a/src/lib/ipc/IpcLogOutputter.cpp +++ b/src/lib/ipc/IpcLogOutputter.cpp @@ -31,49 +31,49 @@ #include "base/TMethodJob.h" enum EIpcLogOutputter { - kBufferMaxSize = 1000, - kMaxSendLines = 100, - kBufferRateWriteLimit = 1000, // writes per kBufferRateTime - kBufferRateTimeLimit = 1 // seconds + kBufferMaxSize = 1000, + kMaxSendLines = 100, + kBufferRateWriteLimit = 1000, // writes per kBufferRateTime + kBufferRateTimeLimit = 1 // seconds }; IpcLogOutputter::IpcLogOutputter(IpcServer& ipcServer, EIpcClientType clientType, bool useThread) : - m_ipcServer(ipcServer), - m_bufferMutex(ARCH->newMutex()), - m_sending(false), - m_bufferThread(nullptr), - m_running(false), - m_notifyCond(ARCH->newCondVar()), - m_notifyMutex(ARCH->newMutex()), - m_bufferWaiting(false), - m_bufferMaxSize(kBufferMaxSize), - m_bufferRateWriteLimit(kBufferRateWriteLimit), - m_bufferRateTimeLimit(kBufferRateTimeLimit), - m_bufferWriteCount(0), - m_bufferRateStart(ARCH->time()), - m_clientType(clientType), - m_runningMutex(ARCH->newMutex()) + m_ipcServer(ipcServer), + m_bufferMutex(ARCH->newMutex()), + m_sending(false), + m_bufferThread(nullptr), + m_running(false), + m_notifyCond(ARCH->newCondVar()), + m_notifyMutex(ARCH->newMutex()), + m_bufferWaiting(false), + m_bufferMaxSize(kBufferMaxSize), + m_bufferRateWriteLimit(kBufferRateWriteLimit), + m_bufferRateTimeLimit(kBufferRateTimeLimit), + m_bufferWriteCount(0), + m_bufferRateStart(ARCH->time()), + m_clientType(clientType), + m_runningMutex(ARCH->newMutex()) { - if (useThread) { - m_bufferThread = new Thread(new TMethodJob( - this, &IpcLogOutputter::bufferThread)); - } + if (useThread) { + m_bufferThread = new Thread(new TMethodJob( + this, &IpcLogOutputter::bufferThread)); + } } IpcLogOutputter::~IpcLogOutputter() { - close(); + close(); - ARCH->closeMutex(m_bufferMutex); + ARCH->closeMutex(m_bufferMutex); - if (m_bufferThread != nullptr) { - m_bufferThread->cancel(); - m_bufferThread->wait(); - delete m_bufferThread; - } + if (m_bufferThread != nullptr) { + m_bufferThread->cancel(); + m_bufferThread->wait(); + delete m_bufferThread; + } - ARCH->closeCondVar(m_notifyCond); - ARCH->closeMutex(m_notifyMutex); + ARCH->closeCondVar(m_notifyCond); + ARCH->closeMutex(m_notifyMutex); } void @@ -84,12 +84,12 @@ IpcLogOutputter::open(const char* title) void IpcLogOutputter::close() { - if (m_bufferThread != nullptr) { - ArchMutexLock lock(m_runningMutex); - m_running = false; - notifyBuffer(); - m_bufferThread->wait(5); - } + if (m_bufferThread != nullptr) { + ArchMutexLock lock(m_runningMutex); + m_running = false; + notifyBuffer(); + m_bufferThread->wait(5); + } } void @@ -100,128 +100,128 @@ IpcLogOutputter::show(bool showIfEmpty) bool IpcLogOutputter::write(ELevel, const char* text) { - // ignore events from the buffer thread (would cause recursion). - if (m_bufferThread != nullptr && - Thread::getCurrentThread().getID() == m_bufferThreadId) { - return true; - } + // ignore events from the buffer thread (would cause recursion). + if (m_bufferThread != nullptr && + Thread::getCurrentThread().getID() == m_bufferThreadId) { + return true; + } - appendBuffer(text); - notifyBuffer(); + appendBuffer(text); + notifyBuffer(); - return true; + return true; } void IpcLogOutputter::appendBuffer(const String& text) { - ArchMutexLock lock(m_bufferMutex); + ArchMutexLock lock(m_bufferMutex); - double elapsed = ARCH->time() - m_bufferRateStart; - if (elapsed < m_bufferRateTimeLimit) { - if (m_bufferWriteCount >= m_bufferRateWriteLimit) { - // discard the log line if we've logged too much. - return; - } - } - else { - m_bufferWriteCount = 0; - m_bufferRateStart = ARCH->time(); - } + double elapsed = ARCH->time() - m_bufferRateStart; + if (elapsed < m_bufferRateTimeLimit) { + if (m_bufferWriteCount >= m_bufferRateWriteLimit) { + // discard the log line if we've logged too much. + return; + } + } + else { + m_bufferWriteCount = 0; + m_bufferRateStart = ARCH->time(); + } - if (m_buffer.size() >= m_bufferMaxSize) { - // if the queue is exceeds size limit, - // throw away the oldest item - m_buffer.pop_front(); - } + if (m_buffer.size() >= m_bufferMaxSize) { + // if the queue is exceeds size limit, + // throw away the oldest item + m_buffer.pop_front(); + } - m_buffer.push_back(text); - m_bufferWriteCount++; + m_buffer.push_back(text); + m_bufferWriteCount++; } bool IpcLogOutputter::isRunning() { - ArchMutexLock lock(m_runningMutex); - return m_running; + ArchMutexLock lock(m_runningMutex); + return m_running; } void IpcLogOutputter::bufferThread(void*) { - m_bufferThreadId = m_bufferThread->getID(); - m_running = true; + m_bufferThreadId = m_bufferThread->getID(); + m_running = true; - try { - while (isRunning()) { - if (m_buffer.empty() || !m_ipcServer.hasClients(m_clientType)) { - ArchMutexLock lock(m_notifyMutex); - ARCH->waitCondVar(m_notifyCond, m_notifyMutex, -1); - } + try { + while (isRunning()) { + if (m_buffer.empty() || !m_ipcServer.hasClients(m_clientType)) { + ArchMutexLock lock(m_notifyMutex); + ARCH->waitCondVar(m_notifyCond, m_notifyMutex, -1); + } - sendBuffer(); - } - } - catch (XArch& e) { - LOG((CLOG_ERR "ipc log buffer thread error, %s", e.what())); - } + sendBuffer(); + } + } + catch (XArch& e) { + LOG((CLOG_ERR "ipc log buffer thread error, %s", e.what())); + } - LOG((CLOG_DEBUG "ipc log buffer thread finished")); + LOG((CLOG_DEBUG "ipc log buffer thread finished")); } void IpcLogOutputter::notifyBuffer() { - ArchMutexLock lock(m_notifyMutex); - ARCH->broadcastCondVar(m_notifyCond); + ArchMutexLock lock(m_notifyMutex); + ARCH->broadcastCondVar(m_notifyCond); } String IpcLogOutputter::getChunk(size_t count) { - ArchMutexLock lock(m_bufferMutex); + ArchMutexLock lock(m_bufferMutex); - if (m_buffer.size() < count) { - count = m_buffer.size(); - } + if (m_buffer.size() < count) { + count = m_buffer.size(); + } - String chunk; - for (size_t i = 0; i < count; i++) { - chunk.append(m_buffer.front()); - chunk.append("\n"); - m_buffer.pop_front(); - } - return chunk; + String chunk; + for (size_t i = 0; i < count; i++) { + chunk.append(m_buffer.front()); + chunk.append("\n"); + m_buffer.pop_front(); + } + return chunk; } void IpcLogOutputter::sendBuffer() { - if (m_buffer.empty() || !m_ipcServer.hasClients(m_clientType)) { - return; - } + if (m_buffer.empty() || !m_ipcServer.hasClients(m_clientType)) { + return; + } - IpcLogLineMessage message(getChunk(kMaxSendLines)); - m_sending = true; - m_ipcServer.send(message, kIpcClientGui); - m_sending = false; + IpcLogLineMessage message(getChunk(kMaxSendLines)); + m_sending = true; + m_ipcServer.send(message, kIpcClientGui); + m_sending = false; } void IpcLogOutputter::bufferMaxSize(UInt16 bufferMaxSize) { - m_bufferMaxSize = bufferMaxSize; + m_bufferMaxSize = bufferMaxSize; } UInt16 IpcLogOutputter::bufferMaxSize() const { - return m_bufferMaxSize; + return m_bufferMaxSize; } void IpcLogOutputter::bufferRateLimit(UInt16 writeLimit, double timeLimit) { - m_bufferRateWriteLimit = writeLimit; - m_bufferRateTimeLimit = timeLimit; + m_bufferRateWriteLimit = writeLimit; + m_bufferRateTimeLimit = timeLimit; } diff --git a/src/lib/ipc/IpcLogOutputter.h b/src/lib/ipc/IpcLogOutputter.h index ac5ddc65..dd2bada6 100644 --- a/src/lib/ipc/IpcLogOutputter.h +++ b/src/lib/ipc/IpcLogOutputter.h @@ -35,86 +35,86 @@ This outputter writes output to the GUI via IPC. */ class IpcLogOutputter : public ILogOutputter { public: - /*! - If \p useThread is \c true, the buffer will be sent using a thread. - If \p useThread is \c false, then the buffer needs to be sent manually - using the \c sendBuffer() function. - */ - IpcLogOutputter(IpcServer& ipcServer, EIpcClientType clientType, bool useThread); - virtual ~IpcLogOutputter(); + /*! + If \p useThread is \c true, the buffer will be sent using a thread. + If \p useThread is \c false, then the buffer needs to be sent manually + using the \c sendBuffer() function. + */ + IpcLogOutputter(IpcServer& ipcServer, EIpcClientType clientType, bool useThread); + virtual ~IpcLogOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); - - //! @name manipulators - //@{ + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); + + //! @name manipulators + //@{ - //! Notify that the buffer should be sent. - void notifyBuffer(); + //! Notify that the buffer should be sent. + void notifyBuffer(); - //! Set the buffer size - /*! - Set the maximum size of the buffer to protect memory - from runaway logging. - */ - void bufferMaxSize(UInt16 bufferMaxSize); + //! Set the buffer size + /*! + Set the maximum size of the buffer to protect memory + from runaway logging. + */ + void bufferMaxSize(UInt16 bufferMaxSize); - //! Set the rate limit - /*! - Set the maximum number of \p writeRate for every \p timeRate in seconds. - */ - void bufferRateLimit(UInt16 writeLimit, double timeLimit); + //! Set the rate limit + /*! + Set the maximum number of \p writeRate for every \p timeRate in seconds. + */ + void bufferRateLimit(UInt16 writeLimit, double timeLimit); - //! Send the buffer - /*! - Sends a chunk of the buffer to the IPC server, normally called - when threaded mode is on. - */ - void sendBuffer(); - - //@} - - //! @name accessors - //@{ - - //! Get the buffer size - /*! - Returns the maximum size of the buffer. - */ - UInt16 bufferMaxSize() const; - - //@} + //! Send the buffer + /*! + Sends a chunk of the buffer to the IPC server, normally called + when threaded mode is on. + */ + void sendBuffer(); + + //@} + + //! @name accessors + //@{ + + //! Get the buffer size + /*! + Returns the maximum size of the buffer. + */ + UInt16 bufferMaxSize() const; + + //@} private: - void init(); - void bufferThread(void*); - String getChunk(size_t count); - void appendBuffer(const String& text); - bool isRunning(); + void init(); + void bufferThread(void*); + String getChunk(size_t count); + void appendBuffer(const String& text); + bool isRunning(); private: - typedef std::deque Buffer; + typedef std::deque Buffer; - IpcServer& m_ipcServer; - Buffer m_buffer; - ArchMutex m_bufferMutex; - bool m_sending; - Thread* m_bufferThread; - bool m_running; - ArchCond m_notifyCond; - ArchMutex m_notifyMutex; - bool m_bufferWaiting; - IArchMultithread::ThreadID - m_bufferThreadId; - UInt16 m_bufferMaxSize; - UInt16 m_bufferRateWriteLimit; - double m_bufferRateTimeLimit; - UInt16 m_bufferWriteCount; - double m_bufferRateStart; - bool m_useThread; - EIpcClientType m_clientType; - ArchMutex m_runningMutex; + IpcServer& m_ipcServer; + Buffer m_buffer; + ArchMutex m_bufferMutex; + bool m_sending; + Thread* m_bufferThread; + bool m_running; + ArchCond m_notifyCond; + ArchMutex m_notifyMutex; + bool m_bufferWaiting; + IArchMultithread::ThreadID + m_bufferThreadId; + UInt16 m_bufferMaxSize; + UInt16 m_bufferRateWriteLimit; + double m_bufferRateTimeLimit; + UInt16 m_bufferWriteCount; + double m_bufferRateStart; + bool m_useThread; + EIpcClientType m_clientType; + ArchMutex m_runningMutex; }; diff --git a/src/lib/ipc/IpcMessage.cpp b/src/lib/ipc/IpcMessage.cpp index 7b1901f0..f8162ce1 100644 --- a/src/lib/ipc/IpcMessage.cpp +++ b/src/lib/ipc/IpcMessage.cpp @@ -20,7 +20,7 @@ #include "ipc/Ipc.h" IpcMessage::IpcMessage(UInt8 type) : - m_type(type) + m_type(type) { } @@ -29,8 +29,8 @@ IpcMessage::~IpcMessage() } IpcHelloMessage::IpcHelloMessage(EIpcClientType clientType) : - IpcMessage(kIpcHello), - m_clientType(clientType) + IpcMessage(kIpcHello), + m_clientType(clientType) { } diff --git a/src/lib/ipc/IpcMessage.h b/src/lib/ipc/IpcMessage.h index 5a8f699e..5407c562 100644 --- a/src/lib/ipc/IpcMessage.h +++ b/src/lib/ipc/IpcMessage.h @@ -25,61 +25,61 @@ class IpcMessage : public EventData { public: - virtual ~IpcMessage(); + virtual ~IpcMessage(); - //! Gets the message type ID. - UInt8 type() const { return m_type; } + //! Gets the message type ID. + UInt8 type() const { return m_type; } protected: - IpcMessage(UInt8 type); + IpcMessage(UInt8 type); private: - UInt8 m_type; + UInt8 m_type; }; class IpcHelloMessage : public IpcMessage { public: - IpcHelloMessage(EIpcClientType clientType); - virtual ~IpcHelloMessage(); + IpcHelloMessage(EIpcClientType clientType); + virtual ~IpcHelloMessage(); - //! Gets the message type ID. - EIpcClientType clientType() const { return m_clientType; } + //! Gets the message type ID. + EIpcClientType clientType() const { return m_clientType; } private: - EIpcClientType m_clientType; + EIpcClientType m_clientType; }; class IpcShutdownMessage : public IpcMessage { public: - IpcShutdownMessage(); - virtual ~IpcShutdownMessage(); + IpcShutdownMessage(); + virtual ~IpcShutdownMessage(); }; class IpcLogLineMessage : public IpcMessage { public: - IpcLogLineMessage(const String& logLine); - virtual ~IpcLogLineMessage(); + IpcLogLineMessage(const String& logLine); + virtual ~IpcLogLineMessage(); - //! Gets the log line. - String logLine() const { return m_logLine; } + //! Gets the log line. + String logLine() const { return m_logLine; } private: - String m_logLine; + String m_logLine; }; class IpcCommandMessage : public IpcMessage { public: - IpcCommandMessage(const String& command, bool elevate); - virtual ~IpcCommandMessage(); + IpcCommandMessage(const String& command, bool elevate); + virtual ~IpcCommandMessage(); - //! Gets the command. - String command() const { return m_command; } + //! Gets the command. + String command() const { return m_command; } - //! Gets whether or not the process should be elevated on MS Windows. - bool elevate() const { return m_elevate; } + //! Gets whether or not the process should be elevated on MS Windows. + bool elevate() const { return m_elevate; } private: - String m_command; - bool m_elevate; + String m_command; + bool m_elevate; }; diff --git a/src/lib/ipc/IpcServer.cpp b/src/lib/ipc/IpcServer.cpp index 1104857c..390310ec 100644 --- a/src/lib/ipc/IpcServer.cpp +++ b/src/lib/ipc/IpcServer.cpp @@ -33,155 +33,155 @@ // IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : - m_mock(false), - m_events(events), - m_socketMultiplexer(socketMultiplexer), - m_socket(nullptr), - m_address(NetworkAddress(IPC_HOST, IPC_PORT)) + m_mock(false), + m_events(events), + m_socketMultiplexer(socketMultiplexer), + m_socket(nullptr), + m_address(NetworkAddress(IPC_HOST, IPC_PORT)) { - init(); + init(); } IpcServer::IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port) : - m_mock(false), - m_events(events), - m_socketMultiplexer(socketMultiplexer), - m_address(NetworkAddress(IPC_HOST, port)) + m_mock(false), + m_events(events), + m_socketMultiplexer(socketMultiplexer), + m_address(NetworkAddress(IPC_HOST, port)) { - init(); + init(); } void IpcServer::init() { - m_socket = new TCPListenSocket(m_events, m_socketMultiplexer); + m_socket = new TCPListenSocket(m_events, m_socketMultiplexer); - m_clientsMutex = ARCH->newMutex(); - m_address.resolve(); + m_clientsMutex = ARCH->newMutex(); + m_address.resolve(); - m_events->adoptHandler( - m_events->forIListenSocket().connecting(), m_socket, - new TMethodEventJob( - this, &IpcServer::handleClientConnecting)); + m_events->adoptHandler( + m_events->forIListenSocket().connecting(), m_socket, + new TMethodEventJob( + this, &IpcServer::handleClientConnecting)); } IpcServer::~IpcServer() { - if (m_mock) { - return; - } + if (m_mock) { + return; + } - if (m_socket != nullptr) { - delete m_socket; - } + if (m_socket != nullptr) { + delete m_socket; + } - ARCH->lockMutex(m_clientsMutex); - ClientList::iterator it; - for (it = m_clients.begin(); it != m_clients.end(); it++) { - deleteClient(*it); - } - m_clients.empty(); - ARCH->unlockMutex(m_clientsMutex); - ARCH->closeMutex(m_clientsMutex); - - m_events->removeHandler(m_events->forIListenSocket().connecting(), m_socket); + ARCH->lockMutex(m_clientsMutex); + ClientList::iterator it; + for (it = m_clients.begin(); it != m_clients.end(); it++) { + deleteClient(*it); + } + m_clients.empty(); + ARCH->unlockMutex(m_clientsMutex); + ARCH->closeMutex(m_clientsMutex); + + m_events->removeHandler(m_events->forIListenSocket().connecting(), m_socket); } void IpcServer::listen() { - m_socket->bind(m_address); + m_socket->bind(m_address); } void IpcServer::handleClientConnecting(const Event&, void*) { - synergy::IStream* stream = m_socket->accept(); - if (stream == NULL) { - return; - } + synergy::IStream* stream = m_socket->accept(); + if (stream == NULL) { + return; + } - LOG((CLOG_DEBUG "accepted ipc client connection")); + LOG((CLOG_DEBUG "accepted ipc client connection")); - ARCH->lockMutex(m_clientsMutex); - IpcClientProxy* proxy = new IpcClientProxy(*stream, m_events); - m_clients.push_back(proxy); - ARCH->unlockMutex(m_clientsMutex); + ARCH->lockMutex(m_clientsMutex); + IpcClientProxy* proxy = new IpcClientProxy(*stream, m_events); + m_clients.push_back(proxy); + ARCH->unlockMutex(m_clientsMutex); - m_events->adoptHandler( - m_events->forIpcClientProxy().disconnected(), proxy, - new TMethodEventJob( - this, &IpcServer::handleClientDisconnected)); + m_events->adoptHandler( + m_events->forIpcClientProxy().disconnected(), proxy, + new TMethodEventJob( + this, &IpcServer::handleClientDisconnected)); - m_events->adoptHandler( - m_events->forIpcClientProxy().messageReceived(), proxy, - new TMethodEventJob( - this, &IpcServer::handleMessageReceived)); + m_events->adoptHandler( + m_events->forIpcClientProxy().messageReceived(), proxy, + new TMethodEventJob( + this, &IpcServer::handleMessageReceived)); - m_events->addEvent(Event( - m_events->forIpcServer().clientConnected(), this, proxy, Event::kDontFreeData)); + m_events->addEvent(Event( + m_events->forIpcServer().clientConnected(), this, proxy, Event::kDontFreeData)); } void IpcServer::handleClientDisconnected(const Event& e, void*) { - IpcClientProxy* proxy = static_cast(e.getTarget()); + IpcClientProxy* proxy = static_cast(e.getTarget()); - ArchMutexLock lock(m_clientsMutex); - m_clients.remove(proxy); - deleteClient(proxy); + ArchMutexLock lock(m_clientsMutex); + m_clients.remove(proxy); + deleteClient(proxy); - LOG((CLOG_DEBUG "ipc client proxy removed, connected=%d", m_clients.size())); + LOG((CLOG_DEBUG "ipc client proxy removed, connected=%d", m_clients.size())); } void IpcServer::handleMessageReceived(const Event& e, void*) { - Event event(m_events->forIpcServer().messageReceived(), this); - event.setDataObject(e.getDataObject()); - m_events->addEvent(event); + Event event(m_events->forIpcServer().messageReceived(), this); + event.setDataObject(e.getDataObject()); + m_events->addEvent(event); } void IpcServer::deleteClient(IpcClientProxy* proxy) { - m_events->removeHandler(m_events->forIpcClientProxy().messageReceived(), proxy); - m_events->removeHandler(m_events->forIpcClientProxy().disconnected(), proxy); - delete proxy; + m_events->removeHandler(m_events->forIpcClientProxy().messageReceived(), proxy); + m_events->removeHandler(m_events->forIpcClientProxy().disconnected(), proxy); + delete proxy; } bool IpcServer::hasClients(EIpcClientType clientType) const { - ArchMutexLock lock(m_clientsMutex); + ArchMutexLock lock(m_clientsMutex); - if (m_clients.empty()) { - return false; - } + if (m_clients.empty()) { + return false; + } - ClientList::const_iterator it; - for (it = m_clients.begin(); it != m_clients.end(); it++) { - // at least one client is alive and type matches, there are clients. - IpcClientProxy* p = *it; - if (!p->m_disconnecting && p->m_clientType == clientType) { - return true; - } - } + ClientList::const_iterator it; + for (it = m_clients.begin(); it != m_clients.end(); it++) { + // at least one client is alive and type matches, there are clients. + IpcClientProxy* p = *it; + if (!p->m_disconnecting && p->m_clientType == clientType) { + return true; + } + } - // all clients must be disconnecting, no active clients. - return false; + // all clients must be disconnecting, no active clients. + return false; } void IpcServer::send(const IpcMessage& message, EIpcClientType filterType) { - ArchMutexLock lock(m_clientsMutex); + ArchMutexLock lock(m_clientsMutex); - ClientList::iterator it; - for (it = m_clients.begin(); it != m_clients.end(); it++) { - IpcClientProxy* proxy = *it; - if (proxy->m_clientType == filterType) { - proxy->send(message); - } - } + ClientList::iterator it; + for (it = m_clients.begin(); it != m_clients.end(); it++) { + IpcClientProxy* proxy = *it; + if (proxy->m_clientType == filterType) { + proxy->send(message); + } + } } diff --git a/src/lib/ipc/IpcServer.h b/src/lib/ipc/IpcServer.h index ae88d440..b6477f8a 100644 --- a/src/lib/ipc/IpcServer.h +++ b/src/lib/ipc/IpcServer.h @@ -41,52 +41,52 @@ and allows the daemon and client/server to send log data to the GUI. */ class IpcServer { public: - IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port); - virtual ~IpcServer(); + IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + IpcServer(IEventQueue* events, SocketMultiplexer* socketMultiplexer, int port); + virtual ~IpcServer(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Opens a TCP socket only allowing local connections. - virtual void listen(); + //! Opens a TCP socket only allowing local connections. + virtual void listen(); - //! Send a message to all clients matching the filter type. - virtual void send(const IpcMessage& message, EIpcClientType filterType); + //! Send a message to all clients matching the filter type. + virtual void send(const IpcMessage& message, EIpcClientType filterType); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Returns true when there are clients of the specified type connected. - virtual bool hasClients(EIpcClientType clientType) const; + //! Returns true when there are clients of the specified type connected. + virtual bool hasClients(EIpcClientType clientType) const; - //@} + //@} private: - void init(); - void handleClientConnecting(const Event&, void*); - void handleClientDisconnected(const Event&, void*); - void handleMessageReceived(const Event&, void*); - void deleteClient(IpcClientProxy* proxy); + void init(); + void handleClientConnecting(const Event&, void*); + void handleClientDisconnected(const Event&, void*); + void handleMessageReceived(const Event&, void*); + void deleteClient(IpcClientProxy* proxy); private: - typedef std::list ClientList; - - bool m_mock; - IEventQueue* m_events; - SocketMultiplexer* m_socketMultiplexer; - TCPListenSocket* m_socket; - NetworkAddress m_address; - ClientList m_clients; - ArchMutex m_clientsMutex; + typedef std::list ClientList; + + bool m_mock; + IEventQueue* m_events; + SocketMultiplexer* m_socketMultiplexer; + TCPListenSocket* m_socket; + NetworkAddress m_address; + ClientList m_clients; + ArchMutex m_clientsMutex; #ifdef TEST_ENV public: - IpcServer() : - m_mock(true), - m_events(nullptr), - m_socketMultiplexer(nullptr), - m_socket(nullptr) { } + IpcServer() : + m_mock(true), + m_events(nullptr), + m_socketMultiplexer(nullptr), + m_socket(nullptr) { } #endif }; diff --git a/src/lib/ipc/IpcServerProxy.cpp b/src/lib/ipc/IpcServerProxy.cpp index 39379f52..3cf59f7b 100644 --- a/src/lib/ipc/IpcServerProxy.cpp +++ b/src/lib/ipc/IpcServerProxy.cpp @@ -30,94 +30,94 @@ // IpcServerProxy::IpcServerProxy(synergy::IStream& stream, IEventQueue* events) : - m_stream(stream), - m_events(events) + m_stream(stream), + m_events(events) { - m_events->adoptHandler(m_events->forIStream().inputReady(), - stream.getEventTarget(), - new TMethodEventJob( - this, &IpcServerProxy::handleData)); + m_events->adoptHandler(m_events->forIStream().inputReady(), + stream.getEventTarget(), + new TMethodEventJob( + this, &IpcServerProxy::handleData)); } IpcServerProxy::~IpcServerProxy() { - m_events->removeHandler(m_events->forIStream().inputReady(), - m_stream.getEventTarget()); + m_events->removeHandler(m_events->forIStream().inputReady(), + m_stream.getEventTarget()); } void IpcServerProxy::handleData(const Event&, void*) { - LOG((CLOG_DEBUG "start ipc handle data")); + LOG((CLOG_DEBUG "start ipc handle data")); - UInt8 code[4]; - UInt32 n = m_stream.read(code, 4); - while (n != 0) { + UInt8 code[4]; + UInt32 n = m_stream.read(code, 4); + while (n != 0) { - LOG((CLOG_DEBUG "ipc read: %c%c%c%c", - code[0], code[1], code[2], code[3])); - - IpcMessage* m = nullptr; - if (memcmp(code, kIpcMsgLogLine, 4) == 0) { - m = parseLogLine(); - } - else if (memcmp(code, kIpcMsgShutdown, 4) == 0) { - m = new IpcShutdownMessage(); - } - else { - LOG((CLOG_ERR "invalid ipc message")); - disconnect(); - } - - // don't delete with this event; the data is passed to a new event. - Event e(m_events->forIpcServerProxy().messageReceived(), this, NULL, Event::kDontFreeData); - e.setDataObject(m); - m_events->addEvent(e); + LOG((CLOG_DEBUG "ipc read: %c%c%c%c", + code[0], code[1], code[2], code[3])); + + IpcMessage* m = nullptr; + if (memcmp(code, kIpcMsgLogLine, 4) == 0) { + m = parseLogLine(); + } + else if (memcmp(code, kIpcMsgShutdown, 4) == 0) { + m = new IpcShutdownMessage(); + } + else { + LOG((CLOG_ERR "invalid ipc message")); + disconnect(); + } + + // don't delete with this event; the data is passed to a new event. + Event e(m_events->forIpcServerProxy().messageReceived(), this, NULL, Event::kDontFreeData); + e.setDataObject(m); + m_events->addEvent(e); - n = m_stream.read(code, 4); - } - - LOG((CLOG_DEBUG "finished ipc handle data")); + n = m_stream.read(code, 4); + } + + LOG((CLOG_DEBUG "finished ipc handle data")); } void IpcServerProxy::send(const IpcMessage& message) { - LOG((CLOG_DEBUG4 "ipc write: %d", message.type())); + LOG((CLOG_DEBUG4 "ipc write: %d", message.type())); - switch (message.type()) { - case kIpcHello: { - const IpcHelloMessage& hm = static_cast(message); - ProtocolUtil::writef(&m_stream, kIpcMsgHello, hm.clientType()); - break; - } + switch (message.type()) { + case kIpcHello: { + const IpcHelloMessage& hm = static_cast(message); + ProtocolUtil::writef(&m_stream, kIpcMsgHello, hm.clientType()); + break; + } - case kIpcCommand: { - const IpcCommandMessage& cm = static_cast(message); - const String command = cm.command(); - ProtocolUtil::writef(&m_stream, kIpcMsgCommand, &command); - break; - } + case kIpcCommand: { + const IpcCommandMessage& cm = static_cast(message); + const String command = cm.command(); + ProtocolUtil::writef(&m_stream, kIpcMsgCommand, &command); + break; + } - default: - LOG((CLOG_ERR "ipc message not supported: %d", message.type())); - break; - } + default: + LOG((CLOG_ERR "ipc message not supported: %d", message.type())); + break; + } } IpcLogLineMessage* IpcServerProxy::parseLogLine() { - String logLine; - ProtocolUtil::readf(&m_stream, kIpcMsgLogLine + 4, &logLine); - - // must be deleted by event handler. - return new IpcLogLineMessage(logLine); + String logLine; + ProtocolUtil::readf(&m_stream, kIpcMsgLogLine + 4, &logLine); + + // must be deleted by event handler. + return new IpcLogLineMessage(logLine); } void IpcServerProxy::disconnect() { - LOG((CLOG_DEBUG "ipc disconnect, closing stream")); - m_stream.close(); + LOG((CLOG_DEBUG "ipc disconnect, closing stream")); + m_stream.close(); } diff --git a/src/lib/ipc/IpcServerProxy.h b/src/lib/ipc/IpcServerProxy.h index 7f83dc71..dc9459a9 100644 --- a/src/lib/ipc/IpcServerProxy.h +++ b/src/lib/ipc/IpcServerProxy.h @@ -27,20 +27,20 @@ class IpcLogLineMessage; class IEventQueue; class IpcServerProxy { - friend class IpcClient; + friend class IpcClient; public: - IpcServerProxy(synergy::IStream& stream, IEventQueue* events); - virtual ~IpcServerProxy(); + IpcServerProxy(synergy::IStream& stream, IEventQueue* events); + virtual ~IpcServerProxy(); private: - void send(const IpcMessage& message); + void send(const IpcMessage& message); - void handleData(const Event&, void*); - IpcLogLineMessage* parseLogLine(); - void disconnect(); + void handleData(const Event&, void*); + IpcLogLineMessage* parseLogLine(); + void disconnect(); private: - synergy::IStream& m_stream; - IEventQueue* m_events; + synergy::IStream& m_stream; + IEventQueue* m_events; }; diff --git a/src/lib/mt/CMakeLists.txt b/src/lib/mt/CMakeLists.txt index ebbae546..44113c84 100644 --- a/src/lib/mt/CMakeLists.txt +++ b/src/lib/mt/CMakeLists.txt @@ -18,17 +18,17 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(mt STATIC ${sources}) diff --git a/src/lib/mt/CondVar.cpp b/src/lib/mt/CondVar.cpp index e7e580ab..99ebf267 100644 --- a/src/lib/mt/CondVar.cpp +++ b/src/lib/mt/CondVar.cpp @@ -25,67 +25,67 @@ // CondVarBase::CondVarBase(Mutex* mutex) : - m_mutex(mutex) + m_mutex(mutex) { - assert(m_mutex != NULL); - m_cond = ARCH->newCondVar(); + assert(m_mutex != NULL); + m_cond = ARCH->newCondVar(); } CondVarBase::~CondVarBase() { - ARCH->closeCondVar(m_cond); + ARCH->closeCondVar(m_cond); } void CondVarBase::lock() const { - m_mutex->lock(); + m_mutex->lock(); } void CondVarBase::unlock() const { - m_mutex->unlock(); + m_mutex->unlock(); } void CondVarBase::signal() { - ARCH->signalCondVar(m_cond); + ARCH->signalCondVar(m_cond); } void CondVarBase::broadcast() { - ARCH->broadcastCondVar(m_cond); + ARCH->broadcastCondVar(m_cond); } bool CondVarBase::wait(Stopwatch& timer, double timeout) const { - double remain = timeout-timer.getTime(); - // Some ARCH wait()s return prematurely, retry until really timed out - // In particular, ArchMultithreadPosix::waitCondVar() returns every 100ms - do { - // Always call wait at least once, even if remain is 0, to give - // other thread a chance to grab the mutex to avoid deadlocks on + double remain = timeout-timer.getTime(); + // Some ARCH wait()s return prematurely, retry until really timed out + // In particular, ArchMultithreadPosix::waitCondVar() returns every 100ms + do { + // Always call wait at least once, even if remain is 0, to give + // other thread a chance to grab the mutex to avoid deadlocks on // busy waiting. - if (remain<0.0) remain=0.0; - if (wait(remain)) - return true; - remain = timeout - timer.getTime(); - } while (remain >= 0.0); - return false; + if (remain<0.0) remain=0.0; + if (wait(remain)) + return true; + remain = timeout - timer.getTime(); + } while (remain >= 0.0); + return false; } bool CondVarBase::wait(double timeout) const { - return ARCH->waitCondVar(m_cond, m_mutex->m_mutex, timeout); + return ARCH->waitCondVar(m_cond, m_mutex->m_mutex, timeout); } Mutex* CondVarBase::getMutex() const { - return m_mutex; + return m_mutex; } diff --git a/src/lib/mt/CondVar.h b/src/lib/mt/CondVar.h index 3c7a7f11..8e5f1ec0 100644 --- a/src/lib/mt/CondVar.h +++ b/src/lib/mt/CondVar.h @@ -32,96 +32,96 @@ variable has an associated mutex. */ class CondVarBase { public: - /*! - \c mutex must not be NULL. All condition variables have an - associated mutex. The mutex needn't be unique to one condition - variable. - */ - CondVarBase(Mutex* mutex); - ~CondVarBase(); + /*! + \c mutex must not be NULL. All condition variables have an + associated mutex. The mutex needn't be unique to one condition + variable. + */ + CondVarBase(Mutex* mutex); + ~CondVarBase(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Lock the condition variable's mutex - /*! - Lock the condition variable's mutex. The condition variable should - be locked before reading or writing it. It must be locked for a - call to wait(). Locks are not recursive; locking a locked mutex - will deadlock the thread. - */ - void lock() const; + //! Lock the condition variable's mutex + /*! + Lock the condition variable's mutex. The condition variable should + be locked before reading or writing it. It must be locked for a + call to wait(). Locks are not recursive; locking a locked mutex + will deadlock the thread. + */ + void lock() const; - //! Unlock the condition variable's mutex - void unlock() const; + //! Unlock the condition variable's mutex + void unlock() const; - //! Signal the condition variable - /*! - Wake up one waiting thread, if there are any. Which thread gets - woken is undefined. - */ - void signal(); + //! Signal the condition variable + /*! + Wake up one waiting thread, if there are any. Which thread gets + woken is undefined. + */ + void signal(); - //! Signal the condition variable - /*! - Wake up all waiting threads, if any. - */ - void broadcast(); + //! Signal the condition variable + /*! + Wake up all waiting threads, if any. + */ + void broadcast(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Wait on the condition variable - /*! - Wait on the condition variable. If \c timeout < 0 then wait until - signalled, otherwise up to \c timeout seconds or until signalled, - whichever comes first. Returns true if the object was signalled - during the wait, false otherwise. - - The proper way to wait for a condition is: - \code - cv.lock(); - while (cv-expr) { - cv.wait(); + //! Wait on the condition variable + /*! + Wait on the condition variable. If \c timeout < 0 then wait until + signalled, otherwise up to \c timeout seconds or until signalled, + whichever comes first. Returns true if the object was signalled + during the wait, false otherwise. + + The proper way to wait for a condition is: + \code + cv.lock(); + while (cv-expr) { + cv.wait(); } - cv.unlock(); - \endcode - where \c cv-expr involves the value of \c cv and is false when the - condition is satisfied. + cv.unlock(); + \endcode + where \c cv-expr involves the value of \c cv and is false when the + condition is satisfied. - (cancellation point) - */ - bool wait(double timeout = -1.0) const; + (cancellation point) + */ + bool wait(double timeout = -1.0) const; - //! Wait on the condition variable - /*! - Same as \c wait(double) but use \c timer to compare against \c timeout. - Since clients normally wait on condition variables in a loop, clients - can use this to avoid recalculating \c timeout on each iteration. - Passing a stopwatch with a negative \c timeout is pointless (it will - never time out) but permitted. + //! Wait on the condition variable + /*! + Same as \c wait(double) but use \c timer to compare against \c timeout. + Since clients normally wait on condition variables in a loop, clients + can use this to avoid recalculating \c timeout on each iteration. + Passing a stopwatch with a negative \c timeout is pointless (it will + never time out) but permitted. - (cancellation point) - */ - bool wait(Stopwatch& timer, double timeout) const; + (cancellation point) + */ + bool wait(Stopwatch& timer, double timeout) const; - //! Get the mutex - /*! - Get the mutex passed to the c'tor. - */ - Mutex* getMutex() const; + //! Get the mutex + /*! + Get the mutex passed to the c'tor. + */ + Mutex* getMutex() const; - //@} + //@} private: - // not implemented - CondVarBase(const CondVarBase&); - CondVarBase& operator=(const CondVarBase&); + // not implemented + CondVarBase(const CondVarBase&); + CondVarBase& operator=(const CondVarBase&); private: - Mutex* m_mutex; - ArchCond m_cond; + Mutex* m_mutex; + ArchCond m_cond; }; //! Condition variable @@ -131,72 +131,72 @@ A condition variable with storage for type \c T. template class CondVar : public CondVarBase { public: - //! Initialize using \c value - CondVar(Mutex* mutex, const T& value); - //! Initialize using another condition variable's value - CondVar(const CondVar&); - ~CondVar(); + //! Initialize using \c value + CondVar(Mutex* mutex, const T& value); + //! Initialize using another condition variable's value + CondVar(const CondVar&); + ~CondVar(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Assigns the value of \c cv to this - /*! - Set the variable's value. The condition variable should be locked - before calling this method. - */ - CondVar& operator=(const CondVar& cv); + //! Assigns the value of \c cv to this + /*! + Set the variable's value. The condition variable should be locked + before calling this method. + */ + CondVar& operator=(const CondVar& cv); - //! Assigns \c value to this - /*! - Set the variable's value. The condition variable should be locked - before calling this method. - */ - CondVar& operator=(const T& v); + //! Assigns \c value to this + /*! + Set the variable's value. The condition variable should be locked + before calling this method. + */ + CondVar& operator=(const T& v); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get the variable's value - /*! - Get the variable's value. The condition variable should be locked - before calling this method. - */ - operator const volatile T&() const; + //! Get the variable's value + /*! + Get the variable's value. The condition variable should be locked + before calling this method. + */ + operator const volatile T&() const; - //@} + //@} private: - volatile T m_data; + volatile T m_data; }; template inline CondVar::CondVar( - Mutex* mutex, - const T& data) : - CondVarBase(mutex), - m_data(data) + Mutex* mutex, + const T& data) : + CondVarBase(mutex), + m_data(data) { - // do nothing + // do nothing } template inline CondVar::CondVar( - const CondVar& cv) : - CondVarBase(cv.getMutex()), - m_data(cv.m_data) + const CondVar& cv) : + CondVarBase(cv.getMutex()), + m_data(cv.m_data) { - // do nothing + // do nothing } template inline CondVar::~CondVar() { - // do nothing + // do nothing } template @@ -204,8 +204,8 @@ inline CondVar& CondVar::operator=(const CondVar& cv) { - m_data = cv.m_data; - return *this; + m_data = cv.m_data; + return *this; } template @@ -213,13 +213,13 @@ inline CondVar& CondVar::operator=(const T& data) { - m_data = data; - return *this; + m_data = data; + return *this; } template inline CondVar::operator const volatile T&() const { - return m_data; + return m_data; } diff --git a/src/lib/mt/Lock.cpp b/src/lib/mt/Lock.cpp index 752a1bcf..a9970ebe 100644 --- a/src/lib/mt/Lock.cpp +++ b/src/lib/mt/Lock.cpp @@ -25,18 +25,18 @@ // Lock::Lock(const Mutex* mutex) : - m_mutex(mutex) + m_mutex(mutex) { - m_mutex->lock(); + m_mutex->lock(); } Lock::Lock(const CondVarBase* cv) : - m_mutex(cv->getMutex()) + m_mutex(cv->getMutex()) { - m_mutex->lock(); + m_mutex->lock(); } Lock::~Lock() { - m_mutex->unlock(); + m_mutex->unlock(); } diff --git a/src/lib/mt/Lock.h b/src/lib/mt/Lock.h index 4b8117a0..1c07d0ed 100644 --- a/src/lib/mt/Lock.h +++ b/src/lib/mt/Lock.h @@ -32,18 +32,18 @@ exits (including by unwinding due to an exception). */ class Lock { public: - //! Lock the mutex \c mutex - Lock(const Mutex* mutex); - //! Lock the condition variable \c cv - Lock(const CondVarBase* cv); - //! Unlock the mutex or condition variable - ~Lock(); + //! Lock the mutex \c mutex + Lock(const Mutex* mutex); + //! Lock the condition variable \c cv + Lock(const CondVarBase* cv); + //! Unlock the mutex or condition variable + ~Lock(); private: - // not implemented - Lock(const Lock&); - Lock& operator=(const Lock&); + // not implemented + Lock(const Lock&); + Lock& operator=(const Lock&); private: - const Mutex* m_mutex; + const Mutex* m_mutex; }; diff --git a/src/lib/mt/Mutex.cpp b/src/lib/mt/Mutex.cpp index 224ace16..beed6aa3 100644 --- a/src/lib/mt/Mutex.cpp +++ b/src/lib/mt/Mutex.cpp @@ -26,33 +26,33 @@ Mutex::Mutex() { - m_mutex = ARCH->newMutex(); + m_mutex = ARCH->newMutex(); } Mutex::Mutex(const Mutex&) { - m_mutex = ARCH->newMutex(); + m_mutex = ARCH->newMutex(); } Mutex::~Mutex() { - ARCH->closeMutex(m_mutex); + ARCH->closeMutex(m_mutex); } Mutex& Mutex::operator=(const Mutex&) { - return *this; + return *this; } void Mutex::lock() const { - ARCH->lockMutex(m_mutex); + ARCH->lockMutex(m_mutex); } void Mutex::unlock() const { - ARCH->unlockMutex(m_mutex); + ARCH->unlockMutex(m_mutex); } diff --git a/src/lib/mt/Mutex.h b/src/lib/mt/Mutex.h index 6d385bbf..b8ef5a00 100644 --- a/src/lib/mt/Mutex.h +++ b/src/lib/mt/Mutex.h @@ -31,49 +31,49 @@ it tries it will deadlock itself. */ class Mutex { public: - Mutex(); - //! Equivalent to default c'tor - /*! - Copy c'tor doesn't copy anything. It just makes it possible to - copy objects that contain a mutex. - */ - Mutex(const Mutex&); - ~Mutex(); + Mutex(); + //! Equivalent to default c'tor + /*! + Copy c'tor doesn't copy anything. It just makes it possible to + copy objects that contain a mutex. + */ + Mutex(const Mutex&); + ~Mutex(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Does nothing - /*! - This does nothing. It just makes it possible to assign objects - that contain a mutex. - */ - Mutex& operator=(const Mutex&); + //! Does nothing + /*! + This does nothing. It just makes it possible to assign objects + that contain a mutex. + */ + Mutex& operator=(const Mutex&); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Lock the mutex - /*! - Locks the mutex, which must not have been previously locked by the - calling thread. This blocks if the mutex is already locked by another - thread. + //! Lock the mutex + /*! + Locks the mutex, which must not have been previously locked by the + calling thread. This blocks if the mutex is already locked by another + thread. - (cancellation point) - */ - void lock() const; + (cancellation point) + */ + void lock() const; - //! Unlock the mutex - /*! - Unlocks the mutex, which must have been previously locked by the - calling thread. - */ - void unlock() const; + //! Unlock the mutex + /*! + Unlocks the mutex, which must have been previously locked by the + calling thread. + */ + void unlock() const; - //@} + //@} private: - friend class CondVarBase; - ArchMutex m_mutex; + friend class CondVarBase; + ArchMutex m_mutex; }; diff --git a/src/lib/mt/Thread.cpp b/src/lib/mt/Thread.cpp index 752aace8..9016906c 100644 --- a/src/lib/mt/Thread.cpp +++ b/src/lib/mt/Thread.cpp @@ -30,158 +30,158 @@ Thread::Thread(IJob* job) { - m_thread = ARCH->newThread(&Thread::threadFunc, job); - if (m_thread == NULL) { - // couldn't create thread - delete job; - throw XMTThreadUnavailable(); - } + m_thread = ARCH->newThread(&Thread::threadFunc, job); + if (m_thread == NULL) { + // couldn't create thread + delete job; + throw XMTThreadUnavailable(); + } } Thread::Thread(const Thread& thread) { - m_thread = ARCH->copyThread(thread.m_thread); + m_thread = ARCH->copyThread(thread.m_thread); } Thread::Thread(ArchThread adoptedThread) { - m_thread = adoptedThread; + m_thread = adoptedThread; } Thread::~Thread() { - ARCH->closeThread(m_thread); + ARCH->closeThread(m_thread); } Thread& Thread::operator=(const Thread& thread) { - // copy given thread and release ours - ArchThread copy = ARCH->copyThread(thread.m_thread); - ARCH->closeThread(m_thread); + // copy given thread and release ours + ArchThread copy = ARCH->copyThread(thread.m_thread); + ARCH->closeThread(m_thread); - // cut over - m_thread = copy; + // cut over + m_thread = copy; - return *this; + return *this; } void Thread::exit(void* result) { - throw XThreadExit(result); + throw XThreadExit(result); } void Thread::cancel() { - ARCH->cancelThread(m_thread); + ARCH->cancelThread(m_thread); } void Thread::setPriority(int n) { - ARCH->setPriorityOfThread(m_thread, n); + ARCH->setPriorityOfThread(m_thread, n); } void Thread::unblockPollSocket() { - ARCH->unblockPollSocket(m_thread); + ARCH->unblockPollSocket(m_thread); } Thread Thread::getCurrentThread() { - return Thread(ARCH->newCurrentThread()); + return Thread(ARCH->newCurrentThread()); } void Thread::testCancel() { - ARCH->testCancelThread(); + ARCH->testCancelThread(); } bool Thread::wait(double timeout) const { - return ARCH->wait(m_thread, timeout); + return ARCH->wait(m_thread, timeout); } void* Thread::getResult() const { - if (wait()) - return ARCH->getResultOfThread(m_thread); - else - return NULL; + if (wait()) + return ARCH->getResultOfThread(m_thread); + else + return NULL; } IArchMultithread::ThreadID Thread::getID() const { - return ARCH->getIDOfThread(m_thread); + return ARCH->getIDOfThread(m_thread); } bool Thread::operator==(const Thread& thread) const { - return ARCH->isSameThread(m_thread, thread.m_thread); + return ARCH->isSameThread(m_thread, thread.m_thread); } bool Thread::operator!=(const Thread& thread) const { - return !ARCH->isSameThread(m_thread, thread.m_thread); + return !ARCH->isSameThread(m_thread, thread.m_thread); } void* Thread::threadFunc(void* vjob) { - // get this thread's id for logging - IArchMultithread::ThreadID id; - { - ArchThread thread = ARCH->newCurrentThread(); - id = ARCH->getIDOfThread(thread); - ARCH->closeThread(thread); - } + // get this thread's id for logging + IArchMultithread::ThreadID id; + { + ArchThread thread = ARCH->newCurrentThread(); + id = ARCH->getIDOfThread(thread); + ARCH->closeThread(thread); + } - // get job - IJob* job = static_cast(vjob); + // get job + IJob* job = static_cast(vjob); - // run job - void* result = NULL; - try { - // go - LOG((CLOG_DEBUG1 "thread 0x%08x entry", id)); - job->run(); - LOG((CLOG_DEBUG1 "thread 0x%08x exit", id)); - } - catch (XThreadCancel&) { - // client called cancel() - LOG((CLOG_DEBUG1 "caught cancel on thread 0x%08x", id)); - delete job; - throw; - } - catch (XThreadExit& e) { - // client called exit() - result = e.m_result; - LOG((CLOG_DEBUG1 "caught exit on thread 0x%08x, result %p", id, result)); - } - catch (XBase& e) { - LOG((CLOG_ERR "exception on thread 0x%08x: %s", id, e.what())); - delete job; - throw; - } - catch (...) { - LOG((CLOG_ERR "exception on thread 0x%08x: ", id)); - delete job; - throw; - } + // run job + void* result = NULL; + try { + // go + LOG((CLOG_DEBUG1 "thread 0x%08x entry", id)); + job->run(); + LOG((CLOG_DEBUG1 "thread 0x%08x exit", id)); + } + catch (XThreadCancel&) { + // client called cancel() + LOG((CLOG_DEBUG1 "caught cancel on thread 0x%08x", id)); + delete job; + throw; + } + catch (XThreadExit& e) { + // client called exit() + result = e.m_result; + LOG((CLOG_DEBUG1 "caught exit on thread 0x%08x, result %p", id, result)); + } + catch (XBase& e) { + LOG((CLOG_ERR "exception on thread 0x%08x: %s", id, e.what())); + delete job; + throw; + } + catch (...) { + LOG((CLOG_ERR "exception on thread 0x%08x: ", id)); + delete job; + throw; + } - // done with job - delete job; + // done with job + delete job; - // return exit result - return result; + // return exit result + return result; } diff --git a/src/lib/mt/Thread.h b/src/lib/mt/Thread.h index dfcdfada..e3320230 100644 --- a/src/lib/mt/Thread.h +++ b/src/lib/mt/Thread.h @@ -42,169 +42,169 @@ documentation. // note -- do not derive from this class class Thread { public: - //! Run \c adoptedJob in a new thread - /*! - Create and start a new thread executing the \c adoptedJob. The - new thread takes ownership of \c adoptedJob and will delete it. - */ - Thread(IJob* adoptedJob); + //! Run \c adoptedJob in a new thread + /*! + Create and start a new thread executing the \c adoptedJob. The + new thread takes ownership of \c adoptedJob and will delete it. + */ + Thread(IJob* adoptedJob); - //! Duplicate a thread handle - /*! - Make a new thread object that refers to an existing thread. - This does \b not start a new thread. - */ - Thread(const Thread&); + //! Duplicate a thread handle + /*! + Make a new thread object that refers to an existing thread. + This does \b not start a new thread. + */ + Thread(const Thread&); - //! Release a thread handle - /*! - Release a thread handle. This does not terminate the thread. A thread - will keep running until the job completes or calls exit() or allows - itself to be cancelled. - */ - ~Thread(); + //! Release a thread handle + /*! + Release a thread handle. This does not terminate the thread. A thread + will keep running until the job completes or calls exit() or allows + itself to be cancelled. + */ + ~Thread(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Assign thread handle - /*! - Assign a thread handle. This has no effect on the threads, it simply - makes this thread object refer to another thread. It does \b not - start a new thread. - */ - Thread& operator=(const Thread&); + //! Assign thread handle + /*! + Assign a thread handle. This has no effect on the threads, it simply + makes this thread object refer to another thread. It does \b not + start a new thread. + */ + Thread& operator=(const Thread&); - //! Terminate the calling thread - /*! - Terminate the calling thread. This function does not return but - the stack is unwound and automatic objects are destroyed, as if - exit() threw an exception (which is, in fact, what it does). The - argument is saved as the result returned by getResult(). If you - have \c catch(...) blocks then you should add the following before - each to avoid catching the exit: - \code - catch(ThreadExit&) { throw; } - \endcode - or add the \c RETHROW_XTHREAD macro to the \c catch(...) block. - */ - static void exit(void*); + //! Terminate the calling thread + /*! + Terminate the calling thread. This function does not return but + the stack is unwound and automatic objects are destroyed, as if + exit() threw an exception (which is, in fact, what it does). The + argument is saved as the result returned by getResult(). If you + have \c catch(...) blocks then you should add the following before + each to avoid catching the exit: + \code + catch(ThreadExit&) { throw; } + \endcode + or add the \c RETHROW_XTHREAD macro to the \c catch(...) block. + */ + static void exit(void*); - //! Cancel thread - /*! - Cancel the thread. cancel() never waits for the thread to - terminate; it just posts the cancel and returns. A thread will - terminate when it enters a cancellation point with cancellation - enabled. If cancellation is disabled then the cancel is - remembered but not acted on until the first call to a - cancellation point after cancellation is enabled. - - A cancellation point is a function that can act on cancellation. - A cancellation point does not return if there's a cancel pending. - Instead, it unwinds the stack and destroys automatic objects, as - if cancel() threw an exception (which is, in fact, what it does). - Threads must take care to unlock and clean up any resources they - may have, especially mutexes. They can \c catch(XThreadCancel) to - do that then rethrow the exception or they can let it happen - automatically by doing clean up in the d'tors of automatic - objects (like Lock). Clients are strongly encouraged to do the latter. - During cancellation, further cancel() calls are ignored (i.e. - a thread cannot be interrupted by a cancel during cancellation). - - Clients that \c catch(XThreadCancel) must always rethrow the - exception. Clients that \c catch(...) must either rethrow the - exception or include a \c catch(XThreadCancel) handler that - rethrows. The \c RETHROW_XTHREAD macro may be useful for that. - */ - void cancel(); + //! Cancel thread + /*! + Cancel the thread. cancel() never waits for the thread to + terminate; it just posts the cancel and returns. A thread will + terminate when it enters a cancellation point with cancellation + enabled. If cancellation is disabled then the cancel is + remembered but not acted on until the first call to a + cancellation point after cancellation is enabled. + + A cancellation point is a function that can act on cancellation. + A cancellation point does not return if there's a cancel pending. + Instead, it unwinds the stack and destroys automatic objects, as + if cancel() threw an exception (which is, in fact, what it does). + Threads must take care to unlock and clean up any resources they + may have, especially mutexes. They can \c catch(XThreadCancel) to + do that then rethrow the exception or they can let it happen + automatically by doing clean up in the d'tors of automatic + objects (like Lock). Clients are strongly encouraged to do the latter. + During cancellation, further cancel() calls are ignored (i.e. + a thread cannot be interrupted by a cancel during cancellation). + + Clients that \c catch(XThreadCancel) must always rethrow the + exception. Clients that \c catch(...) must either rethrow the + exception or include a \c catch(XThreadCancel) handler that + rethrows. The \c RETHROW_XTHREAD macro may be useful for that. + */ + void cancel(); - //! Change thread priority - /*! - Change the priority of the thread. Normal priority is 0, 1 is - the next lower, etc. -1 is the next higher, etc. but boosting - the priority may not be permitted and will be silenty ignored. - */ - void setPriority(int n); + //! Change thread priority + /*! + Change the priority of the thread. Normal priority is 0, 1 is + the next lower, etc. -1 is the next higher, etc. but boosting + the priority may not be permitted and will be silenty ignored. + */ + void setPriority(int n); - //! Force pollSocket() to return - /*! - Forces a currently blocked pollSocket() in the thread to return - immediately. - */ - void unblockPollSocket(); + //! Force pollSocket() to return + /*! + Forces a currently blocked pollSocket() in the thread to return + immediately. + */ + void unblockPollSocket(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get current thread's handle - /*! - Return a Thread object representing the calling thread. - */ - static Thread getCurrentThread(); + //! Get current thread's handle + /*! + Return a Thread object representing the calling thread. + */ + static Thread getCurrentThread(); - //! Test for cancellation - /*! - testCancel() does nothing but is a cancellation point. Call - this to make a function itself a cancellation point. If the - thread was cancelled and cancellation is enabled this will - cause the thread to unwind the stack and terminate. + //! Test for cancellation + /*! + testCancel() does nothing but is a cancellation point. Call + this to make a function itself a cancellation point. If the + thread was cancelled and cancellation is enabled this will + cause the thread to unwind the stack and terminate. - (cancellation point) - */ - static void testCancel(); + (cancellation point) + */ + static void testCancel(); - //! Wait for thread to terminate - /*! - Waits for the thread to terminate (by exit() or cancel() or - by returning from the thread job) for up to \c timeout seconds, - returning true if the thread terminated and false otherwise. - This returns immediately with false if called by a thread on - itself and immediately with true if the thread has already - terminated. This will wait forever if \c timeout < 0.0. + //! Wait for thread to terminate + /*! + Waits for the thread to terminate (by exit() or cancel() or + by returning from the thread job) for up to \c timeout seconds, + returning true if the thread terminated and false otherwise. + This returns immediately with false if called by a thread on + itself and immediately with true if the thread has already + terminated. This will wait forever if \c timeout < 0.0. - (cancellation point) - */ - bool wait(double timeout = -1.0) const; + (cancellation point) + */ + bool wait(double timeout = -1.0) const; - //! Get the exit result - /*! - Returns the exit result. This does an implicit wait(). It returns - NULL immediately if called by a thread on itself or on a thread that - was cancelled. + //! Get the exit result + /*! + Returns the exit result. This does an implicit wait(). It returns + NULL immediately if called by a thread on itself or on a thread that + was cancelled. - (cancellation point) - */ - void* getResult() const; + (cancellation point) + */ + void* getResult() const; - //! Get the thread id - /*! - Returns an integer id for this thread. This id must not be used to - check if two Thread objects refer to the same thread. Use - operator==() for that. - */ - IArchMultithread::ThreadID - getID() const; + //! Get the thread id + /*! + Returns an integer id for this thread. This id must not be used to + check if two Thread objects refer to the same thread. Use + operator==() for that. + */ + IArchMultithread::ThreadID + getID() const; - //! Compare thread handles - /*! - Returns true if two Thread objects refer to the same thread. - */ - bool operator==(const Thread&) const; + //! Compare thread handles + /*! + Returns true if two Thread objects refer to the same thread. + */ + bool operator==(const Thread&) const; - //! Compare thread handles - /*! - Returns true if two Thread objects do not refer to the same thread. - */ - bool operator!=(const Thread&) const; + //! Compare thread handles + /*! + Returns true if two Thread objects do not refer to the same thread. + */ + bool operator!=(const Thread&) const; - //@} + //@} private: - Thread(ArchThread); + Thread(ArchThread); - static void* threadFunc(void*); + static void* threadFunc(void*); private: - ArchThread m_thread; + ArchThread m_thread; }; diff --git a/src/lib/mt/XMT.cpp b/src/lib/mt/XMT.cpp index bc825afb..ff7d8751 100644 --- a/src/lib/mt/XMT.cpp +++ b/src/lib/mt/XMT.cpp @@ -25,5 +25,5 @@ String XMTThreadUnavailable::getWhat() const throw() { - return format("XMTThreadUnavailable", "cannot create thread"); + return format("XMTThreadUnavailable", "cannot create thread"); } diff --git a/src/lib/mt/XThread.h b/src/lib/mt/XThread.h index f2649f6a..bc502851 100644 --- a/src/lib/mt/XThread.h +++ b/src/lib/mt/XThread.h @@ -28,10 +28,10 @@ XThreadExit, XThread, or ...). */ class XThreadExit : public XThread { public: - //! \c result is the result of the thread - XThreadExit(void* result) : m_result(result) { } - ~XThreadExit() { } + //! \c result is the result of the thread + XThreadExit(void* result) : m_result(result) { } + ~XThreadExit() { } public: - void* m_result; + void* m_result; }; diff --git a/src/lib/net/CMakeLists.txt b/src/lib/net/CMakeLists.txt index 62ebe5c4..769b060c 100644 --- a/src/lib/net/CMakeLists.txt +++ b/src/lib/net/CMakeLists.txt @@ -18,22 +18,22 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ${OPENSSL_INCLUDE} + ../ + ${OPENSSL_INCLUDE} ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(net STATIC ${sources}) if (UNIX) - target_link_libraries(net mt io ${OPENSSL_LIBS}) + target_link_libraries(net mt io ${OPENSSL_LIBS}) endif() diff --git a/src/lib/net/IDataSocket.cpp b/src/lib/net/IDataSocket.cpp index 8baf1f82..4d4d8944 100644 --- a/src/lib/net/IDataSocket.cpp +++ b/src/lib/net/IDataSocket.cpp @@ -26,14 +26,14 @@ void IDataSocket::close() { - // this is here to work around a VC++6 bug. see the header file. - assert(0 && "bad call"); + // this is here to work around a VC++6 bug. see the header file. + assert(0 && "bad call"); } void* IDataSocket::getEventTarget() const { - // this is here to work around a VC++6 bug. see the header file. - assert(0 && "bad call"); - return NULL; + // this is here to work around a VC++6 bug. see the header file. + assert(0 && "bad call"); + return NULL; } diff --git a/src/lib/net/IDataSocket.h b/src/lib/net/IDataSocket.h index 1044aa37..a58c4df6 100644 --- a/src/lib/net/IDataSocket.h +++ b/src/lib/net/IDataSocket.h @@ -30,44 +30,44 @@ represent a full-duplex data stream. */ class IDataSocket : public ISocket, public synergy::IStream { public: - class ConnectionFailedInfo { - public: - ConnectionFailedInfo(const char* what) : m_what(what) { } - String m_what; - }; + class ConnectionFailedInfo { + public: + ConnectionFailedInfo(const char* what) : m_what(what) { } + String m_what; + }; - IDataSocket(IEventQueue* events) { } + IDataSocket(IEventQueue* events) { } - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Connect socket - /*! - Attempt to connect to a remote endpoint. This returns immediately - and sends a connected event when successful or a connection failed - event when it fails. The stream acts as if shutdown for input and - output until the stream connects. - */ - virtual void connect(const NetworkAddress&) = 0; + //! Connect socket + /*! + Attempt to connect to a remote endpoint. This returns immediately + and sends a connected event when successful or a connection failed + event when it fails. The stream acts as if shutdown for input and + output until the stream connects. + */ + virtual void connect(const NetworkAddress&) = 0; - //@} + //@} - // ISocket overrides - // close() and getEventTarget() aren't pure to work around a bug - // in VC++6. it claims the methods are unused locals and warns - // that it's removing them. it's presumably tickled by inheriting - // methods with identical signatures from both superclasses. - virtual void bind(const NetworkAddress&) = 0; - virtual void close(); - virtual void* getEventTarget() const; + // ISocket overrides + // close() and getEventTarget() aren't pure to work around a bug + // in VC++6. it claims the methods are unused locals and warns + // that it's removing them. it's presumably tickled by inheriting + // methods with identical signatures from both superclasses. + virtual void bind(const NetworkAddress&) = 0; + virtual void close(); + virtual void* getEventTarget() const; - // IStream overrides - virtual UInt32 read(void* buffer, UInt32 n) = 0; - virtual void write(const void* buffer, UInt32 n) = 0; - virtual void flush() = 0; - virtual void shutdownInput() = 0; - virtual void shutdownOutput() = 0; - virtual bool isReady() const = 0; - virtual bool isFatal() const = 0; - virtual UInt32 getSize() const = 0; + // IStream overrides + virtual UInt32 read(void* buffer, UInt32 n) = 0; + virtual void write(const void* buffer, UInt32 n) = 0; + virtual void flush() = 0; + virtual void shutdownInput() = 0; + virtual void shutdownOutput() = 0; + virtual bool isReady() const = 0; + virtual bool isFatal() const = 0; + virtual UInt32 getSize() const = 0; }; diff --git a/src/lib/net/IListenSocket.h b/src/lib/net/IListenSocket.h index 2cd6fb1b..cbf1d252 100644 --- a/src/lib/net/IListenSocket.h +++ b/src/lib/net/IListenSocket.h @@ -30,22 +30,22 @@ listen for incoming connections. */ class IListenSocket : public ISocket { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Accept connection - /*! - Accept a connection, returning a socket representing the full-duplex - data stream. Returns NULL if no socket is waiting to be accepted. - This is only valid after a call to \c bind(). - */ - virtual IDataSocket* - accept() = 0; - - //@} + //! Accept connection + /*! + Accept a connection, returning a socket representing the full-duplex + data stream. Returns NULL if no socket is waiting to be accepted. + This is only valid after a call to \c bind(). + */ + virtual IDataSocket* + accept() = 0; + + //@} - // ISocket overrides - virtual void bind(const NetworkAddress&) = 0; - virtual void close() = 0; - virtual void* getEventTarget() const = 0; + // ISocket overrides + virtual void bind(const NetworkAddress&) = 0; + virtual void close() = 0; + virtual void* getEventTarget() const = 0; }; diff --git a/src/lib/net/ISocket.h b/src/lib/net/ISocket.h index efa19171..2d5d6311 100644 --- a/src/lib/net/ISocket.h +++ b/src/lib/net/ISocket.h @@ -31,30 +31,30 @@ Generated events use \c this as the target. */ class ISocket : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Bind socket to address - /*! - Binds the socket to a particular address. - */ - virtual void bind(const NetworkAddress&) = 0; + //! Bind socket to address + /*! + Binds the socket to a particular address. + */ + virtual void bind(const NetworkAddress&) = 0; - //! Close socket - /*! - Closes the socket. This should flush the output stream. - */ - virtual void close() = 0; + //! Close socket + /*! + Closes the socket. This should flush the output stream. + */ + virtual void close() = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get event target - /*! - Returns the event target for events generated by this socket. - */ - virtual void* getEventTarget() const = 0; + //! Get event target + /*! + Returns the event target for events generated by this socket. + */ + virtual void* getEventTarget() const = 0; - //@} + //@} }; diff --git a/src/lib/net/ISocketFactory.h b/src/lib/net/ISocketFactory.h index 9820536f..628535db 100644 --- a/src/lib/net/ISocketFactory.h +++ b/src/lib/net/ISocketFactory.h @@ -30,14 +30,14 @@ create sockets. */ class ISocketFactory : public IInterface { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Create data socket - virtual IDataSocket* create(bool secure) const = 0; + //! Create data socket + virtual IDataSocket* create(bool secure) const = 0; - //! Create listen socket - virtual IListenSocket* createListen(bool secure) const = 0; + //! Create listen socket + virtual IListenSocket* createListen(bool secure) const = 0; - //@} + //@} }; diff --git a/src/lib/net/ISocketMultiplexerJob.h b/src/lib/net/ISocketMultiplexerJob.h index ba7949aa..cc1d0d93 100644 --- a/src/lib/net/ISocketMultiplexerJob.h +++ b/src/lib/net/ISocketMultiplexerJob.h @@ -27,50 +27,50 @@ A socket multiplexer job handles events on a socket. */ class ISocketMultiplexerJob : public IInterface { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Handle socket event - /*! - Called by a socket multiplexer when the socket becomes readable, - writable, or has an error. It should return itself if the same - job can continue to service events, a new job if the socket must - be serviced differently, or NULL if the socket should no longer - be serviced. The socket is readable if \p readable is true, - writable if \p writable is true, and in error if \p error is - true. + //! Handle socket event + /*! + Called by a socket multiplexer when the socket becomes readable, + writable, or has an error. It should return itself if the same + job can continue to service events, a new job if the socket must + be serviced differently, or NULL if the socket should no longer + be serviced. The socket is readable if \p readable is true, + writable if \p writable is true, and in error if \p error is + true. - This call must not attempt to directly change the job for this - socket by calling \c addSocket() or \c removeSocket() on the - multiplexer. It must instead return the new job. It can, - however, add or remove jobs for other sockets. - */ - virtual ISocketMultiplexerJob* - run(bool readable, bool writable, bool error) = 0; + This call must not attempt to directly change the job for this + socket by calling \c addSocket() or \c removeSocket() on the + multiplexer. It must instead return the new job. It can, + however, add or remove jobs for other sockets. + */ + virtual ISocketMultiplexerJob* + run(bool readable, bool writable, bool error) = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get the socket - /*! - Return the socket to multiplex - */ - virtual ArchSocket getSocket() const = 0; + //! Get the socket + /*! + Return the socket to multiplex + */ + virtual ArchSocket getSocket() const = 0; - //! Check for interest in readability - /*! - Return true if the job is interested in being run if the socket - becomes readable. - */ - virtual bool isReadable() const = 0; + //! Check for interest in readability + /*! + Return true if the job is interested in being run if the socket + becomes readable. + */ + virtual bool isReadable() const = 0; - //! Check for interest in writability - /*! - Return true if the job is interested in being run if the socket - becomes writable. - */ - virtual bool isWritable() const = 0; + //! Check for interest in writability + /*! + Return true if the job is interested in being run if the socket + becomes writable. + */ + virtual bool isWritable() const = 0; - //@} + //@} }; diff --git a/src/lib/net/NetworkAddress.cpp b/src/lib/net/NetworkAddress.cpp index da864a4f..c0df9805 100644 --- a/src/lib/net/NetworkAddress.cpp +++ b/src/lib/net/NetworkAddress.cpp @@ -31,184 +31,184 @@ // name re-resolution adapted from a patch by Brent Priddy. NetworkAddress::NetworkAddress() : - m_address(NULL), - m_hostname(), - m_port(0) + m_address(NULL), + m_hostname(), + m_port(0) { - // note -- make no calls to Network socket interface here; - // we're often called prior to Network::init(). + // note -- make no calls to Network socket interface here; + // we're often called prior to Network::init(). } NetworkAddress::NetworkAddress(int port) : - m_address(NULL), - m_hostname(), - m_port(port) + m_address(NULL), + m_hostname(), + m_port(port) { - checkPort(); - m_address = ARCH->newAnyAddr(IArchNetwork::kINET); - ARCH->setAddrPort(m_address, m_port); + checkPort(); + m_address = ARCH->newAnyAddr(IArchNetwork::kINET); + ARCH->setAddrPort(m_address, m_port); } NetworkAddress::NetworkAddress(const NetworkAddress& addr) : - m_address(addr.m_address != NULL ? ARCH->copyAddr(addr.m_address) : NULL), - m_hostname(addr.m_hostname), - m_port(addr.m_port) + m_address(addr.m_address != NULL ? ARCH->copyAddr(addr.m_address) : NULL), + m_hostname(addr.m_hostname), + m_port(addr.m_port) { - // do nothing + // do nothing } NetworkAddress::NetworkAddress(const String& hostname, int port) : - m_address(NULL), - m_hostname(hostname), - m_port(port) + m_address(NULL), + m_hostname(hostname), + m_port(port) { - // check for port suffix - String::size_type i = m_hostname.rfind(':'); - if (i != String::npos && i + 1 < m_hostname.size()) { - // found a colon. see if it looks like an IPv6 address. - bool colonNotation = false; - bool dotNotation = false; - bool doubleColon = false; - for (String::size_type j = 0; j < i; ++j) { - if (m_hostname[j] == ':') { - colonNotation = true; - dotNotation = false; - if (m_hostname[j + 1] == ':') { - doubleColon = true; - } - } - else if (m_hostname[j] == '.' && colonNotation) { - dotNotation = true; - } - } + // check for port suffix + String::size_type i = m_hostname.rfind(':'); + if (i != String::npos && i + 1 < m_hostname.size()) { + // found a colon. see if it looks like an IPv6 address. + bool colonNotation = false; + bool dotNotation = false; + bool doubleColon = false; + for (String::size_type j = 0; j < i; ++j) { + if (m_hostname[j] == ':') { + colonNotation = true; + dotNotation = false; + if (m_hostname[j + 1] == ':') { + doubleColon = true; + } + } + else if (m_hostname[j] == '.' && colonNotation) { + dotNotation = true; + } + } - // port suffix is ambiguous with IPv6 notation if there's - // a double colon and the end of the address is not in dot - // notation. in that case we assume it's not a port suffix. - // the user can replace the double colon with zeros to - // disambiguate. - if ((!doubleColon || dotNotation) || !colonNotation) { - // parse port from hostname - char* end; - const char* chostname = m_hostname.c_str(); - long suffixPort = strtol(chostname + i + 1, &end, 10); - if (end == chostname + i + 1 || *end != '\0') { - throw XSocketAddress(XSocketAddress::kBadPort, - m_hostname, m_port); - } + // port suffix is ambiguous with IPv6 notation if there's + // a double colon and the end of the address is not in dot + // notation. in that case we assume it's not a port suffix. + // the user can replace the double colon with zeros to + // disambiguate. + if ((!doubleColon || dotNotation) || !colonNotation) { + // parse port from hostname + char* end; + const char* chostname = m_hostname.c_str(); + long suffixPort = strtol(chostname + i + 1, &end, 10); + if (end == chostname + i + 1 || *end != '\0') { + throw XSocketAddress(XSocketAddress::kBadPort, + m_hostname, m_port); + } - // trim port from hostname - m_hostname.erase(i); + // trim port from hostname + m_hostname.erase(i); - // save port - m_port = static_cast(suffixPort); - } - } + // save port + m_port = static_cast(suffixPort); + } + } - // check port number - checkPort(); + // check port number + checkPort(); } NetworkAddress::~NetworkAddress() { - if (m_address != NULL) { - ARCH->closeAddr(m_address); - } + if (m_address != NULL) { + ARCH->closeAddr(m_address); + } } NetworkAddress& NetworkAddress::operator=(const NetworkAddress& addr) { - ArchNetAddress newAddr = NULL; - if (addr.m_address != NULL) { - newAddr = ARCH->copyAddr(addr.m_address); - } - if (m_address != NULL) { - ARCH->closeAddr(m_address); - } - m_address = newAddr; - m_hostname = addr.m_hostname; - m_port = addr.m_port; - return *this; + ArchNetAddress newAddr = NULL; + if (addr.m_address != NULL) { + newAddr = ARCH->copyAddr(addr.m_address); + } + if (m_address != NULL) { + ARCH->closeAddr(m_address); + } + m_address = newAddr; + m_hostname = addr.m_hostname; + m_port = addr.m_port; + return *this; } void NetworkAddress::resolve() { - // discard previous address - if (m_address != NULL) { - ARCH->closeAddr(m_address); - m_address = NULL; - } + // discard previous address + if (m_address != NULL) { + ARCH->closeAddr(m_address); + m_address = NULL; + } - try { - // if hostname is empty then use wildcard address otherwise look - // up the name. - if (m_hostname.empty()) { - m_address = ARCH->newAnyAddr(IArchNetwork::kINET); - } - else { - m_address = ARCH->nameToAddr(m_hostname); - } - } - catch (XArchNetworkNameUnknown&) { - throw XSocketAddress(XSocketAddress::kNotFound, m_hostname, m_port); - } - catch (XArchNetworkNameNoAddress&) { - throw XSocketAddress(XSocketAddress::kNoAddress, m_hostname, m_port); - } - catch (XArchNetworkNameUnsupported&) { - throw XSocketAddress(XSocketAddress::kUnsupported, m_hostname, m_port); - } - catch (XArchNetworkName&) { - throw XSocketAddress(XSocketAddress::kUnknown, m_hostname, m_port); - } + try { + // if hostname is empty then use wildcard address otherwise look + // up the name. + if (m_hostname.empty()) { + m_address = ARCH->newAnyAddr(IArchNetwork::kINET); + } + else { + m_address = ARCH->nameToAddr(m_hostname); + } + } + catch (XArchNetworkNameUnknown&) { + throw XSocketAddress(XSocketAddress::kNotFound, m_hostname, m_port); + } + catch (XArchNetworkNameNoAddress&) { + throw XSocketAddress(XSocketAddress::kNoAddress, m_hostname, m_port); + } + catch (XArchNetworkNameUnsupported&) { + throw XSocketAddress(XSocketAddress::kUnsupported, m_hostname, m_port); + } + catch (XArchNetworkName&) { + throw XSocketAddress(XSocketAddress::kUnknown, m_hostname, m_port); + } - // set port in address - ARCH->setAddrPort(m_address, m_port); + // set port in address + ARCH->setAddrPort(m_address, m_port); } bool NetworkAddress::operator==(const NetworkAddress& addr) const { - return ARCH->isEqualAddr(m_address, addr.m_address); + return ARCH->isEqualAddr(m_address, addr.m_address); } bool NetworkAddress::operator!=(const NetworkAddress& addr) const { - return !operator==(addr); + return !operator==(addr); } bool NetworkAddress::isValid() const { - return (m_address != NULL); + return (m_address != NULL); } const ArchNetAddress& NetworkAddress::getAddress() const { - return m_address; + return m_address; } int NetworkAddress::getPort() const { - return m_port; + return m_port; } String NetworkAddress::getHostname() const { - return m_hostname; + return m_hostname; } void NetworkAddress::checkPort() { - // check port number - if (m_port <= 0 || m_port > 65535) { - throw XSocketAddress(XSocketAddress::kBadPort, m_hostname, m_port); - } + // check port number + if (m_port <= 0 || m_port > 65535) { + throw XSocketAddress(XSocketAddress::kBadPort, m_hostname, m_port); + } } diff --git a/src/lib/net/NetworkAddress.h b/src/lib/net/NetworkAddress.h index 31cbb710..f4266854 100644 --- a/src/lib/net/NetworkAddress.h +++ b/src/lib/net/NetworkAddress.h @@ -28,96 +28,96 @@ This class represents a network address. */ class NetworkAddress { public: - /*! - Constructs the invalid address - */ - NetworkAddress(); + /*! + Constructs the invalid address + */ + NetworkAddress(); - /*! - Construct the wildcard address with the given port. \c port must - not be zero. - */ - NetworkAddress(int port); + /*! + Construct the wildcard address with the given port. \c port must + not be zero. + */ + NetworkAddress(int port); - /*! - Construct the network address for the given \c hostname and \c port. - If \c hostname can be parsed as a numerical address then that's how - it's used, otherwise it's used as a host name. If \c hostname ends - in ":[0-9]+" then that suffix is extracted and used as the port, - overridding the port parameter. The resulting port must be a valid - port number (zero is not a valid port number) otherwise \c XSocketAddress - is thrown with an error of \c XSocketAddress::kBadPort. The hostname - is not resolved by the c'tor; use \c resolve to do that. - */ - NetworkAddress(const String& hostname, int port); + /*! + Construct the network address for the given \c hostname and \c port. + If \c hostname can be parsed as a numerical address then that's how + it's used, otherwise it's used as a host name. If \c hostname ends + in ":[0-9]+" then that suffix is extracted and used as the port, + overridding the port parameter. The resulting port must be a valid + port number (zero is not a valid port number) otherwise \c XSocketAddress + is thrown with an error of \c XSocketAddress::kBadPort. The hostname + is not resolved by the c'tor; use \c resolve to do that. + */ + NetworkAddress(const String& hostname, int port); - NetworkAddress(const NetworkAddress&); + NetworkAddress(const NetworkAddress&); - ~NetworkAddress(); + ~NetworkAddress(); - NetworkAddress& operator=(const NetworkAddress&); + NetworkAddress& operator=(const NetworkAddress&); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Resolve address - /*! - Resolves the hostname to an address. This can be done any number of - times and is done automatically by the c'tor taking a hostname. - Throws XSocketAddress if resolution is unsuccessful, after which - \c isValid returns false until the next call to this method. - */ - void resolve(); + //! Resolve address + /*! + Resolves the hostname to an address. This can be done any number of + times and is done automatically by the c'tor taking a hostname. + Throws XSocketAddress if resolution is unsuccessful, after which + \c isValid returns false until the next call to this method. + */ + void resolve(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Check address equality - /*! - Returns true if this address is equal to \p address. - */ - bool operator==(const NetworkAddress& address) const; + //! Check address equality + /*! + Returns true if this address is equal to \p address. + */ + bool operator==(const NetworkAddress& address) const; - //! Check address inequality - /*! - Returns true if this address is not equal to \p address. - */ - bool operator!=(const NetworkAddress& address) const; + //! Check address inequality + /*! + Returns true if this address is not equal to \p address. + */ + bool operator!=(const NetworkAddress& address) const; - //! Check address validity - /*! - Returns true if this is not the invalid address. - */ - bool isValid() const; + //! Check address validity + /*! + Returns true if this is not the invalid address. + */ + bool isValid() const; - //! Get address - /*! - Returns the address in the platform's native network address - structure. - */ - const ArchNetAddress& getAddress() const; + //! Get address + /*! + Returns the address in the platform's native network address + structure. + */ + const ArchNetAddress& getAddress() const; - //! Get port - /*! - Returns the port passed to the c'tor as a suffix to the hostname, - if that existed, otherwise as passed directly to the c'tor. - */ - int getPort() const; + //! Get port + /*! + Returns the port passed to the c'tor as a suffix to the hostname, + if that existed, otherwise as passed directly to the c'tor. + */ + int getPort() const; - //! Get hostname - /*! - Returns the hostname passed to the c'tor sans any port suffix. - */ - String getHostname() const; + //! Get hostname + /*! + Returns the hostname passed to the c'tor sans any port suffix. + */ + String getHostname() const; - //@} + //@} private: - void checkPort(); + void checkPort(); private: - ArchNetAddress m_address; - String m_hostname; - int m_port; + ArchNetAddress m_address; + String m_hostname; + int m_port; }; diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp index 533ae41a..b0b50506 100644 --- a/src/lib/net/SecureListenSocket.cpp +++ b/src/lib/net/SecureListenSocket.cpp @@ -31,65 +31,65 @@ static const char s_certificateFilename[] = { "Synergy.pem" }; // SecureListenSocket::SecureListenSocket( - IEventQueue* events, - SocketMultiplexer* socketMultiplexer) : - TCPListenSocket(events, socketMultiplexer) + IEventQueue* events, + SocketMultiplexer* socketMultiplexer) : + TCPListenSocket(events, socketMultiplexer) { } SecureListenSocket::~SecureListenSocket() { - SecureSocketSet::iterator it; - for (it = m_secureSocketSet.begin(); it != m_secureSocketSet.end(); it++) { - delete *it; - } - m_secureSocketSet.clear(); + SecureSocketSet::iterator it; + for (it = m_secureSocketSet.begin(); it != m_secureSocketSet.end(); it++) { + delete *it; + } + m_secureSocketSet.clear(); } IDataSocket* SecureListenSocket::accept() { - SecureSocket* socket = NULL; - try { - socket = new SecureSocket( - m_events, - m_socketMultiplexer, - ARCH->acceptSocket(m_socket, NULL)); - socket->initSsl(true); + SecureSocket* socket = NULL; + try { + socket = new SecureSocket( + m_events, + m_socketMultiplexer, + ARCH->acceptSocket(m_socket, NULL)); + socket->initSsl(true); - if (socket != NULL) { - setListeningJob(); - } + if (socket != NULL) { + setListeningJob(); + } - String certificateFilename = synergy::string::sprintf("%s/%s/%s", - ARCH->getProfileDirectory().c_str(), - s_certificateDir, - s_certificateFilename); + String certificateFilename = synergy::string::sprintf("%s/%s/%s", + ARCH->getProfileDirectory().c_str(), + s_certificateDir, + s_certificateFilename); - bool loaded = socket->loadCertificates(certificateFilename); - if (!loaded) { - delete socket; - return NULL; - } + bool loaded = socket->loadCertificates(certificateFilename); + if (!loaded) { + delete socket; + return NULL; + } - socket->secureAccept(); + socket->secureAccept(); - m_secureSocketSet.insert(socket); + m_secureSocketSet.insert(socket); - return dynamic_cast(socket); - } - catch (XArchNetwork&) { - if (socket != NULL) { - delete socket; - setListeningJob(); - } - return NULL; - } - catch (std::exception &ex) { - if (socket != NULL) { - delete socket; - setListeningJob(); - } - throw ex; - } + return dynamic_cast(socket); + } + catch (XArchNetwork&) { + if (socket != NULL) { + delete socket; + setListeningJob(); + } + return NULL; + } + catch (std::exception &ex) { + if (socket != NULL) { + delete socket; + setListeningJob(); + } + throw ex; + } } diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h index 960a8a26..340dba5d 100644 --- a/src/lib/net/SecureListenSocket.h +++ b/src/lib/net/SecureListenSocket.h @@ -26,16 +26,16 @@ class IDataSocket; class SecureListenSocket : public TCPListenSocket{ public: - SecureListenSocket(IEventQueue* events, - SocketMultiplexer* socketMultiplexer); - ~SecureListenSocket(); + SecureListenSocket(IEventQueue* events, + SocketMultiplexer* socketMultiplexer); + ~SecureListenSocket(); - // IListenSocket overrides - virtual IDataSocket* - accept(); + // IListenSocket overrides + virtual IDataSocket* + accept(); private: - typedef std::set SecureSocketSet; + typedef std::set SecureSocketSet; - SecureSocketSet m_secureSocketSet; + SecureSocketSet m_secureSocketSet; }; diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp index 7076c764..843c24c2 100644 --- a/src/lib/net/SecureSocket.cpp +++ b/src/lib/net/SecureSocket.cpp @@ -40,7 +40,7 @@ static const float s_retryDelay = 0.01f; enum { - kMsgSize = 128 + kMsgSize = 128 }; static const char kFingerprintDirName[] = "SSL/Fingerprints"; @@ -49,801 +49,801 @@ static const char kFingerprintTrustedServersFilename[] = "TrustedServers.txt"; //static const char kFingerprintTrustedClientsFilename[] = "TrustedClients.txt"; struct Ssl { - SSL_CTX* m_context; - SSL* m_ssl; + SSL_CTX* m_context; + SSL* m_ssl; }; SecureSocket::SecureSocket( - IEventQueue* events, - SocketMultiplexer* socketMultiplexer) : - TCPSocket(events, socketMultiplexer), - m_secureReady(false), - m_fatal(false) + IEventQueue* events, + SocketMultiplexer* socketMultiplexer) : + TCPSocket(events, socketMultiplexer), + m_secureReady(false), + m_fatal(false) { } SecureSocket::SecureSocket( - IEventQueue* events, - SocketMultiplexer* socketMultiplexer, - ArchSocket socket) : - TCPSocket(events, socketMultiplexer, socket), - m_secureReady(false), - m_fatal(false) + IEventQueue* events, + SocketMultiplexer* socketMultiplexer, + ArchSocket socket) : + TCPSocket(events, socketMultiplexer, socket), + m_secureReady(false), + m_fatal(false) { } SecureSocket::~SecureSocket() { - isFatal(true); - if (m_ssl->m_ssl != NULL) { - SSL_shutdown(m_ssl->m_ssl); + isFatal(true); + if (m_ssl->m_ssl != NULL) { + SSL_shutdown(m_ssl->m_ssl); - SSL_free(m_ssl->m_ssl); - m_ssl->m_ssl = NULL; - } - if (m_ssl->m_context != NULL) { - SSL_CTX_free(m_ssl->m_context); - m_ssl->m_context = NULL; - } - ARCH->sleep(1); - delete m_ssl; + SSL_free(m_ssl->m_ssl); + m_ssl->m_ssl = NULL; + } + if (m_ssl->m_context != NULL) { + SSL_CTX_free(m_ssl->m_context); + m_ssl->m_context = NULL; + } + ARCH->sleep(1); + delete m_ssl; } void SecureSocket::close() { - isFatal(true); + isFatal(true); - SSL_shutdown(m_ssl->m_ssl); + SSL_shutdown(m_ssl->m_ssl); - TCPSocket::close(); + TCPSocket::close(); } void SecureSocket::connect(const NetworkAddress& addr) { - m_events->adoptHandler(m_events->forIDataSocket().connected(), - getEventTarget(), - new TMethodEventJob(this, - &SecureSocket::handleTCPConnected)); + m_events->adoptHandler(m_events->forIDataSocket().connected(), + getEventTarget(), + new TMethodEventJob(this, + &SecureSocket::handleTCPConnected)); - TCPSocket::connect(addr); + TCPSocket::connect(addr); } ISocketMultiplexerJob* SecureSocket::newJob() { - // after TCP connection is established, SecureSocket will pick up - // connected event and do secureConnect - if (m_connected && !m_secureReady) { - return NULL; - } - - return TCPSocket::newJob(); + // after TCP connection is established, SecureSocket will pick up + // connected event and do secureConnect + if (m_connected && !m_secureReady) { + return NULL; + } + + return TCPSocket::newJob(); } void SecureSocket::secureConnect() { - setJob(new TSocketMultiplexerMethodJob( - this, &SecureSocket::serviceConnect, - getSocket(), isReadable(), isWritable())); + setJob(new TSocketMultiplexerMethodJob( + this, &SecureSocket::serviceConnect, + getSocket(), isReadable(), isWritable())); } void SecureSocket::secureAccept() { - setJob(new TSocketMultiplexerMethodJob( - this, &SecureSocket::serviceAccept, - getSocket(), isReadable(), isWritable())); + setJob(new TSocketMultiplexerMethodJob( + this, &SecureSocket::serviceAccept, + getSocket(), isReadable(), isWritable())); } TCPSocket::EJobResult SecureSocket::doRead() { - static UInt8 buffer[4096]; - memset(buffer, 0, sizeof(buffer)); - int bytesRead = 0; - int status = 0; + static UInt8 buffer[4096]; + memset(buffer, 0, sizeof(buffer)); + int bytesRead = 0; + int status = 0; - if (isSecureReady()) { - status = secureRead(buffer, sizeof(buffer), bytesRead); - if (status < 0) { - return kBreak; - } - else if (status == 0) { - return kNew; - } - } - else { - return kRetry; - } - - if (bytesRead > 0) { - bool wasEmpty = (m_inputBuffer.getSize() == 0); - - // slurp up as much as possible - do { - m_inputBuffer.write(buffer, bytesRead); - - status = secureRead(buffer, sizeof(buffer), bytesRead); - if (status < 0) { - return kBreak; - } - } while (bytesRead > 0 || status > 0); - - // send input ready if input buffer was empty - if (wasEmpty) { - sendEvent(m_events->forIStream().inputReady()); - } - } - else { - // remote write end of stream hungup. our input side - // has therefore shutdown but don't flush our buffer - // since there's still data to be read. - sendEvent(m_events->forIStream().inputShutdown()); - if (!m_writable && m_inputBuffer.getSize() == 0) { - sendEvent(m_events->forISocket().disconnected()); - m_connected = false; - } - m_readable = false; - return kNew; - } - - return kRetry; + if (isSecureReady()) { + status = secureRead(buffer, sizeof(buffer), bytesRead); + if (status < 0) { + return kBreak; + } + else if (status == 0) { + return kNew; + } + } + else { + return kRetry; + } + + if (bytesRead > 0) { + bool wasEmpty = (m_inputBuffer.getSize() == 0); + + // slurp up as much as possible + do { + m_inputBuffer.write(buffer, bytesRead); + + status = secureRead(buffer, sizeof(buffer), bytesRead); + if (status < 0) { + return kBreak; + } + } while (bytesRead > 0 || status > 0); + + // send input ready if input buffer was empty + if (wasEmpty) { + sendEvent(m_events->forIStream().inputReady()); + } + } + else { + // remote write end of stream hungup. our input side + // has therefore shutdown but don't flush our buffer + // since there's still data to be read. + sendEvent(m_events->forIStream().inputShutdown()); + if (!m_writable && m_inputBuffer.getSize() == 0) { + sendEvent(m_events->forISocket().disconnected()); + m_connected = false; + } + m_readable = false; + return kNew; + } + + return kRetry; } TCPSocket::EJobResult SecureSocket::doWrite() { - static bool s_retry = false; - static int s_retrySize = 0; - static void* s_staticBuffer = NULL; + static bool s_retry = false; + static int s_retrySize = 0; + static void* s_staticBuffer = NULL; - // write data - int bufferSize = 0; - int bytesWrote = 0; - int status = 0; - - if (s_retry) { - bufferSize = s_retrySize; - } - else { - bufferSize = m_outputBuffer.getSize(); - s_staticBuffer = malloc(bufferSize); - memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize); - } - - if (bufferSize == 0) { - return kRetry; - } + // write data + int bufferSize = 0; + int bytesWrote = 0; + int status = 0; + + if (s_retry) { + bufferSize = s_retrySize; + } + else { + bufferSize = m_outputBuffer.getSize(); + s_staticBuffer = malloc(bufferSize); + memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize); + } + + if (bufferSize == 0) { + return kRetry; + } - if (isSecureReady()) { - status = secureWrite(s_staticBuffer, bufferSize, bytesWrote); - if (status > 0) { - s_retry = false; - bufferSize = 0; - free(s_staticBuffer); - s_staticBuffer = NULL; - } - else if (status < 0) { - return kBreak; - } - else if (status == 0) { - s_retry = true; - s_retrySize = bufferSize; - return kNew; - } - } - else { - return kRetry; - } - - if (bytesWrote > 0) { - discardWrittenData(bytesWrote); - return kNew; - } + if (isSecureReady()) { + status = secureWrite(s_staticBuffer, bufferSize, bytesWrote); + if (status > 0) { + s_retry = false; + bufferSize = 0; + free(s_staticBuffer); + s_staticBuffer = NULL; + } + else if (status < 0) { + return kBreak; + } + else if (status == 0) { + s_retry = true; + s_retrySize = bufferSize; + return kNew; + } + } + else { + return kRetry; + } + + if (bytesWrote > 0) { + discardWrittenData(bytesWrote); + return kNew; + } - return kRetry; + return kRetry; } int SecureSocket::secureRead(void* buffer, int size, int& read) { - if (m_ssl->m_ssl != NULL) { - LOG((CLOG_DEBUG2 "reading secure socket")); - read = SSL_read(m_ssl->m_ssl, buffer, size); - - static int retry; + if (m_ssl->m_ssl != NULL) { + LOG((CLOG_DEBUG2 "reading secure socket")); + read = SSL_read(m_ssl->m_ssl, buffer, size); + + static int retry; - // Check result will cleanup the connection in the case of a fatal - checkResult(read, retry); - - if (retry) { - return 0; - } + // Check result will cleanup the connection in the case of a fatal + checkResult(read, retry); + + if (retry) { + return 0; + } - if (isFatal()) { - return -1; - } - } - // According to SSL spec, the number of bytes read must not be negative and - // not have an error code from SSL_get_error(). If this happens, it is - // itself an error. Let the parent handle the case - return read; + if (isFatal()) { + return -1; + } + } + // According to SSL spec, the number of bytes read must not be negative and + // not have an error code from SSL_get_error(). If this happens, it is + // itself an error. Let the parent handle the case + return read; } int SecureSocket::secureWrite(const void* buffer, int size, int& wrote) { - if (m_ssl->m_ssl != NULL) { - LOG((CLOG_DEBUG2 "writing secure socket:%p", this)); + if (m_ssl->m_ssl != NULL) { + LOG((CLOG_DEBUG2 "writing secure socket:%p", this)); - wrote = SSL_write(m_ssl->m_ssl, buffer, size); - - static int retry; + wrote = SSL_write(m_ssl->m_ssl, buffer, size); + + static int retry; - // Check result will cleanup the connection in the case of a fatal - checkResult(wrote, retry); + // Check result will cleanup the connection in the case of a fatal + checkResult(wrote, retry); - if (retry) { - return 0; - } + if (retry) { + return 0; + } - if (isFatal()) { - return -1; - } - } - // According to SSL spec, r must not be negative and not have an error code - // from SSL_get_error(). If this happens, it is itself an error. Let the - // parent handle the case - return wrote; + if (isFatal()) { + return -1; + } + } + // According to SSL spec, r must not be negative and not have an error code + // from SSL_get_error(). If this happens, it is itself an error. Let the + // parent handle the case + return wrote; } bool SecureSocket::isSecureReady() { - return m_secureReady; + return m_secureReady; } void SecureSocket::initSsl(bool server) { - m_ssl = new Ssl(); - m_ssl->m_context = NULL; - m_ssl->m_ssl = NULL; + m_ssl = new Ssl(); + m_ssl->m_context = NULL; + m_ssl->m_ssl = NULL; - initContext(server); + initContext(server); } bool SecureSocket::loadCertificates(String& filename) { - if (filename.empty()) { - showError("ssl certificate is not specified"); - return false; - } - else { - std::ifstream file(filename.c_str()); - bool exist = file.good(); - file.close(); + if (filename.empty()) { + showError("ssl certificate is not specified"); + return false; + } + else { + std::ifstream file(filename.c_str()); + bool exist = file.good(); + file.close(); - if (!exist) { - String errorMsg("ssl certificate doesn't exist: "); - errorMsg.append(filename); - showError(errorMsg.c_str()); - return false; - } - } + if (!exist) { + String errorMsg("ssl certificate doesn't exist: "); + errorMsg.append(filename); + showError(errorMsg.c_str()); + return false; + } + } - int r = 0; - r = SSL_CTX_use_certificate_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM); - if (r <= 0) { - showError("could not use ssl certificate"); - return false; - } + int r = 0; + r = SSL_CTX_use_certificate_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM); + if (r <= 0) { + showError("could not use ssl certificate"); + return false; + } - r = SSL_CTX_use_PrivateKey_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM); - if (r <= 0) { - showError("could not use ssl private key"); - return false; - } + r = SSL_CTX_use_PrivateKey_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM); + if (r <= 0) { + showError("could not use ssl private key"); + return false; + } - r = SSL_CTX_check_private_key(m_ssl->m_context); - if (!r) { - showError("could not verify ssl private key"); - return false; - } + r = SSL_CTX_check_private_key(m_ssl->m_context); + if (!r) { + showError("could not verify ssl private key"); + return false; + } - return true; + return true; } void SecureSocket::initContext(bool server) { - SSL_library_init(); + SSL_library_init(); - const SSL_METHOD* method; + const SSL_METHOD* method; - // load & register all cryptos, etc. - OpenSSL_add_all_algorithms(); + // load & register all cryptos, etc. + OpenSSL_add_all_algorithms(); - // load all error messages - SSL_load_error_strings(); + // load all error messages + SSL_load_error_strings(); - if (CLOG->getFilter() >= kINFO) { - showSecureLibInfo(); - } + if (CLOG->getFilter() >= kINFO) { + showSecureLibInfo(); + } - // SSLv23_method uses TLSv1, with the ability to fall back to SSLv3 - if (server) { - method = SSLv23_server_method(); - } - else { - method = SSLv23_client_method(); - } - - // create new context from method - SSL_METHOD* m = const_cast(method); - m_ssl->m_context = SSL_CTX_new(m); + // SSLv23_method uses TLSv1, with the ability to fall back to SSLv3 + if (server) { + method = SSLv23_server_method(); + } + else { + method = SSLv23_client_method(); + } + + // create new context from method + SSL_METHOD* m = const_cast(method); + m_ssl->m_context = SSL_CTX_new(m); - // drop SSLv3 support - SSL_CTX_set_options(m_ssl->m_context, SSL_OP_NO_SSLv3); + // drop SSLv3 support + SSL_CTX_set_options(m_ssl->m_context, SSL_OP_NO_SSLv3); - if (m_ssl->m_context == NULL) { - showError(); - } + if (m_ssl->m_context == NULL) { + showError(); + } } void SecureSocket::createSSL() { - // I assume just one instance is needed - // get new SSL state with context - if (m_ssl->m_ssl == NULL) { - m_ssl->m_ssl = SSL_new(m_ssl->m_context); - } + // I assume just one instance is needed + // get new SSL state with context + if (m_ssl->m_ssl == NULL) { + m_ssl->m_ssl = SSL_new(m_ssl->m_context); + } } int SecureSocket::secureAccept(int socket) { - createSSL(); + createSSL(); - // set connection socket to SSL state - SSL_set_fd(m_ssl->m_ssl, socket); - - LOG((CLOG_DEBUG2 "accepting secure socket")); - int r = SSL_accept(m_ssl->m_ssl); - - static int retry; + // set connection socket to SSL state + SSL_set_fd(m_ssl->m_ssl, socket); + + LOG((CLOG_DEBUG2 "accepting secure socket")); + int r = SSL_accept(m_ssl->m_ssl); + + static int retry; - checkResult(r, retry); + checkResult(r, retry); - if (isFatal()) { - // tell user and sleep so the socket isn't hammered. - LOG((CLOG_ERR "failed to accept secure socket")); - LOG((CLOG_INFO "client connection may not be secure")); - m_secureReady = false; - ARCH->sleep(1); - retry = 0; - return -1; // Failed, error out - } + if (isFatal()) { + // tell user and sleep so the socket isn't hammered. + LOG((CLOG_ERR "failed to accept secure socket")); + LOG((CLOG_INFO "client connection may not be secure")); + m_secureReady = false; + ARCH->sleep(1); + retry = 0; + return -1; // Failed, error out + } - // If not fatal and no retry, state is good - if (retry == 0) { - m_secureReady = true; - LOG((CLOG_INFO "accepted secure socket")); - if (CLOG->getFilter() >= kDEBUG1) { - showSecureCipherInfo(); - } - showSecureConnectInfo(); - return 1; - } + // If not fatal and no retry, state is good + if (retry == 0) { + m_secureReady = true; + LOG((CLOG_INFO "accepted secure socket")); + if (CLOG->getFilter() >= kDEBUG1) { + showSecureCipherInfo(); + } + showSecureConnectInfo(); + return 1; + } - // If not fatal and retry is set, not ready, and return retry - if (retry > 0) { - LOG((CLOG_DEBUG2 "retry accepting secure socket")); - m_secureReady = false; - ARCH->sleep(s_retryDelay); - return 0; - } + // If not fatal and retry is set, not ready, and return retry + if (retry > 0) { + LOG((CLOG_DEBUG2 "retry accepting secure socket")); + m_secureReady = false; + ARCH->sleep(s_retryDelay); + return 0; + } - // no good state exists here - LOG((CLOG_ERR "unexpected state attempting to accept connection")); - return -1; + // no good state exists here + LOG((CLOG_ERR "unexpected state attempting to accept connection")); + return -1; } int SecureSocket::secureConnect(int socket) { - createSSL(); + createSSL(); - // attach the socket descriptor - SSL_set_fd(m_ssl->m_ssl, socket); - - LOG((CLOG_DEBUG2 "connecting secure socket")); - int r = SSL_connect(m_ssl->m_ssl); - - static int retry; + // attach the socket descriptor + SSL_set_fd(m_ssl->m_ssl, socket); + + LOG((CLOG_DEBUG2 "connecting secure socket")); + int r = SSL_connect(m_ssl->m_ssl); + + static int retry; - checkResult(r, retry); + checkResult(r, retry); - if (isFatal()) { - LOG((CLOG_ERR "failed to connect secure socket")); - retry = 0; - return -1; - } + if (isFatal()) { + LOG((CLOG_ERR "failed to connect secure socket")); + retry = 0; + return -1; + } - // If we should retry, not ready and return 0 - if (retry > 0) { - LOG((CLOG_DEBUG2 "retry connect secure socket")); - m_secureReady = false; - ARCH->sleep(s_retryDelay); - return 0; - } + // If we should retry, not ready and return 0 + if (retry > 0) { + LOG((CLOG_DEBUG2 "retry connect secure socket")); + m_secureReady = false; + ARCH->sleep(s_retryDelay); + return 0; + } - retry = 0; - // No error, set ready, process and return ok - m_secureReady = true; - if (verifyCertFingerprint()) { - LOG((CLOG_INFO "connected to secure socket")); - if (!showCertificate()) { - disconnect(); - return -1;// Cert fail, error - } - } - else { - LOG((CLOG_ERR "failed to verify server certificate fingerprint")); - disconnect(); - return -1; // Fingerprint failed, error - } - LOG((CLOG_DEBUG2 "connected secure socket")); - if (CLOG->getFilter() >= kDEBUG1) { - showSecureCipherInfo(); - } - showSecureConnectInfo(); - return 1; + retry = 0; + // No error, set ready, process and return ok + m_secureReady = true; + if (verifyCertFingerprint()) { + LOG((CLOG_INFO "connected to secure socket")); + if (!showCertificate()) { + disconnect(); + return -1;// Cert fail, error + } + } + else { + LOG((CLOG_ERR "failed to verify server certificate fingerprint")); + disconnect(); + return -1; // Fingerprint failed, error + } + LOG((CLOG_DEBUG2 "connected secure socket")); + if (CLOG->getFilter() >= kDEBUG1) { + showSecureCipherInfo(); + } + showSecureConnectInfo(); + return 1; } bool SecureSocket::showCertificate() { - X509* cert; - char* line; + X509* cert; + char* line; - // get the server's certificate - cert = SSL_get_peer_certificate(m_ssl->m_ssl); - if (cert != NULL) { - line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); - LOG((CLOG_INFO "server ssl certificate info: %s", line)); - OPENSSL_free(line); - X509_free(cert); - } - else { - showError("server has no ssl certificate"); - return false; - } + // get the server's certificate + cert = SSL_get_peer_certificate(m_ssl->m_ssl); + if (cert != NULL) { + line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); + LOG((CLOG_INFO "server ssl certificate info: %s", line)); + OPENSSL_free(line); + X509_free(cert); + } + else { + showError("server has no ssl certificate"); + return false; + } - return true; + return true; } void SecureSocket::checkResult(int status, int& retry) { - // ssl errors are a little quirky. the "want" errors are normal and - // should result in a retry. + // ssl errors are a little quirky. the "want" errors are normal and + // should result in a retry. - int errorCode = SSL_get_error(m_ssl->m_ssl, status); + int errorCode = SSL_get_error(m_ssl->m_ssl, status); - switch (errorCode) { - case SSL_ERROR_NONE: - retry = 0; - // operation completed - break; + switch (errorCode) { + case SSL_ERROR_NONE: + retry = 0; + // operation completed + break; - case SSL_ERROR_ZERO_RETURN: - // connection closed - isFatal(true); - LOG((CLOG_DEBUG "ssl connection closed")); - break; + case SSL_ERROR_ZERO_RETURN: + // connection closed + isFatal(true); + LOG((CLOG_DEBUG "ssl connection closed")); + break; - case SSL_ERROR_WANT_READ: - retry++; - LOG((CLOG_DEBUG2 "want to read, error=%d, attempt=%d", errorCode, retry)); - break; + case SSL_ERROR_WANT_READ: + retry++; + LOG((CLOG_DEBUG2 "want to read, error=%d, attempt=%d", errorCode, retry)); + break; - case SSL_ERROR_WANT_WRITE: - // Need to make sure the socket is known to be writable so the impending - // select action actually triggers on a write. This isn't necessary for - // m_readable because the socket logic is always readable - m_writable = true; - retry++; - LOG((CLOG_DEBUG2 "want to write, error=%d, attempt=%d", errorCode, retry)); - break; + case SSL_ERROR_WANT_WRITE: + // Need to make sure the socket is known to be writable so the impending + // select action actually triggers on a write. This isn't necessary for + // m_readable because the socket logic is always readable + m_writable = true; + retry++; + LOG((CLOG_DEBUG2 "want to write, error=%d, attempt=%d", errorCode, retry)); + break; - case SSL_ERROR_WANT_CONNECT: - retry++; - LOG((CLOG_DEBUG2 "want to connect, error=%d, attempt=%d", errorCode, retry)); - break; + case SSL_ERROR_WANT_CONNECT: + retry++; + LOG((CLOG_DEBUG2 "want to connect, error=%d, attempt=%d", errorCode, retry)); + break; - case SSL_ERROR_WANT_ACCEPT: - retry++; - LOG((CLOG_DEBUG2 "want to accept, error=%d, attempt=%d", errorCode, retry)); - break; + case SSL_ERROR_WANT_ACCEPT: + retry++; + LOG((CLOG_DEBUG2 "want to accept, error=%d, attempt=%d", errorCode, retry)); + break; - case SSL_ERROR_SYSCALL: - LOG((CLOG_ERR "ssl error occurred (system call failure)")); - if (ERR_peek_error() == 0) { - if (status == 0) { - LOG((CLOG_ERR "eof violates ssl protocol")); - } - else if (status == -1) { - // underlying socket I/O reproted an error - try { - ARCH->throwErrorOnSocket(getSocket()); - } - catch (XArchNetwork& e) { - LOG((CLOG_ERR "%s", e.what())); - } - } - } + case SSL_ERROR_SYSCALL: + LOG((CLOG_ERR "ssl error occurred (system call failure)")); + if (ERR_peek_error() == 0) { + if (status == 0) { + LOG((CLOG_ERR "eof violates ssl protocol")); + } + else if (status == -1) { + // underlying socket I/O reproted an error + try { + ARCH->throwErrorOnSocket(getSocket()); + } + catch (XArchNetwork& e) { + LOG((CLOG_ERR "%s", e.what())); + } + } + } - isFatal(true); - break; + isFatal(true); + break; - case SSL_ERROR_SSL: - LOG((CLOG_ERR "ssl error occurred (generic failure)")); - isFatal(true); - break; + case SSL_ERROR_SSL: + LOG((CLOG_ERR "ssl error occurred (generic failure)")); + isFatal(true); + break; - default: - LOG((CLOG_ERR "ssl error occurred (unknown failure)")); - isFatal(true); - break; - } + default: + LOG((CLOG_ERR "ssl error occurred (unknown failure)")); + isFatal(true); + break; + } - if (isFatal()) { - retry = 0; - showError(); - disconnect(); - } + if (isFatal()) { + retry = 0; + showError(); + disconnect(); + } } void SecureSocket::showError(const char* reason) { - if (reason != NULL) { - LOG((CLOG_ERR "%s", reason)); - } + if (reason != NULL) { + LOG((CLOG_ERR "%s", reason)); + } - String error = getError(); - if (!error.empty()) { - LOG((CLOG_ERR "%s", error.c_str())); - } + String error = getError(); + if (!error.empty()) { + LOG((CLOG_ERR "%s", error.c_str())); + } } String SecureSocket::getError() { - unsigned long e = ERR_get_error(); + unsigned long e = ERR_get_error(); - if (e != 0) { - char error[MAX_ERROR_SIZE]; - ERR_error_string_n(e, error, MAX_ERROR_SIZE); - return error; - } - else { - return ""; - } + if (e != 0) { + char error[MAX_ERROR_SIZE]; + ERR_error_string_n(e, error, MAX_ERROR_SIZE); + return error; + } + else { + return ""; + } } void SecureSocket::disconnect() { - sendEvent(getEvents()->forISocket().stopRetry()); - sendEvent(getEvents()->forISocket().disconnected()); - sendEvent(getEvents()->forIStream().inputShutdown()); + sendEvent(getEvents()->forISocket().stopRetry()); + sendEvent(getEvents()->forISocket().disconnected()); + sendEvent(getEvents()->forIStream().inputShutdown()); } void SecureSocket::formatFingerprint(String& fingerprint, bool hex, bool separator) { - if (hex) { - // to hexidecimal - synergy::string::toHex(fingerprint, 2); - } + if (hex) { + // to hexidecimal + synergy::string::toHex(fingerprint, 2); + } - // all uppercase - synergy::string::uppercase(fingerprint); + // all uppercase + synergy::string::uppercase(fingerprint); - if (separator) { - // add colon to separate each 2 charactors - size_t separators = fingerprint.size() / 2; - for (size_t i = 1; i < separators; i++) { - fingerprint.insert(i * 3 - 1, ":"); - } - } + if (separator) { + // add colon to separate each 2 charactors + size_t separators = fingerprint.size() / 2; + for (size_t i = 1; i < separators; i++) { + fingerprint.insert(i * 3 - 1, ":"); + } + } } bool SecureSocket::verifyCertFingerprint() { - // calculate received certificate fingerprint - X509 *cert = cert = SSL_get_peer_certificate(m_ssl->m_ssl); - EVP_MD* tempDigest; - unsigned char tempFingerprint[EVP_MAX_MD_SIZE]; - unsigned int tempFingerprintLen; - tempDigest = (EVP_MD*)EVP_sha1(); - int digestResult = X509_digest(cert, tempDigest, tempFingerprint, &tempFingerprintLen); + // calculate received certificate fingerprint + X509 *cert = cert = SSL_get_peer_certificate(m_ssl->m_ssl); + EVP_MD* tempDigest; + unsigned char tempFingerprint[EVP_MAX_MD_SIZE]; + unsigned int tempFingerprintLen; + tempDigest = (EVP_MD*)EVP_sha1(); + int digestResult = X509_digest(cert, tempDigest, tempFingerprint, &tempFingerprintLen); - if (digestResult <= 0) { - LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult)); - return false; - } + if (digestResult <= 0) { + LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult)); + return false; + } - // format fingerprint into hexdecimal format with colon separator - String fingerprint(reinterpret_cast(tempFingerprint), tempFingerprintLen); - formatFingerprint(fingerprint); - LOG((CLOG_NOTE "server fingerprint: %s", fingerprint.c_str())); + // format fingerprint into hexdecimal format with colon separator + String fingerprint(reinterpret_cast(tempFingerprint), tempFingerprintLen); + formatFingerprint(fingerprint); + LOG((CLOG_NOTE "server fingerprint: %s", fingerprint.c_str())); - String trustedServersFilename; - trustedServersFilename = synergy::string::sprintf( - "%s/%s/%s", - ARCH->getProfileDirectory().c_str(), - kFingerprintDirName, - kFingerprintTrustedServersFilename); + String trustedServersFilename; + trustedServersFilename = synergy::string::sprintf( + "%s/%s/%s", + ARCH->getProfileDirectory().c_str(), + kFingerprintDirName, + kFingerprintTrustedServersFilename); - // check if this fingerprint exist - String fileLine; - std::ifstream file; - file.open(trustedServersFilename.c_str()); + // check if this fingerprint exist + String fileLine; + std::ifstream file; + file.open(trustedServersFilename.c_str()); - bool isValid = false; - while (!file.eof() && file.is_open()) { - getline(file,fileLine); - if (!fileLine.empty()) { - if (fileLine.compare(fingerprint) == 0) { - isValid = true; - break; - } - } - } + bool isValid = false; + while (!file.eof() && file.is_open()) { + getline(file,fileLine); + if (!fileLine.empty()) { + if (fileLine.compare(fingerprint) == 0) { + isValid = true; + break; + } + } + } - file.close(); - return isValid; + file.close(); + return isValid; } ISocketMultiplexerJob* SecureSocket::serviceConnect(ISocketMultiplexerJob* job, - bool, bool write, bool error) + bool, bool write, bool error) { - Lock lock(&getMutex()); + Lock lock(&getMutex()); - int status = 0; + int status = 0; #ifdef SYSAPI_WIN32 - status = secureConnect(static_cast(getSocket()->m_socket)); + status = secureConnect(static_cast(getSocket()->m_socket)); #elif SYSAPI_UNIX - status = secureConnect(getSocket()->m_fd); + status = secureConnect(getSocket()->m_fd); #endif - // If status < 0, error happened - if (status < 0) { - return NULL; - } + // If status < 0, error happened + if (status < 0) { + return NULL; + } - // If status > 0, success - if (status > 0) { - sendEvent(m_events->forIDataSocket().secureConnected()); - return newJob(); - } + // If status > 0, success + if (status > 0) { + sendEvent(m_events->forIDataSocket().secureConnected()); + return newJob(); + } - // Retry case - return new TSocketMultiplexerMethodJob( - this, &SecureSocket::serviceConnect, - getSocket(), isReadable(), isWritable()); + // Retry case + return new TSocketMultiplexerMethodJob( + this, &SecureSocket::serviceConnect, + getSocket(), isReadable(), isWritable()); } ISocketMultiplexerJob* SecureSocket::serviceAccept(ISocketMultiplexerJob* job, - bool, bool write, bool error) + bool, bool write, bool error) { - Lock lock(&getMutex()); + Lock lock(&getMutex()); - int status = 0; + int status = 0; #ifdef SYSAPI_WIN32 - status = secureAccept(static_cast(getSocket()->m_socket)); + status = secureAccept(static_cast(getSocket()->m_socket)); #elif SYSAPI_UNIX - status = secureAccept(getSocket()->m_fd); + status = secureAccept(getSocket()->m_fd); #endif - // If status < 0, error happened - if (status < 0) { - return NULL; - } + // If status < 0, error happened + if (status < 0) { + return NULL; + } - // If status > 0, success - if (status > 0) { - sendEvent(m_events->forClientListener().accepted()); - return newJob(); - } + // If status > 0, success + if (status > 0) { + sendEvent(m_events->forClientListener().accepted()); + return newJob(); + } - // Retry case - return new TSocketMultiplexerMethodJob( - this, &SecureSocket::serviceAccept, - getSocket(), isReadable(), isWritable()); + // Retry case + return new TSocketMultiplexerMethodJob( + this, &SecureSocket::serviceAccept, + getSocket(), isReadable(), isWritable()); } void showCipherStackDesc(STACK_OF(SSL_CIPHER) * stack) { - char msg[kMsgSize]; - int i = 0; - for ( ; i < sk_SSL_CIPHER_num(stack) ; i++) { - const SSL_CIPHER * cipher = sk_SSL_CIPHER_value(stack,i); + char msg[kMsgSize]; + int i = 0; + for ( ; i < sk_SSL_CIPHER_num(stack) ; i++) { + const SSL_CIPHER * cipher = sk_SSL_CIPHER_value(stack,i); - SSL_CIPHER_description(cipher, msg, kMsgSize); + SSL_CIPHER_description(cipher, msg, kMsgSize); - // Why does SSL put a newline in the description? - int pos = (int)strlen(msg) - 1; - if (msg[pos] == '\n') { - msg[pos] = '\0'; - } + // Why does SSL put a newline in the description? + int pos = (int)strlen(msg) - 1; + if (msg[pos] == '\n') { + msg[pos] = '\0'; + } - LOG((CLOG_DEBUG1 "%s",msg)); - } + LOG((CLOG_DEBUG1 "%s",msg)); + } } void SecureSocket::showSecureCipherInfo() { - STACK_OF(SSL_CIPHER) * sStack = SSL_get_ciphers(m_ssl->m_ssl); + STACK_OF(SSL_CIPHER) * sStack = SSL_get_ciphers(m_ssl->m_ssl); - if (sStack == NULL) { - LOG((CLOG_DEBUG1 "local cipher list not available")); - } - else { - LOG((CLOG_DEBUG1 "available local ciphers:")); - showCipherStackDesc(sStack); - } + if (sStack == NULL) { + LOG((CLOG_DEBUG1 "local cipher list not available")); + } + else { + LOG((CLOG_DEBUG1 "available local ciphers:")); + showCipherStackDesc(sStack); + } - // m_ssl->m_ssl->session->ciphers is not forward compatable, In future release - // of OpenSSL, it's not visible, need to use SSL_get_client_ciphers() instead - STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers; - if (cStack == NULL) { - LOG((CLOG_DEBUG1 "remote cipher list not available")); - } - else { - LOG((CLOG_DEBUG1 "available remote ciphers:")); - showCipherStackDesc(cStack); - } - return; + // m_ssl->m_ssl->session->ciphers is not forward compatable, In future release + // of OpenSSL, it's not visible, need to use SSL_get_client_ciphers() instead + STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers; + if (cStack == NULL) { + LOG((CLOG_DEBUG1 "remote cipher list not available")); + } + else { + LOG((CLOG_DEBUG1 "available remote ciphers:")); + showCipherStackDesc(cStack); + } + return; } void SecureSocket::showSecureLibInfo() { - LOG((CLOG_INFO "%s",SSLeay_version(SSLEAY_VERSION))); - LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_CFLAGS))); - LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_BUILT_ON))); - LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_PLATFORM))); - LOG((CLOG_DEBUG1 "%s",SSLeay_version(SSLEAY_DIR))); - return; + LOG((CLOG_INFO "%s",SSLeay_version(SSLEAY_VERSION))); + LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_CFLAGS))); + LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_BUILT_ON))); + LOG((CLOG_DEBUG1 "openSSL : %s",SSLeay_version(SSLEAY_PLATFORM))); + LOG((CLOG_DEBUG1 "%s",SSLeay_version(SSLEAY_DIR))); + return; } void SecureSocket::showSecureConnectInfo() { - const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl); + const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl); - if (cipher != NULL) { - char msg[kMsgSize]; - SSL_CIPHER_description(cipher, msg, kMsgSize); - LOG((CLOG_INFO "%s", msg)); - } - return; + if (cipher != NULL) { + char msg[kMsgSize]; + SSL_CIPHER_description(cipher, msg, kMsgSize); + LOG((CLOG_INFO "%s", msg)); + } + return; } void SecureSocket::handleTCPConnected(const Event& event, void*) { - secureConnect(); + secureConnect(); } diff --git a/src/lib/net/SecureSocket.h b/src/lib/net/SecureSocket.h index 1a29cdaa..2292cd29 100644 --- a/src/lib/net/SecureSocket.h +++ b/src/lib/net/SecureSocket.h @@ -32,64 +32,64 @@ A secure socket using SSL. */ class SecureSocket : public TCPSocket { public: - SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - SecureSocket(IEventQueue* events, - SocketMultiplexer* socketMultiplexer, - ArchSocket socket); - ~SecureSocket(); + SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + SecureSocket(IEventQueue* events, + SocketMultiplexer* socketMultiplexer, + ArchSocket socket); + ~SecureSocket(); - // ISocket overrides - void close(); + // ISocket overrides + void close(); - // IDataSocket overrides - virtual void connect(const NetworkAddress&); - - ISocketMultiplexerJob* - newJob(); - bool isFatal() const { return m_fatal; } - void isFatal(bool b) { m_fatal = b; } - bool isSecureReady(); - void secureConnect(); - void secureAccept(); - int secureRead(void* buffer, int size, int& read); - int secureWrite(const void* buffer, int size, int& wrote); - EJobResult doRead(); - EJobResult doWrite(); - void initSsl(bool server); - bool loadCertificates(String& CertFile); + // IDataSocket overrides + virtual void connect(const NetworkAddress&); + + ISocketMultiplexerJob* + newJob(); + bool isFatal() const { return m_fatal; } + void isFatal(bool b) { m_fatal = b; } + bool isSecureReady(); + void secureConnect(); + void secureAccept(); + int secureRead(void* buffer, int size, int& read); + int secureWrite(const void* buffer, int size, int& wrote); + EJobResult doRead(); + EJobResult doWrite(); + void initSsl(bool server); + bool loadCertificates(String& CertFile); private: - // SSL - void initContext(bool server); - void createSSL(); - int secureAccept(int s); - int secureConnect(int s); - bool showCertificate(); - void checkResult(int n, int& retry); - void showError(const char* reason = NULL); - String getError(); - void disconnect(); - void formatFingerprint(String& fingerprint, - bool hex = true, - bool separator = true); - bool verifyCertFingerprint(); + // SSL + void initContext(bool server); + void createSSL(); + int secureAccept(int s); + int secureConnect(int s); + bool showCertificate(); + void checkResult(int n, int& retry); + void showError(const char* reason = NULL); + String getError(); + void disconnect(); + void formatFingerprint(String& fingerprint, + bool hex = true, + bool separator = true); + bool verifyCertFingerprint(); - ISocketMultiplexerJob* - serviceConnect(ISocketMultiplexerJob*, - bool, bool, bool); + ISocketMultiplexerJob* + serviceConnect(ISocketMultiplexerJob*, + bool, bool, bool); - ISocketMultiplexerJob* - serviceAccept(ISocketMultiplexerJob*, - bool, bool, bool); + ISocketMultiplexerJob* + serviceAccept(ISocketMultiplexerJob*, + bool, bool, bool); - void showSecureConnectInfo(); - void showSecureLibInfo(); - void showSecureCipherInfo(); - - void handleTCPConnected(const Event& event, void*); + void showSecureConnectInfo(); + void showSecureLibInfo(); + void showSecureCipherInfo(); + + void handleTCPConnected(const Event& event, void*); private: - Ssl* m_ssl; - bool m_secureReady; - bool m_fatal; + Ssl* m_ssl; + bool m_secureReady; + bool m_fatal; }; diff --git a/src/lib/net/SocketMultiplexer.cpp b/src/lib/net/SocketMultiplexer.cpp index bab76b20..77b5f0dd 100644 --- a/src/lib/net/SocketMultiplexer.cpp +++ b/src/lib/net/SocketMultiplexer.cpp @@ -34,319 +34,319 @@ // SocketMultiplexer::SocketMultiplexer() : - m_mutex(new Mutex), - m_thread(NULL), - m_update(false), - m_jobsReady(new CondVar(m_mutex, false)), - m_jobListLock(new CondVar(m_mutex, false)), - m_jobListLockLocked(new CondVar(m_mutex, false)), - m_jobListLocker(NULL), - m_jobListLockLocker(NULL) + m_mutex(new Mutex), + m_thread(NULL), + m_update(false), + m_jobsReady(new CondVar(m_mutex, false)), + m_jobListLock(new CondVar(m_mutex, false)), + m_jobListLockLocked(new CondVar(m_mutex, false)), + m_jobListLocker(NULL), + m_jobListLockLocker(NULL) { - // this pointer just has to be unique and not NULL. it will - // never be dereferenced. it's used to identify cursor nodes - // in the jobs list. - // TODO: Remove this evilness - m_cursorMark = reinterpret_cast(this); + // this pointer just has to be unique and not NULL. it will + // never be dereferenced. it's used to identify cursor nodes + // in the jobs list. + // TODO: Remove this evilness + m_cursorMark = reinterpret_cast(this); - // start thread - m_thread = new Thread(new TMethodJob( - this, &SocketMultiplexer::serviceThread)); + // start thread + m_thread = new Thread(new TMethodJob( + this, &SocketMultiplexer::serviceThread)); } SocketMultiplexer::~SocketMultiplexer() { - m_thread->cancel(); - m_thread->unblockPollSocket(); - m_thread->wait(); - delete m_thread; - delete m_jobsReady; - delete m_jobListLock; - delete m_jobListLockLocked; - delete m_jobListLocker; - delete m_jobListLockLocker; - delete m_mutex; + m_thread->cancel(); + m_thread->unblockPollSocket(); + m_thread->wait(); + delete m_thread; + delete m_jobsReady; + delete m_jobListLock; + delete m_jobListLockLocked; + delete m_jobListLocker; + delete m_jobListLockLocker; + delete m_mutex; - // clean up jobs - for (SocketJobMap::iterator i = m_socketJobMap.begin(); - i != m_socketJobMap.end(); ++i) { - delete *(i->second); - } + // clean up jobs + for (SocketJobMap::iterator i = m_socketJobMap.begin(); + i != m_socketJobMap.end(); ++i) { + delete *(i->second); + } } void SocketMultiplexer::addSocket(ISocket* socket, ISocketMultiplexerJob* job) { - assert(socket != NULL); - assert(job != NULL); + assert(socket != NULL); + assert(job != NULL); - // prevent other threads from locking the job list - lockJobListLock(); + // prevent other threads from locking the job list + lockJobListLock(); - // break thread out of poll - m_thread->unblockPollSocket(); + // break thread out of poll + m_thread->unblockPollSocket(); - // lock the job list - lockJobList(); + // lock the job list + lockJobList(); - // insert/replace job - SocketJobMap::iterator i = m_socketJobMap.find(socket); - if (i == m_socketJobMap.end()) { - // we *must* put the job at the end so the order of jobs in - // the list continue to match the order of jobs in pfds in - // serviceThread(). - JobCursor j = m_socketJobs.insert(m_socketJobs.end(), job); - m_update = true; - m_socketJobMap.insert(std::make_pair(socket, j)); - } - else { - JobCursor j = i->second; - if (*j != job) { - delete *j; - *j = job; - } - m_update = true; - } + // insert/replace job + SocketJobMap::iterator i = m_socketJobMap.find(socket); + if (i == m_socketJobMap.end()) { + // we *must* put the job at the end so the order of jobs in + // the list continue to match the order of jobs in pfds in + // serviceThread(). + JobCursor j = m_socketJobs.insert(m_socketJobs.end(), job); + m_update = true; + m_socketJobMap.insert(std::make_pair(socket, j)); + } + else { + JobCursor j = i->second; + if (*j != job) { + delete *j; + *j = job; + } + m_update = true; + } - // unlock the job list - unlockJobList(); + // unlock the job list + unlockJobList(); } void SocketMultiplexer::removeSocket(ISocket* socket) { - assert(socket != NULL); + assert(socket != NULL); - // prevent other threads from locking the job list - lockJobListLock(); + // prevent other threads from locking the job list + lockJobListLock(); - // break thread out of poll - m_thread->unblockPollSocket(); + // break thread out of poll + m_thread->unblockPollSocket(); - // lock the job list - lockJobList(); + // lock the job list + lockJobList(); - // remove job. rather than removing it from the map we put NULL - // in the list instead so the order of jobs in the list continues - // to match the order of jobs in pfds in serviceThread(). - SocketJobMap::iterator i = m_socketJobMap.find(socket); - if (i != m_socketJobMap.end()) { - if (*(i->second) != NULL) { - delete *(i->second); - *(i->second) = NULL; - m_update = true; - } - } + // remove job. rather than removing it from the map we put NULL + // in the list instead so the order of jobs in the list continues + // to match the order of jobs in pfds in serviceThread(). + SocketJobMap::iterator i = m_socketJobMap.find(socket); + if (i != m_socketJobMap.end()) { + if (*(i->second) != NULL) { + delete *(i->second); + *(i->second) = NULL; + m_update = true; + } + } - // unlock the job list - unlockJobList(); + // unlock the job list + unlockJobList(); } void SocketMultiplexer::serviceThread(void*) { - std::vector pfds; - IArchNetwork::PollEntry pfd; + std::vector pfds; + IArchNetwork::PollEntry pfd; - // service the connections - for (;;) { - Thread::testCancel(); + // service the connections + for (;;) { + Thread::testCancel(); - // wait until there are jobs to handle - { - Lock lock(m_mutex); - while (!(bool)*m_jobsReady) { - m_jobsReady->wait(); - } - } + // wait until there are jobs to handle + { + Lock lock(m_mutex); + while (!(bool)*m_jobsReady) { + m_jobsReady->wait(); + } + } - // lock the job list - lockJobListLock(); - lockJobList(); + // lock the job list + lockJobListLock(); + lockJobList(); - // collect poll entries - if (m_update) { - m_update = false; - pfds.clear(); - pfds.reserve(m_socketJobMap.size()); + // collect poll entries + if (m_update) { + m_update = false; + pfds.clear(); + pfds.reserve(m_socketJobMap.size()); - JobCursor cursor = newCursor(); - JobCursor jobCursor = nextCursor(cursor); - while (jobCursor != m_socketJobs.end()) { - ISocketMultiplexerJob* job = *jobCursor; - if (job != NULL) { - pfd.m_socket = job->getSocket(); - pfd.m_events = 0; - if (job->isReadable()) { - pfd.m_events |= IArchNetwork::kPOLLIN; - } - if (job->isWritable()) { - pfd.m_events |= IArchNetwork::kPOLLOUT; - } - pfds.push_back(pfd); - } - jobCursor = nextCursor(cursor); - } - deleteCursor(cursor); - } + JobCursor cursor = newCursor(); + JobCursor jobCursor = nextCursor(cursor); + while (jobCursor != m_socketJobs.end()) { + ISocketMultiplexerJob* job = *jobCursor; + if (job != NULL) { + pfd.m_socket = job->getSocket(); + pfd.m_events = 0; + if (job->isReadable()) { + pfd.m_events |= IArchNetwork::kPOLLIN; + } + if (job->isWritable()) { + pfd.m_events |= IArchNetwork::kPOLLOUT; + } + pfds.push_back(pfd); + } + jobCursor = nextCursor(cursor); + } + deleteCursor(cursor); + } - int status; - try { - // check for status - if (!pfds.empty()) { - status = ARCH->pollSocket(&pfds[0], (int)pfds.size(), -1); - } - else { - status = 0; - } - } - catch (XArchNetwork& e) { - LOG((CLOG_WARN "error in socket multiplexer: %s", e.what())); - status = 0; - } + int status; + try { + // check for status + if (!pfds.empty()) { + status = ARCH->pollSocket(&pfds[0], (int)pfds.size(), -1); + } + else { + status = 0; + } + } + catch (XArchNetwork& e) { + LOG((CLOG_WARN "error in socket multiplexer: %s", e.what())); + status = 0; + } - if (status != 0) { - // iterate over socket jobs, invoking each and saving the - // new job. - UInt32 i = 0; - JobCursor cursor = newCursor(); - JobCursor jobCursor = nextCursor(cursor); - while (i < pfds.size() && jobCursor != m_socketJobs.end()) { - if (*jobCursor != NULL) { - // get poll state - unsigned short revents = pfds[i].m_revents; - bool read = ((revents & IArchNetwork::kPOLLIN) != 0); - bool write = ((revents & IArchNetwork::kPOLLOUT) != 0); - bool error = ((revents & (IArchNetwork::kPOLLERR | - IArchNetwork::kPOLLNVAL)) != 0); + if (status != 0) { + // iterate over socket jobs, invoking each and saving the + // new job. + UInt32 i = 0; + JobCursor cursor = newCursor(); + JobCursor jobCursor = nextCursor(cursor); + while (i < pfds.size() && jobCursor != m_socketJobs.end()) { + if (*jobCursor != NULL) { + // get poll state + unsigned short revents = pfds[i].m_revents; + bool read = ((revents & IArchNetwork::kPOLLIN) != 0); + bool write = ((revents & IArchNetwork::kPOLLOUT) != 0); + bool error = ((revents & (IArchNetwork::kPOLLERR | + IArchNetwork::kPOLLNVAL)) != 0); - // run job - ISocketMultiplexerJob* job = *jobCursor; - ISocketMultiplexerJob* newJob = job->run(read, write, error); + // run job + ISocketMultiplexerJob* job = *jobCursor; + ISocketMultiplexerJob* newJob = job->run(read, write, error); - // save job, if different - if (newJob != job) { - Lock lock(m_mutex); - delete job; - *jobCursor = newJob; - m_update = true; - } - ++i; - } + // save job, if different + if (newJob != job) { + Lock lock(m_mutex); + delete job; + *jobCursor = newJob; + m_update = true; + } + ++i; + } - // next job - jobCursor = nextCursor(cursor); - } - deleteCursor(cursor); - } + // next job + jobCursor = nextCursor(cursor); + } + deleteCursor(cursor); + } - // delete any removed socket jobs - for (SocketJobMap::iterator i = m_socketJobMap.begin(); - i != m_socketJobMap.end();) { - if (*(i->second) == NULL) { - m_socketJobs.erase(i->second); - m_socketJobMap.erase(i++); - m_update = true; - } - else { - ++i; - } - } + // delete any removed socket jobs + for (SocketJobMap::iterator i = m_socketJobMap.begin(); + i != m_socketJobMap.end();) { + if (*(i->second) == NULL) { + m_socketJobs.erase(i->second); + m_socketJobMap.erase(i++); + m_update = true; + } + else { + ++i; + } + } - // unlock the job list - unlockJobList(); - } + // unlock the job list + unlockJobList(); + } } SocketMultiplexer::JobCursor SocketMultiplexer::newCursor() { - Lock lock(m_mutex); - return m_socketJobs.insert(m_socketJobs.begin(), m_cursorMark); + Lock lock(m_mutex); + return m_socketJobs.insert(m_socketJobs.begin(), m_cursorMark); } SocketMultiplexer::JobCursor SocketMultiplexer::nextCursor(JobCursor cursor) { - Lock lock(m_mutex); - JobCursor j = m_socketJobs.end(); - JobCursor i = cursor; - while (++i != m_socketJobs.end()) { - if (*i != m_cursorMark) { - // found a real job (as opposed to a cursor) - j = i; + Lock lock(m_mutex); + JobCursor j = m_socketJobs.end(); + JobCursor i = cursor; + while (++i != m_socketJobs.end()) { + if (*i != m_cursorMark) { + // found a real job (as opposed to a cursor) + j = i; - // move our cursor just past the job - m_socketJobs.splice(++i, m_socketJobs, cursor); - break; - } - } - return j; + // move our cursor just past the job + m_socketJobs.splice(++i, m_socketJobs, cursor); + break; + } + } + return j; } void SocketMultiplexer::deleteCursor(JobCursor cursor) { - Lock lock(m_mutex); - m_socketJobs.erase(cursor); + Lock lock(m_mutex); + m_socketJobs.erase(cursor); } void SocketMultiplexer::lockJobListLock() { - Lock lock(m_mutex); + Lock lock(m_mutex); - // wait for the lock on the lock - while (*m_jobListLockLocked) { - m_jobListLockLocked->wait(); - } + // wait for the lock on the lock + while (*m_jobListLockLocked) { + m_jobListLockLocked->wait(); + } - // take ownership of the lock on the lock - *m_jobListLockLocked = true; - m_jobListLockLocker = new Thread(Thread::getCurrentThread()); + // take ownership of the lock on the lock + *m_jobListLockLocked = true; + m_jobListLockLocker = new Thread(Thread::getCurrentThread()); } void SocketMultiplexer::lockJobList() { - Lock lock(m_mutex); + Lock lock(m_mutex); - // make sure we're the one that called lockJobListLock() - assert(*m_jobListLockLocker == Thread::getCurrentThread()); + // make sure we're the one that called lockJobListLock() + assert(*m_jobListLockLocker == Thread::getCurrentThread()); - // wait for the job list lock - while (*m_jobListLock) { - m_jobListLock->wait(); - } + // wait for the job list lock + while (*m_jobListLock) { + m_jobListLock->wait(); + } - // take ownership of the lock - *m_jobListLock = true; - m_jobListLocker = m_jobListLockLocker; - m_jobListLockLocker = NULL; + // take ownership of the lock + *m_jobListLock = true; + m_jobListLocker = m_jobListLockLocker; + m_jobListLockLocker = NULL; - // release the lock on the lock - *m_jobListLockLocked = false; - m_jobListLockLocked->broadcast(); + // release the lock on the lock + *m_jobListLockLocked = false; + m_jobListLockLocked->broadcast(); } void SocketMultiplexer::unlockJobList() { - Lock lock(m_mutex); + Lock lock(m_mutex); - // make sure we're the one that called lockJobList() - assert(*m_jobListLocker == Thread::getCurrentThread()); + // make sure we're the one that called lockJobList() + assert(*m_jobListLocker == Thread::getCurrentThread()); - // release the lock - delete m_jobListLocker; - m_jobListLocker = NULL; - *m_jobListLock = false; - m_jobListLock->signal(); + // release the lock + delete m_jobListLocker; + m_jobListLocker = NULL; + *m_jobListLock = false; + m_jobListLock->signal(); - // set new jobs ready state - bool isReady = !m_socketJobMap.empty(); - if (*m_jobsReady != isReady) { - *m_jobsReady = isReady; - m_jobsReady->signal(); - } + // set new jobs ready state + bool isReady = !m_socketJobMap.empty(); + if (*m_jobsReady != isReady) { + *m_jobsReady = isReady; + m_jobsReady->signal(); + } } diff --git a/src/lib/net/SocketMultiplexer.h b/src/lib/net/SocketMultiplexer.h index bfdc8e61..f745ed00 100644 --- a/src/lib/net/SocketMultiplexer.h +++ b/src/lib/net/SocketMultiplexer.h @@ -35,77 +35,77 @@ A socket multiplexer services multiple sockets simultaneously. */ class SocketMultiplexer { public: - SocketMultiplexer(); - ~SocketMultiplexer(); + SocketMultiplexer(); + ~SocketMultiplexer(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - void addSocket(ISocket*, ISocketMultiplexerJob*); + void addSocket(ISocket*, ISocketMultiplexerJob*); - void removeSocket(ISocket*); + void removeSocket(ISocket*); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - // maybe belongs on ISocketMultiplexer - static SocketMultiplexer* - getInstance(); + // maybe belongs on ISocketMultiplexer + static SocketMultiplexer* + getInstance(); - //@} + //@} private: - // list of jobs. we use a list so we can safely iterate over it - // while other threads modify it. - typedef std::list SocketJobs; - typedef SocketJobs::iterator JobCursor; - typedef std::map SocketJobMap; + // list of jobs. we use a list so we can safely iterate over it + // while other threads modify it. + typedef std::list SocketJobs; + typedef SocketJobs::iterator JobCursor; + typedef std::map SocketJobMap; - // service sockets. the service thread will only access m_sockets - // and m_update while m_pollable and m_polling are true. all other - // threads must only modify these when m_pollable and m_polling are - // false. only the service thread sets m_polling. - void serviceThread(void*); + // service sockets. the service thread will only access m_sockets + // and m_update while m_pollable and m_polling are true. all other + // threads must only modify these when m_pollable and m_polling are + // false. only the service thread sets m_polling. + void serviceThread(void*); - // create, iterate, and destroy a cursor. a cursor is used to - // safely iterate through the job list while other threads modify - // the list. it works by inserting a dummy item in the list and - // moving that item through the list. the dummy item will never - // be removed by other edits so an iterator pointing at the item - // remains valid until we remove the dummy item in deleteCursor(). - // nextCursor() finds the next non-dummy item, moves our dummy - // item just past it, and returns an iterator for the non-dummy - // item. all cursor calls lock the mutex for their duration. - JobCursor newCursor(); - JobCursor nextCursor(JobCursor); - void deleteCursor(JobCursor); + // create, iterate, and destroy a cursor. a cursor is used to + // safely iterate through the job list while other threads modify + // the list. it works by inserting a dummy item in the list and + // moving that item through the list. the dummy item will never + // be removed by other edits so an iterator pointing at the item + // remains valid until we remove the dummy item in deleteCursor(). + // nextCursor() finds the next non-dummy item, moves our dummy + // item just past it, and returns an iterator for the non-dummy + // item. all cursor calls lock the mutex for their duration. + JobCursor newCursor(); + JobCursor nextCursor(JobCursor); + void deleteCursor(JobCursor); - // lock out locking the job list. this blocks if another thread - // has already locked out locking. once it returns, only the - // calling thread will be able to lock the job list after any - // current lock is released. - void lockJobListLock(); + // lock out locking the job list. this blocks if another thread + // has already locked out locking. once it returns, only the + // calling thread will be able to lock the job list after any + // current lock is released. + void lockJobListLock(); - // lock the job list. this blocks if the job list is already - // locked. the calling thread must have called requestJobLock. - void lockJobList(); + // lock the job list. this blocks if the job list is already + // locked. the calling thread must have called requestJobLock. + void lockJobList(); - // unlock the job list and the lock out on locking. - void unlockJobList(); + // unlock the job list and the lock out on locking. + void unlockJobList(); private: - Mutex* m_mutex; - Thread* m_thread; - bool m_update; - CondVar* m_jobsReady; - CondVar* m_jobListLock; - CondVar* m_jobListLockLocked; - Thread* m_jobListLocker; - Thread* m_jobListLockLocker; + Mutex* m_mutex; + Thread* m_thread; + bool m_update; + CondVar* m_jobsReady; + CondVar* m_jobListLock; + CondVar* m_jobListLockLocked; + Thread* m_jobListLocker; + Thread* m_jobListLockLocker; - SocketJobs m_socketJobs; - SocketJobMap m_socketJobMap; - ISocketMultiplexerJob* - m_cursorMark; + SocketJobs m_socketJobs; + SocketJobMap m_socketJobMap; + ISocketMultiplexerJob* + m_cursorMark; }; diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp index 2b20c124..23abed40 100644 --- a/src/lib/net/TCPListenSocket.cpp +++ b/src/lib/net/TCPListenSocket.cpp @@ -35,124 +35,124 @@ // TCPListenSocket::TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : - m_events(events), - m_socketMultiplexer(socketMultiplexer) + m_events(events), + m_socketMultiplexer(socketMultiplexer) { - m_mutex = new Mutex; - try { - m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); - } - catch (XArchNetwork& e) { - throw XSocketCreate(e.what()); - } + m_mutex = new Mutex; + try { + m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); + } + catch (XArchNetwork& e) { + throw XSocketCreate(e.what()); + } } TCPListenSocket::~TCPListenSocket() { - try { - if (m_socket != NULL) { - m_socketMultiplexer->removeSocket(this); - ARCH->closeSocket(m_socket); - } - } - catch (...) { - // ignore - } - delete m_mutex; + try { + if (m_socket != NULL) { + m_socketMultiplexer->removeSocket(this); + ARCH->closeSocket(m_socket); + } + } + catch (...) { + // ignore + } + delete m_mutex; } void TCPListenSocket::bind(const NetworkAddress& addr) { - try { - Lock lock(m_mutex); - ARCH->setReuseAddrOnSocket(m_socket, true); - ARCH->bindSocket(m_socket, addr.getAddress()); - ARCH->listenOnSocket(m_socket); - m_socketMultiplexer->addSocket(this, - new TSocketMultiplexerMethodJob( - this, &TCPListenSocket::serviceListening, - m_socket, true, false)); - } - catch (XArchNetworkAddressInUse& e) { - throw XSocketAddressInUse(e.what()); - } - catch (XArchNetwork& e) { - throw XSocketBind(e.what()); - } + try { + Lock lock(m_mutex); + ARCH->setReuseAddrOnSocket(m_socket, true); + ARCH->bindSocket(m_socket, addr.getAddress()); + ARCH->listenOnSocket(m_socket); + m_socketMultiplexer->addSocket(this, + new TSocketMultiplexerMethodJob( + this, &TCPListenSocket::serviceListening, + m_socket, true, false)); + } + catch (XArchNetworkAddressInUse& e) { + throw XSocketAddressInUse(e.what()); + } + catch (XArchNetwork& e) { + throw XSocketBind(e.what()); + } } void TCPListenSocket::close() { - Lock lock(m_mutex); - if (m_socket == NULL) { - throw XIOClosed(); - } - try { - m_socketMultiplexer->removeSocket(this); - ARCH->closeSocket(m_socket); - m_socket = NULL; - } - catch (XArchNetwork& e) { - throw XSocketIOClose(e.what()); - } + Lock lock(m_mutex); + if (m_socket == NULL) { + throw XIOClosed(); + } + try { + m_socketMultiplexer->removeSocket(this); + ARCH->closeSocket(m_socket); + m_socket = NULL; + } + catch (XArchNetwork& e) { + throw XSocketIOClose(e.what()); + } } void* TCPListenSocket::getEventTarget() const { - return const_cast(static_cast(this)); + return const_cast(static_cast(this)); } IDataSocket* TCPListenSocket::accept() { - IDataSocket* socket = NULL; - try { - socket = new TCPSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, NULL)); - if (socket != NULL) { - setListeningJob(); - } - return socket; - } - catch (XArchNetwork&) { - if (socket != NULL) { - delete socket; - setListeningJob(); - } - return NULL; - } - catch (std::exception &ex) { - if (socket != NULL) { - delete socket; - setListeningJob(); - } - throw ex; - } + IDataSocket* socket = NULL; + try { + socket = new TCPSocket(m_events, m_socketMultiplexer, ARCH->acceptSocket(m_socket, NULL)); + if (socket != NULL) { + setListeningJob(); + } + return socket; + } + catch (XArchNetwork&) { + if (socket != NULL) { + delete socket; + setListeningJob(); + } + return NULL; + } + catch (std::exception &ex) { + if (socket != NULL) { + delete socket; + setListeningJob(); + } + throw ex; + } } void TCPListenSocket::setListeningJob() { - m_socketMultiplexer->addSocket(this, - new TSocketMultiplexerMethodJob( - this, &TCPListenSocket::serviceListening, - m_socket, true, false)); + m_socketMultiplexer->addSocket(this, + new TSocketMultiplexerMethodJob( + this, &TCPListenSocket::serviceListening, + m_socket, true, false)); } ISocketMultiplexerJob* TCPListenSocket::serviceListening(ISocketMultiplexerJob* job, - bool read, bool, bool error) + bool read, bool, bool error) { - if (error) { - close(); - return NULL; - } - if (read) { - m_events->addEvent(Event(m_events->forIListenSocket().connecting(), this, NULL)); - // stop polling on this socket until the client accepts - return NULL; - } - return job; + if (error) { + close(); + return NULL; + } + if (read) { + m_events->addEvent(Event(m_events->forIListenSocket().connecting(), this, NULL)); + // stop polling on this socket until the client accepts + return NULL; + } + return job; } diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h index 41308622..4abd752c 100644 --- a/src/lib/net/TCPListenSocket.h +++ b/src/lib/net/TCPListenSocket.h @@ -32,29 +32,29 @@ A listen socket using TCP. */ class TCPListenSocket : public IListenSocket { public: - TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - virtual ~TCPListenSocket(); + TCPListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + virtual ~TCPListenSocket(); - // ISocket overrides - virtual void bind(const NetworkAddress&); - virtual void close(); - virtual void* getEventTarget() const; + // ISocket overrides + virtual void bind(const NetworkAddress&); + virtual void close(); + virtual void* getEventTarget() const; - // IListenSocket overrides - virtual IDataSocket* - accept(); + // IListenSocket overrides + virtual IDataSocket* + accept(); protected: - void setListeningJob(); + void setListeningJob(); public: - ISocketMultiplexerJob* - serviceListening(ISocketMultiplexerJob*, - bool, bool, bool); + ISocketMultiplexerJob* + serviceListening(ISocketMultiplexerJob*, + bool, bool, bool); protected: - ArchSocket m_socket; - Mutex* m_mutex; - IEventQueue* m_events; - SocketMultiplexer* m_socketMultiplexer; + ArchSocket m_socket; + Mutex* m_mutex; + IEventQueue* m_events; + SocketMultiplexer* m_socketMultiplexer; }; diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp index 680e49e5..9498e946 100644 --- a/src/lib/net/TCPSocket.cpp +++ b/src/lib/net/TCPSocket.cpp @@ -38,553 +38,553 @@ // TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : - IDataSocket(events), - m_events(events), - m_mutex(), - m_flushed(&m_mutex, true), - m_socketMultiplexer(socketMultiplexer) + IDataSocket(events), + m_events(events), + m_mutex(), + m_flushed(&m_mutex, true), + m_socketMultiplexer(socketMultiplexer) { - try { - m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); - } - catch (XArchNetwork& e) { - throw XSocketCreate(e.what()); - } + try { + m_socket = ARCH->newSocket(IArchNetwork::kINET, IArchNetwork::kSTREAM); + } + catch (XArchNetwork& e) { + throw XSocketCreate(e.what()); + } - init(); + init(); } TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket) : - IDataSocket(events), - m_events(events), - m_mutex(), - m_socket(socket), - m_flushed(&m_mutex, true), - m_socketMultiplexer(socketMultiplexer) + IDataSocket(events), + m_events(events), + m_mutex(), + m_socket(socket), + m_flushed(&m_mutex, true), + m_socketMultiplexer(socketMultiplexer) { - assert(m_socket != NULL); + assert(m_socket != NULL); - // socket starts in connected state - init(); - onConnected(); - setJob(newJob()); + // socket starts in connected state + init(); + onConnected(); + setJob(newJob()); } TCPSocket::~TCPSocket() { - try { - close(); - } - catch (...) { - // ignore - } + try { + close(); + } + catch (...) { + // ignore + } } void TCPSocket::bind(const NetworkAddress& addr) { - try { - ARCH->bindSocket(m_socket, addr.getAddress()); - } - catch (XArchNetworkAddressInUse& e) { - throw XSocketAddressInUse(e.what()); - } - catch (XArchNetwork& e) { - throw XSocketBind(e.what()); - } + try { + ARCH->bindSocket(m_socket, addr.getAddress()); + } + catch (XArchNetworkAddressInUse& e) { + throw XSocketAddressInUse(e.what()); + } + catch (XArchNetwork& e) { + throw XSocketBind(e.what()); + } } void TCPSocket::close() { - // remove ourself from the multiplexer - setJob(NULL); + // remove ourself from the multiplexer + setJob(NULL); - Lock lock(&m_mutex); + Lock lock(&m_mutex); - // clear buffers and enter disconnected state - if (m_connected) { - sendEvent(m_events->forISocket().disconnected()); - } - onDisconnected(); + // clear buffers and enter disconnected state + if (m_connected) { + sendEvent(m_events->forISocket().disconnected()); + } + onDisconnected(); - // close the socket - if (m_socket != NULL) { - ArchSocket socket = m_socket; - m_socket = NULL; - try { - ARCH->closeSocket(socket); - } - catch (XArchNetwork& e) { - // ignore, there's not much we can do - LOG((CLOG_WARN "error closing socket: %s", e.what())); - } - } + // close the socket + if (m_socket != NULL) { + ArchSocket socket = m_socket; + m_socket = NULL; + try { + ARCH->closeSocket(socket); + } + catch (XArchNetwork& e) { + // ignore, there's not much we can do + LOG((CLOG_WARN "error closing socket: %s", e.what())); + } + } } void* TCPSocket::getEventTarget() const { - return const_cast(static_cast(this)); + return const_cast(static_cast(this)); } UInt32 TCPSocket::read(void* buffer, UInt32 n) { - // copy data directly from our input buffer - Lock lock(&m_mutex); - UInt32 size = m_inputBuffer.getSize(); - if (n > size) { - n = size; - } - if (buffer != NULL && n != 0) { - memcpy(buffer, m_inputBuffer.peek(n), n); - } - m_inputBuffer.pop(n); + // copy data directly from our input buffer + Lock lock(&m_mutex); + UInt32 size = m_inputBuffer.getSize(); + if (n > size) { + n = size; + } + if (buffer != NULL && n != 0) { + memcpy(buffer, m_inputBuffer.peek(n), n); + } + m_inputBuffer.pop(n); - // if no more data and we cannot read or write then send disconnected - if (n > 0 && m_inputBuffer.getSize() == 0 && !m_readable && !m_writable) { - sendEvent(m_events->forISocket().disconnected()); - m_connected = false; - } + // if no more data and we cannot read or write then send disconnected + if (n > 0 && m_inputBuffer.getSize() == 0 && !m_readable && !m_writable) { + sendEvent(m_events->forISocket().disconnected()); + m_connected = false; + } - return n; + return n; } void TCPSocket::write(const void* buffer, UInt32 n) { - bool wasEmpty; - { - Lock lock(&m_mutex); + bool wasEmpty; + { + Lock lock(&m_mutex); - // must not have shutdown output - if (!m_writable) { - sendEvent(m_events->forIStream().outputError()); - return; - } + // must not have shutdown output + if (!m_writable) { + sendEvent(m_events->forIStream().outputError()); + return; + } - // ignore empty writes - if (n == 0) { - return; - } + // ignore empty writes + if (n == 0) { + return; + } - // copy data to the output buffer - wasEmpty = (m_outputBuffer.getSize() == 0); - m_outputBuffer.write(buffer, n); + // copy data to the output buffer + wasEmpty = (m_outputBuffer.getSize() == 0); + m_outputBuffer.write(buffer, n); - // there's data to write - m_flushed = false; - } + // there's data to write + m_flushed = false; + } - // make sure we're waiting to write - if (wasEmpty) { - setJob(newJob()); - } + // make sure we're waiting to write + if (wasEmpty) { + setJob(newJob()); + } } void TCPSocket::flush() { - Lock lock(&m_mutex); - while (m_flushed == false) { - m_flushed.wait(); - } + Lock lock(&m_mutex); + while (m_flushed == false) { + m_flushed.wait(); + } } void TCPSocket::shutdownInput() { - bool useNewJob = false; - { - Lock lock(&m_mutex); + bool useNewJob = false; + { + Lock lock(&m_mutex); - // shutdown socket for reading - try { - ARCH->closeSocketForRead(m_socket); - } - catch (XArchNetwork&) { - // ignore - } + // shutdown socket for reading + try { + ARCH->closeSocketForRead(m_socket); + } + catch (XArchNetwork&) { + // ignore + } - // shutdown buffer for reading - if (m_readable) { - sendEvent(m_events->forIStream().inputShutdown()); - onInputShutdown(); - useNewJob = true; - } - } - if (useNewJob) { - setJob(newJob()); - } + // shutdown buffer for reading + if (m_readable) { + sendEvent(m_events->forIStream().inputShutdown()); + onInputShutdown(); + useNewJob = true; + } + } + if (useNewJob) { + setJob(newJob()); + } } void TCPSocket::shutdownOutput() { - bool useNewJob = false; - { - Lock lock(&m_mutex); + bool useNewJob = false; + { + Lock lock(&m_mutex); - // shutdown socket for writing - try { - ARCH->closeSocketForWrite(m_socket); - } - catch (XArchNetwork&) { - // ignore - } + // shutdown socket for writing + try { + ARCH->closeSocketForWrite(m_socket); + } + catch (XArchNetwork&) { + // ignore + } - // shutdown buffer for writing - if (m_writable) { - sendEvent(m_events->forIStream().outputShutdown()); - onOutputShutdown(); - useNewJob = true; - } - } - if (useNewJob) { - setJob(newJob()); - } + // shutdown buffer for writing + if (m_writable) { + sendEvent(m_events->forIStream().outputShutdown()); + onOutputShutdown(); + useNewJob = true; + } + } + if (useNewJob) { + setJob(newJob()); + } } bool TCPSocket::isReady() const { - Lock lock(&m_mutex); - return (m_inputBuffer.getSize() > 0); + Lock lock(&m_mutex); + return (m_inputBuffer.getSize() > 0); } bool TCPSocket::isFatal() const { - // TCP sockets aren't ever left in a fatal state. - LOG((CLOG_ERR "isFatal() not valid for non-secure connections")); - return false; + // TCP sockets aren't ever left in a fatal state. + LOG((CLOG_ERR "isFatal() not valid for non-secure connections")); + return false; } UInt32 TCPSocket::getSize() const { - Lock lock(&m_mutex); - return m_inputBuffer.getSize(); + Lock lock(&m_mutex); + return m_inputBuffer.getSize(); } void TCPSocket::connect(const NetworkAddress& addr) { - { - Lock lock(&m_mutex); + { + Lock lock(&m_mutex); - // fail on attempts to reconnect - if (m_socket == NULL || m_connected) { - sendConnectionFailedEvent("busy"); - return; - } + // fail on attempts to reconnect + if (m_socket == NULL || m_connected) { + sendConnectionFailedEvent("busy"); + return; + } - try { - if (ARCH->connectSocket(m_socket, addr.getAddress())) { - sendEvent(m_events->forIDataSocket().connected()); - onConnected(); - } - else { - // connection is in progress - m_writable = true; - } - } - catch (XArchNetwork& e) { - throw XSocketConnect(e.what()); - } - } - setJob(newJob()); + try { + if (ARCH->connectSocket(m_socket, addr.getAddress())) { + sendEvent(m_events->forIDataSocket().connected()); + onConnected(); + } + else { + // connection is in progress + m_writable = true; + } + } + catch (XArchNetwork& e) { + throw XSocketConnect(e.what()); + } + } + setJob(newJob()); } void TCPSocket::init() { - // default state - m_connected = false; - m_readable = false; - m_writable = false; + // default state + m_connected = false; + m_readable = false; + m_writable = false; - try { - // turn off Nagle algorithm. we send lots of very short messages - // that should be sent without (much) delay. for example, the - // mouse motion messages are much less useful if they're delayed. - ARCH->setNoDelayOnSocket(m_socket, true); - } - catch (XArchNetwork& e) { - try { - ARCH->closeSocket(m_socket); - m_socket = NULL; - } - catch (XArchNetwork&) { - // ignore - } - throw XSocketCreate(e.what()); - } + try { + // turn off Nagle algorithm. we send lots of very short messages + // that should be sent without (much) delay. for example, the + // mouse motion messages are much less useful if they're delayed. + ARCH->setNoDelayOnSocket(m_socket, true); + } + catch (XArchNetwork& e) { + try { + ARCH->closeSocket(m_socket); + m_socket = NULL; + } + catch (XArchNetwork&) { + // ignore + } + throw XSocketCreate(e.what()); + } } TCPSocket::EJobResult TCPSocket::doRead() { - UInt8 buffer[4096]; - memset(buffer, 0, sizeof(buffer)); - size_t bytesRead = 0; - - bytesRead = (int) ARCH->readSocket(m_socket, buffer, sizeof(buffer)); - - if (bytesRead > 0) { - bool wasEmpty = (m_inputBuffer.getSize() == 0); - - // slurp up as much as possible - do { - m_inputBuffer.write(buffer, bytesRead); + UInt8 buffer[4096]; + memset(buffer, 0, sizeof(buffer)); + size_t bytesRead = 0; + + bytesRead = (int) ARCH->readSocket(m_socket, buffer, sizeof(buffer)); + + if (bytesRead > 0) { + bool wasEmpty = (m_inputBuffer.getSize() == 0); + + // slurp up as much as possible + do { + m_inputBuffer.write(buffer, bytesRead); - bytesRead = ARCH->readSocket(m_socket, buffer, sizeof(buffer)); - } while (bytesRead > 0); - - // send input ready if input buffer was empty - if (wasEmpty) { - sendEvent(m_events->forIStream().inputReady()); - } - } - else { - // remote write end of stream hungup. our input side - // has therefore shutdown but don't flush our buffer - // since there's still data to be read. - sendEvent(m_events->forIStream().inputShutdown()); - if (!m_writable && m_inputBuffer.getSize() == 0) { - sendEvent(m_events->forISocket().disconnected()); - m_connected = false; - } - m_readable = false; - return kNew; - } - - return kRetry; + bytesRead = ARCH->readSocket(m_socket, buffer, sizeof(buffer)); + } while (bytesRead > 0); + + // send input ready if input buffer was empty + if (wasEmpty) { + sendEvent(m_events->forIStream().inputReady()); + } + } + else { + // remote write end of stream hungup. our input side + // has therefore shutdown but don't flush our buffer + // since there's still data to be read. + sendEvent(m_events->forIStream().inputShutdown()); + if (!m_writable && m_inputBuffer.getSize() == 0) { + sendEvent(m_events->forISocket().disconnected()); + m_connected = false; + } + m_readable = false; + return kNew; + } + + return kRetry; } TCPSocket::EJobResult TCPSocket::doWrite() { - // write data - UInt32 bufferSize = 0; - int bytesWrote = 0; + // write data + UInt32 bufferSize = 0; + int bytesWrote = 0; - bufferSize = m_outputBuffer.getSize(); - const void* buffer = m_outputBuffer.peek(bufferSize); - bytesWrote = (UInt32)ARCH->writeSocket(m_socket, buffer, bufferSize); + bufferSize = m_outputBuffer.getSize(); + const void* buffer = m_outputBuffer.peek(bufferSize); + bytesWrote = (UInt32)ARCH->writeSocket(m_socket, buffer, bufferSize); - if (bytesWrote > 0) { - discardWrittenData(bytesWrote); - return kNew; - } - - return kRetry; + if (bytesWrote > 0) { + discardWrittenData(bytesWrote); + return kNew; + } + + return kRetry; } void TCPSocket::setJob(ISocketMultiplexerJob* job) { - // multiplexer will delete the old job - if (job == NULL) { - m_socketMultiplexer->removeSocket(this); - } - else { - m_socketMultiplexer->addSocket(this, job); - } + // multiplexer will delete the old job + if (job == NULL) { + m_socketMultiplexer->removeSocket(this); + } + else { + m_socketMultiplexer->addSocket(this, job); + } } ISocketMultiplexerJob* TCPSocket::newJob() { - // note -- must have m_mutex locked on entry + // note -- must have m_mutex locked on entry - if (m_socket == NULL) { - return NULL; - } - else if (!m_connected) { - assert(!m_readable); - if (!(m_readable || m_writable)) { - return NULL; - } - return new TSocketMultiplexerMethodJob( - this, &TCPSocket::serviceConnecting, - m_socket, m_readable, m_writable); - } - else { - if (!(m_readable || (m_writable && (m_outputBuffer.getSize() > 0)))) { - return NULL; - } - return new TSocketMultiplexerMethodJob( - this, &TCPSocket::serviceConnected, - m_socket, m_readable, - m_writable && (m_outputBuffer.getSize() > 0)); - } + if (m_socket == NULL) { + return NULL; + } + else if (!m_connected) { + assert(!m_readable); + if (!(m_readable || m_writable)) { + return NULL; + } + return new TSocketMultiplexerMethodJob( + this, &TCPSocket::serviceConnecting, + m_socket, m_readable, m_writable); + } + else { + if (!(m_readable || (m_writable && (m_outputBuffer.getSize() > 0)))) { + return NULL; + } + return new TSocketMultiplexerMethodJob( + this, &TCPSocket::serviceConnected, + m_socket, m_readable, + m_writable && (m_outputBuffer.getSize() > 0)); + } } void TCPSocket::sendConnectionFailedEvent(const char* msg) { - ConnectionFailedInfo* info = new ConnectionFailedInfo(msg); - m_events->addEvent(Event(m_events->forIDataSocket().connectionFailed(), - getEventTarget(), info, Event::kDontFreeData)); + ConnectionFailedInfo* info = new ConnectionFailedInfo(msg); + m_events->addEvent(Event(m_events->forIDataSocket().connectionFailed(), + getEventTarget(), info, Event::kDontFreeData)); } void TCPSocket::sendEvent(Event::Type type) { - m_events->addEvent(Event(type, getEventTarget(), NULL)); + m_events->addEvent(Event(type, getEventTarget(), NULL)); } void TCPSocket::discardWrittenData(int bytesWrote) { - m_outputBuffer.pop(bytesWrote); - if (m_outputBuffer.getSize() == 0) { - sendEvent(m_events->forIStream().outputFlushed()); - m_flushed = true; - m_flushed.broadcast(); - } + m_outputBuffer.pop(bytesWrote); + if (m_outputBuffer.getSize() == 0) { + sendEvent(m_events->forIStream().outputFlushed()); + m_flushed = true; + m_flushed.broadcast(); + } } void TCPSocket::onConnected() { - m_connected = true; - m_readable = true; - m_writable = true; + m_connected = true; + m_readable = true; + m_writable = true; } void TCPSocket::onInputShutdown() { - m_inputBuffer.pop(m_inputBuffer.getSize()); - m_readable = false; + m_inputBuffer.pop(m_inputBuffer.getSize()); + m_readable = false; } void TCPSocket::onOutputShutdown() { - m_outputBuffer.pop(m_outputBuffer.getSize()); - m_writable = false; + m_outputBuffer.pop(m_outputBuffer.getSize()); + m_writable = false; - // we're now flushed - m_flushed = true; - m_flushed.broadcast(); + // we're now flushed + m_flushed = true; + m_flushed.broadcast(); } void TCPSocket::onDisconnected() { - // disconnected - onInputShutdown(); - onOutputShutdown(); - m_connected = false; + // disconnected + onInputShutdown(); + onOutputShutdown(); + m_connected = false; } ISocketMultiplexerJob* TCPSocket::serviceConnecting(ISocketMultiplexerJob* job, - bool, bool write, bool error) + bool, bool write, bool error) { - Lock lock(&m_mutex); + Lock lock(&m_mutex); - // should only check for errors if error is true but checking a new - // socket (and a socket that's connecting should be new) for errors - // should be safe and Mac OS X appears to have a bug where a - // non-blocking stream socket that fails to connect immediately is - // reported by select as being writable (i.e. connected) even when - // the connection has failed. this is easily demonstrated on OS X - // 10.3.4 by starting a synergy client and telling to connect to - // another system that's not running a synergy server. it will - // claim to have connected then quickly disconnect (i guess because - // read returns 0 bytes). unfortunately, synergy attempts to - // reconnect immediately, the process repeats and we end up - // spinning the CPU. luckily, OS X does set SO_ERROR on the - // socket correctly when the connection has failed so checking for - // errors works. (curiously, sometimes OS X doesn't report - // connection refused. when that happens it at least doesn't - // report the socket as being writable so synergy is able to time - // out the attempt.) - if (error || true) { - try { - // connection may have failed or succeeded - ARCH->throwErrorOnSocket(m_socket); - } - catch (XArchNetwork& e) { - sendConnectionFailedEvent(e.what()); - onDisconnected(); - return newJob(); - } - } + // should only check for errors if error is true but checking a new + // socket (and a socket that's connecting should be new) for errors + // should be safe and Mac OS X appears to have a bug where a + // non-blocking stream socket that fails to connect immediately is + // reported by select as being writable (i.e. connected) even when + // the connection has failed. this is easily demonstrated on OS X + // 10.3.4 by starting a synergy client and telling to connect to + // another system that's not running a synergy server. it will + // claim to have connected then quickly disconnect (i guess because + // read returns 0 bytes). unfortunately, synergy attempts to + // reconnect immediately, the process repeats and we end up + // spinning the CPU. luckily, OS X does set SO_ERROR on the + // socket correctly when the connection has failed so checking for + // errors works. (curiously, sometimes OS X doesn't report + // connection refused. when that happens it at least doesn't + // report the socket as being writable so synergy is able to time + // out the attempt.) + if (error || true) { + try { + // connection may have failed or succeeded + ARCH->throwErrorOnSocket(m_socket); + } + catch (XArchNetwork& e) { + sendConnectionFailedEvent(e.what()); + onDisconnected(); + return newJob(); + } + } - if (write) { - sendEvent(m_events->forIDataSocket().connected()); - onConnected(); - return newJob(); - } + if (write) { + sendEvent(m_events->forIDataSocket().connected()); + onConnected(); + return newJob(); + } - return job; + return job; } ISocketMultiplexerJob* TCPSocket::serviceConnected(ISocketMultiplexerJob* job, - bool read, bool write, bool error) + bool read, bool write, bool error) { - Lock lock(&m_mutex); + Lock lock(&m_mutex); - if (error) { - sendEvent(m_events->forISocket().disconnected()); - onDisconnected(); - return newJob(); - } + if (error) { + sendEvent(m_events->forISocket().disconnected()); + onDisconnected(); + return newJob(); + } - EJobResult result = kRetry; - if (write) { - try { - result = doWrite(); - } - catch (XArchNetworkShutdown&) { - // remote read end of stream hungup. our output side - // has therefore shutdown. - onOutputShutdown(); - sendEvent(m_events->forIStream().outputShutdown()); - if (!m_readable && m_inputBuffer.getSize() == 0) { - sendEvent(m_events->forISocket().disconnected()); - m_connected = false; - } - result = kNew; - } - catch (XArchNetworkDisconnected&) { - // stream hungup - onDisconnected(); - sendEvent(m_events->forISocket().disconnected()); - result = kNew; - } - catch (XArchNetwork& e) { - // other write error - LOG((CLOG_WARN "error writing socket: %s", e.what())); - onDisconnected(); - sendEvent(m_events->forIStream().outputError()); - sendEvent(m_events->forISocket().disconnected()); - result = kNew; - } - } + EJobResult result = kRetry; + if (write) { + try { + result = doWrite(); + } + catch (XArchNetworkShutdown&) { + // remote read end of stream hungup. our output side + // has therefore shutdown. + onOutputShutdown(); + sendEvent(m_events->forIStream().outputShutdown()); + if (!m_readable && m_inputBuffer.getSize() == 0) { + sendEvent(m_events->forISocket().disconnected()); + m_connected = false; + } + result = kNew; + } + catch (XArchNetworkDisconnected&) { + // stream hungup + onDisconnected(); + sendEvent(m_events->forISocket().disconnected()); + result = kNew; + } + catch (XArchNetwork& e) { + // other write error + LOG((CLOG_WARN "error writing socket: %s", e.what())); + onDisconnected(); + sendEvent(m_events->forIStream().outputError()); + sendEvent(m_events->forISocket().disconnected()); + result = kNew; + } + } - if (read && m_readable) { - try { - result = doRead(); - } - catch (XArchNetworkDisconnected&) { - // stream hungup - sendEvent(m_events->forISocket().disconnected()); - onDisconnected(); - result = kNew; - } - catch (XArchNetwork& e) { - // ignore other read error - LOG((CLOG_WARN "error reading socket: %s", e.what())); - } - } + if (read && m_readable) { + try { + result = doRead(); + } + catch (XArchNetworkDisconnected&) { + // stream hungup + sendEvent(m_events->forISocket().disconnected()); + onDisconnected(); + result = kNew; + } + catch (XArchNetwork& e) { + // ignore other read error + LOG((CLOG_WARN "error reading socket: %s", e.what())); + } + } - return result == kBreak ? NULL : result == kNew ? newJob() : job; + return result == kBreak ? NULL : result == kNew ? newJob() : job; } diff --git a/src/lib/net/TCPSocket.h b/src/lib/net/TCPSocket.h index f3beb2f8..b29aa927 100644 --- a/src/lib/net/TCPSocket.h +++ b/src/lib/net/TCPSocket.h @@ -36,81 +36,81 @@ A data socket using TCP. */ class TCPSocket : public IDataSocket { public: - TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket); - virtual ~TCPSocket(); + TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket); + virtual ~TCPSocket(); - // ISocket overrides - virtual void bind(const NetworkAddress&); - virtual void close(); - virtual void* getEventTarget() const; + // ISocket overrides + virtual void bind(const NetworkAddress&); + virtual void close(); + virtual void* getEventTarget() const; - // IStream overrides - virtual UInt32 read(void* buffer, UInt32 n); - virtual void write(const void* buffer, UInt32 n); - virtual void flush(); - virtual void shutdownInput(); - virtual void shutdownOutput(); - virtual bool isReady() const; - virtual bool isFatal() const; - virtual UInt32 getSize() const; + // IStream overrides + virtual UInt32 read(void* buffer, UInt32 n); + virtual void write(const void* buffer, UInt32 n); + virtual void flush(); + virtual void shutdownInput(); + virtual void shutdownOutput(); + virtual bool isReady() const; + virtual bool isFatal() const; + virtual UInt32 getSize() const; - // IDataSocket overrides - virtual void connect(const NetworkAddress&); + // IDataSocket overrides + virtual void connect(const NetworkAddress&); - - virtual ISocketMultiplexerJob* - newJob(); + + virtual ISocketMultiplexerJob* + newJob(); protected: - enum EJobResult { - kBreak = -1, //!< Break the Job chain - kRetry, //!< Retry the same job - kNew //!< Require a new job - }; - - ArchSocket getSocket() { return m_socket; } - IEventQueue* getEvents() { return m_events; } - virtual EJobResult doRead(); - virtual EJobResult doWrite(); + enum EJobResult { + kBreak = -1, //!< Break the Job chain + kRetry, //!< Retry the same job + kNew //!< Require a new job + }; + + ArchSocket getSocket() { return m_socket; } + IEventQueue* getEvents() { return m_events; } + virtual EJobResult doRead(); + virtual EJobResult doWrite(); - void setJob(ISocketMultiplexerJob*); - - bool isReadable() { return m_readable; } - bool isWritable() { return m_writable; } + void setJob(ISocketMultiplexerJob*); + + bool isReadable() { return m_readable; } + bool isWritable() { return m_writable; } - Mutex& getMutex() { return m_mutex; } + Mutex& getMutex() { return m_mutex; } - void sendEvent(Event::Type); - void discardWrittenData(int bytesWrote); + void sendEvent(Event::Type); + void discardWrittenData(int bytesWrote); private: - void init(); + void init(); - void sendConnectionFailedEvent(const char*); - void onConnected(); - void onInputShutdown(); - void onOutputShutdown(); - void onDisconnected(); + void sendConnectionFailedEvent(const char*); + void onConnected(); + void onInputShutdown(); + void onOutputShutdown(); + void onDisconnected(); - ISocketMultiplexerJob* - serviceConnecting(ISocketMultiplexerJob*, - bool, bool, bool); - ISocketMultiplexerJob* - serviceConnected(ISocketMultiplexerJob*, - bool, bool, bool); + ISocketMultiplexerJob* + serviceConnecting(ISocketMultiplexerJob*, + bool, bool, bool); + ISocketMultiplexerJob* + serviceConnected(ISocketMultiplexerJob*, + bool, bool, bool); protected: - bool m_readable; - bool m_writable; - bool m_connected; - IEventQueue* m_events; - StreamBuffer m_inputBuffer; - StreamBuffer m_outputBuffer; - + bool m_readable; + bool m_writable; + bool m_connected; + IEventQueue* m_events; + StreamBuffer m_inputBuffer; + StreamBuffer m_outputBuffer; + private: - Mutex m_mutex; - ArchSocket m_socket; - CondVar m_flushed; - SocketMultiplexer* m_socketMultiplexer; + Mutex m_mutex; + ArchSocket m_socket; + CondVar m_flushed; + SocketMultiplexer* m_socketMultiplexer; }; diff --git a/src/lib/net/TCPSocketFactory.cpp b/src/lib/net/TCPSocketFactory.cpp index e205a9fa..e8329980 100644 --- a/src/lib/net/TCPSocketFactory.cpp +++ b/src/lib/net/TCPSocketFactory.cpp @@ -29,40 +29,40 @@ // TCPSocketFactory::TCPSocketFactory(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : - m_events(events), - m_socketMultiplexer(socketMultiplexer) + m_events(events), + m_socketMultiplexer(socketMultiplexer) { - // do nothing + // do nothing } TCPSocketFactory::~TCPSocketFactory() { - // do nothing + // do nothing } IDataSocket* TCPSocketFactory::create(bool secure) const { - if (secure) { - SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer); - secureSocket->initSsl (false); - return secureSocket; - } - else { - return new TCPSocket(m_events, m_socketMultiplexer); - } + if (secure) { + SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer); + secureSocket->initSsl (false); + return secureSocket; + } + else { + return new TCPSocket(m_events, m_socketMultiplexer); + } } IListenSocket* TCPSocketFactory::createListen(bool secure) const { - IListenSocket* socket = NULL; - if (secure) { - socket = new SecureListenSocket(m_events, m_socketMultiplexer); - } - else { - socket = new TCPListenSocket(m_events, m_socketMultiplexer); - } + IListenSocket* socket = NULL; + if (secure) { + socket = new SecureListenSocket(m_events, m_socketMultiplexer); + } + else { + socket = new TCPListenSocket(m_events, m_socketMultiplexer); + } - return socket; + return socket; } diff --git a/src/lib/net/TCPSocketFactory.h b/src/lib/net/TCPSocketFactory.h index 083f6ff2..0b28851e 100644 --- a/src/lib/net/TCPSocketFactory.h +++ b/src/lib/net/TCPSocketFactory.h @@ -26,16 +26,16 @@ class SocketMultiplexer; //! Socket factory for TCP sockets class TCPSocketFactory : public ISocketFactory { public: - TCPSocketFactory(IEventQueue* events, SocketMultiplexer* socketMultiplexer); - virtual ~TCPSocketFactory(); + TCPSocketFactory(IEventQueue* events, SocketMultiplexer* socketMultiplexer); + virtual ~TCPSocketFactory(); - // ISocketFactory overrides - virtual IDataSocket* - create(bool secure) const; - virtual IListenSocket* - createListen(bool secure) const; + // ISocketFactory overrides + virtual IDataSocket* + create(bool secure) const; + virtual IListenSocket* + createListen(bool secure) const; private: - IEventQueue* m_events; - SocketMultiplexer* m_socketMultiplexer; + IEventQueue* m_events; + SocketMultiplexer* m_socketMultiplexer; }; diff --git a/src/lib/net/TSocketMultiplexerMethodJob.h b/src/lib/net/TSocketMultiplexerMethodJob.h index f3d7f095..256943d9 100644 --- a/src/lib/net/TSocketMultiplexerMethodJob.h +++ b/src/lib/net/TSocketMultiplexerMethodJob.h @@ -28,49 +28,49 @@ A socket multiplexer job class that invokes a member function. template class TSocketMultiplexerMethodJob : public ISocketMultiplexerJob { public: - typedef ISocketMultiplexerJob* - (T::*Method)(ISocketMultiplexerJob*, bool, bool, bool); + typedef ISocketMultiplexerJob* + (T::*Method)(ISocketMultiplexerJob*, bool, bool, bool); - //! run() invokes \c object->method(arg) - TSocketMultiplexerMethodJob(T* object, Method method, - ArchSocket socket, bool readable, bool writeable); - virtual ~TSocketMultiplexerMethodJob(); + //! run() invokes \c object->method(arg) + TSocketMultiplexerMethodJob(T* object, Method method, + ArchSocket socket, bool readable, bool writeable); + virtual ~TSocketMultiplexerMethodJob(); - // IJob overrides - virtual ISocketMultiplexerJob* - run(bool readable, bool writable, bool error); - virtual ArchSocket getSocket() const; - virtual bool isReadable() const; - virtual bool isWritable() const; + // IJob overrides + virtual ISocketMultiplexerJob* + run(bool readable, bool writable, bool error); + virtual ArchSocket getSocket() const; + virtual bool isReadable() const; + virtual bool isWritable() const; private: - T* m_object; - Method m_method; - ArchSocket m_socket; - bool m_readable; - bool m_writable; - void* m_arg; + T* m_object; + Method m_method; + ArchSocket m_socket; + bool m_readable; + bool m_writable; + void* m_arg; }; template inline TSocketMultiplexerMethodJob::TSocketMultiplexerMethodJob(T* object, - Method method, ArchSocket socket, - bool readable, bool writable) : - m_object(object), - m_method(method), - m_socket(ARCH->copySocket(socket)), - m_readable(readable), - m_writable(writable) + Method method, ArchSocket socket, + bool readable, bool writable) : + m_object(object), + m_method(method), + m_socket(ARCH->copySocket(socket)), + m_readable(readable), + m_writable(writable) { - // do nothing + // do nothing } template inline TSocketMultiplexerMethodJob::~TSocketMultiplexerMethodJob() { - ARCH->closeSocket(m_socket); + ARCH->closeSocket(m_socket); } template @@ -78,10 +78,10 @@ inline ISocketMultiplexerJob* TSocketMultiplexerMethodJob::run(bool read, bool write, bool error) { - if (m_object != NULL) { - return (m_object->*m_method)(this, read, write, error); - } - return NULL; + if (m_object != NULL) { + return (m_object->*m_method)(this, read, write, error); + } + return NULL; } template @@ -89,7 +89,7 @@ inline ArchSocket TSocketMultiplexerMethodJob::getSocket() const { - return m_socket; + return m_socket; } template @@ -97,7 +97,7 @@ inline bool TSocketMultiplexerMethodJob::isReadable() const { - return m_readable; + return m_readable; } template @@ -105,5 +105,5 @@ inline bool TSocketMultiplexerMethodJob::isWritable() const { - return m_writable; + return m_writable; } diff --git a/src/lib/net/XSocket.cpp b/src/lib/net/XSocket.cpp index 4b52c8a9..77c9ea16 100644 --- a/src/lib/net/XSocket.cpp +++ b/src/lib/net/XSocket.cpp @@ -24,52 +24,52 @@ // XSocketAddress::XSocketAddress(EError error, - const String& hostname, int port) _NOEXCEPT : - m_error(error), - m_hostname(hostname), - m_port(port) + const String& hostname, int port) _NOEXCEPT : + m_error(error), + m_hostname(hostname), + m_port(port) { - // do nothing + // do nothing } XSocketAddress::EError XSocketAddress::getError() const throw() { - return m_error; + return m_error; } String XSocketAddress::getHostname() const throw() { - return m_hostname; + return m_hostname; } int XSocketAddress::getPort() const throw() { - return m_port; + return m_port; } String XSocketAddress::getWhat() const throw() { - static const char* s_errorID[] = { - "XSocketAddressUnknown", - "XSocketAddressNotFound", - "XSocketAddressNoAddress", - "XSocketAddressUnsupported", - "XSocketAddressBadPort" - }; - static const char* s_errorMsg[] = { - "unknown error for: %{1}:%{2}", - "address not found for: %{1}", - "no address for: %{1}", - "unsupported address for: %{1}", - "invalid port" // m_port may not be set to the bad port - }; - return format(s_errorID[m_error], s_errorMsg[m_error], - m_hostname.c_str(), - synergy::string::sprintf("%d", m_port).c_str()); + static const char* s_errorID[] = { + "XSocketAddressUnknown", + "XSocketAddressNotFound", + "XSocketAddressNoAddress", + "XSocketAddressUnsupported", + "XSocketAddressBadPort" + }; + static const char* s_errorMsg[] = { + "unknown error for: %{1}:%{2}", + "address not found for: %{1}", + "no address for: %{1}", + "unsupported address for: %{1}", + "invalid port" // m_port may not be set to the bad port + }; + return format(s_errorID[m_error], s_errorMsg[m_error], + m_hostname.c_str(), + synergy::string::sprintf("%d", m_port).c_str()); } @@ -80,7 +80,7 @@ XSocketAddress::getWhat() const throw() String XSocketIOClose::getWhat() const throw() { - return format("XSocketIOClose", "close: %{1}", what()); + return format("XSocketIOClose", "close: %{1}", what()); } @@ -91,7 +91,7 @@ XSocketIOClose::getWhat() const throw() String XSocketBind::getWhat() const throw() { - return format("XSocketBind", "cannot bind address: %{1}", what()); + return format("XSocketBind", "cannot bind address: %{1}", what()); } @@ -102,7 +102,7 @@ XSocketBind::getWhat() const throw() String XSocketConnect::getWhat() const throw() { - return format("XSocketConnect", "cannot connect socket: %{1}", what()); + return format("XSocketConnect", "cannot connect socket: %{1}", what()); } @@ -113,5 +113,5 @@ XSocketConnect::getWhat() const throw() String XSocketCreate::getWhat() const throw() { - return format("XSocketCreate", "cannot create socket: %{1}", what()); + return format("XSocketCreate", "cannot create socket: %{1}", what()); } diff --git a/src/lib/net/XSocket.h b/src/lib/net/XSocket.h index 900f4077..f6e3ca9f 100644 --- a/src/lib/net/XSocket.h +++ b/src/lib/net/XSocket.h @@ -32,38 +32,38 @@ Thrown when attempting to create an invalid network address. */ class XSocketAddress : public XSocket { public: - //! Failure codes - enum EError { - kUnknown, //!< Unknown error - kNotFound, //!< The hostname is unknown - kNoAddress, //!< The hostname is valid but has no IP address - kUnsupported, //!< The hostname is valid but has no supported address - kBadPort //!< The port is invalid - }; + //! Failure codes + enum EError { + kUnknown, //!< Unknown error + kNotFound, //!< The hostname is unknown + kNoAddress, //!< The hostname is valid but has no IP address + kUnsupported, //!< The hostname is valid but has no supported address + kBadPort //!< The port is invalid + }; - XSocketAddress(EError, const String& hostname, int port) _NOEXCEPT; - virtual ~XSocketAddress() _NOEXCEPT { } + XSocketAddress(EError, const String& hostname, int port) _NOEXCEPT; + virtual ~XSocketAddress() _NOEXCEPT { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get the error code - EError getError() const throw(); - //! Get the hostname - String getHostname() const throw(); - //! Get the port - int getPort() const throw(); + //! Get the error code + EError getError() const throw(); + //! Get the hostname + String getHostname() const throw(); + //! Get the port + int getPort() const throw(); - //@} + //@} protected: - // XBase overrides - virtual String getWhat() const throw(); + // XBase overrides + virtual String getWhat() const throw(); private: - EError m_error; - String m_hostname; - int m_port; + EError m_error; + String m_hostname; + int m_port; }; //! I/O closing exception diff --git a/src/lib/platform/CMakeLists.txt b/src/lib/platform/CMakeLists.txt index 481d8ef9..b8d07077 100644 --- a/src/lib/platform/CMakeLists.txt +++ b/src/lib/platform/CMakeLists.txt @@ -15,35 +15,35 @@ # along with this program. If not, see . if (WIN32) - file(GLOB headers "MSWindows*.h") - file(GLOB sources "MSWindows*.cpp") + file(GLOB headers "MSWindows*.h") + file(GLOB sources "MSWindows*.cpp") elseif (APPLE) - file(GLOB headers "OSX*.h" "IOSX*.h") - file(GLOB sources "OSX*.cpp" "IOSX*.cpp" "OSX*.m" "OSX*.mm") + file(GLOB headers "OSX*.h" "IOSX*.h") + file(GLOB sources "OSX*.cpp" "IOSX*.cpp" "OSX*.m" "OSX*.mm") elseif (UNIX) - file(GLOB headers "XWindows*.h") - file(GLOB sources "XWindows*.cpp") + file(GLOB headers "XWindows*.h") + file(GLOB sources "XWindows*.cpp") endif() if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../../ext/gtest-1.6.0/include + ../ + ../../../ext/gtest-1.6.0/include ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() if (APPLE) - list(APPEND inc - /System/Library/Frameworks - ) + list(APPEND inc + /System/Library/Frameworks + ) endif() include_directories(${inc}) @@ -51,10 +51,10 @@ add_library(platform STATIC ${sources}) target_link_libraries(platform client ${libs}) if (UNIX) - target_link_libraries(platform io net ipc synergy client ${libs}) + target_link_libraries(platform io net ipc synergy client ${libs}) endif() if (APPLE) - find_library(COCOA_LIBRARY Cocoa) - target_link_libraries(platform ${COCOA_LIBRARY}) + find_library(COCOA_LIBRARY Cocoa) + target_link_libraries(platform ${COCOA_LIBRARY}) endif() diff --git a/src/lib/platform/IMSWindowsClipboardFacade.h b/src/lib/platform/IMSWindowsClipboardFacade.h index 60dcaf7c..2eca023d 100644 --- a/src/lib/platform/IMSWindowsClipboardFacade.h +++ b/src/lib/platform/IMSWindowsClipboardFacade.h @@ -29,8 +29,8 @@ class IMSWindowsClipboardConverter; class IMSWindowsClipboardFacade : public IInterface { public: - virtual void write(HANDLE win32Data, UINT win32Format) = 0; - virtual ~IMSWindowsClipboardFacade() { } + virtual void write(HANDLE win32Data, UINT win32Format) = 0; + virtual ~IMSWindowsClipboardFacade() { } }; #endif \ No newline at end of file diff --git a/src/lib/platform/IOSXKeyResource.cpp b/src/lib/platform/IOSXKeyResource.cpp index 384d4369..b887fc59 100644 --- a/src/lib/platform/IOSXKeyResource.cpp +++ b/src/lib/platform/IOSXKeyResource.cpp @@ -22,168 +22,168 @@ KeyID IOSXKeyResource::getKeyID(UInt8 c) { - if (c == 0) { - return kKeyNone; - } - else if (c >= 32 && c < 127) { - // ASCII - return static_cast(c); - } - else { - // handle special keys - switch (c) { - case 0x01: - return kKeyHome; + if (c == 0) { + return kKeyNone; + } + else if (c >= 32 && c < 127) { + // ASCII + return static_cast(c); + } + else { + // handle special keys + switch (c) { + case 0x01: + return kKeyHome; - case 0x02: - return kKeyKP_Enter; + case 0x02: + return kKeyKP_Enter; - case 0x03: - return kKeyKP_Enter; + case 0x03: + return kKeyKP_Enter; - case 0x04: - return kKeyEnd; + case 0x04: + return kKeyEnd; - case 0x05: - return kKeyHelp; + case 0x05: + return kKeyHelp; - case 0x08: - return kKeyBackSpace; + case 0x08: + return kKeyBackSpace; - case 0x09: - return kKeyTab; + case 0x09: + return kKeyTab; - case 0x0b: - return kKeyPageUp; + case 0x0b: + return kKeyPageUp; - case 0x0c: - return kKeyPageDown; + case 0x0c: + return kKeyPageDown; - case 0x0d: - return kKeyReturn; + case 0x0d: + return kKeyReturn; - case 0x10: - // OS X maps all the function keys (F1, etc) to this one key. - // we can't determine the right key here so we have to do it - // some other way. - return kKeyNone; + case 0x10: + // OS X maps all the function keys (F1, etc) to this one key. + // we can't determine the right key here so we have to do it + // some other way. + return kKeyNone; - case 0x1b: - return kKeyEscape; + case 0x1b: + return kKeyEscape; - case 0x1c: - return kKeyLeft; + case 0x1c: + return kKeyLeft; - case 0x1d: - return kKeyRight; + case 0x1d: + return kKeyRight; - case 0x1e: - return kKeyUp; + case 0x1e: + return kKeyUp; - case 0x1f: - return kKeyDown; + case 0x1f: + return kKeyDown; - case 0x7f: - return kKeyDelete; + case 0x7f: + return kKeyDelete; - case 0x06: - case 0x07: - case 0x0a: - case 0x0e: - case 0x0f: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1a: - // discard other control characters - return kKeyNone; + case 0x06: + case 0x07: + case 0x0a: + case 0x0e: + case 0x0f: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1a: + // discard other control characters + return kKeyNone; - default: - // not special or unknown - break; - } + default: + // not special or unknown + break; + } - // create string with character - char str[2]; - str[0] = static_cast(c); - str[1] = 0; + // create string with character + char str[2]; + str[0] = static_cast(c); + str[1] = 0; - // get current keyboard script - TISInputSourceRef isref = TISCopyCurrentKeyboardInputSource(); - CFArrayRef langs = (CFArrayRef) TISGetInputSourceProperty(isref, kTISPropertyInputSourceLanguages); - CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding( - (CFStringRef)CFArrayGetValueAtIndex(langs, 0)); - // convert to unicode - CFStringRef cfString = - CFStringCreateWithCStringNoCopy( - kCFAllocatorDefault, str, encoding, kCFAllocatorNull); + // get current keyboard script + TISInputSourceRef isref = TISCopyCurrentKeyboardInputSource(); + CFArrayRef langs = (CFArrayRef) TISGetInputSourceProperty(isref, kTISPropertyInputSourceLanguages); + CFStringEncoding encoding = CFStringConvertIANACharSetNameToEncoding( + (CFStringRef)CFArrayGetValueAtIndex(langs, 0)); + // convert to unicode + CFStringRef cfString = + CFStringCreateWithCStringNoCopy( + kCFAllocatorDefault, str, encoding, kCFAllocatorNull); - // sometimes CFStringCreate...() returns NULL (e.g. Apple Korean - // encoding with char value 214). if it did then make no key, - // otherwise CFStringCreateMutableCopy() will crash. - if (cfString == NULL) { - return kKeyNone; - } + // sometimes CFStringCreate...() returns NULL (e.g. Apple Korean + // encoding with char value 214). if it did then make no key, + // otherwise CFStringCreateMutableCopy() will crash. + if (cfString == NULL) { + return kKeyNone; + } - // convert to precomposed - CFMutableStringRef mcfString = - CFStringCreateMutableCopy(kCFAllocatorDefault, 0, cfString); - CFRelease(cfString); - CFStringNormalize(mcfString, kCFStringNormalizationFormC); + // convert to precomposed + CFMutableStringRef mcfString = + CFStringCreateMutableCopy(kCFAllocatorDefault, 0, cfString); + CFRelease(cfString); + CFStringNormalize(mcfString, kCFStringNormalizationFormC); - // check result - int unicodeLength = CFStringGetLength(mcfString); - if (unicodeLength == 0) { - CFRelease(mcfString); - return kKeyNone; - } - if (unicodeLength > 1) { - // FIXME -- more than one character, we should handle this - CFRelease(mcfString); - return kKeyNone; - } + // check result + int unicodeLength = CFStringGetLength(mcfString); + if (unicodeLength == 0) { + CFRelease(mcfString); + return kKeyNone; + } + if (unicodeLength > 1) { + // FIXME -- more than one character, we should handle this + CFRelease(mcfString); + return kKeyNone; + } - // get unicode character - UniChar uc = CFStringGetCharacterAtIndex(mcfString, 0); - CFRelease(mcfString); + // get unicode character + UniChar uc = CFStringGetCharacterAtIndex(mcfString, 0); + CFRelease(mcfString); - // convert to KeyID - return static_cast(uc); - } + // convert to KeyID + return static_cast(uc); + } } KeyID IOSXKeyResource::unicharToKeyID(UniChar c) { - switch (c) { - case 3: - return kKeyKP_Enter; + switch (c) { + case 3: + return kKeyKP_Enter; - case 8: - return kKeyBackSpace; + case 8: + return kKeyBackSpace; - case 9: - return kKeyTab; + case 9: + return kKeyTab; - case 13: - return kKeyReturn; + case 13: + return kKeyReturn; - case 27: - return kKeyEscape; + case 27: + return kKeyEscape; - case 127: - return kKeyDelete; + case 127: + return kKeyDelete; - default: - if (c < 32) { - return kKeyNone; - } - return static_cast(c); - } + default: + if (c < 32) { + return kKeyNone; + } + return static_cast(c); + } } diff --git a/src/lib/platform/IOSXKeyResource.h b/src/lib/platform/IOSXKeyResource.h index 57d826ea..71770828 100644 --- a/src/lib/platform/IOSXKeyResource.h +++ b/src/lib/platform/IOSXKeyResource.h @@ -21,16 +21,16 @@ class IOSXKeyResource : public IInterface { public: - virtual bool isValid() const = 0; - virtual UInt32 getNumModifierCombinations() const = 0; - virtual UInt32 getNumTables() const = 0; - virtual UInt32 getNumButtons() const = 0; - virtual UInt32 getTableForModifier(UInt32 mask) const = 0; - virtual KeyID getKey(UInt32 table, UInt32 button) const = 0; - - // Convert a character in the current script to the equivalent KeyID - static KeyID getKeyID(UInt8); - - // Convert a unicode character to the equivalent KeyID. - static KeyID unicharToKeyID(UniChar); + virtual bool isValid() const = 0; + virtual UInt32 getNumModifierCombinations() const = 0; + virtual UInt32 getNumTables() const = 0; + virtual UInt32 getNumButtons() const = 0; + virtual UInt32 getTableForModifier(UInt32 mask) const = 0; + virtual KeyID getKey(UInt32 table, UInt32 button) const = 0; + + // Convert a character in the current script to the equivalent KeyID + static KeyID getKeyID(UInt8); + + // Convert a unicode character to the equivalent KeyID. + static KeyID unicharToKeyID(UniChar); }; diff --git a/src/lib/platform/MSWindowsClipboard.cpp b/src/lib/platform/MSWindowsClipboard.cpp index 4264ae4b..2373d255 100644 --- a/src/lib/platform/MSWindowsClipboard.cpp +++ b/src/lib/platform/MSWindowsClipboard.cpp @@ -30,199 +30,199 @@ // MSWindowsClipboard // -UINT MSWindowsClipboard::s_ownershipFormat = 0; +UINT MSWindowsClipboard::s_ownershipFormat = 0; MSWindowsClipboard::MSWindowsClipboard(HWND window) : - m_window(window), - m_time(0), - m_facade(new MSWindowsClipboardFacade()), - m_deleteFacade(true) + m_window(window), + m_time(0), + m_facade(new MSWindowsClipboardFacade()), + m_deleteFacade(true) { - // add converters, most desired first - m_converters.push_back(new MSWindowsClipboardUTF16Converter); - m_converters.push_back(new MSWindowsClipboardBitmapConverter); - m_converters.push_back(new MSWindowsClipboardHTMLConverter); + // add converters, most desired first + m_converters.push_back(new MSWindowsClipboardUTF16Converter); + m_converters.push_back(new MSWindowsClipboardBitmapConverter); + m_converters.push_back(new MSWindowsClipboardHTMLConverter); } MSWindowsClipboard::~MSWindowsClipboard() { - clearConverters(); + clearConverters(); - // dependency injection causes confusion over ownership, so we need - // logic to decide whether or not we delete the facade. there must - // be a more elegant way of doing this. - if (m_deleteFacade) - delete m_facade; + // dependency injection causes confusion over ownership, so we need + // logic to decide whether or not we delete the facade. there must + // be a more elegant way of doing this. + if (m_deleteFacade) + delete m_facade; } void MSWindowsClipboard::setFacade(IMSWindowsClipboardFacade& facade) { - delete m_facade; - m_facade = &facade; - m_deleteFacade = false; + delete m_facade; + m_facade = &facade; + m_deleteFacade = false; } bool MSWindowsClipboard::emptyUnowned() { - LOG((CLOG_DEBUG "empty clipboard")); + LOG((CLOG_DEBUG "empty clipboard")); - // empty the clipboard (and take ownership) - if (!EmptyClipboard()) { - // unable to cause this in integ tests, but this error has never - // actually been reported by users. - LOG((CLOG_DEBUG "failed to grab clipboard")); - return false; - } + // empty the clipboard (and take ownership) + if (!EmptyClipboard()) { + // unable to cause this in integ tests, but this error has never + // actually been reported by users. + LOG((CLOG_DEBUG "failed to grab clipboard")); + return false; + } - return true; + return true; } bool MSWindowsClipboard::empty() { - if (!emptyUnowned()) { - return false; - } + if (!emptyUnowned()) { + return false; + } - // mark clipboard as being owned by synergy - HGLOBAL data = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, 1); - SetClipboardData(getOwnershipFormat(), data); + // mark clipboard as being owned by synergy + HGLOBAL data = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, 1); + SetClipboardData(getOwnershipFormat(), data); - return true; + return true; } void MSWindowsClipboard::add(EFormat format, const String& data) { - LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format)); + LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format)); - // convert data to win32 form - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IMSWindowsClipboardConverter* converter = *index; + // convert data to win32 form + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IMSWindowsClipboardConverter* converter = *index; - // skip converters for other formats - if (converter->getFormat() == format) { - HANDLE win32Data = converter->fromIClipboard(data); - if (win32Data != NULL) { - UINT win32Format = converter->getWin32Format(); - m_facade->write(win32Data, win32Format); - } - } - } + // skip converters for other formats + if (converter->getFormat() == format) { + HANDLE win32Data = converter->fromIClipboard(data); + if (win32Data != NULL) { + UINT win32Format = converter->getWin32Format(); + m_facade->write(win32Data, win32Format); + } + } + } } bool MSWindowsClipboard::open(Time time) const { - LOG((CLOG_DEBUG "open clipboard")); + LOG((CLOG_DEBUG "open clipboard")); - if (!OpenClipboard(m_window)) { - // unable to cause this in integ tests; but this can happen! - // * http://symless.com/pm/issues/86 - // * http://symless.com/pm/issues/1256 - // logging improved to see if we can catch more info next time. - LOG((CLOG_WARN "failed to open clipboard: %d", GetLastError())); - return false; - } + if (!OpenClipboard(m_window)) { + // unable to cause this in integ tests; but this can happen! + // * http://symless.com/pm/issues/86 + // * http://symless.com/pm/issues/1256 + // logging improved to see if we can catch more info next time. + LOG((CLOG_WARN "failed to open clipboard: %d", GetLastError())); + return false; + } - m_time = time; + m_time = time; - return true; + return true; } void MSWindowsClipboard::close() const { - LOG((CLOG_DEBUG "close clipboard")); - CloseClipboard(); + LOG((CLOG_DEBUG "close clipboard")); + CloseClipboard(); } IClipboard::Time MSWindowsClipboard::getTime() const { - return m_time; + return m_time; } bool MSWindowsClipboard::has(EFormat format) const { - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IMSWindowsClipboardConverter* converter = *index; - if (converter->getFormat() == format) { - if (IsClipboardFormatAvailable(converter->getWin32Format())) { - return true; - } - } - } - return false; + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IMSWindowsClipboardConverter* converter = *index; + if (converter->getFormat() == format) { + if (IsClipboardFormatAvailable(converter->getWin32Format())) { + return true; + } + } + } + return false; } String MSWindowsClipboard::get(EFormat format) const { - // find the converter for the first clipboard format we can handle - IMSWindowsClipboardConverter* converter = NULL; - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { + // find the converter for the first clipboard format we can handle + IMSWindowsClipboardConverter* converter = NULL; + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { - converter = *index; - if (converter->getFormat() == format) { - break; - } - converter = NULL; - } + converter = *index; + if (converter->getFormat() == format) { + break; + } + converter = NULL; + } - // if no converter then we don't recognize any formats - if (converter == NULL) { - LOG((CLOG_WARN "no converter for format %d", format)); - return String(); - } + // if no converter then we don't recognize any formats + if (converter == NULL) { + LOG((CLOG_WARN "no converter for format %d", format)); + return String(); + } - // get a handle to the clipboard data - HANDLE win32Data = GetClipboardData(converter->getWin32Format()); - if (win32Data == NULL) { - // nb: can't cause this using integ tests; this is only caused when - // the selected converter returns an invalid format -- which you - // cannot cause using public functions. - return String(); - } + // get a handle to the clipboard data + HANDLE win32Data = GetClipboardData(converter->getWin32Format()); + if (win32Data == NULL) { + // nb: can't cause this using integ tests; this is only caused when + // the selected converter returns an invalid format -- which you + // cannot cause using public functions. + return String(); + } - // convert - return converter->toIClipboard(win32Data); + // convert + return converter->toIClipboard(win32Data); } void MSWindowsClipboard::clearConverters() { - for (ConverterList::iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - delete *index; - } - m_converters.clear(); + for (ConverterList::iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + delete *index; + } + m_converters.clear(); } bool MSWindowsClipboard::isOwnedBySynergy() { - // create ownership format if we haven't yet - if (s_ownershipFormat == 0) { - s_ownershipFormat = RegisterClipboardFormat(TEXT("SynergyOwnership")); - } - return (IsClipboardFormatAvailable(getOwnershipFormat()) != 0); + // create ownership format if we haven't yet + if (s_ownershipFormat == 0) { + s_ownershipFormat = RegisterClipboardFormat(TEXT("SynergyOwnership")); + } + return (IsClipboardFormatAvailable(getOwnershipFormat()) != 0); } UINT MSWindowsClipboard::getOwnershipFormat() { - // create ownership format if we haven't yet - if (s_ownershipFormat == 0) { - s_ownershipFormat = RegisterClipboardFormat(TEXT("SynergyOwnership")); - } + // create ownership format if we haven't yet + if (s_ownershipFormat == 0) { + s_ownershipFormat = RegisterClipboardFormat(TEXT("SynergyOwnership")); + } - // return the format - return s_ownershipFormat; + // return the format + return s_ownershipFormat; } diff --git a/src/lib/platform/MSWindowsClipboard.h b/src/lib/platform/MSWindowsClipboard.h index 3f25fd33..c0f47cc1 100644 --- a/src/lib/platform/MSWindowsClipboard.h +++ b/src/lib/platform/MSWindowsClipboard.h @@ -31,57 +31,57 @@ class IMSWindowsClipboardFacade; //! Microsoft windows clipboard implementation class MSWindowsClipboard : public IClipboard { public: - MSWindowsClipboard(HWND window); - MSWindowsClipboard(HWND window, IMSWindowsClipboardFacade &facade); - virtual ~MSWindowsClipboard(); + MSWindowsClipboard(HWND window); + MSWindowsClipboard(HWND window, IMSWindowsClipboardFacade &facade); + virtual ~MSWindowsClipboard(); - //! Empty clipboard without ownership - /*! - Take ownership of the clipboard and clear all data from it. - This must be called between a successful open() and close(). - Return false if the clipboard ownership could not be taken; - the clipboard should not be emptied in this case. Unlike - empty(), isOwnedBySynergy() will return false when emptied - this way. This is useful when synergy wants to put data on - clipboard but pretend (to itself) that some other app did it. - When using empty(), synergy assumes the data came from the - server and doesn't need to be sent back. emptyUnowned() - makes synergy send the data to the server. - */ - bool emptyUnowned(); + //! Empty clipboard without ownership + /*! + Take ownership of the clipboard and clear all data from it. + This must be called between a successful open() and close(). + Return false if the clipboard ownership could not be taken; + the clipboard should not be emptied in this case. Unlike + empty(), isOwnedBySynergy() will return false when emptied + this way. This is useful when synergy wants to put data on + clipboard but pretend (to itself) that some other app did it. + When using empty(), synergy assumes the data came from the + server and doesn't need to be sent back. emptyUnowned() + makes synergy send the data to the server. + */ + bool emptyUnowned(); - //! Test if clipboard is owned by synergy - static bool isOwnedBySynergy(); + //! Test if clipboard is owned by synergy + static bool isOwnedBySynergy(); - // IClipboard overrides - virtual bool empty(); - virtual void add(EFormat, const String& data); - virtual bool open(Time) const; - virtual void close() const; - virtual Time getTime() const; - virtual bool has(EFormat) const; - virtual String get(EFormat) const; + // IClipboard overrides + virtual bool empty(); + virtual void add(EFormat, const String& data); + virtual bool open(Time) const; + virtual void close() const; + virtual Time getTime() const; + virtual bool has(EFormat) const; + virtual String get(EFormat) const; - void setFacade(IMSWindowsClipboardFacade& facade); + void setFacade(IMSWindowsClipboardFacade& facade); private: - void clearConverters(); + void clearConverters(); - UINT convertFormatToWin32(EFormat) const; - HANDLE convertTextToWin32(const String& data) const; - String convertTextFromWin32(HANDLE) const; + UINT convertFormatToWin32(EFormat) const; + HANDLE convertTextToWin32(const String& data) const; + String convertTextFromWin32(HANDLE) const; - static UINT getOwnershipFormat(); + static UINT getOwnershipFormat(); private: - typedef std::vector ConverterList; + typedef std::vector ConverterList; - HWND m_window; - mutable Time m_time; - ConverterList m_converters; - static UINT s_ownershipFormat; - IMSWindowsClipboardFacade* m_facade; - bool m_deleteFacade; + HWND m_window; + mutable Time m_time; + ConverterList m_converters; + static UINT s_ownershipFormat; + IMSWindowsClipboardFacade* m_facade; + bool m_deleteFacade; }; //! Clipboard format converter interface @@ -91,23 +91,23 @@ converters. */ class IMSWindowsClipboardConverter : public IInterface { public: - // accessors + // accessors - // return the clipboard format this object converts from/to - virtual IClipboard::EFormat - getFormat() const = 0; + // return the clipboard format this object converts from/to + virtual IClipboard::EFormat + getFormat() const = 0; - // return the atom representing the win32 clipboard format that - // this object converts from/to - virtual UINT getWin32Format() const = 0; + // return the atom representing the win32 clipboard format that + // this object converts from/to + virtual UINT getWin32Format() const = 0; - // convert from the IClipboard format to the win32 clipboard format. - // the input data must be in the IClipboard format returned by - // getFormat(). the return data will be in the win32 clipboard - // format returned by getWin32Format(), allocated by GlobalAlloc(). - virtual HANDLE fromIClipboard(const String&) const = 0; + // convert from the IClipboard format to the win32 clipboard format. + // the input data must be in the IClipboard format returned by + // getFormat(). the return data will be in the win32 clipboard + // format returned by getWin32Format(), allocated by GlobalAlloc(). + virtual HANDLE fromIClipboard(const String&) const = 0; - // convert from the win32 clipboard format to the IClipboard format - // (i.e., the reverse of fromIClipboard()). - virtual String toIClipboard(HANDLE data) const = 0; + // convert from the win32 clipboard format to the IClipboard format + // (i.e., the reverse of fromIClipboard()). + virtual String toIClipboard(HANDLE data) const = 0; }; diff --git a/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp b/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp index 5038469a..b28b6974 100644 --- a/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp +++ b/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp @@ -24,126 +24,126 @@ MSWindowsClipboardAnyTextConverter::MSWindowsClipboardAnyTextConverter() { - // do nothing + // do nothing } MSWindowsClipboardAnyTextConverter::~MSWindowsClipboardAnyTextConverter() { - // do nothing + // do nothing } IClipboard::EFormat MSWindowsClipboardAnyTextConverter::getFormat() const { - return IClipboard::kText; + return IClipboard::kText; } HANDLE MSWindowsClipboardAnyTextConverter::fromIClipboard(const String& data) const { - // convert linefeeds and then convert to desired encoding - String text = doFromIClipboard(convertLinefeedToWin32(data)); - UInt32 size = (UInt32)text.size(); + // convert linefeeds and then convert to desired encoding + String text = doFromIClipboard(convertLinefeedToWin32(data)); + UInt32 size = (UInt32)text.size(); - // copy to memory handle - HGLOBAL gData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, size); - if (gData != NULL) { - // get a pointer to the allocated memory - char* dst = (char*)GlobalLock(gData); - if (dst != NULL) { - memcpy(dst, text.data(), size); - GlobalUnlock(gData); - } - else { - GlobalFree(gData); - gData = NULL; - } - } + // copy to memory handle + HGLOBAL gData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, size); + if (gData != NULL) { + // get a pointer to the allocated memory + char* dst = (char*)GlobalLock(gData); + if (dst != NULL) { + memcpy(dst, text.data(), size); + GlobalUnlock(gData); + } + else { + GlobalFree(gData); + gData = NULL; + } + } - return gData; + return gData; } String MSWindowsClipboardAnyTextConverter::toIClipboard(HANDLE data) const { - // get datator - const char* src = (const char*)GlobalLock(data); - UInt32 srcSize = (UInt32)GlobalSize(data); - if (src == NULL || srcSize <= 1) { - return String(); - } + // get datator + const char* src = (const char*)GlobalLock(data); + UInt32 srcSize = (UInt32)GlobalSize(data); + if (src == NULL || srcSize <= 1) { + return String(); + } - // convert text - String text = doToIClipboard(String(src, srcSize)); + // convert text + String text = doToIClipboard(String(src, srcSize)); - // release handle - GlobalUnlock(data); + // release handle + GlobalUnlock(data); - // convert newlines - return convertLinefeedToUnix(text); + // convert newlines + return convertLinefeedToUnix(text); } String MSWindowsClipboardAnyTextConverter::convertLinefeedToWin32( - const String& src) const + const String& src) const { - // note -- we assume src is a valid UTF-8 string + // note -- we assume src is a valid UTF-8 string - // count newlines in string - UInt32 numNewlines = 0; - UInt32 n = (UInt32)src.size(); - for (const char* scan = src.c_str(); n > 0; ++scan, --n) { - if (*scan == '\n') { - ++numNewlines; - } - } - if (numNewlines == 0) { - return src; - } + // count newlines in string + UInt32 numNewlines = 0; + UInt32 n = (UInt32)src.size(); + for (const char* scan = src.c_str(); n > 0; ++scan, --n) { + if (*scan == '\n') { + ++numNewlines; + } + } + if (numNewlines == 0) { + return src; + } - // allocate new string - String dst; - dst.reserve(src.size() + numNewlines); + // allocate new string + String dst; + dst.reserve(src.size() + numNewlines); - // copy string, converting newlines - n = (UInt32)src.size(); - for (const char* scan = src.c_str(); n > 0; ++scan, --n) { - if (scan[0] == '\n') { - dst += '\r'; - } - dst += scan[0]; - } + // copy string, converting newlines + n = (UInt32)src.size(); + for (const char* scan = src.c_str(); n > 0; ++scan, --n) { + if (scan[0] == '\n') { + dst += '\r'; + } + dst += scan[0]; + } - return dst; + return dst; } String MSWindowsClipboardAnyTextConverter::convertLinefeedToUnix( - const String& src) const + const String& src) const { - // count newlines in string - UInt32 numNewlines = 0; - UInt32 n = (UInt32)src.size(); - for (const char* scan = src.c_str(); n > 0; ++scan, --n) { - if (scan[0] == '\r' && scan[1] == '\n') { - ++numNewlines; - } - } - if (numNewlines == 0) { - return src; - } + // count newlines in string + UInt32 numNewlines = 0; + UInt32 n = (UInt32)src.size(); + for (const char* scan = src.c_str(); n > 0; ++scan, --n) { + if (scan[0] == '\r' && scan[1] == '\n') { + ++numNewlines; + } + } + if (numNewlines == 0) { + return src; + } - // allocate new string - String dst; - dst.reserve(src.size()); + // allocate new string + String dst; + dst.reserve(src.size()); - // copy string, converting newlines - n = (UInt32)src.size(); - for (const char* scan = src.c_str(); n > 0; ++scan, --n) { - if (scan[0] != '\r' || scan[1] != '\n') { - dst += scan[0]; - } - } + // copy string, converting newlines + n = (UInt32)src.size(); + for (const char* scan = src.c_str(); n > 0; ++scan, --n) { + if (scan[0] != '\r' || scan[1] != '\n') { + dst += scan[0]; + } + } - return dst; + return dst; } diff --git a/src/lib/platform/MSWindowsClipboardAnyTextConverter.h b/src/lib/platform/MSWindowsClipboardAnyTextConverter.h index c9d0372f..c0942839 100644 --- a/src/lib/platform/MSWindowsClipboardAnyTextConverter.h +++ b/src/lib/platform/MSWindowsClipboardAnyTextConverter.h @@ -22,36 +22,36 @@ //! Convert to/from some text encoding class MSWindowsClipboardAnyTextConverter : - public IMSWindowsClipboardConverter { + public IMSWindowsClipboardConverter { public: - MSWindowsClipboardAnyTextConverter(); - virtual ~MSWindowsClipboardAnyTextConverter(); + MSWindowsClipboardAnyTextConverter(); + virtual ~MSWindowsClipboardAnyTextConverter(); - // IMSWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual UINT getWin32Format() const = 0; - virtual HANDLE fromIClipboard(const String&) const; - virtual String toIClipboard(HANDLE) const; + // IMSWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual UINT getWin32Format() const = 0; + virtual HANDLE fromIClipboard(const String&) const; + virtual String toIClipboard(HANDLE) const; protected: - //! Convert from IClipboard format - /*! - Do UTF-8 conversion only. Memory handle allocation and - linefeed conversion is done by this class. doFromIClipboard() - must include the nul terminator in the returned string (not - including the String's nul terminator). - */ - virtual String doFromIClipboard(const String&) const = 0; + //! Convert from IClipboard format + /*! + Do UTF-8 conversion only. Memory handle allocation and + linefeed conversion is done by this class. doFromIClipboard() + must include the nul terminator in the returned string (not + including the String's nul terminator). + */ + virtual String doFromIClipboard(const String&) const = 0; - //! Convert to IClipboard format - /*! - Do UTF-8 conversion only. Memory handle allocation and - linefeed conversion is done by this class. - */ - virtual String doToIClipboard(const String&) const = 0; + //! Convert to IClipboard format + /*! + Do UTF-8 conversion only. Memory handle allocation and + linefeed conversion is done by this class. + */ + virtual String doToIClipboard(const String&) const = 0; private: - String convertLinefeedToWin32(const String&) const; - String convertLinefeedToUnix(const String&) const; + String convertLinefeedToWin32(const String&) const; + String convertLinefeedToUnix(const String&) const; }; diff --git a/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp b/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp index d1676bb0..94ef1088 100644 --- a/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp +++ b/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp @@ -26,127 +26,127 @@ MSWindowsClipboardBitmapConverter::MSWindowsClipboardBitmapConverter() { - // do nothing + // do nothing } MSWindowsClipboardBitmapConverter::~MSWindowsClipboardBitmapConverter() { - // do nothing + // do nothing } IClipboard::EFormat MSWindowsClipboardBitmapConverter::getFormat() const { - return IClipboard::kBitmap; + return IClipboard::kBitmap; } UINT MSWindowsClipboardBitmapConverter::getWin32Format() const { - return CF_DIB; + return CF_DIB; } HANDLE MSWindowsClipboardBitmapConverter::fromIClipboard(const String& data) const { - // copy to memory handle - HGLOBAL gData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, data.size()); - if (gData != NULL) { - // get a pointer to the allocated memory - char* dst = (char*)GlobalLock(gData); - if (dst != NULL) { - memcpy(dst, data.data(), data.size()); - GlobalUnlock(gData); - } - else { - GlobalFree(gData); - gData = NULL; - } - } + // copy to memory handle + HGLOBAL gData = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, data.size()); + if (gData != NULL) { + // get a pointer to the allocated memory + char* dst = (char*)GlobalLock(gData); + if (dst != NULL) { + memcpy(dst, data.data(), data.size()); + GlobalUnlock(gData); + } + else { + GlobalFree(gData); + gData = NULL; + } + } - return gData; + return gData; } String MSWindowsClipboardBitmapConverter::toIClipboard(HANDLE data) const { - // get datator - LPVOID src = GlobalLock(data); - if (src == NULL) { - return String(); - } - UInt32 srcSize = (UInt32)GlobalSize(data); + // get datator + LPVOID src = GlobalLock(data); + if (src == NULL) { + return String(); + } + UInt32 srcSize = (UInt32)GlobalSize(data); - // check image type - const BITMAPINFO* bitmap = static_cast(src); - LOG((CLOG_INFO "bitmap: %dx%d %d", bitmap->bmiHeader.biWidth, bitmap->bmiHeader.biHeight, (int)bitmap->bmiHeader.biBitCount)); - if (bitmap->bmiHeader.biPlanes == 1 && - (bitmap->bmiHeader.biBitCount == 24 || - bitmap->bmiHeader.biBitCount == 32) && - bitmap->bmiHeader.biCompression == BI_RGB) { - // already in canonical form - String image(static_cast(src), srcSize); - GlobalUnlock(data); - return image; - } + // check image type + const BITMAPINFO* bitmap = static_cast(src); + LOG((CLOG_INFO "bitmap: %dx%d %d", bitmap->bmiHeader.biWidth, bitmap->bmiHeader.biHeight, (int)bitmap->bmiHeader.biBitCount)); + if (bitmap->bmiHeader.biPlanes == 1 && + (bitmap->bmiHeader.biBitCount == 24 || + bitmap->bmiHeader.biBitCount == 32) && + bitmap->bmiHeader.biCompression == BI_RGB) { + // already in canonical form + String image(static_cast(src), srcSize); + GlobalUnlock(data); + return image; + } - // create a destination DIB section - LOG((CLOG_INFO "convert image from: depth=%d comp=%d", bitmap->bmiHeader.biBitCount, bitmap->bmiHeader.biCompression)); - void* raw; - BITMAPINFOHEADER info; - LONG w = bitmap->bmiHeader.biWidth; - LONG h = bitmap->bmiHeader.biHeight; - info.biSize = sizeof(BITMAPINFOHEADER); - info.biWidth = w; - info.biHeight = h; - info.biPlanes = 1; - info.biBitCount = 32; - info.biCompression = BI_RGB; - info.biSizeImage = 0; - info.biXPelsPerMeter = 1000; - info.biYPelsPerMeter = 1000; - info.biClrUsed = 0; - info.biClrImportant = 0; - HDC dc = GetDC(NULL); - HBITMAP dst = CreateDIBSection(dc, (BITMAPINFO*)&info, - DIB_RGB_COLORS, &raw, NULL, 0); + // create a destination DIB section + LOG((CLOG_INFO "convert image from: depth=%d comp=%d", bitmap->bmiHeader.biBitCount, bitmap->bmiHeader.biCompression)); + void* raw; + BITMAPINFOHEADER info; + LONG w = bitmap->bmiHeader.biWidth; + LONG h = bitmap->bmiHeader.biHeight; + info.biSize = sizeof(BITMAPINFOHEADER); + info.biWidth = w; + info.biHeight = h; + info.biPlanes = 1; + info.biBitCount = 32; + info.biCompression = BI_RGB; + info.biSizeImage = 0; + info.biXPelsPerMeter = 1000; + info.biYPelsPerMeter = 1000; + info.biClrUsed = 0; + info.biClrImportant = 0; + HDC dc = GetDC(NULL); + HBITMAP dst = CreateDIBSection(dc, (BITMAPINFO*)&info, + DIB_RGB_COLORS, &raw, NULL, 0); - // find the start of the pixel data - const char* srcBits = (const char*)bitmap + bitmap->bmiHeader.biSize; - if (bitmap->bmiHeader.biBitCount >= 16) { - if (bitmap->bmiHeader.biCompression == BI_BITFIELDS && - (bitmap->bmiHeader.biBitCount == 16 || - bitmap->bmiHeader.biBitCount == 32)) { - srcBits += 3 * sizeof(DWORD); - } - } - else if (bitmap->bmiHeader.biClrUsed != 0) { - srcBits += bitmap->bmiHeader.biClrUsed * sizeof(RGBQUAD); - } - else { - //http://msdn.microsoft.com/en-us/library/ke55d167(VS.80).aspx - srcBits += (1i64 << bitmap->bmiHeader.biBitCount) * sizeof(RGBQUAD); - } + // find the start of the pixel data + const char* srcBits = (const char*)bitmap + bitmap->bmiHeader.biSize; + if (bitmap->bmiHeader.biBitCount >= 16) { + if (bitmap->bmiHeader.biCompression == BI_BITFIELDS && + (bitmap->bmiHeader.biBitCount == 16 || + bitmap->bmiHeader.biBitCount == 32)) { + srcBits += 3 * sizeof(DWORD); + } + } + else if (bitmap->bmiHeader.biClrUsed != 0) { + srcBits += bitmap->bmiHeader.biClrUsed * sizeof(RGBQUAD); + } + else { + //http://msdn.microsoft.com/en-us/library/ke55d167(VS.80).aspx + srcBits += (1i64 << bitmap->bmiHeader.biBitCount) * sizeof(RGBQUAD); + } - // copy source image to destination image - HDC dstDC = CreateCompatibleDC(dc); - HGDIOBJ oldBitmap = SelectObject(dstDC, dst); - SetDIBitsToDevice(dstDC, 0, 0, w, h, 0, 0, 0, h, - srcBits, bitmap, DIB_RGB_COLORS); - SelectObject(dstDC, oldBitmap); - DeleteDC(dstDC); - GdiFlush(); + // copy source image to destination image + HDC dstDC = CreateCompatibleDC(dc); + HGDIOBJ oldBitmap = SelectObject(dstDC, dst); + SetDIBitsToDevice(dstDC, 0, 0, w, h, 0, 0, 0, h, + srcBits, bitmap, DIB_RGB_COLORS); + SelectObject(dstDC, oldBitmap); + DeleteDC(dstDC); + GdiFlush(); - // extract data - String image((const char*)&info, info.biSize); - image.append((const char*)raw, 4 * w * h); + // extract data + String image((const char*)&info, info.biSize); + image.append((const char*)raw, 4 * w * h); - // clean up GDI - DeleteObject(dst); - ReleaseDC(NULL, dc); + // clean up GDI + DeleteObject(dst); + ReleaseDC(NULL, dc); - // release handle - GlobalUnlock(data); + // release handle + GlobalUnlock(data); - return image; + return image; } diff --git a/src/lib/platform/MSWindowsClipboardBitmapConverter.h b/src/lib/platform/MSWindowsClipboardBitmapConverter.h index 593a686d..4a0c8ec7 100644 --- a/src/lib/platform/MSWindowsClipboardBitmapConverter.h +++ b/src/lib/platform/MSWindowsClipboardBitmapConverter.h @@ -22,15 +22,15 @@ //! Convert to/from some text encoding class MSWindowsClipboardBitmapConverter : - public IMSWindowsClipboardConverter { + public IMSWindowsClipboardConverter { public: - MSWindowsClipboardBitmapConverter(); - virtual ~MSWindowsClipboardBitmapConverter(); + MSWindowsClipboardBitmapConverter(); + virtual ~MSWindowsClipboardBitmapConverter(); - // IMSWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual UINT getWin32Format() const; - virtual HANDLE fromIClipboard(const String&) const; - virtual String toIClipboard(HANDLE) const; + // IMSWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual UINT getWin32Format() const; + virtual HANDLE fromIClipboard(const String&) const; + virtual String toIClipboard(HANDLE) const; }; diff --git a/src/lib/platform/MSWindowsClipboardFacade.cpp b/src/lib/platform/MSWindowsClipboardFacade.cpp index 7601df56..e69bb189 100644 --- a/src/lib/platform/MSWindowsClipboardFacade.cpp +++ b/src/lib/platform/MSWindowsClipboardFacade.cpp @@ -22,10 +22,10 @@ void MSWindowsClipboardFacade::write(HANDLE win32Data, UINT win32Format) { - if (SetClipboardData(win32Format, win32Data) == NULL) { - // free converted data if we couldn't put it on - // the clipboard. - // nb: couldn't cause this in integ tests. - GlobalFree(win32Data); - } + if (SetClipboardData(win32Format, win32Data) == NULL) { + // free converted data if we couldn't put it on + // the clipboard. + // nb: couldn't cause this in integ tests. + GlobalFree(win32Data); + } } diff --git a/src/lib/platform/MSWindowsClipboardFacade.h b/src/lib/platform/MSWindowsClipboardFacade.h index 65b193e1..a256dace 100644 --- a/src/lib/platform/MSWindowsClipboardFacade.h +++ b/src/lib/platform/MSWindowsClipboardFacade.h @@ -25,5 +25,5 @@ class MSWindowsClipboardFacade : public IMSWindowsClipboardFacade { public: - virtual void write(HANDLE win32Data, UINT win32Format); + virtual void write(HANDLE win32Data, UINT win32Format); }; diff --git a/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp b/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp index 8064cd8f..53404058 100644 --- a/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp +++ b/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp @@ -26,95 +26,95 @@ MSWindowsClipboardHTMLConverter::MSWindowsClipboardHTMLConverter() { - m_format = RegisterClipboardFormat("HTML Format"); + m_format = RegisterClipboardFormat("HTML Format"); } MSWindowsClipboardHTMLConverter::~MSWindowsClipboardHTMLConverter() { - // do nothing + // do nothing } IClipboard::EFormat MSWindowsClipboardHTMLConverter::getFormat() const { - return IClipboard::kHTML; + return IClipboard::kHTML; } UINT MSWindowsClipboardHTMLConverter::getWin32Format() const { - return m_format; + return m_format; } String MSWindowsClipboardHTMLConverter::doFromIClipboard(const String& data) const { - // prepare to CF_HTML format prefix and suffix - String prefix("Version:0.9\r\nStartHTML:0000000105\r\n" - "EndHTML:ZZZZZZZZZZ\r\n" - "StartFragment:XXXXXXXXXX\r\nEndFragment:YYYYYYYYYY\r\n" - ""); - String suffix("\r\n"); + // prepare to CF_HTML format prefix and suffix + String prefix("Version:0.9\r\nStartHTML:0000000105\r\n" + "EndHTML:ZZZZZZZZZZ\r\n" + "StartFragment:XXXXXXXXXX\r\nEndFragment:YYYYYYYYYY\r\n" + ""); + String suffix("\r\n"); - // Get byte offsets for header - UInt32 StartFragment = (UInt32)prefix.size(); - UInt32 EndFragment = StartFragment + (UInt32)data.size(); - // StartHTML is constant by the design of the prefix - UInt32 EndHTML = EndFragment + (UInt32)suffix.size(); + // Get byte offsets for header + UInt32 StartFragment = (UInt32)prefix.size(); + UInt32 EndFragment = StartFragment + (UInt32)data.size(); + // StartHTML is constant by the design of the prefix + UInt32 EndHTML = EndFragment + (UInt32)suffix.size(); - prefix.replace(prefix.find("XXXXXXXXXX"), 10, - synergy::string::sprintf("%010u", StartFragment)); - prefix.replace(prefix.find("YYYYYYYYYY"), 10, - synergy::string::sprintf("%010u", EndFragment)); - prefix.replace(prefix.find("ZZZZZZZZZZ"), 10, - synergy::string::sprintf("%010u", EndHTML)); + prefix.replace(prefix.find("XXXXXXXXXX"), 10, + synergy::string::sprintf("%010u", StartFragment)); + prefix.replace(prefix.find("YYYYYYYYYY"), 10, + synergy::string::sprintf("%010u", EndFragment)); + prefix.replace(prefix.find("ZZZZZZZZZZ"), 10, + synergy::string::sprintf("%010u", EndHTML)); - // concatenate - prefix += data; - prefix += suffix; - return prefix; + // concatenate + prefix += data; + prefix += suffix; + return prefix; } String MSWindowsClipboardHTMLConverter::doToIClipboard(const String& data) const { - // get fragment start/end args - String startArg = findArg(data, "StartFragment"); - String endArg = findArg(data, "EndFragment"); - if (startArg.empty() || endArg.empty()) { - return String(); - } + // get fragment start/end args + String startArg = findArg(data, "StartFragment"); + String endArg = findArg(data, "EndFragment"); + if (startArg.empty() || endArg.empty()) { + return String(); + } - // convert args to integers - SInt32 start = (SInt32)atoi(startArg.c_str()); - SInt32 end = (SInt32)atoi(endArg.c_str()); - if (start <= 0 || end <= 0 || start >= end) { - return String(); - } + // convert args to integers + SInt32 start = (SInt32)atoi(startArg.c_str()); + SInt32 end = (SInt32)atoi(endArg.c_str()); + if (start <= 0 || end <= 0 || start >= end) { + return String(); + } - // extract the fragment - return data.substr(start, end - start); + // extract the fragment + return data.substr(start, end - start); } String MSWindowsClipboardHTMLConverter::findArg( - const String& data, const String& name) const + const String& data, const String& name) const { - String::size_type i = data.find(name); - if (i == String::npos) { - return String(); - } - i = data.find_first_of(":\r\n", i); - if (i == String::npos || data[i] != ':') { - return String(); - } - i = data.find_first_of("0123456789\r\n", i + 1); - if (i == String::npos || data[i] == '\r' || data[i] == '\n') { - return String(); - } - String::size_type j = data.find_first_not_of("0123456789", i); - if (j == String::npos) { - j = data.size(); - } - return data.substr(i, j - i); + String::size_type i = data.find(name); + if (i == String::npos) { + return String(); + } + i = data.find_first_of(":\r\n", i); + if (i == String::npos || data[i] != ':') { + return String(); + } + i = data.find_first_of("0123456789\r\n", i + 1); + if (i == String::npos || data[i] == '\r' || data[i] == '\n') { + return String(); + } + String::size_type j = data.find_first_not_of("0123456789", i); + if (j == String::npos) { + j = data.size(); + } + return data.substr(i, j - i); } diff --git a/src/lib/platform/MSWindowsClipboardHTMLConverter.h b/src/lib/platform/MSWindowsClipboardHTMLConverter.h index cba26e13..9ca767c9 100644 --- a/src/lib/platform/MSWindowsClipboardHTMLConverter.h +++ b/src/lib/platform/MSWindowsClipboardHTMLConverter.h @@ -22,24 +22,24 @@ //! Convert to/from HTML encoding class MSWindowsClipboardHTMLConverter : - public MSWindowsClipboardAnyTextConverter { + public MSWindowsClipboardAnyTextConverter { public: - MSWindowsClipboardHTMLConverter(); - virtual ~MSWindowsClipboardHTMLConverter(); + MSWindowsClipboardHTMLConverter(); + virtual ~MSWindowsClipboardHTMLConverter(); - // IMSWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual UINT getWin32Format() const; + // IMSWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual UINT getWin32Format() const; protected: - // MSWindowsClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // MSWindowsClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; private: - String findArg(const String& data, const String& name) const; + String findArg(const String& data, const String& name) const; private: - UINT m_format; + UINT m_format; }; diff --git a/src/lib/platform/MSWindowsClipboardTextConverter.cpp b/src/lib/platform/MSWindowsClipboardTextConverter.cpp index 6988c43b..9fbec002 100644 --- a/src/lib/platform/MSWindowsClipboardTextConverter.cpp +++ b/src/lib/platform/MSWindowsClipboardTextConverter.cpp @@ -26,35 +26,35 @@ MSWindowsClipboardTextConverter::MSWindowsClipboardTextConverter() { - // do nothing + // do nothing } MSWindowsClipboardTextConverter::~MSWindowsClipboardTextConverter() { - // do nothing + // do nothing } UINT MSWindowsClipboardTextConverter::getWin32Format() const { - return CF_TEXT; + return CF_TEXT; } String MSWindowsClipboardTextConverter::doFromIClipboard(const String& data) const { - // convert and add nul terminator - return Unicode::UTF8ToText(data) += '\0'; + // convert and add nul terminator + return Unicode::UTF8ToText(data) += '\0'; } String MSWindowsClipboardTextConverter::doToIClipboard(const String& data) const { - // convert and truncate at first nul terminator - String dst = Unicode::textToUTF8(data); - String::size_type n = dst.find('\0'); - if (n != String::npos) { - dst.erase(n); - } - return dst; + // convert and truncate at first nul terminator + String dst = Unicode::textToUTF8(data); + String::size_type n = dst.find('\0'); + if (n != String::npos) { + dst.erase(n); + } + return dst; } diff --git a/src/lib/platform/MSWindowsClipboardTextConverter.h b/src/lib/platform/MSWindowsClipboardTextConverter.h index 956297df..2b534acd 100644 --- a/src/lib/platform/MSWindowsClipboardTextConverter.h +++ b/src/lib/platform/MSWindowsClipboardTextConverter.h @@ -22,16 +22,16 @@ //! Convert to/from locale text encoding class MSWindowsClipboardTextConverter : - public MSWindowsClipboardAnyTextConverter { + public MSWindowsClipboardAnyTextConverter { public: - MSWindowsClipboardTextConverter(); - virtual ~MSWindowsClipboardTextConverter(); + MSWindowsClipboardTextConverter(); + virtual ~MSWindowsClipboardTextConverter(); - // IMSWindowsClipboardConverter overrides - virtual UINT getWin32Format() const; + // IMSWindowsClipboardConverter overrides + virtual UINT getWin32Format() const; protected: - // MSWindowsClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // MSWindowsClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; }; diff --git a/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp b/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp index 999afabe..eee17af7 100644 --- a/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp +++ b/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp @@ -26,35 +26,35 @@ MSWindowsClipboardUTF16Converter::MSWindowsClipboardUTF16Converter() { - // do nothing + // do nothing } MSWindowsClipboardUTF16Converter::~MSWindowsClipboardUTF16Converter() { - // do nothing + // do nothing } UINT MSWindowsClipboardUTF16Converter::getWin32Format() const { - return CF_UNICODETEXT; + return CF_UNICODETEXT; } String MSWindowsClipboardUTF16Converter::doFromIClipboard(const String& data) const { - // convert and add nul terminator - return Unicode::UTF8ToUTF16(data).append(sizeof(wchar_t), 0); + // convert and add nul terminator + return Unicode::UTF8ToUTF16(data).append(sizeof(wchar_t), 0); } String MSWindowsClipboardUTF16Converter::doToIClipboard(const String& data) const { - // convert and strip nul terminator - String dst = Unicode::UTF16ToUTF8(data); - String::size_type n = dst.find('\0'); - if (n != String::npos) { - dst.erase(n); - } - return dst; + // convert and strip nul terminator + String dst = Unicode::UTF16ToUTF8(data); + String::size_type n = dst.find('\0'); + if (n != String::npos) { + dst.erase(n); + } + return dst; } diff --git a/src/lib/platform/MSWindowsClipboardUTF16Converter.h b/src/lib/platform/MSWindowsClipboardUTF16Converter.h index f0e4a307..8c9d8ceb 100644 --- a/src/lib/platform/MSWindowsClipboardUTF16Converter.h +++ b/src/lib/platform/MSWindowsClipboardUTF16Converter.h @@ -22,16 +22,16 @@ //! Convert to/from UTF-16 encoding class MSWindowsClipboardUTF16Converter : - public MSWindowsClipboardAnyTextConverter { + public MSWindowsClipboardAnyTextConverter { public: - MSWindowsClipboardUTF16Converter(); - virtual ~MSWindowsClipboardUTF16Converter(); + MSWindowsClipboardUTF16Converter(); + virtual ~MSWindowsClipboardUTF16Converter(); - // IMSWindowsClipboardConverter overrides - virtual UINT getWin32Format() const; + // IMSWindowsClipboardConverter overrides + virtual UINT getWin32Format() const; protected: - // MSWindowsClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // MSWindowsClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; }; diff --git a/src/lib/platform/MSWindowsDebugOutputter.cpp b/src/lib/platform/MSWindowsDebugOutputter.cpp index 0a0571a5..9d9f4344 100644 --- a/src/lib/platform/MSWindowsDebugOutputter.cpp +++ b/src/lib/platform/MSWindowsDebugOutputter.cpp @@ -48,8 +48,8 @@ MSWindowsDebugOutputter::show(bool showIfEmpty) bool MSWindowsDebugOutputter::write(ELevel level, const char* msg) { - OutputDebugString((std::string(msg) + "\n").c_str()); - return true; + OutputDebugString((std::string(msg) + "\n").c_str()); + return true; } void diff --git a/src/lib/platform/MSWindowsDebugOutputter.h b/src/lib/platform/MSWindowsDebugOutputter.h index c41aa128..3ce8c4e5 100644 --- a/src/lib/platform/MSWindowsDebugOutputter.h +++ b/src/lib/platform/MSWindowsDebugOutputter.h @@ -27,13 +27,13 @@ can be seen in the Output window. */ class MSWindowsDebugOutputter : public ILogOutputter { public: - MSWindowsDebugOutputter(); - virtual ~MSWindowsDebugOutputter(); + MSWindowsDebugOutputter(); + virtual ~MSWindowsDebugOutputter(); - // ILogOutputter overrides - virtual void open(const char* title); - virtual void close(); - virtual void show(bool showIfEmpty); - virtual bool write(ELevel level, const char* message); - virtual void flush(); + // ILogOutputter overrides + virtual void open(const char* title); + virtual void close(); + virtual void show(bool showIfEmpty); + virtual bool write(ELevel level, const char* message); + virtual void flush(); }; diff --git a/src/lib/platform/MSWindowsDesks.cpp b/src/lib/platform/MSWindowsDesks.cpp index a5cf4e62..325e4578 100644 --- a/src/lib/platform/MSWindowsDesks.cpp +++ b/src/lib/platform/MSWindowsDesks.cpp @@ -47,941 +47,941 @@ // X button stuff #if !defined(WM_XBUTTONDOWN) -#define WM_XBUTTONDOWN 0x020B -#define WM_XBUTTONUP 0x020C -#define WM_XBUTTONDBLCLK 0x020D -#define WM_NCXBUTTONDOWN 0x00AB -#define WM_NCXBUTTONUP 0x00AC -#define WM_NCXBUTTONDBLCLK 0x00AD -#define MOUSEEVENTF_XDOWN 0x0080 -#define MOUSEEVENTF_XUP 0x0100 -#define XBUTTON1 0x0001 -#define XBUTTON2 0x0002 +#define WM_XBUTTONDOWN 0x020B +#define WM_XBUTTONUP 0x020C +#define WM_XBUTTONDBLCLK 0x020D +#define WM_NCXBUTTONDOWN 0x00AB +#define WM_NCXBUTTONUP 0x00AC +#define WM_NCXBUTTONDBLCLK 0x00AD +#define MOUSEEVENTF_XDOWN 0x0080 +#define MOUSEEVENTF_XUP 0x0100 +#define XBUTTON1 0x0001 +#define XBUTTON2 0x0002 #endif #if !defined(VK_XBUTTON1) -#define VK_XBUTTON1 0x05 -#define VK_XBUTTON2 0x06 +#define VK_XBUTTON1 0x05 +#define VK_XBUTTON2 0x06 #endif // ; -#define SYNERGY_MSG_SWITCH SYNERGY_HOOK_LAST_MSG + 1 +#define SYNERGY_MSG_SWITCH SYNERGY_HOOK_LAST_MSG + 1 // ; -#define SYNERGY_MSG_ENTER SYNERGY_HOOK_LAST_MSG + 2 +#define SYNERGY_MSG_ENTER SYNERGY_HOOK_LAST_MSG + 2 // ; -#define SYNERGY_MSG_LEAVE SYNERGY_HOOK_LAST_MSG + 3 +#define SYNERGY_MSG_LEAVE SYNERGY_HOOK_LAST_MSG + 3 // wParam = flags, HIBYTE(lParam) = virtual key, LOBYTE(lParam) = scan code -#define SYNERGY_MSG_FAKE_KEY SYNERGY_HOOK_LAST_MSG + 4 +#define SYNERGY_MSG_FAKE_KEY SYNERGY_HOOK_LAST_MSG + 4 // flags, XBUTTON id -#define SYNERGY_MSG_FAKE_BUTTON SYNERGY_HOOK_LAST_MSG + 5 +#define SYNERGY_MSG_FAKE_BUTTON SYNERGY_HOOK_LAST_MSG + 5 // x; y -#define SYNERGY_MSG_FAKE_MOVE SYNERGY_HOOK_LAST_MSG + 6 +#define SYNERGY_MSG_FAKE_MOVE SYNERGY_HOOK_LAST_MSG + 6 // xDelta; yDelta -#define SYNERGY_MSG_FAKE_WHEEL SYNERGY_HOOK_LAST_MSG + 7 +#define SYNERGY_MSG_FAKE_WHEEL SYNERGY_HOOK_LAST_MSG + 7 // POINT*; -#define SYNERGY_MSG_CURSOR_POS SYNERGY_HOOK_LAST_MSG + 8 +#define SYNERGY_MSG_CURSOR_POS SYNERGY_HOOK_LAST_MSG + 8 // IKeyState*; -#define SYNERGY_MSG_SYNC_KEYS SYNERGY_HOOK_LAST_MSG + 9 +#define SYNERGY_MSG_SYNC_KEYS SYNERGY_HOOK_LAST_MSG + 9 // install; -#define SYNERGY_MSG_SCREENSAVER SYNERGY_HOOK_LAST_MSG + 10 +#define SYNERGY_MSG_SCREENSAVER SYNERGY_HOOK_LAST_MSG + 10 // dx; dy -#define SYNERGY_MSG_FAKE_REL_MOVE SYNERGY_HOOK_LAST_MSG + 11 +#define SYNERGY_MSG_FAKE_REL_MOVE SYNERGY_HOOK_LAST_MSG + 11 // enable; -#define SYNERGY_MSG_FAKE_INPUT SYNERGY_HOOK_LAST_MSG + 12 +#define SYNERGY_MSG_FAKE_INPUT SYNERGY_HOOK_LAST_MSG + 12 // // MSWindowsDesks // MSWindowsDesks::MSWindowsDesks( - bool isPrimary, bool noHooks, HINSTANCE hookLibrary, - const IScreenSaver* screensaver, IEventQueue* events, - IJob* updateKeys, bool stopOnDeskSwitch) : - m_isPrimary(isPrimary), - m_noHooks(noHooks), - m_isOnScreen(m_isPrimary), - m_x(0), m_y(0), - m_w(0), m_h(0), - m_xCenter(0), m_yCenter(0), - m_multimon(false), - m_timer(NULL), - m_screensaver(screensaver), - m_screensaverNotify(false), - m_activeDesk(NULL), - m_activeDeskName(), - m_mutex(), - m_deskReady(&m_mutex, false), - m_updateKeys(updateKeys), - m_events(events), - m_stopOnDeskSwitch(stopOnDeskSwitch) + bool isPrimary, bool noHooks, HINSTANCE hookLibrary, + const IScreenSaver* screensaver, IEventQueue* events, + IJob* updateKeys, bool stopOnDeskSwitch) : + m_isPrimary(isPrimary), + m_noHooks(noHooks), + m_isOnScreen(m_isPrimary), + m_x(0), m_y(0), + m_w(0), m_h(0), + m_xCenter(0), m_yCenter(0), + m_multimon(false), + m_timer(NULL), + m_screensaver(screensaver), + m_screensaverNotify(false), + m_activeDesk(NULL), + m_activeDeskName(), + m_mutex(), + m_deskReady(&m_mutex, false), + m_updateKeys(updateKeys), + m_events(events), + m_stopOnDeskSwitch(stopOnDeskSwitch) { - if (hookLibrary != NULL) - queryHookLibrary(hookLibrary); + if (hookLibrary != NULL) + queryHookLibrary(hookLibrary); - m_cursor = createBlankCursor(); - m_deskClass = createDeskWindowClass(m_isPrimary); - m_keyLayout = GetKeyboardLayout(GetCurrentThreadId()); - resetOptions(); + m_cursor = createBlankCursor(); + m_deskClass = createDeskWindowClass(m_isPrimary); + m_keyLayout = GetKeyboardLayout(GetCurrentThreadId()); + resetOptions(); } MSWindowsDesks::~MSWindowsDesks() { - disable(); - destroyClass(m_deskClass); - destroyCursor(m_cursor); - delete m_updateKeys; + disable(); + destroyClass(m_deskClass); + destroyCursor(m_cursor); + delete m_updateKeys; } void MSWindowsDesks::enable() { - m_threadID = GetCurrentThreadId(); + m_threadID = GetCurrentThreadId(); - // set the active desk and (re)install the hooks - checkDesk(); + // set the active desk and (re)install the hooks + checkDesk(); - // install the desk timer. this timer periodically checks - // which desk is active and reinstalls the hooks as necessary. - // we wouldn't need this if windows notified us of a desktop - // change but as far as i can tell it doesn't. - m_timer = m_events->newTimer(0.2, NULL); - m_events->adoptHandler(Event::kTimer, m_timer, - new TMethodEventJob( - this, &MSWindowsDesks::handleCheckDesk)); + // install the desk timer. this timer periodically checks + // which desk is active and reinstalls the hooks as necessary. + // we wouldn't need this if windows notified us of a desktop + // change but as far as i can tell it doesn't. + m_timer = m_events->newTimer(0.2, NULL); + m_events->adoptHandler(Event::kTimer, m_timer, + new TMethodEventJob( + this, &MSWindowsDesks::handleCheckDesk)); - updateKeys(); + updateKeys(); } void MSWindowsDesks::disable() { - // remove timer - if (m_timer != NULL) { - m_events->removeHandler(Event::kTimer, m_timer); - m_events->deleteTimer(m_timer); - m_timer = NULL; - } + // remove timer + if (m_timer != NULL) { + m_events->removeHandler(Event::kTimer, m_timer); + m_events->deleteTimer(m_timer); + m_timer = NULL; + } - // destroy desks - removeDesks(); + // destroy desks + removeDesks(); - m_isOnScreen = m_isPrimary; + m_isOnScreen = m_isPrimary; } void MSWindowsDesks::enter() { - sendMessage(SYNERGY_MSG_ENTER, 0, 0); + sendMessage(SYNERGY_MSG_ENTER, 0, 0); } void MSWindowsDesks::leave(HKL keyLayout) { - sendMessage(SYNERGY_MSG_LEAVE, (WPARAM)keyLayout, 0); + sendMessage(SYNERGY_MSG_LEAVE, (WPARAM)keyLayout, 0); } void MSWindowsDesks::resetOptions() { - m_leaveForegroundOption = false; + m_leaveForegroundOption = false; } void MSWindowsDesks::setOptions(const OptionsList& options) { - for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { - if (options[i] == kOptionWin32KeepForeground) { - m_leaveForegroundOption = (options[i + 1] != 0); - LOG((CLOG_DEBUG1 "%s the foreground window", m_leaveForegroundOption ? "don\'t grab" : "grab")); - } - } + for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { + if (options[i] == kOptionWin32KeepForeground) { + m_leaveForegroundOption = (options[i + 1] != 0); + LOG((CLOG_DEBUG1 "%s the foreground window", m_leaveForegroundOption ? "don\'t grab" : "grab")); + } + } } void MSWindowsDesks::updateKeys() { - sendMessage(SYNERGY_MSG_SYNC_KEYS, 0, 0); + sendMessage(SYNERGY_MSG_SYNC_KEYS, 0, 0); } void MSWindowsDesks::setShape(SInt32 x, SInt32 y, - SInt32 width, SInt32 height, - SInt32 xCenter, SInt32 yCenter, bool isMultimon) + SInt32 width, SInt32 height, + SInt32 xCenter, SInt32 yCenter, bool isMultimon) { - m_x = x; - m_y = y; - m_w = width; - m_h = height; - m_xCenter = xCenter; - m_yCenter = yCenter; - m_multimon = isMultimon; + m_x = x; + m_y = y; + m_w = width; + m_h = height; + m_xCenter = xCenter; + m_yCenter = yCenter; + m_multimon = isMultimon; } void MSWindowsDesks::installScreensaverHooks(bool install) { - if (m_isPrimary && m_screensaverNotify != install) { - m_screensaverNotify = install; - sendMessage(SYNERGY_MSG_SCREENSAVER, install, 0); - } + if (m_isPrimary && m_screensaverNotify != install) { + m_screensaverNotify = install; + sendMessage(SYNERGY_MSG_SCREENSAVER, install, 0); + } } void MSWindowsDesks::fakeInputBegin() { - sendMessage(SYNERGY_MSG_FAKE_INPUT, 1, 0); + sendMessage(SYNERGY_MSG_FAKE_INPUT, 1, 0); } void MSWindowsDesks::fakeInputEnd() { - sendMessage(SYNERGY_MSG_FAKE_INPUT, 0, 0); + sendMessage(SYNERGY_MSG_FAKE_INPUT, 0, 0); } void MSWindowsDesks::getCursorPos(SInt32& x, SInt32& y) const { - POINT pos; - sendMessage(SYNERGY_MSG_CURSOR_POS, reinterpret_cast(&pos), 0); - x = pos.x; - y = pos.y; + POINT pos; + sendMessage(SYNERGY_MSG_CURSOR_POS, reinterpret_cast(&pos), 0); + x = pos.x; + y = pos.y; } void MSWindowsDesks::fakeKeyEvent( - KeyButton button, UINT virtualKey, - bool press, bool /*isAutoRepeat*/) const + KeyButton button, UINT virtualKey, + bool press, bool /*isAutoRepeat*/) const { - // synthesize event - DWORD flags = 0; - if (((button & 0x100u) != 0)) { - flags |= KEYEVENTF_EXTENDEDKEY; - } - if (!press) { - flags |= KEYEVENTF_KEYUP; - } - sendMessage(SYNERGY_MSG_FAKE_KEY, flags, - MAKEWORD(static_cast(button & 0xffu), - static_cast(virtualKey & 0xffu))); + // synthesize event + DWORD flags = 0; + if (((button & 0x100u) != 0)) { + flags |= KEYEVENTF_EXTENDEDKEY; + } + if (!press) { + flags |= KEYEVENTF_KEYUP; + } + sendMessage(SYNERGY_MSG_FAKE_KEY, flags, + MAKEWORD(static_cast(button & 0xffu), + static_cast(virtualKey & 0xffu))); } void MSWindowsDesks::fakeMouseButton(ButtonID button, bool press) { - // the system will swap the meaning of left/right for us if - // the user has configured a left-handed mouse but we don't - // want it to swap since we want the handedness of the - // server's mouse. so pre-swap for a left-handed mouse. - if (GetSystemMetrics(SM_SWAPBUTTON)) { - switch (button) { - case kButtonLeft: - button = kButtonRight; - break; + // the system will swap the meaning of left/right for us if + // the user has configured a left-handed mouse but we don't + // want it to swap since we want the handedness of the + // server's mouse. so pre-swap for a left-handed mouse. + if (GetSystemMetrics(SM_SWAPBUTTON)) { + switch (button) { + case kButtonLeft: + button = kButtonRight; + break; - case kButtonRight: - button = kButtonLeft; - break; - } - } + case kButtonRight: + button = kButtonLeft; + break; + } + } - // map button id to button flag and button data - DWORD data = 0; - DWORD flags; - switch (button) { - case kButtonLeft: - flags = press ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; - break; + // map button id to button flag and button data + DWORD data = 0; + DWORD flags; + switch (button) { + case kButtonLeft: + flags = press ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP; + break; - case kButtonMiddle: - flags = press ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP; - break; + case kButtonMiddle: + flags = press ? MOUSEEVENTF_MIDDLEDOWN : MOUSEEVENTF_MIDDLEUP; + break; - case kButtonRight: - flags = press ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; - break; + case kButtonRight: + flags = press ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP; + break; - case kButtonExtra0 + 0: - data = XBUTTON1; - flags = press ? MOUSEEVENTF_XDOWN : MOUSEEVENTF_XUP; - break; + case kButtonExtra0 + 0: + data = XBUTTON1; + flags = press ? MOUSEEVENTF_XDOWN : MOUSEEVENTF_XUP; + break; - case kButtonExtra0 + 1: - data = XBUTTON2; - flags = press ? MOUSEEVENTF_XDOWN : MOUSEEVENTF_XUP; - break; + case kButtonExtra0 + 1: + data = XBUTTON2; + flags = press ? MOUSEEVENTF_XDOWN : MOUSEEVENTF_XUP; + break; - default: - return; - } + default: + return; + } - // do it - sendMessage(SYNERGY_MSG_FAKE_BUTTON, flags, data); + // do it + sendMessage(SYNERGY_MSG_FAKE_BUTTON, flags, data); } void MSWindowsDesks::fakeMouseMove(SInt32 x, SInt32 y) const { - sendMessage(SYNERGY_MSG_FAKE_MOVE, - static_cast(x), - static_cast(y)); + sendMessage(SYNERGY_MSG_FAKE_MOVE, + static_cast(x), + static_cast(y)); } void MSWindowsDesks::fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const { - sendMessage(SYNERGY_MSG_FAKE_REL_MOVE, - static_cast(dx), - static_cast(dy)); + sendMessage(SYNERGY_MSG_FAKE_REL_MOVE, + static_cast(dx), + static_cast(dy)); } void MSWindowsDesks::fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const { - sendMessage(SYNERGY_MSG_FAKE_WHEEL, xDelta, yDelta); + sendMessage(SYNERGY_MSG_FAKE_WHEEL, xDelta, yDelta); } void MSWindowsDesks::sendMessage(UINT msg, WPARAM wParam, LPARAM lParam) const { - if (m_activeDesk != NULL && m_activeDesk->m_window != NULL) { - PostThreadMessage(m_activeDesk->m_threadID, msg, wParam, lParam); - waitForDesk(); - } + if (m_activeDesk != NULL && m_activeDesk->m_window != NULL) { + PostThreadMessage(m_activeDesk->m_threadID, msg, wParam, lParam); + waitForDesk(); + } } void MSWindowsDesks::queryHookLibrary(HINSTANCE hookLibrary) { - // look up functions - if (m_isPrimary && !m_noHooks) { - m_install = (InstallFunc)GetProcAddress(hookLibrary, "install"); - m_uninstall = (UninstallFunc)GetProcAddress(hookLibrary, "uninstall"); - m_installScreensaver = - (InstallScreenSaverFunc)GetProcAddress( - hookLibrary, "installScreenSaver"); - m_uninstallScreensaver = - (UninstallScreenSaverFunc)GetProcAddress( - hookLibrary, "uninstallScreenSaver"); - if (m_install == NULL || - m_uninstall == NULL || - m_installScreensaver == NULL || - m_uninstallScreensaver == NULL) { - LOG((CLOG_ERR "Invalid hook library")); - throw XScreenOpenFailure(); - } - } - else { - m_install = NULL; - m_uninstall = NULL; - m_installScreensaver = NULL; - m_uninstallScreensaver = NULL; - } + // look up functions + if (m_isPrimary && !m_noHooks) { + m_install = (InstallFunc)GetProcAddress(hookLibrary, "install"); + m_uninstall = (UninstallFunc)GetProcAddress(hookLibrary, "uninstall"); + m_installScreensaver = + (InstallScreenSaverFunc)GetProcAddress( + hookLibrary, "installScreenSaver"); + m_uninstallScreensaver = + (UninstallScreenSaverFunc)GetProcAddress( + hookLibrary, "uninstallScreenSaver"); + if (m_install == NULL || + m_uninstall == NULL || + m_installScreensaver == NULL || + m_uninstallScreensaver == NULL) { + LOG((CLOG_ERR "Invalid hook library")); + throw XScreenOpenFailure(); + } + } + else { + m_install = NULL; + m_uninstall = NULL; + m_installScreensaver = NULL; + m_uninstallScreensaver = NULL; + } } HCURSOR MSWindowsDesks::createBlankCursor() const { - // create a transparent cursor - int cw = GetSystemMetrics(SM_CXCURSOR); - int ch = GetSystemMetrics(SM_CYCURSOR); - UInt8* cursorAND = new UInt8[ch * ((cw + 31) >> 2)]; - UInt8* cursorXOR = new UInt8[ch * ((cw + 31) >> 2)]; - memset(cursorAND, 0xff, ch * ((cw + 31) >> 2)); - memset(cursorXOR, 0x00, ch * ((cw + 31) >> 2)); - HCURSOR c = CreateCursor(MSWindowsScreen::getWindowInstance(), - 0, 0, cw, ch, cursorAND, cursorXOR); - delete[] cursorXOR; - delete[] cursorAND; - return c; + // create a transparent cursor + int cw = GetSystemMetrics(SM_CXCURSOR); + int ch = GetSystemMetrics(SM_CYCURSOR); + UInt8* cursorAND = new UInt8[ch * ((cw + 31) >> 2)]; + UInt8* cursorXOR = new UInt8[ch * ((cw + 31) >> 2)]; + memset(cursorAND, 0xff, ch * ((cw + 31) >> 2)); + memset(cursorXOR, 0x00, ch * ((cw + 31) >> 2)); + HCURSOR c = CreateCursor(MSWindowsScreen::getWindowInstance(), + 0, 0, cw, ch, cursorAND, cursorXOR); + delete[] cursorXOR; + delete[] cursorAND; + return c; } void MSWindowsDesks::destroyCursor(HCURSOR cursor) const { - if (cursor != NULL) { - DestroyCursor(cursor); - } + if (cursor != NULL) { + DestroyCursor(cursor); + } } ATOM MSWindowsDesks::createDeskWindowClass(bool isPrimary) const { - WNDCLASSEX classInfo; - classInfo.cbSize = sizeof(classInfo); - classInfo.style = CS_DBLCLKS | CS_NOCLOSE; - classInfo.lpfnWndProc = isPrimary ? - &MSWindowsDesks::primaryDeskProc : - &MSWindowsDesks::secondaryDeskProc; - classInfo.cbClsExtra = 0; - classInfo.cbWndExtra = 0; - classInfo.hInstance = MSWindowsScreen::getWindowInstance(); - classInfo.hIcon = NULL; - classInfo.hCursor = m_cursor; - classInfo.hbrBackground = NULL; - classInfo.lpszMenuName = NULL; - classInfo.lpszClassName = "SynergyDesk"; - classInfo.hIconSm = NULL; - return RegisterClassEx(&classInfo); + WNDCLASSEX classInfo; + classInfo.cbSize = sizeof(classInfo); + classInfo.style = CS_DBLCLKS | CS_NOCLOSE; + classInfo.lpfnWndProc = isPrimary ? + &MSWindowsDesks::primaryDeskProc : + &MSWindowsDesks::secondaryDeskProc; + classInfo.cbClsExtra = 0; + classInfo.cbWndExtra = 0; + classInfo.hInstance = MSWindowsScreen::getWindowInstance(); + classInfo.hIcon = NULL; + classInfo.hCursor = m_cursor; + classInfo.hbrBackground = NULL; + classInfo.lpszMenuName = NULL; + classInfo.lpszClassName = "SynergyDesk"; + classInfo.hIconSm = NULL; + return RegisterClassEx(&classInfo); } void MSWindowsDesks::destroyClass(ATOM windowClass) const { - if (windowClass != 0) { - UnregisterClass(reinterpret_cast(windowClass), - MSWindowsScreen::getWindowInstance()); - } + if (windowClass != 0) { + UnregisterClass(reinterpret_cast(windowClass), + MSWindowsScreen::getWindowInstance()); + } } HWND MSWindowsDesks::createWindow(ATOM windowClass, const char* name) const { - HWND window = CreateWindowEx(WS_EX_TRANSPARENT | - WS_EX_TOOLWINDOW, - reinterpret_cast(windowClass), - name, - WS_POPUP, - 0, 0, 1, 1, - NULL, NULL, - MSWindowsScreen::getWindowInstance(), - NULL); - if (window == NULL) { - LOG((CLOG_ERR "failed to create window: %d", GetLastError())); - throw XScreenOpenFailure(); - } - return window; + HWND window = CreateWindowEx(WS_EX_TRANSPARENT | + WS_EX_TOOLWINDOW, + reinterpret_cast(windowClass), + name, + WS_POPUP, + 0, 0, 1, 1, + NULL, NULL, + MSWindowsScreen::getWindowInstance(), + NULL); + if (window == NULL) { + LOG((CLOG_ERR "failed to create window: %d", GetLastError())); + throw XScreenOpenFailure(); + } + return window; } void MSWindowsDesks::destroyWindow(HWND hwnd) const { - if (hwnd != NULL) { - DestroyWindow(hwnd); - } + if (hwnd != NULL) { + DestroyWindow(hwnd); + } } LRESULT CALLBACK MSWindowsDesks::primaryDeskProc( - HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) + HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProc(hwnd, msg, wParam, lParam); } LRESULT CALLBACK MSWindowsDesks::secondaryDeskProc( - HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) + HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - // would like to detect any local user input and hide the hider - // window but for now we just detect mouse motion. - bool hide = false; - switch (msg) { - case WM_MOUSEMOVE: - if (LOWORD(lParam) != 0 || HIWORD(lParam) != 0) { - hide = true; - } - break; - } + // would like to detect any local user input and hide the hider + // window but for now we just detect mouse motion. + bool hide = false; + switch (msg) { + case WM_MOUSEMOVE: + if (LOWORD(lParam) != 0 || HIWORD(lParam) != 0) { + hide = true; + } + break; + } - if (hide && IsWindowVisible(hwnd)) { - ReleaseCapture(); - SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | - SWP_NOACTIVATE | SWP_HIDEWINDOW); - } + if (hide && IsWindowVisible(hwnd)) { + ReleaseCapture(); + SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | + SWP_NOACTIVATE | SWP_HIDEWINDOW); + } - return DefWindowProc(hwnd, msg, wParam, lParam); + return DefWindowProc(hwnd, msg, wParam, lParam); } void MSWindowsDesks::deskMouseMove(SInt32 x, SInt32 y) const { - // when using absolute positioning with mouse_event(), - // the normalized device coordinates range over only - // the primary screen. - SInt32 w = GetSystemMetrics(SM_CXSCREEN); - SInt32 h = GetSystemMetrics(SM_CYSCREEN); - mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, - (DWORD)((65535.0f * x) / (w - 1) + 0.5f), - (DWORD)((65535.0f * y) / (h - 1) + 0.5f), - 0, 0); + // when using absolute positioning with mouse_event(), + // the normalized device coordinates range over only + // the primary screen. + SInt32 w = GetSystemMetrics(SM_CXSCREEN); + SInt32 h = GetSystemMetrics(SM_CYSCREEN); + mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, + (DWORD)((65535.0f * x) / (w - 1) + 0.5f), + (DWORD)((65535.0f * y) / (h - 1) + 0.5f), + 0, 0); } void MSWindowsDesks::deskMouseRelativeMove(SInt32 dx, SInt32 dy) const { - // relative moves are subject to cursor acceleration which we don't - // want.so we disable acceleration, do the relative move, then - // restore acceleration. there's a slight chance we'll end up in - // the wrong place if the user moves the cursor using this system's - // mouse while simultaneously moving the mouse on the server - // system. that defeats the purpose of synergy so we'll assume - // that won't happen. even if it does, the next mouse move will - // correct the position. + // relative moves are subject to cursor acceleration which we don't + // want.so we disable acceleration, do the relative move, then + // restore acceleration. there's a slight chance we'll end up in + // the wrong place if the user moves the cursor using this system's + // mouse while simultaneously moving the mouse on the server + // system. that defeats the purpose of synergy so we'll assume + // that won't happen. even if it does, the next mouse move will + // correct the position. - // save mouse speed & acceleration - int oldSpeed[4]; - bool accelChanged = - SystemParametersInfo(SPI_GETMOUSE,0, oldSpeed, 0) && - SystemParametersInfo(SPI_GETMOUSESPEED, 0, oldSpeed + 3, 0); + // save mouse speed & acceleration + int oldSpeed[4]; + bool accelChanged = + SystemParametersInfo(SPI_GETMOUSE,0, oldSpeed, 0) && + SystemParametersInfo(SPI_GETMOUSESPEED, 0, oldSpeed + 3, 0); - // use 1:1 motion - if (accelChanged) { - int newSpeed[4] = { 0, 0, 0, 1 }; - accelChanged = - SystemParametersInfo(SPI_SETMOUSE, 0, newSpeed, 0) || - SystemParametersInfo(SPI_SETMOUSESPEED, 0, newSpeed + 3, 0); - } + // use 1:1 motion + if (accelChanged) { + int newSpeed[4] = { 0, 0, 0, 1 }; + accelChanged = + SystemParametersInfo(SPI_SETMOUSE, 0, newSpeed, 0) || + SystemParametersInfo(SPI_SETMOUSESPEED, 0, newSpeed + 3, 0); + } - // move relative to mouse position - mouse_event(MOUSEEVENTF_MOVE, dx, dy, 0, 0); + // move relative to mouse position + mouse_event(MOUSEEVENTF_MOVE, dx, dy, 0, 0); - // restore mouse speed & acceleration - if (accelChanged) { - SystemParametersInfo(SPI_SETMOUSE, 0, oldSpeed, 0); - SystemParametersInfo(SPI_SETMOUSESPEED, 0, oldSpeed + 3, 0); - } + // restore mouse speed & acceleration + if (accelChanged) { + SystemParametersInfo(SPI_SETMOUSE, 0, oldSpeed, 0); + SystemParametersInfo(SPI_SETMOUSESPEED, 0, oldSpeed + 3, 0); + } } void MSWindowsDesks::deskEnter(Desk* desk) { - if (!m_isPrimary) { - ReleaseCapture(); - } - ShowCursor(TRUE); - SetWindowPos(desk->m_window, HWND_BOTTOM, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | - SWP_NOACTIVATE | SWP_HIDEWINDOW); + if (!m_isPrimary) { + ReleaseCapture(); + } + ShowCursor(TRUE); + SetWindowPos(desk->m_window, HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | + SWP_NOACTIVATE | SWP_HIDEWINDOW); - // restore the foreground window - // XXX -- this raises the window to the top of the Z-order. we - // want it to stay wherever it was to properly support X-mouse - // (mouse over activation) but i've no idea how to do that. - // the obvious workaround of using SetWindowPos() to move it back - // after being raised doesn't work. - DWORD thisThread = - GetWindowThreadProcessId(desk->m_window, NULL); - DWORD thatThread = - GetWindowThreadProcessId(desk->m_foregroundWindow, NULL); - AttachThreadInput(thatThread, thisThread, TRUE); - SetForegroundWindow(desk->m_foregroundWindow); - AttachThreadInput(thatThread, thisThread, FALSE); - EnableWindow(desk->m_window, desk->m_lowLevel ? FALSE : TRUE); - desk->m_foregroundWindow = NULL; + // restore the foreground window + // XXX -- this raises the window to the top of the Z-order. we + // want it to stay wherever it was to properly support X-mouse + // (mouse over activation) but i've no idea how to do that. + // the obvious workaround of using SetWindowPos() to move it back + // after being raised doesn't work. + DWORD thisThread = + GetWindowThreadProcessId(desk->m_window, NULL); + DWORD thatThread = + GetWindowThreadProcessId(desk->m_foregroundWindow, NULL); + AttachThreadInput(thatThread, thisThread, TRUE); + SetForegroundWindow(desk->m_foregroundWindow); + AttachThreadInput(thatThread, thisThread, FALSE); + EnableWindow(desk->m_window, desk->m_lowLevel ? FALSE : TRUE); + desk->m_foregroundWindow = NULL; } void MSWindowsDesks::deskLeave(Desk* desk, HKL keyLayout) { - ShowCursor(FALSE); - if (m_isPrimary) { - // map a window to hide the cursor and to use whatever keyboard - // layout we choose rather than the keyboard layout of the last - // active window. - int x, y, w, h; - if (desk->m_lowLevel) { - // with a low level hook the cursor will never budge so - // just a 1x1 window is sufficient. - x = m_xCenter; - y = m_yCenter; - w = 1; - h = 1; - } - else { - // with regular hooks the cursor will jitter as it's moved - // by the user then back to the center by us. to be sure - // we never lose it, cover all the monitors with the window. - x = m_x; - y = m_y; - w = m_w; - h = m_h; - } - SetWindowPos(desk->m_window, HWND_TOP, x, y, w, h, - SWP_NOACTIVATE | SWP_SHOWWINDOW); + ShowCursor(FALSE); + if (m_isPrimary) { + // map a window to hide the cursor and to use whatever keyboard + // layout we choose rather than the keyboard layout of the last + // active window. + int x, y, w, h; + if (desk->m_lowLevel) { + // with a low level hook the cursor will never budge so + // just a 1x1 window is sufficient. + x = m_xCenter; + y = m_yCenter; + w = 1; + h = 1; + } + else { + // with regular hooks the cursor will jitter as it's moved + // by the user then back to the center by us. to be sure + // we never lose it, cover all the monitors with the window. + x = m_x; + y = m_y; + w = m_w; + h = m_h; + } + SetWindowPos(desk->m_window, HWND_TOP, x, y, w, h, + SWP_NOACTIVATE | SWP_SHOWWINDOW); - // if not using low-level hooks we have to also activate the - // window to ensure we don't lose keyboard focus. - // FIXME -- see if this can be avoided. if so then always - // disable the window (see handling of SYNERGY_MSG_SWITCH). - if (!desk->m_lowLevel) { - SetActiveWindow(desk->m_window); - } + // if not using low-level hooks we have to also activate the + // window to ensure we don't lose keyboard focus. + // FIXME -- see if this can be avoided. if so then always + // disable the window (see handling of SYNERGY_MSG_SWITCH). + if (!desk->m_lowLevel) { + SetActiveWindow(desk->m_window); + } - // if using low-level hooks then disable the foreground window - // so it can't mess up any of our keyboard events. the console - // program, for example, will cause characters to be reported as - // unshifted, regardless of the shift key state. interestingly - // we do see the shift key go down and up. - // - // note that we must enable the window to activate it and we - // need to disable the window on deskEnter. - else { - desk->m_foregroundWindow = getForegroundWindow(); - if (desk->m_foregroundWindow != NULL) { - EnableWindow(desk->m_window, TRUE); - SetActiveWindow(desk->m_window); - DWORD thisThread = - GetWindowThreadProcessId(desk->m_window, NULL); - DWORD thatThread = - GetWindowThreadProcessId(desk->m_foregroundWindow, NULL); - AttachThreadInput(thatThread, thisThread, TRUE); - SetForegroundWindow(desk->m_window); - AttachThreadInput(thatThread, thisThread, FALSE); - } - } + // if using low-level hooks then disable the foreground window + // so it can't mess up any of our keyboard events. the console + // program, for example, will cause characters to be reported as + // unshifted, regardless of the shift key state. interestingly + // we do see the shift key go down and up. + // + // note that we must enable the window to activate it and we + // need to disable the window on deskEnter. + else { + desk->m_foregroundWindow = getForegroundWindow(); + if (desk->m_foregroundWindow != NULL) { + EnableWindow(desk->m_window, TRUE); + SetActiveWindow(desk->m_window); + DWORD thisThread = + GetWindowThreadProcessId(desk->m_window, NULL); + DWORD thatThread = + GetWindowThreadProcessId(desk->m_foregroundWindow, NULL); + AttachThreadInput(thatThread, thisThread, TRUE); + SetForegroundWindow(desk->m_window); + AttachThreadInput(thatThread, thisThread, FALSE); + } + } - // switch to requested keyboard layout - ActivateKeyboardLayout(keyLayout, 0); - } - else { - // move hider window under the cursor center, raise, and show it - SetWindowPos(desk->m_window, HWND_TOP, - m_xCenter, m_yCenter, 1, 1, - SWP_NOACTIVATE | SWP_SHOWWINDOW); + // switch to requested keyboard layout + ActivateKeyboardLayout(keyLayout, 0); + } + else { + // move hider window under the cursor center, raise, and show it + SetWindowPos(desk->m_window, HWND_TOP, + m_xCenter, m_yCenter, 1, 1, + SWP_NOACTIVATE | SWP_SHOWWINDOW); - // watch for mouse motion. if we see any then we hide the - // hider window so the user can use the physically attached - // mouse if desired. we'd rather not capture the mouse but - // we aren't notified when the mouse leaves our window. - SetCapture(desk->m_window); + // watch for mouse motion. if we see any then we hide the + // hider window so the user can use the physically attached + // mouse if desired. we'd rather not capture the mouse but + // we aren't notified when the mouse leaves our window. + SetCapture(desk->m_window); - // warp the mouse to the cursor center - LOG((CLOG_DEBUG2 "warping cursor to center: %+d,%+d", m_xCenter, m_yCenter)); - deskMouseMove(m_xCenter, m_yCenter); - } + // warp the mouse to the cursor center + LOG((CLOG_DEBUG2 "warping cursor to center: %+d,%+d", m_xCenter, m_yCenter)); + deskMouseMove(m_xCenter, m_yCenter); + } } void MSWindowsDesks::deskThread(void* vdesk) { - MSG msg; + MSG msg; - // use given desktop for this thread - Desk* desk = static_cast(vdesk); - desk->m_threadID = GetCurrentThreadId(); - desk->m_window = NULL; - desk->m_foregroundWindow = NULL; - if (desk->m_desk != NULL && SetThreadDesktop(desk->m_desk) != 0) { - // create a message queue - PeekMessage(&msg, NULL, 0,0, PM_NOREMOVE); + // use given desktop for this thread + Desk* desk = static_cast(vdesk); + desk->m_threadID = GetCurrentThreadId(); + desk->m_window = NULL; + desk->m_foregroundWindow = NULL; + if (desk->m_desk != NULL && SetThreadDesktop(desk->m_desk) != 0) { + // create a message queue + PeekMessage(&msg, NULL, 0,0, PM_NOREMOVE); - // create a window. we use this window to hide the cursor. - try { - desk->m_window = createWindow(m_deskClass, "SynergyDesk"); - LOG((CLOG_DEBUG "desk %s window is 0x%08x", desk->m_name.c_str(), desk->m_window)); - } - catch (...) { - // ignore - LOG((CLOG_DEBUG "can't create desk window for %s", desk->m_name.c_str())); - } - } + // create a window. we use this window to hide the cursor. + try { + desk->m_window = createWindow(m_deskClass, "SynergyDesk"); + LOG((CLOG_DEBUG "desk %s window is 0x%08x", desk->m_name.c_str(), desk->m_window)); + } + catch (...) { + // ignore + LOG((CLOG_DEBUG "can't create desk window for %s", desk->m_name.c_str())); + } + } - // tell main thread that we're ready - { - Lock lock(&m_mutex); - m_deskReady = true; - m_deskReady.broadcast(); - } + // tell main thread that we're ready + { + Lock lock(&m_mutex); + m_deskReady = true; + m_deskReady.broadcast(); + } - while (GetMessage(&msg, NULL, 0, 0)) { - switch (msg.message) { - default: - TranslateMessage(&msg); - DispatchMessage(&msg); - continue; + while (GetMessage(&msg, NULL, 0, 0)) { + switch (msg.message) { + default: + TranslateMessage(&msg); + DispatchMessage(&msg); + continue; - case SYNERGY_MSG_SWITCH: - if (m_isPrimary && !m_noHooks) { - m_uninstall(); - if (m_screensaverNotify) { - m_uninstallScreensaver(); - m_installScreensaver(); - } - switch (m_install()) { - case kHOOK_FAILED: - // we won't work on this desk - desk->m_lowLevel = false; - break; + case SYNERGY_MSG_SWITCH: + if (m_isPrimary && !m_noHooks) { + m_uninstall(); + if (m_screensaverNotify) { + m_uninstallScreensaver(); + m_installScreensaver(); + } + switch (m_install()) { + case kHOOK_FAILED: + // we won't work on this desk + desk->m_lowLevel = false; + break; - case kHOOK_OKAY: - desk->m_lowLevel = false; - break; + case kHOOK_OKAY: + desk->m_lowLevel = false; + break; - case kHOOK_OKAY_LL: - desk->m_lowLevel = true; - break; - } + case kHOOK_OKAY_LL: + desk->m_lowLevel = true; + break; + } - // a window on the primary screen with low-level hooks - // should never activate. - if (desk->m_window) - EnableWindow(desk->m_window, desk->m_lowLevel ? FALSE : TRUE); - } - break; + // a window on the primary screen with low-level hooks + // should never activate. + if (desk->m_window) + EnableWindow(desk->m_window, desk->m_lowLevel ? FALSE : TRUE); + } + break; - case SYNERGY_MSG_ENTER: - m_isOnScreen = true; - deskEnter(desk); - break; + case SYNERGY_MSG_ENTER: + m_isOnScreen = true; + deskEnter(desk); + break; - case SYNERGY_MSG_LEAVE: - m_isOnScreen = false; - m_keyLayout = (HKL)msg.wParam; - deskLeave(desk, m_keyLayout); - break; + case SYNERGY_MSG_LEAVE: + m_isOnScreen = false; + m_keyLayout = (HKL)msg.wParam; + deskLeave(desk, m_keyLayout); + break; - case SYNERGY_MSG_FAKE_KEY: - keybd_event(HIBYTE(msg.lParam), LOBYTE(msg.lParam), (DWORD)msg.wParam, 0); - break; + case SYNERGY_MSG_FAKE_KEY: + keybd_event(HIBYTE(msg.lParam), LOBYTE(msg.lParam), (DWORD)msg.wParam, 0); + break; - case SYNERGY_MSG_FAKE_BUTTON: - if (msg.wParam != 0) { - mouse_event((DWORD)msg.wParam, 0, 0, (DWORD)msg.lParam, 0); - } - break; + case SYNERGY_MSG_FAKE_BUTTON: + if (msg.wParam != 0) { + mouse_event((DWORD)msg.wParam, 0, 0, (DWORD)msg.lParam, 0); + } + break; - case SYNERGY_MSG_FAKE_MOVE: - deskMouseMove(static_cast(msg.wParam), - static_cast(msg.lParam)); - break; + case SYNERGY_MSG_FAKE_MOVE: + deskMouseMove(static_cast(msg.wParam), + static_cast(msg.lParam)); + break; - case SYNERGY_MSG_FAKE_REL_MOVE: - deskMouseRelativeMove(static_cast(msg.wParam), - static_cast(msg.lParam)); - break; + case SYNERGY_MSG_FAKE_REL_MOVE: + deskMouseRelativeMove(static_cast(msg.wParam), + static_cast(msg.lParam)); + break; - case SYNERGY_MSG_FAKE_WHEEL: - // XXX -- add support for x-axis scrolling - if (msg.lParam != 0) { - mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (DWORD)msg.lParam, 0); - } - break; + case SYNERGY_MSG_FAKE_WHEEL: + // XXX -- add support for x-axis scrolling + if (msg.lParam != 0) { + mouse_event(MOUSEEVENTF_WHEEL, 0, 0, (DWORD)msg.lParam, 0); + } + break; - case SYNERGY_MSG_CURSOR_POS: { - POINT* pos = reinterpret_cast(msg.wParam); - if (!GetCursorPos(pos)) { - pos->x = m_xCenter; - pos->y = m_yCenter; - } - break; - } + case SYNERGY_MSG_CURSOR_POS: { + POINT* pos = reinterpret_cast(msg.wParam); + if (!GetCursorPos(pos)) { + pos->x = m_xCenter; + pos->y = m_yCenter; + } + break; + } - case SYNERGY_MSG_SYNC_KEYS: - m_updateKeys->run(); - break; + case SYNERGY_MSG_SYNC_KEYS: + m_updateKeys->run(); + break; - case SYNERGY_MSG_SCREENSAVER: - if (!m_noHooks) { - if (msg.wParam != 0) { - m_installScreensaver(); - } - else { - m_uninstallScreensaver(); - } - } - break; + case SYNERGY_MSG_SCREENSAVER: + if (!m_noHooks) { + if (msg.wParam != 0) { + m_installScreensaver(); + } + else { + m_uninstallScreensaver(); + } + } + break; - case SYNERGY_MSG_FAKE_INPUT: - keybd_event(SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY, - SYNERGY_HOOK_FAKE_INPUT_SCANCODE, - msg.wParam ? 0 : KEYEVENTF_KEYUP, 0); - break; - } + case SYNERGY_MSG_FAKE_INPUT: + keybd_event(SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY, + SYNERGY_HOOK_FAKE_INPUT_SCANCODE, + msg.wParam ? 0 : KEYEVENTF_KEYUP, 0); + break; + } - // notify that message was processed - Lock lock(&m_mutex); - m_deskReady = true; - m_deskReady.broadcast(); - } + // notify that message was processed + Lock lock(&m_mutex); + m_deskReady = true; + m_deskReady.broadcast(); + } - // clean up - deskEnter(desk); - if (desk->m_window != NULL) { - DestroyWindow(desk->m_window); - } - if (desk->m_desk != NULL) { - closeDesktop(desk->m_desk); - } + // clean up + deskEnter(desk); + if (desk->m_window != NULL) { + DestroyWindow(desk->m_window); + } + if (desk->m_desk != NULL) { + closeDesktop(desk->m_desk); + } } MSWindowsDesks::Desk* MSWindowsDesks::addDesk(const String& name, HDESK hdesk) { - Desk* desk = new Desk; - desk->m_name = name; - desk->m_desk = hdesk; - desk->m_targetID = GetCurrentThreadId(); - desk->m_thread = new Thread(new TMethodJob( - this, &MSWindowsDesks::deskThread, desk)); - waitForDesk(); - m_desks.insert(std::make_pair(name, desk)); - return desk; + Desk* desk = new Desk; + desk->m_name = name; + desk->m_desk = hdesk; + desk->m_targetID = GetCurrentThreadId(); + desk->m_thread = new Thread(new TMethodJob( + this, &MSWindowsDesks::deskThread, desk)); + waitForDesk(); + m_desks.insert(std::make_pair(name, desk)); + return desk; } void MSWindowsDesks::removeDesks() { - for (Desks::iterator index = m_desks.begin(); - index != m_desks.end(); ++index) { - Desk* desk = index->second; - PostThreadMessage(desk->m_threadID, WM_QUIT, 0, 0); - desk->m_thread->wait(); - delete desk->m_thread; - delete desk; - } - m_desks.clear(); - m_activeDesk = NULL; - m_activeDeskName = ""; + for (Desks::iterator index = m_desks.begin(); + index != m_desks.end(); ++index) { + Desk* desk = index->second; + PostThreadMessage(desk->m_threadID, WM_QUIT, 0, 0); + desk->m_thread->wait(); + delete desk->m_thread; + delete desk; + } + m_desks.clear(); + m_activeDesk = NULL; + m_activeDeskName = ""; } void MSWindowsDesks::checkDesk() { - // get current desktop. if we already know about it then return. - Desk* desk; - HDESK hdesk = openInputDesktop(); - String name = getDesktopName(hdesk); - Desks::const_iterator index = m_desks.find(name); - if (index == m_desks.end()) { - desk = addDesk(name, hdesk); - // hold on to hdesk until thread exits so the desk can't - // be removed by the system - } - else { - closeDesktop(hdesk); - desk = index->second; - } + // get current desktop. if we already know about it then return. + Desk* desk; + HDESK hdesk = openInputDesktop(); + String name = getDesktopName(hdesk); + Desks::const_iterator index = m_desks.find(name); + if (index == m_desks.end()) { + desk = addDesk(name, hdesk); + // hold on to hdesk until thread exits so the desk can't + // be removed by the system + } + else { + closeDesktop(hdesk); + desk = index->second; + } - // if we are told to shut down on desk switch, and this is not the - // first switch, then shut down. - if (m_stopOnDeskSwitch && m_activeDesk != NULL && name != m_activeDeskName) { - LOG((CLOG_DEBUG "shutting down because of desk switch to \"%s\"", name.c_str())); - m_events->addEvent(Event(Event::kQuit)); - return; - } + // if we are told to shut down on desk switch, and this is not the + // first switch, then shut down. + if (m_stopOnDeskSwitch && m_activeDesk != NULL && name != m_activeDeskName) { + LOG((CLOG_DEBUG "shutting down because of desk switch to \"%s\"", name.c_str())); + m_events->addEvent(Event(Event::kQuit)); + return; + } - // if active desktop changed then tell the old and new desk threads - // about the change. don't switch desktops when the screensaver is - // active becaue we'd most likely switch to the screensaver desktop - // which would have the side effect of forcing the screensaver to - // stop. - if (name != m_activeDeskName && !m_screensaver->isActive()) { - // show cursor on previous desk - bool wasOnScreen = m_isOnScreen; - if (!wasOnScreen) { - sendMessage(SYNERGY_MSG_ENTER, 0, 0); - } + // if active desktop changed then tell the old and new desk threads + // about the change. don't switch desktops when the screensaver is + // active becaue we'd most likely switch to the screensaver desktop + // which would have the side effect of forcing the screensaver to + // stop. + if (name != m_activeDeskName && !m_screensaver->isActive()) { + // show cursor on previous desk + bool wasOnScreen = m_isOnScreen; + if (!wasOnScreen) { + sendMessage(SYNERGY_MSG_ENTER, 0, 0); + } - // check for desk accessibility change. we don't get events - // from an inaccessible desktop so when we switch from an - // inaccessible desktop to an accessible one we have to - // update the keyboard state. - LOG((CLOG_DEBUG "switched to desk \"%s\"", name.c_str())); - bool syncKeys = false; - bool isAccessible = isDeskAccessible(desk); - if (isDeskAccessible(m_activeDesk) != isAccessible) { - if (isAccessible) { - LOG((CLOG_DEBUG "desktop is now accessible")); - syncKeys = true; - } - else { - LOG((CLOG_DEBUG "desktop is now inaccessible")); - } - } + // check for desk accessibility change. we don't get events + // from an inaccessible desktop so when we switch from an + // inaccessible desktop to an accessible one we have to + // update the keyboard state. + LOG((CLOG_DEBUG "switched to desk \"%s\"", name.c_str())); + bool syncKeys = false; + bool isAccessible = isDeskAccessible(desk); + if (isDeskAccessible(m_activeDesk) != isAccessible) { + if (isAccessible) { + LOG((CLOG_DEBUG "desktop is now accessible")); + syncKeys = true; + } + else { + LOG((CLOG_DEBUG "desktop is now inaccessible")); + } + } - // switch desk - m_activeDesk = desk; - m_activeDeskName = name; - sendMessage(SYNERGY_MSG_SWITCH, 0, 0); + // switch desk + m_activeDesk = desk; + m_activeDeskName = name; + sendMessage(SYNERGY_MSG_SWITCH, 0, 0); - // hide cursor on new desk - if (!wasOnScreen) { - sendMessage(SYNERGY_MSG_LEAVE, (WPARAM)m_keyLayout, 0); - } + // hide cursor on new desk + if (!wasOnScreen) { + sendMessage(SYNERGY_MSG_LEAVE, (WPARAM)m_keyLayout, 0); + } - // update keys if necessary - if (syncKeys) { - updateKeys(); - } - } - else if (name != m_activeDeskName) { - // screen saver might have started - PostThreadMessage(m_threadID, SYNERGY_MSG_SCREEN_SAVER, TRUE, 0); - } + // update keys if necessary + if (syncKeys) { + updateKeys(); + } + } + else if (name != m_activeDeskName) { + // screen saver might have started + PostThreadMessage(m_threadID, SYNERGY_MSG_SCREEN_SAVER, TRUE, 0); + } } bool MSWindowsDesks::isDeskAccessible(const Desk* desk) const { - return (desk != NULL && desk->m_desk != NULL); + return (desk != NULL && desk->m_desk != NULL); } void MSWindowsDesks::waitForDesk() const { - MSWindowsDesks* self = const_cast(this); + MSWindowsDesks* self = const_cast(this); - Lock lock(&m_mutex); - while (!(bool)m_deskReady) { - m_deskReady.wait(); - } - self->m_deskReady = false; + Lock lock(&m_mutex); + while (!(bool)m_deskReady) { + m_deskReady.wait(); + } + self->m_deskReady = false; } void MSWindowsDesks::handleCheckDesk(const Event&, void*) { - checkDesk(); + checkDesk(); - // also check if screen saver is running if on a modern OS and - // this is the primary screen. - if (m_isPrimary) { - BOOL running; - SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, FALSE); - PostThreadMessage(m_threadID, SYNERGY_MSG_SCREEN_SAVER, running, 0); - } + // also check if screen saver is running if on a modern OS and + // this is the primary screen. + if (m_isPrimary) { + BOOL running; + SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, FALSE); + PostThreadMessage(m_threadID, SYNERGY_MSG_SCREEN_SAVER, running, 0); + } } HDESK MSWindowsDesks::openInputDesktop() { - return OpenInputDesktop( - DF_ALLOWOTHERACCOUNTHOOK, TRUE, - DESKTOP_CREATEWINDOW | DESKTOP_HOOKCONTROL | GENERIC_WRITE); + return OpenInputDesktop( + DF_ALLOWOTHERACCOUNTHOOK, TRUE, + DESKTOP_CREATEWINDOW | DESKTOP_HOOKCONTROL | GENERIC_WRITE); } void MSWindowsDesks::closeDesktop(HDESK desk) { - if (desk != NULL) { - CloseDesktop(desk); - } + if (desk != NULL) { + CloseDesktop(desk); + } } String MSWindowsDesks::getDesktopName(HDESK desk) { - if (desk == NULL) { - return String(); - } - else { - DWORD size; - GetUserObjectInformation(desk, UOI_NAME, NULL, 0, &size); - TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR)); - GetUserObjectInformation(desk, UOI_NAME, name, size, &size); - String result(name); - return result; - } + if (desk == NULL) { + return String(); + } + else { + DWORD size; + GetUserObjectInformation(desk, UOI_NAME, NULL, 0, &size); + TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR)); + GetUserObjectInformation(desk, UOI_NAME, name, size, &size); + String result(name); + return result; + } } HWND MSWindowsDesks::getForegroundWindow() const { - // Ideally we'd return NULL as much as possible, only returning - // the actual foreground window when we know it's going to mess - // up our keyboard input. For now we'll just let the user - // decide. - if (m_leaveForegroundOption) { - return NULL; - } - return GetForegroundWindow(); + // Ideally we'd return NULL as much as possible, only returning + // the actual foreground window when we know it's going to mess + // up our keyboard input. For now we'll just let the user + // decide. + if (m_leaveForegroundOption) { + return NULL; + } + return GetForegroundWindow(); } diff --git a/src/lib/platform/MSWindowsDesks.h b/src/lib/platform/MSWindowsDesks.h index acc5ac7c..d12900a1 100644 --- a/src/lib/platform/MSWindowsDesks.h +++ b/src/lib/platform/MSWindowsDesks.h @@ -55,251 +55,251 @@ object don't have to know anything about desks. */ class MSWindowsDesks { public: - //! Constructor - /*! - \p isPrimary is true iff the desk is for a primary screen. - \p screensaver points to a screensaver object and it's used - only to check if the screensaver is active. The \p updateKeys - job is adopted and is called when the key state should be - updated in a thread attached to the current desk. - \p hookLibrary must be a handle to the hook library. - */ - MSWindowsDesks( - bool isPrimary, bool noHooks, HINSTANCE hookLibrary, - const IScreenSaver* screensaver, IEventQueue* events, - IJob* updateKeys, bool stopOnDeskSwitch); - ~MSWindowsDesks(); + //! Constructor + /*! + \p isPrimary is true iff the desk is for a primary screen. + \p screensaver points to a screensaver object and it's used + only to check if the screensaver is active. The \p updateKeys + job is adopted and is called when the key state should be + updated in a thread attached to the current desk. + \p hookLibrary must be a handle to the hook library. + */ + MSWindowsDesks( + bool isPrimary, bool noHooks, HINSTANCE hookLibrary, + const IScreenSaver* screensaver, IEventQueue* events, + IJob* updateKeys, bool stopOnDeskSwitch); + ~MSWindowsDesks(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Enable desk tracking - /*! - Enables desk tracking. While enabled, this object checks to see - if the desk has changed and ensures that the hooks are installed - on the new desk. \c setShape should be called at least once - before calling \c enable. - */ - void enable(); + //! Enable desk tracking + /*! + Enables desk tracking. While enabled, this object checks to see + if the desk has changed and ensures that the hooks are installed + on the new desk. \c setShape should be called at least once + before calling \c enable. + */ + void enable(); - //! Disable desk tracking - /*! - Disables desk tracking. \sa enable. - */ - void disable(); + //! Disable desk tracking + /*! + Disables desk tracking. \sa enable. + */ + void disable(); - //! Notify of entering a desk - /*! - Prepares a desk for when the cursor enters it. - */ - void enter(); + //! Notify of entering a desk + /*! + Prepares a desk for when the cursor enters it. + */ + void enter(); - //! Notify of leaving a desk - /*! - Prepares a desk for when the cursor leaves it. - */ - void leave(HKL keyLayout); + //! Notify of leaving a desk + /*! + Prepares a desk for when the cursor leaves it. + */ + void leave(HKL keyLayout); - //! Notify of options changes - /*! - Resets all options to their default values. - */ - void resetOptions(); + //! Notify of options changes + /*! + Resets all options to their default values. + */ + void resetOptions(); - //! Notify of options changes - /*! - Set options to given values. Ignores unknown options and doesn't - modify options that aren't given in \c options. - */ - void setOptions(const OptionsList& options); + //! Notify of options changes + /*! + Set options to given values. Ignores unknown options and doesn't + modify options that aren't given in \c options. + */ + void setOptions(const OptionsList& options); - //! Update the key state - /*! - Causes the key state to get updated to reflect the physical keyboard - state and current keyboard mapping. - */ - void updateKeys(); + //! Update the key state + /*! + Causes the key state to get updated to reflect the physical keyboard + state and current keyboard mapping. + */ + void updateKeys(); - //! Tell desk about new size - /*! - This tells the desks that the display size has changed. - */ - void setShape(SInt32 x, SInt32 y, - SInt32 width, SInt32 height, - SInt32 xCenter, SInt32 yCenter, bool isMultimon); + //! Tell desk about new size + /*! + This tells the desks that the display size has changed. + */ + void setShape(SInt32 x, SInt32 y, + SInt32 width, SInt32 height, + SInt32 xCenter, SInt32 yCenter, bool isMultimon); - //! Install/uninstall screensaver hooks - /*! - If \p install is true then the screensaver hooks are installed and, - if desk tracking is enabled, updated whenever the desk changes. If - \p install is false then the screensaver hooks are uninstalled. - */ - void installScreensaverHooks(bool install); + //! Install/uninstall screensaver hooks + /*! + If \p install is true then the screensaver hooks are installed and, + if desk tracking is enabled, updated whenever the desk changes. If + \p install is false then the screensaver hooks are uninstalled. + */ + void installScreensaverHooks(bool install); - //! Start ignoring user input - /*! - Starts ignoring user input so we don't pick up our own synthesized events. - */ - void fakeInputBegin(); + //! Start ignoring user input + /*! + Starts ignoring user input so we don't pick up our own synthesized events. + */ + void fakeInputBegin(); - //! Stop ignoring user input - /*! - Undoes whatever \c fakeInputBegin() did. - */ - void fakeInputEnd(); + //! Stop ignoring user input + /*! + Undoes whatever \c fakeInputBegin() did. + */ + void fakeInputEnd(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get cursor position - /*! - Return the current position of the cursor in \c x and \c y. - */ - void getCursorPos(SInt32& x, SInt32& y) const; + //! Get cursor position + /*! + Return the current position of the cursor in \c x and \c y. + */ + void getCursorPos(SInt32& x, SInt32& y) const; - //! Fake key press/release - /*! - Synthesize a press or release of key \c button. - */ - void fakeKeyEvent(KeyButton button, UINT virtualKey, - bool press, bool isAutoRepeat) const; + //! Fake key press/release + /*! + Synthesize a press or release of key \c button. + */ + void fakeKeyEvent(KeyButton button, UINT virtualKey, + bool press, bool isAutoRepeat) const; - //! Fake mouse press/release - /*! - Synthesize a press or release of mouse button \c id. - */ - void fakeMouseButton(ButtonID id, bool press); + //! Fake mouse press/release + /*! + Synthesize a press or release of mouse button \c id. + */ + void fakeMouseButton(ButtonID id, bool press); - //! Fake mouse move - /*! - Synthesize a mouse move to the absolute coordinates \c x,y. - */ - void fakeMouseMove(SInt32 x, SInt32 y) const; + //! Fake mouse move + /*! + Synthesize a mouse move to the absolute coordinates \c x,y. + */ + void fakeMouseMove(SInt32 x, SInt32 y) const; - //! Fake mouse move - /*! - Synthesize a mouse move to the relative coordinates \c dx,dy. - */ - void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; + //! Fake mouse move + /*! + Synthesize a mouse move to the relative coordinates \c dx,dy. + */ + void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; - //! Fake mouse wheel - /*! - Synthesize a mouse wheel event of amount \c delta in direction \c axis. - */ - void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; + //! Fake mouse wheel + /*! + Synthesize a mouse wheel event of amount \c delta in direction \c axis. + */ + void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; - //@} + //@} private: - class Desk { - public: - String m_name; - Thread* m_thread; - DWORD m_threadID; - DWORD m_targetID; - HDESK m_desk; - HWND m_window; - HWND m_foregroundWindow; - bool m_lowLevel; - }; - typedef std::map Desks; + class Desk { + public: + String m_name; + Thread* m_thread; + DWORD m_threadID; + DWORD m_targetID; + HDESK m_desk; + HWND m_window; + HWND m_foregroundWindow; + bool m_lowLevel; + }; + typedef std::map Desks; - // initialization and shutdown operations - void queryHookLibrary(HINSTANCE hookLibrary); - HCURSOR createBlankCursor() const; - void destroyCursor(HCURSOR cursor) const; - ATOM createDeskWindowClass(bool isPrimary) const; - void destroyClass(ATOM windowClass) const; - HWND createWindow(ATOM windowClass, const char* name) const; - void destroyWindow(HWND) const; + // initialization and shutdown operations + void queryHookLibrary(HINSTANCE hookLibrary); + HCURSOR createBlankCursor() const; + void destroyCursor(HCURSOR cursor) const; + ATOM createDeskWindowClass(bool isPrimary) const; + void destroyClass(ATOM windowClass) const; + HWND createWindow(ATOM windowClass, const char* name) const; + void destroyWindow(HWND) const; - // message handlers - void deskMouseMove(SInt32 x, SInt32 y) const; - void deskMouseRelativeMove(SInt32 dx, SInt32 dy) const; - void deskEnter(Desk* desk); - void deskLeave(Desk* desk, HKL keyLayout); - void deskThread(void* vdesk); + // message handlers + void deskMouseMove(SInt32 x, SInt32 y) const; + void deskMouseRelativeMove(SInt32 dx, SInt32 dy) const; + void deskEnter(Desk* desk); + void deskLeave(Desk* desk, HKL keyLayout); + void deskThread(void* vdesk); - // desk switch checking and handling - Desk* addDesk(const String& name, HDESK hdesk); - void removeDesks(); - void checkDesk(); - bool isDeskAccessible(const Desk* desk) const; - void handleCheckDesk(const Event& event, void*); + // desk switch checking and handling + Desk* addDesk(const String& name, HDESK hdesk); + void removeDesks(); + void checkDesk(); + bool isDeskAccessible(const Desk* desk) const; + void handleCheckDesk(const Event& event, void*); - // communication with desk threads - void waitForDesk() const; - void sendMessage(UINT, WPARAM, LPARAM) const; + // communication with desk threads + void waitForDesk() const; + void sendMessage(UINT, WPARAM, LPARAM) const; - // work around for messed up keyboard events from low-level hooks - HWND getForegroundWindow() const; + // work around for messed up keyboard events from low-level hooks + HWND getForegroundWindow() const; - // desk API wrappers - HDESK openInputDesktop(); - void closeDesktop(HDESK); - String getDesktopName(HDESK); + // desk API wrappers + HDESK openInputDesktop(); + void closeDesktop(HDESK); + String getDesktopName(HDESK); - // our desk window procs - static LRESULT CALLBACK primaryDeskProc(HWND, UINT, WPARAM, LPARAM); - static LRESULT CALLBACK secondaryDeskProc(HWND, UINT, WPARAM, LPARAM); + // our desk window procs + static LRESULT CALLBACK primaryDeskProc(HWND, UINT, WPARAM, LPARAM); + static LRESULT CALLBACK secondaryDeskProc(HWND, UINT, WPARAM, LPARAM); private: - // true if screen is being used as a primary screen, false otherwise - bool m_isPrimary; + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; - // true if hooks are not to be installed (useful for debugging) - bool m_noHooks; + // true if hooks are not to be installed (useful for debugging) + bool m_noHooks; - // true if mouse has entered the screen - bool m_isOnScreen; + // true if mouse has entered the screen + bool m_isOnScreen; - // our resources - ATOM m_deskClass; - HCURSOR m_cursor; + // our resources + ATOM m_deskClass; + HCURSOR m_cursor; - // screen shape stuff - SInt32 m_x, m_y; - SInt32 m_w, m_h; - SInt32 m_xCenter, m_yCenter; + // screen shape stuff + SInt32 m_x, m_y; + SInt32 m_w, m_h; + SInt32 m_xCenter, m_yCenter; - // true if system appears to have multiple monitors - bool m_multimon; + // true if system appears to have multiple monitors + bool m_multimon; - // the timer used to check for desktop switching - EventQueueTimer* m_timer; + // the timer used to check for desktop switching + EventQueueTimer* m_timer; - // screen saver stuff - DWORD m_threadID; - const IScreenSaver* m_screensaver; - bool m_screensaverNotify; + // screen saver stuff + DWORD m_threadID; + const IScreenSaver* m_screensaver; + bool m_screensaverNotify; - // the current desk and it's name - Desk* m_activeDesk; - String m_activeDeskName; + // the current desk and it's name + Desk* m_activeDesk; + String m_activeDeskName; - // one desk per desktop and a cond var to communicate with it - Mutex m_mutex; - CondVar m_deskReady; - Desks m_desks; + // one desk per desktop and a cond var to communicate with it + Mutex m_mutex; + CondVar m_deskReady; + Desks m_desks; - // hook library stuff - InstallFunc m_install; - UninstallFunc m_uninstall; - InstallScreenSaverFunc - m_installScreensaver; - UninstallScreenSaverFunc - m_uninstallScreensaver; + // hook library stuff + InstallFunc m_install; + UninstallFunc m_uninstall; + InstallScreenSaverFunc + m_installScreensaver; + UninstallScreenSaverFunc + m_uninstallScreensaver; - // keyboard stuff - IJob* m_updateKeys; - HKL m_keyLayout; + // keyboard stuff + IJob* m_updateKeys; + HKL m_keyLayout; - // options - bool m_leaveForegroundOption; + // options + bool m_leaveForegroundOption; - IEventQueue* m_events; + IEventQueue* m_events; - // true if program should stop on desk switch. - bool m_stopOnDeskSwitch; + // true if program should stop on desk switch. + bool m_stopOnDeskSwitch; }; diff --git a/src/lib/platform/MSWindowsDropTarget.cpp b/src/lib/platform/MSWindowsDropTarget.cpp index fca74bdd..3c9f7ccd 100644 --- a/src/lib/platform/MSWindowsDropTarget.cpp +++ b/src/lib/platform/MSWindowsDropTarget.cpp @@ -28,10 +28,10 @@ void getDropData(IDataObject *pDataObject); MSWindowsDropTarget* MSWindowsDropTarget::s_instance = NULL; MSWindowsDropTarget::MSWindowsDropTarget() : - m_refCount(1), - m_allowDrop(false) + m_refCount(1), + m_allowDrop(false) { - s_instance = this; + s_instance = this; } MSWindowsDropTarget::~MSWindowsDropTarget() @@ -41,138 +41,138 @@ MSWindowsDropTarget::~MSWindowsDropTarget() MSWindowsDropTarget& MSWindowsDropTarget::instance() { - assert(s_instance != NULL); - return *s_instance; + assert(s_instance != NULL); + return *s_instance; } HRESULT MSWindowsDropTarget::DragEnter(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect) { - // check if data object contain drop - m_allowDrop = queryDataObject(dataObject); - if (m_allowDrop) { - getDropData(dataObject); - } - - *effect = DROPEFFECT_NONE; + // check if data object contain drop + m_allowDrop = queryDataObject(dataObject); + if (m_allowDrop) { + getDropData(dataObject); + } + + *effect = DROPEFFECT_NONE; - return S_OK; + return S_OK; } HRESULT MSWindowsDropTarget::DragOver(DWORD keyState, POINTL point, DWORD* effect) { - *effect = DROPEFFECT_NONE; + *effect = DROPEFFECT_NONE; - return S_OK; + return S_OK; } HRESULT MSWindowsDropTarget::DragLeave(void) { - return S_OK; + return S_OK; } HRESULT MSWindowsDropTarget::Drop(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect) { - *effect = DROPEFFECT_NONE; + *effect = DROPEFFECT_NONE; - return S_OK; + return S_OK; } bool MSWindowsDropTarget::queryDataObject(IDataObject* dataObject) { - // check if it supports CF_HDROP using a HGLOBAL - FORMATETC fmtetc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + // check if it supports CF_HDROP using a HGLOBAL + FORMATETC fmtetc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - return dataObject->QueryGetData(&fmtetc) == S_OK ? true : false; + return dataObject->QueryGetData(&fmtetc) == S_OK ? true : false; } void MSWindowsDropTarget::setDraggingFilename(char* const filename) { - m_dragFilename = filename; + m_dragFilename = filename; } std::string MSWindowsDropTarget::getDraggingFilename() { - return m_dragFilename; + return m_dragFilename; } void MSWindowsDropTarget::clearDraggingFilename() { - m_dragFilename.clear(); + m_dragFilename.clear(); } void getDropData(IDataObject* dataObject) { - // construct a FORMATETC object - FORMATETC fmtEtc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; - STGMEDIUM stgMed; + // construct a FORMATETC object + FORMATETC fmtEtc = { CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; + STGMEDIUM stgMed; - // See if the dataobject contains any DROP stored as a HGLOBAL - if (dataObject->QueryGetData(&fmtEtc) == S_OK) { - if (dataObject->GetData(&fmtEtc, &stgMed) == S_OK) { - // get data here - PVOID data = GlobalLock(stgMed.hGlobal); + // See if the dataobject contains any DROP stored as a HGLOBAL + if (dataObject->QueryGetData(&fmtEtc) == S_OK) { + if (dataObject->GetData(&fmtEtc, &stgMed) == S_OK) { + // get data here + PVOID data = GlobalLock(stgMed.hGlobal); - // data object global handler contains: - // DROPFILESfilename1 filename2 two spaces as the end - // TODO: get multiple filenames - wchar_t* wcData = (wchar_t*)((LPBYTE)data + sizeof(DROPFILES)); + // data object global handler contains: + // DROPFILESfilename1 filename2 two spaces as the end + // TODO: get multiple filenames + wchar_t* wcData = (wchar_t*)((LPBYTE)data + sizeof(DROPFILES)); - // convert wchar to char - char* filename = new char[wcslen(wcData) + 1]; - filename[wcslen(wcData)] = '\0'; - wcstombs(filename, wcData, wcslen(wcData)); + // convert wchar to char + char* filename = new char[wcslen(wcData) + 1]; + filename[wcslen(wcData)] = '\0'; + wcstombs(filename, wcData, wcslen(wcData)); - MSWindowsDropTarget::instance().setDraggingFilename(filename); - - GlobalUnlock(stgMed.hGlobal); + MSWindowsDropTarget::instance().setDraggingFilename(filename); + + GlobalUnlock(stgMed.hGlobal); - // release the data using the COM API - ReleaseStgMedium(&stgMed); + // release the data using the COM API + ReleaseStgMedium(&stgMed); - delete[] filename; - } - } + delete[] filename; + } + } } HRESULT __stdcall MSWindowsDropTarget::QueryInterface (REFIID iid, void ** object) { - if (iid == IID_IDropTarget || iid == IID_IUnknown) { - AddRef(); - *object = this; - return S_OK; - } - else { - *object = 0; - return E_NOINTERFACE; - } + if (iid == IID_IDropTarget || iid == IID_IUnknown) { + AddRef(); + *object = this; + return S_OK; + } + else { + *object = 0; + return E_NOINTERFACE; + } } ULONG __stdcall MSWindowsDropTarget::AddRef(void) { - return InterlockedIncrement(&m_refCount); + return InterlockedIncrement(&m_refCount); } ULONG __stdcall MSWindowsDropTarget::Release(void) { - LONG count = InterlockedDecrement(&m_refCount); - - if (count == 0) { - delete this; - return 0; - } - else { - return count; - } + LONG count = InterlockedDecrement(&m_refCount); + + if (count == 0) { + delete this; + return 0; + } + else { + return count; + } } diff --git a/src/lib/platform/MSWindowsDropTarget.h b/src/lib/platform/MSWindowsDropTarget.h index 47a9c8f9..cf60480a 100644 --- a/src/lib/platform/MSWindowsDropTarget.h +++ b/src/lib/platform/MSWindowsDropTarget.h @@ -26,34 +26,34 @@ class MSWindowsScreen; class MSWindowsDropTarget : public IDropTarget { public: - MSWindowsDropTarget(); - ~MSWindowsDropTarget(); + MSWindowsDropTarget(); + ~MSWindowsDropTarget(); - // IUnknown implementation - HRESULT __stdcall QueryInterface(REFIID iid, void** object); - ULONG __stdcall AddRef(void); - ULONG __stdcall Release(void); + // IUnknown implementation + HRESULT __stdcall QueryInterface(REFIID iid, void** object); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); - // IDropTarget implementation - HRESULT __stdcall DragEnter(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect); - HRESULT __stdcall DragOver(DWORD keyState, POINTL point, DWORD* effect); - HRESULT __stdcall DragLeave(void); - HRESULT __stdcall Drop(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect); + // IDropTarget implementation + HRESULT __stdcall DragEnter(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect); + HRESULT __stdcall DragOver(DWORD keyState, POINTL point, DWORD* effect); + HRESULT __stdcall DragLeave(void); + HRESULT __stdcall Drop(IDataObject* dataObject, DWORD keyState, POINTL point, DWORD* effect); - void setDraggingFilename(char* const); - std::string getDraggingFilename(); - void clearDraggingFilename(); + void setDraggingFilename(char* const); + std::string getDraggingFilename(); + void clearDraggingFilename(); - static MSWindowsDropTarget& - instance(); + static MSWindowsDropTarget& + instance(); private: - bool queryDataObject(IDataObject* dataObject); + bool queryDataObject(IDataObject* dataObject); - long m_refCount; - bool m_allowDrop; - std::string m_dragFilename; - - static MSWindowsDropTarget* - s_instance; + long m_refCount; + bool m_allowDrop; + std::string m_dragFilename; + + static MSWindowsDropTarget* + s_instance; }; diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.cpp b/src/lib/platform/MSWindowsEventQueueBuffer.cpp index e5edb7ac..b1203f9a 100644 --- a/src/lib/platform/MSWindowsEventQueueBuffer.cpp +++ b/src/lib/platform/MSWindowsEventQueueBuffer.cpp @@ -34,111 +34,111 @@ class EventQueueTimer { }; // MSWindowsEventQueueBuffer::MSWindowsEventQueueBuffer(IEventQueue* events) : - m_events(events) + m_events(events) { - // remember thread. we'll be posting messages to it. - m_thread = GetCurrentThreadId(); + // remember thread. we'll be posting messages to it. + m_thread = GetCurrentThreadId(); - // create a message type for custom events - m_userEvent = RegisterWindowMessage("SYNERGY_USER_EVENT"); + // create a message type for custom events + m_userEvent = RegisterWindowMessage("SYNERGY_USER_EVENT"); - // get message type for daemon quit - m_daemonQuit = ArchMiscWindows::getDaemonQuitMessage(); + // get message type for daemon quit + m_daemonQuit = ArchMiscWindows::getDaemonQuitMessage(); - // make sure this thread has a message queue - MSG dummy; - PeekMessage(&dummy, NULL, WM_USER, WM_USER, PM_NOREMOVE); + // make sure this thread has a message queue + MSG dummy; + PeekMessage(&dummy, NULL, WM_USER, WM_USER, PM_NOREMOVE); } MSWindowsEventQueueBuffer::~MSWindowsEventQueueBuffer() { - // do nothing + // do nothing } void MSWindowsEventQueueBuffer::waitForEvent(double timeout) { - // check if messages are available first. if we don't do this then - // MsgWaitForMultipleObjects() will block even if the queue isn't - // empty if the messages in the queue were there before the last - // call to GetMessage()/PeekMessage(). - if (HIWORD(GetQueueStatus(QS_ALLINPUT)) != 0) { - return; - } + // check if messages are available first. if we don't do this then + // MsgWaitForMultipleObjects() will block even if the queue isn't + // empty if the messages in the queue were there before the last + // call to GetMessage()/PeekMessage(). + if (HIWORD(GetQueueStatus(QS_ALLINPUT)) != 0) { + return; + } - // convert timeout - DWORD t; - if (timeout < 0.0) { - t = INFINITE; - } - else { - t = (DWORD)(1000.0 * timeout); - } + // convert timeout + DWORD t; + if (timeout < 0.0) { + t = INFINITE; + } + else { + t = (DWORD)(1000.0 * timeout); + } - // wait for a message. we cannot be interrupted by thread - // cancellation but that's okay because we're run in the main - // thread and we never cancel that thread. - HANDLE dummy[1]; - MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT); + // wait for a message. we cannot be interrupted by thread + // cancellation but that's okay because we're run in the main + // thread and we never cancel that thread. + HANDLE dummy[1]; + MsgWaitForMultipleObjects(0, dummy, FALSE, t, QS_ALLINPUT); } IEventQueueBuffer::Type MSWindowsEventQueueBuffer::getEvent(Event& event, UInt32& dataID) { - // peek at messages first. waiting for QS_ALLINPUT will return - // if a message has been sent to our window but GetMessage will - // dispatch that message behind our backs and block. PeekMessage - // will also dispatch behind our backs but won't block. - if (!PeekMessage(&m_event, NULL, 0, 0, PM_NOREMOVE) && - !PeekMessage(&m_event, (HWND)-1, 0, 0, PM_NOREMOVE)) { - return kNone; - } + // peek at messages first. waiting for QS_ALLINPUT will return + // if a message has been sent to our window but GetMessage will + // dispatch that message behind our backs and block. PeekMessage + // will also dispatch behind our backs but won't block. + if (!PeekMessage(&m_event, NULL, 0, 0, PM_NOREMOVE) && + !PeekMessage(&m_event, (HWND)-1, 0, 0, PM_NOREMOVE)) { + return kNone; + } - // BOOL. yeah, right. - BOOL result = GetMessage(&m_event, NULL, 0, 0); - if (result == -1) { - return kNone; - } - else if (result == 0) { - event = Event(Event::kQuit); - return kSystem; - } - else if (m_daemonQuit != 0 && m_event.message == m_daemonQuit) { - event = Event(Event::kQuit); - return kSystem; - } - else if (m_event.message == m_userEvent) { - dataID = static_cast(m_event.wParam); - return kUser; - } - else { - event = Event(Event::kSystem, - m_events->getSystemTarget(), &m_event); - return kSystem; - } + // BOOL. yeah, right. + BOOL result = GetMessage(&m_event, NULL, 0, 0); + if (result == -1) { + return kNone; + } + else if (result == 0) { + event = Event(Event::kQuit); + return kSystem; + } + else if (m_daemonQuit != 0 && m_event.message == m_daemonQuit) { + event = Event(Event::kQuit); + return kSystem; + } + else if (m_event.message == m_userEvent) { + dataID = static_cast(m_event.wParam); + return kUser; + } + else { + event = Event(Event::kSystem, + m_events->getSystemTarget(), &m_event); + return kSystem; + } } bool MSWindowsEventQueueBuffer::addEvent(UInt32 dataID) { - return (PostThreadMessage(m_thread, m_userEvent, - static_cast(dataID), 0) != 0); + return (PostThreadMessage(m_thread, m_userEvent, + static_cast(dataID), 0) != 0); } bool MSWindowsEventQueueBuffer::isEmpty() const { - return (HIWORD(GetQueueStatus(QS_ALLINPUT)) == 0); + return (HIWORD(GetQueueStatus(QS_ALLINPUT)) == 0); } EventQueueTimer* MSWindowsEventQueueBuffer::newTimer(double, bool) const { - return new EventQueueTimer; + return new EventQueueTimer; } void MSWindowsEventQueueBuffer::deleteTimer(EventQueueTimer* timer) const { - delete timer; + delete timer; } diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.h b/src/lib/platform/MSWindowsEventQueueBuffer.h index 1ab413e2..872684e4 100644 --- a/src/lib/platform/MSWindowsEventQueueBuffer.h +++ b/src/lib/platform/MSWindowsEventQueueBuffer.h @@ -28,23 +28,23 @@ class IEventQueue; //! Event queue buffer for Win32 class MSWindowsEventQueueBuffer : public IEventQueueBuffer { public: - MSWindowsEventQueueBuffer(IEventQueue* events); - virtual ~MSWindowsEventQueueBuffer(); + MSWindowsEventQueueBuffer(IEventQueue* events); + virtual ~MSWindowsEventQueueBuffer(); - // IEventQueueBuffer overrides - virtual void init() { } - virtual void waitForEvent(double timeout); - virtual Type getEvent(Event& event, UInt32& dataID); - virtual bool addEvent(UInt32 dataID); - virtual bool isEmpty() const; - virtual EventQueueTimer* - newTimer(double duration, bool oneShot) const; - virtual void deleteTimer(EventQueueTimer*) const; + // IEventQueueBuffer overrides + virtual void init() { } + virtual void waitForEvent(double timeout); + virtual Type getEvent(Event& event, UInt32& dataID); + virtual bool addEvent(UInt32 dataID); + virtual bool isEmpty() const; + virtual EventQueueTimer* + newTimer(double duration, bool oneShot) const; + virtual void deleteTimer(EventQueueTimer*) const; private: - DWORD m_thread; - UINT m_userEvent; - MSG m_event; - UINT m_daemonQuit; - IEventQueue* m_events; + DWORD m_thread; + UINT m_userEvent; + MSG m_event; + UINT m_daemonQuit; + IEventQueue* m_events; }; diff --git a/src/lib/platform/MSWindowsHook.cpp b/src/lib/platform/MSWindowsHook.cpp index cdabd00d..b81d9373 100644 --- a/src/lib/platform/MSWindowsHook.cpp +++ b/src/lib/platform/MSWindowsHook.cpp @@ -24,105 +24,105 @@ static const char* g_name = "synwinhk"; MSWindowsHook::MSWindowsHook() : - m_initFunc(NULL), - m_cleanupFunc(NULL), - m_setSidesFunc(NULL), - m_setZoneFunc(NULL), - m_setModeFunc(NULL), - m_instance(NULL) + m_initFunc(NULL), + m_cleanupFunc(NULL), + m_setSidesFunc(NULL), + m_setZoneFunc(NULL), + m_setModeFunc(NULL), + m_instance(NULL) { } MSWindowsHook::~MSWindowsHook() { - cleanup(); + cleanup(); - if (m_instance != NULL) { - FreeLibrary(m_instance); - } + if (m_instance != NULL) { + FreeLibrary(m_instance); + } } void MSWindowsHook::loadLibrary() { - // load library - m_instance = LoadLibrary(g_name); - if (m_instance == NULL) { - LOG((CLOG_ERR "failed to load hook library, %s.dll is missing or invalid", g_name)); - throw XScreenOpenFailure(); - } + // load library + m_instance = LoadLibrary(g_name); + if (m_instance == NULL) { + LOG((CLOG_ERR "failed to load hook library, %s.dll is missing or invalid", g_name)); + throw XScreenOpenFailure(); + } - // look up functions - m_setSidesFunc = (SetSidesFunc)GetProcAddress(m_instance, "setSides"); - m_setZoneFunc = (SetZoneFunc)GetProcAddress(m_instance, "setZone"); - m_setModeFunc = (SetModeFunc)GetProcAddress(m_instance, "setMode"); - m_initFunc = (InitFunc)GetProcAddress(m_instance, "init"); - m_cleanupFunc = (CleanupFunc)GetProcAddress(m_instance, "cleanup"); + // look up functions + m_setSidesFunc = (SetSidesFunc)GetProcAddress(m_instance, "setSides"); + m_setZoneFunc = (SetZoneFunc)GetProcAddress(m_instance, "setZone"); + m_setModeFunc = (SetModeFunc)GetProcAddress(m_instance, "setMode"); + m_initFunc = (InitFunc)GetProcAddress(m_instance, "init"); + m_cleanupFunc = (CleanupFunc)GetProcAddress(m_instance, "cleanup"); - if (m_setSidesFunc == NULL || - m_setZoneFunc == NULL || - m_setModeFunc == NULL || - m_initFunc == NULL || - m_cleanupFunc == NULL) { - LOG((CLOG_ERR "failed to load hook function, %s.dll could be out of date", g_name)); - throw XScreenOpenFailure(); - } + if (m_setSidesFunc == NULL || + m_setZoneFunc == NULL || + m_setModeFunc == NULL || + m_initFunc == NULL || + m_cleanupFunc == NULL) { + LOG((CLOG_ERR "failed to load hook function, %s.dll could be out of date", g_name)); + throw XScreenOpenFailure(); + } - // initialize library - if (init(GetCurrentThreadId()) == 0) { - LOG((CLOG_ERR "failed to init %s.dll, another program may be using it", g_name)); - LOG((CLOG_INFO "restarting your computer may solve this error")); - throw XScreenOpenFailure(); - } + // initialize library + if (init(GetCurrentThreadId()) == 0) { + LOG((CLOG_ERR "failed to init %s.dll, another program may be using it", g_name)); + LOG((CLOG_INFO "restarting your computer may solve this error")); + throw XScreenOpenFailure(); + } } HINSTANCE MSWindowsHook::getInstance() const { - return m_instance; + return m_instance; } int MSWindowsHook::init(DWORD threadID) { - if (m_initFunc == NULL) { - return NULL; - } - return m_initFunc(threadID); + if (m_initFunc == NULL) { + return NULL; + } + return m_initFunc(threadID); } int MSWindowsHook::cleanup() { - if (m_cleanupFunc == NULL) { - return NULL; - } - return m_cleanupFunc(); + if (m_cleanupFunc == NULL) { + return NULL; + } + return m_cleanupFunc(); } void MSWindowsHook::setSides(UInt32 sides) { - if (m_setSidesFunc == NULL) { - return; - } - m_setSidesFunc(sides); + if (m_setSidesFunc == NULL) { + return; + } + m_setSidesFunc(sides); } void MSWindowsHook::setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 jumpZoneSize) { - if (m_setZoneFunc == NULL) { - return; - } - m_setZoneFunc(x, y, w, h, jumpZoneSize); + if (m_setZoneFunc == NULL) { + return; + } + m_setZoneFunc(x, y, w, h, jumpZoneSize); } void MSWindowsHook::setMode(EHookMode mode) { - if (m_setModeFunc == NULL) { - return; - } - m_setModeFunc(mode); + if (m_setModeFunc == NULL) { + return; + } + m_setModeFunc(mode); } diff --git a/src/lib/platform/MSWindowsHook.h b/src/lib/platform/MSWindowsHook.h index c16492d8..988528f8 100644 --- a/src/lib/platform/MSWindowsHook.h +++ b/src/lib/platform/MSWindowsHook.h @@ -27,22 +27,22 @@ class MSWindowsHook { public: - MSWindowsHook(); - virtual ~MSWindowsHook(); + MSWindowsHook(); + virtual ~MSWindowsHook(); - void loadLibrary(); - HINSTANCE getInstance() const; - int init(DWORD threadID); - int cleanup(); - void setSides(UInt32 sides); - void setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 jumpZoneSize); - void setMode(EHookMode mode); + void loadLibrary(); + HINSTANCE getInstance() const; + int init(DWORD threadID); + int cleanup(); + void setSides(UInt32 sides); + void setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 jumpZoneSize); + void setMode(EHookMode mode); private: - InitFunc m_initFunc; - CleanupFunc m_cleanupFunc; - SetSidesFunc m_setSidesFunc; - SetZoneFunc m_setZoneFunc; - SetModeFunc m_setModeFunc; - HINSTANCE m_instance; + InitFunc m_initFunc; + CleanupFunc m_cleanupFunc; + SetSidesFunc m_setSidesFunc; + SetZoneFunc m_setZoneFunc; + SetModeFunc m_setModeFunc; + HINSTANCE m_instance; }; diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp index defe2b82..bcb794e1 100644 --- a/src/lib/platform/MSWindowsScreen.cpp +++ b/src/lib/platform/MSWindowsScreen.cpp @@ -61,1279 +61,1279 @@ // X button stuff #if !defined(WM_XBUTTONDOWN) -#define WM_XBUTTONDOWN 0x020B -#define WM_XBUTTONUP 0x020C -#define WM_XBUTTONDBLCLK 0x020D -#define WM_NCXBUTTONDOWN 0x00AB -#define WM_NCXBUTTONUP 0x00AC -#define WM_NCXBUTTONDBLCLK 0x00AD -#define MOUSEEVENTF_XDOWN 0x0080 -#define MOUSEEVENTF_XUP 0x0100 -#define XBUTTON1 0x0001 -#define XBUTTON2 0x0002 +#define WM_XBUTTONDOWN 0x020B +#define WM_XBUTTONUP 0x020C +#define WM_XBUTTONDBLCLK 0x020D +#define WM_NCXBUTTONDOWN 0x00AB +#define WM_NCXBUTTONUP 0x00AC +#define WM_NCXBUTTONDBLCLK 0x00AD +#define MOUSEEVENTF_XDOWN 0x0080 +#define MOUSEEVENTF_XUP 0x0100 +#define XBUTTON1 0x0001 +#define XBUTTON2 0x0002 #endif #if !defined(VK_XBUTTON1) -#define VK_XBUTTON1 0x05 -#define VK_XBUTTON2 0x06 +#define VK_XBUTTON1 0x05 +#define VK_XBUTTON2 0x06 #endif // WM_POWERBROADCAST stuff #if !defined(PBT_APMRESUMEAUTOMATIC) -#define PBT_APMRESUMEAUTOMATIC 0x0012 +#define PBT_APMRESUMEAUTOMATIC 0x0012 #endif // // MSWindowsScreen // -HINSTANCE MSWindowsScreen::s_windowInstance = NULL; -MSWindowsScreen* MSWindowsScreen::s_screen = NULL; +HINSTANCE MSWindowsScreen::s_windowInstance = NULL; +MSWindowsScreen* MSWindowsScreen::s_screen = NULL; MSWindowsScreen::MSWindowsScreen( - bool isPrimary, - bool noHooks, - bool stopOnDeskSwitch, - IEventQueue* events) : - PlatformScreen(events), - m_isPrimary(isPrimary), - m_noHooks(noHooks), - m_isOnScreen(m_isPrimary), - m_class(0), - m_x(0), m_y(0), - m_w(0), m_h(0), - m_xCenter(0), m_yCenter(0), - m_multimon(false), - m_xCursor(0), m_yCursor(0), - m_sequenceNumber(0), - m_mark(0), - m_markReceived(0), - m_fixTimer(NULL), - m_keyLayout(NULL), - m_screensaver(NULL), - m_screensaverNotify(false), - m_screensaverActive(false), - m_window(NULL), - m_nextClipboardWindow(NULL), - m_ownClipboard(false), - m_desks(NULL), - m_keyState(NULL), - m_hasMouse(GetSystemMetrics(SM_MOUSEPRESENT) != 0), - m_showingMouse(false), - m_events(events), - m_dropWindow(NULL), - m_dropWindowSize(20) + bool isPrimary, + bool noHooks, + bool stopOnDeskSwitch, + IEventQueue* events) : + PlatformScreen(events), + m_isPrimary(isPrimary), + m_noHooks(noHooks), + m_isOnScreen(m_isPrimary), + m_class(0), + m_x(0), m_y(0), + m_w(0), m_h(0), + m_xCenter(0), m_yCenter(0), + m_multimon(false), + m_xCursor(0), m_yCursor(0), + m_sequenceNumber(0), + m_mark(0), + m_markReceived(0), + m_fixTimer(NULL), + m_keyLayout(NULL), + m_screensaver(NULL), + m_screensaverNotify(false), + m_screensaverActive(false), + m_window(NULL), + m_nextClipboardWindow(NULL), + m_ownClipboard(false), + m_desks(NULL), + m_keyState(NULL), + m_hasMouse(GetSystemMetrics(SM_MOUSEPRESENT) != 0), + m_showingMouse(false), + m_events(events), + m_dropWindow(NULL), + m_dropWindowSize(20) { - assert(s_windowInstance != NULL); - assert(s_screen == NULL); + assert(s_windowInstance != NULL); + assert(s_screen == NULL); - s_screen = this; - try { - if (m_isPrimary && !m_noHooks) { - m_hook.loadLibrary(); - } + s_screen = this; + try { + if (m_isPrimary && !m_noHooks) { + m_hook.loadLibrary(); + } - m_screensaver = new MSWindowsScreenSaver(); - m_desks = new MSWindowsDesks( - m_isPrimary, - m_noHooks, - m_hook.getInstance(), - m_screensaver, - m_events, - new TMethodJob( - this, &MSWindowsScreen::updateKeysCB), - stopOnDeskSwitch); - m_keyState = new MSWindowsKeyState(m_desks, getEventTarget(), m_events); + m_screensaver = new MSWindowsScreenSaver(); + m_desks = new MSWindowsDesks( + m_isPrimary, + m_noHooks, + m_hook.getInstance(), + m_screensaver, + m_events, + new TMethodJob( + this, &MSWindowsScreen::updateKeysCB), + stopOnDeskSwitch); + m_keyState = new MSWindowsKeyState(m_desks, getEventTarget(), m_events); - updateScreenShape(); - m_class = createWindowClass(); - m_window = createWindow(m_class, "Synergy"); - forceShowCursor(); - LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : "")); - LOG((CLOG_DEBUG "window is 0x%08x", m_window)); - - // SHGetFolderPath is deprecated in vista, but use it for xp support. - char desktopPath[MAX_PATH]; - if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) { - m_desktopPath = String(desktopPath); - LOG((CLOG_DEBUG "using desktop for drop target: %s", m_desktopPath.c_str())); - } - else { - LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError())); - } + updateScreenShape(); + m_class = createWindowClass(); + m_window = createWindow(m_class, "Synergy"); + forceShowCursor(); + LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : "")); + LOG((CLOG_DEBUG "window is 0x%08x", m_window)); + + // SHGetFolderPath is deprecated in vista, but use it for xp support. + char desktopPath[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) { + m_desktopPath = String(desktopPath); + LOG((CLOG_DEBUG "using desktop for drop target: %s", m_desktopPath.c_str())); + } + else { + LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError())); + } - OleInitialize(0); - m_dropWindow = createDropWindow(m_class, "DropWindow"); - m_dropTarget = new MSWindowsDropTarget(); - RegisterDragDrop(m_dropWindow, m_dropTarget); - } - catch (...) { - delete m_keyState; - delete m_desks; - delete m_screensaver; - destroyWindow(m_window); - destroyClass(m_class); - s_screen = NULL; - throw; - } + OleInitialize(0); + m_dropWindow = createDropWindow(m_class, "DropWindow"); + m_dropTarget = new MSWindowsDropTarget(); + RegisterDragDrop(m_dropWindow, m_dropTarget); + } + catch (...) { + delete m_keyState; + delete m_desks; + delete m_screensaver; + destroyWindow(m_window); + destroyClass(m_class); + s_screen = NULL; + throw; + } - // install event handlers - m_events->adoptHandler(Event::kSystem, m_events->getSystemTarget(), - new TMethodEventJob(this, - &MSWindowsScreen::handleSystemEvent)); + // install event handlers + m_events->adoptHandler(Event::kSystem, m_events->getSystemTarget(), + new TMethodEventJob(this, + &MSWindowsScreen::handleSystemEvent)); - // install the platform event queue - m_events->adoptBuffer(new MSWindowsEventQueueBuffer(m_events)); + // install the platform event queue + m_events->adoptBuffer(new MSWindowsEventQueueBuffer(m_events)); } MSWindowsScreen::~MSWindowsScreen() { - assert(s_screen != NULL); + assert(s_screen != NULL); - disable(); - m_events->adoptBuffer(NULL); - m_events->removeHandler(Event::kSystem, m_events->getSystemTarget()); - delete m_keyState; - delete m_desks; - delete m_screensaver; - destroyWindow(m_window); - destroyClass(m_class); + disable(); + m_events->adoptBuffer(NULL); + m_events->removeHandler(Event::kSystem, m_events->getSystemTarget()); + delete m_keyState; + delete m_desks; + delete m_screensaver; + destroyWindow(m_window); + destroyClass(m_class); - RevokeDragDrop(m_dropWindow); - m_dropTarget->Release(); - OleUninitialize(); - destroyWindow(m_dropWindow); + RevokeDragDrop(m_dropWindow); + m_dropTarget->Release(); + OleUninitialize(); + destroyWindow(m_dropWindow); - s_screen = NULL; + s_screen = NULL; } void MSWindowsScreen::init(HINSTANCE windowInstance) { - assert(s_windowInstance == NULL); - assert(windowInstance != NULL); + assert(s_windowInstance == NULL); + assert(windowInstance != NULL); - s_windowInstance = windowInstance; + s_windowInstance = windowInstance; } HINSTANCE MSWindowsScreen::getWindowInstance() { - return s_windowInstance; + return s_windowInstance; } void MSWindowsScreen::enable() { - assert(m_isOnScreen == m_isPrimary); + assert(m_isOnScreen == m_isPrimary); - // we need to poll some things to fix them - m_fixTimer = m_events->newTimer(1.0, NULL); - m_events->adoptHandler(Event::kTimer, m_fixTimer, - new TMethodEventJob(this, - &MSWindowsScreen::handleFixes)); + // we need to poll some things to fix them + m_fixTimer = m_events->newTimer(1.0, NULL); + m_events->adoptHandler(Event::kTimer, m_fixTimer, + new TMethodEventJob(this, + &MSWindowsScreen::handleFixes)); - // install our clipboard snooper - m_nextClipboardWindow = SetClipboardViewer(m_window); + // install our clipboard snooper + m_nextClipboardWindow = SetClipboardViewer(m_window); - // track the active desk and (re)install the hooks - m_desks->enable(); + // track the active desk and (re)install the hooks + m_desks->enable(); - if (m_isPrimary) { - // set jump zones - m_hook.setZone(m_x, m_y, m_w, m_h, getJumpZoneSize()); + if (m_isPrimary) { + // set jump zones + m_hook.setZone(m_x, m_y, m_w, m_h, getJumpZoneSize()); - // watch jump zones - m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); - } - else { - // prevent the system from entering power saving modes. if - // it did we'd be forced to disconnect from the server and - // the server would not be able to wake us up. - ArchMiscWindows::addBusyState(ArchMiscWindows::kSYSTEM); - } + // watch jump zones + m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); + } + else { + // prevent the system from entering power saving modes. if + // it did we'd be forced to disconnect from the server and + // the server would not be able to wake us up. + ArchMiscWindows::addBusyState(ArchMiscWindows::kSYSTEM); + } } void MSWindowsScreen::disable() { - // stop tracking the active desk - m_desks->disable(); + // stop tracking the active desk + m_desks->disable(); - if (m_isPrimary) { - // disable hooks - m_hook.setMode(kHOOK_DISABLE); + if (m_isPrimary) { + // disable hooks + m_hook.setMode(kHOOK_DISABLE); - // enable special key sequences on win95 family - enableSpecialKeys(true); - } - else { - // allow the system to enter power saving mode - ArchMiscWindows::removeBusyState(ArchMiscWindows::kSYSTEM | - ArchMiscWindows::kDISPLAY); - } + // enable special key sequences on win95 family + enableSpecialKeys(true); + } + else { + // allow the system to enter power saving mode + ArchMiscWindows::removeBusyState(ArchMiscWindows::kSYSTEM | + ArchMiscWindows::kDISPLAY); + } - // tell key state - m_keyState->disable(); + // tell key state + m_keyState->disable(); - // stop snooping the clipboard - ChangeClipboardChain(m_window, m_nextClipboardWindow); - m_nextClipboardWindow = NULL; + // stop snooping the clipboard + ChangeClipboardChain(m_window, m_nextClipboardWindow); + m_nextClipboardWindow = NULL; - // uninstall fix timer - if (m_fixTimer != NULL) { - m_events->removeHandler(Event::kTimer, m_fixTimer); - m_events->deleteTimer(m_fixTimer); - m_fixTimer = NULL; - } + // uninstall fix timer + if (m_fixTimer != NULL) { + m_events->removeHandler(Event::kTimer, m_fixTimer); + m_events->deleteTimer(m_fixTimer); + m_fixTimer = NULL; + } - m_isOnScreen = m_isPrimary; - forceShowCursor(); + m_isOnScreen = m_isPrimary; + forceShowCursor(); } void MSWindowsScreen::enter() { - m_desks->enter(); - if (m_isPrimary) { - // enable special key sequences on win95 family - enableSpecialKeys(true); + m_desks->enter(); + if (m_isPrimary) { + // enable special key sequences on win95 family + enableSpecialKeys(true); - // watch jump zones - m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); + // watch jump zones + m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); - // all messages prior to now are invalid - nextMark(); + // all messages prior to now are invalid + nextMark(); - m_primaryKeyDownList.clear(); - } - else { - // Entering a secondary screen. Ensure that no screensaver is active - // and that the screen is not in powersave mode. - ArchMiscWindows::wakeupDisplay(); + m_primaryKeyDownList.clear(); + } + else { + // Entering a secondary screen. Ensure that no screensaver is active + // and that the screen is not in powersave mode. + ArchMiscWindows::wakeupDisplay(); - if (m_screensaver != NULL && m_screensaverActive) - { - m_screensaver->deactivate(); - m_screensaverActive = 0; - } - } + if (m_screensaver != NULL && m_screensaverActive) + { + m_screensaver->deactivate(); + m_screensaverActive = 0; + } + } - // now on screen - m_isOnScreen = true; - forceShowCursor(); + // now on screen + m_isOnScreen = true; + forceShowCursor(); } bool MSWindowsScreen::leave() { - // get keyboard layout of foreground window. we'll use this - // keyboard layout for translating keys sent to clients. - HWND window = GetForegroundWindow(); - DWORD thread = GetWindowThreadProcessId(window, NULL); - m_keyLayout = GetKeyboardLayout(thread); + // get keyboard layout of foreground window. we'll use this + // keyboard layout for translating keys sent to clients. + HWND window = GetForegroundWindow(); + DWORD thread = GetWindowThreadProcessId(window, NULL); + m_keyLayout = GetKeyboardLayout(thread); - // tell the key mapper about the keyboard layout - m_keyState->setKeyLayout(m_keyLayout); + // tell the key mapper about the keyboard layout + m_keyState->setKeyLayout(m_keyLayout); - // tell desk that we're leaving and tell it the keyboard layout - m_desks->leave(m_keyLayout); + // tell desk that we're leaving and tell it the keyboard layout + m_desks->leave(m_keyLayout); - if (m_isPrimary) { + if (m_isPrimary) { - // warp to center - LOG((CLOG_DEBUG1 "warping cursor to center: %+d, %+d", m_xCenter, m_yCenter)); - warpCursor(m_xCenter, m_yCenter); + // warp to center + LOG((CLOG_DEBUG1 "warping cursor to center: %+d, %+d", m_xCenter, m_yCenter)); + warpCursor(m_xCenter, m_yCenter); - // disable special key sequences on win95 family - enableSpecialKeys(false); + // disable special key sequences on win95 family + enableSpecialKeys(false); - // all messages prior to now are invalid - nextMark(); + // all messages prior to now are invalid + nextMark(); - // remember the modifier state. this is the modifier state - // reflected in the internal keyboard state. - m_keyState->saveModifiers(); + // remember the modifier state. this is the modifier state + // reflected in the internal keyboard state. + m_keyState->saveModifiers(); - m_hook.setMode(kHOOK_RELAY_EVENTS); + m_hook.setMode(kHOOK_RELAY_EVENTS); - m_primaryKeyDownList.clear(); - for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { - if (m_keyState->isKeyDown(i)) { - m_primaryKeyDownList.push_back(i); - LOG((CLOG_DEBUG1 "key button %d is down before leaving to another screen", i)); - } - } - } + m_primaryKeyDownList.clear(); + for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { + if (m_keyState->isKeyDown(i)) { + m_primaryKeyDownList.push_back(i); + LOG((CLOG_DEBUG1 "key button %d is down before leaving to another screen", i)); + } + } + } - // now off screen - m_isOnScreen = false; - forceShowCursor(); + // now off screen + m_isOnScreen = false; + forceShowCursor(); - if (isDraggingStarted() && !m_isPrimary) { - m_sendDragThread = new Thread( - new TMethodJob( - this, - &MSWindowsScreen::sendDragThread)); - } + if (isDraggingStarted() && !m_isPrimary) { + m_sendDragThread = new Thread( + new TMethodJob( + this, + &MSWindowsScreen::sendDragThread)); + } - return true; + return true; } void MSWindowsScreen::sendDragThread(void*) { - String& draggingFilename = getDraggingFilename(); - size_t size = draggingFilename.size(); + String& draggingFilename = getDraggingFilename(); + size_t size = draggingFilename.size(); - if (draggingFilename.empty() == false) { - ClientApp& app = ClientApp::instance(); - Client* client = app.getClientPtr(); - UInt32 fileCount = 1; - LOG((CLOG_DEBUG "send dragging info to server: %s", draggingFilename.c_str())); - client->sendDragInfo(fileCount, draggingFilename, size); - LOG((CLOG_DEBUG "send dragging file to server")); - client->sendFileToServer(draggingFilename.c_str()); - } - - m_draggingStarted = false; + if (draggingFilename.empty() == false) { + ClientApp& app = ClientApp::instance(); + Client* client = app.getClientPtr(); + UInt32 fileCount = 1; + LOG((CLOG_DEBUG "send dragging info to server: %s", draggingFilename.c_str())); + client->sendDragInfo(fileCount, draggingFilename, size); + LOG((CLOG_DEBUG "send dragging file to server")); + client->sendFileToServer(draggingFilename.c_str()); + } + + m_draggingStarted = false; } bool MSWindowsScreen::setClipboard(ClipboardID, const IClipboard* src) { - MSWindowsClipboard dst(m_window); - if (src != NULL) { - // save clipboard data - return Clipboard::copy(&dst, src); - } - else { - // assert clipboard ownership - if (!dst.open(0)) { - return false; - } - dst.empty(); - dst.close(); - return true; - } + MSWindowsClipboard dst(m_window); + if (src != NULL) { + // save clipboard data + return Clipboard::copy(&dst, src); + } + else { + // assert clipboard ownership + if (!dst.open(0)) { + return false; + } + dst.empty(); + dst.close(); + return true; + } } void MSWindowsScreen::checkClipboards() { - // if we think we own the clipboard but we don't then somebody - // grabbed the clipboard on this screen without us knowing. - // tell the server that this screen grabbed the clipboard. - // - // this works around bugs in the clipboard viewer chain. - // sometimes NT will simply never send WM_DRAWCLIPBOARD - // messages for no apparent reason and rebooting fixes the - // problem. since we don't want a broken clipboard until the - // next reboot we do this double check. clipboard ownership - // won't be reflected on other screens until we leave but at - // least the clipboard itself will work. - if (m_ownClipboard && !MSWindowsClipboard::isOwnedBySynergy()) { - LOG((CLOG_DEBUG "clipboard changed: lost ownership and no notification received")); - m_ownClipboard = false; - sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardClipboard); - sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardSelection); - } + // if we think we own the clipboard but we don't then somebody + // grabbed the clipboard on this screen without us knowing. + // tell the server that this screen grabbed the clipboard. + // + // this works around bugs in the clipboard viewer chain. + // sometimes NT will simply never send WM_DRAWCLIPBOARD + // messages for no apparent reason and rebooting fixes the + // problem. since we don't want a broken clipboard until the + // next reboot we do this double check. clipboard ownership + // won't be reflected on other screens until we leave but at + // least the clipboard itself will work. + if (m_ownClipboard && !MSWindowsClipboard::isOwnedBySynergy()) { + LOG((CLOG_DEBUG "clipboard changed: lost ownership and no notification received")); + m_ownClipboard = false; + sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardClipboard); + sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardSelection); + } } void MSWindowsScreen::openScreensaver(bool notify) { - assert(m_screensaver != NULL); + assert(m_screensaver != NULL); - m_screensaverNotify = notify; - if (m_screensaverNotify) { - m_desks->installScreensaverHooks(true); - } - else if (m_screensaver) { - m_screensaver->disable(); - } + m_screensaverNotify = notify; + if (m_screensaverNotify) { + m_desks->installScreensaverHooks(true); + } + else if (m_screensaver) { + m_screensaver->disable(); + } } void MSWindowsScreen::closeScreensaver() { - if (m_screensaver != NULL) { - if (m_screensaverNotify) { - m_desks->installScreensaverHooks(false); - } - else { - m_screensaver->enable(); - } - } - m_screensaverNotify = false; + if (m_screensaver != NULL) { + if (m_screensaverNotify) { + m_desks->installScreensaverHooks(false); + } + else { + m_screensaver->enable(); + } + } + m_screensaverNotify = false; } void MSWindowsScreen::screensaver(bool activate) { - assert(m_screensaver != NULL); - if (m_screensaver==NULL) return; + assert(m_screensaver != NULL); + if (m_screensaver==NULL) return; - if (activate) { - m_screensaver->activate(); - } - else { - m_screensaver->deactivate(); - } + if (activate) { + m_screensaver->activate(); + } + else { + m_screensaver->deactivate(); + } } void MSWindowsScreen::resetOptions() { - m_desks->resetOptions(); + m_desks->resetOptions(); } void MSWindowsScreen::setOptions(const OptionsList& options) { - m_desks->setOptions(options); + m_desks->setOptions(options); } void MSWindowsScreen::setSequenceNumber(UInt32 seqNum) { - m_sequenceNumber = seqNum; + m_sequenceNumber = seqNum; } bool MSWindowsScreen::isPrimary() const { - return m_isPrimary; + return m_isPrimary; } void* MSWindowsScreen::getEventTarget() const { - return const_cast(this); + return const_cast(this); } bool MSWindowsScreen::getClipboard(ClipboardID, IClipboard* dst) const { - MSWindowsClipboard src(m_window); - Clipboard::copy(dst, &src); - return true; + MSWindowsClipboard src(m_window); + Clipboard::copy(dst, &src); + return true; } void MSWindowsScreen::getShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) const { - assert(m_class != 0); + assert(m_class != 0); - x = m_x; - y = m_y; - w = m_w; - h = m_h; + x = m_x; + y = m_y; + w = m_w; + h = m_h; } void MSWindowsScreen::getCursorPos(SInt32& x, SInt32& y) const { - m_desks->getCursorPos(x, y); + m_desks->getCursorPos(x, y); } void MSWindowsScreen::reconfigure(UInt32 activeSides) { - assert(m_isPrimary); + assert(m_isPrimary); - LOG((CLOG_DEBUG "active sides: %x", activeSides)); - m_hook.setSides(activeSides); + LOG((CLOG_DEBUG "active sides: %x", activeSides)); + m_hook.setSides(activeSides); } void MSWindowsScreen::warpCursor(SInt32 x, SInt32 y) { - // warp mouse - warpCursorNoFlush(x, y); + // warp mouse + warpCursorNoFlush(x, y); - // remove all input events before and including warp - MSG msg; - while (PeekMessage(&msg, NULL, SYNERGY_MSG_INPUT_FIRST, - SYNERGY_MSG_INPUT_LAST, PM_REMOVE)) { - // do nothing - } + // remove all input events before and including warp + MSG msg; + while (PeekMessage(&msg, NULL, SYNERGY_MSG_INPUT_FIRST, + SYNERGY_MSG_INPUT_LAST, PM_REMOVE)) { + // do nothing + } - // save position to compute delta of next motion - saveMousePosition(x, y); + // save position to compute delta of next motion + saveMousePosition(x, y); } void MSWindowsScreen::saveMousePosition(SInt32 x, SInt32 y) { - m_xCursor = x; - m_yCursor = y; + m_xCursor = x; + m_yCursor = y; - LOG((CLOG_DEBUG5 "saved mouse position for next delta: %+d,%+d", x,y)); + LOG((CLOG_DEBUG5 "saved mouse position for next delta: %+d,%+d", x,y)); } UInt32 MSWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask) { - // only allow certain modifiers - if ((mask & ~(KeyModifierShift | KeyModifierControl | - KeyModifierAlt | KeyModifierSuper)) != 0) { - // this should be a warning, but this can confuse users, - // as this warning happens almost always. - LOG((CLOG_DEBUG "could not map hotkey id=%04x mask=%04x", key, mask)); - return 0; - } + // only allow certain modifiers + if ((mask & ~(KeyModifierShift | KeyModifierControl | + KeyModifierAlt | KeyModifierSuper)) != 0) { + // this should be a warning, but this can confuse users, + // as this warning happens almost always. + LOG((CLOG_DEBUG "could not map hotkey id=%04x mask=%04x", key, mask)); + return 0; + } - // fail if no keys - if (key == kKeyNone && mask == 0) { - return 0; - } + // fail if no keys + if (key == kKeyNone && mask == 0) { + return 0; + } - // convert to win32 - UINT modifiers = 0; - if ((mask & KeyModifierShift) != 0) { - modifiers |= MOD_SHIFT; - } - if ((mask & KeyModifierControl) != 0) { - modifiers |= MOD_CONTROL; - } - if ((mask & KeyModifierAlt) != 0) { - modifiers |= MOD_ALT; - } - if ((mask & KeyModifierSuper) != 0) { - modifiers |= MOD_WIN; - } - UINT vk = m_keyState->mapKeyToVirtualKey(key); - if (key != kKeyNone && vk == 0) { - // can't map key - // this should be a warning, but this can confuse users, - // as this warning happens almost always. - LOG((CLOG_DEBUG "could not map hotkey id=%04x mask=%04x", key, mask)); - return 0; - } + // convert to win32 + UINT modifiers = 0; + if ((mask & KeyModifierShift) != 0) { + modifiers |= MOD_SHIFT; + } + if ((mask & KeyModifierControl) != 0) { + modifiers |= MOD_CONTROL; + } + if ((mask & KeyModifierAlt) != 0) { + modifiers |= MOD_ALT; + } + if ((mask & KeyModifierSuper) != 0) { + modifiers |= MOD_WIN; + } + UINT vk = m_keyState->mapKeyToVirtualKey(key); + if (key != kKeyNone && vk == 0) { + // can't map key + // this should be a warning, but this can confuse users, + // as this warning happens almost always. + LOG((CLOG_DEBUG "could not map hotkey id=%04x mask=%04x", key, mask)); + return 0; + } - // choose hotkey id - UInt32 id; - if (!m_oldHotKeyIDs.empty()) { - id = m_oldHotKeyIDs.back(); - m_oldHotKeyIDs.pop_back(); - } - else { - //id = m_hotKeys.size() + 1; - id = (UInt32)m_hotKeys.size() + 1; - } + // choose hotkey id + UInt32 id; + if (!m_oldHotKeyIDs.empty()) { + id = m_oldHotKeyIDs.back(); + m_oldHotKeyIDs.pop_back(); + } + else { + //id = m_hotKeys.size() + 1; + id = (UInt32)m_hotKeys.size() + 1; + } - // if this hot key has modifiers only then we'll handle it specially - bool err; - if (key == kKeyNone) { - // check if already registered - err = (m_hotKeyToIDMap.count(HotKeyItem(vk, modifiers)) > 0); - } - else { - // register with OS - err = (RegisterHotKey(NULL, id, modifiers, vk) == 0); - } + // if this hot key has modifiers only then we'll handle it specially + bool err; + if (key == kKeyNone) { + // check if already registered + err = (m_hotKeyToIDMap.count(HotKeyItem(vk, modifiers)) > 0); + } + else { + // register with OS + err = (RegisterHotKey(NULL, id, modifiers, vk) == 0); + } - if (!err) { - m_hotKeys.insert(std::make_pair(id, HotKeyItem(vk, modifiers))); - m_hotKeyToIDMap[HotKeyItem(vk, modifiers)] = id; - } - else { - m_oldHotKeyIDs.push_back(id); - m_hotKeys.erase(id); - LOG((CLOG_WARN "failed to register hotkey %s (id=%04x mask=%04x)", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask)); - return 0; - } - - LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask, id)); - return id; + if (!err) { + m_hotKeys.insert(std::make_pair(id, HotKeyItem(vk, modifiers))); + m_hotKeyToIDMap[HotKeyItem(vk, modifiers)] = id; + } + else { + m_oldHotKeyIDs.push_back(id); + m_hotKeys.erase(id); + LOG((CLOG_WARN "failed to register hotkey %s (id=%04x mask=%04x)", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask)); + return 0; + } + + LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", synergy::KeyMap::formatKey(key, mask).c_str(), key, mask, id)); + return id; } void MSWindowsScreen::unregisterHotKey(UInt32 id) { - // look up hotkey - HotKeyMap::iterator i = m_hotKeys.find(id); - if (i == m_hotKeys.end()) { - return; - } + // look up hotkey + HotKeyMap::iterator i = m_hotKeys.find(id); + if (i == m_hotKeys.end()) { + return; + } - // unregister with OS - bool err; - if (i->second.getVirtualKey() != 0) { - err = !UnregisterHotKey(NULL, id); - } - else { - err = false; - } - if (err) { - LOG((CLOG_WARN "failed to unregister hotkey id=%d", id)); - } - else { - LOG((CLOG_DEBUG "unregistered hotkey id=%d", id)); - } + // unregister with OS + bool err; + if (i->second.getVirtualKey() != 0) { + err = !UnregisterHotKey(NULL, id); + } + else { + err = false; + } + if (err) { + LOG((CLOG_WARN "failed to unregister hotkey id=%d", id)); + } + else { + LOG((CLOG_DEBUG "unregistered hotkey id=%d", id)); + } - // discard hot key from map and record old id for reuse - m_hotKeyToIDMap.erase(i->second); - m_hotKeys.erase(i); - m_oldHotKeyIDs.push_back(id); + // discard hot key from map and record old id for reuse + m_hotKeyToIDMap.erase(i->second); + m_hotKeys.erase(i); + m_oldHotKeyIDs.push_back(id); } void MSWindowsScreen::fakeInputBegin() { - assert(m_isPrimary); + assert(m_isPrimary); - if (!m_isOnScreen) { - m_keyState->useSavedModifiers(true); - } - m_desks->fakeInputBegin(); + if (!m_isOnScreen) { + m_keyState->useSavedModifiers(true); + } + m_desks->fakeInputBegin(); } void MSWindowsScreen::fakeInputEnd() { - assert(m_isPrimary); + assert(m_isPrimary); - m_desks->fakeInputEnd(); - if (!m_isOnScreen) { - m_keyState->useSavedModifiers(false); - } + m_desks->fakeInputEnd(); + if (!m_isOnScreen) { + m_keyState->useSavedModifiers(false); + } } SInt32 MSWindowsScreen::getJumpZoneSize() const { - return 1; + return 1; } bool MSWindowsScreen::isAnyMouseButtonDown(UInt32& buttonID) const { - static const char* buttonToName[] = { - "", - "Left Button", - "Middle Button", - "Right Button", - "X Button 1", - "X Button 2" - }; + static const char* buttonToName[] = { + "", + "Left Button", + "Middle Button", + "Right Button", + "X Button 1", + "X Button 2" + }; - for (UInt32 i = 1; i < sizeof(m_buttons) / sizeof(m_buttons[0]); ++i) { - if (m_buttons[i]) { - buttonID = i; - LOG((CLOG_DEBUG "locked by \"%s\"", buttonToName[i])); - return true; - } - } + for (UInt32 i = 1; i < sizeof(m_buttons) / sizeof(m_buttons[0]); ++i) { + if (m_buttons[i]) { + buttonID = i; + LOG((CLOG_DEBUG "locked by \"%s\"", buttonToName[i])); + return true; + } + } - return false; + return false; } void MSWindowsScreen::getCursorCenter(SInt32& x, SInt32& y) const { - x = m_xCenter; - y = m_yCenter; + x = m_xCenter; + y = m_yCenter; } void MSWindowsScreen::fakeMouseButton(ButtonID id, bool press) { - m_desks->fakeMouseButton(id, press); + m_desks->fakeMouseButton(id, press); - if (id == kButtonLeft) { - if (press) { - m_buttons[kButtonLeft] = true; - } - else { - m_buttons[kButtonLeft] = false; - m_fakeDraggingStarted = false; - m_draggingStarted = false; - } - } + if (id == kButtonLeft) { + if (press) { + m_buttons[kButtonLeft] = true; + } + else { + m_buttons[kButtonLeft] = false; + m_fakeDraggingStarted = false; + m_draggingStarted = false; + } + } } void MSWindowsScreen::fakeMouseMove(SInt32 x, SInt32 y) { - m_desks->fakeMouseMove(x, y); - if (m_buttons[kButtonLeft]) { - m_draggingStarted = true; - } + m_desks->fakeMouseMove(x, y); + if (m_buttons[kButtonLeft]) { + m_draggingStarted = true; + } } void MSWindowsScreen::fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const { - m_desks->fakeMouseRelativeMove(dx, dy); + m_desks->fakeMouseRelativeMove(dx, dy); } void MSWindowsScreen::fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const { - m_desks->fakeMouseWheel(xDelta, yDelta); + m_desks->fakeMouseWheel(xDelta, yDelta); } void MSWindowsScreen::updateKeys() { - m_desks->updateKeys(); + m_desks->updateKeys(); } void MSWindowsScreen::fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button) + KeyButton button) { - PlatformScreen::fakeKeyDown(id, mask, button); - updateForceShowCursor(); + PlatformScreen::fakeKeyDown(id, mask, button); + updateForceShowCursor(); } bool MSWindowsScreen::fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button) + SInt32 count, KeyButton button) { - bool result = PlatformScreen::fakeKeyRepeat(id, mask, count, button); - updateForceShowCursor(); - return result; + bool result = PlatformScreen::fakeKeyRepeat(id, mask, count, button); + updateForceShowCursor(); + return result; } bool MSWindowsScreen::fakeKeyUp(KeyButton button) { - bool result = PlatformScreen::fakeKeyUp(button); - updateForceShowCursor(); - return result; + bool result = PlatformScreen::fakeKeyUp(button); + updateForceShowCursor(); + return result; } void MSWindowsScreen::fakeAllKeysUp() { - PlatformScreen::fakeAllKeysUp(); - updateForceShowCursor(); + PlatformScreen::fakeAllKeysUp(); + updateForceShowCursor(); } HCURSOR MSWindowsScreen::createBlankCursor() const { - // create a transparent cursor - int cw = GetSystemMetrics(SM_CXCURSOR); - int ch = GetSystemMetrics(SM_CYCURSOR); + // create a transparent cursor + int cw = GetSystemMetrics(SM_CXCURSOR); + int ch = GetSystemMetrics(SM_CYCURSOR); - UInt8* cursorAND = new UInt8[ch * ((cw + 31) >> 2)]; - UInt8* cursorXOR = new UInt8[ch * ((cw + 31) >> 2)]; - memset(cursorAND, 0xff, ch * ((cw + 31) >> 2)); - memset(cursorXOR, 0x00, ch * ((cw + 31) >> 2)); - HCURSOR c = CreateCursor(s_windowInstance, 0, 0, cw, ch, cursorAND, cursorXOR); - delete[] cursorXOR; - delete[] cursorAND; - return c; + UInt8* cursorAND = new UInt8[ch * ((cw + 31) >> 2)]; + UInt8* cursorXOR = new UInt8[ch * ((cw + 31) >> 2)]; + memset(cursorAND, 0xff, ch * ((cw + 31) >> 2)); + memset(cursorXOR, 0x00, ch * ((cw + 31) >> 2)); + HCURSOR c = CreateCursor(s_windowInstance, 0, 0, cw, ch, cursorAND, cursorXOR); + delete[] cursorXOR; + delete[] cursorAND; + return c; } void MSWindowsScreen::destroyCursor(HCURSOR cursor) const { - if (cursor != NULL) { - DestroyCursor(cursor); - } + if (cursor != NULL) { + DestroyCursor(cursor); + } } ATOM MSWindowsScreen::createWindowClass() const { - WNDCLASSEX classInfo; - classInfo.cbSize = sizeof(classInfo); - classInfo.style = CS_DBLCLKS | CS_NOCLOSE; - classInfo.lpfnWndProc = &MSWindowsScreen::wndProc; - classInfo.cbClsExtra = 0; - classInfo.cbWndExtra = 0; - classInfo.hInstance = s_windowInstance; - classInfo.hIcon = NULL; - classInfo.hCursor = NULL; - classInfo.hbrBackground = NULL; - classInfo.lpszMenuName = NULL; - classInfo.lpszClassName = "Synergy"; - classInfo.hIconSm = NULL; - return RegisterClassEx(&classInfo); + WNDCLASSEX classInfo; + classInfo.cbSize = sizeof(classInfo); + classInfo.style = CS_DBLCLKS | CS_NOCLOSE; + classInfo.lpfnWndProc = &MSWindowsScreen::wndProc; + classInfo.cbClsExtra = 0; + classInfo.cbWndExtra = 0; + classInfo.hInstance = s_windowInstance; + classInfo.hIcon = NULL; + classInfo.hCursor = NULL; + classInfo.hbrBackground = NULL; + classInfo.lpszMenuName = NULL; + classInfo.lpszClassName = "Synergy"; + classInfo.hIconSm = NULL; + return RegisterClassEx(&classInfo); } void MSWindowsScreen::destroyClass(ATOM windowClass) const { - if (windowClass != 0) { - UnregisterClass(reinterpret_cast(windowClass), s_windowInstance); - } + if (windowClass != 0) { + UnregisterClass(reinterpret_cast(windowClass), s_windowInstance); + } } HWND MSWindowsScreen::createWindow(ATOM windowClass, const char* name) const { - HWND window = CreateWindowEx(WS_EX_TOPMOST | - WS_EX_TRANSPARENT | - WS_EX_TOOLWINDOW, - reinterpret_cast(windowClass), - name, - WS_POPUP, - 0, 0, 1, 1, - NULL, NULL, - s_windowInstance, - NULL); - if (window == NULL) { - LOG((CLOG_ERR "failed to create window: %d", GetLastError())); - throw XScreenOpenFailure(); - } - return window; + HWND window = CreateWindowEx(WS_EX_TOPMOST | + WS_EX_TRANSPARENT | + WS_EX_TOOLWINDOW, + reinterpret_cast(windowClass), + name, + WS_POPUP, + 0, 0, 1, 1, + NULL, NULL, + s_windowInstance, + NULL); + if (window == NULL) { + LOG((CLOG_ERR "failed to create window: %d", GetLastError())); + throw XScreenOpenFailure(); + } + return window; } HWND MSWindowsScreen::createDropWindow(ATOM windowClass, const char* name) const { - HWND window = CreateWindowEx( - WS_EX_TOPMOST | - WS_EX_TRANSPARENT | - WS_EX_ACCEPTFILES, - reinterpret_cast(m_class), - name, - WS_POPUP, - 0, 0, m_dropWindowSize, m_dropWindowSize, - NULL, NULL, - s_windowInstance, - NULL); + HWND window = CreateWindowEx( + WS_EX_TOPMOST | + WS_EX_TRANSPARENT | + WS_EX_ACCEPTFILES, + reinterpret_cast(m_class), + name, + WS_POPUP, + 0, 0, m_dropWindowSize, m_dropWindowSize, + NULL, NULL, + s_windowInstance, + NULL); - if (window == NULL) { - LOG((CLOG_ERR "failed to create drop window: %d", GetLastError())); - throw XScreenOpenFailure(); - } + if (window == NULL) { + LOG((CLOG_ERR "failed to create drop window: %d", GetLastError())); + throw XScreenOpenFailure(); + } - return window; + return window; } void MSWindowsScreen::destroyWindow(HWND hwnd) const { - if (hwnd != NULL) { - DestroyWindow(hwnd); - } + if (hwnd != NULL) { + DestroyWindow(hwnd); + } } void MSWindowsScreen::sendEvent(Event::Type type, void* data) { - m_events->addEvent(Event(type, getEventTarget(), data)); + m_events->addEvent(Event(type, getEventTarget(), data)); } void MSWindowsScreen::sendClipboardEvent(Event::Type type, ClipboardID id) { - ClipboardInfo* info = (ClipboardInfo*)malloc(sizeof(ClipboardInfo)); - if (info == NULL) { - LOG((CLOG_ERR "malloc failed on %s:%s", __FILE__, __LINE__ )); - return; - } - info->m_id = id; - info->m_sequenceNumber = m_sequenceNumber; - sendEvent(type, info); + ClipboardInfo* info = (ClipboardInfo*)malloc(sizeof(ClipboardInfo)); + if (info == NULL) { + LOG((CLOG_ERR "malloc failed on %s:%s", __FILE__, __LINE__ )); + return; + } + info->m_id = id; + info->m_sequenceNumber = m_sequenceNumber; + sendEvent(type, info); } void MSWindowsScreen::handleSystemEvent(const Event& event, void*) { - MSG* msg = static_cast(event.getData()); - assert(msg != NULL); + MSG* msg = static_cast(event.getData()); + assert(msg != NULL); - if (ArchMiscWindows::processDialog(msg)) { - return; - } - if (onPreDispatch(msg->hwnd, msg->message, msg->wParam, msg->lParam)) { - return; - } - TranslateMessage(msg); - DispatchMessage(msg); + if (ArchMiscWindows::processDialog(msg)) { + return; + } + if (onPreDispatch(msg->hwnd, msg->message, msg->wParam, msg->lParam)) { + return; + } + TranslateMessage(msg); + DispatchMessage(msg); } void MSWindowsScreen::updateButtons() { - int numButtons = GetSystemMetrics(SM_CMOUSEBUTTONS); - m_buttons[kButtonNone] = false; - m_buttons[kButtonLeft] = (GetKeyState(VK_LBUTTON) < 0); - m_buttons[kButtonRight] = (GetKeyState(VK_RBUTTON) < 0); - m_buttons[kButtonMiddle] = (GetKeyState(VK_MBUTTON) < 0); - m_buttons[kButtonExtra0 + 0] = (numButtons >= 4) && - (GetKeyState(VK_XBUTTON1) < 0); - m_buttons[kButtonExtra0 + 1] = (numButtons >= 5) && - (GetKeyState(VK_XBUTTON2) < 0); + int numButtons = GetSystemMetrics(SM_CMOUSEBUTTONS); + m_buttons[kButtonNone] = false; + m_buttons[kButtonLeft] = (GetKeyState(VK_LBUTTON) < 0); + m_buttons[kButtonRight] = (GetKeyState(VK_RBUTTON) < 0); + m_buttons[kButtonMiddle] = (GetKeyState(VK_MBUTTON) < 0); + m_buttons[kButtonExtra0 + 0] = (numButtons >= 4) && + (GetKeyState(VK_XBUTTON1) < 0); + m_buttons[kButtonExtra0 + 1] = (numButtons >= 5) && + (GetKeyState(VK_XBUTTON2) < 0); } IKeyState* MSWindowsScreen::getKeyState() const { - return m_keyState; + return m_keyState; } bool MSWindowsScreen::onPreDispatch(HWND hwnd, - UINT message, WPARAM wParam, LPARAM lParam) + UINT message, WPARAM wParam, LPARAM lParam) { - // handle event - switch (message) { - case SYNERGY_MSG_SCREEN_SAVER: - return onScreensaver(wParam != 0); + // handle event + switch (message) { + case SYNERGY_MSG_SCREEN_SAVER: + return onScreensaver(wParam != 0); - case SYNERGY_MSG_DEBUG: - LOG((CLOG_DEBUG1 "hook: 0x%08x 0x%08x", wParam, lParam)); - return true; - } + case SYNERGY_MSG_DEBUG: + LOG((CLOG_DEBUG1 "hook: 0x%08x 0x%08x", wParam, lParam)); + return true; + } - if (m_isPrimary) { - return onPreDispatchPrimary(hwnd, message, wParam, lParam); - } + if (m_isPrimary) { + return onPreDispatchPrimary(hwnd, message, wParam, lParam); + } - return false; + return false; } bool MSWindowsScreen::onPreDispatchPrimary(HWND, - UINT message, WPARAM wParam, LPARAM lParam) + UINT message, WPARAM wParam, LPARAM lParam) { - LOG((CLOG_DEBUG5 "handling pre-dispatch primary")); + LOG((CLOG_DEBUG5 "handling pre-dispatch primary")); - // handle event - switch (message) { - case SYNERGY_MSG_MARK: - return onMark(static_cast(wParam)); + // handle event + switch (message) { + case SYNERGY_MSG_MARK: + return onMark(static_cast(wParam)); - case SYNERGY_MSG_KEY: - return onKey(wParam, lParam); + case SYNERGY_MSG_KEY: + return onKey(wParam, lParam); - case SYNERGY_MSG_MOUSE_BUTTON: - return onMouseButton(wParam, lParam); + case SYNERGY_MSG_MOUSE_BUTTON: + return onMouseButton(wParam, lParam); - case SYNERGY_MSG_MOUSE_MOVE: - return onMouseMove(static_cast(wParam), - static_cast(lParam)); + case SYNERGY_MSG_MOUSE_MOVE: + return onMouseMove(static_cast(wParam), + static_cast(lParam)); - case SYNERGY_MSG_MOUSE_WHEEL: - // XXX -- support x-axis scrolling - return onMouseWheel(0, static_cast(wParam)); + case SYNERGY_MSG_MOUSE_WHEEL: + // XXX -- support x-axis scrolling + return onMouseWheel(0, static_cast(wParam)); - case SYNERGY_MSG_PRE_WARP: - { - // save position to compute delta of next motion - saveMousePosition(static_cast(wParam), static_cast(lParam)); + case SYNERGY_MSG_PRE_WARP: + { + // save position to compute delta of next motion + saveMousePosition(static_cast(wParam), static_cast(lParam)); - // we warped the mouse. discard events until we find the - // matching post warp event. see warpCursorNoFlush() for - // where the events are sent. we discard the matching - // post warp event and can be sure we've skipped the warp - // event. - MSG msg; - do { - GetMessage(&msg, NULL, SYNERGY_MSG_MOUSE_MOVE, - SYNERGY_MSG_POST_WARP); - } while (msg.message != SYNERGY_MSG_POST_WARP); - } - return true; + // we warped the mouse. discard events until we find the + // matching post warp event. see warpCursorNoFlush() for + // where the events are sent. we discard the matching + // post warp event and can be sure we've skipped the warp + // event. + MSG msg; + do { + GetMessage(&msg, NULL, SYNERGY_MSG_MOUSE_MOVE, + SYNERGY_MSG_POST_WARP); + } while (msg.message != SYNERGY_MSG_POST_WARP); + } + return true; - case SYNERGY_MSG_POST_WARP: - LOG((CLOG_WARN "unmatched post warp")); - return true; + case SYNERGY_MSG_POST_WARP: + LOG((CLOG_WARN "unmatched post warp")); + return true; - case WM_HOTKEY: - // we discard these messages. we'll catch the hot key in the - // regular key event handling, where we can detect both key - // press and release. we only register the hot key so no other - // app will act on the key combination. - break; - } + case WM_HOTKEY: + // we discard these messages. we'll catch the hot key in the + // regular key event handling, where we can detect both key + // press and release. we only register the hot key so no other + // app will act on the key combination. + break; + } - return false; + return false; } bool MSWindowsScreen::onEvent(HWND, UINT msg, - WPARAM wParam, LPARAM lParam, LRESULT* result) + WPARAM wParam, LPARAM lParam, LRESULT* result) { - switch (msg) { - case WM_DRAWCLIPBOARD: - // first pass on the message - if (m_nextClipboardWindow != NULL) { - SendMessage(m_nextClipboardWindow, msg, wParam, lParam); - } + switch (msg) { + case WM_DRAWCLIPBOARD: + // first pass on the message + if (m_nextClipboardWindow != NULL) { + SendMessage(m_nextClipboardWindow, msg, wParam, lParam); + } - // now handle the message - return onClipboardChange(); + // now handle the message + return onClipboardChange(); - case WM_CHANGECBCHAIN: - if (m_nextClipboardWindow == (HWND)wParam) { - m_nextClipboardWindow = (HWND)lParam; - LOG((CLOG_DEBUG "clipboard chain: new next: 0x%08x", m_nextClipboardWindow)); - } - else if (m_nextClipboardWindow != NULL) { - SendMessage(m_nextClipboardWindow, msg, wParam, lParam); - } - return true; + case WM_CHANGECBCHAIN: + if (m_nextClipboardWindow == (HWND)wParam) { + m_nextClipboardWindow = (HWND)lParam; + LOG((CLOG_DEBUG "clipboard chain: new next: 0x%08x", m_nextClipboardWindow)); + } + else if (m_nextClipboardWindow != NULL) { + SendMessage(m_nextClipboardWindow, msg, wParam, lParam); + } + return true; - case WM_DISPLAYCHANGE: - return onDisplayChange(); + case WM_DISPLAYCHANGE: + return onDisplayChange(); - case WM_POWERBROADCAST: - switch (wParam) { - case PBT_APMRESUMEAUTOMATIC: - case PBT_APMRESUMECRITICAL: - case PBT_APMRESUMESUSPEND: - m_events->addEvent(Event(m_events->forIScreen().resume(), - getEventTarget(), NULL, - Event::kDeliverImmediately)); - break; + case WM_POWERBROADCAST: + switch (wParam) { + case PBT_APMRESUMEAUTOMATIC: + case PBT_APMRESUMECRITICAL: + case PBT_APMRESUMESUSPEND: + m_events->addEvent(Event(m_events->forIScreen().resume(), + getEventTarget(), NULL, + Event::kDeliverImmediately)); + break; - case PBT_APMSUSPEND: - m_events->addEvent(Event(m_events->forIScreen().suspend(), - getEventTarget(), NULL, - Event::kDeliverImmediately)); - break; - } - *result = TRUE; - return true; + case PBT_APMSUSPEND: + m_events->addEvent(Event(m_events->forIScreen().suspend(), + getEventTarget(), NULL, + Event::kDeliverImmediately)); + break; + } + *result = TRUE; + return true; - case WM_DEVICECHANGE: - forceShowCursor(); - break; + case WM_DEVICECHANGE: + forceShowCursor(); + break; - case WM_SETTINGCHANGE: - if (wParam == SPI_SETMOUSEKEYS) { - forceShowCursor(); - } - break; - } + case WM_SETTINGCHANGE: + if (wParam == SPI_SETMOUSEKEYS) { + forceShowCursor(); + } + break; + } - return false; + return false; } bool MSWindowsScreen::onMark(UInt32 mark) { - m_markReceived = mark; - return true; + m_markReceived = mark; + return true; } bool MSWindowsScreen::onKey(WPARAM wParam, LPARAM lParam) { - static const KeyModifierMask s_ctrlAlt = - KeyModifierControl | KeyModifierAlt; + static const KeyModifierMask s_ctrlAlt = + KeyModifierControl | KeyModifierAlt; - LOG((CLOG_DEBUG1 "event: Key char=%d, vk=0x%02x, nagr=%d, lParam=0x%08x", (wParam & 0xff00u) >> 8, wParam & 0xffu, (wParam & 0x10000u) ? 1 : 0, lParam)); + LOG((CLOG_DEBUG1 "event: Key char=%d, vk=0x%02x, nagr=%d, lParam=0x%08x", (wParam & 0xff00u) >> 8, wParam & 0xffu, (wParam & 0x10000u) ? 1 : 0, lParam)); - // get event info - KeyButton button = (KeyButton)((lParam & 0x01ff0000) >> 16); - bool down = ((lParam & 0x80000000u) == 0x00000000u); - bool wasDown = isKeyDown(button); - KeyModifierMask oldState = pollActiveModifiers(); + // get event info + KeyButton button = (KeyButton)((lParam & 0x01ff0000) >> 16); + bool down = ((lParam & 0x80000000u) == 0x00000000u); + bool wasDown = isKeyDown(button); + KeyModifierMask oldState = pollActiveModifiers(); - // check for autorepeat - if (m_keyState->testAutoRepeat(down, (lParam & 0x40000000u) == 1, button)) { - lParam |= 0x40000000u; - } + // check for autorepeat + if (m_keyState->testAutoRepeat(down, (lParam & 0x40000000u) == 1, button)) { + lParam |= 0x40000000u; + } - // if the button is zero then guess what the button should be. - // these are badly synthesized key events and logitech software - // that maps mouse buttons to keys is known to do this. - // alternatively, we could just throw these events out. - if (button == 0) { - button = m_keyState->virtualKeyToButton(wParam & 0xffu); - if (button == 0) { - return true; - } - wasDown = isKeyDown(button); - } + // if the button is zero then guess what the button should be. + // these are badly synthesized key events and logitech software + // that maps mouse buttons to keys is known to do this. + // alternatively, we could just throw these events out. + if (button == 0) { + button = m_keyState->virtualKeyToButton(wParam & 0xffu); + if (button == 0) { + return true; + } + wasDown = isKeyDown(button); + } - // record keyboard state - m_keyState->onKey(button, down, oldState); + // record keyboard state + m_keyState->onKey(button, down, oldState); - if (!down && m_isPrimary && !m_isOnScreen) { - PrimaryKeyDownList::iterator find = std::find(m_primaryKeyDownList.begin(), m_primaryKeyDownList.end(), button); - if (find != m_primaryKeyDownList.end()) { - LOG((CLOG_DEBUG1 "release key button %d on primary", *find)); - m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); - fakeLocalKey(*find, false); - m_primaryKeyDownList.erase(find); - m_hook.setMode(kHOOK_RELAY_EVENTS); - return true; - } - } + if (!down && m_isPrimary && !m_isOnScreen) { + PrimaryKeyDownList::iterator find = std::find(m_primaryKeyDownList.begin(), m_primaryKeyDownList.end(), button); + if (find != m_primaryKeyDownList.end()) { + LOG((CLOG_DEBUG1 "release key button %d on primary", *find)); + m_hook.setMode(kHOOK_WATCH_JUMP_ZONE); + fakeLocalKey(*find, false); + m_primaryKeyDownList.erase(find); + m_hook.setMode(kHOOK_RELAY_EVENTS); + return true; + } + } - // windows doesn't tell us the modifier key state on mouse or key - // events so we have to figure it out. most apps would use - // GetKeyState() or even GetAsyncKeyState() for that but we can't - // because our hook doesn't pass on key events for several modifiers. - // it can't otherwise the system would interpret them normally on - // the primary screen even when on a secondary screen. so tapping - // alt would activate menus and tapping the windows key would open - // the start menu. if you don't pass those events on in the hook - // then GetKeyState() understandably doesn't reflect the effect of - // the event. curiously, neither does GetAsyncKeyState(), which is - // surprising. - // - // so anyway, we have to track the modifier state ourselves for - // at least those modifiers we don't pass on. pollActiveModifiers() - // does that but we have to update the keyboard state before calling - // pollActiveModifiers() to get the right answer. but the only way - // to set the modifier state or to set the up/down state of a key - // is via onKey(). so we have to call onKey() twice. - KeyModifierMask state = pollActiveModifiers(); - m_keyState->onKey(button, down, state); + // windows doesn't tell us the modifier key state on mouse or key + // events so we have to figure it out. most apps would use + // GetKeyState() or even GetAsyncKeyState() for that but we can't + // because our hook doesn't pass on key events for several modifiers. + // it can't otherwise the system would interpret them normally on + // the primary screen even when on a secondary screen. so tapping + // alt would activate menus and tapping the windows key would open + // the start menu. if you don't pass those events on in the hook + // then GetKeyState() understandably doesn't reflect the effect of + // the event. curiously, neither does GetAsyncKeyState(), which is + // surprising. + // + // so anyway, we have to track the modifier state ourselves for + // at least those modifiers we don't pass on. pollActiveModifiers() + // does that but we have to update the keyboard state before calling + // pollActiveModifiers() to get the right answer. but the only way + // to set the modifier state or to set the up/down state of a key + // is via onKey(). so we have to call onKey() twice. + KeyModifierMask state = pollActiveModifiers(); + m_keyState->onKey(button, down, state); - // check for hot keys - if (oldState != state) { - // modifier key was pressed/released - if (onHotKey(0, lParam)) { - return true; - } - } - else { - // non-modifier was pressed/released - if (onHotKey(wParam, lParam)) { - return true; - } - } + // check for hot keys + if (oldState != state) { + // modifier key was pressed/released + if (onHotKey(0, lParam)) { + return true; + } + } + else { + // non-modifier was pressed/released + if (onHotKey(wParam, lParam)) { + return true; + } + } - // stop sending modifier keys over and over again - if (isModifierRepeat(oldState, state, wParam)) { - return true; - } + // stop sending modifier keys over and over again + if (isModifierRepeat(oldState, state, wParam)) { + return true; + } - // ignore message if posted prior to last mark change - if (!ignore()) { - // check for ctrl+alt+del. we do not want to pass that to the - // client. the user can use ctrl+alt+pause to emulate it. - UINT virtKey = (wParam & 0xffu); - if (virtKey == VK_DELETE && (state & s_ctrlAlt) == s_ctrlAlt) { - LOG((CLOG_DEBUG "discard ctrl+alt+del")); - return true; - } + // ignore message if posted prior to last mark change + if (!ignore()) { + // check for ctrl+alt+del. we do not want to pass that to the + // client. the user can use ctrl+alt+pause to emulate it. + UINT virtKey = (wParam & 0xffu); + if (virtKey == VK_DELETE && (state & s_ctrlAlt) == s_ctrlAlt) { + LOG((CLOG_DEBUG "discard ctrl+alt+del")); + return true; + } - // check for ctrl+alt+del emulation - if ((virtKey == VK_PAUSE || virtKey == VK_CANCEL) && - (state & s_ctrlAlt) == s_ctrlAlt) { - LOG((CLOG_DEBUG "emulate ctrl+alt+del")); - // switch wParam and lParam to be as if VK_DELETE was - // pressed or released. when mapping the key we require that - // we not use AltGr (the 0x10000 flag in wParam) and we not - // use the keypad delete key (the 0x01000000 flag in lParam). - wParam = VK_DELETE | 0x00010000u; - lParam &= 0xfe000000; - lParam |= m_keyState->virtualKeyToButton(wParam & 0xffu) << 16; - lParam |= 0x01000001; - } + // check for ctrl+alt+del emulation + if ((virtKey == VK_PAUSE || virtKey == VK_CANCEL) && + (state & s_ctrlAlt) == s_ctrlAlt) { + LOG((CLOG_DEBUG "emulate ctrl+alt+del")); + // switch wParam and lParam to be as if VK_DELETE was + // pressed or released. when mapping the key we require that + // we not use AltGr (the 0x10000 flag in wParam) and we not + // use the keypad delete key (the 0x01000000 flag in lParam). + wParam = VK_DELETE | 0x00010000u; + lParam &= 0xfe000000; + lParam |= m_keyState->virtualKeyToButton(wParam & 0xffu) << 16; + lParam |= 0x01000001; + } - // process key - KeyModifierMask mask; - KeyID key = m_keyState->mapKeyFromEvent(wParam, lParam, &mask); - button = static_cast((lParam & 0x01ff0000u) >> 16); - if (key != kKeyNone) { - // do it - m_keyState->sendKeyEvent(getEventTarget(), - ((lParam & 0x80000000u) == 0), - ((lParam & 0x40000000u) != 0), - key, mask, (SInt32)(lParam & 0xffff), button); - } - else { - LOG((CLOG_DEBUG1 "cannot map key")); - } - } + // process key + KeyModifierMask mask; + KeyID key = m_keyState->mapKeyFromEvent(wParam, lParam, &mask); + button = static_cast((lParam & 0x01ff0000u) >> 16); + if (key != kKeyNone) { + // do it + m_keyState->sendKeyEvent(getEventTarget(), + ((lParam & 0x80000000u) == 0), + ((lParam & 0x40000000u) != 0), + key, mask, (SInt32)(lParam & 0xffff), button); + } + else { + LOG((CLOG_DEBUG1 "cannot map key")); + } + } - return true; + return true; } bool MSWindowsScreen::onHotKey(WPARAM wParam, LPARAM lParam) { - // get the key info - KeyModifierMask state = getActiveModifiers(); - UINT virtKey = (wParam & 0xffu); - UINT modifiers = 0; - if ((state & KeyModifierShift) != 0) { - modifiers |= MOD_SHIFT; - } - if ((state & KeyModifierControl) != 0) { - modifiers |= MOD_CONTROL; - } - if ((state & KeyModifierAlt) != 0) { - modifiers |= MOD_ALT; - } - if ((state & KeyModifierSuper) != 0) { - modifiers |= MOD_WIN; - } + // get the key info + KeyModifierMask state = getActiveModifiers(); + UINT virtKey = (wParam & 0xffu); + UINT modifiers = 0; + if ((state & KeyModifierShift) != 0) { + modifiers |= MOD_SHIFT; + } + if ((state & KeyModifierControl) != 0) { + modifiers |= MOD_CONTROL; + } + if ((state & KeyModifierAlt) != 0) { + modifiers |= MOD_ALT; + } + if ((state & KeyModifierSuper) != 0) { + modifiers |= MOD_WIN; + } - // find the hot key id - HotKeyToIDMap::const_iterator i = - m_hotKeyToIDMap.find(HotKeyItem(virtKey, modifiers)); - if (i == m_hotKeyToIDMap.end()) { - return false; - } + // find the hot key id + HotKeyToIDMap::const_iterator i = + m_hotKeyToIDMap.find(HotKeyItem(virtKey, modifiers)); + if (i == m_hotKeyToIDMap.end()) { + return false; + } - // find what kind of event - Event::Type type; - if ((lParam & 0x80000000u) == 0u) { - if ((lParam & 0x40000000u) != 0u) { - // ignore key repeats but it counts as a hot key - return true; - } - type = m_events->forIPrimaryScreen().hotKeyDown(); - } - else { - type = m_events->forIPrimaryScreen().hotKeyUp(); - } + // find what kind of event + Event::Type type; + if ((lParam & 0x80000000u) == 0u) { + if ((lParam & 0x40000000u) != 0u) { + // ignore key repeats but it counts as a hot key + return true; + } + type = m_events->forIPrimaryScreen().hotKeyDown(); + } + else { + type = m_events->forIPrimaryScreen().hotKeyUp(); + } - // generate event - m_events->addEvent(Event(type, getEventTarget(), - HotKeyInfo::alloc(i->second))); + // generate event + m_events->addEvent(Event(type, getEventTarget(), + HotKeyInfo::alloc(i->second))); - return true; + return true; } bool MSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam) { - // get which button - bool pressed = mapPressFromEvent(wParam, lParam); - ButtonID button = mapButtonFromEvent(wParam, lParam); + // get which button + bool pressed = mapPressFromEvent(wParam, lParam); + ButtonID button = mapButtonFromEvent(wParam, lParam); - // keep our shadow key state up to date - if (button >= kButtonLeft && button <= kButtonExtra0 + 1) { - if (pressed) { - m_buttons[button] = true; - if (button == kButtonLeft) { - m_draggingFilename.clear(); - LOG((CLOG_DEBUG2 "dragging filename is cleared")); - } - } - else { - m_buttons[button] = false; - if (m_draggingStarted && button == kButtonLeft) { - m_draggingStarted = false; - } - } - } + // keep our shadow key state up to date + if (button >= kButtonLeft && button <= kButtonExtra0 + 1) { + if (pressed) { + m_buttons[button] = true; + if (button == kButtonLeft) { + m_draggingFilename.clear(); + LOG((CLOG_DEBUG2 "dragging filename is cleared")); + } + } + else { + m_buttons[button] = false; + if (m_draggingStarted && button == kButtonLeft) { + m_draggingStarted = false; + } + } + } - // ignore message if posted prior to last mark change - if (!ignore()) { - KeyModifierMask mask = m_keyState->getActiveModifiers(); - if (pressed) { - LOG((CLOG_DEBUG1 "event: button press button=%d", button)); - if (button != kButtonNone) { - sendEvent(m_events->forIPrimaryScreen().buttonDown(), - ButtonInfo::alloc(button, mask)); - } - } - else { - LOG((CLOG_DEBUG1 "event: button release button=%d", button)); - if (button != kButtonNone) { - sendEvent(m_events->forIPrimaryScreen().buttonUp(), - ButtonInfo::alloc(button, mask)); - } - } - } + // ignore message if posted prior to last mark change + if (!ignore()) { + KeyModifierMask mask = m_keyState->getActiveModifiers(); + if (pressed) { + LOG((CLOG_DEBUG1 "event: button press button=%d", button)); + if (button != kButtonNone) { + sendEvent(m_events->forIPrimaryScreen().buttonDown(), + ButtonInfo::alloc(button, mask)); + } + } + else { + LOG((CLOG_DEBUG1 "event: button release button=%d", button)); + if (button != kButtonNone) { + sendEvent(m_events->forIPrimaryScreen().buttonUp(), + ButtonInfo::alloc(button, mask)); + } + } + } - return true; + return true; } // here's how mouse movements are sent across the network to a client: @@ -1347,288 +1347,288 @@ MSWindowsScreen::onMouseButton(WPARAM wParam, LPARAM lParam) bool MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my) { - // compute motion delta (relative to the last known - // mouse position) - SInt32 x = mx - m_xCursor; - SInt32 y = my - m_yCursor; + // compute motion delta (relative to the last known + // mouse position) + SInt32 x = mx - m_xCursor; + SInt32 y = my - m_yCursor; - LOG((CLOG_DEBUG3 - "mouse move - motion delta: %+d=(%+d - %+d),%+d=(%+d - %+d)", - x, mx, m_xCursor, y, my, m_yCursor)); + LOG((CLOG_DEBUG3 + "mouse move - motion delta: %+d=(%+d - %+d),%+d=(%+d - %+d)", + x, mx, m_xCursor, y, my, m_yCursor)); - // ignore if the mouse didn't move or if message posted prior - // to last mark change. - if (ignore() || (x == 0 && y == 0)) { - return true; - } + // ignore if the mouse didn't move or if message posted prior + // to last mark change. + if (ignore() || (x == 0 && y == 0)) { + return true; + } - // save position to compute delta of next motion - saveMousePosition(mx, my); + // save position to compute delta of next motion + saveMousePosition(mx, my); - if (m_isOnScreen) { - - // motion on primary screen - sendEvent( - m_events->forIPrimaryScreen().motionOnPrimary(), - MotionInfo::alloc(m_xCursor, m_yCursor)); + if (m_isOnScreen) { + + // motion on primary screen + sendEvent( + m_events->forIPrimaryScreen().motionOnPrimary(), + MotionInfo::alloc(m_xCursor, m_yCursor)); - if (m_buttons[kButtonLeft] == true && m_draggingStarted == false) { - m_draggingStarted = true; - } - } - else - { - // the motion is on the secondary screen, so we warp mouse back to - // center on the server screen. if we don't do this, then the mouse - // will always try to return to the original entry point on the - // secondary screen. - LOG((CLOG_DEBUG5 "warping server cursor to center: %+d,%+d", m_xCenter, m_yCenter)); - warpCursorNoFlush(m_xCenter, m_yCenter); - - // examine the motion. if it's about the distance - // from the center of the screen to an edge then - // it's probably a bogus motion that we want to - // ignore (see warpCursorNoFlush() for a further - // description). - static SInt32 bogusZoneSize = 10; - if (-x + bogusZoneSize > m_xCenter - m_x || - x + bogusZoneSize > m_x + m_w - m_xCenter || - -y + bogusZoneSize > m_yCenter - m_y || - y + bogusZoneSize > m_y + m_h - m_yCenter) { - - LOG((CLOG_DEBUG "dropped bogus delta motion: %+d,%+d", x, y)); - } - else { - // send motion - sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(x, y)); - } - } + if (m_buttons[kButtonLeft] == true && m_draggingStarted == false) { + m_draggingStarted = true; + } + } + else + { + // the motion is on the secondary screen, so we warp mouse back to + // center on the server screen. if we don't do this, then the mouse + // will always try to return to the original entry point on the + // secondary screen. + LOG((CLOG_DEBUG5 "warping server cursor to center: %+d,%+d", m_xCenter, m_yCenter)); + warpCursorNoFlush(m_xCenter, m_yCenter); + + // examine the motion. if it's about the distance + // from the center of the screen to an edge then + // it's probably a bogus motion that we want to + // ignore (see warpCursorNoFlush() for a further + // description). + static SInt32 bogusZoneSize = 10; + if (-x + bogusZoneSize > m_xCenter - m_x || + x + bogusZoneSize > m_x + m_w - m_xCenter || + -y + bogusZoneSize > m_yCenter - m_y || + y + bogusZoneSize > m_y + m_h - m_yCenter) { + + LOG((CLOG_DEBUG "dropped bogus delta motion: %+d,%+d", x, y)); + } + else { + // send motion + sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(x, y)); + } + } - return true; + return true; } bool MSWindowsScreen::onMouseWheel(SInt32 xDelta, SInt32 yDelta) { - // ignore message if posted prior to last mark change - if (!ignore()) { - LOG((CLOG_DEBUG1 "event: button wheel delta=%+d,%+d", xDelta, yDelta)); - sendEvent(m_events->forIPrimaryScreen().wheel(), WheelInfo::alloc(xDelta, yDelta)); - } - return true; + // ignore message if posted prior to last mark change + if (!ignore()) { + LOG((CLOG_DEBUG1 "event: button wheel delta=%+d,%+d", xDelta, yDelta)); + sendEvent(m_events->forIPrimaryScreen().wheel(), WheelInfo::alloc(xDelta, yDelta)); + } + return true; } bool MSWindowsScreen::onScreensaver(bool activated) { - // ignore this message if there are any other screen saver - // messages already in the queue. this is important because - // our checkStarted() function has a deliberate delay, so it - // can't respond to events at full CPU speed and will fall - // behind if a lot of screen saver events are generated. - // that can easily happen because windows will continually - // send SC_SCREENSAVE until the screen saver starts, even if - // the screen saver is disabled! - MSG msg; - if (PeekMessage(&msg, NULL, SYNERGY_MSG_SCREEN_SAVER, - SYNERGY_MSG_SCREEN_SAVER, PM_NOREMOVE)) { - return true; - } + // ignore this message if there are any other screen saver + // messages already in the queue. this is important because + // our checkStarted() function has a deliberate delay, so it + // can't respond to events at full CPU speed and will fall + // behind if a lot of screen saver events are generated. + // that can easily happen because windows will continually + // send SC_SCREENSAVE until the screen saver starts, even if + // the screen saver is disabled! + MSG msg; + if (PeekMessage(&msg, NULL, SYNERGY_MSG_SCREEN_SAVER, + SYNERGY_MSG_SCREEN_SAVER, PM_NOREMOVE)) { + return true; + } - if (activated) { - if (!m_screensaverActive && - m_screensaver->checkStarted(SYNERGY_MSG_SCREEN_SAVER, FALSE, 0)) { - m_screensaverActive = true; - sendEvent(m_events->forIPrimaryScreen().screensaverActivated()); + if (activated) { + if (!m_screensaverActive && + m_screensaver->checkStarted(SYNERGY_MSG_SCREEN_SAVER, FALSE, 0)) { + m_screensaverActive = true; + sendEvent(m_events->forIPrimaryScreen().screensaverActivated()); - // enable display power down - ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); - } - } - else { - if (m_screensaverActive) { - m_screensaverActive = false; - sendEvent(m_events->forIPrimaryScreen().screensaverDeactivated()); + // enable display power down + ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); + } + } + else { + if (m_screensaverActive) { + m_screensaverActive = false; + sendEvent(m_events->forIPrimaryScreen().screensaverDeactivated()); - // disable display power down - ArchMiscWindows::addBusyState(ArchMiscWindows::kDISPLAY); - } - } + // disable display power down + ArchMiscWindows::addBusyState(ArchMiscWindows::kDISPLAY); + } + } - return true; + return true; } bool MSWindowsScreen::onDisplayChange() { - // screen resolution may have changed. save old shape. - SInt32 xOld = m_x, yOld = m_y, wOld = m_w, hOld = m_h; + // screen resolution may have changed. save old shape. + SInt32 xOld = m_x, yOld = m_y, wOld = m_w, hOld = m_h; - // update shape - updateScreenShape(); + // update shape + updateScreenShape(); - // do nothing if resolution hasn't changed - if (xOld != m_x || yOld != m_y || wOld != m_w || hOld != m_h) { - if (m_isPrimary) { - // warp mouse to center if off screen - if (!m_isOnScreen) { + // do nothing if resolution hasn't changed + if (xOld != m_x || yOld != m_y || wOld != m_w || hOld != m_h) { + if (m_isPrimary) { + // warp mouse to center if off screen + if (!m_isOnScreen) { - LOG((CLOG_DEBUG1 "warping cursor to center: %+d, %+d", m_xCenter, m_yCenter)); - warpCursor(m_xCenter, m_yCenter); - } + LOG((CLOG_DEBUG1 "warping cursor to center: %+d, %+d", m_xCenter, m_yCenter)); + warpCursor(m_xCenter, m_yCenter); + } - // tell hook about resize if on screen - else { - m_hook.setZone(m_x, m_y, m_w, m_h, getJumpZoneSize()); - } - } + // tell hook about resize if on screen + else { + m_hook.setZone(m_x, m_y, m_w, m_h, getJumpZoneSize()); + } + } - // send new screen info - sendEvent(m_events->forIScreen().shapeChanged()); + // send new screen info + sendEvent(m_events->forIScreen().shapeChanged()); - LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : "")); - } + LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : "")); + } - return true; + return true; } bool MSWindowsScreen::onClipboardChange() { - // now notify client that somebody changed the clipboard (unless - // we're the owner). - if (!MSWindowsClipboard::isOwnedBySynergy()) { - if (m_ownClipboard) { - LOG((CLOG_DEBUG "clipboard changed: lost ownership")); - m_ownClipboard = false; - sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardClipboard); - sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardSelection); - } - } - else if (!m_ownClipboard) { - LOG((CLOG_DEBUG "clipboard changed: synergy owned")); - m_ownClipboard = true; - } + // now notify client that somebody changed the clipboard (unless + // we're the owner). + if (!MSWindowsClipboard::isOwnedBySynergy()) { + if (m_ownClipboard) { + LOG((CLOG_DEBUG "clipboard changed: lost ownership")); + m_ownClipboard = false; + sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardClipboard); + sendClipboardEvent(m_events->forClipboard().clipboardGrabbed(), kClipboardSelection); + } + } + else if (!m_ownClipboard) { + LOG((CLOG_DEBUG "clipboard changed: synergy owned")); + m_ownClipboard = true; + } - return true; + return true; } void MSWindowsScreen::warpCursorNoFlush(SInt32 x, SInt32 y) { - // send an event that we can recognize before the mouse warp - PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_PRE_WARP, x, y); + // send an event that we can recognize before the mouse warp + PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_PRE_WARP, x, y); - // warp mouse. hopefully this inserts a mouse motion event - // between the previous message and the following message. - SetCursorPos(x, y); + // warp mouse. hopefully this inserts a mouse motion event + // between the previous message and the following message. + SetCursorPos(x, y); - // check to see if the mouse pos was set correctly - POINT cursorPos; - GetCursorPos(&cursorPos); + // check to see if the mouse pos was set correctly + POINT cursorPos; + GetCursorPos(&cursorPos); - // there is a bug or round error in SetCursorPos and GetCursorPos on - // a high DPI setting. The check here is for Vista/7 login screen. - // since this feature is mainly for client, so only check on client. - if (!isPrimary()) { - if ((cursorPos.x != x) && (cursorPos.y != y)) { - LOG((CLOG_DEBUG "SetCursorPos did not work; using fakeMouseMove instead")); - LOG((CLOG_DEBUG "cursor pos %d, %d expected pos %d, %d", cursorPos.x, cursorPos.y, x, y)); - // when at Vista/7 login screen, SetCursorPos does not work (which could be - // an MS security feature). instead we can use fakeMouseMove, which calls - // mouse_event. - // IMPORTANT: as of implementing this function, it has an annoying side - // effect; instead of the mouse returning to the correct exit point, it - // returns to the center of the screen. this could have something to do with - // the center screen warping technique used (see comments for onMouseMove - // definition). - fakeMouseMove(x, y); - } - } + // there is a bug or round error in SetCursorPos and GetCursorPos on + // a high DPI setting. The check here is for Vista/7 login screen. + // since this feature is mainly for client, so only check on client. + if (!isPrimary()) { + if ((cursorPos.x != x) && (cursorPos.y != y)) { + LOG((CLOG_DEBUG "SetCursorPos did not work; using fakeMouseMove instead")); + LOG((CLOG_DEBUG "cursor pos %d, %d expected pos %d, %d", cursorPos.x, cursorPos.y, x, y)); + // when at Vista/7 login screen, SetCursorPos does not work (which could be + // an MS security feature). instead we can use fakeMouseMove, which calls + // mouse_event. + // IMPORTANT: as of implementing this function, it has an annoying side + // effect; instead of the mouse returning to the correct exit point, it + // returns to the center of the screen. this could have something to do with + // the center screen warping technique used (see comments for onMouseMove + // definition). + fakeMouseMove(x, y); + } + } - // yield the CPU. there's a race condition when warping: - // a hardware mouse event occurs - // the mouse hook is not called because that process doesn't have the CPU - // we send PRE_WARP, SetCursorPos(), send POST_WARP - // we process all of those events and update m_x, m_y - // we finish our time slice - // the hook is called - // the hook sends us a mouse event from the pre-warp position - // we get the CPU - // we compute a bogus warp - // we need the hook to process all mouse events that occur - // before we warp before we do the warp but i'm not sure how - // to guarantee that. yielding the CPU here may reduce the - // chance of undesired behavior. we'll also check for very - // large motions that look suspiciously like about half width - // or height of the screen. - ARCH->sleep(0.0); + // yield the CPU. there's a race condition when warping: + // a hardware mouse event occurs + // the mouse hook is not called because that process doesn't have the CPU + // we send PRE_WARP, SetCursorPos(), send POST_WARP + // we process all of those events and update m_x, m_y + // we finish our time slice + // the hook is called + // the hook sends us a mouse event from the pre-warp position + // we get the CPU + // we compute a bogus warp + // we need the hook to process all mouse events that occur + // before we warp before we do the warp but i'm not sure how + // to guarantee that. yielding the CPU here may reduce the + // chance of undesired behavior. we'll also check for very + // large motions that look suspiciously like about half width + // or height of the screen. + ARCH->sleep(0.0); - // send an event that we can recognize after the mouse warp - PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_POST_WARP, 0, 0); + // send an event that we can recognize after the mouse warp + PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_POST_WARP, 0, 0); } void MSWindowsScreen::nextMark() { - // next mark - ++m_mark; + // next mark + ++m_mark; - // mark point in message queue where the mark was changed - PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_MARK, m_mark, 0); + // mark point in message queue where the mark was changed + PostThreadMessage(GetCurrentThreadId(), SYNERGY_MSG_MARK, m_mark, 0); } bool MSWindowsScreen::ignore() const { - return (m_mark != m_markReceived); + return (m_mark != m_markReceived); } void MSWindowsScreen::updateScreenShape() { - // get shape and center - m_w = GetSystemMetrics(SM_CXVIRTUALSCREEN); - m_h = GetSystemMetrics(SM_CYVIRTUALSCREEN); - m_x = GetSystemMetrics(SM_XVIRTUALSCREEN); - m_y = GetSystemMetrics(SM_YVIRTUALSCREEN); - m_xCenter = GetSystemMetrics(SM_CXSCREEN) >> 1; - m_yCenter = GetSystemMetrics(SM_CYSCREEN) >> 1; + // get shape and center + m_w = GetSystemMetrics(SM_CXVIRTUALSCREEN); + m_h = GetSystemMetrics(SM_CYVIRTUALSCREEN); + m_x = GetSystemMetrics(SM_XVIRTUALSCREEN); + m_y = GetSystemMetrics(SM_YVIRTUALSCREEN); + m_xCenter = GetSystemMetrics(SM_CXSCREEN) >> 1; + m_yCenter = GetSystemMetrics(SM_CYSCREEN) >> 1; - // check for multiple monitors - m_multimon = (m_w != GetSystemMetrics(SM_CXSCREEN) || - m_h != GetSystemMetrics(SM_CYSCREEN)); + // check for multiple monitors + m_multimon = (m_w != GetSystemMetrics(SM_CXSCREEN) || + m_h != GetSystemMetrics(SM_CYSCREEN)); - // tell the desks - m_desks->setShape(m_x, m_y, m_w, m_h, m_xCenter, m_yCenter, m_multimon); + // tell the desks + m_desks->setShape(m_x, m_y, m_w, m_h, m_xCenter, m_yCenter, m_multimon); } void MSWindowsScreen::handleFixes(const Event&, void*) { - // fix clipboard chain - fixClipboardViewer(); + // fix clipboard chain + fixClipboardViewer(); - // update keys if keyboard layouts have changed - if (m_keyState->didGroupsChange()) { - updateKeys(); - } + // update keys if keyboard layouts have changed + if (m_keyState->didGroupsChange()) { + updateKeys(); + } } void MSWindowsScreen::fixClipboardViewer() { - // XXX -- disable this code for now. somehow it can cause an infinite - // recursion in the WM_DRAWCLIPBOARD handler. either we're sending - // the message to our own window or some window farther down the chain - // forwards the message to our window or a window farther up the chain. - // i'm not sure how that could happen. the m_nextClipboardWindow = NULL - // was not in the code that infinite loops and may fix the bug but i - // doubt it. + // XXX -- disable this code for now. somehow it can cause an infinite + // recursion in the WM_DRAWCLIPBOARD handler. either we're sending + // the message to our own window or some window farther down the chain + // forwards the message to our window or a window farther up the chain. + // i'm not sure how that could happen. the m_nextClipboardWindow = NULL + // was not in the code that infinite loops and may fix the bug but i + // doubt it. /* - ChangeClipboardChain(m_window, m_nextClipboardWindow); - m_nextClipboardWindow = NULL; - m_nextClipboardWindow = SetClipboardViewer(m_window); + ChangeClipboardChain(m_window, m_nextClipboardWindow); + m_nextClipboardWindow = NULL; + m_nextClipboardWindow = SetClipboardViewer(m_window); */ } @@ -1640,205 +1640,205 @@ MSWindowsScreen::enableSpecialKeys(bool enable) const ButtonID MSWindowsScreen::mapButtonFromEvent(WPARAM msg, LPARAM button) const { - switch (msg) { - case WM_LBUTTONDOWN: - case WM_LBUTTONDBLCLK: - case WM_LBUTTONUP: - case WM_NCLBUTTONDOWN: - case WM_NCLBUTTONDBLCLK: - case WM_NCLBUTTONUP: - return kButtonLeft; + switch (msg) { + case WM_LBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_LBUTTONUP: + case WM_NCLBUTTONDOWN: + case WM_NCLBUTTONDBLCLK: + case WM_NCLBUTTONUP: + return kButtonLeft; - case WM_MBUTTONDOWN: - case WM_MBUTTONDBLCLK: - case WM_MBUTTONUP: - case WM_NCMBUTTONDOWN: - case WM_NCMBUTTONDBLCLK: - case WM_NCMBUTTONUP: - return kButtonMiddle; + case WM_MBUTTONDOWN: + case WM_MBUTTONDBLCLK: + case WM_MBUTTONUP: + case WM_NCMBUTTONDOWN: + case WM_NCMBUTTONDBLCLK: + case WM_NCMBUTTONUP: + return kButtonMiddle; - case WM_RBUTTONDOWN: - case WM_RBUTTONDBLCLK: - case WM_RBUTTONUP: - case WM_NCRBUTTONDOWN: - case WM_NCRBUTTONDBLCLK: - case WM_NCRBUTTONUP: - return kButtonRight; + case WM_RBUTTONDOWN: + case WM_RBUTTONDBLCLK: + case WM_RBUTTONUP: + case WM_NCRBUTTONDOWN: + case WM_NCRBUTTONDBLCLK: + case WM_NCRBUTTONUP: + return kButtonRight; - case WM_XBUTTONDOWN: - case WM_XBUTTONDBLCLK: - case WM_XBUTTONUP: - case WM_NCXBUTTONDOWN: - case WM_NCXBUTTONDBLCLK: - case WM_NCXBUTTONUP: - switch (button) { - case XBUTTON1: - if (GetSystemMetrics(SM_CMOUSEBUTTONS) >= 4) { - return kButtonExtra0 + 0; - } - break; + case WM_XBUTTONDOWN: + case WM_XBUTTONDBLCLK: + case WM_XBUTTONUP: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONDBLCLK: + case WM_NCXBUTTONUP: + switch (button) { + case XBUTTON1: + if (GetSystemMetrics(SM_CMOUSEBUTTONS) >= 4) { + return kButtonExtra0 + 0; + } + break; - case XBUTTON2: - if (GetSystemMetrics(SM_CMOUSEBUTTONS) >= 5) { - return kButtonExtra0 + 1; - } - break; - } - return kButtonNone; + case XBUTTON2: + if (GetSystemMetrics(SM_CMOUSEBUTTONS) >= 5) { + return kButtonExtra0 + 1; + } + break; + } + return kButtonNone; - default: - return kButtonNone; - } + default: + return kButtonNone; + } } bool MSWindowsScreen::mapPressFromEvent(WPARAM msg, LPARAM) const { - switch (msg) { - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_XBUTTONDOWN: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_XBUTTONDBLCLK: - case WM_NCLBUTTONDOWN: - case WM_NCMBUTTONDOWN: - case WM_NCRBUTTONDOWN: - case WM_NCXBUTTONDOWN: - case WM_NCLBUTTONDBLCLK: - case WM_NCMBUTTONDBLCLK: - case WM_NCRBUTTONDBLCLK: - case WM_NCXBUTTONDBLCLK: - return true; + switch (msg) { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_XBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_XBUTTONDBLCLK: + case WM_NCLBUTTONDOWN: + case WM_NCMBUTTONDOWN: + case WM_NCRBUTTONDOWN: + case WM_NCXBUTTONDOWN: + case WM_NCLBUTTONDBLCLK: + case WM_NCMBUTTONDBLCLK: + case WM_NCRBUTTONDBLCLK: + case WM_NCXBUTTONDBLCLK: + return true; - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - case WM_XBUTTONUP: - case WM_NCLBUTTONUP: - case WM_NCMBUTTONUP: - case WM_NCRBUTTONUP: - case WM_NCXBUTTONUP: - return false; + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + case WM_XBUTTONUP: + case WM_NCLBUTTONUP: + case WM_NCMBUTTONUP: + case WM_NCRBUTTONUP: + case WM_NCXBUTTONUP: + return false; - default: - return false; - } + default: + return false; + } } void MSWindowsScreen::updateKeysCB(void*) { - // record which keys we think are down - bool down[IKeyState::kNumButtons]; - bool sendFixes = (isPrimary() && !m_isOnScreen); - if (sendFixes) { - for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { - down[i] = m_keyState->isKeyDown(i); - } - } + // record which keys we think are down + bool down[IKeyState::kNumButtons]; + bool sendFixes = (isPrimary() && !m_isOnScreen); + if (sendFixes) { + for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { + down[i] = m_keyState->isKeyDown(i); + } + } - // update layouts if necessary - if (m_keyState->didGroupsChange()) { - PlatformScreen::updateKeyMap(); - } + // update layouts if necessary + if (m_keyState->didGroupsChange()) { + PlatformScreen::updateKeyMap(); + } - // now update the keyboard state - PlatformScreen::updateKeyState(); + // now update the keyboard state + PlatformScreen::updateKeyState(); - // now see which keys we thought were down but now think are up. - // send key releases for these keys to the active client. - if (sendFixes) { - KeyModifierMask mask = pollActiveModifiers(); - for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { - if (down[i] && !m_keyState->isKeyDown(i)) { - m_keyState->sendKeyEvent(getEventTarget(), - false, false, kKeyNone, mask, 1, i); - } - } - } + // now see which keys we thought were down but now think are up. + // send key releases for these keys to the active client. + if (sendFixes) { + KeyModifierMask mask = pollActiveModifiers(); + for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { + if (down[i] && !m_keyState->isKeyDown(i)) { + m_keyState->sendKeyEvent(getEventTarget(), + false, false, kKeyNone, mask, 1, i); + } + } + } } void MSWindowsScreen::forceShowCursor() { - // check for mouse - m_hasMouse = (GetSystemMetrics(SM_MOUSEPRESENT) != 0); + // check for mouse + m_hasMouse = (GetSystemMetrics(SM_MOUSEPRESENT) != 0); - // decide if we should show the mouse - bool showMouse = (!m_hasMouse && !m_isPrimary && m_isOnScreen); + // decide if we should show the mouse + bool showMouse = (!m_hasMouse && !m_isPrimary && m_isOnScreen); - // show/hide the mouse - if (showMouse != m_showingMouse) { - if (showMouse) { - m_oldMouseKeys.cbSize = sizeof(m_oldMouseKeys); - m_gotOldMouseKeys = - (SystemParametersInfo(SPI_GETMOUSEKEYS, - m_oldMouseKeys.cbSize, &m_oldMouseKeys, 0) != 0); - if (m_gotOldMouseKeys) { - m_mouseKeys = m_oldMouseKeys; - m_showingMouse = true; - updateForceShowCursor(); - } - } - else { - if (m_gotOldMouseKeys) { - SystemParametersInfo(SPI_SETMOUSEKEYS, - m_oldMouseKeys.cbSize, - &m_oldMouseKeys, SPIF_SENDCHANGE); - m_showingMouse = false; - } - } - } + // show/hide the mouse + if (showMouse != m_showingMouse) { + if (showMouse) { + m_oldMouseKeys.cbSize = sizeof(m_oldMouseKeys); + m_gotOldMouseKeys = + (SystemParametersInfo(SPI_GETMOUSEKEYS, + m_oldMouseKeys.cbSize, &m_oldMouseKeys, 0) != 0); + if (m_gotOldMouseKeys) { + m_mouseKeys = m_oldMouseKeys; + m_showingMouse = true; + updateForceShowCursor(); + } + } + else { + if (m_gotOldMouseKeys) { + SystemParametersInfo(SPI_SETMOUSEKEYS, + m_oldMouseKeys.cbSize, + &m_oldMouseKeys, SPIF_SENDCHANGE); + m_showingMouse = false; + } + } + } } void MSWindowsScreen::updateForceShowCursor() { - DWORD oldFlags = m_mouseKeys.dwFlags; + DWORD oldFlags = m_mouseKeys.dwFlags; - // turn on MouseKeys - m_mouseKeys.dwFlags = MKF_AVAILABLE | MKF_MOUSEKEYSON; + // turn on MouseKeys + m_mouseKeys.dwFlags = MKF_AVAILABLE | MKF_MOUSEKEYSON; - // make sure MouseKeys is active in whatever state the NumLock is - // not currently in. - if ((m_keyState->getActiveModifiers() & KeyModifierNumLock) != 0) { - m_mouseKeys.dwFlags |= MKF_REPLACENUMBERS; - } + // make sure MouseKeys is active in whatever state the NumLock is + // not currently in. + if ((m_keyState->getActiveModifiers() & KeyModifierNumLock) != 0) { + m_mouseKeys.dwFlags |= MKF_REPLACENUMBERS; + } - // update MouseKeys - if (oldFlags != m_mouseKeys.dwFlags) { - SystemParametersInfo(SPI_SETMOUSEKEYS, - m_mouseKeys.cbSize, &m_mouseKeys, SPIF_SENDCHANGE); - } + // update MouseKeys + if (oldFlags != m_mouseKeys.dwFlags) { + SystemParametersInfo(SPI_SETMOUSEKEYS, + m_mouseKeys.cbSize, &m_mouseKeys, SPIF_SENDCHANGE); + } } LRESULT CALLBACK MSWindowsScreen::wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { - assert(s_screen != NULL); + assert(s_screen != NULL); - LRESULT result = 0; - if (!s_screen->onEvent(hwnd, msg, wParam, lParam, &result)) { - result = DefWindowProc(hwnd, msg, wParam, lParam); - } + LRESULT result = 0; + if (!s_screen->onEvent(hwnd, msg, wParam, lParam, &result)) { + result = DefWindowProc(hwnd, msg, wParam, lParam); + } - return result; + return result; } void MSWindowsScreen::fakeLocalKey(KeyButton button, bool press) const { - INPUT input; - input.type = INPUT_KEYBOARD; - input.ki.wVk = m_keyState->mapButtonToVirtualKey(button); - DWORD pressFlag = press ? KEYEVENTF_EXTENDEDKEY : KEYEVENTF_KEYUP; - input.ki.dwFlags = pressFlag; - input.ki.time = 0; - input.ki.dwExtraInfo = 0; - SendInput(1,&input,sizeof(input)); + INPUT input; + input.type = INPUT_KEYBOARD; + input.ki.wVk = m_keyState->mapButtonToVirtualKey(button); + DWORD pressFlag = press ? KEYEVENTF_EXTENDEDKEY : KEYEVENTF_KEYUP; + input.ki.dwFlags = pressFlag; + input.ki.time = 0; + input.ki.dwExtraInfo = 0; + SendInput(1,&input,sizeof(input)); } // @@ -1846,118 +1846,118 @@ MSWindowsScreen::fakeLocalKey(KeyButton button, bool press) const // MSWindowsScreen::HotKeyItem::HotKeyItem(UINT keycode, UINT mask) : - m_keycode(keycode), - m_mask(mask) + m_keycode(keycode), + m_mask(mask) { - // do nothing + // do nothing } UINT MSWindowsScreen::HotKeyItem::getVirtualKey() const { - return m_keycode; + return m_keycode; } bool MSWindowsScreen::HotKeyItem::operator<(const HotKeyItem& x) const { - return (m_keycode < x.m_keycode || - (m_keycode == x.m_keycode && m_mask < x.m_mask)); + return (m_keycode < x.m_keycode || + (m_keycode == x.m_keycode && m_mask < x.m_mask)); } void MSWindowsScreen::fakeDraggingFiles(DragFileList fileList) { - // possible design flaw: this function stops a "not implemented" - // exception from being thrown. + // possible design flaw: this function stops a "not implemented" + // exception from being thrown. } String& MSWindowsScreen::getDraggingFilename() { - if (m_draggingStarted) { - m_dropTarget->clearDraggingFilename(); - m_draggingFilename.clear(); + if (m_draggingStarted) { + m_dropTarget->clearDraggingFilename(); + m_draggingFilename.clear(); - int halfSize = m_dropWindowSize / 2; + int halfSize = m_dropWindowSize / 2; - SInt32 xPos = m_isPrimary ? m_xCursor : m_xCenter; - SInt32 yPos = m_isPrimary ? m_yCursor : m_yCenter; - xPos = (xPos - halfSize) < 0 ? 0 : xPos - halfSize; - yPos = (yPos - halfSize) < 0 ? 0 : yPos - halfSize; - SetWindowPos( - m_dropWindow, - HWND_TOPMOST, - xPos, - yPos, - m_dropWindowSize, - m_dropWindowSize, - SWP_SHOWWINDOW); + SInt32 xPos = m_isPrimary ? m_xCursor : m_xCenter; + SInt32 yPos = m_isPrimary ? m_yCursor : m_yCenter; + xPos = (xPos - halfSize) < 0 ? 0 : xPos - halfSize; + yPos = (yPos - halfSize) < 0 ? 0 : yPos - halfSize; + SetWindowPos( + m_dropWindow, + HWND_TOPMOST, + xPos, + yPos, + m_dropWindowSize, + m_dropWindowSize, + SWP_SHOWWINDOW); - // TODO: fake these keys properly - fakeKeyDown(kKeyEscape, 8192, 1); - fakeKeyUp(1); - fakeMouseButton(kButtonLeft, false); + // TODO: fake these keys properly + fakeKeyDown(kKeyEscape, 8192, 1); + fakeKeyUp(1); + fakeMouseButton(kButtonLeft, false); - String filename; - DOUBLE timeout = ARCH->time() + .5f; - while (ARCH->time() < timeout) { - ARCH->sleep(.05f); - filename = m_dropTarget->getDraggingFilename(); - if (!filename.empty()) { - break; - } - } + String filename; + DOUBLE timeout = ARCH->time() + .5f; + while (ARCH->time() < timeout) { + ARCH->sleep(.05f); + filename = m_dropTarget->getDraggingFilename(); + if (!filename.empty()) { + break; + } + } - ShowWindow(m_dropWindow, SW_HIDE); + ShowWindow(m_dropWindow, SW_HIDE); - if (!filename.empty()) { - if (DragInformation::isFileValid(filename)) { - m_draggingFilename = filename; - } - else { - LOG((CLOG_DEBUG "drag file name is invalid: %s", filename.c_str())); - } - } + if (!filename.empty()) { + if (DragInformation::isFileValid(filename)) { + m_draggingFilename = filename; + } + else { + LOG((CLOG_DEBUG "drag file name is invalid: %s", filename.c_str())); + } + } - if (m_draggingFilename.empty()) { - LOG((CLOG_DEBUG "failed to get drag file name from OLE")); - } - } + if (m_draggingFilename.empty()) { + LOG((CLOG_DEBUG "failed to get drag file name from OLE")); + } + } - return m_draggingFilename; + return m_draggingFilename; } const String& MSWindowsScreen::getDropTarget() const { - return m_desktopPath; + return m_desktopPath; } bool MSWindowsScreen::isModifierRepeat(KeyModifierMask oldState, KeyModifierMask state, WPARAM wParam) const { - bool result = false; + bool result = false; - if (oldState == state && state != 0) { - UINT virtKey = (wParam & 0xffu); - if ((state & KeyModifierShift) != 0 - && (virtKey == VK_LSHIFT || virtKey == VK_RSHIFT)) { - result = true; - } - if ((state & KeyModifierControl) != 0 - && (virtKey == VK_LCONTROL || virtKey == VK_RCONTROL)) { - result = true; - } - if ((state & KeyModifierAlt) != 0 - && (virtKey == VK_LMENU || virtKey == VK_RMENU)) { - result = true; - } - if ((state & KeyModifierSuper) != 0 - && (virtKey == VK_LWIN || virtKey == VK_RWIN)) { - result = true; - } - } + if (oldState == state && state != 0) { + UINT virtKey = (wParam & 0xffu); + if ((state & KeyModifierShift) != 0 + && (virtKey == VK_LSHIFT || virtKey == VK_RSHIFT)) { + result = true; + } + if ((state & KeyModifierControl) != 0 + && (virtKey == VK_LCONTROL || virtKey == VK_RCONTROL)) { + result = true; + } + if ((state & KeyModifierAlt) != 0 + && (virtKey == VK_LMENU || virtKey == VK_RMENU)) { + result = true; + } + if ((state & KeyModifierSuper) != 0 + && (virtKey == VK_LWIN || virtKey == VK_RWIN)) { + result = true; + } + } - return result; + return result; } diff --git a/src/lib/platform/MSWindowsScreen.h b/src/lib/platform/MSWindowsScreen.h index b1ae0f94..4b1f2c18 100644 --- a/src/lib/platform/MSWindowsScreen.h +++ b/src/lib/platform/MSWindowsScreen.h @@ -39,307 +39,307 @@ class MSWindowsDropTarget; //! Implementation of IPlatformScreen for Microsoft Windows class MSWindowsScreen : public PlatformScreen { public: - MSWindowsScreen( - bool isPrimary, - bool noHooks, - bool stopOnDeskSwitch, - IEventQueue* events); - virtual ~MSWindowsScreen(); + MSWindowsScreen( + bool isPrimary, + bool noHooks, + bool stopOnDeskSwitch, + IEventQueue* events); + virtual ~MSWindowsScreen(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Initialize - /*! - Saves the application's HINSTANCE. This \b must be called by - WinMain with the HINSTANCE it was passed. - */ - static void init(HINSTANCE); + //! Initialize + /*! + Saves the application's HINSTANCE. This \b must be called by + WinMain with the HINSTANCE it was passed. + */ + static void init(HINSTANCE); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get instance - /*! - Returns the application instance handle passed to init(). - */ - static HINSTANCE getWindowInstance(); + //! Get instance + /*! + Returns the application instance handle passed to init(). + */ + static HINSTANCE getWindowInstance(); - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IPrimaryScreen overrides - virtual void reconfigure(UInt32 activeSides); - virtual void warpCursor(SInt32 x, SInt32 y); - virtual UInt32 registerHotKey(KeyID key, - KeyModifierMask mask); - virtual void unregisterHotKey(UInt32 id); - virtual void fakeInputBegin(); - virtual void fakeInputEnd(); - virtual SInt32 getJumpZoneSize() const; - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; - virtual void getCursorCenter(SInt32& x, SInt32& y) const; + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides); + virtual void warpCursor(SInt32 x, SInt32 y); + virtual UInt32 registerHotKey(KeyID key, + KeyModifierMask mask); + virtual void unregisterHotKey(UInt32 id); + virtual void fakeInputBegin(); + virtual void fakeInputEnd(); + virtual SInt32 getJumpZoneSize() const; + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; + virtual void getCursorCenter(SInt32& x, SInt32& y) const; - // ISecondaryScreen overrides - virtual void fakeMouseButton(ButtonID id, bool press); - virtual void fakeMouseMove(SInt32 x, SInt32 y); - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press); + virtual void fakeMouseMove(SInt32 x, SInt32 y); + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; - // IKeyState overrides - virtual void updateKeys(); - virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button); - virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button); - virtual bool fakeKeyUp(KeyButton button); - virtual void fakeAllKeysUp(); + // IKeyState overrides + virtual void updateKeys(); + virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, + KeyButton button); + virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton button); + virtual bool fakeKeyUp(KeyButton button); + virtual void fakeAllKeysUp(); - // IPlatformScreen overrides - virtual void enable(); - virtual void disable(); - virtual void enter(); - virtual bool leave(); - virtual bool setClipboard(ClipboardID, const IClipboard*); - virtual void checkClipboards(); - virtual void openScreensaver(bool notify); - virtual void closeScreensaver(); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual void setSequenceNumber(UInt32); - virtual bool isPrimary() const; - virtual void fakeDraggingFiles(DragFileList fileList); - virtual String& getDraggingFilename(); - virtual const String& - getDropTarget() const; + // IPlatformScreen overrides + virtual void enable(); + virtual void disable(); + virtual void enter(); + virtual bool leave(); + virtual bool setClipboard(ClipboardID, const IClipboard*); + virtual void checkClipboards(); + virtual void openScreensaver(bool notify); + virtual void closeScreensaver(); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual void setSequenceNumber(UInt32); + virtual bool isPrimary() const; + virtual void fakeDraggingFiles(DragFileList fileList); + virtual String& getDraggingFilename(); + virtual const String& + getDropTarget() const; protected: - // IPlatformScreen overrides - virtual void handleSystemEvent(const Event&, void*); - virtual void updateButtons(); - virtual IKeyState* getKeyState() const; + // IPlatformScreen overrides + virtual void handleSystemEvent(const Event&, void*); + virtual void updateButtons(); + virtual IKeyState* getKeyState() const; - // simulate a local key to the system directly - void fakeLocalKey(KeyButton button, bool press) const; + // simulate a local key to the system directly + void fakeLocalKey(KeyButton button, bool press) const; private: - // initialization and shutdown operations - HCURSOR createBlankCursor() const; - void destroyCursor(HCURSOR cursor) const; - ATOM createWindowClass() const; - ATOM createDeskWindowClass(bool isPrimary) const; - void destroyClass(ATOM windowClass) const; - HWND createWindow(ATOM windowClass, const char* name) const; - HWND createDropWindow(ATOM windowClass, const char* name) const; - void destroyWindow(HWND) const; + // initialization and shutdown operations + HCURSOR createBlankCursor() const; + void destroyCursor(HCURSOR cursor) const; + ATOM createWindowClass() const; + ATOM createDeskWindowClass(bool isPrimary) const; + void destroyClass(ATOM windowClass) const; + HWND createWindow(ATOM windowClass, const char* name) const; + HWND createDropWindow(ATOM windowClass, const char* name) const; + void destroyWindow(HWND) const; - // convenience function to send events + // convenience function to send events public: // HACK - void sendEvent(Event::Type type, void* = NULL); + void sendEvent(Event::Type type, void* = NULL); private: // HACK - void sendClipboardEvent(Event::Type type, ClipboardID id); + void sendClipboardEvent(Event::Type type, ClipboardID id); - // handle message before it gets dispatched. returns true iff - // the message should not be dispatched. - bool onPreDispatch(HWND, UINT, WPARAM, LPARAM); + // handle message before it gets dispatched. returns true iff + // the message should not be dispatched. + bool onPreDispatch(HWND, UINT, WPARAM, LPARAM); - // handle message before it gets dispatched. returns true iff - // the message should not be dispatched. - bool onPreDispatchPrimary(HWND, UINT, WPARAM, LPARAM); + // handle message before it gets dispatched. returns true iff + // the message should not be dispatched. + bool onPreDispatchPrimary(HWND, UINT, WPARAM, LPARAM); - // handle message. returns true iff handled and optionally sets - // \c *result (which defaults to 0). - bool onEvent(HWND, UINT, WPARAM, LPARAM, LRESULT* result); + // handle message. returns true iff handled and optionally sets + // \c *result (which defaults to 0). + bool onEvent(HWND, UINT, WPARAM, LPARAM, LRESULT* result); - // message handlers - bool onMark(UInt32 mark); - bool onKey(WPARAM, LPARAM); - bool onHotKey(WPARAM, LPARAM); - bool onMouseButton(WPARAM, LPARAM); - bool onMouseMove(SInt32 x, SInt32 y); - bool onMouseWheel(SInt32 xDelta, SInt32 yDelta); - bool onScreensaver(bool activated); - bool onDisplayChange(); - bool onClipboardChange(); + // message handlers + bool onMark(UInt32 mark); + bool onKey(WPARAM, LPARAM); + bool onHotKey(WPARAM, LPARAM); + bool onMouseButton(WPARAM, LPARAM); + bool onMouseMove(SInt32 x, SInt32 y); + bool onMouseWheel(SInt32 xDelta, SInt32 yDelta); + bool onScreensaver(bool activated); + bool onDisplayChange(); + bool onClipboardChange(); - // warp cursor without discarding queued events - void warpCursorNoFlush(SInt32 x, SInt32 y); + // warp cursor without discarding queued events + void warpCursorNoFlush(SInt32 x, SInt32 y); - // discard posted messages - void nextMark(); + // discard posted messages + void nextMark(); - // test if event should be ignored - bool ignore() const; + // test if event should be ignored + bool ignore() const; - // update screen size cache - void updateScreenShape(); + // update screen size cache + void updateScreenShape(); - // fix timer callback - void handleFixes(const Event&, void*); + // fix timer callback + void handleFixes(const Event&, void*); - // fix the clipboard viewer chain - void fixClipboardViewer(); + // fix the clipboard viewer chain + void fixClipboardViewer(); - // enable/disable special key combinations so we can catch/pass them - void enableSpecialKeys(bool) const; + // enable/disable special key combinations so we can catch/pass them + void enableSpecialKeys(bool) const; - // map a button event to a button ID - ButtonID mapButtonFromEvent(WPARAM msg, LPARAM button) const; + // map a button event to a button ID + ButtonID mapButtonFromEvent(WPARAM msg, LPARAM button) const; - // map a button event to a press (true) or release (false) - bool mapPressFromEvent(WPARAM msg, LPARAM button) const; + // map a button event to a press (true) or release (false) + bool mapPressFromEvent(WPARAM msg, LPARAM button) const; - // job to update the key state - void updateKeysCB(void*); + // job to update the key state + void updateKeysCB(void*); - // determine whether the mouse is hidden by the system and force - // it to be displayed if user has entered this secondary screen. - void forceShowCursor(); + // determine whether the mouse is hidden by the system and force + // it to be displayed if user has entered this secondary screen. + void forceShowCursor(); - // forceShowCursor uses MouseKeys to show the cursor. since we - // don't actually want MouseKeys behavior we have to make sure - // it applies when NumLock is in whatever state it's not in now. - // this method does that. - void updateForceShowCursor(); + // forceShowCursor uses MouseKeys to show the cursor. since we + // don't actually want MouseKeys behavior we have to make sure + // it applies when NumLock is in whatever state it's not in now. + // this method does that. + void updateForceShowCursor(); - // our window proc - static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM); - - // save last position of mouse to compute next delta movement - void saveMousePosition(SInt32 x, SInt32 y); + // our window proc + static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM); + + // save last position of mouse to compute next delta movement + void saveMousePosition(SInt32 x, SInt32 y); - // check if it is a modifier key repeating message - bool isModifierRepeat(KeyModifierMask oldState, - KeyModifierMask state, WPARAM wParam) const; + // check if it is a modifier key repeating message + bool isModifierRepeat(KeyModifierMask oldState, + KeyModifierMask state, WPARAM wParam) const; - // send drag info and data back to server - void sendDragThread(void*); + // send drag info and data back to server + void sendDragThread(void*); private: - struct HotKeyItem { - public: - HotKeyItem(UINT vk, UINT modifiers); + struct HotKeyItem { + public: + HotKeyItem(UINT vk, UINT modifiers); - UINT getVirtualKey() const; + UINT getVirtualKey() const; - bool operator<(const HotKeyItem&) const; + bool operator<(const HotKeyItem&) const; - private: - UINT m_keycode; - UINT m_mask; - }; - typedef std::map HotKeyMap; - typedef std::vector HotKeyIDList; - typedef std::map HotKeyToIDMap; - typedef std::vector PrimaryKeyDownList; + private: + UINT m_keycode; + UINT m_mask; + }; + typedef std::map HotKeyMap; + typedef std::vector HotKeyIDList; + typedef std::map HotKeyToIDMap; + typedef std::vector PrimaryKeyDownList; - static HINSTANCE s_windowInstance; + static HINSTANCE s_windowInstance; - // true if screen is being used as a primary screen, false otherwise - bool m_isPrimary; + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; - // true if hooks are not to be installed (useful for debugging) - bool m_noHooks; + // true if hooks are not to be installed (useful for debugging) + bool m_noHooks; - // true if mouse has entered the screen - bool m_isOnScreen; + // true if mouse has entered the screen + bool m_isOnScreen; - // our resources - ATOM m_class; + // our resources + ATOM m_class; - // screen shape stuff - SInt32 m_x, m_y; - SInt32 m_w, m_h; - SInt32 m_xCenter, m_yCenter; + // screen shape stuff + SInt32 m_x, m_y; + SInt32 m_w, m_h; + SInt32 m_xCenter, m_yCenter; - // true if system appears to have multiple monitors - bool m_multimon; + // true if system appears to have multiple monitors + bool m_multimon; - // last mouse position - SInt32 m_xCursor, m_yCursor; + // last mouse position + SInt32 m_xCursor, m_yCursor; - // last clipboard - UInt32 m_sequenceNumber; + // last clipboard + UInt32 m_sequenceNumber; - // used to discard queued messages that are no longer needed - UInt32 m_mark; - UInt32 m_markReceived; + // used to discard queued messages that are no longer needed + UInt32 m_mark; + UInt32 m_markReceived; - // the main loop's thread id - DWORD m_threadID; + // the main loop's thread id + DWORD m_threadID; - // timer for periodically checking stuff that requires polling - EventQueueTimer* m_fixTimer; + // timer for periodically checking stuff that requires polling + EventQueueTimer* m_fixTimer; - // the keyboard layout to use when off primary screen - HKL m_keyLayout; + // the keyboard layout to use when off primary screen + HKL m_keyLayout; - // screen saver stuff - MSWindowsScreenSaver* - m_screensaver; - bool m_screensaverNotify; - bool m_screensaverActive; + // screen saver stuff + MSWindowsScreenSaver* + m_screensaver; + bool m_screensaverNotify; + bool m_screensaverActive; - // clipboard stuff. our window is used mainly as a clipboard - // owner and as a link in the clipboard viewer chain. - HWND m_window; - HWND m_nextClipboardWindow; - bool m_ownClipboard; + // clipboard stuff. our window is used mainly as a clipboard + // owner and as a link in the clipboard viewer chain. + HWND m_window; + HWND m_nextClipboardWindow; + bool m_ownClipboard; - // one desk per desktop and a cond var to communicate with it - MSWindowsDesks* m_desks; + // one desk per desktop and a cond var to communicate with it + MSWindowsDesks* m_desks; - // keyboard stuff - MSWindowsKeyState* m_keyState; + // keyboard stuff + MSWindowsKeyState* m_keyState; - // hot key stuff - HotKeyMap m_hotKeys; - HotKeyIDList m_oldHotKeyIDs; - HotKeyToIDMap m_hotKeyToIDMap; + // hot key stuff + HotKeyMap m_hotKeys; + HotKeyIDList m_oldHotKeyIDs; + HotKeyToIDMap m_hotKeyToIDMap; - // map of button state - bool m_buttons[1 + kButtonExtra0 + 1]; + // map of button state + bool m_buttons[1 + kButtonExtra0 + 1]; - // the system shows the mouse cursor when an internal display count - // is >= 0. this count is maintained per application but there's - // apparently a system wide count added to the application's count. - // this system count is 0 if there's a mouse attached to the system - // and -1 otherwise. the MouseKeys accessibility feature can modify - // this system count by making the system appear to have a mouse. - // - // m_hasMouse is true iff there's a mouse attached to the system or - // MouseKeys is simulating one. we track this so we can force the - // cursor to be displayed when the user has entered this screen. - // m_showingMouse is true when we're doing that. - bool m_hasMouse; - bool m_showingMouse; - bool m_gotOldMouseKeys; - MOUSEKEYS m_mouseKeys; - MOUSEKEYS m_oldMouseKeys; - - MSWindowsHook m_hook; + // the system shows the mouse cursor when an internal display count + // is >= 0. this count is maintained per application but there's + // apparently a system wide count added to the application's count. + // this system count is 0 if there's a mouse attached to the system + // and -1 otherwise. the MouseKeys accessibility feature can modify + // this system count by making the system appear to have a mouse. + // + // m_hasMouse is true iff there's a mouse attached to the system or + // MouseKeys is simulating one. we track this so we can force the + // cursor to be displayed when the user has entered this screen. + // m_showingMouse is true when we're doing that. + bool m_hasMouse; + bool m_showingMouse; + bool m_gotOldMouseKeys; + MOUSEKEYS m_mouseKeys; + MOUSEKEYS m_oldMouseKeys; + + MSWindowsHook m_hook; - static MSWindowsScreen* - s_screen; - - IEventQueue* m_events; + static MSWindowsScreen* + s_screen; + + IEventQueue* m_events; - String m_desktopPath; + String m_desktopPath; - MSWindowsDropTarget* - m_dropTarget; - HWND m_dropWindow; - const int m_dropWindowSize; + MSWindowsDropTarget* + m_dropTarget; + HWND m_dropWindow; + const int m_dropWindowSize; - Thread* m_sendDragThread; + Thread* m_sendDragThread; - PrimaryKeyDownList m_primaryKeyDownList; + PrimaryKeyDownList m_primaryKeyDownList; }; diff --git a/src/lib/platform/MSWindowsScreenSaver.cpp b/src/lib/platform/MSWindowsScreenSaver.cpp index f2ab7334..f6a9d386 100644 --- a/src/lib/platform/MSWindowsScreenSaver.cpp +++ b/src/lib/platform/MSWindowsScreenSaver.cpp @@ -35,9 +35,9 @@ static const TCHAR* g_isSecureNT = "ScreenSaverIsSecure"; static const TCHAR* g_isSecure9x = "ScreenSaveUsePassword"; static const TCHAR* const g_pathScreenSaverIsSecure[] = { - "Control Panel", - "Desktop", - NULL + "Control Panel", + "Desktop", + NULL }; // @@ -45,312 +45,312 @@ static const TCHAR* const g_pathScreenSaverIsSecure[] = { // MSWindowsScreenSaver::MSWindowsScreenSaver() : - m_wasSecure(false), - m_wasSecureAnInt(false), - m_process(NULL), - m_watch(NULL), - m_threadID(0), - m_active(false) + m_wasSecure(false), + m_wasSecureAnInt(false), + m_process(NULL), + m_watch(NULL), + m_threadID(0), + m_active(false) { - // check if screen saver is enabled - SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); + // check if screen saver is enabled + SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); } MSWindowsScreenSaver::~MSWindowsScreenSaver() { - unwatchProcess(); + unwatchProcess(); } bool MSWindowsScreenSaver::checkStarted(UINT msg, WPARAM wParam, LPARAM lParam) { - // if already started then say it didn't just start - if (m_active) { - return false; - } + // if already started then say it didn't just start + if (m_active) { + return false; + } - // screen saver may have started. look for it and get - // the process. if we can't find it then assume it - // didn't really start. we wait a moment before - // looking to give the screen saver a chance to start. - // this shouldn't be a problem since we only get here - // if the screen saver wants to kick in, meaning that - // the system is idle or the user deliberately started - // the screen saver. - Sleep(250); + // screen saver may have started. look for it and get + // the process. if we can't find it then assume it + // didn't really start. we wait a moment before + // looking to give the screen saver a chance to start. + // this shouldn't be a problem since we only get here + // if the screen saver wants to kick in, meaning that + // the system is idle or the user deliberately started + // the screen saver. + Sleep(250); - // set parameters common to all screen saver handling - m_threadID = GetCurrentThreadId(); - m_msg = msg; - m_wParam = wParam; - m_lParam = lParam; + // set parameters common to all screen saver handling + m_threadID = GetCurrentThreadId(); + m_msg = msg; + m_wParam = wParam; + m_lParam = lParam; - // on the windows nt family we wait for the desktop to - // change until it's neither the Screen-Saver desktop - // nor a desktop we can't open (the login desktop). - // since windows will send the request-to-start-screen- - // saver message even when the screen saver is disabled - // we first check that the screen saver is indeed active - // before watching for it to stop. - if (!isActive()) { - LOG((CLOG_DEBUG2 "can't open screen saver desktop")); - return false; - } + // on the windows nt family we wait for the desktop to + // change until it's neither the Screen-Saver desktop + // nor a desktop we can't open (the login desktop). + // since windows will send the request-to-start-screen- + // saver message even when the screen saver is disabled + // we first check that the screen saver is indeed active + // before watching for it to stop. + if (!isActive()) { + LOG((CLOG_DEBUG2 "can't open screen saver desktop")); + return false; + } - watchDesktop(); - return true; + watchDesktop(); + return true; } void MSWindowsScreenSaver::enable() { - SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, m_wasEnabled, 0, 0); + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, m_wasEnabled, 0, 0); - // restore password protection - if (m_wasSecure) { - setSecure(true, m_wasSecureAnInt); - } + // restore password protection + if (m_wasSecure) { + setSecure(true, m_wasSecureAnInt); + } - // restore display power down - ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); + // restore display power down + ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); } void MSWindowsScreenSaver::disable() { - SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); - SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, 0, 0); + SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, FALSE, 0, 0); - // disable password protected screensaver - m_wasSecure = isSecure(&m_wasSecureAnInt); - if (m_wasSecure) { - setSecure(false, m_wasSecureAnInt); - } + // disable password protected screensaver + m_wasSecure = isSecure(&m_wasSecureAnInt); + if (m_wasSecure) { + setSecure(false, m_wasSecureAnInt); + } - // disable display power down - ArchMiscWindows::addBusyState(ArchMiscWindows::kDISPLAY); + // disable display power down + ArchMiscWindows::addBusyState(ArchMiscWindows::kDISPLAY); } void MSWindowsScreenSaver::activate() { - // don't activate if already active - if (!isActive()) { - // activate - HWND hwnd = GetForegroundWindow(); - if (hwnd != NULL) { - PostMessage(hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); - } - else { - // no foreground window. pretend we got the event instead. - DefWindowProc(NULL, WM_SYSCOMMAND, SC_SCREENSAVE, 0); - } + // don't activate if already active + if (!isActive()) { + // activate + HWND hwnd = GetForegroundWindow(); + if (hwnd != NULL) { + PostMessage(hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0); + } + else { + // no foreground window. pretend we got the event instead. + DefWindowProc(NULL, WM_SYSCOMMAND, SC_SCREENSAVE, 0); + } - // restore power save when screen saver activates - ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); - } + // restore power save when screen saver activates + ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); + } } void MSWindowsScreenSaver::deactivate() { - bool killed = false; + bool killed = false; - // NT runs screen saver in another desktop - HDESK desktop = OpenDesktop("Screen-saver", 0, FALSE, - DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); - if (desktop != NULL) { - EnumDesktopWindows(desktop, - &MSWindowsScreenSaver::killScreenSaverFunc, - reinterpret_cast(&killed)); - CloseDesktop(desktop); - } + // NT runs screen saver in another desktop + HDESK desktop = OpenDesktop("Screen-saver", 0, FALSE, + DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); + if (desktop != NULL) { + EnumDesktopWindows(desktop, + &MSWindowsScreenSaver::killScreenSaverFunc, + reinterpret_cast(&killed)); + CloseDesktop(desktop); + } - // if above failed or wasn't tried, try the windows 95 way - if (!killed) { - // find screen saver window and close it - HWND hwnd = FindWindow("WindowsScreenSaverClass", NULL); - if (hwnd == NULL) { - // win2k may use a different class - hwnd = FindWindow("Default Screen Saver", NULL); - } - if (hwnd != NULL) { - PostMessage(hwnd, WM_CLOSE, 0, 0); - } - } + // if above failed or wasn't tried, try the windows 95 way + if (!killed) { + // find screen saver window and close it + HWND hwnd = FindWindow("WindowsScreenSaverClass", NULL); + if (hwnd == NULL) { + // win2k may use a different class + hwnd = FindWindow("Default Screen Saver", NULL); + } + if (hwnd != NULL) { + PostMessage(hwnd, WM_CLOSE, 0, 0); + } + } - // force timer to restart - SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); - SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, - !m_wasEnabled, 0, SPIF_SENDWININICHANGE); - SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, - m_wasEnabled, 0, SPIF_SENDWININICHANGE); + // force timer to restart + SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &m_wasEnabled, 0); + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, + !m_wasEnabled, 0, SPIF_SENDWININICHANGE); + SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, + m_wasEnabled, 0, SPIF_SENDWININICHANGE); - // disable display power down - ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); + // disable display power down + ArchMiscWindows::removeBusyState(ArchMiscWindows::kDISPLAY); } bool MSWindowsScreenSaver::isActive() const { - BOOL running; - SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, 0); - return (running != FALSE); + BOOL running; + SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, 0); + return (running != FALSE); } BOOL CALLBACK MSWindowsScreenSaver::killScreenSaverFunc(HWND hwnd, LPARAM arg) { - if (IsWindowVisible(hwnd)) { - HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE); - if (instance != MSWindowsScreen::getWindowInstance()) { - PostMessage(hwnd, WM_CLOSE, 0, 0); - *reinterpret_cast(arg) = true; - } - } - return TRUE; + if (IsWindowVisible(hwnd)) { + HINSTANCE instance = (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE); + if (instance != MSWindowsScreen::getWindowInstance()) { + PostMessage(hwnd, WM_CLOSE, 0, 0); + *reinterpret_cast(arg) = true; + } + } + return TRUE; } void MSWindowsScreenSaver::watchDesktop() { - // stop watching previous process/desktop - unwatchProcess(); + // stop watching previous process/desktop + unwatchProcess(); - // watch desktop in another thread - LOG((CLOG_DEBUG "watching screen saver desktop")); - m_active = true; - m_watch = new Thread(new TMethodJob(this, - &MSWindowsScreenSaver::watchDesktopThread)); + // watch desktop in another thread + LOG((CLOG_DEBUG "watching screen saver desktop")); + m_active = true; + m_watch = new Thread(new TMethodJob(this, + &MSWindowsScreenSaver::watchDesktopThread)); } void MSWindowsScreenSaver::watchProcess(HANDLE process) { - // stop watching previous process/desktop - unwatchProcess(); + // stop watching previous process/desktop + unwatchProcess(); - // watch new process in another thread - if (process != NULL) { - LOG((CLOG_DEBUG "watching screen saver process")); - m_process = process; - m_active = true; - m_watch = new Thread(new TMethodJob(this, - &MSWindowsScreenSaver::watchProcessThread)); - } + // watch new process in another thread + if (process != NULL) { + LOG((CLOG_DEBUG "watching screen saver process")); + m_process = process; + m_active = true; + m_watch = new Thread(new TMethodJob(this, + &MSWindowsScreenSaver::watchProcessThread)); + } } void MSWindowsScreenSaver::unwatchProcess() { - if (m_watch != NULL) { - LOG((CLOG_DEBUG "stopped watching screen saver process/desktop")); - m_watch->cancel(); - m_watch->wait(); - delete m_watch; - m_watch = NULL; - m_active = false; - } - if (m_process != NULL) { - CloseHandle(m_process); - m_process = NULL; - } + if (m_watch != NULL) { + LOG((CLOG_DEBUG "stopped watching screen saver process/desktop")); + m_watch->cancel(); + m_watch->wait(); + delete m_watch; + m_watch = NULL; + m_active = false; + } + if (m_process != NULL) { + CloseHandle(m_process); + m_process = NULL; + } } void MSWindowsScreenSaver::watchDesktopThread(void*) { - DWORD reserved = 0; - TCHAR* name = NULL; + DWORD reserved = 0; + TCHAR* name = NULL; - for (;;) { - // wait a bit - ARCH->sleep(0.2); + for (;;) { + // wait a bit + ARCH->sleep(0.2); - BOOL running; - SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, 0); - if (running) { - continue; - } + BOOL running; + SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &running, 0); + if (running) { + continue; + } - // send screen saver deactivation message - m_active = false; - PostThreadMessage(m_threadID, m_msg, m_wParam, m_lParam); - return; - } + // send screen saver deactivation message + m_active = false; + PostThreadMessage(m_threadID, m_msg, m_wParam, m_lParam); + return; + } } void MSWindowsScreenSaver::watchProcessThread(void*) { - for (;;) { - Thread::testCancel(); - if (WaitForSingleObject(m_process, 50) == WAIT_OBJECT_0) { - // process terminated - LOG((CLOG_DEBUG "screen saver died")); + for (;;) { + Thread::testCancel(); + if (WaitForSingleObject(m_process, 50) == WAIT_OBJECT_0) { + // process terminated + LOG((CLOG_DEBUG "screen saver died")); - // send screen saver deactivation message - m_active = false; - PostThreadMessage(m_threadID, m_msg, m_wParam, m_lParam); - return; - } - } + // send screen saver deactivation message + m_active = false; + PostThreadMessage(m_threadID, m_msg, m_wParam, m_lParam); + return; + } + } } void MSWindowsScreenSaver::setSecure(bool secure, bool saveSecureAsInt) { - HKEY hkey = - ArchMiscWindows::addKey(HKEY_CURRENT_USER, g_pathScreenSaverIsSecure); - if (hkey == NULL) { - return; - } + HKEY hkey = + ArchMiscWindows::addKey(HKEY_CURRENT_USER, g_pathScreenSaverIsSecure); + if (hkey == NULL) { + return; + } - if (saveSecureAsInt) { - ArchMiscWindows::setValue(hkey, g_isSecureNT, secure ? 1 : 0); - } - else { - ArchMiscWindows::setValue(hkey, g_isSecureNT, secure ? "1" : "0"); - } + if (saveSecureAsInt) { + ArchMiscWindows::setValue(hkey, g_isSecureNT, secure ? 1 : 0); + } + else { + ArchMiscWindows::setValue(hkey, g_isSecureNT, secure ? "1" : "0"); + } - ArchMiscWindows::closeKey(hkey); + ArchMiscWindows::closeKey(hkey); } bool MSWindowsScreenSaver::isSecure(bool* wasSecureFlagAnInt) const { - // get the password protection setting key - HKEY hkey = - ArchMiscWindows::openKey(HKEY_CURRENT_USER, g_pathScreenSaverIsSecure); - if (hkey == NULL) { - return false; - } + // get the password protection setting key + HKEY hkey = + ArchMiscWindows::openKey(HKEY_CURRENT_USER, g_pathScreenSaverIsSecure); + if (hkey == NULL) { + return false; + } - // get the value. the value may be an int or a string, depending - // on the version of windows. - bool result; - switch (ArchMiscWindows::typeOfValue(hkey, g_isSecureNT)) { - default: - result = false; - break; + // get the value. the value may be an int or a string, depending + // on the version of windows. + bool result; + switch (ArchMiscWindows::typeOfValue(hkey, g_isSecureNT)) { + default: + result = false; + break; - case ArchMiscWindows::kUINT: { - DWORD value = - ArchMiscWindows::readValueInt(hkey, g_isSecureNT); - *wasSecureFlagAnInt = true; - result = (value != 0); - break; - } + case ArchMiscWindows::kUINT: { + DWORD value = + ArchMiscWindows::readValueInt(hkey, g_isSecureNT); + *wasSecureFlagAnInt = true; + result = (value != 0); + break; + } - case ArchMiscWindows::kSTRING: { - std::string value = - ArchMiscWindows::readValueString(hkey, g_isSecureNT); - *wasSecureFlagAnInt = false; - result = (value != "0"); - break; - } - } + case ArchMiscWindows::kSTRING: { + std::string value = + ArchMiscWindows::readValueString(hkey, g_isSecureNT); + *wasSecureFlagAnInt = false; + result = (value != "0"); + break; + } + } - ArchMiscWindows::closeKey(hkey); - return result; + ArchMiscWindows::closeKey(hkey); + return result; } diff --git a/src/lib/platform/MSWindowsScreenSaver.h b/src/lib/platform/MSWindowsScreenSaver.h index c6fe7bd4..c7441283 100644 --- a/src/lib/platform/MSWindowsScreenSaver.h +++ b/src/lib/platform/MSWindowsScreenSaver.h @@ -29,61 +29,61 @@ class Thread; //! Microsoft windows screen saver implementation class MSWindowsScreenSaver : public IScreenSaver { public: - MSWindowsScreenSaver(); - virtual ~MSWindowsScreenSaver(); + MSWindowsScreenSaver(); + virtual ~MSWindowsScreenSaver(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Check if screen saver started - /*! - Check if the screen saver really started. Returns false if it - hasn't, true otherwise. When the screen saver stops, \c msg will - be posted to the current thread's message queue with the given - parameters. - */ - bool checkStarted(UINT msg, WPARAM, LPARAM); + //! Check if screen saver started + /*! + Check if the screen saver really started. Returns false if it + hasn't, true otherwise. When the screen saver stops, \c msg will + be posted to the current thread's message queue with the given + parameters. + */ + bool checkStarted(UINT msg, WPARAM, LPARAM); - //@} + //@} - // IScreenSaver overrides - virtual void enable(); - virtual void disable(); - virtual void activate(); - virtual void deactivate(); - virtual bool isActive() const; + // IScreenSaver overrides + virtual void enable(); + virtual void disable(); + virtual void activate(); + virtual void deactivate(); + virtual bool isActive() const; private: - class FindScreenSaverInfo { - public: - HDESK m_desktop; - HWND m_window; - }; + class FindScreenSaverInfo { + public: + HDESK m_desktop; + HWND m_window; + }; - static BOOL CALLBACK killScreenSaverFunc(HWND hwnd, LPARAM lParam); + static BOOL CALLBACK killScreenSaverFunc(HWND hwnd, LPARAM lParam); - void watchDesktop(); - void watchProcess(HANDLE process); - void unwatchProcess(); - void watchDesktopThread(void*); - void watchProcessThread(void*); + void watchDesktop(); + void watchProcess(HANDLE process); + void unwatchProcess(); + void watchDesktopThread(void*); + void watchProcessThread(void*); - void setSecure(bool secure, bool saveSecureAsInt); - bool isSecure(bool* wasSecureAnInt) const; + void setSecure(bool secure, bool saveSecureAsInt); + bool isSecure(bool* wasSecureAnInt) const; private: - BOOL m_wasEnabled; - bool m_wasSecure; - bool m_wasSecureAnInt; + BOOL m_wasEnabled; + bool m_wasSecure; + bool m_wasSecureAnInt; - HANDLE m_process; - Thread* m_watch; - DWORD m_threadID; - UINT m_msg; - WPARAM m_wParam; - LPARAM m_lParam; + HANDLE m_process; + Thread* m_watch; + DWORD m_threadID; + UINT m_msg; + WPARAM m_wParam; + LPARAM m_lParam; - // checkActive state. true if the screen saver is being watched - // for deactivation (and is therefore active). - bool m_active; + // checkActive state. true if the screen saver is being watched + // for deactivation (and is therefore active). + bool m_active; }; diff --git a/src/lib/platform/MSWindowsSession.cpp b/src/lib/platform/MSWindowsSession.cpp index 62bdbba2..9e817b1e 100644 --- a/src/lib/platform/MSWindowsSession.cpp +++ b/src/lib/platform/MSWindowsSession.cpp @@ -24,7 +24,7 @@ #include MSWindowsSession::MSWindowsSession() : - m_activeSessionId(-1) + m_activeSessionId(-1) { } @@ -35,161 +35,161 @@ MSWindowsSession::~MSWindowsSession() bool MSWindowsSession::isProcessInSession(const char* name, PHANDLE process = NULL) { - // first we need to take a snapshot of the running processes - HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (snapshot == INVALID_HANDLE_VALUE) { - LOG((CLOG_ERR "could not get process snapshot")); - throw XArch(new XArchEvalWindows()); - } + // first we need to take a snapshot of the running processes + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) { + LOG((CLOG_ERR "could not get process snapshot")); + throw XArch(new XArchEvalWindows()); + } - PROCESSENTRY32 entry; - entry.dwSize = sizeof(PROCESSENTRY32); + PROCESSENTRY32 entry; + entry.dwSize = sizeof(PROCESSENTRY32); - // get the first process, and if we can't do that then it's - // unlikely we can go any further - BOOL gotEntry = Process32First(snapshot, &entry); - if (!gotEntry) { - LOG((CLOG_ERR "could not get first process entry")); - throw XArch(new XArchEvalWindows()); - } + // get the first process, and if we can't do that then it's + // unlikely we can go any further + BOOL gotEntry = Process32First(snapshot, &entry); + if (!gotEntry) { + LOG((CLOG_ERR "could not get first process entry")); + throw XArch(new XArchEvalWindows()); + } - // used to record process names for debug info - std::list nameList; + // used to record process names for debug info + std::list nameList; - // now just iterate until we can find winlogon.exe pid - DWORD pid = 0; - while(gotEntry) { + // now just iterate until we can find winlogon.exe pid + DWORD pid = 0; + while(gotEntry) { - // make sure we're not checking the system process - if (entry.th32ProcessID != 0) { + // make sure we're not checking the system process + if (entry.th32ProcessID != 0) { - DWORD processSessionId; - BOOL pidToSidRet = ProcessIdToSessionId( - entry.th32ProcessID, &processSessionId); + DWORD processSessionId; + BOOL pidToSidRet = ProcessIdToSessionId( + entry.th32ProcessID, &processSessionId); - if (!pidToSidRet) { - // if we can not acquire session associated with a specified process, - // simply ignore it - LOG((CLOG_ERR "could not get session id for process id %i", entry.th32ProcessID)); - gotEntry = nextProcessEntry(snapshot, &entry); - continue; - } - else { - // only pay attention to processes in the active session - if (processSessionId == m_activeSessionId) { + if (!pidToSidRet) { + // if we can not acquire session associated with a specified process, + // simply ignore it + LOG((CLOG_ERR "could not get session id for process id %i", entry.th32ProcessID)); + gotEntry = nextProcessEntry(snapshot, &entry); + continue; + } + else { + // only pay attention to processes in the active session + if (processSessionId == m_activeSessionId) { - // store the names so we can record them for debug - nameList.push_back(entry.szExeFile); + // store the names so we can record them for debug + nameList.push_back(entry.szExeFile); - if (_stricmp(entry.szExeFile, name) == 0) { - pid = entry.th32ProcessID; - } - } - } + if (_stricmp(entry.szExeFile, name) == 0) { + pid = entry.th32ProcessID; + } + } + } - } + } - // now move on to the next entry (if we're not at the end) - gotEntry = nextProcessEntry(snapshot, &entry); - } + // now move on to the next entry (if we're not at the end) + gotEntry = nextProcessEntry(snapshot, &entry); + } - std::string nameListJoin; - for(std::list::iterator it = nameList.begin(); - it != nameList.end(); it++) { - nameListJoin.append(*it); - nameListJoin.append(", "); - } + std::string nameListJoin; + for(std::list::iterator it = nameList.begin(); + it != nameList.end(); it++) { + nameListJoin.append(*it); + nameListJoin.append(", "); + } - LOG((CLOG_DEBUG "processes in session %d: %s", - m_activeSessionId, nameListJoin.c_str())); + LOG((CLOG_DEBUG "processes in session %d: %s", + m_activeSessionId, nameListJoin.c_str())); - CloseHandle(snapshot); + CloseHandle(snapshot); - if (pid) { - if (process != NULL) { - // now get the process, which we'll use to get the process token. - LOG((CLOG_DEBUG "found %s in session %i", name, m_activeSessionId)); - *process = OpenProcess(MAXIMUM_ALLOWED, FALSE, pid); - } - return true; - } - else { - LOG((CLOG_DEBUG "did not find %s in session %i", name, m_activeSessionId)); - return false; - } + if (pid) { + if (process != NULL) { + // now get the process, which we'll use to get the process token. + LOG((CLOG_DEBUG "found %s in session %i", name, m_activeSessionId)); + *process = OpenProcess(MAXIMUM_ALLOWED, FALSE, pid); + } + return true; + } + else { + LOG((CLOG_DEBUG "did not find %s in session %i", name, m_activeSessionId)); + return false; + } } HANDLE MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security) { - HANDLE sourceToken; - if (!WTSQueryUserToken(m_activeSessionId, &sourceToken)) { - LOG((CLOG_ERR "could not get token from session %d", m_activeSessionId)); - throw XArch(new XArchEvalWindows); - } - - HANDLE newToken; - if (!DuplicateTokenEx( - sourceToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, security, - SecurityImpersonation, TokenPrimary, &newToken)) { + HANDLE sourceToken; + if (!WTSQueryUserToken(m_activeSessionId, &sourceToken)) { + LOG((CLOG_ERR "could not get token from session %d", m_activeSessionId)); + throw XArch(new XArchEvalWindows); + } + + HANDLE newToken; + if (!DuplicateTokenEx( + sourceToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, security, + SecurityImpersonation, TokenPrimary, &newToken)) { - LOG((CLOG_ERR "could not duplicate token")); - throw XArch(new XArchEvalWindows); - } - - LOG((CLOG_DEBUG "duplicated, new token: %i", newToken)); - return newToken; + LOG((CLOG_ERR "could not duplicate token")); + throw XArch(new XArchEvalWindows); + } + + LOG((CLOG_DEBUG "duplicated, new token: %i", newToken)); + return newToken; } BOOL MSWindowsSession::hasChanged() { - return (m_activeSessionId != WTSGetActiveConsoleSessionId()); + return (m_activeSessionId != WTSGetActiveConsoleSessionId()); } void MSWindowsSession::updateActiveSession() { - m_activeSessionId = WTSGetActiveConsoleSessionId(); + m_activeSessionId = WTSGetActiveConsoleSessionId(); } BOOL MSWindowsSession::nextProcessEntry(HANDLE snapshot, LPPROCESSENTRY32 entry) { - BOOL gotEntry = Process32Next(snapshot, entry); - if (!gotEntry) { + BOOL gotEntry = Process32Next(snapshot, entry); + if (!gotEntry) { - DWORD err = GetLastError(); - if (err != ERROR_NO_MORE_FILES) { + DWORD err = GetLastError(); + if (err != ERROR_NO_MORE_FILES) { - // only worry about error if it's not the end of the snapshot - LOG((CLOG_ERR "could not get next process entry")); - throw XArch(new XArchEvalWindows()); - } - } + // only worry about error if it's not the end of the snapshot + LOG((CLOG_ERR "could not get next process entry")); + throw XArch(new XArchEvalWindows()); + } + } - return gotEntry; + return gotEntry; } String MSWindowsSession::getActiveDesktopName() { - String result; - try { - HDESK hd = OpenInputDesktop(0, TRUE, GENERIC_READ); - if (hd != NULL) { - DWORD size; - GetUserObjectInformation(hd, UOI_NAME, NULL, 0, &size); - TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR)); - GetUserObjectInformation(hd, UOI_NAME, name, size, &size); - result = name; - CloseDesktop(hd); - } - } - catch (std::exception error) { - LOG((CLOG_ERR "failed to get active desktop name: %s", error.what())); - } + String result; + try { + HDESK hd = OpenInputDesktop(0, TRUE, GENERIC_READ); + if (hd != NULL) { + DWORD size; + GetUserObjectInformation(hd, UOI_NAME, NULL, 0, &size); + TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR)); + GetUserObjectInformation(hd, UOI_NAME, name, size, &size); + result = name; + CloseDesktop(hd); + } + } + catch (std::exception error) { + LOG((CLOG_ERR "failed to get active desktop name: %s", error.what())); + } - return result; + return result; } diff --git a/src/lib/platform/MSWindowsSession.h b/src/lib/platform/MSWindowsSession.h index 8646fa52..8c48117d 100644 --- a/src/lib/platform/MSWindowsSession.h +++ b/src/lib/platform/MSWindowsSession.h @@ -25,28 +25,28 @@ class MSWindowsSession { public: - MSWindowsSession(); - ~MSWindowsSession(); + MSWindowsSession(); + ~MSWindowsSession(); - //! - /*! - Returns true if the session ID has changed since updateActiveSession was called. - */ - BOOL hasChanged(); - - bool isProcessInSession(const char* name, PHANDLE process); + //! + /*! + Returns true if the session ID has changed since updateActiveSession was called. + */ + BOOL hasChanged(); + + bool isProcessInSession(const char* name, PHANDLE process); - HANDLE getUserToken(LPSECURITY_ATTRIBUTES security); + HANDLE getUserToken(LPSECURITY_ATTRIBUTES security); - DWORD getActiveSessionId() { return m_activeSessionId; } + DWORD getActiveSessionId() { return m_activeSessionId; } - void updateActiveSession(); + void updateActiveSession(); - String getActiveDesktopName(); + String getActiveDesktopName(); private: - BOOL nextProcessEntry(HANDLE snapshot, LPPROCESSENTRY32 entry); + BOOL nextProcessEntry(HANDLE snapshot, LPPROCESSENTRY32 entry); private: - DWORD m_activeSessionId; + DWORD m_activeSessionId; }; diff --git a/src/lib/platform/MSWindowsUtil.cpp b/src/lib/platform/MSWindowsUtil.cpp index c5523a05..811c6be2 100644 --- a/src/lib/platform/MSWindowsUtil.cpp +++ b/src/lib/platform/MSWindowsUtil.cpp @@ -29,53 +29,53 @@ String MSWindowsUtil::getString(HINSTANCE instance, DWORD id) { - char buffer[1024]; - int size = static_cast(sizeof(buffer) / sizeof(buffer[0])); - char* msg = buffer; + char buffer[1024]; + int size = static_cast(sizeof(buffer) / sizeof(buffer[0])); + char* msg = buffer; - // load string - int n = LoadString(instance, id, msg, size); - msg[n] = '\0'; - if (n < size) { - return msg; - } + // load string + int n = LoadString(instance, id, msg, size); + msg[n] = '\0'; + if (n < size) { + return msg; + } - // not enough buffer space. keep trying larger buffers until - // we get the whole string. - msg = NULL; - do { - size <<= 1; - delete[] msg; - char* msg = new char[size]; - n = LoadString(instance, id, msg, size); - } while (n == size); - msg[n] = '\0'; + // not enough buffer space. keep trying larger buffers until + // we get the whole string. + msg = NULL; + do { + size <<= 1; + delete[] msg; + char* msg = new char[size]; + n = LoadString(instance, id, msg, size); + } while (n == size); + msg[n] = '\0'; - String result(msg); - delete[] msg; - return result; + String result(msg); + delete[] msg; + return result; } String MSWindowsUtil::getErrorString(HINSTANCE hinstance, DWORD error, DWORD id) { - char* buffer; - if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_IGNORE_INSERTS | - FORMAT_MESSAGE_FROM_SYSTEM, - 0, - error, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR)&buffer, - 0, - NULL) == 0) { - String errorString = synergy::string::sprintf("%d", error); - return synergy::string::format(getString(hinstance, id).c_str(), - errorString.c_str()); - } - else { - String result(buffer); - LocalFree(buffer); - return result; - } + char* buffer; + if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_IGNORE_INSERTS | + FORMAT_MESSAGE_FROM_SYSTEM, + 0, + error, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR)&buffer, + 0, + NULL) == 0) { + String errorString = synergy::string::sprintf("%d", error); + return synergy::string::format(getString(hinstance, id).c_str(), + errorString.c_str()); + } + else { + String result(buffer); + LocalFree(buffer); + return result; + } } diff --git a/src/lib/platform/MSWindowsUtil.h b/src/lib/platform/MSWindowsUtil.h index 55033da0..275288b4 100644 --- a/src/lib/platform/MSWindowsUtil.h +++ b/src/lib/platform/MSWindowsUtil.h @@ -25,16 +25,16 @@ class MSWindowsUtil { public: - //! Get message string - /*! - Gets a string for \p id from the string table of \p instance. - */ - static String getString(HINSTANCE instance, DWORD id); + //! Get message string + /*! + Gets a string for \p id from the string table of \p instance. + */ + static String getString(HINSTANCE instance, DWORD id); - //! Get error string - /*! - Gets a system error message for \p error. If the error cannot be - found return the string for \p id, replacing ${1} with \p error. - */ - static String getErrorString(HINSTANCE, DWORD error, DWORD id); + //! Get error string + /*! + Gets a system error message for \p error. If the error cannot be + found return the string for \p id, replacing ${1} with \p error. + */ + static String getErrorString(HINSTANCE, DWORD error, DWORD id); }; diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index 4af95b08..3f37d368 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -39,7 +39,7 @@ #define MAXIMUM_WAIT_TIME 3 enum { - kOutputBufferSize = 4096 + kOutputBufferSize = 4096 }; typedef VOID (WINAPI *SendSas)(BOOL asUser); @@ -47,542 +47,542 @@ typedef VOID (WINAPI *SendSas)(BOOL asUser); const char g_activeDesktop[] = {"activeDesktop:"}; MSWindowsWatchdog::MSWindowsWatchdog( - bool autoDetectCommand, - IpcServer& ipcServer, - IpcLogOutputter& ipcLogOutputter) : - m_thread(NULL), - m_autoDetectCommand(autoDetectCommand), - m_monitoring(true), - m_commandChanged(false), - m_stdOutWrite(NULL), - m_stdOutRead(NULL), - m_ipcServer(ipcServer), - m_ipcLogOutputter(ipcLogOutputter), - m_elevateProcess(false), - m_processFailures(0), - m_processRunning(false), - m_fileLogOutputter(NULL), - m_autoElevated(false), - m_ready(false) + bool autoDetectCommand, + IpcServer& ipcServer, + IpcLogOutputter& ipcLogOutputter) : + m_thread(NULL), + m_autoDetectCommand(autoDetectCommand), + m_monitoring(true), + m_commandChanged(false), + m_stdOutWrite(NULL), + m_stdOutRead(NULL), + m_ipcServer(ipcServer), + m_ipcLogOutputter(ipcLogOutputter), + m_elevateProcess(false), + m_processFailures(0), + m_processRunning(false), + m_fileLogOutputter(NULL), + m_autoElevated(false), + m_ready(false) { - m_mutex = ARCH->newMutex(); - m_condVar = ARCH->newCondVar(); + m_mutex = ARCH->newMutex(); + m_condVar = ARCH->newCondVar(); } MSWindowsWatchdog::~MSWindowsWatchdog() { - if (m_condVar != NULL) { - ARCH->closeCondVar(m_condVar); - } + if (m_condVar != NULL) { + ARCH->closeCondVar(m_condVar); + } - if (m_mutex != NULL) { - ARCH->closeMutex(m_mutex); - } + if (m_mutex != NULL) { + ARCH->closeMutex(m_mutex); + } } void MSWindowsWatchdog::startAsync() { - m_thread = new Thread(new TMethodJob( - this, &MSWindowsWatchdog::mainLoop, nullptr)); + m_thread = new Thread(new TMethodJob( + this, &MSWindowsWatchdog::mainLoop, nullptr)); - m_outputThread = new Thread(new TMethodJob( - this, &MSWindowsWatchdog::outputLoop, nullptr)); + m_outputThread = new Thread(new TMethodJob( + this, &MSWindowsWatchdog::outputLoop, nullptr)); } void MSWindowsWatchdog::stop() { - m_monitoring = false; - - m_thread->wait(5); - delete m_thread; + m_monitoring = false; + + m_thread->wait(5); + delete m_thread; - m_outputThread->wait(5); - delete m_outputThread; + m_outputThread->wait(5); + delete m_outputThread; } HANDLE MSWindowsWatchdog::duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES security) { - HANDLE sourceToken; + HANDLE sourceToken; - BOOL tokenRet = OpenProcessToken( - process, - TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, - &sourceToken); + BOOL tokenRet = OpenProcessToken( + process, + TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, + &sourceToken); - if (!tokenRet) { - LOG((CLOG_ERR "could not open token, process handle: %d", process)); - throw XArch(new XArchEvalWindows()); - } - - LOG((CLOG_DEBUG "got token %i, duplicating", sourceToken)); + if (!tokenRet) { + LOG((CLOG_ERR "could not open token, process handle: %d", process)); + throw XArch(new XArchEvalWindows()); + } + + LOG((CLOG_DEBUG "got token %i, duplicating", sourceToken)); - HANDLE newToken; - BOOL duplicateRet = DuplicateTokenEx( - sourceToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, security, - SecurityImpersonation, TokenPrimary, &newToken); + HANDLE newToken; + BOOL duplicateRet = DuplicateTokenEx( + sourceToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, security, + SecurityImpersonation, TokenPrimary, &newToken); - if (!duplicateRet) { - LOG((CLOG_ERR "could not duplicate token %i", sourceToken)); - throw XArch(new XArchEvalWindows()); - } - - LOG((CLOG_DEBUG "duplicated, new token: %i", newToken)); - return newToken; + if (!duplicateRet) { + LOG((CLOG_ERR "could not duplicate token %i", sourceToken)); + throw XArch(new XArchEvalWindows()); + } + + LOG((CLOG_DEBUG "duplicated, new token: %i", newToken)); + return newToken; } HANDLE MSWindowsWatchdog::getUserToken(LPSECURITY_ATTRIBUTES security) { - // always elevate if we are at the vista/7 login screen. we could also - // elevate for the uac dialog (consent.exe) but this would be pointless, - // since synergy would re-launch as non-elevated after the desk switch, - // and so would be unusable with the new elevated process taking focus. - if (m_elevateProcess - || m_autoElevated - || m_session.isProcessInSession("logonui.exe", NULL)) { - - LOG((CLOG_DEBUG "getting elevated token, %s", - (m_elevateProcess ? "elevation required" : "at login screen"))); - - HANDLE process; - if (!m_session.isProcessInSession("winlogon.exe", &process)) { - throw XMSWindowsWatchdogError("cannot get user token without winlogon.exe"); - } + // always elevate if we are at the vista/7 login screen. we could also + // elevate for the uac dialog (consent.exe) but this would be pointless, + // since synergy would re-launch as non-elevated after the desk switch, + // and so would be unusable with the new elevated process taking focus. + if (m_elevateProcess + || m_autoElevated + || m_session.isProcessInSession("logonui.exe", NULL)) { + + LOG((CLOG_DEBUG "getting elevated token, %s", + (m_elevateProcess ? "elevation required" : "at login screen"))); + + HANDLE process; + if (!m_session.isProcessInSession("winlogon.exe", &process)) { + throw XMSWindowsWatchdogError("cannot get user token without winlogon.exe"); + } - return duplicateProcessToken(process, security); - } - else { - LOG((CLOG_DEBUG "getting non-elevated token")); - return m_session.getUserToken(security); - } + return duplicateProcessToken(process, security); + } + else { + LOG((CLOG_DEBUG "getting non-elevated token")); + return m_session.getUserToken(security); + } } void MSWindowsWatchdog::mainLoop(void*) { - shutdownExistingProcesses(); + shutdownExistingProcesses(); - SendSas sendSasFunc = NULL; - HINSTANCE sasLib = LoadLibrary("sas.dll"); - if (sasLib) { - LOG((CLOG_DEBUG "found sas.dll")); - sendSasFunc = (SendSas)GetProcAddress(sasLib, "SendSAS"); - } + SendSas sendSasFunc = NULL; + HINSTANCE sasLib = LoadLibrary("sas.dll"); + if (sasLib) { + LOG((CLOG_DEBUG "found sas.dll")); + sendSasFunc = (SendSas)GetProcAddress(sasLib, "SendSAS"); + } - SECURITY_ATTRIBUTES saAttr; - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; + SECURITY_ATTRIBUTES saAttr; + saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); + saAttr.bInheritHandle = TRUE; + saAttr.lpSecurityDescriptor = NULL; - if (!CreatePipe(&m_stdOutRead, &m_stdOutWrite, &saAttr, 0)) { - throw XArch(new XArchEvalWindows()); - } + if (!CreatePipe(&m_stdOutRead, &m_stdOutWrite, &saAttr, 0)) { + throw XArch(new XArchEvalWindows()); + } - ZeroMemory(&m_processInfo, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&m_processInfo, sizeof(PROCESS_INFORMATION)); - while (m_monitoring) { - try { + while (m_monitoring) { + try { - if (m_processRunning && getCommand().empty()) { - LOG((CLOG_INFO "process started but command is empty, shutting down")); - shutdownExistingProcesses(); - m_processRunning = false; - continue; - } + if (m_processRunning && getCommand().empty()) { + LOG((CLOG_INFO "process started but command is empty, shutting down")); + shutdownExistingProcesses(); + m_processRunning = false; + continue; + } - if (m_processFailures != 0) { - // increasing backoff period, maximum of 10 seconds. - int timeout = (m_processFailures * 2) < 10 ? (m_processFailures * 2) : 10; - LOG((CLOG_INFO "backing off, wait=%ds, failures=%d", timeout, m_processFailures)); - ARCH->sleep(timeout); - } - - if (!getCommand().empty() && ((m_processFailures != 0) || m_session.hasChanged() || m_commandChanged)) { - startProcess(); - } + if (m_processFailures != 0) { + // increasing backoff period, maximum of 10 seconds. + int timeout = (m_processFailures * 2) < 10 ? (m_processFailures * 2) : 10; + LOG((CLOG_INFO "backing off, wait=%ds, failures=%d", timeout, m_processFailures)); + ARCH->sleep(timeout); + } + + if (!getCommand().empty() && ((m_processFailures != 0) || m_session.hasChanged() || m_commandChanged)) { + startProcess(); + } - if (m_processRunning && !isProcessActive()) { + if (m_processRunning && !isProcessActive()) { - m_processFailures++; - m_processRunning = false; - - LOG((CLOG_WARN "detected application not running, pid=%d", - m_processInfo.dwProcessId)); - } + m_processFailures++; + m_processRunning = false; + + LOG((CLOG_WARN "detected application not running, pid=%d", + m_processInfo.dwProcessId)); + } - if (sendSasFunc != NULL) { + if (sendSasFunc != NULL) { - HANDLE sendSasEvent = CreateEvent(NULL, FALSE, FALSE, "Global\\SendSAS"); - if (sendSasEvent != NULL) { + HANDLE sendSasEvent = CreateEvent(NULL, FALSE, FALSE, "Global\\SendSAS"); + if (sendSasEvent != NULL) { - // use SendSAS event to wait for next session (timeout 1 second). - if (WaitForSingleObject(sendSasEvent, 1000) == WAIT_OBJECT_0) { - LOG((CLOG_DEBUG "calling SendSAS")); - sendSasFunc(FALSE); - } + // use SendSAS event to wait for next session (timeout 1 second). + if (WaitForSingleObject(sendSasEvent, 1000) == WAIT_OBJECT_0) { + LOG((CLOG_DEBUG "calling SendSAS")); + sendSasFunc(FALSE); + } - CloseHandle(sendSasEvent); - continue; - } - } + CloseHandle(sendSasEvent); + continue; + } + } - // if the sas event failed, wait by sleeping. - ARCH->sleep(1); - - } - catch (std::exception& e) { - LOG((CLOG_ERR "failed to launch, error: %s", e.what())); - m_processFailures++; - m_processRunning = false; - continue; - } - catch (...) { - LOG((CLOG_ERR "failed to launch, unknown error.")); - m_processFailures++; - m_processRunning = false; - continue; - } - } + // if the sas event failed, wait by sleeping. + ARCH->sleep(1); + + } + catch (std::exception& e) { + LOG((CLOG_ERR "failed to launch, error: %s", e.what())); + m_processFailures++; + m_processRunning = false; + continue; + } + catch (...) { + LOG((CLOG_ERR "failed to launch, unknown error.")); + m_processFailures++; + m_processRunning = false; + continue; + } + } - if (m_processRunning) { - LOG((CLOG_DEBUG "terminated running process on exit")); - shutdownProcess(m_processInfo.hProcess, m_processInfo.dwProcessId, 20); - } - - LOG((CLOG_DEBUG "watchdog main thread finished")); + if (m_processRunning) { + LOG((CLOG_DEBUG "terminated running process on exit")); + shutdownProcess(m_processInfo.hProcess, m_processInfo.dwProcessId, 20); + } + + LOG((CLOG_DEBUG "watchdog main thread finished")); } bool MSWindowsWatchdog::isProcessActive() { - DWORD exitCode; - GetExitCodeProcess(m_processInfo.hProcess, &exitCode); - return exitCode == STILL_ACTIVE; + DWORD exitCode; + GetExitCodeProcess(m_processInfo.hProcess, &exitCode); + return exitCode == STILL_ACTIVE; } void MSWindowsWatchdog::setFileLogOutputter(FileLogOutputter* outputter) { - m_fileLogOutputter = outputter; + m_fileLogOutputter = outputter; } void MSWindowsWatchdog::startProcess() { - if (m_command.empty()) { - throw XMSWindowsWatchdogError("cannot start process, command is empty"); - } + if (m_command.empty()) { + throw XMSWindowsWatchdogError("cannot start process, command is empty"); + } - m_commandChanged = false; + m_commandChanged = false; - if (m_processRunning) { - LOG((CLOG_DEBUG "closing existing process to make way for new one")); - shutdownProcess(m_processInfo.hProcess, m_processInfo.dwProcessId, 20); - m_processRunning = false; - } + if (m_processRunning) { + LOG((CLOG_DEBUG "closing existing process to make way for new one")); + shutdownProcess(m_processInfo.hProcess, m_processInfo.dwProcessId, 20); + m_processRunning = false; + } - m_session.updateActiveSession(); + m_session.updateActiveSession(); - SECURITY_ATTRIBUTES sa; - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + SECURITY_ATTRIBUTES sa; + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); - getActiveDesktop(&sa); + getActiveDesktop(&sa); - ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); - HANDLE userToken = getUserToken(&sa); - m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess; - m_autoElevated = false; + ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES)); + HANDLE userToken = getUserToken(&sa); + m_elevateProcess = m_autoElevated ? m_autoElevated : m_elevateProcess; + m_autoElevated = false; - // patch by Jack Zhou and Henry Tung - // set UIAccess to fix Windows 8 GUI interaction - // http://symless.com/spit/issues/details/3338/#c70 - DWORD uiAccess = 1; - SetTokenInformation(userToken, TokenUIAccess, &uiAccess, sizeof(DWORD)); + // patch by Jack Zhou and Henry Tung + // set UIAccess to fix Windows 8 GUI interaction + // http://symless.com/spit/issues/details/3338/#c70 + DWORD uiAccess = 1; + SetTokenInformation(userToken, TokenUIAccess, &uiAccess, sizeof(DWORD)); - BOOL createRet = doStartProcess(m_command, userToken, &sa); + BOOL createRet = doStartProcess(m_command, userToken, &sa); - if (!createRet) { - LOG((CLOG_ERR "could not launch")); - DWORD exitCode = 0; - GetExitCodeProcess(m_processInfo.hProcess, &exitCode); - LOG((CLOG_ERR "exit code: %d", exitCode)); - throw XArch(new XArchEvalWindows); - } - else { - // wait for program to fail. - ARCH->sleep(1); - if (!isProcessActive()) { - throw XMSWindowsWatchdogError("process immediately stopped"); - } + if (!createRet) { + LOG((CLOG_ERR "could not launch")); + DWORD exitCode = 0; + GetExitCodeProcess(m_processInfo.hProcess, &exitCode); + LOG((CLOG_ERR "exit code: %d", exitCode)); + throw XArch(new XArchEvalWindows); + } + else { + // wait for program to fail. + ARCH->sleep(1); + if (!isProcessActive()) { + throw XMSWindowsWatchdogError("process immediately stopped"); + } - m_processRunning = true; - m_processFailures = 0; + m_processRunning = true; + m_processFailures = 0; - LOG((CLOG_DEBUG "started process, session=%i, elevated: %s, command=%s", - m_session.getActiveSessionId(), - m_elevateProcess ? "yes" : "no", - m_command.c_str())); - } + LOG((CLOG_DEBUG "started process, session=%i, elevated: %s, command=%s", + m_session.getActiveSessionId(), + m_elevateProcess ? "yes" : "no", + m_command.c_str())); + } } BOOL MSWindowsWatchdog::doStartProcess(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa) { - // clear, as we're reusing process info struct - ZeroMemory(&m_processInfo, sizeof(PROCESS_INFORMATION)); + // clear, as we're reusing process info struct + ZeroMemory(&m_processInfo, sizeof(PROCESS_INFORMATION)); - STARTUPINFO si; - ZeroMemory(&si, sizeof(STARTUPINFO)); - si.cb = sizeof(STARTUPINFO); - si.lpDesktop = "winsta0\\Default"; // TODO: maybe this should be \winlogon if we have logonui.exe? - si.hStdError = m_stdOutWrite; - si.hStdOutput = m_stdOutWrite; - si.dwFlags |= STARTF_USESTDHANDLES; + STARTUPINFO si; + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + si.lpDesktop = "winsta0\\Default"; // TODO: maybe this should be \winlogon if we have logonui.exe? + si.hStdError = m_stdOutWrite; + si.hStdOutput = m_stdOutWrite; + si.dwFlags |= STARTF_USESTDHANDLES; - LPVOID environment; - BOOL blockRet = CreateEnvironmentBlock(&environment, userToken, FALSE); - if (!blockRet) { - LOG((CLOG_ERR "could not create environment block")); - throw XArch(new XArchEvalWindows); - } + LPVOID environment; + BOOL blockRet = CreateEnvironmentBlock(&environment, userToken, FALSE); + if (!blockRet) { + LOG((CLOG_ERR "could not create environment block")); + throw XArch(new XArchEvalWindows); + } - DWORD creationFlags = - NORMAL_PRIORITY_CLASS | - CREATE_NO_WINDOW | - CREATE_UNICODE_ENVIRONMENT; + DWORD creationFlags = + NORMAL_PRIORITY_CLASS | + CREATE_NO_WINDOW | + CREATE_UNICODE_ENVIRONMENT; - // re-launch in current active user session - LOG((CLOG_INFO "starting new process")); - BOOL createRet = CreateProcessAsUser( - userToken, NULL, LPSTR(command.c_str()), - sa, NULL, TRUE, creationFlags, - environment, NULL, &si, &m_processInfo); + // re-launch in current active user session + LOG((CLOG_INFO "starting new process")); + BOOL createRet = CreateProcessAsUser( + userToken, NULL, LPSTR(command.c_str()), + sa, NULL, TRUE, creationFlags, + environment, NULL, &si, &m_processInfo); - DestroyEnvironmentBlock(environment); - CloseHandle(userToken); + DestroyEnvironmentBlock(environment); + CloseHandle(userToken); - return createRet; + return createRet; } void MSWindowsWatchdog::setCommand(const std::string& command, bool elevate) { - LOG((CLOG_INFO "service command updated")); - m_command = command; - m_elevateProcess = elevate; - m_commandChanged = true; - m_processFailures = 0; + LOG((CLOG_INFO "service command updated")); + m_command = command; + m_elevateProcess = elevate; + m_commandChanged = true; + m_processFailures = 0; } std::string MSWindowsWatchdog::getCommand() const { - if (!m_autoDetectCommand) { - return m_command; - } + if (!m_autoDetectCommand) { + return m_command; + } - // seems like a fairly convoluted way to get the process name - const char* launchName = App::instance().argsBase().m_pname; - std::string args = ARCH->commandLine(); + // seems like a fairly convoluted way to get the process name + const char* launchName = App::instance().argsBase().m_pname; + std::string args = ARCH->commandLine(); - // build up a full command line - std::stringstream cmdTemp; - cmdTemp << launchName << args; + // build up a full command line + std::stringstream cmdTemp; + cmdTemp << launchName << args; - std::string cmd = cmdTemp.str(); + std::string cmd = cmdTemp.str(); - size_t i; - std::string find = "--relaunch"; - while ((i = cmd.find(find)) != std::string::npos) { - cmd.replace(i, find.length(), ""); - } + size_t i; + std::string find = "--relaunch"; + while ((i = cmd.find(find)) != std::string::npos) { + cmd.replace(i, find.length(), ""); + } - return cmd; + return cmd; } void MSWindowsWatchdog::outputLoop(void*) { - // +1 char for \0 - CHAR buffer[kOutputBufferSize + 1]; + // +1 char for \0 + CHAR buffer[kOutputBufferSize + 1]; - while (m_monitoring) { - - DWORD bytesRead; - BOOL success = ReadFile(m_stdOutRead, buffer, kOutputBufferSize, &bytesRead, NULL); + while (m_monitoring) { + + DWORD bytesRead; + BOOL success = ReadFile(m_stdOutRead, buffer, kOutputBufferSize, &bytesRead, NULL); - // assume the process has gone away? slow down - // the reads until another one turns up. - if (!success || bytesRead == 0) { - ARCH->sleep(1); - } - else { - buffer[bytesRead] = '\0'; + // assume the process has gone away? slow down + // the reads until another one turns up. + if (!success || bytesRead == 0) { + ARCH->sleep(1); + } + else { + buffer[bytesRead] = '\0'; - testOutput(buffer); + testOutput(buffer); - m_ipcLogOutputter.write(kINFO, buffer); + m_ipcLogOutputter.write(kINFO, buffer); - if (m_fileLogOutputter != NULL) { - m_fileLogOutputter->write(kINFO, buffer); - } - } - } + if (m_fileLogOutputter != NULL) { + m_fileLogOutputter->write(kINFO, buffer); + } + } + } } void MSWindowsWatchdog::shutdownProcess(HANDLE handle, DWORD pid, int timeout) { - DWORD exitCode; - GetExitCodeProcess(handle, &exitCode); - if (exitCode != STILL_ACTIVE) { - return; - } + DWORD exitCode; + GetExitCodeProcess(handle, &exitCode); + if (exitCode != STILL_ACTIVE) { + return; + } - IpcShutdownMessage shutdown; - m_ipcServer.send(shutdown, kIpcClientNode); + IpcShutdownMessage shutdown; + m_ipcServer.send(shutdown, kIpcClientNode); - // wait for process to exit gracefully. - double start = ARCH->time(); - while (true) { + // wait for process to exit gracefully. + double start = ARCH->time(); + while (true) { - GetExitCodeProcess(handle, &exitCode); - if (exitCode != STILL_ACTIVE) { - // yay, we got a graceful shutdown. there should be no hook in use errors! - LOG((CLOG_INFO "process %d was shutdown gracefully", pid)); - break; - } - else { - - double elapsed = (ARCH->time() - start); - if (elapsed > timeout) { - // if timeout reached, kill forcefully. - // calling TerminateProcess on synergy is very bad! - // it causes the hook DLL to stay loaded in some apps, - // making it impossible to start synergy again. - LOG((CLOG_WARN "shutdown timed out after %d secs, forcefully terminating", (int)elapsed)); - TerminateProcess(handle, kExitSuccess); - break; - } + GetExitCodeProcess(handle, &exitCode); + if (exitCode != STILL_ACTIVE) { + // yay, we got a graceful shutdown. there should be no hook in use errors! + LOG((CLOG_INFO "process %d was shutdown gracefully", pid)); + break; + } + else { + + double elapsed = (ARCH->time() - start); + if (elapsed > timeout) { + // if timeout reached, kill forcefully. + // calling TerminateProcess on synergy is very bad! + // it causes the hook DLL to stay loaded in some apps, + // making it impossible to start synergy again. + LOG((CLOG_WARN "shutdown timed out after %d secs, forcefully terminating", (int)elapsed)); + TerminateProcess(handle, kExitSuccess); + break; + } - ARCH->sleep(1); - } - } + ARCH->sleep(1); + } + } } void MSWindowsWatchdog::shutdownExistingProcesses() { - // first we need to take a snapshot of the running processes - HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); - if (snapshot == INVALID_HANDLE_VALUE) { - LOG((CLOG_ERR "could not get process snapshot")); - throw XArch(new XArchEvalWindows); - } + // first we need to take a snapshot of the running processes + HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if (snapshot == INVALID_HANDLE_VALUE) { + LOG((CLOG_ERR "could not get process snapshot")); + throw XArch(new XArchEvalWindows); + } - PROCESSENTRY32 entry; - entry.dwSize = sizeof(PROCESSENTRY32); + PROCESSENTRY32 entry; + entry.dwSize = sizeof(PROCESSENTRY32); - // get the first process, and if we can't do that then it's - // unlikely we can go any further - BOOL gotEntry = Process32First(snapshot, &entry); - if (!gotEntry) { - LOG((CLOG_ERR "could not get first process entry")); - throw XArch(new XArchEvalWindows); - } + // get the first process, and if we can't do that then it's + // unlikely we can go any further + BOOL gotEntry = Process32First(snapshot, &entry); + if (!gotEntry) { + LOG((CLOG_ERR "could not get first process entry")); + throw XArch(new XArchEvalWindows); + } - // now just iterate until we can find winlogon.exe pid - DWORD pid = 0; - while (gotEntry) { + // now just iterate until we can find winlogon.exe pid + DWORD pid = 0; + while (gotEntry) { - // make sure we're not checking the system process - if (entry.th32ProcessID != 0) { + // make sure we're not checking the system process + if (entry.th32ProcessID != 0) { - if (_stricmp(entry.szExeFile, "synergyc.exe") == 0 || - _stricmp(entry.szExeFile, "synergys.exe") == 0) { - - HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); - shutdownProcess(handle, entry.th32ProcessID, 10); - } - } + if (_stricmp(entry.szExeFile, "synergyc.exe") == 0 || + _stricmp(entry.szExeFile, "synergys.exe") == 0) { + + HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); + shutdownProcess(handle, entry.th32ProcessID, 10); + } + } - // now move on to the next entry (if we're not at the end) - gotEntry = Process32Next(snapshot, &entry); - if (!gotEntry) { + // now move on to the next entry (if we're not at the end) + gotEntry = Process32Next(snapshot, &entry); + if (!gotEntry) { - DWORD err = GetLastError(); - if (err != ERROR_NO_MORE_FILES) { + DWORD err = GetLastError(); + if (err != ERROR_NO_MORE_FILES) { - // only worry about error if it's not the end of the snapshot - LOG((CLOG_ERR "could not get subsiquent process entry")); - throw XArch(new XArchEvalWindows); - } - } - } + // only worry about error if it's not the end of the snapshot + LOG((CLOG_ERR "could not get subsiquent process entry")); + throw XArch(new XArchEvalWindows); + } + } + } - CloseHandle(snapshot); - m_processRunning = false; + CloseHandle(snapshot); + m_processRunning = false; } void MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security) { - String installedDir = ARCH->getInstalledDirectory(); - if (!installedDir.empty()) { - String syntoolCommand; - syntoolCommand.append("\"").append(installedDir).append("\\").append("syntool").append("\""); - syntoolCommand.append(" --get-active-desktop"); + String installedDir = ARCH->getInstalledDirectory(); + if (!installedDir.empty()) { + String syntoolCommand; + syntoolCommand.append("\"").append(installedDir).append("\\").append("syntool").append("\""); + syntoolCommand.append(" --get-active-desktop"); - m_session.updateActiveSession(); - bool elevateProcess = m_elevateProcess; - m_elevateProcess = true; - HANDLE userToken = getUserToken(security); - m_elevateProcess = elevateProcess; + m_session.updateActiveSession(); + bool elevateProcess = m_elevateProcess; + m_elevateProcess = true; + HANDLE userToken = getUserToken(security); + m_elevateProcess = elevateProcess; - BOOL createRet = doStartProcess(syntoolCommand, userToken, security); + BOOL createRet = doStartProcess(syntoolCommand, userToken, security); - if (!createRet) { - DWORD rc = GetLastError(); - RevertToSelf(); - } - else { - LOG((CLOG_DEBUG "launched syntool to check active desktop")); - } + if (!createRet) { + DWORD rc = GetLastError(); + RevertToSelf(); + } + else { + LOG((CLOG_DEBUG "launched syntool to check active desktop")); + } - ARCH->lockMutex(m_mutex); - int waitTime = 0; - while (!m_ready) { - if (waitTime >= MAXIMUM_WAIT_TIME) { - break; - } + ARCH->lockMutex(m_mutex); + int waitTime = 0; + while (!m_ready) { + if (waitTime >= MAXIMUM_WAIT_TIME) { + break; + } - ARCH->waitCondVar(m_condVar, m_mutex, 1.0); - waitTime++; - } - m_ready = false; - ARCH->unlockMutex(m_mutex); - } + ARCH->waitCondVar(m_condVar, m_mutex, 1.0); + waitTime++; + } + m_ready = false; + ARCH->unlockMutex(m_mutex); + } } void MSWindowsWatchdog::testOutput(String buffer) { - // HACK: check standard output seems hacky. - size_t i = buffer.find(g_activeDesktop); - if (i != String::npos) { - size_t s = sizeof(g_activeDesktop); - String defaultDesktop("Default"); - String sub = buffer.substr(i + s - 1, defaultDesktop.size()); - if (sub != defaultDesktop) { - m_autoElevated = true; - } + // HACK: check standard output seems hacky. + size_t i = buffer.find(g_activeDesktop); + if (i != String::npos) { + size_t s = sizeof(g_activeDesktop); + String defaultDesktop("Default"); + String sub = buffer.substr(i + s - 1, defaultDesktop.size()); + if (sub != defaultDesktop) { + m_autoElevated = true; + } - ARCH->lockMutex(m_mutex); - m_ready = true; - ARCH->broadcastCondVar(m_condVar); - ARCH->unlockMutex(m_mutex); - } + ARCH->lockMutex(m_mutex); + m_ready = true; + ARCH->broadcastCondVar(m_condVar); + ARCH->unlockMutex(m_mutex); + } } diff --git a/src/lib/platform/MSWindowsWatchdog.h b/src/lib/platform/MSWindowsWatchdog.h index b6d829d8..76546539 100644 --- a/src/lib/platform/MSWindowsWatchdog.h +++ b/src/lib/platform/MSWindowsWatchdog.h @@ -34,53 +34,53 @@ class FileLogOutputter; class MSWindowsWatchdog { public: - MSWindowsWatchdog( - bool autoDetectCommand, - IpcServer& ipcServer, - IpcLogOutputter& ipcLogOutputter); - virtual ~MSWindowsWatchdog(); + MSWindowsWatchdog( + bool autoDetectCommand, + IpcServer& ipcServer, + IpcLogOutputter& ipcLogOutputter); + virtual ~MSWindowsWatchdog(); - void startAsync(); - std::string getCommand() const; - void setCommand(const std::string& command, bool elevate); - void stop(); - bool isProcessActive(); - void setFileLogOutputter(FileLogOutputter* outputter); + void startAsync(); + std::string getCommand() const; + void setCommand(const std::string& command, bool elevate); + void stop(); + bool isProcessActive(); + void setFileLogOutputter(FileLogOutputter* outputter); private: - void mainLoop(void*); - void outputLoop(void*); - void shutdownProcess(HANDLE handle, DWORD pid, int timeout); - void shutdownExistingProcesses(); - HANDLE duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES security); - HANDLE getUserToken(LPSECURITY_ATTRIBUTES security); - void startProcess(); - BOOL doStartProcess(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa); - void sendSas(); - void getActiveDesktop(LPSECURITY_ATTRIBUTES security); - void testOutput(String buffer); + void mainLoop(void*); + void outputLoop(void*); + void shutdownProcess(HANDLE handle, DWORD pid, int timeout); + void shutdownExistingProcesses(); + HANDLE duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES security); + HANDLE getUserToken(LPSECURITY_ATTRIBUTES security); + void startProcess(); + BOOL doStartProcess(String& command, HANDLE userToken, LPSECURITY_ATTRIBUTES sa); + void sendSas(); + void getActiveDesktop(LPSECURITY_ATTRIBUTES security); + void testOutput(String buffer); private: - Thread* m_thread; - bool m_autoDetectCommand; - std::string m_command; - bool m_monitoring; - bool m_commandChanged; - HANDLE m_stdOutWrite; - HANDLE m_stdOutRead; - Thread* m_outputThread; - IpcServer& m_ipcServer; - IpcLogOutputter& m_ipcLogOutputter; - bool m_elevateProcess; - MSWindowsSession m_session; - PROCESS_INFORMATION m_processInfo; - int m_processFailures; - bool m_processRunning; - FileLogOutputter* m_fileLogOutputter; - bool m_autoElevated; - ArchMutex m_mutex; - ArchCond m_condVar; - bool m_ready; + Thread* m_thread; + bool m_autoDetectCommand; + std::string m_command; + bool m_monitoring; + bool m_commandChanged; + HANDLE m_stdOutWrite; + HANDLE m_stdOutRead; + Thread* m_outputThread; + IpcServer& m_ipcServer; + IpcLogOutputter& m_ipcLogOutputter; + bool m_elevateProcess; + MSWindowsSession m_session; + PROCESS_INFORMATION m_processInfo; + int m_processFailures; + bool m_processRunning; + FileLogOutputter* m_fileLogOutputter; + bool m_autoElevated; + ArchMutex m_mutex; + ArchCond m_condVar; + bool m_ready; }; //! Relauncher error @@ -89,8 +89,8 @@ An error occured in the process watchdog. */ class XMSWindowsWatchdogError : public XSynergy { public: - XMSWindowsWatchdogError(const String& msg) : XSynergy(msg) { } + XMSWindowsWatchdogError(const String& msg) : XSynergy(msg) { } - // XBase overrides - virtual String getWhat() const throw() { return what(); } + // XBase overrides + virtual String getWhat() const throw() { return what(); } }; diff --git a/src/lib/platform/OSXClipboard.cpp b/src/lib/platform/OSXClipboard.cpp index 288b2009..7212175c 100644 --- a/src/lib/platform/OSXClipboard.cpp +++ b/src/lib/platform/OSXClipboard.cpp @@ -31,95 +31,95 @@ // OSXClipboard::OSXClipboard() : - m_time(0), - m_pboard(NULL) + m_time(0), + m_pboard(NULL) { - m_converters.push_back(new OSXClipboardHTMLConverter); - m_converters.push_back(new OSXClipboardBMPConverter); - m_converters.push_back(new OSXClipboardUTF16Converter); - m_converters.push_back(new OSXClipboardTextConverter); + m_converters.push_back(new OSXClipboardHTMLConverter); + m_converters.push_back(new OSXClipboardBMPConverter); + m_converters.push_back(new OSXClipboardUTF16Converter); + m_converters.push_back(new OSXClipboardTextConverter); - OSStatus createErr = PasteboardCreate(kPasteboardClipboard, &m_pboard); - if (createErr != noErr) { - LOG((CLOG_DEBUG "failed to create clipboard reference: error %i", createErr)); - LOG((CLOG_ERR "unable to connect to pasteboard, clipboard sharing disabled", createErr)); - m_pboard = NULL; - return; + OSStatus createErr = PasteboardCreate(kPasteboardClipboard, &m_pboard); + if (createErr != noErr) { + LOG((CLOG_DEBUG "failed to create clipboard reference: error %i", createErr)); + LOG((CLOG_ERR "unable to connect to pasteboard, clipboard sharing disabled", createErr)); + m_pboard = NULL; + return; - } + } - OSStatus syncErr = PasteboardSynchronize(m_pboard); - if (syncErr != noErr) { - LOG((CLOG_DEBUG "failed to syncronize clipboard: error %i", syncErr)); - } + OSStatus syncErr = PasteboardSynchronize(m_pboard); + if (syncErr != noErr) { + LOG((CLOG_DEBUG "failed to syncronize clipboard: error %i", syncErr)); + } } OSXClipboard::~OSXClipboard() { - clearConverters(); + clearConverters(); } - bool + bool OSXClipboard::empty() { - LOG((CLOG_DEBUG "emptying clipboard")); - if (m_pboard == NULL) - return false; + LOG((CLOG_DEBUG "emptying clipboard")); + if (m_pboard == NULL) + return false; - OSStatus err = PasteboardClear(m_pboard); - if (err != noErr) { - LOG((CLOG_DEBUG "failed to clear clipboard: error %i", err)); - return false; - } + OSStatus err = PasteboardClear(m_pboard); + if (err != noErr) { + LOG((CLOG_DEBUG "failed to clear clipboard: error %i", err)); + return false; + } - return true; + return true; } - bool + bool OSXClipboard::synchronize() { - if (m_pboard == NULL) - return false; + if (m_pboard == NULL) + return false; - PasteboardSyncFlags flags = PasteboardSynchronize(m_pboard); - LOG((CLOG_DEBUG2 "flags: %x", flags)); + PasteboardSyncFlags flags = PasteboardSynchronize(m_pboard); + LOG((CLOG_DEBUG2 "flags: %x", flags)); - if (flags & kPasteboardModified) { - return true; - } - return false; + if (flags & kPasteboardModified) { + return true; + } + return false; } - void + void OSXClipboard::add(EFormat format, const String & data) { - if (m_pboard == NULL) - return; + if (m_pboard == NULL) + return; - LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format)); - if (format == IClipboard::kText) { - LOG((CLOG_DEBUG " format of data to be added to clipboard was kText")); - } - else if (format == IClipboard::kBitmap) { - LOG((CLOG_DEBUG " format of data to be added to clipboard was kBitmap")); - } - else if (format == IClipboard::kHTML) { - LOG((CLOG_DEBUG " format of data to be added to clipboard was kHTML")); - } + LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format)); + if (format == IClipboard::kText) { + LOG((CLOG_DEBUG " format of data to be added to clipboard was kText")); + } + else if (format == IClipboard::kBitmap) { + LOG((CLOG_DEBUG " format of data to be added to clipboard was kBitmap")); + } + else if (format == IClipboard::kHTML) { + LOG((CLOG_DEBUG " format of data to be added to clipboard was kHTML")); + } - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { - IOSXClipboardConverter* converter = *index; + IOSXClipboardConverter* converter = *index; - // skip converters for other formats - if (converter->getFormat() == format) { - String osXData = converter->fromIClipboard(data); - CFStringRef flavorType = converter->getOSXFormat(); - CFDataRef dataRef = CFDataCreate(kCFAllocatorDefault, (UInt8 *)osXData.data(), osXData.size()); - PasteboardItemID itemID = 0; + // skip converters for other formats + if (converter->getFormat() == format) { + String osXData = converter->fromIClipboard(data); + CFStringRef flavorType = converter->getOSXFormat(); + CFDataRef dataRef = CFDataCreate(kCFAllocatorDefault, (UInt8 *)osXData.data(), osXData.size()); + PasteboardItemID itemID = 0; PasteboardPutItemFlavor( m_pboard, @@ -131,129 +131,129 @@ OSXClipboard::add(EFormat format, const String & data) LOG((CLOG_DEBUG "added %d bytes to clipboard format: %d", data.size(), format)); } - } + } } bool OSXClipboard::open(Time time) const { - if (m_pboard == NULL) - return false; + if (m_pboard == NULL) + return false; - LOG((CLOG_DEBUG "opening clipboard")); - m_time = time; - return true; + LOG((CLOG_DEBUG "opening clipboard")); + m_time = time; + return true; } void OSXClipboard::close() const { - LOG((CLOG_DEBUG "closing clipboard")); - /* not needed */ + LOG((CLOG_DEBUG "closing clipboard")); + /* not needed */ } IClipboard::Time OSXClipboard::getTime() const { - return m_time; + return m_time; } bool OSXClipboard::has(EFormat format) const { - if (m_pboard == NULL) - return false; + if (m_pboard == NULL) + return false; - PasteboardItemID item; - PasteboardGetItemIdentifier(m_pboard, (CFIndex) 1, &item); + PasteboardItemID item; + PasteboardGetItemIdentifier(m_pboard, (CFIndex) 1, &item); - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IOSXClipboardConverter* converter = *index; - if (converter->getFormat() == format) { - PasteboardFlavorFlags flags; - CFStringRef type = converter->getOSXFormat(); + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IOSXClipboardConverter* converter = *index; + if (converter->getFormat() == format) { + PasteboardFlavorFlags flags; + CFStringRef type = converter->getOSXFormat(); - OSStatus res; + OSStatus res; - if ((res = PasteboardGetItemFlavorFlags(m_pboard, item, type, &flags)) == noErr) { - return true; - } - } - } + if ((res = PasteboardGetItemFlavorFlags(m_pboard, item, type, &flags)) == noErr) { + return true; + } + } + } - return false; + return false; } String OSXClipboard::get(EFormat format) const { - CFStringRef type; - PasteboardItemID item; - String result; + CFStringRef type; + PasteboardItemID item; + String result; - if (m_pboard == NULL) - return result; + if (m_pboard == NULL) + return result; - PasteboardGetItemIdentifier(m_pboard, (CFIndex) 1, &item); + PasteboardGetItemIdentifier(m_pboard, (CFIndex) 1, &item); - // find the converter for the first clipboard format we can handle - IOSXClipboardConverter* converter = NULL; - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - converter = *index; + // find the converter for the first clipboard format we can handle + IOSXClipboardConverter* converter = NULL; + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + converter = *index; - PasteboardFlavorFlags flags; - type = converter->getOSXFormat(); + PasteboardFlavorFlags flags; + type = converter->getOSXFormat(); - if (converter->getFormat() == format && - PasteboardGetItemFlavorFlags(m_pboard, item, type, &flags) == noErr) { - break; - } - converter = NULL; - } + if (converter->getFormat() == format && + PasteboardGetItemFlavorFlags(m_pboard, item, type, &flags) == noErr) { + break; + } + converter = NULL; + } - // if no converter then we don't recognize any formats - if (converter == NULL) { - LOG((CLOG_DEBUG "Unable to find converter for data")); - return result; - } + // if no converter then we don't recognize any formats + if (converter == NULL) { + LOG((CLOG_DEBUG "Unable to find converter for data")); + return result; + } - // get the clipboard data. - CFDataRef buffer = NULL; - try { - OSStatus err = PasteboardCopyItemFlavorData(m_pboard, item, type, &buffer); + // get the clipboard data. + CFDataRef buffer = NULL; + try { + OSStatus err = PasteboardCopyItemFlavorData(m_pboard, item, type, &buffer); - if (err != noErr) { - throw err; - } + if (err != noErr) { + throw err; + } - result = String((char *) CFDataGetBytePtr(buffer), CFDataGetLength(buffer)); - } - catch (OSStatus err) { - LOG((CLOG_DEBUG "exception thrown in OSXClipboard::get MacError (%d)", err)); - } - catch (...) { - LOG((CLOG_DEBUG "unknown exception in OSXClipboard::get")); - RETHROW_XTHREAD - } + result = String((char *) CFDataGetBytePtr(buffer), CFDataGetLength(buffer)); + } + catch (OSStatus err) { + LOG((CLOG_DEBUG "exception thrown in OSXClipboard::get MacError (%d)", err)); + } + catch (...) { + LOG((CLOG_DEBUG "unknown exception in OSXClipboard::get")); + RETHROW_XTHREAD + } - if (buffer != NULL) - CFRelease(buffer); + if (buffer != NULL) + CFRelease(buffer); - return converter->toIClipboard(result); + return converter->toIClipboard(result); } - void + void OSXClipboard::clearConverters() { - if (m_pboard == NULL) - return; + if (m_pboard == NULL) + return; - for (ConverterList::iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - delete *index; - } - m_converters.clear(); + for (ConverterList::iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + delete *index; + } + m_converters.clear(); } diff --git a/src/lib/platform/OSXClipboard.h b/src/lib/platform/OSXClipboard.h index d02bbb20..e9d01a70 100644 --- a/src/lib/platform/OSXClipboard.h +++ b/src/lib/platform/OSXClipboard.h @@ -28,31 +28,31 @@ class IOSXClipboardConverter; //! OS X clipboard implementation class OSXClipboard : public IClipboard { public: - OSXClipboard(); - virtual ~OSXClipboard(); + OSXClipboard(); + virtual ~OSXClipboard(); - //! Test if clipboard is owned by synergy - static bool isOwnedBySynergy(); + //! Test if clipboard is owned by synergy + static bool isOwnedBySynergy(); - // IClipboard overrides - virtual bool empty(); - virtual void add(EFormat, const String& data); - virtual bool open(Time) const; - virtual void close() const; - virtual Time getTime() const; - virtual bool has(EFormat) const; - virtual String get(EFormat) const; + // IClipboard overrides + virtual bool empty(); + virtual void add(EFormat, const String& data); + virtual bool open(Time) const; + virtual void close() const; + virtual Time getTime() const; + virtual bool has(EFormat) const; + virtual String get(EFormat) const; - bool synchronize(); + bool synchronize(); private: - void clearConverters(); + void clearConverters(); private: - typedef std::vector ConverterList; + typedef std::vector ConverterList; - mutable Time m_time; - ConverterList m_converters; - PasteboardRef m_pboard; + mutable Time m_time; + ConverterList m_converters; + PasteboardRef m_pboard; }; //! Clipboard format converter interface @@ -61,35 +61,35 @@ This interface defines the methods common to all Scrap book format */ class IOSXClipboardConverter : public IInterface { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get clipboard format - /*! - Return the clipboard format this object converts from/to. - */ - virtual IClipboard::EFormat - getFormat() const = 0; + //! Get clipboard format + /*! + Return the clipboard format this object converts from/to. + */ + virtual IClipboard::EFormat + getFormat() const = 0; - //! returns the scrap flavor type that this object converts from/to - virtual CFStringRef - getOSXFormat() const = 0; + //! returns the scrap flavor type that this object converts from/to + virtual CFStringRef + getOSXFormat() const = 0; - //! Convert from IClipboard format - /*! - Convert from the IClipboard format to the Carbon scrap format. - The input data must be in the IClipboard format returned by - getFormat(). The return data will be in the scrap - format returned by getOSXFormat(). - */ - virtual String fromIClipboard(const String&) const = 0; + //! Convert from IClipboard format + /*! + Convert from the IClipboard format to the Carbon scrap format. + The input data must be in the IClipboard format returned by + getFormat(). The return data will be in the scrap + format returned by getOSXFormat(). + */ + virtual String fromIClipboard(const String&) const = 0; - //! Convert to IClipboard format - /*! - Convert from the carbon scrap format to the IClipboard format - (i.e., the reverse of fromIClipboard()). - */ - virtual String toIClipboard(const String&) const = 0; + //! Convert to IClipboard format + /*! + Convert from the carbon scrap format to the IClipboard format + (i.e., the reverse of fromIClipboard()). + */ + virtual String toIClipboard(const String&) const = 0; - //@} + //@} }; diff --git a/src/lib/platform/OSXClipboardAnyBitmapConverter.cpp b/src/lib/platform/OSXClipboardAnyBitmapConverter.cpp index 862e0232..bab48a0f 100644 --- a/src/lib/platform/OSXClipboardAnyBitmapConverter.cpp +++ b/src/lib/platform/OSXClipboardAnyBitmapConverter.cpp @@ -21,28 +21,28 @@ OSXClipboardAnyBitmapConverter::OSXClipboardAnyBitmapConverter() { - // do nothing + // do nothing } OSXClipboardAnyBitmapConverter::~OSXClipboardAnyBitmapConverter() { - // do nothing + // do nothing } IClipboard::EFormat OSXClipboardAnyBitmapConverter::getFormat() const { - return IClipboard::kBitmap; + return IClipboard::kBitmap; } String OSXClipboardAnyBitmapConverter::fromIClipboard(const String& data) const { - return doFromIClipboard(data); + return doFromIClipboard(data); } String OSXClipboardAnyBitmapConverter::toIClipboard(const String& data) const { - return doToIClipboard(data); + return doToIClipboard(data); } diff --git a/src/lib/platform/OSXClipboardAnyBitmapConverter.h b/src/lib/platform/OSXClipboardAnyBitmapConverter.h index 08b6853b..c54a4a8b 100644 --- a/src/lib/platform/OSXClipboardAnyBitmapConverter.h +++ b/src/lib/platform/OSXClipboardAnyBitmapConverter.h @@ -23,26 +23,26 @@ //! Convert to/from some text encoding class OSXClipboardAnyBitmapConverter : public IOSXClipboardConverter { public: - OSXClipboardAnyBitmapConverter(); - virtual ~OSXClipboardAnyBitmapConverter(); + OSXClipboardAnyBitmapConverter(); + virtual ~OSXClipboardAnyBitmapConverter(); - // IOSXClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual CFStringRef getOSXFormat() const = 0; - virtual String fromIClipboard(const String &) const; - virtual String toIClipboard(const String &) const; + // IOSXClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual CFStringRef getOSXFormat() const = 0; + virtual String fromIClipboard(const String &) const; + virtual String toIClipboard(const String &) const; protected: - //! Convert from IClipboard format - /*! - Do UTF-8 conversion and linefeed conversion. - */ - virtual String doFromIClipboard(const String&) const = 0; + //! Convert from IClipboard format + /*! + Do UTF-8 conversion and linefeed conversion. + */ + virtual String doFromIClipboard(const String&) const = 0; - //! Convert to IClipboard format - /*! - Do UTF-8 conversion and Linefeed conversion. - */ - virtual String doToIClipboard(const String&) const = 0; + //! Convert to IClipboard format + /*! + Do UTF-8 conversion and Linefeed conversion. + */ + virtual String doToIClipboard(const String&) const = 0; }; diff --git a/src/lib/platform/OSXClipboardAnyTextConverter.cpp b/src/lib/platform/OSXClipboardAnyTextConverter.cpp index a1830d7b..27711bc4 100644 --- a/src/lib/platform/OSXClipboardAnyTextConverter.cpp +++ b/src/lib/platform/OSXClipboardAnyTextConverter.cpp @@ -26,32 +26,32 @@ OSXClipboardAnyTextConverter::OSXClipboardAnyTextConverter() { - // do nothing + // do nothing } OSXClipboardAnyTextConverter::~OSXClipboardAnyTextConverter() { - // do nothing + // do nothing } IClipboard::EFormat OSXClipboardAnyTextConverter::getFormat() const { - return IClipboard::kText; + return IClipboard::kText; } String OSXClipboardAnyTextConverter::fromIClipboard(const String& data) const { - // convert linefeeds and then convert to desired encoding - return doFromIClipboard(convertLinefeedToMacOS(data)); + // convert linefeeds and then convert to desired encoding + return doFromIClipboard(convertLinefeedToMacOS(data)); } String OSXClipboardAnyTextConverter::toIClipboard(const String& data) const { - // convert text then newlines - return convertLinefeedToUnix(doToIClipboard(data)); + // convert text then newlines + return convertLinefeedToUnix(doToIClipboard(data)); } static @@ -71,12 +71,12 @@ isCR(char ch) String OSXClipboardAnyTextConverter::convertLinefeedToMacOS(const String& src) { - // note -- we assume src is a valid UTF-8 string + // note -- we assume src is a valid UTF-8 string String copy = src; std::replace_if(copy.begin(), copy.end(), isLF, '\r'); - return copy; + return copy; } String @@ -86,5 +86,5 @@ OSXClipboardAnyTextConverter::convertLinefeedToUnix(const String& src) std::replace_if(copy.begin(), copy.end(), isCR, '\n'); - return copy; + return copy; } diff --git a/src/lib/platform/OSXClipboardAnyTextConverter.h b/src/lib/platform/OSXClipboardAnyTextConverter.h index 70be04f9..3a95d496 100644 --- a/src/lib/platform/OSXClipboardAnyTextConverter.h +++ b/src/lib/platform/OSXClipboardAnyTextConverter.h @@ -23,31 +23,31 @@ //! Convert to/from some text encoding class OSXClipboardAnyTextConverter : public IOSXClipboardConverter { public: - OSXClipboardAnyTextConverter(); - virtual ~OSXClipboardAnyTextConverter(); + OSXClipboardAnyTextConverter(); + virtual ~OSXClipboardAnyTextConverter(); - // IOSXClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual CFStringRef - getOSXFormat() const = 0; - virtual String fromIClipboard(const String &) const; - virtual String toIClipboard(const String &) const; + // IOSXClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual CFStringRef + getOSXFormat() const = 0; + virtual String fromIClipboard(const String &) const; + virtual String toIClipboard(const String &) const; protected: - //! Convert from IClipboard format - /*! - Do UTF-8 conversion and linefeed conversion. - */ - virtual String doFromIClipboard(const String&) const = 0; + //! Convert from IClipboard format + /*! + Do UTF-8 conversion and linefeed conversion. + */ + virtual String doFromIClipboard(const String&) const = 0; - //! Convert to IClipboard format - /*! - Do UTF-8 conversion and Linefeed conversion. - */ - virtual String doToIClipboard(const String&) const = 0; + //! Convert to IClipboard format + /*! + Do UTF-8 conversion and Linefeed conversion. + */ + virtual String doToIClipboard(const String&) const = 0; private: - static String convertLinefeedToMacOS(const String&); - static String convertLinefeedToUnix(const String&); + static String convertLinefeedToMacOS(const String&); + static String convertLinefeedToUnix(const String&); }; diff --git a/src/lib/platform/OSXClipboardBMPConverter.cpp b/src/lib/platform/OSXClipboardBMPConverter.cpp index faeac291..6639f11f 100644 --- a/src/lib/platform/OSXClipboardBMPConverter.cpp +++ b/src/lib/platform/OSXClipboardBMPConverter.cpp @@ -22,11 +22,11 @@ // BMP file header structure struct CBMPHeader { public: - UInt16 type; - UInt32 size; - UInt16 reserved1; - UInt16 reserved2; - UInt32 offset; + UInt16 type; + UInt32 size; + UInt16 reserved1; + UInt16 reserved2; + UInt32 offset; }; // BMP is little-endian @@ -34,101 +34,101 @@ static inline UInt32 fromLEU32(const UInt8* data) { - return static_cast(data[0]) | - (static_cast(data[1]) << 8) | - (static_cast(data[2]) << 16) | - (static_cast(data[3]) << 24); + return static_cast(data[0]) | + (static_cast(data[1]) << 8) | + (static_cast(data[2]) << 16) | + (static_cast(data[3]) << 24); } static void toLE(UInt8*& dst, char src) { - dst[0] = static_cast(src); - dst += 1; + dst[0] = static_cast(src); + dst += 1; } static void toLE(UInt8*& dst, UInt16 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst += 2; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst += 2; } static void toLE(UInt8*& dst, UInt32 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst[2] = static_cast((src >> 16) & 0xffu); - dst[3] = static_cast((src >> 24) & 0xffu); - dst += 4; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst[2] = static_cast((src >> 16) & 0xffu); + dst[3] = static_cast((src >> 24) & 0xffu); + dst += 4; } OSXClipboardBMPConverter::OSXClipboardBMPConverter() { - // do nothing + // do nothing } OSXClipboardBMPConverter::~OSXClipboardBMPConverter() { - // do nothing + // do nothing } IClipboard::EFormat OSXClipboardBMPConverter::getFormat() const { - return IClipboard::kBitmap; + return IClipboard::kBitmap; } CFStringRef OSXClipboardBMPConverter::getOSXFormat() const { - // TODO: does this only work with Windows? - return CFSTR("com.microsoft.bmp"); + // TODO: does this only work with Windows? + return CFSTR("com.microsoft.bmp"); } String OSXClipboardBMPConverter::fromIClipboard(const String& bmp) const { - LOG((CLOG_DEBUG1 "ENTER OSXClipboardBMPConverter::doFromIClipboard()")); - // create BMP image - UInt8 header[14]; - UInt8* dst = header; - toLE(dst, 'B'); - toLE(dst, 'M'); - toLE(dst, static_cast(14 + bmp.size())); - toLE(dst, static_cast(0)); - toLE(dst, static_cast(0)); - toLE(dst, static_cast(14 + 40)); - return String(reinterpret_cast(header), 14) + bmp; + LOG((CLOG_DEBUG1 "ENTER OSXClipboardBMPConverter::doFromIClipboard()")); + // create BMP image + UInt8 header[14]; + UInt8* dst = header; + toLE(dst, 'B'); + toLE(dst, 'M'); + toLE(dst, static_cast(14 + bmp.size())); + toLE(dst, static_cast(0)); + toLE(dst, static_cast(0)); + toLE(dst, static_cast(14 + 40)); + return String(reinterpret_cast(header), 14) + bmp; } String OSXClipboardBMPConverter::toIClipboard(const String& bmp) const { - // make sure data is big enough for a BMP file - if (bmp.size() <= 14 + 40) { - return String(); - } + // make sure data is big enough for a BMP file + if (bmp.size() <= 14 + 40) { + return String(); + } - // check BMP file header - const UInt8* rawBMPHeader = reinterpret_cast(bmp.data()); - if (rawBMPHeader[0] != 'B' || rawBMPHeader[1] != 'M') { - return String(); - } + // check BMP file header + const UInt8* rawBMPHeader = reinterpret_cast(bmp.data()); + if (rawBMPHeader[0] != 'B' || rawBMPHeader[1] != 'M') { + return String(); + } - // get offset to image data - UInt32 offset = fromLEU32(rawBMPHeader + 10); + // get offset to image data + UInt32 offset = fromLEU32(rawBMPHeader + 10); - // construct BMP - if (offset == 14 + 40) { - return bmp.substr(14); - } - else { - return bmp.substr(14, 40) + bmp.substr(offset, bmp.size() - offset); - } + // construct BMP + if (offset == 14 + 40) { + return bmp.substr(14); + } + else { + return bmp.substr(14, 40) + bmp.substr(offset, bmp.size() - offset); + } } diff --git a/src/lib/platform/OSXClipboardBMPConverter.h b/src/lib/platform/OSXClipboardBMPConverter.h index 6fbfdcba..48f888aa 100644 --- a/src/lib/platform/OSXClipboardBMPConverter.h +++ b/src/lib/platform/OSXClipboardBMPConverter.h @@ -23,22 +23,22 @@ //! Convert to/from some text encoding class OSXClipboardBMPConverter : public IOSXClipboardConverter { public: - OSXClipboardBMPConverter(); - virtual ~OSXClipboardBMPConverter(); + OSXClipboardBMPConverter(); + virtual ~OSXClipboardBMPConverter(); - // IMSWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; + // IMSWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; - virtual CFStringRef - getOSXFormat() const; + virtual CFStringRef + getOSXFormat() const; - // OSXClipboardAnyBMPConverter overrides - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // OSXClipboardAnyBMPConverter overrides + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; - // generic encoding converter - static String convertString(const String& data, - CFStringEncoding fromEncoding, - CFStringEncoding toEncoding); + // generic encoding converter + static String convertString(const String& data, + CFStringEncoding fromEncoding, + CFStringEncoding toEncoding); }; diff --git a/src/lib/platform/OSXClipboardHTMLConverter.cpp b/src/lib/platform/OSXClipboardHTMLConverter.cpp index 0760bb28..03caaa09 100644 --- a/src/lib/platform/OSXClipboardHTMLConverter.cpp +++ b/src/lib/platform/OSXClipboardHTMLConverter.cpp @@ -22,74 +22,74 @@ OSXClipboardHTMLConverter::OSXClipboardHTMLConverter() { - // do nothing + // do nothing } OSXClipboardHTMLConverter::~OSXClipboardHTMLConverter() { - // do nothing + // do nothing } IClipboard::EFormat OSXClipboardHTMLConverter::getFormat() const { - return IClipboard::kHTML; + return IClipboard::kHTML; } CFStringRef OSXClipboardHTMLConverter::getOSXFormat() const { - return CFSTR("public.html"); + return CFSTR("public.html"); } String OSXClipboardHTMLConverter::convertString( - const String& data, - CFStringEncoding fromEncoding, - CFStringEncoding toEncoding) + const String& data, + CFStringEncoding fromEncoding, + CFStringEncoding toEncoding) { - CFStringRef stringRef = CFStringCreateWithCString( - kCFAllocatorDefault, - data.c_str(), fromEncoding); + CFStringRef stringRef = CFStringCreateWithCString( + kCFAllocatorDefault, + data.c_str(), fromEncoding); - if (stringRef == NULL) { - return String(); - } + if (stringRef == NULL) { + return String(); + } - CFIndex buffSize; - CFRange entireString = CFRangeMake(0, CFStringGetLength(stringRef)); + CFIndex buffSize; + CFRange entireString = CFRangeMake(0, CFStringGetLength(stringRef)); - CFStringGetBytes(stringRef, entireString, toEncoding, - 0, false, NULL, 0, &buffSize); + CFStringGetBytes(stringRef, entireString, toEncoding, + 0, false, NULL, 0, &buffSize); - char* buffer = new char[buffSize]; + char* buffer = new char[buffSize]; - if (buffer == NULL) { - CFRelease(stringRef); - return String(); - } - - CFStringGetBytes(stringRef, entireString, toEncoding, - 0, false, (UInt8*)buffer, buffSize, NULL); + if (buffer == NULL) { + CFRelease(stringRef); + return String(); + } + + CFStringGetBytes(stringRef, entireString, toEncoding, + 0, false, (UInt8*)buffer, buffSize, NULL); - String result(buffer, buffSize); + String result(buffer, buffSize); - delete[] buffer; - CFRelease(stringRef); + delete[] buffer; + CFRelease(stringRef); - return result; + return result; } String OSXClipboardHTMLConverter::doFromIClipboard(const String& data) const { - return convertString(data, kCFStringEncodingUTF8, - CFStringGetSystemEncoding()); + return convertString(data, kCFStringEncodingUTF8, + CFStringGetSystemEncoding()); } String OSXClipboardHTMLConverter::doToIClipboard(const String& data) const { - return convertString(data, CFStringGetSystemEncoding(), - kCFStringEncodingUTF8); + return convertString(data, CFStringGetSystemEncoding(), + kCFStringEncodingUTF8); } diff --git a/src/lib/platform/OSXClipboardHTMLConverter.h b/src/lib/platform/OSXClipboardHTMLConverter.h index 3b055700..058f0d89 100644 --- a/src/lib/platform/OSXClipboardHTMLConverter.h +++ b/src/lib/platform/OSXClipboardHTMLConverter.h @@ -23,22 +23,22 @@ //! Convert to/from HTML encoding class OSXClipboardHTMLConverter : public OSXClipboardAnyTextConverter { public: - OSXClipboardHTMLConverter(); - virtual ~OSXClipboardHTMLConverter(); + OSXClipboardHTMLConverter(); + virtual ~OSXClipboardHTMLConverter(); - // IMSWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; + // IMSWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; - virtual CFStringRef getOSXFormat() const; + virtual CFStringRef getOSXFormat() const; protected: - // OSXClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // OSXClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; - // generic encoding converter - static String convertString(const String& data, - CFStringEncoding fromEncoding, - CFStringEncoding toEncoding); + // generic encoding converter + static String convertString(const String& data, + CFStringEncoding fromEncoding, + CFStringEncoding toEncoding); }; diff --git a/src/lib/platform/OSXClipboardTextConverter.cpp b/src/lib/platform/OSXClipboardTextConverter.cpp index 8b6f75cd..4c8bf66f 100644 --- a/src/lib/platform/OSXClipboardTextConverter.cpp +++ b/src/lib/platform/OSXClipboardTextConverter.cpp @@ -26,68 +26,68 @@ OSXClipboardTextConverter::OSXClipboardTextConverter() { - // do nothing + // do nothing } OSXClipboardTextConverter::~OSXClipboardTextConverter() { - // do nothing + // do nothing } CFStringRef OSXClipboardTextConverter::getOSXFormat() const { - return CFSTR("public.plain-text"); + return CFSTR("public.plain-text"); } String OSXClipboardTextConverter::convertString( - const String& data, - CFStringEncoding fromEncoding, - CFStringEncoding toEncoding) + const String& data, + CFStringEncoding fromEncoding, + CFStringEncoding toEncoding) { - CFStringRef stringRef = - CFStringCreateWithCString(kCFAllocatorDefault, - data.c_str(), fromEncoding); + CFStringRef stringRef = + CFStringCreateWithCString(kCFAllocatorDefault, + data.c_str(), fromEncoding); - if (stringRef == NULL) { - return String(); - } + if (stringRef == NULL) { + return String(); + } - CFIndex buffSize; - CFRange entireString = CFRangeMake(0, CFStringGetLength(stringRef)); + CFIndex buffSize; + CFRange entireString = CFRangeMake(0, CFStringGetLength(stringRef)); - CFStringGetBytes(stringRef, entireString, toEncoding, - 0, false, NULL, 0, &buffSize); + CFStringGetBytes(stringRef, entireString, toEncoding, + 0, false, NULL, 0, &buffSize); - char* buffer = new char[buffSize]; - - if (buffer == NULL) { - CFRelease(stringRef); - return String(); - } - - CFStringGetBytes(stringRef, entireString, toEncoding, - 0, false, (UInt8*)buffer, buffSize, NULL); + char* buffer = new char[buffSize]; + + if (buffer == NULL) { + CFRelease(stringRef); + return String(); + } + + CFStringGetBytes(stringRef, entireString, toEncoding, + 0, false, (UInt8*)buffer, buffSize, NULL); - String result(buffer, buffSize); + String result(buffer, buffSize); - delete[] buffer; - CFRelease(stringRef); - - return result; + delete[] buffer; + CFRelease(stringRef); + + return result; } String OSXClipboardTextConverter::doFromIClipboard(const String& data) const { - return convertString(data, kCFStringEncodingUTF8, - CFStringGetSystemEncoding()); + return convertString(data, kCFStringEncodingUTF8, + CFStringGetSystemEncoding()); } String OSXClipboardTextConverter::doToIClipboard(const String& data) const { - return convertString(data, CFStringGetSystemEncoding(), - kCFStringEncodingUTF8); + return convertString(data, CFStringGetSystemEncoding(), + kCFStringEncodingUTF8); } diff --git a/src/lib/platform/OSXClipboardTextConverter.h b/src/lib/platform/OSXClipboardTextConverter.h index 8618276d..fd4f5c22 100644 --- a/src/lib/platform/OSXClipboardTextConverter.h +++ b/src/lib/platform/OSXClipboardTextConverter.h @@ -23,20 +23,20 @@ //! Convert to/from locale text encoding class OSXClipboardTextConverter : public OSXClipboardAnyTextConverter { public: - OSXClipboardTextConverter(); - virtual ~OSXClipboardTextConverter(); + OSXClipboardTextConverter(); + virtual ~OSXClipboardTextConverter(); - // IOSXClipboardAnyTextConverter overrides - virtual CFStringRef - getOSXFormat() const; + // IOSXClipboardAnyTextConverter overrides + virtual CFStringRef + getOSXFormat() const; protected: - // OSXClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // OSXClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; - // generic encoding converter - static String convertString(const String& data, - CFStringEncoding fromEncoding, - CFStringEncoding toEncoding); + // generic encoding converter + static String convertString(const String& data, + CFStringEncoding fromEncoding, + CFStringEncoding toEncoding); }; diff --git a/src/lib/platform/OSXClipboardUTF16Converter.cpp b/src/lib/platform/OSXClipboardUTF16Converter.cpp index c72983a4..d2f07c27 100644 --- a/src/lib/platform/OSXClipboardUTF16Converter.cpp +++ b/src/lib/platform/OSXClipboardUTF16Converter.cpp @@ -26,30 +26,30 @@ OSXClipboardUTF16Converter::OSXClipboardUTF16Converter() { - // do nothing + // do nothing } OSXClipboardUTF16Converter::~OSXClipboardUTF16Converter() { - // do nothing + // do nothing } CFStringRef OSXClipboardUTF16Converter::getOSXFormat() const { - return CFSTR("public.utf16-plain-text"); + return CFSTR("public.utf16-plain-text"); } String OSXClipboardUTF16Converter::doFromIClipboard(const String& data) const { - // convert and add nul terminator - return Unicode::UTF8ToUTF16(data); + // convert and add nul terminator + return Unicode::UTF8ToUTF16(data); } String OSXClipboardUTF16Converter::doToIClipboard(const String& data) const { - // convert and strip nul terminator - return Unicode::UTF16ToUTF8(data); + // convert and strip nul terminator + return Unicode::UTF16ToUTF8(data); } diff --git a/src/lib/platform/OSXClipboardUTF16Converter.h b/src/lib/platform/OSXClipboardUTF16Converter.h index 8b753624..da52f1ea 100644 --- a/src/lib/platform/OSXClipboardUTF16Converter.h +++ b/src/lib/platform/OSXClipboardUTF16Converter.h @@ -23,15 +23,15 @@ //! Convert to/from UTF-16 encoding class OSXClipboardUTF16Converter : public OSXClipboardAnyTextConverter { public: - OSXClipboardUTF16Converter(); - virtual ~OSXClipboardUTF16Converter(); + OSXClipboardUTF16Converter(); + virtual ~OSXClipboardUTF16Converter(); - // IOSXClipboardAnyTextConverter overrides - virtual CFStringRef - getOSXFormat() const; + // IOSXClipboardAnyTextConverter overrides + virtual CFStringRef + getOSXFormat() const; protected: - // OSXClipboardAnyTextConverter overrides - virtual String doFromIClipboard(const String&) const; - virtual String doToIClipboard(const String&) const; + // OSXClipboardAnyTextConverter overrides + virtual String doFromIClipboard(const String&) const; + virtual String doToIClipboard(const String&) const; }; diff --git a/src/lib/platform/OSXDragSimulator.h b/src/lib/platform/OSXDragSimulator.h index fa2abe33..148fca04 100644 --- a/src/lib/platform/OSXDragSimulator.h +++ b/src/lib/platform/OSXDragSimulator.h @@ -24,11 +24,11 @@ #if defined(__cplusplus) extern "C" { #endif -void runCocoaApp(); -void stopCocoaLoop(); -void fakeDragging(const char* str, int cursorX, int cursorY); -CFStringRef getCocoaDropTarget(); - +void runCocoaApp(); +void stopCocoaLoop(); +void fakeDragging(const char* str, int cursorX, int cursorY); +CFStringRef getCocoaDropTarget(); + #if defined(__cplusplus) } #endif diff --git a/src/lib/platform/OSXDragView.h b/src/lib/platform/OSXDragView.h index 2f8ce9d4..9e706c58 100644 --- a/src/lib/platform/OSXDragView.h +++ b/src/lib/platform/OSXDragView.h @@ -21,8 +21,8 @@ @interface OSXDragView : NSView { - NSMutableString* m_dropTarget; - NSString* m_dragFileExt; + NSMutableString* m_dropTarget; + NSString* m_dragFileExt; } - (CFStringRef)getDropTarget; diff --git a/src/lib/platform/OSXEventQueueBuffer.cpp b/src/lib/platform/OSXEventQueueBuffer.cpp index 2ee439c8..2a5bd220 100644 --- a/src/lib/platform/OSXEventQueueBuffer.cpp +++ b/src/lib/platform/OSXEventQueueBuffer.cpp @@ -32,112 +32,112 @@ class EventQueueTimer { }; // OSXEventQueueBuffer::OSXEventQueueBuffer(IEventQueue* events) : - m_event(NULL), - m_eventQueue(events), - m_carbonEventQueue(NULL) + m_event(NULL), + m_eventQueue(events), + m_carbonEventQueue(NULL) { - // do nothing + // do nothing } OSXEventQueueBuffer::~OSXEventQueueBuffer() { - // release the last event - if (m_event != NULL) { - ReleaseEvent(m_event); - } + // release the last event + if (m_event != NULL) { + ReleaseEvent(m_event); + } } void OSXEventQueueBuffer::init() { - m_carbonEventQueue = GetCurrentEventQueue(); + m_carbonEventQueue = GetCurrentEventQueue(); } void OSXEventQueueBuffer::waitForEvent(double timeout) { - EventRef event; - ReceiveNextEvent(0, NULL, timeout, false, &event); + EventRef event; + ReceiveNextEvent(0, NULL, timeout, false, &event); } IEventQueueBuffer::Type OSXEventQueueBuffer::getEvent(Event& event, UInt32& dataID) { - // release the previous event - if (m_event != NULL) { - ReleaseEvent(m_event); - m_event = NULL; - } + // release the previous event + if (m_event != NULL) { + ReleaseEvent(m_event); + m_event = NULL; + } - // get the next event - OSStatus error = ReceiveNextEvent(0, NULL, 0.0, true, &m_event); + // get the next event + OSStatus error = ReceiveNextEvent(0, NULL, 0.0, true, &m_event); - // handle the event - if (error == eventLoopQuitErr) { - event = Event(Event::kQuit); - return kSystem; - } - else if (error != noErr) { - return kNone; - } - else { - UInt32 eventClass = GetEventClass(m_event); - switch (eventClass) { - case 'Syne': - dataID = GetEventKind(m_event); - return kUser; + // handle the event + if (error == eventLoopQuitErr) { + event = Event(Event::kQuit); + return kSystem; + } + else if (error != noErr) { + return kNone; + } + else { + UInt32 eventClass = GetEventClass(m_event); + switch (eventClass) { + case 'Syne': + dataID = GetEventKind(m_event); + return kUser; - default: - event = Event(Event::kSystem, - m_eventQueue->getSystemTarget(), &m_event); - return kSystem; - } - } + default: + event = Event(Event::kSystem, + m_eventQueue->getSystemTarget(), &m_event); + return kSystem; + } + } } bool OSXEventQueueBuffer::addEvent(UInt32 dataID) { - EventRef event; - OSStatus error = CreateEvent( - kCFAllocatorDefault, - 'Syne', - dataID, - 0, - kEventAttributeNone, - &event); + EventRef event; + OSStatus error = CreateEvent( + kCFAllocatorDefault, + 'Syne', + dataID, + 0, + kEventAttributeNone, + &event); - if (error == noErr) { - - assert(m_carbonEventQueue != NULL); - - error = PostEventToQueue( - m_carbonEventQueue, - event, - kEventPriorityStandard); - - ReleaseEvent(event); - } - - return (error == noErr); + if (error == noErr) { + + assert(m_carbonEventQueue != NULL); + + error = PostEventToQueue( + m_carbonEventQueue, + event, + kEventPriorityStandard); + + ReleaseEvent(event); + } + + return (error == noErr); } bool OSXEventQueueBuffer::isEmpty() const { - EventRef event; - OSStatus status = ReceiveNextEvent(0, NULL, 0.0, false, &event); - return (status == eventLoopTimedOutErr); + EventRef event; + OSStatus status = ReceiveNextEvent(0, NULL, 0.0, false, &event); + return (status == eventLoopTimedOutErr); } EventQueueTimer* OSXEventQueueBuffer::newTimer(double, bool) const { - return new EventQueueTimer; + return new EventQueueTimer; } void OSXEventQueueBuffer::deleteTimer(EventQueueTimer* timer) const { - delete timer; + delete timer; } diff --git a/src/lib/platform/OSXEventQueueBuffer.h b/src/lib/platform/OSXEventQueueBuffer.h index abc1a39d..d2e46b8b 100644 --- a/src/lib/platform/OSXEventQueueBuffer.h +++ b/src/lib/platform/OSXEventQueueBuffer.h @@ -27,21 +27,21 @@ class IEventQueue; //! Event queue buffer for OS X class OSXEventQueueBuffer : public IEventQueueBuffer { public: - OSXEventQueueBuffer(IEventQueue* eventQueue); - virtual ~OSXEventQueueBuffer(); + OSXEventQueueBuffer(IEventQueue* eventQueue); + virtual ~OSXEventQueueBuffer(); - // IEventQueueBuffer overrides - virtual void init(); - virtual void waitForEvent(double timeout); - virtual Type getEvent(Event& event, UInt32& dataID); - virtual bool addEvent(UInt32 dataID); - virtual bool isEmpty() const; - virtual EventQueueTimer* - newTimer(double duration, bool oneShot) const; - virtual void deleteTimer(EventQueueTimer*) const; + // IEventQueueBuffer overrides + virtual void init(); + virtual void waitForEvent(double timeout); + virtual Type getEvent(Event& event, UInt32& dataID); + virtual bool addEvent(UInt32 dataID); + virtual bool isEmpty() const; + virtual EventQueueTimer* + newTimer(double duration, bool oneShot) const; + virtual void deleteTimer(EventQueueTimer*) const; private: - EventRef m_event; - IEventQueue* m_eventQueue; - EventQueueRef m_carbonEventQueue; + EventRef m_event; + IEventQueue* m_eventQueue; + EventQueueRef m_carbonEventQueue; }; diff --git a/src/lib/platform/OSXKeyState.cpp b/src/lib/platform/OSXKeyState.cpp index 8ab0bc89..95492340 100644 --- a/src/lib/platform/OSXKeyState.cpp +++ b/src/lib/platform/OSXKeyState.cpp @@ -45,84 +45,84 @@ static const UInt32 s_osxNumLock = 1 << 16; struct KeyEntry { public: - KeyID m_keyID; - UInt32 m_virtualKey; + KeyID m_keyID; + UInt32 m_virtualKey; }; -static const KeyEntry s_controlKeys[] = { - // cursor keys. if we don't do this we'll may still get these from - // the keyboard resource but they may not correspond to the arrow - // keys. - { kKeyLeft, kVK_LeftArrow }, - { kKeyRight, kVK_RightArrow }, - { kKeyUp, kVK_UpArrow }, - { kKeyDown, kVK_DownArrow }, - { kKeyHome, kVK_Home }, - { kKeyEnd, kVK_End }, - { kKeyPageUp, kVK_PageUp }, - { kKeyPageDown, kVK_PageDown }, - { kKeyInsert, kVK_Help }, // Mac Keyboards have 'Help' on 'Insert' +static const KeyEntry s_controlKeys[] = { + // cursor keys. if we don't do this we'll may still get these from + // the keyboard resource but they may not correspond to the arrow + // keys. + { kKeyLeft, kVK_LeftArrow }, + { kKeyRight, kVK_RightArrow }, + { kKeyUp, kVK_UpArrow }, + { kKeyDown, kVK_DownArrow }, + { kKeyHome, kVK_Home }, + { kKeyEnd, kVK_End }, + { kKeyPageUp, kVK_PageUp }, + { kKeyPageDown, kVK_PageDown }, + { kKeyInsert, kVK_Help }, // Mac Keyboards have 'Help' on 'Insert' - // function keys - { kKeyF1, kVK_F1 }, - { kKeyF2, kVK_F2 }, - { kKeyF3, kVK_F3 }, - { kKeyF4, kVK_F4 }, - { kKeyF5, kVK_F5 }, - { kKeyF6, kVK_F6 }, - { kKeyF7, kVK_F7 }, - { kKeyF8, kVK_F8 }, - { kKeyF9, kVK_F9 }, - { kKeyF10, kVK_F10 }, - { kKeyF11, kVK_F11 }, - { kKeyF12, kVK_F12 }, - { kKeyF13, kVK_F13 }, - { kKeyF14, kVK_F14 }, - { kKeyF15, kVK_F15 }, - { kKeyF16, kVK_F16 }, + // function keys + { kKeyF1, kVK_F1 }, + { kKeyF2, kVK_F2 }, + { kKeyF3, kVK_F3 }, + { kKeyF4, kVK_F4 }, + { kKeyF5, kVK_F5 }, + { kKeyF6, kVK_F6 }, + { kKeyF7, kVK_F7 }, + { kKeyF8, kVK_F8 }, + { kKeyF9, kVK_F9 }, + { kKeyF10, kVK_F10 }, + { kKeyF11, kVK_F11 }, + { kKeyF12, kVK_F12 }, + { kKeyF13, kVK_F13 }, + { kKeyF14, kVK_F14 }, + { kKeyF15, kVK_F15 }, + { kKeyF16, kVK_F16 }, - { kKeyKP_0, kVK_ANSI_Keypad0 }, - { kKeyKP_1, kVK_ANSI_Keypad1 }, - { kKeyKP_2, kVK_ANSI_Keypad2 }, - { kKeyKP_3, kVK_ANSI_Keypad3 }, - { kKeyKP_4, kVK_ANSI_Keypad4 }, - { kKeyKP_5, kVK_ANSI_Keypad5 }, - { kKeyKP_6, kVK_ANSI_Keypad6 }, - { kKeyKP_7, kVK_ANSI_Keypad7 }, - { kKeyKP_8, kVK_ANSI_Keypad8 }, - { kKeyKP_9, kVK_ANSI_Keypad9 }, - { kKeyKP_Decimal, kVK_ANSI_KeypadDecimal }, - { kKeyKP_Equal, kVK_ANSI_KeypadEquals }, - { kKeyKP_Multiply, kVK_ANSI_KeypadMultiply }, - { kKeyKP_Add, kVK_ANSI_KeypadPlus }, - { kKeyKP_Divide, kVK_ANSI_KeypadDivide }, - { kKeyKP_Subtract, kVK_ANSI_KeypadMinus }, - { kKeyKP_Enter, kVK_ANSI_KeypadEnter }, - - // virtual key 110 is fn+enter and i have no idea what that's supposed - // to map to. also the enter key with numlock on is a modifier but i - // don't know which. + { kKeyKP_0, kVK_ANSI_Keypad0 }, + { kKeyKP_1, kVK_ANSI_Keypad1 }, + { kKeyKP_2, kVK_ANSI_Keypad2 }, + { kKeyKP_3, kVK_ANSI_Keypad3 }, + { kKeyKP_4, kVK_ANSI_Keypad4 }, + { kKeyKP_5, kVK_ANSI_Keypad5 }, + { kKeyKP_6, kVK_ANSI_Keypad6 }, + { kKeyKP_7, kVK_ANSI_Keypad7 }, + { kKeyKP_8, kVK_ANSI_Keypad8 }, + { kKeyKP_9, kVK_ANSI_Keypad9 }, + { kKeyKP_Decimal, kVK_ANSI_KeypadDecimal }, + { kKeyKP_Equal, kVK_ANSI_KeypadEquals }, + { kKeyKP_Multiply, kVK_ANSI_KeypadMultiply }, + { kKeyKP_Add, kVK_ANSI_KeypadPlus }, + { kKeyKP_Divide, kVK_ANSI_KeypadDivide }, + { kKeyKP_Subtract, kVK_ANSI_KeypadMinus }, + { kKeyKP_Enter, kVK_ANSI_KeypadEnter }, + + // virtual key 110 is fn+enter and i have no idea what that's supposed + // to map to. also the enter key with numlock on is a modifier but i + // don't know which. - // modifier keys. OS X doesn't seem to support right handed versions - // of modifier keys so we map them to the left handed versions. - { kKeyShift_L, s_shiftVK }, - { kKeyShift_R, s_shiftVK }, // 60 - { kKeyControl_L, s_controlVK }, - { kKeyControl_R, s_controlVK }, // 62 - { kKeyAlt_L, s_altVK }, - { kKeyAlt_R, s_altVK }, - { kKeySuper_L, s_superVK }, - { kKeySuper_R, s_superVK }, // 61 - { kKeyMeta_L, s_superVK }, - { kKeyMeta_R, s_superVK }, // 61 + // modifier keys. OS X doesn't seem to support right handed versions + // of modifier keys so we map them to the left handed versions. + { kKeyShift_L, s_shiftVK }, + { kKeyShift_R, s_shiftVK }, // 60 + { kKeyControl_L, s_controlVK }, + { kKeyControl_R, s_controlVK }, // 62 + { kKeyAlt_L, s_altVK }, + { kKeyAlt_R, s_altVK }, + { kKeySuper_L, s_superVK }, + { kKeySuper_R, s_superVK }, // 61 + { kKeyMeta_L, s_superVK }, + { kKeyMeta_R, s_superVK }, // 61 - // toggle modifiers - { kKeyNumLock, s_numLockVK }, - { kKeyCapsLock, s_capsLockVK }, - - { kKeyMissionControl, s_missionControlVK }, - { kKeyLaunchpad, s_launchpadVK }, - { kKeyBrightnessUp, s_brightnessUp }, - { kKeyBrightnessDown, s_brightnessDown } + // toggle modifiers + { kKeyNumLock, s_numLockVK }, + { kKeyCapsLock, s_capsLockVK }, + + { kKeyMissionControl, s_missionControlVK }, + { kKeyLaunchpad, s_launchpadVK }, + { kKeyBrightnessUp, s_brightnessUp }, + { kKeyBrightnessDown, s_brightnessDown } }; @@ -131,15 +131,15 @@ static const KeyEntry s_controlKeys[] = { // OSXKeyState::OSXKeyState(IEventQueue* events) : - KeyState(events) + KeyState(events) { - init(); + init(); } OSXKeyState::OSXKeyState(IEventQueue* events, synergy::KeyMap& keyMap) : - KeyState(events, keyMap) + KeyState(events, keyMap) { - init(); + init(); } OSXKeyState::~OSXKeyState() @@ -149,189 +149,189 @@ OSXKeyState::~OSXKeyState() void OSXKeyState::init() { - m_deadKeyState = 0; - m_shiftPressed = false; - m_controlPressed = false; - m_altPressed = false; - m_superPressed = false; - m_capsPressed = false; + m_deadKeyState = 0; + m_shiftPressed = false; + m_controlPressed = false; + m_altPressed = false; + m_superPressed = false; + m_capsPressed = false; - // build virtual key map - for (size_t i = 0; i < sizeof(s_controlKeys) / sizeof(s_controlKeys[0]); - ++i) { - - m_virtualKeyMap[s_controlKeys[i].m_virtualKey] = - s_controlKeys[i].m_keyID; - } + // build virtual key map + for (size_t i = 0; i < sizeof(s_controlKeys) / sizeof(s_controlKeys[0]); + ++i) { + + m_virtualKeyMap[s_controlKeys[i].m_virtualKey] = + s_controlKeys[i].m_keyID; + } } KeyModifierMask OSXKeyState::mapModifiersFromOSX(UInt32 mask) const { - KeyModifierMask outMask = 0; - if ((mask & kCGEventFlagMaskShift) != 0) { - outMask |= KeyModifierShift; - } - if ((mask & kCGEventFlagMaskControl) != 0) { - outMask |= KeyModifierControl; - } - if ((mask & kCGEventFlagMaskAlternate) != 0) { - outMask |= KeyModifierAlt; - } - if ((mask & kCGEventFlagMaskCommand) != 0) { - outMask |= KeyModifierSuper; - } - if ((mask & kCGEventFlagMaskAlphaShift) != 0) { - outMask |= KeyModifierCapsLock; - } - if ((mask & kCGEventFlagMaskNumericPad) != 0) { - outMask |= KeyModifierNumLock; - } + KeyModifierMask outMask = 0; + if ((mask & kCGEventFlagMaskShift) != 0) { + outMask |= KeyModifierShift; + } + if ((mask & kCGEventFlagMaskControl) != 0) { + outMask |= KeyModifierControl; + } + if ((mask & kCGEventFlagMaskAlternate) != 0) { + outMask |= KeyModifierAlt; + } + if ((mask & kCGEventFlagMaskCommand) != 0) { + outMask |= KeyModifierSuper; + } + if ((mask & kCGEventFlagMaskAlphaShift) != 0) { + outMask |= KeyModifierCapsLock; + } + if ((mask & kCGEventFlagMaskNumericPad) != 0) { + outMask |= KeyModifierNumLock; + } - LOG((CLOG_DEBUG1 "mask=%04x outMask=%04x", mask, outMask)); - return outMask; + LOG((CLOG_DEBUG1 "mask=%04x outMask=%04x", mask, outMask)); + return outMask; } KeyModifierMask OSXKeyState::mapModifiersToCarbon(UInt32 mask) const { - KeyModifierMask outMask = 0; - if ((mask & kCGEventFlagMaskShift) != 0) { - outMask |= shiftKey; - } - if ((mask & kCGEventFlagMaskControl) != 0) { - outMask |= controlKey; - } - if ((mask & kCGEventFlagMaskCommand) != 0) { - outMask |= cmdKey; - } - if ((mask & kCGEventFlagMaskAlternate) != 0) { - outMask |= optionKey; - } - if ((mask & kCGEventFlagMaskAlphaShift) != 0) { - outMask |= alphaLock; - } - if ((mask & kCGEventFlagMaskNumericPad) != 0) { - outMask |= s_osxNumLock; - } - - return outMask; + KeyModifierMask outMask = 0; + if ((mask & kCGEventFlagMaskShift) != 0) { + outMask |= shiftKey; + } + if ((mask & kCGEventFlagMaskControl) != 0) { + outMask |= controlKey; + } + if ((mask & kCGEventFlagMaskCommand) != 0) { + outMask |= cmdKey; + } + if ((mask & kCGEventFlagMaskAlternate) != 0) { + outMask |= optionKey; + } + if ((mask & kCGEventFlagMaskAlphaShift) != 0) { + outMask |= alphaLock; + } + if ((mask & kCGEventFlagMaskNumericPad) != 0) { + outMask |= s_osxNumLock; + } + + return outMask; } KeyButton OSXKeyState::mapKeyFromEvent(KeyIDs& ids, - KeyModifierMask* maskOut, CGEventRef event) const + KeyModifierMask* maskOut, CGEventRef event) const { - ids.clear(); + ids.clear(); - // map modifier key - if (maskOut != NULL) { - KeyModifierMask activeMask = getActiveModifiers(); - activeMask &= ~KeyModifierAltGr; - *maskOut = activeMask; - } + // map modifier key + if (maskOut != NULL) { + KeyModifierMask activeMask = getActiveModifiers(); + activeMask &= ~KeyModifierAltGr; + *maskOut = activeMask; + } - // get virtual key - UInt32 vkCode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); + // get virtual key + UInt32 vkCode = CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); - // handle up events - UInt32 eventKind = CGEventGetType(event); - if (eventKind == kCGEventKeyUp) { - // the id isn't used. we just need the same button we used on - // the key press. note that we don't use or reset the dead key - // state; up events should not affect the dead key state. - ids.push_back(kKeyNone); - return mapVirtualKeyToKeyButton(vkCode); - } + // handle up events + UInt32 eventKind = CGEventGetType(event); + if (eventKind == kCGEventKeyUp) { + // the id isn't used. we just need the same button we used on + // the key press. note that we don't use or reset the dead key + // state; up events should not affect the dead key state. + ids.push_back(kKeyNone); + return mapVirtualKeyToKeyButton(vkCode); + } - // check for special keys - VirtualKeyMap::const_iterator i = m_virtualKeyMap.find(vkCode); - if (i != m_virtualKeyMap.end()) { - m_deadKeyState = 0; - ids.push_back(i->second); - return mapVirtualKeyToKeyButton(vkCode); - } + // check for special keys + VirtualKeyMap::const_iterator i = m_virtualKeyMap.find(vkCode); + if (i != m_virtualKeyMap.end()) { + m_deadKeyState = 0; + ids.push_back(i->second); + return mapVirtualKeyToKeyButton(vkCode); + } - // get keyboard info - TISInputSourceRef currentKeyboardLayout = TISCopyCurrentKeyboardLayoutInputSource(); + // get keyboard info + TISInputSourceRef currentKeyboardLayout = TISCopyCurrentKeyboardLayoutInputSource(); - if (currentKeyboardLayout == NULL) { - return kKeyNone; - } + if (currentKeyboardLayout == NULL) { + return kKeyNone; + } - // get the event modifiers and remove the command and control - // keys. note if we used them though. - // UCKeyTranslate expects old-style Carbon modifiers, so convert. - UInt32 modifiers; - modifiers = mapModifiersToCarbon(CGEventGetFlags(event)); - static const UInt32 s_commandModifiers = - cmdKey | controlKey | rightControlKey; - bool isCommand = ((modifiers & s_commandModifiers) != 0); - modifiers &= ~s_commandModifiers; + // get the event modifiers and remove the command and control + // keys. note if we used them though. + // UCKeyTranslate expects old-style Carbon modifiers, so convert. + UInt32 modifiers; + modifiers = mapModifiersToCarbon(CGEventGetFlags(event)); + static const UInt32 s_commandModifiers = + cmdKey | controlKey | rightControlKey; + bool isCommand = ((modifiers & s_commandModifiers) != 0); + modifiers &= ~s_commandModifiers; - // if we've used a command key then we want the glyph produced without - // the option key (i.e. the base glyph). - //if (isCommand) { - modifiers &= ~optionKey; - //} + // if we've used a command key then we want the glyph produced without + // the option key (i.e. the base glyph). + //if (isCommand) { + modifiers &= ~optionKey; + //} - // choose action - UInt16 action; - if (eventKind==kCGEventKeyDown) { - action = kUCKeyActionDown; - } - else if (CGEventGetIntegerValueField(event, kCGKeyboardEventAutorepeat)==1) { - action = kUCKeyActionAutoKey; - } - else { - return 0; - } + // choose action + UInt16 action; + if (eventKind==kCGEventKeyDown) { + action = kUCKeyActionDown; + } + else if (CGEventGetIntegerValueField(event, kCGKeyboardEventAutorepeat)==1) { + action = kUCKeyActionAutoKey; + } + else { + return 0; + } - // translate via uchr resource - CFDataRef ref = (CFDataRef) TISGetInputSourceProperty(currentKeyboardLayout, - kTISPropertyUnicodeKeyLayoutData); - const UCKeyboardLayout* layout = (const UCKeyboardLayout*) CFDataGetBytePtr(ref); - const bool layoutValid = (layout != NULL); + // translate via uchr resource + CFDataRef ref = (CFDataRef) TISGetInputSourceProperty(currentKeyboardLayout, + kTISPropertyUnicodeKeyLayoutData); + const UCKeyboardLayout* layout = (const UCKeyboardLayout*) CFDataGetBytePtr(ref); + const bool layoutValid = (layout != NULL); - if (layoutValid) { - // translate key - UniCharCount count; - UniChar chars[2]; - LOG((CLOG_DEBUG2 "modifiers: %08x", modifiers & 0xffu)); - OSStatus status = UCKeyTranslate(layout, - vkCode & 0xffu, action, - (modifiers >> 8) & 0xffu, - LMGetKbdType(), 0, &m_deadKeyState, - sizeof(chars) / sizeof(chars[0]), &count, chars); + if (layoutValid) { + // translate key + UniCharCount count; + UniChar chars[2]; + LOG((CLOG_DEBUG2 "modifiers: %08x", modifiers & 0xffu)); + OSStatus status = UCKeyTranslate(layout, + vkCode & 0xffu, action, + (modifiers >> 8) & 0xffu, + LMGetKbdType(), 0, &m_deadKeyState, + sizeof(chars) / sizeof(chars[0]), &count, chars); - // get the characters - if (status == 0) { - if (count != 0 || m_deadKeyState == 0) { - m_deadKeyState = 0; - for (UniCharCount i = 0; i < count; ++i) { - ids.push_back(IOSXKeyResource::unicharToKeyID(chars[i])); - } - adjustAltGrModifier(ids, maskOut, isCommand); - return mapVirtualKeyToKeyButton(vkCode); - } - return 0; - } - } + // get the characters + if (status == 0) { + if (count != 0 || m_deadKeyState == 0) { + m_deadKeyState = 0; + for (UniCharCount i = 0; i < count; ++i) { + ids.push_back(IOSXKeyResource::unicharToKeyID(chars[i])); + } + adjustAltGrModifier(ids, maskOut, isCommand); + return mapVirtualKeyToKeyButton(vkCode); + } + return 0; + } + } - return 0; + return 0; } bool OSXKeyState::fakeCtrlAltDel() { - // pass keys through unchanged - return false; + // pass keys through unchanged + return false; } bool OSXKeyState::fakeMediaKey(KeyID id) { - return fakeNativeMediaKey(id);; + return fakeNativeMediaKey(id);; } CGEventFlags @@ -365,548 +365,548 @@ OSXKeyState::getModifierStateAsOSXFlags() KeyModifierMask OSXKeyState::pollActiveModifiers() const { - // falsely assumed that the mask returned by GetCurrentKeyModifiers() - // was the same as a CGEventFlags (which is what mapModifiersFromOSX - // expects). patch by Marc - UInt32 mask = GetCurrentKeyModifiers(); - KeyModifierMask outMask = 0; + // falsely assumed that the mask returned by GetCurrentKeyModifiers() + // was the same as a CGEventFlags (which is what mapModifiersFromOSX + // expects). patch by Marc + UInt32 mask = GetCurrentKeyModifiers(); + KeyModifierMask outMask = 0; - if ((mask & shiftKey) != 0) { - outMask |= KeyModifierShift; - } - if ((mask & controlKey) != 0) { - outMask |= KeyModifierControl; - } - if ((mask & optionKey) != 0) { - outMask |= KeyModifierAlt; - } - if ((mask & cmdKey) != 0) { - outMask |= KeyModifierSuper; - } - if ((mask & alphaLock) != 0) { - outMask |= KeyModifierCapsLock; - } - if ((mask & s_osxNumLock) != 0) { - outMask |= KeyModifierNumLock; - } + if ((mask & shiftKey) != 0) { + outMask |= KeyModifierShift; + } + if ((mask & controlKey) != 0) { + outMask |= KeyModifierControl; + } + if ((mask & optionKey) != 0) { + outMask |= KeyModifierAlt; + } + if ((mask & cmdKey) != 0) { + outMask |= KeyModifierSuper; + } + if ((mask & alphaLock) != 0) { + outMask |= KeyModifierCapsLock; + } + if ((mask & s_osxNumLock) != 0) { + outMask |= KeyModifierNumLock; + } - LOG((CLOG_DEBUG1 "mask=%04x outMask=%04x", mask, outMask)); - return outMask; + LOG((CLOG_DEBUG1 "mask=%04x outMask=%04x", mask, outMask)); + return outMask; } SInt32 OSXKeyState::pollActiveGroup() const { - TISInputSourceRef keyboardLayout = TISCopyCurrentKeyboardLayoutInputSource(); - CFDataRef id = (CFDataRef)TISGetInputSourceProperty( - keyboardLayout, kTISPropertyInputSourceID); - - GroupMap::const_iterator i = m_groupMap.find(id); - if (i != m_groupMap.end()) { - return i->second; - } - - LOG((CLOG_DEBUG "can't get the active group, use the first group instead")); + TISInputSourceRef keyboardLayout = TISCopyCurrentKeyboardLayoutInputSource(); + CFDataRef id = (CFDataRef)TISGetInputSourceProperty( + keyboardLayout, kTISPropertyInputSourceID); + + GroupMap::const_iterator i = m_groupMap.find(id); + if (i != m_groupMap.end()) { + return i->second; + } + + LOG((CLOG_DEBUG "can't get the active group, use the first group instead")); - return 0; + return 0; } void OSXKeyState::pollPressedKeys(KeyButtonSet& pressedKeys) const { - ::KeyMap km; - GetKeys(km); - const UInt8* m = reinterpret_cast(km); - for (UInt32 i = 0; i < 16; ++i) { - for (UInt32 j = 0; j < 8; ++j) { - if ((m[i] & (1u << j)) != 0) { - pressedKeys.insert(mapVirtualKeyToKeyButton(8 * i + j)); - } - } - } + ::KeyMap km; + GetKeys(km); + const UInt8* m = reinterpret_cast(km); + for (UInt32 i = 0; i < 16; ++i) { + for (UInt32 j = 0; j < 8; ++j) { + if ((m[i] & (1u << j)) != 0) { + pressedKeys.insert(mapVirtualKeyToKeyButton(8 * i + j)); + } + } + } } void OSXKeyState::getKeyMap(synergy::KeyMap& keyMap) { - // update keyboard groups - if (getGroups(m_groups)) { - m_groupMap.clear(); - SInt32 numGroups = (SInt32)m_groups.size(); - for (SInt32 g = 0; g < numGroups; ++g) { - CFDataRef id = (CFDataRef)TISGetInputSourceProperty( - m_groups[g], kTISPropertyInputSourceID); - m_groupMap[id] = g; - } - } + // update keyboard groups + if (getGroups(m_groups)) { + m_groupMap.clear(); + SInt32 numGroups = (SInt32)m_groups.size(); + for (SInt32 g = 0; g < numGroups; ++g) { + CFDataRef id = (CFDataRef)TISGetInputSourceProperty( + m_groups[g], kTISPropertyInputSourceID); + m_groupMap[id] = g; + } + } - UInt32 keyboardType = LMGetKbdType(); - for (SInt32 g = 0, n = (SInt32)m_groups.size(); g < n; ++g) { - // add special keys - getKeyMapForSpecialKeys(keyMap, g); + UInt32 keyboardType = LMGetKbdType(); + for (SInt32 g = 0, n = (SInt32)m_groups.size(); g < n; ++g) { + // add special keys + getKeyMapForSpecialKeys(keyMap, g); - const void* resource; - bool layoutValid = false; - - // add regular keys - // try uchr resource first - CFDataRef resourceRef = (CFDataRef)TISGetInputSourceProperty( - m_groups[g], kTISPropertyUnicodeKeyLayoutData); + const void* resource; + bool layoutValid = false; + + // add regular keys + // try uchr resource first + CFDataRef resourceRef = (CFDataRef)TISGetInputSourceProperty( + m_groups[g], kTISPropertyUnicodeKeyLayoutData); - layoutValid = resourceRef != NULL; - if (layoutValid) - resource = CFDataGetBytePtr(resourceRef); + layoutValid = resourceRef != NULL; + if (layoutValid) + resource = CFDataGetBytePtr(resourceRef); - if (layoutValid) { - OSXUchrKeyResource uchr(resource, keyboardType); - if (uchr.isValid()) { - LOG((CLOG_DEBUG1 "using uchr resource for group %d", g)); - getKeyMap(keyMap, g, uchr); - continue; - } - } + if (layoutValid) { + OSXUchrKeyResource uchr(resource, keyboardType); + if (uchr.isValid()) { + LOG((CLOG_DEBUG1 "using uchr resource for group %d", g)); + getKeyMap(keyMap, g, uchr); + continue; + } + } - LOG((CLOG_DEBUG1 "no keyboard resource for group %d", g)); - } + LOG((CLOG_DEBUG1 "no keyboard resource for group %d", g)); + } } static io_connect_t getEventDriver(void) { - static mach_port_t sEventDrvrRef = 0; - mach_port_t masterPort, service, iter; - kern_return_t kr; - - if (!sEventDrvrRef) { - // Get master device port - kr = IOMasterPort(bootstrap_port, &masterPort); - assert(KERN_SUCCESS == kr); - - kr = IOServiceGetMatchingServices(masterPort, - IOServiceMatching(kIOHIDSystemClass), &iter); - assert(KERN_SUCCESS == kr); - - service = IOIteratorNext(iter); - assert(service); - - kr = IOServiceOpen(service, mach_task_self(), - kIOHIDParamConnectType, &sEventDrvrRef); - assert(KERN_SUCCESS == kr); + static mach_port_t sEventDrvrRef = 0; + mach_port_t masterPort, service, iter; + kern_return_t kr; + + if (!sEventDrvrRef) { + // Get master device port + kr = IOMasterPort(bootstrap_port, &masterPort); + assert(KERN_SUCCESS == kr); + + kr = IOServiceGetMatchingServices(masterPort, + IOServiceMatching(kIOHIDSystemClass), &iter); + assert(KERN_SUCCESS == kr); + + service = IOIteratorNext(iter); + assert(service); + + kr = IOServiceOpen(service, mach_task_self(), + kIOHIDParamConnectType, &sEventDrvrRef); + assert(KERN_SUCCESS == kr); - IOObjectRelease(service); - IOObjectRelease(iter); - } - - return sEventDrvrRef; + IOObjectRelease(service); + IOObjectRelease(iter); + } + + return sEventDrvrRef; } void OSXKeyState::postHIDVirtualKey(const UInt8 virtualKeyCode, - const bool postDown) + const bool postDown) { - static UInt32 modifiers = 0; - - NXEventData event; - IOGPoint loc = { 0, 0 }; - UInt32 modifiersDelta = 0; + static UInt32 modifiers = 0; + + NXEventData event; + IOGPoint loc = { 0, 0 }; + UInt32 modifiersDelta = 0; - bzero(&event, sizeof(NXEventData)); + bzero(&event, sizeof(NXEventData)); - switch (virtualKeyCode) - { - case s_shiftVK: - case s_superVK: - case s_altVK: - case s_controlVK: - case s_capsLockVK: - switch (virtualKeyCode) - { - case s_shiftVK: - modifiersDelta = NX_SHIFTMASK; - m_shiftPressed = postDown; - break; - case s_superVK: - modifiersDelta = NX_COMMANDMASK; - m_superPressed = postDown; - break; - case s_altVK: - modifiersDelta = NX_ALTERNATEMASK; - m_altPressed = postDown; - break; - case s_controlVK: - modifiersDelta = NX_CONTROLMASK; - m_controlPressed = postDown; - break; - case s_capsLockVK: - modifiersDelta = NX_ALPHASHIFTMASK; - m_capsPressed = postDown; - break; - } - - // update the modifier bit - if (postDown) { - modifiers |= modifiersDelta; - } - else { - modifiers &= ~modifiersDelta; - } - - kern_return_t kr; - kr = IOHIDPostEvent(getEventDriver(), NX_FLAGSCHANGED, loc, - &event, kNXEventDataVersion, modifiers, true); - assert(KERN_SUCCESS == kr); - break; + switch (virtualKeyCode) + { + case s_shiftVK: + case s_superVK: + case s_altVK: + case s_controlVK: + case s_capsLockVK: + switch (virtualKeyCode) + { + case s_shiftVK: + modifiersDelta = NX_SHIFTMASK; + m_shiftPressed = postDown; + break; + case s_superVK: + modifiersDelta = NX_COMMANDMASK; + m_superPressed = postDown; + break; + case s_altVK: + modifiersDelta = NX_ALTERNATEMASK; + m_altPressed = postDown; + break; + case s_controlVK: + modifiersDelta = NX_CONTROLMASK; + m_controlPressed = postDown; + break; + case s_capsLockVK: + modifiersDelta = NX_ALPHASHIFTMASK; + m_capsPressed = postDown; + break; + } + + // update the modifier bit + if (postDown) { + modifiers |= modifiersDelta; + } + else { + modifiers &= ~modifiersDelta; + } + + kern_return_t kr; + kr = IOHIDPostEvent(getEventDriver(), NX_FLAGSCHANGED, loc, + &event, kNXEventDataVersion, modifiers, true); + assert(KERN_SUCCESS == kr); + break; - default: - event.key.repeat = false; - event.key.keyCode = virtualKeyCode; - event.key.origCharSet = event.key.charSet = NX_ASCIISET; - event.key.origCharCode = event.key.charCode = 0; - kr = IOHIDPostEvent(getEventDriver(), - postDown ? NX_KEYDOWN : NX_KEYUP, - loc, &event, kNXEventDataVersion, 0, false); - assert(KERN_SUCCESS == kr); - break; - } + default: + event.key.repeat = false; + event.key.keyCode = virtualKeyCode; + event.key.origCharSet = event.key.charSet = NX_ASCIISET; + event.key.origCharCode = event.key.charCode = 0; + kr = IOHIDPostEvent(getEventDriver(), + postDown ? NX_KEYDOWN : NX_KEYUP, + loc, &event, kNXEventDataVersion, 0, false); + assert(KERN_SUCCESS == kr); + break; + } } void OSXKeyState::fakeKey(const Keystroke& keystroke) { - switch (keystroke.m_type) { - case Keystroke::kButton: { - - KeyButton button = keystroke.m_data.m_button.m_button; - bool keyDown = keystroke.m_data.m_button.m_press; - CGKeyCode virtualKey = mapKeyButtonToVirtualKey(button); - - LOG((CLOG_DEBUG1 - " button=0x%04x virtualKey=0x%04x keyDown=%s", - button, virtualKey, keyDown ? "down" : "up")); + switch (keystroke.m_type) { + case Keystroke::kButton: { + + KeyButton button = keystroke.m_data.m_button.m_button; + bool keyDown = keystroke.m_data.m_button.m_press; + CGKeyCode virtualKey = mapKeyButtonToVirtualKey(button); + + LOG((CLOG_DEBUG1 + " button=0x%04x virtualKey=0x%04x keyDown=%s", + button, virtualKey, keyDown ? "down" : "up")); - postHIDVirtualKey(virtualKey, keyDown); + postHIDVirtualKey(virtualKey, keyDown); - break; - } + break; + } - case Keystroke::kGroup: { - SInt32 group = keystroke.m_data.m_group.m_group; - if (keystroke.m_data.m_group.m_absolute) { - LOG((CLOG_DEBUG1 " group %d", group)); - setGroup(group); - } - else { - LOG((CLOG_DEBUG1 " group %+d", group)); - setGroup(getEffectiveGroup(pollActiveGroup(), group)); - } - break; - } - } + case Keystroke::kGroup: { + SInt32 group = keystroke.m_data.m_group.m_group; + if (keystroke.m_data.m_group.m_absolute) { + LOG((CLOG_DEBUG1 " group %d", group)); + setGroup(group); + } + else { + LOG((CLOG_DEBUG1 " group %+d", group)); + setGroup(getEffectiveGroup(pollActiveGroup(), group)); + } + break; + } + } } void OSXKeyState::getKeyMapForSpecialKeys(synergy::KeyMap& keyMap, SInt32 group) const { - // special keys are insensitive to modifers and none are dead keys - synergy::KeyMap::KeyItem item; - for (size_t i = 0; i < sizeof(s_controlKeys) / - sizeof(s_controlKeys[0]); ++i) { - const KeyEntry& entry = s_controlKeys[i]; - item.m_id = entry.m_keyID; - item.m_group = group; - item.m_button = mapVirtualKeyToKeyButton(entry.m_virtualKey); - item.m_required = 0; - item.m_sensitive = 0; - item.m_dead = false; - item.m_client = 0; - synergy::KeyMap::initModifierKey(item); - keyMap.addKeyEntry(item); + // special keys are insensitive to modifers and none are dead keys + synergy::KeyMap::KeyItem item; + for (size_t i = 0; i < sizeof(s_controlKeys) / + sizeof(s_controlKeys[0]); ++i) { + const KeyEntry& entry = s_controlKeys[i]; + item.m_id = entry.m_keyID; + item.m_group = group; + item.m_button = mapVirtualKeyToKeyButton(entry.m_virtualKey); + item.m_required = 0; + item.m_sensitive = 0; + item.m_dead = false; + item.m_client = 0; + synergy::KeyMap::initModifierKey(item); + keyMap.addKeyEntry(item); - if (item.m_lock) { - // all locking keys are half duplex on OS X - keyMap.addHalfDuplexButton(item.m_button); - } - } + if (item.m_lock) { + // all locking keys are half duplex on OS X + keyMap.addHalfDuplexButton(item.m_button); + } + } - // note: we don't special case the number pad keys. querying the - // mac keyboard returns the non-keypad version of those keys but - // a KeyState always provides a mapping from keypad keys to - // non-keypad keys so we'll be able to generate the characters - // anyway. + // note: we don't special case the number pad keys. querying the + // mac keyboard returns the non-keypad version of those keys but + // a KeyState always provides a mapping from keypad keys to + // non-keypad keys so we'll be able to generate the characters + // anyway. } bool OSXKeyState::getKeyMap(synergy::KeyMap& keyMap, - SInt32 group, const IOSXKeyResource& r) const + SInt32 group, const IOSXKeyResource& r) const { - if (!r.isValid()) { - return false; - } + if (!r.isValid()) { + return false; + } - // space for all possible modifier combinations - std::vector modifiers(r.getNumModifierCombinations()); + // space for all possible modifier combinations + std::vector modifiers(r.getNumModifierCombinations()); - // make space for the keys that any single button can synthesize - std::vector > buttonKeys(r.getNumTables()); + // make space for the keys that any single button can synthesize + std::vector > buttonKeys(r.getNumTables()); - // iterate over each button - synergy::KeyMap::KeyItem item; - for (UInt32 i = 0; i < r.getNumButtons(); ++i) { - item.m_button = mapVirtualKeyToKeyButton(i); + // iterate over each button + synergy::KeyMap::KeyItem item; + for (UInt32 i = 0; i < r.getNumButtons(); ++i) { + item.m_button = mapVirtualKeyToKeyButton(i); - // the KeyIDs we've already handled - std::set keys; + // the KeyIDs we've already handled + std::set keys; - // convert the entry in each table for this button to a KeyID - for (UInt32 j = 0; j < r.getNumTables(); ++j) { - buttonKeys[j].first = r.getKey(j, i); - buttonKeys[j].second = synergy::KeyMap::isDeadKey(buttonKeys[j].first); - } + // convert the entry in each table for this button to a KeyID + for (UInt32 j = 0; j < r.getNumTables(); ++j) { + buttonKeys[j].first = r.getKey(j, i); + buttonKeys[j].second = synergy::KeyMap::isDeadKey(buttonKeys[j].first); + } - // iterate over each character table - for (UInt32 j = 0; j < r.getNumTables(); ++j) { - // get the KeyID for the button/table - KeyID id = buttonKeys[j].first; - if (id == kKeyNone) { - continue; - } + // iterate over each character table + for (UInt32 j = 0; j < r.getNumTables(); ++j) { + // get the KeyID for the button/table + KeyID id = buttonKeys[j].first; + if (id == kKeyNone) { + continue; + } - // if we've already handled the KeyID in the table then - // move on to the next table - if (keys.count(id) > 0) { - continue; - } - keys.insert(id); + // if we've already handled the KeyID in the table then + // move on to the next table + if (keys.count(id) > 0) { + continue; + } + keys.insert(id); - // prepare item. the client state is 1 for dead keys. - item.m_id = id; - item.m_group = group; - item.m_dead = buttonKeys[j].second; - item.m_client = buttonKeys[j].second ? 1 : 0; - synergy::KeyMap::initModifierKey(item); - if (item.m_lock) { - // all locking keys are half duplex on OS X - keyMap.addHalfDuplexButton(i); - } + // prepare item. the client state is 1 for dead keys. + item.m_id = id; + item.m_group = group; + item.m_dead = buttonKeys[j].second; + item.m_client = buttonKeys[j].second ? 1 : 0; + synergy::KeyMap::initModifierKey(item); + if (item.m_lock) { + // all locking keys are half duplex on OS X + keyMap.addHalfDuplexButton(i); + } - // collect the tables that map to the same KeyID. we know it - // can't be any earlier tables because of the check above. - std::set tables; - tables.insert(static_cast(j)); - for (UInt32 k = j + 1; k < r.getNumTables(); ++k) { - if (buttonKeys[k].first == id) { - tables.insert(static_cast(k)); - } - } + // collect the tables that map to the same KeyID. we know it + // can't be any earlier tables because of the check above. + std::set tables; + tables.insert(static_cast(j)); + for (UInt32 k = j + 1; k < r.getNumTables(); ++k) { + if (buttonKeys[k].first == id) { + tables.insert(static_cast(k)); + } + } - // collect the modifier combinations that map to any of the - // tables we just collected - for (UInt32 k = 0; k < r.getNumModifierCombinations(); ++k) { - modifiers[k] = (tables.count(r.getTableForModifier(k)) > 0); - } + // collect the modifier combinations that map to any of the + // tables we just collected + for (UInt32 k = 0; k < r.getNumModifierCombinations(); ++k) { + modifiers[k] = (tables.count(r.getTableForModifier(k)) > 0); + } - // figure out which modifiers the key is sensitive to. the - // key is insensitive to a modifier if for every modifier mask - // with the modifier bit unset in the modifiers we also find - // the same mask with the bit set. - // - // we ignore a few modifiers that we know aren't important - // for generating characters. in fact, we want to ignore any - // characters generated by the control key. we don't map - // those and instead expect the control modifier plus a key. - UInt32 sensitive = 0; - for (UInt32 k = 0; (1u << k) < - r.getNumModifierCombinations(); ++k) { - UInt32 bit = (1u << k); - if ((bit << 8) == cmdKey || - (bit << 8) == controlKey || - (bit << 8) == rightControlKey) { - continue; - } - for (UInt32 m = 0; m < r.getNumModifierCombinations(); ++m) { - if (modifiers[m] != modifiers[m ^ bit]) { - sensitive |= bit; - break; - } - } - } + // figure out which modifiers the key is sensitive to. the + // key is insensitive to a modifier if for every modifier mask + // with the modifier bit unset in the modifiers we also find + // the same mask with the bit set. + // + // we ignore a few modifiers that we know aren't important + // for generating characters. in fact, we want to ignore any + // characters generated by the control key. we don't map + // those and instead expect the control modifier plus a key. + UInt32 sensitive = 0; + for (UInt32 k = 0; (1u << k) < + r.getNumModifierCombinations(); ++k) { + UInt32 bit = (1u << k); + if ((bit << 8) == cmdKey || + (bit << 8) == controlKey || + (bit << 8) == rightControlKey) { + continue; + } + for (UInt32 m = 0; m < r.getNumModifierCombinations(); ++m) { + if (modifiers[m] != modifiers[m ^ bit]) { + sensitive |= bit; + break; + } + } + } - // find each required modifier mask. the key can be synthesized - // using any of the masks. - std::set required; - for (UInt32 k = 0; k < r.getNumModifierCombinations(); ++k) { - if ((k & sensitive) == k && modifiers[k & sensitive]) { - required.insert(k); - } - } + // find each required modifier mask. the key can be synthesized + // using any of the masks. + std::set required; + for (UInt32 k = 0; k < r.getNumModifierCombinations(); ++k) { + if ((k & sensitive) == k && modifiers[k & sensitive]) { + required.insert(k); + } + } - // now add a key entry for each key/required modifier pair. - item.m_sensitive = mapModifiersFromOSX(sensitive << 16); - for (std::set::iterator k = required.begin(); - k != required.end(); ++k) { - item.m_required = mapModifiersFromOSX(*k << 16); - keyMap.addKeyEntry(item); - } - } - } + // now add a key entry for each key/required modifier pair. + item.m_sensitive = mapModifiersFromOSX(sensitive << 16); + for (std::set::iterator k = required.begin(); + k != required.end(); ++k) { + item.m_required = mapModifiersFromOSX(*k << 16); + keyMap.addKeyEntry(item); + } + } + } - return true; + return true; } bool OSXKeyState::mapSynergyHotKeyToMac(KeyID key, KeyModifierMask mask, - UInt32 &macVirtualKey, UInt32 &macModifierMask) const + UInt32 &macVirtualKey, UInt32 &macModifierMask) const { - // look up button for key - KeyButton button = getButton(key, pollActiveGroup()); - if (button == 0 && key != kKeyNone) { - return false; - } - macVirtualKey = mapKeyButtonToVirtualKey(button); - - // calculate modifier mask - macModifierMask = 0; - if ((mask & KeyModifierShift) != 0) { - macModifierMask |= shiftKey; - } - if ((mask & KeyModifierControl) != 0) { - macModifierMask |= controlKey; - } - if ((mask & KeyModifierAlt) != 0) { - macModifierMask |= cmdKey; - } - if ((mask & KeyModifierSuper) != 0) { - macModifierMask |= optionKey; - } - if ((mask & KeyModifierCapsLock) != 0) { - macModifierMask |= alphaLock; - } - if ((mask & KeyModifierNumLock) != 0) { - macModifierMask |= s_osxNumLock; - } - - return true; + // look up button for key + KeyButton button = getButton(key, pollActiveGroup()); + if (button == 0 && key != kKeyNone) { + return false; + } + macVirtualKey = mapKeyButtonToVirtualKey(button); + + // calculate modifier mask + macModifierMask = 0; + if ((mask & KeyModifierShift) != 0) { + macModifierMask |= shiftKey; + } + if ((mask & KeyModifierControl) != 0) { + macModifierMask |= controlKey; + } + if ((mask & KeyModifierAlt) != 0) { + macModifierMask |= cmdKey; + } + if ((mask & KeyModifierSuper) != 0) { + macModifierMask |= optionKey; + } + if ((mask & KeyModifierCapsLock) != 0) { + macModifierMask |= alphaLock; + } + if ((mask & KeyModifierNumLock) != 0) { + macModifierMask |= s_osxNumLock; + } + + return true; } - + void OSXKeyState::handleModifierKeys(void* target, - KeyModifierMask oldMask, KeyModifierMask newMask) + KeyModifierMask oldMask, KeyModifierMask newMask) { - // compute changed modifiers - KeyModifierMask changed = (oldMask ^ newMask); + // compute changed modifiers + KeyModifierMask changed = (oldMask ^ newMask); - // synthesize changed modifier keys - if ((changed & KeyModifierShift) != 0) { - handleModifierKey(target, s_shiftVK, kKeyShift_L, - (newMask & KeyModifierShift) != 0, newMask); - } - if ((changed & KeyModifierControl) != 0) { - handleModifierKey(target, s_controlVK, kKeyControl_L, - (newMask & KeyModifierControl) != 0, newMask); - } - if ((changed & KeyModifierAlt) != 0) { - handleModifierKey(target, s_altVK, kKeyAlt_L, - (newMask & KeyModifierAlt) != 0, newMask); - } - if ((changed & KeyModifierSuper) != 0) { - handleModifierKey(target, s_superVK, kKeySuper_L, - (newMask & KeyModifierSuper) != 0, newMask); - } - if ((changed & KeyModifierCapsLock) != 0) { - handleModifierKey(target, s_capsLockVK, kKeyCapsLock, - (newMask & KeyModifierCapsLock) != 0, newMask); - } - if ((changed & KeyModifierNumLock) != 0) { - handleModifierKey(target, s_numLockVK, kKeyNumLock, - (newMask & KeyModifierNumLock) != 0, newMask); - } + // synthesize changed modifier keys + if ((changed & KeyModifierShift) != 0) { + handleModifierKey(target, s_shiftVK, kKeyShift_L, + (newMask & KeyModifierShift) != 0, newMask); + } + if ((changed & KeyModifierControl) != 0) { + handleModifierKey(target, s_controlVK, kKeyControl_L, + (newMask & KeyModifierControl) != 0, newMask); + } + if ((changed & KeyModifierAlt) != 0) { + handleModifierKey(target, s_altVK, kKeyAlt_L, + (newMask & KeyModifierAlt) != 0, newMask); + } + if ((changed & KeyModifierSuper) != 0) { + handleModifierKey(target, s_superVK, kKeySuper_L, + (newMask & KeyModifierSuper) != 0, newMask); + } + if ((changed & KeyModifierCapsLock) != 0) { + handleModifierKey(target, s_capsLockVK, kKeyCapsLock, + (newMask & KeyModifierCapsLock) != 0, newMask); + } + if ((changed & KeyModifierNumLock) != 0) { + handleModifierKey(target, s_numLockVK, kKeyNumLock, + (newMask & KeyModifierNumLock) != 0, newMask); + } } void OSXKeyState::handleModifierKey(void* target, - UInt32 virtualKey, KeyID id, - bool down, KeyModifierMask newMask) + UInt32 virtualKey, KeyID id, + bool down, KeyModifierMask newMask) { - KeyButton button = mapVirtualKeyToKeyButton(virtualKey); - onKey(button, down, newMask); - sendKeyEvent(target, down, false, id, newMask, 0, button); + KeyButton button = mapVirtualKeyToKeyButton(virtualKey); + onKey(button, down, newMask); + sendKeyEvent(target, down, false, id, newMask, 0, button); } bool OSXKeyState::getGroups(GroupList& groups) const { - CFIndex n; - bool gotLayouts = false; + CFIndex n; + bool gotLayouts = false; - // get number of layouts - CFStringRef keys[] = { kTISPropertyInputSourceCategory }; - CFStringRef values[] = { kTISCategoryKeyboardInputSource }; - CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 1, NULL, NULL); - CFArrayRef kbds = TISCreateInputSourceList(dict, false); - n = CFArrayGetCount(kbds); - gotLayouts = (n != 0); + // get number of layouts + CFStringRef keys[] = { kTISPropertyInputSourceCategory }; + CFStringRef values[] = { kTISCategoryKeyboardInputSource }; + CFDictionaryRef dict = CFDictionaryCreate(NULL, (const void **)keys, (const void **)values, 1, NULL, NULL); + CFArrayRef kbds = TISCreateInputSourceList(dict, false); + n = CFArrayGetCount(kbds); + gotLayouts = (n != 0); - if (!gotLayouts) { - LOG((CLOG_DEBUG1 "can't get keyboard layouts")); - return false; - } + if (!gotLayouts) { + LOG((CLOG_DEBUG1 "can't get keyboard layouts")); + return false; + } - // get each layout - groups.clear(); - for (CFIndex i = 0; i < n; ++i) { - bool addToGroups = true; - TISInputSourceRef keyboardLayout = - (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, i); + // get each layout + groups.clear(); + for (CFIndex i = 0; i < n; ++i) { + bool addToGroups = true; + TISInputSourceRef keyboardLayout = + (TISInputSourceRef)CFArrayGetValueAtIndex(kbds, i); - if (addToGroups) - groups.push_back(keyboardLayout); - } - return true; + if (addToGroups) + groups.push_back(keyboardLayout); + } + return true; } void OSXKeyState::setGroup(SInt32 group) { - TISSetInputMethodKeyboardLayoutOverride(m_groups[group]); + TISSetInputMethodKeyboardLayoutOverride(m_groups[group]); } void OSXKeyState::checkKeyboardLayout() { - // XXX -- should call this when notified that groups have changed. - // if no notification for that then we should poll. - GroupList groups; - if (getGroups(groups) && groups != m_groups) { - updateKeyMap(); - updateKeyState(); - } + // XXX -- should call this when notified that groups have changed. + // if no notification for that then we should poll. + GroupList groups; + if (getGroups(groups) && groups != m_groups) { + updateKeyMap(); + updateKeyState(); + } } void OSXKeyState::adjustAltGrModifier(const KeyIDs& ids, - KeyModifierMask* mask, bool isCommand) const + KeyModifierMask* mask, bool isCommand) const { - if (!isCommand) { - for (KeyIDs::const_iterator i = ids.begin(); i != ids.end(); ++i) { - KeyID id = *i; - if (id != kKeyNone && - ((id < 0xe000u || id > 0xefffu) || - (id >= kKeyKP_Equal && id <= kKeyKP_9))) { - *mask |= KeyModifierAltGr; - return; - } - } - } + if (!isCommand) { + for (KeyIDs::const_iterator i = ids.begin(); i != ids.end(); ++i) { + KeyID id = *i; + if (id != kKeyNone && + ((id < 0xe000u || id > 0xefffu) || + (id >= kKeyKP_Equal && id <= kKeyKP_9))) { + *mask |= KeyModifierAltGr; + return; + } + } + } } KeyButton OSXKeyState::mapVirtualKeyToKeyButton(UInt32 keyCode) { - // 'A' maps to 0 so shift every id - return static_cast(keyCode + KeyButtonOffset); + // 'A' maps to 0 so shift every id + return static_cast(keyCode + KeyButtonOffset); } UInt32 OSXKeyState::mapKeyButtonToVirtualKey(KeyButton keyButton) { - return static_cast(keyButton - KeyButtonOffset); + return static_cast(keyButton - KeyButtonOffset); } diff --git a/src/lib/platform/OSXKeyState.h b/src/lib/platform/OSXKeyState.h index a3e16315..ac951671 100644 --- a/src/lib/platform/OSXKeyState.h +++ b/src/lib/platform/OSXKeyState.h @@ -34,147 +34,147 @@ A key state for OS X. */ class OSXKeyState : public KeyState { public: - typedef std::vector KeyIDs; + typedef std::vector KeyIDs; - OSXKeyState(IEventQueue* events); - OSXKeyState(IEventQueue* events, synergy::KeyMap& keyMap); - virtual ~OSXKeyState(); + OSXKeyState(IEventQueue* events); + OSXKeyState(IEventQueue* events, synergy::KeyMap& keyMap); + virtual ~OSXKeyState(); - //! @name modifiers - //@{ + //! @name modifiers + //@{ - //! Handle modifier key change - /*! - Determines which modifier keys have changed and updates the modifier - state and sends key events as appropriate. - */ - void handleModifierKeys(void* target, - KeyModifierMask oldMask, KeyModifierMask newMask); + //! Handle modifier key change + /*! + Determines which modifier keys have changed and updates the modifier + state and sends key events as appropriate. + */ + void handleModifierKeys(void* target, + KeyModifierMask oldMask, KeyModifierMask newMask); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Convert OS X modifier mask to synergy mask - /*! - Returns the synergy modifier mask corresponding to the OS X modifier - mask in \p mask. - */ - KeyModifierMask mapModifiersFromOSX(UInt32 mask) const; + //! Convert OS X modifier mask to synergy mask + /*! + Returns the synergy modifier mask corresponding to the OS X modifier + mask in \p mask. + */ + KeyModifierMask mapModifiersFromOSX(UInt32 mask) const; - //! Convert CG flags-style modifier mask to old-style Carbon - /*! - Still required in a few places for translation calls. - */ - KeyModifierMask mapModifiersToCarbon(UInt32 mask) const; - - //! Map key event to keys - /*! - Converts a key event into a sequence of KeyIDs and the shadow modifier - state to a modifier mask. The KeyIDs list, in order, the characters - generated by the key press/release. It returns the id of the button - that was pressed or released, or 0 if the button doesn't map to a known - KeyID. - */ - KeyButton mapKeyFromEvent(KeyIDs& ids, - KeyModifierMask* maskOut, CGEventRef event) const; + //! Convert CG flags-style modifier mask to old-style Carbon + /*! + Still required in a few places for translation calls. + */ + KeyModifierMask mapModifiersToCarbon(UInt32 mask) const; + + //! Map key event to keys + /*! + Converts a key event into a sequence of KeyIDs and the shadow modifier + state to a modifier mask. The KeyIDs list, in order, the characters + generated by the key press/release. It returns the id of the button + that was pressed or released, or 0 if the button doesn't map to a known + KeyID. + */ + KeyButton mapKeyFromEvent(KeyIDs& ids, + KeyModifierMask* maskOut, CGEventRef event) const; - //! Map key and mask to native values - /*! - Calculates mac virtual key and mask for a key \p key and modifiers - \p mask. Returns \c true if the key can be mapped, \c false otherwise. - */ - bool mapSynergyHotKeyToMac(KeyID key, KeyModifierMask mask, - UInt32& macVirtualKey, - UInt32& macModifierMask) const; + //! Map key and mask to native values + /*! + Calculates mac virtual key and mask for a key \p key and modifiers + \p mask. Returns \c true if the key can be mapped, \c false otherwise. + */ + bool mapSynergyHotKeyToMac(KeyID key, KeyModifierMask mask, + UInt32& macVirtualKey, + UInt32& macModifierMask) const; - //@} + //@} - // IKeyState overrides - virtual bool fakeCtrlAltDel(); - virtual bool fakeMediaKey(KeyID id); - virtual KeyModifierMask - pollActiveModifiers() const; - virtual SInt32 pollActiveGroup() const; - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; + // IKeyState overrides + virtual bool fakeCtrlAltDel(); + virtual bool fakeMediaKey(KeyID id); + virtual KeyModifierMask + pollActiveModifiers() const; + virtual SInt32 pollActiveGroup() const; + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; CGEventFlags getModifierStateAsOSXFlags(); protected: - // KeyState overrides - virtual void getKeyMap(synergy::KeyMap& keyMap); - virtual void fakeKey(const Keystroke& keystroke); + // KeyState overrides + virtual void getKeyMap(synergy::KeyMap& keyMap); + virtual void fakeKey(const Keystroke& keystroke); private: - class KeyResource; - typedef std::vector GroupList; + class KeyResource; + typedef std::vector GroupList; - // Add hard coded special keys to a synergy::KeyMap. - void getKeyMapForSpecialKeys( - synergy::KeyMap& keyMap, SInt32 group) const; + // Add hard coded special keys to a synergy::KeyMap. + void getKeyMapForSpecialKeys( + synergy::KeyMap& keyMap, SInt32 group) const; - // Convert keyboard resource to a key map - bool getKeyMap(synergy::KeyMap& keyMap, - SInt32 group, const IOSXKeyResource& r) const; + // Convert keyboard resource to a key map + bool getKeyMap(synergy::KeyMap& keyMap, + SInt32 group, const IOSXKeyResource& r) const; - // Get the available keyboard groups - bool getGroups(GroupList&) const; + // Get the available keyboard groups + bool getGroups(GroupList&) const; - // Change active keyboard group to group - void setGroup(SInt32 group); + // Change active keyboard group to group + void setGroup(SInt32 group); - // Check if the keyboard layout has changed and update keyboard state - // if so. - void checkKeyboardLayout(); + // Check if the keyboard layout has changed and update keyboard state + // if so. + void checkKeyboardLayout(); - // Send an event for the given modifier key - void handleModifierKey(void* target, - UInt32 virtualKey, KeyID id, - bool down, KeyModifierMask newMask); + // Send an event for the given modifier key + void handleModifierKey(void* target, + UInt32 virtualKey, KeyID id, + bool down, KeyModifierMask newMask); - // Checks if any in \p ids is a glyph key and if \p isCommand is false. - // If so it adds the AltGr modifier to \p mask. This allows OS X - // servers to use the option key both as AltGr and as a modifier. If - // option is acting as AltGr (i.e. it generates a glyph and there are - // no command modifiers active) then we don't send the super modifier - // to clients because they'd try to match it as a command modifier. - void adjustAltGrModifier(const KeyIDs& ids, - KeyModifierMask* mask, bool isCommand) const; + // Checks if any in \p ids is a glyph key and if \p isCommand is false. + // If so it adds the AltGr modifier to \p mask. This allows OS X + // servers to use the option key both as AltGr and as a modifier. If + // option is acting as AltGr (i.e. it generates a glyph and there are + // no command modifiers active) then we don't send the super modifier + // to clients because they'd try to match it as a command modifier. + void adjustAltGrModifier(const KeyIDs& ids, + KeyModifierMask* mask, bool isCommand) const; - // Maps an OS X virtual key id to a KeyButton. This simply remaps - // the ids so we don't use KeyButton 0. - static KeyButton mapVirtualKeyToKeyButton(UInt32 keyCode); + // Maps an OS X virtual key id to a KeyButton. This simply remaps + // the ids so we don't use KeyButton 0. + static KeyButton mapVirtualKeyToKeyButton(UInt32 keyCode); - // Maps a KeyButton to an OS X key code. This is the inverse of - // mapVirtualKeyToKeyButton. - static UInt32 mapKeyButtonToVirtualKey(KeyButton keyButton); + // Maps a KeyButton to an OS X key code. This is the inverse of + // mapVirtualKeyToKeyButton. + static UInt32 mapKeyButtonToVirtualKey(KeyButton keyButton); - void init(); - - // Post a key event to HID manager. It posts an event to HID client, a - // much lower level than window manager which's the target from carbon - // CGEventPost - void postHIDVirtualKey(const UInt8 virtualKeyCode, - const bool postDown); + void init(); + + // Post a key event to HID manager. It posts an event to HID client, a + // much lower level than window manager which's the target from carbon + // CGEventPost + void postHIDVirtualKey(const UInt8 virtualKeyCode, + const bool postDown); private: - // OS X uses a physical key if 0 for the 'A' key. synergy reserves - // KeyButton 0 so we offset all OS X physical key ids by this much - // when used as a KeyButton and by minus this much to map a KeyButton - // to a physical button. - enum { - KeyButtonOffset = 1 - }; + // OS X uses a physical key if 0 for the 'A' key. synergy reserves + // KeyButton 0 so we offset all OS X physical key ids by this much + // when used as a KeyButton and by minus this much to map a KeyButton + // to a physical button. + enum { + KeyButtonOffset = 1 + }; - typedef std::map GroupMap; - typedef std::map VirtualKeyMap; + typedef std::map GroupMap; + typedef std::map VirtualKeyMap; - VirtualKeyMap m_virtualKeyMap; - mutable UInt32 m_deadKeyState; - GroupList m_groups; - GroupMap m_groupMap; - bool m_shiftPressed; - bool m_controlPressed; - bool m_altPressed; - bool m_superPressed; - bool m_capsPressed; + VirtualKeyMap m_virtualKeyMap; + mutable UInt32 m_deadKeyState; + GroupList m_groups; + GroupMap m_groupMap; + bool m_shiftPressed; + bool m_controlPressed; + bool m_altPressed; + bool m_superPressed; + bool m_capsPressed; }; diff --git a/src/lib/platform/OSXMediaKeySimulator.h b/src/lib/platform/OSXMediaKeySimulator.h index 277778df..75145480 100644 --- a/src/lib/platform/OSXMediaKeySimulator.h +++ b/src/lib/platform/OSXMediaKeySimulator.h @@ -24,7 +24,7 @@ #if defined(__cplusplus) extern "C" { #endif -bool fakeNativeMediaKey(KeyID id); +bool fakeNativeMediaKey(KeyID id); #if defined(__cplusplus) } #endif diff --git a/src/lib/platform/OSXMediaKeySupport.h b/src/lib/platform/OSXMediaKeySupport.h index c62a19bc..3cecaacf 100644 --- a/src/lib/platform/OSXMediaKeySupport.h +++ b/src/lib/platform/OSXMediaKeySupport.h @@ -25,9 +25,9 @@ #if defined(__cplusplus) extern "C" { #endif -bool fakeNativeMediaKey(KeyID id); -bool isMediaKeyEvent(CGEventRef event); -bool getMediaKeyEventInfo(CGEventRef event, KeyID* keyId, bool* down, bool* isRepeat); +bool fakeNativeMediaKey(KeyID id); +bool isMediaKeyEvent(CGEventRef event); +bool getMediaKeyEventInfo(CGEventRef event, KeyID* keyId, bool* down, bool* isRepeat); #if defined(__cplusplus) } #endif diff --git a/src/lib/platform/OSXPasteboardPeeker.h b/src/lib/platform/OSXPasteboardPeeker.h index a4115173..7d368a7e 100644 --- a/src/lib/platform/OSXPasteboardPeeker.h +++ b/src/lib/platform/OSXPasteboardPeeker.h @@ -25,8 +25,8 @@ extern "C" { #endif -CFStringRef getDraggedFileURL(); - +CFStringRef getDraggedFileURL(); + #if defined(__cplusplus) } #endif diff --git a/src/lib/platform/OSXScreen.h b/src/lib/platform/OSXScreen.h index 0357583e..668e713b 100644 --- a/src/lib/platform/OSXScreen.h +++ b/src/lib/platform/OSXScreen.h @@ -53,297 +53,297 @@ class Mutex; //! Implementation of IPlatformScreen for OS X class OSXScreen : public PlatformScreen { public: - OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCursor=true); - virtual ~OSXScreen(); + OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCursor=true); + virtual ~OSXScreen(); - IEventQueue* getEvents() const { return m_events; } + IEventQueue* getEvents() const { return m_events; } - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IPrimaryScreen overrides - virtual void reconfigure(UInt32 activeSides); - virtual void warpCursor(SInt32 x, SInt32 y); - virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); - virtual void unregisterHotKey(UInt32 id); - virtual void fakeInputBegin(); - virtual void fakeInputEnd(); - virtual SInt32 getJumpZoneSize() const; - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; - virtual void getCursorCenter(SInt32& x, SInt32& y) const; + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides); + virtual void warpCursor(SInt32 x, SInt32 y); + virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); + virtual void unregisterHotKey(UInt32 id); + virtual void fakeInputBegin(); + virtual void fakeInputEnd(); + virtual SInt32 getJumpZoneSize() const; + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; + virtual void getCursorCenter(SInt32& x, SInt32& y) const; - // ISecondaryScreen overrides - virtual void fakeMouseButton(ButtonID id, bool press); - virtual void fakeMouseMove(SInt32 x, SInt32 y); - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press); + virtual void fakeMouseMove(SInt32 x, SInt32 y); + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; - // IPlatformScreen overrides - virtual void enable(); - virtual void disable(); - virtual void enter(); - virtual bool leave(); - virtual bool setClipboard(ClipboardID, const IClipboard*); - virtual void checkClipboards(); - virtual void openScreensaver(bool notify); - virtual void closeScreensaver(); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual void setSequenceNumber(UInt32); - virtual bool isPrimary() const; - virtual void fakeDraggingFiles(DragFileList fileList); - virtual String& getDraggingFilename(); - - const String& getDropTarget() const { return m_dropTarget; } - void waitForCarbonLoop() const; - + // IPlatformScreen overrides + virtual void enable(); + virtual void disable(); + virtual void enter(); + virtual bool leave(); + virtual bool setClipboard(ClipboardID, const IClipboard*); + virtual void checkClipboards(); + virtual void openScreensaver(bool notify); + virtual void closeScreensaver(); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual void setSequenceNumber(UInt32); + virtual bool isPrimary() const; + virtual void fakeDraggingFiles(DragFileList fileList); + virtual String& getDraggingFilename(); + + const String& getDropTarget() const { return m_dropTarget; } + void waitForCarbonLoop() const; + protected: - // IPlatformScreen overrides - virtual void handleSystemEvent(const Event&, void*); - virtual void updateButtons(); - virtual IKeyState* getKeyState() const; + // IPlatformScreen overrides + virtual void handleSystemEvent(const Event&, void*); + virtual void updateButtons(); + virtual IKeyState* getKeyState() const; private: - void updateScreenShape(); - void updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags); - void postMouseEvent(CGPoint&) const; - - // convenience function to send events - void sendEvent(Event::Type type, void* = NULL) const; - void sendClipboardEvent(Event::Type type, ClipboardID id) const; + void updateScreenShape(); + void updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags); + void postMouseEvent(CGPoint&) const; + + // convenience function to send events + void sendEvent(Event::Type type, void* = NULL) const; + void sendClipboardEvent(Event::Type type, ClipboardID id) const; - // message handlers - bool onMouseMove(SInt32 mx, SInt32 my); - // mouse button handler. pressed is true if this is a mousedown - // event, false if it is a mouseup event. macButton is the index - // of the button pressed using the mac button mapping. - bool onMouseButton(bool pressed, UInt16 macButton); - bool onMouseWheel(SInt32 xDelta, SInt32 yDelta) const; - - void constructMouseButtonEventMap(); + // message handlers + bool onMouseMove(SInt32 mx, SInt32 my); + // mouse button handler. pressed is true if this is a mousedown + // event, false if it is a mouseup event. macButton is the index + // of the button pressed using the mac button mapping. + bool onMouseButton(bool pressed, UInt16 macButton); + bool onMouseWheel(SInt32 xDelta, SInt32 yDelta) const; + + void constructMouseButtonEventMap(); - bool onKey(CGEventRef event); + bool onKey(CGEventRef event); - void onMediaKey(CGEventRef event); - - bool onHotKey(EventRef event) const; - - // Added here to allow the carbon cursor hack to be called. - void showCursor(); - void hideCursor(); + void onMediaKey(CGEventRef event); + + bool onHotKey(EventRef event) const; + + // Added here to allow the carbon cursor hack to be called. + void showCursor(); + void hideCursor(); - // map synergy mouse button to mac buttons - ButtonID mapSynergyButtonToMac(UInt16) const; + // map synergy mouse button to mac buttons + ButtonID mapSynergyButtonToMac(UInt16) const; - // map mac mouse button to synergy buttons - ButtonID mapMacButtonToSynergy(UInt16) const; + // map mac mouse button to synergy buttons + ButtonID mapMacButtonToSynergy(UInt16) const; - // map mac scroll wheel value to a synergy scroll wheel value - SInt32 mapScrollWheelToSynergy(SInt32) const; + // map mac scroll wheel value to a synergy scroll wheel value + SInt32 mapScrollWheelToSynergy(SInt32) const; - // map synergy scroll wheel value to a mac scroll wheel value - SInt32 mapScrollWheelFromSynergy(SInt32) const; + // map synergy scroll wheel value to a mac scroll wheel value + SInt32 mapScrollWheelFromSynergy(SInt32) const; - // get the current scroll wheel speed - double getScrollSpeed() const; + // get the current scroll wheel speed + double getScrollSpeed() const; - // get the current scroll wheel speed - double getScrollSpeedFactor() const; + // get the current scroll wheel speed + double getScrollSpeedFactor() const; - // enable/disable drag handling for buttons 3 and up - void enableDragTimer(bool enable); + // enable/disable drag handling for buttons 3 and up + void enableDragTimer(bool enable); - // drag timer handler - void handleDrag(const Event&, void*); + // drag timer handler + void handleDrag(const Event&, void*); - // clipboard check timer handler - void handleClipboardCheck(const Event&, void*); + // clipboard check timer handler + void handleClipboardCheck(const Event&, void*); - // Resolution switch callback - static void displayReconfigurationCallback(CGDirectDisplayID, - CGDisplayChangeSummaryFlags, void*); + // Resolution switch callback + static void displayReconfigurationCallback(CGDirectDisplayID, + CGDisplayChangeSummaryFlags, void*); - // fast user switch callback - static pascal OSStatus - userSwitchCallback(EventHandlerCallRef nextHandler, - EventRef theEvent, void* inUserData); - - // sleep / wakeup support - void watchSystemPowerThread(void*); - static void testCanceled(CFRunLoopTimerRef timer, void*info); - static void powerChangeCallback(void* refcon, io_service_t service, - natural_t messageType, void* messageArgument); - void handlePowerChangeRequest(natural_t messageType, - void* messageArgument); + // fast user switch callback + static pascal OSStatus + userSwitchCallback(EventHandlerCallRef nextHandler, + EventRef theEvent, void* inUserData); + + // sleep / wakeup support + void watchSystemPowerThread(void*); + static void testCanceled(CFRunLoopTimerRef timer, void*info); + static void powerChangeCallback(void* refcon, io_service_t service, + natural_t messageType, void* messageArgument); + void handlePowerChangeRequest(natural_t messageType, + void* messageArgument); - void handleConfirmSleep(const Event& event, void*); - - // global hotkey operating mode - static bool isGlobalHotKeyOperatingModeAvailable(); - static void setGlobalHotKeysEnabled(bool enabled); - static bool getGlobalHotKeysEnabled(); - - // Quartz event tap support - static CGEventRef handleCGInputEvent(CGEventTapProxy proxy, - CGEventType type, - CGEventRef event, - void* refcon); - static CGEventRef handleCGInputEventSecondary(CGEventTapProxy proxy, - CGEventType type, - CGEventRef event, - void* refcon); - - // convert CFString to char* - static char* CFStringRefToUTF8String(CFStringRef aString); - - void getDropTargetThread(void*); - + void handleConfirmSleep(const Event& event, void*); + + // global hotkey operating mode + static bool isGlobalHotKeyOperatingModeAvailable(); + static void setGlobalHotKeysEnabled(bool enabled); + static bool getGlobalHotKeysEnabled(); + + // Quartz event tap support + static CGEventRef handleCGInputEvent(CGEventTapProxy proxy, + CGEventType type, + CGEventRef event, + void* refcon); + static CGEventRef handleCGInputEventSecondary(CGEventTapProxy proxy, + CGEventType type, + CGEventRef event, + void* refcon); + + // convert CFString to char* + static char* CFStringRefToUTF8String(CFStringRef aString); + + void getDropTargetThread(void*); + private: - struct HotKeyItem { - public: - HotKeyItem(UInt32, UInt32); - HotKeyItem(EventHotKeyRef, UInt32, UInt32); + struct HotKeyItem { + public: + HotKeyItem(UInt32, UInt32); + HotKeyItem(EventHotKeyRef, UInt32, UInt32); - EventHotKeyRef getRef() const; + EventHotKeyRef getRef() const; - bool operator<(const HotKeyItem&) const; + bool operator<(const HotKeyItem&) const; - private: - EventHotKeyRef m_ref; - UInt32 m_keycode; - UInt32 m_mask; - }; + private: + EventHotKeyRef m_ref; + UInt32 m_keycode; + UInt32 m_mask; + }; - enum EMouseButtonState { - kMouseButtonUp = 0, - kMouseButtonDragged, - kMouseButtonDown, - kMouseButtonStateMax - }; - + enum EMouseButtonState { + kMouseButtonUp = 0, + kMouseButtonDragged, + kMouseButtonDown, + kMouseButtonStateMax + }; + - class MouseButtonState { - public: - void set(UInt32 button, EMouseButtonState state); - bool any(); - void reset(); - void overwrite(UInt32 buttons); + class MouseButtonState { + public: + void set(UInt32 button, EMouseButtonState state); + bool any(); + void reset(); + void overwrite(UInt32 buttons); - bool test(UInt32 button) const; - SInt8 getFirstButtonDown() const; - private: - std::bitset m_buttons; - }; + bool test(UInt32 button) const; + SInt8 getFirstButtonDown() const; + private: + std::bitset m_buttons; + }; - typedef std::map HotKeyMap; - typedef std::vector HotKeyIDList; - typedef std::map ModifierHotKeyMap; - typedef std::map HotKeyToIDMap; + typedef std::map HotKeyMap; + typedef std::vector HotKeyIDList; + typedef std::map ModifierHotKeyMap; + typedef std::map HotKeyToIDMap; - // true if screen is being used as a primary screen, false otherwise - bool m_isPrimary; + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; - // true if mouse has entered the screen - bool m_isOnScreen; + // true if mouse has entered the screen + bool m_isOnScreen; - // the display - CGDirectDisplayID m_displayID; + // the display + CGDirectDisplayID m_displayID; - // screen shape stuff - SInt32 m_x, m_y; - SInt32 m_w, m_h; - SInt32 m_xCenter, m_yCenter; + // screen shape stuff + SInt32 m_x, m_y; + SInt32 m_w, m_h; + SInt32 m_xCenter, m_yCenter; - // mouse state - mutable SInt32 m_xCursor, m_yCursor; - mutable bool m_cursorPosValid; - + // mouse state + mutable SInt32 m_xCursor, m_yCursor; + mutable bool m_cursorPosValid; + /* FIXME: this data structure is explicitly marked mutable due to a need to track the state of buttons since the remote side only lets us know of change events, and because the fakeMouseButton button method is marked 'const'. This is Evil, and this should be moved to a place where it need not be mutable as soon as possible. */ - mutable MouseButtonState m_buttonState; - typedef std::map MouseButtonEventMapType; - std::vector MouseButtonEventMap; + mutable MouseButtonState m_buttonState; + typedef std::map MouseButtonEventMapType; + std::vector MouseButtonEventMap; - bool m_cursorHidden; - SInt32 m_dragNumButtonsDown; - Point m_dragLastPoint; - EventQueueTimer* m_dragTimer; + bool m_cursorHidden; + SInt32 m_dragNumButtonsDown; + Point m_dragLastPoint; + EventQueueTimer* m_dragTimer; - // keyboard stuff - OSXKeyState* m_keyState; + // keyboard stuff + OSXKeyState* m_keyState; - // clipboards - OSXClipboard m_pasteboard; - UInt32 m_sequenceNumber; + // clipboards + OSXClipboard m_pasteboard; + UInt32 m_sequenceNumber; - // screen saver stuff - OSXScreenSaver* m_screensaver; - bool m_screensaverNotify; + // screen saver stuff + OSXScreenSaver* m_screensaver; + bool m_screensaverNotify; - // clipboard stuff - bool m_ownClipboard; - EventQueueTimer* m_clipboardTimer; + // clipboard stuff + bool m_ownClipboard; + EventQueueTimer* m_clipboardTimer; - // window object that gets user input events when the server - // has focus. - WindowRef m_hiddenWindow; - // window object that gets user input events when the server - // does not have focus. - WindowRef m_userInputWindow; + // window object that gets user input events when the server + // has focus. + WindowRef m_hiddenWindow; + // window object that gets user input events when the server + // does not have focus. + WindowRef m_userInputWindow; - // fast user switching - EventHandlerRef m_switchEventHandlerRef; + // fast user switching + EventHandlerRef m_switchEventHandlerRef; - // sleep / wakeup - Mutex* m_pmMutex; - Thread* m_pmWatchThread; - CondVar* m_pmThreadReady; - CFRunLoopRef m_pmRunloop; - io_connect_t m_pmRootPort; + // sleep / wakeup + Mutex* m_pmMutex; + Thread* m_pmWatchThread; + CondVar* m_pmThreadReady; + CFRunLoopRef m_pmRunloop; + io_connect_t m_pmRootPort; - // hot key stuff - HotKeyMap m_hotKeys; - HotKeyIDList m_oldHotKeyIDs; - ModifierHotKeyMap m_modifierHotKeys; - UInt32 m_activeModifierHotKey; - KeyModifierMask m_activeModifierHotKeyMask; - HotKeyToIDMap m_hotKeyToIDMap; + // hot key stuff + HotKeyMap m_hotKeys; + HotKeyIDList m_oldHotKeyIDs; + ModifierHotKeyMap m_modifierHotKeys; + UInt32 m_activeModifierHotKey; + KeyModifierMask m_activeModifierHotKeyMask; + HotKeyToIDMap m_hotKeyToIDMap; - // global hotkey operating mode - static bool s_testedForGHOM; - static bool s_hasGHOM; - - // Quartz input event support - CFMachPortRef m_eventTapPort; - CFRunLoopSourceRef m_eventTapRLSR; + // global hotkey operating mode + static bool s_testedForGHOM; + static bool s_hasGHOM; + + // Quartz input event support + CFMachPortRef m_eventTapPort; + CFRunLoopSourceRef m_eventTapRLSR; - // for double click coalescing. - double m_lastClickTime; + // for double click coalescing. + double m_lastClickTime; int m_clickState; - SInt32 m_lastSingleClickXCursor; - SInt32 m_lastSingleClickYCursor; + SInt32 m_lastSingleClickXCursor; + SInt32 m_lastSingleClickYCursor; - // cursor will hide and show on enable and disable if true. - bool m_autoShowHideCursor; + // cursor will hide and show on enable and disable if true. + bool m_autoShowHideCursor; - IEventQueue* m_events; - - Thread* m_getDropTargetThread; - String m_dropTarget; - + IEventQueue* m_events; + + Thread* m_getDropTargetThread; + String m_dropTarget; + #if defined(MAC_OS_X_VERSION_10_7) - Mutex* m_carbonLoopMutex; - CondVar* m_carbonLoopReady; + Mutex* m_carbonLoopMutex; + CondVar* m_carbonLoopReady; #endif - class OSXScreenImpl* m_impl; + class OSXScreenImpl* m_impl; }; diff --git a/src/lib/platform/OSXScreenSaver.cpp b/src/lib/platform/OSXScreenSaver.cpp index 91b72493..49fe8fe8 100644 --- a/src/lib/platform/OSXScreenSaver.cpp +++ b/src/lib/platform/OSXScreenSaver.cpp @@ -35,131 +35,131 @@ bool testProcessName(const char* name, const ProcessSerialNumber& psn); // OSXScreenSaver::OSXScreenSaver(IEventQueue* events, void* eventTarget) : - m_eventTarget(eventTarget), - m_enabled(true), - m_events(events) + m_eventTarget(eventTarget), + m_enabled(true), + m_events(events) { - m_autoReleasePool = screenSaverUtilCreatePool(); - m_screenSaverController = screenSaverUtilCreateController(); + m_autoReleasePool = screenSaverUtilCreatePool(); + m_screenSaverController = screenSaverUtilCreateController(); - // install launch/termination event handlers - EventTypeSpec launchEventTypes[2]; - launchEventTypes[0].eventClass = kEventClassApplication; - launchEventTypes[0].eventKind = kEventAppLaunched; - launchEventTypes[1].eventClass = kEventClassApplication; - launchEventTypes[1].eventKind = kEventAppTerminated; - - EventHandlerUPP launchTerminationEventHandler = - NewEventHandlerUPP(launchTerminationCallback); - InstallApplicationEventHandler(launchTerminationEventHandler, 2, - launchEventTypes, this, - &m_launchTerminationEventHandlerRef); - DisposeEventHandlerUPP(launchTerminationEventHandler); - - m_screenSaverPSN.highLongOfPSN = 0; - m_screenSaverPSN.lowLongOfPSN = 0; - - if (isActive()) { - getProcessSerialNumber("ScreenSaverEngine", m_screenSaverPSN); - } + // install launch/termination event handlers + EventTypeSpec launchEventTypes[2]; + launchEventTypes[0].eventClass = kEventClassApplication; + launchEventTypes[0].eventKind = kEventAppLaunched; + launchEventTypes[1].eventClass = kEventClassApplication; + launchEventTypes[1].eventKind = kEventAppTerminated; + + EventHandlerUPP launchTerminationEventHandler = + NewEventHandlerUPP(launchTerminationCallback); + InstallApplicationEventHandler(launchTerminationEventHandler, 2, + launchEventTypes, this, + &m_launchTerminationEventHandlerRef); + DisposeEventHandlerUPP(launchTerminationEventHandler); + + m_screenSaverPSN.highLongOfPSN = 0; + m_screenSaverPSN.lowLongOfPSN = 0; + + if (isActive()) { + getProcessSerialNumber("ScreenSaverEngine", m_screenSaverPSN); + } } OSXScreenSaver::~OSXScreenSaver() { - RemoveEventHandler(m_launchTerminationEventHandlerRef); -// screenSaverUtilReleaseController(m_screenSaverController); - screenSaverUtilReleasePool(m_autoReleasePool); + RemoveEventHandler(m_launchTerminationEventHandlerRef); +// screenSaverUtilReleaseController(m_screenSaverController); + screenSaverUtilReleasePool(m_autoReleasePool); } void OSXScreenSaver::enable() { - m_enabled = true; - screenSaverUtilEnable(m_screenSaverController); + m_enabled = true; + screenSaverUtilEnable(m_screenSaverController); } void OSXScreenSaver::disable() { - m_enabled = false; - screenSaverUtilDisable(m_screenSaverController); + m_enabled = false; + screenSaverUtilDisable(m_screenSaverController); } void OSXScreenSaver::activate() { - screenSaverUtilActivate(m_screenSaverController); + screenSaverUtilActivate(m_screenSaverController); } void OSXScreenSaver::deactivate() { - screenSaverUtilDeactivate(m_screenSaverController, m_enabled); + screenSaverUtilDeactivate(m_screenSaverController, m_enabled); } bool OSXScreenSaver::isActive() const { - return (screenSaverUtilIsActive(m_screenSaverController) != 0); + return (screenSaverUtilIsActive(m_screenSaverController) != 0); } void OSXScreenSaver::processLaunched(ProcessSerialNumber psn) { - if (testProcessName("ScreenSaverEngine", psn)) { - m_screenSaverPSN = psn; - LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled)); - if (m_enabled) { - m_events->addEvent( - Event(m_events->forIPrimaryScreen().screensaverActivated(), - m_eventTarget)); - } - } + if (testProcessName("ScreenSaverEngine", psn)) { + m_screenSaverPSN = psn; + LOG((CLOG_DEBUG1 "ScreenSaverEngine launched. Enabled=%d", m_enabled)); + if (m_enabled) { + m_events->addEvent( + Event(m_events->forIPrimaryScreen().screensaverActivated(), + m_eventTarget)); + } + } } void OSXScreenSaver::processTerminated(ProcessSerialNumber psn) { - if (m_screenSaverPSN.highLongOfPSN == psn.highLongOfPSN && - m_screenSaverPSN.lowLongOfPSN == psn.lowLongOfPSN) { - LOG((CLOG_DEBUG1 "ScreenSaverEngine terminated. Enabled=%d", m_enabled)); - if (m_enabled) { - m_events->addEvent( - Event(m_events->forIPrimaryScreen().screensaverDeactivated(), - m_eventTarget)); - } - - m_screenSaverPSN.highLongOfPSN = 0; - m_screenSaverPSN.lowLongOfPSN = 0; - } + if (m_screenSaverPSN.highLongOfPSN == psn.highLongOfPSN && + m_screenSaverPSN.lowLongOfPSN == psn.lowLongOfPSN) { + LOG((CLOG_DEBUG1 "ScreenSaverEngine terminated. Enabled=%d", m_enabled)); + if (m_enabled) { + m_events->addEvent( + Event(m_events->forIPrimaryScreen().screensaverDeactivated(), + m_eventTarget)); + } + + m_screenSaverPSN.highLongOfPSN = 0; + m_screenSaverPSN.lowLongOfPSN = 0; + } } pascal OSStatus OSXScreenSaver::launchTerminationCallback( - EventHandlerCallRef nextHandler, - EventRef theEvent, void* userData) + EventHandlerCallRef nextHandler, + EventRef theEvent, void* userData) { - OSStatus result; + OSStatus result; ProcessSerialNumber psn; - EventParamType actualType; - ByteCount actualSize; + EventParamType actualType; + ByteCount actualSize; result = GetEventParameter(theEvent, kEventParamProcessID, - typeProcessSerialNumber, &actualType, - sizeof(psn), &actualSize, &psn); + typeProcessSerialNumber, &actualType, + sizeof(psn), &actualSize, &psn); - if ((result == noErr) && - (actualSize > 0) && - (actualType == typeProcessSerialNumber)) { - OSXScreenSaver* screenSaver = (OSXScreenSaver*)userData; - UInt32 eventKind = GetEventKind(theEvent); - if (eventKind == kEventAppLaunched) { - screenSaver->processLaunched(psn); - } - else if (eventKind == kEventAppTerminated) { - screenSaver->processTerminated(psn); - } - } + if ((result == noErr) && + (actualSize > 0) && + (actualType == typeProcessSerialNumber)) { + OSXScreenSaver* screenSaver = (OSXScreenSaver*)userData; + UInt32 eventKind = GetEventKind(theEvent); + if (eventKind == kEventAppLaunched) { + screenSaver->processLaunched(psn); + } + else if (eventKind == kEventAppTerminated) { + screenSaver->processTerminated(psn); + } + } return (CallNextEventHandler(nextHandler, theEvent)); } @@ -168,34 +168,34 @@ OSXScreenSaver::launchTerminationCallback( void getProcessSerialNumber(const char* name, ProcessSerialNumber& psn) { - ProcessInfoRec procInfo; - Str31 procName; // pascal string. first byte holds length. - memset(&procInfo, 0, sizeof(procInfo)); - procInfo.processName = procName; - procInfo.processInfoLength = sizeof(ProcessInfoRec); + ProcessInfoRec procInfo; + Str31 procName; // pascal string. first byte holds length. + memset(&procInfo, 0, sizeof(procInfo)); + procInfo.processName = procName; + procInfo.processInfoLength = sizeof(ProcessInfoRec); - ProcessSerialNumber checkPsn; - OSErr err = GetNextProcess(&checkPsn); - while (err == 0) { - memset(procName, 0, sizeof(procName)); - err = GetProcessInformation(&checkPsn, &procInfo); - if (err != 0) { - break; - } - if (strcmp(name, (const char*)&procName[1]) == 0) { - psn = checkPsn; - break; - } - err = GetNextProcess(&checkPsn); - } + ProcessSerialNumber checkPsn; + OSErr err = GetNextProcess(&checkPsn); + while (err == 0) { + memset(procName, 0, sizeof(procName)); + err = GetProcessInformation(&checkPsn, &procInfo); + if (err != 0) { + break; + } + if (strcmp(name, (const char*)&procName[1]) == 0) { + psn = checkPsn; + break; + } + err = GetNextProcess(&checkPsn); + } } bool testProcessName(const char* name, const ProcessSerialNumber& psn) { - CFStringRef processName; - OSStatus err = CopyProcessName(&psn, &processName); - return (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)); + CFStringRef processName; + OSStatus err = CopyProcessName(&psn, &processName); + return (err == 0 && CFEqual(CFSTR("ScreenSaverEngine"), processName)); } #pragma GCC diagnostic error "-Wdeprecated-declarations" diff --git a/src/lib/platform/OSXScreenSaver.h b/src/lib/platform/OSXScreenSaver.h index 0f5315c9..2427ba8d 100644 --- a/src/lib/platform/OSXScreenSaver.h +++ b/src/lib/platform/OSXScreenSaver.h @@ -27,33 +27,33 @@ class IEventQueue; //! OSX screen saver implementation class OSXScreenSaver : public IScreenSaver { public: - OSXScreenSaver(IEventQueue* events, void* eventTarget); - virtual ~OSXScreenSaver(); + OSXScreenSaver(IEventQueue* events, void* eventTarget); + virtual ~OSXScreenSaver(); - // IScreenSaver overrides - virtual void enable(); - virtual void disable(); - virtual void activate(); - virtual void deactivate(); - virtual bool isActive() const; - + // IScreenSaver overrides + virtual void enable(); + virtual void disable(); + virtual void activate(); + virtual void deactivate(); + virtual bool isActive() const; + private: - void processLaunched(ProcessSerialNumber psn); - void processTerminated(ProcessSerialNumber psn); - - static pascal OSStatus - launchTerminationCallback( - EventHandlerCallRef nextHandler, - EventRef theEvent, void* userData); + void processLaunched(ProcessSerialNumber psn); + void processTerminated(ProcessSerialNumber psn); + + static pascal OSStatus + launchTerminationCallback( + EventHandlerCallRef nextHandler, + EventRef theEvent, void* userData); private: - // the target for the events we generate - void* m_eventTarget; + // the target for the events we generate + void* m_eventTarget; - bool m_enabled; - void* m_screenSaverController; - void* m_autoReleasePool; - EventHandlerRef m_launchTerminationEventHandlerRef; - ProcessSerialNumber m_screenSaverPSN; + bool m_enabled; + void* m_screenSaverController; + void* m_autoReleasePool; + EventHandlerRef m_launchTerminationEventHandlerRef; + ProcessSerialNumber m_screenSaverPSN; IEventQueue* m_events; }; diff --git a/src/lib/platform/OSXScreenSaverUtil.h b/src/lib/platform/OSXScreenSaverUtil.h index 293b6caa..0fa5727d 100644 --- a/src/lib/platform/OSXScreenSaverUtil.h +++ b/src/lib/platform/OSXScreenSaverUtil.h @@ -24,16 +24,16 @@ extern "C" { #endif -void* screenSaverUtilCreatePool(); -void screenSaverUtilReleasePool(void*); +void* screenSaverUtilCreatePool(); +void screenSaverUtilReleasePool(void*); -void* screenSaverUtilCreateController(); -void screenSaverUtilReleaseController(void*); -void screenSaverUtilEnable(void*); -void screenSaverUtilDisable(void*); -void screenSaverUtilActivate(void*); -void screenSaverUtilDeactivate(void*, int isEnabled); -int screenSaverUtilIsActive(void*); +void* screenSaverUtilCreateController(); +void screenSaverUtilReleaseController(void*); +void screenSaverUtilEnable(void*); +void screenSaverUtilDisable(void*); +void screenSaverUtilActivate(void*); +void screenSaverUtilDeactivate(void*, int isEnabled); +int screenSaverUtilIsActive(void*); #if defined(__cplusplus) } diff --git a/src/lib/platform/OSXUchrKeyResource.cpp b/src/lib/platform/OSXUchrKeyResource.cpp index 603ba04a..4d2ca7e3 100644 --- a/src/lib/platform/OSXUchrKeyResource.cpp +++ b/src/lib/platform/OSXUchrKeyResource.cpp @@ -24,273 +24,273 @@ // OSXUchrKeyResource::OSXUchrKeyResource(const void* resource, - UInt32 keyboardType) : - m_m(NULL), - m_cti(NULL), - m_sdi(NULL), - m_sri(NULL), - m_st(NULL) + UInt32 keyboardType) : + m_m(NULL), + m_cti(NULL), + m_sdi(NULL), + m_sri(NULL), + m_st(NULL) { - m_resource = static_cast(resource); - if (m_resource == NULL) { - return; - } + m_resource = static_cast(resource); + if (m_resource == NULL) { + return; + } - // find the keyboard info for the current keyboard type - const UCKeyboardTypeHeader* th = NULL; - const UCKeyboardLayout* r = m_resource; - for (ItemCount i = 0; i < r->keyboardTypeCount; ++i) { - if (keyboardType >= r->keyboardTypeList[i].keyboardTypeFirst && - keyboardType <= r->keyboardTypeList[i].keyboardTypeLast) { - th = r->keyboardTypeList + i; - break; - } - if (r->keyboardTypeList[i].keyboardTypeFirst == 0) { - // found the default. use it unless we find a match. - th = r->keyboardTypeList + i; - } - } - if (th == NULL) { - // cannot find a suitable keyboard type - return; - } + // find the keyboard info for the current keyboard type + const UCKeyboardTypeHeader* th = NULL; + const UCKeyboardLayout* r = m_resource; + for (ItemCount i = 0; i < r->keyboardTypeCount; ++i) { + if (keyboardType >= r->keyboardTypeList[i].keyboardTypeFirst && + keyboardType <= r->keyboardTypeList[i].keyboardTypeLast) { + th = r->keyboardTypeList + i; + break; + } + if (r->keyboardTypeList[i].keyboardTypeFirst == 0) { + // found the default. use it unless we find a match. + th = r->keyboardTypeList + i; + } + } + if (th == NULL) { + // cannot find a suitable keyboard type + return; + } - // get tables for keyboard type - const UInt8* const base = reinterpret_cast(m_resource); - m_m = reinterpret_cast(base + - th->keyModifiersToTableNumOffset); - m_cti = reinterpret_cast(base + - th->keyToCharTableIndexOffset); - m_sdi = reinterpret_cast(base + - th->keySequenceDataIndexOffset); - if (th->keyStateRecordsIndexOffset != 0) { - m_sri = reinterpret_cast(base + - th->keyStateRecordsIndexOffset); - } - if (th->keyStateTerminatorsOffset != 0) { - m_st = reinterpret_cast(base + - th->keyStateTerminatorsOffset); - } + // get tables for keyboard type + const UInt8* const base = reinterpret_cast(m_resource); + m_m = reinterpret_cast(base + + th->keyModifiersToTableNumOffset); + m_cti = reinterpret_cast(base + + th->keyToCharTableIndexOffset); + m_sdi = reinterpret_cast(base + + th->keySequenceDataIndexOffset); + if (th->keyStateRecordsIndexOffset != 0) { + m_sri = reinterpret_cast(base + + th->keyStateRecordsIndexOffset); + } + if (th->keyStateTerminatorsOffset != 0) { + m_st = reinterpret_cast(base + + th->keyStateTerminatorsOffset); + } - // find the space key, but only if it can combine with dead keys. - // a dead key followed by a space yields the non-dead version of - // the dead key. - m_spaceOutput = 0xffffu; - UInt32 table = getTableForModifier(0); - for (UInt32 button = 0, n = getNumButtons(); button < n; ++button) { - KeyID id = getKey(table, button); - if (id == 0x20) { - UCKeyOutput c = - reinterpret_cast(base + - m_cti->keyToCharTableOffsets[table])[button]; - if ((c & kUCKeyOutputTestForIndexMask) == - kUCKeyOutputStateIndexMask) { - m_spaceOutput = (c & kUCKeyOutputGetIndexMask); - break; - } - } - } + // find the space key, but only if it can combine with dead keys. + // a dead key followed by a space yields the non-dead version of + // the dead key. + m_spaceOutput = 0xffffu; + UInt32 table = getTableForModifier(0); + for (UInt32 button = 0, n = getNumButtons(); button < n; ++button) { + KeyID id = getKey(table, button); + if (id == 0x20) { + UCKeyOutput c = + reinterpret_cast(base + + m_cti->keyToCharTableOffsets[table])[button]; + if ((c & kUCKeyOutputTestForIndexMask) == + kUCKeyOutputStateIndexMask) { + m_spaceOutput = (c & kUCKeyOutputGetIndexMask); + break; + } + } + } } bool OSXUchrKeyResource::isValid() const { - return (m_m != NULL); + return (m_m != NULL); } UInt32 OSXUchrKeyResource::getNumModifierCombinations() const { - // only 32 (not 256) because the righthanded modifier bits are ignored - return 32; + // only 32 (not 256) because the righthanded modifier bits are ignored + return 32; } UInt32 OSXUchrKeyResource::getNumTables() const { - return m_cti->keyToCharTableCount; + return m_cti->keyToCharTableCount; } UInt32 OSXUchrKeyResource::getNumButtons() const { - return m_cti->keyToCharTableSize; + return m_cti->keyToCharTableSize; } UInt32 OSXUchrKeyResource::getTableForModifier(UInt32 mask) const { - if (mask >= m_m->modifiersCount) { - return m_m->defaultTableNum; - } - else { - return m_m->tableNum[mask]; - } + if (mask >= m_m->modifiersCount) { + return m_m->defaultTableNum; + } + else { + return m_m->tableNum[mask]; + } } KeyID OSXUchrKeyResource::getKey(UInt32 table, UInt32 button) const { - assert(table < getNumTables()); - assert(button < getNumButtons()); + assert(table < getNumTables()); + assert(button < getNumButtons()); - const UInt8* const base = reinterpret_cast(m_resource); - const UCKeyOutput* cPtr = reinterpret_cast(base + - m_cti->keyToCharTableOffsets[table]); + const UInt8* const base = reinterpret_cast(m_resource); + const UCKeyOutput* cPtr = reinterpret_cast(base + + m_cti->keyToCharTableOffsets[table]); const UCKeyOutput c = cPtr[button]; - KeySequence keys; - switch (c & kUCKeyOutputTestForIndexMask) { - case kUCKeyOutputStateIndexMask: - if (!getDeadKey(keys, c & kUCKeyOutputGetIndexMask)) { - return kKeyNone; - } - break; + KeySequence keys; + switch (c & kUCKeyOutputTestForIndexMask) { + case kUCKeyOutputStateIndexMask: + if (!getDeadKey(keys, c & kUCKeyOutputGetIndexMask)) { + return kKeyNone; + } + break; - case kUCKeyOutputSequenceIndexMask: - default: - if (!addSequence(keys, c)) { - return kKeyNone; - } - break; - } + case kUCKeyOutputSequenceIndexMask: + default: + if (!addSequence(keys, c)) { + return kKeyNone; + } + break; + } - // XXX -- no support for multiple characters - if (keys.size() != 1) { - return kKeyNone; - } + // XXX -- no support for multiple characters + if (keys.size() != 1) { + return kKeyNone; + } - return keys.front(); + return keys.front(); } bool OSXUchrKeyResource::getDeadKey( - KeySequence& keys, UInt16 index) const + KeySequence& keys, UInt16 index) const { - if (m_sri == NULL || index >= m_sri->keyStateRecordCount) { - // XXX -- should we be using some other fallback? - return false; - } + if (m_sri == NULL || index >= m_sri->keyStateRecordCount) { + // XXX -- should we be using some other fallback? + return false; + } - UInt16 state = 0; - if (!getKeyRecord(keys, index, state)) { - return false; - } - if (state == 0) { - // not a dead key - return true; - } + UInt16 state = 0; + if (!getKeyRecord(keys, index, state)) { + return false; + } + if (state == 0) { + // not a dead key + return true; + } - // no dead keys if we couldn't find the space key - if (m_spaceOutput == 0xffffu) { - return false; - } + // no dead keys if we couldn't find the space key + if (m_spaceOutput == 0xffffu) { + return false; + } - // the dead key should not have put anything in the key list - if (!keys.empty()) { - return false; - } + // the dead key should not have put anything in the key list + if (!keys.empty()) { + return false; + } - // get the character generated by pressing the space key after the - // dead key. if we're still in a compose state afterwards then we're - // confused so we bail. - if (!getKeyRecord(keys, m_spaceOutput, state) || state != 0) { - return false; - } + // get the character generated by pressing the space key after the + // dead key. if we're still in a compose state afterwards then we're + // confused so we bail. + if (!getKeyRecord(keys, m_spaceOutput, state) || state != 0) { + return false; + } - // convert keys to their dead counterparts - for (KeySequence::iterator i = keys.begin(); i != keys.end(); ++i) { - *i = synergy::KeyMap::getDeadKey(*i); - } + // convert keys to their dead counterparts + for (KeySequence::iterator i = keys.begin(); i != keys.end(); ++i) { + *i = synergy::KeyMap::getDeadKey(*i); + } - return true; + return true; } bool OSXUchrKeyResource::getKeyRecord( - KeySequence& keys, UInt16 index, UInt16& state) const + KeySequence& keys, UInt16 index, UInt16& state) const { - const UInt8* const base = reinterpret_cast(m_resource); - const UCKeyStateRecord* sr = - reinterpret_cast(base + - m_sri->keyStateRecordOffsets[index]); - const UCKeyStateEntryTerminal* kset = - reinterpret_cast(sr->stateEntryData); + const UInt8* const base = reinterpret_cast(m_resource); + const UCKeyStateRecord* sr = + reinterpret_cast(base + + m_sri->keyStateRecordOffsets[index]); + const UCKeyStateEntryTerminal* kset = + reinterpret_cast(sr->stateEntryData); - UInt16 nextState = 0; - bool found = false; - if (state == 0) { - found = true; - nextState = sr->stateZeroNextState; - if (!addSequence(keys, sr->stateZeroCharData)) { - return false; - } - } - else { - // we have a next entry - switch (sr->stateEntryFormat) { - case kUCKeyStateEntryTerminalFormat: - for (UInt16 j = 0; j < sr->stateEntryCount; ++j) { - if (kset[j].curState == state) { - if (!addSequence(keys, kset[j].charData)) { - return false; - } - nextState = 0; - found = true; - break; - } - } - break; + UInt16 nextState = 0; + bool found = false; + if (state == 0) { + found = true; + nextState = sr->stateZeroNextState; + if (!addSequence(keys, sr->stateZeroCharData)) { + return false; + } + } + else { + // we have a next entry + switch (sr->stateEntryFormat) { + case kUCKeyStateEntryTerminalFormat: + for (UInt16 j = 0; j < sr->stateEntryCount; ++j) { + if (kset[j].curState == state) { + if (!addSequence(keys, kset[j].charData)) { + return false; + } + nextState = 0; + found = true; + break; + } + } + break; - case kUCKeyStateEntryRangeFormat: - // XXX -- not supported yet - break; + case kUCKeyStateEntryRangeFormat: + // XXX -- not supported yet + break; - default: - // XXX -- unknown format - return false; - } - } - if (!found) { - // use a terminator - if (m_st != NULL && state < m_st->keyStateTerminatorCount) { - if (!addSequence(keys, m_st->keyStateTerminators[state - 1])) { - return false; - } - } - nextState = sr->stateZeroNextState; - if (!addSequence(keys, sr->stateZeroCharData)) { - return false; - } - } + default: + // XXX -- unknown format + return false; + } + } + if (!found) { + // use a terminator + if (m_st != NULL && state < m_st->keyStateTerminatorCount) { + if (!addSequence(keys, m_st->keyStateTerminators[state - 1])) { + return false; + } + } + nextState = sr->stateZeroNextState; + if (!addSequence(keys, sr->stateZeroCharData)) { + return false; + } + } - // next - state = nextState; + // next + state = nextState; - return true; + return true; } bool OSXUchrKeyResource::addSequence( - KeySequence& keys, UCKeyCharSeq c) const + KeySequence& keys, UCKeyCharSeq c) const { - if ((c & kUCKeyOutputTestForIndexMask) == kUCKeyOutputSequenceIndexMask) { - UInt16 index = (c & kUCKeyOutputGetIndexMask); - if (index < m_sdi->charSequenceCount && - m_sdi->charSequenceOffsets[index] != - m_sdi->charSequenceOffsets[index + 1]) { - // XXX -- sequences not supported yet - return false; - } - } + if ((c & kUCKeyOutputTestForIndexMask) == kUCKeyOutputSequenceIndexMask) { + UInt16 index = (c & kUCKeyOutputGetIndexMask); + if (index < m_sdi->charSequenceCount && + m_sdi->charSequenceOffsets[index] != + m_sdi->charSequenceOffsets[index + 1]) { + // XXX -- sequences not supported yet + return false; + } + } - if (c != 0xfffe && c != 0xffff) { - KeyID id = unicharToKeyID(c); - if (id != kKeyNone) { - keys.push_back(id); - } - } + if (c != 0xfffe && c != 0xffff) { + KeyID id = unicharToKeyID(c); + if (id != kKeyNone) { + keys.push_back(id); + } + } - return true; + return true; } diff --git a/src/lib/platform/OSXUchrKeyResource.h b/src/lib/platform/OSXUchrKeyResource.h index 6d97cc51..bbb8fd2b 100644 --- a/src/lib/platform/OSXUchrKeyResource.h +++ b/src/lib/platform/OSXUchrKeyResource.h @@ -26,30 +26,30 @@ typedef TISInputSourceRef KeyLayout; class OSXUchrKeyResource : public IOSXKeyResource { public: - OSXUchrKeyResource(const void*, UInt32 keyboardType); - - // KeyResource overrides - virtual bool isValid() const; - virtual UInt32 getNumModifierCombinations() const; - virtual UInt32 getNumTables() const; - virtual UInt32 getNumButtons() const; - virtual UInt32 getTableForModifier(UInt32 mask) const; - virtual KeyID getKey(UInt32 table, UInt32 button) const; - + OSXUchrKeyResource(const void*, UInt32 keyboardType); + + // KeyResource overrides + virtual bool isValid() const; + virtual UInt32 getNumModifierCombinations() const; + virtual UInt32 getNumTables() const; + virtual UInt32 getNumButtons() const; + virtual UInt32 getTableForModifier(UInt32 mask) const; + virtual KeyID getKey(UInt32 table, UInt32 button) const; + private: - typedef std::vector KeySequence; - - bool getDeadKey(KeySequence& keys, UInt16 index) const; - bool getKeyRecord(KeySequence& keys, - UInt16 index, UInt16& state) const; - bool addSequence(KeySequence& keys, UCKeyCharSeq c) const; - + typedef std::vector KeySequence; + + bool getDeadKey(KeySequence& keys, UInt16 index) const; + bool getKeyRecord(KeySequence& keys, + UInt16 index, UInt16& state) const; + bool addSequence(KeySequence& keys, UCKeyCharSeq c) const; + private: - const UCKeyboardLayout* m_resource; - const UCKeyModifiersToTableNum* m_m; - const UCKeyToCharTableIndex* m_cti; - const UCKeySequenceDataIndex* m_sdi; - const UCKeyStateRecordsIndex* m_sri; - const UCKeyStateTerminators* m_st; - UInt16 m_spaceOutput; + const UCKeyboardLayout* m_resource; + const UCKeyModifiersToTableNum* m_m; + const UCKeyToCharTableIndex* m_cti; + const UCKeySequenceDataIndex* m_sdi; + const UCKeyStateRecordsIndex* m_sri; + const UCKeyStateTerminators* m_st; + UInt16 m_spaceOutput; }; diff --git a/src/lib/platform/XWindowsClipboard.cpp b/src/lib/platform/XWindowsClipboard.cpp index f30cc2c9..7e79f7e3 100644 --- a/src/lib/platform/XWindowsClipboard.cpp +++ b/src/lib/platform/XWindowsClipboard.cpp @@ -39,1216 +39,1216 @@ // XWindowsClipboard::XWindowsClipboard(Display* display, - Window window, ClipboardID id) : - m_display(display), - m_window(window), - m_id(id), - m_open(false), - m_time(0), - m_owner(false), - m_timeOwned(0), - m_timeLost(0) + Window window, ClipboardID id) : + m_display(display), + m_window(window), + m_id(id), + m_open(false), + m_time(0), + m_owner(false), + m_timeOwned(0), + m_timeLost(0) { - // get some atoms - m_atomTargets = XInternAtom(m_display, "TARGETS", False); - m_atomMultiple = XInternAtom(m_display, "MULTIPLE", False); - m_atomTimestamp = XInternAtom(m_display, "TIMESTAMP", False); - m_atomInteger = XInternAtom(m_display, "INTEGER", False); - m_atomAtom = XInternAtom(m_display, "ATOM", False); - m_atomAtomPair = XInternAtom(m_display, "ATOM_PAIR", False); - m_atomData = XInternAtom(m_display, "CLIP_TEMPORARY", False); - m_atomINCR = XInternAtom(m_display, "INCR", False); - m_atomMotifClipLock = XInternAtom(m_display, "_MOTIF_CLIP_LOCK", False); - m_atomMotifClipHeader = XInternAtom(m_display, "_MOTIF_CLIP_HEADER", False); - m_atomMotifClipAccess = XInternAtom(m_display, - "_MOTIF_CLIP_LOCK_ACCESS_VALID", False); - m_atomGDKSelection = XInternAtom(m_display, "GDK_SELECTION", False); + // get some atoms + m_atomTargets = XInternAtom(m_display, "TARGETS", False); + m_atomMultiple = XInternAtom(m_display, "MULTIPLE", False); + m_atomTimestamp = XInternAtom(m_display, "TIMESTAMP", False); + m_atomInteger = XInternAtom(m_display, "INTEGER", False); + m_atomAtom = XInternAtom(m_display, "ATOM", False); + m_atomAtomPair = XInternAtom(m_display, "ATOM_PAIR", False); + m_atomData = XInternAtom(m_display, "CLIP_TEMPORARY", False); + m_atomINCR = XInternAtom(m_display, "INCR", False); + m_atomMotifClipLock = XInternAtom(m_display, "_MOTIF_CLIP_LOCK", False); + m_atomMotifClipHeader = XInternAtom(m_display, "_MOTIF_CLIP_HEADER", False); + m_atomMotifClipAccess = XInternAtom(m_display, + "_MOTIF_CLIP_LOCK_ACCESS_VALID", False); + m_atomGDKSelection = XInternAtom(m_display, "GDK_SELECTION", False); - // set selection atom based on clipboard id - switch (id) { - case kClipboardClipboard: - m_selection = XInternAtom(m_display, "CLIPBOARD", False); - break; + // set selection atom based on clipboard id + switch (id) { + case kClipboardClipboard: + m_selection = XInternAtom(m_display, "CLIPBOARD", False); + break; - case kClipboardSelection: - default: - m_selection = XA_PRIMARY; - break; - } + case kClipboardSelection: + default: + m_selection = XA_PRIMARY; + break; + } - // add converters, most desired first - m_converters.push_back(new XWindowsClipboardHTMLConverter(m_display, - "text/html")); - m_converters.push_back(new XWindowsClipboardBMPConverter(m_display)); - m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, - "text/plain;charset=UTF-8")); - m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, - "UTF8_STRING")); - m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display, - "text/plain;charset=ISO-10646-UCS-2")); - m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display, - "text/unicode")); - m_converters.push_back(new XWindowsClipboardTextConverter(m_display, - "text/plain")); - m_converters.push_back(new XWindowsClipboardTextConverter(m_display, - "STRING")); + // add converters, most desired first + m_converters.push_back(new XWindowsClipboardHTMLConverter(m_display, + "text/html")); + m_converters.push_back(new XWindowsClipboardBMPConverter(m_display)); + m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, + "text/plain;charset=UTF-8")); + m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display, + "UTF8_STRING")); + m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display, + "text/plain;charset=ISO-10646-UCS-2")); + m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display, + "text/unicode")); + m_converters.push_back(new XWindowsClipboardTextConverter(m_display, + "text/plain")); + m_converters.push_back(new XWindowsClipboardTextConverter(m_display, + "STRING")); - // we have no data - clearCache(); + // we have no data + clearCache(); } XWindowsClipboard::~XWindowsClipboard() { - clearReplies(); - clearConverters(); + clearReplies(); + clearConverters(); } void XWindowsClipboard::lost(Time time) { - LOG((CLOG_DEBUG "lost clipboard %d ownership at %d", m_id, time)); - if (m_owner) { - m_owner = false; - m_timeLost = time; - clearCache(); - } + LOG((CLOG_DEBUG "lost clipboard %d ownership at %d", m_id, time)); + if (m_owner) { + m_owner = false; + m_timeLost = time; + clearCache(); + } } void XWindowsClipboard::addRequest(Window owner, Window requestor, - Atom target, ::Time time, Atom property) + Atom target, ::Time time, Atom property) { - // must be for our window and we must have owned the selection - // at the given time. - bool success = false; - if (owner == m_window) { - LOG((CLOG_DEBUG1 "request for clipboard %d, target %s by 0x%08x (property=%s)", m_selection, XWindowsUtil::atomToString(m_display, target).c_str(), requestor, XWindowsUtil::atomToString(m_display, property).c_str())); - if (wasOwnedAtTime(time)) { - if (target == m_atomMultiple) { - // add a multiple request. property may not be None - // according to ICCCM. - if (property != None) { - success = insertMultipleReply(requestor, time, property); - } - } - else { - addSimpleRequest(requestor, target, time, property); + // must be for our window and we must have owned the selection + // at the given time. + bool success = false; + if (owner == m_window) { + LOG((CLOG_DEBUG1 "request for clipboard %d, target %s by 0x%08x (property=%s)", m_selection, XWindowsUtil::atomToString(m_display, target).c_str(), requestor, XWindowsUtil::atomToString(m_display, property).c_str())); + if (wasOwnedAtTime(time)) { + if (target == m_atomMultiple) { + // add a multiple request. property may not be None + // according to ICCCM. + if (property != None) { + success = insertMultipleReply(requestor, time, property); + } + } + else { + addSimpleRequest(requestor, target, time, property); - // addSimpleRequest() will have already handled failure - success = true; - } - } - else { - LOG((CLOG_DEBUG1 "failed, not owned at time %d", time)); - } - } + // addSimpleRequest() will have already handled failure + success = true; + } + } + else { + LOG((CLOG_DEBUG1 "failed, not owned at time %d", time)); + } + } - if (!success) { - // send failure - LOG((CLOG_DEBUG1 "failed")); - insertReply(new Reply(requestor, target, time)); - } + if (!success) { + // send failure + LOG((CLOG_DEBUG1 "failed")); + insertReply(new Reply(requestor, target, time)); + } - // send notifications that are pending - pushReplies(); + // send notifications that are pending + pushReplies(); } bool XWindowsClipboard::addSimpleRequest(Window requestor, - Atom target, ::Time time, Atom property) + Atom target, ::Time time, Atom property) { - // obsolete requestors may supply a None property. in - // that case we use the target as the property to store - // the conversion. - if (property == None) { - property = target; - } + // obsolete requestors may supply a None property. in + // that case we use the target as the property to store + // the conversion. + if (property == None) { + property = target; + } - // handle targets - String data; - Atom type = None; - int format = 0; - if (target == m_atomTargets) { - type = getTargetsData(data, &format); - } - else if (target == m_atomTimestamp) { - type = getTimestampData(data, &format); - } - else { - IXWindowsClipboardConverter* converter = getConverter(target); - if (converter != NULL) { - IClipboard::EFormat clipboardFormat = converter->getFormat(); - if (m_added[clipboardFormat]) { - try { - data = converter->fromIClipboard(m_data[clipboardFormat]); - format = converter->getDataSize(); - type = converter->getAtom(); - } - catch (...) { - // ignore -- cannot convert - } - } - } - } + // handle targets + String data; + Atom type = None; + int format = 0; + if (target == m_atomTargets) { + type = getTargetsData(data, &format); + } + else if (target == m_atomTimestamp) { + type = getTimestampData(data, &format); + } + else { + IXWindowsClipboardConverter* converter = getConverter(target); + if (converter != NULL) { + IClipboard::EFormat clipboardFormat = converter->getFormat(); + if (m_added[clipboardFormat]) { + try { + data = converter->fromIClipboard(m_data[clipboardFormat]); + format = converter->getDataSize(); + type = converter->getAtom(); + } + catch (...) { + // ignore -- cannot convert + } + } + } + } - if (type != None) { - // success - LOG((CLOG_DEBUG1 "success")); - insertReply(new Reply(requestor, target, time, - property, data, type, format)); - return true; - } - else { - // failure - LOG((CLOG_DEBUG1 "failed")); - insertReply(new Reply(requestor, target, time)); - return false; - } + if (type != None) { + // success + LOG((CLOG_DEBUG1 "success")); + insertReply(new Reply(requestor, target, time, + property, data, type, format)); + return true; + } + else { + // failure + LOG((CLOG_DEBUG1 "failed")); + insertReply(new Reply(requestor, target, time)); + return false; + } } bool XWindowsClipboard::processRequest(Window requestor, - ::Time /*time*/, Atom property) + ::Time /*time*/, Atom property) { - ReplyMap::iterator index = m_replies.find(requestor); - if (index == m_replies.end()) { - // unknown requestor window - return false; - } - LOG((CLOG_DEBUG1 "received property %s delete from 0x08%x", XWindowsUtil::atomToString(m_display, property).c_str(), requestor)); + ReplyMap::iterator index = m_replies.find(requestor); + if (index == m_replies.end()) { + // unknown requestor window + return false; + } + LOG((CLOG_DEBUG1 "received property %s delete from 0x08%x", XWindowsUtil::atomToString(m_display, property).c_str(), requestor)); - // find the property in the known requests. it should be the - // first property but we'll check 'em all if we have to. - ReplyList& replies = index->second; - for (ReplyList::iterator index2 = replies.begin(); - index2 != replies.end(); ++index2) { - Reply* reply = *index2; - if (reply->m_replied && reply->m_property == property) { - // if reply is complete then remove it and start the - // next one. - pushReplies(index, replies, index2); - return true; - } - } + // find the property in the known requests. it should be the + // first property but we'll check 'em all if we have to. + ReplyList& replies = index->second; + for (ReplyList::iterator index2 = replies.begin(); + index2 != replies.end(); ++index2) { + Reply* reply = *index2; + if (reply->m_replied && reply->m_property == property) { + // if reply is complete then remove it and start the + // next one. + pushReplies(index, replies, index2); + return true; + } + } - return false; + return false; } bool XWindowsClipboard::destroyRequest(Window requestor) { - ReplyMap::iterator index = m_replies.find(requestor); - if (index == m_replies.end()) { - // unknown requestor window - return false; - } + ReplyMap::iterator index = m_replies.find(requestor); + if (index == m_replies.end()) { + // unknown requestor window + return false; + } - // destroy all replies for this window - clearReplies(index->second); - m_replies.erase(index); + // destroy all replies for this window + clearReplies(index->second); + m_replies.erase(index); - // note -- we don't stop watching the window for events because - // we're called in response to the window being destroyed. + // note -- we don't stop watching the window for events because + // we're called in response to the window being destroyed. - return true; + return true; } Window XWindowsClipboard::getWindow() const { - return m_window; + return m_window; } Atom XWindowsClipboard::getSelection() const { - return m_selection; + return m_selection; } bool XWindowsClipboard::empty() { - assert(m_open); + assert(m_open); - LOG((CLOG_DEBUG "empty clipboard %d", m_id)); + LOG((CLOG_DEBUG "empty clipboard %d", m_id)); - // assert ownership of clipboard - XSetSelectionOwner(m_display, m_selection, m_window, m_time); - if (XGetSelectionOwner(m_display, m_selection) != m_window) { - LOG((CLOG_DEBUG "failed to grab clipboard %d", m_id)); - return false; - } + // assert ownership of clipboard + XSetSelectionOwner(m_display, m_selection, m_window, m_time); + if (XGetSelectionOwner(m_display, m_selection) != m_window) { + LOG((CLOG_DEBUG "failed to grab clipboard %d", m_id)); + return false; + } - // clear all data. since we own the data now, the cache is up - // to date. - clearCache(); - m_cached = true; + // clear all data. since we own the data now, the cache is up + // to date. + clearCache(); + m_cached = true; - // FIXME -- actually delete motif clipboard items? - // FIXME -- do anything to motif clipboard properties? + // FIXME -- actually delete motif clipboard items? + // FIXME -- do anything to motif clipboard properties? - // save time - m_timeOwned = m_time; - m_timeLost = 0; + // save time + m_timeOwned = m_time; + m_timeLost = 0; - // we're the owner now - m_owner = true; - LOG((CLOG_DEBUG "grabbed clipboard %d", m_id)); + // we're the owner now + m_owner = true; + LOG((CLOG_DEBUG "grabbed clipboard %d", m_id)); - return true; + return true; } void XWindowsClipboard::add(EFormat format, const String& data) { - assert(m_open); - assert(m_owner); + assert(m_open); + assert(m_owner); - LOG((CLOG_DEBUG "add %d bytes to clipboard %d format: %d", data.size(), m_id, format)); + LOG((CLOG_DEBUG "add %d bytes to clipboard %d format: %d", data.size(), m_id, format)); - m_data[format] = data; - m_added[format] = true; + m_data[format] = data; + m_added[format] = true; - // FIXME -- set motif clipboard item? + // FIXME -- set motif clipboard item? } bool XWindowsClipboard::open(Time time) const { - if (m_open) { - LOG((CLOG_DEBUG "failed to open clipboard: already opened")); - return false; - } + if (m_open) { + LOG((CLOG_DEBUG "failed to open clipboard: already opened")); + return false; + } - LOG((CLOG_DEBUG "open clipboard %d", m_id)); + LOG((CLOG_DEBUG "open clipboard %d", m_id)); - // assume not motif - m_motif = false; + // assume not motif + m_motif = false; - // lock clipboard - if (m_id == kClipboardClipboard) { - if (!motifLockClipboard()) { - return false; - } + // lock clipboard + if (m_id == kClipboardClipboard) { + if (!motifLockClipboard()) { + return false; + } - // check if motif owns the selection. unlock motif clipboard - // if it does not. - m_motif = motifOwnsClipboard(); - LOG((CLOG_DEBUG1 "motif does %sown clipboard", m_motif ? "" : "not ")); - if (!m_motif) { - motifUnlockClipboard(); - } - } + // check if motif owns the selection. unlock motif clipboard + // if it does not. + m_motif = motifOwnsClipboard(); + LOG((CLOG_DEBUG1 "motif does %sown clipboard", m_motif ? "" : "not ")); + if (!m_motif) { + motifUnlockClipboard(); + } + } - // now open - m_open = true; - m_time = time; + // now open + m_open = true; + m_time = time; - // be sure to flush the cache later if it's dirty - m_checkCache = true; + // be sure to flush the cache later if it's dirty + m_checkCache = true; - return true; + return true; } void XWindowsClipboard::close() const { - assert(m_open); + assert(m_open); - LOG((CLOG_DEBUG "close clipboard %d", m_id)); + LOG((CLOG_DEBUG "close clipboard %d", m_id)); - // unlock clipboard - if (m_motif) { - motifUnlockClipboard(); - } + // unlock clipboard + if (m_motif) { + motifUnlockClipboard(); + } - m_motif = false; - m_open = false; + m_motif = false; + m_open = false; } IClipboard::Time XWindowsClipboard::getTime() const { - checkCache(); - return m_timeOwned; + checkCache(); + return m_timeOwned; } bool XWindowsClipboard::has(EFormat format) const { - assert(m_open); + assert(m_open); - fillCache(); - return m_added[format]; + fillCache(); + return m_added[format]; } String XWindowsClipboard::get(EFormat format) const { - assert(m_open); + assert(m_open); - fillCache(); - return m_data[format]; + fillCache(); + return m_data[format]; } void XWindowsClipboard::clearConverters() { - for (ConverterList::iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - delete *index; - } - m_converters.clear(); + for (ConverterList::iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + delete *index; + } + m_converters.clear(); } IXWindowsClipboardConverter* XWindowsClipboard::getConverter(Atom target, bool onlyIfNotAdded) const { - IXWindowsClipboardConverter* converter = NULL; - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - converter = *index; - if (converter->getAtom() == target) { - break; - } - } - if (converter == NULL) { - LOG((CLOG_DEBUG1 " no converter for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); - return NULL; - } + IXWindowsClipboardConverter* converter = NULL; + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + converter = *index; + if (converter->getAtom() == target) { + break; + } + } + if (converter == NULL) { + LOG((CLOG_DEBUG1 " no converter for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); + return NULL; + } - // optionally skip already handled targets - if (onlyIfNotAdded) { - if (m_added[converter->getFormat()]) { - LOG((CLOG_DEBUG1 " skipping handled format %d", converter->getFormat())); - return NULL; - } - } + // optionally skip already handled targets + if (onlyIfNotAdded) { + if (m_added[converter->getFormat()]) { + LOG((CLOG_DEBUG1 " skipping handled format %d", converter->getFormat())); + return NULL; + } + } - return converter; + return converter; } void XWindowsClipboard::checkCache() const { - if (!m_checkCache) { - return; - } - m_checkCache = false; + if (!m_checkCache) { + return; + } + m_checkCache = false; - // get the time the clipboard ownership was taken by the current - // owner. - if (m_motif) { - m_timeOwned = motifGetTime(); - } - else { - m_timeOwned = icccmGetTime(); - } + // get the time the clipboard ownership was taken by the current + // owner. + if (m_motif) { + m_timeOwned = motifGetTime(); + } + else { + m_timeOwned = icccmGetTime(); + } - // if we can't get the time then use the time passed to us - if (m_timeOwned == 0) { - m_timeOwned = m_time; - } + // if we can't get the time then use the time passed to us + if (m_timeOwned == 0) { + m_timeOwned = m_time; + } - // if the cache is dirty then flush it - if (m_timeOwned != m_cacheTime) { - clearCache(); - } + // if the cache is dirty then flush it + if (m_timeOwned != m_cacheTime) { + clearCache(); + } } void XWindowsClipboard::clearCache() const { - const_cast(this)->doClearCache(); + const_cast(this)->doClearCache(); } void XWindowsClipboard::doClearCache() { - m_checkCache = false; - m_cached = false; - for (SInt32 index = 0; index < kNumFormats; ++index) { - m_data[index] = ""; - m_added[index] = false; - } + m_checkCache = false; + m_cached = false; + for (SInt32 index = 0; index < kNumFormats; ++index) { + m_data[index] = ""; + m_added[index] = false; + } } void XWindowsClipboard::fillCache() const { - // get the selection data if not already cached - checkCache(); - if (!m_cached) { - const_cast(this)->doFillCache(); - } + // get the selection data if not already cached + checkCache(); + if (!m_cached) { + const_cast(this)->doFillCache(); + } } void XWindowsClipboard::doFillCache() { - if (m_motif) { - motifFillCache(); - } - else { - icccmFillCache(); - } - m_checkCache = false; - m_cached = true; - m_cacheTime = m_timeOwned; + if (m_motif) { + motifFillCache(); + } + else { + icccmFillCache(); + } + m_checkCache = false; + m_cached = true; + m_cacheTime = m_timeOwned; } void XWindowsClipboard::icccmFillCache() { - LOG((CLOG_DEBUG "ICCCM fill clipboard %d", m_id)); + LOG((CLOG_DEBUG "ICCCM fill clipboard %d", m_id)); - // see if we can get the list of available formats from the selection. - // if not then use a default list of formats. note that some clipboard - // owners are broken and report TARGETS as the type of the TARGETS data - // instead of the correct type ATOM; allow either. - const Atom atomTargets = m_atomTargets; - Atom target; - String data; - if (!icccmGetSelection(atomTargets, &target, &data) || - (target != m_atomAtom && target != m_atomTargets)) { - LOG((CLOG_DEBUG1 "selection doesn't support TARGETS")); - data = ""; - XWindowsUtil::appendAtomData(data, XA_STRING); - } + // see if we can get the list of available formats from the selection. + // if not then use a default list of formats. note that some clipboard + // owners are broken and report TARGETS as the type of the TARGETS data + // instead of the correct type ATOM; allow either. + const Atom atomTargets = m_atomTargets; + Atom target; + String data; + if (!icccmGetSelection(atomTargets, &target, &data) || + (target != m_atomAtom && target != m_atomTargets)) { + LOG((CLOG_DEBUG1 "selection doesn't support TARGETS")); + data = ""; + XWindowsUtil::appendAtomData(data, XA_STRING); + } - XWindowsUtil::convertAtomProperty(data); - const Atom* targets = reinterpret_cast(data.data()); // TODO: Safe? - const UInt32 numTargets = data.size() / sizeof(Atom); - LOG((CLOG_DEBUG " available targets: %s", XWindowsUtil::atomsToString(m_display, targets, numTargets).c_str())); + XWindowsUtil::convertAtomProperty(data); + const Atom* targets = reinterpret_cast(data.data()); // TODO: Safe? + const UInt32 numTargets = data.size() / sizeof(Atom); + LOG((CLOG_DEBUG " available targets: %s", XWindowsUtil::atomsToString(m_display, targets, numTargets).c_str())); - // try each converter in order (because they're in order of - // preference). - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IXWindowsClipboardConverter* converter = *index; + // try each converter in order (because they're in order of + // preference). + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IXWindowsClipboardConverter* converter = *index; - // skip already handled targets - if (m_added[converter->getFormat()]) { - continue; - } + // skip already handled targets + if (m_added[converter->getFormat()]) { + continue; + } - // see if atom is in target list - Atom target = None; - // XXX -- just ask for the converter's target to see if it's - // available rather than checking TARGETS. i've seen clipboard - // owners that don't report all the targets they support. - target = converter->getAtom(); - /* - for (UInt32 i = 0; i < numTargets; ++i) { - if (converter->getAtom() == targets[i]) { - target = targets[i]; - break; - } - } - */ - if (target == None) { - continue; - } + // see if atom is in target list + Atom target = None; + // XXX -- just ask for the converter's target to see if it's + // available rather than checking TARGETS. i've seen clipboard + // owners that don't report all the targets they support. + target = converter->getAtom(); + /* + for (UInt32 i = 0; i < numTargets; ++i) { + if (converter->getAtom() == targets[i]) { + target = targets[i]; + break; + } + } + */ + if (target == None) { + continue; + } - // get the data - Atom actualTarget; - String targetData; - if (!icccmGetSelection(target, &actualTarget, &targetData)) { - LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); - continue; - } + // get the data + Atom actualTarget; + String targetData; + if (!icccmGetSelection(target, &actualTarget, &targetData)) { + LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); + continue; + } - // add to clipboard and note we've done it - IClipboard::EFormat format = converter->getFormat(); - m_data[format] = converter->toIClipboard(targetData); - m_added[format] = true; - LOG((CLOG_DEBUG "added format %d for target %s (%u %s)", format, XWindowsUtil::atomToString(m_display, target).c_str(), targetData.size(), targetData.size() == 1 ? "byte" : "bytes")); - } + // add to clipboard and note we've done it + IClipboard::EFormat format = converter->getFormat(); + m_data[format] = converter->toIClipboard(targetData); + m_added[format] = true; + LOG((CLOG_DEBUG "added format %d for target %s (%u %s)", format, XWindowsUtil::atomToString(m_display, target).c_str(), targetData.size(), targetData.size() == 1 ? "byte" : "bytes")); + } } bool XWindowsClipboard::icccmGetSelection(Atom target, - Atom* actualTarget, String* data) const + Atom* actualTarget, String* data) const { - assert(actualTarget != NULL); - assert(data != NULL); + assert(actualTarget != NULL); + assert(data != NULL); - // request data conversion - CICCCMGetClipboard getter(m_window, m_time, m_atomData); - if (!getter.readClipboard(m_display, m_selection, - target, actualTarget, data)) { - LOG((CLOG_DEBUG1 "can't get data for selection target %s", XWindowsUtil::atomToString(m_display, target).c_str())); - LOGC(getter.m_error, (CLOG_WARN "ICCCM violation by clipboard owner")); - return false; - } - else if (*actualTarget == None) { - LOG((CLOG_DEBUG1 "selection conversion failed for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); - return false; - } - return true; + // request data conversion + CICCCMGetClipboard getter(m_window, m_time, m_atomData); + if (!getter.readClipboard(m_display, m_selection, + target, actualTarget, data)) { + LOG((CLOG_DEBUG1 "can't get data for selection target %s", XWindowsUtil::atomToString(m_display, target).c_str())); + LOGC(getter.m_error, (CLOG_WARN "ICCCM violation by clipboard owner")); + return false; + } + else if (*actualTarget == None) { + LOG((CLOG_DEBUG1 "selection conversion failed for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); + return false; + } + return true; } IClipboard::Time XWindowsClipboard::icccmGetTime() const { - Atom actualTarget; - String data; - if (icccmGetSelection(m_atomTimestamp, &actualTarget, &data) && - actualTarget == m_atomInteger) { - Time time = *reinterpret_cast(data.data()); - LOG((CLOG_DEBUG1 "got ICCCM time %d", time)); - return time; - } - else { - // no timestamp - LOG((CLOG_DEBUG1 "can't get ICCCM time")); - return 0; - } + Atom actualTarget; + String data; + if (icccmGetSelection(m_atomTimestamp, &actualTarget, &data) && + actualTarget == m_atomInteger) { + Time time = *reinterpret_cast(data.data()); + LOG((CLOG_DEBUG1 "got ICCCM time %d", time)); + return time; + } + else { + // no timestamp + LOG((CLOG_DEBUG1 "can't get ICCCM time")); + return 0; + } } bool XWindowsClipboard::motifLockClipboard() const { - // fail if anybody owns the lock (even us, so this is non-recursive) + // fail if anybody owns the lock (even us, so this is non-recursive) Window lockOwner = XGetSelectionOwner(m_display, m_atomMotifClipLock); - if (lockOwner != None) { - LOG((CLOG_DEBUG1 "motif lock owner 0x%08x", lockOwner)); - return false; - } + if (lockOwner != None) { + LOG((CLOG_DEBUG1 "motif lock owner 0x%08x", lockOwner)); + return false; + } - // try to grab the lock - // FIXME -- is this right? there's a race condition here -- - // A grabs successfully, B grabs successfully, A thinks it - // still has the grab until it gets a SelectionClear. - Time time = XWindowsUtil::getCurrentTime(m_display, m_window); - XSetSelectionOwner(m_display, m_atomMotifClipLock, m_window, time); + // try to grab the lock + // FIXME -- is this right? there's a race condition here -- + // A grabs successfully, B grabs successfully, A thinks it + // still has the grab until it gets a SelectionClear. + Time time = XWindowsUtil::getCurrentTime(m_display, m_window); + XSetSelectionOwner(m_display, m_atomMotifClipLock, m_window, time); lockOwner = XGetSelectionOwner(m_display, m_atomMotifClipLock); - if (lockOwner != m_window) { - LOG((CLOG_DEBUG1 "motif lock owner 0x%08x", lockOwner)); - return false; - } + if (lockOwner != m_window) { + LOG((CLOG_DEBUG1 "motif lock owner 0x%08x", lockOwner)); + return false; + } - LOG((CLOG_DEBUG1 "locked motif clipboard")); - return true; + LOG((CLOG_DEBUG1 "locked motif clipboard")); + return true; } void XWindowsClipboard::motifUnlockClipboard() const { - LOG((CLOG_DEBUG1 "unlocked motif clipboard")); + LOG((CLOG_DEBUG1 "unlocked motif clipboard")); - // fail if we don't own the lock - Window lockOwner = XGetSelectionOwner(m_display, m_atomMotifClipLock); - if (lockOwner != m_window) { - return; - } + // fail if we don't own the lock + Window lockOwner = XGetSelectionOwner(m_display, m_atomMotifClipLock); + if (lockOwner != m_window) { + return; + } - // release lock - Time time = XWindowsUtil::getCurrentTime(m_display, m_window); - XSetSelectionOwner(m_display, m_atomMotifClipLock, None, time); + // release lock + Time time = XWindowsUtil::getCurrentTime(m_display, m_window); + XSetSelectionOwner(m_display, m_atomMotifClipLock, None, time); } bool XWindowsClipboard::motifOwnsClipboard() const { - // get the current selection owner - // FIXME -- this can't be right. even if the window is destroyed - // Motif will still have a valid clipboard. how can we tell if - // some other client owns CLIPBOARD? - Window owner = XGetSelectionOwner(m_display, m_selection); - if (owner == None) { - return false; - } + // get the current selection owner + // FIXME -- this can't be right. even if the window is destroyed + // Motif will still have a valid clipboard. how can we tell if + // some other client owns CLIPBOARD? + Window owner = XGetSelectionOwner(m_display, m_selection); + if (owner == None) { + return false; + } - // get the Motif clipboard header property from the root window - Atom target; - SInt32 format; - String data; - Window root = RootWindow(m_display, DefaultScreen(m_display)); - if (!XWindowsUtil::getWindowProperty(m_display, root, - m_atomMotifClipHeader, - &data, &target, &format, False)) { - return false; - } + // get the Motif clipboard header property from the root window + Atom target; + SInt32 format; + String data; + Window root = RootWindow(m_display, DefaultScreen(m_display)); + if (!XWindowsUtil::getWindowProperty(m_display, root, + m_atomMotifClipHeader, + &data, &target, &format, False)) { + return false; + } - // check the owner window against the current clipboard owner - if (data.size() >= sizeof(MotifClipHeader)) { - MotifClipHeader header; - std::memcpy (&header, data.data(), sizeof(header)); - if ((header.m_id == kMotifClipHeader) && - (static_cast(header.m_selectionOwner) == owner)) { - return true; - } - } + // check the owner window against the current clipboard owner + if (data.size() >= sizeof(MotifClipHeader)) { + MotifClipHeader header; + std::memcpy (&header, data.data(), sizeof(header)); + if ((header.m_id == kMotifClipHeader) && + (static_cast(header.m_selectionOwner) == owner)) { + return true; + } + } - return false; + return false; } void XWindowsClipboard::motifFillCache() { - LOG((CLOG_DEBUG "Motif fill clipboard %d", m_id)); + LOG((CLOG_DEBUG "Motif fill clipboard %d", m_id)); - // get the Motif clipboard header property from the root window - Atom target; - SInt32 format; - String data; - Window root = RootWindow(m_display, DefaultScreen(m_display)); - if (!XWindowsUtil::getWindowProperty(m_display, root, - m_atomMotifClipHeader, - &data, &target, &format, False)) { - return; - } + // get the Motif clipboard header property from the root window + Atom target; + SInt32 format; + String data; + Window root = RootWindow(m_display, DefaultScreen(m_display)); + if (!XWindowsUtil::getWindowProperty(m_display, root, + m_atomMotifClipHeader, + &data, &target, &format, False)) { + return; + } - MotifClipHeader header; - if (data.size() < sizeof(header)) { // check that the header is okay - return; - } - std::memcpy (&header, data.data(), sizeof(header)); - if (header.m_id != kMotifClipHeader || header.m_numItems < 1) { - return; - } + MotifClipHeader header; + if (data.size() < sizeof(header)) { // check that the header is okay + return; + } + std::memcpy (&header, data.data(), sizeof(header)); + if (header.m_id != kMotifClipHeader || header.m_numItems < 1) { + return; + } - // get the Motif item property from the root window - char name[18 + 20]; - sprintf(name, "_MOTIF_CLIP_ITEM_%d", header.m_item); + // get the Motif item property from the root window + char name[18 + 20]; + sprintf(name, "_MOTIF_CLIP_ITEM_%d", header.m_item); Atom atomItem = XInternAtom(m_display, name, False); - data = ""; - if (!XWindowsUtil::getWindowProperty(m_display, root, - atomItem, &data, - &target, &format, False)) { - return; - } + data = ""; + if (!XWindowsUtil::getWindowProperty(m_display, root, + atomItem, &data, + &target, &format, False)) { + return; + } - MotifClipItem item; - if (data.size() < sizeof(item)) { // check that the item is okay - return; - } - std::memcpy (&item, data.data(), sizeof(item)); - if (item.m_id != kMotifClipItem || - item.m_numFormats - item.m_numDeletedFormats < 1) { - return; - } + MotifClipItem item; + if (data.size() < sizeof(item)) { // check that the item is okay + return; + } + std::memcpy (&item, data.data(), sizeof(item)); + if (item.m_id != kMotifClipItem || + item.m_numFormats - item.m_numDeletedFormats < 1) { + return; + } - // format list is after static item structure elements - const SInt32 numFormats = item.m_numFormats - item.m_numDeletedFormats; - const SInt32* formats = reinterpret_cast(item.m_size + - static_cast(data.data())); + // format list is after static item structure elements + const SInt32 numFormats = item.m_numFormats - item.m_numDeletedFormats; + const SInt32* formats = reinterpret_cast(item.m_size + + static_cast(data.data())); - // get the available formats - typedef std::map MotifFormatMap; - MotifFormatMap motifFormats; - for (SInt32 i = 0; i < numFormats; ++i) { - // get Motif format property from the root window - sprintf(name, "_MOTIF_CLIP_ITEM_%d", formats[i]); - Atom atomFormat = XInternAtom(m_display, name, False); - String data; - if (!XWindowsUtil::getWindowProperty(m_display, root, - atomFormat, &data, - &target, &format, False)) { - continue; - } + // get the available formats + typedef std::map MotifFormatMap; + MotifFormatMap motifFormats; + for (SInt32 i = 0; i < numFormats; ++i) { + // get Motif format property from the root window + sprintf(name, "_MOTIF_CLIP_ITEM_%d", formats[i]); + Atom atomFormat = XInternAtom(m_display, name, False); + String data; + if (!XWindowsUtil::getWindowProperty(m_display, root, + atomFormat, &data, + &target, &format, False)) { + continue; + } - // check that the format is okay - MotifClipFormat motifFormat; - if (data.size() < sizeof(motifFormat)) { - continue; - } - std::memcpy (&motifFormat, data.data(), sizeof(motifFormat)); - if (motifFormat.m_id != kMotifClipFormat || - motifFormat.m_length < 0 || - motifFormat.m_type == None || - motifFormat.m_deleted != 0) { - continue; - } + // check that the format is okay + MotifClipFormat motifFormat; + if (data.size() < sizeof(motifFormat)) { + continue; + } + std::memcpy (&motifFormat, data.data(), sizeof(motifFormat)); + if (motifFormat.m_id != kMotifClipFormat || + motifFormat.m_length < 0 || + motifFormat.m_type == None || + motifFormat.m_deleted != 0) { + continue; + } - // save it - motifFormats.insert(std::make_pair(motifFormat.m_type, data)); - } - //const UInt32 numMotifFormats = motifFormats.size(); + // save it + motifFormats.insert(std::make_pair(motifFormat.m_type, data)); + } + //const UInt32 numMotifFormats = motifFormats.size(); - // try each converter in order (because they're in order of - // preference). - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IXWindowsClipboardConverter* converter = *index; + // try each converter in order (because they're in order of + // preference). + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IXWindowsClipboardConverter* converter = *index; - // skip already handled targets - if (m_added[converter->getFormat()]) { - continue; - } + // skip already handled targets + if (m_added[converter->getFormat()]) { + continue; + } - // see if atom is in target list - MotifFormatMap::const_iterator index2 = - motifFormats.find(converter->getAtom()); - if (index2 == motifFormats.end()) { - continue; - } + // see if atom is in target list + MotifFormatMap::const_iterator index2 = + motifFormats.find(converter->getAtom()); + if (index2 == motifFormats.end()) { + continue; + } - // get format - MotifClipFormat motifFormat; - std::memcpy (&motifFormat, index2->second.data(), sizeof(motifFormat)); - const Atom target = motifFormat.m_type; + // get format + MotifClipFormat motifFormat; + std::memcpy (&motifFormat, index2->second.data(), sizeof(motifFormat)); + const Atom target = motifFormat.m_type; - // get the data (finally) - Atom actualTarget; - String targetData; - if (!motifGetSelection(&motifFormat, &actualTarget, &targetData)) { - LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); - continue; - } + // get the data (finally) + Atom actualTarget; + String targetData; + if (!motifGetSelection(&motifFormat, &actualTarget, &targetData)) { + LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); + continue; + } - // add to clipboard and note we've done it - IClipboard::EFormat format = converter->getFormat(); - m_data[format] = converter->toIClipboard(targetData); - m_added[format] = true; - LOG((CLOG_DEBUG "added format %d for target %s", format, XWindowsUtil::atomToString(m_display, target).c_str())); - } + // add to clipboard and note we've done it + IClipboard::EFormat format = converter->getFormat(); + m_data[format] = converter->toIClipboard(targetData); + m_added[format] = true; + LOG((CLOG_DEBUG "added format %d for target %s", format, XWindowsUtil::atomToString(m_display, target).c_str())); + } } bool XWindowsClipboard::motifGetSelection(const MotifClipFormat* format, - Atom* actualTarget, String* data) const + Atom* actualTarget, String* data) const { - // if the current clipboard owner and the owner indicated by the - // motif clip header are the same then transfer via a property on - // the root window, otherwise transfer as a normal ICCCM client. - if (!motifOwnsClipboard()) { - return icccmGetSelection(format->m_type, actualTarget, data); - } + // if the current clipboard owner and the owner indicated by the + // motif clip header are the same then transfer via a property on + // the root window, otherwise transfer as a normal ICCCM client. + if (!motifOwnsClipboard()) { + return icccmGetSelection(format->m_type, actualTarget, data); + } - // use motif way - // FIXME -- this isn't right. it'll only work if the data is - // already stored on the root window and only if it fits in a - // property. motif has some scheme for transferring part by - // part that i don't know. - char name[18 + 20]; - sprintf(name, "_MOTIF_CLIP_ITEM_%d", format->m_data); - Atom target = XInternAtom(m_display, name, False); - Window root = RootWindow(m_display, DefaultScreen(m_display)); - return XWindowsUtil::getWindowProperty(m_display, root, - target, data, - actualTarget, NULL, False); + // use motif way + // FIXME -- this isn't right. it'll only work if the data is + // already stored on the root window and only if it fits in a + // property. motif has some scheme for transferring part by + // part that i don't know. + char name[18 + 20]; + sprintf(name, "_MOTIF_CLIP_ITEM_%d", format->m_data); + Atom target = XInternAtom(m_display, name, False); + Window root = RootWindow(m_display, DefaultScreen(m_display)); + return XWindowsUtil::getWindowProperty(m_display, root, + target, data, + actualTarget, NULL, False); } IClipboard::Time XWindowsClipboard::motifGetTime() const { - return icccmGetTime(); + return icccmGetTime(); } bool XWindowsClipboard::insertMultipleReply(Window requestor, - ::Time time, Atom property) + ::Time time, Atom property) { - // get the requested targets - Atom target; - SInt32 format; - String data; - if (!XWindowsUtil::getWindowProperty(m_display, requestor, - property, &data, &target, &format, False)) { - // can't get the requested targets - return false; - } + // get the requested targets + Atom target; + SInt32 format; + String data; + if (!XWindowsUtil::getWindowProperty(m_display, requestor, + property, &data, &target, &format, False)) { + // can't get the requested targets + return false; + } - // fail if the requested targets isn't of the correct form - if (format != 32 || target != m_atomAtomPair) { - return false; - } + // fail if the requested targets isn't of the correct form + if (format != 32 || target != m_atomAtomPair) { + return false; + } - // data is a list of atom pairs: target, property - XWindowsUtil::convertAtomProperty(data); - const Atom* targets = reinterpret_cast(data.data()); - const UInt32 numTargets = data.size() / sizeof(Atom); + // data is a list of atom pairs: target, property + XWindowsUtil::convertAtomProperty(data); + const Atom* targets = reinterpret_cast(data.data()); + const UInt32 numTargets = data.size() / sizeof(Atom); - // add replies for each target - bool changed = false; - for (UInt32 i = 0; i < numTargets; i += 2) { - const Atom target = targets[i + 0]; - const Atom property = targets[i + 1]; - if (!addSimpleRequest(requestor, target, time, property)) { - // note that we can't perform the requested conversion - XWindowsUtil::replaceAtomData(data, i, None); - changed = true; - } - } + // add replies for each target + bool changed = false; + for (UInt32 i = 0; i < numTargets; i += 2) { + const Atom target = targets[i + 0]; + const Atom property = targets[i + 1]; + if (!addSimpleRequest(requestor, target, time, property)) { + // note that we can't perform the requested conversion + XWindowsUtil::replaceAtomData(data, i, None); + changed = true; + } + } - // update the targets property if we changed it - if (changed) { - XWindowsUtil::setWindowProperty(m_display, requestor, - property, data.data(), data.size(), - target, format); - } + // update the targets property if we changed it + if (changed) { + XWindowsUtil::setWindowProperty(m_display, requestor, + property, data.data(), data.size(), + target, format); + } - // add reply for MULTIPLE request - insertReply(new Reply(requestor, m_atomMultiple, - time, property, String(), None, 32)); + // add reply for MULTIPLE request + insertReply(new Reply(requestor, m_atomMultiple, + time, property, String(), None, 32)); - return true; + return true; } void XWindowsClipboard::insertReply(Reply* reply) { - assert(reply != NULL); + assert(reply != NULL); - // note -- we must respond to requests in order if requestor,target,time - // are the same, otherwise we can use whatever order we like with one - // exception: each reply in a MULTIPLE reply must be handled in order - // as well. those replies will almost certainly not share targets so - // we can't simply use requestor,target,time as map index. - // - // instead we'll use just the requestor. that's more restrictive than - // necessary but we're guaranteed to do things in the right order. - // note that we could also include the time in the map index and still - // ensure the right order. but since that'll just make it harder to - // find the right reply when handling property notify events we stick - // to just the requestor. + // note -- we must respond to requests in order if requestor,target,time + // are the same, otherwise we can use whatever order we like with one + // exception: each reply in a MULTIPLE reply must be handled in order + // as well. those replies will almost certainly not share targets so + // we can't simply use requestor,target,time as map index. + // + // instead we'll use just the requestor. that's more restrictive than + // necessary but we're guaranteed to do things in the right order. + // note that we could also include the time in the map index and still + // ensure the right order. but since that'll just make it harder to + // find the right reply when handling property notify events we stick + // to just the requestor. - const bool newWindow = (m_replies.count(reply->m_requestor) == 0); - m_replies[reply->m_requestor].push_back(reply); + const bool newWindow = (m_replies.count(reply->m_requestor) == 0); + m_replies[reply->m_requestor].push_back(reply); - // adjust requestor's event mask if we haven't done so already. we - // want events in case the window is destroyed or any of its - // properties change. - if (newWindow) { - // note errors while we adjust event masks - bool error = false; - { - XWindowsUtil::ErrorLock lock(m_display, &error); + // adjust requestor's event mask if we haven't done so already. we + // want events in case the window is destroyed or any of its + // properties change. + if (newWindow) { + // note errors while we adjust event masks + bool error = false; + { + XWindowsUtil::ErrorLock lock(m_display, &error); - // get and save the current event mask - XWindowAttributes attr; - XGetWindowAttributes(m_display, reply->m_requestor, &attr); - m_eventMasks[reply->m_requestor] = attr.your_event_mask; + // get and save the current event mask + XWindowAttributes attr; + XGetWindowAttributes(m_display, reply->m_requestor, &attr); + m_eventMasks[reply->m_requestor] = attr.your_event_mask; - // add the events we want - XSelectInput(m_display, reply->m_requestor, attr.your_event_mask | - StructureNotifyMask | PropertyChangeMask); - } + // add the events we want + XSelectInput(m_display, reply->m_requestor, attr.your_event_mask | + StructureNotifyMask | PropertyChangeMask); + } - // if we failed then the window has already been destroyed - if (error) { - m_replies.erase(reply->m_requestor); - delete reply; - } - } + // if we failed then the window has already been destroyed + if (error) { + m_replies.erase(reply->m_requestor); + delete reply; + } + } } void XWindowsClipboard::pushReplies() { - // send the first reply for each window if that reply hasn't - // been sent yet. - for (ReplyMap::iterator index = m_replies.begin(); - index != m_replies.end(); ) { - assert(!index->second.empty()); - ReplyList::iterator listit = index->second.begin(); - while (listit != index->second.end()) { - if (!(*listit)->m_replied) - break; - ++listit; - } - if (listit != index->second.end() && !(*listit)->m_replied) { - pushReplies(index, index->second, listit); - } - else { - ++index; - } - } + // send the first reply for each window if that reply hasn't + // been sent yet. + for (ReplyMap::iterator index = m_replies.begin(); + index != m_replies.end(); ) { + assert(!index->second.empty()); + ReplyList::iterator listit = index->second.begin(); + while (listit != index->second.end()) { + if (!(*listit)->m_replied) + break; + ++listit; + } + if (listit != index->second.end() && !(*listit)->m_replied) { + pushReplies(index, index->second, listit); + } + else { + ++index; + } + } } void XWindowsClipboard::pushReplies(ReplyMap::iterator& mapIndex, - ReplyList& replies, ReplyList::iterator index) + ReplyList& replies, ReplyList::iterator index) { - Reply* reply = *index; - while (sendReply(reply)) { - // reply is complete. discard it and send the next reply, - // if any. - index = replies.erase(index); - delete reply; - if (index == replies.end()) { - break; - } - reply = *index; - } + Reply* reply = *index; + while (sendReply(reply)) { + // reply is complete. discard it and send the next reply, + // if any. + index = replies.erase(index); + delete reply; + if (index == replies.end()) { + break; + } + reply = *index; + } - // if there are no more replies in the list then remove the list - // and stop watching the requestor for events. - if (replies.empty()) { - XWindowsUtil::ErrorLock lock(m_display); - Window requestor = mapIndex->first; - XSelectInput(m_display, requestor, m_eventMasks[requestor]); - m_replies.erase(mapIndex++); - m_eventMasks.erase(requestor); - } - else { - ++mapIndex; - } + // if there are no more replies in the list then remove the list + // and stop watching the requestor for events. + if (replies.empty()) { + XWindowsUtil::ErrorLock lock(m_display); + Window requestor = mapIndex->first; + XSelectInput(m_display, requestor, m_eventMasks[requestor]); + m_replies.erase(mapIndex++); + m_eventMasks.erase(requestor); + } + else { + ++mapIndex; + } } bool XWindowsClipboard::sendReply(Reply* reply) { - assert(reply != NULL); + assert(reply != NULL); - // bail out immediately if reply is done - if (reply->m_done) { - LOG((CLOG_DEBUG1 "clipboard: finished reply to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); - return true; - } + // bail out immediately if reply is done + if (reply->m_done) { + LOG((CLOG_DEBUG1 "clipboard: finished reply to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); + return true; + } - // start in failed state if property is None - bool failed = (reply->m_property == None); - if (!failed) { - LOG((CLOG_DEBUG1 "clipboard: setting property on 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); + // start in failed state if property is None + bool failed = (reply->m_property == None); + if (!failed) { + LOG((CLOG_DEBUG1 "clipboard: setting property on 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); - // send using INCR if already sending incrementally or if reply - // is too large, otherwise just send it. - const UInt32 maxRequestSize = 3 * XMaxRequestSize(m_display); - const bool useINCR = (reply->m_data.size() > maxRequestSize); + // send using INCR if already sending incrementally or if reply + // is too large, otherwise just send it. + const UInt32 maxRequestSize = 3 * XMaxRequestSize(m_display); + const bool useINCR = (reply->m_data.size() > maxRequestSize); - // send INCR reply if incremental and we haven't replied yet - if (useINCR && !reply->m_replied) { - UInt32 size = reply->m_data.size(); - if (!XWindowsUtil::setWindowProperty(m_display, - reply->m_requestor, reply->m_property, - &size, 4, m_atomINCR, 32)) { - failed = true; - } - } + // send INCR reply if incremental and we haven't replied yet + if (useINCR && !reply->m_replied) { + UInt32 size = reply->m_data.size(); + if (!XWindowsUtil::setWindowProperty(m_display, + reply->m_requestor, reply->m_property, + &size, 4, m_atomINCR, 32)) { + failed = true; + } + } - // send more INCR reply or entire non-incremental reply - else { - // how much more data should we send? - UInt32 size = reply->m_data.size() - reply->m_ptr; - if (size > maxRequestSize) - size = maxRequestSize; + // send more INCR reply or entire non-incremental reply + else { + // how much more data should we send? + UInt32 size = reply->m_data.size() - reply->m_ptr; + if (size > maxRequestSize) + size = maxRequestSize; - // send it - if (!XWindowsUtil::setWindowProperty(m_display, - reply->m_requestor, reply->m_property, - reply->m_data.data() + reply->m_ptr, - size, - reply->m_type, reply->m_format)) { - failed = true; - } - else { - reply->m_ptr += size; + // send it + if (!XWindowsUtil::setWindowProperty(m_display, + reply->m_requestor, reply->m_property, + reply->m_data.data() + reply->m_ptr, + size, + reply->m_type, reply->m_format)) { + failed = true; + } + else { + reply->m_ptr += size; - // we've finished the reply if we just sent the zero - // size incremental chunk or if we're not incremental. - reply->m_done = (size == 0 || !useINCR); - } - } - } + // we've finished the reply if we just sent the zero + // size incremental chunk or if we're not incremental. + reply->m_done = (size == 0 || !useINCR); + } + } + } - // if we've failed then delete the property and say we're done. - // if we haven't replied yet then we can send a failure notify, - // otherwise we've failed in the middle of an incremental - // transfer; i don't know how to cancel that so i'll just send - // the final zero-length property. - // FIXME -- how do you gracefully cancel an incremental transfer? - if (failed) { - LOG((CLOG_DEBUG1 "clipboard: sending failure to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); - reply->m_done = true; - if (reply->m_property != None) { - XWindowsUtil::ErrorLock lock(m_display); - XDeleteProperty(m_display, reply->m_requestor, reply->m_property); - } + // if we've failed then delete the property and say we're done. + // if we haven't replied yet then we can send a failure notify, + // otherwise we've failed in the middle of an incremental + // transfer; i don't know how to cancel that so i'll just send + // the final zero-length property. + // FIXME -- how do you gracefully cancel an incremental transfer? + if (failed) { + LOG((CLOG_DEBUG1 "clipboard: sending failure to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); + reply->m_done = true; + if (reply->m_property != None) { + XWindowsUtil::ErrorLock lock(m_display); + XDeleteProperty(m_display, reply->m_requestor, reply->m_property); + } - if (!reply->m_replied) { - sendNotify(reply->m_requestor, m_selection, - reply->m_target, None, - reply->m_time); + if (!reply->m_replied) { + sendNotify(reply->m_requestor, m_selection, + reply->m_target, None, + reply->m_time); - // don't wait for any reply (because we're not expecting one) - return true; - } - else { - static const char dummy = 0; - XWindowsUtil::setWindowProperty(m_display, - reply->m_requestor, reply->m_property, - &dummy, - 0, - reply->m_type, reply->m_format); + // don't wait for any reply (because we're not expecting one) + return true; + } + else { + static const char dummy = 0; + XWindowsUtil::setWindowProperty(m_display, + reply->m_requestor, reply->m_property, + &dummy, + 0, + reply->m_type, reply->m_format); - // wait for delete notify - return false; - } - } + // wait for delete notify + return false; + } + } - // send notification if we haven't yet - if (!reply->m_replied) { - LOG((CLOG_DEBUG1 "clipboard: sending notify to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); - reply->m_replied = true; + // send notification if we haven't yet + if (!reply->m_replied) { + LOG((CLOG_DEBUG1 "clipboard: sending notify to 0x%08x,%d,%d", reply->m_requestor, reply->m_target, reply->m_property)); + reply->m_replied = true; - // dump every property on the requestor window to the debug2 - // log. we've seen what appears to be a bug in lesstif and - // knowing the properties may help design a workaround, if - // it becomes necessary. - if (CLOG->getFilter() >= kDEBUG2) { - XWindowsUtil::ErrorLock lock(m_display); - int n; - Atom* props = XListProperties(m_display, reply->m_requestor, &n); - LOG((CLOG_DEBUG2 "properties of 0x%08x:", reply->m_requestor)); - for (int i = 0; i < n; ++i) { - Atom target; - String data; - char* name = XGetAtomName(m_display, props[i]); - if (!XWindowsUtil::getWindowProperty(m_display, - reply->m_requestor, - props[i], &data, &target, NULL, False)) { - LOG((CLOG_DEBUG2 " %s: ", name)); - } - else { - // if there are any non-ascii characters in string - // then print the binary data. - static const char* hex = "0123456789abcdef"; - for (String::size_type j = 0; j < data.size(); ++j) { - if (data[j] < 32 || data[j] > 126) { - String tmp; - tmp.reserve(data.size() * 3); - for (j = 0; j < data.size(); ++j) { - unsigned char v = (unsigned char)data[j]; - tmp += hex[v >> 16]; - tmp += hex[v & 15]; - tmp += ' '; - } - data = tmp; - break; - } - } - char* type = XGetAtomName(m_display, target); - LOG((CLOG_DEBUG2 " %s (%s): %s", name, type, data.c_str())); - if (type != NULL) { - XFree(type); - } - } - if (name != NULL) { - XFree(name); - } - } - if (props != NULL) { - XFree(props); - } - } + // dump every property on the requestor window to the debug2 + // log. we've seen what appears to be a bug in lesstif and + // knowing the properties may help design a workaround, if + // it becomes necessary. + if (CLOG->getFilter() >= kDEBUG2) { + XWindowsUtil::ErrorLock lock(m_display); + int n; + Atom* props = XListProperties(m_display, reply->m_requestor, &n); + LOG((CLOG_DEBUG2 "properties of 0x%08x:", reply->m_requestor)); + for (int i = 0; i < n; ++i) { + Atom target; + String data; + char* name = XGetAtomName(m_display, props[i]); + if (!XWindowsUtil::getWindowProperty(m_display, + reply->m_requestor, + props[i], &data, &target, NULL, False)) { + LOG((CLOG_DEBUG2 " %s: ", name)); + } + else { + // if there are any non-ascii characters in string + // then print the binary data. + static const char* hex = "0123456789abcdef"; + for (String::size_type j = 0; j < data.size(); ++j) { + if (data[j] < 32 || data[j] > 126) { + String tmp; + tmp.reserve(data.size() * 3); + for (j = 0; j < data.size(); ++j) { + unsigned char v = (unsigned char)data[j]; + tmp += hex[v >> 16]; + tmp += hex[v & 15]; + tmp += ' '; + } + data = tmp; + break; + } + } + char* type = XGetAtomName(m_display, target); + LOG((CLOG_DEBUG2 " %s (%s): %s", name, type, data.c_str())); + if (type != NULL) { + XFree(type); + } + } + if (name != NULL) { + XFree(name); + } + } + if (props != NULL) { + XFree(props); + } + } - sendNotify(reply->m_requestor, m_selection, - reply->m_target, reply->m_property, - reply->m_time); - } + sendNotify(reply->m_requestor, m_selection, + reply->m_target, reply->m_property, + reply->m_time); + } - // wait for delete notify - return false; + // wait for delete notify + return false; } void XWindowsClipboard::clearReplies() { - for (ReplyMap::iterator index = m_replies.begin(); - index != m_replies.end(); ++index) { - clearReplies(index->second); - } - m_replies.clear(); - m_eventMasks.clear(); + for (ReplyMap::iterator index = m_replies.begin(); + index != m_replies.end(); ++index) { + clearReplies(index->second); + } + m_replies.clear(); + m_eventMasks.clear(); } void XWindowsClipboard::clearReplies(ReplyList& replies) { - for (ReplyList::iterator index = replies.begin(); - index != replies.end(); ++index) { - delete *index; - } - replies.clear(); + for (ReplyList::iterator index = replies.begin(); + index != replies.end(); ++index) { + delete *index; + } + replies.clear(); } void XWindowsClipboard::sendNotify(Window requestor, - Atom selection, Atom target, Atom property, Time time) + Atom selection, Atom target, Atom property, Time time) { - XEvent event; - event.xselection.type = SelectionNotify; - event.xselection.display = m_display; - event.xselection.requestor = requestor; - event.xselection.selection = selection; - event.xselection.target = target; - event.xselection.property = property; - event.xselection.time = time; - XWindowsUtil::ErrorLock lock(m_display); - XSendEvent(m_display, requestor, False, 0, &event); + XEvent event; + event.xselection.type = SelectionNotify; + event.xselection.display = m_display; + event.xselection.requestor = requestor; + event.xselection.selection = selection; + event.xselection.target = target; + event.xselection.property = property; + event.xselection.time = time; + XWindowsUtil::ErrorLock lock(m_display); + XSendEvent(m_display, requestor, False, 0, &event); } bool XWindowsClipboard::wasOwnedAtTime(::Time time) const { - // not owned if we've never owned the selection - checkCache(); - if (m_timeOwned == 0) { - return false; - } + // not owned if we've never owned the selection + checkCache(); + if (m_timeOwned == 0) { + return false; + } - // if time is CurrentTime then return true if we still own the - // selection and false if we do not. else if we still own the - // selection then get the current time, otherwise use - // m_timeLost as the end time. - Time lost = m_timeLost; - if (m_timeLost == 0) { - if (time == CurrentTime) { - return true; - } - else { - lost = XWindowsUtil::getCurrentTime(m_display, m_window); - } - } - else { - if (time == CurrentTime) { - return false; - } - } + // if time is CurrentTime then return true if we still own the + // selection and false if we do not. else if we still own the + // selection then get the current time, otherwise use + // m_timeLost as the end time. + Time lost = m_timeLost; + if (m_timeLost == 0) { + if (time == CurrentTime) { + return true; + } + else { + lost = XWindowsUtil::getCurrentTime(m_display, m_window); + } + } + else { + if (time == CurrentTime) { + return false; + } + } - // compare time to range - Time duration = lost - m_timeOwned; - Time when = time - m_timeOwned; - return (/*when >= 0 &&*/ when <= duration); + // compare time to range + Time duration = lost - m_timeOwned; + Time when = time - m_timeOwned; + return (/*when >= 0 &&*/ when <= duration); } Atom XWindowsClipboard::getTargetsData(String& data, int* format) const { - assert(format != NULL); + assert(format != NULL); - // add standard targets - XWindowsUtil::appendAtomData(data, m_atomTargets); - XWindowsUtil::appendAtomData(data, m_atomMultiple); - XWindowsUtil::appendAtomData(data, m_atomTimestamp); + // add standard targets + XWindowsUtil::appendAtomData(data, m_atomTargets); + XWindowsUtil::appendAtomData(data, m_atomMultiple); + XWindowsUtil::appendAtomData(data, m_atomTimestamp); - // add targets we can convert to - for (ConverterList::const_iterator index = m_converters.begin(); - index != m_converters.end(); ++index) { - IXWindowsClipboardConverter* converter = *index; + // add targets we can convert to + for (ConverterList::const_iterator index = m_converters.begin(); + index != m_converters.end(); ++index) { + IXWindowsClipboardConverter* converter = *index; - // skip formats we don't have - if (m_added[converter->getFormat()]) { - XWindowsUtil::appendAtomData(data, converter->getAtom()); - } - } + // skip formats we don't have + if (m_added[converter->getFormat()]) { + XWindowsUtil::appendAtomData(data, converter->getAtom()); + } + } - *format = 32; - return m_atomAtom; + *format = 32; + return m_atomAtom; } Atom XWindowsClipboard::getTimestampData(String& data, int* format) const { - assert(format != NULL); + assert(format != NULL); - checkCache(); - XWindowsUtil::appendTimeData(data, m_timeOwned); - *format = 32; - return m_atomInteger; + checkCache(); + XWindowsUtil::appendTimeData(data, m_timeOwned); + *format = 32; + return m_atomInteger; } @@ -1257,235 +1257,235 @@ XWindowsClipboard::getTimestampData(String& data, int* format) const // XWindowsClipboard::CICCCMGetClipboard::CICCCMGetClipboard( - Window requestor, Time time, Atom property) : - m_requestor(requestor), - m_time(time), - m_property(property), - m_incr(false), - m_failed(false), - m_done(false), - m_reading(false), - m_data(NULL), - m_actualTarget(NULL), - m_error(false) + Window requestor, Time time, Atom property) : + m_requestor(requestor), + m_time(time), + m_property(property), + m_incr(false), + m_failed(false), + m_done(false), + m_reading(false), + m_data(NULL), + m_actualTarget(NULL), + m_error(false) { - // do nothing + // do nothing } XWindowsClipboard::CICCCMGetClipboard::~CICCCMGetClipboard() { - // do nothing + // do nothing } bool XWindowsClipboard::CICCCMGetClipboard::readClipboard(Display* display, - Atom selection, Atom target, Atom* actualTarget, String* data) + Atom selection, Atom target, Atom* actualTarget, String* data) { - assert(actualTarget != NULL); - assert(data != NULL); + assert(actualTarget != NULL); + assert(data != NULL); - LOG((CLOG_DEBUG1 "request selection=%s, target=%s, window=%x", XWindowsUtil::atomToString(display, selection).c_str(), XWindowsUtil::atomToString(display, target).c_str(), m_requestor)); + LOG((CLOG_DEBUG1 "request selection=%s, target=%s, window=%x", XWindowsUtil::atomToString(display, selection).c_str(), XWindowsUtil::atomToString(display, target).c_str(), m_requestor)); - m_atomNone = XInternAtom(display, "NONE", False); - m_atomIncr = XInternAtom(display, "INCR", False); + m_atomNone = XInternAtom(display, "NONE", False); + m_atomIncr = XInternAtom(display, "INCR", False); - // save output pointers - m_actualTarget = actualTarget; - m_data = data; + // save output pointers + m_actualTarget = actualTarget; + m_data = data; - // assume failure - *m_actualTarget = None; - *m_data = ""; + // assume failure + *m_actualTarget = None; + *m_data = ""; - // delete target property - XDeleteProperty(display, m_requestor, m_property); + // delete target property + XDeleteProperty(display, m_requestor, m_property); - // select window for property changes - XWindowAttributes attr; - XGetWindowAttributes(display, m_requestor, &attr); - XSelectInput(display, m_requestor, - attr.your_event_mask | PropertyChangeMask); + // select window for property changes + XWindowAttributes attr; + XGetWindowAttributes(display, m_requestor, &attr); + XSelectInput(display, m_requestor, + attr.your_event_mask | PropertyChangeMask); - // request data conversion - XConvertSelection(display, selection, target, - m_property, m_requestor, m_time); + // request data conversion + XConvertSelection(display, selection, target, + m_property, m_requestor, m_time); - // synchronize with server before we start following timeout countdown - XSync(display, False); + // synchronize with server before we start following timeout countdown + XSync(display, False); - // Xlib inexplicably omits the ability to wait for an event with - // a timeout. (it's inexplicable because there's no portable way - // to do it.) we'll poll until we have what we're looking for or - // a timeout expires. we use a timeout so we don't get locked up - // by badly behaved selection owners. - XEvent xevent; - std::vector events; - Stopwatch timeout(false); // timer not stopped, not triggered - static const double s_timeout = 0.25; // FIXME -- is this too short? - bool noWait = false; - while (!m_done && !m_failed) { - // fail if timeout has expired - if (timeout.getTime() >= s_timeout) { - m_failed = true; - break; - } + // Xlib inexplicably omits the ability to wait for an event with + // a timeout. (it's inexplicable because there's no portable way + // to do it.) we'll poll until we have what we're looking for or + // a timeout expires. we use a timeout so we don't get locked up + // by badly behaved selection owners. + XEvent xevent; + std::vector events; + Stopwatch timeout(false); // timer not stopped, not triggered + static const double s_timeout = 0.25; // FIXME -- is this too short? + bool noWait = false; + while (!m_done && !m_failed) { + // fail if timeout has expired + if (timeout.getTime() >= s_timeout) { + m_failed = true; + break; + } - // process events if any otherwise sleep - if (noWait || XPending(display) > 0) { - while (!m_done && !m_failed && (noWait || XPending(display) > 0)) { - XNextEvent(display, &xevent); - if (!processEvent(display, &xevent)) { - // not processed so save it - events.push_back(xevent); - } - else { - // reset timer since we've made some progress - timeout.reset(); + // process events if any otherwise sleep + if (noWait || XPending(display) > 0) { + while (!m_done && !m_failed && (noWait || XPending(display) > 0)) { + XNextEvent(display, &xevent); + if (!processEvent(display, &xevent)) { + // not processed so save it + events.push_back(xevent); + } + else { + // reset timer since we've made some progress + timeout.reset(); - // don't sleep anymore, just block waiting for events. - // we're assuming here that the clipboard owner will - // complete the protocol correctly. if we continue to - // sleep we'll get very bad performance. - noWait = true; - } - } - } - else { - ARCH->sleep(0.01); - } - } + // don't sleep anymore, just block waiting for events. + // we're assuming here that the clipboard owner will + // complete the protocol correctly. if we continue to + // sleep we'll get very bad performance. + noWait = true; + } + } + } + else { + ARCH->sleep(0.01); + } + } - // put unprocessed events back - for (UInt32 i = events.size(); i > 0; --i) { - XPutBackEvent(display, &events[i - 1]); - } + // put unprocessed events back + for (UInt32 i = events.size(); i > 0; --i) { + XPutBackEvent(display, &events[i - 1]); + } - // restore mask - XSelectInput(display, m_requestor, attr.your_event_mask); + // restore mask + XSelectInput(display, m_requestor, attr.your_event_mask); - // return success or failure - LOG((CLOG_DEBUG1 "request %s after %fs", m_failed ? "failed" : "succeeded", timeout.getTime())); - return !m_failed; + // return success or failure + LOG((CLOG_DEBUG1 "request %s after %fs", m_failed ? "failed" : "succeeded", timeout.getTime())); + return !m_failed; } bool XWindowsClipboard::CICCCMGetClipboard::processEvent( - Display* display, XEvent* xevent) + Display* display, XEvent* xevent) { - // process event - switch (xevent->type) { - case DestroyNotify: - if (xevent->xdestroywindow.window == m_requestor) { - m_failed = true; - return true; - } + // process event + switch (xevent->type) { + case DestroyNotify: + if (xevent->xdestroywindow.window == m_requestor) { + m_failed = true; + return true; + } - // not interested - return false; + // not interested + return false; - case SelectionNotify: - if (xevent->xselection.requestor == m_requestor) { - // done if we can't convert - if (xevent->xselection.property == None || - xevent->xselection.property == m_atomNone) { - m_done = true; - return true; - } + case SelectionNotify: + if (xevent->xselection.requestor == m_requestor) { + // done if we can't convert + if (xevent->xselection.property == None || + xevent->xselection.property == m_atomNone) { + m_done = true; + return true; + } - // proceed if conversion successful - else if (xevent->xselection.property == m_property) { - m_reading = true; - break; - } - } + // proceed if conversion successful + else if (xevent->xselection.property == m_property) { + m_reading = true; + break; + } + } - // otherwise not interested - return false; + // otherwise not interested + return false; - case PropertyNotify: - // proceed if conversion successful and we're receiving more data - if (xevent->xproperty.window == m_requestor && - xevent->xproperty.atom == m_property && - xevent->xproperty.state == PropertyNewValue) { - if (!m_reading) { - // we haven't gotten the SelectionNotify yet - return true; - } - break; - } + case PropertyNotify: + // proceed if conversion successful and we're receiving more data + if (xevent->xproperty.window == m_requestor && + xevent->xproperty.atom == m_property && + xevent->xproperty.state == PropertyNewValue) { + if (!m_reading) { + // we haven't gotten the SelectionNotify yet + return true; + } + break; + } - // otherwise not interested - return false; + // otherwise not interested + return false; - default: - // not interested - return false; - } + default: + // not interested + return false; + } - // get the data from the property - Atom target; - const String::size_type oldSize = m_data->size(); - if (!XWindowsUtil::getWindowProperty(display, m_requestor, - m_property, m_data, &target, NULL, True)) { - // unable to read property - m_failed = true; - return true; - } + // get the data from the property + Atom target; + const String::size_type oldSize = m_data->size(); + if (!XWindowsUtil::getWindowProperty(display, m_requestor, + m_property, m_data, &target, NULL, True)) { + // unable to read property + m_failed = true; + return true; + } - // note if incremental. if we're already incremental then the - // selection owner is busted. if the INCR property has no size - // then the selection owner is busted. - if (target == m_atomIncr) { - if (m_incr) { - m_failed = true; - m_error = true; - } - else if (m_data->size() == oldSize) { - m_failed = true; - m_error = true; - } - else { - m_incr = true; + // note if incremental. if we're already incremental then the + // selection owner is busted. if the INCR property has no size + // then the selection owner is busted. + if (target == m_atomIncr) { + if (m_incr) { + m_failed = true; + m_error = true; + } + else if (m_data->size() == oldSize) { + m_failed = true; + m_error = true; + } + else { + m_incr = true; - // discard INCR data - *m_data = ""; - } - } + // discard INCR data + *m_data = ""; + } + } - // handle incremental chunks - else if (m_incr) { - // if first incremental chunk then save target - if (oldSize == 0) { - LOG((CLOG_DEBUG1 " INCR first chunk, target %s", XWindowsUtil::atomToString(display, target).c_str())); - *m_actualTarget = target; - } + // handle incremental chunks + else if (m_incr) { + // if first incremental chunk then save target + if (oldSize == 0) { + LOG((CLOG_DEBUG1 " INCR first chunk, target %s", XWindowsUtil::atomToString(display, target).c_str())); + *m_actualTarget = target; + } - // secondary chunks must have the same target - else { - if (target != *m_actualTarget) { - LOG((CLOG_WARN " INCR target mismatch")); - m_failed = true; - m_error = true; - } - } + // secondary chunks must have the same target + else { + if (target != *m_actualTarget) { + LOG((CLOG_WARN " INCR target mismatch")); + m_failed = true; + m_error = true; + } + } - // note if this is the final chunk - if (m_data->size() == oldSize) { - LOG((CLOG_DEBUG1 " INCR final chunk: %d bytes total", m_data->size())); - m_done = true; - } - } + // note if this is the final chunk + if (m_data->size() == oldSize) { + LOG((CLOG_DEBUG1 " INCR final chunk: %d bytes total", m_data->size())); + m_done = true; + } + } - // not incremental; save the target. - else { - LOG((CLOG_DEBUG1 " target %s", XWindowsUtil::atomToString(display, target).c_str())); - *m_actualTarget = target; - m_done = true; - } + // not incremental; save the target. + else { + LOG((CLOG_DEBUG1 " target %s", XWindowsUtil::atomToString(display, target).c_str())); + *m_actualTarget = target; + m_done = true; + } - // this event has been processed - LOGC(!m_incr, (CLOG_DEBUG1 " got data, %d bytes", m_data->size())); - return true; + // this event has been processed + LOGC(!m_incr, (CLOG_DEBUG1 " got data, %d bytes", m_data->size())); + return true; } @@ -1494,32 +1494,32 @@ XWindowsClipboard::CICCCMGetClipboard::processEvent( // XWindowsClipboard::Reply::Reply(Window requestor, Atom target, ::Time time) : - m_requestor(requestor), - m_target(target), - m_time(time), - m_property(None), - m_replied(false), - m_done(false), - m_data(), - m_type(None), - m_format(32), - m_ptr(0) + m_requestor(requestor), + m_target(target), + m_time(time), + m_property(None), + m_replied(false), + m_done(false), + m_data(), + m_type(None), + m_format(32), + m_ptr(0) { - // do nothing + // do nothing } XWindowsClipboard::Reply::Reply(Window requestor, Atom target, ::Time time, - Atom property, const String& data, Atom type, int format) : - m_requestor(requestor), - m_target(target), - m_time(time), - m_property(property), - m_replied(false), - m_done(false), - m_data(data), - m_type(type), - m_format(format), - m_ptr(0) + Atom property, const String& data, Atom type, int format) : + m_requestor(requestor), + m_target(target), + m_time(time), + m_property(property), + m_replied(false), + m_done(false), + m_data(data), + m_type(type), + m_format(format), + m_ptr(0) { - // do nothing + // do nothing } diff --git a/src/lib/platform/XWindowsClipboard.h b/src/lib/platform/XWindowsClipboard.h index d091fd6a..9e6fbd47 100644 --- a/src/lib/platform/XWindowsClipboard.h +++ b/src/lib/platform/XWindowsClipboard.h @@ -25,9 +25,9 @@ #include "common/stdvector.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include +# include #endif class IXWindowsClipboardConverter; @@ -35,296 +35,296 @@ class IXWindowsClipboardConverter; //! X11 clipboard implementation class XWindowsClipboard : public IClipboard { public: - /*! - Use \c window as the window that owns or interacts with the - clipboard identified by \c id. - */ - XWindowsClipboard(Display*, Window window, ClipboardID id); - virtual ~XWindowsClipboard(); + /*! + Use \c window as the window that owns or interacts with the + clipboard identified by \c id. + */ + XWindowsClipboard(Display*, Window window, ClipboardID id); + virtual ~XWindowsClipboard(); - //! Notify clipboard was lost - /*! - Tells clipboard it lost ownership at the given time. - */ - void lost(Time); + //! Notify clipboard was lost + /*! + Tells clipboard it lost ownership at the given time. + */ + void lost(Time); - //! Add clipboard request - /*! - Adds a selection request to the request list. If the given - owner window isn't this clipboard's window then this simply - sends a failure event to the requestor. - */ - void addRequest(Window owner, - Window requestor, Atom target, - ::Time time, Atom property); + //! Add clipboard request + /*! + Adds a selection request to the request list. If the given + owner window isn't this clipboard's window then this simply + sends a failure event to the requestor. + */ + void addRequest(Window owner, + Window requestor, Atom target, + ::Time time, Atom property); - //! Process clipboard request - /*! - Continues processing a selection request. Returns true if the - request was handled, false if the request was unknown. - */ - bool processRequest(Window requestor, - ::Time time, Atom property); + //! Process clipboard request + /*! + Continues processing a selection request. Returns true if the + request was handled, false if the request was unknown. + */ + bool processRequest(Window requestor, + ::Time time, Atom property); - //! Cancel clipboard request - /*! - Terminate a selection request. Returns true iff the request - was known and handled. - */ - bool destroyRequest(Window requestor); + //! Cancel clipboard request + /*! + Terminate a selection request. Returns true iff the request + was known and handled. + */ + bool destroyRequest(Window requestor); - //! Get window - /*! - Returns the clipboard's window (passed the c'tor). - */ - Window getWindow() const; + //! Get window + /*! + Returns the clipboard's window (passed the c'tor). + */ + Window getWindow() const; - //! Get selection atom - /*! - Returns the selection atom that identifies the clipboard to X11 - (e.g. XA_PRIMARY). - */ - Atom getSelection() const; + //! Get selection atom + /*! + Returns the selection atom that identifies the clipboard to X11 + (e.g. XA_PRIMARY). + */ + Atom getSelection() const; - // IClipboard overrides - virtual bool empty(); - virtual void add(EFormat, const String& data); - virtual bool open(Time) const; - virtual void close() const; - virtual Time getTime() const; - virtual bool has(EFormat) const; - virtual String get(EFormat) const; + // IClipboard overrides + virtual bool empty(); + virtual void add(EFormat, const String& data); + virtual bool open(Time) const; + virtual void close() const; + virtual Time getTime() const; + virtual bool has(EFormat) const; + virtual String get(EFormat) const; private: - // remove all converters from our list - void clearConverters(); + // remove all converters from our list + void clearConverters(); - // get the converter for a clipboard format. returns NULL if no - // suitable converter. iff onlyIfNotAdded is true then also - // return NULL if a suitable converter was found but we already - // have data of the converter's clipboard format. - IXWindowsClipboardConverter* - getConverter(Atom target, - bool onlyIfNotAdded = false) const; + // get the converter for a clipboard format. returns NULL if no + // suitable converter. iff onlyIfNotAdded is true then also + // return NULL if a suitable converter was found but we already + // have data of the converter's clipboard format. + IXWindowsClipboardConverter* + getConverter(Atom target, + bool onlyIfNotAdded = false) const; - // convert target atom to clipboard format - EFormat getFormat(Atom target) const; + // convert target atom to clipboard format + EFormat getFormat(Atom target) const; - // add a non-MULTIPLE request. does not verify that the selection - // was owned at the given time. returns true if the conversion - // could be performed, false otherwise. in either case, the - // reply is inserted. - bool addSimpleRequest( - Window requestor, Atom target, - ::Time time, Atom property); + // add a non-MULTIPLE request. does not verify that the selection + // was owned at the given time. returns true if the conversion + // could be performed, false otherwise. in either case, the + // reply is inserted. + bool addSimpleRequest( + Window requestor, Atom target, + ::Time time, Atom property); - // if not already checked then see if the cache is stale and, if so, - // clear it. this has the side effect of updating m_timeOwned. - void checkCache() const; + // if not already checked then see if the cache is stale and, if so, + // clear it. this has the side effect of updating m_timeOwned. + void checkCache() const; - // clear the cache, resetting the cached flag and the added flag for - // each format. - void clearCache() const; - void doClearCache(); + // clear the cache, resetting the cached flag and the added flag for + // each format. + void clearCache() const; + void doClearCache(); - // cache all formats of the selection - void fillCache() const; - void doFillCache(); + // cache all formats of the selection + void fillCache() const; + void doFillCache(); - // - // helper classes - // + // + // helper classes + // - // read an ICCCM conforming selection - class CICCCMGetClipboard { - public: - CICCCMGetClipboard(Window requestor, Time time, Atom property); - ~CICCCMGetClipboard(); + // read an ICCCM conforming selection + class CICCCMGetClipboard { + public: + CICCCMGetClipboard(Window requestor, Time time, Atom property); + ~CICCCMGetClipboard(); - // convert the given selection to the given type. returns - // true iff the conversion was successful or the conversion - // cannot be performed (in which case *actualTarget == None). - bool readClipboard(Display* display, - Atom selection, Atom target, - Atom* actualTarget, String* data); + // convert the given selection to the given type. returns + // true iff the conversion was successful or the conversion + // cannot be performed (in which case *actualTarget == None). + bool readClipboard(Display* display, + Atom selection, Atom target, + Atom* actualTarget, String* data); - private: - bool processEvent(Display* display, XEvent* event); + private: + bool processEvent(Display* display, XEvent* event); - private: - Window m_requestor; - Time m_time; - Atom m_property; - bool m_incr; - bool m_failed; - bool m_done; + private: + Window m_requestor; + Time m_time; + Atom m_property; + bool m_incr; + bool m_failed; + bool m_done; - // atoms needed for the protocol - Atom m_atomNone; // NONE, not None - Atom m_atomIncr; + // atoms needed for the protocol + Atom m_atomNone; // NONE, not None + Atom m_atomIncr; - // true iff we've received the selection notify - bool m_reading; + // true iff we've received the selection notify + bool m_reading; - // the converted selection data - String* m_data; + // the converted selection data + String* m_data; - // the actual type of the data. if this is None then the - // selection owner cannot convert to the requested type. - Atom* m_actualTarget; + // the actual type of the data. if this is None then the + // selection owner cannot convert to the requested type. + Atom* m_actualTarget; - public: - // true iff the selection owner didn't follow ICCCM conventions - bool m_error; - }; + public: + // true iff the selection owner didn't follow ICCCM conventions + bool m_error; + }; - // Motif structure IDs - enum { kMotifClipFormat = 1, kMotifClipItem, kMotifClipHeader }; + // Motif structure IDs + enum { kMotifClipFormat = 1, kMotifClipItem, kMotifClipHeader }; - // _MOTIF_CLIP_HEADER structure - class MotifClipHeader { - public: - SInt32 m_id; // kMotifClipHeader - SInt32 m_pad1[3]; - SInt32 m_item; - SInt32 m_pad2[4]; - SInt32 m_numItems; - SInt32 m_pad3[3]; - SInt32 m_selectionOwner; // a Window - SInt32 m_pad4[2]; - }; + // _MOTIF_CLIP_HEADER structure + class MotifClipHeader { + public: + SInt32 m_id; // kMotifClipHeader + SInt32 m_pad1[3]; + SInt32 m_item; + SInt32 m_pad2[4]; + SInt32 m_numItems; + SInt32 m_pad3[3]; + SInt32 m_selectionOwner; // a Window + SInt32 m_pad4[2]; + }; - // Motif clip item structure - class MotifClipItem { - public: - SInt32 m_id; // kMotifClipItem - SInt32 m_pad1[5]; - SInt32 m_size; - SInt32 m_numFormats; - SInt32 m_numDeletedFormats; - SInt32 m_pad2[6]; - }; + // Motif clip item structure + class MotifClipItem { + public: + SInt32 m_id; // kMotifClipItem + SInt32 m_pad1[5]; + SInt32 m_size; + SInt32 m_numFormats; + SInt32 m_numDeletedFormats; + SInt32 m_pad2[6]; + }; - // Motif clip format structure - class MotifClipFormat { - public: - SInt32 m_id; // kMotifClipFormat - SInt32 m_pad1[6]; - SInt32 m_length; - SInt32 m_data; - SInt32 m_type; // an Atom - SInt32 m_pad2[1]; - SInt32 m_deleted; - SInt32 m_pad3[4]; - }; + // Motif clip format structure + class MotifClipFormat { + public: + SInt32 m_id; // kMotifClipFormat + SInt32 m_pad1[6]; + SInt32 m_length; + SInt32 m_data; + SInt32 m_type; // an Atom + SInt32 m_pad2[1]; + SInt32 m_deleted; + SInt32 m_pad3[4]; + }; - // stores data needed to respond to a selection request - class Reply { - public: - Reply(Window, Atom target, ::Time); - Reply(Window, Atom target, ::Time, Atom property, - const String& data, Atom type, int format); + // stores data needed to respond to a selection request + class Reply { + public: + Reply(Window, Atom target, ::Time); + Reply(Window, Atom target, ::Time, Atom property, + const String& data, Atom type, int format); - public: - // information about the request - Window m_requestor; - Atom m_target; - ::Time m_time; - Atom m_property; + public: + // information about the request + Window m_requestor; + Atom m_target; + ::Time m_time; + Atom m_property; - // true iff we've sent the notification for this reply - bool m_replied; + // true iff we've sent the notification for this reply + bool m_replied; - // true iff the reply has sent its last message - bool m_done; + // true iff the reply has sent its last message + bool m_done; - // the data to send and its type and format - String m_data; - Atom m_type; - int m_format; + // the data to send and its type and format + String m_data; + Atom m_type; + int m_format; - // index of next byte in m_data to send - UInt32 m_ptr; - }; - typedef std::list ReplyList; - typedef std::map ReplyMap; - typedef std::map ReplyEventMask; + // index of next byte in m_data to send + UInt32 m_ptr; + }; + typedef std::list ReplyList; + typedef std::map ReplyMap; + typedef std::map ReplyEventMask; - // ICCCM interoperability methods - void icccmFillCache(); - bool icccmGetSelection(Atom target, - Atom* actualTarget, String* data) const; - Time icccmGetTime() const; + // ICCCM interoperability methods + void icccmFillCache(); + bool icccmGetSelection(Atom target, + Atom* actualTarget, String* data) const; + Time icccmGetTime() const; - // motif interoperability methods - bool motifLockClipboard() const; - void motifUnlockClipboard() const; - bool motifOwnsClipboard() const; - void motifFillCache(); - bool motifGetSelection(const MotifClipFormat*, - Atom* actualTarget, String* data) const; - Time motifGetTime() const; + // motif interoperability methods + bool motifLockClipboard() const; + void motifUnlockClipboard() const; + bool motifOwnsClipboard() const; + void motifFillCache(); + bool motifGetSelection(const MotifClipFormat*, + Atom* actualTarget, String* data) const; + Time motifGetTime() const; - // reply methods - bool insertMultipleReply(Window, ::Time, Atom); - void insertReply(Reply*); - void pushReplies(); - void pushReplies(ReplyMap::iterator&, - ReplyList&, ReplyList::iterator); - bool sendReply(Reply*); - void clearReplies(); - void clearReplies(ReplyList&); - void sendNotify(Window requestor, Atom selection, - Atom target, Atom property, Time time); - bool wasOwnedAtTime(::Time) const; + // reply methods + bool insertMultipleReply(Window, ::Time, Atom); + void insertReply(Reply*); + void pushReplies(); + void pushReplies(ReplyMap::iterator&, + ReplyList&, ReplyList::iterator); + bool sendReply(Reply*); + void clearReplies(); + void clearReplies(ReplyList&); + void sendNotify(Window requestor, Atom selection, + Atom target, Atom property, Time time); + bool wasOwnedAtTime(::Time) const; - // data conversion methods - Atom getTargetsData(String&, int* format) const; - Atom getTimestampData(String&, int* format) const; + // data conversion methods + Atom getTargetsData(String&, int* format) const; + Atom getTimestampData(String&, int* format) const; private: - typedef std::vector ConverterList; + typedef std::vector ConverterList; - Display* m_display; - Window m_window; - ClipboardID m_id; - Atom m_selection; - mutable bool m_open; - mutable Time m_time; - bool m_owner; - mutable Time m_timeOwned; - Time m_timeLost; + Display* m_display; + Window m_window; + ClipboardID m_id; + Atom m_selection; + mutable bool m_open; + mutable Time m_time; + bool m_owner; + mutable Time m_timeOwned; + Time m_timeLost; - // true iff open and clipboard owned by a motif app - mutable bool m_motif; + // true iff open and clipboard owned by a motif app + mutable bool m_motif; - // the added/cached clipboard data - mutable bool m_checkCache; - bool m_cached; - Time m_cacheTime; - bool m_added[kNumFormats]; - String m_data[kNumFormats]; + // the added/cached clipboard data + mutable bool m_checkCache; + bool m_cached; + Time m_cacheTime; + bool m_added[kNumFormats]; + String m_data[kNumFormats]; - // conversion request replies - ReplyMap m_replies; - ReplyEventMask m_eventMasks; + // conversion request replies + ReplyMap m_replies; + ReplyEventMask m_eventMasks; - // clipboard format converters - ConverterList m_converters; + // clipboard format converters + ConverterList m_converters; - // atoms we'll need - Atom m_atomTargets; - Atom m_atomMultiple; - Atom m_atomTimestamp; - Atom m_atomInteger; - Atom m_atomAtom; - Atom m_atomAtomPair; - Atom m_atomData; - Atom m_atomINCR; - Atom m_atomMotifClipLock; - Atom m_atomMotifClipHeader; - Atom m_atomMotifClipAccess; - Atom m_atomGDKSelection; + // atoms we'll need + Atom m_atomTargets; + Atom m_atomMultiple; + Atom m_atomTimestamp; + Atom m_atomInteger; + Atom m_atomAtom; + Atom m_atomAtomPair; + Atom m_atomData; + Atom m_atomINCR; + Atom m_atomMotifClipLock; + Atom m_atomMotifClipHeader; + Atom m_atomMotifClipAccess; + Atom m_atomGDKSelection; }; //! Clipboard format converter interface @@ -334,45 +334,45 @@ converters. */ class IXWindowsClipboardConverter : public IInterface { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get clipboard format - /*! - Return the clipboard format this object converts from/to. - */ - virtual IClipboard::EFormat - getFormat() const = 0; + //! Get clipboard format + /*! + Return the clipboard format this object converts from/to. + */ + virtual IClipboard::EFormat + getFormat() const = 0; - //! Get X11 format atom - /*! - Return the atom representing the X selection format that - this object converts from/to. - */ - virtual Atom getAtom() const = 0; + //! Get X11 format atom + /*! + Return the atom representing the X selection format that + this object converts from/to. + */ + virtual Atom getAtom() const = 0; - //! Get X11 property datum size - /*! - Return the size (in bits) of data elements returned by - toIClipboard(). - */ - virtual int getDataSize() const = 0; + //! Get X11 property datum size + /*! + Return the size (in bits) of data elements returned by + toIClipboard(). + */ + virtual int getDataSize() const = 0; - //! Convert from IClipboard format - /*! - Convert from the IClipboard format to the X selection format. - The input data must be in the IClipboard format returned by - getFormat(). The return data will be in the X selection - format returned by getAtom(). - */ - virtual String fromIClipboard(const String&) const = 0; + //! Convert from IClipboard format + /*! + Convert from the IClipboard format to the X selection format. + The input data must be in the IClipboard format returned by + getFormat(). The return data will be in the X selection + format returned by getAtom(). + */ + virtual String fromIClipboard(const String&) const = 0; - //! Convert to IClipboard format - /*! - Convert from the X selection format to the IClipboard format - (i.e., the reverse of fromIClipboard()). - */ - virtual String toIClipboard(const String&) const = 0; + //! Convert to IClipboard format + /*! + Convert from the X selection format to the IClipboard format + (i.e., the reverse of fromIClipboard()). + */ + virtual String toIClipboard(const String&) const = 0; - //@} + //@} }; diff --git a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp index 07f89a3a..4c18b537 100644 --- a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp +++ b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp @@ -21,17 +21,17 @@ // BMP info header structure struct CBMPInfoHeader { public: - UInt32 biSize; - SInt32 biWidth; - SInt32 biHeight; - UInt16 biPlanes; - UInt16 biBitCount; - UInt32 biCompression; - UInt32 biSizeImage; - SInt32 biXPelsPerMeter; - SInt32 biYPelsPerMeter; - UInt32 biClrUsed; - UInt32 biClrImportant; + UInt32 biSize; + SInt32 biWidth; + SInt32 biHeight; + UInt16 biPlanes; + UInt16 biBitCount; + UInt32 biCompression; + UInt32 biSizeImage; + SInt32 biXPelsPerMeter; + SInt32 biYPelsPerMeter; + UInt32 biClrUsed; + UInt32 biClrImportant; }; // BMP is little-endian @@ -40,59 +40,59 @@ static void toLE(UInt8*& dst, UInt16 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst += 2; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst += 2; } static void toLE(UInt8*& dst, SInt32 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst[2] = static_cast((src >> 16) & 0xffu); - dst[3] = static_cast((src >> 24) & 0xffu); - dst += 4; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst[2] = static_cast((src >> 16) & 0xffu); + dst[3] = static_cast((src >> 24) & 0xffu); + dst += 4; } static void toLE(UInt8*& dst, UInt32 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst[2] = static_cast((src >> 16) & 0xffu); - dst[3] = static_cast((src >> 24) & 0xffu); - dst += 4; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst[2] = static_cast((src >> 16) & 0xffu); + dst[3] = static_cast((src >> 24) & 0xffu); + dst += 4; } static inline UInt16 fromLEU16(const UInt8* data) { - return static_cast(data[0]) | - (static_cast(data[1]) << 8); + return static_cast(data[0]) | + (static_cast(data[1]) << 8); } static inline SInt32 fromLES32(const UInt8* data) { - return static_cast(static_cast(data[0]) | - (static_cast(data[1]) << 8) | - (static_cast(data[2]) << 16) | - (static_cast(data[3]) << 24)); + return static_cast(static_cast(data[0]) | + (static_cast(data[1]) << 8) | + (static_cast(data[2]) << 16) | + (static_cast(data[3]) << 24)); } static inline UInt32 fromLEU32(const UInt8* data) { - return static_cast(data[0]) | - (static_cast(data[1]) << 8) | - (static_cast(data[2]) << 16) | - (static_cast(data[3]) << 24); + return static_cast(data[0]) | + (static_cast(data[1]) << 8) | + (static_cast(data[2]) << 16) | + (static_cast(data[3]) << 24); } @@ -102,90 +102,90 @@ fromLEU32(const UInt8* data) XWindowsClipboardAnyBitmapConverter::XWindowsClipboardAnyBitmapConverter() { - // do nothing + // do nothing } XWindowsClipboardAnyBitmapConverter::~XWindowsClipboardAnyBitmapConverter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardAnyBitmapConverter::getFormat() const { - return IClipboard::kBitmap; + return IClipboard::kBitmap; } int XWindowsClipboardAnyBitmapConverter::getDataSize() const { - return 8; + return 8; } String XWindowsClipboardAnyBitmapConverter::fromIClipboard(const String& bmp) const { - // fill BMP info header with native-endian data - CBMPInfoHeader infoHeader; - const UInt8* rawBMPInfoHeader = reinterpret_cast(bmp.data()); - infoHeader.biSize = fromLEU32(rawBMPInfoHeader + 0); - infoHeader.biWidth = fromLES32(rawBMPInfoHeader + 4); - infoHeader.biHeight = fromLES32(rawBMPInfoHeader + 8); - infoHeader.biPlanes = fromLEU16(rawBMPInfoHeader + 12); - infoHeader.biBitCount = fromLEU16(rawBMPInfoHeader + 14); - infoHeader.biCompression = fromLEU32(rawBMPInfoHeader + 16); - infoHeader.biSizeImage = fromLEU32(rawBMPInfoHeader + 20); - infoHeader.biXPelsPerMeter = fromLES32(rawBMPInfoHeader + 24); - infoHeader.biYPelsPerMeter = fromLES32(rawBMPInfoHeader + 28); - infoHeader.biClrUsed = fromLEU32(rawBMPInfoHeader + 32); - infoHeader.biClrImportant = fromLEU32(rawBMPInfoHeader + 36); + // fill BMP info header with native-endian data + CBMPInfoHeader infoHeader; + const UInt8* rawBMPInfoHeader = reinterpret_cast(bmp.data()); + infoHeader.biSize = fromLEU32(rawBMPInfoHeader + 0); + infoHeader.biWidth = fromLES32(rawBMPInfoHeader + 4); + infoHeader.biHeight = fromLES32(rawBMPInfoHeader + 8); + infoHeader.biPlanes = fromLEU16(rawBMPInfoHeader + 12); + infoHeader.biBitCount = fromLEU16(rawBMPInfoHeader + 14); + infoHeader.biCompression = fromLEU32(rawBMPInfoHeader + 16); + infoHeader.biSizeImage = fromLEU32(rawBMPInfoHeader + 20); + infoHeader.biXPelsPerMeter = fromLES32(rawBMPInfoHeader + 24); + infoHeader.biYPelsPerMeter = fromLES32(rawBMPInfoHeader + 28); + infoHeader.biClrUsed = fromLEU32(rawBMPInfoHeader + 32); + infoHeader.biClrImportant = fromLEU32(rawBMPInfoHeader + 36); - // check that format is acceptable - if (infoHeader.biSize != 40 || - infoHeader.biWidth == 0 || infoHeader.biHeight == 0 || - infoHeader.biPlanes != 0 || infoHeader.biCompression != 0 || - (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 32)) { - return String(); - } + // check that format is acceptable + if (infoHeader.biSize != 40 || + infoHeader.biWidth == 0 || infoHeader.biHeight == 0 || + infoHeader.biPlanes != 0 || infoHeader.biCompression != 0 || + (infoHeader.biBitCount != 24 && infoHeader.biBitCount != 32)) { + return String(); + } - // convert to image format - const UInt8* rawBMPPixels = rawBMPInfoHeader + 40; - if (infoHeader.biBitCount == 24) { - return doBGRFromIClipboard(rawBMPPixels, - infoHeader.biWidth, infoHeader.biHeight); - } - else { - return doBGRAFromIClipboard(rawBMPPixels, - infoHeader.biWidth, infoHeader.biHeight); - } + // convert to image format + const UInt8* rawBMPPixels = rawBMPInfoHeader + 40; + if (infoHeader.biBitCount == 24) { + return doBGRFromIClipboard(rawBMPPixels, + infoHeader.biWidth, infoHeader.biHeight); + } + else { + return doBGRAFromIClipboard(rawBMPPixels, + infoHeader.biWidth, infoHeader.biHeight); + } } String XWindowsClipboardAnyBitmapConverter::toIClipboard(const String& image) const { - // convert to raw BMP data - UInt32 w, h, depth; - String rawBMP = doToIClipboard(image, w, h, depth); - if (rawBMP.empty() || w == 0 || h == 0 || (depth != 24 && depth != 32)) { - return String(); - } + // convert to raw BMP data + UInt32 w, h, depth; + String rawBMP = doToIClipboard(image, w, h, depth); + if (rawBMP.empty() || w == 0 || h == 0 || (depth != 24 && depth != 32)) { + return String(); + } - // fill BMP info header with little-endian data - UInt8 infoHeader[40]; - UInt8* dst = infoHeader; - toLE(dst, static_cast(40)); - toLE(dst, static_cast(w)); - toLE(dst, static_cast(h)); - toLE(dst, static_cast(1)); - toLE(dst, static_cast(depth)); - toLE(dst, static_cast(0)); // BI_RGB - toLE(dst, static_cast(image.size())); - toLE(dst, static_cast(2834)); // 72 dpi - toLE(dst, static_cast(2834)); // 72 dpi - toLE(dst, static_cast(0)); - toLE(dst, static_cast(0)); + // fill BMP info header with little-endian data + UInt8 infoHeader[40]; + UInt8* dst = infoHeader; + toLE(dst, static_cast(40)); + toLE(dst, static_cast(w)); + toLE(dst, static_cast(h)); + toLE(dst, static_cast(1)); + toLE(dst, static_cast(depth)); + toLE(dst, static_cast(0)); // BI_RGB + toLE(dst, static_cast(image.size())); + toLE(dst, static_cast(2834)); // 72 dpi + toLE(dst, static_cast(2834)); // 72 dpi + toLE(dst, static_cast(0)); + toLE(dst, static_cast(0)); - // construct image - return String(reinterpret_cast(infoHeader), - sizeof(infoHeader)) + rawBMP; + // construct image + return String(reinterpret_cast(infoHeader), + sizeof(infoHeader)) + rawBMP; } diff --git a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h index 02c21c47..e99d7dc5 100644 --- a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h +++ b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h @@ -22,39 +22,39 @@ //! Convert to/from some text encoding class XWindowsClipboardAnyBitmapConverter : - public IXWindowsClipboardConverter { + public IXWindowsClipboardConverter { public: - XWindowsClipboardAnyBitmapConverter(); - virtual ~XWindowsClipboardAnyBitmapConverter(); + XWindowsClipboardAnyBitmapConverter(); + virtual ~XWindowsClipboardAnyBitmapConverter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const = 0; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const = 0; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; protected: - //! Convert from IClipboard format - /*! - Convert raw BGR pixel data to another image format. - */ - virtual String doBGRFromIClipboard(const UInt8* bgrData, - UInt32 w, UInt32 h) const = 0; + //! Convert from IClipboard format + /*! + Convert raw BGR pixel data to another image format. + */ + virtual String doBGRFromIClipboard(const UInt8* bgrData, + UInt32 w, UInt32 h) const = 0; - //! Convert from IClipboard format - /*! - Convert raw BGRA pixel data to another image format. - */ - virtual String doBGRAFromIClipboard(const UInt8* bgrData, - UInt32 w, UInt32 h) const = 0; + //! Convert from IClipboard format + /*! + Convert raw BGRA pixel data to another image format. + */ + virtual String doBGRAFromIClipboard(const UInt8* bgrData, + UInt32 w, UInt32 h) const = 0; - //! Convert to IClipboard format - /*! - Convert an image into raw BGR or BGRA image data and store the - width, height, and image depth (24 or 32). - */ - virtual String doToIClipboard(const String&, - UInt32& w, UInt32& h, UInt32& depth) const = 0; + //! Convert to IClipboard format + /*! + Convert an image into raw BGR or BGRA image data and store the + width, height, and image depth (24 or 32). + */ + virtual String doToIClipboard(const String&, + UInt32& w, UInt32& h, UInt32& depth) const = 0; }; diff --git a/src/lib/platform/XWindowsClipboardBMPConverter.cpp b/src/lib/platform/XWindowsClipboardBMPConverter.cpp index e1f35ff1..22c6dcbe 100644 --- a/src/lib/platform/XWindowsClipboardBMPConverter.cpp +++ b/src/lib/platform/XWindowsClipboardBMPConverter.cpp @@ -21,11 +21,11 @@ // BMP file header structure struct CBMPHeader { public: - UInt16 type; - UInt32 size; - UInt16 reserved1; - UInt16 reserved2; - UInt32 offset; + UInt16 type; + UInt32 size; + UInt16 reserved1; + UInt16 reserved2; + UInt32 offset; }; // BMP is little-endian @@ -33,38 +33,38 @@ static inline UInt32 fromLEU32(const UInt8* data) { - return static_cast(data[0]) | - (static_cast(data[1]) << 8) | - (static_cast(data[2]) << 16) | - (static_cast(data[3]) << 24); + return static_cast(data[0]) | + (static_cast(data[1]) << 8) | + (static_cast(data[2]) << 16) | + (static_cast(data[3]) << 24); } static void toLE(UInt8*& dst, char src) { - dst[0] = static_cast(src); - dst += 1; + dst[0] = static_cast(src); + dst += 1; } static void toLE(UInt8*& dst, UInt16 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst += 2; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst += 2; } static void toLE(UInt8*& dst, UInt32 src) { - dst[0] = static_cast(src & 0xffu); - dst[1] = static_cast((src >> 8) & 0xffu); - dst[2] = static_cast((src >> 16) & 0xffu); - dst[3] = static_cast((src >> 24) & 0xffu); - dst += 4; + dst[0] = static_cast(src & 0xffu); + dst[1] = static_cast((src >> 8) & 0xffu); + dst[2] = static_cast((src >> 16) & 0xffu); + dst[3] = static_cast((src >> 24) & 0xffu); + dst += 4; } // @@ -72,72 +72,72 @@ toLE(UInt8*& dst, UInt32 src) // XWindowsClipboardBMPConverter::XWindowsClipboardBMPConverter( - Display* display) : - m_atom(XInternAtom(display, "image/bmp", False)) + Display* display) : + m_atom(XInternAtom(display, "image/bmp", False)) { - // do nothing + // do nothing } XWindowsClipboardBMPConverter::~XWindowsClipboardBMPConverter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardBMPConverter::getFormat() const { - return IClipboard::kBitmap; + return IClipboard::kBitmap; } Atom XWindowsClipboardBMPConverter::getAtom() const { - return m_atom; + return m_atom; } int XWindowsClipboardBMPConverter::getDataSize() const { - return 8; + return 8; } String XWindowsClipboardBMPConverter::fromIClipboard(const String& bmp) const { - // create BMP image - UInt8 header[14]; - UInt8* dst = header; - toLE(dst, 'B'); - toLE(dst, 'M'); - toLE(dst, static_cast(14 + bmp.size())); - toLE(dst, static_cast(0)); - toLE(dst, static_cast(0)); - toLE(dst, static_cast(14 + 40)); - return String(reinterpret_cast(header), 14) + bmp; + // create BMP image + UInt8 header[14]; + UInt8* dst = header; + toLE(dst, 'B'); + toLE(dst, 'M'); + toLE(dst, static_cast(14 + bmp.size())); + toLE(dst, static_cast(0)); + toLE(dst, static_cast(0)); + toLE(dst, static_cast(14 + 40)); + return String(reinterpret_cast(header), 14) + bmp; } String XWindowsClipboardBMPConverter::toIClipboard(const String& bmp) const { - // make sure data is big enough for a BMP file - if (bmp.size() <= 14 + 40) { - return String(); - } + // make sure data is big enough for a BMP file + if (bmp.size() <= 14 + 40) { + return String(); + } - // check BMP file header - const UInt8* rawBMPHeader = reinterpret_cast(bmp.data()); - if (rawBMPHeader[0] != 'B' || rawBMPHeader[1] != 'M') { - return String(); - } + // check BMP file header + const UInt8* rawBMPHeader = reinterpret_cast(bmp.data()); + if (rawBMPHeader[0] != 'B' || rawBMPHeader[1] != 'M') { + return String(); + } - // get offset to image data - UInt32 offset = fromLEU32(rawBMPHeader + 10); + // get offset to image data + UInt32 offset = fromLEU32(rawBMPHeader + 10); - // construct BMP - if (offset == 14 + 40) { - return bmp.substr(14); - } - else { - return bmp.substr(14, 40) + bmp.substr(offset, bmp.size() - offset); - } + // construct BMP + if (offset == 14 + 40) { + return bmp.substr(14); + } + else { + return bmp.substr(14, 40) + bmp.substr(offset, bmp.size() - offset); + } } diff --git a/src/lib/platform/XWindowsClipboardBMPConverter.h b/src/lib/platform/XWindowsClipboardBMPConverter.h index 9d419b63..0f99a32a 100644 --- a/src/lib/platform/XWindowsClipboardBMPConverter.h +++ b/src/lib/platform/XWindowsClipboardBMPConverter.h @@ -22,19 +22,19 @@ //! Convert to/from some text encoding class XWindowsClipboardBMPConverter : - public IXWindowsClipboardConverter { + public IXWindowsClipboardConverter { public: - XWindowsClipboardBMPConverter(Display* display); - virtual ~XWindowsClipboardBMPConverter(); + XWindowsClipboardBMPConverter(Display* display); + virtual ~XWindowsClipboardBMPConverter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; private: - Atom m_atom; + Atom m_atom; }; diff --git a/src/lib/platform/XWindowsClipboardHTMLConverter.cpp b/src/lib/platform/XWindowsClipboardHTMLConverter.cpp index 8f06cc8d..2e743f7e 100644 --- a/src/lib/platform/XWindowsClipboardHTMLConverter.cpp +++ b/src/lib/platform/XWindowsClipboardHTMLConverter.cpp @@ -25,43 +25,43 @@ // XWindowsClipboardHTMLConverter::XWindowsClipboardHTMLConverter( - Display* display, const char* name) : - m_atom(XInternAtom(display, name, False)) + Display* display, const char* name) : + m_atom(XInternAtom(display, name, False)) { - // do nothing + // do nothing } XWindowsClipboardHTMLConverter::~XWindowsClipboardHTMLConverter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardHTMLConverter::getFormat() const { - return IClipboard::kHTML; + return IClipboard::kHTML; } Atom XWindowsClipboardHTMLConverter::getAtom() const { - return m_atom; + return m_atom; } int XWindowsClipboardHTMLConverter::getDataSize() const { - return 8; + return 8; } String XWindowsClipboardHTMLConverter::fromIClipboard(const String& data) const { - return Unicode::UTF8ToUTF16(data); + return Unicode::UTF8ToUTF16(data); } String XWindowsClipboardHTMLConverter::toIClipboard(const String& data) const { - return Unicode::UTF16ToUTF8(data); + return Unicode::UTF16ToUTF8(data); } diff --git a/src/lib/platform/XWindowsClipboardHTMLConverter.h b/src/lib/platform/XWindowsClipboardHTMLConverter.h index f0a70288..32e5bdd8 100644 --- a/src/lib/platform/XWindowsClipboardHTMLConverter.h +++ b/src/lib/platform/XWindowsClipboardHTMLConverter.h @@ -23,20 +23,20 @@ //! Convert to/from HTML encoding class XWindowsClipboardHTMLConverter : public IXWindowsClipboardConverter { public: - /*! - \c name is converted to an atom and that is reported by getAtom(). - */ - XWindowsClipboardHTMLConverter(Display* display, const char* name); - virtual ~XWindowsClipboardHTMLConverter(); + /*! + \c name is converted to an atom and that is reported by getAtom(). + */ + XWindowsClipboardHTMLConverter(Display* display, const char* name); + virtual ~XWindowsClipboardHTMLConverter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; private: - Atom m_atom; + Atom m_atom; }; diff --git a/src/lib/platform/XWindowsClipboardTextConverter.cpp b/src/lib/platform/XWindowsClipboardTextConverter.cpp index 07fb9e3d..7d055f10 100644 --- a/src/lib/platform/XWindowsClipboardTextConverter.cpp +++ b/src/lib/platform/XWindowsClipboardTextConverter.cpp @@ -25,55 +25,55 @@ // XWindowsClipboardTextConverter::XWindowsClipboardTextConverter( - Display* display, const char* name) : - m_atom(XInternAtom(display, name, False)) + Display* display, const char* name) : + m_atom(XInternAtom(display, name, False)) { - // do nothing + // do nothing } XWindowsClipboardTextConverter::~XWindowsClipboardTextConverter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardTextConverter::getFormat() const { - return IClipboard::kText; + return IClipboard::kText; } Atom XWindowsClipboardTextConverter::getAtom() const { - return m_atom; + return m_atom; } int XWindowsClipboardTextConverter::getDataSize() const { - return 8; + return 8; } String XWindowsClipboardTextConverter::fromIClipboard(const String& data) const { - return Unicode::UTF8ToText(data); + return Unicode::UTF8ToText(data); } String XWindowsClipboardTextConverter::toIClipboard(const String& data) const { - // convert to UTF-8 - bool errors; - String utf8 = Unicode::textToUTF8(data, &errors); + // convert to UTF-8 + bool errors; + String utf8 = Unicode::textToUTF8(data, &errors); - // if there were decoding errors then, to support old applications - // that don't understand UTF-8 but can report the exact binary - // UTF-8 representation, see if the data appears to be UTF-8. if - // so then use it as is. - if (errors && Unicode::isUTF8(data)) { - return data; - } + // if there were decoding errors then, to support old applications + // that don't understand UTF-8 but can report the exact binary + // UTF-8 representation, see if the data appears to be UTF-8. if + // so then use it as is. + if (errors && Unicode::isUTF8(data)) { + return data; + } - return utf8; + return utf8; } diff --git a/src/lib/platform/XWindowsClipboardTextConverter.h b/src/lib/platform/XWindowsClipboardTextConverter.h index d031c85e..0ad87ceb 100644 --- a/src/lib/platform/XWindowsClipboardTextConverter.h +++ b/src/lib/platform/XWindowsClipboardTextConverter.h @@ -23,20 +23,20 @@ //! Convert to/from locale text encoding class XWindowsClipboardTextConverter : public IXWindowsClipboardConverter { public: - /*! - \c name is converted to an atom and that is reported by getAtom(). - */ - XWindowsClipboardTextConverter(Display* display, const char* name); - virtual ~XWindowsClipboardTextConverter(); + /*! + \c name is converted to an atom and that is reported by getAtom(). + */ + XWindowsClipboardTextConverter(Display* display, const char* name); + virtual ~XWindowsClipboardTextConverter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; private: - Atom m_atom; + Atom m_atom; }; diff --git a/src/lib/platform/XWindowsClipboardUCS2Converter.cpp b/src/lib/platform/XWindowsClipboardUCS2Converter.cpp index cc1d0207..82bebbdb 100644 --- a/src/lib/platform/XWindowsClipboardUCS2Converter.cpp +++ b/src/lib/platform/XWindowsClipboardUCS2Converter.cpp @@ -25,43 +25,43 @@ // XWindowsClipboardUCS2Converter::XWindowsClipboardUCS2Converter( - Display* display, const char* name) : - m_atom(XInternAtom(display, name, False)) + Display* display, const char* name) : + m_atom(XInternAtom(display, name, False)) { - // do nothing + // do nothing } XWindowsClipboardUCS2Converter::~XWindowsClipboardUCS2Converter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardUCS2Converter::getFormat() const { - return IClipboard::kText; + return IClipboard::kText; } Atom XWindowsClipboardUCS2Converter::getAtom() const { - return m_atom; + return m_atom; } int XWindowsClipboardUCS2Converter::getDataSize() const { - return 16; + return 16; } String XWindowsClipboardUCS2Converter::fromIClipboard(const String& data) const { - return Unicode::UTF8ToUCS2(data); + return Unicode::UTF8ToUCS2(data); } String XWindowsClipboardUCS2Converter::toIClipboard(const String& data) const { - return Unicode::UCS2ToUTF8(data); + return Unicode::UCS2ToUTF8(data); } diff --git a/src/lib/platform/XWindowsClipboardUCS2Converter.h b/src/lib/platform/XWindowsClipboardUCS2Converter.h index 876ec7d8..f57ad1e2 100644 --- a/src/lib/platform/XWindowsClipboardUCS2Converter.h +++ b/src/lib/platform/XWindowsClipboardUCS2Converter.h @@ -23,20 +23,20 @@ //! Convert to/from UCS-2 encoding class XWindowsClipboardUCS2Converter : public IXWindowsClipboardConverter { public: - /*! - \c name is converted to an atom and that is reported by getAtom(). - */ - XWindowsClipboardUCS2Converter(Display* display, const char* name); - virtual ~XWindowsClipboardUCS2Converter(); + /*! + \c name is converted to an atom and that is reported by getAtom(). + */ + XWindowsClipboardUCS2Converter(Display* display, const char* name); + virtual ~XWindowsClipboardUCS2Converter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; private: - Atom m_atom; + Atom m_atom; }; diff --git a/src/lib/platform/XWindowsClipboardUTF8Converter.cpp b/src/lib/platform/XWindowsClipboardUTF8Converter.cpp index 685dd60e..4a7a5b09 100644 --- a/src/lib/platform/XWindowsClipboardUTF8Converter.cpp +++ b/src/lib/platform/XWindowsClipboardUTF8Converter.cpp @@ -23,43 +23,43 @@ // XWindowsClipboardUTF8Converter::XWindowsClipboardUTF8Converter( - Display* display, const char* name) : - m_atom(XInternAtom(display, name, False)) + Display* display, const char* name) : + m_atom(XInternAtom(display, name, False)) { - // do nothing + // do nothing } XWindowsClipboardUTF8Converter::~XWindowsClipboardUTF8Converter() { - // do nothing + // do nothing } IClipboard::EFormat XWindowsClipboardUTF8Converter::getFormat() const { - return IClipboard::kText; + return IClipboard::kText; } Atom XWindowsClipboardUTF8Converter::getAtom() const { - return m_atom; + return m_atom; } int XWindowsClipboardUTF8Converter::getDataSize() const { - return 8; + return 8; } String XWindowsClipboardUTF8Converter::fromIClipboard(const String& data) const { - return data; + return data; } String XWindowsClipboardUTF8Converter::toIClipboard(const String& data) const { - return data; + return data; } diff --git a/src/lib/platform/XWindowsClipboardUTF8Converter.h b/src/lib/platform/XWindowsClipboardUTF8Converter.h index 3a4f5405..db8d9902 100644 --- a/src/lib/platform/XWindowsClipboardUTF8Converter.h +++ b/src/lib/platform/XWindowsClipboardUTF8Converter.h @@ -23,20 +23,20 @@ //! Convert to/from UTF-8 encoding class XWindowsClipboardUTF8Converter : public IXWindowsClipboardConverter { public: - /*! - \c name is converted to an atom and that is reported by getAtom(). - */ - XWindowsClipboardUTF8Converter(Display* display, const char* name); - virtual ~XWindowsClipboardUTF8Converter(); + /*! + \c name is converted to an atom and that is reported by getAtom(). + */ + XWindowsClipboardUTF8Converter(Display* display, const char* name); + virtual ~XWindowsClipboardUTF8Converter(); - // IXWindowsClipboardConverter overrides - virtual IClipboard::EFormat - getFormat() const; - virtual Atom getAtom() const; - virtual int getDataSize() const; - virtual String fromIClipboard(const String&) const; - virtual String toIClipboard(const String&) const; + // IXWindowsClipboardConverter overrides + virtual IClipboard::EFormat + getFormat() const; + virtual Atom getAtom() const; + virtual int getDataSize() const; + virtual String fromIClipboard(const String&) const; + virtual String toIClipboard(const String&) const; private: - Atom m_atom; + Atom m_atom; }; diff --git a/src/lib/platform/XWindowsEventQueueBuffer.cpp b/src/lib/platform/XWindowsEventQueueBuffer.cpp index 03fd451e..71e2cfba 100644 --- a/src/lib/platform/XWindowsEventQueueBuffer.cpp +++ b/src/lib/platform/XWindowsEventQueueBuffer.cpp @@ -25,20 +25,20 @@ #include #if HAVE_UNISTD_H -# include +# include #endif #if HAVE_POLL -# include +# include #else -# if HAVE_SYS_SELECT_H -# include -# endif -# if HAVE_SYS_TIME_H -# include -# endif -# if HAVE_SYS_TYPES_H -# include -# endif +# if HAVE_SYS_SELECT_H +# include +# endif +# if HAVE_SYS_TIME_H +# include +# endif +# if HAVE_SYS_TYPES_H +# include +# endif #endif // @@ -53,239 +53,239 @@ class EventQueueTimer { }; // XWindowsEventQueueBuffer::XWindowsEventQueueBuffer( - Display* display, Window window, IEventQueue* events) : - m_events(events), - m_display(display), - m_window(window), - m_waiting(false) + Display* display, Window window, IEventQueue* events) : + m_events(events), + m_display(display), + m_window(window), + m_waiting(false) { - assert(m_display != NULL); - assert(m_window != None); + assert(m_display != NULL); + assert(m_window != None); - m_userEvent = XInternAtom(m_display, "SYNERGY_USER_EVENT", False); - // set up for pipe hack - int result = pipe(m_pipefd); - assert(result == 0); + m_userEvent = XInternAtom(m_display, "SYNERGY_USER_EVENT", False); + // set up for pipe hack + int result = pipe(m_pipefd); + assert(result == 0); - int pipeflags; - pipeflags = fcntl(m_pipefd[0], F_GETFL); - fcntl(m_pipefd[0], F_SETFL, pipeflags | O_NONBLOCK); - pipeflags = fcntl(m_pipefd[1], F_GETFL); - fcntl(m_pipefd[1], F_SETFL, pipeflags | O_NONBLOCK); + int pipeflags; + pipeflags = fcntl(m_pipefd[0], F_GETFL); + fcntl(m_pipefd[0], F_SETFL, pipeflags | O_NONBLOCK); + pipeflags = fcntl(m_pipefd[1], F_GETFL); + fcntl(m_pipefd[1], F_SETFL, pipeflags | O_NONBLOCK); } XWindowsEventQueueBuffer::~XWindowsEventQueueBuffer() { - // release pipe hack resources - close(m_pipefd[0]); - close(m_pipefd[1]); + // release pipe hack resources + close(m_pipefd[0]); + close(m_pipefd[1]); } void XWindowsEventQueueBuffer::waitForEvent(double dtimeout) { - Thread::testCancel(); + Thread::testCancel(); - // clear out the pipe in preparation for waiting. + // clear out the pipe in preparation for waiting. - char buf[16]; - ssize_t read_response = read(m_pipefd[0], buf, 15); - - // with linux automake, warnings are treated as errors by default - if (read_response < 0) - { - // todo: handle read response - } + char buf[16]; + ssize_t read_response = read(m_pipefd[0], buf, 15); + + // with linux automake, warnings are treated as errors by default + if (read_response < 0) + { + // todo: handle read response + } - { - Lock lock(&m_mutex); - // we're now waiting for events - m_waiting = true; + { + Lock lock(&m_mutex); + // we're now waiting for events + m_waiting = true; - // push out pending events - flush(); - } - // calling flush may have queued up a new event. - if (!XWindowsEventQueueBuffer::isEmpty()) { - Thread::testCancel(); - return; - } + // push out pending events + flush(); + } + // calling flush may have queued up a new event. + if (!XWindowsEventQueueBuffer::isEmpty()) { + Thread::testCancel(); + return; + } - // use poll() to wait for a message from the X server or for timeout. - // this is a good deal more efficient than polling and sleeping. + // use poll() to wait for a message from the X server or for timeout. + // this is a good deal more efficient than polling and sleeping. #if HAVE_POLL - struct pollfd pfds[2]; - pfds[0].fd = ConnectionNumber(m_display); - pfds[0].events = POLLIN; - pfds[1].fd = m_pipefd[0]; - pfds[1].events = POLLIN; - int timeout = (dtimeout < 0.0) ? -1 : - static_cast(1000.0 * dtimeout); - int remaining = timeout; - int retval = 0; + struct pollfd pfds[2]; + pfds[0].fd = ConnectionNumber(m_display); + pfds[0].events = POLLIN; + pfds[1].fd = m_pipefd[0]; + pfds[1].events = POLLIN; + int timeout = (dtimeout < 0.0) ? -1 : + static_cast(1000.0 * dtimeout); + int remaining = timeout; + int retval = 0; #else - struct timeval timeout; - struct timeval* timeoutPtr; - if (dtimeout < 0.0) { - timeoutPtr = NULL; - } - else { - timeout.tv_sec = static_cast(dtimeout); - timeout.tv_usec = static_cast(1.0e+6 * - (dtimeout - timeout.tv_sec)); - timeoutPtr = &timeout; - } + struct timeval timeout; + struct timeval* timeoutPtr; + if (dtimeout < 0.0) { + timeoutPtr = NULL; + } + else { + timeout.tv_sec = static_cast(dtimeout); + timeout.tv_usec = static_cast(1.0e+6 * + (dtimeout - timeout.tv_sec)); + timeoutPtr = &timeout; + } - // initialize file descriptor sets - fd_set rfds; - FD_ZERO(&rfds); - FD_SET(ConnectionNumber(m_display), &rfds); - FD_SET(m_pipefd[0], &rfds); - int nfds; - if (ConnectionNumber(m_display) > m_pipefd[0]) { - nfds = ConnectionNumber(m_display) + 1; - } - else { - nfds = m_pipefd[0] + 1; - } + // initialize file descriptor sets + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(ConnectionNumber(m_display), &rfds); + FD_SET(m_pipefd[0], &rfds); + int nfds; + if (ConnectionNumber(m_display) > m_pipefd[0]) { + nfds = ConnectionNumber(m_display) + 1; + } + else { + nfds = m_pipefd[0] + 1; + } #endif - // It's possible that the X server has queued events locally - // in xlib's event buffer and not pushed on to the fd. Hence we - // can't simply monitor the fd as we may never be woken up. - // ie addEvent calls flush, XFlush may not send via the fd hence - // there is an event waiting to be sent but we must exit the poll - // before it can. - // Instead we poll for a brief period of time (so if events - // queued locally in the xlib buffer can be processed) - // and continue doing this until timeout is reached. - // The human eye can notice 60hz (ansi) which is 16ms, however - // we want to give the cpu a chance s owe up this to 25ms + // It's possible that the X server has queued events locally + // in xlib's event buffer and not pushed on to the fd. Hence we + // can't simply monitor the fd as we may never be woken up. + // ie addEvent calls flush, XFlush may not send via the fd hence + // there is an event waiting to be sent but we must exit the poll + // before it can. + // Instead we poll for a brief period of time (so if events + // queued locally in the xlib buffer can be processed) + // and continue doing this until timeout is reached. + // The human eye can notice 60hz (ansi) which is 16ms, however + // we want to give the cpu a chance s owe up this to 25ms #define TIMEOUT_DELAY 25 - while (((dtimeout < 0.0) || (remaining > 0)) && QLength(m_display)==0 && retval==0){ + while (((dtimeout < 0.0) || (remaining > 0)) && QLength(m_display)==0 && retval==0){ #if HAVE_POLL - retval = poll(pfds, 2, TIMEOUT_DELAY); //16ms = 60hz, but we make it > to play nicely with the cpu - if (pfds[1].revents & POLLIN) { - ssize_t read_response = read(m_pipefd[0], buf, 15); - - // with linux automake, warnings are treated as errors by default - if (read_response < 0) - { - // todo: handle read response - } + retval = poll(pfds, 2, TIMEOUT_DELAY); //16ms = 60hz, but we make it > to play nicely with the cpu + if (pfds[1].revents & POLLIN) { + ssize_t read_response = read(m_pipefd[0], buf, 15); + + // with linux automake, warnings are treated as errors by default + if (read_response < 0) + { + // todo: handle read response + } - } + } #else - retval = select(nfds, - SELECT_TYPE_ARG234 &rfds, - SELECT_TYPE_ARG234 NULL, - SELECT_TYPE_ARG234 NULL, - SELECT_TYPE_ARG5 TIMEOUT_DELAY); - if (FD_SET(m_pipefd[0], &rfds)) { - read(m_pipefd[0], buf, 15); - } + retval = select(nfds, + SELECT_TYPE_ARG234 &rfds, + SELECT_TYPE_ARG234 NULL, + SELECT_TYPE_ARG234 NULL, + SELECT_TYPE_ARG5 TIMEOUT_DELAY); + if (FD_SET(m_pipefd[0], &rfds)) { + read(m_pipefd[0], buf, 15); + } #endif - remaining-=TIMEOUT_DELAY; - } + remaining-=TIMEOUT_DELAY; + } - { - // we're no longer waiting for events - Lock lock(&m_mutex); - m_waiting = false; - } + { + // we're no longer waiting for events + Lock lock(&m_mutex); + m_waiting = false; + } - Thread::testCancel(); + Thread::testCancel(); } IEventQueueBuffer::Type XWindowsEventQueueBuffer::getEvent(Event& event, UInt32& dataID) { - Lock lock(&m_mutex); + Lock lock(&m_mutex); - // push out pending events - flush(); + // push out pending events + flush(); - // get next event - XNextEvent(m_display, &m_event); + // get next event + XNextEvent(m_display, &m_event); - // process event - if (m_event.xany.type == ClientMessage && - m_event.xclient.message_type == m_userEvent) { - dataID = static_cast(m_event.xclient.data.l[0]); - return kUser; - } - else { - event = Event(Event::kSystem, - m_events->getSystemTarget(), &m_event); - return kSystem; - } + // process event + if (m_event.xany.type == ClientMessage && + m_event.xclient.message_type == m_userEvent) { + dataID = static_cast(m_event.xclient.data.l[0]); + return kUser; + } + else { + event = Event(Event::kSystem, + m_events->getSystemTarget(), &m_event); + return kSystem; + } } bool XWindowsEventQueueBuffer::addEvent(UInt32 dataID) { - // prepare a message - XEvent xevent; - xevent.xclient.type = ClientMessage; - xevent.xclient.window = m_window; - xevent.xclient.message_type = m_userEvent; - xevent.xclient.format = 32; - xevent.xclient.data.l[0] = static_cast(dataID); + // prepare a message + XEvent xevent; + xevent.xclient.type = ClientMessage; + xevent.xclient.window = m_window; + xevent.xclient.message_type = m_userEvent; + xevent.xclient.format = 32; + xevent.xclient.data.l[0] = static_cast(dataID); - // save the message - Lock lock(&m_mutex); - m_postedEvents.push_back(xevent); + // save the message + Lock lock(&m_mutex); + m_postedEvents.push_back(xevent); - // if we're currently waiting for an event then send saved events to - // the X server now. if we're not waiting then some other thread - // might be using the display connection so we can't safely use it - // too. - if (m_waiting) { - flush(); - // Send a character through the round-trip pipe to wake a thread - // that is waiting for a ConnectionNumber() socket to be readable. - // The flush call can read incoming data from the socket and put - // it in Xlib's input buffer. That sneaks it past the other thread. - ssize_t write_response = write(m_pipefd[1], "!", 1); + // if we're currently waiting for an event then send saved events to + // the X server now. if we're not waiting then some other thread + // might be using the display connection so we can't safely use it + // too. + if (m_waiting) { + flush(); + // Send a character through the round-trip pipe to wake a thread + // that is waiting for a ConnectionNumber() socket to be readable. + // The flush call can read incoming data from the socket and put + // it in Xlib's input buffer. That sneaks it past the other thread. + ssize_t write_response = write(m_pipefd[1], "!", 1); - // with linux automake, warnings are treated as errors by default - if (write_response < 0) - { - // todo: handle read response - } - } + // with linux automake, warnings are treated as errors by default + if (write_response < 0) + { + // todo: handle read response + } + } - return true; + return true; } bool XWindowsEventQueueBuffer::isEmpty() const { - Lock lock(&m_mutex); - return (XPending(m_display) == 0 ); + Lock lock(&m_mutex); + return (XPending(m_display) == 0 ); } EventQueueTimer* XWindowsEventQueueBuffer::newTimer(double, bool) const { - return new EventQueueTimer; + return new EventQueueTimer; } void XWindowsEventQueueBuffer::deleteTimer(EventQueueTimer* timer) const { - delete timer; + delete timer; } void XWindowsEventQueueBuffer::flush() { - // note -- m_mutex must be locked on entry + // note -- m_mutex must be locked on entry - // flush the posted event list to the X server - for (size_t i = 0; i < m_postedEvents.size(); ++i) { - XSendEvent(m_display, m_window, False, 0, &m_postedEvents[i]); - } - XFlush(m_display); - m_postedEvents.clear(); + // flush the posted event list to the X server + for (size_t i = 0; i < m_postedEvents.size(); ++i) { + XSendEvent(m_display, m_window, False, 0, &m_postedEvents[i]); + } + XFlush(m_display); + m_postedEvents.clear(); } diff --git a/src/lib/platform/XWindowsEventQueueBuffer.h b/src/lib/platform/XWindowsEventQueueBuffer.h index 902b6627..7614deea 100644 --- a/src/lib/platform/XWindowsEventQueueBuffer.h +++ b/src/lib/platform/XWindowsEventQueueBuffer.h @@ -23,9 +23,9 @@ #include "common/stdvector.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include +# include #endif class IEventQueue; @@ -33,32 +33,32 @@ class IEventQueue; //! Event queue buffer for X11 class XWindowsEventQueueBuffer : public IEventQueueBuffer { public: - XWindowsEventQueueBuffer(Display*, Window, IEventQueue* events); - virtual ~XWindowsEventQueueBuffer(); + XWindowsEventQueueBuffer(Display*, Window, IEventQueue* events); + virtual ~XWindowsEventQueueBuffer(); - // IEventQueueBuffer overrides - virtual void init() { } - virtual void waitForEvent(double timeout); - virtual Type getEvent(Event& event, UInt32& dataID); - virtual bool addEvent(UInt32 dataID); - virtual bool isEmpty() const; - virtual EventQueueTimer* - newTimer(double duration, bool oneShot) const; - virtual void deleteTimer(EventQueueTimer*) const; + // IEventQueueBuffer overrides + virtual void init() { } + virtual void waitForEvent(double timeout); + virtual Type getEvent(Event& event, UInt32& dataID); + virtual bool addEvent(UInt32 dataID); + virtual bool isEmpty() const; + virtual EventQueueTimer* + newTimer(double duration, bool oneShot) const; + virtual void deleteTimer(EventQueueTimer*) const; private: - void flush(); + void flush(); private: - typedef std::vector EventList; + typedef std::vector EventList; - Mutex m_mutex; - Display* m_display; - Window m_window; - Atom m_userEvent; - XEvent m_event; - EventList m_postedEvents; - bool m_waiting; - int m_pipefd[2]; - IEventQueue* m_events; + Mutex m_mutex; + Display* m_display; + Window m_window; + Atom m_userEvent; + XEvent m_event; + EventList m_postedEvents; + bool m_waiting; + int m_pipefd[2]; + IEventQueue* m_events; }; diff --git a/src/lib/platform/XWindowsKeyState.cpp b/src/lib/platform/XWindowsKeyState.cpp index f97ef531..f9dc722d 100644 --- a/src/lib/platform/XWindowsKeyState.cpp +++ b/src/lib/platform/XWindowsKeyState.cpp @@ -26,842 +26,842 @@ #include #include #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include -# include -# define XK_MISCELLANY -# define XK_XKB_KEYS -# include +# include +# include +# define XK_MISCELLANY +# define XK_XKB_KEYS +# include #if HAVE_XKB_EXTENSION -# include +# include #endif #endif static const size_t ModifiersFromXDefaultSize = 32; XWindowsKeyState::XWindowsKeyState( - Display* display, bool useXKB, - IEventQueue* events) : - KeyState(events), - m_display(display), - m_modifierFromX(ModifiersFromXDefaultSize) + Display* display, bool useXKB, + IEventQueue* events) : + KeyState(events), + m_display(display), + m_modifierFromX(ModifiersFromXDefaultSize) { - init(display, useXKB); + init(display, useXKB); } XWindowsKeyState::XWindowsKeyState( - Display* display, bool useXKB, - IEventQueue* events, synergy::KeyMap& keyMap) : - KeyState(events, keyMap), - m_display(display), - m_modifierFromX(ModifiersFromXDefaultSize) + Display* display, bool useXKB, + IEventQueue* events, synergy::KeyMap& keyMap) : + KeyState(events, keyMap), + m_display(display), + m_modifierFromX(ModifiersFromXDefaultSize) { - init(display, useXKB); + init(display, useXKB); } XWindowsKeyState::~XWindowsKeyState() { #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - XkbFreeKeyboard(m_xkb, 0, True); - } + if (m_xkb != NULL) { + XkbFreeKeyboard(m_xkb, 0, True); + } #endif } void XWindowsKeyState::init(Display* display, bool useXKB) { - XGetKeyboardControl(m_display, &m_keyboardState); + XGetKeyboardControl(m_display, &m_keyboardState); #if HAVE_XKB_EXTENSION - if (useXKB) { - m_xkb = XkbGetMap(m_display, XkbKeyActionsMask | XkbKeyBehaviorsMask | - XkbAllClientInfoMask, XkbUseCoreKbd); - } - else { - m_xkb = NULL; - } + if (useXKB) { + m_xkb = XkbGetMap(m_display, XkbKeyActionsMask | XkbKeyBehaviorsMask | + XkbAllClientInfoMask, XkbUseCoreKbd); + } + else { + m_xkb = NULL; + } #endif - setActiveGroup(kGroupPollAndSet); + setActiveGroup(kGroupPollAndSet); } void XWindowsKeyState::setActiveGroup(SInt32 group) { - if (group == kGroupPollAndSet) { - // we need to set the group to -1 in order for pollActiveGroup() to - // actually poll for the group - m_group = -1; - m_group = pollActiveGroup(); - } - else if (group == kGroupPoll) { - m_group = -1; - } - else { - assert(group >= 0); - m_group = group; - } + if (group == kGroupPollAndSet) { + // we need to set the group to -1 in order for pollActiveGroup() to + // actually poll for the group + m_group = -1; + m_group = pollActiveGroup(); + } + else if (group == kGroupPoll) { + m_group = -1; + } + else { + assert(group >= 0); + m_group = group; + } } void XWindowsKeyState::setAutoRepeat(const XKeyboardState& state) { - m_keyboardState = state; + m_keyboardState = state; } KeyModifierMask XWindowsKeyState::mapModifiersFromX(unsigned int state) const { - LOG((CLOG_DEBUG2 "mapping state: %i", state)); - UInt32 offset = 8 * getGroupFromState(state); - KeyModifierMask mask = 0; - for (int i = 0; i < 8; ++i) { - if ((state & (1u << i)) != 0) { - LOG((CLOG_DEBUG2 "|= modifier: %i", offset + i)); - if (offset + i >= m_modifierFromX.size()) { - LOG((CLOG_ERR "m_modifierFromX is too small (%d) for the " - "requested offset (%d)", m_modifierFromX.size(), offset+i)); - } else { - mask |= m_modifierFromX[offset + i]; - } - } - } - return mask; + LOG((CLOG_DEBUG2 "mapping state: %i", state)); + UInt32 offset = 8 * getGroupFromState(state); + KeyModifierMask mask = 0; + for (int i = 0; i < 8; ++i) { + if ((state & (1u << i)) != 0) { + LOG((CLOG_DEBUG2 "|= modifier: %i", offset + i)); + if (offset + i >= m_modifierFromX.size()) { + LOG((CLOG_ERR "m_modifierFromX is too small (%d) for the " + "requested offset (%d)", m_modifierFromX.size(), offset+i)); + } else { + mask |= m_modifierFromX[offset + i]; + } + } + } + return mask; } bool XWindowsKeyState::mapModifiersToX(KeyModifierMask mask, - unsigned int& modifiers) const + unsigned int& modifiers) const { - modifiers = 0; + modifiers = 0; - for (SInt32 i = 0; i < kKeyModifierNumBits; ++i) { - KeyModifierMask bit = (1u << i); - if ((mask & bit) != 0) { - KeyModifierToXMask::const_iterator j = m_modifierToX.find(bit); - if (j == m_modifierToX.end()) { - return false; - } - else { - modifiers |= j->second; - } - } - } + for (SInt32 i = 0; i < kKeyModifierNumBits; ++i) { + KeyModifierMask bit = (1u << i); + if ((mask & bit) != 0) { + KeyModifierToXMask::const_iterator j = m_modifierToX.find(bit); + if (j == m_modifierToX.end()) { + return false; + } + else { + modifiers |= j->second; + } + } + } - return true; + return true; } void XWindowsKeyState::mapKeyToKeycodes(KeyID key, KeycodeList& keycodes) const { - keycodes.clear(); - std::pair range = - m_keyCodeFromKey.equal_range(key); - for (KeyToKeyCodeMap::const_iterator i = range.first; - i != range.second; ++i) { - keycodes.push_back(i->second); - } + keycodes.clear(); + std::pair range = + m_keyCodeFromKey.equal_range(key); + for (KeyToKeyCodeMap::const_iterator i = range.first; + i != range.second; ++i) { + keycodes.push_back(i->second); + } } bool XWindowsKeyState::fakeCtrlAltDel() { - // pass keys through unchanged - return false; + // pass keys through unchanged + return false; } KeyModifierMask XWindowsKeyState::pollActiveModifiers() const { - Window root = DefaultRootWindow(m_display), window; - int xRoot, yRoot, xWindow, yWindow; - unsigned int state = 0; - if (XQueryPointer(m_display, root, &root, &window, - &xRoot, &yRoot, &xWindow, &yWindow, &state) == False) { - state = 0; - } - return mapModifiersFromX(state); + Window root = DefaultRootWindow(m_display), window; + int xRoot, yRoot, xWindow, yWindow; + unsigned int state = 0; + if (XQueryPointer(m_display, root, &root, &window, + &xRoot, &yRoot, &xWindow, &yWindow, &state) == False) { + state = 0; + } + return mapModifiersFromX(state); } SInt32 XWindowsKeyState::pollActiveGroup() const { - // fixed condition where any group < -1 would have undetermined behaviour - if (m_group >= 0) { - return m_group; - } + // fixed condition where any group < -1 would have undetermined behaviour + if (m_group >= 0) { + return m_group; + } #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - XkbStateRec state; - if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) { - return state.group; - } - } + if (m_xkb != NULL) { + XkbStateRec state; + if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) { + return state.group; + } + } #endif - return 0; + return 0; } void XWindowsKeyState::pollPressedKeys(KeyButtonSet& pressedKeys) const { - char keys[32]; - XQueryKeymap(m_display, keys); - for (UInt32 i = 0; i < 32; ++i) { - for (UInt32 j = 0; j < 8; ++j) { - if ((keys[i] & (1u << j)) != 0) { - pressedKeys.insert(8 * i + j); - } - } - } + char keys[32]; + XQueryKeymap(m_display, keys); + for (UInt32 i = 0; i < 32; ++i) { + for (UInt32 j = 0; j < 8; ++j) { + if ((keys[i] & (1u << j)) != 0) { + pressedKeys.insert(8 * i + j); + } + } + } } void XWindowsKeyState::getKeyMap(synergy::KeyMap& keyMap) { - // get autorepeat info. we must use the global_auto_repeat told to - // us because it may have modified by synergy. - int oldGlobalAutoRepeat = m_keyboardState.global_auto_repeat; - XGetKeyboardControl(m_display, &m_keyboardState); - m_keyboardState.global_auto_repeat = oldGlobalAutoRepeat; + // get autorepeat info. we must use the global_auto_repeat told to + // us because it may have modified by synergy. + int oldGlobalAutoRepeat = m_keyboardState.global_auto_repeat; + XGetKeyboardControl(m_display, &m_keyboardState); + m_keyboardState.global_auto_repeat = oldGlobalAutoRepeat; #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - if (XkbGetUpdatedMap(m_display, XkbKeyActionsMask | - XkbKeyBehaviorsMask | XkbAllClientInfoMask, m_xkb) == Success) { - updateKeysymMapXKB(keyMap); - return; - } - } + if (m_xkb != NULL) { + if (XkbGetUpdatedMap(m_display, XkbKeyActionsMask | + XkbKeyBehaviorsMask | XkbAllClientInfoMask, m_xkb) == Success) { + updateKeysymMapXKB(keyMap); + return; + } + } #endif - updateKeysymMap(keyMap); + updateKeysymMap(keyMap); } void XWindowsKeyState::fakeKey(const Keystroke& keystroke) { - switch (keystroke.m_type) { - case Keystroke::kButton: - LOG((CLOG_DEBUG1 " %03x (%08x) %s", keystroke.m_data.m_button.m_button, keystroke.m_data.m_button.m_client, keystroke.m_data.m_button.m_press ? "down" : "up")); - if (keystroke.m_data.m_button.m_repeat) { - int c = keystroke.m_data.m_button.m_button; - int i = (c >> 3); - int b = 1 << (c & 7); - if (m_keyboardState.global_auto_repeat == AutoRepeatModeOff || - (c!=113 && c!=116 && (m_keyboardState.auto_repeats[i] & b) == 0)) { - LOG((CLOG_DEBUG1 " discard autorepeat")); - break; - } - } - XTestFakeKeyEvent(m_display, keystroke.m_data.m_button.m_button, - keystroke.m_data.m_button.m_press ? True : False, - CurrentTime); - break; + switch (keystroke.m_type) { + case Keystroke::kButton: + LOG((CLOG_DEBUG1 " %03x (%08x) %s", keystroke.m_data.m_button.m_button, keystroke.m_data.m_button.m_client, keystroke.m_data.m_button.m_press ? "down" : "up")); + if (keystroke.m_data.m_button.m_repeat) { + int c = keystroke.m_data.m_button.m_button; + int i = (c >> 3); + int b = 1 << (c & 7); + if (m_keyboardState.global_auto_repeat == AutoRepeatModeOff || + (c!=113 && c!=116 && (m_keyboardState.auto_repeats[i] & b) == 0)) { + LOG((CLOG_DEBUG1 " discard autorepeat")); + break; + } + } + XTestFakeKeyEvent(m_display, keystroke.m_data.m_button.m_button, + keystroke.m_data.m_button.m_press ? True : False, + CurrentTime); + break; - case Keystroke::kGroup: - if (keystroke.m_data.m_group.m_absolute) { - LOG((CLOG_DEBUG1 " group %d", keystroke.m_data.m_group.m_group)); + case Keystroke::kGroup: + if (keystroke.m_data.m_group.m_absolute) { + LOG((CLOG_DEBUG1 " group %d", keystroke.m_data.m_group.m_group)); #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - if (XkbLockGroup(m_display, XkbUseCoreKbd, - keystroke.m_data.m_group.m_group) == False) { - LOG((CLOG_DEBUG1 "XkbLockGroup request not sent")); - } - } - else + if (m_xkb != NULL) { + if (XkbLockGroup(m_display, XkbUseCoreKbd, + keystroke.m_data.m_group.m_group) == False) { + LOG((CLOG_DEBUG1 "XkbLockGroup request not sent")); + } + } + else #endif - { - LOG((CLOG_DEBUG1 " ignored")); - } - } - else { - LOG((CLOG_DEBUG1 " group %+d", keystroke.m_data.m_group.m_group)); + { + LOG((CLOG_DEBUG1 " ignored")); + } + } + else { + LOG((CLOG_DEBUG1 " group %+d", keystroke.m_data.m_group.m_group)); #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - if (XkbLockGroup(m_display, XkbUseCoreKbd, - getEffectiveGroup(pollActiveGroup(), - keystroke.m_data.m_group.m_group)) == False) { - LOG((CLOG_DEBUG1 "XkbLockGroup request not sent")); - } - } - else + if (m_xkb != NULL) { + if (XkbLockGroup(m_display, XkbUseCoreKbd, + getEffectiveGroup(pollActiveGroup(), + keystroke.m_data.m_group.m_group)) == False) { + LOG((CLOG_DEBUG1 "XkbLockGroup request not sent")); + } + } + else #endif - { - LOG((CLOG_DEBUG1 " ignored")); - } - } - break; - } - XFlush(m_display); + { + LOG((CLOG_DEBUG1 " ignored")); + } + } + break; + } + XFlush(m_display); } void XWindowsKeyState::updateKeysymMap(synergy::KeyMap& keyMap) { - // there are up to 4 keysyms per keycode - static const int maxKeysyms = 4; + // there are up to 4 keysyms per keycode + static const int maxKeysyms = 4; - LOG((CLOG_DEBUG1 "non-XKB mapping")); + LOG((CLOG_DEBUG1 "non-XKB mapping")); - // prepare map from X modifier to KeyModifierMask. certain bits - // are predefined. - std::fill(m_modifierFromX.begin(), m_modifierFromX.end(), 0); - m_modifierFromX[ShiftMapIndex] = KeyModifierShift; - m_modifierFromX[LockMapIndex] = KeyModifierCapsLock; - m_modifierFromX[ControlMapIndex] = KeyModifierControl; - m_modifierToX.clear(); - m_modifierToX[KeyModifierShift] = ShiftMask; - m_modifierToX[KeyModifierCapsLock] = LockMask; - m_modifierToX[KeyModifierControl] = ControlMask; + // prepare map from X modifier to KeyModifierMask. certain bits + // are predefined. + std::fill(m_modifierFromX.begin(), m_modifierFromX.end(), 0); + m_modifierFromX[ShiftMapIndex] = KeyModifierShift; + m_modifierFromX[LockMapIndex] = KeyModifierCapsLock; + m_modifierFromX[ControlMapIndex] = KeyModifierControl; + m_modifierToX.clear(); + m_modifierToX[KeyModifierShift] = ShiftMask; + m_modifierToX[KeyModifierCapsLock] = LockMask; + m_modifierToX[KeyModifierControl] = ControlMask; - // prepare map from KeyID to KeyCode - m_keyCodeFromKey.clear(); + // prepare map from KeyID to KeyCode + m_keyCodeFromKey.clear(); - // get the number of keycodes - int minKeycode, maxKeycode; - XDisplayKeycodes(m_display, &minKeycode, &maxKeycode); - int numKeycodes = maxKeycode - minKeycode + 1; + // get the number of keycodes + int minKeycode, maxKeycode; + XDisplayKeycodes(m_display, &minKeycode, &maxKeycode); + int numKeycodes = maxKeycode - minKeycode + 1; - // get the keyboard mapping for all keys - int keysymsPerKeycode; - KeySym* allKeysyms = XGetKeyboardMapping(m_display, - minKeycode, numKeycodes, - &keysymsPerKeycode); + // get the keyboard mapping for all keys + int keysymsPerKeycode; + KeySym* allKeysyms = XGetKeyboardMapping(m_display, + minKeycode, numKeycodes, + &keysymsPerKeycode); - // it's more convenient to always have maxKeysyms KeySyms per key - { - KeySym* tmpKeysyms = new KeySym[maxKeysyms * numKeycodes]; - for (int i = 0; i < numKeycodes; ++i) { - for (int j = 0; j < maxKeysyms; ++j) { - if (j < keysymsPerKeycode) { - tmpKeysyms[maxKeysyms * i + j] = - allKeysyms[keysymsPerKeycode * i + j]; - } - else { - tmpKeysyms[maxKeysyms * i + j] = NoSymbol; - } - } - } - XFree(allKeysyms); - allKeysyms = tmpKeysyms; - } + // it's more convenient to always have maxKeysyms KeySyms per key + { + KeySym* tmpKeysyms = new KeySym[maxKeysyms * numKeycodes]; + for (int i = 0; i < numKeycodes; ++i) { + for (int j = 0; j < maxKeysyms; ++j) { + if (j < keysymsPerKeycode) { + tmpKeysyms[maxKeysyms * i + j] = + allKeysyms[keysymsPerKeycode * i + j]; + } + else { + tmpKeysyms[maxKeysyms * i + j] = NoSymbol; + } + } + } + XFree(allKeysyms); + allKeysyms = tmpKeysyms; + } - // get the buttons assigned to modifiers. X11 does not predefine - // the meaning of any modifiers except shift, caps lock, and the - // control key. the meaning of a modifier bit (other than those) - // depends entirely on the KeySyms mapped to that bit. unfortunately - // you cannot map a bit back to the KeySym used to produce it. - // for example, let's say button 1 maps to Alt_L without shift and - // Meta_L with shift. now if mod1 is mapped to button 1 that could - // mean the user used Alt or Meta to turn on that modifier and there's - // no way to know which. it's also possible for one button to be - // mapped to multiple bits so both mod1 and mod2 could be generated - // by button 1. - // - // we're going to ignore any modifier for a button except the first. - // with the above example, that means we'll ignore the mod2 modifier - // bit unless it's also mapped to some other button. we're also - // going to ignore all KeySyms except the first modifier KeySym, - // which means button 1 above won't map to Meta, just Alt. - std::map modifierButtons; - XModifierKeymap* modifiers = XGetModifierMapping(m_display); - for (unsigned int i = 0; i < 8; ++i) { - const KeyCode* buttons = - modifiers->modifiermap + i * modifiers->max_keypermod; - for (int j = 0; j < modifiers->max_keypermod; ++j) { - modifierButtons.insert(std::make_pair(buttons[j], i)); - } - } - XFreeModifiermap(modifiers); - modifierButtons.erase(0); + // get the buttons assigned to modifiers. X11 does not predefine + // the meaning of any modifiers except shift, caps lock, and the + // control key. the meaning of a modifier bit (other than those) + // depends entirely on the KeySyms mapped to that bit. unfortunately + // you cannot map a bit back to the KeySym used to produce it. + // for example, let's say button 1 maps to Alt_L without shift and + // Meta_L with shift. now if mod1 is mapped to button 1 that could + // mean the user used Alt or Meta to turn on that modifier and there's + // no way to know which. it's also possible for one button to be + // mapped to multiple bits so both mod1 and mod2 could be generated + // by button 1. + // + // we're going to ignore any modifier for a button except the first. + // with the above example, that means we'll ignore the mod2 modifier + // bit unless it's also mapped to some other button. we're also + // going to ignore all KeySyms except the first modifier KeySym, + // which means button 1 above won't map to Meta, just Alt. + std::map modifierButtons; + XModifierKeymap* modifiers = XGetModifierMapping(m_display); + for (unsigned int i = 0; i < 8; ++i) { + const KeyCode* buttons = + modifiers->modifiermap + i * modifiers->max_keypermod; + for (int j = 0; j < modifiers->max_keypermod; ++j) { + modifierButtons.insert(std::make_pair(buttons[j], i)); + } + } + XFreeModifiermap(modifiers); + modifierButtons.erase(0); - // Hack to deal with VMware. When a VMware client grabs input the - // player clears out the X modifier map for whatever reason. We're - // notified of the change and arrive here to discover that there - // are no modifiers at all. Since this prevents the modifiers from - // working in the VMware client we'll use the last known good set - // of modifiers when there are no modifiers. If there are modifiers - // we update the last known good set. - if (!modifierButtons.empty()) { - m_lastGoodNonXKBModifiers = modifierButtons; - } - else { - modifierButtons = m_lastGoodNonXKBModifiers; - } + // Hack to deal with VMware. When a VMware client grabs input the + // player clears out the X modifier map for whatever reason. We're + // notified of the change and arrive here to discover that there + // are no modifiers at all. Since this prevents the modifiers from + // working in the VMware client we'll use the last known good set + // of modifiers when there are no modifiers. If there are modifiers + // we update the last known good set. + if (!modifierButtons.empty()) { + m_lastGoodNonXKBModifiers = modifierButtons; + } + else { + modifierButtons = m_lastGoodNonXKBModifiers; + } - // add entries for each keycode - synergy::KeyMap::KeyItem item; - for (int i = 0; i < numKeycodes; ++i) { - KeySym* keysyms = allKeysyms + maxKeysyms * i; - KeyCode keycode = static_cast(i + minKeycode); - item.m_button = static_cast(keycode); - item.m_client = 0; + // add entries for each keycode + synergy::KeyMap::KeyItem item; + for (int i = 0; i < numKeycodes; ++i) { + KeySym* keysyms = allKeysyms + maxKeysyms * i; + KeyCode keycode = static_cast(i + minKeycode); + item.m_button = static_cast(keycode); + item.m_client = 0; - // determine modifier sensitivity - item.m_sensitive = 0; + // determine modifier sensitivity + item.m_sensitive = 0; - // if the keysyms in levels 2 or 3 exist and differ from levels - // 0 and 1 then the key is sensitive AltGr (Mode_switch) - if ((keysyms[2] != NoSymbol && keysyms[2] != keysyms[0]) || - (keysyms[3] != NoSymbol && keysyms[2] != keysyms[1])) { - item.m_sensitive |= KeyModifierAltGr; - } + // if the keysyms in levels 2 or 3 exist and differ from levels + // 0 and 1 then the key is sensitive AltGr (Mode_switch) + if ((keysyms[2] != NoSymbol && keysyms[2] != keysyms[0]) || + (keysyms[3] != NoSymbol && keysyms[2] != keysyms[1])) { + item.m_sensitive |= KeyModifierAltGr; + } - // check if the key is caps-lock sensitive. some systems only - // provide one keysym for keys sensitive to caps-lock. if we - // find that then fill in the missing keysym. - if (keysyms[0] != NoSymbol && keysyms[1] == NoSymbol && - keysyms[2] == NoSymbol && keysyms[3] == NoSymbol) { - KeySym lKeysym, uKeysym; - XConvertCase(keysyms[0], &lKeysym, &uKeysym); - if (lKeysym != uKeysym) { - keysyms[0] = lKeysym; - keysyms[1] = uKeysym; - item.m_sensitive |= KeyModifierCapsLock; - } - } - else if (keysyms[0] != NoSymbol && keysyms[1] != NoSymbol) { - KeySym lKeysym, uKeysym; - XConvertCase(keysyms[0], &lKeysym, &uKeysym); - if (lKeysym != uKeysym && - lKeysym == keysyms[0] && - uKeysym == keysyms[1]) { - item.m_sensitive |= KeyModifierCapsLock; - } - else if (keysyms[2] != NoSymbol && keysyms[3] != NoSymbol) { - XConvertCase(keysyms[2], &lKeysym, &uKeysym); - if (lKeysym != uKeysym && - lKeysym == keysyms[2] && - uKeysym == keysyms[3]) { - item.m_sensitive |= KeyModifierCapsLock; - } - } - } + // check if the key is caps-lock sensitive. some systems only + // provide one keysym for keys sensitive to caps-lock. if we + // find that then fill in the missing keysym. + if (keysyms[0] != NoSymbol && keysyms[1] == NoSymbol && + keysyms[2] == NoSymbol && keysyms[3] == NoSymbol) { + KeySym lKeysym, uKeysym; + XConvertCase(keysyms[0], &lKeysym, &uKeysym); + if (lKeysym != uKeysym) { + keysyms[0] = lKeysym; + keysyms[1] = uKeysym; + item.m_sensitive |= KeyModifierCapsLock; + } + } + else if (keysyms[0] != NoSymbol && keysyms[1] != NoSymbol) { + KeySym lKeysym, uKeysym; + XConvertCase(keysyms[0], &lKeysym, &uKeysym); + if (lKeysym != uKeysym && + lKeysym == keysyms[0] && + uKeysym == keysyms[1]) { + item.m_sensitive |= KeyModifierCapsLock; + } + else if (keysyms[2] != NoSymbol && keysyms[3] != NoSymbol) { + XConvertCase(keysyms[2], &lKeysym, &uKeysym); + if (lKeysym != uKeysym && + lKeysym == keysyms[2] && + uKeysym == keysyms[3]) { + item.m_sensitive |= KeyModifierCapsLock; + } + } + } - // key is sensitive to shift if keysyms in levels 0 and 1 or - // levels 2 and 3 don't match. it's also sensitive to shift - // if it's sensitive to caps-lock. - if ((item.m_sensitive & KeyModifierCapsLock) != 0) { - item.m_sensitive |= KeyModifierShift; - } - else if ((keysyms[0] != NoSymbol && keysyms[1] != NoSymbol && - keysyms[0] != keysyms[1]) || - (keysyms[2] != NoSymbol && keysyms[3] != NoSymbol && - keysyms[2] != keysyms[3])) { - item.m_sensitive |= KeyModifierShift; - } + // key is sensitive to shift if keysyms in levels 0 and 1 or + // levels 2 and 3 don't match. it's also sensitive to shift + // if it's sensitive to caps-lock. + if ((item.m_sensitive & KeyModifierCapsLock) != 0) { + item.m_sensitive |= KeyModifierShift; + } + else if ((keysyms[0] != NoSymbol && keysyms[1] != NoSymbol && + keysyms[0] != keysyms[1]) || + (keysyms[2] != NoSymbol && keysyms[3] != NoSymbol && + keysyms[2] != keysyms[3])) { + item.m_sensitive |= KeyModifierShift; + } - // key is sensitive to numlock if any keysym on it is - if (IsKeypadKey(keysyms[0]) || IsPrivateKeypadKey(keysyms[0]) || - IsKeypadKey(keysyms[1]) || IsPrivateKeypadKey(keysyms[1]) || - IsKeypadKey(keysyms[2]) || IsPrivateKeypadKey(keysyms[2]) || - IsKeypadKey(keysyms[3]) || IsPrivateKeypadKey(keysyms[3])) { - item.m_sensitive |= KeyModifierNumLock; - } + // key is sensitive to numlock if any keysym on it is + if (IsKeypadKey(keysyms[0]) || IsPrivateKeypadKey(keysyms[0]) || + IsKeypadKey(keysyms[1]) || IsPrivateKeypadKey(keysyms[1]) || + IsKeypadKey(keysyms[2]) || IsPrivateKeypadKey(keysyms[2]) || + IsKeypadKey(keysyms[3]) || IsPrivateKeypadKey(keysyms[3])) { + item.m_sensitive |= KeyModifierNumLock; + } - // do each keysym (shift level) - for (int j = 0; j < maxKeysyms; ++j) { - item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[j]); - if (item.m_id == kKeyNone) { - if (j != 0 && modifierButtons.count(keycode) > 0) { - // pretend the modifier works in other shift levels - // because it probably does. - if (keysyms[1] == NoSymbol || j != 3) { - item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[0]); - } - else { - item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[1]); - } - } - if (item.m_id == kKeyNone) { - continue; - } - } + // do each keysym (shift level) + for (int j = 0; j < maxKeysyms; ++j) { + item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[j]); + if (item.m_id == kKeyNone) { + if (j != 0 && modifierButtons.count(keycode) > 0) { + // pretend the modifier works in other shift levels + // because it probably does. + if (keysyms[1] == NoSymbol || j != 3) { + item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[0]); + } + else { + item.m_id = XWindowsUtil::mapKeySymToKeyID(keysyms[1]); + } + } + if (item.m_id == kKeyNone) { + continue; + } + } - // group is 0 for levels 0 and 1 and 1 for levels 2 and 3 - item.m_group = (j >= 2) ? 1 : 0; + // group is 0 for levels 0 and 1 and 1 for levels 2 and 3 + item.m_group = (j >= 2) ? 1 : 0; - // compute required modifiers - item.m_required = 0; - if ((j & 1) != 0) { - item.m_required |= KeyModifierShift; - } - if ((j & 2) != 0) { - item.m_required |= KeyModifierAltGr; - } + // compute required modifiers + item.m_required = 0; + if ((j & 1) != 0) { + item.m_required |= KeyModifierShift; + } + if ((j & 2) != 0) { + item.m_required |= KeyModifierAltGr; + } - item.m_generates = 0; - item.m_lock = false; - if (modifierButtons.count(keycode) > 0) { - // get flags for modifier keys - synergy::KeyMap::initModifierKey(item); + item.m_generates = 0; + item.m_lock = false; + if (modifierButtons.count(keycode) > 0) { + // get flags for modifier keys + synergy::KeyMap::initModifierKey(item); - // add mapping from X (unless we already have) - if (item.m_generates != 0) { - unsigned int bit = modifierButtons[keycode]; - if (m_modifierFromX[bit] == 0) { - m_modifierFromX[bit] = item.m_generates; - m_modifierToX[item.m_generates] = (1u << bit); - } - } - } + // add mapping from X (unless we already have) + if (item.m_generates != 0) { + unsigned int bit = modifierButtons[keycode]; + if (m_modifierFromX[bit] == 0) { + m_modifierFromX[bit] = item.m_generates; + m_modifierToX[item.m_generates] = (1u << bit); + } + } + } - // add key - keyMap.addKeyEntry(item); - m_keyCodeFromKey.insert(std::make_pair(item.m_id, keycode)); + // add key + keyMap.addKeyEntry(item); + m_keyCodeFromKey.insert(std::make_pair(item.m_id, keycode)); - // add other ways to synthesize the key - if ((j & 1) != 0) { - // add capslock version of key is sensitive to capslock - KeySym lKeysym, uKeysym; - XConvertCase(keysyms[j], &lKeysym, &uKeysym); - if (lKeysym != uKeysym && - lKeysym == keysyms[j - 1] && - uKeysym == keysyms[j]) { - item.m_required &= ~KeyModifierShift; - item.m_required |= KeyModifierCapsLock; - keyMap.addKeyEntry(item); - item.m_required |= KeyModifierShift; - item.m_required &= ~KeyModifierCapsLock; - } + // add other ways to synthesize the key + if ((j & 1) != 0) { + // add capslock version of key is sensitive to capslock + KeySym lKeysym, uKeysym; + XConvertCase(keysyms[j], &lKeysym, &uKeysym); + if (lKeysym != uKeysym && + lKeysym == keysyms[j - 1] && + uKeysym == keysyms[j]) { + item.m_required &= ~KeyModifierShift; + item.m_required |= KeyModifierCapsLock; + keyMap.addKeyEntry(item); + item.m_required |= KeyModifierShift; + item.m_required &= ~KeyModifierCapsLock; + } - // add numlock version of key if sensitive to numlock - if (IsKeypadKey(keysyms[j]) || IsPrivateKeypadKey(keysyms[j])) { - item.m_required &= ~KeyModifierShift; - item.m_required |= KeyModifierNumLock; - keyMap.addKeyEntry(item); - item.m_required |= KeyModifierShift; - item.m_required &= ~KeyModifierNumLock; - } - } - } - } + // add numlock version of key if sensitive to numlock + if (IsKeypadKey(keysyms[j]) || IsPrivateKeypadKey(keysyms[j])) { + item.m_required &= ~KeyModifierShift; + item.m_required |= KeyModifierNumLock; + keyMap.addKeyEntry(item); + item.m_required |= KeyModifierShift; + item.m_required &= ~KeyModifierNumLock; + } + } + } + } - delete[] allKeysyms; + delete[] allKeysyms; } #if HAVE_XKB_EXTENSION void XWindowsKeyState::updateKeysymMapXKB(synergy::KeyMap& keyMap) { - static const XkbKTMapEntryRec defMapEntry = { - True, // active - 0, // level - { - 0, // mods.mask - 0, // mods.real_mods - 0 // mods.vmods - } - }; + static const XkbKTMapEntryRec defMapEntry = { + True, // active + 0, // level + { + 0, // mods.mask + 0, // mods.real_mods + 0 // mods.vmods + } + }; - LOG((CLOG_DEBUG1 "XKB mapping")); + LOG((CLOG_DEBUG1 "XKB mapping")); - // find the number of groups - int maxNumGroups = 0; - for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { - int numGroups = XkbKeyNumGroups(m_xkb, static_cast(i)); - if (numGroups > maxNumGroups) { - maxNumGroups = numGroups; - } - } + // find the number of groups + int maxNumGroups = 0; + for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { + int numGroups = XkbKeyNumGroups(m_xkb, static_cast(i)); + if (numGroups > maxNumGroups) { + maxNumGroups = numGroups; + } + } - // prepare map from X modifier to KeyModifierMask - std::vector modifierLevel(maxNumGroups * 8, 4); - m_modifierFromX.clear(); - m_modifierFromX.resize(maxNumGroups * 8); - m_modifierToX.clear(); + // prepare map from X modifier to KeyModifierMask + std::vector modifierLevel(maxNumGroups * 8, 4); + m_modifierFromX.clear(); + m_modifierFromX.resize(maxNumGroups * 8); + m_modifierToX.clear(); - // prepare map from KeyID to KeyCode - m_keyCodeFromKey.clear(); + // prepare map from KeyID to KeyCode + m_keyCodeFromKey.clear(); - // Hack to deal with VMware. When a VMware client grabs input the - // player clears out the X modifier map for whatever reason. We're - // notified of the change and arrive here to discover that there - // are no modifiers at all. Since this prevents the modifiers from - // working in the VMware client we'll use the last known good set - // of modifiers when there are no modifiers. If there are modifiers - // we update the last known good set. - bool useLastGoodModifiers = !hasModifiersXKB(); - if (!useLastGoodModifiers) { - m_lastGoodXKBModifiers.clear(); - } + // Hack to deal with VMware. When a VMware client grabs input the + // player clears out the X modifier map for whatever reason. We're + // notified of the change and arrive here to discover that there + // are no modifiers at all. Since this prevents the modifiers from + // working in the VMware client we'll use the last known good set + // of modifiers when there are no modifiers. If there are modifiers + // we update the last known good set. + bool useLastGoodModifiers = !hasModifiersXKB(); + if (!useLastGoodModifiers) { + m_lastGoodXKBModifiers.clear(); + } - // check every button. on this pass we save all modifiers as native - // X modifier masks. - synergy::KeyMap::KeyItem item; - for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { - KeyCode keycode = static_cast(i); - item.m_button = static_cast(keycode); - item.m_client = 0; + // check every button. on this pass we save all modifiers as native + // X modifier masks. + synergy::KeyMap::KeyItem item; + for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { + KeyCode keycode = static_cast(i); + item.m_button = static_cast(keycode); + item.m_client = 0; - // skip keys with no groups (they generate no symbols) - if (XkbKeyNumGroups(m_xkb, keycode) == 0) { - continue; - } + // skip keys with no groups (they generate no symbols) + if (XkbKeyNumGroups(m_xkb, keycode) == 0) { + continue; + } - // note half-duplex keys - const XkbBehavior& b = m_xkb->server->behaviors[keycode]; - if ((b.type & XkbKB_OpMask) == XkbKB_Lock) { - keyMap.addHalfDuplexButton(item.m_button); - } + // note half-duplex keys + const XkbBehavior& b = m_xkb->server->behaviors[keycode]; + if ((b.type & XkbKB_OpMask) == XkbKB_Lock) { + keyMap.addHalfDuplexButton(item.m_button); + } - // iterate over all groups - for (int group = 0; group < maxNumGroups; ++group) { - item.m_group = group; - int eGroup = getEffectiveGroup(keycode, group); + // iterate over all groups + for (int group = 0; group < maxNumGroups; ++group) { + item.m_group = group; + int eGroup = getEffectiveGroup(keycode, group); - // get key info - XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, eGroup); + // get key info + XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, eGroup); - // set modifiers the item is sensitive to - item.m_sensitive = type->mods.mask; + // set modifiers the item is sensitive to + item.m_sensitive = type->mods.mask; - // iterate over all shift levels for the button (including none) - for (int j = -1; j < type->map_count; ++j) { - const XkbKTMapEntryRec* mapEntry = - ((j == -1) ? &defMapEntry : type->map + j); - if (!mapEntry->active) { - continue; - } - int level = mapEntry->level; + // iterate over all shift levels for the button (including none) + for (int j = -1; j < type->map_count; ++j) { + const XkbKTMapEntryRec* mapEntry = + ((j == -1) ? &defMapEntry : type->map + j); + if (!mapEntry->active) { + continue; + } + int level = mapEntry->level; - // set required modifiers for this item - item.m_required = mapEntry->mods.mask; - if ((item.m_required & LockMask) != 0 && - j != -1 && type->preserve != NULL && - (type->preserve[j].mask & LockMask) != 0) { - // sensitive caps lock and we preserve caps-lock. - // preserving caps-lock means we Xlib functions would - // yield the capitialized KeySym so we'll adjust the - // level accordingly. - if ((level ^ 1) < type->num_levels) { - level ^= 1; - } - } + // set required modifiers for this item + item.m_required = mapEntry->mods.mask; + if ((item.m_required & LockMask) != 0 && + j != -1 && type->preserve != NULL && + (type->preserve[j].mask & LockMask) != 0) { + // sensitive caps lock and we preserve caps-lock. + // preserving caps-lock means we Xlib functions would + // yield the capitialized KeySym so we'll adjust the + // level accordingly. + if ((level ^ 1) < type->num_levels) { + level ^= 1; + } + } - // get the keysym for this item - KeySym keysym = XkbKeySymEntry(m_xkb, keycode, level, eGroup); + // get the keysym for this item + KeySym keysym = XkbKeySymEntry(m_xkb, keycode, level, eGroup); - // check for group change actions, locking modifiers, and - // modifier masks. - item.m_lock = false; - bool isModifier = false; - UInt32 modifierMask = m_xkb->map->modmap[keycode]; - if (XkbKeyHasActions(m_xkb, keycode) == True) { - XkbAction* action = - XkbKeyActionEntry(m_xkb, keycode, level, eGroup); - if (action->type == XkbSA_SetMods || - action->type == XkbSA_LockMods) { - isModifier = true; + // check for group change actions, locking modifiers, and + // modifier masks. + item.m_lock = false; + bool isModifier = false; + UInt32 modifierMask = m_xkb->map->modmap[keycode]; + if (XkbKeyHasActions(m_xkb, keycode) == True) { + XkbAction* action = + XkbKeyActionEntry(m_xkb, keycode, level, eGroup); + if (action->type == XkbSA_SetMods || + action->type == XkbSA_LockMods) { + isModifier = true; - // note toggles - item.m_lock = (action->type == XkbSA_LockMods); + // note toggles + item.m_lock = (action->type == XkbSA_LockMods); - // maybe use action's mask - if ((action->mods.flags & XkbSA_UseModMapMods) == 0) { - modifierMask = action->mods.mask; - } - } - else if (action->type == XkbSA_SetGroup || - action->type == XkbSA_LatchGroup || - action->type == XkbSA_LockGroup) { - // ignore group change key - continue; - } - } - level = mapEntry->level; + // maybe use action's mask + if ((action->mods.flags & XkbSA_UseModMapMods) == 0) { + modifierMask = action->mods.mask; + } + } + else if (action->type == XkbSA_SetGroup || + action->type == XkbSA_LatchGroup || + action->type == XkbSA_LockGroup) { + // ignore group change key + continue; + } + } + level = mapEntry->level; - // VMware modifier hack - if (useLastGoodModifiers) { - XKBModifierMap::const_iterator k = - m_lastGoodXKBModifiers.find(eGroup * 256 + keycode); - if (k != m_lastGoodXKBModifiers.end()) { - // Use last known good modifier - isModifier = true; - level = k->second.m_level; - modifierMask = k->second.m_mask; - item.m_lock = k->second.m_lock; - } - } - else if (isModifier) { - // Save known good modifier - XKBModifierInfo& info = - m_lastGoodXKBModifiers[eGroup * 256 + keycode]; - info.m_level = level; - info.m_mask = modifierMask; - info.m_lock = item.m_lock; - } + // VMware modifier hack + if (useLastGoodModifiers) { + XKBModifierMap::const_iterator k = + m_lastGoodXKBModifiers.find(eGroup * 256 + keycode); + if (k != m_lastGoodXKBModifiers.end()) { + // Use last known good modifier + isModifier = true; + level = k->second.m_level; + modifierMask = k->second.m_mask; + item.m_lock = k->second.m_lock; + } + } + else if (isModifier) { + // Save known good modifier + XKBModifierInfo& info = + m_lastGoodXKBModifiers[eGroup * 256 + keycode]; + info.m_level = level; + info.m_mask = modifierMask; + info.m_lock = item.m_lock; + } - // record the modifier mask for this key. don't bother - // for keys that change the group. - item.m_generates = 0; - UInt32 modifierBit = - XWindowsUtil::getModifierBitForKeySym(keysym); - if (isModifier && modifierBit != kKeyModifierBitNone) { - item.m_generates = (1u << modifierBit); - for (SInt32 j = 0; j < 8; ++j) { - // skip modifiers this key doesn't generate - if ((modifierMask & (1u << j)) == 0) { - continue; - } + // record the modifier mask for this key. don't bother + // for keys that change the group. + item.m_generates = 0; + UInt32 modifierBit = + XWindowsUtil::getModifierBitForKeySym(keysym); + if (isModifier && modifierBit != kKeyModifierBitNone) { + item.m_generates = (1u << modifierBit); + for (SInt32 j = 0; j < 8; ++j) { + // skip modifiers this key doesn't generate + if ((modifierMask & (1u << j)) == 0) { + continue; + } - // skip keys that map to a modifier that we've - // already seen using fewer modifiers. that is - // if this key must combine with other modifiers - // and we know of a key that combines with fewer - // modifiers (or no modifiers) then prefer the - // other key. - if (level >= modifierLevel[8 * group + j]) { - continue; - } - modifierLevel[8 * group + j] = level; + // skip keys that map to a modifier that we've + // already seen using fewer modifiers. that is + // if this key must combine with other modifiers + // and we know of a key that combines with fewer + // modifiers (or no modifiers) then prefer the + // other key. + if (level >= modifierLevel[8 * group + j]) { + continue; + } + modifierLevel[8 * group + j] = level; - // save modifier - m_modifierFromX[8 * group + j] |= (1u << modifierBit); - m_modifierToX.insert(std::make_pair( - 1u << modifierBit, 1u << j)); - } - } + // save modifier + m_modifierFromX[8 * group + j] |= (1u << modifierBit); + m_modifierToX.insert(std::make_pair( + 1u << modifierBit, 1u << j)); + } + } - // handle special cases of just one keysym for the keycode - if (type->num_levels == 1) { - // if there are upper- and lowercase versions of the - // keysym then add both. - KeySym lKeysym, uKeysym; - XConvertCase(keysym, &lKeysym, &uKeysym); - if (lKeysym != uKeysym) { - if (j != -1) { - continue; - } + // handle special cases of just one keysym for the keycode + if (type->num_levels == 1) { + // if there are upper- and lowercase versions of the + // keysym then add both. + KeySym lKeysym, uKeysym; + XConvertCase(keysym, &lKeysym, &uKeysym); + if (lKeysym != uKeysym) { + if (j != -1) { + continue; + } - item.m_sensitive |= ShiftMask | LockMask; + item.m_sensitive |= ShiftMask | LockMask; - KeyID lKeyID = XWindowsUtil::mapKeySymToKeyID(lKeysym); - KeyID uKeyID = XWindowsUtil::mapKeySymToKeyID(uKeysym); - if (lKeyID == kKeyNone || uKeyID == kKeyNone) { - continue; - } + KeyID lKeyID = XWindowsUtil::mapKeySymToKeyID(lKeysym); + KeyID uKeyID = XWindowsUtil::mapKeySymToKeyID(uKeysym); + if (lKeyID == kKeyNone || uKeyID == kKeyNone) { + continue; + } - item.m_id = lKeyID; - item.m_required = 0; - keyMap.addKeyEntry(item); + item.m_id = lKeyID; + item.m_required = 0; + keyMap.addKeyEntry(item); - item.m_id = uKeyID; - item.m_required = ShiftMask; - keyMap.addKeyEntry(item); - item.m_required = LockMask; - keyMap.addKeyEntry(item); + item.m_id = uKeyID; + item.m_required = ShiftMask; + keyMap.addKeyEntry(item); + item.m_required = LockMask; + keyMap.addKeyEntry(item); - if (group == 0) { - m_keyCodeFromKey.insert( - std::make_pair(lKeyID, keycode)); - m_keyCodeFromKey.insert( - std::make_pair(uKeyID, keycode)); - } - continue; - } - } + if (group == 0) { + m_keyCodeFromKey.insert( + std::make_pair(lKeyID, keycode)); + m_keyCodeFromKey.insert( + std::make_pair(uKeyID, keycode)); + } + continue; + } + } - // add entry - item.m_id = XWindowsUtil::mapKeySymToKeyID(keysym); - keyMap.addKeyEntry(item); - if (group == 0) { - m_keyCodeFromKey.insert(std::make_pair(item.m_id, keycode)); - } - } - } - } + // add entry + item.m_id = XWindowsUtil::mapKeySymToKeyID(keysym); + keyMap.addKeyEntry(item); + if (group == 0) { + m_keyCodeFromKey.insert(std::make_pair(item.m_id, keycode)); + } + } + } + } - // change all modifier masks to synergy masks from X masks - keyMap.foreachKey(&XWindowsKeyState::remapKeyModifiers, this); + // change all modifier masks to synergy masks from X masks + keyMap.foreachKey(&XWindowsKeyState::remapKeyModifiers, this); - // allow composition across groups - keyMap.allowGroupSwitchDuringCompose(); + // allow composition across groups + keyMap.allowGroupSwitchDuringCompose(); } #endif void XWindowsKeyState::remapKeyModifiers(KeyID id, SInt32 group, - synergy::KeyMap::KeyItem& item, void* vself) + synergy::KeyMap::KeyItem& item, void* vself) { - XWindowsKeyState* self = static_cast(vself); - item.m_required = - self->mapModifiersFromX(XkbBuildCoreState(item.m_required, group)); - item.m_sensitive = - self->mapModifiersFromX(XkbBuildCoreState(item.m_sensitive, group)); + XWindowsKeyState* self = static_cast(vself); + item.m_required = + self->mapModifiersFromX(XkbBuildCoreState(item.m_required, group)); + item.m_sensitive = + self->mapModifiersFromX(XkbBuildCoreState(item.m_sensitive, group)); } bool XWindowsKeyState::hasModifiersXKB() const { #if HAVE_XKB_EXTENSION - // iterate over all keycodes - for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { - KeyCode keycode = static_cast(i); - if (XkbKeyHasActions(m_xkb, keycode) == True) { - // iterate over all groups - int numGroups = XkbKeyNumGroups(m_xkb, keycode); - for (int group = 0; group < numGroups; ++group) { - // iterate over all shift levels for the button (including none) - XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, group); - for (int j = -1; j < type->map_count; ++j) { - if (j != -1 && !type->map[j].active) { - continue; - } - int level = ((j == -1) ? 0 : type->map[j].level); - XkbAction* action = - XkbKeyActionEntry(m_xkb, keycode, level, group); - if (action->type == XkbSA_SetMods || - action->type == XkbSA_LockMods) { - return true; - } - } - } - } - } + // iterate over all keycodes + for (int i = m_xkb->min_key_code; i <= m_xkb->max_key_code; ++i) { + KeyCode keycode = static_cast(i); + if (XkbKeyHasActions(m_xkb, keycode) == True) { + // iterate over all groups + int numGroups = XkbKeyNumGroups(m_xkb, keycode); + for (int group = 0; group < numGroups; ++group) { + // iterate over all shift levels for the button (including none) + XkbKeyTypePtr type = XkbKeyKeyType(m_xkb, keycode, group); + for (int j = -1; j < type->map_count; ++j) { + if (j != -1 && !type->map[j].active) { + continue; + } + int level = ((j == -1) ? 0 : type->map[j].level); + XkbAction* action = + XkbKeyActionEntry(m_xkb, keycode, level, group); + if (action->type == XkbSA_SetMods || + action->type == XkbSA_LockMods) { + return true; + } + } + } + } + } #endif - return false; + return false; } int XWindowsKeyState::getEffectiveGroup(KeyCode keycode, int group) const { - (void)keycode; + (void)keycode; #if HAVE_XKB_EXTENSION - // get effective group for key - int numGroups = XkbKeyNumGroups(m_xkb, keycode); - if (group >= numGroups) { - unsigned char groupInfo = XkbKeyGroupInfo(m_xkb, keycode); - switch (XkbOutOfRangeGroupAction(groupInfo)) { - case XkbClampIntoRange: - group = numGroups - 1; - break; + // get effective group for key + int numGroups = XkbKeyNumGroups(m_xkb, keycode); + if (group >= numGroups) { + unsigned char groupInfo = XkbKeyGroupInfo(m_xkb, keycode); + switch (XkbOutOfRangeGroupAction(groupInfo)) { + case XkbClampIntoRange: + group = numGroups - 1; + break; - case XkbRedirectIntoRange: - group = XkbOutOfRangeGroupNumber(groupInfo); - if (group >= numGroups) { - group = 0; - } - break; + case XkbRedirectIntoRange: + group = XkbOutOfRangeGroupNumber(groupInfo); + if (group >= numGroups) { + group = 0; + } + break; - default: - // wrap - group %= numGroups; - break; - } - } + default: + // wrap + group %= numGroups; + break; + } + } #endif - return group; + return group; } UInt32 XWindowsKeyState::getGroupFromState(unsigned int state) const { #if HAVE_XKB_EXTENSION - if (m_xkb != NULL) { - return XkbGroupForCoreState(state); - } + if (m_xkb != NULL) { + return XkbGroupForCoreState(state); + } #endif - return 0; + return 0; } diff --git a/src/lib/platform/XWindowsKeyState.h b/src/lib/platform/XWindowsKeyState.h index 8c845054..9b389794 100644 --- a/src/lib/platform/XWindowsKeyState.h +++ b/src/lib/platform/XWindowsKeyState.h @@ -23,17 +23,17 @@ #include "common/stdvector.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include -# if HAVE_X11_EXTENSIONS_XTEST_H -# include -# else -# error The XTest extension is required to build synergy -# endif -# if HAVE_XKB_EXTENSION -# include -# endif +# include +# if HAVE_X11_EXTENSIONS_XTEST_H +# include +# else +# error The XTest extension is required to build synergy +# endif +# if HAVE_XKB_EXTENSION +# include +# endif #endif class IEventQueue; @@ -44,131 +44,131 @@ A key state for X Windows. */ class XWindowsKeyState : public KeyState { public: - typedef std::vector KeycodeList; - enum { - kGroupPoll = -1, - kGroupPollAndSet = -2 - }; + typedef std::vector KeycodeList; + enum { + kGroupPoll = -1, + kGroupPollAndSet = -2 + }; - XWindowsKeyState(Display*, bool useXKB, IEventQueue* events); - XWindowsKeyState(Display*, bool useXKB, - IEventQueue* events, synergy::KeyMap& keyMap); - ~XWindowsKeyState(); + XWindowsKeyState(Display*, bool useXKB, IEventQueue* events); + XWindowsKeyState(Display*, bool useXKB, + IEventQueue* events, synergy::KeyMap& keyMap); + ~XWindowsKeyState(); - //! @name modifiers - //@{ + //! @name modifiers + //@{ - //! Set active group - /*! - Sets the active group to \p group. This is the group returned by - \c pollActiveGroup(). If \p group is \c kGroupPoll then - \c pollActiveGroup() will really poll, but that's a slow operation - on X11. If \p group is \c kGroupPollAndSet then this will poll the - active group now and use it for future calls to \c pollActiveGroup(). - */ - void setActiveGroup(SInt32 group); + //! Set active group + /*! + Sets the active group to \p group. This is the group returned by + \c pollActiveGroup(). If \p group is \c kGroupPoll then + \c pollActiveGroup() will really poll, but that's a slow operation + on X11. If \p group is \c kGroupPollAndSet then this will poll the + active group now and use it for future calls to \c pollActiveGroup(). + */ + void setActiveGroup(SInt32 group); - //! Set the auto-repeat state - /*! - Sets the auto-repeat state. - */ - void setAutoRepeat(const XKeyboardState&); + //! Set the auto-repeat state + /*! + Sets the auto-repeat state. + */ + void setAutoRepeat(const XKeyboardState&); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Convert X modifier mask to synergy mask - /*! - Returns the synergy modifier mask corresponding to the X modifier - mask in \p state. - */ - KeyModifierMask mapModifiersFromX(unsigned int state) const; + //! Convert X modifier mask to synergy mask + /*! + Returns the synergy modifier mask corresponding to the X modifier + mask in \p state. + */ + KeyModifierMask mapModifiersFromX(unsigned int state) const; - //! Convert synergy modifier mask to X mask - /*! - Converts the synergy modifier mask to the corresponding X modifier - mask. Returns \c true if successful and \c false if any modifier - could not be converted. - */ - bool mapModifiersToX(KeyModifierMask, unsigned int&) const; + //! Convert synergy modifier mask to X mask + /*! + Converts the synergy modifier mask to the corresponding X modifier + mask. Returns \c true if successful and \c false if any modifier + could not be converted. + */ + bool mapModifiersToX(KeyModifierMask, unsigned int&) const; - //! Convert synergy key to all corresponding X keycodes - /*! - Converts the synergy key \p key to all of the keycodes that map to - that key. - */ - void mapKeyToKeycodes(KeyID key, - KeycodeList& keycodes) const; + //! Convert synergy key to all corresponding X keycodes + /*! + Converts the synergy key \p key to all of the keycodes that map to + that key. + */ + void mapKeyToKeycodes(KeyID key, + KeycodeList& keycodes) const; - //@} + //@} - // IKeyState overrides - virtual bool fakeCtrlAltDel(); - virtual KeyModifierMask - pollActiveModifiers() const; - virtual SInt32 pollActiveGroup() const; - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; + // IKeyState overrides + virtual bool fakeCtrlAltDel(); + virtual KeyModifierMask + pollActiveModifiers() const; + virtual SInt32 pollActiveGroup() const; + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; protected: - // KeyState overrides - virtual void getKeyMap(synergy::KeyMap& keyMap); - virtual void fakeKey(const Keystroke& keystroke); + // KeyState overrides + virtual void getKeyMap(synergy::KeyMap& keyMap); + virtual void fakeKey(const Keystroke& keystroke); private: - void init(Display* display, bool useXKB); - void updateKeysymMap(synergy::KeyMap&); - void updateKeysymMapXKB(synergy::KeyMap&); - bool hasModifiersXKB() const; - int getEffectiveGroup(KeyCode, int group) const; - UInt32 getGroupFromState(unsigned int state) const; + void init(Display* display, bool useXKB); + void updateKeysymMap(synergy::KeyMap&); + void updateKeysymMapXKB(synergy::KeyMap&); + bool hasModifiersXKB() const; + int getEffectiveGroup(KeyCode, int group) const; + UInt32 getGroupFromState(unsigned int state) const; - static void remapKeyModifiers(KeyID, SInt32, - synergy::KeyMap::KeyItem&, void*); + static void remapKeyModifiers(KeyID, SInt32, + synergy::KeyMap::KeyItem&, void*); private: - struct XKBModifierInfo { - public: - unsigned char m_level; - UInt32 m_mask; - bool m_lock; - }; + struct XKBModifierInfo { + public: + unsigned char m_level; + UInt32 m_mask; + bool m_lock; + }; #ifdef TEST_ENV public: // yuck #endif - typedef std::vector KeyModifierMaskList; + typedef std::vector KeyModifierMaskList; private: - typedef std::map KeyModifierToXMask; - typedef std::multimap KeyToKeyCodeMap; - typedef std::map NonXKBModifierMap; - typedef std::map XKBModifierMap; + typedef std::map KeyModifierToXMask; + typedef std::multimap KeyToKeyCodeMap; + typedef std::map NonXKBModifierMap; + typedef std::map XKBModifierMap; - Display* m_display; + Display* m_display; #if HAVE_XKB_EXTENSION - XkbDescPtr m_xkb; + XkbDescPtr m_xkb; #endif - SInt32 m_group; - XKBModifierMap m_lastGoodXKBModifiers; - NonXKBModifierMap m_lastGoodNonXKBModifiers; + SInt32 m_group; + XKBModifierMap m_lastGoodXKBModifiers; + NonXKBModifierMap m_lastGoodNonXKBModifiers; - // X modifier (bit number) to synergy modifier (mask) mapping - KeyModifierMaskList m_modifierFromX; + // X modifier (bit number) to synergy modifier (mask) mapping + KeyModifierMaskList m_modifierFromX; - // synergy modifier (mask) to X modifier (mask) - KeyModifierToXMask m_modifierToX; + // synergy modifier (mask) to X modifier (mask) + KeyModifierToXMask m_modifierToX; - // map KeyID to all keycodes that can synthesize that KeyID - KeyToKeyCodeMap m_keyCodeFromKey; + // map KeyID to all keycodes that can synthesize that KeyID + KeyToKeyCodeMap m_keyCodeFromKey; - // autorepeat state - XKeyboardState m_keyboardState; + // autorepeat state + XKeyboardState m_keyboardState; #ifdef TEST_ENV public: - SInt32 group() const { return m_group; } - void group(const SInt32& group) { m_group = group; } - KeyModifierMaskList modifierFromX() const { return m_modifierFromX; } + SInt32 group() const { return m_group; } + void group(const SInt32& group) { m_group = group; } + KeyModifierMaskList modifierFromX() const { return m_modifierFromX; } #endif }; diff --git a/src/lib/platform/XWindowsScreen.h b/src/lib/platform/XWindowsScreen.h index fcf93502..89524490 100644 --- a/src/lib/platform/XWindowsScreen.h +++ b/src/lib/platform/XWindowsScreen.h @@ -24,9 +24,9 @@ #include "common/stdvector.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include +# include #endif class XWindowsClipboard; @@ -36,217 +36,217 @@ class XWindowsScreenSaver; //! Implementation of IPlatformScreen for X11 class XWindowsScreen : public PlatformScreen { public: - XWindowsScreen(const char* displayName, bool isPrimary, - bool disableXInitThreads, int mouseScrollDelta, - IEventQueue* events); - virtual ~XWindowsScreen(); + XWindowsScreen(const char* displayName, bool isPrimary, + bool disableXInitThreads, int mouseScrollDelta, + IEventQueue* events); + virtual ~XWindowsScreen(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IPrimaryScreen overrides - virtual void reconfigure(UInt32 activeSides); - virtual void warpCursor(SInt32 x, SInt32 y); - virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); - virtual void unregisterHotKey(UInt32 id); - virtual void fakeInputBegin(); - virtual void fakeInputEnd(); - virtual SInt32 getJumpZoneSize() const; - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; - virtual void getCursorCenter(SInt32& x, SInt32& y) const; + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides); + virtual void warpCursor(SInt32 x, SInt32 y); + virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); + virtual void unregisterHotKey(UInt32 id); + virtual void fakeInputBegin(); + virtual void fakeInputEnd(); + virtual SInt32 getJumpZoneSize() const; + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const; + virtual void getCursorCenter(SInt32& x, SInt32& y) const; - // ISecondaryScreen overrides - virtual void fakeMouseButton(ButtonID id, bool press); - virtual void fakeMouseMove(SInt32 x, SInt32 y); - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press); + virtual void fakeMouseMove(SInt32 x, SInt32 y); + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const; + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const; - // IPlatformScreen overrides - virtual void enable(); - virtual void disable(); - virtual void enter(); - virtual bool leave(); - virtual bool setClipboard(ClipboardID, const IClipboard*); - virtual void checkClipboards(); - virtual void openScreensaver(bool notify); - virtual void closeScreensaver(); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual void setSequenceNumber(UInt32); - virtual bool isPrimary() const; + // IPlatformScreen overrides + virtual void enable(); + virtual void disable(); + virtual void enter(); + virtual bool leave(); + virtual bool setClipboard(ClipboardID, const IClipboard*); + virtual void checkClipboards(); + virtual void openScreensaver(bool notify); + virtual void closeScreensaver(); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual void setSequenceNumber(UInt32); + virtual bool isPrimary() const; protected: - // IPlatformScreen overrides - virtual void handleSystemEvent(const Event&, void*); - virtual void updateButtons(); - virtual IKeyState* getKeyState() const; + // IPlatformScreen overrides + virtual void handleSystemEvent(const Event&, void*); + virtual void updateButtons(); + virtual IKeyState* getKeyState() const; private: - // event sending - void sendEvent(Event::Type, void* = NULL); - void sendClipboardEvent(Event::Type, ClipboardID); + // event sending + void sendEvent(Event::Type, void* = NULL); + void sendClipboardEvent(Event::Type, ClipboardID); - // create the transparent cursor - Cursor createBlankCursor() const; + // create the transparent cursor + Cursor createBlankCursor() const; - // determine the clipboard from the X selection. returns - // kClipboardEnd if no such clipboard. - ClipboardID getClipboardID(Atom selection) const; + // determine the clipboard from the X selection. returns + // kClipboardEnd if no such clipboard. + ClipboardID getClipboardID(Atom selection) const; - // continue processing a selection request - void processClipboardRequest(Window window, - Time time, Atom property); + // continue processing a selection request + void processClipboardRequest(Window window, + Time time, Atom property); - // terminate a selection request - void destroyClipboardRequest(Window window); + // terminate a selection request + void destroyClipboardRequest(Window window); - // X I/O error handler - void onError(); - static int ioErrorHandler(Display*); + // X I/O error handler + void onError(); + static int ioErrorHandler(Display*); private: - class KeyEventFilter { - public: - int m_event; - Window m_window; - Time m_time; - KeyCode m_keycode; - }; + class KeyEventFilter { + public: + int m_event; + Window m_window; + Time m_time; + KeyCode m_keycode; + }; - Display* openDisplay(const char* displayName); - void saveShape(); - Window openWindow() const; - void openIM(); + Display* openDisplay(const char* displayName); + void saveShape(); + Window openWindow() const; + void openIM(); - bool grabMouseAndKeyboard(); - void onKeyPress(XKeyEvent&); - void onKeyRelease(XKeyEvent&, bool isRepeat); - bool onHotKey(XKeyEvent&, bool isRepeat); - void onMousePress(const XButtonEvent&); - void onMouseRelease(const XButtonEvent&); - void onMouseMove(const XMotionEvent&); + bool grabMouseAndKeyboard(); + void onKeyPress(XKeyEvent&); + void onKeyRelease(XKeyEvent&, bool isRepeat); + bool onHotKey(XKeyEvent&, bool isRepeat); + void onMousePress(const XButtonEvent&); + void onMouseRelease(const XButtonEvent&); + void onMouseMove(const XMotionEvent&); - bool detectXI2(); + bool detectXI2(); #ifdef HAVE_XI2 - void selectXIRawMotion(); + void selectXIRawMotion(); #endif - void selectEvents(Window) const; - void doSelectEvents(Window) const; + void selectEvents(Window) const; + void doSelectEvents(Window) const; - KeyID mapKeyFromX(XKeyEvent*) const; - ButtonID mapButtonFromX(const XButtonEvent*) const; - unsigned int mapButtonToX(ButtonID id) const; + KeyID mapKeyFromX(XKeyEvent*) const; + ButtonID mapButtonFromX(const XButtonEvent*) const; + unsigned int mapButtonToX(ButtonID id) const; - void warpCursorNoFlush(SInt32 x, SInt32 y); + void warpCursorNoFlush(SInt32 x, SInt32 y); - void refreshKeyboard(XEvent*); + void refreshKeyboard(XEvent*); - static Bool findKeyEvent(Display*, XEvent* xevent, XPointer arg); + static Bool findKeyEvent(Display*, XEvent* xevent, XPointer arg); private: - struct HotKeyItem { - public: - HotKeyItem(int, unsigned int); + struct HotKeyItem { + public: + HotKeyItem(int, unsigned int); - bool operator<(const HotKeyItem&) const; + bool operator<(const HotKeyItem&) const; - private: - int m_keycode; - unsigned int m_mask; - }; - typedef std::set FilteredKeycodes; - typedef std::vector > HotKeyList; - typedef std::map HotKeyMap; - typedef std::vector HotKeyIDList; - typedef std::map HotKeyToIDMap; + private: + int m_keycode; + unsigned int m_mask; + }; + typedef std::set FilteredKeycodes; + typedef std::vector > HotKeyList; + typedef std::map HotKeyMap; + typedef std::vector HotKeyIDList; + typedef std::map HotKeyToIDMap; - // true if screen is being used as a primary screen, false otherwise - bool m_isPrimary; - int m_mouseScrollDelta; + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; + int m_mouseScrollDelta; - Display* m_display; - Window m_root; - Window m_window; + Display* m_display; + Window m_root; + Window m_window; - // true if mouse has entered the screen - bool m_isOnScreen; + // true if mouse has entered the screen + bool m_isOnScreen; - // screen shape stuff - SInt32 m_x, m_y; - SInt32 m_w, m_h; - SInt32 m_xCenter, m_yCenter; + // screen shape stuff + SInt32 m_x, m_y; + SInt32 m_w, m_h; + SInt32 m_xCenter, m_yCenter; - // last mouse position - SInt32 m_xCursor, m_yCursor; + // last mouse position + SInt32 m_xCursor, m_yCursor; - // keyboard stuff - XWindowsKeyState* m_keyState; + // keyboard stuff + XWindowsKeyState* m_keyState; - // hot key stuff - HotKeyMap m_hotKeys; - HotKeyIDList m_oldHotKeyIDs; - HotKeyToIDMap m_hotKeyToIDMap; + // hot key stuff + HotKeyMap m_hotKeys; + HotKeyIDList m_oldHotKeyIDs; + HotKeyToIDMap m_hotKeyToIDMap; - // input focus stuff - Window m_lastFocus; - int m_lastFocusRevert; + // input focus stuff + Window m_lastFocus; + int m_lastFocusRevert; - // input method stuff - XIM m_im; - XIC m_ic; - KeyCode m_lastKeycode; - FilteredKeycodes m_filtered; + // input method stuff + XIM m_im; + XIC m_ic; + KeyCode m_lastKeycode; + FilteredKeycodes m_filtered; - // clipboards - XWindowsClipboard* m_clipboard[kClipboardEnd]; - UInt32 m_sequenceNumber; + // clipboards + XWindowsClipboard* m_clipboard[kClipboardEnd]; + UInt32 m_sequenceNumber; - // screen saver stuff - XWindowsScreenSaver* m_screensaver; - bool m_screensaverNotify; + // screen saver stuff + XWindowsScreenSaver* m_screensaver; + bool m_screensaverNotify; - // logical to physical button mapping. m_buttons[i] gives the - // physical button for logical button i+1. - std::vector m_buttons; + // logical to physical button mapping. m_buttons[i] gives the + // physical button for logical button i+1. + std::vector m_buttons; - // true if global auto-repeat was enabled before we turned it off - bool m_autoRepeat; + // true if global auto-repeat was enabled before we turned it off + bool m_autoRepeat; - // stuff to workaround xtest being xinerama unaware. attempting - // to fake a mouse motion under xinerama may behave strangely, - // especially if screen 0 is not at 0,0 or if faking a motion on - // a screen other than screen 0. - bool m_xtestIsXineramaUnaware; - bool m_xinerama; + // stuff to workaround xtest being xinerama unaware. attempting + // to fake a mouse motion under xinerama may behave strangely, + // especially if screen 0 is not at 0,0 or if faking a motion on + // a screen other than screen 0. + bool m_xtestIsXineramaUnaware; + bool m_xinerama; - // stuff to work around lost focus issues on certain systems - // (ie: a MythTV front-end). - bool m_preserveFocus; + // stuff to work around lost focus issues on certain systems + // (ie: a MythTV front-end). + bool m_preserveFocus; - // XKB extension stuff - bool m_xkb; - int m_xkbEventBase; + // XKB extension stuff + bool m_xkb; + int m_xkbEventBase; - bool m_xi2detected; + bool m_xi2detected; - // XRandR extension stuff - bool m_xrandr; - int m_xrandrEventBase; + // XRandR extension stuff + bool m_xrandr; + int m_xrandrEventBase; - IEventQueue* m_events; - synergy::KeyMap m_keyMap; + IEventQueue* m_events; + synergy::KeyMap m_keyMap; - // pointer to (singleton) screen. this is only needed by - // ioErrorHandler(). - static XWindowsScreen* s_screen; + // pointer to (singleton) screen. this is only needed by + // ioErrorHandler(). + static XWindowsScreen* s_screen; }; diff --git a/src/lib/platform/XWindowsScreenSaver.cpp b/src/lib/platform/XWindowsScreenSaver.cpp index 6e3ad9c6..239ddc14 100644 --- a/src/lib/platform/XWindowsScreenSaver.cpp +++ b/src/lib/platform/XWindowsScreenSaver.cpp @@ -27,30 +27,30 @@ #include #if HAVE_X11_EXTENSIONS_XTEST_H -# include +# include #else -# error The XTest extension is required to build synergy +# error The XTest extension is required to build synergy #endif #if HAVE_X11_EXTENSIONS_DPMS_H extern "C" { -# include -# include -# if !HAVE_DPMS_PROTOTYPES -# undef DPMSModeOn -# undef DPMSModeStandby -# undef DPMSModeSuspend -# undef DPMSModeOff -# define DPMSModeOn 0 -# define DPMSModeStandby 1 -# define DPMSModeSuspend 2 -# define DPMSModeOff 3 +# include +# include +# if !HAVE_DPMS_PROTOTYPES +# undef DPMSModeOn +# undef DPMSModeStandby +# undef DPMSModeSuspend +# undef DPMSModeOff +# define DPMSModeOn 0 +# define DPMSModeStandby 1 +# define DPMSModeSuspend 2 +# define DPMSModeOff 3 extern Bool DPMSQueryExtension(Display *, int *, int *); extern Bool DPMSCapable(Display *); extern Status DPMSEnable(Display *); extern Status DPMSDisable(Display *); extern Status DPMSForceLevel(Display *, CARD16); extern Status DPMSInfo(Display *, CARD16 *, BOOL *); -# endif +# endif } #endif @@ -59,497 +59,497 @@ extern Status DPMSInfo(Display *, CARD16 *, BOOL *); // XWindowsScreenSaver::XWindowsScreenSaver( - Display* display, Window window, void* eventTarget, IEventQueue* events) : - m_display(display), - m_xscreensaverSink(window), - m_eventTarget(eventTarget), - m_xscreensaver(None), - m_xscreensaverActive(false), - m_dpms(false), - m_disabled(false), - m_suppressDisable(false), - m_disableTimer(NULL), - m_disablePos(0), - m_events(events) + Display* display, Window window, void* eventTarget, IEventQueue* events) : + m_display(display), + m_xscreensaverSink(window), + m_eventTarget(eventTarget), + m_xscreensaver(None), + m_xscreensaverActive(false), + m_dpms(false), + m_disabled(false), + m_suppressDisable(false), + m_disableTimer(NULL), + m_disablePos(0), + m_events(events) { - // get atoms - m_atomScreenSaver = XInternAtom(m_display, - "SCREENSAVER", False); - m_atomScreenSaverVersion = XInternAtom(m_display, - "_SCREENSAVER_VERSION", False); - m_atomScreenSaverActivate = XInternAtom(m_display, - "ACTIVATE", False); - m_atomScreenSaverDeactivate = XInternAtom(m_display, - "DEACTIVATE", False); + // get atoms + m_atomScreenSaver = XInternAtom(m_display, + "SCREENSAVER", False); + m_atomScreenSaverVersion = XInternAtom(m_display, + "_SCREENSAVER_VERSION", False); + m_atomScreenSaverActivate = XInternAtom(m_display, + "ACTIVATE", False); + m_atomScreenSaverDeactivate = XInternAtom(m_display, + "DEACTIVATE", False); - // check for DPMS extension. this is an alternative screen saver - // that powers down the display. + // check for DPMS extension. this is an alternative screen saver + // that powers down the display. #if HAVE_X11_EXTENSIONS_DPMS_H - int eventBase, errorBase; - if (DPMSQueryExtension(m_display, &eventBase, &errorBase)) { - if (DPMSCapable(m_display)) { - // we have DPMS - m_dpms = true; - } - } + int eventBase, errorBase; + if (DPMSQueryExtension(m_display, &eventBase, &errorBase)) { + if (DPMSCapable(m_display)) { + // we have DPMS + m_dpms = true; + } + } #endif - // watch top-level windows for changes - bool error = false; - { - XWindowsUtil::ErrorLock lock(m_display, &error); - Window root = DefaultRootWindow(m_display); - XWindowAttributes attr; - XGetWindowAttributes(m_display, root, &attr); - m_rootEventMask = attr.your_event_mask; - XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); - } - if (error) { - LOG((CLOG_DEBUG "didn't set root event mask")); - m_rootEventMask = 0; - } + // watch top-level windows for changes + bool error = false; + { + XWindowsUtil::ErrorLock lock(m_display, &error); + Window root = DefaultRootWindow(m_display); + XWindowAttributes attr; + XGetWindowAttributes(m_display, root, &attr); + m_rootEventMask = attr.your_event_mask; + XSelectInput(m_display, root, m_rootEventMask | SubstructureNotifyMask); + } + if (error) { + LOG((CLOG_DEBUG "didn't set root event mask")); + m_rootEventMask = 0; + } - // get the built-in settings - XGetScreenSaver(m_display, &m_timeout, &m_interval, - &m_preferBlanking, &m_allowExposures); + // get the built-in settings + XGetScreenSaver(m_display, &m_timeout, &m_interval, + &m_preferBlanking, &m_allowExposures); - // get the DPMS settings - m_dpmsEnabled = isDPMSEnabled(); + // get the DPMS settings + m_dpmsEnabled = isDPMSEnabled(); - // get the xscreensaver window, if any - if (!findXScreenSaver()) { - setXScreenSaver(None); - } + // get the xscreensaver window, if any + if (!findXScreenSaver()) { + setXScreenSaver(None); + } - // install disable timer event handler - m_events->adoptHandler(Event::kTimer, this, - new TMethodEventJob(this, - &XWindowsScreenSaver::handleDisableTimer)); + // install disable timer event handler + m_events->adoptHandler(Event::kTimer, this, + new TMethodEventJob(this, + &XWindowsScreenSaver::handleDisableTimer)); } XWindowsScreenSaver::~XWindowsScreenSaver() { - // done with disable job - if (m_disableTimer != NULL) { - m_events->deleteTimer(m_disableTimer); - } - m_events->removeHandler(Event::kTimer, this); + // done with disable job + if (m_disableTimer != NULL) { + m_events->deleteTimer(m_disableTimer); + } + m_events->removeHandler(Event::kTimer, this); - if (m_display != NULL) { - enableDPMS(m_dpmsEnabled); - XSetScreenSaver(m_display, m_timeout, m_interval, - m_preferBlanking, m_allowExposures); - clearWatchForXScreenSaver(); - XWindowsUtil::ErrorLock lock(m_display); - XSelectInput(m_display, DefaultRootWindow(m_display), m_rootEventMask); - } + if (m_display != NULL) { + enableDPMS(m_dpmsEnabled); + XSetScreenSaver(m_display, m_timeout, m_interval, + m_preferBlanking, m_allowExposures); + clearWatchForXScreenSaver(); + XWindowsUtil::ErrorLock lock(m_display); + XSelectInput(m_display, DefaultRootWindow(m_display), m_rootEventMask); + } } void XWindowsScreenSaver::destroy() { - m_display = NULL; - delete this; + m_display = NULL; + delete this; } bool XWindowsScreenSaver::handleXEvent(const XEvent* xevent) { - switch (xevent->type) { - case CreateNotify: - if (m_xscreensaver == None) { - if (isXScreenSaver(xevent->xcreatewindow.window)) { - // found the xscreensaver - setXScreenSaver(xevent->xcreatewindow.window); - } - else { - // another window to watch. to detect the xscreensaver - // window we look for a property but that property may - // not yet exist by the time we get this event so we - // have to watch the window for property changes. - // this would be so much easier if xscreensaver did the - // smart thing and stored its window in a property on - // the root window. - addWatchXScreenSaver(xevent->xcreatewindow.window); - } - } - break; + switch (xevent->type) { + case CreateNotify: + if (m_xscreensaver == None) { + if (isXScreenSaver(xevent->xcreatewindow.window)) { + // found the xscreensaver + setXScreenSaver(xevent->xcreatewindow.window); + } + else { + // another window to watch. to detect the xscreensaver + // window we look for a property but that property may + // not yet exist by the time we get this event so we + // have to watch the window for property changes. + // this would be so much easier if xscreensaver did the + // smart thing and stored its window in a property on + // the root window. + addWatchXScreenSaver(xevent->xcreatewindow.window); + } + } + break; - case DestroyNotify: - if (xevent->xdestroywindow.window == m_xscreensaver) { - // xscreensaver is gone - LOG((CLOG_DEBUG "xscreensaver died")); - setXScreenSaver(None); - return true; - } - break; + case DestroyNotify: + if (xevent->xdestroywindow.window == m_xscreensaver) { + // xscreensaver is gone + LOG((CLOG_DEBUG "xscreensaver died")); + setXScreenSaver(None); + return true; + } + break; - case PropertyNotify: - if (xevent->xproperty.state == PropertyNewValue) { - if (isXScreenSaver(xevent->xproperty.window)) { - // found the xscreensaver - setXScreenSaver(xevent->xcreatewindow.window); - } - } - break; + case PropertyNotify: + if (xevent->xproperty.state == PropertyNewValue) { + if (isXScreenSaver(xevent->xproperty.window)) { + // found the xscreensaver + setXScreenSaver(xevent->xcreatewindow.window); + } + } + break; - case MapNotify: - if (xevent->xmap.window == m_xscreensaver) { - // xscreensaver has activated - setXScreenSaverActive(true); - return true; - } - break; + case MapNotify: + if (xevent->xmap.window == m_xscreensaver) { + // xscreensaver has activated + setXScreenSaverActive(true); + return true; + } + break; - case UnmapNotify: - if (xevent->xunmap.window == m_xscreensaver) { - // xscreensaver has deactivated - setXScreenSaverActive(false); - return true; - } - break; - } + case UnmapNotify: + if (xevent->xunmap.window == m_xscreensaver) { + // xscreensaver has deactivated + setXScreenSaverActive(false); + return true; + } + break; + } - return false; + return false; } void XWindowsScreenSaver::enable() { - // for xscreensaver - m_disabled = false; - updateDisableTimer(); + // for xscreensaver + m_disabled = false; + updateDisableTimer(); - // for built-in X screen saver - XSetScreenSaver(m_display, m_timeout, m_interval, - m_preferBlanking, m_allowExposures); + // for built-in X screen saver + XSetScreenSaver(m_display, m_timeout, m_interval, + m_preferBlanking, m_allowExposures); - // for DPMS - enableDPMS(m_dpmsEnabled); + // for DPMS + enableDPMS(m_dpmsEnabled); } void XWindowsScreenSaver::disable() { - // for xscreensaver - m_disabled = true; - updateDisableTimer(); + // for xscreensaver + m_disabled = true; + updateDisableTimer(); - // use built-in X screen saver - XGetScreenSaver(m_display, &m_timeout, &m_interval, - &m_preferBlanking, &m_allowExposures); - XSetScreenSaver(m_display, 0, m_interval, - m_preferBlanking, m_allowExposures); + // use built-in X screen saver + XGetScreenSaver(m_display, &m_timeout, &m_interval, + &m_preferBlanking, &m_allowExposures); + XSetScreenSaver(m_display, 0, m_interval, + m_preferBlanking, m_allowExposures); - // for DPMS - m_dpmsEnabled = isDPMSEnabled(); - enableDPMS(false); + // for DPMS + m_dpmsEnabled = isDPMSEnabled(); + enableDPMS(false); - // FIXME -- now deactivate? + // FIXME -- now deactivate? } void XWindowsScreenSaver::activate() { - // remove disable job timer - m_suppressDisable = true; - updateDisableTimer(); + // remove disable job timer + m_suppressDisable = true; + updateDisableTimer(); - // enable DPMS if it was enabled - enableDPMS(m_dpmsEnabled); + // enable DPMS if it was enabled + enableDPMS(m_dpmsEnabled); - // try xscreensaver - findXScreenSaver(); - if (m_xscreensaver != None) { - sendXScreenSaverCommand(m_atomScreenSaverActivate); - return; - } + // try xscreensaver + findXScreenSaver(); + if (m_xscreensaver != None) { + sendXScreenSaverCommand(m_atomScreenSaverActivate); + return; + } - // try built-in X screen saver - if (m_timeout != 0) { - XForceScreenSaver(m_display, ScreenSaverActive); - } + // try built-in X screen saver + if (m_timeout != 0) { + XForceScreenSaver(m_display, ScreenSaverActive); + } - // try DPMS - activateDPMS(true); + // try DPMS + activateDPMS(true); } void XWindowsScreenSaver::deactivate() { - // reinstall disable job timer - m_suppressDisable = false; - updateDisableTimer(); + // reinstall disable job timer + m_suppressDisable = false; + updateDisableTimer(); - // try DPMS - activateDPMS(false); + // try DPMS + activateDPMS(false); - // disable DPMS if screen saver is disabled - if (m_disabled) { - enableDPMS(false); - } + // disable DPMS if screen saver is disabled + if (m_disabled) { + enableDPMS(false); + } - // try xscreensaver - findXScreenSaver(); - if (m_xscreensaver != None) { - sendXScreenSaverCommand(m_atomScreenSaverDeactivate); - return; - } + // try xscreensaver + findXScreenSaver(); + if (m_xscreensaver != None) { + sendXScreenSaverCommand(m_atomScreenSaverDeactivate); + return; + } - // use built-in X screen saver - XForceScreenSaver(m_display, ScreenSaverReset); + // use built-in X screen saver + XForceScreenSaver(m_display, ScreenSaverReset); } bool XWindowsScreenSaver::isActive() const { - // check xscreensaver - if (m_xscreensaver != None) { - return m_xscreensaverActive; - } + // check xscreensaver + if (m_xscreensaver != None) { + return m_xscreensaverActive; + } - // check DPMS - if (isDPMSActivated()) { - return true; - } + // check DPMS + if (isDPMSActivated()) { + return true; + } - // can't check built-in X screen saver activity - return false; + // can't check built-in X screen saver activity + return false; } bool XWindowsScreenSaver::findXScreenSaver() { - // do nothing if we've already got the xscreensaver window - if (m_xscreensaver == None) { - // find top-level window xscreensaver window - Window root = DefaultRootWindow(m_display); - Window rw, pw, *cw; - unsigned int nc; - if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { - for (unsigned int i = 0; i < nc; ++i) { - if (isXScreenSaver(cw[i])) { - setXScreenSaver(cw[i]); - break; - } - } - XFree(cw); - } - } + // do nothing if we've already got the xscreensaver window + if (m_xscreensaver == None) { + // find top-level window xscreensaver window + Window root = DefaultRootWindow(m_display); + Window rw, pw, *cw; + unsigned int nc; + if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { + for (unsigned int i = 0; i < nc; ++i) { + if (isXScreenSaver(cw[i])) { + setXScreenSaver(cw[i]); + break; + } + } + XFree(cw); + } + } - return (m_xscreensaver != None); + return (m_xscreensaver != None); } void XWindowsScreenSaver::setXScreenSaver(Window window) { - LOG((CLOG_DEBUG "xscreensaver window: 0x%08x", window)); + LOG((CLOG_DEBUG "xscreensaver window: 0x%08x", window)); - // save window - m_xscreensaver = window; + // save window + m_xscreensaver = window; - if (m_xscreensaver != None) { - // clear old watch list - clearWatchForXScreenSaver(); + if (m_xscreensaver != None) { + // clear old watch list + clearWatchForXScreenSaver(); - // see if xscreensaver is active - bool error = false; - XWindowAttributes attr; - { - XWindowsUtil::ErrorLock lock(m_display, &error); - XGetWindowAttributes(m_display, m_xscreensaver, &attr); - } - setXScreenSaverActive(!error && attr.map_state != IsUnmapped); + // see if xscreensaver is active + bool error = false; + XWindowAttributes attr; + { + XWindowsUtil::ErrorLock lock(m_display, &error); + XGetWindowAttributes(m_display, m_xscreensaver, &attr); + } + setXScreenSaverActive(!error && attr.map_state != IsUnmapped); - // save current DPMS state; xscreensaver may have changed it. - m_dpmsEnabled = isDPMSEnabled(); - } - else { - // screen saver can't be active if it doesn't exist - setXScreenSaverActive(false); + // save current DPMS state; xscreensaver may have changed it. + m_dpmsEnabled = isDPMSEnabled(); + } + else { + // screen saver can't be active if it doesn't exist + setXScreenSaverActive(false); - // start watching for xscreensaver - watchForXScreenSaver(); - } + // start watching for xscreensaver + watchForXScreenSaver(); + } } bool XWindowsScreenSaver::isXScreenSaver(Window w) const { - // check for m_atomScreenSaverVersion string property - Atom type; - return (XWindowsUtil::getWindowProperty(m_display, w, - m_atomScreenSaverVersion, - NULL, &type, NULL, False) && - type == XA_STRING); + // check for m_atomScreenSaverVersion string property + Atom type; + return (XWindowsUtil::getWindowProperty(m_display, w, + m_atomScreenSaverVersion, + NULL, &type, NULL, False) && + type == XA_STRING); } void XWindowsScreenSaver::setXScreenSaverActive(bool activated) { - if (m_xscreensaverActive != activated) { - LOG((CLOG_DEBUG "xscreensaver %s on window 0x%08x", activated ? "activated" : "deactivated", m_xscreensaver)); - m_xscreensaverActive = activated; + if (m_xscreensaverActive != activated) { + LOG((CLOG_DEBUG "xscreensaver %s on window 0x%08x", activated ? "activated" : "deactivated", m_xscreensaver)); + m_xscreensaverActive = activated; - // if screen saver was activated forcefully (i.e. against - // our will) then just accept it. don't try to keep it - // from activating since that'll just pop up the password - // dialog if locking is enabled. - m_suppressDisable = activated; - updateDisableTimer(); + // if screen saver was activated forcefully (i.e. against + // our will) then just accept it. don't try to keep it + // from activating since that'll just pop up the password + // dialog if locking is enabled. + m_suppressDisable = activated; + updateDisableTimer(); - if (activated) { - m_events->addEvent(Event( - m_events->forIPrimaryScreen().screensaverActivated(), - m_eventTarget)); - } - else { - m_events->addEvent(Event( - m_events->forIPrimaryScreen().screensaverDeactivated(), - m_eventTarget)); - } - } + if (activated) { + m_events->addEvent(Event( + m_events->forIPrimaryScreen().screensaverActivated(), + m_eventTarget)); + } + else { + m_events->addEvent(Event( + m_events->forIPrimaryScreen().screensaverDeactivated(), + m_eventTarget)); + } + } } void XWindowsScreenSaver::sendXScreenSaverCommand(Atom cmd, long arg1, long arg2) { - XEvent event; - event.xclient.type = ClientMessage; - event.xclient.display = m_display; - event.xclient.window = m_xscreensaverSink; - event.xclient.message_type = m_atomScreenSaver; - event.xclient.format = 32; - event.xclient.data.l[0] = static_cast(cmd); - event.xclient.data.l[1] = arg1; - event.xclient.data.l[2] = arg2; - event.xclient.data.l[3] = 0; - event.xclient.data.l[4] = 0; + XEvent event; + event.xclient.type = ClientMessage; + event.xclient.display = m_display; + event.xclient.window = m_xscreensaverSink; + event.xclient.message_type = m_atomScreenSaver; + event.xclient.format = 32; + event.xclient.data.l[0] = static_cast(cmd); + event.xclient.data.l[1] = arg1; + event.xclient.data.l[2] = arg2; + event.xclient.data.l[3] = 0; + event.xclient.data.l[4] = 0; - LOG((CLOG_DEBUG "send xscreensaver command: %d %d %d", (long)cmd, arg1, arg2)); - bool error = false; - { - XWindowsUtil::ErrorLock lock(m_display, &error); - XSendEvent(m_display, m_xscreensaver, False, 0, &event); - } - if (error) { - findXScreenSaver(); - } + LOG((CLOG_DEBUG "send xscreensaver command: %d %d %d", (long)cmd, arg1, arg2)); + bool error = false; + { + XWindowsUtil::ErrorLock lock(m_display, &error); + XSendEvent(m_display, m_xscreensaver, False, 0, &event); + } + if (error) { + findXScreenSaver(); + } } void XWindowsScreenSaver::watchForXScreenSaver() { - // clear old watch list - clearWatchForXScreenSaver(); + // clear old watch list + clearWatchForXScreenSaver(); - // add every child of the root to the list of windows to watch - Window root = DefaultRootWindow(m_display); - Window rw, pw, *cw; - unsigned int nc; - if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { - for (unsigned int i = 0; i < nc; ++i) { - addWatchXScreenSaver(cw[i]); - } - XFree(cw); - } + // add every child of the root to the list of windows to watch + Window root = DefaultRootWindow(m_display); + Window rw, pw, *cw; + unsigned int nc; + if (XQueryTree(m_display, root, &rw, &pw, &cw, &nc)) { + for (unsigned int i = 0; i < nc; ++i) { + addWatchXScreenSaver(cw[i]); + } + XFree(cw); + } - // now check for xscreensaver window in case it set the property - // before we could request property change events. - if (findXScreenSaver()) { - // found it so clear out our watch list - clearWatchForXScreenSaver(); - } + // now check for xscreensaver window in case it set the property + // before we could request property change events. + if (findXScreenSaver()) { + // found it so clear out our watch list + clearWatchForXScreenSaver(); + } } void XWindowsScreenSaver::clearWatchForXScreenSaver() { - // stop watching all windows - XWindowsUtil::ErrorLock lock(m_display); - for (WatchList::iterator index = m_watchWindows.begin(); - index != m_watchWindows.end(); ++index) { - XSelectInput(m_display, index->first, index->second); - } - m_watchWindows.clear(); + // stop watching all windows + XWindowsUtil::ErrorLock lock(m_display); + for (WatchList::iterator index = m_watchWindows.begin(); + index != m_watchWindows.end(); ++index) { + XSelectInput(m_display, index->first, index->second); + } + m_watchWindows.clear(); } void XWindowsScreenSaver::addWatchXScreenSaver(Window window) { - // get window attributes - bool error = false; - XWindowAttributes attr; - { - XWindowsUtil::ErrorLock lock(m_display, &error); - XGetWindowAttributes(m_display, window, &attr); - } + // get window attributes + bool error = false; + XWindowAttributes attr; + { + XWindowsUtil::ErrorLock lock(m_display, &error); + XGetWindowAttributes(m_display, window, &attr); + } - // if successful and window uses override_redirect (like xscreensaver - // does) then watch it for property changes. - if (!error && attr.override_redirect == True) { - error = false; - { - XWindowsUtil::ErrorLock lock(m_display, &error); - XSelectInput(m_display, window, - attr.your_event_mask | PropertyChangeMask); - } - if (!error) { - // if successful then add the window to our list - m_watchWindows.insert(std::make_pair(window, attr.your_event_mask)); - } - } + // if successful and window uses override_redirect (like xscreensaver + // does) then watch it for property changes. + if (!error && attr.override_redirect == True) { + error = false; + { + XWindowsUtil::ErrorLock lock(m_display, &error); + XSelectInput(m_display, window, + attr.your_event_mask | PropertyChangeMask); + } + if (!error) { + // if successful then add the window to our list + m_watchWindows.insert(std::make_pair(window, attr.your_event_mask)); + } + } } void XWindowsScreenSaver::updateDisableTimer() { - if (m_disabled && !m_suppressDisable && m_disableTimer == NULL) { - // 5 seconds should be plenty often to suppress the screen saver - m_disableTimer = m_events->newTimer(5.0, this); - } - else if ((!m_disabled || m_suppressDisable) && m_disableTimer != NULL) { - m_events->deleteTimer(m_disableTimer); - m_disableTimer = NULL; - } + if (m_disabled && !m_suppressDisable && m_disableTimer == NULL) { + // 5 seconds should be plenty often to suppress the screen saver + m_disableTimer = m_events->newTimer(5.0, this); + } + else if ((!m_disabled || m_suppressDisable) && m_disableTimer != NULL) { + m_events->deleteTimer(m_disableTimer); + m_disableTimer = NULL; + } } void XWindowsScreenSaver::handleDisableTimer(const Event&, void*) { - // send fake mouse motion directly to xscreensaver - if (m_xscreensaver != None) { - XEvent event; - event.xmotion.type = MotionNotify; - event.xmotion.display = m_display; - event.xmotion.window = m_xscreensaver; - event.xmotion.root = DefaultRootWindow(m_display); - event.xmotion.subwindow = None; - event.xmotion.time = CurrentTime; - event.xmotion.x = m_disablePos; - event.xmotion.y = 0; - event.xmotion.x_root = m_disablePos; - event.xmotion.y_root = 0; - event.xmotion.state = 0; - event.xmotion.is_hint = NotifyNormal; - event.xmotion.same_screen = True; + // send fake mouse motion directly to xscreensaver + if (m_xscreensaver != None) { + XEvent event; + event.xmotion.type = MotionNotify; + event.xmotion.display = m_display; + event.xmotion.window = m_xscreensaver; + event.xmotion.root = DefaultRootWindow(m_display); + event.xmotion.subwindow = None; + event.xmotion.time = CurrentTime; + event.xmotion.x = m_disablePos; + event.xmotion.y = 0; + event.xmotion.x_root = m_disablePos; + event.xmotion.y_root = 0; + event.xmotion.state = 0; + event.xmotion.is_hint = NotifyNormal; + event.xmotion.same_screen = True; - XWindowsUtil::ErrorLock lock(m_display); - XSendEvent(m_display, m_xscreensaver, False, 0, &event); + XWindowsUtil::ErrorLock lock(m_display); + XSendEvent(m_display, m_xscreensaver, False, 0, &event); - m_disablePos = 20 - m_disablePos; - } + m_disablePos = 20 - m_disablePos; + } } void XWindowsScreenSaver::activateDPMS(bool activate) { #if HAVE_X11_EXTENSIONS_DPMS_H - if (m_dpms) { - // DPMSForceLevel will generate a BadMatch if DPMS is disabled - XWindowsUtil::ErrorLock lock(m_display); - DPMSForceLevel(m_display, activate ? DPMSModeStandby : DPMSModeOn); - } + if (m_dpms) { + // DPMSForceLevel will generate a BadMatch if DPMS is disabled + XWindowsUtil::ErrorLock lock(m_display); + DPMSForceLevel(m_display, activate ? DPMSModeStandby : DPMSModeOn); + } #endif } @@ -557,14 +557,14 @@ void XWindowsScreenSaver::enableDPMS(bool enable) { #if HAVE_X11_EXTENSIONS_DPMS_H - if (m_dpms) { - if (enable) { - DPMSEnable(m_display); - } - else { - DPMSDisable(m_display); - } - } + if (m_dpms) { + if (enable) { + DPMSEnable(m_display); + } + else { + DPMSDisable(m_display); + } + } #endif } @@ -572,17 +572,17 @@ bool XWindowsScreenSaver::isDPMSEnabled() const { #if HAVE_X11_EXTENSIONS_DPMS_H - if (m_dpms) { - CARD16 level; - BOOL state; - DPMSInfo(m_display, &level, &state); - return (state != False); - } - else { - return false; - } + if (m_dpms) { + CARD16 level; + BOOL state; + DPMSInfo(m_display, &level, &state); + return (state != False); + } + else { + return false; + } #else - return false; + return false; #endif } @@ -590,16 +590,16 @@ bool XWindowsScreenSaver::isDPMSActivated() const { #if HAVE_X11_EXTENSIONS_DPMS_H - if (m_dpms) { - CARD16 level; - BOOL state; - DPMSInfo(m_display, &level, &state); - return (level != DPMSModeOn); - } - else { - return false; - } + if (m_dpms) { + CARD16 level; + BOOL state; + DPMSInfo(m_display, &level, &state); + return (level != DPMSModeOn); + } + else { + return false; + } #else - return false; + return false; #endif } diff --git a/src/lib/platform/XWindowsScreenSaver.h b/src/lib/platform/XWindowsScreenSaver.h index 297eb6f0..1b3b0928 100644 --- a/src/lib/platform/XWindowsScreenSaver.h +++ b/src/lib/platform/XWindowsScreenSaver.h @@ -23,9 +23,9 @@ #include "common/stdmap.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include +# include #endif class Event; @@ -34,136 +34,136 @@ class EventQueueTimer; //! X11 screen saver implementation class XWindowsScreenSaver : public IScreenSaver { public: - XWindowsScreenSaver(Display*, Window, void* eventTarget, IEventQueue* events); - virtual ~XWindowsScreenSaver(); + XWindowsScreenSaver(Display*, Window, void* eventTarget, IEventQueue* events); + virtual ~XWindowsScreenSaver(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Event filtering - /*! - Should be called for each system event before event translation and - dispatch. Returns true to skip translation and dispatch. - */ - bool handleXEvent(const XEvent*); + //! Event filtering + /*! + Should be called for each system event before event translation and + dispatch. Returns true to skip translation and dispatch. + */ + bool handleXEvent(const XEvent*); - //! Destroy without the display - /*! - Tells this object to delete itself without using the X11 display. - It may leak some resources as a result. - */ - void destroy(); + //! Destroy without the display + /*! + Tells this object to delete itself without using the X11 display. + It may leak some resources as a result. + */ + void destroy(); - //@} + //@} - // IScreenSaver overrides - virtual void enable(); - virtual void disable(); - virtual void activate(); - virtual void deactivate(); - virtual bool isActive() const; + // IScreenSaver overrides + virtual void enable(); + virtual void disable(); + virtual void activate(); + virtual void deactivate(); + virtual bool isActive() const; private: - // find and set the running xscreensaver's window. returns true iff - // found. - bool findXScreenSaver(); + // find and set the running xscreensaver's window. returns true iff + // found. + bool findXScreenSaver(); - // set the xscreensaver's window, updating the activation state flag - void setXScreenSaver(Window); + // set the xscreensaver's window, updating the activation state flag + void setXScreenSaver(Window); - // returns true if the window appears to be the xscreensaver window - bool isXScreenSaver(Window) const; + // returns true if the window appears to be the xscreensaver window + bool isXScreenSaver(Window) const; - // set xscreensaver's activation state flag. sends notification - // if the state has changed. - void setXScreenSaverActive(bool activated); + // set xscreensaver's activation state flag. sends notification + // if the state has changed. + void setXScreenSaverActive(bool activated); - // send a command to xscreensaver - void sendXScreenSaverCommand(Atom, long = 0, long = 0); + // send a command to xscreensaver + void sendXScreenSaverCommand(Atom, long = 0, long = 0); - // watch all windows that could potentially be the xscreensaver for - // the events that will confirm it. - void watchForXScreenSaver(); + // watch all windows that could potentially be the xscreensaver for + // the events that will confirm it. + void watchForXScreenSaver(); - // stop watching all watched windows - void clearWatchForXScreenSaver(); + // stop watching all watched windows + void clearWatchForXScreenSaver(); - // add window to the watch list - void addWatchXScreenSaver(Window window); + // add window to the watch list + void addWatchXScreenSaver(Window window); - // install/uninstall the job used to suppress the screensaver - void updateDisableTimer(); + // install/uninstall the job used to suppress the screensaver + void updateDisableTimer(); - // called periodically to prevent the screen saver from starting - void handleDisableTimer(const Event&, void*); + // called periodically to prevent the screen saver from starting + void handleDisableTimer(const Event&, void*); - // force DPMS to activate or deactivate - void activateDPMS(bool activate); + // force DPMS to activate or deactivate + void activateDPMS(bool activate); - // enable/disable DPMS screen saver - void enableDPMS(bool); + // enable/disable DPMS screen saver + void enableDPMS(bool); - // check if DPMS is enabled - bool isDPMSEnabled() const; + // check if DPMS is enabled + bool isDPMSEnabled() const; - // check if DPMS is activate - bool isDPMSActivated() const; + // check if DPMS is activate + bool isDPMSActivated() const; private: - typedef std::map WatchList; + typedef std::map WatchList; - // the X display - Display* m_display; + // the X display + Display* m_display; - // window to receive xscreensaver repsonses - Window m_xscreensaverSink; + // window to receive xscreensaver repsonses + Window m_xscreensaverSink; - // the target for the events we generate - void* m_eventTarget; + // the target for the events we generate + void* m_eventTarget; - // xscreensaver's window - Window m_xscreensaver; + // xscreensaver's window + Window m_xscreensaver; - // xscreensaver activation state - bool m_xscreensaverActive; + // xscreensaver activation state + bool m_xscreensaverActive; - // old event mask on root window - long m_rootEventMask; + // old event mask on root window + long m_rootEventMask; - // potential xscreensaver windows being watched - WatchList m_watchWindows; + // potential xscreensaver windows being watched + WatchList m_watchWindows; - // atoms used to communicate with xscreensaver's window - Atom m_atomScreenSaver; - Atom m_atomScreenSaverVersion; - Atom m_atomScreenSaverActivate; - Atom m_atomScreenSaverDeactivate; + // atoms used to communicate with xscreensaver's window + Atom m_atomScreenSaver; + Atom m_atomScreenSaverVersion; + Atom m_atomScreenSaverActivate; + Atom m_atomScreenSaverDeactivate; - // built-in screen saver settings - int m_timeout; - int m_interval; - int m_preferBlanking; - int m_allowExposures; + // built-in screen saver settings + int m_timeout; + int m_interval; + int m_preferBlanking; + int m_allowExposures; - // DPMS screen saver settings - bool m_dpms; - bool m_dpmsEnabled; + // DPMS screen saver settings + bool m_dpms; + bool m_dpmsEnabled; - // true iff the client wants the screen saver suppressed - bool m_disabled; + // true iff the client wants the screen saver suppressed + bool m_disabled; - // true iff we're ignoring m_disabled. this is true, for example, - // when the client has called activate() and so presumably wants - // to activate the screen saver even if disabled. - bool m_suppressDisable; + // true iff we're ignoring m_disabled. this is true, for example, + // when the client has called activate() and so presumably wants + // to activate the screen saver even if disabled. + bool m_suppressDisable; - // the disable timer (NULL if not installed) - EventQueueTimer* m_disableTimer; + // the disable timer (NULL if not installed) + EventQueueTimer* m_disableTimer; - // fake mouse motion position for suppressing the screen saver. - // xscreensaver since 2.21 requires the mouse to move more than 10 - // pixels to be considered significant. - SInt32 m_disablePos; + // fake mouse motion position for suppressing the screen saver. + // xscreensaver since 2.21 requires the mouse to move more than 10 + // pixels to be considered significant. + SInt32 m_disablePos; - IEventQueue* m_events; + IEventQueue* m_events; }; diff --git a/src/lib/platform/XWindowsUtil.cpp b/src/lib/platform/XWindowsUtil.cpp index 10b35096..cfef8cf4 100644 --- a/src/lib/platform/XWindowsUtil.cpp +++ b/src/lib/platform/XWindowsUtil.cpp @@ -77,8 +77,8 @@ */ struct codepair { - KeySym keysym; - UInt32 ucs4; + KeySym keysym; + UInt32 ucs4; } s_keymap[] = { { XK_Aogonek, 0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */ { XK_breve, 0x02d8 }, /* BREVE */ @@ -1250,39 +1250,39 @@ XK_uhorn // map "Internet" keys to KeyIDs static const KeySym s_map1008FF[] = { - /* 0x00 */ 0, 0, kKeyBrightnessUp, kKeyBrightnessDown, 0, 0, 0, 0, - /* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp, - /* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext, - /* 0x18 */ kKeyWWWHome, kKeyAppMail, 0, kKeyWWWSearch, 0, 0, 0, 0, - /* 0x20 */ 0, 0, 0, 0, 0, 0, kKeyWWWBack, kKeyWWWForward, - /* 0x28 */ kKeyWWWStop, kKeyWWWRefresh, 0, 0, kKeyEject, 0, 0, 0, - /* 0x30 */ kKeyWWWFavorites, 0, kKeyAppMedia, 0, 0, 0, 0, 0, - /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x40 */ kKeyAppUser1, kKeyAppUser2, 0, 0, 0, 0, 0, 0, - /* 0x48 */ 0, 0, kKeyMissionControl, kKeyLaunchpad, 0, 0, 0, 0, - /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x58 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x68 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x88 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0x98 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xa8 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xb8 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xc8 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xd8 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xe8 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, - /* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0 + /* 0x00 */ 0, 0, kKeyBrightnessUp, kKeyBrightnessDown, 0, 0, 0, 0, + /* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp, + /* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext, + /* 0x18 */ kKeyWWWHome, kKeyAppMail, 0, kKeyWWWSearch, 0, 0, 0, 0, + /* 0x20 */ 0, 0, 0, 0, 0, 0, kKeyWWWBack, kKeyWWWForward, + /* 0x28 */ kKeyWWWStop, kKeyWWWRefresh, 0, 0, kKeyEject, 0, 0, 0, + /* 0x30 */ kKeyWWWFavorites, 0, kKeyAppMedia, 0, 0, 0, 0, 0, + /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x40 */ kKeyAppUser1, kKeyAppUser2, 0, 0, 0, 0, 0, 0, + /* 0x48 */ 0, 0, kKeyMissionControl, kKeyLaunchpad, 0, 0, 0, 0, + /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x58 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x68 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x88 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0x98 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xa8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xb8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xc8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xd8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xe8 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0, + /* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0 }; @@ -1290,424 +1290,424 @@ static const KeySym s_map1008FF[] = // XWindowsUtil // -XWindowsUtil::KeySymMap XWindowsUtil::s_keySymToUCS4; +XWindowsUtil::KeySymMap XWindowsUtil::s_keySymToUCS4; bool XWindowsUtil::getWindowProperty(Display* display, Window window, - Atom property, String* data, Atom* type, - SInt32* format, bool deleteProperty) + Atom property, String* data, Atom* type, + SInt32* format, bool deleteProperty) { - assert(display != NULL); + assert(display != NULL); - Atom actualType; - int actualDatumSize; + Atom actualType; + int actualDatumSize; - // ignore errors. XGetWindowProperty() will report failure. - XWindowsUtil::ErrorLock lock(display); + // ignore errors. XGetWindowProperty() will report failure. + XWindowsUtil::ErrorLock lock(display); - // read the property - bool okay = true; - const long length = XMaxRequestSize(display); - long offset = 0; - unsigned long bytesLeft = 1; - while (bytesLeft != 0) { - // get more data - unsigned long numItems; - unsigned char* rawData; - if (XGetWindowProperty(display, window, property, - offset, length, False, AnyPropertyType, - &actualType, &actualDatumSize, - &numItems, &bytesLeft, &rawData) != Success || - actualType == None || actualDatumSize == 0) { - // failed - okay = false; - break; - } + // read the property + bool okay = true; + const long length = XMaxRequestSize(display); + long offset = 0; + unsigned long bytesLeft = 1; + while (bytesLeft != 0) { + // get more data + unsigned long numItems; + unsigned char* rawData; + if (XGetWindowProperty(display, window, property, + offset, length, False, AnyPropertyType, + &actualType, &actualDatumSize, + &numItems, &bytesLeft, &rawData) != Success || + actualType == None || actualDatumSize == 0) { + // failed + okay = false; + break; + } - // compute bytes read and advance offset - unsigned long numBytes; - switch (actualDatumSize) { - case 8: - default: - numBytes = numItems; - offset += numItems / 4; - break; + // compute bytes read and advance offset + unsigned long numBytes; + switch (actualDatumSize) { + case 8: + default: + numBytes = numItems; + offset += numItems / 4; + break; - case 16: - numBytes = 2 * numItems; - offset += numItems / 2; - break; + case 16: + numBytes = 2 * numItems; + offset += numItems / 2; + break; - case 32: - numBytes = 4 * numItems; - offset += numItems; - break; - } + case 32: + numBytes = 4 * numItems; + offset += numItems; + break; + } - // append data - if (data != NULL) { - data->append((char*)rawData, numBytes); - } - else { - // data is not required so don't try to get any more - bytesLeft = 0; - } + // append data + if (data != NULL) { + data->append((char*)rawData, numBytes); + } + else { + // data is not required so don't try to get any more + bytesLeft = 0; + } - // done with returned data - XFree(rawData); - } + // done with returned data + XFree(rawData); + } - // delete the property if requested - if (deleteProperty) { - XDeleteProperty(display, window, property); - } + // delete the property if requested + if (deleteProperty) { + XDeleteProperty(display, window, property); + } - // save property info - if (type != NULL) { - *type = actualType; - } - if (format != NULL) { - *format = static_cast(actualDatumSize); - } + // save property info + if (type != NULL) { + *type = actualType; + } + if (format != NULL) { + *format = static_cast(actualDatumSize); + } - if (okay) { - LOG((CLOG_DEBUG2 "read property %d on window 0x%08x: bytes=%d", property, window, (data == NULL) ? 0 : data->size())); - return true; - } - else { - LOG((CLOG_DEBUG2 "can't read property %d on window 0x%08x", property, window)); - return false; - } + if (okay) { + LOG((CLOG_DEBUG2 "read property %d on window 0x%08x: bytes=%d", property, window, (data == NULL) ? 0 : data->size())); + return true; + } + else { + LOG((CLOG_DEBUG2 "can't read property %d on window 0x%08x", property, window)); + return false; + } } bool XWindowsUtil::setWindowProperty(Display* display, Window window, - Atom property, const void* vdata, UInt32 size, - Atom type, SInt32 format) + Atom property, const void* vdata, UInt32 size, + Atom type, SInt32 format) { - const UInt32 length = 4 * XMaxRequestSize(display); - const unsigned char* data = static_cast(vdata); - UInt32 datumSize = static_cast(format / 8); - // format 32 on 64bit systems is 8 bytes not 4. - if (format == 32) { - datumSize = sizeof(Atom); - } + const UInt32 length = 4 * XMaxRequestSize(display); + const unsigned char* data = static_cast(vdata); + UInt32 datumSize = static_cast(format / 8); + // format 32 on 64bit systems is 8 bytes not 4. + if (format == 32) { + datumSize = sizeof(Atom); + } - // save errors - bool error = false; - XWindowsUtil::ErrorLock lock(display, &error); + // save errors + bool error = false; + XWindowsUtil::ErrorLock lock(display, &error); - // how much data to send in first chunk? - UInt32 chunkSize = size; - if (chunkSize > length) { - chunkSize = length; - } + // how much data to send in first chunk? + UInt32 chunkSize = size; + if (chunkSize > length) { + chunkSize = length; + } - // send first chunk - XChangeProperty(display, window, property, - type, format, PropModeReplace, - data, chunkSize / datumSize); + // send first chunk + XChangeProperty(display, window, property, + type, format, PropModeReplace, + data, chunkSize / datumSize); - // append remaining chunks - data += chunkSize; - size -= chunkSize; - while (!error && size > 0) { - chunkSize = size; - if (chunkSize > length) { - chunkSize = length; - } - XChangeProperty(display, window, property, - type, format, PropModeAppend, - data, chunkSize / datumSize); - data += chunkSize; - size -= chunkSize; - } + // append remaining chunks + data += chunkSize; + size -= chunkSize; + while (!error && size > 0) { + chunkSize = size; + if (chunkSize > length) { + chunkSize = length; + } + XChangeProperty(display, window, property, + type, format, PropModeAppend, + data, chunkSize / datumSize); + data += chunkSize; + size -= chunkSize; + } - return !error; + return !error; } Time XWindowsUtil::getCurrentTime(Display* display, Window window) { - XLockDisplay(display); - // select property events on window - XWindowAttributes attr; - XGetWindowAttributes(display, window, &attr); - XSelectInput(display, window, attr.your_event_mask | PropertyChangeMask); + XLockDisplay(display); + // select property events on window + XWindowAttributes attr; + XGetWindowAttributes(display, window, &attr); + XSelectInput(display, window, attr.your_event_mask | PropertyChangeMask); - // make a property name to receive dummy change - Atom atom = XInternAtom(display, "TIMESTAMP", False); + // make a property name to receive dummy change + Atom atom = XInternAtom(display, "TIMESTAMP", False); - // do a zero-length append to get the current time - unsigned char dummy; - XChangeProperty(display, window, atom, - XA_INTEGER, 8, - PropModeAppend, - &dummy, 0); + // do a zero-length append to get the current time + unsigned char dummy; + XChangeProperty(display, window, atom, + XA_INTEGER, 8, + PropModeAppend, + &dummy, 0); - // look for property notify events with the following - PropertyNotifyPredicateInfo filter; - filter.m_window = window; - filter.m_property = atom; + // look for property notify events with the following + PropertyNotifyPredicateInfo filter; + filter.m_window = window; + filter.m_property = atom; - // wait for reply - XEvent xevent; - XIfEvent(display, &xevent, &XWindowsUtil::propertyNotifyPredicate, - (XPointer)&filter); - assert(xevent.type == PropertyNotify); - assert(xevent.xproperty.window == window); - assert(xevent.xproperty.atom == atom); + // wait for reply + XEvent xevent; + XIfEvent(display, &xevent, &XWindowsUtil::propertyNotifyPredicate, + (XPointer)&filter); + assert(xevent.type == PropertyNotify); + assert(xevent.xproperty.window == window); + assert(xevent.xproperty.atom == atom); - // restore event mask - XSelectInput(display, window, attr.your_event_mask); - XUnlockDisplay(display); + // restore event mask + XSelectInput(display, window, attr.your_event_mask); + XUnlockDisplay(display); - return xevent.xproperty.time; + return xevent.xproperty.time; } KeyID XWindowsUtil::mapKeySymToKeyID(KeySym k) { - initKeyMaps(); + initKeyMaps(); - switch (k & 0xffffff00) { - case 0x0000: - // Latin-1 - return static_cast(k); + switch (k & 0xffffff00) { + case 0x0000: + // Latin-1 + return static_cast(k); - case 0xfe00: - // ISO 9995 Function and Modifier Keys - switch (k) { - case XK_ISO_Left_Tab: - return kKeyLeftTab; + case 0xfe00: + // ISO 9995 Function and Modifier Keys + switch (k) { + case XK_ISO_Left_Tab: + return kKeyLeftTab; - case XK_ISO_Level3_Shift: - return kKeyAltGr; + case XK_ISO_Level3_Shift: + return kKeyAltGr; #ifdef XK_ISO_Level5_Shift - case XK_ISO_Level5_Shift: - return XK_ISO_Level5_Shift; //FIXME: there is no "usual" key for this... + case XK_ISO_Level5_Shift: + return XK_ISO_Level5_Shift; //FIXME: there is no "usual" key for this... #endif - case XK_ISO_Next_Group: - return kKeyNextGroup; + case XK_ISO_Next_Group: + return kKeyNextGroup; - case XK_ISO_Prev_Group: - return kKeyPrevGroup; + case XK_ISO_Prev_Group: + return kKeyPrevGroup; - case XK_dead_grave: - return kKeyDeadGrave; + case XK_dead_grave: + return kKeyDeadGrave; - case XK_dead_acute: - return kKeyDeadAcute; + case XK_dead_acute: + return kKeyDeadAcute; - case XK_dead_circumflex: - return kKeyDeadCircumflex; + case XK_dead_circumflex: + return kKeyDeadCircumflex; - case XK_dead_tilde: - return kKeyDeadTilde; + case XK_dead_tilde: + return kKeyDeadTilde; - case XK_dead_macron: - return kKeyDeadMacron; + case XK_dead_macron: + return kKeyDeadMacron; - case XK_dead_breve: - return kKeyDeadBreve; + case XK_dead_breve: + return kKeyDeadBreve; - case XK_dead_abovedot: - return kKeyDeadAbovedot; + case XK_dead_abovedot: + return kKeyDeadAbovedot; - case XK_dead_diaeresis: - return kKeyDeadDiaeresis; + case XK_dead_diaeresis: + return kKeyDeadDiaeresis; - case XK_dead_abovering: - return kKeyDeadAbovering; + case XK_dead_abovering: + return kKeyDeadAbovering; - case XK_dead_doubleacute: - return kKeyDeadDoubleacute; + case XK_dead_doubleacute: + return kKeyDeadDoubleacute; - case XK_dead_caron: - return kKeyDeadCaron; + case XK_dead_caron: + return kKeyDeadCaron; - case XK_dead_cedilla: - return kKeyDeadCedilla; + case XK_dead_cedilla: + return kKeyDeadCedilla; - case XK_dead_ogonek: - return kKeyDeadOgonek; + case XK_dead_ogonek: + return kKeyDeadOgonek; - default: - return kKeyNone; - } + default: + return kKeyNone; + } - case 0xff00: - // MISCELLANY - return static_cast(k - 0xff00 + 0xef00); + case 0xff00: + // MISCELLANY + return static_cast(k - 0xff00 + 0xef00); - case 0x1008ff00: - // "Internet" keys - return s_map1008FF[k & 0xff]; + case 0x1008ff00: + // "Internet" keys + return s_map1008FF[k & 0xff]; - default: { - // lookup character in table - KeySymMap::const_iterator index = s_keySymToUCS4.find(k); - if (index != s_keySymToUCS4.end()) { - return static_cast(index->second); - } + default: { + // lookup character in table + KeySymMap::const_iterator index = s_keySymToUCS4.find(k); + if (index != s_keySymToUCS4.end()) { + return static_cast(index->second); + } - // unknown character - return kKeyNone; - } - } + // unknown character + return kKeyNone; + } + } } UInt32 XWindowsUtil::getModifierBitForKeySym(KeySym keysym) { - switch (keysym) { - case XK_Shift_L: - case XK_Shift_R: - return kKeyModifierBitShift; + switch (keysym) { + case XK_Shift_L: + case XK_Shift_R: + return kKeyModifierBitShift; - case XK_Control_L: - case XK_Control_R: - return kKeyModifierBitControl; + case XK_Control_L: + case XK_Control_R: + return kKeyModifierBitControl; - case XK_Alt_L: - case XK_Alt_R: - return kKeyModifierBitAlt; + case XK_Alt_L: + case XK_Alt_R: + return kKeyModifierBitAlt; - case XK_Meta_L: - case XK_Meta_R: - return kKeyModifierBitMeta; + case XK_Meta_L: + case XK_Meta_R: + return kKeyModifierBitMeta; - case XK_Super_L: - case XK_Super_R: - case XK_Hyper_L: - case XK_Hyper_R: - return kKeyModifierBitSuper; + case XK_Super_L: + case XK_Super_R: + case XK_Hyper_L: + case XK_Hyper_R: + return kKeyModifierBitSuper; - case XK_Mode_switch: - case XK_ISO_Level3_Shift: - return kKeyModifierBitAltGr; + case XK_Mode_switch: + case XK_ISO_Level3_Shift: + return kKeyModifierBitAltGr; #ifdef XK_ISO_Level5_Shift - case XK_ISO_Level5_Shift: - return kKeyModifierBitLevel5Lock; + case XK_ISO_Level5_Shift: + return kKeyModifierBitLevel5Lock; #endif - case XK_Caps_Lock: - return kKeyModifierBitCapsLock; + case XK_Caps_Lock: + return kKeyModifierBitCapsLock; - case XK_Num_Lock: - return kKeyModifierBitNumLock; + case XK_Num_Lock: + return kKeyModifierBitNumLock; - case XK_Scroll_Lock: - return kKeyModifierBitScrollLock; + case XK_Scroll_Lock: + return kKeyModifierBitScrollLock; - default: - return kKeyModifierBitNone; - } + default: + return kKeyModifierBitNone; + } } String XWindowsUtil::atomToString(Display* display, Atom atom) { - if (atom == 0) { - return "None"; - } + if (atom == 0) { + return "None"; + } - bool error = false; - XWindowsUtil::ErrorLock lock(display, &error); - char* name = XGetAtomName(display, atom); - if (error) { - return synergy::string::sprintf(" (%d)", (int)atom); - } - else { - String msg = synergy::string::sprintf("%s (%d)", name, (int)atom); - XFree(name); - return msg; - } + bool error = false; + XWindowsUtil::ErrorLock lock(display, &error); + char* name = XGetAtomName(display, atom); + if (error) { + return synergy::string::sprintf(" (%d)", (int)atom); + } + else { + String msg = synergy::string::sprintf("%s (%d)", name, (int)atom); + XFree(name); + return msg; + } } String XWindowsUtil::atomsToString(Display* display, const Atom* atom, UInt32 num) { - char** names = new char*[num]; - bool error = false; - XWindowsUtil::ErrorLock lock(display, &error); - XGetAtomNames(display, const_cast(atom), (int)num, names); - String msg; - if (error) { - for (UInt32 i = 0; i < num; ++i) { - msg += synergy::string::sprintf(" (%d), ", (int)atom[i]); - } - } - else { - for (UInt32 i = 0; i < num; ++i) { - msg += synergy::string::sprintf("%s (%d), ", names[i], (int)atom[i]); - XFree(names[i]); - } - } - delete[] names; - if (msg.size() > 2) { - msg.erase(msg.size() - 2); - } - return msg; + char** names = new char*[num]; + bool error = false; + XWindowsUtil::ErrorLock lock(display, &error); + XGetAtomNames(display, const_cast(atom), (int)num, names); + String msg; + if (error) { + for (UInt32 i = 0; i < num; ++i) { + msg += synergy::string::sprintf(" (%d), ", (int)atom[i]); + } + } + else { + for (UInt32 i = 0; i < num; ++i) { + msg += synergy::string::sprintf("%s (%d), ", names[i], (int)atom[i]); + XFree(names[i]); + } + } + delete[] names; + if (msg.size() > 2) { + msg.erase(msg.size() - 2); + } + return msg; } void XWindowsUtil::convertAtomProperty(String& data) { - // as best i can tell, 64-bit systems don't pack Atoms into properties - // as 32-bit numbers but rather as the 64-bit numbers they are. that - // seems wrong but we have to cope. sometimes we'll get a list of - // atoms that's 8*n+4 bytes long, missing the trailing 4 bytes which - // should all be 0. since we're going to reference the Atoms as - // 64-bit numbers we have to ensure the last number is a full 64 bits. - if (sizeof(Atom) != 4 && ((data.size() / 4) & 1) != 0) { - UInt32 zero = 0; - data.append(reinterpret_cast(&zero), sizeof(zero)); - } + // as best i can tell, 64-bit systems don't pack Atoms into properties + // as 32-bit numbers but rather as the 64-bit numbers they are. that + // seems wrong but we have to cope. sometimes we'll get a list of + // atoms that's 8*n+4 bytes long, missing the trailing 4 bytes which + // should all be 0. since we're going to reference the Atoms as + // 64-bit numbers we have to ensure the last number is a full 64 bits. + if (sizeof(Atom) != 4 && ((data.size() / 4) & 1) != 0) { + UInt32 zero = 0; + data.append(reinterpret_cast(&zero), sizeof(zero)); + } } void XWindowsUtil::appendAtomData(String& data, Atom atom) { - data.append(reinterpret_cast(&atom), sizeof(Atom)); + data.append(reinterpret_cast(&atom), sizeof(Atom)); } void XWindowsUtil::replaceAtomData(String& data, UInt32 index, Atom atom) { - data.replace(index * sizeof(Atom), sizeof(Atom), - reinterpret_cast(&atom), - sizeof(Atom)); + data.replace(index * sizeof(Atom), sizeof(Atom), + reinterpret_cast(&atom), + sizeof(Atom)); } void XWindowsUtil::appendTimeData(String& data, Time time) { - data.append(reinterpret_cast(&time), sizeof(Time)); + data.append(reinterpret_cast(&time), sizeof(Time)); } Bool XWindowsUtil::propertyNotifyPredicate(Display*, XEvent* xevent, XPointer arg) { - PropertyNotifyPredicateInfo* filter = - reinterpret_cast(arg); - return (xevent->type == PropertyNotify && - xevent->xproperty.window == filter->m_window && - xevent->xproperty.atom == filter->m_property && - xevent->xproperty.state == PropertyNewValue) ? True : False; + PropertyNotifyPredicateInfo* filter = + reinterpret_cast(arg); + return (xevent->type == PropertyNotify && + xevent->xproperty.window == filter->m_window && + xevent->xproperty.atom == filter->m_property && + xevent->xproperty.state == PropertyNewValue) ? True : False; } void XWindowsUtil::initKeyMaps() { - if (s_keySymToUCS4.empty()) { - for (size_t i =0; i < sizeof(s_keymap) / sizeof(s_keymap[0]); ++i) { - s_keySymToUCS4[s_keymap[i].keysym] = s_keymap[i].ucs4; - } - } + if (s_keySymToUCS4.empty()) { + for (size_t i =0; i < sizeof(s_keymap) / sizeof(s_keymap[0]); ++i) { + s_keySymToUCS4[s_keymap[i].keysym] = s_keymap[i].ucs4; + } + } } @@ -1715,74 +1715,74 @@ XWindowsUtil::initKeyMaps() // XWindowsUtil::ErrorLock // -XWindowsUtil::ErrorLock* XWindowsUtil::ErrorLock::s_top = NULL; +XWindowsUtil::ErrorLock* XWindowsUtil::ErrorLock::s_top = NULL; XWindowsUtil::ErrorLock::ErrorLock(Display* display) : - m_display(display) + m_display(display) { - install(&XWindowsUtil::ErrorLock::ignoreHandler, NULL); + install(&XWindowsUtil::ErrorLock::ignoreHandler, NULL); } XWindowsUtil::ErrorLock::ErrorLock(Display* display, bool* flag) : - m_display(display) + m_display(display) { - install(&XWindowsUtil::ErrorLock::saveHandler, flag); + install(&XWindowsUtil::ErrorLock::saveHandler, flag); } XWindowsUtil::ErrorLock::ErrorLock(Display* display, - ErrorHandler handler, void* data) : - m_display(display) + ErrorHandler handler, void* data) : + m_display(display) { - install(handler, data); + install(handler, data); } XWindowsUtil::ErrorLock::~ErrorLock() { - // make sure everything finishes before uninstalling handler - if (m_display != NULL) { - XSync(m_display, False); - } + // make sure everything finishes before uninstalling handler + if (m_display != NULL) { + XSync(m_display, False); + } - // restore old handler - XSetErrorHandler(m_oldXHandler); - s_top = m_next; + // restore old handler + XSetErrorHandler(m_oldXHandler); + s_top = m_next; } void XWindowsUtil::ErrorLock::install(ErrorHandler handler, void* data) { - // make sure everything finishes before installing handler - if (m_display != NULL) { - XSync(m_display, False); - } + // make sure everything finishes before installing handler + if (m_display != NULL) { + XSync(m_display, False); + } - // install handler - m_handler = handler; - m_userData = data; - m_oldXHandler = XSetErrorHandler( - &XWindowsUtil::ErrorLock::internalHandler); - m_next = s_top; - s_top = this; + // install handler + m_handler = handler; + m_userData = data; + m_oldXHandler = XSetErrorHandler( + &XWindowsUtil::ErrorLock::internalHandler); + m_next = s_top; + s_top = this; } int XWindowsUtil::ErrorLock::internalHandler(Display* display, XErrorEvent* event) { - if (s_top != NULL && s_top->m_handler != NULL) { - s_top->m_handler(display, event, s_top->m_userData); - } - return 0; + if (s_top != NULL && s_top->m_handler != NULL) { + s_top->m_handler(display, event, s_top->m_userData); + } + return 0; } void XWindowsUtil::ErrorLock::ignoreHandler(Display*, XErrorEvent* e, void*) { - LOG((CLOG_DEBUG1 "ignoring X error: %d", e->error_code)); + LOG((CLOG_DEBUG1 "ignoring X error: %d", e->error_code)); } void XWindowsUtil::ErrorLock::saveHandler(Display*, XErrorEvent* e, void* flag) { - LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code)); - *static_cast(flag) = true; + LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code)); + *static_cast(flag) = true; } diff --git a/src/lib/platform/XWindowsUtil.h b/src/lib/platform/XWindowsUtil.h index e39fc17d..f953e32d 100644 --- a/src/lib/platform/XWindowsUtil.h +++ b/src/lib/platform/XWindowsUtil.h @@ -24,164 +24,164 @@ #include "common/stdvector.h" #if X_DISPLAY_MISSING -# error X11 is required to build synergy +# error X11 is required to build synergy #else -# include +# include #endif //! X11 utility functions class XWindowsUtil { public: - typedef std::vector KeySyms; + typedef std::vector KeySyms; - //! Get property - /*! - Gets property \c property on \c window. \b Appends the data to - \c *data if \c data is not NULL, saves the property type in \c *type - if \c type is not NULL, and saves the property format in \c *format - if \c format is not NULL. If \c deleteProperty is true then the - property is deleted after being read. - */ - static bool getWindowProperty(Display*, - Window window, Atom property, - String* data, Atom* type, - SInt32* format, bool deleteProperty); + //! Get property + /*! + Gets property \c property on \c window. \b Appends the data to + \c *data if \c data is not NULL, saves the property type in \c *type + if \c type is not NULL, and saves the property format in \c *format + if \c format is not NULL. If \c deleteProperty is true then the + property is deleted after being read. + */ + static bool getWindowProperty(Display*, + Window window, Atom property, + String* data, Atom* type, + SInt32* format, bool deleteProperty); - //! Set property - /*! - Sets property \c property on \c window to \c size bytes of data from - \c data. - */ - static bool setWindowProperty(Display*, - Window window, Atom property, - const void* data, UInt32 size, - Atom type, SInt32 format); + //! Set property + /*! + Sets property \c property on \c window to \c size bytes of data from + \c data. + */ + static bool setWindowProperty(Display*, + Window window, Atom property, + const void* data, UInt32 size, + Atom type, SInt32 format); - //! Get X server time - /*! - Returns the current X server time. - */ - static Time getCurrentTime(Display*, Window); + //! Get X server time + /*! + Returns the current X server time. + */ + static Time getCurrentTime(Display*, Window); - //! Convert KeySym to KeyID - /*! - Converts a KeySym to the equivalent KeyID. Returns kKeyNone if the - KeySym cannot be mapped. - */ - static UInt32 mapKeySymToKeyID(KeySym); + //! Convert KeySym to KeyID + /*! + Converts a KeySym to the equivalent KeyID. Returns kKeyNone if the + KeySym cannot be mapped. + */ + static UInt32 mapKeySymToKeyID(KeySym); - //! Convert KeySym to corresponding KeyModifierMask - /*! - Converts a KeySym to the corresponding KeyModifierMask, or 0 if the - KeySym is not a modifier. - */ - static UInt32 getModifierBitForKeySym(KeySym keysym); + //! Convert KeySym to corresponding KeyModifierMask + /*! + Converts a KeySym to the corresponding KeyModifierMask, or 0 if the + KeySym is not a modifier. + */ + static UInt32 getModifierBitForKeySym(KeySym keysym); - //! Convert Atom to its string - /*! - Converts \p atom to its string representation. - */ - static String atomToString(Display*, Atom atom); + //! Convert Atom to its string + /*! + Converts \p atom to its string representation. + */ + static String atomToString(Display*, Atom atom); - //! Convert several Atoms to a string - /*! - Converts each atom in \p atoms to its string representation and - concatenates the results. - */ - static String atomsToString(Display* display, - const Atom* atom, UInt32 num); + //! Convert several Atoms to a string + /*! + Converts each atom in \p atoms to its string representation and + concatenates the results. + */ + static String atomsToString(Display* display, + const Atom* atom, UInt32 num); - //! Prepare a property of atoms for use - /*! - 64-bit systems may need to modify a property's data if it's a - list of Atoms before using it. - */ - static void convertAtomProperty(String& data); + //! Prepare a property of atoms for use + /*! + 64-bit systems may need to modify a property's data if it's a + list of Atoms before using it. + */ + static void convertAtomProperty(String& data); - //! Append an Atom to property data - /*! - Converts \p atom to a 32-bit on-the-wire format and appends it to - \p data. - */ - static void appendAtomData(String& data, Atom atom); + //! Append an Atom to property data + /*! + Converts \p atom to a 32-bit on-the-wire format and appends it to + \p data. + */ + static void appendAtomData(String& data, Atom atom); - //! Replace an Atom in property data - /*! - Converts \p atom to a 32-bit on-the-wire format and replaces the atom - at index \p index in \p data. - */ - static void replaceAtomData(String& data, - UInt32 index, Atom atom); + //! Replace an Atom in property data + /*! + Converts \p atom to a 32-bit on-the-wire format and replaces the atom + at index \p index in \p data. + */ + static void replaceAtomData(String& data, + UInt32 index, Atom atom); - //! Append an Time to property data - /*! - Converts \p time to a 32-bit on-the-wire format and appends it to - \p data. - */ - static void appendTimeData(String& data, Time time); + //! Append an Time to property data + /*! + Converts \p time to a 32-bit on-the-wire format and appends it to + \p data. + */ + static void appendTimeData(String& data, Time time); - //! X11 error handler - /*! - This class sets an X error handler in the c'tor and restores the - previous error handler in the d'tor. A lock should only be - installed while the display is locked by the thread. - - ErrorLock() ignores errors - ErrorLock(bool* flag) sets *flag to true if any error occurs - */ - class ErrorLock { - public: - //! Error handler type - typedef void (*ErrorHandler)(Display*, XErrorEvent*, void* userData); + //! X11 error handler + /*! + This class sets an X error handler in the c'tor and restores the + previous error handler in the d'tor. A lock should only be + installed while the display is locked by the thread. + + ErrorLock() ignores errors + ErrorLock(bool* flag) sets *flag to true if any error occurs + */ + class ErrorLock { + public: + //! Error handler type + typedef void (*ErrorHandler)(Display*, XErrorEvent*, void* userData); - /*! - Ignore X11 errors. - */ - ErrorLock(Display*); + /*! + Ignore X11 errors. + */ + ErrorLock(Display*); - /*! - Set \c *errorFlag if any error occurs. - */ - ErrorLock(Display*, bool* errorFlag); + /*! + Set \c *errorFlag if any error occurs. + */ + ErrorLock(Display*, bool* errorFlag); - /*! - Call \c handler on each error. - */ - ErrorLock(Display*, ErrorHandler handler, void* userData); + /*! + Call \c handler on each error. + */ + ErrorLock(Display*, ErrorHandler handler, void* userData); - ~ErrorLock(); + ~ErrorLock(); - private: - void install(ErrorHandler, void*); - static int internalHandler(Display*, XErrorEvent*); - static void ignoreHandler(Display*, XErrorEvent*, void*); - static void saveHandler(Display*, XErrorEvent*, void*); + private: + void install(ErrorHandler, void*); + static int internalHandler(Display*, XErrorEvent*); + static void ignoreHandler(Display*, XErrorEvent*, void*); + static void saveHandler(Display*, XErrorEvent*, void*); - private: - typedef int (*XErrorHandler)(Display*, XErrorEvent*); + private: + typedef int (*XErrorHandler)(Display*, XErrorEvent*); - Display* m_display; - ErrorHandler m_handler; - void* m_userData; - XErrorHandler m_oldXHandler; - ErrorLock* m_next; - static ErrorLock* s_top; - }; + Display* m_display; + ErrorHandler m_handler; + void* m_userData; + XErrorHandler m_oldXHandler; + ErrorLock* m_next; + static ErrorLock* s_top; + }; private: - class PropertyNotifyPredicateInfo { - public: - Window m_window; - Atom m_property; - }; + class PropertyNotifyPredicateInfo { + public: + Window m_window; + Atom m_property; + }; - static Bool propertyNotifyPredicate(Display*, - XEvent* xevent, XPointer arg); + static Bool propertyNotifyPredicate(Display*, + XEvent* xevent, XPointer arg); - static void initKeyMaps(); + static void initKeyMaps(); private: - typedef std::map KeySymMap; + typedef std::map KeySymMap; - static KeySymMap s_keySymToUCS4; + static KeySymMap s_keySymToUCS4; }; diff --git a/src/lib/server/BaseClientProxy.cpp b/src/lib/server/BaseClientProxy.cpp index 0ffedcb3..029f999f 100644 --- a/src/lib/server/BaseClientProxy.cpp +++ b/src/lib/server/BaseClientProxy.cpp @@ -23,34 +23,34 @@ // BaseClientProxy::BaseClientProxy(const String& name) : - m_name(name), - m_x(0), - m_y(0) + m_name(name), + m_x(0), + m_y(0) { - // do nothing + // do nothing } BaseClientProxy::~BaseClientProxy() { - // do nothing + // do nothing } void BaseClientProxy::setJumpCursorPos(SInt32 x, SInt32 y) { - m_x = x; - m_y = y; + m_x = x; + m_y = y; } void BaseClientProxy::getJumpCursorPos(SInt32& x, SInt32& y) const { - x = m_x; - y = m_y; + x = m_x; + y = m_y; } String BaseClientProxy::getName() const { - return m_name; + return m_name; } diff --git a/src/lib/server/BaseClientProxy.h b/src/lib/server/BaseClientProxy.h index 02ce90e6..22076c7c 100644 --- a/src/lib/server/BaseClientProxy.h +++ b/src/lib/server/BaseClientProxy.h @@ -26,74 +26,74 @@ namespace synergy { class IStream; } //! Generic proxy for client or primary class BaseClientProxy : public IClient { public: - /*! - \c name is the name of the client. - */ - BaseClientProxy(const String& name); - ~BaseClientProxy(); + /*! + \c name is the name of the client. + */ + BaseClientProxy(const String& name); + ~BaseClientProxy(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Save cursor position - /*! - Save the position of the cursor when jumping from client. - */ - void setJumpCursorPos(SInt32 x, SInt32 y); + //! Save cursor position + /*! + Save the position of the cursor when jumping from client. + */ + void setJumpCursorPos(SInt32 x, SInt32 y); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get cursor position - /*! - Get the position of the cursor when last jumping from client. - */ - void getJumpCursorPos(SInt32& x, SInt32& y) const; + //! Get cursor position + /*! + Get the position of the cursor when last jumping from client. + */ + void getJumpCursorPos(SInt32& x, SInt32& y) const; - //! Get cursor position - /*! - Return if this proxy is for client or primary. - */ - virtual bool isPrimary() const { return false; } + //! Get cursor position + /*! + Return if this proxy is for client or primary. + */ + virtual bool isPrimary() const { return false; } - //@} + //@} - // IScreen - virtual void* getEventTarget() const = 0; - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + // IScreen + virtual void* getEventTarget() const = 0; + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; - // IClient overrides - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver) = 0; - virtual bool leave() = 0; - virtual void setClipboard(ClipboardID, const IClipboard*) = 0; - virtual void grabClipboard(ClipboardID) = 0; - virtual void setClipboardDirty(ClipboardID, bool) = 0; - virtual void keyDown(KeyID, KeyModifierMask, KeyButton) = 0; - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton) = 0; - virtual void keyUp(KeyID, KeyModifierMask, KeyButton) = 0; - virtual void mouseDown(ButtonID) = 0; - virtual void mouseUp(ButtonID) = 0; - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; - virtual void screensaver(bool activate) = 0; - virtual void resetOptions() = 0; - virtual void setOptions(const OptionsList& options) = 0; - virtual void sendDragInfo(UInt32 fileCount, const char* info, - size_t size) = 0; - virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0; - virtual String getName() const; - virtual synergy::IStream* - getStream() const = 0; + // IClient overrides + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver) = 0; + virtual bool leave() = 0; + virtual void setClipboard(ClipboardID, const IClipboard*) = 0; + virtual void grabClipboard(ClipboardID) = 0; + virtual void setClipboardDirty(ClipboardID, bool) = 0; + virtual void keyDown(KeyID, KeyModifierMask, KeyButton) = 0; + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton) = 0; + virtual void keyUp(KeyID, KeyModifierMask, KeyButton) = 0; + virtual void mouseDown(ButtonID) = 0; + virtual void mouseUp(ButtonID) = 0; + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; + virtual void screensaver(bool activate) = 0; + virtual void resetOptions() = 0; + virtual void setOptions(const OptionsList& options) = 0; + virtual void sendDragInfo(UInt32 fileCount, const char* info, + size_t size) = 0; + virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0; + virtual String getName() const; + virtual synergy::IStream* + getStream() const = 0; private: - String m_name; - SInt32 m_x, m_y; + String m_name; + SInt32 m_x, m_y; }; diff --git a/src/lib/server/CMakeLists.txt b/src/lib/server/CMakeLists.txt index 3cb582ec..038ea777 100644 --- a/src/lib/server/CMakeLists.txt +++ b/src/lib/server/CMakeLists.txt @@ -18,19 +18,19 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../../ext - ../../../ext/gtest-1.6.0/include + ../ + ../../../ext + ../../../ext/gtest-1.6.0/include ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(server STATIC ${sources}) @@ -38,5 +38,5 @@ add_library(server STATIC ${sources}) target_link_libraries(server shared) if (UNIX) - target_link_libraries(server synergy) + target_link_libraries(server synergy) endif() diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp index a8bef7cf..0ecdb0e6 100644 --- a/src/lib/server/ClientListener.cpp +++ b/src/lib/server/ClientListener.cpp @@ -34,201 +34,201 @@ // ClientListener::ClientListener(const NetworkAddress& address, - ISocketFactory* socketFactory, - IEventQueue* events, - bool enableCrypto) : - m_socketFactory(socketFactory), - m_server(NULL), - m_events(events), - m_useSecureNetwork(enableCrypto) + ISocketFactory* socketFactory, + IEventQueue* events, + bool enableCrypto) : + m_socketFactory(socketFactory), + m_server(NULL), + m_events(events), + m_useSecureNetwork(enableCrypto) { - assert(m_socketFactory != NULL); + assert(m_socketFactory != NULL); - try { - m_listen = m_socketFactory->createListen(m_useSecureNetwork); + try { + m_listen = m_socketFactory->createListen(m_useSecureNetwork); - // setup event handler - m_events->adoptHandler(m_events->forIListenSocket().connecting(), - m_listen, - new TMethodEventJob(this, - &ClientListener::handleClientConnecting)); - - // bind listen address - LOG((CLOG_DEBUG1 "binding listen socket")); - m_listen->bind(address); - } - catch (XSocketAddressInUse&) { - cleanupListenSocket(); - delete m_socketFactory; - throw; - } - catch (XBase&) { - cleanupListenSocket(); - delete m_socketFactory; - throw; - } - LOG((CLOG_DEBUG1 "listening for clients")); + // setup event handler + m_events->adoptHandler(m_events->forIListenSocket().connecting(), + m_listen, + new TMethodEventJob(this, + &ClientListener::handleClientConnecting)); + + // bind listen address + LOG((CLOG_DEBUG1 "binding listen socket")); + m_listen->bind(address); + } + catch (XSocketAddressInUse&) { + cleanupListenSocket(); + delete m_socketFactory; + throw; + } + catch (XBase&) { + cleanupListenSocket(); + delete m_socketFactory; + throw; + } + LOG((CLOG_DEBUG1 "listening for clients")); } ClientListener::~ClientListener() { - LOG((CLOG_DEBUG1 "stop listening for clients")); + LOG((CLOG_DEBUG1 "stop listening for clients")); - // discard already connected clients - for (NewClients::iterator index = m_newClients.begin(); - index != m_newClients.end(); ++index) { - ClientProxyUnknown* client = *index; - m_events->removeHandler( - m_events->forClientProxyUnknown().success(), client); - m_events->removeHandler( - m_events->forClientProxyUnknown().failure(), client); - m_events->removeHandler( - m_events->forClientProxy().disconnected(), client); - delete client; - } + // discard already connected clients + for (NewClients::iterator index = m_newClients.begin(); + index != m_newClients.end(); ++index) { + ClientProxyUnknown* client = *index; + m_events->removeHandler( + m_events->forClientProxyUnknown().success(), client); + m_events->removeHandler( + m_events->forClientProxyUnknown().failure(), client); + m_events->removeHandler( + m_events->forClientProxy().disconnected(), client); + delete client; + } - // discard waiting clients - ClientProxy* client = getNextClient(); - while (client != NULL) { - delete client; - client = getNextClient(); - } + // discard waiting clients + ClientProxy* client = getNextClient(); + while (client != NULL) { + delete client; + client = getNextClient(); + } - m_events->removeHandler(m_events->forIListenSocket().connecting(), m_listen); - cleanupListenSocket(); - delete m_socketFactory; + m_events->removeHandler(m_events->forIListenSocket().connecting(), m_listen); + cleanupListenSocket(); + delete m_socketFactory; } void ClientListener::setServer(Server* server) { - assert(server != NULL); - m_server = server; + assert(server != NULL); + m_server = server; } ClientProxy* ClientListener::getNextClient() { - ClientProxy* client = NULL; - if (!m_waitingClients.empty()) { - client = m_waitingClients.front(); - m_waitingClients.pop_front(); - m_events->removeHandler(m_events->forClientProxy().disconnected(), client); - } - return client; + ClientProxy* client = NULL; + if (!m_waitingClients.empty()) { + client = m_waitingClients.front(); + m_waitingClients.pop_front(); + m_events->removeHandler(m_events->forClientProxy().disconnected(), client); + } + return client; } void ClientListener::handleClientConnecting(const Event&, void*) { - // accept client connection - IDataSocket* socket = m_listen->accept(); + // accept client connection + IDataSocket* socket = m_listen->accept(); - if (socket == NULL) { - return; - } - - m_events->adoptHandler(m_events->forClientListener().accepted(), - socket->getEventTarget(), - new TMethodEventJob(this, - &ClientListener::handleClientAccepted, socket)); - - // When using non SSL, server accepts clients immediately, while SSL - // has to call secure accept which may require retry - if (!m_useSecureNetwork) { - m_events->addEvent(Event(m_events->forClientListener().accepted(), - socket->getEventTarget())); - } + if (socket == NULL) { + return; + } + + m_events->adoptHandler(m_events->forClientListener().accepted(), + socket->getEventTarget(), + new TMethodEventJob(this, + &ClientListener::handleClientAccepted, socket)); + + // When using non SSL, server accepts clients immediately, while SSL + // has to call secure accept which may require retry + if (!m_useSecureNetwork) { + m_events->addEvent(Event(m_events->forClientListener().accepted(), + socket->getEventTarget())); + } } void ClientListener::handleClientAccepted(const Event&, void* vsocket) { - LOG((CLOG_NOTE "accepted client connection")); + LOG((CLOG_NOTE "accepted client connection")); - IDataSocket* socket = static_cast(vsocket); - - // filter socket messages, including a packetizing filter - synergy::IStream* stream = new PacketStreamFilter(m_events, socket, true); - assert(m_server != NULL); + IDataSocket* socket = static_cast(vsocket); + + // filter socket messages, including a packetizing filter + synergy::IStream* stream = new PacketStreamFilter(m_events, socket, true); + assert(m_server != NULL); - // create proxy for unknown client - ClientProxyUnknown* client = new ClientProxyUnknown(stream, 30.0, m_server, m_events); + // create proxy for unknown client + ClientProxyUnknown* client = new ClientProxyUnknown(stream, 30.0, m_server, m_events); - m_newClients.insert(client); + m_newClients.insert(client); - // watch for events from unknown client - m_events->adoptHandler(m_events->forClientProxyUnknown().success(), - client, - new TMethodEventJob(this, - &ClientListener::handleUnknownClient, client)); - m_events->adoptHandler(m_events->forClientProxyUnknown().failure(), - client, - new TMethodEventJob(this, - &ClientListener::handleUnknownClient, client)); + // watch for events from unknown client + m_events->adoptHandler(m_events->forClientProxyUnknown().success(), + client, + new TMethodEventJob(this, + &ClientListener::handleUnknownClient, client)); + m_events->adoptHandler(m_events->forClientProxyUnknown().failure(), + client, + new TMethodEventJob(this, + &ClientListener::handleUnknownClient, client)); } void ClientListener::handleUnknownClient(const Event&, void* vclient) { - ClientProxyUnknown* unknownClient = - static_cast(vclient); + ClientProxyUnknown* unknownClient = + static_cast(vclient); - // we should have the client in our new client list - assert(m_newClients.count(unknownClient) == 1); + // we should have the client in our new client list + assert(m_newClients.count(unknownClient) == 1); - // get the real client proxy and install it - ClientProxy* client = unknownClient->orphanClientProxy(); - bool handshakeOk = true; - if (client != NULL) { - // handshake was successful - m_waitingClients.push_back(client); - m_events->addEvent(Event(m_events->forClientListener().connected(), - this)); + // get the real client proxy and install it + ClientProxy* client = unknownClient->orphanClientProxy(); + bool handshakeOk = true; + if (client != NULL) { + // handshake was successful + m_waitingClients.push_back(client); + m_events->addEvent(Event(m_events->forClientListener().connected(), + this)); - // watch for client to disconnect while it's in our queue - m_events->adoptHandler(m_events->forClientProxy().disconnected(), client, - new TMethodEventJob(this, - &ClientListener::handleClientDisconnected, - client)); - } - else { - handshakeOk = false; - } + // watch for client to disconnect while it's in our queue + m_events->adoptHandler(m_events->forClientProxy().disconnected(), client, + new TMethodEventJob(this, + &ClientListener::handleClientDisconnected, + client)); + } + else { + handshakeOk = false; + } - // now finished with unknown client - m_events->removeHandler(m_events->forClientProxyUnknown().success(), client); - m_events->removeHandler(m_events->forClientProxyUnknown().failure(), client); - m_newClients.erase(unknownClient); - PacketStreamFilter* streamFileter = dynamic_cast(unknownClient->getStream()); - IDataSocket* socket = NULL; - if (streamFileter != NULL) { - socket = dynamic_cast(streamFileter->getStream()); - } + // now finished with unknown client + m_events->removeHandler(m_events->forClientProxyUnknown().success(), client); + m_events->removeHandler(m_events->forClientProxyUnknown().failure(), client); + m_newClients.erase(unknownClient); + PacketStreamFilter* streamFileter = dynamic_cast(unknownClient->getStream()); + IDataSocket* socket = NULL; + if (streamFileter != NULL) { + socket = dynamic_cast(streamFileter->getStream()); + } - delete unknownClient; + delete unknownClient; } void ClientListener::handleClientDisconnected(const Event&, void* vclient) { - ClientProxy* client = static_cast(vclient); + ClientProxy* client = static_cast(vclient); - // find client in waiting clients queue - for (WaitingClients::iterator i = m_waitingClients.begin(), - n = m_waitingClients.end(); i != n; ++i) { - if (*i == client) { - m_waitingClients.erase(i); - m_events->removeHandler(m_events->forClientProxy().disconnected(), - client); - delete client; - break; - } - } + // find client in waiting clients queue + for (WaitingClients::iterator i = m_waitingClients.begin(), + n = m_waitingClients.end(); i != n; ++i) { + if (*i == client) { + m_waitingClients.erase(i); + m_events->removeHandler(m_events->forClientProxy().disconnected(), + client); + delete client; + break; + } + } } void ClientListener::cleanupListenSocket() { - delete m_listen; + delete m_listen; } diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h index 545e163a..4b69f0d9 100644 --- a/src/lib/server/ClientListener.h +++ b/src/lib/server/ClientListener.h @@ -34,54 +34,54 @@ class IEventQueue; class ClientListener { public: - // The factories are adopted. - ClientListener(const NetworkAddress&, - ISocketFactory*, - IEventQueue* events, - bool enableCrypto); - ~ClientListener(); + // The factories are adopted. + ClientListener(const NetworkAddress&, + ISocketFactory*, + IEventQueue* events, + bool enableCrypto); + ~ClientListener(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - void setServer(Server* server); + void setServer(Server* server); - //@} + //@} - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get next connected client - /*! - Returns the next connected client and removes it from the internal - list. The client is responsible for deleting the returned client. - Returns NULL if no clients are available. - */ - ClientProxy* getNextClient(); + //! Get next connected client + /*! + Returns the next connected client and removes it from the internal + list. The client is responsible for deleting the returned client. + Returns NULL if no clients are available. + */ + ClientProxy* getNextClient(); - //! Get server which owns this listener - Server* getServer() { return m_server; } + //! Get server which owns this listener + Server* getServer() { return m_server; } - //@} + //@} private: - // client connection event handlers - void handleClientConnecting(const Event&, void*); - void handleClientAccepted(const Event&, void*); - void handleUnknownClient(const Event&, void*); - void handleClientDisconnected(const Event&, void*); + // client connection event handlers + void handleClientConnecting(const Event&, void*); + void handleClientAccepted(const Event&, void*); + void handleUnknownClient(const Event&, void*); + void handleClientDisconnected(const Event&, void*); - void cleanupListenSocket(); + void cleanupListenSocket(); private: - typedef std::set NewClients; - typedef std::deque WaitingClients; + typedef std::set NewClients; + typedef std::deque WaitingClients; - IListenSocket* m_listen; - ISocketFactory* m_socketFactory; - NewClients m_newClients; - WaitingClients m_waitingClients; - Server* m_server; - IEventQueue* m_events; - bool m_useSecureNetwork; + IListenSocket* m_listen; + ISocketFactory* m_socketFactory; + NewClients m_newClients; + WaitingClients m_waitingClients; + Server* m_server; + IEventQueue* m_events; + bool m_useSecureNetwork; }; diff --git a/src/lib/server/ClientProxy.cpp b/src/lib/server/ClientProxy.cpp index 36e845e5..404ce2c6 100644 --- a/src/lib/server/ClientProxy.cpp +++ b/src/lib/server/ClientProxy.cpp @@ -28,34 +28,34 @@ // ClientProxy::ClientProxy(const String& name, synergy::IStream* stream) : - BaseClientProxy(name), - m_stream(stream) + BaseClientProxy(name), + m_stream(stream) { } ClientProxy::~ClientProxy() { - delete m_stream; + delete m_stream; } void ClientProxy::close(const char* msg) { - LOG((CLOG_DEBUG1 "send close \"%s\" to \"%s\"", msg, getName().c_str())); - ProtocolUtil::writef(getStream(), msg); + LOG((CLOG_DEBUG1 "send close \"%s\" to \"%s\"", msg, getName().c_str())); + ProtocolUtil::writef(getStream(), msg); - // force the close to be sent before we return - getStream()->flush(); + // force the close to be sent before we return + getStream()->flush(); } synergy::IStream* ClientProxy::getStream() const { - return m_stream; + return m_stream; } void* ClientProxy::getEventTarget() const { - return static_cast(const_cast(this)); + return static_cast(const_cast(this)); } diff --git a/src/lib/server/ClientProxy.h b/src/lib/server/ClientProxy.h index 9f40d9b1..3d05a072 100644 --- a/src/lib/server/ClientProxy.h +++ b/src/lib/server/ClientProxy.h @@ -28,64 +28,64 @@ namespace synergy { class IStream; } //! Generic proxy for client class ClientProxy : public BaseClientProxy { public: - /*! - \c name is the name of the client. - */ - ClientProxy(const String& name, synergy::IStream* adoptedStream); - ~ClientProxy(); + /*! + \c name is the name of the client. + */ + ClientProxy(const String& name, synergy::IStream* adoptedStream); + ~ClientProxy(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Disconnect - /*! - Ask the client to disconnect, using \p msg as the reason. - */ - void close(const char* msg); + //! Disconnect + /*! + Ask the client to disconnect, using \p msg as the reason. + */ + void close(const char* msg); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get stream - /*! - Returns the original stream passed to the c'tor. - */ - synergy::IStream* getStream() const; + //! Get stream + /*! + Returns the original stream passed to the c'tor. + */ + synergy::IStream* getStream() const; - //@} + //@} - // IScreen - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + // IScreen + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; - // IClient overrides - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver) = 0; - virtual bool leave() = 0; - virtual void setClipboard(ClipboardID, const IClipboard*) = 0; - virtual void grabClipboard(ClipboardID) = 0; - virtual void setClipboardDirty(ClipboardID, bool) = 0; - virtual void keyDown(KeyID, KeyModifierMask, KeyButton) = 0; - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton) = 0; - virtual void keyUp(KeyID, KeyModifierMask, KeyButton) = 0; - virtual void mouseDown(ButtonID) = 0; - virtual void mouseUp(ButtonID) = 0; - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; - virtual void screensaver(bool activate) = 0; - virtual void resetOptions() = 0; - virtual void setOptions(const OptionsList& options) = 0; - virtual void sendDragInfo(UInt32 fileCount, const char* info, - size_t size) = 0; - virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0; + // IClient overrides + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver) = 0; + virtual bool leave() = 0; + virtual void setClipboard(ClipboardID, const IClipboard*) = 0; + virtual void grabClipboard(ClipboardID) = 0; + virtual void setClipboardDirty(ClipboardID, bool) = 0; + virtual void keyDown(KeyID, KeyModifierMask, KeyButton) = 0; + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton) = 0; + virtual void keyUp(KeyID, KeyModifierMask, KeyButton) = 0; + virtual void mouseDown(ButtonID) = 0; + virtual void mouseUp(ButtonID) = 0; + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; + virtual void screensaver(bool activate) = 0; + virtual void resetOptions() = 0; + virtual void setOptions(const OptionsList& options) = 0; + virtual void sendDragInfo(UInt32 fileCount, const char* info, + size_t size) = 0; + virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize) = 0; private: - synergy::IStream* m_stream; + synergy::IStream* m_stream; }; diff --git a/src/lib/server/ClientProxy1_0.cpp b/src/lib/server/ClientProxy1_0.cpp index dc9b0138..429973f1 100644 --- a/src/lib/server/ClientProxy1_0.cpp +++ b/src/lib/server/ClientProxy1_0.cpp @@ -32,443 +32,443 @@ // ClientProxy1_0::ClientProxy1_0(const String& name, synergy::IStream* stream, IEventQueue* events) : - ClientProxy(name, stream), - m_heartbeatTimer(NULL), - m_parser(&ClientProxy1_0::parseHandshakeMessage), - m_events(events) + ClientProxy(name, stream), + m_heartbeatTimer(NULL), + m_parser(&ClientProxy1_0::parseHandshakeMessage), + m_events(events) { - // install event handlers - m_events->adoptHandler(m_events->forIStream().inputReady(), - stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxy1_0::handleData, NULL)); - m_events->adoptHandler(m_events->forIStream().outputError(), - stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxy1_0::handleWriteError, NULL)); - m_events->adoptHandler(m_events->forIStream().inputShutdown(), - stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxy1_0::handleDisconnect, NULL)); - m_events->adoptHandler(m_events->forIStream().outputShutdown(), - stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxy1_0::handleWriteError, NULL)); - m_events->adoptHandler(Event::kTimer, this, - new TMethodEventJob(this, - &ClientProxy1_0::handleFlatline, NULL)); + // install event handlers + m_events->adoptHandler(m_events->forIStream().inputReady(), + stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxy1_0::handleData, NULL)); + m_events->adoptHandler(m_events->forIStream().outputError(), + stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxy1_0::handleWriteError, NULL)); + m_events->adoptHandler(m_events->forIStream().inputShutdown(), + stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxy1_0::handleDisconnect, NULL)); + m_events->adoptHandler(m_events->forIStream().outputShutdown(), + stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxy1_0::handleWriteError, NULL)); + m_events->adoptHandler(Event::kTimer, this, + new TMethodEventJob(this, + &ClientProxy1_0::handleFlatline, NULL)); - setHeartbeatRate(kHeartRate, kHeartRate * kHeartBeatsUntilDeath); + setHeartbeatRate(kHeartRate, kHeartRate * kHeartBeatsUntilDeath); - LOG((CLOG_DEBUG1 "querying client \"%s\" info", getName().c_str())); - ProtocolUtil::writef(getStream(), kMsgQInfo); + LOG((CLOG_DEBUG1 "querying client \"%s\" info", getName().c_str())); + ProtocolUtil::writef(getStream(), kMsgQInfo); } ClientProxy1_0::~ClientProxy1_0() { - removeHandlers(); + removeHandlers(); } void ClientProxy1_0::disconnect() { - removeHandlers(); - getStream()->close(); - m_events->addEvent(Event(m_events->forClientProxy().disconnected(), getEventTarget())); + removeHandlers(); + getStream()->close(); + m_events->addEvent(Event(m_events->forClientProxy().disconnected(), getEventTarget())); } void ClientProxy1_0::removeHandlers() { - // uninstall event handlers - m_events->removeHandler(m_events->forIStream().inputReady(), - getStream()->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputError(), - getStream()->getEventTarget()); - m_events->removeHandler(m_events->forIStream().inputShutdown(), - getStream()->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputShutdown(), - getStream()->getEventTarget()); - m_events->removeHandler(Event::kTimer, this); + // uninstall event handlers + m_events->removeHandler(m_events->forIStream().inputReady(), + getStream()->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputError(), + getStream()->getEventTarget()); + m_events->removeHandler(m_events->forIStream().inputShutdown(), + getStream()->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputShutdown(), + getStream()->getEventTarget()); + m_events->removeHandler(Event::kTimer, this); - // remove timer - removeHeartbeatTimer(); + // remove timer + removeHeartbeatTimer(); } void ClientProxy1_0::addHeartbeatTimer() { - if (m_heartbeatAlarm > 0.0) { - m_heartbeatTimer = m_events->newOneShotTimer(m_heartbeatAlarm, this); - } + if (m_heartbeatAlarm > 0.0) { + m_heartbeatTimer = m_events->newOneShotTimer(m_heartbeatAlarm, this); + } } void ClientProxy1_0::removeHeartbeatTimer() { - if (m_heartbeatTimer != NULL) { - m_events->deleteTimer(m_heartbeatTimer); - m_heartbeatTimer = NULL; - } + if (m_heartbeatTimer != NULL) { + m_events->deleteTimer(m_heartbeatTimer); + m_heartbeatTimer = NULL; + } } void ClientProxy1_0::resetHeartbeatTimer() { - // reset the alarm - removeHeartbeatTimer(); - addHeartbeatTimer(); + // reset the alarm + removeHeartbeatTimer(); + addHeartbeatTimer(); } void ClientProxy1_0::resetHeartbeatRate() { - setHeartbeatRate(kHeartRate, kHeartRate * kHeartBeatsUntilDeath); + setHeartbeatRate(kHeartRate, kHeartRate * kHeartBeatsUntilDeath); } void ClientProxy1_0::setHeartbeatRate(double, double alarm) { - m_heartbeatAlarm = alarm; + m_heartbeatAlarm = alarm; } void ClientProxy1_0::handleData(const Event&, void*) { - // handle messages until there are no more. first read message code. - UInt8 code[4]; - UInt32 n = getStream()->read(code, 4); - while (n != 0) { - // verify we got an entire code - if (n != 4) { - LOG((CLOG_ERR "incomplete message from \"%s\": %d bytes", getName().c_str(), n)); - disconnect(); - return; - } + // handle messages until there are no more. first read message code. + UInt8 code[4]; + UInt32 n = getStream()->read(code, 4); + while (n != 0) { + // verify we got an entire code + if (n != 4) { + LOG((CLOG_ERR "incomplete message from \"%s\": %d bytes", getName().c_str(), n)); + disconnect(); + return; + } - // parse message - LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3])); - if (!(this->*m_parser)(code)) { - LOG((CLOG_ERR "invalid message from client \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3])); - disconnect(); - return; - } + // parse message + LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3])); + if (!(this->*m_parser)(code)) { + LOG((CLOG_ERR "invalid message from client \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3])); + disconnect(); + return; + } - // next message - n = getStream()->read(code, 4); - } + // next message + n = getStream()->read(code, 4); + } - // restart heartbeat timer - resetHeartbeatTimer(); + // restart heartbeat timer + resetHeartbeatTimer(); } bool ClientProxy1_0::parseHandshakeMessage(const UInt8* code) { - if (memcmp(code, kMsgCNoop, 4) == 0) { - // discard no-ops - LOG((CLOG_DEBUG2 "no-op from", getName().c_str())); - return true; - } - else if (memcmp(code, kMsgDInfo, 4) == 0) { - // future messages get parsed by parseMessage - m_parser = &ClientProxy1_0::parseMessage; - if (recvInfo()) { - m_events->addEvent(Event(m_events->forClientProxy().ready(), getEventTarget())); - addHeartbeatTimer(); - return true; - } - } - return false; + if (memcmp(code, kMsgCNoop, 4) == 0) { + // discard no-ops + LOG((CLOG_DEBUG2 "no-op from", getName().c_str())); + return true; + } + else if (memcmp(code, kMsgDInfo, 4) == 0) { + // future messages get parsed by parseMessage + m_parser = &ClientProxy1_0::parseMessage; + if (recvInfo()) { + m_events->addEvent(Event(m_events->forClientProxy().ready(), getEventTarget())); + addHeartbeatTimer(); + return true; + } + } + return false; } bool ClientProxy1_0::parseMessage(const UInt8* code) { - if (memcmp(code, kMsgDInfo, 4) == 0) { - if (recvInfo()) { - m_events->addEvent( - Event(m_events->forIScreen().shapeChanged(), getEventTarget())); - return true; - } - return false; - } - else if (memcmp(code, kMsgCNoop, 4) == 0) { - // discard no-ops - LOG((CLOG_DEBUG2 "no-op from", getName().c_str())); - return true; - } - else if (memcmp(code, kMsgCClipboard, 4) == 0) { - return recvGrabClipboard(); - } - else if (memcmp(code, kMsgDClipboard, 4) == 0) { - return recvClipboard(); - } - return false; + if (memcmp(code, kMsgDInfo, 4) == 0) { + if (recvInfo()) { + m_events->addEvent( + Event(m_events->forIScreen().shapeChanged(), getEventTarget())); + return true; + } + return false; + } + else if (memcmp(code, kMsgCNoop, 4) == 0) { + // discard no-ops + LOG((CLOG_DEBUG2 "no-op from", getName().c_str())); + return true; + } + else if (memcmp(code, kMsgCClipboard, 4) == 0) { + return recvGrabClipboard(); + } + else if (memcmp(code, kMsgDClipboard, 4) == 0) { + return recvClipboard(); + } + return false; } void ClientProxy1_0::handleDisconnect(const Event&, void*) { - LOG((CLOG_NOTE "client \"%s\" has disconnected", getName().c_str())); - disconnect(); + LOG((CLOG_NOTE "client \"%s\" has disconnected", getName().c_str())); + disconnect(); } void ClientProxy1_0::handleWriteError(const Event&, void*) { - LOG((CLOG_WARN "error writing to client \"%s\"", getName().c_str())); - disconnect(); + LOG((CLOG_WARN "error writing to client \"%s\"", getName().c_str())); + disconnect(); } void ClientProxy1_0::handleFlatline(const Event&, void*) { - // didn't get a heartbeat fast enough. assume client is dead. - LOG((CLOG_NOTE "client \"%s\" is dead", getName().c_str())); - disconnect(); + // didn't get a heartbeat fast enough. assume client is dead. + LOG((CLOG_NOTE "client \"%s\" is dead", getName().c_str())); + disconnect(); } bool ClientProxy1_0::getClipboard(ClipboardID id, IClipboard* clipboard) const { - Clipboard::copy(clipboard, &m_clipboard[id].m_clipboard); - return true; + Clipboard::copy(clipboard, &m_clipboard[id].m_clipboard); + return true; } void ClientProxy1_0::getShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) const { - x = m_info.m_x; - y = m_info.m_y; - w = m_info.m_w; - h = m_info.m_h; + x = m_info.m_x; + y = m_info.m_y; + w = m_info.m_w; + h = m_info.m_h; } void ClientProxy1_0::getCursorPos(SInt32& x, SInt32& y) const { - // note -- this returns the cursor pos from when we last got client info - x = m_info.m_mx; - y = m_info.m_my; + // note -- this returns the cursor pos from when we last got client info + x = m_info.m_mx; + y = m_info.m_my; } void ClientProxy1_0::enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, bool) + UInt32 seqNum, KeyModifierMask mask, bool) { - LOG((CLOG_DEBUG1 "send enter to \"%s\", %d,%d %d %04x", getName().c_str(), xAbs, yAbs, seqNum, mask)); - ProtocolUtil::writef(getStream(), kMsgCEnter, - xAbs, yAbs, seqNum, mask); + LOG((CLOG_DEBUG1 "send enter to \"%s\", %d,%d %d %04x", getName().c_str(), xAbs, yAbs, seqNum, mask)); + ProtocolUtil::writef(getStream(), kMsgCEnter, + xAbs, yAbs, seqNum, mask); } bool ClientProxy1_0::leave() { - LOG((CLOG_DEBUG1 "send leave to \"%s\"", getName().c_str())); - ProtocolUtil::writef(getStream(), kMsgCLeave); + LOG((CLOG_DEBUG1 "send leave to \"%s\"", getName().c_str())); + ProtocolUtil::writef(getStream(), kMsgCLeave); - // we can never prevent the user from leaving - return true; + // we can never prevent the user from leaving + return true; } void ClientProxy1_0::setClipboard(ClipboardID id, const IClipboard* clipboard) { - // ignore -- deprecated in protocol 1.0 + // ignore -- deprecated in protocol 1.0 } void ClientProxy1_0::grabClipboard(ClipboardID id) { - LOG((CLOG_DEBUG "send grab clipboard %d to \"%s\"", id, getName().c_str())); - ProtocolUtil::writef(getStream(), kMsgCClipboard, id, 0); + LOG((CLOG_DEBUG "send grab clipboard %d to \"%s\"", id, getName().c_str())); + ProtocolUtil::writef(getStream(), kMsgCClipboard, id, 0); - // this clipboard is now dirty - m_clipboard[id].m_dirty = true; + // this clipboard is now dirty + m_clipboard[id].m_dirty = true; } void ClientProxy1_0::setClipboardDirty(ClipboardID id, bool dirty) { - m_clipboard[id].m_dirty = dirty; + m_clipboard[id].m_dirty = dirty; } void ClientProxy1_0::keyDown(KeyID key, KeyModifierMask mask, KeyButton) { - LOG((CLOG_DEBUG1 "send key down to \"%s\" id=%d, mask=0x%04x", getName().c_str(), key, mask)); - ProtocolUtil::writef(getStream(), kMsgDKeyDown1_0, key, mask); + LOG((CLOG_DEBUG1 "send key down to \"%s\" id=%d, mask=0x%04x", getName().c_str(), key, mask)); + ProtocolUtil::writef(getStream(), kMsgDKeyDown1_0, key, mask); } void ClientProxy1_0::keyRepeat(KeyID key, KeyModifierMask mask, - SInt32 count, KeyButton) + SInt32 count, KeyButton) { - LOG((CLOG_DEBUG1 "send key repeat to \"%s\" id=%d, mask=0x%04x, count=%d", getName().c_str(), key, mask, count)); - ProtocolUtil::writef(getStream(), kMsgDKeyRepeat1_0, key, mask, count); + LOG((CLOG_DEBUG1 "send key repeat to \"%s\" id=%d, mask=0x%04x, count=%d", getName().c_str(), key, mask, count)); + ProtocolUtil::writef(getStream(), kMsgDKeyRepeat1_0, key, mask, count); } void ClientProxy1_0::keyUp(KeyID key, KeyModifierMask mask, KeyButton) { - LOG((CLOG_DEBUG1 "send key up to \"%s\" id=%d, mask=0x%04x", getName().c_str(), key, mask)); - ProtocolUtil::writef(getStream(), kMsgDKeyUp1_0, key, mask); + LOG((CLOG_DEBUG1 "send key up to \"%s\" id=%d, mask=0x%04x", getName().c_str(), key, mask)); + ProtocolUtil::writef(getStream(), kMsgDKeyUp1_0, key, mask); } void ClientProxy1_0::mouseDown(ButtonID button) { - LOG((CLOG_DEBUG1 "send mouse down to \"%s\" id=%d", getName().c_str(), button)); - ProtocolUtil::writef(getStream(), kMsgDMouseDown, button); + LOG((CLOG_DEBUG1 "send mouse down to \"%s\" id=%d", getName().c_str(), button)); + ProtocolUtil::writef(getStream(), kMsgDMouseDown, button); } void ClientProxy1_0::mouseUp(ButtonID button) { - LOG((CLOG_DEBUG1 "send mouse up to \"%s\" id=%d", getName().c_str(), button)); - ProtocolUtil::writef(getStream(), kMsgDMouseUp, button); + LOG((CLOG_DEBUG1 "send mouse up to \"%s\" id=%d", getName().c_str(), button)); + ProtocolUtil::writef(getStream(), kMsgDMouseUp, button); } void ClientProxy1_0::mouseMove(SInt32 xAbs, SInt32 yAbs) { - LOG((CLOG_DEBUG2 "send mouse move to \"%s\" %d,%d", getName().c_str(), xAbs, yAbs)); - ProtocolUtil::writef(getStream(), kMsgDMouseMove, xAbs, yAbs); + LOG((CLOG_DEBUG2 "send mouse move to \"%s\" %d,%d", getName().c_str(), xAbs, yAbs)); + ProtocolUtil::writef(getStream(), kMsgDMouseMove, xAbs, yAbs); } void ClientProxy1_0::mouseRelativeMove(SInt32, SInt32) { - // ignore -- not supported in protocol 1.0 + // ignore -- not supported in protocol 1.0 } void ClientProxy1_0::mouseWheel(SInt32, SInt32 yDelta) { - // clients prior to 1.3 only support the y axis - LOG((CLOG_DEBUG2 "send mouse wheel to \"%s\" %+d", getName().c_str(), yDelta)); - ProtocolUtil::writef(getStream(), kMsgDMouseWheel1_0, yDelta); + // clients prior to 1.3 only support the y axis + LOG((CLOG_DEBUG2 "send mouse wheel to \"%s\" %+d", getName().c_str(), yDelta)); + ProtocolUtil::writef(getStream(), kMsgDMouseWheel1_0, yDelta); } void ClientProxy1_0::sendDragInfo(UInt32 fileCount, const char* info, size_t size) { - // ignore -- not supported in protocol 1.0 - LOG((CLOG_DEBUG "draggingInfoSending not supported")); + // ignore -- not supported in protocol 1.0 + LOG((CLOG_DEBUG "draggingInfoSending not supported")); } void ClientProxy1_0::fileChunkSending(UInt8 mark, char* data, size_t dataSize) { - // ignore -- not supported in protocol 1.0 - LOG((CLOG_DEBUG "fileChunkSending not supported")); + // ignore -- not supported in protocol 1.0 + LOG((CLOG_DEBUG "fileChunkSending not supported")); } void ClientProxy1_0::screensaver(bool on) { - LOG((CLOG_DEBUG1 "send screen saver to \"%s\" on=%d", getName().c_str(), on ? 1 : 0)); - ProtocolUtil::writef(getStream(), kMsgCScreenSaver, on ? 1 : 0); + LOG((CLOG_DEBUG1 "send screen saver to \"%s\" on=%d", getName().c_str(), on ? 1 : 0)); + ProtocolUtil::writef(getStream(), kMsgCScreenSaver, on ? 1 : 0); } void ClientProxy1_0::resetOptions() { - LOG((CLOG_DEBUG1 "send reset options to \"%s\"", getName().c_str())); - ProtocolUtil::writef(getStream(), kMsgCResetOptions); + LOG((CLOG_DEBUG1 "send reset options to \"%s\"", getName().c_str())); + ProtocolUtil::writef(getStream(), kMsgCResetOptions); - // reset heart rate and death - resetHeartbeatRate(); - removeHeartbeatTimer(); - addHeartbeatTimer(); + // reset heart rate and death + resetHeartbeatRate(); + removeHeartbeatTimer(); + addHeartbeatTimer(); } void ClientProxy1_0::setOptions(const OptionsList& options) { - LOG((CLOG_DEBUG1 "send set options to \"%s\" size=%d", getName().c_str(), options.size())); - ProtocolUtil::writef(getStream(), kMsgDSetOptions, &options); + LOG((CLOG_DEBUG1 "send set options to \"%s\" size=%d", getName().c_str(), options.size())); + ProtocolUtil::writef(getStream(), kMsgDSetOptions, &options); - // check options - for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { - if (options[i] == kOptionHeartbeat) { - double rate = 1.0e-3 * static_cast(options[i + 1]); - if (rate <= 0.0) { - rate = -1.0; - } - setHeartbeatRate(rate, rate * kHeartBeatsUntilDeath); - removeHeartbeatTimer(); - addHeartbeatTimer(); - } - } + // check options + for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { + if (options[i] == kOptionHeartbeat) { + double rate = 1.0e-3 * static_cast(options[i + 1]); + if (rate <= 0.0) { + rate = -1.0; + } + setHeartbeatRate(rate, rate * kHeartBeatsUntilDeath); + removeHeartbeatTimer(); + addHeartbeatTimer(); + } + } } bool ClientProxy1_0::recvInfo() { - // parse the message - SInt16 x, y, w, h, dummy1, mx, my; - if (!ProtocolUtil::readf(getStream(), kMsgDInfo + 4, - &x, &y, &w, &h, &dummy1, &mx, &my)) { - return false; - } - LOG((CLOG_DEBUG "received client \"%s\" info shape=%d,%d %dx%d at %d,%d", getName().c_str(), x, y, w, h, mx, my)); + // parse the message + SInt16 x, y, w, h, dummy1, mx, my; + if (!ProtocolUtil::readf(getStream(), kMsgDInfo + 4, + &x, &y, &w, &h, &dummy1, &mx, &my)) { + return false; + } + LOG((CLOG_DEBUG "received client \"%s\" info shape=%d,%d %dx%d at %d,%d", getName().c_str(), x, y, w, h, mx, my)); - // validate - if (w <= 0 || h <= 0) { - return false; - } - if (mx < x || mx >= x + w || my < y || my >= y + h) { - mx = x + w / 2; - my = y + h / 2; - } + // validate + if (w <= 0 || h <= 0) { + return false; + } + if (mx < x || mx >= x + w || my < y || my >= y + h) { + mx = x + w / 2; + my = y + h / 2; + } - // save - m_info.m_x = x; - m_info.m_y = y; - m_info.m_w = w; - m_info.m_h = h; - m_info.m_mx = mx; - m_info.m_my = my; + // save + m_info.m_x = x; + m_info.m_y = y; + m_info.m_w = w; + m_info.m_h = h; + m_info.m_mx = mx; + m_info.m_my = my; - // acknowledge receipt - LOG((CLOG_DEBUG1 "send info ack to \"%s\"", getName().c_str())); - ProtocolUtil::writef(getStream(), kMsgCInfoAck); - return true; + // acknowledge receipt + LOG((CLOG_DEBUG1 "send info ack to \"%s\"", getName().c_str())); + ProtocolUtil::writef(getStream(), kMsgCInfoAck); + return true; } bool ClientProxy1_0::recvClipboard() { - // deprecated in protocol 1.0 - return false; + // deprecated in protocol 1.0 + return false; } bool ClientProxy1_0::recvGrabClipboard() { - // parse message - ClipboardID id; - UInt32 seqNum; - if (!ProtocolUtil::readf(getStream(), kMsgCClipboard + 4, &id, &seqNum)) { - return false; - } - LOG((CLOG_DEBUG "received client \"%s\" grabbed clipboard %d seqnum=%d", getName().c_str(), id, seqNum)); + // parse message + ClipboardID id; + UInt32 seqNum; + if (!ProtocolUtil::readf(getStream(), kMsgCClipboard + 4, &id, &seqNum)) { + return false; + } + LOG((CLOG_DEBUG "received client \"%s\" grabbed clipboard %d seqnum=%d", getName().c_str(), id, seqNum)); - // validate - if (id >= kClipboardEnd) { - return false; - } + // validate + if (id >= kClipboardEnd) { + return false; + } - // notify - ClipboardInfo* info = new ClipboardInfo; - info->m_id = id; - info->m_sequenceNumber = seqNum; - m_events->addEvent(Event(m_events->forClipboard().clipboardGrabbed(), - getEventTarget(), info)); + // notify + ClipboardInfo* info = new ClipboardInfo; + info->m_id = id; + info->m_sequenceNumber = seqNum; + m_events->addEvent(Event(m_events->forClipboard().clipboardGrabbed(), + getEventTarget(), info)); - return true; + return true; } // @@ -476,9 +476,9 @@ ClientProxy1_0::recvGrabClipboard() // ClientProxy1_0::ClientClipboard::ClientClipboard() : - m_clipboard(), - m_sequenceNumber(0), - m_dirty(true) + m_clipboard(), + m_sequenceNumber(0), + m_dirty(true) { - // do nothing + // do nothing } diff --git a/src/lib/server/ClientProxy1_0.h b/src/lib/server/ClientProxy1_0.h index 8cb7858c..e40f8d86 100644 --- a/src/lib/server/ClientProxy1_0.h +++ b/src/lib/server/ClientProxy1_0.h @@ -29,79 +29,79 @@ class IEventQueue; //! Proxy for client implementing protocol version 1.0 class ClientProxy1_0 : public ClientProxy { public: - ClientProxy1_0(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); - ~ClientProxy1_0(); + ClientProxy1_0(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); + ~ClientProxy1_0(); - // IScreen - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IClient overrides - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver); - virtual bool leave(); - virtual void setClipboard(ClipboardID, const IClipboard*); - virtual void grabClipboard(ClipboardID); - virtual void setClipboardDirty(ClipboardID, bool); - virtual void keyDown(KeyID, KeyModifierMask, KeyButton); - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton); - virtual void keyUp(KeyID, KeyModifierMask, KeyButton); - virtual void mouseDown(ButtonID); - virtual void mouseUp(ButtonID); - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); - virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); + // IClient overrides + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver); + virtual bool leave(); + virtual void setClipboard(ClipboardID, const IClipboard*); + virtual void grabClipboard(ClipboardID); + virtual void setClipboardDirty(ClipboardID, bool); + virtual void keyDown(KeyID, KeyModifierMask, KeyButton); + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton); + virtual void keyUp(KeyID, KeyModifierMask, KeyButton); + virtual void mouseDown(ButtonID); + virtual void mouseUp(ButtonID); + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); + virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); protected: - virtual bool parseHandshakeMessage(const UInt8* code); - virtual bool parseMessage(const UInt8* code); + virtual bool parseHandshakeMessage(const UInt8* code); + virtual bool parseMessage(const UInt8* code); - virtual void resetHeartbeatRate(); - virtual void setHeartbeatRate(double rate, double alarm); - virtual void resetHeartbeatTimer(); - virtual void addHeartbeatTimer(); - virtual void removeHeartbeatTimer(); - virtual bool recvClipboard(); + virtual void resetHeartbeatRate(); + virtual void setHeartbeatRate(double rate, double alarm); + virtual void resetHeartbeatTimer(); + virtual void addHeartbeatTimer(); + virtual void removeHeartbeatTimer(); + virtual bool recvClipboard(); private: - void disconnect(); - void removeHandlers(); + void disconnect(); + void removeHandlers(); - void handleData(const Event&, void*); - void handleDisconnect(const Event&, void*); - void handleWriteError(const Event&, void*); - void handleFlatline(const Event&, void*); + void handleData(const Event&, void*); + void handleDisconnect(const Event&, void*); + void handleWriteError(const Event&, void*); + void handleFlatline(const Event&, void*); - bool recvInfo(); - bool recvGrabClipboard(); + bool recvInfo(); + bool recvGrabClipboard(); protected: - struct ClientClipboard { - public: - ClientClipboard(); + struct ClientClipboard { + public: + ClientClipboard(); - public: - Clipboard m_clipboard; - UInt32 m_sequenceNumber; - bool m_dirty; - }; + public: + Clipboard m_clipboard; + UInt32 m_sequenceNumber; + bool m_dirty; + }; - ClientClipboard m_clipboard[kClipboardEnd]; + ClientClipboard m_clipboard[kClipboardEnd]; private: - typedef bool (ClientProxy1_0::*MessageParser)(const UInt8*); + typedef bool (ClientProxy1_0::*MessageParser)(const UInt8*); - ClientInfo m_info; - double m_heartbeatAlarm; - EventQueueTimer* m_heartbeatTimer; - MessageParser m_parser; - IEventQueue* m_events; + ClientInfo m_info; + double m_heartbeatAlarm; + EventQueueTimer* m_heartbeatTimer; + MessageParser m_parser; + IEventQueue* m_events; }; diff --git a/src/lib/server/ClientProxy1_1.cpp b/src/lib/server/ClientProxy1_1.cpp index 17709b70..e445d322 100644 --- a/src/lib/server/ClientProxy1_1.cpp +++ b/src/lib/server/ClientProxy1_1.cpp @@ -28,34 +28,34 @@ // ClientProxy1_1::ClientProxy1_1(const String& name, synergy::IStream* stream, IEventQueue* events) : - ClientProxy1_0(name, stream, events) + ClientProxy1_0(name, stream, events) { - // do nothing + // do nothing } ClientProxy1_1::~ClientProxy1_1() { - // do nothing + // do nothing } void ClientProxy1_1::keyDown(KeyID key, KeyModifierMask mask, KeyButton button) { - LOG((CLOG_DEBUG1 "send key down to \"%s\" id=%d, mask=0x%04x, button=0x%04x", getName().c_str(), key, mask, button)); - ProtocolUtil::writef(getStream(), kMsgDKeyDown, key, mask, button); + LOG((CLOG_DEBUG1 "send key down to \"%s\" id=%d, mask=0x%04x, button=0x%04x", getName().c_str(), key, mask, button)); + ProtocolUtil::writef(getStream(), kMsgDKeyDown, key, mask, button); } void ClientProxy1_1::keyRepeat(KeyID key, KeyModifierMask mask, - SInt32 count, KeyButton button) + SInt32 count, KeyButton button) { - LOG((CLOG_DEBUG1 "send key repeat to \"%s\" id=%d, mask=0x%04x, count=%d, button=0x%04x", getName().c_str(), key, mask, count, button)); - ProtocolUtil::writef(getStream(), kMsgDKeyRepeat, key, mask, count, button); + LOG((CLOG_DEBUG1 "send key repeat to \"%s\" id=%d, mask=0x%04x, count=%d, button=0x%04x", getName().c_str(), key, mask, count, button)); + ProtocolUtil::writef(getStream(), kMsgDKeyRepeat, key, mask, count, button); } void ClientProxy1_1::keyUp(KeyID key, KeyModifierMask mask, KeyButton button) { - LOG((CLOG_DEBUG1 "send key up to \"%s\" id=%d, mask=0x%04x, button=0x%04x", getName().c_str(), key, mask, button)); - ProtocolUtil::writef(getStream(), kMsgDKeyUp, key, mask, button); + LOG((CLOG_DEBUG1 "send key up to \"%s\" id=%d, mask=0x%04x, button=0x%04x", getName().c_str(), key, mask, button)); + ProtocolUtil::writef(getStream(), kMsgDKeyUp, key, mask, button); } diff --git a/src/lib/server/ClientProxy1_1.h b/src/lib/server/ClientProxy1_1.h index 238b3702..22cda44f 100644 --- a/src/lib/server/ClientProxy1_1.h +++ b/src/lib/server/ClientProxy1_1.h @@ -23,12 +23,12 @@ //! Proxy for client implementing protocol version 1.1 class ClientProxy1_1 : public ClientProxy1_0 { public: - ClientProxy1_1(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); - ~ClientProxy1_1(); + ClientProxy1_1(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); + ~ClientProxy1_1(); - // IClient overrides - virtual void keyDown(KeyID, KeyModifierMask, KeyButton); - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton); - virtual void keyUp(KeyID, KeyModifierMask, KeyButton); + // IClient overrides + virtual void keyDown(KeyID, KeyModifierMask, KeyButton); + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton); + virtual void keyUp(KeyID, KeyModifierMask, KeyButton); }; diff --git a/src/lib/server/ClientProxy1_2.cpp b/src/lib/server/ClientProxy1_2.cpp index 266aa62d..d6aca0f4 100644 --- a/src/lib/server/ClientProxy1_2.cpp +++ b/src/lib/server/ClientProxy1_2.cpp @@ -26,19 +26,19 @@ // ClientProxy1_2::ClientProxy1_2(const String& name, synergy::IStream* stream, IEventQueue* events) : - ClientProxy1_1(name, stream, events) + ClientProxy1_1(name, stream, events) { - // do nothing + // do nothing } ClientProxy1_2::~ClientProxy1_2() { - // do nothing + // do nothing } void ClientProxy1_2::mouseRelativeMove(SInt32 xRel, SInt32 yRel) { - LOG((CLOG_DEBUG2 "send mouse relative move to \"%s\" %d,%d", getName().c_str(), xRel, yRel)); - ProtocolUtil::writef(getStream(), kMsgDMouseRelMove, xRel, yRel); + LOG((CLOG_DEBUG2 "send mouse relative move to \"%s\" %d,%d", getName().c_str(), xRel, yRel)); + ProtocolUtil::writef(getStream(), kMsgDMouseRelMove, xRel, yRel); } diff --git a/src/lib/server/ClientProxy1_2.h b/src/lib/server/ClientProxy1_2.h index c11d1ef5..c54b90d2 100644 --- a/src/lib/server/ClientProxy1_2.h +++ b/src/lib/server/ClientProxy1_2.h @@ -25,9 +25,9 @@ class IEventQueue; //! Proxy for client implementing protocol version 1.2 class ClientProxy1_2 : public ClientProxy1_1 { public: - ClientProxy1_2(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); - ~ClientProxy1_2(); + ClientProxy1_2(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); + ~ClientProxy1_2(); - // IClient overrides - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); + // IClient overrides + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); }; diff --git a/src/lib/server/ClientProxy1_3.cpp b/src/lib/server/ClientProxy1_3.cpp index 6c32e10d..9f923595 100644 --- a/src/lib/server/ClientProxy1_3.cpp +++ b/src/lib/server/ClientProxy1_3.cpp @@ -31,99 +31,99 @@ // ClientProxy1_3::ClientProxy1_3(const String& name, synergy::IStream* stream, IEventQueue* events) : - ClientProxy1_2(name, stream, events), - m_keepAliveRate(kKeepAliveRate), - m_keepAliveTimer(NULL), - m_events(events) + ClientProxy1_2(name, stream, events), + m_keepAliveRate(kKeepAliveRate), + m_keepAliveTimer(NULL), + m_events(events) { - setHeartbeatRate(kKeepAliveRate, kKeepAliveRate * kKeepAlivesUntilDeath); + setHeartbeatRate(kKeepAliveRate, kKeepAliveRate * kKeepAlivesUntilDeath); } ClientProxy1_3::~ClientProxy1_3() { - // cannot do this in superclass or our override wouldn't get called - removeHeartbeatTimer(); + // cannot do this in superclass or our override wouldn't get called + removeHeartbeatTimer(); } void ClientProxy1_3::mouseWheel(SInt32 xDelta, SInt32 yDelta) { - LOG((CLOG_DEBUG2 "send mouse wheel to \"%s\" %+d,%+d", getName().c_str(), xDelta, yDelta)); - ProtocolUtil::writef(getStream(), kMsgDMouseWheel, xDelta, yDelta); + LOG((CLOG_DEBUG2 "send mouse wheel to \"%s\" %+d,%+d", getName().c_str(), xDelta, yDelta)); + ProtocolUtil::writef(getStream(), kMsgDMouseWheel, xDelta, yDelta); } bool ClientProxy1_3::parseMessage(const UInt8* code) { - // process message - if (memcmp(code, kMsgCKeepAlive, 4) == 0) { - // reset alarm - resetHeartbeatTimer(); - return true; - } - else { - return ClientProxy1_2::parseMessage(code); - } + // process message + if (memcmp(code, kMsgCKeepAlive, 4) == 0) { + // reset alarm + resetHeartbeatTimer(); + return true; + } + else { + return ClientProxy1_2::parseMessage(code); + } } void ClientProxy1_3::resetHeartbeatRate() { - setHeartbeatRate(kKeepAliveRate, kKeepAliveRate * kKeepAlivesUntilDeath); + setHeartbeatRate(kKeepAliveRate, kKeepAliveRate * kKeepAlivesUntilDeath); } void ClientProxy1_3::setHeartbeatRate(double rate, double) { - m_keepAliveRate = rate; - ClientProxy1_2::setHeartbeatRate(rate, rate * kKeepAlivesUntilDeath); + m_keepAliveRate = rate; + ClientProxy1_2::setHeartbeatRate(rate, rate * kKeepAlivesUntilDeath); } void ClientProxy1_3::resetHeartbeatTimer() { - // reset the alarm but not the keep alive timer - ClientProxy1_2::removeHeartbeatTimer(); - ClientProxy1_2::addHeartbeatTimer(); + // reset the alarm but not the keep alive timer + ClientProxy1_2::removeHeartbeatTimer(); + ClientProxy1_2::addHeartbeatTimer(); } void ClientProxy1_3::addHeartbeatTimer() { - // create and install a timer to periodically send keep alives - if (m_keepAliveRate > 0.0) { - m_keepAliveTimer = m_events->newTimer(m_keepAliveRate, NULL); - m_events->adoptHandler(Event::kTimer, m_keepAliveTimer, - new TMethodEventJob(this, - &ClientProxy1_3::handleKeepAlive, NULL)); - } + // create and install a timer to periodically send keep alives + if (m_keepAliveRate > 0.0) { + m_keepAliveTimer = m_events->newTimer(m_keepAliveRate, NULL); + m_events->adoptHandler(Event::kTimer, m_keepAliveTimer, + new TMethodEventJob(this, + &ClientProxy1_3::handleKeepAlive, NULL)); + } - // superclass does the alarm - ClientProxy1_2::addHeartbeatTimer(); + // superclass does the alarm + ClientProxy1_2::addHeartbeatTimer(); } void ClientProxy1_3::removeHeartbeatTimer() { - // remove the timer that sends keep alives periodically - if (m_keepAliveTimer != NULL) { - m_events->removeHandler(Event::kTimer, m_keepAliveTimer); - m_events->deleteTimer(m_keepAliveTimer); - m_keepAliveTimer = NULL; - } + // remove the timer that sends keep alives periodically + if (m_keepAliveTimer != NULL) { + m_events->removeHandler(Event::kTimer, m_keepAliveTimer); + m_events->deleteTimer(m_keepAliveTimer); + m_keepAliveTimer = NULL; + } - // superclass does the alarm - ClientProxy1_2::removeHeartbeatTimer(); + // superclass does the alarm + ClientProxy1_2::removeHeartbeatTimer(); } void ClientProxy1_3::handleKeepAlive(const Event&, void*) { - keepAlive(); + keepAlive(); } void ClientProxy1_3::keepAlive() { - ProtocolUtil::writef(getStream(), kMsgCKeepAlive); + ProtocolUtil::writef(getStream(), kMsgCKeepAlive); } diff --git a/src/lib/server/ClientProxy1_3.h b/src/lib/server/ClientProxy1_3.h index 054b201a..37299ca6 100644 --- a/src/lib/server/ClientProxy1_3.h +++ b/src/lib/server/ClientProxy1_3.h @@ -23,26 +23,26 @@ //! Proxy for client implementing protocol version 1.3 class ClientProxy1_3 : public ClientProxy1_2 { public: - ClientProxy1_3(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); - ~ClientProxy1_3(); + ClientProxy1_3(const String& name, synergy::IStream* adoptedStream, IEventQueue* events); + ~ClientProxy1_3(); - // IClient overrides - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); + // IClient overrides + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); - void handleKeepAlive(const Event&, void*); + void handleKeepAlive(const Event&, void*); protected: - // ClientProxy overrides - virtual bool parseMessage(const UInt8* code); - virtual void resetHeartbeatRate(); - virtual void setHeartbeatRate(double rate, double alarm); - virtual void resetHeartbeatTimer(); - virtual void addHeartbeatTimer(); - virtual void removeHeartbeatTimer(); - virtual void keepAlive(); + // ClientProxy overrides + virtual bool parseMessage(const UInt8* code); + virtual void resetHeartbeatRate(); + virtual void setHeartbeatRate(double rate, double alarm); + virtual void resetHeartbeatTimer(); + virtual void addHeartbeatTimer(); + virtual void removeHeartbeatTimer(); + virtual void keepAlive(); private: - double m_keepAliveRate; - EventQueueTimer* m_keepAliveTimer; - IEventQueue* m_events; + double m_keepAliveRate; + EventQueueTimer* m_keepAliveTimer; + IEventQueue* m_events; }; diff --git a/src/lib/server/ClientProxy1_4.cpp b/src/lib/server/ClientProxy1_4.cpp index 205876a4..52f105df 100644 --- a/src/lib/server/ClientProxy1_4.cpp +++ b/src/lib/server/ClientProxy1_4.cpp @@ -32,9 +32,9 @@ // ClientProxy1_4::ClientProxy1_4(const String& name, synergy::IStream* stream, Server* server, IEventQueue* events) : - ClientProxy1_3(name, stream, events), m_server(server) + ClientProxy1_3(name, stream, events), m_server(server) { - assert(m_server != NULL); + assert(m_server != NULL); } ClientProxy1_4::~ClientProxy1_4() @@ -44,23 +44,23 @@ ClientProxy1_4::~ClientProxy1_4() void ClientProxy1_4::keyDown(KeyID key, KeyModifierMask mask, KeyButton button) { - ClientProxy1_3::keyDown(key, mask, button); + ClientProxy1_3::keyDown(key, mask, button); } void ClientProxy1_4::keyRepeat(KeyID key, KeyModifierMask mask, SInt32 count, KeyButton button) { - ClientProxy1_3::keyRepeat(key, mask, count, button); + ClientProxy1_3::keyRepeat(key, mask, count, button); } void ClientProxy1_4::keyUp(KeyID key, KeyModifierMask mask, KeyButton button) { - ClientProxy1_3::keyUp(key, mask, button); + ClientProxy1_3::keyUp(key, mask, button); } void ClientProxy1_4::keepAlive() { - ClientProxy1_3::keepAlive(); + ClientProxy1_3::keepAlive(); } diff --git a/src/lib/server/ClientProxy1_4.h b/src/lib/server/ClientProxy1_4.h index 14adb118..8b08bc13 100644 --- a/src/lib/server/ClientProxy1_4.h +++ b/src/lib/server/ClientProxy1_4.h @@ -25,22 +25,22 @@ class Server; //! Proxy for client implementing protocol version 1.4 class ClientProxy1_4 : public ClientProxy1_3 { public: - ClientProxy1_4(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); - ~ClientProxy1_4(); + ClientProxy1_4(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); + ~ClientProxy1_4(); - //! @name accessors - //@{ + //! @name accessors + //@{ - //! get server pointer - Server* getServer() { return m_server; } + //! get server pointer + Server* getServer() { return m_server; } - //@} + //@} - // IClient overrides - virtual void keyDown(KeyID key, KeyModifierMask mask, KeyButton button); - virtual void keyRepeat(KeyID key, KeyModifierMask mask, SInt32 count, KeyButton button); - virtual void keyUp(KeyID key, KeyModifierMask mask, KeyButton button); - virtual void keepAlive(); + // IClient overrides + virtual void keyDown(KeyID key, KeyModifierMask mask, KeyButton button); + virtual void keyRepeat(KeyID key, KeyModifierMask mask, SInt32 count, KeyButton button); + virtual void keyUp(KeyID key, KeyModifierMask mask, KeyButton button); + virtual void keepAlive(); - Server* m_server; + Server* m_server; }; diff --git a/src/lib/server/ClientProxy1_5.cpp b/src/lib/server/ClientProxy1_5.cpp index 7df851de..91560c08 100644 --- a/src/lib/server/ClientProxy1_5.cpp +++ b/src/lib/server/ClientProxy1_5.cpp @@ -32,79 +32,79 @@ // ClientProxy1_5::ClientProxy1_5(const String& name, synergy::IStream* stream, Server* server, IEventQueue* events) : - ClientProxy1_4(name, stream, server, events), - m_events(events) + ClientProxy1_4(name, stream, server, events), + m_events(events) { - m_events->adoptHandler(m_events->forFile().keepAlive(), - this, - new TMethodEventJob(this, - &ClientProxy1_3::handleKeepAlive, NULL)); + m_events->adoptHandler(m_events->forFile().keepAlive(), + this, + new TMethodEventJob(this, + &ClientProxy1_3::handleKeepAlive, NULL)); } ClientProxy1_5::~ClientProxy1_5() { - m_events->removeHandler(m_events->forFile().keepAlive(), this); + m_events->removeHandler(m_events->forFile().keepAlive(), this); } void ClientProxy1_5::sendDragInfo(UInt32 fileCount, const char* info, size_t size) { - String data(info, size); + String data(info, size); - ProtocolUtil::writef(getStream(), kMsgDDragInfo, fileCount, &data); + ProtocolUtil::writef(getStream(), kMsgDDragInfo, fileCount, &data); } void ClientProxy1_5::fileChunkSending(UInt8 mark, char* data, size_t dataSize) { - FileChunk::send(getStream(), mark, data, dataSize); + FileChunk::send(getStream(), mark, data, dataSize); } bool ClientProxy1_5::parseMessage(const UInt8* code) { - if (memcmp(code, kMsgDFileTransfer, 4) == 0) { - fileChunkReceived(); - } - else if (memcmp(code, kMsgDDragInfo, 4) == 0) { - dragInfoReceived(); - } - else { - return ClientProxy1_4::parseMessage(code); - } + if (memcmp(code, kMsgDFileTransfer, 4) == 0) { + fileChunkReceived(); + } + else if (memcmp(code, kMsgDDragInfo, 4) == 0) { + dragInfoReceived(); + } + else { + return ClientProxy1_4::parseMessage(code); + } - return true; + return true; } void ClientProxy1_5::fileChunkReceived() { - Server* server = getServer(); - int result = FileChunk::assemble( - getStream(), - server->getReceivedFileData(), - server->getExpectedFileSize()); - + Server* server = getServer(); + int result = FileChunk::assemble( + getStream(), + server->getReceivedFileData(), + server->getExpectedFileSize()); + - if (result == kFinish) { - m_events->addEvent(Event(m_events->forFile().fileRecieveCompleted(), server)); - } - else if (result == kStart) { - if (server->getFakeDragFileList().size() > 0) { - String filename = server->getFakeDragFileList().at(0).getFilename(); - LOG((CLOG_DEBUG "start receiving %s", filename.c_str())); - } - } + if (result == kFinish) { + m_events->addEvent(Event(m_events->forFile().fileRecieveCompleted(), server)); + } + else if (result == kStart) { + if (server->getFakeDragFileList().size() > 0) { + String filename = server->getFakeDragFileList().at(0).getFilename(); + LOG((CLOG_DEBUG "start receiving %s", filename.c_str())); + } + } } void ClientProxy1_5::dragInfoReceived() { - // parse - UInt32 fileNum = 0; - String content; - ProtocolUtil::readf(getStream(), kMsgDDragInfo + 4, &fileNum, &content); - - m_server->dragInfoReceived(fileNum, content); + // parse + UInt32 fileNum = 0; + String content; + ProtocolUtil::readf(getStream(), kMsgDDragInfo + 4, &fileNum, &content); + + m_server->dragInfoReceived(fileNum, content); } diff --git a/src/lib/server/ClientProxy1_5.h b/src/lib/server/ClientProxy1_5.h index 3f1fc8e6..1d541005 100644 --- a/src/lib/server/ClientProxy1_5.h +++ b/src/lib/server/ClientProxy1_5.h @@ -27,15 +27,15 @@ class IEventQueue; //! Proxy for client implementing protocol version 1.5 class ClientProxy1_5 : public ClientProxy1_4 { public: - ClientProxy1_5(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); - ~ClientProxy1_5(); + ClientProxy1_5(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); + ~ClientProxy1_5(); - virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); - virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); - virtual bool parseMessage(const UInt8* code); - void fileChunkReceived(); - void dragInfoReceived(); + virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); + virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); + virtual bool parseMessage(const UInt8* code); + void fileChunkReceived(); + void dragInfoReceived(); private: - IEventQueue* m_events; + IEventQueue* m_events; }; diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp index 054efca1..deb70e13 100644 --- a/src/lib/server/ClientProxy1_6.cpp +++ b/src/lib/server/ClientProxy1_6.cpp @@ -30,13 +30,13 @@ // ClientProxy1_6::ClientProxy1_6(const String& name, synergy::IStream* stream, Server* server, IEventQueue* events) : - ClientProxy1_5(name, stream, server, events), - m_events(events) + ClientProxy1_5(name, stream, server, events), + m_events(events) { - m_events->adoptHandler(m_events->forClipboard().clipboardSending(), - this, - new TMethodEventJob(this, - &ClientProxy1_6::handleClipboardSendingEvent)); + m_events->adoptHandler(m_events->forClipboard().clipboardSending(), + this, + new TMethodEventJob(this, + &ClientProxy1_6::handleClipboardSendingEvent)); } ClientProxy1_6::~ClientProxy1_6() @@ -46,55 +46,55 @@ ClientProxy1_6::~ClientProxy1_6() void ClientProxy1_6::setClipboard(ClipboardID id, const IClipboard* clipboard) { - // ignore if this clipboard is already clean - if (m_clipboard[id].m_dirty) { - // this clipboard is now clean - m_clipboard[id].m_dirty = false; - Clipboard::copy(&m_clipboard[id].m_clipboard, clipboard); + // ignore if this clipboard is already clean + if (m_clipboard[id].m_dirty) { + // this clipboard is now clean + m_clipboard[id].m_dirty = false; + Clipboard::copy(&m_clipboard[id].m_clipboard, clipboard); - String data = m_clipboard[id].m_clipboard.marshall(); + String data = m_clipboard[id].m_clipboard.marshall(); - size_t size = data.size(); - LOG((CLOG_DEBUG "sending clipboard %d to \"%s\"", id, getName().c_str())); + size_t size = data.size(); + LOG((CLOG_DEBUG "sending clipboard %d to \"%s\"", id, getName().c_str())); - StreamChunker::sendClipboard(data, size, id, 0, m_events, this); - } + StreamChunker::sendClipboard(data, size, id, 0, m_events, this); + } } void ClientProxy1_6::handleClipboardSendingEvent(const Event& event, void*) { - ClipboardChunk::send(getStream(), event.getData()); + ClipboardChunk::send(getStream(), event.getData()); } bool ClientProxy1_6::recvClipboard() { - // parse message - static String dataCached; - ClipboardID id; - UInt32 seq; + // parse message + static String dataCached; + ClipboardID id; + UInt32 seq; - int r = ClipboardChunk::assemble(getStream(), dataCached, id, seq); + int r = ClipboardChunk::assemble(getStream(), dataCached, id, seq); - if (r == kStart) { - size_t size = ClipboardChunk::getExpectedSize(); - LOG((CLOG_DEBUG "receiving clipboard %d size=%d", id, size)); - } - else if (r == kFinish) { - LOG((CLOG_DEBUG "received client \"%s\" clipboard %d seqnum=%d, size=%d", - getName().c_str(), id, seq, dataCached.size())); - // save clipboard - m_clipboard[id].m_clipboard.unmarshall(dataCached, 0); - m_clipboard[id].m_sequenceNumber = seq; - - // notify - ClipboardInfo* info = new ClipboardInfo; - info->m_id = id; - info->m_sequenceNumber = seq; - m_events->addEvent(Event(m_events->forClipboard().clipboardChanged(), - getEventTarget(), info)); - } + if (r == kStart) { + size_t size = ClipboardChunk::getExpectedSize(); + LOG((CLOG_DEBUG "receiving clipboard %d size=%d", id, size)); + } + else if (r == kFinish) { + LOG((CLOG_DEBUG "received client \"%s\" clipboard %d seqnum=%d, size=%d", + getName().c_str(), id, seq, dataCached.size())); + // save clipboard + m_clipboard[id].m_clipboard.unmarshall(dataCached, 0); + m_clipboard[id].m_sequenceNumber = seq; + + // notify + ClipboardInfo* info = new ClipboardInfo; + info->m_id = id; + info->m_sequenceNumber = seq; + m_events->addEvent(Event(m_events->forClipboard().clipboardChanged(), + getEventTarget(), info)); + } - return true; + return true; } diff --git a/src/lib/server/ClientProxy1_6.h b/src/lib/server/ClientProxy1_6.h index 98dd8d24..395365e6 100644 --- a/src/lib/server/ClientProxy1_6.h +++ b/src/lib/server/ClientProxy1_6.h @@ -25,15 +25,15 @@ class IEventQueue; //! Proxy for client implementing protocol version 1.6 class ClientProxy1_6 : public ClientProxy1_5 { public: - ClientProxy1_6(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); - ~ClientProxy1_6(); + ClientProxy1_6(const String& name, synergy::IStream* adoptedStream, Server* server, IEventQueue* events); + ~ClientProxy1_6(); - virtual void setClipboard(ClipboardID id, const IClipboard* clipboard); - virtual bool recvClipboard(); + virtual void setClipboard(ClipboardID id, const IClipboard* clipboard); + virtual bool recvClipboard(); private: - void handleClipboardSendingEvent(const Event&, void*); + void handleClipboardSendingEvent(const Event&, void*); private: - IEventQueue* m_events; + IEventQueue* m_events; }; diff --git a/src/lib/server/ClientProxyUnknown.cpp b/src/lib/server/ClientProxyUnknown.cpp index eab15622..7df67c0f 100644 --- a/src/lib/server/ClientProxyUnknown.cpp +++ b/src/lib/server/ClientProxyUnknown.cpp @@ -41,255 +41,255 @@ // ClientProxyUnknown::ClientProxyUnknown(synergy::IStream* stream, double timeout, Server* server, IEventQueue* events) : - m_stream(stream), - m_proxy(NULL), - m_ready(false), - m_server(server), - m_events(events) + m_stream(stream), + m_proxy(NULL), + m_ready(false), + m_server(server), + m_events(events) { - assert(m_server != NULL); + assert(m_server != NULL); - m_events->adoptHandler(Event::kTimer, this, - new TMethodEventJob(this, - &ClientProxyUnknown::handleTimeout, NULL)); - m_timer = m_events->newOneShotTimer(timeout, this); - addStreamHandlers(); + m_events->adoptHandler(Event::kTimer, this, + new TMethodEventJob(this, + &ClientProxyUnknown::handleTimeout, NULL)); + m_timer = m_events->newOneShotTimer(timeout, this); + addStreamHandlers(); - LOG((CLOG_DEBUG1 "saying hello")); - ProtocolUtil::writef(m_stream, kMsgHello, - kProtocolMajorVersion, - kProtocolMinorVersion); + LOG((CLOG_DEBUG1 "saying hello")); + ProtocolUtil::writef(m_stream, kMsgHello, + kProtocolMajorVersion, + kProtocolMinorVersion); } ClientProxyUnknown::~ClientProxyUnknown() { - removeHandlers(); - removeTimer(); - delete m_stream; - delete m_proxy; + removeHandlers(); + removeTimer(); + delete m_stream; + delete m_proxy; } ClientProxy* ClientProxyUnknown::orphanClientProxy() { - if (m_ready) { - removeHandlers(); - ClientProxy* proxy = m_proxy; - m_proxy = NULL; - return proxy; - } - else { - return NULL; - } + if (m_ready) { + removeHandlers(); + ClientProxy* proxy = m_proxy; + m_proxy = NULL; + return proxy; + } + else { + return NULL; + } } void ClientProxyUnknown::sendSuccess() { - m_ready = true; - removeTimer(); - m_events->addEvent(Event(m_events->forClientProxyUnknown().success(), this)); + m_ready = true; + removeTimer(); + m_events->addEvent(Event(m_events->forClientProxyUnknown().success(), this)); } void ClientProxyUnknown::sendFailure() { - delete m_proxy; - m_proxy = NULL; - m_ready = false; - removeHandlers(); - removeTimer(); - m_events->addEvent(Event(m_events->forClientProxyUnknown().failure(), this)); + delete m_proxy; + m_proxy = NULL; + m_ready = false; + removeHandlers(); + removeTimer(); + m_events->addEvent(Event(m_events->forClientProxyUnknown().failure(), this)); } void ClientProxyUnknown::addStreamHandlers() { - assert(m_stream != NULL); + assert(m_stream != NULL); - m_events->adoptHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxyUnknown::handleData)); - m_events->adoptHandler(m_events->forIStream().outputError(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxyUnknown::handleWriteError)); - m_events->adoptHandler(m_events->forIStream().inputShutdown(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxyUnknown::handleDisconnect)); - m_events->adoptHandler(m_events->forIStream().outputShutdown(), - m_stream->getEventTarget(), - new TMethodEventJob(this, - &ClientProxyUnknown::handleWriteError)); + m_events->adoptHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxyUnknown::handleData)); + m_events->adoptHandler(m_events->forIStream().outputError(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxyUnknown::handleWriteError)); + m_events->adoptHandler(m_events->forIStream().inputShutdown(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxyUnknown::handleDisconnect)); + m_events->adoptHandler(m_events->forIStream().outputShutdown(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &ClientProxyUnknown::handleWriteError)); } void ClientProxyUnknown::addProxyHandlers() { - assert(m_proxy != NULL); + assert(m_proxy != NULL); - m_events->adoptHandler(m_events->forClientProxy().ready(), - m_proxy, - new TMethodEventJob(this, - &ClientProxyUnknown::handleReady)); - m_events->adoptHandler(m_events->forClientProxy().disconnected(), - m_proxy, - new TMethodEventJob(this, - &ClientProxyUnknown::handleDisconnect)); + m_events->adoptHandler(m_events->forClientProxy().ready(), + m_proxy, + new TMethodEventJob(this, + &ClientProxyUnknown::handleReady)); + m_events->adoptHandler(m_events->forClientProxy().disconnected(), + m_proxy, + new TMethodEventJob(this, + &ClientProxyUnknown::handleDisconnect)); } void ClientProxyUnknown::removeHandlers() { - if (m_stream != NULL) { - m_events->removeHandler(m_events->forIStream().inputReady(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputError(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().inputShutdown(), - m_stream->getEventTarget()); - m_events->removeHandler(m_events->forIStream().outputShutdown(), - m_stream->getEventTarget()); - } - if (m_proxy != NULL) { - m_events->removeHandler(m_events->forClientProxy().ready(), - m_proxy); - m_events->removeHandler(m_events->forClientProxy().disconnected(), - m_proxy); - } + if (m_stream != NULL) { + m_events->removeHandler(m_events->forIStream().inputReady(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputError(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().inputShutdown(), + m_stream->getEventTarget()); + m_events->removeHandler(m_events->forIStream().outputShutdown(), + m_stream->getEventTarget()); + } + if (m_proxy != NULL) { + m_events->removeHandler(m_events->forClientProxy().ready(), + m_proxy); + m_events->removeHandler(m_events->forClientProxy().disconnected(), + m_proxy); + } } void ClientProxyUnknown::removeTimer() { - if (m_timer != NULL) { - m_events->deleteTimer(m_timer); - m_events->removeHandler(Event::kTimer, this); - m_timer = NULL; - } + if (m_timer != NULL) { + m_events->deleteTimer(m_timer); + m_events->removeHandler(Event::kTimer, this); + m_timer = NULL; + } } void ClientProxyUnknown::handleData(const Event&, void*) { - LOG((CLOG_DEBUG1 "parsing hello reply")); + LOG((CLOG_DEBUG1 "parsing hello reply")); - String name(""); - try { - // limit the maximum length of the hello - UInt32 n = m_stream->getSize(); - if (n > kMaxHelloLength) { - LOG((CLOG_DEBUG1 "hello reply too long")); - throw XBadClient(); - } + String name(""); + try { + // limit the maximum length of the hello + UInt32 n = m_stream->getSize(); + if (n > kMaxHelloLength) { + LOG((CLOG_DEBUG1 "hello reply too long")); + throw XBadClient(); + } - // parse the reply to hello - SInt16 major, minor; - if (!ProtocolUtil::readf(m_stream, kMsgHelloBack, - &major, &minor, &name)) { - throw XBadClient(); - } + // parse the reply to hello + SInt16 major, minor; + if (!ProtocolUtil::readf(m_stream, kMsgHelloBack, + &major, &minor, &name)) { + throw XBadClient(); + } - // disallow invalid version numbers - if (major <= 0 || minor < 0) { - throw XIncompatibleClient(major, minor); - } + // disallow invalid version numbers + if (major <= 0 || minor < 0) { + throw XIncompatibleClient(major, minor); + } - // remove stream event handlers. the proxy we're about to create - // may install its own handlers and we don't want to accidentally - // remove those later. - removeHandlers(); + // remove stream event handlers. the proxy we're about to create + // may install its own handlers and we don't want to accidentally + // remove those later. + removeHandlers(); - // create client proxy for highest version supported by the client - if (major == 1) { - switch (minor) { - case 0: - m_proxy = new ClientProxy1_0(name, m_stream, m_events); - break; + // create client proxy for highest version supported by the client + if (major == 1) { + switch (minor) { + case 0: + m_proxy = new ClientProxy1_0(name, m_stream, m_events); + break; - case 1: - m_proxy = new ClientProxy1_1(name, m_stream, m_events); - break; + case 1: + m_proxy = new ClientProxy1_1(name, m_stream, m_events); + break; - case 2: - m_proxy = new ClientProxy1_2(name, m_stream, m_events); - break; + case 2: + m_proxy = new ClientProxy1_2(name, m_stream, m_events); + break; - case 3: - m_proxy = new ClientProxy1_3(name, m_stream, m_events); - break; + case 3: + m_proxy = new ClientProxy1_3(name, m_stream, m_events); + break; - case 4: - m_proxy = new ClientProxy1_4(name, m_stream, m_server, m_events); - break; + case 4: + m_proxy = new ClientProxy1_4(name, m_stream, m_server, m_events); + break; - case 5: - m_proxy = new ClientProxy1_5(name, m_stream, m_server, m_events); - break; + case 5: + m_proxy = new ClientProxy1_5(name, m_stream, m_server, m_events); + break; - case 6: - m_proxy = new ClientProxy1_6(name, m_stream, m_server, m_events); - break; - } - } + case 6: + m_proxy = new ClientProxy1_6(name, m_stream, m_server, m_events); + break; + } + } - // hangup (with error) if version isn't supported - if (m_proxy == NULL) { - throw XIncompatibleClient(major, minor); - } + // hangup (with error) if version isn't supported + if (m_proxy == NULL) { + throw XIncompatibleClient(major, minor); + } - // the proxy is created and now proxy now owns the stream - LOG((CLOG_DEBUG1 "created proxy for client \"%s\" version %d.%d", name.c_str(), major, minor)); - m_stream = NULL; + // the proxy is created and now proxy now owns the stream + LOG((CLOG_DEBUG1 "created proxy for client \"%s\" version %d.%d", name.c_str(), major, minor)); + m_stream = NULL; - // wait until the proxy signals that it's ready or has disconnected - addProxyHandlers(); - return; - } - catch (XIncompatibleClient& e) { - // client is incompatible - LOG((CLOG_WARN "client \"%s\" has incompatible version %d.%d)", name.c_str(), e.getMajor(), e.getMinor())); - ProtocolUtil::writef(m_stream, - kMsgEIncompatible, - kProtocolMajorVersion, kProtocolMinorVersion); - } - catch (XBadClient&) { - // client not behaving - LOG((CLOG_WARN "protocol error from client \"%s\"", name.c_str())); - ProtocolUtil::writef(m_stream, kMsgEBad); - } - catch (XBase& e) { - // misc error - LOG((CLOG_WARN "error communicating with client \"%s\": %s", name.c_str(), e.what())); - } - sendFailure(); + // wait until the proxy signals that it's ready or has disconnected + addProxyHandlers(); + return; + } + catch (XIncompatibleClient& e) { + // client is incompatible + LOG((CLOG_WARN "client \"%s\" has incompatible version %d.%d)", name.c_str(), e.getMajor(), e.getMinor())); + ProtocolUtil::writef(m_stream, + kMsgEIncompatible, + kProtocolMajorVersion, kProtocolMinorVersion); + } + catch (XBadClient&) { + // client not behaving + LOG((CLOG_WARN "protocol error from client \"%s\"", name.c_str())); + ProtocolUtil::writef(m_stream, kMsgEBad); + } + catch (XBase& e) { + // misc error + LOG((CLOG_WARN "error communicating with client \"%s\": %s", name.c_str(), e.what())); + } + sendFailure(); } void ClientProxyUnknown::handleWriteError(const Event&, void*) { - LOG((CLOG_NOTE "error communicating with new client")); - sendFailure(); + LOG((CLOG_NOTE "error communicating with new client")); + sendFailure(); } void ClientProxyUnknown::handleTimeout(const Event&, void*) { - LOG((CLOG_NOTE "new client is unresponsive")); - sendFailure(); + LOG((CLOG_NOTE "new client is unresponsive")); + sendFailure(); } void ClientProxyUnknown::handleDisconnect(const Event&, void*) { - LOG((CLOG_NOTE "new client disconnected")); - sendFailure(); + LOG((CLOG_NOTE "new client disconnected")); + sendFailure(); } void ClientProxyUnknown::handleReady(const Event&, void*) { - sendSuccess(); + sendSuccess(); } diff --git a/src/lib/server/ClientProxyUnknown.h b/src/lib/server/ClientProxyUnknown.h index e618b3a2..88ef88ba 100644 --- a/src/lib/server/ClientProxyUnknown.h +++ b/src/lib/server/ClientProxyUnknown.h @@ -29,43 +29,43 @@ class IEventQueue; class ClientProxyUnknown { public: - ClientProxyUnknown(synergy::IStream* stream, double timeout, Server* server, IEventQueue* events); - ~ClientProxyUnknown(); + ClientProxyUnknown(synergy::IStream* stream, double timeout, Server* server, IEventQueue* events); + ~ClientProxyUnknown(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Get the client proxy - /*! - Returns the client proxy created after a successful handshake - (i.e. when this object sends a success event). Returns NULL - if the handshake is unsuccessful or incomplete. - */ - ClientProxy* orphanClientProxy(); + //! Get the client proxy + /*! + Returns the client proxy created after a successful handshake + (i.e. when this object sends a success event). Returns NULL + if the handshake is unsuccessful or incomplete. + */ + ClientProxy* orphanClientProxy(); - //! Get the stream - synergy::IStream* getStream() { return m_stream; } + //! Get the stream + synergy::IStream* getStream() { return m_stream; } - //@} + //@} private: - void sendSuccess(); - void sendFailure(); - void addStreamHandlers(); - void addProxyHandlers(); - void removeHandlers(); - void removeTimer(); - void handleData(const Event&, void*); - void handleWriteError(const Event&, void*); - void handleTimeout(const Event&, void*); - void handleDisconnect(const Event&, void*); - void handleReady(const Event&, void*); + void sendSuccess(); + void sendFailure(); + void addStreamHandlers(); + void addProxyHandlers(); + void removeHandlers(); + void removeTimer(); + void handleData(const Event&, void*); + void handleWriteError(const Event&, void*); + void handleTimeout(const Event&, void*); + void handleDisconnect(const Event&, void*); + void handleReady(const Event&, void*); private: - synergy::IStream* m_stream; - EventQueueTimer* m_timer; - ClientProxy* m_proxy; - bool m_ready; - Server* m_server; - IEventQueue* m_events; + synergy::IStream* m_stream; + EventQueueTimer* m_timer; + ClientProxy* m_proxy; + bool m_ready; + Server* m_server; + IEventQueue* m_events; }; diff --git a/src/lib/server/Config.h b/src/lib/server/Config.h index 03422e0d..75b37203 100644 --- a/src/lib/server/Config.h +++ b/src/lib/server/Config.h @@ -37,11 +37,11 @@ class IEventQueue; namespace std { template <> struct iterator_traits { - typedef String value_type; - typedef ptrdiff_t difference_type; - typedef bidirectional_iterator_tag iterator_category; - typedef String* pointer; - typedef String& reference; + typedef String value_type; + typedef ptrdiff_t difference_type; + typedef bidirectional_iterator_tag iterator_category; + typedef String* pointer; + typedef String& reference; }; }; @@ -57,428 +57,428 @@ namespace and must be unique. */ class Config { public: - typedef std::map ScreenOptions; - typedef std::pair Interval; + typedef std::map ScreenOptions; + typedef std::pair Interval; - class CellEdge { - public: - CellEdge(EDirection side, float position); - CellEdge(EDirection side, const Interval&); - CellEdge(const String& name, EDirection side, const Interval&); - ~CellEdge(); + class CellEdge { + public: + CellEdge(EDirection side, float position); + CellEdge(EDirection side, const Interval&); + CellEdge(const String& name, EDirection side, const Interval&); + ~CellEdge(); - Interval getInterval() const; - void setName(const String& newName); - String getName() const; - EDirection getSide() const; - bool overlaps(const CellEdge&) const; - bool isInside(float x) const; + Interval getInterval() const; + void setName(const String& newName); + String getName() const; + EDirection getSide() const; + bool overlaps(const CellEdge&) const; + bool isInside(float x) const; - // transform position to [0,1] - float transform(float x) const; + // transform position to [0,1] + float transform(float x) const; - // transform [0,1] to position - float inverseTransform(float x) const; + // transform [0,1] to position + float inverseTransform(float x) const; - // compares side and start of interval - bool operator<(const CellEdge&) const; + // compares side and start of interval + bool operator<(const CellEdge&) const; - // compares side and interval - bool operator==(const CellEdge&) const; - bool operator!=(const CellEdge&) const; + // compares side and interval + bool operator==(const CellEdge&) const; + bool operator!=(const CellEdge&) const; - private: - void init(const String& name, EDirection side, - const Interval&); + private: + void init(const String& name, EDirection side, + const Interval&); - private: - String m_name; - EDirection m_side; - Interval m_interval; - }; + private: + String m_name; + EDirection m_side; + Interval m_interval; + }; private: - class Name { - public: - Name(Config*, const String& name); + class Name { + public: + Name(Config*, const String& name); - bool operator==(const String& name) const; + bool operator==(const String& name) const; - private: - Config* m_config; - String m_name; - }; + private: + Config* m_config; + String m_name; + }; - class Cell { - private: - typedef std::map EdgeLinks; + class Cell { + private: + typedef std::map EdgeLinks; - public: - typedef EdgeLinks::const_iterator const_iterator; + public: + typedef EdgeLinks::const_iterator const_iterator; - bool add(const CellEdge& src, const CellEdge& dst); - void remove(EDirection side); - void remove(EDirection side, float position); - void remove(const Name& destinationName); - void rename(const Name& oldName, const String& newName); + bool add(const CellEdge& src, const CellEdge& dst); + void remove(EDirection side); + void remove(EDirection side, float position); + void remove(const Name& destinationName); + void rename(const Name& oldName, const String& newName); - bool hasEdge(const CellEdge&) const; - bool overlaps(const CellEdge&) const; + bool hasEdge(const CellEdge&) const; + bool overlaps(const CellEdge&) const; - bool getLink(EDirection side, float position, - const CellEdge*& src, const CellEdge*& dst) const; + bool getLink(EDirection side, float position, + const CellEdge*& src, const CellEdge*& dst) const; - bool operator==(const Cell&) const; - bool operator!=(const Cell&) const; + bool operator==(const Cell&) const; + bool operator!=(const Cell&) const; - const_iterator begin() const; - const_iterator end() const; + const_iterator begin() const; + const_iterator end() const; - private: - EdgeLinks m_neighbors; + private: + EdgeLinks m_neighbors; - public: - ScreenOptions m_options; - }; - typedef std::map CellMap; - typedef std::map NameMap; + public: + ScreenOptions m_options; + }; + typedef std::map CellMap; + typedef std::map NameMap; public: - typedef Cell::const_iterator link_const_iterator; - typedef CellMap::const_iterator internal_const_iterator; - typedef NameMap::const_iterator all_const_iterator; - class const_iterator : std::iterator_traits { - public: - explicit const_iterator() : m_i() { } - explicit const_iterator(const internal_const_iterator& i) : m_i(i) { } + typedef Cell::const_iterator link_const_iterator; + typedef CellMap::const_iterator internal_const_iterator; + typedef NameMap::const_iterator all_const_iterator; + class const_iterator : std::iterator_traits { + public: + explicit const_iterator() : m_i() { } + explicit const_iterator(const internal_const_iterator& i) : m_i(i) { } - const_iterator& operator=(const const_iterator& i) { - m_i = i.m_i; - return *this; - } - String operator*() { return m_i->first; } - const String* operator->() { return &(m_i->first); } - const_iterator& operator++() { ++m_i; return *this; } - const_iterator operator++(int) { return const_iterator(m_i++); } - const_iterator& operator--() { --m_i; return *this; } - const_iterator operator--(int) { return const_iterator(m_i--); } - bool operator==(const const_iterator& i) const { - return (m_i == i.m_i); - } - bool operator!=(const const_iterator& i) const { - return (m_i != i.m_i); - } + const_iterator& operator=(const const_iterator& i) { + m_i = i.m_i; + return *this; + } + String operator*() { return m_i->first; } + const String* operator->() { return &(m_i->first); } + const_iterator& operator++() { ++m_i; return *this; } + const_iterator operator++(int) { return const_iterator(m_i++); } + const_iterator& operator--() { --m_i; return *this; } + const_iterator operator--(int) { return const_iterator(m_i--); } + bool operator==(const const_iterator& i) const { + return (m_i == i.m_i); + } + bool operator!=(const const_iterator& i) const { + return (m_i != i.m_i); + } - private: - internal_const_iterator m_i; - }; + private: + internal_const_iterator m_i; + }; - Config(IEventQueue* events); - virtual ~Config(); + Config(IEventQueue* events); + virtual ~Config(); #ifdef TEST_ENV - Config() : m_inputFilter(NULL) { } + Config() : m_inputFilter(NULL) { } #endif - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Add screen - /*! - Adds a screen, returning true iff successful. If a screen or - alias with the given name exists then it fails. - */ - bool addScreen(const String& name); + //! Add screen + /*! + Adds a screen, returning true iff successful. If a screen or + alias with the given name exists then it fails. + */ + bool addScreen(const String& name); - //! Rename screen - /*! - Renames a screen. All references to the name are updated. - Returns true iff successful. - */ - bool renameScreen(const String& oldName, - const String& newName); + //! Rename screen + /*! + Renames a screen. All references to the name are updated. + Returns true iff successful. + */ + bool renameScreen(const String& oldName, + const String& newName); - //! Remove screen - /*! - Removes a screen. This also removes aliases for the screen and - disconnects any connections to the screen. \c name may be an - alias. - */ - void removeScreen(const String& name); + //! Remove screen + /*! + Removes a screen. This also removes aliases for the screen and + disconnects any connections to the screen. \c name may be an + alias. + */ + void removeScreen(const String& name); - //! Remove all screens - /*! - Removes all screens, aliases, and connections. - */ - void removeAllScreens(); + //! Remove all screens + /*! + Removes all screens, aliases, and connections. + */ + void removeAllScreens(); - //! Add alias - /*! - Adds an alias for a screen name. An alias can be used - any place the canonical screen name can (except addScreen()). - Returns false if the alias name already exists or the canonical - name is unknown, otherwise returns true. - */ - bool addAlias(const String& canonical, - const String& alias); + //! Add alias + /*! + Adds an alias for a screen name. An alias can be used + any place the canonical screen name can (except addScreen()). + Returns false if the alias name already exists or the canonical + name is unknown, otherwise returns true. + */ + bool addAlias(const String& canonical, + const String& alias); - //! Remove alias - /*! - Removes an alias for a screen name. It returns false if the - alias is unknown or a canonical name, otherwise returns true. - */ - bool removeAlias(const String& alias); + //! Remove alias + /*! + Removes an alias for a screen name. It returns false if the + alias is unknown or a canonical name, otherwise returns true. + */ + bool removeAlias(const String& alias); - //! Remove aliases - /*! - Removes all aliases for a canonical screen name. It returns false - if the canonical name is unknown, otherwise returns true. - */ - bool removeAliases(const String& canonical); + //! Remove aliases + /*! + Removes all aliases for a canonical screen name. It returns false + if the canonical name is unknown, otherwise returns true. + */ + bool removeAliases(const String& canonical); - //! Remove all aliases - /*! - This removes all aliases but not the screens. - */ - void removeAllAliases(); + //! Remove all aliases + /*! + This removes all aliases but not the screens. + */ + void removeAllAliases(); - //! Connect screens - /*! - Establishes a one-way connection between portions of opposite edges - of two screens. Each portion is described by an interval defined - by two numbers, the start and end of the interval half-open on the - end. The numbers range from 0 to 1, inclusive, for the left/top - to the right/bottom. The user will be able to jump from the - \c srcStart to \c srcSend interval of \c srcSide of screen - \c srcName to the opposite side of screen \c dstName in the interval - \c dstStart and \c dstEnd when both screens are connected to the - server and the user isn't locked to a screen. Returns false if - \c srcName is unknown. \c srcStart must be less than or equal to - \c srcEnd and \c dstStart must be less then or equal to \c dstEnd - and all of \c srcStart, \c srcEnd, \c dstStart, or \c dstEnd must - be inside the range [0,1]. - */ - bool connect(const String& srcName, - EDirection srcSide, - float srcStart, float srcEnd, - const String& dstName, - float dstStart, float dstEnd); + //! Connect screens + /*! + Establishes a one-way connection between portions of opposite edges + of two screens. Each portion is described by an interval defined + by two numbers, the start and end of the interval half-open on the + end. The numbers range from 0 to 1, inclusive, for the left/top + to the right/bottom. The user will be able to jump from the + \c srcStart to \c srcSend interval of \c srcSide of screen + \c srcName to the opposite side of screen \c dstName in the interval + \c dstStart and \c dstEnd when both screens are connected to the + server and the user isn't locked to a screen. Returns false if + \c srcName is unknown. \c srcStart must be less than or equal to + \c srcEnd and \c dstStart must be less then or equal to \c dstEnd + and all of \c srcStart, \c srcEnd, \c dstStart, or \c dstEnd must + be inside the range [0,1]. + */ + bool connect(const String& srcName, + EDirection srcSide, + float srcStart, float srcEnd, + const String& dstName, + float dstStart, float dstEnd); - //! Disconnect screens - /*! - Removes all connections created by connect() on side \c srcSide. - Returns false if \c srcName is unknown. - */ - bool disconnect(const String& srcName, - EDirection srcSide); + //! Disconnect screens + /*! + Removes all connections created by connect() on side \c srcSide. + Returns false if \c srcName is unknown. + */ + bool disconnect(const String& srcName, + EDirection srcSide); - //! Disconnect screens - /*! - Removes the connections created by connect() on side \c srcSide - covering position \c position. Returns false if \c srcName is - unknown. - */ - bool disconnect(const String& srcName, - EDirection srcSide, float position); + //! Disconnect screens + /*! + Removes the connections created by connect() on side \c srcSide + covering position \c position. Returns false if \c srcName is + unknown. + */ + bool disconnect(const String& srcName, + EDirection srcSide, float position); - //! Set server address - /*! - Set the synergy listen addresses. There is no default address so - this must be called to run a server using this configuration. - */ - void setSynergyAddress(const NetworkAddress&); + //! Set server address + /*! + Set the synergy listen addresses. There is no default address so + this must be called to run a server using this configuration. + */ + void setSynergyAddress(const NetworkAddress&); - //! Add a screen option - /*! - Adds an option and its value to the named screen. Replaces the - existing option's value if there is one. Returns true iff \c name - is a known screen. - */ - bool addOption(const String& name, - OptionID option, OptionValue value); + //! Add a screen option + /*! + Adds an option and its value to the named screen. Replaces the + existing option's value if there is one. Returns true iff \c name + is a known screen. + */ + bool addOption(const String& name, + OptionID option, OptionValue value); - //! Remove a screen option - /*! - Removes an option and its value from the named screen. Does - nothing if the option doesn't exist on the screen. Returns true - iff \c name is a known screen. - */ - bool removeOption(const String& name, OptionID option); + //! Remove a screen option + /*! + Removes an option and its value from the named screen. Does + nothing if the option doesn't exist on the screen. Returns true + iff \c name is a known screen. + */ + bool removeOption(const String& name, OptionID option); - //! Remove a screen options - /*! - Removes all options and values from the named screen. Returns true - iff \c name is a known screen. - */ - bool removeOptions(const String& name); + //! Remove a screen options + /*! + Removes all options and values from the named screen. Returns true + iff \c name is a known screen. + */ + bool removeOptions(const String& name); - //! Get the hot key input filter - /*! - Returns the hot key input filter. Clients can modify hotkeys using - that object. - */ - virtual InputFilter* - getInputFilter(); + //! Get the hot key input filter + /*! + Returns the hot key input filter. Clients can modify hotkeys using + that object. + */ + virtual InputFilter* + getInputFilter(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Test screen name validity - /*! - Returns true iff \c name is a valid screen name. - */ - bool isValidScreenName(const String& name) const; + //! Test screen name validity + /*! + Returns true iff \c name is a valid screen name. + */ + bool isValidScreenName(const String& name) const; - //! Get beginning (canonical) screen name iterator - const_iterator begin() const; - //! Get ending (canonical) screen name iterator - const_iterator end() const; + //! Get beginning (canonical) screen name iterator + const_iterator begin() const; + //! Get ending (canonical) screen name iterator + const_iterator end() const; - //! Get beginning screen name iterator - all_const_iterator beginAll() const; - //! Get ending screen name iterator - all_const_iterator endAll() const; + //! Get beginning screen name iterator + all_const_iterator beginAll() const; + //! Get ending screen name iterator + all_const_iterator endAll() const; - //! Test for screen name - /*! - Returns true iff \c name names a screen. - */ - virtual bool isScreen(const String& name) const; + //! Test for screen name + /*! + Returns true iff \c name names a screen. + */ + virtual bool isScreen(const String& name) const; - //! Test for canonical screen name - /*! - Returns true iff \c name is the canonical name of a screen. - */ - bool isCanonicalName(const String& name) const; + //! Test for canonical screen name + /*! + Returns true iff \c name is the canonical name of a screen. + */ + bool isCanonicalName(const String& name) const; - //! Get canonical name - /*! - Returns the canonical name of a screen or the empty string if - the name is unknown. Returns the canonical name if one is given. - */ - String getCanonicalName(const String& name) const; + //! Get canonical name + /*! + Returns the canonical name of a screen or the empty string if + the name is unknown. Returns the canonical name if one is given. + */ + String getCanonicalName(const String& name) const; - //! Get neighbor - /*! - Returns the canonical screen name of the neighbor in the given - direction (set through connect()) at position \c position. Returns - the empty string if there is no neighbor in that direction, otherwise - saves the position on the neighbor in \c positionOut if it's not - \c NULL. - */ - String getNeighbor(const String&, EDirection, - float position, float* positionOut) const; + //! Get neighbor + /*! + Returns the canonical screen name of the neighbor in the given + direction (set through connect()) at position \c position. Returns + the empty string if there is no neighbor in that direction, otherwise + saves the position on the neighbor in \c positionOut if it's not + \c NULL. + */ + String getNeighbor(const String&, EDirection, + float position, float* positionOut) const; - //! Check for neighbor - /*! - Returns \c true if the screen has a neighbor anywhere along the edge - given by the direction. - */ - bool hasNeighbor(const String&, EDirection) const; + //! Check for neighbor + /*! + Returns \c true if the screen has a neighbor anywhere along the edge + given by the direction. + */ + bool hasNeighbor(const String&, EDirection) const; - //! Check for neighbor - /*! - Returns \c true if the screen has a neighbor in the given range along - the edge given by the direction. - */ - bool hasNeighbor(const String&, EDirection, - float start, float end) const; + //! Check for neighbor + /*! + Returns \c true if the screen has a neighbor in the given range along + the edge given by the direction. + */ + bool hasNeighbor(const String&, EDirection, + float start, float end) const; - //! Get beginning neighbor iterator - link_const_iterator beginNeighbor(const String&) const; - //! Get ending neighbor iterator - link_const_iterator endNeighbor(const String&) const; + //! Get beginning neighbor iterator + link_const_iterator beginNeighbor(const String&) const; + //! Get ending neighbor iterator + link_const_iterator endNeighbor(const String&) const; - //! Get the server address - const NetworkAddress& - getSynergyAddress() const; + //! Get the server address + const NetworkAddress& + getSynergyAddress() const; - //! Get the screen options - /*! - Returns all the added options for the named screen. Returns NULL - if the screen is unknown and an empty collection if there are no - options. - */ - const ScreenOptions* - getOptions(const String& name) const; + //! Get the screen options + /*! + Returns all the added options for the named screen. Returns NULL + if the screen is unknown and an empty collection if there are no + options. + */ + const ScreenOptions* + getOptions(const String& name) const; - //! Check for lock to screen action - /*! - Returns \c true if this configuration has a lock to screen action. - This is for backwards compatible support of ScrollLock locking. - */ - bool hasLockToScreenAction() const; + //! Check for lock to screen action + /*! + Returns \c true if this configuration has a lock to screen action. + This is for backwards compatible support of ScrollLock locking. + */ + bool hasLockToScreenAction() const; - //! Compare configurations - bool operator==(const Config&) const; - //! Compare configurations - bool operator!=(const Config&) const; + //! Compare configurations + bool operator==(const Config&) const; + //! Compare configurations + bool operator!=(const Config&) const; - //! Read configuration - /*! - Reads a configuration from a context. Throws XConfigRead on error - and context is unchanged. - */ - void read(ConfigReadContext& context); + //! Read configuration + /*! + Reads a configuration from a context. Throws XConfigRead on error + and context is unchanged. + */ + void read(ConfigReadContext& context); - //! Read configuration - /*! - Reads a configuration from a stream. Throws XConfigRead on error. - */ - friend std::istream& - operator>>(std::istream&, Config&); + //! Read configuration + /*! + Reads a configuration from a stream. Throws XConfigRead on error. + */ + friend std::istream& + operator>>(std::istream&, Config&); - //! Write configuration - /*! - Writes a configuration to a stream. - */ - friend std::ostream& - operator<<(std::ostream&, const Config&); + //! Write configuration + /*! + Writes a configuration to a stream. + */ + friend std::ostream& + operator<<(std::ostream&, const Config&); - //! Get direction name - /*! - Returns the name of a direction (for debugging). - */ - static const char* dirName(EDirection); + //! Get direction name + /*! + Returns the name of a direction (for debugging). + */ + static const char* dirName(EDirection); - //! Get interval as string - /*! - Returns an interval as a parseable string. - */ - static String formatInterval(const Interval&); + //! Get interval as string + /*! + Returns an interval as a parseable string. + */ + static String formatInterval(const Interval&); - //@} + //@} private: - void readSection(ConfigReadContext&); - void readSectionOptions(ConfigReadContext&); - void readSectionScreens(ConfigReadContext&); - void readSectionLinks(ConfigReadContext&); - void readSectionAliases(ConfigReadContext&); + void readSection(ConfigReadContext&); + void readSectionOptions(ConfigReadContext&); + void readSectionScreens(ConfigReadContext&); + void readSectionLinks(ConfigReadContext&); + void readSectionAliases(ConfigReadContext&); - InputFilter::Condition* - parseCondition(ConfigReadContext&, - const String& condition, - const std::vector& args); - void parseAction(ConfigReadContext&, - const String& action, - const std::vector& args, - InputFilter::Rule&, bool activate); + InputFilter::Condition* + parseCondition(ConfigReadContext&, + const String& condition, + const std::vector& args); + void parseAction(ConfigReadContext&, + const String& action, + const std::vector& args, + InputFilter::Rule&, bool activate); - void parseScreens(ConfigReadContext&, const String&, - std::set& screens) const; - static const char* getOptionName(OptionID); - static String getOptionValue(OptionID, OptionValue); + void parseScreens(ConfigReadContext&, const String&, + std::set& screens) const; + static const char* getOptionName(OptionID); + static String getOptionValue(OptionID, OptionValue); private: - CellMap m_map; - NameMap m_nameToCanonicalName; - NetworkAddress m_synergyAddress; - ScreenOptions m_globalOptions; - InputFilter m_inputFilter; - bool m_hasLockToScreenAction; - IEventQueue* m_events; + CellMap m_map; + NameMap m_nameToCanonicalName; + NetworkAddress m_synergyAddress; + ScreenOptions m_globalOptions; + InputFilter m_inputFilter; + bool m_hasLockToScreenAction; + IEventQueue* m_events; }; //! Configuration read context @@ -487,46 +487,46 @@ Maintains a context when reading a configuration from a stream. */ class ConfigReadContext { public: - typedef std::vector ArgList; + typedef std::vector ArgList; - ConfigReadContext(std::istream&, SInt32 firstLine = 1); - ~ConfigReadContext(); + ConfigReadContext(std::istream&, SInt32 firstLine = 1); + ~ConfigReadContext(); - bool readLine(String&); - UInt32 getLineNumber() const; + bool readLine(String&); + UInt32 getLineNumber() const; - bool operator!() const; + bool operator!() const; - OptionValue parseBoolean(const String&) const; - OptionValue parseInt(const String&) const; - OptionValue parseModifierKey(const String&) const; - OptionValue parseCorner(const String&) const; - OptionValue parseCorners(const String&) const; - Config::Interval - parseInterval(const ArgList& args) const; - void parseNameWithArgs( - const String& type, const String& line, - const String& delim, String::size_type& index, - String& name, ArgList& args) const; - IPlatformScreen::KeyInfo* - parseKeystroke(const String& keystroke) const; - IPlatformScreen::KeyInfo* - parseKeystroke(const String& keystroke, - const std::set& screens) const; - IPlatformScreen::ButtonInfo* - parseMouse(const String& mouse) const; - KeyModifierMask parseModifier(const String& modifiers) const; - std::istream& getStream() const { return m_stream; }; + OptionValue parseBoolean(const String&) const; + OptionValue parseInt(const String&) const; + OptionValue parseModifierKey(const String&) const; + OptionValue parseCorner(const String&) const; + OptionValue parseCorners(const String&) const; + Config::Interval + parseInterval(const ArgList& args) const; + void parseNameWithArgs( + const String& type, const String& line, + const String& delim, String::size_type& index, + String& name, ArgList& args) const; + IPlatformScreen::KeyInfo* + parseKeystroke(const String& keystroke) const; + IPlatformScreen::KeyInfo* + parseKeystroke(const String& keystroke, + const std::set& screens) const; + IPlatformScreen::ButtonInfo* + parseMouse(const String& mouse) const; + KeyModifierMask parseModifier(const String& modifiers) const; + std::istream& getStream() const { return m_stream; }; private: - // not implemented - ConfigReadContext& operator=(const ConfigReadContext&); + // not implemented + ConfigReadContext& operator=(const ConfigReadContext&); - static String concatArgs(const ArgList& args); + static String concatArgs(const ArgList& args); private: - std::istream& m_stream; - SInt32 m_line; + std::istream& m_stream; + SInt32 m_line; }; //! Configuration stream read exception @@ -535,15 +535,15 @@ Thrown when a configuration stream cannot be parsed. */ class XConfigRead : public XBase { public: - XConfigRead(const ConfigReadContext& context, const String&); - XConfigRead(const ConfigReadContext& context, - const char* errorFmt, const String& arg); - virtual ~XConfigRead() _NOEXCEPT; + XConfigRead(const ConfigReadContext& context, const String&); + XConfigRead(const ConfigReadContext& context, + const char* errorFmt, const String& arg); + virtual ~XConfigRead() _NOEXCEPT; protected: - // XBase overrides - virtual String getWhat() const throw(); + // XBase overrides + virtual String getWhat() const throw(); private: - String m_error; + String m_error; }; diff --git a/src/lib/server/InputFilter.cpp b/src/lib/server/InputFilter.cpp index 0ab2fcaa..363ded15 100644 --- a/src/lib/server/InputFilter.cpp +++ b/src/lib/server/InputFilter.cpp @@ -32,237 +32,237 @@ // ----------------------------------------------------------------------------- InputFilter::Condition::Condition() { - // do nothing + // do nothing } InputFilter::Condition::~Condition() { - // do nothing + // do nothing } void InputFilter::Condition::enablePrimary(PrimaryClient*) { - // do nothing + // do nothing } void InputFilter::Condition::disablePrimary(PrimaryClient*) { - // do nothing + // do nothing } InputFilter::KeystrokeCondition::KeystrokeCondition( - IEventQueue* events, IPlatformScreen::KeyInfo* info) : - m_id(0), - m_key(info->m_key), - m_mask(info->m_mask), - m_events(events) + IEventQueue* events, IPlatformScreen::KeyInfo* info) : + m_id(0), + m_key(info->m_key), + m_mask(info->m_mask), + m_events(events) { - free(info); + free(info); } InputFilter::KeystrokeCondition::KeystrokeCondition( - IEventQueue* events, KeyID key, KeyModifierMask mask) : - m_id(0), - m_key(key), - m_mask(mask), - m_events(events) + IEventQueue* events, KeyID key, KeyModifierMask mask) : + m_id(0), + m_key(key), + m_mask(mask), + m_events(events) { - // do nothing + // do nothing } InputFilter::KeystrokeCondition::~KeystrokeCondition() { - // do nothing + // do nothing } KeyID InputFilter::KeystrokeCondition::getKey() const { - return m_key; + return m_key; } KeyModifierMask InputFilter::KeystrokeCondition::getMask() const { - return m_mask; + return m_mask; } InputFilter::Condition* InputFilter::KeystrokeCondition::clone() const { - return new KeystrokeCondition(m_events, m_key, m_mask); + return new KeystrokeCondition(m_events, m_key, m_mask); } String InputFilter::KeystrokeCondition::format() const { - return synergy::string::sprintf("keystroke(%s)", - synergy::KeyMap::formatKey(m_key, m_mask).c_str()); + return synergy::string::sprintf("keystroke(%s)", + synergy::KeyMap::formatKey(m_key, m_mask).c_str()); } InputFilter::EFilterStatus InputFilter::KeystrokeCondition::match(const Event& event) { - EFilterStatus status; + EFilterStatus status; - // check for hotkey events - Event::Type type = event.getType(); - if (type == m_events->forIPrimaryScreen().hotKeyDown()) { - status = kActivate; - } - else if (type == m_events->forIPrimaryScreen().hotKeyUp()) { - status = kDeactivate; - } - else { - return kNoMatch; - } + // check for hotkey events + Event::Type type = event.getType(); + if (type == m_events->forIPrimaryScreen().hotKeyDown()) { + status = kActivate; + } + else if (type == m_events->forIPrimaryScreen().hotKeyUp()) { + status = kDeactivate; + } + else { + return kNoMatch; + } - // check if it's our hotkey - IPrimaryScreen::HotKeyInfo* kinfo = - static_cast(event.getData()); - if (kinfo->m_id != m_id) { - return kNoMatch; - } + // check if it's our hotkey + IPrimaryScreen::HotKeyInfo* kinfo = + static_cast(event.getData()); + if (kinfo->m_id != m_id) { + return kNoMatch; + } - return status; + return status; } void InputFilter::KeystrokeCondition::enablePrimary(PrimaryClient* primary) { - m_id = primary->registerHotKey(m_key, m_mask); + m_id = primary->registerHotKey(m_key, m_mask); } void InputFilter::KeystrokeCondition::disablePrimary(PrimaryClient* primary) { - primary->unregisterHotKey(m_id); - m_id = 0; + primary->unregisterHotKey(m_id); + m_id = 0; } InputFilter::MouseButtonCondition::MouseButtonCondition( - IEventQueue* events, IPlatformScreen::ButtonInfo* info) : - m_button(info->m_button), - m_mask(info->m_mask), - m_events(events) + IEventQueue* events, IPlatformScreen::ButtonInfo* info) : + m_button(info->m_button), + m_mask(info->m_mask), + m_events(events) { - free(info); + free(info); } InputFilter::MouseButtonCondition::MouseButtonCondition( - IEventQueue* events, ButtonID button, KeyModifierMask mask) : - m_button(button), - m_mask(mask), - m_events(events) + IEventQueue* events, ButtonID button, KeyModifierMask mask) : + m_button(button), + m_mask(mask), + m_events(events) { - // do nothing + // do nothing } InputFilter::MouseButtonCondition::~MouseButtonCondition() { - // do nothing + // do nothing } ButtonID InputFilter::MouseButtonCondition::getButton() const { - return m_button; + return m_button; } KeyModifierMask InputFilter::MouseButtonCondition::getMask() const { - return m_mask; + return m_mask; } InputFilter::Condition* InputFilter::MouseButtonCondition::clone() const { - return new MouseButtonCondition(m_events, m_button, m_mask); + return new MouseButtonCondition(m_events, m_button, m_mask); } String InputFilter::MouseButtonCondition::format() const { - String key = synergy::KeyMap::formatKey(kKeyNone, m_mask); - if (!key.empty()) { - key += "+"; - } - return synergy::string::sprintf("mousebutton(%s%d)", key.c_str(), m_button); + String key = synergy::KeyMap::formatKey(kKeyNone, m_mask); + if (!key.empty()) { + key += "+"; + } + return synergy::string::sprintf("mousebutton(%s%d)", key.c_str(), m_button); } -InputFilter::EFilterStatus +InputFilter::EFilterStatus InputFilter::MouseButtonCondition::match(const Event& event) { - static const KeyModifierMask s_ignoreMask = - KeyModifierAltGr | KeyModifierCapsLock | - KeyModifierNumLock | KeyModifierScrollLock; + static const KeyModifierMask s_ignoreMask = + KeyModifierAltGr | KeyModifierCapsLock | + KeyModifierNumLock | KeyModifierScrollLock; - EFilterStatus status; + EFilterStatus status; - // check for hotkey events - Event::Type type = event.getType(); - if (type == m_events->forIPrimaryScreen().buttonDown()) { - status = kActivate; - } - else if (type == m_events->forIPrimaryScreen().buttonUp()) { - status = kDeactivate; - } - else { - return kNoMatch; - } + // check for hotkey events + Event::Type type = event.getType(); + if (type == m_events->forIPrimaryScreen().buttonDown()) { + status = kActivate; + } + else if (type == m_events->forIPrimaryScreen().buttonUp()) { + status = kDeactivate; + } + else { + return kNoMatch; + } - // check if it's the right button and modifiers. ignore modifiers - // that cannot be combined with a mouse button. - IPlatformScreen::ButtonInfo* minfo = - static_cast(event.getData()); - if (minfo->m_button != m_button || - (minfo->m_mask & ~s_ignoreMask) != m_mask) { - return kNoMatch; - } + // check if it's the right button and modifiers. ignore modifiers + // that cannot be combined with a mouse button. + IPlatformScreen::ButtonInfo* minfo = + static_cast(event.getData()); + if (minfo->m_button != m_button || + (minfo->m_mask & ~s_ignoreMask) != m_mask) { + return kNoMatch; + } - return status; + return status; } InputFilter::ScreenConnectedCondition::ScreenConnectedCondition( - IEventQueue* events, const String& screen) : - m_screen(screen), - m_events(events) + IEventQueue* events, const String& screen) : + m_screen(screen), + m_events(events) { - // do nothing + // do nothing } InputFilter::ScreenConnectedCondition::~ScreenConnectedCondition() { - // do nothing + // do nothing } InputFilter::Condition* InputFilter::ScreenConnectedCondition::clone() const { - return new ScreenConnectedCondition(m_events, m_screen); + return new ScreenConnectedCondition(m_events, m_screen); } String InputFilter::ScreenConnectedCondition::format() const { - return synergy::string::sprintf("connect(%s)", m_screen.c_str()); + return synergy::string::sprintf("connect(%s)", m_screen.c_str()); } InputFilter::EFilterStatus InputFilter::ScreenConnectedCondition::match(const Event& event) { - if (event.getType() == m_events->forServer().connected()) { - Server::ScreenConnectedInfo* info = - static_cast(event.getData()); - if (m_screen == info->m_screen || m_screen.empty()) { - return kActivate; - } - } + if (event.getType() == m_events->forServer().connected()) { + Server::ScreenConnectedInfo* info = + static_cast(event.getData()); + if (m_screen == info->m_screen || m_screen.empty()) { + return kActivate; + } + } - return kNoMatch; + return kNoMatch; } // ----------------------------------------------------------------------------- @@ -270,381 +270,381 @@ InputFilter::ScreenConnectedCondition::match(const Event& event) // ----------------------------------------------------------------------------- InputFilter::Action::Action() { - // do nothing + // do nothing } InputFilter::Action::~Action() { - // do nothing + // do nothing } InputFilter::LockCursorToScreenAction::LockCursorToScreenAction( - IEventQueue* events, Mode mode) : - m_mode(mode), - m_events(events) + IEventQueue* events, Mode mode) : + m_mode(mode), + m_events(events) { - // do nothing + // do nothing } InputFilter::LockCursorToScreenAction::Mode InputFilter::LockCursorToScreenAction::getMode() const { - return m_mode; + return m_mode; } InputFilter::Action* InputFilter::LockCursorToScreenAction::clone() const { - return new LockCursorToScreenAction(*this); + return new LockCursorToScreenAction(*this); } String InputFilter::LockCursorToScreenAction::format() const { - static const char* s_mode[] = { "off", "on", "toggle" }; + static const char* s_mode[] = { "off", "on", "toggle" }; - return synergy::string::sprintf("lockCursorToScreen(%s)", s_mode[m_mode]); + return synergy::string::sprintf("lockCursorToScreen(%s)", s_mode[m_mode]); } void InputFilter::LockCursorToScreenAction::perform(const Event& event) { - static const Server::LockCursorToScreenInfo::State s_state[] = { - Server::LockCursorToScreenInfo::kOff, - Server::LockCursorToScreenInfo::kOn, - Server::LockCursorToScreenInfo::kToggle - }; + static const Server::LockCursorToScreenInfo::State s_state[] = { + Server::LockCursorToScreenInfo::kOff, + Server::LockCursorToScreenInfo::kOn, + Server::LockCursorToScreenInfo::kToggle + }; - // send event - Server::LockCursorToScreenInfo* info = - Server::LockCursorToScreenInfo::alloc(s_state[m_mode]); - m_events->addEvent(Event(m_events->forServer().lockCursorToScreen(), - event.getTarget(), info, - Event::kDeliverImmediately)); + // send event + Server::LockCursorToScreenInfo* info = + Server::LockCursorToScreenInfo::alloc(s_state[m_mode]); + m_events->addEvent(Event(m_events->forServer().lockCursorToScreen(), + event.getTarget(), info, + Event::kDeliverImmediately)); } InputFilter::SwitchToScreenAction::SwitchToScreenAction( - IEventQueue* events, const String& screen) : - m_screen(screen), - m_events(events) + IEventQueue* events, const String& screen) : + m_screen(screen), + m_events(events) { - // do nothing + // do nothing } String InputFilter::SwitchToScreenAction::getScreen() const { - return m_screen; + return m_screen; } InputFilter::Action* InputFilter::SwitchToScreenAction::clone() const { - return new SwitchToScreenAction(*this); + return new SwitchToScreenAction(*this); } String InputFilter::SwitchToScreenAction::format() const { - return synergy::string::sprintf("switchToScreen(%s)", m_screen.c_str()); + return synergy::string::sprintf("switchToScreen(%s)", m_screen.c_str()); } void InputFilter::SwitchToScreenAction::perform(const Event& event) { - // pick screen name. if m_screen is empty then use the screen from - // event if it has one. - String screen = m_screen; - if (screen.empty() && event.getType() == m_events->forServer().connected()) { - Server::ScreenConnectedInfo* info = - static_cast(event.getData()); - screen = info->m_screen; - } + // pick screen name. if m_screen is empty then use the screen from + // event if it has one. + String screen = m_screen; + if (screen.empty() && event.getType() == m_events->forServer().connected()) { + Server::ScreenConnectedInfo* info = + static_cast(event.getData()); + screen = info->m_screen; + } - // send event - Server::SwitchToScreenInfo* info = - Server::SwitchToScreenInfo::alloc(screen); - m_events->addEvent(Event(m_events->forServer().switchToScreen(), - event.getTarget(), info, - Event::kDeliverImmediately)); + // send event + Server::SwitchToScreenInfo* info = + Server::SwitchToScreenInfo::alloc(screen); + m_events->addEvent(Event(m_events->forServer().switchToScreen(), + event.getTarget(), info, + Event::kDeliverImmediately)); } InputFilter::SwitchInDirectionAction::SwitchInDirectionAction( - IEventQueue* events, EDirection direction) : - m_direction(direction), - m_events(events) + IEventQueue* events, EDirection direction) : + m_direction(direction), + m_events(events) { - // do nothing + // do nothing } EDirection InputFilter::SwitchInDirectionAction::getDirection() const { - return m_direction; + return m_direction; } InputFilter::Action* InputFilter::SwitchInDirectionAction::clone() const { - return new SwitchInDirectionAction(*this); + return new SwitchInDirectionAction(*this); } String InputFilter::SwitchInDirectionAction::format() const { - static const char* s_names[] = { - "", - "left", - "right", - "up", - "down" - }; + static const char* s_names[] = { + "", + "left", + "right", + "up", + "down" + }; - return synergy::string::sprintf("switchInDirection(%s)", s_names[m_direction]); + return synergy::string::sprintf("switchInDirection(%s)", s_names[m_direction]); } void InputFilter::SwitchInDirectionAction::perform(const Event& event) { - Server::SwitchInDirectionInfo* info = - Server::SwitchInDirectionInfo::alloc(m_direction); - m_events->addEvent(Event(m_events->forServer().switchInDirection(), - event.getTarget(), info, - Event::kDeliverImmediately)); + Server::SwitchInDirectionInfo* info = + Server::SwitchInDirectionInfo::alloc(m_direction); + m_events->addEvent(Event(m_events->forServer().switchInDirection(), + event.getTarget(), info, + Event::kDeliverImmediately)); } InputFilter::KeyboardBroadcastAction::KeyboardBroadcastAction( - IEventQueue* events, Mode mode) : - m_mode(mode), - m_events(events) + IEventQueue* events, Mode mode) : + m_mode(mode), + m_events(events) { - // do nothing + // do nothing } InputFilter::KeyboardBroadcastAction::KeyboardBroadcastAction( - IEventQueue* events, - Mode mode, - const std::set& screens) : - m_mode(mode), - m_screens(IKeyState::KeyInfo::join(screens)), - m_events(events) + IEventQueue* events, + Mode mode, + const std::set& screens) : + m_mode(mode), + m_screens(IKeyState::KeyInfo::join(screens)), + m_events(events) { - // do nothing + // do nothing } InputFilter::KeyboardBroadcastAction::Mode InputFilter::KeyboardBroadcastAction::getMode() const { - return m_mode; + return m_mode; } std::set InputFilter::KeyboardBroadcastAction::getScreens() const { - std::set screens; - IKeyState::KeyInfo::split(m_screens.c_str(), screens); - return screens; + std::set screens; + IKeyState::KeyInfo::split(m_screens.c_str(), screens); + return screens; } InputFilter::Action* InputFilter::KeyboardBroadcastAction::clone() const { - return new KeyboardBroadcastAction(*this); + return new KeyboardBroadcastAction(*this); } String InputFilter::KeyboardBroadcastAction::format() const { - static const char* s_mode[] = { "off", "on", "toggle" }; - static const char* s_name = "keyboardBroadcast"; + static const char* s_mode[] = { "off", "on", "toggle" }; + static const char* s_name = "keyboardBroadcast"; - if (m_screens.empty() || m_screens[0] == '*') { - return synergy::string::sprintf("%s(%s)", s_name, s_mode[m_mode]); - } - else { - return synergy::string::sprintf("%s(%s,%.*s)", s_name, s_mode[m_mode], - m_screens.size() - 2, - m_screens.c_str() + 1); - } + if (m_screens.empty() || m_screens[0] == '*') { + return synergy::string::sprintf("%s(%s)", s_name, s_mode[m_mode]); + } + else { + return synergy::string::sprintf("%s(%s,%.*s)", s_name, s_mode[m_mode], + m_screens.size() - 2, + m_screens.c_str() + 1); + } } void InputFilter::KeyboardBroadcastAction::perform(const Event& event) { - static const Server::KeyboardBroadcastInfo::State s_state[] = { - Server::KeyboardBroadcastInfo::kOff, - Server::KeyboardBroadcastInfo::kOn, - Server::KeyboardBroadcastInfo::kToggle - }; + static const Server::KeyboardBroadcastInfo::State s_state[] = { + Server::KeyboardBroadcastInfo::kOff, + Server::KeyboardBroadcastInfo::kOn, + Server::KeyboardBroadcastInfo::kToggle + }; - // send event - Server::KeyboardBroadcastInfo* info = - Server::KeyboardBroadcastInfo::alloc(s_state[m_mode], m_screens); - m_events->addEvent(Event(m_events->forServer().keyboardBroadcast(), - event.getTarget(), info, - Event::kDeliverImmediately)); + // send event + Server::KeyboardBroadcastInfo* info = + Server::KeyboardBroadcastInfo::alloc(s_state[m_mode], m_screens); + m_events->addEvent(Event(m_events->forServer().keyboardBroadcast(), + event.getTarget(), info, + Event::kDeliverImmediately)); } InputFilter::KeystrokeAction::KeystrokeAction( - IEventQueue* events, IPlatformScreen::KeyInfo* info, bool press) : - m_keyInfo(info), - m_press(press), - m_events(events) + IEventQueue* events, IPlatformScreen::KeyInfo* info, bool press) : + m_keyInfo(info), + m_press(press), + m_events(events) { - // do nothing + // do nothing } InputFilter::KeystrokeAction::~KeystrokeAction() { - free(m_keyInfo); + free(m_keyInfo); } void InputFilter::KeystrokeAction::adoptInfo(IPlatformScreen::KeyInfo* info) { - free(m_keyInfo); - m_keyInfo = info; + free(m_keyInfo); + m_keyInfo = info; } const IPlatformScreen::KeyInfo* InputFilter::KeystrokeAction::getInfo() const { - return m_keyInfo; + return m_keyInfo; } bool InputFilter::KeystrokeAction::isOnPress() const { - return m_press; + return m_press; } InputFilter::Action* InputFilter::KeystrokeAction::clone() const { - IKeyState::KeyInfo* info = IKeyState::KeyInfo::alloc(*m_keyInfo); - return new KeystrokeAction(m_events, info, m_press); + IKeyState::KeyInfo* info = IKeyState::KeyInfo::alloc(*m_keyInfo); + return new KeystrokeAction(m_events, info, m_press); } String InputFilter::KeystrokeAction::format() const { - const char* type = formatName(); + const char* type = formatName(); - if (m_keyInfo->m_screens[0] == '\0') { - return synergy::string::sprintf("%s(%s)", type, - synergy::KeyMap::formatKey(m_keyInfo->m_key, - m_keyInfo->m_mask).c_str()); - } - else if (m_keyInfo->m_screens[0] == '*') { - return synergy::string::sprintf("%s(%s,*)", type, - synergy::KeyMap::formatKey(m_keyInfo->m_key, - m_keyInfo->m_mask).c_str()); - } - else { - return synergy::string::sprintf("%s(%s,%.*s)", type, - synergy::KeyMap::formatKey(m_keyInfo->m_key, - m_keyInfo->m_mask).c_str(), - strlen(m_keyInfo->m_screens + 1) - 1, - m_keyInfo->m_screens + 1); - } + if (m_keyInfo->m_screens[0] == '\0') { + return synergy::string::sprintf("%s(%s)", type, + synergy::KeyMap::formatKey(m_keyInfo->m_key, + m_keyInfo->m_mask).c_str()); + } + else if (m_keyInfo->m_screens[0] == '*') { + return synergy::string::sprintf("%s(%s,*)", type, + synergy::KeyMap::formatKey(m_keyInfo->m_key, + m_keyInfo->m_mask).c_str()); + } + else { + return synergy::string::sprintf("%s(%s,%.*s)", type, + synergy::KeyMap::formatKey(m_keyInfo->m_key, + m_keyInfo->m_mask).c_str(), + strlen(m_keyInfo->m_screens + 1) - 1, + m_keyInfo->m_screens + 1); + } } void InputFilter::KeystrokeAction::perform(const Event& event) { - Event::Type type = m_press ? - m_events->forIKeyState().keyDown() : - m_events->forIKeyState().keyUp(); - - m_events->addEvent(Event(m_events->forIPrimaryScreen().fakeInputBegin(), - event.getTarget(), NULL, - Event::kDeliverImmediately)); - m_events->addEvent(Event(type, event.getTarget(), m_keyInfo, - Event::kDeliverImmediately | - Event::kDontFreeData)); - m_events->addEvent(Event(m_events->forIPrimaryScreen().fakeInputEnd(), - event.getTarget(), NULL, - Event::kDeliverImmediately)); + Event::Type type = m_press ? + m_events->forIKeyState().keyDown() : + m_events->forIKeyState().keyUp(); + + m_events->addEvent(Event(m_events->forIPrimaryScreen().fakeInputBegin(), + event.getTarget(), NULL, + Event::kDeliverImmediately)); + m_events->addEvent(Event(type, event.getTarget(), m_keyInfo, + Event::kDeliverImmediately | + Event::kDontFreeData)); + m_events->addEvent(Event(m_events->forIPrimaryScreen().fakeInputEnd(), + event.getTarget(), NULL, + Event::kDeliverImmediately)); } const char* InputFilter::KeystrokeAction::formatName() const { - return (m_press ? "keyDown" : "keyUp"); + return (m_press ? "keyDown" : "keyUp"); } InputFilter::MouseButtonAction::MouseButtonAction( - IEventQueue* events, IPlatformScreen::ButtonInfo* info, bool press) : - m_buttonInfo(info), - m_press(press), - m_events(events) + IEventQueue* events, IPlatformScreen::ButtonInfo* info, bool press) : + m_buttonInfo(info), + m_press(press), + m_events(events) { - // do nothing + // do nothing } InputFilter::MouseButtonAction::~MouseButtonAction() { - free(m_buttonInfo); + free(m_buttonInfo); } const IPlatformScreen::ButtonInfo* InputFilter::MouseButtonAction::getInfo() const { - return m_buttonInfo; + return m_buttonInfo; } bool InputFilter::MouseButtonAction::isOnPress() const { - return m_press; + return m_press; } InputFilter::Action* InputFilter::MouseButtonAction::clone() const { - IPlatformScreen::ButtonInfo* info = - IPrimaryScreen::ButtonInfo::alloc(*m_buttonInfo); - return new MouseButtonAction(m_events, info, m_press); + IPlatformScreen::ButtonInfo* info = + IPrimaryScreen::ButtonInfo::alloc(*m_buttonInfo); + return new MouseButtonAction(m_events, info, m_press); } String InputFilter::MouseButtonAction::format() const { - const char* type = formatName(); + const char* type = formatName(); - String key = synergy::KeyMap::formatKey(kKeyNone, m_buttonInfo->m_mask); - return synergy::string::sprintf("%s(%s%s%d)", type, - key.c_str(), key.empty() ? "" : "+", - m_buttonInfo->m_button); + String key = synergy::KeyMap::formatKey(kKeyNone, m_buttonInfo->m_mask); + return synergy::string::sprintf("%s(%s%s%d)", type, + key.c_str(), key.empty() ? "" : "+", + m_buttonInfo->m_button); } void InputFilter::MouseButtonAction::perform(const Event& event) { - // send modifiers - IPlatformScreen::KeyInfo* modifierInfo = NULL; - if (m_buttonInfo->m_mask != 0) { - KeyID key = m_press ? kKeySetModifiers : kKeyClearModifiers; - modifierInfo = - IKeyState::KeyInfo::alloc(key, m_buttonInfo->m_mask, 0, 1); - m_events->addEvent(Event(m_events->forIKeyState().keyDown(), - event.getTarget(), modifierInfo, - Event::kDeliverImmediately)); - } + // send modifiers + IPlatformScreen::KeyInfo* modifierInfo = NULL; + if (m_buttonInfo->m_mask != 0) { + KeyID key = m_press ? kKeySetModifiers : kKeyClearModifiers; + modifierInfo = + IKeyState::KeyInfo::alloc(key, m_buttonInfo->m_mask, 0, 1); + m_events->addEvent(Event(m_events->forIKeyState().keyDown(), + event.getTarget(), modifierInfo, + Event::kDeliverImmediately)); + } - // send button - Event::Type type = m_press ? m_events->forIPrimaryScreen().buttonDown() : - m_events->forIPrimaryScreen().buttonUp(); - m_events->addEvent(Event(type, event.getTarget(), m_buttonInfo, - Event::kDeliverImmediately | - Event::kDontFreeData)); + // send button + Event::Type type = m_press ? m_events->forIPrimaryScreen().buttonDown() : + m_events->forIPrimaryScreen().buttonUp(); + m_events->addEvent(Event(type, event.getTarget(), m_buttonInfo, + Event::kDeliverImmediately | + Event::kDontFreeData)); } const char* InputFilter::MouseButtonAction::formatName() const { - return (m_press ? "mouseDown" : "mouseUp"); + return (m_press ? "mouseDown" : "mouseUp"); } // @@ -652,235 +652,235 @@ InputFilter::MouseButtonAction::formatName() const // InputFilter::Rule::Rule() : - m_condition(NULL) + m_condition(NULL) { - // do nothing + // do nothing } InputFilter::Rule::Rule(Condition* adoptedCondition) : - m_condition(adoptedCondition) + m_condition(adoptedCondition) { - // do nothing + // do nothing } InputFilter::Rule::Rule(const Rule& rule) : - m_condition(NULL) + m_condition(NULL) { - copy(rule); + copy(rule); } InputFilter::Rule::~Rule() { - clear(); + clear(); } InputFilter::Rule& InputFilter::Rule::operator=(const Rule& rule) { - if (&rule != this) { - copy(rule); - } - return *this; + if (&rule != this) { + copy(rule); + } + return *this; } void InputFilter::Rule::clear() { - delete m_condition; - for (ActionList::iterator i = m_activateActions.begin(); - i != m_activateActions.end(); ++i) { - delete *i; - } - for (ActionList::iterator i = m_deactivateActions.begin(); - i != m_deactivateActions.end(); ++i) { - delete *i; - } + delete m_condition; + for (ActionList::iterator i = m_activateActions.begin(); + i != m_activateActions.end(); ++i) { + delete *i; + } + for (ActionList::iterator i = m_deactivateActions.begin(); + i != m_deactivateActions.end(); ++i) { + delete *i; + } - m_condition = NULL; - m_activateActions.clear(); - m_deactivateActions.clear(); + m_condition = NULL; + m_activateActions.clear(); + m_deactivateActions.clear(); } void InputFilter::Rule::copy(const Rule& rule) { - clear(); - if (rule.m_condition != NULL) { - m_condition = rule.m_condition->clone(); - } - for (ActionList::const_iterator i = rule.m_activateActions.begin(); - i != rule.m_activateActions.end(); ++i) { - m_activateActions.push_back((*i)->clone()); - } - for (ActionList::const_iterator i = rule.m_deactivateActions.begin(); - i != rule.m_deactivateActions.end(); ++i) { - m_deactivateActions.push_back((*i)->clone()); - } + clear(); + if (rule.m_condition != NULL) { + m_condition = rule.m_condition->clone(); + } + for (ActionList::const_iterator i = rule.m_activateActions.begin(); + i != rule.m_activateActions.end(); ++i) { + m_activateActions.push_back((*i)->clone()); + } + for (ActionList::const_iterator i = rule.m_deactivateActions.begin(); + i != rule.m_deactivateActions.end(); ++i) { + m_deactivateActions.push_back((*i)->clone()); + } } void InputFilter::Rule::setCondition(Condition* adopted) { - delete m_condition; - m_condition = adopted; + delete m_condition; + m_condition = adopted; } void InputFilter::Rule::adoptAction(Action* action, bool onActivation) { - if (action != NULL) { - if (onActivation) { - m_activateActions.push_back(action); - } - else { - m_deactivateActions.push_back(action); - } - } + if (action != NULL) { + if (onActivation) { + m_activateActions.push_back(action); + } + else { + m_deactivateActions.push_back(action); + } + } } void InputFilter::Rule::removeAction(bool onActivation, UInt32 index) { - if (onActivation) { - delete m_activateActions[index]; - m_activateActions.erase(m_activateActions.begin() + index); - } - else { - delete m_deactivateActions[index]; - m_deactivateActions.erase(m_deactivateActions.begin() + index); - } + if (onActivation) { + delete m_activateActions[index]; + m_activateActions.erase(m_activateActions.begin() + index); + } + else { + delete m_deactivateActions[index]; + m_deactivateActions.erase(m_deactivateActions.begin() + index); + } } void InputFilter::Rule::replaceAction(Action* adopted, - bool onActivation, UInt32 index) + bool onActivation, UInt32 index) { - if (adopted == NULL) { - removeAction(onActivation, index); - } - else if (onActivation) { - delete m_activateActions[index]; - m_activateActions[index] = adopted; - } - else { - delete m_deactivateActions[index]; - m_deactivateActions[index] = adopted; - } + if (adopted == NULL) { + removeAction(onActivation, index); + } + else if (onActivation) { + delete m_activateActions[index]; + m_activateActions[index] = adopted; + } + else { + delete m_deactivateActions[index]; + m_deactivateActions[index] = adopted; + } } void InputFilter::Rule::enable(PrimaryClient* primaryClient) { - if (m_condition != NULL) { - m_condition->enablePrimary(primaryClient); - } + if (m_condition != NULL) { + m_condition->enablePrimary(primaryClient); + } } void InputFilter::Rule::disable(PrimaryClient* primaryClient) { - if (m_condition != NULL) { - m_condition->disablePrimary(primaryClient); - } + if (m_condition != NULL) { + m_condition->disablePrimary(primaryClient); + } } bool InputFilter::Rule::handleEvent(const Event& event) { - // NULL condition never matches - if (m_condition == NULL) { - return false; - } + // NULL condition never matches + if (m_condition == NULL) { + return false; + } - // match - const ActionList* actions; - switch (m_condition->match(event)) { - default: - // not handled - return false; + // match + const ActionList* actions; + switch (m_condition->match(event)) { + default: + // not handled + return false; - case kActivate: - actions = &m_activateActions; - LOG((CLOG_DEBUG1 "activate actions")); - break; + case kActivate: + actions = &m_activateActions; + LOG((CLOG_DEBUG1 "activate actions")); + break; - case kDeactivate: - actions = &m_deactivateActions; - LOG((CLOG_DEBUG1 "deactivate actions")); - break; - } + case kDeactivate: + actions = &m_deactivateActions; + LOG((CLOG_DEBUG1 "deactivate actions")); + break; + } - // perform actions - for (ActionList::const_iterator i = actions->begin(); - i != actions->end(); ++i) { - LOG((CLOG_DEBUG1 "hotkey: %s", (*i)->format().c_str())); - (*i)->perform(event); - } + // perform actions + for (ActionList::const_iterator i = actions->begin(); + i != actions->end(); ++i) { + LOG((CLOG_DEBUG1 "hotkey: %s", (*i)->format().c_str())); + (*i)->perform(event); + } - return true; + return true; } String InputFilter::Rule::format() const { - String s; - if (m_condition != NULL) { - // condition - s += m_condition->format(); - s += " = "; + String s; + if (m_condition != NULL) { + // condition + s += m_condition->format(); + s += " = "; - // activate actions - ActionList::const_iterator i = m_activateActions.begin(); - if (i != m_activateActions.end()) { - s += (*i)->format(); - while (++i != m_activateActions.end()) { - s += ", "; - s += (*i)->format(); - } - } + // activate actions + ActionList::const_iterator i = m_activateActions.begin(); + if (i != m_activateActions.end()) { + s += (*i)->format(); + while (++i != m_activateActions.end()) { + s += ", "; + s += (*i)->format(); + } + } - // deactivate actions - if (!m_deactivateActions.empty()) { - s += "; "; - i = m_deactivateActions.begin(); - if (i != m_deactivateActions.end()) { - s += (*i)->format(); - while (++i != m_deactivateActions.end()) { - s += ", "; - s += (*i)->format(); - } - } - } - } - return s; + // deactivate actions + if (!m_deactivateActions.empty()) { + s += "; "; + i = m_deactivateActions.begin(); + if (i != m_deactivateActions.end()) { + s += (*i)->format(); + while (++i != m_deactivateActions.end()) { + s += ", "; + s += (*i)->format(); + } + } + } + } + return s; } const InputFilter::Condition* InputFilter::Rule::getCondition() const { - return m_condition; + return m_condition; } UInt32 InputFilter::Rule::getNumActions(bool onActivation) const { - if (onActivation) { - return static_cast(m_activateActions.size()); - } - else { - return static_cast(m_deactivateActions.size()); - } + if (onActivation) { + return static_cast(m_activateActions.size()); + } + else { + return static_cast(m_deactivateActions.size()); + } } const InputFilter::Action& InputFilter::Rule::getAction(bool onActivation, UInt32 index) const { - if (onActivation) { - return *m_activateActions[index]; - } - else { - return *m_deactivateActions[index]; - } + if (onActivation) { + return *m_activateActions[index]; + } + else { + return *m_deactivateActions[index]; + } } @@ -888,203 +888,203 @@ InputFilter::Rule::getAction(bool onActivation, UInt32 index) const // Input Filter Class // ----------------------------------------------------------------------------- InputFilter::InputFilter(IEventQueue* events) : - m_primaryClient(NULL), - m_events(events) + m_primaryClient(NULL), + m_events(events) { - // do nothing + // do nothing } InputFilter::InputFilter(const InputFilter& x) : - m_ruleList(x.m_ruleList), - m_primaryClient(NULL), - m_events(x.m_events) + m_ruleList(x.m_ruleList), + m_primaryClient(NULL), + m_events(x.m_events) { - setPrimaryClient(x.m_primaryClient); + setPrimaryClient(x.m_primaryClient); } InputFilter::~InputFilter() { - setPrimaryClient(NULL); + setPrimaryClient(NULL); } InputFilter& InputFilter::operator=(const InputFilter& x) { - if (&x != this) { - PrimaryClient* oldClient = m_primaryClient; - setPrimaryClient(NULL); + if (&x != this) { + PrimaryClient* oldClient = m_primaryClient; + setPrimaryClient(NULL); - m_ruleList = x.m_ruleList; + m_ruleList = x.m_ruleList; - setPrimaryClient(oldClient); - } - return *this; + setPrimaryClient(oldClient); + } + return *this; } void InputFilter::addFilterRule(const Rule& rule) { - m_ruleList.push_back(rule); - if (m_primaryClient != NULL) { - m_ruleList.back().enable(m_primaryClient); - } + m_ruleList.push_back(rule); + if (m_primaryClient != NULL) { + m_ruleList.back().enable(m_primaryClient); + } } void InputFilter::removeFilterRule(UInt32 index) { - if (m_primaryClient != NULL) { - m_ruleList[index].disable(m_primaryClient); - } - m_ruleList.erase(m_ruleList.begin() + index); + if (m_primaryClient != NULL) { + m_ruleList[index].disable(m_primaryClient); + } + m_ruleList.erase(m_ruleList.begin() + index); } InputFilter::Rule& InputFilter::getRule(UInt32 index) { - return m_ruleList[index]; + return m_ruleList[index]; } void InputFilter::setPrimaryClient(PrimaryClient* client) { - if (m_primaryClient == client) { - return; - } + if (m_primaryClient == client) { + return; + } - if (m_primaryClient != NULL) { - for (RuleList::iterator rule = m_ruleList.begin(); - rule != m_ruleList.end(); ++rule) { - rule->disable(m_primaryClient); - } + if (m_primaryClient != NULL) { + for (RuleList::iterator rule = m_ruleList.begin(); + rule != m_ruleList.end(); ++rule) { + rule->disable(m_primaryClient); + } - m_events->removeHandler(m_events->forIKeyState().keyDown(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIKeyState().keyUp(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIKeyState().keyRepeat(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIPrimaryScreen().buttonDown(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIPrimaryScreen().buttonUp(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIPrimaryScreen().hotKeyDown(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forIPrimaryScreen().hotKeyUp(), - m_primaryClient->getEventTarget()); - m_events->removeHandler(m_events->forServer().connected(), - m_primaryClient->getEventTarget()); - } + m_events->removeHandler(m_events->forIKeyState().keyDown(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIKeyState().keyUp(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIKeyState().keyRepeat(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIPrimaryScreen().buttonDown(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIPrimaryScreen().buttonUp(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIPrimaryScreen().hotKeyDown(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forIPrimaryScreen().hotKeyUp(), + m_primaryClient->getEventTarget()); + m_events->removeHandler(m_events->forServer().connected(), + m_primaryClient->getEventTarget()); + } - m_primaryClient = client; + m_primaryClient = client; - if (m_primaryClient != NULL) { - m_events->adoptHandler(m_events->forIKeyState().keyDown(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIKeyState().keyUp(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIKeyState().keyRepeat(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIPrimaryScreen().buttonDown(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIPrimaryScreen().buttonUp(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIPrimaryScreen().hotKeyDown(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forIPrimaryScreen().hotKeyUp(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); - m_events->adoptHandler(m_events->forServer().connected(), - m_primaryClient->getEventTarget(), - new TMethodEventJob(this, - &InputFilter::handleEvent)); + if (m_primaryClient != NULL) { + m_events->adoptHandler(m_events->forIKeyState().keyDown(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIKeyState().keyUp(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIKeyState().keyRepeat(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIPrimaryScreen().buttonDown(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIPrimaryScreen().buttonUp(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIPrimaryScreen().hotKeyDown(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forIPrimaryScreen().hotKeyUp(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); + m_events->adoptHandler(m_events->forServer().connected(), + m_primaryClient->getEventTarget(), + new TMethodEventJob(this, + &InputFilter::handleEvent)); - for (RuleList::iterator rule = m_ruleList.begin(); - rule != m_ruleList.end(); ++rule) { - rule->enable(m_primaryClient); - } - } + for (RuleList::iterator rule = m_ruleList.begin(); + rule != m_ruleList.end(); ++rule) { + rule->enable(m_primaryClient); + } + } } String InputFilter::format(const String& linePrefix) const { - String s; - for (RuleList::const_iterator i = m_ruleList.begin(); - i != m_ruleList.end(); ++i) { - s += linePrefix; - s += i->format(); - s += "\n"; - } - return s; + String s; + for (RuleList::const_iterator i = m_ruleList.begin(); + i != m_ruleList.end(); ++i) { + s += linePrefix; + s += i->format(); + s += "\n"; + } + return s; } UInt32 InputFilter::getNumRules() const { - return static_cast(m_ruleList.size()); + return static_cast(m_ruleList.size()); } bool InputFilter::operator==(const InputFilter& x) const { - // if there are different numbers of rules then we can't be equal - if (m_ruleList.size() != x.m_ruleList.size()) { - return false; - } + // if there are different numbers of rules then we can't be equal + if (m_ruleList.size() != x.m_ruleList.size()) { + return false; + } - // compare rule lists. the easiest way to do that is to format each - // rule into a string, sort the strings, then compare the results. - std::vector aList, bList; - for (RuleList::const_iterator i = m_ruleList.begin(); - i != m_ruleList.end(); ++i) { - aList.push_back(i->format()); - } - for (RuleList::const_iterator i = x.m_ruleList.begin(); - i != x.m_ruleList.end(); ++i) { - bList.push_back(i->format()); - } - std::partial_sort(aList.begin(), aList.end(), aList.end()); - std::partial_sort(bList.begin(), bList.end(), bList.end()); - return (aList == bList); + // compare rule lists. the easiest way to do that is to format each + // rule into a string, sort the strings, then compare the results. + std::vector aList, bList; + for (RuleList::const_iterator i = m_ruleList.begin(); + i != m_ruleList.end(); ++i) { + aList.push_back(i->format()); + } + for (RuleList::const_iterator i = x.m_ruleList.begin(); + i != x.m_ruleList.end(); ++i) { + bList.push_back(i->format()); + } + std::partial_sort(aList.begin(), aList.end(), aList.end()); + std::partial_sort(bList.begin(), bList.end(), bList.end()); + return (aList == bList); } bool InputFilter::operator!=(const InputFilter& x) const { - return !operator==(x); + return !operator==(x); } void InputFilter::handleEvent(const Event& event, void*) { - // copy event and adjust target - Event myEvent(event.getType(), this, event.getData(), - event.getFlags() | Event::kDontFreeData | - Event::kDeliverImmediately); + // copy event and adjust target + Event myEvent(event.getType(), this, event.getData(), + event.getFlags() | Event::kDontFreeData | + Event::kDeliverImmediately); - // let each rule try to match the event until one does - for (RuleList::iterator rule = m_ruleList.begin(); - rule != m_ruleList.end(); ++rule) { - if (rule->handleEvent(myEvent)) { - // handled - return; - } - } + // let each rule try to match the event until one does + for (RuleList::iterator rule = m_ruleList.begin(); + rule != m_ruleList.end(); ++rule) { + if (rule->handleEvent(myEvent)) { + // handled + return; + } + } - // not handled so pass through - m_events->addEvent(myEvent); + // not handled so pass through + m_events->addEvent(myEvent); } diff --git a/src/lib/server/InputFilter.h b/src/lib/server/InputFilter.h index 25e2494a..99564176 100644 --- a/src/lib/server/InputFilter.h +++ b/src/lib/server/InputFilter.h @@ -32,330 +32,330 @@ class IEventQueue; class InputFilter { public: - // ------------------------------------------------------------------------- - // Input Filter Condition Classes - // ------------------------------------------------------------------------- - enum EFilterStatus { - kNoMatch, - kActivate, - kDeactivate - }; - - class Condition { - public: - Condition(); - virtual ~Condition(); - - virtual Condition* clone() const = 0; - virtual String format() const = 0; - - virtual EFilterStatus match(const Event&) = 0; - - virtual void enablePrimary(PrimaryClient*); - virtual void disablePrimary(PrimaryClient*); - }; - - // KeystrokeCondition - class KeystrokeCondition : public Condition { - public: - KeystrokeCondition(IEventQueue* events, IPlatformScreen::KeyInfo*); - KeystrokeCondition(IEventQueue* events, KeyID key, KeyModifierMask mask); - virtual ~KeystrokeCondition(); - - KeyID getKey() const; - KeyModifierMask getMask() const; - - // Condition overrides - virtual Condition* clone() const; - virtual String format() const; - virtual EFilterStatus match(const Event&); - virtual void enablePrimary(PrimaryClient*); - virtual void disablePrimary(PrimaryClient*); - - private: - UInt32 m_id; - KeyID m_key; - KeyModifierMask m_mask; - IEventQueue* m_events; - }; - - // MouseButtonCondition - class MouseButtonCondition : public Condition { - public: - MouseButtonCondition(IEventQueue* events, IPlatformScreen::ButtonInfo*); - MouseButtonCondition(IEventQueue* events, ButtonID, KeyModifierMask mask); - virtual ~MouseButtonCondition(); - - ButtonID getButton() const; - KeyModifierMask getMask() const; - - // Condition overrides - virtual Condition* clone() const; - virtual String format() const; - virtual EFilterStatus match(const Event&); - - private: - ButtonID m_button; - KeyModifierMask m_mask; - IEventQueue* m_events; - }; - - // ScreenConnectedCondition - class ScreenConnectedCondition : public Condition { - public: - ScreenConnectedCondition(IEventQueue* events, const String& screen); - virtual ~ScreenConnectedCondition(); - - // Condition overrides - virtual Condition* clone() const; - virtual String format() const; - virtual EFilterStatus match(const Event&); - - private: - String m_screen; - IEventQueue* m_events; - }; - - // ------------------------------------------------------------------------- - // Input Filter Action Classes - // ------------------------------------------------------------------------- - - class Action { - public: - Action(); - virtual ~Action(); - - virtual Action* clone() const = 0; - virtual String format() const = 0; - - virtual void perform(const Event&) = 0; + // ------------------------------------------------------------------------- + // Input Filter Condition Classes + // ------------------------------------------------------------------------- + enum EFilterStatus { + kNoMatch, + kActivate, + kDeactivate }; - - // LockCursorToScreenAction - class LockCursorToScreenAction : public Action { - public: - enum Mode { kOff, kOn, kToggle }; - LockCursorToScreenAction(IEventQueue* events, Mode = kToggle); + class Condition { + public: + Condition(); + virtual ~Condition(); - Mode getMode() const; + virtual Condition* clone() const = 0; + virtual String format() const = 0; - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + virtual EFilterStatus match(const Event&) = 0; - private: - Mode m_mode; - IEventQueue* m_events; - }; - - // SwitchToScreenAction - class SwitchToScreenAction : public Action { - public: - SwitchToScreenAction(IEventQueue* events, const String& screen); + virtual void enablePrimary(PrimaryClient*); + virtual void disablePrimary(PrimaryClient*); + }; + + // KeystrokeCondition + class KeystrokeCondition : public Condition { + public: + KeystrokeCondition(IEventQueue* events, IPlatformScreen::KeyInfo*); + KeystrokeCondition(IEventQueue* events, KeyID key, KeyModifierMask mask); + virtual ~KeystrokeCondition(); - String getScreen() const; + KeyID getKey() const; + KeyModifierMask getMask() const; - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + // Condition overrides + virtual Condition* clone() const; + virtual String format() const; + virtual EFilterStatus match(const Event&); + virtual void enablePrimary(PrimaryClient*); + virtual void disablePrimary(PrimaryClient*); - private: - String m_screen; - IEventQueue* m_events; - }; - - // SwitchInDirectionAction - class SwitchInDirectionAction : public Action { - public: - SwitchInDirectionAction(IEventQueue* events, EDirection); + private: + UInt32 m_id; + KeyID m_key; + KeyModifierMask m_mask; + IEventQueue* m_events; + }; - EDirection getDirection() const; + // MouseButtonCondition + class MouseButtonCondition : public Condition { + public: + MouseButtonCondition(IEventQueue* events, IPlatformScreen::ButtonInfo*); + MouseButtonCondition(IEventQueue* events, ButtonID, KeyModifierMask mask); + virtual ~MouseButtonCondition(); - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + ButtonID getButton() const; + KeyModifierMask getMask() const; - private: - EDirection m_direction; - IEventQueue* m_events; - }; - - // KeyboardBroadcastAction - class KeyboardBroadcastAction : public Action { - public: - enum Mode { kOff, kOn, kToggle }; + // Condition overrides + virtual Condition* clone() const; + virtual String format() const; + virtual EFilterStatus match(const Event&); - KeyboardBroadcastAction(IEventQueue* events, Mode = kToggle); - KeyboardBroadcastAction(IEventQueue* events, Mode, const std::set& screens); + private: + ButtonID m_button; + KeyModifierMask m_mask; + IEventQueue* m_events; + }; - Mode getMode() const; - std::set getScreens() const; + // ScreenConnectedCondition + class ScreenConnectedCondition : public Condition { + public: + ScreenConnectedCondition(IEventQueue* events, const String& screen); + virtual ~ScreenConnectedCondition(); - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + // Condition overrides + virtual Condition* clone() const; + virtual String format() const; + virtual EFilterStatus match(const Event&); - private: - Mode m_mode; - String m_screens; - IEventQueue* m_events; - }; + private: + String m_screen; + IEventQueue* m_events; + }; - // KeystrokeAction - class KeystrokeAction : public Action { - public: - KeystrokeAction(IEventQueue* events, IPlatformScreen::KeyInfo* adoptedInfo, bool press); - ~KeystrokeAction(); + // ------------------------------------------------------------------------- + // Input Filter Action Classes + // ------------------------------------------------------------------------- + + class Action { + public: + Action(); + virtual ~Action(); - void adoptInfo(IPlatformScreen::KeyInfo*); - const IPlatformScreen::KeyInfo* - getInfo() const; - bool isOnPress() const; + virtual Action* clone() const = 0; + virtual String format() const = 0; - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + virtual void perform(const Event&) = 0; + }; + + // LockCursorToScreenAction + class LockCursorToScreenAction : public Action { + public: + enum Mode { kOff, kOn, kToggle }; - protected: - virtual const char* formatName() const; + LockCursorToScreenAction(IEventQueue* events, Mode = kToggle); - private: - IPlatformScreen::KeyInfo* m_keyInfo; - bool m_press; - IEventQueue* m_events; - }; + Mode getMode() const; - // MouseButtonAction -- modifier combinations not implemented yet - class MouseButtonAction : public Action { - public: - MouseButtonAction(IEventQueue* events, - IPlatformScreen::ButtonInfo* adoptedInfo, - bool press); - ~MouseButtonAction(); + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - const IPlatformScreen::ButtonInfo* - getInfo() const; - bool isOnPress() const; + private: + Mode m_mode; + IEventQueue* m_events; + }; + + // SwitchToScreenAction + class SwitchToScreenAction : public Action { + public: + SwitchToScreenAction(IEventQueue* events, const String& screen); - // Action overrides - virtual Action* clone() const; - virtual String format() const; - virtual void perform(const Event&); + String getScreen() const; - protected: - virtual const char* formatName() const; + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - private: - IPlatformScreen::ButtonInfo* m_buttonInfo; - bool m_press; - IEventQueue* m_events; - }; + private: + String m_screen; + IEventQueue* m_events; + }; + + // SwitchInDirectionAction + class SwitchInDirectionAction : public Action { + public: + SwitchInDirectionAction(IEventQueue* events, EDirection); - class Rule { - public: - Rule(); - Rule(Condition* adopted); - Rule(const Rule&); - ~Rule(); + EDirection getDirection() const; - Rule& operator=(const Rule&); + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - // replace the condition - void setCondition(Condition* adopted); + private: + EDirection m_direction; + IEventQueue* m_events; + }; + + // KeyboardBroadcastAction + class KeyboardBroadcastAction : public Action { + public: + enum Mode { kOff, kOn, kToggle }; - // add an action to the rule - void adoptAction(Action*, bool onActivation); + KeyboardBroadcastAction(IEventQueue* events, Mode = kToggle); + KeyboardBroadcastAction(IEventQueue* events, Mode, const std::set& screens); - // remove an action from the rule - void removeAction(bool onActivation, UInt32 index); + Mode getMode() const; + std::set getScreens() const; - // replace an action in the rule - void replaceAction(Action* adopted, - bool onActivation, UInt32 index); + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - // enable/disable - void enable(PrimaryClient*); - void disable(PrimaryClient*); + private: + Mode m_mode; + String m_screens; + IEventQueue* m_events; + }; - // event handling - bool handleEvent(const Event&); + // KeystrokeAction + class KeystrokeAction : public Action { + public: + KeystrokeAction(IEventQueue* events, IPlatformScreen::KeyInfo* adoptedInfo, bool press); + ~KeystrokeAction(); - // convert rule to a string - String format() const; + void adoptInfo(IPlatformScreen::KeyInfo*); + const IPlatformScreen::KeyInfo* + getInfo() const; + bool isOnPress() const; - // get the rule's condition - const Condition* - getCondition() const; + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - // get number of actions - UInt32 getNumActions(bool onActivation) const; + protected: + virtual const char* formatName() const; - // get action by index - const Action& getAction(bool onActivation, UInt32 index) const; + private: + IPlatformScreen::KeyInfo* m_keyInfo; + bool m_press; + IEventQueue* m_events; + }; - private: - void clear(); - void copy(const Rule&); + // MouseButtonAction -- modifier combinations not implemented yet + class MouseButtonAction : public Action { + public: + MouseButtonAction(IEventQueue* events, + IPlatformScreen::ButtonInfo* adoptedInfo, + bool press); + ~MouseButtonAction(); - private: - typedef std::vector ActionList; + const IPlatformScreen::ButtonInfo* + getInfo() const; + bool isOnPress() const; - Condition* m_condition; - ActionList m_activateActions; - ActionList m_deactivateActions; - }; + // Action overrides + virtual Action* clone() const; + virtual String format() const; + virtual void perform(const Event&); - // ------------------------------------------------------------------------- - // Input Filter Class - // ------------------------------------------------------------------------- - typedef std::vector RuleList; + protected: + virtual const char* formatName() const; - InputFilter(IEventQueue* events); - InputFilter(const InputFilter&); - virtual ~InputFilter(); + private: + IPlatformScreen::ButtonInfo* m_buttonInfo; + bool m_press; + IEventQueue* m_events; + }; + + class Rule { + public: + Rule(); + Rule(Condition* adopted); + Rule(const Rule&); + ~Rule(); + + Rule& operator=(const Rule&); + + // replace the condition + void setCondition(Condition* adopted); + + // add an action to the rule + void adoptAction(Action*, bool onActivation); + + // remove an action from the rule + void removeAction(bool onActivation, UInt32 index); + + // replace an action in the rule + void replaceAction(Action* adopted, + bool onActivation, UInt32 index); + + // enable/disable + void enable(PrimaryClient*); + void disable(PrimaryClient*); + + // event handling + bool handleEvent(const Event&); + + // convert rule to a string + String format() const; + + // get the rule's condition + const Condition* + getCondition() const; + + // get number of actions + UInt32 getNumActions(bool onActivation) const; + + // get action by index + const Action& getAction(bool onActivation, UInt32 index) const; + + private: + void clear(); + void copy(const Rule&); + + private: + typedef std::vector ActionList; + + Condition* m_condition; + ActionList m_activateActions; + ActionList m_deactivateActions; + }; + + // ------------------------------------------------------------------------- + // Input Filter Class + // ------------------------------------------------------------------------- + typedef std::vector RuleList; + + InputFilter(IEventQueue* events); + InputFilter(const InputFilter&); + virtual ~InputFilter(); #ifdef TEST_ENV - InputFilter() : m_primaryClient(NULL) { } + InputFilter() : m_primaryClient(NULL) { } #endif - InputFilter& operator=(const InputFilter&); + InputFilter& operator=(const InputFilter&); - // add rule, adopting the condition and the actions - void addFilterRule(const Rule& rule); + // add rule, adopting the condition and the actions + void addFilterRule(const Rule& rule); - // remove a rule - void removeFilterRule(UInt32 index); + // remove a rule + void removeFilterRule(UInt32 index); - // get rule by index - Rule& getRule(UInt32 index); + // get rule by index + Rule& getRule(UInt32 index); - // enable event filtering using the given primary client. disable - // if client is NULL. - virtual void setPrimaryClient(PrimaryClient* client); + // enable event filtering using the given primary client. disable + // if client is NULL. + virtual void setPrimaryClient(PrimaryClient* client); - // convert rules to a string - String format(const String& linePrefix) const; + // convert rules to a string + String format(const String& linePrefix) const; - // get number of rules - UInt32 getNumRules() const; + // get number of rules + UInt32 getNumRules() const; - //! Compare filters - bool operator==(const InputFilter&) const; - //! Compare filters - bool operator!=(const InputFilter&) const; + //! Compare filters + bool operator==(const InputFilter&) const; + //! Compare filters + bool operator!=(const InputFilter&) const; private: - // event handling - void handleEvent(const Event&, void*); + // event handling + void handleEvent(const Event&, void*); private: - RuleList m_ruleList; - PrimaryClient* m_primaryClient; - IEventQueue* m_events; + RuleList m_ruleList; + PrimaryClient* m_primaryClient; + IEventQueue* m_events; }; diff --git a/src/lib/server/PrimaryClient.cpp b/src/lib/server/PrimaryClient.cpp index 2da3665c..76731228 100644 --- a/src/lib/server/PrimaryClient.cpp +++ b/src/lib/server/PrimaryClient.cpp @@ -27,248 +27,248 @@ // PrimaryClient::PrimaryClient(const String& name, synergy::Screen* screen) : - BaseClientProxy(name), - m_screen(screen), - m_fakeInputCount(0) + BaseClientProxy(name), + m_screen(screen), + m_fakeInputCount(0) { - // all clipboards are clean - for (UInt32 i = 0; i < kClipboardEnd; ++i) { - m_clipboardDirty[i] = false; - } + // all clipboards are clean + for (UInt32 i = 0; i < kClipboardEnd; ++i) { + m_clipboardDirty[i] = false; + } } PrimaryClient::~PrimaryClient() { - // do nothing + // do nothing } void PrimaryClient::reconfigure(UInt32 activeSides) { - m_screen->reconfigure(activeSides); + m_screen->reconfigure(activeSides); } UInt32 PrimaryClient::registerHotKey(KeyID key, KeyModifierMask mask) { - return m_screen->registerHotKey(key, mask); + return m_screen->registerHotKey(key, mask); } void PrimaryClient::unregisterHotKey(UInt32 id) { - m_screen->unregisterHotKey(id); + m_screen->unregisterHotKey(id); } void PrimaryClient::fakeInputBegin() { - if (++m_fakeInputCount == 1) { - m_screen->fakeInputBegin(); - } + if (++m_fakeInputCount == 1) { + m_screen->fakeInputBegin(); + } } void PrimaryClient::fakeInputEnd() { - if (--m_fakeInputCount == 0) { - m_screen->fakeInputEnd(); - } + if (--m_fakeInputCount == 0) { + m_screen->fakeInputEnd(); + } } SInt32 PrimaryClient::getJumpZoneSize() const { - return m_screen->getJumpZoneSize(); + return m_screen->getJumpZoneSize(); } void PrimaryClient::getCursorCenter(SInt32& x, SInt32& y) const { - m_screen->getCursorCenter(x, y); + m_screen->getCursorCenter(x, y); } KeyModifierMask PrimaryClient::getToggleMask() const { - return m_screen->pollActiveModifiers(); + return m_screen->pollActiveModifiers(); } bool PrimaryClient::isLockedToScreen() const { - return m_screen->isLockedToScreen(); + return m_screen->isLockedToScreen(); } void* PrimaryClient::getEventTarget() const { - return m_screen->getEventTarget(); + return m_screen->getEventTarget(); } bool PrimaryClient::getClipboard(ClipboardID id, IClipboard* clipboard) const { - return m_screen->getClipboard(id, clipboard); + return m_screen->getClipboard(id, clipboard); } void PrimaryClient::getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const + SInt32& width, SInt32& height) const { - m_screen->getShape(x, y, width, height); + m_screen->getShape(x, y, width, height); } void PrimaryClient::getCursorPos(SInt32& x, SInt32& y) const { - m_screen->getCursorPos(x, y); + m_screen->getCursorPos(x, y); } void PrimaryClient::enable() { - m_screen->enable(); + m_screen->enable(); } void PrimaryClient::disable() { - m_screen->disable(); + m_screen->disable(); } void PrimaryClient::enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, bool screensaver) + UInt32 seqNum, KeyModifierMask mask, bool screensaver) { - m_screen->setSequenceNumber(seqNum); - if (!screensaver) { - m_screen->warpCursor(xAbs, yAbs); - } - m_screen->enter(mask); + m_screen->setSequenceNumber(seqNum); + if (!screensaver) { + m_screen->warpCursor(xAbs, yAbs); + } + m_screen->enter(mask); } bool PrimaryClient::leave() { - return m_screen->leave(); + return m_screen->leave(); } void PrimaryClient::setClipboard(ClipboardID id, const IClipboard* clipboard) { - // ignore if this clipboard is already clean - if (m_clipboardDirty[id]) { - // this clipboard is now clean - m_clipboardDirty[id] = false; + // ignore if this clipboard is already clean + if (m_clipboardDirty[id]) { + // this clipboard is now clean + m_clipboardDirty[id] = false; - // set clipboard - m_screen->setClipboard(id, clipboard); - } + // set clipboard + m_screen->setClipboard(id, clipboard); + } } void PrimaryClient::grabClipboard(ClipboardID id) { - // grab clipboard - m_screen->grabClipboard(id); + // grab clipboard + m_screen->grabClipboard(id); - // clipboard is dirty (because someone else owns it now) - m_clipboardDirty[id] = true; + // clipboard is dirty (because someone else owns it now) + m_clipboardDirty[id] = true; } void PrimaryClient::setClipboardDirty(ClipboardID id, bool dirty) { - m_clipboardDirty[id] = dirty; + m_clipboardDirty[id] = dirty; } void PrimaryClient::keyDown(KeyID key, KeyModifierMask mask, KeyButton button) { - if (m_fakeInputCount > 0) { + if (m_fakeInputCount > 0) { // XXX -- don't forward keystrokes to primary screen for now - (void)key; - (void)mask; - (void)button; -// m_screen->keyDown(key, mask, button); - } + (void)key; + (void)mask; + (void)button; +// m_screen->keyDown(key, mask, button); + } } void PrimaryClient::keyRepeat(KeyID, KeyModifierMask, SInt32, KeyButton) { - // ignore + // ignore } void PrimaryClient::keyUp(KeyID key, KeyModifierMask mask, KeyButton button) { - if (m_fakeInputCount > 0) { + if (m_fakeInputCount > 0) { // XXX -- don't forward keystrokes to primary screen for now - (void)key; - (void)mask; - (void)button; -// m_screen->keyUp(key, mask, button); - } + (void)key; + (void)mask; + (void)button; +// m_screen->keyUp(key, mask, button); + } } void PrimaryClient::mouseDown(ButtonID) { - // ignore + // ignore } void PrimaryClient::mouseUp(ButtonID) { - // ignore + // ignore } void PrimaryClient::mouseMove(SInt32 x, SInt32 y) { - m_screen->warpCursor(x, y); + m_screen->warpCursor(x, y); } void PrimaryClient::mouseRelativeMove(SInt32, SInt32) { - // ignore + // ignore } void PrimaryClient::mouseWheel(SInt32, SInt32) { - // ignore + // ignore } void PrimaryClient::screensaver(bool) { - // ignore + // ignore } void PrimaryClient::sendDragInfo(UInt32 fileCount, const char* info, size_t size) { - // ignore + // ignore } void PrimaryClient::fileChunkSending(UInt8 mark, char* data, size_t dataSize) { - // ignore + // ignore } void PrimaryClient::resetOptions() { - m_screen->resetOptions(); + m_screen->resetOptions(); } void PrimaryClient::setOptions(const OptionsList& options) { - m_screen->setOptions(options); + m_screen->setOptions(options); } diff --git a/src/lib/server/PrimaryClient.h b/src/lib/server/PrimaryClient.h index 1b22886e..f63bbf5c 100644 --- a/src/lib/server/PrimaryClient.h +++ b/src/lib/server/PrimaryClient.h @@ -31,126 +31,126 @@ treated as if it was a client. */ class PrimaryClient : public BaseClientProxy { public: - /*! - \c name is the name of the server and \p screen is primary screen. - */ - PrimaryClient(const String& name, synergy::Screen* screen); - ~PrimaryClient(); + /*! + \c name is the name of the server and \p screen is primary screen. + */ + PrimaryClient(const String& name, synergy::Screen* screen); + ~PrimaryClient(); #ifdef TEST_ENV - PrimaryClient() : BaseClientProxy("") { } + PrimaryClient() : BaseClientProxy("") { } #endif - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update configuration - /*! - Handles reconfiguration of jump zones. - */ - virtual void reconfigure(UInt32 activeSides); + //! Update configuration + /*! + Handles reconfiguration of jump zones. + */ + virtual void reconfigure(UInt32 activeSides); - //! Register a system hotkey - /*! - Registers a system-wide hotkey for key \p key with modifiers \p mask. - Returns an id used to unregister the hotkey. - */ - virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); + //! Register a system hotkey + /*! + Registers a system-wide hotkey for key \p key with modifiers \p mask. + Returns an id used to unregister the hotkey. + */ + virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask); - //! Unregister a system hotkey - /*! - Unregisters a previously registered hot key. - */ - virtual void unregisterHotKey(UInt32 id); + //! Unregister a system hotkey + /*! + Unregisters a previously registered hot key. + */ + virtual void unregisterHotKey(UInt32 id); - //! Prepare to synthesize input on primary screen - /*! - Prepares the primary screen to receive synthesized input. We do not - want to receive this synthesized input as user input so this method - ensures that we ignore it. Calls to \c fakeInputBegin() and - \c fakeInputEnd() may be nested; only the outermost have an effect. - */ - void fakeInputBegin(); + //! Prepare to synthesize input on primary screen + /*! + Prepares the primary screen to receive synthesized input. We do not + want to receive this synthesized input as user input so this method + ensures that we ignore it. Calls to \c fakeInputBegin() and + \c fakeInputEnd() may be nested; only the outermost have an effect. + */ + void fakeInputBegin(); - //! Done synthesizing input on primary screen - /*! - Undoes whatever \c fakeInputBegin() did. - */ - void fakeInputEnd(); + //! Done synthesizing input on primary screen + /*! + Undoes whatever \c fakeInputBegin() did. + */ + void fakeInputEnd(); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get jump zone size - /*! - Return the jump zone size, the size of the regions on the edges of - the screen that cause the cursor to jump to another screen. - */ - SInt32 getJumpZoneSize() const; + //! Get jump zone size + /*! + Return the jump zone size, the size of the regions on the edges of + the screen that cause the cursor to jump to another screen. + */ + SInt32 getJumpZoneSize() const; - //! Get cursor center position - /*! - Return the cursor center position which is where we park the - cursor to compute cursor motion deltas and should be far from - the edges of the screen, typically the center. - */ - void getCursorCenter(SInt32& x, SInt32& y) const; - - //! Get toggle key state - /*! - Returns the primary screen's current toggle modifier key state. - */ - virtual KeyModifierMask - getToggleMask() const; + //! Get cursor center position + /*! + Return the cursor center position which is where we park the + cursor to compute cursor motion deltas and should be far from + the edges of the screen, typically the center. + */ + void getCursorCenter(SInt32& x, SInt32& y) const; + + //! Get toggle key state + /*! + Returns the primary screen's current toggle modifier key state. + */ + virtual KeyModifierMask + getToggleMask() const; - //! Get screen lock state - /*! - Returns true if the user is locked to the screen. - */ - bool isLockedToScreen() const; + //! Get screen lock state + /*! + Returns true if the user is locked to the screen. + */ + bool isLockedToScreen() const; - //@} + //@} - // FIXME -- these probably belong on IScreen - virtual void enable(); - virtual void disable(); + // FIXME -- these probably belong on IScreen + virtual void enable(); + virtual void disable(); - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; - // IClient overrides - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver); - virtual bool leave(); - virtual void setClipboard(ClipboardID, const IClipboard*); - virtual void grabClipboard(ClipboardID); - virtual void setClipboardDirty(ClipboardID, bool); - virtual void keyDown(KeyID, KeyModifierMask, KeyButton); - virtual void keyRepeat(KeyID, KeyModifierMask, - SInt32 count, KeyButton); - virtual void keyUp(KeyID, KeyModifierMask, KeyButton); - virtual void mouseDown(ButtonID); - virtual void mouseUp(ButtonID); - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); - virtual void screensaver(bool activate); - virtual void resetOptions(); - virtual void setOptions(const OptionsList& options); - virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); - virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); + // IClient overrides + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver); + virtual bool leave(); + virtual void setClipboard(ClipboardID, const IClipboard*); + virtual void grabClipboard(ClipboardID); + virtual void setClipboardDirty(ClipboardID, bool); + virtual void keyDown(KeyID, KeyModifierMask, KeyButton); + virtual void keyRepeat(KeyID, KeyModifierMask, + SInt32 count, KeyButton); + virtual void keyUp(KeyID, KeyModifierMask, KeyButton); + virtual void mouseDown(ButtonID); + virtual void mouseUp(ButtonID); + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs); + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel); + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta); + virtual void screensaver(bool activate); + virtual void resetOptions(); + virtual void setOptions(const OptionsList& options); + virtual void sendDragInfo(UInt32 fileCount, const char* info, size_t size); + virtual void fileChunkSending(UInt8 mark, char* data, size_t dataSize); - virtual synergy::IStream* - getStream() const { return NULL; } - bool isPrimary() const { return true; } + virtual synergy::IStream* + getStream() const { return NULL; } + bool isPrimary() const { return true; } private: - synergy::Screen* m_screen; - bool m_clipboardDirty[kClipboardEnd]; - SInt32 m_fakeInputCount; + synergy::Screen* m_screen; + bool m_clipboardDirty[kClipboardEnd]; + SInt32 m_fakeInputCount; }; diff --git a/src/lib/server/Server.h b/src/lib/server/Server.h index d1e48bd5..a9c5d239 100644 --- a/src/lib/server/Server.h +++ b/src/lib/server/Server.h @@ -48,436 +48,436 @@ This class implements the top-level server algorithms for synergy. */ class Server : public INode { public: - //! Lock cursor to screen data - class LockCursorToScreenInfo { - public: - enum State { kOff, kOn, kToggle }; + //! Lock cursor to screen data + class LockCursorToScreenInfo { + public: + enum State { kOff, kOn, kToggle }; - static LockCursorToScreenInfo* alloc(State state = kToggle); + static LockCursorToScreenInfo* alloc(State state = kToggle); - public: - State m_state; - }; + public: + State m_state; + }; - //! Switch to screen data - class SwitchToScreenInfo { - public: - static SwitchToScreenInfo* alloc(const String& screen); + //! Switch to screen data + class SwitchToScreenInfo { + public: + static SwitchToScreenInfo* alloc(const String& screen); - public: - // this is a C-string; this type is a variable size structure - char m_screen[1]; - }; + public: + // this is a C-string; this type is a variable size structure + char m_screen[1]; + }; - //! Switch in direction data - class SwitchInDirectionInfo { - public: - static SwitchInDirectionInfo* alloc(EDirection direction); + //! Switch in direction data + class SwitchInDirectionInfo { + public: + static SwitchInDirectionInfo* alloc(EDirection direction); - public: - EDirection m_direction; - }; + public: + EDirection m_direction; + }; - //! Screen connected data - class ScreenConnectedInfo { - public: - ScreenConnectedInfo(String screen) : m_screen(screen) { } + //! Screen connected data + class ScreenConnectedInfo { + public: + ScreenConnectedInfo(String screen) : m_screen(screen) { } - public: - String m_screen; // was char[1] - }; + public: + String m_screen; // was char[1] + }; - //! Keyboard broadcast data - class KeyboardBroadcastInfo { - public: - enum State { kOff, kOn, kToggle }; + //! Keyboard broadcast data + class KeyboardBroadcastInfo { + public: + enum State { kOff, kOn, kToggle }; - static KeyboardBroadcastInfo* alloc(State state = kToggle); - static KeyboardBroadcastInfo* alloc(State state, - const String& screens); + static KeyboardBroadcastInfo* alloc(State state = kToggle); + static KeyboardBroadcastInfo* alloc(State state, + const String& screens); - public: - State m_state; - char m_screens[1]; - }; + public: + State m_state; + char m_screens[1]; + }; - /*! - Start the server with the configuration \p config and the primary - client (local screen) \p primaryClient. The client retains - ownership of \p primaryClient. - */ - Server(Config& config, PrimaryClient* primaryClient, - synergy::Screen* screen, IEventQueue* events, ServerArgs const& args); - ~Server(); + /*! + Start the server with the configuration \p config and the primary + client (local screen) \p primaryClient. The client retains + ownership of \p primaryClient. + */ + Server(Config& config, PrimaryClient* primaryClient, + synergy::Screen* screen, IEventQueue* events, ServerArgs const& args); + ~Server(); #ifdef TEST_ENV - Server() : m_mock(true), m_config(NULL) { } - void setActive(BaseClientProxy* active) { m_active = active; } + Server() : m_mock(true), m_config(NULL) { } + void setActive(BaseClientProxy* active) { m_active = active; } #endif - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Set configuration - /*! - Change the server's configuration. Returns true iff the new - configuration was accepted (it must include the server's name). - This will disconnect any clients no longer in the configuration. - */ - bool setConfig(const Config&); + //! Set configuration + /*! + Change the server's configuration. Returns true iff the new + configuration was accepted (it must include the server's name). + This will disconnect any clients no longer in the configuration. + */ + bool setConfig(const Config&); - //! Add a client - /*! - Adds \p client to the server. The client is adopted and will be - destroyed when the client disconnects or is disconnected. - */ - void adoptClient(BaseClientProxy* client); + //! Add a client + /*! + Adds \p client to the server. The client is adopted and will be + destroyed when the client disconnects or is disconnected. + */ + void adoptClient(BaseClientProxy* client); - //! Disconnect clients - /*! - Disconnect clients. This tells them to disconnect but does not wait - for them to actually do so. The server sends the disconnected event - when they're all disconnected (or immediately if none are connected). - The caller can also just destroy this object to force the disconnection. - */ - void disconnect(); + //! Disconnect clients + /*! + Disconnect clients. This tells them to disconnect but does not wait + for them to actually do so. The server sends the disconnected event + when they're all disconnected (or immediately if none are connected). + The caller can also just destroy this object to force the disconnection. + */ + void disconnect(); - //! Create a new thread and use it to send file to client - void sendFileToClient(const char* filename); + //! Create a new thread and use it to send file to client + void sendFileToClient(const char* filename); - //! Received dragging information from client - void dragInfoReceived(UInt32 fileNum, String content); + //! Received dragging information from client + void dragInfoReceived(UInt32 fileNum, String content); - //! Store ClientListener pointer - void setListener(ClientListener* p) { m_clientListener = p; } - - //@} - //! @name accessors - //@{ + //! Store ClientListener pointer + void setListener(ClientListener* p) { m_clientListener = p; } + + //@} + //! @name accessors + //@{ - //! Get number of connected clients - /*! - Returns the number of connected clients, including the server itself. - */ - UInt32 getNumClients() const; + //! Get number of connected clients + /*! + Returns the number of connected clients, including the server itself. + */ + UInt32 getNumClients() const; - //! Get the list of connected clients - /*! - Set the \c list to the names of the currently connected clients. - */ - void getClients(std::vector& list) const; - - //! Return true if recieved file size is valid - bool isReceivedFileSizeValid(); + //! Get the list of connected clients + /*! + Set the \c list to the names of the currently connected clients. + */ + void getClients(std::vector& list) const; + + //! Return true if recieved file size is valid + bool isReceivedFileSizeValid(); - //! Return expected file data size - size_t& getExpectedFileSize() { return m_expectedFileSize; } + //! Return expected file data size + size_t& getExpectedFileSize() { return m_expectedFileSize; } - //! Return received file data - String& getReceivedFileData() { return m_receivedFileData; } + //! Return received file data + String& getReceivedFileData() { return m_receivedFileData; } - //! Return fake drag file list - DragFileList getFakeDragFileList() { return m_fakeDragFileList; } + //! Return fake drag file list + DragFileList getFakeDragFileList() { return m_fakeDragFileList; } - //@} + //@} private: - // get canonical name of client - String getName(const BaseClientProxy*) const; + // get canonical name of client + String getName(const BaseClientProxy*) const; - // get the sides of the primary screen that have neighbors - UInt32 getActivePrimarySides() const; + // get the sides of the primary screen that have neighbors + UInt32 getActivePrimarySides() const; - // returns true iff mouse should be locked to the current screen - // according to this object only, ignoring what the primary client - // says. - bool isLockedToScreenServer() const; + // returns true iff mouse should be locked to the current screen + // according to this object only, ignoring what the primary client + // says. + bool isLockedToScreenServer() const; - // returns true iff mouse should be locked to the current screen - // according to this object or the primary client. - bool isLockedToScreen() const; + // returns true iff mouse should be locked to the current screen + // according to this object or the primary client. + bool isLockedToScreen() const; - // returns the jump zone of the client - SInt32 getJumpZoneSize(BaseClientProxy*) const; + // returns the jump zone of the client + SInt32 getJumpZoneSize(BaseClientProxy*) const; - // change the active screen - void switchScreen(BaseClientProxy*, - SInt32 x, SInt32 y, bool forScreenSaver); + // change the active screen + void switchScreen(BaseClientProxy*, + SInt32 x, SInt32 y, bool forScreenSaver); - // jump to screen - void jumpToScreen(BaseClientProxy*); + // jump to screen + void jumpToScreen(BaseClientProxy*); - // convert pixel position to fraction, using x or y depending on the - // direction. - float mapToFraction(BaseClientProxy*, EDirection, - SInt32 x, SInt32 y) const; + // convert pixel position to fraction, using x or y depending on the + // direction. + float mapToFraction(BaseClientProxy*, EDirection, + SInt32 x, SInt32 y) const; - // convert fraction to pixel position, writing only x or y depending - // on the direction. - void mapToPixel(BaseClientProxy*, EDirection, float f, - SInt32& x, SInt32& y) const; + // convert fraction to pixel position, writing only x or y depending + // on the direction. + void mapToPixel(BaseClientProxy*, EDirection, float f, + SInt32& x, SInt32& y) const; - // returns true if the client has a neighbor anywhere along the edge - // indicated by the direction. - bool hasAnyNeighbor(BaseClientProxy*, EDirection) const; + // returns true if the client has a neighbor anywhere along the edge + // indicated by the direction. + bool hasAnyNeighbor(BaseClientProxy*, EDirection) const; - // lookup neighboring screen, mapping the coordinate independent of - // the direction to the neighbor's coordinate space. - BaseClientProxy* getNeighbor(BaseClientProxy*, EDirection, - SInt32& x, SInt32& y) const; + // lookup neighboring screen, mapping the coordinate independent of + // the direction to the neighbor's coordinate space. + BaseClientProxy* getNeighbor(BaseClientProxy*, EDirection, + SInt32& x, SInt32& y) const; - // lookup neighboring screen. given a position relative to the - // source screen, find the screen we should move onto and where. - // if the position is sufficiently far from the source then we - // cross multiple screens. if there is no suitable screen then - // return NULL and x,y are not modified. - BaseClientProxy* mapToNeighbor(BaseClientProxy*, EDirection, - SInt32& x, SInt32& y) const; + // lookup neighboring screen. given a position relative to the + // source screen, find the screen we should move onto and where. + // if the position is sufficiently far from the source then we + // cross multiple screens. if there is no suitable screen then + // return NULL and x,y are not modified. + BaseClientProxy* mapToNeighbor(BaseClientProxy*, EDirection, + SInt32& x, SInt32& y) const; - // adjusts x and y or neither to avoid ending up in a jump zone - // after entering the client in the given direction. - void avoidJumpZone(BaseClientProxy*, EDirection, - SInt32& x, SInt32& y) const; + // adjusts x and y or neither to avoid ending up in a jump zone + // after entering the client in the given direction. + void avoidJumpZone(BaseClientProxy*, EDirection, + SInt32& x, SInt32& y) const; - // test if a switch is permitted. this includes testing user - // options like switch delay and tracking any state required to - // implement them. returns true iff a switch is permitted. - bool isSwitchOkay(BaseClientProxy* dst, EDirection, - SInt32 x, SInt32 y, SInt32 xActive, SInt32 yActive); + // test if a switch is permitted. this includes testing user + // options like switch delay and tracking any state required to + // implement them. returns true iff a switch is permitted. + bool isSwitchOkay(BaseClientProxy* dst, EDirection, + SInt32 x, SInt32 y, SInt32 xActive, SInt32 yActive); - // update switch state due to a mouse move at \p x, \p y that - // doesn't switch screens. - void noSwitch(SInt32 x, SInt32 y); + // update switch state due to a mouse move at \p x, \p y that + // doesn't switch screens. + void noSwitch(SInt32 x, SInt32 y); - // stop switch timers - void stopSwitch(); + // stop switch timers + void stopSwitch(); - // start two tap switch timer - void startSwitchTwoTap(); + // start two tap switch timer + void startSwitchTwoTap(); - // arm the two tap switch timer if \p x, \p y is outside the tap zone - void armSwitchTwoTap(SInt32 x, SInt32 y); + // arm the two tap switch timer if \p x, \p y is outside the tap zone + void armSwitchTwoTap(SInt32 x, SInt32 y); - // stop the two tap switch timer - void stopSwitchTwoTap(); + // stop the two tap switch timer + void stopSwitchTwoTap(); - // returns true iff the two tap switch timer is started - bool isSwitchTwoTapStarted() const; + // returns true iff the two tap switch timer is started + bool isSwitchTwoTapStarted() const; - // returns true iff should switch because of two tap - bool shouldSwitchTwoTap() const; + // returns true iff should switch because of two tap + bool shouldSwitchTwoTap() const; - // start delay switch timer - void startSwitchWait(SInt32 x, SInt32 y); + // start delay switch timer + void startSwitchWait(SInt32 x, SInt32 y); - // stop delay switch timer - void stopSwitchWait(); + // stop delay switch timer + void stopSwitchWait(); - // returns true iff the delay switch timer is started - bool isSwitchWaitStarted() const; + // returns true iff the delay switch timer is started + bool isSwitchWaitStarted() const; - // returns the corner (EScreenSwitchCornerMasks) where x,y is on the - // given client. corners have the given size. - UInt32 getCorner(BaseClientProxy*, - SInt32 x, SInt32 y, SInt32 size) const; + // returns the corner (EScreenSwitchCornerMasks) where x,y is on the + // given client. corners have the given size. + UInt32 getCorner(BaseClientProxy*, + SInt32 x, SInt32 y, SInt32 size) const; - // stop relative mouse moves - void stopRelativeMoves(); + // stop relative mouse moves + void stopRelativeMoves(); - // send screen options to \c client - void sendOptions(BaseClientProxy* client) const; + // send screen options to \c client + void sendOptions(BaseClientProxy* client) const; - // process options from configuration - void processOptions(); + // process options from configuration + void processOptions(); - // event handlers - void handleShapeChanged(const Event&, void*); - void handleClipboardGrabbed(const Event&, void*); - void handleClipboardChanged(const Event&, void*); - void handleKeyDownEvent(const Event&, void*); - void handleKeyUpEvent(const Event&, void*); - void handleKeyRepeatEvent(const Event&, void*); - void handleButtonDownEvent(const Event&, void*); - void handleButtonUpEvent(const Event&, void*); - void handleMotionPrimaryEvent(const Event&, void*); - void handleMotionSecondaryEvent(const Event&, void*); - void handleWheelEvent(const Event&, void*); - void handleScreensaverActivatedEvent(const Event&, void*); - void handleScreensaverDeactivatedEvent(const Event&, void*); - void handleSwitchWaitTimeout(const Event&, void*); - void handleClientDisconnected(const Event&, void*); - void handleClientCloseTimeout(const Event&, void*); - void handleSwitchToScreenEvent(const Event&, void*); - void handleSwitchInDirectionEvent(const Event&, void*); - void handleKeyboardBroadcastEvent(const Event&,void*); - void handleLockCursorToScreenEvent(const Event&, void*); - void handleFakeInputBeginEvent(const Event&, void*); - void handleFakeInputEndEvent(const Event&, void*); - void handleFileChunkSendingEvent(const Event&, void*); - void handleFileRecieveCompletedEvent(const Event&, void*); + // event handlers + void handleShapeChanged(const Event&, void*); + void handleClipboardGrabbed(const Event&, void*); + void handleClipboardChanged(const Event&, void*); + void handleKeyDownEvent(const Event&, void*); + void handleKeyUpEvent(const Event&, void*); + void handleKeyRepeatEvent(const Event&, void*); + void handleButtonDownEvent(const Event&, void*); + void handleButtonUpEvent(const Event&, void*); + void handleMotionPrimaryEvent(const Event&, void*); + void handleMotionSecondaryEvent(const Event&, void*); + void handleWheelEvent(const Event&, void*); + void handleScreensaverActivatedEvent(const Event&, void*); + void handleScreensaverDeactivatedEvent(const Event&, void*); + void handleSwitchWaitTimeout(const Event&, void*); + void handleClientDisconnected(const Event&, void*); + void handleClientCloseTimeout(const Event&, void*); + void handleSwitchToScreenEvent(const Event&, void*); + void handleSwitchInDirectionEvent(const Event&, void*); + void handleKeyboardBroadcastEvent(const Event&,void*); + void handleLockCursorToScreenEvent(const Event&, void*); + void handleFakeInputBeginEvent(const Event&, void*); + void handleFakeInputEndEvent(const Event&, void*); + void handleFileChunkSendingEvent(const Event&, void*); + void handleFileRecieveCompletedEvent(const Event&, void*); - // event processing - void onClipboardChanged(BaseClientProxy* sender, - ClipboardID id, UInt32 seqNum); - void onScreensaver(bool activated); - void onKeyDown(KeyID, KeyModifierMask, KeyButton, - const char* screens); - void onKeyUp(KeyID, KeyModifierMask, KeyButton, - const char* screens); - void onKeyRepeat(KeyID, KeyModifierMask, SInt32, KeyButton); - void onMouseDown(ButtonID); - void onMouseUp(ButtonID); - bool onMouseMovePrimary(SInt32 x, SInt32 y); - void onMouseMoveSecondary(SInt32 dx, SInt32 dy); - void onMouseWheel(SInt32 xDelta, SInt32 yDelta); - void onFileChunkSending(const void* data); - void onFileRecieveCompleted(); + // event processing + void onClipboardChanged(BaseClientProxy* sender, + ClipboardID id, UInt32 seqNum); + void onScreensaver(bool activated); + void onKeyDown(KeyID, KeyModifierMask, KeyButton, + const char* screens); + void onKeyUp(KeyID, KeyModifierMask, KeyButton, + const char* screens); + void onKeyRepeat(KeyID, KeyModifierMask, SInt32, KeyButton); + void onMouseDown(ButtonID); + void onMouseUp(ButtonID); + bool onMouseMovePrimary(SInt32 x, SInt32 y); + void onMouseMoveSecondary(SInt32 dx, SInt32 dy); + void onMouseWheel(SInt32 xDelta, SInt32 yDelta); + void onFileChunkSending(const void* data); + void onFileRecieveCompleted(); - // add client to list and attach event handlers for client - bool addClient(BaseClientProxy*); + // add client to list and attach event handlers for client + bool addClient(BaseClientProxy*); - // remove client from list and detach event handlers for client - bool removeClient(BaseClientProxy*); + // remove client from list and detach event handlers for client + bool removeClient(BaseClientProxy*); - // close a client - void closeClient(BaseClientProxy*, const char* msg); + // close a client + void closeClient(BaseClientProxy*, const char* msg); - // close clients not in \p config - void closeClients(const Config& config); + // close clients not in \p config + void closeClients(const Config& config); - // close all clients whether they've completed the handshake or not, - // except the primary client - void closeAllClients(); + // close all clients whether they've completed the handshake or not, + // except the primary client + void closeAllClients(); - // remove clients from internal state - void removeActiveClient(BaseClientProxy*); - void removeOldClient(BaseClientProxy*); + // remove clients from internal state + void removeActiveClient(BaseClientProxy*); + void removeOldClient(BaseClientProxy*); - // force the cursor off of \p client - void forceLeaveClient(BaseClientProxy* client); - - // thread funciton for sending file - void sendFileThread(void*); - - // thread function for writing file to drop directory - void writeToDropDirThread(void*); + // force the cursor off of \p client + void forceLeaveClient(BaseClientProxy* client); + + // thread funciton for sending file + void sendFileThread(void*); + + // thread function for writing file to drop directory + void writeToDropDirThread(void*); - // thread function for sending drag information - void sendDragInfoThread(void*); + // thread function for sending drag information + void sendDragInfoThread(void*); - // send drag info to new client screen - void sendDragInfo(BaseClientProxy* newScreen); + // send drag info to new client screen + void sendDragInfo(BaseClientProxy* newScreen); public: - bool m_mock; + bool m_mock; private: - class ClipboardInfo { - public: - ClipboardInfo(); + class ClipboardInfo { + public: + ClipboardInfo(); - public: - Clipboard m_clipboard; - String m_clipboardData; - String m_clipboardOwner; - UInt32 m_clipboardSeqNum; - }; + public: + Clipboard m_clipboard; + String m_clipboardData; + String m_clipboardOwner; + UInt32 m_clipboardSeqNum; + }; - // the primary screen client - PrimaryClient* m_primaryClient; + // the primary screen client + PrimaryClient* m_primaryClient; - // all clients (including the primary client) indexed by name - typedef std::map ClientList; - typedef std::set ClientSet; - ClientList m_clients; - ClientSet m_clientSet; + // all clients (including the primary client) indexed by name + typedef std::map ClientList; + typedef std::set ClientSet; + ClientList m_clients; + ClientSet m_clientSet; - // all old connections that we're waiting to hangup - typedef std::map OldClients; - OldClients m_oldClients; + // all old connections that we're waiting to hangup + typedef std::map OldClients; + OldClients m_oldClients; - // the client with focus - BaseClientProxy* m_active; + // the client with focus + BaseClientProxy* m_active; - // the sequence number of enter messages - UInt32 m_seqNum; + // the sequence number of enter messages + UInt32 m_seqNum; - // current mouse position (in absolute screen coordinates) on - // whichever screen is active - SInt32 m_x, m_y; + // current mouse position (in absolute screen coordinates) on + // whichever screen is active + SInt32 m_x, m_y; - // last mouse deltas. this is needed to smooth out double tap - // on win32 which reports bogus mouse motion at the edge of - // the screen when using low level hooks, synthesizing motion - // in the opposite direction the mouse actually moved. - SInt32 m_xDelta, m_yDelta; - SInt32 m_xDelta2, m_yDelta2; + // last mouse deltas. this is needed to smooth out double tap + // on win32 which reports bogus mouse motion at the edge of + // the screen when using low level hooks, synthesizing motion + // in the opposite direction the mouse actually moved. + SInt32 m_xDelta, m_yDelta; + SInt32 m_xDelta2, m_yDelta2; - // current configuration - Config* m_config; + // current configuration + Config* m_config; - // input filter (from m_config); - InputFilter* m_inputFilter; + // input filter (from m_config); + InputFilter* m_inputFilter; - // clipboard cache - ClipboardInfo m_clipboards[kClipboardEnd]; + // clipboard cache + ClipboardInfo m_clipboards[kClipboardEnd]; - // state saved when screen saver activates - BaseClientProxy* m_activeSaver; - SInt32 m_xSaver, m_ySaver; + // state saved when screen saver activates + BaseClientProxy* m_activeSaver; + SInt32 m_xSaver, m_ySaver; - // common state for screen switch tests. all tests are always - // trying to reach the same screen in the same direction. - EDirection m_switchDir; - BaseClientProxy* m_switchScreen; + // common state for screen switch tests. all tests are always + // trying to reach the same screen in the same direction. + EDirection m_switchDir; + BaseClientProxy* m_switchScreen; - // state for delayed screen switching - double m_switchWaitDelay; - EventQueueTimer* m_switchWaitTimer; - SInt32 m_switchWaitX, m_switchWaitY; + // state for delayed screen switching + double m_switchWaitDelay; + EventQueueTimer* m_switchWaitTimer; + SInt32 m_switchWaitX, m_switchWaitY; - // state for double-tap screen switching - double m_switchTwoTapDelay; - Stopwatch m_switchTwoTapTimer; - bool m_switchTwoTapEngaged; - bool m_switchTwoTapArmed; - SInt32 m_switchTwoTapZone; + // state for double-tap screen switching + double m_switchTwoTapDelay; + Stopwatch m_switchTwoTapTimer; + bool m_switchTwoTapEngaged; + bool m_switchTwoTapArmed; + SInt32 m_switchTwoTapZone; - // modifiers needed before switching - bool m_switchNeedsShift; - bool m_switchNeedsControl; - bool m_switchNeedsAlt; - - // relative mouse move option - bool m_relativeMoves; + // modifiers needed before switching + bool m_switchNeedsShift; + bool m_switchNeedsControl; + bool m_switchNeedsAlt; + + // relative mouse move option + bool m_relativeMoves; - // flag whether or not we have broadcasting enabled and the screens to - // which we should send broadcasted keys. - bool m_keyboardBroadcasting; - String m_keyboardBroadcastingScreens; + // flag whether or not we have broadcasting enabled and the screens to + // which we should send broadcasted keys. + bool m_keyboardBroadcasting; + String m_keyboardBroadcastingScreens; - // screen locking (former scroll lock) - bool m_lockedToScreen; + // screen locking (former scroll lock) + bool m_lockedToScreen; - // server screen - synergy::Screen* m_screen; + // server screen + synergy::Screen* m_screen; - IEventQueue* m_events; + IEventQueue* m_events; - // file transfer - size_t m_expectedFileSize; - String m_receivedFileData; - DragFileList m_dragFileList; - DragFileList m_fakeDragFileList; - Thread* m_sendFileThread; - Thread* m_writeToDropDirThread; - String m_dragFileExt; - bool m_ignoreFileTransfer; - bool m_enableClipboard; + // file transfer + size_t m_expectedFileSize; + String m_receivedFileData; + DragFileList m_dragFileList; + DragFileList m_fakeDragFileList; + Thread* m_sendFileThread; + Thread* m_writeToDropDirThread; + String m_dragFileExt; + bool m_ignoreFileTransfer; + bool m_enableClipboard; - Thread* m_sendDragInfoThread; - bool m_waitDragInfoThread; + Thread* m_sendDragInfoThread; + bool m_waitDragInfoThread; - ClientListener* m_clientListener; - ServerArgs m_args; + ClientListener* m_clientListener; + ServerArgs m_args; }; diff --git a/src/lib/shared/CMakeLists.txt b/src/lib/shared/CMakeLists.txt index 891f4aa7..ce2301b6 100644 --- a/src/lib/shared/CMakeLists.txt +++ b/src/lib/shared/CMakeLists.txt @@ -17,15 +17,15 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() add_library(shared STATIC ${sources}) include_directories( - ../ - ../../../ext - ../../../ext/gtest-1.6.0/include + ../ + ../../../ext + ../../../ext/gtest-1.6.0/include ) target_link_libraries(shared arch base) diff --git a/src/lib/shared/EditionType.h b/src/lib/shared/EditionType.h index 66f30aa9..6544f613 100644 --- a/src/lib/shared/EditionType.h +++ b/src/lib/shared/EditionType.h @@ -21,10 +21,10 @@ /* Do not reorder these! */ enum Edition { - kBasic, - kPro, - Trial_DO_NOT_USE_OR_THERE_WILL_BE_PAIN, - kUnregistered + kBasic, + kPro, + Trial_DO_NOT_USE_OR_THERE_WILL_BE_PAIN, + kUnregistered }; #endif // EDITIONTYPE_H diff --git a/src/lib/shared/SerialKey.cpp b/src/lib/shared/SerialKey.cpp index 60a039cb..bb78d981 100644 --- a/src/lib/shared/SerialKey.cpp +++ b/src/lib/shared/SerialKey.cpp @@ -29,236 +29,236 @@ using namespace std; SerialKey::SerialKey(Edition edition): - m_userLimit(1), - m_warnTime(ULLONG_MAX), - m_expireTime(ULLONG_MAX), - m_edition(edition), - m_trial(false) + m_userLimit(1), + m_warnTime(ULLONG_MAX), + m_expireTime(ULLONG_MAX), + m_edition(edition), + m_trial(false) { } SerialKey::SerialKey(std::string serial) : - m_userLimit(1), - m_warnTime(0), - m_expireTime(0), - m_edition(kBasic), - m_trial(true) + m_userLimit(1), + m_warnTime(0), + m_expireTime(0), + m_edition(kBasic), + m_trial(true) { - string plainText = decode(serial); - bool valid = false; - if (!plainText.empty()) { - valid = parse(plainText); - } - if (!valid) { - throw std::runtime_error ("Invalid serial key"); - } + string plainText = decode(serial); + bool valid = false; + if (!plainText.empty()) { + valid = parse(plainText); + } + if (!valid) { + throw std::runtime_error ("Invalid serial key"); + } } bool SerialKey::isExpiring(time_t currentTime) const { - bool result = false; + bool result = false; - if (m_trial) { - if (m_warnTime <= currentTime && currentTime < m_expireTime) { - result = true; - } - } + if (m_trial) { + if (m_warnTime <= currentTime && currentTime < m_expireTime) { + result = true; + } + } - return result; + return result; } bool SerialKey::isExpired(time_t currentTime) const { - bool result = false; + bool result = false; - if (m_trial) { - if (m_expireTime <= currentTime) { - result = true; - } - } + if (m_trial) { + if (m_expireTime <= currentTime) { + result = true; + } + } - return result; + return result; } bool SerialKey::isTrial() const { - return m_trial; + return m_trial; } Edition SerialKey::edition() const { - return m_edition; + return m_edition; } std::string SerialKey::editionString() const { - switch (edition()) { - case kBasic: - return "basic"; - case kPro: - return "pro"; - default: { - std::ostringstream oss; - oss << static_cast(edition()); - return oss.str(); - } - } + switch (edition()) { + case kBasic: + return "basic"; + case kPro: + return "pro"; + default: { + std::ostringstream oss; + oss << static_cast(edition()); + return oss.str(); + } + } } static std::string hexEncode (std::string const& str) { - std::ostringstream oss; - for (size_t i = 0; i < str.size(); ++i) { - int c = str[i]; - oss << std::setfill('0') << std::hex << std::setw(2) - << std::uppercase; - oss << c; - } - return oss.str(); + std::ostringstream oss; + for (size_t i = 0; i < str.size(); ++i) { + int c = str[i]; + oss << std::setfill('0') << std::hex << std::setw(2) + << std::uppercase; + oss << c; + } + return oss.str(); } std::string SerialKey::toString() const { - std::ostringstream oss; - oss << "{"; - if (isTrial()) { - oss << "v2;trial;"; - } else { - oss << "v1;"; - } - oss << editionString() << ";"; - oss << m_name << ";"; - oss << m_userLimit << ";"; - oss << m_email << ";"; - oss << m_company << ";"; - oss << (isTrial() ? m_warnTime : 0) << ";"; - oss << (isTrial() ? m_expireTime : 0); - oss << "}"; - return hexEncode(oss.str()); + std::ostringstream oss; + oss << "{"; + if (isTrial()) { + oss << "v2;trial;"; + } else { + oss << "v1;"; + } + oss << editionString() << ";"; + oss << m_name << ";"; + oss << m_userLimit << ";"; + oss << m_email << ";"; + oss << m_company << ";"; + oss << (isTrial() ? m_warnTime : 0) << ";"; + oss << (isTrial() ? m_expireTime : 0); + oss << "}"; + return hexEncode(oss.str()); } time_t SerialKey::daysLeft(time_t currentTime) const { - unsigned long long timeLeft = 0; - unsigned long long const day = 60 * 60 * 24; + unsigned long long timeLeft = 0; + unsigned long long const day = 60 * 60 * 24; - if (currentTime < m_expireTime) { - timeLeft = m_expireTime - currentTime; - } + if (currentTime < m_expireTime) { + timeLeft = m_expireTime - currentTime; + } - unsigned long long daysLeft = 0; - daysLeft = timeLeft % day != 0 ? 1 : 0; + unsigned long long daysLeft = 0; + daysLeft = timeLeft % day != 0 ? 1 : 0; - return timeLeft / day + daysLeft; + return timeLeft / day + daysLeft; } std::string SerialKey::email() const { - return m_email; + return m_email; } std::string SerialKey::decode(const std::string& serial) { - static const char* const lut = "0123456789ABCDEF"; - string output; - size_t len = serial.length(); - if (len & 1) { - return output; - } + static const char* const lut = "0123456789ABCDEF"; + string output; + size_t len = serial.length(); + if (len & 1) { + return output; + } - output.reserve(len / 2); - for (size_t i = 0; i < len; i += 2) { + output.reserve(len / 2); + for (size_t i = 0; i < len; i += 2) { - char a = serial[i]; - char b = serial[i + 1]; + char a = serial[i]; + char b = serial[i + 1]; - const char* p = std::lower_bound(lut, lut + 16, a); - const char* q = std::lower_bound(lut, lut + 16, b); + const char* p = std::lower_bound(lut, lut + 16, a); + const char* q = std::lower_bound(lut, lut + 16, b); - if (*q != b || *p != a) { - return output; - } + if (*q != b || *p != a) { + return output; + } - output.push_back(static_cast(((p - lut) << 4) | (q - lut))); - } + output.push_back(static_cast(((p - lut) << 4) | (q - lut))); + } - return output; + return output; } bool SerialKey::parse(std::string plainSerial) { - string parityStart = plainSerial.substr(0, 1); - string parityEnd = plainSerial.substr(plainSerial.length() - 1, 1); + string parityStart = plainSerial.substr(0, 1); + string parityEnd = plainSerial.substr(plainSerial.length() - 1, 1); - bool valid = false; + bool valid = false; - // check for parity chars { and }, record parity result, then remove them. - if (parityStart == "{" && parityEnd == "}") { - plainSerial = plainSerial.substr(1, plainSerial.length() - 2); + // check for parity chars { and }, record parity result, then remove them. + if (parityStart == "{" && parityEnd == "}") { + plainSerial = plainSerial.substr(1, plainSerial.length() - 2); - // tokenize serialised subscription. - vector parts; - std::string::size_type pos = 0; - bool look = true; - while (look) { - std::string::size_type start = pos; - pos = plainSerial.find(";", pos); - if (pos == string::npos) { - pos = plainSerial.length(); - look = false; - } - parts.push_back(plainSerial.substr(start, pos - start)); - pos += 1; - } + // tokenize serialised subscription. + vector parts; + std::string::size_type pos = 0; + bool look = true; + while (look) { + std::string::size_type start = pos; + pos = plainSerial.find(";", pos); + if (pos == string::npos) { + pos = plainSerial.length(); + look = false; + } + parts.push_back(plainSerial.substr(start, pos - start)); + pos += 1; + } - if ((parts.size() == 8) - && (parts.at(0).find("v1") != string::npos)) { - // e.g.: {v1;basic;Bob;1;email;company name;1398297600;1398384000} - m_edition = parseEdition(parts.at(1)); - m_name = parts.at(2); - m_trial = false; - sscanf(parts.at(3).c_str(), "%d", &m_userLimit); - m_email = parts.at(4); - m_company = parts.at(5); - sscanf(parts.at(6).c_str(), "%lld", &m_warnTime); - sscanf(parts.at(7).c_str(), "%lld", &m_expireTime); - valid = true; - } - else if ((parts.size() == 9) - && (parts.at(0).find("v2") != string::npos)) { - // e.g.: {v2;trial;basic;Bob;1;email;company name;1398297600;1398384000} - m_trial = parts.at(1) == "trial" ? true : false; - m_edition = parseEdition(parts.at(2)); - m_name = parts.at(3); - sscanf(parts.at(4).c_str(), "%d", &m_userLimit); - m_email = parts.at(5); - m_company = parts.at(6); - sscanf(parts.at(7).c_str(), "%lld", &m_warnTime); - sscanf(parts.at(8).c_str(), "%lld", &m_expireTime); - valid = true; - } - } + if ((parts.size() == 8) + && (parts.at(0).find("v1") != string::npos)) { + // e.g.: {v1;basic;Bob;1;email;company name;1398297600;1398384000} + m_edition = parseEdition(parts.at(1)); + m_name = parts.at(2); + m_trial = false; + sscanf(parts.at(3).c_str(), "%d", &m_userLimit); + m_email = parts.at(4); + m_company = parts.at(5); + sscanf(parts.at(6).c_str(), "%lld", &m_warnTime); + sscanf(parts.at(7).c_str(), "%lld", &m_expireTime); + valid = true; + } + else if ((parts.size() == 9) + && (parts.at(0).find("v2") != string::npos)) { + // e.g.: {v2;trial;basic;Bob;1;email;company name;1398297600;1398384000} + m_trial = parts.at(1) == "trial" ? true : false; + m_edition = parseEdition(parts.at(2)); + m_name = parts.at(3); + sscanf(parts.at(4).c_str(), "%d", &m_userLimit); + m_email = parts.at(5); + m_company = parts.at(6); + sscanf(parts.at(7).c_str(), "%lld", &m_warnTime); + sscanf(parts.at(8).c_str(), "%lld", &m_expireTime); + valid = true; + } + } - return valid; + return valid; } Edition SerialKey::parseEdition(std::string const& editionStr) { - Edition e = kBasic; - if (editionStr == "pro") { - e = kPro; - } + Edition e = kBasic; + if (editionStr == "pro") { + e = kPro; + } - return e; + return e; } diff --git a/src/lib/shared/SerialKey.h b/src/lib/shared/SerialKey.h index dd9b7160..fa031661 100644 --- a/src/lib/shared/SerialKey.h +++ b/src/lib/shared/SerialKey.h @@ -26,59 +26,59 @@ #endif class SerialKey { - friend bool operator== (SerialKey const&, SerialKey const&); + friend bool operator== (SerialKey const&, SerialKey const&); public: - explicit SerialKey(Edition edition = kUnregistered); - explicit SerialKey(std::string serial); + explicit SerialKey(Edition edition = kUnregistered); + explicit SerialKey(std::string serial); - bool isExpiring(time_t currentTime) const; - bool isExpired(time_t currentTime) const; - bool isTrial() const; - time_t daysLeft(time_t currentTime) const; - std::string email() const; - Edition edition() const; - std::string toString() const; + bool isExpiring(time_t currentTime) const; + bool isExpired(time_t currentTime) const; + bool isTrial() const; + time_t daysLeft(time_t currentTime) const; + std::string email() const; + Edition edition() const; + std::string toString() const; - static std::string decode(const std::string& serial); - static Edition parseEdition(const std::string& editionStr); + static std::string decode(const std::string& serial); + static Edition parseEdition(const std::string& editionStr); private: - bool parse(std::string plainSerial); - std::string editionString() const; + bool parse(std::string plainSerial); + std::string editionString() const; #ifdef TEST_ENV private: - FRIEND_TEST(SerialKeyTests, parse_noParty_invalid); - FRIEND_TEST(SerialKeyTests, parse_invalidPartsLenghth_invalid); - FRIEND_TEST(SerialKeyTests, parse_validV1Serial_valid); - FRIEND_TEST(SerialKeyTests, parse_validV2Serial_valid); + FRIEND_TEST(SerialKeyTests, parse_noParty_invalid); + FRIEND_TEST(SerialKeyTests, parse_invalidPartsLenghth_invalid); + FRIEND_TEST(SerialKeyTests, parse_validV1Serial_valid); + FRIEND_TEST(SerialKeyTests, parse_validV2Serial_valid); #endif private: - std::string m_name; - std::string m_email; - std::string m_company; - unsigned m_userLimit; - unsigned long long m_warnTime; - unsigned long long m_expireTime; - Edition m_edition; - bool m_trial; + std::string m_name; + std::string m_email; + std::string m_company; + unsigned m_userLimit; + unsigned long long m_warnTime; + unsigned long long m_expireTime; + Edition m_edition; + bool m_trial; }; inline bool operator== (SerialKey const& lhs, SerialKey const& rhs) { - return (lhs.m_name == rhs.m_name) && - (lhs.m_email == rhs.m_email) && - (lhs.m_company == rhs.m_company) && - (lhs.m_userLimit == rhs.m_userLimit) && - (lhs.m_warnTime == rhs.m_warnTime) && - (lhs.m_expireTime == rhs.m_expireTime) && - (lhs.m_edition == rhs.m_edition) && - (lhs.m_trial == rhs.m_trial); + return (lhs.m_name == rhs.m_name) && + (lhs.m_email == rhs.m_email) && + (lhs.m_company == rhs.m_company) && + (lhs.m_userLimit == rhs.m_userLimit) && + (lhs.m_warnTime == rhs.m_warnTime) && + (lhs.m_expireTime == rhs.m_expireTime) && + (lhs.m_edition == rhs.m_edition) && + (lhs.m_trial == rhs.m_trial); } inline bool operator!= (SerialKey const& lhs, SerialKey const& rhs) { - return !(lhs == rhs); + return !(lhs == rhs); } diff --git a/src/lib/synergy/App.cpp b/src/lib/synergy/App.cpp index 4d9aa298..81ab826c 100644 --- a/src/lib/synergy/App.cpp +++ b/src/lib/synergy/App.cpp @@ -57,194 +57,194 @@ App* App::s_instance = nullptr; // App::App(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver, ArgsBase* args) : - m_bye(&exit), - m_taskBarReceiver(NULL), - m_suspended(false), - m_events(events), - m_args(args), - m_createTaskBarReceiver(createTaskBarReceiver), - m_appUtil(events), - m_ipcClient(nullptr) + m_bye(&exit), + m_taskBarReceiver(NULL), + m_suspended(false), + m_events(events), + m_args(args), + m_createTaskBarReceiver(createTaskBarReceiver), + m_appUtil(events), + m_ipcClient(nullptr) { - assert(s_instance == nullptr); - s_instance = this; + assert(s_instance == nullptr); + s_instance = this; } App::~App() { - s_instance = nullptr; - delete m_args; + s_instance = nullptr; + delete m_args; } void App::version() { - char buffer[500]; - sprintf( - buffer, - "%s %s, protocol version %d.%d\n%s", - argsBase().m_pname, - kVersion, - kProtocolMajorVersion, - kProtocolMinorVersion, - kCopyright - ); + char buffer[500]; + sprintf( + buffer, + "%s %s, protocol version %d.%d\n%s", + argsBase().m_pname, + kVersion, + kProtocolMajorVersion, + kProtocolMinorVersion, + kCopyright + ); - std::cout << buffer << std::endl; + std::cout << buffer << std::endl; } int App::run(int argc, char** argv) -{ +{ #if MAC_OS_X_VERSION_10_7 - // dock hide only supported on lion :( - ProcessSerialNumber psn = { 0, kCurrentProcess }; - + // dock hide only supported on lion :( + ProcessSerialNumber psn = { 0, kCurrentProcess }; + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - GetCurrentProcess(&psn); + GetCurrentProcess(&psn); #pragma GCC diagnostic pop - TransformProcessType(&psn, kProcessTransformToBackgroundApplication); + TransformProcessType(&psn, kProcessTransformToBackgroundApplication); #endif - // install application in to arch - appUtil().adoptApp(this); - - // HACK: fail by default (saves us setting result in each catch) - int result = kExitFailed; + // install application in to arch + appUtil().adoptApp(this); + + // HACK: fail by default (saves us setting result in each catch) + int result = kExitFailed; - try { - result = appUtil().run(argc, argv); - } - catch (XExitApp& e) { - // instead of showing a nasty error, just exit with the error code. - // not sure if i like this behaviour, but it's probably better than - // using the exit(int) function! - result = e.getCode(); - } - catch (std::exception& e) { - LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); - } - catch (...) { - LOG((CLOG_CRIT "An unknown error occurred.\n")); - } + try { + result = appUtil().run(argc, argv); + } + catch (XExitApp& e) { + // instead of showing a nasty error, just exit with the error code. + // not sure if i like this behaviour, but it's probably better than + // using the exit(int) function! + result = e.getCode(); + } + catch (std::exception& e) { + LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); + } + catch (...) { + LOG((CLOG_CRIT "An unknown error occurred.\n")); + } - appUtil().beforeAppExit(); - - return result; + appUtil().beforeAppExit(); + + return result; } int App::daemonMainLoop(int, const char**) { #if SYSAPI_WIN32 - SystemLogger sysLogger(daemonName(), false); + SystemLogger sysLogger(daemonName(), false); #else - SystemLogger sysLogger(daemonName(), true); + SystemLogger sysLogger(daemonName(), true); #endif - return mainLoop(); + return mainLoop(); } void App::setupFileLogging() { - if (argsBase().m_logFile != NULL) { - m_fileLog = new FileLogOutputter(argsBase().m_logFile); - CLOG->insert(m_fileLog); - LOG((CLOG_DEBUG1 "logging to file (%s) enabled", argsBase().m_logFile)); - } + if (argsBase().m_logFile != NULL) { + m_fileLog = new FileLogOutputter(argsBase().m_logFile); + CLOG->insert(m_fileLog); + LOG((CLOG_DEBUG1 "logging to file (%s) enabled", argsBase().m_logFile)); + } } void App::loggingFilterWarning() { - if (CLOG->getFilter() > CLOG->getConsoleMaxLevel()) { - if (argsBase().m_logFile == NULL) { - LOG((CLOG_WARN "log messages above %s are NOT sent to console (use file logging)", - CLOG->getFilterName(CLOG->getConsoleMaxLevel()))); - } - } + if (CLOG->getFilter() > CLOG->getConsoleMaxLevel()) { + if (argsBase().m_logFile == NULL) { + LOG((CLOG_WARN "log messages above %s are NOT sent to console (use file logging)", + CLOG->getFilterName(CLOG->getConsoleMaxLevel()))); + } + } } void App::initApp(int argc, const char** argv) { - // parse command line - parseArgs(argc, argv); - - ARCH->setProfileDirectory(argsBase().m_profileDirectory); - ARCH->setPluginDirectory(argsBase().m_pluginDirectory); + // parse command line + parseArgs(argc, argv); + + ARCH->setProfileDirectory(argsBase().m_profileDirectory); + ARCH->setPluginDirectory(argsBase().m_pluginDirectory); - // set log filter - if (!CLOG->setFilter(argsBase().m_logFilter)) { - LOG((CLOG_PRINT "%s: unrecognized log level `%s'" BYE, - argsBase().m_pname, argsBase().m_logFilter, argsBase().m_pname)); - m_bye(kExitArgs); - } - loggingFilterWarning(); - - if (argsBase().m_enableDragDrop) { - LOG((CLOG_INFO "drag and drop enabled")); - } + // set log filter + if (!CLOG->setFilter(argsBase().m_logFilter)) { + LOG((CLOG_PRINT "%s: unrecognized log level `%s'" BYE, + argsBase().m_pname, argsBase().m_logFilter, argsBase().m_pname)); + m_bye(kExitArgs); + } + loggingFilterWarning(); + + if (argsBase().m_enableDragDrop) { + LOG((CLOG_INFO "drag and drop enabled")); + } - // setup file logging after parsing args - setupFileLogging(); + // setup file logging after parsing args + setupFileLogging(); - // load configuration - loadConfig(); + // load configuration + loadConfig(); - if (!argsBase().m_disableTray) { + if (!argsBase().m_disableTray) { - // create a log buffer so we can show the latest message - // as a tray icon tooltip - BufferedLogOutputter* logBuffer = new BufferedLogOutputter(1000); - CLOG->insert(logBuffer, true); + // create a log buffer so we can show the latest message + // as a tray icon tooltip + BufferedLogOutputter* logBuffer = new BufferedLogOutputter(1000); + CLOG->insert(logBuffer, true); - // make the task bar receiver. the user can control this app - // through the task bar. - m_taskBarReceiver = m_createTaskBarReceiver(logBuffer, m_events); - } + // make the task bar receiver. the user can control this app + // through the task bar. + m_taskBarReceiver = m_createTaskBarReceiver(logBuffer, m_events); + } } void App::initIpcClient() { - m_ipcClient = new IpcClient(m_events, m_socketMultiplexer); - m_ipcClient->connect(); + m_ipcClient = new IpcClient(m_events, m_socketMultiplexer); + m_ipcClient->connect(); - m_events->adoptHandler( - m_events->forIpcClient().messageReceived(), m_ipcClient, - new TMethodEventJob(this, &App::handleIpcMessage)); + m_events->adoptHandler( + m_events->forIpcClient().messageReceived(), m_ipcClient, + new TMethodEventJob(this, &App::handleIpcMessage)); } void App::cleanupIpcClient() { - m_ipcClient->disconnect(); - m_events->removeHandler(m_events->forIpcClient().messageReceived(), m_ipcClient); - delete m_ipcClient; + m_ipcClient->disconnect(); + m_events->removeHandler(m_events->forIpcClient().messageReceived(), m_ipcClient); + delete m_ipcClient; } void App::handleIpcMessage(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - if (m->type() == kIpcShutdown) { - LOG((CLOG_INFO "got ipc shutdown message")); - m_events->addEvent(Event(Event::kQuit)); + IpcMessage* m = static_cast(e.getDataObject()); + if (m->type() == kIpcShutdown) { + LOG((CLOG_INFO "got ipc shutdown message")); + m_events->addEvent(Event(Event::kQuit)); } } void App::runEventsLoop(void*) { - m_events->loop(); - + m_events->loop(); + #if defined(MAC_OS_X_VERSION_10_7) - - stopCocoaLoop(); - + + stopCocoaLoop(); + #endif } @@ -253,10 +253,10 @@ App::runEventsLoop(void*) // MinimalApp::MinimalApp() : - App(NULL, NULL, new ArgsBase()) + App(NULL, NULL, new ArgsBase()) { - m_arch.init(); - setEvents(m_events); + m_arch.init(); + setEvents(m_events); } MinimalApp::~MinimalApp() @@ -266,13 +266,13 @@ MinimalApp::~MinimalApp() int MinimalApp::standardStartup(int argc, char** argv) { - return 0; + return 0; } int MinimalApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup) { - return 0; + return 0; } void @@ -283,19 +283,19 @@ MinimalApp::startNode() int MinimalApp::mainLoop() { - return 0; + return 0; } int MinimalApp::foregroundStartup(int argc, char** argv) { - return 0; + return 0; } synergy::Screen* MinimalApp::createScreen() { - return NULL; + return NULL; } void @@ -306,19 +306,19 @@ MinimalApp::loadConfig() bool MinimalApp::loadConfig(const String& pathname) { - return false; + return false; } const char* MinimalApp::daemonInfo() const { - return ""; + return ""; } const char* MinimalApp::daemonName() const { - return ""; + return ""; } void diff --git a/src/lib/synergy/App.h b/src/lib/synergy/App.h index 8cfaea91..078786f9 100644 --- a/src/lib/synergy/App.h +++ b/src/lib/synergy/App.h @@ -43,108 +43,108 @@ typedef IArchTaskBarReceiver* (*CreateTaskBarReceiverFunc)(const BufferedLogOutp class App : public IApp { public: - App(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver, ArgsBase* args); - virtual ~App(); + App(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver, ArgsBase* args); + virtual ~App(); - // Returns args that are common between server and client. - ArgsBase& argsBase() const { return *m_args; } + // Returns args that are common between server and client. + ArgsBase& argsBase() const { return *m_args; } - // Prints the current compiled version. - virtual void version(); + // Prints the current compiled version. + virtual void version(); - // Prints help specific to client or server. - virtual void help() = 0; + // Prints help specific to client or server. + virtual void help() = 0; - // Parse command line arguments. - virtual void parseArgs(int argc, const char* const* argv) = 0; - - int run(int argc, char** argv); + // Parse command line arguments. + virtual void parseArgs(int argc, const char* const* argv) = 0; + + int run(int argc, char** argv); - int daemonMainLoop(int, const char**); + int daemonMainLoop(int, const char**); - virtual void loadConfig() = 0; - virtual bool loadConfig(const String& pathname) = 0; + virtual void loadConfig() = 0; + virtual bool loadConfig(const String& pathname) = 0; - // A description of the daemon (used only on Windows). - virtual const char* daemonInfo() const = 0; + // A description of the daemon (used only on Windows). + virtual const char* daemonInfo() const = 0; - // Function pointer for function to exit immediately. - // TODO: this is old C code - use inheritance to normalize - void (*m_bye)(int); + // Function pointer for function to exit immediately. + // TODO: this is old C code - use inheritance to normalize + void (*m_bye)(int); - static App& instance() { assert(s_instance != nullptr); return *s_instance; } + static App& instance() { assert(s_instance != nullptr); return *s_instance; } - // If --log was specified in args, then add a file logger. - void setupFileLogging(); + // If --log was specified in args, then add a file logger. + void setupFileLogging(); - // If messages will be hidden (to improve performance), warn user. - void loggingFilterWarning(); + // If messages will be hidden (to improve performance), warn user. + void loggingFilterWarning(); - // Parses args, sets up file logging, and loads the config. - void initApp(int argc, const char** argv); + // Parses args, sets up file logging, and loads the config. + void initApp(int argc, const char** argv); - // HACK: accept non-const, but make it const anyway - void initApp(int argc, char** argv) { initApp(argc, (const char**)argv); } + // HACK: accept non-const, but make it const anyway + void initApp(int argc, char** argv) { initApp(argc, (const char**)argv); } - ARCH_APP_UTIL& appUtil() { return m_appUtil; } + ARCH_APP_UTIL& appUtil() { return m_appUtil; } - virtual IArchTaskBarReceiver* taskBarReceiver() const { return m_taskBarReceiver; } + virtual IArchTaskBarReceiver* taskBarReceiver() const { return m_taskBarReceiver; } - virtual void setByeFunc(void(*bye)(int)) { m_bye = bye; } - virtual void bye(int error) { m_bye(error); } - - virtual IEventQueue* getEvents() const { return m_events; } + virtual void setByeFunc(void(*bye)(int)) { m_bye = bye; } + virtual void bye(int error) { m_bye(error); } + + virtual IEventQueue* getEvents() const { return m_events; } - void setSocketMultiplexer(SocketMultiplexer* sm) { m_socketMultiplexer = sm; } - SocketMultiplexer* getSocketMultiplexer() const { return m_socketMultiplexer; } + void setSocketMultiplexer(SocketMultiplexer* sm) { m_socketMultiplexer = sm; } + SocketMultiplexer* getSocketMultiplexer() const { return m_socketMultiplexer; } - void setEvents(EventQueue& events) { m_events = &events; } + void setEvents(EventQueue& events) { m_events = &events; } private: - void handleIpcMessage(const Event&, void*); + void handleIpcMessage(const Event&, void*); protected: - void initIpcClient(); - void cleanupIpcClient(); - void runEventsLoop(void*); + void initIpcClient(); + void cleanupIpcClient(); + void runEventsLoop(void*); - IArchTaskBarReceiver* m_taskBarReceiver; - bool m_suspended; - IEventQueue* m_events; + IArchTaskBarReceiver* m_taskBarReceiver; + bool m_suspended; + IEventQueue* m_events; private: - ArgsBase* m_args; - static App* s_instance; - FileLogOutputter* m_fileLog; - CreateTaskBarReceiverFunc m_createTaskBarReceiver; - ARCH_APP_UTIL m_appUtil; - IpcClient* m_ipcClient; - SocketMultiplexer* m_socketMultiplexer; + ArgsBase* m_args; + static App* s_instance; + FileLogOutputter* m_fileLog; + CreateTaskBarReceiverFunc m_createTaskBarReceiver; + ARCH_APP_UTIL m_appUtil; + IpcClient* m_ipcClient; + SocketMultiplexer* m_socketMultiplexer; }; class MinimalApp : public App { public: - MinimalApp(); - virtual ~MinimalApp(); + MinimalApp(); + virtual ~MinimalApp(); - // IApp overrides - virtual int standardStartup(int argc, char** argv); - virtual int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); - virtual void startNode(); - virtual int mainLoop(); - virtual int foregroundStartup(int argc, char** argv); - virtual synergy::Screen* - createScreen(); - virtual void loadConfig(); - virtual bool loadConfig(const String& pathname); - virtual const char* daemonInfo() const; - virtual const char* daemonName() const; - virtual void parseArgs(int argc, const char* const* argv); + // IApp overrides + virtual int standardStartup(int argc, char** argv); + virtual int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); + virtual void startNode(); + virtual int mainLoop(); + virtual int foregroundStartup(int argc, char** argv); + virtual synergy::Screen* + createScreen(); + virtual void loadConfig(); + virtual bool loadConfig(const String& pathname); + virtual const char* daemonInfo() const; + virtual const char* daemonName() const; + virtual void parseArgs(int argc, const char* const* argv); private: - Arch m_arch; - Log m_log; - EventQueue m_events; + Arch m_arch; + Log m_log; + EventQueue m_events; }; #if WINAPI_MSWINDOWS @@ -154,47 +154,47 @@ private: #endif #define HELP_COMMON_INFO_1 \ - " -d, --debug filter out log messages with priority below level.\n" \ - " level may be: FATAL, ERROR, WARNING, NOTE, INFO,\n" \ - " DEBUG, DEBUG1, DEBUG2.\n" \ - " -n, --name use screen-name instead the hostname to identify\n" \ - " this screen in the configuration.\n" \ - " -1, --no-restart do not try to restart on failure.\n" \ - "* --restart restart the server automatically if it fails.\n" \ - " -l --log write log messages to file.\n" \ - " --no-tray disable the system tray icon.\n" \ - " --enable-drag-drop enable file drag & drop.\n" \ - " --enable-crypto enable the crypto (ssl) plugin.\n" + " -d, --debug filter out log messages with priority below level.\n" \ + " level may be: FATAL, ERROR, WARNING, NOTE, INFO,\n" \ + " DEBUG, DEBUG1, DEBUG2.\n" \ + " -n, --name use screen-name instead the hostname to identify\n" \ + " this screen in the configuration.\n" \ + " -1, --no-restart do not try to restart on failure.\n" \ + "* --restart restart the server automatically if it fails.\n" \ + " -l --log write log messages to file.\n" \ + " --no-tray disable the system tray icon.\n" \ + " --enable-drag-drop enable file drag & drop.\n" \ + " --enable-crypto enable the crypto (ssl) plugin.\n" #define HELP_COMMON_INFO_2 \ - " -h, --help display this help and exit.\n" \ - " --version display version information and exit.\n" + " -h, --help display this help and exit.\n" \ + " --version display version information and exit.\n" #define HELP_COMMON_ARGS \ - " [--name ]" \ - " [--restart|--no-restart]" \ - " [--debug ]" + " [--name ]" \ + " [--restart|--no-restart]" \ + " [--debug ]" // system args (windows/unix) #if SYSAPI_UNIX // unix daemon mode args # define HELP_SYS_ARGS \ - " [--daemon|--no-daemon]" + " [--daemon|--no-daemon]" # define HELP_SYS_INFO \ - " -f, --no-daemon run in the foreground.\n" \ - "* --daemon run as a daemon.\n" + " -f, --no-daemon run in the foreground.\n" \ + "* --daemon run as a daemon.\n" #elif SYSAPI_WIN32 // windows args # define HELP_SYS_ARGS \ - " [--service ] [--relaunch] [--exit-pause]" + " [--service ] [--relaunch] [--exit-pause]" # define HELP_SYS_INFO \ - " --service manage the windows service, valid options are:\n" \ - " install/uninstall/start/stop\n" \ - " --relaunch persistently relaunches process in current user \n" \ - " session (useful for vista and upward).\n" \ - " --exit-pause wait for key press on exit, can be useful for\n" \ - " reading error messages that occur on exit.\n" + " --service manage the windows service, valid options are:\n" \ + " install/uninstall/start/stop\n" \ + " --relaunch persistently relaunches process in current user \n" \ + " session (useful for vista and upward).\n" \ + " --exit-pause wait for key press on exit, can be useful for\n" \ + " reading error messages that occur on exit.\n" #endif diff --git a/src/lib/synergy/AppUtil.cpp b/src/lib/synergy/AppUtil.cpp index 7a442675..c1f9bb56 100644 --- a/src/lib/synergy/AppUtil.cpp +++ b/src/lib/synergy/AppUtil.cpp @@ -23,7 +23,7 @@ AppUtil* AppUtil::s_instance = nullptr; AppUtil::AppUtil() : m_app(nullptr) { - s_instance = this; + s_instance = this; } AppUtil::~AppUtil() @@ -33,20 +33,20 @@ AppUtil::~AppUtil() void AppUtil::adoptApp(IApp* app) { - app->setByeFunc(&exitAppStatic); - m_app = app; + app->setByeFunc(&exitAppStatic); + m_app = app; } IApp& AppUtil::app() const { - assert(m_app != nullptr); - return *m_app; + assert(m_app != nullptr); + return *m_app; } AppUtil& AppUtil::instance() { - assert(s_instance != nullptr); - return *s_instance; + assert(s_instance != nullptr); + return *s_instance; } diff --git a/src/lib/synergy/AppUtil.h b/src/lib/synergy/AppUtil.h index 783a922c..dedece90 100644 --- a/src/lib/synergy/AppUtil.h +++ b/src/lib/synergy/AppUtil.h @@ -23,18 +23,18 @@ class AppUtil : public IAppUtil { public: - AppUtil(); - virtual ~AppUtil(); + AppUtil(); + virtual ~AppUtil(); - virtual void adoptApp(IApp* app); - IApp& app() const; - virtual void exitApp(int code) { throw XExitApp(code); } + virtual void adoptApp(IApp* app); + IApp& app() const; + virtual void exitApp(int code) { throw XExitApp(code); } - static AppUtil& instance(); - static void exitAppStatic(int code) { instance().exitApp(code); } - virtual void beforeAppExit() {} - + static AppUtil& instance(); + static void exitAppStatic(int code) { instance().exitApp(code); } + virtual void beforeAppExit() {} + private: - IApp* m_app; - static AppUtil* s_instance; + IApp* m_app; + static AppUtil* s_instance; }; diff --git a/src/lib/synergy/ArgParser.cpp b/src/lib/synergy/ArgParser.cpp index 553886f4..c9da4e55 100644 --- a/src/lib/synergy/ArgParser.cpp +++ b/src/lib/synergy/ArgParser.cpp @@ -33,487 +33,487 @@ ArgsBase* ArgParser::m_argsBase = NULL; ArgParser::ArgParser(App* app) : - m_app(app) + m_app(app) { } bool ArgParser::parseServerArgs(ServerArgs& args, int argc, const char* const* argv) { - setArgsBase(args); - updateCommonArgs(argv); + setArgsBase(args); + updateCommonArgs(argv); - for (int i = 1; i < argc; ++i) { - if (parsePlatformArg(args, argc, argv, i)) { - continue; - } - else if (parseGenericArgs(argc, argv, i)) { - continue; - } - else if (parseDeprecatedArgs(argc, argv, i)) { - continue; - } - else if (isArg(i, argc, argv, "-a", "--address", 1)) { - // save listen address - args.m_synergyAddress = argv[++i]; - } - else if (isArg(i, argc, argv, "-c", "--config", 1)) { - // save configuration file path - args.m_configFile = argv[++i]; - } - else if (isArg(i, argc, argv, "", "--serial-key", 1)) { - args.m_serial = SerialKey(argv[++i]); - } - else { - LOG((CLOG_PRINT "%s: unrecognized option `%s'" BYE, args.m_pname, argv[i], args.m_pname)); - return false; - } - } + for (int i = 1; i < argc; ++i) { + if (parsePlatformArg(args, argc, argv, i)) { + continue; + } + else if (parseGenericArgs(argc, argv, i)) { + continue; + } + else if (parseDeprecatedArgs(argc, argv, i)) { + continue; + } + else if (isArg(i, argc, argv, "-a", "--address", 1)) { + // save listen address + args.m_synergyAddress = argv[++i]; + } + else if (isArg(i, argc, argv, "-c", "--config", 1)) { + // save configuration file path + args.m_configFile = argv[++i]; + } + else if (isArg(i, argc, argv, "", "--serial-key", 1)) { + args.m_serial = SerialKey(argv[++i]); + } + else { + LOG((CLOG_PRINT "%s: unrecognized option `%s'" BYE, args.m_pname, argv[i], args.m_pname)); + return false; + } + } - if (checkUnexpectedArgs()) { - return false; - } + if (checkUnexpectedArgs()) { + return false; + } - return true; + return true; } bool ArgParser::parseClientArgs(ClientArgs& args, int argc, const char* const* argv) { - setArgsBase(args); - updateCommonArgs(argv); + setArgsBase(args); + updateCommonArgs(argv); - int i; - for (i = 1; i < argc; ++i) { - if (parsePlatformArg(args, argc, argv, i)) { - continue; - } - else if (parseGenericArgs(argc, argv, i)) { - continue; - } - else if (parseDeprecatedArgs(argc, argv, i)) { - continue; - } - else if (isArg(i, argc, argv, NULL, "--camp")) { - // ignore -- included for backwards compatibility - } - else if (isArg(i, argc, argv, NULL, "--no-camp")) { - // ignore -- included for backwards compatibility - } - else if (isArg(i, argc, argv, NULL, "--yscroll", 1)) { - // define scroll - args.m_yscroll = atoi(argv[++i]); - } - else { - if (i + 1 == argc) { - args.m_synergyAddress = argv[i]; - return true; - } + int i; + for (i = 1; i < argc; ++i) { + if (parsePlatformArg(args, argc, argv, i)) { + continue; + } + else if (parseGenericArgs(argc, argv, i)) { + continue; + } + else if (parseDeprecatedArgs(argc, argv, i)) { + continue; + } + else if (isArg(i, argc, argv, NULL, "--camp")) { + // ignore -- included for backwards compatibility + } + else if (isArg(i, argc, argv, NULL, "--no-camp")) { + // ignore -- included for backwards compatibility + } + else if (isArg(i, argc, argv, NULL, "--yscroll", 1)) { + // define scroll + args.m_yscroll = atoi(argv[++i]); + } + else { + if (i + 1 == argc) { + args.m_synergyAddress = argv[i]; + return true; + } - LOG((CLOG_PRINT "%s: unrecognized option `%s'" BYE, args.m_pname, argv[i], args.m_pname)); - return false; - } - } + LOG((CLOG_PRINT "%s: unrecognized option `%s'" BYE, args.m_pname, argv[i], args.m_pname)); + return false; + } + } - // exactly one non-option argument (server-address) - if (i == argc) { - LOG((CLOG_PRINT "%s: a server address or name is required" BYE, - args.m_pname, args.m_pname)); - return false; - } + // exactly one non-option argument (server-address) + if (i == argc) { + LOG((CLOG_PRINT "%s: a server address or name is required" BYE, + args.m_pname, args.m_pname)); + return false; + } - if (checkUnexpectedArgs()) { - return false; - } + if (checkUnexpectedArgs()) { + return false; + } - return true; + return true; } bool ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i) { #if WINAPI_MSWINDOWS - if (isArg(i, argc, argv, NULL, "--service")) { - LOG((CLOG_WARN "obsolete argument --service, use synergyd instead.")); - argsBase.m_shouldExit = true; - } - else if (isArg(i, argc, argv, NULL, "--exit-pause")) { - argsBase.m_pauseOnExit = true; - } - else if (isArg(i, argc, argv, NULL, "--stop-on-desk-switch")) { - argsBase.m_stopOnDeskSwitch = true; - } - else { - // option not supported here - return false; - } + if (isArg(i, argc, argv, NULL, "--service")) { + LOG((CLOG_WARN "obsolete argument --service, use synergyd instead.")); + argsBase.m_shouldExit = true; + } + else if (isArg(i, argc, argv, NULL, "--exit-pause")) { + argsBase.m_pauseOnExit = true; + } + else if (isArg(i, argc, argv, NULL, "--stop-on-desk-switch")) { + argsBase.m_stopOnDeskSwitch = true; + } + else { + // option not supported here + return false; + } - return true; + return true; #elif WINAPI_XWINDOWS - if (isArg(i, argc, argv, "-display", "--display", 1)) { - // use alternative display - argsBase.m_display = argv[++i]; - } + if (isArg(i, argc, argv, "-display", "--display", 1)) { + // use alternative display + argsBase.m_display = argv[++i]; + } - else if (isArg(i, argc, argv, NULL, "--no-xinitthreads")) { - argsBase.m_disableXInitThreads = true; - } + else if (isArg(i, argc, argv, NULL, "--no-xinitthreads")) { + argsBase.m_disableXInitThreads = true; + } - else { - // option not supported here - return false; - } + else { + // option not supported here + return false; + } - return true; + return true; #elif WINAPI_CARBON - // no options for carbon - return false; + // no options for carbon + return false; #endif } bool ArgParser::parseToolArgs(ToolArgs& args, int argc, const char* const* argv) { - for (int i = 1; i < argc; ++i) { - if (isArg(i, argc, argv, NULL, "--get-active-desktop", 0)) { - args.m_printActiveDesktopName = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--login-auth", 0)) { - args.m_loginAuthenticate = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--get-installed-dir", 0)) { - args.m_getInstalledDir = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--get-profile-dir", 0)) { - args.m_getProfileDir = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--get-arch", 0)) { - args.m_getArch = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--notify-activation", 0)) { - args.m_notifyActivation = true; - return true; - } - else if (isArg(i, argc, argv, NULL, "--notify-update", 0)) { - args.m_notifyUpdate = true; - return true; - } - else { - return false; - } - } + for (int i = 1; i < argc; ++i) { + if (isArg(i, argc, argv, NULL, "--get-active-desktop", 0)) { + args.m_printActiveDesktopName = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--login-auth", 0)) { + args.m_loginAuthenticate = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--get-installed-dir", 0)) { + args.m_getInstalledDir = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--get-profile-dir", 0)) { + args.m_getProfileDir = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--get-arch", 0)) { + args.m_getArch = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--notify-activation", 0)) { + args.m_notifyActivation = true; + return true; + } + else if (isArg(i, argc, argv, NULL, "--notify-update", 0)) { + args.m_notifyUpdate = true; + return true; + } + else { + return false; + } + } - return false; + return false; } bool ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i) { - if (isArg(i, argc, argv, "-d", "--debug", 1)) { - // change logging level - argsBase().m_logFilter = argv[++i]; - } - else if (isArg(i, argc, argv, "-l", "--log", 1)) { - argsBase().m_logFile = argv[++i]; - } - else if (isArg(i, argc, argv, "-f", "--no-daemon")) { - // not a daemon - argsBase().m_daemon = false; - } - else if (isArg(i, argc, argv, NULL, "--daemon")) { - // daemonize - argsBase().m_daemon = true; - } - else if (isArg(i, argc, argv, "-n", "--name", 1)) { - // save screen name - argsBase().m_name = argv[++i]; - } - else if (isArg(i, argc, argv, "-1", "--no-restart")) { - // don't try to restart - argsBase().m_restartable = false; - } - else if (isArg(i, argc, argv, NULL, "--restart")) { - // try to restart - argsBase().m_restartable = true; - } - else if (isArg(i, argc, argv, "-z", NULL)) { - argsBase().m_backend = true; - } - else if (isArg(i, argc, argv, NULL, "--no-hooks")) { - argsBase().m_noHooks = true; - } - else if (isArg(i, argc, argv, "-h", "--help")) { - if (m_app) { - m_app->help(); - } - argsBase().m_shouldExit = true; - } - else if (isArg(i, argc, argv, NULL, "--version")) { - if (m_app) { - m_app->version(); - } - argsBase().m_shouldExit = true; - } - else if (isArg(i, argc, argv, NULL, "--no-tray")) { - argsBase().m_disableTray = true; - } - else if (isArg(i, argc, argv, NULL, "--ipc")) { - argsBase().m_enableIpc = true; - } - else if (isArg(i, argc, argv, NULL, "--server")) { - // HACK: stop error happening when using portable (synergyp) - } - else if (isArg(i, argc, argv, NULL, "--client")) { - // HACK: stop error happening when using portable (synergyp) - } - else if (isArg(i, argc, argv, NULL, "--enable-drag-drop")) { - bool useDragDrop = true; + if (isArg(i, argc, argv, "-d", "--debug", 1)) { + // change logging level + argsBase().m_logFilter = argv[++i]; + } + else if (isArg(i, argc, argv, "-l", "--log", 1)) { + argsBase().m_logFile = argv[++i]; + } + else if (isArg(i, argc, argv, "-f", "--no-daemon")) { + // not a daemon + argsBase().m_daemon = false; + } + else if (isArg(i, argc, argv, NULL, "--daemon")) { + // daemonize + argsBase().m_daemon = true; + } + else if (isArg(i, argc, argv, "-n", "--name", 1)) { + // save screen name + argsBase().m_name = argv[++i]; + } + else if (isArg(i, argc, argv, "-1", "--no-restart")) { + // don't try to restart + argsBase().m_restartable = false; + } + else if (isArg(i, argc, argv, NULL, "--restart")) { + // try to restart + argsBase().m_restartable = true; + } + else if (isArg(i, argc, argv, "-z", NULL)) { + argsBase().m_backend = true; + } + else if (isArg(i, argc, argv, NULL, "--no-hooks")) { + argsBase().m_noHooks = true; + } + else if (isArg(i, argc, argv, "-h", "--help")) { + if (m_app) { + m_app->help(); + } + argsBase().m_shouldExit = true; + } + else if (isArg(i, argc, argv, NULL, "--version")) { + if (m_app) { + m_app->version(); + } + argsBase().m_shouldExit = true; + } + else if (isArg(i, argc, argv, NULL, "--no-tray")) { + argsBase().m_disableTray = true; + } + else if (isArg(i, argc, argv, NULL, "--ipc")) { + argsBase().m_enableIpc = true; + } + else if (isArg(i, argc, argv, NULL, "--server")) { + // HACK: stop error happening when using portable (synergyp) + } + else if (isArg(i, argc, argv, NULL, "--client")) { + // HACK: stop error happening when using portable (synergyp) + } + else if (isArg(i, argc, argv, NULL, "--enable-drag-drop")) { + bool useDragDrop = true; #ifdef WINAPI_XWINDOWS - useDragDrop = false; - LOG((CLOG_INFO "ignoring --enable-drag-drop, not supported on linux.")); + useDragDrop = false; + LOG((CLOG_INFO "ignoring --enable-drag-drop, not supported on linux.")); #endif #ifdef WINAPI_MSWINDOWS - if (!IsWindowsVistaOrGreater()) { - useDragDrop = false; - LOG((CLOG_INFO "ignoring --enable-drag-drop, not supported below vista.")); - } + if (!IsWindowsVistaOrGreater()) { + useDragDrop = false; + LOG((CLOG_INFO "ignoring --enable-drag-drop, not supported below vista.")); + } #endif - if (useDragDrop) { - argsBase().m_enableDragDrop = true; - } - } - else if (isArg(i, argc, argv, NULL, "--enable-crypto")) { - argsBase().m_enableCrypto = true; - } - else if (isArg(i, argc, argv, NULL, "--profile-dir", 1)) { - argsBase().m_profileDirectory = argv[++i]; - } - else if (isArg(i, argc, argv, NULL, "--plugin-dir", 1)) { - argsBase().m_pluginDirectory = argv[++i]; - } - else { - // option not supported here - return false; - } + if (useDragDrop) { + argsBase().m_enableDragDrop = true; + } + } + else if (isArg(i, argc, argv, NULL, "--enable-crypto")) { + argsBase().m_enableCrypto = true; + } + else if (isArg(i, argc, argv, NULL, "--profile-dir", 1)) { + argsBase().m_profileDirectory = argv[++i]; + } + else if (isArg(i, argc, argv, NULL, "--plugin-dir", 1)) { + argsBase().m_pluginDirectory = argv[++i]; + } + else { + // option not supported here + return false; + } - return true; + return true; } bool ArgParser::parseDeprecatedArgs(int argc, const char* const* argv, int& i) { - if (isArg(i, argc, argv, NULL, "--crypto-pass")) { - LOG((CLOG_NOTE "--crypto-pass is deprecated")); - i++; - return true; - } - else if (isArg(i, argc, argv, NULL, "--res-w")) { - LOG((CLOG_NOTE "--res-w is deprecated")); - i++; - return true; - } - else if (isArg(i, argc, argv, NULL, "--res-h")) { - LOG((CLOG_NOTE "--res-h is deprecated")); - i++; - return true; - } - else if (isArg(i, argc, argv, NULL, "--prm-wc")) { - LOG((CLOG_NOTE "--prm-wc is deprecated")); - i++; - return true; - } - else if (isArg(i, argc, argv, NULL, "--prm-hc")) { - LOG((CLOG_NOTE "--prm-hc is deprecated")); - i++; - return true; - } + if (isArg(i, argc, argv, NULL, "--crypto-pass")) { + LOG((CLOG_NOTE "--crypto-pass is deprecated")); + i++; + return true; + } + else if (isArg(i, argc, argv, NULL, "--res-w")) { + LOG((CLOG_NOTE "--res-w is deprecated")); + i++; + return true; + } + else if (isArg(i, argc, argv, NULL, "--res-h")) { + LOG((CLOG_NOTE "--res-h is deprecated")); + i++; + return true; + } + else if (isArg(i, argc, argv, NULL, "--prm-wc")) { + LOG((CLOG_NOTE "--prm-wc is deprecated")); + i++; + return true; + } + else if (isArg(i, argc, argv, NULL, "--prm-hc")) { + LOG((CLOG_NOTE "--prm-hc is deprecated")); + i++; + return true; + } - return false; + return false; } bool ArgParser::isArg( - int argi, int argc, const char* const* argv, - const char* name1, const char* name2, - int minRequiredParameters) + int argi, int argc, const char* const* argv, + const char* name1, const char* name2, + int minRequiredParameters) { - if ((name1 != NULL && strcmp(argv[argi], name1) == 0) || - (name2 != NULL && strcmp(argv[argi], name2) == 0)) { - // match. check args left. - if (argi + minRequiredParameters >= argc) { - LOG((CLOG_PRINT "%s: missing arguments for `%s'" BYE, - argsBase().m_pname, argv[argi], argsBase().m_pname)); - argsBase().m_shouldExit = true; - return false; - } - return true; - } + if ((name1 != NULL && strcmp(argv[argi], name1) == 0) || + (name2 != NULL && strcmp(argv[argi], name2) == 0)) { + // match. check args left. + if (argi + minRequiredParameters >= argc) { + LOG((CLOG_PRINT "%s: missing arguments for `%s'" BYE, + argsBase().m_pname, argv[argi], argsBase().m_pname)); + argsBase().m_shouldExit = true; + return false; + } + return true; + } - // no match - return false; + // no match + return false; } void ArgParser::splitCommandString(String& command, std::vector& argv) { - if (command.empty()) { - return ; - } + if (command.empty()) { + return ; + } - size_t leftDoubleQuote = 0; - size_t rightDoubleQuote = 0; - searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote); + size_t leftDoubleQuote = 0; + size_t rightDoubleQuote = 0; + searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote); - size_t startPos = 0; - size_t space = command.find(" ", startPos); + size_t startPos = 0; + size_t space = command.find(" ", startPos); - while (space != String::npos) { - bool ignoreThisSpace = false; + while (space != String::npos) { + bool ignoreThisSpace = false; - // check if the space is between two double quotes - if (space > leftDoubleQuote && space < rightDoubleQuote) { - ignoreThisSpace = true; - } - else if (space > rightDoubleQuote){ - searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1); - } + // check if the space is between two double quotes + if (space > leftDoubleQuote && space < rightDoubleQuote) { + ignoreThisSpace = true; + } + else if (space > rightDoubleQuote){ + searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1); + } - if (!ignoreThisSpace) { - String subString = command.substr(startPos, space - startPos); + if (!ignoreThisSpace) { + String subString = command.substr(startPos, space - startPos); - removeDoubleQuotes(subString); - argv.push_back(subString); - } + removeDoubleQuotes(subString); + argv.push_back(subString); + } - // find next space - if (ignoreThisSpace) { - space = command.find(" ", rightDoubleQuote + 1); - } - else { - startPos = space + 1; - space = command.find(" ", startPos); - } - } + // find next space + if (ignoreThisSpace) { + space = command.find(" ", rightDoubleQuote + 1); + } + else { + startPos = space + 1; + space = command.find(" ", startPos); + } + } - String subString = command.substr(startPos, command.size()); - removeDoubleQuotes(subString); - argv.push_back(subString); + String subString = command.substr(startPos, command.size()); + removeDoubleQuotes(subString); + argv.push_back(subString); } bool ArgParser::searchDoubleQuotes(String& command, size_t& left, size_t& right, size_t startPos) { - bool result = false; - left = String::npos; - right = String::npos; + bool result = false; + left = String::npos; + right = String::npos; - left = command.find("\"", startPos); - if (left != String::npos) { - right = command.find("\"", left + 1); - if (right != String::npos) { - result = true; - } - } + left = command.find("\"", startPos); + if (left != String::npos) { + right = command.find("\"", left + 1); + if (right != String::npos) { + result = true; + } + } - if (!result) { - left = 0; - right = 0; - } + if (!result) { + left = 0; + right = 0; + } - return result; + return result; } void ArgParser::removeDoubleQuotes(String& arg) { - // if string is surrounded by double quotes, remove them - if (arg[0] == '\"' && - arg[arg.size() - 1] == '\"') { - arg = arg.substr(1, arg.size() - 2); - } + // if string is surrounded by double quotes, remove them + if (arg[0] == '\"' && + arg[arg.size() - 1] == '\"') { + arg = arg.substr(1, arg.size() - 2); + } } const char** ArgParser::getArgv(std::vector& argsArray) { - size_t argc = argsArray.size(); + size_t argc = argsArray.size(); - // caller is responsible for deleting the outer array only - // we use the c string pointers from argsArray and assign - // them to the inner array. So caller only need to use - // delete[] to delete the outer array - const char** argv = new const char*[argc]; + // caller is responsible for deleting the outer array only + // we use the c string pointers from argsArray and assign + // them to the inner array. So caller only need to use + // delete[] to delete the outer array + const char** argv = new const char*[argc]; - for (size_t i = 0; i < argc; i++) { - argv[i] = argsArray[i].c_str(); - } + for (size_t i = 0; i < argc; i++) { + argv[i] = argsArray[i].c_str(); + } - return argv; + return argv; } String ArgParser::assembleCommand(std::vector& argsArray, String ignoreArg, int parametersRequired) { - String result; + String result; - for (std::vector::iterator it = argsArray.begin(); it != argsArray.end(); ++it) { - if (it->compare(ignoreArg) == 0) { - it = it + parametersRequired; - continue; - } + for (std::vector::iterator it = argsArray.begin(); it != argsArray.end(); ++it) { + if (it->compare(ignoreArg) == 0) { + it = it + parametersRequired; + continue; + } - // if there is a space in this arg, use double quotes surround it - if ((*it).find(" ") != String::npos) { - (*it).insert(0, "\""); - (*it).push_back('\"'); - } + // if there is a space in this arg, use double quotes surround it + if ((*it).find(" ") != String::npos) { + (*it).insert(0, "\""); + (*it).push_back('\"'); + } - result.append(*it); - // add space to saperate args - result.append(" "); - } + result.append(*it); + // add space to saperate args + result.append(" "); + } - if (!result.empty()) { - // remove the tail space - result = result.substr(0, result.size() - 1); - } + if (!result.empty()) { + // remove the tail space + result = result.substr(0, result.size() - 1); + } - return result; + return result; } void ArgParser::updateCommonArgs(const char* const* argv) { - argsBase().m_name = ARCH->getHostName(); - argsBase().m_pname = ARCH->getBasename(argv[0]); + argsBase().m_name = ARCH->getHostName(); + argsBase().m_pname = ARCH->getBasename(argv[0]); } bool ArgParser::checkUnexpectedArgs() { #if SYSAPI_WIN32 - // suggest that user installs as a windows service. when launched as - // service, process should automatically detect that it should run in - // daemon mode. - if (argsBase().m_daemon) { - LOG((CLOG_ERR - "the --daemon argument is not supported on windows. " - "instead, install %s as a service (--service install)", - argsBase().m_pname)); - return true; - } + // suggest that user installs as a windows service. when launched as + // service, process should automatically detect that it should run in + // daemon mode. + if (argsBase().m_daemon) { + LOG((CLOG_ERR + "the --daemon argument is not supported on windows. " + "instead, install %s as a service (--service install)", + argsBase().m_pname)); + return true; + } #endif - return false; + return false; } diff --git a/src/lib/synergy/ArgParser.h b/src/lib/synergy/ArgParser.h index 73b1039b..4fc8a263 100644 --- a/src/lib/synergy/ArgParser.h +++ b/src/lib/synergy/ArgParser.h @@ -29,35 +29,35 @@ class App; class ArgParser { public: - ArgParser(App* app); + ArgParser(App* app); - bool parseServerArgs(ServerArgs& args, int argc, const char* const* argv); - bool parseClientArgs(ClientArgs& args, int argc, const char* const* argv); - bool parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i); - bool parseToolArgs(ToolArgs& args, int argc, const char* const* argv); - bool parseGenericArgs(int argc, const char* const* argv, int& i); - bool parseDeprecatedArgs(int argc, const char* const* argv, int& i); - void setArgsBase(ArgsBase& argsBase) { m_argsBase = &argsBase; } + bool parseServerArgs(ServerArgs& args, int argc, const char* const* argv); + bool parseClientArgs(ClientArgs& args, int argc, const char* const* argv); + bool parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i); + bool parseToolArgs(ToolArgs& args, int argc, const char* const* argv); + bool parseGenericArgs(int argc, const char* const* argv, int& i); + bool parseDeprecatedArgs(int argc, const char* const* argv, int& i); + void setArgsBase(ArgsBase& argsBase) { m_argsBase = &argsBase; } - static bool isArg(int argi, int argc, const char* const* argv, - const char* name1, const char* name2, - int minRequiredParameters = 0); - static void splitCommandString(String& command, std::vector& argv); - static bool searchDoubleQuotes(String& command, size_t& left, - size_t& right, size_t startPos = 0); - static void removeDoubleQuotes(String& arg); - static const char** getArgv(std::vector& argsArray); - static String assembleCommand(std::vector& argsArray, - String ignoreArg = "", int parametersRequired = 0); + static bool isArg(int argi, int argc, const char* const* argv, + const char* name1, const char* name2, + int minRequiredParameters = 0); + static void splitCommandString(String& command, std::vector& argv); + static bool searchDoubleQuotes(String& command, size_t& left, + size_t& right, size_t startPos = 0); + static void removeDoubleQuotes(String& arg); + static const char** getArgv(std::vector& argsArray); + static String assembleCommand(std::vector& argsArray, + String ignoreArg = "", int parametersRequired = 0); private: - void updateCommonArgs(const char* const* argv); - bool checkUnexpectedArgs(); - - static ArgsBase& argsBase() { return *m_argsBase; } + void updateCommonArgs(const char* const* argv); + bool checkUnexpectedArgs(); + + static ArgsBase& argsBase() { return *m_argsBase; } private: - App* m_app; - - static ArgsBase* m_argsBase; + App* m_app; + + static ArgsBase* m_argsBase; }; diff --git a/src/lib/synergy/ArgsBase.h b/src/lib/synergy/ArgsBase.h index 166e30ba..6ae0e3d0 100644 --- a/src/lib/synergy/ArgsBase.h +++ b/src/lib/synergy/ArgsBase.h @@ -22,33 +22,33 @@ class ArgsBase { public: - ArgsBase(); - virtual ~ArgsBase(); + ArgsBase(); + virtual ~ArgsBase(); public: - bool m_daemon; - bool m_backend; - bool m_restartable; - bool m_noHooks; - const char* m_pname; - const char* m_logFilter; - const char* m_logFile; - const char* m_display; - String m_name; - bool m_disableTray; - bool m_enableIpc; - bool m_enableDragDrop; + bool m_daemon; + bool m_backend; + bool m_restartable; + bool m_noHooks; + const char* m_pname; + const char* m_logFilter; + const char* m_logFile; + const char* m_display; + String m_name; + bool m_disableTray; + bool m_enableIpc; + bool m_enableDragDrop; #if SYSAPI_WIN32 - bool m_debugServiceWait; - bool m_pauseOnExit; - bool m_stopOnDeskSwitch; + bool m_debugServiceWait; + bool m_pauseOnExit; + bool m_stopOnDeskSwitch; #endif #if WINAPI_XWINDOWS - bool m_disableXInitThreads; + bool m_disableXInitThreads; #endif - bool m_shouldExit; - String m_synergyAddress; - bool m_enableCrypto; - String m_profileDirectory; - String m_pluginDirectory; + bool m_shouldExit; + String m_synergyAddress; + bool m_enableCrypto; + String m_profileDirectory; + String m_pluginDirectory; }; diff --git a/src/lib/synergy/CMakeLists.txt b/src/lib/synergy/CMakeLists.txt index 0972be8c..64ecd431 100644 --- a/src/lib/synergy/CMakeLists.txt +++ b/src/lib/synergy/CMakeLists.txt @@ -19,34 +19,34 @@ file(GLOB sources "*.cpp") # arch if (WIN32) - file(GLOB arch_headers "win32/*.h") - file(GLOB arch_sources "win32/*.cpp") + file(GLOB arch_headers "win32/*.h") + file(GLOB arch_sources "win32/*.cpp") elseif (UNIX) - file(GLOB arch_headers "unix/*.h") - file(GLOB arch_sources "unix/*.cpp") + file(GLOB arch_headers "unix/*.h") + file(GLOB arch_sources "unix/*.cpp") endif() list(APPEND sources ${arch_sources}) list(APPEND headers ${arch_headers}) if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ - ../../../ext - ../../../ext/gtest-1.6.0/include + ../ + ../../../ext + ../../../ext/gtest-1.6.0/include ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_library(synergy STATIC ${sources}) if (UNIX) - target_link_libraries(synergy arch client ipc net base platform mt server) + target_link_libraries(synergy arch client ipc net base platform mt server) endif() diff --git a/src/lib/synergy/Chunk.cpp b/src/lib/synergy/Chunk.cpp index fa690ba7..0bd8a62c 100644 --- a/src/lib/synergy/Chunk.cpp +++ b/src/lib/synergy/Chunk.cpp @@ -20,11 +20,11 @@ Chunk::Chunk(size_t size) { - m_chunk = new char[size]; - memset(m_chunk, 0, size); + m_chunk = new char[size]; + memset(m_chunk, 0, size); } Chunk::~Chunk() { - delete[] m_chunk; + delete[] m_chunk; } diff --git a/src/lib/synergy/Chunk.h b/src/lib/synergy/Chunk.h index 366788a4..8a6f21f2 100644 --- a/src/lib/synergy/Chunk.h +++ b/src/lib/synergy/Chunk.h @@ -21,10 +21,10 @@ class Chunk { public: - Chunk(size_t size); - ~Chunk(); + Chunk(size_t size); + ~Chunk(); public: - size_t m_dataSize; - char* m_chunk; + size_t m_dataSize; + char* m_chunk; }; diff --git a/src/lib/synergy/ClientApp.cpp b/src/lib/synergy/ClientApp.cpp index 10aba5f3..1accbad3 100644 --- a/src/lib/synergy/ClientApp.cpp +++ b/src/lib/synergy/ClientApp.cpp @@ -63,10 +63,10 @@ #define RETRY_TIME 1.0 ClientApp::ClientApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : - App(events, createTaskBarReceiver, new ClientArgs()), - m_client(NULL), - m_clientScreen(NULL), - m_serverAddress(NULL) + App(events, createTaskBarReceiver, new ClientArgs()), + m_client(NULL), + m_clientScreen(NULL), + m_serverAddress(NULL) { } @@ -77,32 +77,32 @@ ClientApp::~ClientApp() void ClientApp::parseArgs(int argc, const char* const* argv) { - ArgParser argParser(this); - bool result = argParser.parseClientArgs(args(), argc, argv); + ArgParser argParser(this); + bool result = argParser.parseClientArgs(args(), argc, argv); - if (!result || args().m_shouldExit) { - m_bye(kExitArgs); - } - else { - // save server address - if (!args().m_synergyAddress.empty()) { - try { - *m_serverAddress = NetworkAddress(args().m_synergyAddress, kDefaultPort); - m_serverAddress->resolve(); - } - catch (XSocketAddress& e) { - // allow an address that we can't look up if we're restartable. - // we'll try to resolve the address each time we connect to the - // server. a bad port will never get better. patch by Brent - // Priddy. - if (!args().m_restartable || e.getError() == XSocketAddress::kBadPort) { - LOG((CLOG_PRINT "%s: %s" BYE, - args().m_pname, e.what(), args().m_pname)); - m_bye(kExitFailed); - } - } - } - } + if (!result || args().m_shouldExit) { + m_bye(kExitArgs); + } + else { + // save server address + if (!args().m_synergyAddress.empty()) { + try { + *m_serverAddress = NetworkAddress(args().m_synergyAddress, kDefaultPort); + m_serverAddress->resolve(); + } + catch (XSocketAddress& e) { + // allow an address that we can't look up if we're restartable. + // we'll try to resolve the address each time we connect to the + // server. a bad port will never get better. patch by Brent + // Priddy. + if (!args().m_restartable || e.getError() == XSocketAddress::kBadPort) { + LOG((CLOG_PRINT "%s: %s" BYE, + args().m_pname, e.what(), args().m_pname)); + m_bye(kExitFailed); + } + } + } + } } void @@ -110,52 +110,52 @@ ClientApp::help() { #if WINAPI_XWINDOWS # define WINAPI_ARG \ - " [--display ] [--no-xinitthreads]" + " [--display ] [--no-xinitthreads]" # define WINAPI_INFO \ - " --display connect to the X server at \n" \ - " --no-xinitthreads do not call XInitThreads()\n" + " --display connect to the X server at \n" \ + " --no-xinitthreads do not call XInitThreads()\n" #else # define WINAPI_ARG # define WINAPI_INFO #endif - char buffer[2000]; - sprintf( - buffer, - "Usage: %s" - " [--yscroll ]" - WINAPI_ARG - HELP_SYS_ARGS - HELP_COMMON_ARGS - " " - "\n\n" - "Connect to a synergy mouse/keyboard sharing server.\n" - "\n" - HELP_COMMON_INFO_1 - WINAPI_INFO - HELP_SYS_INFO - " --yscroll defines the vertical scrolling delta, which is\n" - " 120 by default.\n" - HELP_COMMON_INFO_2 - "\n" - "* marks defaults.\n" - "\n" - "The server address is of the form: [][:]. The hostname\n" - "must be the address or hostname of the server. The port overrides the\n" - "default port, %d.\n", - args().m_pname, kDefaultPort - ); + char buffer[2000]; + sprintf( + buffer, + "Usage: %s" + " [--yscroll ]" + WINAPI_ARG + HELP_SYS_ARGS + HELP_COMMON_ARGS + " " + "\n\n" + "Connect to a synergy mouse/keyboard sharing server.\n" + "\n" + HELP_COMMON_INFO_1 + WINAPI_INFO + HELP_SYS_INFO + " --yscroll defines the vertical scrolling delta, which is\n" + " 120 by default.\n" + HELP_COMMON_INFO_2 + "\n" + "* marks defaults.\n" + "\n" + "The server address is of the form: [][:]. The hostname\n" + "must be the address or hostname of the server. The port overrides the\n" + "default port, %d.\n", + args().m_pname, kDefaultPort + ); - LOG((CLOG_PRINT "%s", buffer)); + LOG((CLOG_PRINT "%s", buffer)); } const char* ClientApp::daemonName() const { #if SYSAPI_WIN32 - return "Synergy Client"; + return "Synergy Client"; #elif SYSAPI_UNIX - return "synergyc"; + return "synergyc"; #endif } @@ -163,9 +163,9 @@ const char* ClientApp::daemonInfo() const { #if SYSAPI_WIN32 - return "Allows another computer to share it's keyboard and mouse with this computer."; + return "Allows another computer to share it's keyboard and mouse with this computer."; #elif SYSAPI_UNIX - return ""; + return ""; #endif } @@ -173,396 +173,396 @@ synergy::Screen* ClientApp::createScreen() { #if WINAPI_MSWINDOWS - return new synergy::Screen(new MSWindowsScreen( - false, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events); + return new synergy::Screen(new MSWindowsScreen( + false, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events); #elif WINAPI_XWINDOWS - return new synergy::Screen(new XWindowsScreen( - args().m_display, false, args().m_disableXInitThreads, - args().m_yscroll, m_events), m_events); + return new synergy::Screen(new XWindowsScreen( + args().m_display, false, args().m_disableXInitThreads, + args().m_yscroll, m_events), m_events); #elif WINAPI_CARBON - return new synergy::Screen(new OSXScreen(m_events, false), m_events); + return new synergy::Screen(new OSXScreen(m_events, false), m_events); #endif } void ClientApp::updateStatus() { - updateStatus(""); + updateStatus(""); } void ClientApp::updateStatus(const String& msg) { - if (m_taskBarReceiver) - { - m_taskBarReceiver->updateStatus(m_client, msg); - } + if (m_taskBarReceiver) + { + m_taskBarReceiver->updateStatus(m_client, msg); + } } void ClientApp::resetRestartTimeout() { - // retry time can nolonger be changed - //s_retryTime = 0.0; + // retry time can nolonger be changed + //s_retryTime = 0.0; } double ClientApp::nextRestartTimeout() { - // retry at a constant rate (Issue 52) - return RETRY_TIME; + // retry at a constant rate (Issue 52) + return RETRY_TIME; - /* - // choose next restart timeout. we start with rapid retries - // then slow down. - if (s_retryTime < 1.0) { - s_retryTime = 1.0; - } - else if (s_retryTime < 3.0) { - s_retryTime = 3.0; - } - else { - s_retryTime = 5.0; - } - return s_retryTime; - */ + /* + // choose next restart timeout. we start with rapid retries + // then slow down. + if (s_retryTime < 1.0) { + s_retryTime = 1.0; + } + else if (s_retryTime < 3.0) { + s_retryTime = 3.0; + } + else { + s_retryTime = 5.0; + } + return s_retryTime; + */ } void ClientApp::handleScreenError(const Event&, void*) { - LOG((CLOG_CRIT "error on screen")); - m_events->addEvent(Event(Event::kQuit)); + LOG((CLOG_CRIT "error on screen")); + m_events->addEvent(Event(Event::kQuit)); } synergy::Screen* ClientApp::openClientScreen() { - synergy::Screen* screen = createScreen(); - screen->setEnableDragDrop(argsBase().m_enableDragDrop); - m_events->adoptHandler(m_events->forIScreen().error(), - screen->getEventTarget(), - new TMethodEventJob( - this, &ClientApp::handleScreenError)); - return screen; + synergy::Screen* screen = createScreen(); + screen->setEnableDragDrop(argsBase().m_enableDragDrop); + m_events->adoptHandler(m_events->forIScreen().error(), + screen->getEventTarget(), + new TMethodEventJob( + this, &ClientApp::handleScreenError)); + return screen; } void ClientApp::closeClientScreen(synergy::Screen* screen) { - if (screen != NULL) { - m_events->removeHandler(m_events->forIScreen().error(), - screen->getEventTarget()); - delete screen; - } + if (screen != NULL) { + m_events->removeHandler(m_events->forIScreen().error(), + screen->getEventTarget()); + delete screen; + } } void ClientApp::handleClientRestart(const Event&, void* vtimer) { - // discard old timer - EventQueueTimer* timer = static_cast(vtimer); - m_events->deleteTimer(timer); - m_events->removeHandler(Event::kTimer, timer); + // discard old timer + EventQueueTimer* timer = static_cast(vtimer); + m_events->deleteTimer(timer); + m_events->removeHandler(Event::kTimer, timer); - // reconnect - startClient(); + // reconnect + startClient(); } void ClientApp::scheduleClientRestart(double retryTime) { - // install a timer and handler to retry later - LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); - EventQueueTimer* timer = m_events->newOneShotTimer(retryTime, NULL); - m_events->adoptHandler(Event::kTimer, timer, - new TMethodEventJob(this, &ClientApp::handleClientRestart, timer)); + // install a timer and handler to retry later + LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); + EventQueueTimer* timer = m_events->newOneShotTimer(retryTime, NULL); + m_events->adoptHandler(Event::kTimer, timer, + new TMethodEventJob(this, &ClientApp::handleClientRestart, timer)); } void ClientApp::handleClientConnected(const Event&, void*) { - LOG((CLOG_NOTE "connected to server")); - resetRestartTimeout(); - updateStatus(); + LOG((CLOG_NOTE "connected to server")); + resetRestartTimeout(); + updateStatus(); } void ClientApp::handleClientFailed(const Event& e, void*) { - Client::FailInfo* info = - static_cast(e.getData()); + Client::FailInfo* info = + static_cast(e.getData()); - updateStatus(String("Failed to connect to server: ") + info->m_what); - if (!args().m_restartable || !info->m_retry) { - LOG((CLOG_ERR "failed to connect to server: %s", info->m_what.c_str())); - m_events->addEvent(Event(Event::kQuit)); - } - else { - LOG((CLOG_WARN "failed to connect to server: %s", info->m_what.c_str())); - if (!m_suspended) { - scheduleClientRestart(nextRestartTimeout()); - } - } - delete info; + updateStatus(String("Failed to connect to server: ") + info->m_what); + if (!args().m_restartable || !info->m_retry) { + LOG((CLOG_ERR "failed to connect to server: %s", info->m_what.c_str())); + m_events->addEvent(Event(Event::kQuit)); + } + else { + LOG((CLOG_WARN "failed to connect to server: %s", info->m_what.c_str())); + if (!m_suspended) { + scheduleClientRestart(nextRestartTimeout()); + } + } + delete info; } void ClientApp::handleClientDisconnected(const Event&, void*) { - LOG((CLOG_NOTE "disconnected from server")); - if (!args().m_restartable) { - m_events->addEvent(Event(Event::kQuit)); - } - else if (!m_suspended) { - scheduleClientRestart(nextRestartTimeout()); - } - updateStatus(); + LOG((CLOG_NOTE "disconnected from server")); + if (!args().m_restartable) { + m_events->addEvent(Event(Event::kQuit)); + } + else if (!m_suspended) { + scheduleClientRestart(nextRestartTimeout()); + } + updateStatus(); } Client* ClientApp::openClient(const String& name, const NetworkAddress& address, - synergy::Screen* screen) + synergy::Screen* screen) { - Client* client = new Client( - m_events, - name, - address, - new TCPSocketFactory(m_events, getSocketMultiplexer()), - screen, - args()); + Client* client = new Client( + m_events, + name, + address, + new TCPSocketFactory(m_events, getSocketMultiplexer()), + screen, + args()); - try { - m_events->adoptHandler( - m_events->forClient().connected(), - client->getEventTarget(), - new TMethodEventJob(this, &ClientApp::handleClientConnected)); + try { + m_events->adoptHandler( + m_events->forClient().connected(), + client->getEventTarget(), + new TMethodEventJob(this, &ClientApp::handleClientConnected)); - m_events->adoptHandler( - m_events->forClient().connectionFailed(), - client->getEventTarget(), - new TMethodEventJob(this, &ClientApp::handleClientFailed)); + m_events->adoptHandler( + m_events->forClient().connectionFailed(), + client->getEventTarget(), + new TMethodEventJob(this, &ClientApp::handleClientFailed)); - m_events->adoptHandler( - m_events->forClient().disconnected(), - client->getEventTarget(), - new TMethodEventJob(this, &ClientApp::handleClientDisconnected)); + m_events->adoptHandler( + m_events->forClient().disconnected(), + client->getEventTarget(), + new TMethodEventJob(this, &ClientApp::handleClientDisconnected)); - } catch (std::bad_alloc &ba) { - delete client; - throw ba; - } + } catch (std::bad_alloc &ba) { + delete client; + throw ba; + } - return client; + return client; } void ClientApp::closeClient(Client* client) { - if (client == NULL) { - return; - } + if (client == NULL) { + return; + } - m_events->removeHandler(m_events->forClient().connected(), client); - m_events->removeHandler(m_events->forClient().connectionFailed(), client); - m_events->removeHandler(m_events->forClient().disconnected(), client); - delete client; + m_events->removeHandler(m_events->forClient().connected(), client); + m_events->removeHandler(m_events->forClient().connectionFailed(), client); + m_events->removeHandler(m_events->forClient().disconnected(), client); + delete client; } int ClientApp::foregroundStartup(int argc, char** argv) { - initApp(argc, argv); + initApp(argc, argv); - // never daemonize - return mainLoop(); + // never daemonize + return mainLoop(); } bool ClientApp::startClient() { - double retryTime; - synergy::Screen* clientScreen = NULL; - try { - if (m_clientScreen == NULL) { - clientScreen = openClientScreen(); - m_client = openClient(args().m_name, - *m_serverAddress, clientScreen); - m_clientScreen = clientScreen; - LOG((CLOG_NOTE "started client")); - } + double retryTime; + synergy::Screen* clientScreen = NULL; + try { + if (m_clientScreen == NULL) { + clientScreen = openClientScreen(); + m_client = openClient(args().m_name, + *m_serverAddress, clientScreen); + m_clientScreen = clientScreen; + LOG((CLOG_NOTE "started client")); + } - m_client->connect(); + m_client->connect(); - updateStatus(); - return true; - } - catch (XScreenUnavailable& e) { - LOG((CLOG_WARN "secondary screen unavailable: %s", e.what())); - closeClientScreen(clientScreen); - updateStatus(String("secondary screen unavailable: ") + e.what()); - retryTime = e.getRetryTime(); - } - catch (XScreenOpenFailure& e) { - LOG((CLOG_CRIT "failed to start client: %s", e.what())); - closeClientScreen(clientScreen); - return false; - } - catch (XBase& e) { - LOG((CLOG_CRIT "failed to start client: %s", e.what())); - closeClientScreen(clientScreen); - return false; - } + updateStatus(); + return true; + } + catch (XScreenUnavailable& e) { + LOG((CLOG_WARN "secondary screen unavailable: %s", e.what())); + closeClientScreen(clientScreen); + updateStatus(String("secondary screen unavailable: ") + e.what()); + retryTime = e.getRetryTime(); + } + catch (XScreenOpenFailure& e) { + LOG((CLOG_CRIT "failed to start client: %s", e.what())); + closeClientScreen(clientScreen); + return false; + } + catch (XBase& e) { + LOG((CLOG_CRIT "failed to start client: %s", e.what())); + closeClientScreen(clientScreen); + return false; + } - if (args().m_restartable) { - scheduleClientRestart(retryTime); - return true; - } - else { - // don't try again - return false; - } + if (args().m_restartable) { + scheduleClientRestart(retryTime); + return true; + } + else { + // don't try again + return false; + } } void ClientApp::stopClient() { - closeClient(m_client); - closeClientScreen(m_clientScreen); - m_client = NULL; - m_clientScreen = NULL; + closeClient(m_client); + closeClientScreen(m_clientScreen); + m_client = NULL; + m_clientScreen = NULL; } int ClientApp::mainLoop() { - // create socket multiplexer. this must happen after daemonization - // on unix because threads evaporate across a fork(). - SocketMultiplexer multiplexer; - setSocketMultiplexer(&multiplexer); + // create socket multiplexer. this must happen after daemonization + // on unix because threads evaporate across a fork(). + SocketMultiplexer multiplexer; + setSocketMultiplexer(&multiplexer); - // start client, etc - appUtil().startNode(); - - // init ipc client after node start, since create a new screen wipes out - // the event queue (the screen ctors call adoptBuffer). - if (argsBase().m_enableIpc) { - initIpcClient(); - } + // start client, etc + appUtil().startNode(); + + // init ipc client after node start, since create a new screen wipes out + // the event queue (the screen ctors call adoptBuffer). + if (argsBase().m_enableIpc) { + initIpcClient(); + } - // run event loop. if startClient() failed we're supposed to retry - // later. the timer installed by startClient() will take care of - // that. - DAEMON_RUNNING(true); - + // run event loop. if startClient() failed we're supposed to retry + // later. the timer installed by startClient() will take care of + // that. + DAEMON_RUNNING(true); + #if defined(MAC_OS_X_VERSION_10_7) - - Thread thread( - new TMethodJob( - this, &ClientApp::runEventsLoop, - NULL)); - - // wait until carbon loop is ready - OSXScreen* screen = dynamic_cast( - m_clientScreen->getPlatformScreen()); - screen->waitForCarbonLoop(); - - runCocoaApp(); + + Thread thread( + new TMethodJob( + this, &ClientApp::runEventsLoop, + NULL)); + + // wait until carbon loop is ready + OSXScreen* screen = dynamic_cast( + m_clientScreen->getPlatformScreen()); + screen->waitForCarbonLoop(); + + runCocoaApp(); #else - m_events->loop(); + m_events->loop(); #endif - - DAEMON_RUNNING(false); + + DAEMON_RUNNING(false); - // close down - LOG((CLOG_DEBUG1 "stopping client")); - stopClient(); - updateStatus(); - LOG((CLOG_NOTE "stopped client")); + // close down + LOG((CLOG_DEBUG1 "stopping client")); + stopClient(); + updateStatus(); + LOG((CLOG_NOTE "stopped client")); - if (argsBase().m_enableIpc) { - cleanupIpcClient(); - } + if (argsBase().m_enableIpc) { + cleanupIpcClient(); + } - return kExitSuccess; + return kExitSuccess; } static int daemonMainLoopStatic(int argc, const char** argv) { - return ClientApp::instance().daemonMainLoop(argc, argv); + return ClientApp::instance().daemonMainLoop(argc, argv); } int ClientApp::standardStartup(int argc, char** argv) { - initApp(argc, argv); + initApp(argc, argv); - // daemonize if requested - if (args().m_daemon) { - return ARCH->daemonize(daemonName(), &daemonMainLoopStatic); - } - else { - return mainLoop(); - } + // daemonize if requested + if (args().m_daemon) { + return ARCH->daemonize(daemonName(), &daemonMainLoopStatic); + } + else { + return mainLoop(); + } } int ClientApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup) { - // general initialization - m_serverAddress = new NetworkAddress; - args().m_pname = ARCH->getBasename(argv[0]); + // general initialization + m_serverAddress = new NetworkAddress; + args().m_pname = ARCH->getBasename(argv[0]); - // install caller's output filter - if (outputter != NULL) { - CLOG->insert(outputter); - } + // install caller's output filter + if (outputter != NULL) { + CLOG->insert(outputter); + } - int result; - try - { - // run - result = startup(argc, argv); - } - catch (...) - { - if (m_taskBarReceiver) - { - // done with task bar receiver - delete m_taskBarReceiver; - } + int result; + try + { + // run + result = startup(argc, argv); + } + catch (...) + { + if (m_taskBarReceiver) + { + // done with task bar receiver + delete m_taskBarReceiver; + } - delete m_serverAddress; + delete m_serverAddress; - throw; - } + throw; + } - return result; + return result; } void ClientApp::startNode() { - // start the client. if this return false then we've failed and - // we shouldn't retry. - LOG((CLOG_DEBUG1 "starting client")); - if (!startClient()) { - m_bye(kExitFailed); - } + // start the client. if this return false then we've failed and + // we shouldn't retry. + LOG((CLOG_DEBUG1 "starting client")); + if (!startClient()) { + m_bye(kExitFailed); + } } diff --git a/src/lib/synergy/ClientApp.h b/src/lib/synergy/ClientApp.h index 2113318f..24fa20c3 100644 --- a/src/lib/synergy/ClientApp.h +++ b/src/lib/synergy/ClientApp.h @@ -29,55 +29,55 @@ class ClientArgs; class ClientApp : public App { public: - ClientApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver); - virtual ~ClientApp(); + ClientApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver); + virtual ~ClientApp(); - // Parse client specific command line arguments. - void parseArgs(int argc, const char* const* argv); + // Parse client specific command line arguments. + void parseArgs(int argc, const char* const* argv); - // Prints help specific to client. - void help(); + // Prints help specific to client. + void help(); - // Returns arguments that are common and for client. - ClientArgs& args() const { return (ClientArgs&)argsBase(); } + // Returns arguments that are common and for client. + ClientArgs& args() const { return (ClientArgs&)argsBase(); } - const char* daemonName() const; - const char* daemonInfo() const; + const char* daemonName() const; + const char* daemonInfo() const; - // TODO: move to server only (not supported on client) - void loadConfig() { } - bool loadConfig(const String& pathname) { return false; } + // TODO: move to server only (not supported on client) + void loadConfig() { } + bool loadConfig(const String& pathname) { return false; } - int foregroundStartup(int argc, char** argv); - int standardStartup(int argc, char** argv); - int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); - synergy::Screen* createScreen(); - void updateStatus(); - void updateStatus(const String& msg); - void resetRestartTimeout(); - double nextRestartTimeout(); - void handleScreenError(const Event&, void*); - synergy::Screen* openClientScreen(); - void closeClientScreen(synergy::Screen* screen); - void handleClientRestart(const Event&, void* vtimer); - void scheduleClientRestart(double retryTime); - void handleClientConnected(const Event&, void*); - void handleClientFailed(const Event& e, void*); - void handleClientDisconnected(const Event&, void*); - Client* openClient(const String& name, const NetworkAddress& address, - synergy::Screen* screen); - void closeClient(Client* client); - bool startClient(); - void stopClient(); - int mainLoop(); - void startNode(); + int foregroundStartup(int argc, char** argv); + int standardStartup(int argc, char** argv); + int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); + synergy::Screen* createScreen(); + void updateStatus(); + void updateStatus(const String& msg); + void resetRestartTimeout(); + double nextRestartTimeout(); + void handleScreenError(const Event&, void*); + synergy::Screen* openClientScreen(); + void closeClientScreen(synergy::Screen* screen); + void handleClientRestart(const Event&, void* vtimer); + void scheduleClientRestart(double retryTime); + void handleClientConnected(const Event&, void*); + void handleClientFailed(const Event& e, void*); + void handleClientDisconnected(const Event&, void*); + Client* openClient(const String& name, const NetworkAddress& address, + synergy::Screen* screen); + void closeClient(Client* client); + bool startClient(); + void stopClient(); + int mainLoop(); + void startNode(); - static ClientApp& instance() { return (ClientApp&)App::instance(); } + static ClientApp& instance() { return (ClientApp&)App::instance(); } - Client* getClientPtr() { return m_client; } + Client* getClientPtr() { return m_client; } private: - Client* m_client; - synergy::Screen*m_clientScreen; - NetworkAddress* m_serverAddress; + Client* m_client; + synergy::Screen*m_clientScreen; + NetworkAddress* m_serverAddress; }; diff --git a/src/lib/synergy/ClientArgs.cpp b/src/lib/synergy/ClientArgs.cpp index a7b8f733..03ffd746 100644 --- a/src/lib/synergy/ClientArgs.cpp +++ b/src/lib/synergy/ClientArgs.cpp @@ -18,6 +18,6 @@ #include "synergy/ClientArgs.h" ClientArgs::ClientArgs() : - m_yscroll(0) + m_yscroll(0) { } diff --git a/src/lib/synergy/ClientArgs.h b/src/lib/synergy/ClientArgs.h index 004966d8..93a7307a 100644 --- a/src/lib/synergy/ClientArgs.h +++ b/src/lib/synergy/ClientArgs.h @@ -23,8 +23,8 @@ class NetworkAddress; class ClientArgs : public ArgsBase { public: - ClientArgs(); + ClientArgs(); public: - int m_yscroll; + int m_yscroll; }; diff --git a/src/lib/synergy/ClientTaskBarReceiver.cpp b/src/lib/synergy/ClientTaskBarReceiver.cpp index b84e8b99..d49175da 100644 --- a/src/lib/synergy/ClientTaskBarReceiver.cpp +++ b/src/lib/synergy/ClientTaskBarReceiver.cpp @@ -29,113 +29,113 @@ // ClientTaskBarReceiver::ClientTaskBarReceiver(IEventQueue* events) : - m_state(kNotRunning), - m_events(events) + m_state(kNotRunning), + m_events(events) { - // do nothing + // do nothing } ClientTaskBarReceiver::~ClientTaskBarReceiver() { - // do nothing + // do nothing } void ClientTaskBarReceiver::updateStatus(Client* client, const String& errorMsg) { - { - // update our status - m_errorMessage = errorMsg; - if (client == NULL) { - if (m_errorMessage.empty()) { - m_state = kNotRunning; - } - else { - m_state = kNotWorking; - } - } - else { - m_server = client->getServerAddress().getHostname(); + { + // update our status + m_errorMessage = errorMsg; + if (client == NULL) { + if (m_errorMessage.empty()) { + m_state = kNotRunning; + } + else { + m_state = kNotWorking; + } + } + else { + m_server = client->getServerAddress().getHostname(); - if (client->isConnected()) { - m_state = kConnected; - } - else if (client->isConnecting()) { - m_state = kConnecting; - } - else { - m_state = kNotConnected; - } - } + if (client->isConnected()) { + m_state = kConnected; + } + else if (client->isConnecting()) { + m_state = kConnecting; + } + else { + m_state = kNotConnected; + } + } - // let subclasses have a go - onStatusChanged(client); - } + // let subclasses have a go + onStatusChanged(client); + } - // tell task bar - ARCH->updateReceiver(this); + // tell task bar + ARCH->updateReceiver(this); } ClientTaskBarReceiver::EState ClientTaskBarReceiver::getStatus() const { - return m_state; + return m_state; } const String& ClientTaskBarReceiver::getErrorMessage() const { - return m_errorMessage; + return m_errorMessage; } void ClientTaskBarReceiver::quit() { - m_events->addEvent(Event(Event::kQuit)); + m_events->addEvent(Event(Event::kQuit)); } void ClientTaskBarReceiver::onStatusChanged(Client*) { - // do nothing + // do nothing } void ClientTaskBarReceiver::lock() const { - // do nothing + // do nothing } void ClientTaskBarReceiver::unlock() const { - // do nothing + // do nothing } std::string ClientTaskBarReceiver::getToolTip() const { - switch (m_state) { - case kNotRunning: - return synergy::string::sprintf("%s: Not running", kAppVersion); + switch (m_state) { + case kNotRunning: + return synergy::string::sprintf("%s: Not running", kAppVersion); - case kNotWorking: - return synergy::string::sprintf("%s: %s", - kAppVersion, m_errorMessage.c_str()); + case kNotWorking: + return synergy::string::sprintf("%s: %s", + kAppVersion, m_errorMessage.c_str()); - case kNotConnected: - return synergy::string::sprintf("%s: Not connected: %s", - kAppVersion, m_errorMessage.c_str()); + case kNotConnected: + return synergy::string::sprintf("%s: Not connected: %s", + kAppVersion, m_errorMessage.c_str()); - case kConnecting: - return synergy::string::sprintf("%s: Connecting to %s...", - kAppVersion, m_server.c_str()); + case kConnecting: + return synergy::string::sprintf("%s: Connecting to %s...", + kAppVersion, m_server.c_str()); - case kConnected: - return synergy::string::sprintf("%s: Connected to %s", - kAppVersion, m_server.c_str()); + case kConnected: + return synergy::string::sprintf("%s: Connected to %s", + kAppVersion, m_server.c_str()); - default: - return ""; - } + default: + return ""; + } } diff --git a/src/lib/synergy/ClientTaskBarReceiver.h b/src/lib/synergy/ClientTaskBarReceiver.h index 7a317c4a..eae8e3b0 100644 --- a/src/lib/synergy/ClientTaskBarReceiver.h +++ b/src/lib/synergy/ClientTaskBarReceiver.h @@ -29,65 +29,65 @@ class IEventQueue; //! Implementation of IArchTaskBarReceiver for the synergy server class ClientTaskBarReceiver : public IArchTaskBarReceiver { public: - ClientTaskBarReceiver(IEventQueue* events); - virtual ~ClientTaskBarReceiver(); + ClientTaskBarReceiver(IEventQueue* events); + virtual ~ClientTaskBarReceiver(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update status - /*! - Determine the status and query required information from the client. - */ - void updateStatus(Client*, const String& errorMsg); + //! Update status + /*! + Determine the status and query required information from the client. + */ + void updateStatus(Client*, const String& errorMsg); - void updateStatus(INode* n, const String& errorMsg) { updateStatus((Client*)n, errorMsg); } + void updateStatus(INode* n, const String& errorMsg) { updateStatus((Client*)n, errorMsg); } - //@} + //@} - // IArchTaskBarReceiver overrides - virtual void showStatus() = 0; - virtual void runMenu(int x, int y) = 0; - virtual void primaryAction() = 0; - virtual void lock() const; - virtual void unlock() const; - virtual const Icon getIcon() const = 0; - virtual std::string getToolTip() const; - virtual void cleanup() {} + // IArchTaskBarReceiver overrides + virtual void showStatus() = 0; + virtual void runMenu(int x, int y) = 0; + virtual void primaryAction() = 0; + virtual void lock() const; + virtual void unlock() const; + virtual const Icon getIcon() const = 0; + virtual std::string getToolTip() const; + virtual void cleanup() {} protected: - enum EState { - kNotRunning, - kNotWorking, - kNotConnected, - kConnecting, - kConnected, - kMaxState - }; + enum EState { + kNotRunning, + kNotWorking, + kNotConnected, + kConnecting, + kConnected, + kMaxState + }; - //! Get status - EState getStatus() const; + //! Get status + EState getStatus() const; - //! Get error message - const String& getErrorMessage() const; + //! Get error message + const String& getErrorMessage() const; - //! Quit app - /*! - Causes the application to quit gracefully - */ - void quit(); + //! Quit app + /*! + Causes the application to quit gracefully + */ + void quit(); - //! Status change notification - /*! - Called when status changes. The default implementation does nothing. - */ - virtual void onStatusChanged(Client* client); + //! Status change notification + /*! + Called when status changes. The default implementation does nothing. + */ + virtual void onStatusChanged(Client* client); private: - EState m_state; - String m_errorMessage; - String m_server; - IEventQueue* m_events; + EState m_state; + String m_errorMessage; + String m_server; + IEventQueue* m_events; }; IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events); diff --git a/src/lib/synergy/Clipboard.cpp b/src/lib/synergy/Clipboard.cpp index 87025252..86bd37b6 100644 --- a/src/lib/synergy/Clipboard.cpp +++ b/src/lib/synergy/Clipboard.cpp @@ -23,96 +23,96 @@ // Clipboard::Clipboard() : - m_open(false), - m_owner(false) + m_open(false), + m_owner(false) { - open(0); - empty(); - close(); + open(0); + empty(); + close(); } Clipboard::~Clipboard() { - // do nothing + // do nothing } bool Clipboard::empty() { - assert(m_open); + assert(m_open); - // clear all data - for (SInt32 index = 0; index < kNumFormats; ++index) { - m_data[index] = ""; - m_added[index] = false; - } + // clear all data + for (SInt32 index = 0; index < kNumFormats; ++index) { + m_data[index] = ""; + m_added[index] = false; + } - // save time - m_timeOwned = m_time; + // save time + m_timeOwned = m_time; - // we're the owner now - m_owner = true; + // we're the owner now + m_owner = true; - return true; + return true; } void Clipboard::add(EFormat format, const String& data) { - assert(m_open); - assert(m_owner); + assert(m_open); + assert(m_owner); - m_data[format] = data; - m_added[format] = true; + m_data[format] = data; + m_added[format] = true; } bool Clipboard::open(Time time) const { - assert(!m_open); + assert(!m_open); - m_open = true; - m_time = time; + m_open = true; + m_time = time; - return true; + return true; } void Clipboard::close() const { - assert(m_open); + assert(m_open); - m_open = false; + m_open = false; } Clipboard::Time Clipboard::getTime() const { - return m_timeOwned; + return m_timeOwned; } bool Clipboard::has(EFormat format) const { - assert(m_open); - return m_added[format]; + assert(m_open); + return m_added[format]; } String Clipboard::get(EFormat format) const { - assert(m_open); - return m_data[format]; + assert(m_open); + return m_data[format]; } void Clipboard::unmarshall(const String& data, Time time) { - IClipboard::unmarshall(this, data, time); + IClipboard::unmarshall(this, data, time); } String Clipboard::marshall() const { - return IClipboard::marshall(this); + return IClipboard::marshall(this); } diff --git a/src/lib/synergy/Clipboard.h b/src/lib/synergy/Clipboard.h index e0195f70..81f07000 100644 --- a/src/lib/synergy/Clipboard.h +++ b/src/lib/synergy/Clipboard.h @@ -26,46 +26,46 @@ This class implements a clipboard that stores data in memory. */ class Clipboard : public IClipboard { public: - Clipboard(); - virtual ~Clipboard(); + Clipboard(); + virtual ~Clipboard(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Unmarshall clipboard data - /*! - Extract marshalled clipboard data and store it in this clipboard. - Sets the clipboard time to \c time. - */ - void unmarshall(const String& data, Time time); + //! Unmarshall clipboard data + /*! + Extract marshalled clipboard data and store it in this clipboard. + Sets the clipboard time to \c time. + */ + void unmarshall(const String& data, Time time); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Marshall clipboard data - /*! - Merge this clipboard's data into a single buffer that can be later - unmarshalled to restore the clipboard and return the buffer. - */ - String marshall() const; + //! Marshall clipboard data + /*! + Merge this clipboard's data into a single buffer that can be later + unmarshalled to restore the clipboard and return the buffer. + */ + String marshall() const; - //@} + //@} - // IClipboard overrides - virtual bool empty(); - virtual void add(EFormat, const String& data); - virtual bool open(Time) const; - virtual void close() const; - virtual Time getTime() const; - virtual bool has(EFormat) const; - virtual String get(EFormat) const; + // IClipboard overrides + virtual bool empty(); + virtual void add(EFormat, const String& data); + virtual bool open(Time) const; + virtual void close() const; + virtual Time getTime() const; + virtual bool has(EFormat) const; + virtual String get(EFormat) const; private: - mutable bool m_open; - mutable Time m_time; - bool m_owner; - Time m_timeOwned; - bool m_added[kNumFormats]; - String m_data[kNumFormats]; + mutable bool m_open; + mutable Time m_time; + bool m_owner; + Time m_timeOwned; + bool m_added[kNumFormats]; + String m_data[kNumFormats]; }; diff --git a/src/lib/synergy/ClipboardChunk.cpp b/src/lib/synergy/ClipboardChunk.cpp index 292826ee..0cf0ffbc 100644 --- a/src/lib/synergy/ClipboardChunk.cpp +++ b/src/lib/synergy/ClipboardChunk.cpp @@ -26,129 +26,129 @@ size_t ClipboardChunk::s_expectedSize = 0; ClipboardChunk::ClipboardChunk(size_t size) : - Chunk(size) + Chunk(size) { - m_dataSize = size - CLIPBOARD_CHUNK_META_SIZE; + m_dataSize = size - CLIPBOARD_CHUNK_META_SIZE; } ClipboardChunk* ClipboardChunk::start( - ClipboardID id, - UInt32 sequence, - const String& size) + ClipboardID id, + UInt32 sequence, + const String& size) { - size_t sizeLength = size.size(); - ClipboardChunk* start = new ClipboardChunk(sizeLength + CLIPBOARD_CHUNK_META_SIZE); - char* chunk = start->m_chunk; + size_t sizeLength = size.size(); + ClipboardChunk* start = new ClipboardChunk(sizeLength + CLIPBOARD_CHUNK_META_SIZE); + char* chunk = start->m_chunk; - chunk[0] = id; - std::memcpy (&chunk[1], &sequence, 4); - chunk[5] = kDataStart; - memcpy(&chunk[6], size.c_str(), sizeLength); - chunk[sizeLength + CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; + chunk[0] = id; + std::memcpy (&chunk[1], &sequence, 4); + chunk[5] = kDataStart; + memcpy(&chunk[6], size.c_str(), sizeLength); + chunk[sizeLength + CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; - return start; + return start; } ClipboardChunk* ClipboardChunk::data( - ClipboardID id, - UInt32 sequence, - const String& data) + ClipboardID id, + UInt32 sequence, + const String& data) { - size_t dataSize = data.size(); - ClipboardChunk* chunk = new ClipboardChunk(dataSize + CLIPBOARD_CHUNK_META_SIZE); - char* chunkData = chunk->m_chunk; + size_t dataSize = data.size(); + ClipboardChunk* chunk = new ClipboardChunk(dataSize + CLIPBOARD_CHUNK_META_SIZE); + char* chunkData = chunk->m_chunk; - chunkData[0] = id; - std::memcpy (&chunkData[1], &sequence, 4); - chunkData[5] = kDataChunk; - memcpy(&chunkData[6], data.c_str(), dataSize); - chunkData[dataSize + CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; + chunkData[0] = id; + std::memcpy (&chunkData[1], &sequence, 4); + chunkData[5] = kDataChunk; + memcpy(&chunkData[6], data.c_str(), dataSize); + chunkData[dataSize + CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; - return chunk; + return chunk; } ClipboardChunk* ClipboardChunk::end(ClipboardID id, UInt32 sequence) { - ClipboardChunk* end = new ClipboardChunk(CLIPBOARD_CHUNK_META_SIZE); - char* chunk = end->m_chunk; - - chunk[0] = id; - std::memcpy (&chunk[1], &sequence, 4); - chunk[5] = kDataEnd; - chunk[CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; + ClipboardChunk* end = new ClipboardChunk(CLIPBOARD_CHUNK_META_SIZE); + char* chunk = end->m_chunk; + + chunk[0] = id; + std::memcpy (&chunk[1], &sequence, 4); + chunk[5] = kDataEnd; + chunk[CLIPBOARD_CHUNK_META_SIZE - 1] = '\0'; - return end; + return end; } int ClipboardChunk::assemble(synergy::IStream* stream, - String& dataCached, - ClipboardID& id, - UInt32& sequence) + String& dataCached, + ClipboardID& id, + UInt32& sequence) { - UInt8 mark; - String data; + UInt8 mark; + String data; - if (!ProtocolUtil::readf(stream, kMsgDClipboard + 4, &id, &sequence, &mark, &data)) { - return kError; - } - - if (mark == kDataStart) { - s_expectedSize = synergy::string::stringToSizeType(data); - LOG((CLOG_DEBUG "start receiving clipboard data")); - dataCached.clear(); - return kStart; - } - else if (mark == kDataChunk) { - dataCached.append(data); - return kNotFinish; - } - else if (mark == kDataEnd) { - // validate - if (id >= kClipboardEnd) { - return kError; - } - else if (s_expectedSize != dataCached.size()) { - LOG((CLOG_ERR "corrupted clipboard data, expected size=%d actual size=%d", s_expectedSize, dataCached.size())); - return kError; - } - return kFinish; - } + if (!ProtocolUtil::readf(stream, kMsgDClipboard + 4, &id, &sequence, &mark, &data)) { + return kError; + } + + if (mark == kDataStart) { + s_expectedSize = synergy::string::stringToSizeType(data); + LOG((CLOG_DEBUG "start receiving clipboard data")); + dataCached.clear(); + return kStart; + } + else if (mark == kDataChunk) { + dataCached.append(data); + return kNotFinish; + } + else if (mark == kDataEnd) { + // validate + if (id >= kClipboardEnd) { + return kError; + } + else if (s_expectedSize != dataCached.size()) { + LOG((CLOG_ERR "corrupted clipboard data, expected size=%d actual size=%d", s_expectedSize, dataCached.size())); + return kError; + } + return kFinish; + } - LOG((CLOG_ERR "clipboard transmission failed: unknown error")); - return kError; + LOG((CLOG_ERR "clipboard transmission failed: unknown error")); + return kError; } void ClipboardChunk::send(synergy::IStream* stream, void* data) { - ClipboardChunk* clipboardData = static_cast(data); + ClipboardChunk* clipboardData = static_cast(data); - LOG((CLOG_DEBUG1 "sending clipboard chunk")); + LOG((CLOG_DEBUG1 "sending clipboard chunk")); - char* chunk = clipboardData->m_chunk; - ClipboardID id = chunk[0]; - UInt32 sequence; - std::memcpy (&sequence, &chunk[1], 4); - UInt8 mark = chunk[5]; - String dataChunk(&chunk[6], clipboardData->m_dataSize); + char* chunk = clipboardData->m_chunk; + ClipboardID id = chunk[0]; + UInt32 sequence; + std::memcpy (&sequence, &chunk[1], 4); + UInt8 mark = chunk[5]; + String dataChunk(&chunk[6], clipboardData->m_dataSize); - switch (mark) { - case kDataStart: - LOG((CLOG_DEBUG2 "sending clipboard chunk start: size=%s", dataChunk.c_str())); - break; + switch (mark) { + case kDataStart: + LOG((CLOG_DEBUG2 "sending clipboard chunk start: size=%s", dataChunk.c_str())); + break; - case kDataChunk: - LOG((CLOG_DEBUG2 "sending clipboard chunk data: size=%i", dataChunk.size())); - break; + case kDataChunk: + LOG((CLOG_DEBUG2 "sending clipboard chunk data: size=%i", dataChunk.size())); + break; - case kDataEnd: - LOG((CLOG_DEBUG2 "sending clipboard finished")); - break; - } + case kDataEnd: + LOG((CLOG_DEBUG2 "sending clipboard finished")); + break; + } - ProtocolUtil::writef(stream, kMsgDClipboard, id, sequence, mark, &dataChunk); + ProtocolUtil::writef(stream, kMsgDClipboard, id, sequence, mark, &dataChunk); } diff --git a/src/lib/synergy/ClipboardChunk.h b/src/lib/synergy/ClipboardChunk.h index 8fc09bda..9bf4b7a4 100644 --- a/src/lib/synergy/ClipboardChunk.h +++ b/src/lib/synergy/ClipboardChunk.h @@ -30,31 +30,31 @@ class IStream; class ClipboardChunk : public Chunk { public: - ClipboardChunk(size_t size); + ClipboardChunk(size_t size); - static ClipboardChunk* - start( - ClipboardID id, - UInt32 sequence, - const String& size); - static ClipboardChunk* - data( - ClipboardID id, - UInt32 sequence, - const String& data); - static ClipboardChunk* - end(ClipboardID id, UInt32 sequence); + static ClipboardChunk* + start( + ClipboardID id, + UInt32 sequence, + const String& size); + static ClipboardChunk* + data( + ClipboardID id, + UInt32 sequence, + const String& data); + static ClipboardChunk* + end(ClipboardID id, UInt32 sequence); - static int assemble( - synergy::IStream* stream, - String& dataCached, - ClipboardID& id, - UInt32& sequence); + static int assemble( + synergy::IStream* stream, + String& dataCached, + ClipboardID& id, + UInt32& sequence); - static void send(synergy::IStream* stream, void* data); + static void send(synergy::IStream* stream, void* data); - static size_t getExpectedSize() { return s_expectedSize; } + static size_t getExpectedSize() { return s_expectedSize; } private: - static size_t s_expectedSize; + static size_t s_expectedSize; }; diff --git a/src/lib/synergy/DaemonApp.cpp b/src/lib/synergy/DaemonApp.cpp index d368eaf4..84f2a784 100644 --- a/src/lib/synergy/DaemonApp.cpp +++ b/src/lib/synergy/DaemonApp.cpp @@ -63,34 +63,34 @@ DaemonApp* DaemonApp::s_instance = NULL; int mainLoopStatic() { - DaemonApp::s_instance->mainLoop(true); - return kExitSuccess; + DaemonApp::s_instance->mainLoop(true); + return kExitSuccess; } int unixMainLoopStatic(int, const char**) { - return mainLoopStatic(); + return mainLoopStatic(); } #if SYSAPI_WIN32 int winMainLoopStatic(int, const char**) { - return ArchMiscWindows::runDaemon(mainLoopStatic); + return ArchMiscWindows::runDaemon(mainLoopStatic); } #endif DaemonApp::DaemonApp() : - m_ipcServer(nullptr), - m_ipcLogOutputter(nullptr), - #if SYSAPI_WIN32 - m_watchdog(nullptr), - #endif - m_events(nullptr), - m_fileLogOutputter(nullptr) + m_ipcServer(nullptr), + m_ipcLogOutputter(nullptr), + #if SYSAPI_WIN32 + m_watchdog(nullptr), + #endif + m_events(nullptr), + m_fileLogOutputter(nullptr) { - s_instance = this; + s_instance = this; } DaemonApp::~DaemonApp() @@ -101,302 +101,302 @@ int DaemonApp::run(int argc, char** argv) { #if SYSAPI_WIN32 - // win32 instance needed for threading, etc. - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // win32 instance needed for threading, etc. + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - - Arch arch; - arch.init(); + + Arch arch; + arch.init(); - Log log; - EventQueue events; - m_events = &events; + Log log; + EventQueue events; + m_events = &events; - bool uninstall = false; - try - { + bool uninstall = false; + try + { #if SYSAPI_WIN32 - // sends debug messages to visual studio console window. - log.insert(new MSWindowsDebugOutputter()); + // sends debug messages to visual studio console window. + log.insert(new MSWindowsDebugOutputter()); #endif - // default log level to system setting. - string logLevel = arch.setting("LogLevel"); - if (logLevel != "") - log.setFilter(logLevel.c_str()); + // default log level to system setting. + string logLevel = arch.setting("LogLevel"); + if (logLevel != "") + log.setFilter(logLevel.c_str()); - bool foreground = false; + bool foreground = false; - for (int i = 1; i < argc; ++i) { - string arg(argv[i]); + for (int i = 1; i < argc; ++i) { + string arg(argv[i]); - if (arg == "/f" || arg == "-f") { - foreground = true; - } + if (arg == "/f" || arg == "-f") { + foreground = true; + } #if SYSAPI_WIN32 - else if (arg == "/install") { - uninstall = true; - arch.installDaemon(); - return kExitSuccess; - } - else if (arg == "/uninstall") { - arch.uninstallDaemon(); - return kExitSuccess; - } + else if (arg == "/install") { + uninstall = true; + arch.installDaemon(); + return kExitSuccess; + } + else if (arg == "/uninstall") { + arch.uninstallDaemon(); + return kExitSuccess; + } #endif - else { - stringstream ss; - ss << "Unrecognized argument: " << arg; - foregroundError(ss.str().c_str()); - return kExitArgs; - } - } + else { + stringstream ss; + ss << "Unrecognized argument: " << arg; + foregroundError(ss.str().c_str()); + return kExitArgs; + } + } - if (foreground) { - // run process in foreground instead of daemonizing. - // useful for debugging. - mainLoop(false); - } - else { + if (foreground) { + // run process in foreground instead of daemonizing. + // useful for debugging. + mainLoop(false); + } + else { #if SYSAPI_WIN32 - arch.daemonize("Synergy", winMainLoopStatic); + arch.daemonize("Synergy", winMainLoopStatic); #elif SYSAPI_UNIX - arch.daemonize("Synergy", unixMainLoopStatic); + arch.daemonize("Synergy", unixMainLoopStatic); #endif - } + } - return kExitSuccess; - } - catch (XArch& e) { - String message = e.what(); - if (uninstall && (message.find("The service has not been started") != String::npos)) { - // TODO: if we're keeping this use error code instead (what is it?!). - // HACK: this message happens intermittently, not sure where from but - // it's quite misleading for the user. they thing something has gone - // horribly wrong, but it's just the service manager reporting a false - // positive (the service has actually shut down in most cases). - } - else { - foregroundError(message.c_str()); - } - return kExitFailed; - } - catch (std::exception& e) { - foregroundError(e.what()); - return kExitFailed; - } - catch (...) { - foregroundError("Unrecognized error."); - return kExitFailed; - } + return kExitSuccess; + } + catch (XArch& e) { + String message = e.what(); + if (uninstall && (message.find("The service has not been started") != String::npos)) { + // TODO: if we're keeping this use error code instead (what is it?!). + // HACK: this message happens intermittently, not sure where from but + // it's quite misleading for the user. they thing something has gone + // horribly wrong, but it's just the service manager reporting a false + // positive (the service has actually shut down in most cases). + } + else { + foregroundError(message.c_str()); + } + return kExitFailed; + } + catch (std::exception& e) { + foregroundError(e.what()); + return kExitFailed; + } + catch (...) { + foregroundError("Unrecognized error."); + return kExitFailed; + } } void DaemonApp::mainLoop(bool logToFile) { - try - { - DAEMON_RUNNING(true); - - if (logToFile) { - m_fileLogOutputter = new FileLogOutputter(logFilename().c_str()); - CLOG->insert(m_fileLogOutputter); - } + try + { + DAEMON_RUNNING(true); + + if (logToFile) { + m_fileLogOutputter = new FileLogOutputter(logFilename().c_str()); + CLOG->insert(m_fileLogOutputter); + } - // create socket multiplexer. this must happen after daemonization - // on unix because threads evaporate across a fork(). - SocketMultiplexer multiplexer; + // create socket multiplexer. this must happen after daemonization + // on unix because threads evaporate across a fork(). + SocketMultiplexer multiplexer; - // uses event queue, must be created here. - m_ipcServer = new IpcServer(m_events, &multiplexer); + // uses event queue, must be created here. + m_ipcServer = new IpcServer(m_events, &multiplexer); - // send logging to gui via ipc, log system adopts outputter. - m_ipcLogOutputter = new IpcLogOutputter(*m_ipcServer, kIpcClientGui, true); - CLOG->insert(m_ipcLogOutputter); - + // send logging to gui via ipc, log system adopts outputter. + m_ipcLogOutputter = new IpcLogOutputter(*m_ipcServer, kIpcClientGui, true); + CLOG->insert(m_ipcLogOutputter); + #if SYSAPI_WIN32 - m_watchdog = new MSWindowsWatchdog(false, *m_ipcServer, *m_ipcLogOutputter); - m_watchdog->setFileLogOutputter(m_fileLogOutputter); + m_watchdog = new MSWindowsWatchdog(false, *m_ipcServer, *m_ipcLogOutputter); + m_watchdog->setFileLogOutputter(m_fileLogOutputter); #endif - - m_events->adoptHandler( - m_events->forIpcServer().messageReceived(), m_ipcServer, - new TMethodEventJob(this, &DaemonApp::handleIpcMessage)); + + m_events->adoptHandler( + m_events->forIpcServer().messageReceived(), m_ipcServer, + new TMethodEventJob(this, &DaemonApp::handleIpcMessage)); - m_ipcServer->listen(); - + m_ipcServer->listen(); + #if SYSAPI_WIN32 - // install the platform event queue to handle service stop events. - m_events->adoptBuffer(new MSWindowsEventQueueBuffer(m_events)); - - String command = ARCH->setting("Command"); - bool elevate = ARCH->setting("Elevate") == "1"; - if (command != "") { - LOG((CLOG_INFO "using last known command: %s", command.c_str())); - m_watchdog->setCommand(command, elevate); - } + // install the platform event queue to handle service stop events. + m_events->adoptBuffer(new MSWindowsEventQueueBuffer(m_events)); + + String command = ARCH->setting("Command"); + bool elevate = ARCH->setting("Elevate") == "1"; + if (command != "") { + LOG((CLOG_INFO "using last known command: %s", command.c_str())); + m_watchdog->setCommand(command, elevate); + } - m_watchdog->startAsync(); + m_watchdog->startAsync(); #endif - m_events->loop(); + m_events->loop(); #if SYSAPI_WIN32 - m_watchdog->stop(); - delete m_watchdog; + m_watchdog->stop(); + delete m_watchdog; #endif - m_events->removeHandler( - m_events->forIpcServer().messageReceived(), m_ipcServer); - - CLOG->remove(m_ipcLogOutputter); - delete m_ipcLogOutputter; - delete m_ipcServer; - - DAEMON_RUNNING(false); - } - catch (std::exception& e) { - LOG((CLOG_CRIT "An error occurred: %s", e.what())); - } - catch (...) { - LOG((CLOG_CRIT "An unknown error occurred.\n")); - } + m_events->removeHandler( + m_events->forIpcServer().messageReceived(), m_ipcServer); + + CLOG->remove(m_ipcLogOutputter); + delete m_ipcLogOutputter; + delete m_ipcServer; + + DAEMON_RUNNING(false); + } + catch (std::exception& e) { + LOG((CLOG_CRIT "An error occurred: %s", e.what())); + } + catch (...) { + LOG((CLOG_CRIT "An unknown error occurred.\n")); + } } void DaemonApp::foregroundError(const char* message) { #if SYSAPI_WIN32 - MessageBox(NULL, message, "Synergy Service", MB_OK | MB_ICONERROR); + MessageBox(NULL, message, "Synergy Service", MB_OK | MB_ICONERROR); #elif SYSAPI_UNIX - cerr << message << endl; + cerr << message << endl; #endif } std::string DaemonApp::logFilename() { - string logFilename; - logFilename = ARCH->setting("LogFilename"); - if (logFilename.empty()) { - logFilename = ARCH->getLogDirectory(); - logFilename.append("/"); - logFilename.append(LOG_FILENAME); - } + string logFilename; + logFilename = ARCH->setting("LogFilename"); + if (logFilename.empty()) { + logFilename = ARCH->getLogDirectory(); + logFilename.append("/"); + logFilename.append(LOG_FILENAME); + } - return logFilename; + return logFilename; } void DaemonApp::handleIpcMessage(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - switch (m->type()) { - case kIpcCommand: { - IpcCommandMessage* cm = static_cast(m); - String command = cm->command(); + IpcMessage* m = static_cast(e.getDataObject()); + switch (m->type()) { + case kIpcCommand: { + IpcCommandMessage* cm = static_cast(m); + String command = cm->command(); - // if empty quotes, clear. - if (command == "\"\"") { - command.clear(); - } + // if empty quotes, clear. + if (command == "\"\"") { + command.clear(); + } - if (!command.empty()) { - LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); + if (!command.empty()) { + LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); - std::vector argsArray; - ArgParser::splitCommandString(command, argsArray); - ArgParser argParser(NULL); - const char** argv = argParser.getArgv(argsArray); - ServerArgs serverArgs; - ClientArgs clientArgs; - int argc = static_cast(argsArray.size()); - bool server = argsArray[0].find("synergys") != String::npos ? true : false; - ArgsBase* argBase = NULL; + std::vector argsArray; + ArgParser::splitCommandString(command, argsArray); + ArgParser argParser(NULL); + const char** argv = argParser.getArgv(argsArray); + ServerArgs serverArgs; + ClientArgs clientArgs; + int argc = static_cast(argsArray.size()); + bool server = argsArray[0].find("synergys") != String::npos ? true : false; + ArgsBase* argBase = NULL; - if (server) { - argParser.parseServerArgs(serverArgs, argc, argv); - argBase = &serverArgs; - } - else { - argParser.parseClientArgs(clientArgs, argc, argv); - argBase = &clientArgs; - } + if (server) { + argParser.parseServerArgs(serverArgs, argc, argv); + argBase = &serverArgs; + } + else { + argParser.parseClientArgs(clientArgs, argc, argv); + argBase = &clientArgs; + } - delete[] argv; - - String logLevel(argBase->m_logFilter); - if (!logLevel.empty()) { - try { - // change log level based on that in the command string - // and change to that log level now. - ARCH->setting("LogLevel", logLevel); - CLOG->setFilter(logLevel.c_str()); - } - catch (XArch& e) { - LOG((CLOG_ERR "failed to save LogLevel setting, %s", e.what())); - } - } + delete[] argv; + + String logLevel(argBase->m_logFilter); + if (!logLevel.empty()) { + try { + // change log level based on that in the command string + // and change to that log level now. + ARCH->setting("LogLevel", logLevel); + CLOG->setFilter(logLevel.c_str()); + } + catch (XArch& e) { + LOG((CLOG_ERR "failed to save LogLevel setting, %s", e.what())); + } + } #if SYSAPI_WIN32 - String logFilename; - if (argBase->m_logFile != NULL) { - logFilename = String(argBase->m_logFile); - ARCH->setting("LogFilename", logFilename); - m_watchdog->setFileLogOutputter(m_fileLogOutputter); - command = ArgParser::assembleCommand(argsArray, "--log", 1); - LOG((CLOG_DEBUG "removed log file argument and filename %s from command ", logFilename.c_str())); - LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); - } - else { - m_watchdog->setFileLogOutputter(NULL); - } + String logFilename; + if (argBase->m_logFile != NULL) { + logFilename = String(argBase->m_logFile); + ARCH->setting("LogFilename", logFilename); + m_watchdog->setFileLogOutputter(m_fileLogOutputter); + command = ArgParser::assembleCommand(argsArray, "--log", 1); + LOG((CLOG_DEBUG "removed log file argument and filename %s from command ", logFilename.c_str())); + LOG((CLOG_DEBUG "new command, elevate=%d command=%s", cm->elevate(), command.c_str())); + } + else { + m_watchdog->setFileLogOutputter(NULL); + } - m_fileLogOutputter->setLogFilename(logFilename.c_str()); + m_fileLogOutputter->setLogFilename(logFilename.c_str()); #endif - } - else { - LOG((CLOG_DEBUG "empty command, elevate=%d", cm->elevate())); - } + } + else { + LOG((CLOG_DEBUG "empty command, elevate=%d", cm->elevate())); + } - try { - // store command in system settings. this is used when the daemon - // next starts. - ARCH->setting("Command", command); + try { + // store command in system settings. this is used when the daemon + // next starts. + ARCH->setting("Command", command); - // TODO: it would be nice to store bools/ints... - ARCH->setting("Elevate", String(cm->elevate() ? "1" : "0")); - } - catch (XArch& e) { - LOG((CLOG_ERR "failed to save settings, %s", e.what())); - } + // TODO: it would be nice to store bools/ints... + ARCH->setting("Elevate", String(cm->elevate() ? "1" : "0")); + } + catch (XArch& e) { + LOG((CLOG_ERR "failed to save settings, %s", e.what())); + } #if SYSAPI_WIN32 - // tell the relauncher about the new command. this causes the - // relauncher to stop the existing command and start the new - // command. - m_watchdog->setCommand(command, cm->elevate()); + // tell the relauncher about the new command. this causes the + // relauncher to stop the existing command and start the new + // command. + m_watchdog->setCommand(command, cm->elevate()); #endif - break; - } + break; + } - case kIpcHello: - IpcHelloMessage* hm = static_cast(m); - String type; - switch (hm->clientType()) { - case kIpcClientGui: type = "gui"; break; - case kIpcClientNode: type = "node"; break; - default: type = "unknown"; break; - } + case kIpcHello: + IpcHelloMessage* hm = static_cast(m); + String type; + switch (hm->clientType()) { + case kIpcClientGui: type = "gui"; break; + case kIpcClientNode: type = "node"; break; + default: type = "unknown"; break; + } - LOG((CLOG_DEBUG "ipc hello, type=%s", type.c_str())); + LOG((CLOG_DEBUG "ipc hello, type=%s", type.c_str())); #if SYSAPI_WIN32 - String watchdogStatus = m_watchdog->isProcessActive() ? "ok" : "error"; - LOG((CLOG_INFO "watchdog status: %s", watchdogStatus.c_str())); + String watchdogStatus = m_watchdog->isProcessActive() ? "ok" : "error"; + LOG((CLOG_INFO "watchdog status: %s", watchdogStatus.c_str())); #endif - m_ipcLogOutputter->notifyBuffer(); - break; - } + m_ipcLogOutputter->notifyBuffer(); + break; + } } diff --git a/src/lib/synergy/DaemonApp.h b/src/lib/synergy/DaemonApp.h index 6527272e..511c6d53 100644 --- a/src/lib/synergy/DaemonApp.h +++ b/src/lib/synergy/DaemonApp.h @@ -34,29 +34,29 @@ class MSWindowsWatchdog; class DaemonApp { public: - DaemonApp(); - virtual ~DaemonApp(); - int run(int argc, char** argv); - void mainLoop(bool logToFile); + DaemonApp(); + virtual ~DaemonApp(); + int run(int argc, char** argv); + void mainLoop(bool logToFile); private: - void daemonize(); - void foregroundError(const char* message); - std::string logFilename(); - void handleIpcMessage(const Event&, void*); + void daemonize(); + void foregroundError(const char* message); + std::string logFilename(); + void handleIpcMessage(const Event&, void*); public: - static DaemonApp* s_instance; + static DaemonApp* s_instance; #if SYSAPI_WIN32 - MSWindowsWatchdog* m_watchdog; + MSWindowsWatchdog* m_watchdog; #endif private: - IpcServer* m_ipcServer; - IpcLogOutputter* m_ipcLogOutputter; - IEventQueue* m_events; - FileLogOutputter* m_fileLogOutputter; + IpcServer* m_ipcServer; + IpcLogOutputter* m_ipcLogOutputter; + IEventQueue* m_events; + FileLogOutputter* m_fileLogOutputter; }; #define LOG_FILENAME "synergyd.log" diff --git a/src/lib/synergy/DragInformation.cpp b/src/lib/synergy/DragInformation.cpp index b1bd4801..59136516 100644 --- a/src/lib/synergy/DragInformation.cpp +++ b/src/lib/synergy/DragInformation.cpp @@ -25,134 +25,134 @@ using namespace std; DragInformation::DragInformation() : - m_filename(), - m_filesize(0) + m_filename(), + m_filesize(0) { } void DragInformation::parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, String data) { - size_t startPos = 0; - size_t findResult1 = 0; - size_t findResult2 = 0; - dragFileList.clear(); - String slash("\\"); - if (data.find("/", startPos) != string::npos) { - slash = "/"; - } - - UInt32 index = 0; - while (index < fileNum) { - findResult1 = data.find(',', startPos); - findResult2 = data.find_last_of(slash, findResult1); + size_t startPos = 0; + size_t findResult1 = 0; + size_t findResult2 = 0; + dragFileList.clear(); + String slash("\\"); + if (data.find("/", startPos) != string::npos) { + slash = "/"; + } + + UInt32 index = 0; + while (index < fileNum) { + findResult1 = data.find(',', startPos); + findResult2 = data.find_last_of(slash, findResult1); - if (findResult1 == startPos) { - //TODO: file number does not match, something goes wrong - break; - } - - // set filename - if (findResult1 - findResult2 > 1) { - String filename = data.substr(findResult2 + 1, - findResult1 - findResult2 - 1); - DragInformation di; - di.setFilename(filename); - dragFileList.push_back(di); - } - startPos = findResult1 + 1; - - //set filesize - findResult2 = data.find(',', startPos); - if (findResult2 - findResult1 > 1) { - String filesize = data.substr(findResult1 + 1, - findResult2 - findResult1 - 1); - size_t size = stringToNum(filesize); - dragFileList.at(index).setFilesize(size); - } - startPos = findResult1 + 1; - - ++index; - } + if (findResult1 == startPos) { + //TODO: file number does not match, something goes wrong + break; + } + + // set filename + if (findResult1 - findResult2 > 1) { + String filename = data.substr(findResult2 + 1, + findResult1 - findResult2 - 1); + DragInformation di; + di.setFilename(filename); + dragFileList.push_back(di); + } + startPos = findResult1 + 1; + + //set filesize + findResult2 = data.find(',', startPos); + if (findResult2 - findResult1 > 1) { + String filesize = data.substr(findResult1 + 1, + findResult2 - findResult1 - 1); + size_t size = stringToNum(filesize); + dragFileList.at(index).setFilesize(size); + } + startPos = findResult1 + 1; + + ++index; + } - LOG((CLOG_DEBUG "drag info received, total drag file number: %i", - dragFileList.size())); + LOG((CLOG_DEBUG "drag info received, total drag file number: %i", + dragFileList.size())); - for (size_t i = 0; i < dragFileList.size(); ++i) { - LOG((CLOG_DEBUG "dragging file %i name: %s", - i + 1, - dragFileList.at(i).getFilename().c_str())); - } + for (size_t i = 0; i < dragFileList.size(); ++i) { + LOG((CLOG_DEBUG "dragging file %i name: %s", + i + 1, + dragFileList.at(i).getFilename().c_str())); + } } String DragInformation::getDragFileExtension(String filename) { - size_t findResult = string::npos; - findResult = filename.find_last_of(".", filename.size()); - if (findResult != string::npos) { - return filename.substr(findResult + 1, filename.size() - findResult - 1); - } - else { - return ""; - } + size_t findResult = string::npos; + findResult = filename.find_last_of(".", filename.size()); + if (findResult != string::npos) { + return filename.substr(findResult + 1, filename.size() - findResult - 1); + } + else { + return ""; + } } int DragInformation::setupDragInfo(DragFileList& fileList, String& output) { - int size = static_cast(fileList.size()); - for (int i = 0; i < size; ++i) { - output.append(fileList.at(i).getFilename()); - output.append(","); - String filesize = getFileSize(fileList.at(i).getFilename()); - output.append(filesize); - output.append(","); - } - return size; + int size = static_cast(fileList.size()); + for (int i = 0; i < size; ++i) { + output.append(fileList.at(i).getFilename()); + output.append(","); + String filesize = getFileSize(fileList.at(i).getFilename()); + output.append(filesize); + output.append(","); + } + return size; } bool DragInformation::isFileValid(String filename) { - bool result = false; - std::fstream file(filename.c_str(), ios::in|ios::binary); + bool result = false; + std::fstream file(filename.c_str(), ios::in|ios::binary); - if (file.is_open()) { - result = true; - } + if (file.is_open()) { + result = true; + } - file. close(); + file. close(); - return result; + return result; } size_t DragInformation::stringToNum(String& str) { - istringstream iss(str.c_str()); - size_t size; - iss >> size; - return size; + istringstream iss(str.c_str()); + size_t size; + iss >> size; + return size; } String DragInformation::getFileSize(String& filename) { - std::fstream file(filename.c_str(), ios::in|ios::binary); + std::fstream file(filename.c_str(), ios::in|ios::binary); - if (!file.is_open()) { - throw std::runtime_error("failed to get file size"); - } + if (!file.is_open()) { + throw std::runtime_error("failed to get file size"); + } - // check file size - file.seekg (0, std::ios::end); - size_t size = (size_t)file.tellg(); + // check file size + file.seekg (0, std::ios::end); + size_t size = (size_t)file.tellg(); - stringstream ss; - ss << size; - - file. close(); - - return ss.str(); + stringstream ss; + ss << size; + + file. close(); + + return ss.str(); } diff --git a/src/lib/synergy/DragInformation.h b/src/lib/synergy/DragInformation.h index d310fa6c..470146ce 100644 --- a/src/lib/synergy/DragInformation.h +++ b/src/lib/synergy/DragInformation.h @@ -26,28 +26,28 @@ typedef std::vector DragFileList; class DragInformation { public: - DragInformation(); - ~DragInformation() { } - - String& getFilename() { return m_filename; } - void setFilename(String& name) { m_filename = name; } - size_t getFilesize() { return m_filesize; } - void setFilesize(size_t size) { m_filesize = size; } - - static void parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, String data); - static String getDragFileExtension(String filename); - // helper function to setup drag info - // example: filename1,filesize1,filename2,filesize2, - // return file count - static int setupDragInfo(DragFileList& fileList, String& output); + DragInformation(); + ~DragInformation() { } + + String& getFilename() { return m_filename; } + void setFilename(String& name) { m_filename = name; } + size_t getFilesize() { return m_filesize; } + void setFilesize(size_t size) { m_filesize = size; } + + static void parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, String data); + static String getDragFileExtension(String filename); + // helper function to setup drag info + // example: filename1,filesize1,filename2,filesize2, + // return file count + static int setupDragInfo(DragFileList& fileList, String& output); - static bool isFileValid(String filename); + static bool isFileValid(String filename); private: - static size_t stringToNum(String& str); - static String getFileSize(String& filename); + static size_t stringToNum(String& str); + static String getFileSize(String& filename); private: - String m_filename; - size_t m_filesize; + String m_filename; + size_t m_filesize; }; diff --git a/src/lib/synergy/DropHelper.cpp b/src/lib/synergy/DropHelper.cpp index 6346ce0d..a99d9f8a 100644 --- a/src/lib/synergy/DropHelper.cpp +++ b/src/lib/synergy/DropHelper.cpp @@ -24,30 +24,30 @@ void DropHelper::writeToDir(const String& destination, DragFileList& fileList, String& data) { - LOG((CLOG_DEBUG "dropping file, files=%i target=%s", fileList.size(), destination.c_str())); + LOG((CLOG_DEBUG "dropping file, files=%i target=%s", fileList.size(), destination.c_str())); - if (!destination.empty() && fileList.size() > 0) { - std::fstream file; - String dropTarget = destination; + if (!destination.empty() && fileList.size() > 0) { + std::fstream file; + String dropTarget = destination; #ifdef SYSAPI_WIN32 - dropTarget.append("\\"); + dropTarget.append("\\"); #else - dropTarget.append("/"); + dropTarget.append("/"); #endif - dropTarget.append(fileList.at(0).getFilename()); - file.open(dropTarget.c_str(), std::ios::out | std::ios::binary); - if (!file.is_open()) { - LOG((CLOG_ERR "drop file failed: can not open %s", dropTarget.c_str())); - } - - file.write(data.c_str(), data.size()); - file.close(); + dropTarget.append(fileList.at(0).getFilename()); + file.open(dropTarget.c_str(), std::ios::out | std::ios::binary); + if (!file.is_open()) { + LOG((CLOG_ERR "drop file failed: can not open %s", dropTarget.c_str())); + } + + file.write(data.c_str(), data.size()); + file.close(); - LOG((CLOG_DEBUG "%s is saved to %s", fileList.at(0).getFilename().c_str(), destination.c_str())); + LOG((CLOG_DEBUG "%s is saved to %s", fileList.at(0).getFilename().c_str(), destination.c_str())); - fileList.clear(); - } - else { - LOG((CLOG_ERR "drop file failed: drop target is empty")); - } + fileList.clear(); + } + else { + LOG((CLOG_ERR "drop file failed: drop target is empty")); + } } diff --git a/src/lib/synergy/DropHelper.h b/src/lib/synergy/DropHelper.h index 0e754baf..021f2cc9 100644 --- a/src/lib/synergy/DropHelper.h +++ b/src/lib/synergy/DropHelper.h @@ -22,6 +22,6 @@ class DropHelper { public: - static void writeToDir(const String& destination, - DragFileList& fileList, String& data); + static void writeToDir(const String& destination, + DragFileList& fileList, String& data); }; diff --git a/src/lib/synergy/FileChunk.cpp b/src/lib/synergy/FileChunk.cpp index 7906a3a3..490112df 100644 --- a/src/lib/synergy/FileChunk.cpp +++ b/src/lib/synergy/FileChunk.cpp @@ -26,131 +26,131 @@ static const UInt16 kIntervalThreshold = 1; FileChunk::FileChunk(size_t size) : - Chunk(size) + Chunk(size) { - m_dataSize = size - FILE_CHUNK_META_SIZE; + m_dataSize = size - FILE_CHUNK_META_SIZE; } FileChunk* FileChunk::start(const String& size) { - size_t sizeLength = size.size(); - FileChunk* start = new FileChunk(sizeLength + FILE_CHUNK_META_SIZE); - char* chunk = start->m_chunk; - chunk[0] = kDataStart; - memcpy(&chunk[1], size.c_str(), sizeLength); - chunk[sizeLength + 1] = '\0'; + size_t sizeLength = size.size(); + FileChunk* start = new FileChunk(sizeLength + FILE_CHUNK_META_SIZE); + char* chunk = start->m_chunk; + chunk[0] = kDataStart; + memcpy(&chunk[1], size.c_str(), sizeLength); + chunk[sizeLength + 1] = '\0'; - return start; + return start; } FileChunk* FileChunk::data(UInt8* data, size_t dataSize) { - FileChunk* chunk = new FileChunk(dataSize + FILE_CHUNK_META_SIZE); - char* chunkData = chunk->m_chunk; - chunkData[0] = kDataChunk; - memcpy(&chunkData[1], data, dataSize); - chunkData[dataSize + 1] = '\0'; + FileChunk* chunk = new FileChunk(dataSize + FILE_CHUNK_META_SIZE); + char* chunkData = chunk->m_chunk; + chunkData[0] = kDataChunk; + memcpy(&chunkData[1], data, dataSize); + chunkData[dataSize + 1] = '\0'; - return chunk; + return chunk; } FileChunk* FileChunk::end() { - FileChunk* end = new FileChunk(FILE_CHUNK_META_SIZE); - char* chunk = end->m_chunk; - chunk[0] = kDataEnd; - chunk[1] = '\0'; + FileChunk* end = new FileChunk(FILE_CHUNK_META_SIZE); + char* chunk = end->m_chunk; + chunk[0] = kDataEnd; + chunk[1] = '\0'; - return end; + return end; } int FileChunk::assemble(synergy::IStream* stream, String& dataReceived, size_t& expectedSize) { - // parse - UInt8 mark = 0; - String content; - static size_t receivedDataSize; - static double elapsedTime; - static Stopwatch stopwatch; + // parse + UInt8 mark = 0; + String content; + static size_t receivedDataSize; + static double elapsedTime; + static Stopwatch stopwatch; - if (!ProtocolUtil::readf(stream, kMsgDFileTransfer + 4, &mark, &content)) { - return kError; - } + if (!ProtocolUtil::readf(stream, kMsgDFileTransfer + 4, &mark, &content)) { + return kError; + } - switch (mark) { - case kDataStart: - dataReceived.clear(); - expectedSize = synergy::string::stringToSizeType(content); - receivedDataSize = 0; - elapsedTime = 0; - stopwatch.reset(); + switch (mark) { + case kDataStart: + dataReceived.clear(); + expectedSize = synergy::string::stringToSizeType(content); + receivedDataSize = 0; + elapsedTime = 0; + stopwatch.reset(); - if (CLOG->getFilter() >= kDEBUG2) { - LOG((CLOG_DEBUG2 "recv file size=%s", content.c_str())); - stopwatch.start(); - } - return kStart; + if (CLOG->getFilter() >= kDEBUG2) { + LOG((CLOG_DEBUG2 "recv file size=%s", content.c_str())); + stopwatch.start(); + } + return kStart; - case kDataChunk: - dataReceived.append(content); - if (CLOG->getFilter() >= kDEBUG2) { - LOG((CLOG_DEBUG2 "recv file chunck size=%i", content.size())); - double interval = stopwatch.getTime(); - receivedDataSize += content.size(); - LOG((CLOG_DEBUG2 "recv file interval=%f s", interval)); - if (interval >= kIntervalThreshold) { - double averageSpeed = receivedDataSize / interval / 1000; - LOG((CLOG_DEBUG2 "recv file average speed=%f kb/s", averageSpeed)); + case kDataChunk: + dataReceived.append(content); + if (CLOG->getFilter() >= kDEBUG2) { + LOG((CLOG_DEBUG2 "recv file chunck size=%i", content.size())); + double interval = stopwatch.getTime(); + receivedDataSize += content.size(); + LOG((CLOG_DEBUG2 "recv file interval=%f s", interval)); + if (interval >= kIntervalThreshold) { + double averageSpeed = receivedDataSize / interval / 1000; + LOG((CLOG_DEBUG2 "recv file average speed=%f kb/s", averageSpeed)); - receivedDataSize = 0; - elapsedTime += interval; - stopwatch.reset(); - } - } - return kNotFinish; + receivedDataSize = 0; + elapsedTime += interval; + stopwatch.reset(); + } + } + return kNotFinish; - case kDataEnd: - if (expectedSize != dataReceived.size()) { - LOG((CLOG_ERR "corrupted clipboard data, expected size=%d actual size=%d", expectedSize, dataReceived.size())); - return kError; - } + case kDataEnd: + if (expectedSize != dataReceived.size()) { + LOG((CLOG_ERR "corrupted clipboard data, expected size=%d actual size=%d", expectedSize, dataReceived.size())); + return kError; + } - if (CLOG->getFilter() >= kDEBUG2) { - LOG((CLOG_DEBUG2 "file transfer finished")); - elapsedTime += stopwatch.getTime(); - double averageSpeed = expectedSize / elapsedTime / 1000; - LOG((CLOG_DEBUG2 "file transfer finished: total time consumed=%f s", elapsedTime)); - LOG((CLOG_DEBUG2 "file transfer finished: total data received=%i kb", expectedSize / 1000)); - LOG((CLOG_DEBUG2 "file transfer finished: total average speed=%f kb/s", averageSpeed)); - } - return kFinish; - } + if (CLOG->getFilter() >= kDEBUG2) { + LOG((CLOG_DEBUG2 "file transfer finished")); + elapsedTime += stopwatch.getTime(); + double averageSpeed = expectedSize / elapsedTime / 1000; + LOG((CLOG_DEBUG2 "file transfer finished: total time consumed=%f s", elapsedTime)); + LOG((CLOG_DEBUG2 "file transfer finished: total data received=%i kb", expectedSize / 1000)); + LOG((CLOG_DEBUG2 "file transfer finished: total average speed=%f kb/s", averageSpeed)); + } + return kFinish; + } - return kError; + return kError; } void FileChunk::send(synergy::IStream* stream, UInt8 mark, char* data, size_t dataSize) { - String chunk(data, dataSize); + String chunk(data, dataSize); - switch (mark) { - case kDataStart: - LOG((CLOG_DEBUG2 "sending file chunk start: size=%s", data)); - break; + switch (mark) { + case kDataStart: + LOG((CLOG_DEBUG2 "sending file chunk start: size=%s", data)); + break; - case kDataChunk: - LOG((CLOG_DEBUG2 "sending file chunk: size=%i", chunk.size())); - break; + case kDataChunk: + LOG((CLOG_DEBUG2 "sending file chunk: size=%i", chunk.size())); + break; - case kDataEnd: - LOG((CLOG_DEBUG2 "sending file finished")); - break; - } + case kDataEnd: + LOG((CLOG_DEBUG2 "sending file finished")); + break; + } - ProtocolUtil::writef(stream, kMsgDFileTransfer, mark, &chunk); + ProtocolUtil::writef(stream, kMsgDFileTransfer, mark, &chunk); } diff --git a/src/lib/synergy/FileChunk.h b/src/lib/synergy/FileChunk.h index 56c3cb62..12d02f9c 100644 --- a/src/lib/synergy/FileChunk.h +++ b/src/lib/synergy/FileChunk.h @@ -29,18 +29,18 @@ class IStream; class FileChunk : public Chunk { public: - FileChunk(size_t size); + FileChunk(size_t size); - static FileChunk* start(const String& size); - static FileChunk* data(UInt8* data, size_t dataSize); - static FileChunk* end(); - static int assemble( - synergy::IStream* stream, - String& dataCached, - size_t& expectedSize); - static void send( - synergy::IStream* stream, - UInt8 mark, - char* data, - size_t dataSize); + static FileChunk* start(const String& size); + static FileChunk* data(UInt8* data, size_t dataSize); + static FileChunk* end(); + static int assemble( + synergy::IStream* stream, + String& dataCached, + size_t& expectedSize); + static void send( + synergy::IStream* stream, + UInt8 mark, + char* data, + size_t dataSize); }; diff --git a/src/lib/synergy/IApp.h b/src/lib/synergy/IApp.h index 7eabf477..6dc6f844 100644 --- a/src/lib/synergy/IApp.h +++ b/src/lib/synergy/IApp.h @@ -31,17 +31,17 @@ class IEventQueue; class IApp : public IInterface { public: - virtual void setByeFunc(void(*bye)(int)) = 0; - virtual ArgsBase& argsBase() const = 0; - virtual int standardStartup(int argc, char** argv) = 0; - virtual int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup) = 0; - virtual void startNode() = 0; - virtual IArchTaskBarReceiver* taskBarReceiver() const = 0; - virtual void bye(int error) = 0; - virtual int mainLoop() = 0; - virtual void initApp(int argc, const char** argv) = 0; - virtual const char* daemonName() const = 0; - virtual int foregroundStartup(int argc, char** argv) = 0; - virtual synergy::Screen* createScreen() = 0; - virtual IEventQueue* getEvents() const = 0; + virtual void setByeFunc(void(*bye)(int)) = 0; + virtual ArgsBase& argsBase() const = 0; + virtual int standardStartup(int argc, char** argv) = 0; + virtual int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup) = 0; + virtual void startNode() = 0; + virtual IArchTaskBarReceiver* taskBarReceiver() const = 0; + virtual void bye(int error) = 0; + virtual int mainLoop() = 0; + virtual void initApp(int argc, const char** argv) = 0; + virtual const char* daemonName() const = 0; + virtual int foregroundStartup(int argc, char** argv) = 0; + virtual synergy::Screen* createScreen() = 0; + virtual IEventQueue* getEvents() const = 0; }; diff --git a/src/lib/synergy/IAppUtil.h b/src/lib/synergy/IAppUtil.h index 3653fc5c..5f94e82d 100644 --- a/src/lib/synergy/IAppUtil.h +++ b/src/lib/synergy/IAppUtil.h @@ -23,9 +23,9 @@ class IAppUtil : public IInterface { public: - virtual void adoptApp(IApp* app) = 0; - virtual IApp& app() const = 0; - virtual int run(int argc, char** argv) = 0; - virtual void beforeAppExit() = 0; - virtual void startNode() = 0; + virtual void adoptApp(IApp* app) = 0; + virtual IApp& app() const = 0; + virtual int run(int argc, char** argv) = 0; + virtual void beforeAppExit() = 0; + virtual void startNode() = 0; }; diff --git a/src/lib/synergy/IClient.h b/src/lib/synergy/IClient.h index 8403cbd9..0a296bf3 100644 --- a/src/lib/synergy/IClient.h +++ b/src/lib/synergy/IClient.h @@ -32,145 +32,145 @@ communicate with a client. */ class IClient : public IScreen { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Enter screen - /*! - Enter the screen. The cursor should be warped to \p xAbs,yAbs. - \p mask is the expected toggle button state and the client should - update its state to match. \p forScreensaver is true iff the - screen is being entered because the screen saver is starting. - Subsequent clipboard events should report \p seqNum. - */ - virtual void enter(SInt32 xAbs, SInt32 yAbs, - UInt32 seqNum, KeyModifierMask mask, - bool forScreensaver) = 0; + //! Enter screen + /*! + Enter the screen. The cursor should be warped to \p xAbs,yAbs. + \p mask is the expected toggle button state and the client should + update its state to match. \p forScreensaver is true iff the + screen is being entered because the screen saver is starting. + Subsequent clipboard events should report \p seqNum. + */ + virtual void enter(SInt32 xAbs, SInt32 yAbs, + UInt32 seqNum, KeyModifierMask mask, + bool forScreensaver) = 0; - //! Leave screen - /*! - Leave the screen. Return false iff the user may not leave the - client's screen (because, for example, a button is down). - */ - virtual bool leave() = 0; + //! Leave screen + /*! + Leave the screen. Return false iff the user may not leave the + client's screen (because, for example, a button is down). + */ + virtual bool leave() = 0; - //! Set clipboard - /*! - Update the client's clipboard. This implies that the client's - clipboard is now up to date. If the client's clipboard was - already known to be up to date then this may do nothing. \c data - has marshalled clipboard data. - */ - virtual void setClipboard(ClipboardID, const IClipboard*) = 0; + //! Set clipboard + /*! + Update the client's clipboard. This implies that the client's + clipboard is now up to date. If the client's clipboard was + already known to be up to date then this may do nothing. \c data + has marshalled clipboard data. + */ + virtual void setClipboard(ClipboardID, const IClipboard*) = 0; - //! Grab clipboard - /*! - Grab (i.e. take ownership of) the client's clipboard. Since this - is called when another client takes ownership of the clipboard it - implies that the client's clipboard is out of date. - */ - virtual void grabClipboard(ClipboardID) = 0; + //! Grab clipboard + /*! + Grab (i.e. take ownership of) the client's clipboard. Since this + is called when another client takes ownership of the clipboard it + implies that the client's clipboard is out of date. + */ + virtual void grabClipboard(ClipboardID) = 0; - //! Mark clipboard dirty - /*! - Mark the client's clipboard as dirty (out of date) or clean (up to - date). - */ - virtual void setClipboardDirty(ClipboardID, bool dirty) = 0; + //! Mark clipboard dirty + /*! + Mark the client's clipboard as dirty (out of date) or clean (up to + date). + */ + virtual void setClipboardDirty(ClipboardID, bool dirty) = 0; - //! Notify of key press - /*! - Synthesize key events to generate a press of key \c id. If possible - match the given modifier mask. The KeyButton identifies the physical - key on the server that generated this key down. The client must - ensure that a key up or key repeat that uses the same KeyButton will - synthesize an up or repeat for the same client key synthesized by - keyDown(). - */ - virtual void keyDown(KeyID id, KeyModifierMask, KeyButton) = 0; + //! Notify of key press + /*! + Synthesize key events to generate a press of key \c id. If possible + match the given modifier mask. The KeyButton identifies the physical + key on the server that generated this key down. The client must + ensure that a key up or key repeat that uses the same KeyButton will + synthesize an up or repeat for the same client key synthesized by + keyDown(). + */ + virtual void keyDown(KeyID id, KeyModifierMask, KeyButton) = 0; - //! Notify of key repeat - /*! - Synthesize key events to generate a press and release of key \c id - \c count times. If possible match the given modifier mask. - */ - virtual void keyRepeat(KeyID id, KeyModifierMask, - SInt32 count, KeyButton) = 0; + //! Notify of key repeat + /*! + Synthesize key events to generate a press and release of key \c id + \c count times. If possible match the given modifier mask. + */ + virtual void keyRepeat(KeyID id, KeyModifierMask, + SInt32 count, KeyButton) = 0; - //! Notify of key release - /*! - Synthesize key events to generate a release of key \c id. If possible - match the given modifier mask. - */ - virtual void keyUp(KeyID id, KeyModifierMask, KeyButton) = 0; + //! Notify of key release + /*! + Synthesize key events to generate a release of key \c id. If possible + match the given modifier mask. + */ + virtual void keyUp(KeyID id, KeyModifierMask, KeyButton) = 0; - //! Notify of mouse press - /*! - Synthesize mouse events to generate a press of mouse button \c id. - */ - virtual void mouseDown(ButtonID id) = 0; + //! Notify of mouse press + /*! + Synthesize mouse events to generate a press of mouse button \c id. + */ + virtual void mouseDown(ButtonID id) = 0; - //! Notify of mouse release - /*! - Synthesize mouse events to generate a release of mouse button \c id. - */ - virtual void mouseUp(ButtonID id) = 0; + //! Notify of mouse release + /*! + Synthesize mouse events to generate a release of mouse button \c id. + */ + virtual void mouseUp(ButtonID id) = 0; - //! Notify of mouse motion - /*! - Synthesize mouse events to generate mouse motion to the absolute - screen position \c xAbs,yAbs. - */ - virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; + //! Notify of mouse motion + /*! + Synthesize mouse events to generate mouse motion to the absolute + screen position \c xAbs,yAbs. + */ + virtual void mouseMove(SInt32 xAbs, SInt32 yAbs) = 0; - //! Notify of mouse motion - /*! - Synthesize mouse events to generate mouse motion by the relative - amount \c xRel,yRel. - */ - virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; + //! Notify of mouse motion + /*! + Synthesize mouse events to generate mouse motion by the relative + amount \c xRel,yRel. + */ + virtual void mouseRelativeMove(SInt32 xRel, SInt32 yRel) = 0; - //! Notify of mouse wheel motion - /*! - Synthesize mouse events to generate mouse wheel motion of \c xDelta - and \c yDelta. Deltas are positive for motion away from the user or - to the right and negative for motion towards the user or to the left. - Each wheel click should generate a delta of +/-120. - */ - virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; + //! Notify of mouse wheel motion + /*! + Synthesize mouse events to generate mouse wheel motion of \c xDelta + and \c yDelta. Deltas are positive for motion away from the user or + to the right and negative for motion towards the user or to the left. + Each wheel click should generate a delta of +/-120. + */ + virtual void mouseWheel(SInt32 xDelta, SInt32 yDelta) = 0; - //! Notify of screen saver change - virtual void screensaver(bool activate) = 0; + //! Notify of screen saver change + virtual void screensaver(bool activate) = 0; - //! Notify of options changes - /*! - Reset all options to their default values. - */ - virtual void resetOptions() = 0; + //! Notify of options changes + /*! + Reset all options to their default values. + */ + virtual void resetOptions() = 0; - //! Notify of options changes - /*! - Set options to given values. Ignore unknown options and don't - modify our options that aren't given in \c options. - */ - virtual void setOptions(const OptionsList& options) = 0; + //! Notify of options changes + /*! + Set options to given values. Ignore unknown options and don't + modify our options that aren't given in \c options. + */ + virtual void setOptions(const OptionsList& options) = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get client name - /*! - Return the client's name. - */ - virtual String getName() const = 0; + //! Get client name + /*! + Return the client's name. + */ + virtual String getName() const = 0; - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const = 0; - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + // IScreen overrides + virtual void* getEventTarget() const = 0; + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; }; diff --git a/src/lib/synergy/IClipboard.cpp b/src/lib/synergy/IClipboard.cpp index a8019184..a554c9c1 100644 --- a/src/lib/synergy/IClipboard.cpp +++ b/src/lib/synergy/IClipboard.cpp @@ -26,143 +26,143 @@ void IClipboard::unmarshall(IClipboard* clipboard, const String& data, Time time) { - assert(clipboard != NULL); + assert(clipboard != NULL); - const char* index = data.data(); + const char* index = data.data(); - if (clipboard->open(time)) { - // clear existing data - clipboard->empty(); + if (clipboard->open(time)) { + // clear existing data + clipboard->empty(); - // read the number of formats - const UInt32 numFormats = readUInt32(index); - index += 4; + // read the number of formats + const UInt32 numFormats = readUInt32(index); + index += 4; - // read each format - for (UInt32 i = 0; i < numFormats; ++i) { - // get the format id - IClipboard::EFormat format = - static_cast(readUInt32(index)); - index += 4; + // read each format + for (UInt32 i = 0; i < numFormats; ++i) { + // get the format id + IClipboard::EFormat format = + static_cast(readUInt32(index)); + index += 4; - // get the size of the format data - UInt32 size = readUInt32(index); - index += 4; + // get the size of the format data + UInt32 size = readUInt32(index); + index += 4; - // save the data if it's a known format. if either the client - // or server supports more clipboard formats than the other - // then one of them will get a format >= kNumFormats here. - if (format add(format, String(index, size)); - } - index += size; - } + // save the data if it's a known format. if either the client + // or server supports more clipboard formats than the other + // then one of them will get a format >= kNumFormats here. + if (format add(format, String(index, size)); + } + index += size; + } - // done - clipboard->close(); - } + // done + clipboard->close(); + } } String IClipboard::marshall(const IClipboard* clipboard) { - // return data format: - // 4 bytes => number of formats included - // 4 bytes => format enum - // 4 bytes => clipboard data size n - // n bytes => clipboard data - // back to the second 4 bytes if there is another format - - assert(clipboard != NULL); + // return data format: + // 4 bytes => number of formats included + // 4 bytes => format enum + // 4 bytes => clipboard data size n + // n bytes => clipboard data + // back to the second 4 bytes if there is another format + + assert(clipboard != NULL); - String data; + String data; - std::vector formatData; - formatData.resize(IClipboard::kNumFormats); - // FIXME -- use current time - if (clipboard->open(0)) { + std::vector formatData; + formatData.resize(IClipboard::kNumFormats); + // FIXME -- use current time + if (clipboard->open(0)) { - // compute size of marshalled data - UInt32 size = 4; - UInt32 numFormats = 0; - for (UInt32 format = 0; format != IClipboard::kNumFormats; ++format) { - if (clipboard->has(static_cast(format))) { - ++numFormats; - formatData[format] = - clipboard->get(static_cast(format)); - size += 4 + 4 + (UInt32)formatData[format].size(); - } - } + // compute size of marshalled data + UInt32 size = 4; + UInt32 numFormats = 0; + for (UInt32 format = 0; format != IClipboard::kNumFormats; ++format) { + if (clipboard->has(static_cast(format))) { + ++numFormats; + formatData[format] = + clipboard->get(static_cast(format)); + size += 4 + 4 + (UInt32)formatData[format].size(); + } + } - // allocate space - data.reserve(size); + // allocate space + data.reserve(size); - // marshall the data - writeUInt32(&data, numFormats); - for (UInt32 format = 0; format != IClipboard::kNumFormats; ++format) { - if (clipboard->has(static_cast(format))) { - writeUInt32(&data, format); - writeUInt32(&data, (UInt32)formatData[format].size()); - data += formatData[format]; - } - } - clipboard->close(); - } + // marshall the data + writeUInt32(&data, numFormats); + for (UInt32 format = 0; format != IClipboard::kNumFormats; ++format) { + if (clipboard->has(static_cast(format))) { + writeUInt32(&data, format); + writeUInt32(&data, (UInt32)formatData[format].size()); + data += formatData[format]; + } + } + clipboard->close(); + } - return data; + return data; } bool IClipboard::copy(IClipboard* dst, const IClipboard* src) { - assert(dst != NULL); - assert(src != NULL); + assert(dst != NULL); + assert(src != NULL); - return copy(dst, src, src->getTime()); + return copy(dst, src, src->getTime()); } bool IClipboard::copy(IClipboard* dst, const IClipboard* src, Time time) { - assert(dst != NULL); - assert(src != NULL); + assert(dst != NULL); + assert(src != NULL); - bool success = false; - if (src->open(time)) { - if (dst->open(time)) { - if (dst->empty()) { - for (SInt32 format = 0; - format != IClipboard::kNumFormats; ++format) { - IClipboard::EFormat eFormat = (IClipboard::EFormat)format; - if (src->has(eFormat)) { - dst->add(eFormat, src->get(eFormat)); - } - } - success = true; - } - dst->close(); - } - src->close(); - } + bool success = false; + if (src->open(time)) { + if (dst->open(time)) { + if (dst->empty()) { + for (SInt32 format = 0; + format != IClipboard::kNumFormats; ++format) { + IClipboard::EFormat eFormat = (IClipboard::EFormat)format; + if (src->has(eFormat)) { + dst->add(eFormat, src->get(eFormat)); + } + } + success = true; + } + dst->close(); + } + src->close(); + } - return success; + return success; } UInt32 IClipboard::readUInt32(const char* buf) { - const unsigned char* ubuf = reinterpret_cast(buf); - return (static_cast(ubuf[0]) << 24) | - (static_cast(ubuf[1]) << 16) | - (static_cast(ubuf[2]) << 8) | - static_cast(ubuf[3]); + const unsigned char* ubuf = reinterpret_cast(buf); + return (static_cast(ubuf[0]) << 24) | + (static_cast(ubuf[1]) << 16) | + (static_cast(ubuf[2]) << 8) | + static_cast(ubuf[3]); } void IClipboard::writeUInt32(String* buf, UInt32 v) { - *buf += static_cast((v >> 24) & 0xff); - *buf += static_cast((v >> 16) & 0xff); - *buf += static_cast((v >> 8) & 0xff); - *buf += static_cast( v & 0xff); + *buf += static_cast((v >> 24) & 0xff); + *buf += static_cast((v >> 16) & 0xff); + *buf += static_cast((v >> 8) & 0xff); + *buf += static_cast( v & 0xff); } diff --git a/src/lib/synergy/IClipboard.h b/src/lib/synergy/IClipboard.h index 1d8e2f21..13522634 100644 --- a/src/lib/synergy/IClipboard.h +++ b/src/lib/synergy/IClipboard.h @@ -28,142 +28,142 @@ This interface defines the methods common to all clipboards. */ class IClipboard : public IInterface { public: - //! Timestamp type - /*! - Timestamp type. Timestamps are in milliseconds from some - arbitrary starting time. Timestamps will wrap around to 0 - after about 49 3/4 days. - */ - typedef UInt32 Time; + //! Timestamp type + /*! + Timestamp type. Timestamps are in milliseconds from some + arbitrary starting time. Timestamps will wrap around to 0 + after about 49 3/4 days. + */ + typedef UInt32 Time; - //! Clipboard formats - /*! - The list of known clipboard formats. kNumFormats must be last and - formats must be sequential starting from zero. Clipboard data set - via add() and retrieved via get() must be in one of these formats. - Platform dependent clipboard subclasses can and should present any - suitable formats derivable from these formats. + //! Clipboard formats + /*! + The list of known clipboard formats. kNumFormats must be last and + formats must be sequential starting from zero. Clipboard data set + via add() and retrieved via get() must be in one of these formats. + Platform dependent clipboard subclasses can and should present any + suitable formats derivable from these formats. - \c kText is a text format encoded in UTF-8. Newlines are LF (not - CR or LF/CR). + \c kText is a text format encoded in UTF-8. Newlines are LF (not + CR or LF/CR). - \c kBitmap is an image format. The data is a BMP file without the - 14 byte header (i.e. starting at the INFOHEADER) and with the image - data immediately following the 40 byte INFOHEADER. + \c kBitmap is an image format. The data is a BMP file without the + 14 byte header (i.e. starting at the INFOHEADER) and with the image + data immediately following the 40 byte INFOHEADER. - \c kHTML is a text format encoded in UTF-8 and containing a valid - HTML fragment (but not necessarily a complete HTML document). - Newlines are LF. - */ - enum EFormat { - kText, //!< Text format, UTF-8, newline is LF - kHTML, //!< HTML format, HTML fragment, UTF-8, newline is LF - kBitmap, //!< Bitmap format, BMP 24/32bpp, BI_RGB - kNumFormats //!< The number of clipboard formats - }; + \c kHTML is a text format encoded in UTF-8 and containing a valid + HTML fragment (but not necessarily a complete HTML document). + Newlines are LF. + */ + enum EFormat { + kText, //!< Text format, UTF-8, newline is LF + kHTML, //!< HTML format, HTML fragment, UTF-8, newline is LF + kBitmap, //!< Bitmap format, BMP 24/32bpp, BI_RGB + kNumFormats //!< The number of clipboard formats + }; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Empty clipboard - /*! - Take ownership of the clipboard and clear all data from it. - This must be called between a successful open() and close(). - Return false if the clipboard ownership could not be taken; - the clipboard should not be emptied in this case. - */ - virtual bool empty() = 0; + //! Empty clipboard + /*! + Take ownership of the clipboard and clear all data from it. + This must be called between a successful open() and close(). + Return false if the clipboard ownership could not be taken; + the clipboard should not be emptied in this case. + */ + virtual bool empty() = 0; - //! Add data - /*! - Add data in the given format to the clipboard. May only be - called after a successful empty(). - */ - virtual void add(EFormat, const String& data) = 0; + //! Add data + /*! + Add data in the given format to the clipboard. May only be + called after a successful empty(). + */ + virtual void add(EFormat, const String& data) = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Open clipboard - /*! - Open the clipboard. Return true iff the clipboard could be - opened. If open() returns true then the client must call - close() at some later time; if it returns false then close() - must not be called. \c time should be the current time or - a time in the past when the open should effectively have taken - place. - */ - virtual bool open(Time time) const = 0; + //! Open clipboard + /*! + Open the clipboard. Return true iff the clipboard could be + opened. If open() returns true then the client must call + close() at some later time; if it returns false then close() + must not be called. \c time should be the current time or + a time in the past when the open should effectively have taken + place. + */ + virtual bool open(Time time) const = 0; - //! Close clipboard - /*! - Close the clipboard. close() must match a preceding successful - open(). This signals that the clipboard has been filled with - all the necessary data or all data has been read. It does not - mean the clipboard ownership should be released (if it was - taken). - */ - virtual void close() const = 0; + //! Close clipboard + /*! + Close the clipboard. close() must match a preceding successful + open(). This signals that the clipboard has been filled with + all the necessary data or all data has been read. It does not + mean the clipboard ownership should be released (if it was + taken). + */ + virtual void close() const = 0; - //! Get time - /*! - Return the timestamp passed to the last successful open(). - */ - virtual Time getTime() const = 0; + //! Get time + /*! + Return the timestamp passed to the last successful open(). + */ + virtual Time getTime() const = 0; - //! Check for data - /*! - Return true iff the clipboard contains data in the given - format. Must be called between a successful open() and close(). - */ - virtual bool has(EFormat) const = 0; + //! Check for data + /*! + Return true iff the clipboard contains data in the given + format. Must be called between a successful open() and close(). + */ + virtual bool has(EFormat) const = 0; - //! Get data - /*! - Return the data in the given format. Returns the empty string - if there is no data in that format. Must be called between - a successful open() and close(). - */ - virtual String get(EFormat) const = 0; + //! Get data + /*! + Return the data in the given format. Returns the empty string + if there is no data in that format. Must be called between + a successful open() and close(). + */ + virtual String get(EFormat) const = 0; - //! Marshall clipboard data - /*! - Merge \p clipboard's data into a single buffer that can be later - unmarshalled to restore the clipboard and return the buffer. - */ - static String marshall(const IClipboard* clipboard); + //! Marshall clipboard data + /*! + Merge \p clipboard's data into a single buffer that can be later + unmarshalled to restore the clipboard and return the buffer. + */ + static String marshall(const IClipboard* clipboard); - //! Unmarshall clipboard data - /*! - Extract marshalled clipboard data and store it in \p clipboard. - Sets the clipboard time to \c time. - */ - static void unmarshall(IClipboard* clipboard, - const String& data, Time time); + //! Unmarshall clipboard data + /*! + Extract marshalled clipboard data and store it in \p clipboard. + Sets the clipboard time to \c time. + */ + static void unmarshall(IClipboard* clipboard, + const String& data, Time time); - //! Copy clipboard - /*! - Transfers all the data in one clipboard to another. The - clipboards can be of any concrete clipboard type (and - they don't have to be the same type). This also sets - the destination clipboard's timestamp to source clipboard's - timestamp. Returns true iff the copy succeeded. - */ - static bool copy(IClipboard* dst, const IClipboard* src); + //! Copy clipboard + /*! + Transfers all the data in one clipboard to another. The + clipboards can be of any concrete clipboard type (and + they don't have to be the same type). This also sets + the destination clipboard's timestamp to source clipboard's + timestamp. Returns true iff the copy succeeded. + */ + static bool copy(IClipboard* dst, const IClipboard* src); - //! Copy clipboard - /*! - Transfers all the data in one clipboard to another. The - clipboards can be of any concrete clipboard type (and they - don't have to be the same type). This also sets the - timestamp to \c time. Returns true iff the copy succeeded. - */ - static bool copy(IClipboard* dst, const IClipboard* src, Time); + //! Copy clipboard + /*! + Transfers all the data in one clipboard to another. The + clipboards can be of any concrete clipboard type (and they + don't have to be the same type). This also sets the + timestamp to \c time. Returns true iff the copy succeeded. + */ + static bool copy(IClipboard* dst, const IClipboard* src, Time); - //@} + //@} private: - static UInt32 readUInt32(const char*); - static void writeUInt32(String*, UInt32); + static UInt32 readUInt32(const char*); + static void writeUInt32(String*, UInt32); }; diff --git a/src/lib/synergy/IKeyState.cpp b/src/lib/synergy/IKeyState.cpp index 2b130a4d..a46fb64f 100644 --- a/src/lib/synergy/IKeyState.cpp +++ b/src/lib/synergy/IKeyState.cpp @@ -36,126 +36,126 @@ IKeyState::IKeyState(IEventQueue* events) IKeyState::KeyInfo* IKeyState::KeyInfo::alloc(KeyID id, - KeyModifierMask mask, KeyButton button, SInt32 count) + KeyModifierMask mask, KeyButton button, SInt32 count) { - KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo)); - info->m_key = id; - info->m_mask = mask; - info->m_button = button; - info->m_count = count; - info->m_screens = NULL; - info->m_screensBuffer[0] = '\0'; - return info; + KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo)); + info->m_key = id; + info->m_mask = mask; + info->m_button = button; + info->m_count = count; + info->m_screens = NULL; + info->m_screensBuffer[0] = '\0'; + return info; } IKeyState::KeyInfo* IKeyState::KeyInfo::alloc(KeyID id, - KeyModifierMask mask, KeyButton button, SInt32 count, - const std::set& destinations) + KeyModifierMask mask, KeyButton button, SInt32 count, + const std::set& destinations) { - String screens = join(destinations); + String screens = join(destinations); - // build structure - KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo) + screens.size()); - info->m_key = id; - info->m_mask = mask; - info->m_button = button; - info->m_count = count; - info->m_screens = info->m_screensBuffer; - strcpy(info->m_screensBuffer, screens.c_str()); - return info; + // build structure + KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo) + screens.size()); + info->m_key = id; + info->m_mask = mask; + info->m_button = button; + info->m_count = count; + info->m_screens = info->m_screensBuffer; + strcpy(info->m_screensBuffer, screens.c_str()); + return info; } IKeyState::KeyInfo* IKeyState::KeyInfo::alloc(const KeyInfo& x) { - KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo) + - strlen(x.m_screensBuffer)); - info->m_key = x.m_key; - info->m_mask = x.m_mask; - info->m_button = x.m_button; - info->m_count = x.m_count; - info->m_screens = x.m_screens ? info->m_screensBuffer : NULL; - strcpy(info->m_screensBuffer, x.m_screensBuffer); - return info; + KeyInfo* info = (KeyInfo*)malloc(sizeof(KeyInfo) + + strlen(x.m_screensBuffer)); + info->m_key = x.m_key; + info->m_mask = x.m_mask; + info->m_button = x.m_button; + info->m_count = x.m_count; + info->m_screens = x.m_screens ? info->m_screensBuffer : NULL; + strcpy(info->m_screensBuffer, x.m_screensBuffer); + return info; } bool IKeyState::KeyInfo::isDefault(const char* screens) { - return (screens == NULL || screens[0] == '\0'); + return (screens == NULL || screens[0] == '\0'); } bool IKeyState::KeyInfo::contains(const char* screens, const String& name) { - // special cases - if (isDefault(screens)) { - return false; - } - if (screens[0] == '*') { - return true; - } + // special cases + if (isDefault(screens)) { + return false; + } + if (screens[0] == '*') { + return true; + } - // search - String match; - match.reserve(name.size() + 2); - match += ":"; - match += name; - match += ":"; - return (strstr(screens, match.c_str()) != NULL); + // search + String match; + match.reserve(name.size() + 2); + match += ":"; + match += name; + match += ":"; + return (strstr(screens, match.c_str()) != NULL); } bool IKeyState::KeyInfo::equal(const KeyInfo* a, const KeyInfo* b) { - return (a->m_key == b->m_key && - a->m_mask == b->m_mask && - a->m_button == b->m_button && - a->m_count == b->m_count && - strcmp(a->m_screensBuffer, b->m_screensBuffer) == 0); + return (a->m_key == b->m_key && + a->m_mask == b->m_mask && + a->m_button == b->m_button && + a->m_count == b->m_count && + strcmp(a->m_screensBuffer, b->m_screensBuffer) == 0); } String IKeyState::KeyInfo::join(const std::set& destinations) { - // collect destinations into a string. names are surrounded by ':' - // which makes searching easy. the string is empty if there are no - // destinations and "*" means all destinations. - String screens; - for (std::set::const_iterator i = destinations.begin(); - i != destinations.end(); ++i) { - if (*i == "*") { - screens = "*"; - break; - } - else { - if (screens.empty()) { - screens = ":"; - } - screens += *i; - screens += ":"; - } - } - return screens; + // collect destinations into a string. names are surrounded by ':' + // which makes searching easy. the string is empty if there are no + // destinations and "*" means all destinations. + String screens; + for (std::set::const_iterator i = destinations.begin(); + i != destinations.end(); ++i) { + if (*i == "*") { + screens = "*"; + break; + } + else { + if (screens.empty()) { + screens = ":"; + } + screens += *i; + screens += ":"; + } + } + return screens; } void IKeyState::KeyInfo::split(const char* screens, std::set& dst) { - dst.clear(); - if (isDefault(screens)) { - return; - } - if (screens[0] == '*') { - dst.insert("*"); - return; - } + dst.clear(); + if (isDefault(screens)) { + return; + } + if (screens[0] == '*') { + dst.insert("*"); + return; + } - const char* i = screens + 1; - while (*i != '\0') { - const char* j = strchr(i, ':'); - dst.insert(String(i, j - i)); - i = j + 1; - } + const char* i = screens + 1; + while (*i != '\0') { + const char* j = strchr(i, ':'); + dst.insert(String(i, j - i)); + i = j + 1; + } } diff --git a/src/lib/synergy/IKeyState.h b/src/lib/synergy/IKeyState.h index 26b0b2d9..249f4e8f 100644 --- a/src/lib/synergy/IKeyState.h +++ b/src/lib/synergy/IKeyState.h @@ -33,142 +33,142 @@ to synthesize key events. */ class IKeyState : public IInterface { public: - IKeyState(IEventQueue* events); + IKeyState(IEventQueue* events); - enum { - kNumButtons = 0x200 - }; + enum { + kNumButtons = 0x200 + }; - //! Key event data - class KeyInfo { - public: - static KeyInfo* alloc(KeyID, KeyModifierMask, KeyButton, SInt32 count); - static KeyInfo* alloc(KeyID, KeyModifierMask, KeyButton, SInt32 count, - const std::set& destinations); - static KeyInfo* alloc(const KeyInfo&); + //! Key event data + class KeyInfo { + public: + static KeyInfo* alloc(KeyID, KeyModifierMask, KeyButton, SInt32 count); + static KeyInfo* alloc(KeyID, KeyModifierMask, KeyButton, SInt32 count, + const std::set& destinations); + static KeyInfo* alloc(const KeyInfo&); - static bool isDefault(const char* screens); - static bool contains(const char* screens, const String& name); - static bool equal(const KeyInfo*, const KeyInfo*); - static String join(const std::set& destinations); - static void split(const char* screens, std::set&); + static bool isDefault(const char* screens); + static bool contains(const char* screens, const String& name); + static bool equal(const KeyInfo*, const KeyInfo*); + static String join(const std::set& destinations); + static void split(const char* screens, std::set&); - public: - KeyID m_key; - KeyModifierMask m_mask; - KeyButton m_button; - SInt32 m_count; - char* m_screens; - char m_screensBuffer[1]; - }; + public: + KeyID m_key; + KeyModifierMask m_mask; + KeyButton m_button; + SInt32 m_count; + char* m_screens; + char m_screensBuffer[1]; + }; - typedef std::set KeyButtonSet; + typedef std::set KeyButtonSet; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update the keyboard map - /*! - Causes the key state to get updated to reflect the current keyboard - mapping. - */ - virtual void updateKeyMap() = 0; + //! Update the keyboard map + /*! + Causes the key state to get updated to reflect the current keyboard + mapping. + */ + virtual void updateKeyMap() = 0; - //! Update the key state - /*! - Causes the key state to get updated to reflect the physical keyboard - state. - */ - virtual void updateKeyState() = 0; + //! Update the key state + /*! + Causes the key state to get updated to reflect the physical keyboard + state. + */ + virtual void updateKeyState() = 0; - //! Set half-duplex mask - /*! - Sets which modifier toggle keys are half-duplex. A half-duplex - toggle key doesn't report a key release when toggled on and - doesn't report a key press when toggled off. - */ - virtual void setHalfDuplexMask(KeyModifierMask) = 0; + //! Set half-duplex mask + /*! + Sets which modifier toggle keys are half-duplex. A half-duplex + toggle key doesn't report a key release when toggled on and + doesn't report a key press when toggled off. + */ + virtual void setHalfDuplexMask(KeyModifierMask) = 0; - //! Fake a key press - /*! - Synthesizes a key press event and updates the key state. - */ - virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button) = 0; + //! Fake a key press + /*! + Synthesizes a key press event and updates the key state. + */ + virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, + KeyButton button) = 0; - //! Fake a key repeat - /*! - Synthesizes a key repeat event and updates the key state. - */ - virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button) = 0; + //! Fake a key repeat + /*! + Synthesizes a key repeat event and updates the key state. + */ + virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton button) = 0; - //! Fake a key release - /*! - Synthesizes a key release event and updates the key state. - */ - virtual bool fakeKeyUp(KeyButton button) = 0; + //! Fake a key release + /*! + Synthesizes a key release event and updates the key state. + */ + virtual bool fakeKeyUp(KeyButton button) = 0; - //! Fake key releases for all fake pressed keys - /*! - Synthesizes a key release event for every key that is synthetically - pressed and updates the key state. - */ - virtual void fakeAllKeysUp() = 0; + //! Fake key releases for all fake pressed keys + /*! + Synthesizes a key release event for every key that is synthetically + pressed and updates the key state. + */ + virtual void fakeAllKeysUp() = 0; - //! Fake ctrl+alt+del - /*! - Synthesize a press of ctrl+alt+del. Return true if processing is - complete and false if normal key processing should continue. - */ - virtual bool fakeCtrlAltDel() = 0; - - //! Fake a media key - /*! - Synthesizes a media key down and up. Only Mac would implement this by - use cocoa appkit framework. - */ - virtual bool fakeMediaKey(KeyID id) = 0; - - //@} - //! @name accessors - //@{ + //! Fake ctrl+alt+del + /*! + Synthesize a press of ctrl+alt+del. Return true if processing is + complete and false if normal key processing should continue. + */ + virtual bool fakeCtrlAltDel() = 0; + + //! Fake a media key + /*! + Synthesizes a media key down and up. Only Mac would implement this by + use cocoa appkit framework. + */ + virtual bool fakeMediaKey(KeyID id) = 0; + + //@} + //! @name accessors + //@{ - //! Test if key is pressed - /*! - Returns true iff the given key is down. Half-duplex toggles - always return false. - */ - virtual bool isKeyDown(KeyButton) const = 0; + //! Test if key is pressed + /*! + Returns true iff the given key is down. Half-duplex toggles + always return false. + */ + virtual bool isKeyDown(KeyButton) const = 0; - //! Get the active modifiers - /*! - Returns the modifiers that are currently active according to our - shadowed state. - */ - virtual KeyModifierMask - getActiveModifiers() const = 0; + //! Get the active modifiers + /*! + Returns the modifiers that are currently active according to our + shadowed state. + */ + virtual KeyModifierMask + getActiveModifiers() const = 0; - //! Get the active modifiers from OS - /*! - Returns the modifiers that are currently active according to the - operating system. - */ - virtual KeyModifierMask - pollActiveModifiers() const = 0; + //! Get the active modifiers from OS + /*! + Returns the modifiers that are currently active according to the + operating system. + */ + virtual KeyModifierMask + pollActiveModifiers() const = 0; - //! Get the active keyboard layout from OS - /*! - Returns the active keyboard layout according to the operating system. - */ - virtual SInt32 pollActiveGroup() const = 0; + //! Get the active keyboard layout from OS + /*! + Returns the active keyboard layout according to the operating system. + */ + virtual SInt32 pollActiveGroup() const = 0; - //! Get the keys currently pressed from OS - /*! - Adds any keys that are currently pressed according to the operating - system to \p pressedKeys. - */ - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; + //! Get the keys currently pressed from OS + /*! + Adds any keys that are currently pressed according to the operating + system to \p pressedKeys. + */ + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; - //@} + //@} }; diff --git a/src/lib/synergy/INode.h b/src/lib/synergy/INode.h index 33c551cf..15951844 100644 --- a/src/lib/synergy/INode.h +++ b/src/lib/synergy/INode.h @@ -21,5 +21,5 @@ #include "common/IInterface.h" class INode : IInterface { - + }; diff --git a/src/lib/synergy/IPlatformScreen.cpp b/src/lib/synergy/IPlatformScreen.cpp index 7c2b679f..844b34cc 100644 --- a/src/lib/synergy/IPlatformScreen.cpp +++ b/src/lib/synergy/IPlatformScreen.cpp @@ -20,5 +20,5 @@ bool IPlatformScreen::fakeMediaKey(KeyID id) { - return false; + return false; } diff --git a/src/lib/synergy/IPlatformScreen.h b/src/lib/synergy/IPlatformScreen.h index 6a8e0fe9..71eed1d0 100644 --- a/src/lib/synergy/IPlatformScreen.h +++ b/src/lib/synergy/IPlatformScreen.h @@ -35,193 +35,193 @@ screen implementations that are used by both primary and secondary screens. */ class IPlatformScreen : public IScreen, - public IPrimaryScreen, public ISecondaryScreen, - public IKeyState { + public IPrimaryScreen, public ISecondaryScreen, + public IKeyState { public: - //! @name manipulators - //@{ + //! @name manipulators + //@{ - IPlatformScreen(IEventQueue* events) : IKeyState(events) { } + IPlatformScreen(IEventQueue* events) : IKeyState(events) { } - //! Enable screen - /*! - Enable the screen, preparing it to report system and user events. - For a secondary screen it also means preparing to synthesize events - and hiding the cursor. - */ - virtual void enable() = 0; + //! Enable screen + /*! + Enable the screen, preparing it to report system and user events. + For a secondary screen it also means preparing to synthesize events + and hiding the cursor. + */ + virtual void enable() = 0; - //! Disable screen - /*! - Undoes the operations in enable() and events should no longer - be reported. - */ - virtual void disable() = 0; + //! Disable screen + /*! + Undoes the operations in enable() and events should no longer + be reported. + */ + virtual void disable() = 0; - //! Enter screen - /*! - Called when the user navigates to this screen. - */ - virtual void enter() = 0; + //! Enter screen + /*! + Called when the user navigates to this screen. + */ + virtual void enter() = 0; - //! Leave screen - /*! - Called when the user navigates off the screen. Returns true on - success, false on failure. A typical reason for failure is being - unable to install the keyboard and mouse snoopers on a primary - screen. Secondary screens should not fail. - */ - virtual bool leave() = 0; + //! Leave screen + /*! + Called when the user navigates off the screen. Returns true on + success, false on failure. A typical reason for failure is being + unable to install the keyboard and mouse snoopers on a primary + screen. Secondary screens should not fail. + */ + virtual bool leave() = 0; - //! Set clipboard - /*! - Set the contents of the system clipboard indicated by \c id. - */ - virtual bool setClipboard(ClipboardID id, const IClipboard*) = 0; + //! Set clipboard + /*! + Set the contents of the system clipboard indicated by \c id. + */ + virtual bool setClipboard(ClipboardID id, const IClipboard*) = 0; - //! Check clipboard owner - /*! - Check ownership of all clipboards and post grab events for any that - have changed. This is used as a backup in case the system doesn't - reliably report clipboard ownership changes. - */ - virtual void checkClipboards() = 0; + //! Check clipboard owner + /*! + Check ownership of all clipboards and post grab events for any that + have changed. This is used as a backup in case the system doesn't + reliably report clipboard ownership changes. + */ + virtual void checkClipboards() = 0; - //! Open screen saver - /*! - Open the screen saver. If \c notify is true then this object must - send events when the screen saver activates or deactivates until - \c closeScreensaver() is called. If \c notify is false then the - screen saver is disabled and restored on \c closeScreensaver(). - */ - virtual void openScreensaver(bool notify) = 0; + //! Open screen saver + /*! + Open the screen saver. If \c notify is true then this object must + send events when the screen saver activates or deactivates until + \c closeScreensaver() is called. If \c notify is false then the + screen saver is disabled and restored on \c closeScreensaver(). + */ + virtual void openScreensaver(bool notify) = 0; - //! Close screen saver - /*! - // Close the screen saver. Stop reporting screen saver activation - and deactivation and, if the screen saver was disabled by - openScreensaver(), enable the screen saver. - */ - virtual void closeScreensaver() = 0; + //! Close screen saver + /*! + // Close the screen saver. Stop reporting screen saver activation + and deactivation and, if the screen saver was disabled by + openScreensaver(), enable the screen saver. + */ + virtual void closeScreensaver() = 0; - //! Activate/deactivate screen saver - /*! - Forcibly activate the screen saver if \c activate is true otherwise - forcibly deactivate it. - */ - virtual void screensaver(bool activate) = 0; + //! Activate/deactivate screen saver + /*! + Forcibly activate the screen saver if \c activate is true otherwise + forcibly deactivate it. + */ + virtual void screensaver(bool activate) = 0; - //! Notify of options changes - /*! - Reset all options to their default values. - */ - virtual void resetOptions() = 0; + //! Notify of options changes + /*! + Reset all options to their default values. + */ + virtual void resetOptions() = 0; - //! Notify of options changes - /*! - Set options to given values. Ignore unknown options and don't - modify options that aren't given in \c options. - */ - virtual void setOptions(const OptionsList& options) = 0; + //! Notify of options changes + /*! + Set options to given values. Ignore unknown options and don't + modify options that aren't given in \c options. + */ + virtual void setOptions(const OptionsList& options) = 0; - //! Set clipboard sequence number - /*! - Sets the sequence number to use in subsequent clipboard events. - */ - virtual void setSequenceNumber(UInt32) = 0; + //! Set clipboard sequence number + /*! + Sets the sequence number to use in subsequent clipboard events. + */ + virtual void setSequenceNumber(UInt32) = 0; - //! Change dragging status - virtual void setDraggingStarted(bool started) = 0; + //! Change dragging status + virtual void setDraggingStarted(bool started) = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Test if is primary screen - /*! - Return true iff this screen is a primary screen. - */ - virtual bool isPrimary() const = 0; + //! Test if is primary screen + /*! + Return true iff this screen is a primary screen. + */ + virtual bool isPrimary() const = 0; - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const = 0; - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + // IScreen overrides + virtual void* getEventTarget() const = 0; + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; - // IPrimaryScreen overrides - virtual void reconfigure(UInt32 activeSides) = 0; - virtual void warpCursor(SInt32 x, SInt32 y) = 0; - virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask) = 0; - virtual void unregisterHotKey(UInt32 id) = 0; - virtual void fakeInputBegin() = 0; - virtual void fakeInputEnd() = 0; - virtual SInt32 getJumpZoneSize() const = 0; - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; - virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides) = 0; + virtual void warpCursor(SInt32 x, SInt32 y) = 0; + virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask) = 0; + virtual void unregisterHotKey(UInt32 id) = 0; + virtual void fakeInputBegin() = 0; + virtual void fakeInputEnd() = 0; + virtual SInt32 getJumpZoneSize() const = 0; + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; + virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; - // ISecondaryScreen overrides - virtual void fakeMouseButton(ButtonID id, bool press) = 0; - virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press) = 0; + virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; - // IKeyState overrides - virtual void updateKeyMap() = 0; - virtual void updateKeyState() = 0; - virtual void setHalfDuplexMask(KeyModifierMask) = 0; - virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button) = 0; - virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button) = 0; - virtual bool fakeKeyUp(KeyButton button) = 0; - virtual void fakeAllKeysUp() = 0; - virtual bool fakeCtrlAltDel() = 0; - virtual bool fakeMediaKey(KeyID id); - virtual bool isKeyDown(KeyButton) const = 0; - virtual KeyModifierMask - getActiveModifiers() const = 0; - virtual KeyModifierMask - pollActiveModifiers() const = 0; - virtual SInt32 pollActiveGroup() const = 0; - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; + // IKeyState overrides + virtual void updateKeyMap() = 0; + virtual void updateKeyState() = 0; + virtual void setHalfDuplexMask(KeyModifierMask) = 0; + virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, + KeyButton button) = 0; + virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton button) = 0; + virtual bool fakeKeyUp(KeyButton button) = 0; + virtual void fakeAllKeysUp() = 0; + virtual bool fakeCtrlAltDel() = 0; + virtual bool fakeMediaKey(KeyID id); + virtual bool isKeyDown(KeyButton) const = 0; + virtual KeyModifierMask + getActiveModifiers() const = 0; + virtual KeyModifierMask + pollActiveModifiers() const = 0; + virtual SInt32 pollActiveGroup() const = 0; + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; - virtual String& getDraggingFilename() = 0; - virtual void clearDraggingFilename() = 0; - virtual bool isDraggingStarted() = 0; - virtual bool isFakeDraggingStarted() = 0; + virtual String& getDraggingFilename() = 0; + virtual void clearDraggingFilename() = 0; + virtual bool isDraggingStarted() = 0; + virtual bool isFakeDraggingStarted() = 0; - virtual void fakeDraggingFiles(DragFileList fileList) = 0; - virtual const String& - getDropTarget() const = 0; - + virtual void fakeDraggingFiles(DragFileList fileList) = 0; + virtual const String& + getDropTarget() const = 0; + protected: - //! Handle system event - /*! - A platform screen is expected to install a handler for system - events in its c'tor like so: - \code - m_events->adoptHandler(Event::kSystem, - m_events->getSystemTarget(), - new TMethodEventJob(this, - &CXXXPlatformScreen::handleSystemEvent)); - \endcode - It should remove the handler in its d'tor. Override the - \c handleSystemEvent() method to process system events. - It should post the events \c IScreen as appropriate. + //! Handle system event + /*! + A platform screen is expected to install a handler for system + events in its c'tor like so: + \code + m_events->adoptHandler(Event::kSystem, + m_events->getSystemTarget(), + new TMethodEventJob(this, + &CXXXPlatformScreen::handleSystemEvent)); + \endcode + It should remove the handler in its d'tor. Override the + \c handleSystemEvent() method to process system events. + It should post the events \c IScreen as appropriate. - A primary screen has further responsibilities. It should post - the events in \c IPrimaryScreen as appropriate. It should also - call \c onKey() on its \c KeyState whenever a key is pressed - or released (but not for key repeats). And it should call - \c updateKeyMap() on its \c KeyState if necessary when the keyboard - mapping changes. + A primary screen has further responsibilities. It should post + the events in \c IPrimaryScreen as appropriate. It should also + call \c onKey() on its \c KeyState whenever a key is pressed + or released (but not for key repeats). And it should call + \c updateKeyMap() on its \c KeyState if necessary when the keyboard + mapping changes. - The target of all events should be the value returned by - \c getEventTarget(). - */ - virtual void handleSystemEvent(const Event& event, void*) = 0; + The target of all events should be the value returned by + \c getEventTarget(). + */ + virtual void handleSystemEvent(const Event& event, void*) = 0; }; diff --git a/src/lib/synergy/IPrimaryScreen.cpp b/src/lib/synergy/IPrimaryScreen.cpp index 929c0590..94c58b72 100644 --- a/src/lib/synergy/IPrimaryScreen.cpp +++ b/src/lib/synergy/IPrimaryScreen.cpp @@ -28,25 +28,25 @@ IPrimaryScreen::ButtonInfo* IPrimaryScreen::ButtonInfo::alloc(ButtonID id, KeyModifierMask mask) { - ButtonInfo* info = (ButtonInfo*)malloc(sizeof(ButtonInfo)); - info->m_button = id; - info->m_mask = mask; - return info; + ButtonInfo* info = (ButtonInfo*)malloc(sizeof(ButtonInfo)); + info->m_button = id; + info->m_mask = mask; + return info; } IPrimaryScreen::ButtonInfo* IPrimaryScreen::ButtonInfo::alloc(const ButtonInfo& x) { - ButtonInfo* info = (ButtonInfo*)malloc(sizeof(ButtonInfo)); - info->m_button = x.m_button; - info->m_mask = x.m_mask; - return info; + ButtonInfo* info = (ButtonInfo*)malloc(sizeof(ButtonInfo)); + info->m_button = x.m_button; + info->m_mask = x.m_mask; + return info; } bool IPrimaryScreen::ButtonInfo::equal(const ButtonInfo* a, const ButtonInfo* b) { - return (a->m_button == b->m_button && a->m_mask == b->m_mask); + return (a->m_button == b->m_button && a->m_mask == b->m_mask); } @@ -57,10 +57,10 @@ IPrimaryScreen::ButtonInfo::equal(const ButtonInfo* a, const ButtonInfo* b) IPrimaryScreen::MotionInfo* IPrimaryScreen::MotionInfo::alloc(SInt32 x, SInt32 y) { - MotionInfo* info = (MotionInfo*)malloc(sizeof(MotionInfo)); - info->m_x = x; - info->m_y = y; - return info; + MotionInfo* info = (MotionInfo*)malloc(sizeof(MotionInfo)); + info->m_x = x; + info->m_y = y; + return info; } @@ -71,10 +71,10 @@ IPrimaryScreen::MotionInfo::alloc(SInt32 x, SInt32 y) IPrimaryScreen::WheelInfo* IPrimaryScreen::WheelInfo::alloc(SInt32 xDelta, SInt32 yDelta) { - WheelInfo* info = (WheelInfo*)malloc(sizeof(WheelInfo)); - info->m_xDelta = xDelta; - info->m_yDelta = yDelta; - return info; + WheelInfo* info = (WheelInfo*)malloc(sizeof(WheelInfo)); + info->m_xDelta = xDelta; + info->m_yDelta = yDelta; + return info; } @@ -85,7 +85,7 @@ IPrimaryScreen::WheelInfo::alloc(SInt32 xDelta, SInt32 yDelta) IPrimaryScreen::HotKeyInfo* IPrimaryScreen::HotKeyInfo::alloc(UInt32 id) { - HotKeyInfo* info = (HotKeyInfo*)malloc(sizeof(HotKeyInfo)); - info->m_id = id; - return info; + HotKeyInfo* info = (HotKeyInfo*)malloc(sizeof(HotKeyInfo)); + info->m_id = id; + return info; } diff --git a/src/lib/synergy/IPrimaryScreen.h b/src/lib/synergy/IPrimaryScreen.h index bc4a745d..c4ec04d3 100644 --- a/src/lib/synergy/IPrimaryScreen.h +++ b/src/lib/synergy/IPrimaryScreen.h @@ -31,135 +31,135 @@ primary screen implementations. */ class IPrimaryScreen : public IInterface { public: - //! Button event data - class ButtonInfo { - public: - static ButtonInfo* alloc(ButtonID, KeyModifierMask); - static ButtonInfo* alloc(const ButtonInfo&); + //! Button event data + class ButtonInfo { + public: + static ButtonInfo* alloc(ButtonID, KeyModifierMask); + static ButtonInfo* alloc(const ButtonInfo&); - static bool equal(const ButtonInfo*, const ButtonInfo*); + static bool equal(const ButtonInfo*, const ButtonInfo*); - public: - ButtonID m_button; - KeyModifierMask m_mask; - }; - //! Motion event data - class MotionInfo { - public: - static MotionInfo* alloc(SInt32 x, SInt32 y); + public: + ButtonID m_button; + KeyModifierMask m_mask; + }; + //! Motion event data + class MotionInfo { + public: + static MotionInfo* alloc(SInt32 x, SInt32 y); - public: - SInt32 m_x; - SInt32 m_y; - }; - //! Wheel motion event data - class WheelInfo { - public: - static WheelInfo* alloc(SInt32 xDelta, SInt32 yDelta); + public: + SInt32 m_x; + SInt32 m_y; + }; + //! Wheel motion event data + class WheelInfo { + public: + static WheelInfo* alloc(SInt32 xDelta, SInt32 yDelta); - public: - SInt32 m_xDelta; - SInt32 m_yDelta; - }; - //! Hot key event data - class HotKeyInfo { - public: - static HotKeyInfo* alloc(UInt32 id); + public: + SInt32 m_xDelta; + SInt32 m_yDelta; + }; + //! Hot key event data + class HotKeyInfo { + public: + static HotKeyInfo* alloc(UInt32 id); - public: - UInt32 m_id; - }; + public: + UInt32 m_id; + }; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update configuration - /*! - This is called when the configuration has changed. \c activeSides - is a bitmask of EDirectionMask indicating which sides of the - primary screen are linked to clients. Override to handle the - possible change in jump zones. - */ - virtual void reconfigure(UInt32 activeSides) = 0; + //! Update configuration + /*! + This is called when the configuration has changed. \c activeSides + is a bitmask of EDirectionMask indicating which sides of the + primary screen are linked to clients. Override to handle the + possible change in jump zones. + */ + virtual void reconfigure(UInt32 activeSides) = 0; - //! Warp cursor - /*! - Warp the cursor to the absolute coordinates \c x,y. Also - discard input events up to and including the warp before - returning. - */ - virtual void warpCursor(SInt32 x, SInt32 y) = 0; + //! Warp cursor + /*! + Warp the cursor to the absolute coordinates \c x,y. Also + discard input events up to and including the warp before + returning. + */ + virtual void warpCursor(SInt32 x, SInt32 y) = 0; - //! Register a system hotkey - /*! - Registers a system-wide hotkey. The screen should arrange for an event - to be delivered to itself when the hot key is pressed or released. When - that happens the screen should post a \c getHotKeyDownEvent() or - \c getHotKeyUpEvent(), respectively. The hot key is key \p key with - exactly the modifiers \p mask. Returns 0 on failure otherwise an id - that can be used to unregister the hotkey. + //! Register a system hotkey + /*! + Registers a system-wide hotkey. The screen should arrange for an event + to be delivered to itself when the hot key is pressed or released. When + that happens the screen should post a \c getHotKeyDownEvent() or + \c getHotKeyUpEvent(), respectively. The hot key is key \p key with + exactly the modifiers \p mask. Returns 0 on failure otherwise an id + that can be used to unregister the hotkey. - A hot key is a set of modifiers and a key, which may itself be a modifier. - The hot key is pressed when the hot key's modifiers and only those - modifiers are logically down (active) and the key is pressed. The hot - key is released when the key is released, regardless of the modifiers. + A hot key is a set of modifiers and a key, which may itself be a modifier. + The hot key is pressed when the hot key's modifiers and only those + modifiers are logically down (active) and the key is pressed. The hot + key is released when the key is released, regardless of the modifiers. - The hot key event should be generated no matter what window or application - has the focus. No other window or application should receive the key - press or release events (they can and should see the modifier key events). - When the key is a modifier, it's acceptable to allow the user to press - the modifiers in any order or to require the user to press the given key - last. - */ - virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask) = 0; + The hot key event should be generated no matter what window or application + has the focus. No other window or application should receive the key + press or release events (they can and should see the modifier key events). + When the key is a modifier, it's acceptable to allow the user to press + the modifiers in any order or to require the user to press the given key + last. + */ + virtual UInt32 registerHotKey(KeyID key, KeyModifierMask mask) = 0; - //! Unregister a system hotkey - /*! - Unregisters a previously registered hot key. - */ - virtual void unregisterHotKey(UInt32 id) = 0; + //! Unregister a system hotkey + /*! + Unregisters a previously registered hot key. + */ + virtual void unregisterHotKey(UInt32 id) = 0; - //! Prepare to synthesize input on primary screen - /*! - Prepares the primary screen to receive synthesized input. We do not - want to receive this synthesized input as user input so this method - ensures that we ignore it. Calls to \c fakeInputBegin() may not be - nested. - */ - virtual void fakeInputBegin() = 0; + //! Prepare to synthesize input on primary screen + /*! + Prepares the primary screen to receive synthesized input. We do not + want to receive this synthesized input as user input so this method + ensures that we ignore it. Calls to \c fakeInputBegin() may not be + nested. + */ + virtual void fakeInputBegin() = 0; - //! Done synthesizing input on primary screen - /*! - Undoes whatever \c fakeInputBegin() did. - */ - virtual void fakeInputEnd() = 0; + //! Done synthesizing input on primary screen + /*! + Undoes whatever \c fakeInputBegin() did. + */ + virtual void fakeInputEnd() = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Get jump zone size - /*! - Return the jump zone size, the size of the regions on the edges of - the screen that cause the cursor to jump to another screen. - */ - virtual SInt32 getJumpZoneSize() const = 0; + //! Get jump zone size + /*! + Return the jump zone size, the size of the regions on the edges of + the screen that cause the cursor to jump to another screen. + */ + virtual SInt32 getJumpZoneSize() const = 0; - //! Test if mouse is pressed - /*! - Return true if any mouse button is currently pressed. Ideally, - "current" means up to the last processed event but it can mean - the current physical mouse button state. - */ - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; + //! Test if mouse is pressed + /*! + Return true if any mouse button is currently pressed. Ideally, + "current" means up to the last processed event but it can mean + the current physical mouse button state. + */ + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; - //! Get cursor center position - /*! - Return the cursor center position which is where we park the - cursor to compute cursor motion deltas and should be far from - the edges of the screen, typically the center. - */ - virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; + //! Get cursor center position + /*! + Return the cursor center position which is where we park the + cursor to compute cursor motion deltas and should be far from + the edges of the screen, typically the center. + */ + virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; - //@} + //@} }; diff --git a/src/lib/synergy/IScreen.h b/src/lib/synergy/IScreen.h index b3b348bf..a55a238c 100644 --- a/src/lib/synergy/IScreen.h +++ b/src/lib/synergy/IScreen.h @@ -31,41 +31,41 @@ This interface defines the methods common to all screens. */ class IScreen : public IInterface { public: - struct ClipboardInfo { - public: - ClipboardID m_id; - UInt32 m_sequenceNumber; - }; + struct ClipboardInfo { + public: + ClipboardID m_id; + UInt32 m_sequenceNumber; + }; - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get event target - /*! - Returns the target used for events created by this object. - */ - virtual void* getEventTarget() const = 0; + //! Get event target + /*! + Returns the target used for events created by this object. + */ + virtual void* getEventTarget() const = 0; - //! Get clipboard - /*! - Save the contents of the clipboard indicated by \c id and return - true iff successful. - */ - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + //! Get clipboard + /*! + Save the contents of the clipboard indicated by \c id and return + true iff successful. + */ + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - //! Get screen shape - /*! - Return the position of the upper-left corner of the screen in \c x and - \c y and the size of the screen in \c width and \c height. - */ - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; + //! Get screen shape + /*! + Return the position of the upper-left corner of the screen in \c x and + \c y and the size of the screen in \c width and \c height. + */ + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; - //! Get cursor position - /*! - Return the current position of the cursor in \c x and \c y. - */ - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; - - //@} + //! Get cursor position + /*! + Return the current position of the cursor in \c x and \c y. + */ + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + + //@} }; diff --git a/src/lib/synergy/IScreenSaver.h b/src/lib/synergy/IScreenSaver.h index e6cd63c0..1908c23d 100644 --- a/src/lib/synergy/IScreenSaver.h +++ b/src/lib/synergy/IScreenSaver.h @@ -27,49 +27,49 @@ This interface defines the methods common to all screen savers. */ class IScreenSaver : public IInterface { public: - // note -- the c'tor/d'tor must *not* enable/disable the screen saver + // note -- the c'tor/d'tor must *not* enable/disable the screen saver - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Enable screen saver - /*! - Enable the screen saver, restoring the screen saver settings to - what they were when disable() was previously called. If disable() - wasn't previously called then it should keep the current settings - or use reasonable defaults. - */ - virtual void enable() = 0; + //! Enable screen saver + /*! + Enable the screen saver, restoring the screen saver settings to + what they were when disable() was previously called. If disable() + wasn't previously called then it should keep the current settings + or use reasonable defaults. + */ + virtual void enable() = 0; - //! Disable screen saver - /*! - Disable the screen saver, saving the old settings for the next - call to enable(). - */ - virtual void disable() = 0; + //! Disable screen saver + /*! + Disable the screen saver, saving the old settings for the next + call to enable(). + */ + virtual void disable() = 0; - //! Activate screen saver - /*! - Activate (i.e. show) the screen saver. - */ - virtual void activate() = 0; + //! Activate screen saver + /*! + Activate (i.e. show) the screen saver. + */ + virtual void activate() = 0; - //! Deactivate screen saver - /*! - Deactivate (i.e. hide) the screen saver, reseting the screen saver - timer. - */ - virtual void deactivate() = 0; + //! Deactivate screen saver + /*! + Deactivate (i.e. hide) the screen saver, reseting the screen saver + timer. + */ + virtual void deactivate() = 0; - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Test if screen saver on - /*! - Returns true iff the screen saver is currently active (showing). - */ - virtual bool isActive() const = 0; + //! Test if screen saver on + /*! + Returns true iff the screen saver is currently active (showing). + */ + virtual bool isActive() const = 0; - //@} + //@} }; diff --git a/src/lib/synergy/ISecondaryScreen.h b/src/lib/synergy/ISecondaryScreen.h index 007aeafd..1f4e25d5 100644 --- a/src/lib/synergy/ISecondaryScreen.h +++ b/src/lib/synergy/ISecondaryScreen.h @@ -30,32 +30,32 @@ secondary screen implementations. */ class ISecondaryScreen : public IInterface { public: - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Fake mouse press/release - /*! - Synthesize a press or release of mouse button \c id. - */ - virtual void fakeMouseButton(ButtonID id, bool press) = 0; + //! Fake mouse press/release + /*! + Synthesize a press or release of mouse button \c id. + */ + virtual void fakeMouseButton(ButtonID id, bool press) = 0; - //! Fake mouse move - /*! - Synthesize a mouse move to the absolute coordinates \c x,y. - */ - virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; + //! Fake mouse move + /*! + Synthesize a mouse move to the absolute coordinates \c x,y. + */ + virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; - //! Fake mouse move - /*! - Synthesize a mouse move to the relative coordinates \c dx,dy. - */ - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; + //! Fake mouse move + /*! + Synthesize a mouse move to the relative coordinates \c dx,dy. + */ + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; - //! Fake mouse wheel - /*! - Synthesize a mouse wheel event of amount \c xDelta and \c yDelta. - */ - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; + //! Fake mouse wheel + /*! + Synthesize a mouse wheel event of amount \c xDelta and \c yDelta. + */ + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; - //@} + //@} }; diff --git a/src/lib/synergy/KeyMap.cpp b/src/lib/synergy/KeyMap.cpp index 52c5deac..e2d3edb2 100644 --- a/src/lib/synergy/KeyMap.cpp +++ b/src/lib/synergy/KeyMap.cpp @@ -26,1277 +26,1277 @@ namespace synergy { -KeyMap::NameToKeyMap* KeyMap::s_nameToKeyMap = NULL; -KeyMap::NameToModifierMap* KeyMap::s_nameToModifierMap = NULL; -KeyMap::KeyToNameMap* KeyMap::s_keyToNameMap = NULL; -KeyMap::ModifierToNameMap* KeyMap::s_modifierToNameMap = NULL; +KeyMap::NameToKeyMap* KeyMap::s_nameToKeyMap = NULL; +KeyMap::NameToModifierMap* KeyMap::s_nameToModifierMap = NULL; +KeyMap::KeyToNameMap* KeyMap::s_keyToNameMap = NULL; +KeyMap::ModifierToNameMap* KeyMap::s_modifierToNameMap = NULL; KeyMap::KeyMap() : - m_numGroups(0), - m_composeAcrossGroups(false) + m_numGroups(0), + m_composeAcrossGroups(false) { - m_modifierKeyItem.m_id = kKeyNone; - m_modifierKeyItem.m_group = 0; - m_modifierKeyItem.m_button = 0; - m_modifierKeyItem.m_required = 0; - m_modifierKeyItem.m_sensitive = 0; - m_modifierKeyItem.m_generates = 0; - m_modifierKeyItem.m_dead = false; - m_modifierKeyItem.m_lock = false; - m_modifierKeyItem.m_client = 0; + m_modifierKeyItem.m_id = kKeyNone; + m_modifierKeyItem.m_group = 0; + m_modifierKeyItem.m_button = 0; + m_modifierKeyItem.m_required = 0; + m_modifierKeyItem.m_sensitive = 0; + m_modifierKeyItem.m_generates = 0; + m_modifierKeyItem.m_dead = false; + m_modifierKeyItem.m_lock = false; + m_modifierKeyItem.m_client = 0; } KeyMap::~KeyMap() { - // do nothing + // do nothing } void KeyMap::swap(KeyMap& x) { - m_keyIDMap.swap(x.m_keyIDMap); - m_modifierKeys.swap(x.m_modifierKeys); - m_halfDuplex.swap(x.m_halfDuplex); - m_halfDuplexMods.swap(x.m_halfDuplexMods); - SInt32 tmp1 = m_numGroups; - m_numGroups = x.m_numGroups; - x.m_numGroups = tmp1; - bool tmp2 = m_composeAcrossGroups; - m_composeAcrossGroups = x.m_composeAcrossGroups; - x.m_composeAcrossGroups = tmp2; + m_keyIDMap.swap(x.m_keyIDMap); + m_modifierKeys.swap(x.m_modifierKeys); + m_halfDuplex.swap(x.m_halfDuplex); + m_halfDuplexMods.swap(x.m_halfDuplexMods); + SInt32 tmp1 = m_numGroups; + m_numGroups = x.m_numGroups; + x.m_numGroups = tmp1; + bool tmp2 = m_composeAcrossGroups; + m_composeAcrossGroups = x.m_composeAcrossGroups; + x.m_composeAcrossGroups = tmp2; } void KeyMap::addKeyEntry(const KeyItem& item) { - // ignore kKeyNone - if (item.m_id == kKeyNone) { - return; - } + // ignore kKeyNone + if (item.m_id == kKeyNone) { + return; + } - // resize number of groups for key - SInt32 numGroups = item.m_group + 1; - if (getNumGroups() > numGroups) { - numGroups = getNumGroups(); - } - KeyGroupTable& groupTable = m_keyIDMap[item.m_id]; - if (groupTable.size() < static_cast(numGroups)) { - groupTable.resize(numGroups); - } + // resize number of groups for key + SInt32 numGroups = item.m_group + 1; + if (getNumGroups() > numGroups) { + numGroups = getNumGroups(); + } + KeyGroupTable& groupTable = m_keyIDMap[item.m_id]; + if (groupTable.size() < static_cast(numGroups)) { + groupTable.resize(numGroups); + } - // make a list from the item - KeyItemList items; - items.push_back(item); + // make a list from the item + KeyItemList items; + items.push_back(item); - // set group and dead key flag on the item - KeyItem& newItem = items.back(); - newItem.m_dead = isDeadKey(item.m_id); + // set group and dead key flag on the item + KeyItem& newItem = items.back(); + newItem.m_dead = isDeadKey(item.m_id); - // mask the required bits with the sensitive bits - newItem.m_required &= newItem.m_sensitive; + // mask the required bits with the sensitive bits + newItem.m_required &= newItem.m_sensitive; - // see if we already have this item; just return if so - KeyEntryList& entries = groupTable[item.m_group]; - for (size_t i = 0, n = entries.size(); i < n; ++i) { - if (entries[i].size() == 1 && newItem == entries[i][0]) { - return; - } - } + // see if we already have this item; just return if so + KeyEntryList& entries = groupTable[item.m_group]; + for (size_t i = 0, n = entries.size(); i < n; ++i) { + if (entries[i].size() == 1 && newItem == entries[i][0]) { + return; + } + } - // add item list - entries.push_back(items); - LOG((CLOG_DEBUG5 "add key: %04x %d %03x %04x (%04x %04x %04x)%s", newItem.m_id, newItem.m_group, newItem.m_button, newItem.m_client, newItem.m_required, newItem.m_sensitive, newItem.m_generates, newItem.m_dead ? " dead" : "")); + // add item list + entries.push_back(items); + LOG((CLOG_DEBUG5 "add key: %04x %d %03x %04x (%04x %04x %04x)%s", newItem.m_id, newItem.m_group, newItem.m_button, newItem.m_client, newItem.m_required, newItem.m_sensitive, newItem.m_generates, newItem.m_dead ? " dead" : "")); } void KeyMap::addKeyAliasEntry(KeyID targetID, SInt32 group, - KeyModifierMask targetRequired, - KeyModifierMask targetSensitive, - KeyID sourceID, - KeyModifierMask sourceRequired, - KeyModifierMask sourceSensitive) + KeyModifierMask targetRequired, + KeyModifierMask targetSensitive, + KeyID sourceID, + KeyModifierMask sourceRequired, + KeyModifierMask sourceSensitive) { - // if we can already generate the target as desired then we're done. - if (findCompatibleKey(targetID, group, targetRequired, - targetSensitive) != NULL) { - return; - } + // if we can already generate the target as desired then we're done. + if (findCompatibleKey(targetID, group, targetRequired, + targetSensitive) != NULL) { + return; + } - // find a compatible source, preferably in the same group - for (SInt32 gd = 0, n = getNumGroups(); gd < n; ++gd) { - SInt32 eg = getEffectiveGroup(group, gd); - const KeyItemList* sourceEntry = - findCompatibleKey(sourceID, eg, - sourceRequired, sourceSensitive); - if (sourceEntry != NULL && sourceEntry->size() == 1) { - KeyMap::KeyItem targetItem = sourceEntry->back(); - targetItem.m_id = targetID; - targetItem.m_group = eg; - addKeyEntry(targetItem); - break; - } - } + // find a compatible source, preferably in the same group + for (SInt32 gd = 0, n = getNumGroups(); gd < n; ++gd) { + SInt32 eg = getEffectiveGroup(group, gd); + const KeyItemList* sourceEntry = + findCompatibleKey(sourceID, eg, + sourceRequired, sourceSensitive); + if (sourceEntry != NULL && sourceEntry->size() == 1) { + KeyMap::KeyItem targetItem = sourceEntry->back(); + targetItem.m_id = targetID; + targetItem.m_group = eg; + addKeyEntry(targetItem); + break; + } + } } bool KeyMap::addKeyCombinationEntry(KeyID id, SInt32 group, - const KeyID* keys, UInt32 numKeys) + const KeyID* keys, UInt32 numKeys) { - // disallow kKeyNone - if (id == kKeyNone) { - return false; - } + // disallow kKeyNone + if (id == kKeyNone) { + return false; + } - SInt32 numGroups = group + 1; - if (getNumGroups() > numGroups) { - numGroups = getNumGroups(); - } - KeyGroupTable& groupTable = m_keyIDMap[id]; - if (groupTable.size() < static_cast(numGroups)) { - groupTable.resize(numGroups); - } - if (!groupTable[group].empty()) { - // key is already in the table - return false; - } + SInt32 numGroups = group + 1; + if (getNumGroups() > numGroups) { + numGroups = getNumGroups(); + } + KeyGroupTable& groupTable = m_keyIDMap[id]; + if (groupTable.size() < static_cast(numGroups)) { + groupTable.resize(numGroups); + } + if (!groupTable[group].empty()) { + // key is already in the table + return false; + } - // convert to buttons - KeyItemList items; - for (UInt32 i = 0; i < numKeys; ++i) { - KeyIDMap::const_iterator gtIndex = m_keyIDMap.find(keys[i]); - if (gtIndex == m_keyIDMap.end()) { - return false; - } - const KeyGroupTable& groupTable = gtIndex->second; + // convert to buttons + KeyItemList items; + for (UInt32 i = 0; i < numKeys; ++i) { + KeyIDMap::const_iterator gtIndex = m_keyIDMap.find(keys[i]); + if (gtIndex == m_keyIDMap.end()) { + return false; + } + const KeyGroupTable& groupTable = gtIndex->second; - // if we allow group switching during composition then search all - // groups for keys, otherwise search just the given group. - SInt32 n = 1; - if (m_composeAcrossGroups) { - n = (SInt32)groupTable.size(); - } + // if we allow group switching during composition then search all + // groups for keys, otherwise search just the given group. + SInt32 n = 1; + if (m_composeAcrossGroups) { + n = (SInt32)groupTable.size(); + } - bool found = false; - for (SInt32 gd = 0; gd < n && !found; ++gd) { - SInt32 eg = (group + gd) % getNumGroups(); - const KeyEntryList& entries = groupTable[eg]; - for (size_t j = 0; j < entries.size(); ++j) { - if (entries[j].size() == 1) { - found = true; - items.push_back(entries[j][0]); - break; - } - } - } - if (!found) { - // required key is not in keyboard group - return false; - } - } + bool found = false; + for (SInt32 gd = 0; gd < n && !found; ++gd) { + SInt32 eg = (group + gd) % getNumGroups(); + const KeyEntryList& entries = groupTable[eg]; + for (size_t j = 0; j < entries.size(); ++j) { + if (entries[j].size() == 1) { + found = true; + items.push_back(entries[j][0]); + break; + } + } + } + if (!found) { + // required key is not in keyboard group + return false; + } + } - // add key - groupTable[group].push_back(items); - return true; + // add key + groupTable[group].push_back(items); + return true; } void KeyMap::allowGroupSwitchDuringCompose() { - m_composeAcrossGroups = true; + m_composeAcrossGroups = true; } void KeyMap::addHalfDuplexButton(KeyButton button) { - m_halfDuplex.insert(button); + m_halfDuplex.insert(button); } void KeyMap::clearHalfDuplexModifiers() { - m_halfDuplexMods.clear(); + m_halfDuplexMods.clear(); } void KeyMap::addHalfDuplexModifier(KeyID key) { - m_halfDuplexMods.insert(key); + m_halfDuplexMods.insert(key); } void KeyMap::finish() { - m_numGroups = findNumGroups(); + m_numGroups = findNumGroups(); - // make sure every key has the same number of groups - for (KeyIDMap::iterator i = m_keyIDMap.begin(); - i != m_keyIDMap.end(); ++i) { - i->second.resize(m_numGroups); - } + // make sure every key has the same number of groups + for (KeyIDMap::iterator i = m_keyIDMap.begin(); + i != m_keyIDMap.end(); ++i) { + i->second.resize(m_numGroups); + } - // compute keys that generate each modifier - setModifierKeys(); + // compute keys that generate each modifier + setModifierKeys(); } void KeyMap::foreachKey(ForeachKeyCallback cb, void* userData) { - for (KeyIDMap::iterator i = m_keyIDMap.begin(); - i != m_keyIDMap.end(); ++i) { - KeyGroupTable& groupTable = i->second; - for (size_t group = 0; group < groupTable.size(); ++group) { - KeyEntryList& entryList = groupTable[group]; - for (size_t j = 0; j < entryList.size(); ++j) { - KeyItemList& itemList = entryList[j]; - for (size_t k = 0; k < itemList.size(); ++k) { - (*cb)(i->first, static_cast(group), - itemList[k], userData); - } - } - } - } + for (KeyIDMap::iterator i = m_keyIDMap.begin(); + i != m_keyIDMap.end(); ++i) { + KeyGroupTable& groupTable = i->second; + for (size_t group = 0; group < groupTable.size(); ++group) { + KeyEntryList& entryList = groupTable[group]; + for (size_t j = 0; j < entryList.size(); ++j) { + KeyItemList& itemList = entryList[j]; + for (size_t k = 0; k < itemList.size(); ++k) { + (*cb)(i->first, static_cast(group), + itemList[k], userData); + } + } + } + } } const KeyMap::KeyItem* KeyMap::mapKey(Keystrokes& keys, KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const { - LOG((CLOG_DEBUG1 "mapKey %04x (%d) with mask %04x, start state: %04x", id, id, desiredMask, currentState)); + LOG((CLOG_DEBUG1 "mapKey %04x (%d) with mask %04x, start state: %04x", id, id, desiredMask, currentState)); - // handle group change - if (id == kKeyNextGroup) { - keys.push_back(Keystroke(1, false, false)); - return NULL; - } - else if (id == kKeyPrevGroup) { - keys.push_back(Keystroke(-1, false, false)); - return NULL; - } + // handle group change + if (id == kKeyNextGroup) { + keys.push_back(Keystroke(1, false, false)); + return NULL; + } + else if (id == kKeyPrevGroup) { + keys.push_back(Keystroke(-1, false, false)); + return NULL; + } - const KeyItem* item; - switch (id) { - case kKeyShift_L: - case kKeyShift_R: - case kKeyControl_L: - case kKeyControl_R: - case kKeyAlt_L: - case kKeyAlt_R: - case kKeyMeta_L: - case kKeyMeta_R: - case kKeySuper_L: - case kKeySuper_R: - case kKeyAltGr: - case kKeyCapsLock: - case kKeyNumLock: - case kKeyScrollLock: - item = mapModifierKey(keys, id, group, activeModifiers, - currentState, desiredMask, isAutoRepeat); - break; + const KeyItem* item; + switch (id) { + case kKeyShift_L: + case kKeyShift_R: + case kKeyControl_L: + case kKeyControl_R: + case kKeyAlt_L: + case kKeyAlt_R: + case kKeyMeta_L: + case kKeyMeta_R: + case kKeySuper_L: + case kKeySuper_R: + case kKeyAltGr: + case kKeyCapsLock: + case kKeyNumLock: + case kKeyScrollLock: + item = mapModifierKey(keys, id, group, activeModifiers, + currentState, desiredMask, isAutoRepeat); + break; - case kKeySetModifiers: - if (!keysForModifierState(0, group, activeModifiers, currentState, - desiredMask, desiredMask, 0, keys)) { - LOG((CLOG_DEBUG1 "unable to set modifiers %04x", desiredMask)); - return NULL; - } - return &m_modifierKeyItem; + case kKeySetModifiers: + if (!keysForModifierState(0, group, activeModifiers, currentState, + desiredMask, desiredMask, 0, keys)) { + LOG((CLOG_DEBUG1 "unable to set modifiers %04x", desiredMask)); + return NULL; + } + return &m_modifierKeyItem; - case kKeyClearModifiers: - if (!keysForModifierState(0, group, activeModifiers, currentState, - currentState & ~desiredMask, - desiredMask, 0, keys)) { - LOG((CLOG_DEBUG1 "unable to clear modifiers %04x", desiredMask)); - return NULL; - } - return &m_modifierKeyItem; + case kKeyClearModifiers: + if (!keysForModifierState(0, group, activeModifiers, currentState, + currentState & ~desiredMask, + desiredMask, 0, keys)) { + LOG((CLOG_DEBUG1 "unable to clear modifiers %04x", desiredMask)); + return NULL; + } + return &m_modifierKeyItem; - default: - if (isCommand(desiredMask)) { - item = mapCommandKey(keys, id, group, activeModifiers, - currentState, desiredMask, isAutoRepeat); - } - else { - item = mapCharacterKey(keys, id, group, activeModifiers, - currentState, desiredMask, isAutoRepeat); - } - break; - } + default: + if (isCommand(desiredMask)) { + item = mapCommandKey(keys, id, group, activeModifiers, + currentState, desiredMask, isAutoRepeat); + } + else { + item = mapCharacterKey(keys, id, group, activeModifiers, + currentState, desiredMask, isAutoRepeat); + } + break; + } - if (item != NULL) { - LOG((CLOG_DEBUG1 "mapped to %03x, new state %04x", item->m_button, currentState)); - } - return item; + if (item != NULL) { + LOG((CLOG_DEBUG1 "mapped to %03x, new state %04x", item->m_button, currentState)); + } + return item; } SInt32 KeyMap::getNumGroups() const { - return m_numGroups; + return m_numGroups; } SInt32 KeyMap::getEffectiveGroup(SInt32 group, SInt32 offset) const { - return (group + offset + getNumGroups()) % getNumGroups(); + return (group + offset + getNumGroups()) % getNumGroups(); } const KeyMap::KeyItemList* KeyMap::findCompatibleKey(KeyID id, SInt32 group, - KeyModifierMask required, KeyModifierMask sensitive) const + KeyModifierMask required, KeyModifierMask sensitive) const { - assert(group >= 0 && group < getNumGroups()); + assert(group >= 0 && group < getNumGroups()); KeyIDMap::const_iterator i = m_keyIDMap.find(id); - if (i == m_keyIDMap.end()) { - return NULL; - } + if (i == m_keyIDMap.end()) { + return NULL; + } - const KeyEntryList& entries = i->second[group]; - for (size_t j = 0; j < entries.size(); ++j) { - if ((entries[j].back().m_sensitive & sensitive) == 0 || - (entries[j].back().m_required & sensitive) == - (required & sensitive)) { - return &entries[j]; - } - } + const KeyEntryList& entries = i->second[group]; + for (size_t j = 0; j < entries.size(); ++j) { + if ((entries[j].back().m_sensitive & sensitive) == 0 || + (entries[j].back().m_required & sensitive) == + (required & sensitive)) { + return &entries[j]; + } + } - return NULL; + return NULL; } bool KeyMap::isHalfDuplex(KeyID key, KeyButton button) const { - return (m_halfDuplex.count(button) + m_halfDuplexMods.count(key) > 0); + return (m_halfDuplex.count(button) + m_halfDuplexMods.count(key) > 0); } bool KeyMap::isCommand(KeyModifierMask mask) const { - return ((mask & getCommandModifiers()) != 0); + return ((mask & getCommandModifiers()) != 0); } KeyModifierMask KeyMap::getCommandModifiers() const { - // we currently treat ctrl, alt, meta and super as command modifiers. - // some platforms may have a more limited set (OS X only needs Alt) - // but this works anyway. - return KeyModifierControl | - KeyModifierAlt | - KeyModifierAltGr | - KeyModifierMeta | - KeyModifierSuper; + // we currently treat ctrl, alt, meta and super as command modifiers. + // some platforms may have a more limited set (OS X only needs Alt) + // but this works anyway. + return KeyModifierControl | + KeyModifierAlt | + KeyModifierAltGr | + KeyModifierMeta | + KeyModifierSuper; } void KeyMap::collectButtons(const ModifierToKeys& mods, ButtonToKeyMap& keys) { - keys.clear(); - for (ModifierToKeys::const_iterator i = mods.begin(); - i != mods.end(); ++i) { - keys.insert(std::make_pair(i->second.m_button, &i->second)); - } + keys.clear(); + for (ModifierToKeys::const_iterator i = mods.begin(); + i != mods.end(); ++i) { + keys.insert(std::make_pair(i->second.m_button, &i->second)); + } } void KeyMap::initModifierKey(KeyItem& item) { - item.m_generates = 0; - item.m_lock = false; - switch (item.m_id) { - case kKeyShift_L: - case kKeyShift_R: - item.m_generates = KeyModifierShift; - break; + item.m_generates = 0; + item.m_lock = false; + switch (item.m_id) { + case kKeyShift_L: + case kKeyShift_R: + item.m_generates = KeyModifierShift; + break; - case kKeyControl_L: - case kKeyControl_R: - item.m_generates = KeyModifierControl; - break; + case kKeyControl_L: + case kKeyControl_R: + item.m_generates = KeyModifierControl; + break; - case kKeyAlt_L: - case kKeyAlt_R: - item.m_generates = KeyModifierAlt; - break; + case kKeyAlt_L: + case kKeyAlt_R: + item.m_generates = KeyModifierAlt; + break; - case kKeyMeta_L: - case kKeyMeta_R: - item.m_generates = KeyModifierMeta; - break; + case kKeyMeta_L: + case kKeyMeta_R: + item.m_generates = KeyModifierMeta; + break; - case kKeySuper_L: - case kKeySuper_R: - item.m_generates = KeyModifierSuper; - break; + case kKeySuper_L: + case kKeySuper_R: + item.m_generates = KeyModifierSuper; + break; - case kKeyAltGr: - item.m_generates = KeyModifierAltGr; - break; + case kKeyAltGr: + item.m_generates = KeyModifierAltGr; + break; - case kKeyCapsLock: - item.m_generates = KeyModifierCapsLock; - item.m_lock = true; - break; + case kKeyCapsLock: + item.m_generates = KeyModifierCapsLock; + item.m_lock = true; + break; - case kKeyNumLock: - item.m_generates = KeyModifierNumLock; - item.m_lock = true; - break; + case kKeyNumLock: + item.m_generates = KeyModifierNumLock; + item.m_lock = true; + break; - case kKeyScrollLock: - item.m_generates = KeyModifierScrollLock; - item.m_lock = true; - break; + case kKeyScrollLock: + item.m_generates = KeyModifierScrollLock; + item.m_lock = true; + break; - default: - // not a modifier - break; - } + default: + // not a modifier + break; + } } SInt32 KeyMap::findNumGroups() const { - size_t max = 0; - for (KeyIDMap::const_iterator i = m_keyIDMap.begin(); - i != m_keyIDMap.end(); ++i) { - if (i->second.size() > max) { - max = i->second.size(); - } - } - return static_cast(max); + size_t max = 0; + for (KeyIDMap::const_iterator i = m_keyIDMap.begin(); + i != m_keyIDMap.end(); ++i) { + if (i->second.size() > max) { + max = i->second.size(); + } + } + return static_cast(max); } void KeyMap::setModifierKeys() { - m_modifierKeys.clear(); - m_modifierKeys.resize(kKeyModifierNumBits * getNumGroups()); - for (KeyIDMap::const_iterator i = m_keyIDMap.begin(); - i != m_keyIDMap.end(); ++i) { - const KeyGroupTable& groupTable = i->second; - for (size_t g = 0; g < groupTable.size(); ++g) { - const KeyEntryList& entries = groupTable[g]; - for (size_t j = 0; j < entries.size(); ++j) { - // skip multi-key sequences - if (entries[j].size() != 1) { - continue; - } + m_modifierKeys.clear(); + m_modifierKeys.resize(kKeyModifierNumBits * getNumGroups()); + for (KeyIDMap::const_iterator i = m_keyIDMap.begin(); + i != m_keyIDMap.end(); ++i) { + const KeyGroupTable& groupTable = i->second; + for (size_t g = 0; g < groupTable.size(); ++g) { + const KeyEntryList& entries = groupTable[g]; + for (size_t j = 0; j < entries.size(); ++j) { + // skip multi-key sequences + if (entries[j].size() != 1) { + continue; + } - // skip keys that don't generate a modifier - const KeyItem& item = entries[j].back(); - if (item.m_generates == 0) { - continue; - } + // skip keys that don't generate a modifier + const KeyItem& item = entries[j].back(); + if (item.m_generates == 0) { + continue; + } - // add key to each indicated modifier in this group - for (SInt32 b = 0; b < kKeyModifierNumBits; ++b) { - // skip if item doesn't generate bit b - if (((1u << b) & item.m_generates) != 0) { - SInt32 mIndex = (SInt32)g * kKeyModifierNumBits + b; - m_modifierKeys[mIndex].push_back(&item); - } - } - } - } - } + // add key to each indicated modifier in this group + for (SInt32 b = 0; b < kKeyModifierNumBits; ++b) { + // skip if item doesn't generate bit b + if (((1u << b) & item.m_generates) != 0) { + SInt32 mIndex = (SInt32)g * kKeyModifierNumBits + b; + m_modifierKeys[mIndex].push_back(&item); + } + } + } + } + } } const KeyMap::KeyItem* KeyMap::mapCommandKey(Keystrokes& keys, KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const { - static const KeyModifierMask s_overrideModifiers = 0xffffu; + static const KeyModifierMask s_overrideModifiers = 0xffffu; - // find KeySym in table - KeyIDMap::const_iterator i = m_keyIDMap.find(id); - if (i == m_keyIDMap.end()) { - // unknown key - LOG((CLOG_DEBUG1 "key %04x is not on keyboard", id)); - return NULL; - } - const KeyGroupTable& keyGroupTable = i->second; + // find KeySym in table + KeyIDMap::const_iterator i = m_keyIDMap.find(id); + if (i == m_keyIDMap.end()) { + // unknown key + LOG((CLOG_DEBUG1 "key %04x is not on keyboard", id)); + return NULL; + } + const KeyGroupTable& keyGroupTable = i->second; - // find the first key that generates this KeyID - const KeyItem* keyItem = NULL; - SInt32 numGroups = getNumGroups(); - for (SInt32 groupOffset = 0; groupOffset < numGroups; ++groupOffset) { - SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); - const KeyEntryList& entryList = keyGroupTable[effectiveGroup]; - for (size_t i = 0; i < entryList.size(); ++i) { - if (entryList[i].size() != 1) { - // ignore multikey entries - continue; - } + // find the first key that generates this KeyID + const KeyItem* keyItem = NULL; + SInt32 numGroups = getNumGroups(); + for (SInt32 groupOffset = 0; groupOffset < numGroups; ++groupOffset) { + SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); + const KeyEntryList& entryList = keyGroupTable[effectiveGroup]; + for (size_t i = 0; i < entryList.size(); ++i) { + if (entryList[i].size() != 1) { + // ignore multikey entries + continue; + } - // match based on shift and make sure all required modifiers, - // except shift, are already in the desired mask; we're - // after the right button not the right character. - // we'll use desiredMask as-is, overriding the key's required - // modifiers, when synthesizing this button. - const KeyItem& item = entryList[i].back(); - KeyModifierMask desiredShiftMask = KeyModifierShift & desiredMask; - KeyModifierMask requiredIgnoreShiftMask = item.m_required & ~KeyModifierShift; - if ((item.m_required & desiredShiftMask) == (item.m_sensitive & desiredShiftMask) && - ((requiredIgnoreShiftMask & desiredMask) == requiredIgnoreShiftMask)) { - LOG((CLOG_INFO "found key in group %d", effectiveGroup)); - keyItem = &item; - break; - } - } - if (keyItem != NULL) { - break; - } - } - if (keyItem == NULL) { - // no mapping for this keysym - LOG((CLOG_DEBUG1 "no mapping for key %04x", id)); - return NULL; - } + // match based on shift and make sure all required modifiers, + // except shift, are already in the desired mask; we're + // after the right button not the right character. + // we'll use desiredMask as-is, overriding the key's required + // modifiers, when synthesizing this button. + const KeyItem& item = entryList[i].back(); + KeyModifierMask desiredShiftMask = KeyModifierShift & desiredMask; + KeyModifierMask requiredIgnoreShiftMask = item.m_required & ~KeyModifierShift; + if ((item.m_required & desiredShiftMask) == (item.m_sensitive & desiredShiftMask) && + ((requiredIgnoreShiftMask & desiredMask) == requiredIgnoreShiftMask)) { + LOG((CLOG_INFO "found key in group %d", effectiveGroup)); + keyItem = &item; + break; + } + } + if (keyItem != NULL) { + break; + } + } + if (keyItem == NULL) { + // no mapping for this keysym + LOG((CLOG_DEBUG1 "no mapping for key %04x", id)); + return NULL; + } - // make working copy of modifiers - ModifierToKeys newModifiers = activeModifiers; - KeyModifierMask newState = currentState; - SInt32 newGroup = group; + // make working copy of modifiers + ModifierToKeys newModifiers = activeModifiers; + KeyModifierMask newState = currentState; + SInt32 newGroup = group; - // don't try to change CapsLock - desiredMask = (desiredMask & ~KeyModifierCapsLock) | - (currentState & KeyModifierCapsLock); + // don't try to change CapsLock + desiredMask = (desiredMask & ~KeyModifierCapsLock) | + (currentState & KeyModifierCapsLock); - // add the key - if (!keysForKeyItem(*keyItem, newGroup, newModifiers, - newState, desiredMask, - s_overrideModifiers, isAutoRepeat, keys)) { - LOG((CLOG_DEBUG1 "can't map key")); - keys.clear(); - return NULL; - } + // add the key + if (!keysForKeyItem(*keyItem, newGroup, newModifiers, + newState, desiredMask, + s_overrideModifiers, isAutoRepeat, keys)) { + LOG((CLOG_DEBUG1 "can't map key")); + keys.clear(); + return NULL; + } - // add keystrokes to restore modifier keys - if (!keysToRestoreModifiers(*keyItem, group, newModifiers, newState, - activeModifiers, keys)) { - LOG((CLOG_DEBUG1 "failed to restore modifiers")); - keys.clear(); - return NULL; - } + // add keystrokes to restore modifier keys + if (!keysToRestoreModifiers(*keyItem, group, newModifiers, newState, + activeModifiers, keys)) { + LOG((CLOG_DEBUG1 "failed to restore modifiers")); + keys.clear(); + return NULL; + } - // add keystrokes to restore group - if (newGroup != group) { - keys.push_back(Keystroke(group, true, true)); - } + // add keystrokes to restore group + if (newGroup != group) { + keys.push_back(Keystroke(group, true, true)); + } - // save new modifiers - activeModifiers = newModifiers; - currentState = newState; + // save new modifiers + activeModifiers = newModifiers; + currentState = newState; - return keyItem; + return keyItem; } const KeyMap::KeyItem* KeyMap::mapCharacterKey(Keystrokes& keys, KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const { - // find KeySym in table - KeyIDMap::const_iterator i = m_keyIDMap.find(id); - if (i == m_keyIDMap.end()) { - // unknown key - LOG((CLOG_DEBUG1 "key %04x is not on keyboard", id)); - return NULL; - } - const KeyGroupTable& keyGroupTable = i->second; + // find KeySym in table + KeyIDMap::const_iterator i = m_keyIDMap.find(id); + if (i == m_keyIDMap.end()) { + // unknown key + LOG((CLOG_DEBUG1 "key %04x is not on keyboard", id)); + return NULL; + } + const KeyGroupTable& keyGroupTable = i->second; - // find best key in any group, starting with the active group - SInt32 keyIndex = -1; - SInt32 numGroups = getNumGroups(); - SInt32 groupOffset; - LOG((CLOG_DEBUG1 "find best: %04x %04x", currentState, desiredMask)); - for (groupOffset = 0; groupOffset < numGroups; ++groupOffset) { - SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); - keyIndex = findBestKey(keyGroupTable[effectiveGroup], - currentState, desiredMask); - if (keyIndex != -1) { - LOG((CLOG_DEBUG1 "found key in group %d", effectiveGroup)); - break; - } - } - if (keyIndex == -1) { - // no mapping for this keysym - LOG((CLOG_DEBUG1 "no mapping for key %04x", id)); - return NULL; - } + // find best key in any group, starting with the active group + SInt32 keyIndex = -1; + SInt32 numGroups = getNumGroups(); + SInt32 groupOffset; + LOG((CLOG_DEBUG1 "find best: %04x %04x", currentState, desiredMask)); + for (groupOffset = 0; groupOffset < numGroups; ++groupOffset) { + SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); + keyIndex = findBestKey(keyGroupTable[effectiveGroup], + currentState, desiredMask); + if (keyIndex != -1) { + LOG((CLOG_DEBUG1 "found key in group %d", effectiveGroup)); + break; + } + } + if (keyIndex == -1) { + // no mapping for this keysym + LOG((CLOG_DEBUG1 "no mapping for key %04x", id)); + return NULL; + } - // get keys to press for key - SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); - const KeyItemList& itemList = keyGroupTable[effectiveGroup][keyIndex]; - if (itemList.empty()) { - return NULL; - } - const KeyItem& keyItem = itemList.back(); + // get keys to press for key + SInt32 effectiveGroup = getEffectiveGroup(group, groupOffset); + const KeyItemList& itemList = keyGroupTable[effectiveGroup][keyIndex]; + if (itemList.empty()) { + return NULL; + } + const KeyItem& keyItem = itemList.back(); - // make working copy of modifiers - ModifierToKeys newModifiers = activeModifiers; - KeyModifierMask newState = currentState; - SInt32 newGroup = group; + // make working copy of modifiers + ModifierToKeys newModifiers = activeModifiers; + KeyModifierMask newState = currentState; + SInt32 newGroup = group; - // add each key - for (size_t j = 0; j < itemList.size(); ++j) { - if (!keysForKeyItem(itemList[j], newGroup, newModifiers, - newState, desiredMask, - 0, isAutoRepeat, keys)) { - LOG((CLOG_DEBUG1 "can't map key")); - keys.clear(); - return NULL; - } - } + // add each key + for (size_t j = 0; j < itemList.size(); ++j) { + if (!keysForKeyItem(itemList[j], newGroup, newModifiers, + newState, desiredMask, + 0, isAutoRepeat, keys)) { + LOG((CLOG_DEBUG1 "can't map key")); + keys.clear(); + return NULL; + } + } - // add keystrokes to restore modifier keys - if (!keysToRestoreModifiers(keyItem, group, newModifiers, newState, - activeModifiers, keys)) { - LOG((CLOG_DEBUG1 "failed to restore modifiers")); - keys.clear(); - return NULL; - } + // add keystrokes to restore modifier keys + if (!keysToRestoreModifiers(keyItem, group, newModifiers, newState, + activeModifiers, keys)) { + LOG((CLOG_DEBUG1 "failed to restore modifiers")); + keys.clear(); + return NULL; + } - // add keystrokes to restore group - if (newGroup != group) { - keys.push_back(Keystroke(group, true, true)); - } + // add keystrokes to restore group + if (newGroup != group) { + keys.push_back(Keystroke(group, true, true)); + } - // save new modifiers - activeModifiers = newModifiers; - currentState = newState; + // save new modifiers + activeModifiers = newModifiers; + currentState = newState; - return &keyItem; + return &keyItem; } const KeyMap::KeyItem* KeyMap::mapModifierKey(Keystrokes& keys, KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const { - return mapCharacterKey(keys, id, group, activeModifiers, - currentState, desiredMask, isAutoRepeat); + return mapCharacterKey(keys, id, group, activeModifiers, + currentState, desiredMask, isAutoRepeat); } SInt32 KeyMap::findBestKey(const KeyEntryList& entryList, - KeyModifierMask /*currentState*/, - KeyModifierMask desiredState) const + KeyModifierMask /*currentState*/, + KeyModifierMask desiredState) const { - // check for an item that can accommodate the desiredState exactly - for (SInt32 i = 0; i < (SInt32)entryList.size(); ++i) { - const KeyItem& item = entryList[i].back(); - if ((item.m_required & desiredState) == item.m_required && - (item.m_required & desiredState) == (item.m_sensitive & desiredState)) { - LOG((CLOG_DEBUG1 "best key index %d of %d (exact)", i + 1, entryList.size())); - return i; - } - } + // check for an item that can accommodate the desiredState exactly + for (SInt32 i = 0; i < (SInt32)entryList.size(); ++i) { + const KeyItem& item = entryList[i].back(); + if ((item.m_required & desiredState) == item.m_required && + (item.m_required & desiredState) == (item.m_sensitive & desiredState)) { + LOG((CLOG_DEBUG1 "best key index %d of %d (exact)", i + 1, entryList.size())); + return i; + } + } - // choose the item that requires the fewest modifier changes - SInt32 bestCount = 32; - SInt32 bestIndex = -1; - for (SInt32 i = 0; i < (SInt32)entryList.size(); ++i) { - const KeyItem& item = entryList[i].back(); - KeyModifierMask change = - ((item.m_required ^ desiredState) & item.m_sensitive); - SInt32 n = getNumModifiers(change); - if (n < bestCount) { - bestCount = n; - bestIndex = i; - } - } - if (bestIndex != -1) { - LOG((CLOG_DEBUG1 "best key index %d of %d (%d modifiers)", - bestIndex + 1, entryList.size(), bestCount)); - } + // choose the item that requires the fewest modifier changes + SInt32 bestCount = 32; + SInt32 bestIndex = -1; + for (SInt32 i = 0; i < (SInt32)entryList.size(); ++i) { + const KeyItem& item = entryList[i].back(); + KeyModifierMask change = + ((item.m_required ^ desiredState) & item.m_sensitive); + SInt32 n = getNumModifiers(change); + if (n < bestCount) { + bestCount = n; + bestIndex = i; + } + } + if (bestIndex != -1) { + LOG((CLOG_DEBUG1 "best key index %d of %d (%d modifiers)", + bestIndex + 1, entryList.size(), bestCount)); + } - return bestIndex; + return bestIndex; } const KeyMap::KeyItem* KeyMap::keyForModifier(KeyButton button, SInt32 group, - SInt32 modifierBit) const + SInt32 modifierBit) const { - assert(modifierBit >= 0 && modifierBit < kKeyModifierNumBits); - assert(group >= 0 && group < getNumGroups()); + assert(modifierBit >= 0 && modifierBit < kKeyModifierNumBits); + assert(group >= 0 && group < getNumGroups()); - // find a key that generates the given modifier in the given group - // but doesn't use the given button, presumably because we're trying - // to generate a KeyID that's only bound the the given button. - // this is important when a shift button is modified by shift; we - // must use the other shift button to do the shifting. - const ModifierKeyItemList& items = - m_modifierKeys[group * kKeyModifierNumBits + modifierBit]; - for (ModifierKeyItemList::const_iterator i = items.begin(); - i != items.end(); ++i) { - if ((*i)->m_button != button) { - return (*i); - } - } - return NULL; + // find a key that generates the given modifier in the given group + // but doesn't use the given button, presumably because we're trying + // to generate a KeyID that's only bound the the given button. + // this is important when a shift button is modified by shift; we + // must use the other shift button to do the shifting. + const ModifierKeyItemList& items = + m_modifierKeys[group * kKeyModifierNumBits + modifierBit]; + for (ModifierKeyItemList::const_iterator i = items.begin(); + i != items.end(); ++i) { + if ((*i)->m_button != button) { + return (*i); + } + } + return NULL; } bool KeyMap::keysForKeyItem(const KeyItem& keyItem, SInt32& group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, KeyModifierMask desiredState, - KeyModifierMask overrideModifiers, - bool isAutoRepeat, - Keystrokes& keystrokes) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, KeyModifierMask desiredState, + KeyModifierMask overrideModifiers, + bool isAutoRepeat, + Keystrokes& keystrokes) const { - static const KeyModifierMask s_notRequiredMask = - KeyModifierAltGr | KeyModifierNumLock | KeyModifierScrollLock; + static const KeyModifierMask s_notRequiredMask = + KeyModifierAltGr | KeyModifierNumLock | KeyModifierScrollLock; - // add keystrokes to adjust the group - if (group != keyItem.m_group) { - group = keyItem.m_group; - keystrokes.push_back(Keystroke(group, true, false)); - } + // add keystrokes to adjust the group + if (group != keyItem.m_group) { + group = keyItem.m_group; + keystrokes.push_back(Keystroke(group, true, false)); + } - EKeystroke type; - if (keyItem.m_dead) { - // adjust modifiers for dead key - if (!keysForModifierState(keyItem.m_button, group, - activeModifiers, currentState, - keyItem.m_required, keyItem.m_sensitive, - 0, keystrokes)) { - LOG((CLOG_DEBUG1 "unable to match modifier state for dead key %d", keyItem.m_button)); - return false; - } + EKeystroke type; + if (keyItem.m_dead) { + // adjust modifiers for dead key + if (!keysForModifierState(keyItem.m_button, group, + activeModifiers, currentState, + keyItem.m_required, keyItem.m_sensitive, + 0, keystrokes)) { + LOG((CLOG_DEBUG1 "unable to match modifier state for dead key %d", keyItem.m_button)); + return false; + } - // press and release the dead key - type = kKeystrokeClick; - } - else { - // if this a command key then we don't have to match some of the - // key's required modifiers. - KeyModifierMask sensitive = keyItem.m_sensitive & ~overrideModifiers; + // press and release the dead key + type = kKeystrokeClick; + } + else { + // if this a command key then we don't have to match some of the + // key's required modifiers. + KeyModifierMask sensitive = keyItem.m_sensitive & ~overrideModifiers; - // XXX -- must handle pressing a modifier. in particular, if we want - // to synthesize a KeyID on level 1 of a KeyButton that has Shift_L - // mapped to level 0 then we must release that button if it's down - // (in order to satisfy a shift modifier) then press a different - // button (any other button) mapped to the shift modifier and then - // the Shift_L button. - // match key's required state - LOG((CLOG_DEBUG1 "state: %04x,%04x,%04x", currentState, keyItem.m_required, sensitive)); - if (!keysForModifierState(keyItem.m_button, group, - activeModifiers, currentState, - keyItem.m_required, sensitive, - 0, keystrokes)) { - LOG((CLOG_DEBUG1 "unable to match modifier state (%04x,%04x) for key %d", keyItem.m_required, keyItem.m_sensitive, keyItem.m_button)); - return false; - } + // XXX -- must handle pressing a modifier. in particular, if we want + // to synthesize a KeyID on level 1 of a KeyButton that has Shift_L + // mapped to level 0 then we must release that button if it's down + // (in order to satisfy a shift modifier) then press a different + // button (any other button) mapped to the shift modifier and then + // the Shift_L button. + // match key's required state + LOG((CLOG_DEBUG1 "state: %04x,%04x,%04x", currentState, keyItem.m_required, sensitive)); + if (!keysForModifierState(keyItem.m_button, group, + activeModifiers, currentState, + keyItem.m_required, sensitive, + 0, keystrokes)) { + LOG((CLOG_DEBUG1 "unable to match modifier state (%04x,%04x) for key %d", keyItem.m_required, keyItem.m_sensitive, keyItem.m_button)); + return false; + } - // match desiredState as closely as possible. we must not - // change any modifiers in keyItem.m_sensitive. and if the key - // is a modifier, we don't want to change that modifier. - LOG((CLOG_DEBUG1 "desired state: %04x %04x,%04x,%04x", desiredState, currentState, keyItem.m_required, keyItem.m_sensitive)); - if (!keysForModifierState(keyItem.m_button, group, - activeModifiers, currentState, - desiredState, - ~(sensitive | keyItem.m_generates), - s_notRequiredMask, keystrokes)) { - LOG((CLOG_DEBUG1 "unable to match desired modifier state (%04x,%04x) for key %d", desiredState, ~keyItem.m_sensitive & 0xffffu, keyItem.m_button)); - return false; - } + // match desiredState as closely as possible. we must not + // change any modifiers in keyItem.m_sensitive. and if the key + // is a modifier, we don't want to change that modifier. + LOG((CLOG_DEBUG1 "desired state: %04x %04x,%04x,%04x", desiredState, currentState, keyItem.m_required, keyItem.m_sensitive)); + if (!keysForModifierState(keyItem.m_button, group, + activeModifiers, currentState, + desiredState, + ~(sensitive | keyItem.m_generates), + s_notRequiredMask, keystrokes)) { + LOG((CLOG_DEBUG1 "unable to match desired modifier state (%04x,%04x) for key %d", desiredState, ~keyItem.m_sensitive & 0xffffu, keyItem.m_button)); + return false; + } - // repeat or press of key - type = isAutoRepeat ? kKeystrokeRepeat : kKeystrokePress; - } - addKeystrokes(type, keyItem, activeModifiers, currentState, keystrokes); + // repeat or press of key + type = isAutoRepeat ? kKeystrokeRepeat : kKeystrokePress; + } + addKeystrokes(type, keyItem, activeModifiers, currentState, keystrokes); - return true; + return true; } bool KeyMap::keysToRestoreModifiers(const KeyItem& keyItem, SInt32, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - const ModifierToKeys& desiredModifiers, - Keystrokes& keystrokes) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + const ModifierToKeys& desiredModifiers, + Keystrokes& keystrokes) const { - // XXX -- we're not considering modified modifiers here + // XXX -- we're not considering modified modifiers here - ModifierToKeys oldModifiers = activeModifiers; + ModifierToKeys oldModifiers = activeModifiers; - // get the pressed modifier buttons before and after - ButtonToKeyMap oldKeys, newKeys; - collectButtons(oldModifiers, oldKeys); - collectButtons(desiredModifiers, newKeys); + // get the pressed modifier buttons before and after + ButtonToKeyMap oldKeys, newKeys; + collectButtons(oldModifiers, oldKeys); + collectButtons(desiredModifiers, newKeys); - // release unwanted keys - for (ModifierToKeys::const_iterator i = oldModifiers.begin(); - i != oldModifiers.end(); ++i) { - KeyButton button = i->second.m_button; - if (button != keyItem.m_button && newKeys.count(button) == 0) { - EKeystroke type = kKeystrokeRelease; - if (i->second.m_lock) { - type = kKeystrokeUnmodify; - } - addKeystrokes(type, i->second, - activeModifiers, currentState, keystrokes); - } - } + // release unwanted keys + for (ModifierToKeys::const_iterator i = oldModifiers.begin(); + i != oldModifiers.end(); ++i) { + KeyButton button = i->second.m_button; + if (button != keyItem.m_button && newKeys.count(button) == 0) { + EKeystroke type = kKeystrokeRelease; + if (i->second.m_lock) { + type = kKeystrokeUnmodify; + } + addKeystrokes(type, i->second, + activeModifiers, currentState, keystrokes); + } + } - // press wanted keys - for (ModifierToKeys::const_iterator i = desiredModifiers.begin(); - i != desiredModifiers.end(); ++i) { - KeyButton button = i->second.m_button; - if (button != keyItem.m_button && oldKeys.count(button) == 0) { - EKeystroke type = kKeystrokePress; - if (i->second.m_lock) { - type = kKeystrokeModify; - } - addKeystrokes(type, i->second, - activeModifiers, currentState, keystrokes); - } - } + // press wanted keys + for (ModifierToKeys::const_iterator i = desiredModifiers.begin(); + i != desiredModifiers.end(); ++i) { + KeyButton button = i->second.m_button; + if (button != keyItem.m_button && oldKeys.count(button) == 0) { + EKeystroke type = kKeystrokePress; + if (i->second.m_lock) { + type = kKeystrokeModify; + } + addKeystrokes(type, i->second, + activeModifiers, currentState, keystrokes); + } + } - return true; + return true; } bool KeyMap::keysForModifierState(KeyButton button, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask requiredState, KeyModifierMask sensitiveMask, - KeyModifierMask notRequiredMask, - Keystrokes& keystrokes) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask requiredState, KeyModifierMask sensitiveMask, + KeyModifierMask notRequiredMask, + Keystrokes& keystrokes) const { - // compute which modifiers need changing - KeyModifierMask flipMask = ((currentState ^ requiredState) & sensitiveMask); - // if a modifier is not required then don't even try to match it. if - // we don't mask out notRequiredMask then we'll try to match those - // modifiers but succeed if we can't. however, this is known not - // to work if the key itself is a modifier (the numlock toggle can - // interfere) so we don't try to match at all. - flipMask &= ~notRequiredMask; - LOG((CLOG_DEBUG1 "flip: %04x (%04x vs %04x in %04x - %04x)", flipMask, currentState, requiredState, sensitiveMask & 0xffffu, notRequiredMask & 0xffffu)); - if (flipMask == 0) { - return true; - } + // compute which modifiers need changing + KeyModifierMask flipMask = ((currentState ^ requiredState) & sensitiveMask); + // if a modifier is not required then don't even try to match it. if + // we don't mask out notRequiredMask then we'll try to match those + // modifiers but succeed if we can't. however, this is known not + // to work if the key itself is a modifier (the numlock toggle can + // interfere) so we don't try to match at all. + flipMask &= ~notRequiredMask; + LOG((CLOG_DEBUG1 "flip: %04x (%04x vs %04x in %04x - %04x)", flipMask, currentState, requiredState, sensitiveMask & 0xffffu, notRequiredMask & 0xffffu)); + if (flipMask == 0) { + return true; + } - // fix modifiers. this is complicated by the fact that a modifier may - // be sensitive to other modifiers! (who thought that up?) - // - // we'll assume that modifiers with higher bits are affected by modifiers - // with lower bits. there's not much basis for that assumption except - // that we're pretty sure shift isn't changed by other modifiers. - for (SInt32 bit = kKeyModifierNumBits; bit-- > 0; ) { - KeyModifierMask mask = (1u << bit); - if ((flipMask & mask) == 0) { - // modifier is already correct - continue; - } + // fix modifiers. this is complicated by the fact that a modifier may + // be sensitive to other modifiers! (who thought that up?) + // + // we'll assume that modifiers with higher bits are affected by modifiers + // with lower bits. there's not much basis for that assumption except + // that we're pretty sure shift isn't changed by other modifiers. + for (SInt32 bit = kKeyModifierNumBits; bit-- > 0; ) { + KeyModifierMask mask = (1u << bit); + if ((flipMask & mask) == 0) { + // modifier is already correct + continue; + } - // do we want the modifier active or inactive? - bool active = ((requiredState & mask) != 0); + // do we want the modifier active or inactive? + bool active = ((requiredState & mask) != 0); - // get the KeyItem for the modifier in the group - const KeyItem* keyItem = keyForModifier(button, group, bit); - if (keyItem == NULL) { - if ((mask & notRequiredMask) == 0) { - LOG((CLOG_DEBUG1 "no key for modifier %04x", mask)); - return false; - } - else { - continue; - } - } + // get the KeyItem for the modifier in the group + const KeyItem* keyItem = keyForModifier(button, group, bit); + if (keyItem == NULL) { + if ((mask & notRequiredMask) == 0) { + LOG((CLOG_DEBUG1 "no key for modifier %04x", mask)); + return false; + } + else { + continue; + } + } - // if this modifier is sensitive to modifiers then adjust those - // modifiers. also check if our assumption was correct. note - // that we only need to adjust the modifiers on key down. - KeyModifierMask sensitive = keyItem->m_sensitive; - if ((sensitive & mask) != 0) { - // modifier is sensitive to itself. that makes no sense - // so ignore it. - LOG((CLOG_DEBUG1 "modifier %04x modified by itself", mask)); - sensitive &= ~mask; - } - if (sensitive != 0) { - if (sensitive > mask) { - // our assumption is incorrect - LOG((CLOG_DEBUG1 "modifier %04x modified by %04x", mask, sensitive)); - return false; - } - if (active && !keysForModifierState(button, group, - activeModifiers, currentState, - keyItem->m_required, sensitive, - notRequiredMask, keystrokes)) { - return false; - } - else if (!active) { - // release the modifier - // XXX -- this doesn't work! if Alt and Meta are mapped - // to one key and we want to release Meta we can't do - // that without also releasing Alt. - // need to think about support for modified modifiers. - } - } + // if this modifier is sensitive to modifiers then adjust those + // modifiers. also check if our assumption was correct. note + // that we only need to adjust the modifiers on key down. + KeyModifierMask sensitive = keyItem->m_sensitive; + if ((sensitive & mask) != 0) { + // modifier is sensitive to itself. that makes no sense + // so ignore it. + LOG((CLOG_DEBUG1 "modifier %04x modified by itself", mask)); + sensitive &= ~mask; + } + if (sensitive != 0) { + if (sensitive > mask) { + // our assumption is incorrect + LOG((CLOG_DEBUG1 "modifier %04x modified by %04x", mask, sensitive)); + return false; + } + if (active && !keysForModifierState(button, group, + activeModifiers, currentState, + keyItem->m_required, sensitive, + notRequiredMask, keystrokes)) { + return false; + } + else if (!active) { + // release the modifier + // XXX -- this doesn't work! if Alt and Meta are mapped + // to one key and we want to release Meta we can't do + // that without also releasing Alt. + // need to think about support for modified modifiers. + } + } - // current state should match required state - if ((currentState & sensitive) != (keyItem->m_required & sensitive)) { - LOG((CLOG_DEBUG1 "unable to match modifier state for modifier %04x (%04x vs %04x in %04x)", mask, currentState, keyItem->m_required, sensitive)); - return false; - } + // current state should match required state + if ((currentState & sensitive) != (keyItem->m_required & sensitive)) { + LOG((CLOG_DEBUG1 "unable to match modifier state for modifier %04x (%04x vs %04x in %04x)", mask, currentState, keyItem->m_required, sensitive)); + return false; + } - // add keystrokes - EKeystroke type = active ? kKeystrokeModify : kKeystrokeUnmodify; - addKeystrokes(type, *keyItem, activeModifiers, currentState, - keystrokes); - } + // add keystrokes + EKeystroke type = active ? kKeystrokeModify : kKeystrokeUnmodify; + addKeystrokes(type, *keyItem, activeModifiers, currentState, + keystrokes); + } - return true; + return true; } void KeyMap::addKeystrokes(EKeystroke type, const KeyItem& keyItem, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - Keystrokes& keystrokes) const + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + Keystrokes& keystrokes) const { - KeyButton button = keyItem.m_button; - UInt32 data = keyItem.m_client; - switch (type) { - case kKeystrokePress: - keystrokes.push_back(Keystroke(button, true, false, data)); - if (keyItem.m_generates != 0) { - if (!keyItem.m_lock || (currentState & keyItem.m_generates) == 0) { - // add modifier key and activate modifier - activeModifiers.insert(std::make_pair( - keyItem.m_generates, keyItem)); - currentState |= keyItem.m_generates; - } - else { - // deactivate locking modifier - activeModifiers.erase(keyItem.m_generates); - currentState &= ~keyItem.m_generates; - } - } - break; - - case kKeystrokeRelease: - keystrokes.push_back(Keystroke(button, false, false, data)); - if (keyItem.m_generates != 0 && !keyItem.m_lock) { - // remove key from active modifiers - std::pair range = - activeModifiers.equal_range(keyItem.m_generates); - for (ModifierToKeys::iterator i = range.first; - i != range.second; ++i) { - if (i->second.m_button == button) { - activeModifiers.erase(i); - break; - } - } + KeyButton button = keyItem.m_button; + UInt32 data = keyItem.m_client; + switch (type) { + case kKeystrokePress: + keystrokes.push_back(Keystroke(button, true, false, data)); + if (keyItem.m_generates != 0) { + if (!keyItem.m_lock || (currentState & keyItem.m_generates) == 0) { + // add modifier key and activate modifier + activeModifiers.insert(std::make_pair( + keyItem.m_generates, keyItem)); + currentState |= keyItem.m_generates; + } + else { + // deactivate locking modifier + activeModifiers.erase(keyItem.m_generates); + currentState &= ~keyItem.m_generates; + } + } + break; + + case kKeystrokeRelease: + keystrokes.push_back(Keystroke(button, false, false, data)); + if (keyItem.m_generates != 0 && !keyItem.m_lock) { + // remove key from active modifiers + std::pair range = + activeModifiers.equal_range(keyItem.m_generates); + for (ModifierToKeys::iterator i = range.first; + i != range.second; ++i) { + if (i->second.m_button == button) { + activeModifiers.erase(i); + break; + } + } - // if no more keys for this modifier then deactivate modifier - if (activeModifiers.count(keyItem.m_generates) == 0) { - currentState &= ~keyItem.m_generates; - } - } - break; - - case kKeystrokeRepeat: - keystrokes.push_back(Keystroke(button, false, true, data)); - keystrokes.push_back(Keystroke(button, true, true, data)); - // no modifier changes on key repeat - break; - - case kKeystrokeClick: - keystrokes.push_back(Keystroke(button, true, false, data)); - keystrokes.push_back(Keystroke(button, false, false, data)); - // no modifier changes on key click - break; - - case kKeystrokeModify: - case kKeystrokeUnmodify: - if (keyItem.m_lock) { - // we assume there's just one button for this modifier - if (m_halfDuplex.count(button) > 0) { - if (type == kKeystrokeModify) { - // turn half-duplex toggle on (press) - keystrokes.push_back(Keystroke(button, true, false, data)); - } - else { - // turn half-duplex toggle off (release) - keystrokes.push_back(Keystroke(button, false, false, data)); - } - } - else { - // toggle (click) - keystrokes.push_back(Keystroke(button, true, false, data)); - keystrokes.push_back(Keystroke(button, false, false, data)); - } - } - else if (type == kKeystrokeModify) { - // press modifier - keystrokes.push_back(Keystroke(button, true, false, data)); - } - else { - // release all the keys that generate the modifier that are - // currently down - std::pair range = - activeModifiers.equal_range(keyItem.m_generates); - for (ModifierToKeys::const_iterator i = range.first; - i != range.second; ++i) { - keystrokes.push_back(Keystroke(i->second.m_button, - false, false, i->second.m_client)); - } - } + // if no more keys for this modifier then deactivate modifier + if (activeModifiers.count(keyItem.m_generates) == 0) { + currentState &= ~keyItem.m_generates; + } + } + break; + + case kKeystrokeRepeat: + keystrokes.push_back(Keystroke(button, false, true, data)); + keystrokes.push_back(Keystroke(button, true, true, data)); + // no modifier changes on key repeat + break; + + case kKeystrokeClick: + keystrokes.push_back(Keystroke(button, true, false, data)); + keystrokes.push_back(Keystroke(button, false, false, data)); + // no modifier changes on key click + break; + + case kKeystrokeModify: + case kKeystrokeUnmodify: + if (keyItem.m_lock) { + // we assume there's just one button for this modifier + if (m_halfDuplex.count(button) > 0) { + if (type == kKeystrokeModify) { + // turn half-duplex toggle on (press) + keystrokes.push_back(Keystroke(button, true, false, data)); + } + else { + // turn half-duplex toggle off (release) + keystrokes.push_back(Keystroke(button, false, false, data)); + } + } + else { + // toggle (click) + keystrokes.push_back(Keystroke(button, true, false, data)); + keystrokes.push_back(Keystroke(button, false, false, data)); + } + } + else if (type == kKeystrokeModify) { + // press modifier + keystrokes.push_back(Keystroke(button, true, false, data)); + } + else { + // release all the keys that generate the modifier that are + // currently down + std::pair range = + activeModifiers.equal_range(keyItem.m_generates); + for (ModifierToKeys::const_iterator i = range.first; + i != range.second; ++i) { + keystrokes.push_back(Keystroke(i->second.m_button, + false, false, i->second.m_client)); + } + } - if (type == kKeystrokeModify) { - activeModifiers.insert(std::make_pair( - keyItem.m_generates, keyItem)); - currentState |= keyItem.m_generates; - } - else { - activeModifiers.erase(keyItem.m_generates); - currentState &= ~keyItem.m_generates; - } - break; - } + if (type == kKeystrokeModify) { + activeModifiers.insert(std::make_pair( + keyItem.m_generates, keyItem)); + currentState |= keyItem.m_generates; + } + else { + activeModifiers.erase(keyItem.m_generates); + currentState &= ~keyItem.m_generates; + } + break; + } } SInt32 KeyMap::getNumModifiers(KeyModifierMask state) { - SInt32 n = 0; - for (; state != 0; state >>= 1) { - if ((state & 1) != 0) { - ++n; - } - } - return n; + SInt32 n = 0; + for (; state != 0; state >>= 1) { + if ((state & 1) != 0) { + ++n; + } + } + return n; } bool KeyMap::isDeadKey(KeyID key) { - return (key == kKeyCompose || (key >= 0x0300 && key <= 0x036f)); + return (key == kKeyCompose || (key >= 0x0300 && key <= 0x036f)); } KeyID KeyMap::getDeadKey(KeyID key) { - if (isDeadKey(key)) { - // already dead - return key; - } + if (isDeadKey(key)) { + // already dead + return key; + } - switch (key) { - case '`': - return kKeyDeadGrave; + switch (key) { + case '`': + return kKeyDeadGrave; - case 0xb4u: - return kKeyDeadAcute; + case 0xb4u: + return kKeyDeadAcute; - case '^': - case 0x2c6: - return kKeyDeadCircumflex; + case '^': + case 0x2c6: + return kKeyDeadCircumflex; - case '~': - case 0x2dcu: - return kKeyDeadTilde; + case '~': + case 0x2dcu: + return kKeyDeadTilde; - case 0xafu: - return kKeyDeadMacron; + case 0xafu: + return kKeyDeadMacron; - case 0x2d8u: - return kKeyDeadBreve; + case 0x2d8u: + return kKeyDeadBreve; - case 0x2d9u: - return kKeyDeadAbovedot; + case 0x2d9u: + return kKeyDeadAbovedot; - case 0xa8u: - return kKeyDeadDiaeresis; + case 0xa8u: + return kKeyDeadDiaeresis; - case 0xb0u: - case 0x2dau: - return kKeyDeadAbovering; + case 0xb0u: + case 0x2dau: + return kKeyDeadAbovering; - case '\"': - case 0x2ddu: - return kKeyDeadDoubleacute; + case '\"': + case 0x2ddu: + return kKeyDeadDoubleacute; - case 0x2c7u: - return kKeyDeadCaron; + case 0x2c7u: + return kKeyDeadCaron; - case 0xb8u: - return kKeyDeadCedilla; + case 0xb8u: + return kKeyDeadCedilla; - case 0x2dbu: - return kKeyDeadOgonek; + case 0x2dbu: + return kKeyDeadOgonek; - default: - // unknown - return kKeyNone; - } + default: + // unknown + return kKeyNone; + } } String KeyMap::formatKey(KeyID key, KeyModifierMask mask) { - // initialize tables - initKeyNameMaps(); + // initialize tables + initKeyNameMaps(); - String x; - for (SInt32 i = 0; i < kKeyModifierNumBits; ++i) { - KeyModifierMask mod = (1u << i); - if ((mask & mod) != 0 && s_modifierToNameMap->count(mod) > 0) { - x += s_modifierToNameMap->find(mod)->second; - x += "+"; - } - } - if (key != kKeyNone) { - if (s_keyToNameMap->count(key) > 0) { - x += s_keyToNameMap->find(key)->second; - } - // XXX -- we're assuming ASCII here - else if (key >= 33 && key < 127) { - x += (char)key; - } - else { - x += synergy::string::sprintf("\\u%04x", key); - } - } - else if (!x.empty()) { - // remove trailing '+' - x.erase(x.size() - 1); - } - return x; + String x; + for (SInt32 i = 0; i < kKeyModifierNumBits; ++i) { + KeyModifierMask mod = (1u << i); + if ((mask & mod) != 0 && s_modifierToNameMap->count(mod) > 0) { + x += s_modifierToNameMap->find(mod)->second; + x += "+"; + } + } + if (key != kKeyNone) { + if (s_keyToNameMap->count(key) > 0) { + x += s_keyToNameMap->find(key)->second; + } + // XXX -- we're assuming ASCII here + else if (key >= 33 && key < 127) { + x += (char)key; + } + else { + x += synergy::string::sprintf("\\u%04x", key); + } + } + else if (!x.empty()) { + // remove trailing '+' + x.erase(x.size() - 1); + } + return x; } bool KeyMap::parseKey(const String& x, KeyID& key) { - // initialize tables - initKeyNameMaps(); + // initialize tables + initKeyNameMaps(); - // parse the key - key = kKeyNone; - if (s_nameToKeyMap->count(x) > 0) { - key = s_nameToKeyMap->find(x)->second; - } - // XXX -- we're assuming ASCII encoding here - else if (x.size() == 1) { - if (!isgraph(x[0])) { - // unknown key - return false; - } - key = (KeyID)x[0]; - } - else if (x.size() == 6 && x[0] == '\\' && x[1] == 'u') { - // escaped unicode (\uXXXX where XXXX is a hex number) - char* end; - key = (KeyID)strtol(x.c_str() + 2, &end, 16); - if (*end != '\0') { - return false; - } - } - else if (!x.empty()) { - // unknown key - return false; - } + // parse the key + key = kKeyNone; + if (s_nameToKeyMap->count(x) > 0) { + key = s_nameToKeyMap->find(x)->second; + } + // XXX -- we're assuming ASCII encoding here + else if (x.size() == 1) { + if (!isgraph(x[0])) { + // unknown key + return false; + } + key = (KeyID)x[0]; + } + else if (x.size() == 6 && x[0] == '\\' && x[1] == 'u') { + // escaped unicode (\uXXXX where XXXX is a hex number) + char* end; + key = (KeyID)strtol(x.c_str() + 2, &end, 16); + if (*end != '\0') { + return false; + } + } + else if (!x.empty()) { + // unknown key + return false; + } - return true; + return true; } bool KeyMap::parseModifiers(String& x, KeyModifierMask& mask) { - // initialize tables - initKeyNameMaps(); + // initialize tables + initKeyNameMaps(); - mask = 0; - String::size_type tb = x.find_first_not_of(" \t", 0); - while (tb != String::npos) { - // get next component - String::size_type te = x.find_first_of(" \t+)", tb); - if (te == String::npos) { - te = x.size(); - } - String c = x.substr(tb, te - tb); - if (c.empty()) { - // missing component - return false; - } + mask = 0; + String::size_type tb = x.find_first_not_of(" \t", 0); + while (tb != String::npos) { + // get next component + String::size_type te = x.find_first_of(" \t+)", tb); + if (te == String::npos) { + te = x.size(); + } + String c = x.substr(tb, te - tb); + if (c.empty()) { + // missing component + return false; + } - if (s_nameToModifierMap->count(c) > 0) { - KeyModifierMask mod = s_nameToModifierMap->find(c)->second; - if ((mask & mod) != 0) { - // modifier appears twice - return false; - } - mask |= mod; - } - else { - // unknown string - x.erase(0, tb); - String::size_type tb = x.find_first_not_of(" \t"); - String::size_type te = x.find_last_not_of(" \t"); - if (tb == String::npos) { - x = ""; - } - else { - x = x.substr(tb, te - tb + 1); - } - return true; - } + if (s_nameToModifierMap->count(c) > 0) { + KeyModifierMask mod = s_nameToModifierMap->find(c)->second; + if ((mask & mod) != 0) { + // modifier appears twice + return false; + } + mask |= mod; + } + else { + // unknown string + x.erase(0, tb); + String::size_type tb = x.find_first_not_of(" \t"); + String::size_type te = x.find_last_not_of(" \t"); + if (tb == String::npos) { + x = ""; + } + else { + x = x.substr(tb, te - tb + 1); + } + return true; + } - // check for '+' or end of string - tb = x.find_first_not_of(" \t", te); - if (tb != String::npos) { - if (x[tb] != '+') { - // expected '+' - return false; - } - tb = x.find_first_not_of(" \t", tb + 1); - } - } + // check for '+' or end of string + tb = x.find_first_not_of(" \t", te); + if (tb != String::npos) { + if (x[tb] != '+') { + // expected '+' + return false; + } + tb = x.find_first_not_of(" \t", tb + 1); + } + } - // parsed the whole thing - x = ""; - return true; + // parsed the whole thing + x = ""; + return true; } void KeyMap::initKeyNameMaps() { - // initialize tables - if (s_nameToKeyMap == NULL) { - s_nameToKeyMap = new NameToKeyMap; - s_keyToNameMap = new KeyToNameMap; - for (const KeyNameMapEntry* i = kKeyNameMap; i->m_name != NULL; ++i) { - (*s_nameToKeyMap)[i->m_name] = i->m_id; - (*s_keyToNameMap)[i->m_id] = i->m_name; - } - } - if (s_nameToModifierMap == NULL) { - s_nameToModifierMap = new NameToModifierMap; - s_modifierToNameMap = new ModifierToNameMap; - for (const KeyModifierNameMapEntry* i = kModifierNameMap; - i->m_name != NULL; ++i) { - (*s_nameToModifierMap)[i->m_name] = i->m_mask; - (*s_modifierToNameMap)[i->m_mask] = i->m_name; - } - } + // initialize tables + if (s_nameToKeyMap == NULL) { + s_nameToKeyMap = new NameToKeyMap; + s_keyToNameMap = new KeyToNameMap; + for (const KeyNameMapEntry* i = kKeyNameMap; i->m_name != NULL; ++i) { + (*s_nameToKeyMap)[i->m_name] = i->m_id; + (*s_keyToNameMap)[i->m_id] = i->m_name; + } + } + if (s_nameToModifierMap == NULL) { + s_nameToModifierMap = new NameToModifierMap; + s_modifierToNameMap = new ModifierToNameMap; + for (const KeyModifierNameMapEntry* i = kModifierNameMap; + i->m_name != NULL; ++i) { + (*s_nameToModifierMap)[i->m_name] = i->m_mask; + (*s_modifierToNameMap)[i->m_mask] = i->m_name; + } + } } @@ -1307,15 +1307,15 @@ KeyMap::initKeyNameMaps() bool KeyMap::KeyItem::operator==(const KeyItem& x) const { - return (m_id == x.m_id && - m_group == x.m_group && - m_button == x.m_button && - m_required == x.m_required && - m_sensitive == x.m_sensitive && - m_generates == x.m_generates && - m_dead == x.m_dead && - m_lock == x.m_lock && - m_client == x.m_client); + return (m_id == x.m_id && + m_group == x.m_group && + m_button == x.m_button && + m_required == x.m_required && + m_sensitive == x.m_sensitive && + m_generates == x.m_generates && + m_dead == x.m_dead && + m_lock == x.m_lock && + m_client == x.m_client); } @@ -1324,21 +1324,21 @@ KeyMap::KeyItem::operator==(const KeyItem& x) const // KeyMap::Keystroke::Keystroke(KeyButton button, - bool press, bool repeat, UInt32 data) : - m_type(kButton) + bool press, bool repeat, UInt32 data) : + m_type(kButton) { - m_data.m_button.m_button = button; - m_data.m_button.m_press = press; - m_data.m_button.m_repeat = repeat; - m_data.m_button.m_client = data; + m_data.m_button.m_button = button; + m_data.m_button.m_press = press; + m_data.m_button.m_repeat = repeat; + m_data.m_button.m_client = data; } KeyMap::Keystroke::Keystroke(SInt32 group, bool absolute, bool restore) : - m_type(kGroup) + m_type(kGroup) { - m_data.m_group.m_group = group; - m_data.m_group.m_absolute = absolute; - m_data.m_group.m_restore = restore; + m_data.m_group.m_group = group; + m_data.m_group.m_absolute = absolute; + m_data.m_group.m_restore = restore; } } diff --git a/src/lib/synergy/KeyMap.h b/src/lib/synergy/KeyMap.h index de869e68..8de5e2b5 100644 --- a/src/lib/synergy/KeyMap.h +++ b/src/lib/synergy/KeyMap.h @@ -34,479 +34,479 @@ This class provides a keyboard mapping. */ class KeyMap { public: - KeyMap(); - virtual ~KeyMap(); + KeyMap(); + virtual ~KeyMap(); - //! KeyID synthesis info - /*! - This structure contains the information necessary to synthesize a - keystroke that generates a KeyID (stored elsewhere). \c m_sensitive - lists the modifiers that the key is affected by and must therefore - be in the correct state, which is listed in \c m_required. If the - key is mapped to a modifier, that modifier is in \c m_generates and - is not in \c m_sensitive. - */ - struct KeyItem { - public: - KeyID m_id; //!< KeyID - SInt32 m_group; //!< Group for key - KeyButton m_button; //!< Button to generate KeyID - KeyModifierMask m_required; //!< Modifiers required for KeyID - KeyModifierMask m_sensitive; //!< Modifiers key is sensitive to - KeyModifierMask m_generates; //!< Modifiers key is mapped to - bool m_dead; //!< \c true if this is a dead KeyID - bool m_lock; //!< \c true if this locks a modifier - UInt32 m_client; //!< Client data + //! KeyID synthesis info + /*! + This structure contains the information necessary to synthesize a + keystroke that generates a KeyID (stored elsewhere). \c m_sensitive + lists the modifiers that the key is affected by and must therefore + be in the correct state, which is listed in \c m_required. If the + key is mapped to a modifier, that modifier is in \c m_generates and + is not in \c m_sensitive. + */ + struct KeyItem { + public: + KeyID m_id; //!< KeyID + SInt32 m_group; //!< Group for key + KeyButton m_button; //!< Button to generate KeyID + KeyModifierMask m_required; //!< Modifiers required for KeyID + KeyModifierMask m_sensitive; //!< Modifiers key is sensitive to + KeyModifierMask m_generates; //!< Modifiers key is mapped to + bool m_dead; //!< \c true if this is a dead KeyID + bool m_lock; //!< \c true if this locks a modifier + UInt32 m_client; //!< Client data - public: - bool operator==(const KeyItem&) const; - }; + public: + bool operator==(const KeyItem&) const; + }; - //! The KeyButtons needed to synthesize a KeyID - /*! - An ordered list of \c KeyItems produces a particular KeyID. If - the KeyID can be synthesized directly then there is one entry in - the list. If dead keys are required then they're listed first. - A list is the minimal set of keystrokes necessary to synthesize - the KeyID, so it doesn't include no-ops. A list does not include - any modifier keys unless the KeyID is a modifier, in which case - it has exactly one KeyItem for the modifier itself. - */ - typedef std::vector KeyItemList; + //! The KeyButtons needed to synthesize a KeyID + /*! + An ordered list of \c KeyItems produces a particular KeyID. If + the KeyID can be synthesized directly then there is one entry in + the list. If dead keys are required then they're listed first. + A list is the minimal set of keystrokes necessary to synthesize + the KeyID, so it doesn't include no-ops. A list does not include + any modifier keys unless the KeyID is a modifier, in which case + it has exactly one KeyItem for the modifier itself. + */ + typedef std::vector KeyItemList; - //! A keystroke - class Keystroke { - public: - enum EType { - kButton, //!< Synthesize button - kGroup //!< Set new group - }; + //! A keystroke + class Keystroke { + public: + enum EType { + kButton, //!< Synthesize button + kGroup //!< Set new group + }; - Keystroke(KeyButton, bool press, bool repeat, UInt32 clientData); - Keystroke(SInt32 group, bool absolute, bool restore); + Keystroke(KeyButton, bool press, bool repeat, UInt32 clientData); + Keystroke(SInt32 group, bool absolute, bool restore); - public: - struct Button { - public: - KeyButton m_button; //!< Button to synthesize - bool m_press; //!< \c true iff press - bool m_repeat; //!< \c true iff for an autorepeat - UInt32 m_client; //!< Client data - }; - struct Group { - public: - SInt32 m_group; //!< Group/offset to change to/by - bool m_absolute; //!< \c true iff change to, else by - bool m_restore; //!< \c true iff for restoring state - }; - union Data { - public: - Button m_button; - Group m_group; - }; + public: + struct Button { + public: + KeyButton m_button; //!< Button to synthesize + bool m_press; //!< \c true iff press + bool m_repeat; //!< \c true iff for an autorepeat + UInt32 m_client; //!< Client data + }; + struct Group { + public: + SInt32 m_group; //!< Group/offset to change to/by + bool m_absolute; //!< \c true iff change to, else by + bool m_restore; //!< \c true iff for restoring state + }; + union Data { + public: + Button m_button; + Group m_group; + }; - EType m_type; - Data m_data; - }; + EType m_type; + Data m_data; + }; - //! A sequence of keystrokes - typedef std::vector Keystrokes; + //! A sequence of keystrokes + typedef std::vector Keystrokes; - //! A mapping of a modifier to keys for that modifier - typedef std::multimap ModifierToKeys; + //! A mapping of a modifier to keys for that modifier + typedef std::multimap ModifierToKeys; - //! A set of buttons - typedef std::map ButtonToKeyMap; + //! A set of buttons + typedef std::map ButtonToKeyMap; - //! Callback type for \c foreachKey - typedef void (*ForeachKeyCallback)(KeyID, SInt32 group, - KeyItem&, void* userData); + //! Callback type for \c foreachKey + typedef void (*ForeachKeyCallback)(KeyID, SInt32 group, + KeyItem&, void* userData); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Swap with another \c KeyMap - virtual void swap(KeyMap&); + //! Swap with another \c KeyMap + virtual void swap(KeyMap&); - //! Add a key entry - /*! - Adds \p item to the entries for the item's id and group. The - \c m_dead member is set automatically. - */ - void addKeyEntry(const KeyItem& item); + //! Add a key entry + /*! + Adds \p item to the entries for the item's id and group. The + \c m_dead member is set automatically. + */ + void addKeyEntry(const KeyItem& item); - //! Add an alias key entry - /*! - If \p targetID with the modifiers given by \p targetRequired and - \p targetSensitive is not available in group \p group then find an - entry for \p sourceID with modifiers given by \p sourceRequired and - \p sourceSensitive in any group with exactly one item and, if found, - add a new item just like it except using id \p targetID. This - effectively makes the \p sourceID an alias for \p targetID (i.e. we - can generate \p targetID using \p sourceID). - */ - void addKeyAliasEntry(KeyID targetID, SInt32 group, - KeyModifierMask targetRequired, - KeyModifierMask targetSensitive, - KeyID sourceID, - KeyModifierMask sourceRequired, - KeyModifierMask sourceSensitive); + //! Add an alias key entry + /*! + If \p targetID with the modifiers given by \p targetRequired and + \p targetSensitive is not available in group \p group then find an + entry for \p sourceID with modifiers given by \p sourceRequired and + \p sourceSensitive in any group with exactly one item and, if found, + add a new item just like it except using id \p targetID. This + effectively makes the \p sourceID an alias for \p targetID (i.e. we + can generate \p targetID using \p sourceID). + */ + void addKeyAliasEntry(KeyID targetID, SInt32 group, + KeyModifierMask targetRequired, + KeyModifierMask targetSensitive, + KeyID sourceID, + KeyModifierMask sourceRequired, + KeyModifierMask sourceSensitive); - //! Add a key sequence entry - /*! - Adds the sequence of keys \p keys (\p numKeys elements long) to - synthesize key \p id in group \p group. This looks up in the - map each key in \p keys. If all are found then each key is - converted to the button for that key and the buttons are added - as the entry for \p id. If \p id is already in the map or at - least one key in \p keys is not in the map then nothing is added - and this returns \c false, otherwise it returns \c true. - */ - bool addKeyCombinationEntry(KeyID id, SInt32 group, - const KeyID* keys, UInt32 numKeys); + //! Add a key sequence entry + /*! + Adds the sequence of keys \p keys (\p numKeys elements long) to + synthesize key \p id in group \p group. This looks up in the + map each key in \p keys. If all are found then each key is + converted to the button for that key and the buttons are added + as the entry for \p id. If \p id is already in the map or at + least one key in \p keys is not in the map then nothing is added + and this returns \c false, otherwise it returns \c true. + */ + bool addKeyCombinationEntry(KeyID id, SInt32 group, + const KeyID* keys, UInt32 numKeys); - //! Enable composition across groups - /*! - If called then the keyboard map will allow switching between groups - during key composition. Not all systems allow that. - */ - void allowGroupSwitchDuringCompose(); + //! Enable composition across groups + /*! + If called then the keyboard map will allow switching between groups + during key composition. Not all systems allow that. + */ + void allowGroupSwitchDuringCompose(); - //! Add a half-duplex button - /*! - Records that button \p button is a half-duplex key. This is called - when translating the system's keyboard map. It's independent of the - half-duplex modifier calls. - */ - void addHalfDuplexButton(KeyButton button); + //! Add a half-duplex button + /*! + Records that button \p button is a half-duplex key. This is called + when translating the system's keyboard map. It's independent of the + half-duplex modifier calls. + */ + void addHalfDuplexButton(KeyButton button); - //! Remove all half-duplex modifiers - /*! - Removes all half-duplex modifiers. This is called to set user - configurable half-duplex settings. - */ - void clearHalfDuplexModifiers(); + //! Remove all half-duplex modifiers + /*! + Removes all half-duplex modifiers. This is called to set user + configurable half-duplex settings. + */ + void clearHalfDuplexModifiers(); - //! Add a half-duplex modifier - /*! - Records that modifier key \p key is half-duplex. This is called to - set user configurable half-duplex settings. - */ - virtual void addHalfDuplexModifier(KeyID key); + //! Add a half-duplex modifier + /*! + Records that modifier key \p key is half-duplex. This is called to + set user configurable half-duplex settings. + */ + virtual void addHalfDuplexModifier(KeyID key); - //! Finish adding entries - /*! - Called after adding entries, this does some internal housekeeping. - */ - virtual void finish(); + //! Finish adding entries + /*! + Called after adding entries, this does some internal housekeeping. + */ + virtual void finish(); - //! Iterate over all added keys items - /*! - Calls \p cb for every key item. - */ - virtual void foreachKey(ForeachKeyCallback cb, void* userData); + //! Iterate over all added keys items + /*! + Calls \p cb for every key item. + */ + virtual void foreachKey(ForeachKeyCallback cb, void* userData); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //! Map key press/repeat to keystrokes. - /*! - Converts press/repeat of key \p id in group \p group with current - modifiers as given in \p currentState and the desired modifiers in - \p desiredMask into the keystrokes necessary to synthesize that key - event in \p keys. It returns the \c KeyItem of the key being - pressed/repeated, or NULL if the key cannot be mapped. - */ - virtual const KeyItem* mapKey(Keystrokes& keys, KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const; + //! Map key press/repeat to keystrokes. + /*! + Converts press/repeat of key \p id in group \p group with current + modifiers as given in \p currentState and the desired modifiers in + \p desiredMask into the keystrokes necessary to synthesize that key + event in \p keys. It returns the \c KeyItem of the key being + pressed/repeated, or NULL if the key cannot be mapped. + */ + virtual const KeyItem* mapKey(Keystrokes& keys, KeyID id, SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const; - //! Get number of groups - /*! - Returns the number of keyboard groups (independent layouts) in the map. - */ - SInt32 getNumGroups() const; + //! Get number of groups + /*! + Returns the number of keyboard groups (independent layouts) in the map. + */ + SInt32 getNumGroups() const; - //! Compute a group number - /*! - Returns the number of the group \p offset groups after group \p group. - */ - SInt32 getEffectiveGroup(SInt32 group, SInt32 offset) const; + //! Compute a group number + /*! + Returns the number of the group \p offset groups after group \p group. + */ + SInt32 getEffectiveGroup(SInt32 group, SInt32 offset) const; - //! Find key entry compatible with modifiers - /*! - Returns the \c KeyItemList for the first entry for \p id in group - \p group that is compatible with the given modifiers, or NULL - if there isn't one. A button list is compatible with a modifiers - if it is either insensitive to all modifiers in \p sensitive or - it requires the modifiers to be in the state indicated by \p required - for every modifier indicated by \p sensitive. - */ - const KeyItemList* findCompatibleKey(KeyID id, SInt32 group, - KeyModifierMask required, - KeyModifierMask sensitive) const; + //! Find key entry compatible with modifiers + /*! + Returns the \c KeyItemList for the first entry for \p id in group + \p group that is compatible with the given modifiers, or NULL + if there isn't one. A button list is compatible with a modifiers + if it is either insensitive to all modifiers in \p sensitive or + it requires the modifiers to be in the state indicated by \p required + for every modifier indicated by \p sensitive. + */ + const KeyItemList* findCompatibleKey(KeyID id, SInt32 group, + KeyModifierMask required, + KeyModifierMask sensitive) const; - //! Test if modifier is half-duplex - /*! - Returns \c true iff modifier key \p key or button \p button is - half-duplex. - */ - virtual bool isHalfDuplex(KeyID key, KeyButton button) const; + //! Test if modifier is half-duplex + /*! + Returns \c true iff modifier key \p key or button \p button is + half-duplex. + */ + virtual bool isHalfDuplex(KeyID key, KeyButton button) const; - //! Test if modifiers indicate a command - /*! - Returns \c true iff the modifiers in \p mask contain any command - modifiers. A command modifier is used for keyboard shortcuts and - hotkeys, Rather than trying to synthesize a character, a command - is trying to synthesize a particular set of buttons. So it's not - important to match the shift or AltGr state to achieve a character - but it is important to match the modifier state exactly. - */ - bool isCommand(KeyModifierMask mask) const; + //! Test if modifiers indicate a command + /*! + Returns \c true iff the modifiers in \p mask contain any command + modifiers. A command modifier is used for keyboard shortcuts and + hotkeys, Rather than trying to synthesize a character, a command + is trying to synthesize a particular set of buttons. So it's not + important to match the shift or AltGr state to achieve a character + but it is important to match the modifier state exactly. + */ + bool isCommand(KeyModifierMask mask) const; - // Get the modifiers that indicate a command - /*! - Returns the modifiers that when combined with other keys indicate - a command (e.g. shortcut or hotkey). - */ - KeyModifierMask getCommandModifiers() const; + // Get the modifiers that indicate a command + /*! + Returns the modifiers that when combined with other keys indicate + a command (e.g. shortcut or hotkey). + */ + KeyModifierMask getCommandModifiers() const; - //! Get buttons from modifier map - /*! - Put all the keys in \p modifiers into \p keys. - */ - static void collectButtons(const ModifierToKeys& modifiers, - ButtonToKeyMap& keys); + //! Get buttons from modifier map + /*! + Put all the keys in \p modifiers into \p keys. + */ + static void collectButtons(const ModifierToKeys& modifiers, + ButtonToKeyMap& keys); - //! Set modifier key state - /*! - Sets the modifier key state (\c m_generates and \c m_lock) in \p item - based on the \c m_id in \p item. - */ - static void initModifierKey(KeyItem& item); + //! Set modifier key state + /*! + Sets the modifier key state (\c m_generates and \c m_lock) in \p item + based on the \c m_id in \p item. + */ + static void initModifierKey(KeyItem& item); - //! Test for a dead key - /*! - Returns \c true if \p key is a dead key. - */ - static bool isDeadKey(KeyID key); + //! Test for a dead key + /*! + Returns \c true if \p key is a dead key. + */ + static bool isDeadKey(KeyID key); - //! Get corresponding dead key - /*! - Returns the dead key corresponding to \p key if one exists, otherwise - return \c kKeyNone. This returns \p key if it's already a dead key. - */ - static KeyID getDeadKey(KeyID key); + //! Get corresponding dead key + /*! + Returns the dead key corresponding to \p key if one exists, otherwise + return \c kKeyNone. This returns \p key if it's already a dead key. + */ + static KeyID getDeadKey(KeyID key); - //! Get string for a key and modifier mask - /*! - Converts a key and modifier mask into a string representing the - combination. - */ - static String formatKey(KeyID key, KeyModifierMask); + //! Get string for a key and modifier mask + /*! + Converts a key and modifier mask into a string representing the + combination. + */ + static String formatKey(KeyID key, KeyModifierMask); - //! Parse a string into a key - /*! - Converts a string into a key. Returns \c true on success and \c false - if the string cannot be parsed. - */ - static bool parseKey(const String&, KeyID&); + //! Parse a string into a key + /*! + Converts a string into a key. Returns \c true on success and \c false + if the string cannot be parsed. + */ + static bool parseKey(const String&, KeyID&); - //! Parse a string into a modifier mask - /*! - Converts a string into a modifier mask. Returns \c true on success - and \c false if the string cannot be parsed. The modifiers plus any - remaining leading and trailing whitespace is stripped from the input - string. - */ - static bool parseModifiers(String&, KeyModifierMask&); + //! Parse a string into a modifier mask + /*! + Converts a string into a modifier mask. Returns \c true on success + and \c false if the string cannot be parsed. The modifiers plus any + remaining leading and trailing whitespace is stripped from the input + string. + */ + static bool parseModifiers(String&, KeyModifierMask&); - //@} + //@} private: - FRIEND_TEST(KeyMapTests, - findBestKey_requiredDown_matchExactFirstItem); - FRIEND_TEST(KeyMapTests, - findBestKey_requiredAndExtraSensitiveDown_matchExactFirstItem); - FRIEND_TEST(KeyMapTests, - findBestKey_requiredAndExtraSensitiveDown_matchExactSecondItem); - FRIEND_TEST(KeyMapTests, - findBestKey_extraSensitiveDown_matchExactSecondItem); - FRIEND_TEST(KeyMapTests, - findBestKey_noRequiredDown_matchOneRequiredChangeItem); - FRIEND_TEST(KeyMapTests, - findBestKey_onlyOneRequiredDown_matchTwoRequiredChangesItem); - FRIEND_TEST(KeyMapTests, findBestKey_noRequiredDown_cannotMatch); + FRIEND_TEST(KeyMapTests, + findBestKey_requiredDown_matchExactFirstItem); + FRIEND_TEST(KeyMapTests, + findBestKey_requiredAndExtraSensitiveDown_matchExactFirstItem); + FRIEND_TEST(KeyMapTests, + findBestKey_requiredAndExtraSensitiveDown_matchExactSecondItem); + FRIEND_TEST(KeyMapTests, + findBestKey_extraSensitiveDown_matchExactSecondItem); + FRIEND_TEST(KeyMapTests, + findBestKey_noRequiredDown_matchOneRequiredChangeItem); + FRIEND_TEST(KeyMapTests, + findBestKey_onlyOneRequiredDown_matchTwoRequiredChangesItem); + FRIEND_TEST(KeyMapTests, findBestKey_noRequiredDown_cannotMatch); private: - //! Ways to synthesize a key - enum EKeystroke { - kKeystrokePress, //!< Synthesize a press - kKeystrokeRelease, //!< Synthesize a release - kKeystrokeRepeat, //!< Synthesize an autorepeat - kKeystrokeClick, //!< Synthesize a press and release - kKeystrokeModify, //!< Synthesize pressing a modifier - kKeystrokeUnmodify //!< Synthesize releasing a modifier - }; - - // A list of ways to synthesize a KeyID - typedef std::vector KeyEntryList; + //! Ways to synthesize a key + enum EKeystroke { + kKeystrokePress, //!< Synthesize a press + kKeystrokeRelease, //!< Synthesize a release + kKeystrokeRepeat, //!< Synthesize an autorepeat + kKeystrokeClick, //!< Synthesize a press and release + kKeystrokeModify, //!< Synthesize pressing a modifier + kKeystrokeUnmodify //!< Synthesize releasing a modifier + }; + + // A list of ways to synthesize a KeyID + typedef std::vector KeyEntryList; - // computes the number of groups - SInt32 findNumGroups() const; + // computes the number of groups + SInt32 findNumGroups() const; - // computes the map of modifiers to the keys that generate the modifiers - void setModifierKeys(); + // computes the map of modifiers to the keys that generate the modifiers + void setModifierKeys(); - // maps a command key. a command key is a keyboard shortcut and we're - // trying to synthesize a button press with an exact sets of modifiers, - // not trying to synthesize a character. so we just need to find the - // right button and synthesize the requested modifiers without regard - // to what character they would synthesize. we disallow multikey - // entries since they don't make sense as hotkeys. - const KeyItem* mapCommandKey(Keystrokes& keys, - KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const; + // maps a command key. a command key is a keyboard shortcut and we're + // trying to synthesize a button press with an exact sets of modifiers, + // not trying to synthesize a character. so we just need to find the + // right button and synthesize the requested modifiers without regard + // to what character they would synthesize. we disallow multikey + // entries since they don't make sense as hotkeys. + const KeyItem* mapCommandKey(Keystrokes& keys, + KeyID id, SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const; - // maps a character key. a character key is trying to synthesize a - // particular KeyID and isn't entirely concerned with the modifiers - // used to do it. - const KeyItem* mapCharacterKey(Keystrokes& keys, - KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const; + // maps a character key. a character key is trying to synthesize a + // particular KeyID and isn't entirely concerned with the modifiers + // used to do it. + const KeyItem* mapCharacterKey(Keystrokes& keys, + KeyID id, SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const; - // maps a modifier key - const KeyItem* mapModifierKey(Keystrokes& keys, - KeyID id, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) const; + // maps a modifier key + const KeyItem* mapModifierKey(Keystrokes& keys, + KeyID id, SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) const; - // returns the index into \p entryList of the KeyItemList requiring - // the fewest modifier changes between \p currentState and - // \p desiredState. - SInt32 findBestKey(const KeyEntryList& entryList, - KeyModifierMask currentState, - KeyModifierMask desiredState) const; + // returns the index into \p entryList of the KeyItemList requiring + // the fewest modifier changes between \p currentState and + // \p desiredState. + SInt32 findBestKey(const KeyEntryList& entryList, + KeyModifierMask currentState, + KeyModifierMask desiredState) const; - // gets the \c KeyItem used to synthesize the modifier who's bit is - // given by \p modifierBit in group \p group and does not synthesize - // the key \p button. - const KeyItem* keyForModifier(KeyButton button, SInt32 group, - SInt32 modifierBit) const; + // gets the \c KeyItem used to synthesize the modifier who's bit is + // given by \p modifierBit in group \p group and does not synthesize + // the key \p button. + const KeyItem* keyForModifier(KeyButton button, SInt32 group, + SInt32 modifierBit) const; - // fills \p keystrokes with the keys to synthesize the key in - // \p keyItem taking the modifiers into account. returns \c true - // iff successful and sets \p currentState to the - // resulting modifier state. - bool keysForKeyItem(const KeyItem& keyItem, - SInt32& group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredState, - KeyModifierMask overrideModifiers, - bool isAutoRepeat, - Keystrokes& keystrokes) const; + // fills \p keystrokes with the keys to synthesize the key in + // \p keyItem taking the modifiers into account. returns \c true + // iff successful and sets \p currentState to the + // resulting modifier state. + bool keysForKeyItem(const KeyItem& keyItem, + SInt32& group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredState, + KeyModifierMask overrideModifiers, + bool isAutoRepeat, + Keystrokes& keystrokes) const; - // fills \p keystrokes with the keys to synthesize the modifiers - // in \p desiredModifiers from the active modifiers listed in - // \p activeModifiers not including the key in \p keyItem. - // returns \c true iff successful. - bool keysToRestoreModifiers(const KeyItem& keyItem, - SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - const ModifierToKeys& desiredModifiers, - Keystrokes& keystrokes) const; + // fills \p keystrokes with the keys to synthesize the modifiers + // in \p desiredModifiers from the active modifiers listed in + // \p activeModifiers not including the key in \p keyItem. + // returns \c true iff successful. + bool keysToRestoreModifiers(const KeyItem& keyItem, + SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + const ModifierToKeys& desiredModifiers, + Keystrokes& keystrokes) const; - // fills \p keystrokes and \p undo with the keys to change the - // current modifier state in \p currentState to match the state in - // \p requiredState for each modifier indicated in \p sensitiveMask. - // returns \c true iff successful and sets \p currentState to the - // resulting modifier state. - bool keysForModifierState(KeyButton button, SInt32 group, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask requiredState, - KeyModifierMask sensitiveMask, - KeyModifierMask notRequiredMask, - Keystrokes& keystrokes) const; + // fills \p keystrokes and \p undo with the keys to change the + // current modifier state in \p currentState to match the state in + // \p requiredState for each modifier indicated in \p sensitiveMask. + // returns \c true iff successful and sets \p currentState to the + // resulting modifier state. + bool keysForModifierState(KeyButton button, SInt32 group, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask requiredState, + KeyModifierMask sensitiveMask, + KeyModifierMask notRequiredMask, + Keystrokes& keystrokes) const; - // Adds keystrokes to synthesize key \p keyItem in mode \p type to - // \p keystrokes and to undo the synthesis to \p undo. - void addKeystrokes(EKeystroke type, - const KeyItem& keyItem, - ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - Keystrokes& keystrokes) const; + // Adds keystrokes to synthesize key \p keyItem in mode \p type to + // \p keystrokes and to undo the synthesis to \p undo. + void addKeystrokes(EKeystroke type, + const KeyItem& keyItem, + ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + Keystrokes& keystrokes) const; - // Returns the number of modifiers indicated in \p state. - static SInt32 getNumModifiers(KeyModifierMask state); + // Returns the number of modifiers indicated in \p state. + static SInt32 getNumModifiers(KeyModifierMask state); - // Initialize key name/id maps - static void initKeyNameMaps(); + // Initialize key name/id maps + static void initKeyNameMaps(); - // not implemented - KeyMap(const KeyMap&); - KeyMap& operator=(const KeyMap&); + // not implemented + KeyMap(const KeyMap&); + KeyMap& operator=(const KeyMap&); private: - // Ways to synthesize a KeyID over multiple keyboard groups - typedef std::vector KeyGroupTable; + // Ways to synthesize a KeyID over multiple keyboard groups + typedef std::vector KeyGroupTable; - // Table of KeyID to ways to synthesize that KeyID - typedef std::map KeyIDMap; + // Table of KeyID to ways to synthesize that KeyID + typedef std::map KeyIDMap; - // List of KeyItems that generate a particular modifier - typedef std::vector ModifierKeyItemList; + // List of KeyItems that generate a particular modifier + typedef std::vector ModifierKeyItemList; - // Map a modifier to the KeyItems that synthesize that modifier - typedef std::vector ModifierToKeyTable; + // Map a modifier to the KeyItems that synthesize that modifier + typedef std::vector ModifierToKeyTable; - // A set of keys - typedef std::set KeySet; + // A set of keys + typedef std::set KeySet; - // A set of buttons - typedef std::set KeyButtonSet; + // A set of buttons + typedef std::set KeyButtonSet; - // Key maps for parsing/formatting - typedef std::map NameToKeyMap; - typedef std::map NameToModifierMap; - typedef std::map KeyToNameMap; - typedef std::map ModifierToNameMap; + // Key maps for parsing/formatting + typedef std::map NameToKeyMap; + typedef std::map NameToModifierMap; + typedef std::map KeyToNameMap; + typedef std::map ModifierToNameMap; - // KeyID info - KeyIDMap m_keyIDMap; - SInt32 m_numGroups; - ModifierToKeyTable m_modifierKeys; + // KeyID info + KeyIDMap m_keyIDMap; + SInt32 m_numGroups; + ModifierToKeyTable m_modifierKeys; - // composition info - bool m_composeAcrossGroups; + // composition info + bool m_composeAcrossGroups; - // half-duplex info - KeyButtonSet m_halfDuplex; // half-duplex set by synergy - KeySet m_halfDuplexMods; // half-duplex set by user + // half-duplex info + KeyButtonSet m_halfDuplex; // half-duplex set by synergy + KeySet m_halfDuplexMods; // half-duplex set by user - // dummy KeyItem for changing modifiers - KeyItem m_modifierKeyItem; + // dummy KeyItem for changing modifiers + KeyItem m_modifierKeyItem; - // parsing/formatting tables - static NameToKeyMap* s_nameToKeyMap; - static NameToModifierMap* s_nameToModifierMap; - static KeyToNameMap* s_keyToNameMap; - static ModifierToNameMap* s_modifierToNameMap; + // parsing/formatting tables + static NameToKeyMap* s_nameToKeyMap; + static NameToModifierMap* s_nameToModifierMap; + static KeyToNameMap* s_keyToNameMap; + static ModifierToNameMap* s_modifierToNameMap; }; } diff --git a/src/lib/synergy/KeyState.cpp b/src/lib/synergy/KeyState.cpp index bdb8706c..73ffe727 100644 --- a/src/lib/synergy/KeyState.cpp +++ b/src/lib/synergy/KeyState.cpp @@ -27,356 +27,356 @@ static const KeyButton kButtonMask = (KeyButton)(IKeyState::kNumButtons - 1); static const KeyID s_decomposeTable[] = { - // spacing version of dead keys - 0x0060, 0x0300, 0x0020, 0, // grave, dead_grave, space - 0x00b4, 0x0301, 0x0020, 0, // acute, dead_acute, space - 0x005e, 0x0302, 0x0020, 0, // asciicircum, dead_circumflex, space - 0x007e, 0x0303, 0x0020, 0, // asciitilde, dead_tilde, space - 0x00a8, 0x0308, 0x0020, 0, // diaeresis, dead_diaeresis, space - 0x00b0, 0x030a, 0x0020, 0, // degree, dead_abovering, space - 0x00b8, 0x0327, 0x0020, 0, // cedilla, dead_cedilla, space - 0x02db, 0x0328, 0x0020, 0, // ogonek, dead_ogonek, space - 0x02c7, 0x030c, 0x0020, 0, // caron, dead_caron, space - 0x02d9, 0x0307, 0x0020, 0, // abovedot, dead_abovedot, space - 0x02dd, 0x030b, 0x0020, 0, // doubleacute, dead_doubleacute, space - 0x02d8, 0x0306, 0x0020, 0, // breve, dead_breve, space - 0x00af, 0x0304, 0x0020, 0, // macron, dead_macron, space + // spacing version of dead keys + 0x0060, 0x0300, 0x0020, 0, // grave, dead_grave, space + 0x00b4, 0x0301, 0x0020, 0, // acute, dead_acute, space + 0x005e, 0x0302, 0x0020, 0, // asciicircum, dead_circumflex, space + 0x007e, 0x0303, 0x0020, 0, // asciitilde, dead_tilde, space + 0x00a8, 0x0308, 0x0020, 0, // diaeresis, dead_diaeresis, space + 0x00b0, 0x030a, 0x0020, 0, // degree, dead_abovering, space + 0x00b8, 0x0327, 0x0020, 0, // cedilla, dead_cedilla, space + 0x02db, 0x0328, 0x0020, 0, // ogonek, dead_ogonek, space + 0x02c7, 0x030c, 0x0020, 0, // caron, dead_caron, space + 0x02d9, 0x0307, 0x0020, 0, // abovedot, dead_abovedot, space + 0x02dd, 0x030b, 0x0020, 0, // doubleacute, dead_doubleacute, space + 0x02d8, 0x0306, 0x0020, 0, // breve, dead_breve, space + 0x00af, 0x0304, 0x0020, 0, // macron, dead_macron, space - // Latin-1 (ISO 8859-1) - 0x00c0, 0x0300, 0x0041, 0, // Agrave, dead_grave, A - 0x00c1, 0x0301, 0x0041, 0, // Aacute, dead_acute, A - 0x00c2, 0x0302, 0x0041, 0, // Acircumflex, dead_circumflex, A - 0x00c3, 0x0303, 0x0041, 0, // Atilde, dead_tilde, A - 0x00c4, 0x0308, 0x0041, 0, // Adiaeresis, dead_diaeresis, A - 0x00c5, 0x030a, 0x0041, 0, // Aring, dead_abovering, A - 0x00c7, 0x0327, 0x0043, 0, // Ccedilla, dead_cedilla, C - 0x00c8, 0x0300, 0x0045, 0, // Egrave, dead_grave, E - 0x00c9, 0x0301, 0x0045, 0, // Eacute, dead_acute, E - 0x00ca, 0x0302, 0x0045, 0, // Ecircumflex, dead_circumflex, E - 0x00cb, 0x0308, 0x0045, 0, // Ediaeresis, dead_diaeresis, E - 0x00cc, 0x0300, 0x0049, 0, // Igrave, dead_grave, I - 0x00cd, 0x0301, 0x0049, 0, // Iacute, dead_acute, I - 0x00ce, 0x0302, 0x0049, 0, // Icircumflex, dead_circumflex, I - 0x00cf, 0x0308, 0x0049, 0, // Idiaeresis, dead_diaeresis, I - 0x00d1, 0x0303, 0x004e, 0, // Ntilde, dead_tilde, N - 0x00d2, 0x0300, 0x004f, 0, // Ograve, dead_grave, O - 0x00d3, 0x0301, 0x004f, 0, // Oacute, dead_acute, O - 0x00d4, 0x0302, 0x004f, 0, // Ocircumflex, dead_circumflex, O - 0x00d5, 0x0303, 0x004f, 0, // Otilde, dead_tilde, O - 0x00d6, 0x0308, 0x004f, 0, // Odiaeresis, dead_diaeresis, O - 0x00d9, 0x0300, 0x0055, 0, // Ugrave, dead_grave, U - 0x00da, 0x0301, 0x0055, 0, // Uacute, dead_acute, U - 0x00db, 0x0302, 0x0055, 0, // Ucircumflex, dead_circumflex, U - 0x00dc, 0x0308, 0x0055, 0, // Udiaeresis, dead_diaeresis, U - 0x00dd, 0x0301, 0x0059, 0, // Yacute, dead_acute, Y - 0x00e0, 0x0300, 0x0061, 0, // agrave, dead_grave, a - 0x00e1, 0x0301, 0x0061, 0, // aacute, dead_acute, a - 0x00e2, 0x0302, 0x0061, 0, // acircumflex, dead_circumflex, a - 0x00e3, 0x0303, 0x0061, 0, // atilde, dead_tilde, a - 0x00e4, 0x0308, 0x0061, 0, // adiaeresis, dead_diaeresis, a - 0x00e5, 0x030a, 0x0061, 0, // aring, dead_abovering, a - 0x00e7, 0x0327, 0x0063, 0, // ccedilla, dead_cedilla, c - 0x00e8, 0x0300, 0x0065, 0, // egrave, dead_grave, e - 0x00e9, 0x0301, 0x0065, 0, // eacute, dead_acute, e - 0x00ea, 0x0302, 0x0065, 0, // ecircumflex, dead_circumflex, e - 0x00eb, 0x0308, 0x0065, 0, // ediaeresis, dead_diaeresis, e - 0x00ec, 0x0300, 0x0069, 0, // igrave, dead_grave, i - 0x00ed, 0x0301, 0x0069, 0, // iacute, dead_acute, i - 0x00ee, 0x0302, 0x0069, 0, // icircumflex, dead_circumflex, i - 0x00ef, 0x0308, 0x0069, 0, // idiaeresis, dead_diaeresis, i - 0x00f1, 0x0303, 0x006e, 0, // ntilde, dead_tilde, n - 0x00f2, 0x0300, 0x006f, 0, // ograve, dead_grave, o - 0x00f3, 0x0301, 0x006f, 0, // oacute, dead_acute, o - 0x00f4, 0x0302, 0x006f, 0, // ocircumflex, dead_circumflex, o - 0x00f5, 0x0303, 0x006f, 0, // otilde, dead_tilde, o - 0x00f6, 0x0308, 0x006f, 0, // odiaeresis, dead_diaeresis, o - 0x00f9, 0x0300, 0x0075, 0, // ugrave, dead_grave, u - 0x00fa, 0x0301, 0x0075, 0, // uacute, dead_acute, u - 0x00fb, 0x0302, 0x0075, 0, // ucircumflex, dead_circumflex, u - 0x00fc, 0x0308, 0x0075, 0, // udiaeresis, dead_diaeresis, u - 0x00fd, 0x0301, 0x0079, 0, // yacute, dead_acute, y - 0x00ff, 0x0308, 0x0079, 0, // ydiaeresis, dead_diaeresis, y + // Latin-1 (ISO 8859-1) + 0x00c0, 0x0300, 0x0041, 0, // Agrave, dead_grave, A + 0x00c1, 0x0301, 0x0041, 0, // Aacute, dead_acute, A + 0x00c2, 0x0302, 0x0041, 0, // Acircumflex, dead_circumflex, A + 0x00c3, 0x0303, 0x0041, 0, // Atilde, dead_tilde, A + 0x00c4, 0x0308, 0x0041, 0, // Adiaeresis, dead_diaeresis, A + 0x00c5, 0x030a, 0x0041, 0, // Aring, dead_abovering, A + 0x00c7, 0x0327, 0x0043, 0, // Ccedilla, dead_cedilla, C + 0x00c8, 0x0300, 0x0045, 0, // Egrave, dead_grave, E + 0x00c9, 0x0301, 0x0045, 0, // Eacute, dead_acute, E + 0x00ca, 0x0302, 0x0045, 0, // Ecircumflex, dead_circumflex, E + 0x00cb, 0x0308, 0x0045, 0, // Ediaeresis, dead_diaeresis, E + 0x00cc, 0x0300, 0x0049, 0, // Igrave, dead_grave, I + 0x00cd, 0x0301, 0x0049, 0, // Iacute, dead_acute, I + 0x00ce, 0x0302, 0x0049, 0, // Icircumflex, dead_circumflex, I + 0x00cf, 0x0308, 0x0049, 0, // Idiaeresis, dead_diaeresis, I + 0x00d1, 0x0303, 0x004e, 0, // Ntilde, dead_tilde, N + 0x00d2, 0x0300, 0x004f, 0, // Ograve, dead_grave, O + 0x00d3, 0x0301, 0x004f, 0, // Oacute, dead_acute, O + 0x00d4, 0x0302, 0x004f, 0, // Ocircumflex, dead_circumflex, O + 0x00d5, 0x0303, 0x004f, 0, // Otilde, dead_tilde, O + 0x00d6, 0x0308, 0x004f, 0, // Odiaeresis, dead_diaeresis, O + 0x00d9, 0x0300, 0x0055, 0, // Ugrave, dead_grave, U + 0x00da, 0x0301, 0x0055, 0, // Uacute, dead_acute, U + 0x00db, 0x0302, 0x0055, 0, // Ucircumflex, dead_circumflex, U + 0x00dc, 0x0308, 0x0055, 0, // Udiaeresis, dead_diaeresis, U + 0x00dd, 0x0301, 0x0059, 0, // Yacute, dead_acute, Y + 0x00e0, 0x0300, 0x0061, 0, // agrave, dead_grave, a + 0x00e1, 0x0301, 0x0061, 0, // aacute, dead_acute, a + 0x00e2, 0x0302, 0x0061, 0, // acircumflex, dead_circumflex, a + 0x00e3, 0x0303, 0x0061, 0, // atilde, dead_tilde, a + 0x00e4, 0x0308, 0x0061, 0, // adiaeresis, dead_diaeresis, a + 0x00e5, 0x030a, 0x0061, 0, // aring, dead_abovering, a + 0x00e7, 0x0327, 0x0063, 0, // ccedilla, dead_cedilla, c + 0x00e8, 0x0300, 0x0065, 0, // egrave, dead_grave, e + 0x00e9, 0x0301, 0x0065, 0, // eacute, dead_acute, e + 0x00ea, 0x0302, 0x0065, 0, // ecircumflex, dead_circumflex, e + 0x00eb, 0x0308, 0x0065, 0, // ediaeresis, dead_diaeresis, e + 0x00ec, 0x0300, 0x0069, 0, // igrave, dead_grave, i + 0x00ed, 0x0301, 0x0069, 0, // iacute, dead_acute, i + 0x00ee, 0x0302, 0x0069, 0, // icircumflex, dead_circumflex, i + 0x00ef, 0x0308, 0x0069, 0, // idiaeresis, dead_diaeresis, i + 0x00f1, 0x0303, 0x006e, 0, // ntilde, dead_tilde, n + 0x00f2, 0x0300, 0x006f, 0, // ograve, dead_grave, o + 0x00f3, 0x0301, 0x006f, 0, // oacute, dead_acute, o + 0x00f4, 0x0302, 0x006f, 0, // ocircumflex, dead_circumflex, o + 0x00f5, 0x0303, 0x006f, 0, // otilde, dead_tilde, o + 0x00f6, 0x0308, 0x006f, 0, // odiaeresis, dead_diaeresis, o + 0x00f9, 0x0300, 0x0075, 0, // ugrave, dead_grave, u + 0x00fa, 0x0301, 0x0075, 0, // uacute, dead_acute, u + 0x00fb, 0x0302, 0x0075, 0, // ucircumflex, dead_circumflex, u + 0x00fc, 0x0308, 0x0075, 0, // udiaeresis, dead_diaeresis, u + 0x00fd, 0x0301, 0x0079, 0, // yacute, dead_acute, y + 0x00ff, 0x0308, 0x0079, 0, // ydiaeresis, dead_diaeresis, y - // Latin-2 (ISO 8859-2) - 0x0104, 0x0328, 0x0041, 0, // Aogonek, dead_ogonek, A - 0x013d, 0x030c, 0x004c, 0, // Lcaron, dead_caron, L - 0x015a, 0x0301, 0x0053, 0, // Sacute, dead_acute, S - 0x0160, 0x030c, 0x0053, 0, // Scaron, dead_caron, S - 0x015e, 0x0327, 0x0053, 0, // Scedilla, dead_cedilla, S - 0x0164, 0x030c, 0x0054, 0, // Tcaron, dead_caron, T - 0x0179, 0x0301, 0x005a, 0, // Zacute, dead_acute, Z - 0x017d, 0x030c, 0x005a, 0, // Zcaron, dead_caron, Z - 0x017b, 0x0307, 0x005a, 0, // Zabovedot, dead_abovedot, Z - 0x0105, 0x0328, 0x0061, 0, // aogonek, dead_ogonek, a - 0x013e, 0x030c, 0x006c, 0, // lcaron, dead_caron, l - 0x015b, 0x0301, 0x0073, 0, // sacute, dead_acute, s - 0x0161, 0x030c, 0x0073, 0, // scaron, dead_caron, s - 0x015f, 0x0327, 0x0073, 0, // scedilla, dead_cedilla, s - 0x0165, 0x030c, 0x0074, 0, // tcaron, dead_caron, t - 0x017a, 0x0301, 0x007a, 0, // zacute, dead_acute, z - 0x017e, 0x030c, 0x007a, 0, // zcaron, dead_caron, z - 0x017c, 0x0307, 0x007a, 0, // zabovedot, dead_abovedot, z - 0x0154, 0x0301, 0x0052, 0, // Racute, dead_acute, R - 0x0102, 0x0306, 0x0041, 0, // Abreve, dead_breve, A - 0x0139, 0x0301, 0x004c, 0, // Lacute, dead_acute, L - 0x0106, 0x0301, 0x0043, 0, // Cacute, dead_acute, C - 0x010c, 0x030c, 0x0043, 0, // Ccaron, dead_caron, C - 0x0118, 0x0328, 0x0045, 0, // Eogonek, dead_ogonek, E - 0x011a, 0x030c, 0x0045, 0, // Ecaron, dead_caron, E - 0x010e, 0x030c, 0x0044, 0, // Dcaron, dead_caron, D - 0x0143, 0x0301, 0x004e, 0, // Nacute, dead_acute, N - 0x0147, 0x030c, 0x004e, 0, // Ncaron, dead_caron, N - 0x0150, 0x030b, 0x004f, 0, // Odoubleacute, dead_doubleacute, O - 0x0158, 0x030c, 0x0052, 0, // Rcaron, dead_caron, R - 0x016e, 0x030a, 0x0055, 0, // Uring, dead_abovering, U - 0x0170, 0x030b, 0x0055, 0, // Udoubleacute, dead_doubleacute, U - 0x0162, 0x0327, 0x0054, 0, // Tcedilla, dead_cedilla, T - 0x0155, 0x0301, 0x0072, 0, // racute, dead_acute, r - 0x0103, 0x0306, 0x0061, 0, // abreve, dead_breve, a - 0x013a, 0x0301, 0x006c, 0, // lacute, dead_acute, l - 0x0107, 0x0301, 0x0063, 0, // cacute, dead_acute, c - 0x010d, 0x030c, 0x0063, 0, // ccaron, dead_caron, c - 0x0119, 0x0328, 0x0065, 0, // eogonek, dead_ogonek, e - 0x011b, 0x030c, 0x0065, 0, // ecaron, dead_caron, e - 0x010f, 0x030c, 0x0064, 0, // dcaron, dead_caron, d - 0x0144, 0x0301, 0x006e, 0, // nacute, dead_acute, n - 0x0148, 0x030c, 0x006e, 0, // ncaron, dead_caron, n - 0x0151, 0x030b, 0x006f, 0, // odoubleacute, dead_doubleacute, o - 0x0159, 0x030c, 0x0072, 0, // rcaron, dead_caron, r - 0x016f, 0x030a, 0x0075, 0, // uring, dead_abovering, u - 0x0171, 0x030b, 0x0075, 0, // udoubleacute, dead_doubleacute, u - 0x0163, 0x0327, 0x0074, 0, // tcedilla, dead_cedilla, t + // Latin-2 (ISO 8859-2) + 0x0104, 0x0328, 0x0041, 0, // Aogonek, dead_ogonek, A + 0x013d, 0x030c, 0x004c, 0, // Lcaron, dead_caron, L + 0x015a, 0x0301, 0x0053, 0, // Sacute, dead_acute, S + 0x0160, 0x030c, 0x0053, 0, // Scaron, dead_caron, S + 0x015e, 0x0327, 0x0053, 0, // Scedilla, dead_cedilla, S + 0x0164, 0x030c, 0x0054, 0, // Tcaron, dead_caron, T + 0x0179, 0x0301, 0x005a, 0, // Zacute, dead_acute, Z + 0x017d, 0x030c, 0x005a, 0, // Zcaron, dead_caron, Z + 0x017b, 0x0307, 0x005a, 0, // Zabovedot, dead_abovedot, Z + 0x0105, 0x0328, 0x0061, 0, // aogonek, dead_ogonek, a + 0x013e, 0x030c, 0x006c, 0, // lcaron, dead_caron, l + 0x015b, 0x0301, 0x0073, 0, // sacute, dead_acute, s + 0x0161, 0x030c, 0x0073, 0, // scaron, dead_caron, s + 0x015f, 0x0327, 0x0073, 0, // scedilla, dead_cedilla, s + 0x0165, 0x030c, 0x0074, 0, // tcaron, dead_caron, t + 0x017a, 0x0301, 0x007a, 0, // zacute, dead_acute, z + 0x017e, 0x030c, 0x007a, 0, // zcaron, dead_caron, z + 0x017c, 0x0307, 0x007a, 0, // zabovedot, dead_abovedot, z + 0x0154, 0x0301, 0x0052, 0, // Racute, dead_acute, R + 0x0102, 0x0306, 0x0041, 0, // Abreve, dead_breve, A + 0x0139, 0x0301, 0x004c, 0, // Lacute, dead_acute, L + 0x0106, 0x0301, 0x0043, 0, // Cacute, dead_acute, C + 0x010c, 0x030c, 0x0043, 0, // Ccaron, dead_caron, C + 0x0118, 0x0328, 0x0045, 0, // Eogonek, dead_ogonek, E + 0x011a, 0x030c, 0x0045, 0, // Ecaron, dead_caron, E + 0x010e, 0x030c, 0x0044, 0, // Dcaron, dead_caron, D + 0x0143, 0x0301, 0x004e, 0, // Nacute, dead_acute, N + 0x0147, 0x030c, 0x004e, 0, // Ncaron, dead_caron, N + 0x0150, 0x030b, 0x004f, 0, // Odoubleacute, dead_doubleacute, O + 0x0158, 0x030c, 0x0052, 0, // Rcaron, dead_caron, R + 0x016e, 0x030a, 0x0055, 0, // Uring, dead_abovering, U + 0x0170, 0x030b, 0x0055, 0, // Udoubleacute, dead_doubleacute, U + 0x0162, 0x0327, 0x0054, 0, // Tcedilla, dead_cedilla, T + 0x0155, 0x0301, 0x0072, 0, // racute, dead_acute, r + 0x0103, 0x0306, 0x0061, 0, // abreve, dead_breve, a + 0x013a, 0x0301, 0x006c, 0, // lacute, dead_acute, l + 0x0107, 0x0301, 0x0063, 0, // cacute, dead_acute, c + 0x010d, 0x030c, 0x0063, 0, // ccaron, dead_caron, c + 0x0119, 0x0328, 0x0065, 0, // eogonek, dead_ogonek, e + 0x011b, 0x030c, 0x0065, 0, // ecaron, dead_caron, e + 0x010f, 0x030c, 0x0064, 0, // dcaron, dead_caron, d + 0x0144, 0x0301, 0x006e, 0, // nacute, dead_acute, n + 0x0148, 0x030c, 0x006e, 0, // ncaron, dead_caron, n + 0x0151, 0x030b, 0x006f, 0, // odoubleacute, dead_doubleacute, o + 0x0159, 0x030c, 0x0072, 0, // rcaron, dead_caron, r + 0x016f, 0x030a, 0x0075, 0, // uring, dead_abovering, u + 0x0171, 0x030b, 0x0075, 0, // udoubleacute, dead_doubleacute, u + 0x0163, 0x0327, 0x0074, 0, // tcedilla, dead_cedilla, t - // Latin-3 (ISO 8859-3) - 0x0124, 0x0302, 0x0048, 0, // Hcircumflex, dead_circumflex, H - 0x0130, 0x0307, 0x0049, 0, // Iabovedot, dead_abovedot, I - 0x011e, 0x0306, 0x0047, 0, // Gbreve, dead_breve, G - 0x0134, 0x0302, 0x004a, 0, // Jcircumflex, dead_circumflex, J - 0x0125, 0x0302, 0x0068, 0, // hcircumflex, dead_circumflex, h - 0x011f, 0x0306, 0x0067, 0, // gbreve, dead_breve, g - 0x0135, 0x0302, 0x006a, 0, // jcircumflex, dead_circumflex, j - 0x010a, 0x0307, 0x0043, 0, // Cabovedot, dead_abovedot, C - 0x0108, 0x0302, 0x0043, 0, // Ccircumflex, dead_circumflex, C - 0x0120, 0x0307, 0x0047, 0, // Gabovedot, dead_abovedot, G - 0x011c, 0x0302, 0x0047, 0, // Gcircumflex, dead_circumflex, G - 0x016c, 0x0306, 0x0055, 0, // Ubreve, dead_breve, U - 0x015c, 0x0302, 0x0053, 0, // Scircumflex, dead_circumflex, S - 0x010b, 0x0307, 0x0063, 0, // cabovedot, dead_abovedot, c - 0x0109, 0x0302, 0x0063, 0, // ccircumflex, dead_circumflex, c - 0x0121, 0x0307, 0x0067, 0, // gabovedot, dead_abovedot, g - 0x011d, 0x0302, 0x0067, 0, // gcircumflex, dead_circumflex, g - 0x016d, 0x0306, 0x0075, 0, // ubreve, dead_breve, u - 0x015d, 0x0302, 0x0073, 0, // scircumflex, dead_circumflex, s + // Latin-3 (ISO 8859-3) + 0x0124, 0x0302, 0x0048, 0, // Hcircumflex, dead_circumflex, H + 0x0130, 0x0307, 0x0049, 0, // Iabovedot, dead_abovedot, I + 0x011e, 0x0306, 0x0047, 0, // Gbreve, dead_breve, G + 0x0134, 0x0302, 0x004a, 0, // Jcircumflex, dead_circumflex, J + 0x0125, 0x0302, 0x0068, 0, // hcircumflex, dead_circumflex, h + 0x011f, 0x0306, 0x0067, 0, // gbreve, dead_breve, g + 0x0135, 0x0302, 0x006a, 0, // jcircumflex, dead_circumflex, j + 0x010a, 0x0307, 0x0043, 0, // Cabovedot, dead_abovedot, C + 0x0108, 0x0302, 0x0043, 0, // Ccircumflex, dead_circumflex, C + 0x0120, 0x0307, 0x0047, 0, // Gabovedot, dead_abovedot, G + 0x011c, 0x0302, 0x0047, 0, // Gcircumflex, dead_circumflex, G + 0x016c, 0x0306, 0x0055, 0, // Ubreve, dead_breve, U + 0x015c, 0x0302, 0x0053, 0, // Scircumflex, dead_circumflex, S + 0x010b, 0x0307, 0x0063, 0, // cabovedot, dead_abovedot, c + 0x0109, 0x0302, 0x0063, 0, // ccircumflex, dead_circumflex, c + 0x0121, 0x0307, 0x0067, 0, // gabovedot, dead_abovedot, g + 0x011d, 0x0302, 0x0067, 0, // gcircumflex, dead_circumflex, g + 0x016d, 0x0306, 0x0075, 0, // ubreve, dead_breve, u + 0x015d, 0x0302, 0x0073, 0, // scircumflex, dead_circumflex, s - // Latin-4 (ISO 8859-4) - 0x0156, 0x0327, 0x0052, 0, // Rcedilla, dead_cedilla, R - 0x0128, 0x0303, 0x0049, 0, // Itilde, dead_tilde, I - 0x013b, 0x0327, 0x004c, 0, // Lcedilla, dead_cedilla, L - 0x0112, 0x0304, 0x0045, 0, // Emacron, dead_macron, E - 0x0122, 0x0327, 0x0047, 0, // Gcedilla, dead_cedilla, G - 0x0157, 0x0327, 0x0072, 0, // rcedilla, dead_cedilla, r - 0x0129, 0x0303, 0x0069, 0, // itilde, dead_tilde, i - 0x013c, 0x0327, 0x006c, 0, // lcedilla, dead_cedilla, l - 0x0113, 0x0304, 0x0065, 0, // emacron, dead_macron, e - 0x0123, 0x0327, 0x0067, 0, // gcedilla, dead_cedilla, g - 0x0100, 0x0304, 0x0041, 0, // Amacron, dead_macron, A - 0x012e, 0x0328, 0x0049, 0, // Iogonek, dead_ogonek, I - 0x0116, 0x0307, 0x0045, 0, // Eabovedot, dead_abovedot, E - 0x012a, 0x0304, 0x0049, 0, // Imacron, dead_macron, I - 0x0145, 0x0327, 0x004e, 0, // Ncedilla, dead_cedilla, N - 0x014c, 0x0304, 0x004f, 0, // Omacron, dead_macron, O - 0x0136, 0x0327, 0x004b, 0, // Kcedilla, dead_cedilla, K - 0x0172, 0x0328, 0x0055, 0, // Uogonek, dead_ogonek, U - 0x0168, 0x0303, 0x0055, 0, // Utilde, dead_tilde, U - 0x016a, 0x0304, 0x0055, 0, // Umacron, dead_macron, U - 0x0101, 0x0304, 0x0061, 0, // amacron, dead_macron, a - 0x012f, 0x0328, 0x0069, 0, // iogonek, dead_ogonek, i - 0x0117, 0x0307, 0x0065, 0, // eabovedot, dead_abovedot, e - 0x012b, 0x0304, 0x0069, 0, // imacron, dead_macron, i - 0x0146, 0x0327, 0x006e, 0, // ncedilla, dead_cedilla, n - 0x014d, 0x0304, 0x006f, 0, // omacron, dead_macron, o - 0x0137, 0x0327, 0x006b, 0, // kcedilla, dead_cedilla, k - 0x0173, 0x0328, 0x0075, 0, // uogonek, dead_ogonek, u - 0x0169, 0x0303, 0x0075, 0, // utilde, dead_tilde, u - 0x016b, 0x0304, 0x0075, 0, // umacron, dead_macron, u + // Latin-4 (ISO 8859-4) + 0x0156, 0x0327, 0x0052, 0, // Rcedilla, dead_cedilla, R + 0x0128, 0x0303, 0x0049, 0, // Itilde, dead_tilde, I + 0x013b, 0x0327, 0x004c, 0, // Lcedilla, dead_cedilla, L + 0x0112, 0x0304, 0x0045, 0, // Emacron, dead_macron, E + 0x0122, 0x0327, 0x0047, 0, // Gcedilla, dead_cedilla, G + 0x0157, 0x0327, 0x0072, 0, // rcedilla, dead_cedilla, r + 0x0129, 0x0303, 0x0069, 0, // itilde, dead_tilde, i + 0x013c, 0x0327, 0x006c, 0, // lcedilla, dead_cedilla, l + 0x0113, 0x0304, 0x0065, 0, // emacron, dead_macron, e + 0x0123, 0x0327, 0x0067, 0, // gcedilla, dead_cedilla, g + 0x0100, 0x0304, 0x0041, 0, // Amacron, dead_macron, A + 0x012e, 0x0328, 0x0049, 0, // Iogonek, dead_ogonek, I + 0x0116, 0x0307, 0x0045, 0, // Eabovedot, dead_abovedot, E + 0x012a, 0x0304, 0x0049, 0, // Imacron, dead_macron, I + 0x0145, 0x0327, 0x004e, 0, // Ncedilla, dead_cedilla, N + 0x014c, 0x0304, 0x004f, 0, // Omacron, dead_macron, O + 0x0136, 0x0327, 0x004b, 0, // Kcedilla, dead_cedilla, K + 0x0172, 0x0328, 0x0055, 0, // Uogonek, dead_ogonek, U + 0x0168, 0x0303, 0x0055, 0, // Utilde, dead_tilde, U + 0x016a, 0x0304, 0x0055, 0, // Umacron, dead_macron, U + 0x0101, 0x0304, 0x0061, 0, // amacron, dead_macron, a + 0x012f, 0x0328, 0x0069, 0, // iogonek, dead_ogonek, i + 0x0117, 0x0307, 0x0065, 0, // eabovedot, dead_abovedot, e + 0x012b, 0x0304, 0x0069, 0, // imacron, dead_macron, i + 0x0146, 0x0327, 0x006e, 0, // ncedilla, dead_cedilla, n + 0x014d, 0x0304, 0x006f, 0, // omacron, dead_macron, o + 0x0137, 0x0327, 0x006b, 0, // kcedilla, dead_cedilla, k + 0x0173, 0x0328, 0x0075, 0, // uogonek, dead_ogonek, u + 0x0169, 0x0303, 0x0075, 0, // utilde, dead_tilde, u + 0x016b, 0x0304, 0x0075, 0, // umacron, dead_macron, u - // Latin-8 (ISO 8859-14) - 0x1e02, 0x0307, 0x0042, 0, // Babovedot, dead_abovedot, B - 0x1e03, 0x0307, 0x0062, 0, // babovedot, dead_abovedot, b - 0x1e0a, 0x0307, 0x0044, 0, // Dabovedot, dead_abovedot, D - 0x1e80, 0x0300, 0x0057, 0, // Wgrave, dead_grave, W - 0x1e82, 0x0301, 0x0057, 0, // Wacute, dead_acute, W - 0x1e0b, 0x0307, 0x0064, 0, // dabovedot, dead_abovedot, d - 0x1ef2, 0x0300, 0x0059, 0, // Ygrave, dead_grave, Y - 0x1e1e, 0x0307, 0x0046, 0, // Fabovedot, dead_abovedot, F - 0x1e1f, 0x0307, 0x0066, 0, // fabovedot, dead_abovedot, f - 0x1e40, 0x0307, 0x004d, 0, // Mabovedot, dead_abovedot, M - 0x1e41, 0x0307, 0x006d, 0, // mabovedot, dead_abovedot, m - 0x1e56, 0x0307, 0x0050, 0, // Pabovedot, dead_abovedot, P - 0x1e81, 0x0300, 0x0077, 0, // wgrave, dead_grave, w - 0x1e57, 0x0307, 0x0070, 0, // pabovedot, dead_abovedot, p - 0x1e83, 0x0301, 0x0077, 0, // wacute, dead_acute, w - 0x1e60, 0x0307, 0x0053, 0, // Sabovedot, dead_abovedot, S - 0x1ef3, 0x0300, 0x0079, 0, // ygrave, dead_grave, y - 0x1e84, 0x0308, 0x0057, 0, // Wdiaeresis, dead_diaeresis, W - 0x1e85, 0x0308, 0x0077, 0, // wdiaeresis, dead_diaeresis, w - 0x1e61, 0x0307, 0x0073, 0, // sabovedot, dead_abovedot, s - 0x0174, 0x0302, 0x0057, 0, // Wcircumflex, dead_circumflex, W - 0x1e6a, 0x0307, 0x0054, 0, // Tabovedot, dead_abovedot, T - 0x0176, 0x0302, 0x0059, 0, // Ycircumflex, dead_circumflex, Y - 0x0175, 0x0302, 0x0077, 0, // wcircumflex, dead_circumflex, w - 0x1e6b, 0x0307, 0x0074, 0, // tabovedot, dead_abovedot, t - 0x0177, 0x0302, 0x0079, 0, // ycircumflex, dead_circumflex, y + // Latin-8 (ISO 8859-14) + 0x1e02, 0x0307, 0x0042, 0, // Babovedot, dead_abovedot, B + 0x1e03, 0x0307, 0x0062, 0, // babovedot, dead_abovedot, b + 0x1e0a, 0x0307, 0x0044, 0, // Dabovedot, dead_abovedot, D + 0x1e80, 0x0300, 0x0057, 0, // Wgrave, dead_grave, W + 0x1e82, 0x0301, 0x0057, 0, // Wacute, dead_acute, W + 0x1e0b, 0x0307, 0x0064, 0, // dabovedot, dead_abovedot, d + 0x1ef2, 0x0300, 0x0059, 0, // Ygrave, dead_grave, Y + 0x1e1e, 0x0307, 0x0046, 0, // Fabovedot, dead_abovedot, F + 0x1e1f, 0x0307, 0x0066, 0, // fabovedot, dead_abovedot, f + 0x1e40, 0x0307, 0x004d, 0, // Mabovedot, dead_abovedot, M + 0x1e41, 0x0307, 0x006d, 0, // mabovedot, dead_abovedot, m + 0x1e56, 0x0307, 0x0050, 0, // Pabovedot, dead_abovedot, P + 0x1e81, 0x0300, 0x0077, 0, // wgrave, dead_grave, w + 0x1e57, 0x0307, 0x0070, 0, // pabovedot, dead_abovedot, p + 0x1e83, 0x0301, 0x0077, 0, // wacute, dead_acute, w + 0x1e60, 0x0307, 0x0053, 0, // Sabovedot, dead_abovedot, S + 0x1ef3, 0x0300, 0x0079, 0, // ygrave, dead_grave, y + 0x1e84, 0x0308, 0x0057, 0, // Wdiaeresis, dead_diaeresis, W + 0x1e85, 0x0308, 0x0077, 0, // wdiaeresis, dead_diaeresis, w + 0x1e61, 0x0307, 0x0073, 0, // sabovedot, dead_abovedot, s + 0x0174, 0x0302, 0x0057, 0, // Wcircumflex, dead_circumflex, W + 0x1e6a, 0x0307, 0x0054, 0, // Tabovedot, dead_abovedot, T + 0x0176, 0x0302, 0x0059, 0, // Ycircumflex, dead_circumflex, Y + 0x0175, 0x0302, 0x0077, 0, // wcircumflex, dead_circumflex, w + 0x1e6b, 0x0307, 0x0074, 0, // tabovedot, dead_abovedot, t + 0x0177, 0x0302, 0x0079, 0, // ycircumflex, dead_circumflex, y - // Latin-9 (ISO 8859-15) - 0x0178, 0x0308, 0x0059, 0, // Ydiaeresis, dead_diaeresis, Y + // Latin-9 (ISO 8859-15) + 0x0178, 0x0308, 0x0059, 0, // Ydiaeresis, dead_diaeresis, Y - // Compose key sequences - 0x00c6, kKeyCompose, 0x0041, 0x0045, 0, // AE, A, E - 0x00c1, kKeyCompose, 0x0041, 0x0027, 0, // Aacute, A, apostrophe - 0x00c2, kKeyCompose, 0x0041, 0x0053, 0, // Acircumflex, A, asciicircum - 0x00c3, kKeyCompose, 0x0041, 0x0022, 0, // Adiaeresis, A, quotedbl - 0x00c0, kKeyCompose, 0x0041, 0x0060, 0, // Agrave, A, grave - 0x00c5, kKeyCompose, 0x0041, 0x002a, 0, // Aring, A, asterisk - 0x00c3, kKeyCompose, 0x0041, 0x007e, 0, // Atilde, A, asciitilde - 0x00c7, kKeyCompose, 0x0043, 0x002c, 0, // Ccedilla, C, comma - 0x00d0, kKeyCompose, 0x0044, 0x002d, 0, // ETH, D, minus - 0x00c9, kKeyCompose, 0x0045, 0x0027, 0, // Eacute, E, apostrophe - 0x00ca, kKeyCompose, 0x0045, 0x0053, 0, // Ecircumflex, E, asciicircum - 0x00cb, kKeyCompose, 0x0045, 0x0022, 0, // Ediaeresis, E, quotedbl - 0x00c8, kKeyCompose, 0x0045, 0x0060, 0, // Egrave, E, grave - 0x00cd, kKeyCompose, 0x0049, 0x0027, 0, // Iacute, I, apostrophe - 0x00ce, kKeyCompose, 0x0049, 0x0053, 0, // Icircumflex, I, asciicircum - 0x00cf, kKeyCompose, 0x0049, 0x0022, 0, // Idiaeresis, I, quotedbl - 0x00cc, kKeyCompose, 0x0049, 0x0060, 0, // Igrave, I, grave - 0x00d1, kKeyCompose, 0x004e, 0x007e, 0, // Ntilde, N, asciitilde - 0x00d3, kKeyCompose, 0x004f, 0x0027, 0, // Oacute, O, apostrophe - 0x00d4, kKeyCompose, 0x004f, 0x0053, 0, // Ocircumflex, O, asciicircum - 0x00d6, kKeyCompose, 0x004f, 0x0022, 0, // Odiaeresis, O, quotedbl - 0x00d2, kKeyCompose, 0x004f, 0x0060, 0, // Ograve, O, grave - 0x00d8, kKeyCompose, 0x004f, 0x002f, 0, // Ooblique, O, slash - 0x00d5, kKeyCompose, 0x004f, 0x007e, 0, // Otilde, O, asciitilde - 0x00de, kKeyCompose, 0x0054, 0x0048, 0, // THORN, T, H - 0x00da, kKeyCompose, 0x0055, 0x0027, 0, // Uacute, U, apostrophe - 0x00db, kKeyCompose, 0x0055, 0x0053, 0, // Ucircumflex, U, asciicircum - 0x00dc, kKeyCompose, 0x0055, 0x0022, 0, // Udiaeresis, U, quotedbl - 0x00d9, kKeyCompose, 0x0055, 0x0060, 0, // Ugrave, U, grave - 0x00dd, kKeyCompose, 0x0059, 0x0027, 0, // Yacute, Y, apostrophe - 0x00e1, kKeyCompose, 0x0061, 0x0027, 0, // aacute, a, apostrophe - 0x00e2, kKeyCompose, 0x0061, 0x0053, 0, // acircumflex, a, asciicircum - 0x00b4, kKeyCompose, 0x0027, 0x0027, 0, // acute, apostrophe, apostrophe - 0x00e4, kKeyCompose, 0x0061, 0x0022, 0, // adiaeresis, a, quotedbl - 0x00e6, kKeyCompose, 0x0061, 0x0065, 0, // ae, a, e - 0x00e0, kKeyCompose, 0x0061, 0x0060, 0, // agrave, a, grave - 0x00e5, kKeyCompose, 0x0061, 0x002a, 0, // aring, a, asterisk - 0x0040, kKeyCompose, 0x0041, 0x0054, 0, // at, A, T - 0x00e3, kKeyCompose, 0x0061, 0x007e, 0, // atilde, a, asciitilde - 0x005c, kKeyCompose, 0x002f, 0x002f, 0, // backslash, slash, slash - 0x007c, kKeyCompose, 0x004c, 0x0056, 0, // bar, L, V - 0x007b, kKeyCompose, 0x0028, 0x002d, 0, // braceleft, parenleft, minus - 0x007d, kKeyCompose, 0x0029, 0x002d, 0, // braceright, parenright, minus - 0x005b, kKeyCompose, 0x0028, 0x0028, 0, // bracketleft, parenleft, parenleft - 0x005d, kKeyCompose, 0x0029, 0x0029, 0, // bracketright, parenright, parenright - 0x00a6, kKeyCompose, 0x0042, 0x0056, 0, // brokenbar, B, V - 0x00e7, kKeyCompose, 0x0063, 0x002c, 0, // ccedilla, c, comma - 0x00b8, kKeyCompose, 0x002c, 0x002c, 0, // cedilla, comma, comma - 0x00a2, kKeyCompose, 0x0063, 0x002f, 0, // cent, c, slash - 0x00a9, kKeyCompose, 0x0028, 0x0063, 0, // copyright, parenleft, c - 0x00a4, kKeyCompose, 0x006f, 0x0078, 0, // currency, o, x - 0x00b0, kKeyCompose, 0x0030, 0x0053, 0, // degree, 0, asciicircum - 0x00a8, kKeyCompose, 0x0022, 0x0022, 0, // diaeresis, quotedbl, quotedbl - 0x00f7, kKeyCompose, 0x003a, 0x002d, 0, // division, colon, minus - 0x00e9, kKeyCompose, 0x0065, 0x0027, 0, // eacute, e, apostrophe - 0x00ea, kKeyCompose, 0x0065, 0x0053, 0, // ecircumflex, e, asciicircum - 0x00eb, kKeyCompose, 0x0065, 0x0022, 0, // ediaeresis, e, quotedbl - 0x00e8, kKeyCompose, 0x0065, 0x0060, 0, // egrave, e, grave - 0x00f0, kKeyCompose, 0x0064, 0x002d, 0, // eth, d, minus - 0x00a1, kKeyCompose, 0x0021, 0x0021, 0, // exclamdown, exclam, exclam - 0x00ab, kKeyCompose, 0x003c, 0x003c, 0, // guillemotleft, less, less - 0x00bb, kKeyCompose, 0x003e, 0x003e, 0, // guillemotright, greater, greater - 0x0023, kKeyCompose, 0x002b, 0x002b, 0, // numbersign, plus, plus - 0x00ad, kKeyCompose, 0x002d, 0x002d, 0, // hyphen, minus, minus - 0x00ed, kKeyCompose, 0x0069, 0x0027, 0, // iacute, i, apostrophe - 0x00ee, kKeyCompose, 0x0069, 0x0053, 0, // icircumflex, i, asciicircum - 0x00ef, kKeyCompose, 0x0069, 0x0022, 0, // idiaeresis, i, quotedbl - 0x00ec, kKeyCompose, 0x0069, 0x0060, 0, // igrave, i, grave - 0x00af, kKeyCompose, 0x002d, 0x0053, 0, // macron, minus, asciicircum - 0x00ba, kKeyCompose, 0x006f, 0x005f, 0, // masculine, o, underscore - 0x00b5, kKeyCompose, 0x0075, 0x002f, 0, // mu, u, slash - 0x00d7, kKeyCompose, 0x0078, 0x0078, 0, // multiply, x, x - 0x00a0, kKeyCompose, 0x0020, 0x0020, 0, // nobreakspace, space, space - 0x00ac, kKeyCompose, 0x002c, 0x002d, 0, // notsign, comma, minus - 0x00f1, kKeyCompose, 0x006e, 0x007e, 0, // ntilde, n, asciitilde - 0x00f3, kKeyCompose, 0x006f, 0x0027, 0, // oacute, o, apostrophe - 0x00f4, kKeyCompose, 0x006f, 0x0053, 0, // ocircumflex, o, asciicircum - 0x00f6, kKeyCompose, 0x006f, 0x0022, 0, // odiaeresis, o, quotedbl - 0x00f2, kKeyCompose, 0x006f, 0x0060, 0, // ograve, o, grave - 0x00bd, kKeyCompose, 0x0031, 0x0032, 0, // onehalf, 1, 2 - 0x00bc, kKeyCompose, 0x0031, 0x0034, 0, // onequarter, 1, 4 - 0x00b9, kKeyCompose, 0x0031, 0x0053, 0, // onesuperior, 1, asciicircum - 0x00aa, kKeyCompose, 0x0061, 0x005f, 0, // ordfeminine, a, underscore - 0x00f8, kKeyCompose, 0x006f, 0x002f, 0, // oslash, o, slash - 0x00f5, kKeyCompose, 0x006f, 0x007e, 0, // otilde, o, asciitilde - 0x00b6, kKeyCompose, 0x0070, 0x0021, 0, // paragraph, p, exclam - 0x00b7, kKeyCompose, 0x002e, 0x002e, 0, // periodcentered, period, period - 0x00b1, kKeyCompose, 0x002b, 0x002d, 0, // plusminus, plus, minus - 0x00bf, kKeyCompose, 0x003f, 0x003f, 0, // questiondown, question, question - 0x00ae, kKeyCompose, 0x0028, 0x0072, 0, // registered, parenleft, r - 0x00a7, kKeyCompose, 0x0073, 0x006f, 0, // section, s, o - 0x00df, kKeyCompose, 0x0073, 0x0073, 0, // ssharp, s, s - 0x00a3, kKeyCompose, 0x004c, 0x002d, 0, // sterling, L, minus - 0x00fe, kKeyCompose, 0x0074, 0x0068, 0, // thorn, t, h - 0x00be, kKeyCompose, 0x0033, 0x0034, 0, // threequarters, 3, 4 - 0x00b3, kKeyCompose, 0x0033, 0x0053, 0, // threesuperior, 3, asciicircum - 0x00b2, kKeyCompose, 0x0032, 0x0053, 0, // twosuperior, 2, asciicircum - 0x00fa, kKeyCompose, 0x0075, 0x0027, 0, // uacute, u, apostrophe - 0x00fb, kKeyCompose, 0x0075, 0x0053, 0, // ucircumflex, u, asciicircum - 0x00fc, kKeyCompose, 0x0075, 0x0022, 0, // udiaeresis, u, quotedbl - 0x00f9, kKeyCompose, 0x0075, 0x0060, 0, // ugrave, u, grave - 0x00fd, kKeyCompose, 0x0079, 0x0027, 0, // yacute, y, apostrophe - 0x00ff, kKeyCompose, 0x0079, 0x0022, 0, // ydiaeresis, y, quotedbl - 0x00a5, kKeyCompose, 0x0079, 0x003d, 0, // yen, y, equal + // Compose key sequences + 0x00c6, kKeyCompose, 0x0041, 0x0045, 0, // AE, A, E + 0x00c1, kKeyCompose, 0x0041, 0x0027, 0, // Aacute, A, apostrophe + 0x00c2, kKeyCompose, 0x0041, 0x0053, 0, // Acircumflex, A, asciicircum + 0x00c3, kKeyCompose, 0x0041, 0x0022, 0, // Adiaeresis, A, quotedbl + 0x00c0, kKeyCompose, 0x0041, 0x0060, 0, // Agrave, A, grave + 0x00c5, kKeyCompose, 0x0041, 0x002a, 0, // Aring, A, asterisk + 0x00c3, kKeyCompose, 0x0041, 0x007e, 0, // Atilde, A, asciitilde + 0x00c7, kKeyCompose, 0x0043, 0x002c, 0, // Ccedilla, C, comma + 0x00d0, kKeyCompose, 0x0044, 0x002d, 0, // ETH, D, minus + 0x00c9, kKeyCompose, 0x0045, 0x0027, 0, // Eacute, E, apostrophe + 0x00ca, kKeyCompose, 0x0045, 0x0053, 0, // Ecircumflex, E, asciicircum + 0x00cb, kKeyCompose, 0x0045, 0x0022, 0, // Ediaeresis, E, quotedbl + 0x00c8, kKeyCompose, 0x0045, 0x0060, 0, // Egrave, E, grave + 0x00cd, kKeyCompose, 0x0049, 0x0027, 0, // Iacute, I, apostrophe + 0x00ce, kKeyCompose, 0x0049, 0x0053, 0, // Icircumflex, I, asciicircum + 0x00cf, kKeyCompose, 0x0049, 0x0022, 0, // Idiaeresis, I, quotedbl + 0x00cc, kKeyCompose, 0x0049, 0x0060, 0, // Igrave, I, grave + 0x00d1, kKeyCompose, 0x004e, 0x007e, 0, // Ntilde, N, asciitilde + 0x00d3, kKeyCompose, 0x004f, 0x0027, 0, // Oacute, O, apostrophe + 0x00d4, kKeyCompose, 0x004f, 0x0053, 0, // Ocircumflex, O, asciicircum + 0x00d6, kKeyCompose, 0x004f, 0x0022, 0, // Odiaeresis, O, quotedbl + 0x00d2, kKeyCompose, 0x004f, 0x0060, 0, // Ograve, O, grave + 0x00d8, kKeyCompose, 0x004f, 0x002f, 0, // Ooblique, O, slash + 0x00d5, kKeyCompose, 0x004f, 0x007e, 0, // Otilde, O, asciitilde + 0x00de, kKeyCompose, 0x0054, 0x0048, 0, // THORN, T, H + 0x00da, kKeyCompose, 0x0055, 0x0027, 0, // Uacute, U, apostrophe + 0x00db, kKeyCompose, 0x0055, 0x0053, 0, // Ucircumflex, U, asciicircum + 0x00dc, kKeyCompose, 0x0055, 0x0022, 0, // Udiaeresis, U, quotedbl + 0x00d9, kKeyCompose, 0x0055, 0x0060, 0, // Ugrave, U, grave + 0x00dd, kKeyCompose, 0x0059, 0x0027, 0, // Yacute, Y, apostrophe + 0x00e1, kKeyCompose, 0x0061, 0x0027, 0, // aacute, a, apostrophe + 0x00e2, kKeyCompose, 0x0061, 0x0053, 0, // acircumflex, a, asciicircum + 0x00b4, kKeyCompose, 0x0027, 0x0027, 0, // acute, apostrophe, apostrophe + 0x00e4, kKeyCompose, 0x0061, 0x0022, 0, // adiaeresis, a, quotedbl + 0x00e6, kKeyCompose, 0x0061, 0x0065, 0, // ae, a, e + 0x00e0, kKeyCompose, 0x0061, 0x0060, 0, // agrave, a, grave + 0x00e5, kKeyCompose, 0x0061, 0x002a, 0, // aring, a, asterisk + 0x0040, kKeyCompose, 0x0041, 0x0054, 0, // at, A, T + 0x00e3, kKeyCompose, 0x0061, 0x007e, 0, // atilde, a, asciitilde + 0x005c, kKeyCompose, 0x002f, 0x002f, 0, // backslash, slash, slash + 0x007c, kKeyCompose, 0x004c, 0x0056, 0, // bar, L, V + 0x007b, kKeyCompose, 0x0028, 0x002d, 0, // braceleft, parenleft, minus + 0x007d, kKeyCompose, 0x0029, 0x002d, 0, // braceright, parenright, minus + 0x005b, kKeyCompose, 0x0028, 0x0028, 0, // bracketleft, parenleft, parenleft + 0x005d, kKeyCompose, 0x0029, 0x0029, 0, // bracketright, parenright, parenright + 0x00a6, kKeyCompose, 0x0042, 0x0056, 0, // brokenbar, B, V + 0x00e7, kKeyCompose, 0x0063, 0x002c, 0, // ccedilla, c, comma + 0x00b8, kKeyCompose, 0x002c, 0x002c, 0, // cedilla, comma, comma + 0x00a2, kKeyCompose, 0x0063, 0x002f, 0, // cent, c, slash + 0x00a9, kKeyCompose, 0x0028, 0x0063, 0, // copyright, parenleft, c + 0x00a4, kKeyCompose, 0x006f, 0x0078, 0, // currency, o, x + 0x00b0, kKeyCompose, 0x0030, 0x0053, 0, // degree, 0, asciicircum + 0x00a8, kKeyCompose, 0x0022, 0x0022, 0, // diaeresis, quotedbl, quotedbl + 0x00f7, kKeyCompose, 0x003a, 0x002d, 0, // division, colon, minus + 0x00e9, kKeyCompose, 0x0065, 0x0027, 0, // eacute, e, apostrophe + 0x00ea, kKeyCompose, 0x0065, 0x0053, 0, // ecircumflex, e, asciicircum + 0x00eb, kKeyCompose, 0x0065, 0x0022, 0, // ediaeresis, e, quotedbl + 0x00e8, kKeyCompose, 0x0065, 0x0060, 0, // egrave, e, grave + 0x00f0, kKeyCompose, 0x0064, 0x002d, 0, // eth, d, minus + 0x00a1, kKeyCompose, 0x0021, 0x0021, 0, // exclamdown, exclam, exclam + 0x00ab, kKeyCompose, 0x003c, 0x003c, 0, // guillemotleft, less, less + 0x00bb, kKeyCompose, 0x003e, 0x003e, 0, // guillemotright, greater, greater + 0x0023, kKeyCompose, 0x002b, 0x002b, 0, // numbersign, plus, plus + 0x00ad, kKeyCompose, 0x002d, 0x002d, 0, // hyphen, minus, minus + 0x00ed, kKeyCompose, 0x0069, 0x0027, 0, // iacute, i, apostrophe + 0x00ee, kKeyCompose, 0x0069, 0x0053, 0, // icircumflex, i, asciicircum + 0x00ef, kKeyCompose, 0x0069, 0x0022, 0, // idiaeresis, i, quotedbl + 0x00ec, kKeyCompose, 0x0069, 0x0060, 0, // igrave, i, grave + 0x00af, kKeyCompose, 0x002d, 0x0053, 0, // macron, minus, asciicircum + 0x00ba, kKeyCompose, 0x006f, 0x005f, 0, // masculine, o, underscore + 0x00b5, kKeyCompose, 0x0075, 0x002f, 0, // mu, u, slash + 0x00d7, kKeyCompose, 0x0078, 0x0078, 0, // multiply, x, x + 0x00a0, kKeyCompose, 0x0020, 0x0020, 0, // nobreakspace, space, space + 0x00ac, kKeyCompose, 0x002c, 0x002d, 0, // notsign, comma, minus + 0x00f1, kKeyCompose, 0x006e, 0x007e, 0, // ntilde, n, asciitilde + 0x00f3, kKeyCompose, 0x006f, 0x0027, 0, // oacute, o, apostrophe + 0x00f4, kKeyCompose, 0x006f, 0x0053, 0, // ocircumflex, o, asciicircum + 0x00f6, kKeyCompose, 0x006f, 0x0022, 0, // odiaeresis, o, quotedbl + 0x00f2, kKeyCompose, 0x006f, 0x0060, 0, // ograve, o, grave + 0x00bd, kKeyCompose, 0x0031, 0x0032, 0, // onehalf, 1, 2 + 0x00bc, kKeyCompose, 0x0031, 0x0034, 0, // onequarter, 1, 4 + 0x00b9, kKeyCompose, 0x0031, 0x0053, 0, // onesuperior, 1, asciicircum + 0x00aa, kKeyCompose, 0x0061, 0x005f, 0, // ordfeminine, a, underscore + 0x00f8, kKeyCompose, 0x006f, 0x002f, 0, // oslash, o, slash + 0x00f5, kKeyCompose, 0x006f, 0x007e, 0, // otilde, o, asciitilde + 0x00b6, kKeyCompose, 0x0070, 0x0021, 0, // paragraph, p, exclam + 0x00b7, kKeyCompose, 0x002e, 0x002e, 0, // periodcentered, period, period + 0x00b1, kKeyCompose, 0x002b, 0x002d, 0, // plusminus, plus, minus + 0x00bf, kKeyCompose, 0x003f, 0x003f, 0, // questiondown, question, question + 0x00ae, kKeyCompose, 0x0028, 0x0072, 0, // registered, parenleft, r + 0x00a7, kKeyCompose, 0x0073, 0x006f, 0, // section, s, o + 0x00df, kKeyCompose, 0x0073, 0x0073, 0, // ssharp, s, s + 0x00a3, kKeyCompose, 0x004c, 0x002d, 0, // sterling, L, minus + 0x00fe, kKeyCompose, 0x0074, 0x0068, 0, // thorn, t, h + 0x00be, kKeyCompose, 0x0033, 0x0034, 0, // threequarters, 3, 4 + 0x00b3, kKeyCompose, 0x0033, 0x0053, 0, // threesuperior, 3, asciicircum + 0x00b2, kKeyCompose, 0x0032, 0x0053, 0, // twosuperior, 2, asciicircum + 0x00fa, kKeyCompose, 0x0075, 0x0027, 0, // uacute, u, apostrophe + 0x00fb, kKeyCompose, 0x0075, 0x0053, 0, // ucircumflex, u, asciicircum + 0x00fc, kKeyCompose, 0x0075, 0x0022, 0, // udiaeresis, u, quotedbl + 0x00f9, kKeyCompose, 0x0075, 0x0060, 0, // ugrave, u, grave + 0x00fd, kKeyCompose, 0x0079, 0x0027, 0, // yacute, y, apostrophe + 0x00ff, kKeyCompose, 0x0079, 0x0022, 0, // ydiaeresis, y, quotedbl + 0x00a5, kKeyCompose, 0x0079, 0x003d, 0, // yen, y, equal - // end of table - 0 + // end of table + 0 }; static const KeyID s_numpadTable[] = { - kKeyKP_Space, 0x0020, - kKeyKP_Tab, kKeyTab, - kKeyKP_Enter, kKeyReturn, - kKeyKP_F1, kKeyF1, - kKeyKP_F2, kKeyF2, - kKeyKP_F3, kKeyF3, - kKeyKP_F4, kKeyF4, - kKeyKP_Home, kKeyHome, - kKeyKP_Left, kKeyLeft, - kKeyKP_Up, kKeyUp, - kKeyKP_Right, kKeyRight, - kKeyKP_Down, kKeyDown, - kKeyKP_PageUp, kKeyPageUp, - kKeyKP_PageDown, kKeyPageDown, - kKeyKP_End, kKeyEnd, - kKeyKP_Begin, kKeyBegin, - kKeyKP_Insert, kKeyInsert, - kKeyKP_Delete, kKeyDelete, - kKeyKP_Equal, 0x003d, - kKeyKP_Multiply, 0x002a, - kKeyKP_Add, 0x002b, - kKeyKP_Separator, 0x002c, - kKeyKP_Subtract, 0x002d, - kKeyKP_Decimal, 0x002e, - kKeyKP_Divide, 0x002f, - kKeyKP_0, 0x0030, - kKeyKP_1, 0x0031, - kKeyKP_2, 0x0032, - kKeyKP_3, 0x0033, - kKeyKP_4, 0x0034, - kKeyKP_5, 0x0035, - kKeyKP_6, 0x0036, - kKeyKP_7, 0x0037, - kKeyKP_8, 0x0038, - kKeyKP_9, 0x0039 + kKeyKP_Space, 0x0020, + kKeyKP_Tab, kKeyTab, + kKeyKP_Enter, kKeyReturn, + kKeyKP_F1, kKeyF1, + kKeyKP_F2, kKeyF2, + kKeyKP_F3, kKeyF3, + kKeyKP_F4, kKeyF4, + kKeyKP_Home, kKeyHome, + kKeyKP_Left, kKeyLeft, + kKeyKP_Up, kKeyUp, + kKeyKP_Right, kKeyRight, + kKeyKP_Down, kKeyDown, + kKeyKP_PageUp, kKeyPageUp, + kKeyKP_PageDown, kKeyPageDown, + kKeyKP_End, kKeyEnd, + kKeyKP_Begin, kKeyBegin, + kKeyKP_Insert, kKeyInsert, + kKeyKP_Delete, kKeyDelete, + kKeyKP_Equal, 0x003d, + kKeyKP_Multiply, 0x002a, + kKeyKP_Add, 0x002b, + kKeyKP_Separator, 0x002c, + kKeyKP_Subtract, 0x002d, + kKeyKP_Decimal, 0x002e, + kKeyKP_Divide, 0x002f, + kKeyKP_0, 0x0030, + kKeyKP_1, 0x0031, + kKeyKP_2, 0x0032, + kKeyKP_3, 0x0033, + kKeyKP_4, 0x0034, + kKeyKP_5, 0x0035, + kKeyKP_6, 0x0036, + kKeyKP_7, 0x0037, + kKeyKP_8, 0x0038, + kKeyKP_9, 0x0039 }; // @@ -384,541 +384,541 @@ static const KeyID s_numpadTable[] = { // KeyState::KeyState(IEventQueue* events) : - IKeyState(events), - m_keyMapPtr(new synergy::KeyMap()), - m_keyMap(*m_keyMapPtr), - m_mask(0), - m_events(events) + IKeyState(events), + m_keyMapPtr(new synergy::KeyMap()), + m_keyMap(*m_keyMapPtr), + m_mask(0), + m_events(events) { - init(); + init(); } KeyState::KeyState(IEventQueue* events, synergy::KeyMap& keyMap) : - IKeyState(events), - m_keyMapPtr(0), - m_keyMap(keyMap), - m_mask(0), - m_events(events) + IKeyState(events), + m_keyMapPtr(0), + m_keyMap(keyMap), + m_mask(0), + m_events(events) { - init(); + init(); } KeyState::~KeyState() { - if (m_keyMapPtr) - delete m_keyMapPtr; + if (m_keyMapPtr) + delete m_keyMapPtr; } void KeyState::init() { - memset(&m_keys, 0, sizeof(m_keys)); - memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys)); - memset(&m_keyClientData, 0, sizeof(m_keyClientData)); - memset(&m_serverKeys, 0, sizeof(m_serverKeys)); + memset(&m_keys, 0, sizeof(m_keys)); + memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys)); + memset(&m_keyClientData, 0, sizeof(m_keyClientData)); + memset(&m_serverKeys, 0, sizeof(m_serverKeys)); } void KeyState::onKey(KeyButton button, bool down, KeyModifierMask newState) { - // update modifier state - m_mask = newState; - LOG((CLOG_DEBUG1 "new mask: 0x%04x", m_mask)); + // update modifier state + m_mask = newState; + LOG((CLOG_DEBUG1 "new mask: 0x%04x", m_mask)); - // ignore bogus buttons - button &= kButtonMask; - if (button == 0) { - return; - } + // ignore bogus buttons + button &= kButtonMask; + if (button == 0) { + return; + } - // update key state - if (down) { - m_keys[button] = 1; - m_syntheticKeys[button] = 1; - } - else { - m_keys[button] = 0; - m_syntheticKeys[button] = 0; - } + // update key state + if (down) { + m_keys[button] = 1; + m_syntheticKeys[button] = 1; + } + else { + m_keys[button] = 0; + m_syntheticKeys[button] = 0; + } } void KeyState::sendKeyEvent( - void* target, bool press, bool isAutoRepeat, - KeyID key, KeyModifierMask mask, - SInt32 count, KeyButton button) + void* target, bool press, bool isAutoRepeat, + KeyID key, KeyModifierMask mask, + SInt32 count, KeyButton button) { - if (m_keyMap.isHalfDuplex(key, button)) { - if (isAutoRepeat) { - // ignore auto-repeat on half-duplex keys - } - else { - m_events->addEvent(Event(m_events->forIKeyState().keyDown(), target, - KeyInfo::alloc(key, mask, button, 1))); - m_events->addEvent(Event(m_events->forIKeyState().keyUp(), target, - KeyInfo::alloc(key, mask, button, 1))); - } - } - else { - if (isAutoRepeat) { - m_events->addEvent(Event(m_events->forIKeyState().keyRepeat(), target, - KeyInfo::alloc(key, mask, button, count))); - } - else if (press) { - m_events->addEvent(Event(m_events->forIKeyState().keyDown(), target, - KeyInfo::alloc(key, mask, button, 1))); - } - else { - m_events->addEvent(Event(m_events->forIKeyState().keyUp(), target, - KeyInfo::alloc(key, mask, button, 1))); - } - } + if (m_keyMap.isHalfDuplex(key, button)) { + if (isAutoRepeat) { + // ignore auto-repeat on half-duplex keys + } + else { + m_events->addEvent(Event(m_events->forIKeyState().keyDown(), target, + KeyInfo::alloc(key, mask, button, 1))); + m_events->addEvent(Event(m_events->forIKeyState().keyUp(), target, + KeyInfo::alloc(key, mask, button, 1))); + } + } + else { + if (isAutoRepeat) { + m_events->addEvent(Event(m_events->forIKeyState().keyRepeat(), target, + KeyInfo::alloc(key, mask, button, count))); + } + else if (press) { + m_events->addEvent(Event(m_events->forIKeyState().keyDown(), target, + KeyInfo::alloc(key, mask, button, 1))); + } + else { + m_events->addEvent(Event(m_events->forIKeyState().keyUp(), target, + KeyInfo::alloc(key, mask, button, 1))); + } + } } void KeyState::updateKeyMap() { - // get the current keyboard map - synergy::KeyMap keyMap; - getKeyMap(keyMap); - m_keyMap.swap(keyMap); - m_keyMap.finish(); + // get the current keyboard map + synergy::KeyMap keyMap; + getKeyMap(keyMap); + m_keyMap.swap(keyMap); + m_keyMap.finish(); - // add special keys - addCombinationEntries(); - addKeypadEntries(); - addAliasEntries(); + // add special keys + addCombinationEntries(); + addKeypadEntries(); + addAliasEntries(); } void KeyState::updateKeyState() { - // reset our state - memset(&m_keys, 0, sizeof(m_keys)); - memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys)); - memset(&m_keyClientData, 0, sizeof(m_keyClientData)); - memset(&m_serverKeys, 0, sizeof(m_serverKeys)); - m_activeModifiers.clear(); + // reset our state + memset(&m_keys, 0, sizeof(m_keys)); + memset(&m_syntheticKeys, 0, sizeof(m_syntheticKeys)); + memset(&m_keyClientData, 0, sizeof(m_keyClientData)); + memset(&m_serverKeys, 0, sizeof(m_serverKeys)); + m_activeModifiers.clear(); - // get the current keyboard state - KeyButtonSet keysDown; - pollPressedKeys(keysDown); - for (KeyButtonSet::const_iterator i = keysDown.begin(); - i != keysDown.end(); ++i) { - m_keys[*i] = 1; - } + // get the current keyboard state + KeyButtonSet keysDown; + pollPressedKeys(keysDown); + for (KeyButtonSet::const_iterator i = keysDown.begin(); + i != keysDown.end(); ++i) { + m_keys[*i] = 1; + } - // get the current modifier state - m_mask = pollActiveModifiers(); + // get the current modifier state + m_mask = pollActiveModifiers(); - // set active modifiers - AddActiveModifierContext addModifierContext(pollActiveGroup(), m_mask, - m_activeModifiers); - m_keyMap.foreachKey(&KeyState::addActiveModifierCB, &addModifierContext); + // set active modifiers + AddActiveModifierContext addModifierContext(pollActiveGroup(), m_mask, + m_activeModifiers); + m_keyMap.foreachKey(&KeyState::addActiveModifierCB, &addModifierContext); - LOG((CLOG_DEBUG1 "modifiers on update: 0x%04x", m_mask)); + LOG((CLOG_DEBUG1 "modifiers on update: 0x%04x", m_mask)); } void KeyState::addActiveModifierCB(KeyID, SInt32 group, - synergy::KeyMap::KeyItem& keyItem, void* vcontext) + synergy::KeyMap::KeyItem& keyItem, void* vcontext) { - AddActiveModifierContext* context = - static_cast(vcontext); - if (group == context->m_activeGroup && - (keyItem.m_generates & context->m_mask) != 0) { - context->m_activeModifiers.insert(std::make_pair( - keyItem.m_generates, keyItem)); - } + AddActiveModifierContext* context = + static_cast(vcontext); + if (group == context->m_activeGroup && + (keyItem.m_generates & context->m_mask) != 0) { + context->m_activeModifiers.insert(std::make_pair( + keyItem.m_generates, keyItem)); + } } void KeyState::setHalfDuplexMask(KeyModifierMask mask) { - m_keyMap.clearHalfDuplexModifiers(); - if ((mask & KeyModifierCapsLock) != 0) { - m_keyMap.addHalfDuplexModifier(kKeyCapsLock); - } - if ((mask & KeyModifierNumLock) != 0) { - m_keyMap.addHalfDuplexModifier(kKeyNumLock); - } - if ((mask & KeyModifierScrollLock) != 0) { - m_keyMap.addHalfDuplexModifier(kKeyScrollLock); - } + m_keyMap.clearHalfDuplexModifiers(); + if ((mask & KeyModifierCapsLock) != 0) { + m_keyMap.addHalfDuplexModifier(kKeyCapsLock); + } + if ((mask & KeyModifierNumLock) != 0) { + m_keyMap.addHalfDuplexModifier(kKeyNumLock); + } + if ((mask & KeyModifierScrollLock) != 0) { + m_keyMap.addHalfDuplexModifier(kKeyScrollLock); + } } void KeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, KeyButton serverID) { - // if this server key is already down then this is probably a - // mis-reported autorepeat. - serverID &= kButtonMask; - if (m_serverKeys[serverID] != 0) { - fakeKeyRepeat(id, mask, 1, serverID); - return; - } + // if this server key is already down then this is probably a + // mis-reported autorepeat. + serverID &= kButtonMask; + if (m_serverKeys[serverID] != 0) { + fakeKeyRepeat(id, mask, 1, serverID); + return; + } - // ignore certain keys - if (isIgnoredKey(id, mask)) { - LOG((CLOG_DEBUG1 "ignored key %04x %04x", id, mask)); - return; - } + // ignore certain keys + if (isIgnoredKey(id, mask)) { + LOG((CLOG_DEBUG1 "ignored key %04x %04x", id, mask)); + return; + } - // get keys for key press - Keystrokes keys; - ModifierToKeys oldActiveModifiers = m_activeModifiers; - const synergy::KeyMap::KeyItem* keyItem = - m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers, - getActiveModifiersRValue(), mask, false); - if (keyItem == NULL) { - // a media key won't be mapped on mac, so we need to fake it in a - // special way - if (id == kKeyAudioDown || id == kKeyAudioUp || - id == kKeyAudioMute || id == kKeyAudioPlay || - id == kKeyAudioPrev || id == kKeyAudioNext || - id == kKeyBrightnessDown || id == kKeyBrightnessUp - ) { - LOG((CLOG_DEBUG1 "emulating media key")); - fakeMediaKey(id); - } - - return; - } - - KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask); - updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers); - if (localID != 0) { - // note keys down - ++m_keys[localID]; - ++m_syntheticKeys[localID]; - m_keyClientData[localID] = keyItem->m_client; - m_serverKeys[serverID] = localID; - } + // get keys for key press + Keystrokes keys; + ModifierToKeys oldActiveModifiers = m_activeModifiers; + const synergy::KeyMap::KeyItem* keyItem = + m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers, + getActiveModifiersRValue(), mask, false); + if (keyItem == NULL) { + // a media key won't be mapped on mac, so we need to fake it in a + // special way + if (id == kKeyAudioDown || id == kKeyAudioUp || + id == kKeyAudioMute || id == kKeyAudioPlay || + id == kKeyAudioPrev || id == kKeyAudioNext || + id == kKeyBrightnessDown || id == kKeyBrightnessUp + ) { + LOG((CLOG_DEBUG1 "emulating media key")); + fakeMediaKey(id); + } + + return; + } + + KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask); + updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers); + if (localID != 0) { + // note keys down + ++m_keys[localID]; + ++m_syntheticKeys[localID]; + m_keyClientData[localID] = keyItem->m_client; + m_serverKeys[serverID] = localID; + } - // generate key events - fakeKeys(keys, 1); + // generate key events + fakeKeys(keys, 1); } bool KeyState::fakeKeyRepeat( - KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton serverID) + KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton serverID) { - serverID &= kButtonMask; + serverID &= kButtonMask; - // if we haven't seen this button go down then ignore it - KeyButton oldLocalID = m_serverKeys[serverID]; - if (oldLocalID == 0) { - return false; - } + // if we haven't seen this button go down then ignore it + KeyButton oldLocalID = m_serverKeys[serverID]; + if (oldLocalID == 0) { + return false; + } - // get keys for key repeat - Keystrokes keys; - ModifierToKeys oldActiveModifiers = m_activeModifiers; - const synergy::KeyMap::KeyItem* keyItem = - m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers, - getActiveModifiersRValue(), mask, true); - if (keyItem == NULL) { - return false; - } - KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask); - if (localID == 0) { - return false; - } + // get keys for key repeat + Keystrokes keys; + ModifierToKeys oldActiveModifiers = m_activeModifiers; + const synergy::KeyMap::KeyItem* keyItem = + m_keyMap.mapKey(keys, id, pollActiveGroup(), m_activeModifiers, + getActiveModifiersRValue(), mask, true); + if (keyItem == NULL) { + return false; + } + KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask); + if (localID == 0) { + return false; + } - // if the KeyButton for the auto-repeat is not the same as for the - // initial press then mark the initial key as released and the new - // key as pressed. this can happen when we auto-repeat after a - // dead key. for example, a dead accent followed by 'a' will - // generate an 'a with accent' followed by a repeating 'a'. the - // KeyButtons for the two KeyIDs might be different. - if (localID != oldLocalID) { - // replace key up with previous KeyButton but leave key down - // alone so it uses the new KeyButton. - for (Keystrokes::iterator index = keys.begin(); - index != keys.end(); ++index) { - if (index->m_type == Keystroke::kButton && - index->m_data.m_button.m_button == localID) { - index->m_data.m_button.m_button = oldLocalID; - break; - } - } + // if the KeyButton for the auto-repeat is not the same as for the + // initial press then mark the initial key as released and the new + // key as pressed. this can happen when we auto-repeat after a + // dead key. for example, a dead accent followed by 'a' will + // generate an 'a with accent' followed by a repeating 'a'. the + // KeyButtons for the two KeyIDs might be different. + if (localID != oldLocalID) { + // replace key up with previous KeyButton but leave key down + // alone so it uses the new KeyButton. + for (Keystrokes::iterator index = keys.begin(); + index != keys.end(); ++index) { + if (index->m_type == Keystroke::kButton && + index->m_data.m_button.m_button == localID) { + index->m_data.m_button.m_button = oldLocalID; + break; + } + } - // note that old key is now up - --m_keys[oldLocalID]; - --m_syntheticKeys[oldLocalID]; + // note that old key is now up + --m_keys[oldLocalID]; + --m_syntheticKeys[oldLocalID]; - // note keys down - updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers); - ++m_keys[localID]; - ++m_syntheticKeys[localID]; - m_keyClientData[localID] = keyItem->m_client; - m_serverKeys[serverID] = localID; - } + // note keys down + updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers); + ++m_keys[localID]; + ++m_syntheticKeys[localID]; + m_keyClientData[localID] = keyItem->m_client; + m_serverKeys[serverID] = localID; + } - // generate key events - fakeKeys(keys, count); - return true; + // generate key events + fakeKeys(keys, count); + return true; } bool KeyState::fakeKeyUp(KeyButton serverID) { - // if we haven't seen this button go down then ignore it - KeyButton localID = m_serverKeys[serverID & kButtonMask]; - if (localID == 0) { - return false; - } + // if we haven't seen this button go down then ignore it + KeyButton localID = m_serverKeys[serverID & kButtonMask]; + if (localID == 0) { + return false; + } - // get the sequence of keys to simulate key release - Keystrokes keys; - keys.push_back(Keystroke(localID, false, false, m_keyClientData[localID])); + // get the sequence of keys to simulate key release + Keystrokes keys; + keys.push_back(Keystroke(localID, false, false, m_keyClientData[localID])); - // note keys down - --m_keys[localID]; - --m_syntheticKeys[localID]; - m_serverKeys[serverID] = 0; + // note keys down + --m_keys[localID]; + --m_syntheticKeys[localID]; + m_serverKeys[serverID] = 0; - // check if this is a modifier - ModifierToKeys::iterator i = m_activeModifiers.begin(); - while (i != m_activeModifiers.end()) { - if (i->second.m_button == localID && !i->second.m_lock) { - // modifier is no longer down - KeyModifierMask mask = i->first; + // check if this is a modifier + ModifierToKeys::iterator i = m_activeModifiers.begin(); + while (i != m_activeModifiers.end()) { + if (i->second.m_button == localID && !i->second.m_lock) { + // modifier is no longer down + KeyModifierMask mask = i->first; - ModifierToKeys::iterator tmp = i; - ++i; - m_activeModifiers.erase(tmp); + ModifierToKeys::iterator tmp = i; + ++i; + m_activeModifiers.erase(tmp); - if (m_activeModifiers.count(mask) == 0) { - // no key for modifier is down so deactivate modifier - m_mask &= ~mask; - LOG((CLOG_DEBUG1 "new state %04x", m_mask)); - } - } - else { - ++i; - } - } + if (m_activeModifiers.count(mask) == 0) { + // no key for modifier is down so deactivate modifier + m_mask &= ~mask; + LOG((CLOG_DEBUG1 "new state %04x", m_mask)); + } + } + else { + ++i; + } + } - // generate key events - fakeKeys(keys, 1); - return true; + // generate key events + fakeKeys(keys, 1); + return true; } void KeyState::fakeAllKeysUp() { - Keystrokes keys; - for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { - if (m_syntheticKeys[i] > 0) { - keys.push_back(Keystroke(i, false, false, m_keyClientData[i])); - m_keys[i] = 0; - m_syntheticKeys[i] = 0; - } - } - fakeKeys(keys, 1); - memset(&m_serverKeys, 0, sizeof(m_serverKeys)); - m_activeModifiers.clear(); - m_mask = pollActiveModifiers(); + Keystrokes keys; + for (KeyButton i = 0; i < IKeyState::kNumButtons; ++i) { + if (m_syntheticKeys[i] > 0) { + keys.push_back(Keystroke(i, false, false, m_keyClientData[i])); + m_keys[i] = 0; + m_syntheticKeys[i] = 0; + } + } + fakeKeys(keys, 1); + memset(&m_serverKeys, 0, sizeof(m_serverKeys)); + m_activeModifiers.clear(); + m_mask = pollActiveModifiers(); } bool KeyState::fakeMediaKey(KeyID id) { - return false; + return false; } bool KeyState::isKeyDown(KeyButton button) const { - return (m_keys[button & kButtonMask] > 0); + return (m_keys[button & kButtonMask] > 0); } KeyModifierMask KeyState::getActiveModifiers() const { - return m_mask; + return m_mask; } KeyModifierMask& KeyState::getActiveModifiersRValue() { - return m_mask; + return m_mask; } SInt32 KeyState::getEffectiveGroup(SInt32 group, SInt32 offset) const { - return m_keyMap.getEffectiveGroup(group, offset); + return m_keyMap.getEffectiveGroup(group, offset); } bool KeyState::isIgnoredKey(KeyID key, KeyModifierMask) const { - switch (key) { - case kKeyCapsLock: - case kKeyNumLock: - case kKeyScrollLock: - return true; + switch (key) { + case kKeyCapsLock: + case kKeyNumLock: + case kKeyScrollLock: + return true; - default: - return false; - } + default: + return false; + } } KeyButton KeyState::getButton(KeyID id, SInt32 group) const { - const synergy::KeyMap::KeyItemList* items = - m_keyMap.findCompatibleKey(id, group, 0, 0); - if (items == NULL) { - return 0; - } - else { - return items->back().m_button; - } + const synergy::KeyMap::KeyItemList* items = + m_keyMap.findCompatibleKey(id, group, 0, 0); + if (items == NULL) { + return 0; + } + else { + return items->back().m_button; + } } void KeyState::addAliasEntries() { - for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { - // if we can't shift any kKeyTab key in a particular group but we can - // shift kKeyLeftTab then add a shifted kKeyTab entry that matches a - // shifted kKeyLeftTab entry. - m_keyMap.addKeyAliasEntry(kKeyTab, g, - KeyModifierShift, KeyModifierShift, - kKeyLeftTab, - KeyModifierShift, KeyModifierShift); + for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { + // if we can't shift any kKeyTab key in a particular group but we can + // shift kKeyLeftTab then add a shifted kKeyTab entry that matches a + // shifted kKeyLeftTab entry. + m_keyMap.addKeyAliasEntry(kKeyTab, g, + KeyModifierShift, KeyModifierShift, + kKeyLeftTab, + KeyModifierShift, KeyModifierShift); - // if we have no kKeyLeftTab but we do have a kKeyTab that can be - // shifted then add kKeyLeftTab that matches a kKeyTab. - m_keyMap.addKeyAliasEntry(kKeyLeftTab, g, - KeyModifierShift, KeyModifierShift, - kKeyTab, - 0, KeyModifierShift); + // if we have no kKeyLeftTab but we do have a kKeyTab that can be + // shifted then add kKeyLeftTab that matches a kKeyTab. + m_keyMap.addKeyAliasEntry(kKeyLeftTab, g, + KeyModifierShift, KeyModifierShift, + kKeyTab, + 0, KeyModifierShift); - // map non-breaking space to space - m_keyMap.addKeyAliasEntry(0x20, g, 0, 0, 0xa0, 0, 0); - } + // map non-breaking space to space + m_keyMap.addKeyAliasEntry(0x20, g, 0, 0, 0xa0, 0, 0); + } } void KeyState::addKeypadEntries() { - // map every numpad key to its equivalent non-numpad key if it's not - // on the keyboard. - for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { - for (size_t i = 0; i < sizeof(s_numpadTable) / - sizeof(s_numpadTable[0]); i += 2) { - m_keyMap.addKeyCombinationEntry(s_numpadTable[i], g, - s_numpadTable + i + 1, 1); - } - } + // map every numpad key to its equivalent non-numpad key if it's not + // on the keyboard. + for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { + for (size_t i = 0; i < sizeof(s_numpadTable) / + sizeof(s_numpadTable[0]); i += 2) { + m_keyMap.addKeyCombinationEntry(s_numpadTable[i], g, + s_numpadTable + i + 1, 1); + } + } } void KeyState::addCombinationEntries() { - for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { - // add dead and compose key composition sequences - for (const KeyID* i = s_decomposeTable; *i != 0; ++i) { - // count the decomposed keys for this key - UInt32 numKeys = 0; - for (const KeyID* j = i; *++j != 0; ) { - ++numKeys; - } + for (SInt32 g = 0, n = m_keyMap.getNumGroups(); g < n; ++g) { + // add dead and compose key composition sequences + for (const KeyID* i = s_decomposeTable; *i != 0; ++i) { + // count the decomposed keys for this key + UInt32 numKeys = 0; + for (const KeyID* j = i; *++j != 0; ) { + ++numKeys; + } - // add an entry for this key - m_keyMap.addKeyCombinationEntry(*i, g, i + 1, numKeys); + // add an entry for this key + m_keyMap.addKeyCombinationEntry(*i, g, i + 1, numKeys); - // next key - i += numKeys + 1; - } - } + // next key + i += numKeys + 1; + } + } } void KeyState::fakeKeys(const Keystrokes& keys, UInt32 count) { - // do nothing if no keys or no repeats - if (count == 0 || keys.empty()) { - return; - } + // do nothing if no keys or no repeats + if (count == 0 || keys.empty()) { + return; + } - // generate key events - LOG((CLOG_DEBUG1 "keystrokes:")); - for (Keystrokes::const_iterator k = keys.begin(); k != keys.end(); ) { - if (k->m_type == Keystroke::kButton && k->m_data.m_button.m_repeat) { - // repeat from here up to but not including the next key - // with m_repeat == false count times. - Keystrokes::const_iterator start = k; - while (count-- > 0) { - // send repeating events - for (k = start; k != keys.end() && - k->m_type == Keystroke::kButton && - k->m_data.m_button.m_repeat; ++k) { - fakeKey(*k); - } - } + // generate key events + LOG((CLOG_DEBUG1 "keystrokes:")); + for (Keystrokes::const_iterator k = keys.begin(); k != keys.end(); ) { + if (k->m_type == Keystroke::kButton && k->m_data.m_button.m_repeat) { + // repeat from here up to but not including the next key + // with m_repeat == false count times. + Keystrokes::const_iterator start = k; + while (count-- > 0) { + // send repeating events + for (k = start; k != keys.end() && + k->m_type == Keystroke::kButton && + k->m_data.m_button.m_repeat; ++k) { + fakeKey(*k); + } + } - // note -- k is now on the first non-repeat key after the - // repeat keys, exactly where we'd like to continue from. - } - else { - // send event - fakeKey(*k); + // note -- k is now on the first non-repeat key after the + // repeat keys, exactly where we'd like to continue from. + } + else { + // send event + fakeKey(*k); - // next key - ++k; - } - } + // next key + ++k; + } + } } void KeyState::updateModifierKeyState(KeyButton button, - const ModifierToKeys& oldModifiers, - const ModifierToKeys& newModifiers) + const ModifierToKeys& oldModifiers, + const ModifierToKeys& newModifiers) { - // get the pressed modifier buttons before and after - synergy::KeyMap::ButtonToKeyMap oldKeys, newKeys; - for (ModifierToKeys::const_iterator i = oldModifiers.begin(); - i != oldModifiers.end(); ++i) { - oldKeys.insert(std::make_pair(i->second.m_button, &i->second)); - } - for (ModifierToKeys::const_iterator i = newModifiers.begin(); - i != newModifiers.end(); ++i) { - newKeys.insert(std::make_pair(i->second.m_button, &i->second)); - } + // get the pressed modifier buttons before and after + synergy::KeyMap::ButtonToKeyMap oldKeys, newKeys; + for (ModifierToKeys::const_iterator i = oldModifiers.begin(); + i != oldModifiers.end(); ++i) { + oldKeys.insert(std::make_pair(i->second.m_button, &i->second)); + } + for (ModifierToKeys::const_iterator i = newModifiers.begin(); + i != newModifiers.end(); ++i) { + newKeys.insert(std::make_pair(i->second.m_button, &i->second)); + } - // get the modifier buttons that were pressed or released - synergy::KeyMap::ButtonToKeyMap pressed, released; - std::set_difference(oldKeys.begin(), oldKeys.end(), - newKeys.begin(), newKeys.end(), - std::inserter(released, released.end()), - ButtonToKeyLess()); - std::set_difference(newKeys.begin(), newKeys.end(), - oldKeys.begin(), oldKeys.end(), - std::inserter(pressed, pressed.end()), - ButtonToKeyLess()); + // get the modifier buttons that were pressed or released + synergy::KeyMap::ButtonToKeyMap pressed, released; + std::set_difference(oldKeys.begin(), oldKeys.end(), + newKeys.begin(), newKeys.end(), + std::inserter(released, released.end()), + ButtonToKeyLess()); + std::set_difference(newKeys.begin(), newKeys.end(), + oldKeys.begin(), oldKeys.end(), + std::inserter(pressed, pressed.end()), + ButtonToKeyLess()); - // update state - for (synergy::KeyMap::ButtonToKeyMap::const_iterator i = released.begin(); - i != released.end(); ++i) { - if (i->first != button) { - m_keys[i->first] = 0; - m_syntheticKeys[i->first] = 0; - } - } - for (synergy::KeyMap::ButtonToKeyMap::const_iterator i = pressed.begin(); - i != pressed.end(); ++i) { - if (i->first != button) { - m_keys[i->first] = 1; - m_syntheticKeys[i->first] = 1; - m_keyClientData[i->first] = i->second->m_client; - } - } + // update state + for (synergy::KeyMap::ButtonToKeyMap::const_iterator i = released.begin(); + i != released.end(); ++i) { + if (i->first != button) { + m_keys[i->first] = 0; + m_syntheticKeys[i->first] = 0; + } + } + for (synergy::KeyMap::ButtonToKeyMap::const_iterator i = pressed.begin(); + i != pressed.end(); ++i) { + if (i->first != button) { + m_keys[i->first] = 1; + m_syntheticKeys[i->first] = 1; + m_keyClientData[i->first] = i->second->m_client; + } + } } // @@ -926,11 +926,11 @@ KeyState::updateModifierKeyState(KeyButton button, // KeyState::AddActiveModifierContext::AddActiveModifierContext( - SInt32 group, KeyModifierMask mask, - ModifierToKeys& activeModifiers) : - m_activeGroup(group), - m_mask(mask), - m_activeModifiers(activeModifiers) + SInt32 group, KeyModifierMask mask, + ModifierToKeys& activeModifiers) : + m_activeGroup(group), + m_mask(mask), + m_activeModifiers(activeModifiers) { - // do nothing + // do nothing } diff --git a/src/lib/synergy/KeyState.h b/src/lib/synergy/KeyState.h index db750536..45282ee5 100644 --- a/src/lib/synergy/KeyState.h +++ b/src/lib/synergy/KeyState.h @@ -28,205 +28,205 @@ platform specific methods. */ class KeyState : public IKeyState { public: - KeyState(IEventQueue* events); - KeyState(IEventQueue* events, synergy::KeyMap& keyMap); - virtual ~KeyState(); + KeyState(IEventQueue* events); + KeyState(IEventQueue* events, synergy::KeyMap& keyMap); + virtual ~KeyState(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Handle key event - /*! - Sets the state of \p button to down or up and updates the current - modifier state to \p newState. This method should be called by - primary screens only in response to local events. For auto-repeat - set \p down to \c true. Overrides must forward to the superclass. - */ - virtual void onKey(KeyButton button, bool down, - KeyModifierMask newState); + //! Handle key event + /*! + Sets the state of \p button to down or up and updates the current + modifier state to \p newState. This method should be called by + primary screens only in response to local events. For auto-repeat + set \p down to \c true. Overrides must forward to the superclass. + */ + virtual void onKey(KeyButton button, bool down, + KeyModifierMask newState); - //! Post a key event - /*! - Posts a key event. This may adjust the event or post additional - events in some circumstances. If this is overridden it must forward - to the superclass. - */ - virtual void sendKeyEvent(void* target, - bool press, bool isAutoRepeat, - KeyID key, KeyModifierMask mask, - SInt32 count, KeyButton button); + //! Post a key event + /*! + Posts a key event. This may adjust the event or post additional + events in some circumstances. If this is overridden it must forward + to the superclass. + */ + virtual void sendKeyEvent(void* target, + bool press, bool isAutoRepeat, + KeyID key, KeyModifierMask mask, + SInt32 count, KeyButton button); - //@} - //! @name accessors - //@{ + //@} + //! @name accessors + //@{ - //@} + //@} - // IKeyState overrides - virtual void updateKeyMap(); - virtual void updateKeyState(); - virtual void setHalfDuplexMask(KeyModifierMask); - virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button); - virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button); - virtual bool fakeKeyUp(KeyButton button); - virtual void fakeAllKeysUp(); - virtual bool fakeCtrlAltDel() = 0; - virtual bool fakeMediaKey(KeyID id); - - virtual bool isKeyDown(KeyButton) const; - virtual KeyModifierMask - getActiveModifiers() const; - virtual KeyModifierMask - pollActiveModifiers() const = 0; - virtual SInt32 pollActiveGroup() const = 0; - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; + // IKeyState overrides + virtual void updateKeyMap(); + virtual void updateKeyState(); + virtual void setHalfDuplexMask(KeyModifierMask); + virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, + KeyButton button); + virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton button); + virtual bool fakeKeyUp(KeyButton button); + virtual void fakeAllKeysUp(); + virtual bool fakeCtrlAltDel() = 0; + virtual bool fakeMediaKey(KeyID id); + + virtual bool isKeyDown(KeyButton) const; + virtual KeyModifierMask + getActiveModifiers() const; + virtual KeyModifierMask + pollActiveModifiers() const = 0; + virtual SInt32 pollActiveGroup() const = 0; + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const = 0; - SInt32 getKeyState(KeyButton keyButton) { return m_keys[keyButton]; } + SInt32 getKeyState(KeyButton keyButton) { return m_keys[keyButton]; } protected: - typedef synergy::KeyMap::Keystroke Keystroke; + typedef synergy::KeyMap::Keystroke Keystroke; - //! @name protected manipulators - //@{ + //! @name protected manipulators + //@{ - //! Get the keyboard map - /*! - Fills \p keyMap with the current keyboard map. - */ - virtual void getKeyMap(synergy::KeyMap& keyMap) = 0; + //! Get the keyboard map + /*! + Fills \p keyMap with the current keyboard map. + */ + virtual void getKeyMap(synergy::KeyMap& keyMap) = 0; - //! Fake a key event - /*! - Synthesize an event for \p keystroke. - */ - virtual void fakeKey(const Keystroke& keystroke) = 0; + //! Fake a key event + /*! + Synthesize an event for \p keystroke. + */ + virtual void fakeKey(const Keystroke& keystroke) = 0; - //! Get the active modifiers - /*! - Returns the modifiers that are currently active according to our - shadowed state. The state may be modified. - */ - virtual KeyModifierMask& - getActiveModifiersRValue(); + //! Get the active modifiers + /*! + Returns the modifiers that are currently active according to our + shadowed state. The state may be modified. + */ + virtual KeyModifierMask& + getActiveModifiersRValue(); - //@} - //! @name protected accessors - //@{ + //@} + //! @name protected accessors + //@{ - //! Compute a group number - /*! - Returns the number of the group \p offset groups after group \p group. - */ - SInt32 getEffectiveGroup(SInt32 group, SInt32 offset) const; + //! Compute a group number + /*! + Returns the number of the group \p offset groups after group \p group. + */ + SInt32 getEffectiveGroup(SInt32 group, SInt32 offset) const; - //! Check if key is ignored - /*! - Returns \c true if and only if the key should always be ignored. - The default returns \c true only for the toggle keys. - */ - virtual bool isIgnoredKey(KeyID key, KeyModifierMask mask) const; + //! Check if key is ignored + /*! + Returns \c true if and only if the key should always be ignored. + The default returns \c true only for the toggle keys. + */ + virtual bool isIgnoredKey(KeyID key, KeyModifierMask mask) const; - //! Get button for a KeyID - /*! - Return the button mapped to key \p id in group \p group if any, - otherwise returns 0. - */ - KeyButton getButton(KeyID id, SInt32 group) const; + //! Get button for a KeyID + /*! + Return the button mapped to key \p id in group \p group if any, + otherwise returns 0. + */ + KeyButton getButton(KeyID id, SInt32 group) const; - //@} + //@} private: - typedef synergy::KeyMap::Keystrokes Keystrokes; - typedef synergy::KeyMap::ModifierToKeys ModifierToKeys; + typedef synergy::KeyMap::Keystrokes Keystrokes; + typedef synergy::KeyMap::ModifierToKeys ModifierToKeys; public: - struct AddActiveModifierContext { - public: - AddActiveModifierContext(SInt32 group, KeyModifierMask mask, - ModifierToKeys& activeModifiers); + struct AddActiveModifierContext { + public: + AddActiveModifierContext(SInt32 group, KeyModifierMask mask, + ModifierToKeys& activeModifiers); - public: - SInt32 m_activeGroup; - KeyModifierMask m_mask; - ModifierToKeys& m_activeModifiers; + public: + SInt32 m_activeGroup; + KeyModifierMask m_mask; + ModifierToKeys& m_activeModifiers; - private: - // not implemented - AddActiveModifierContext(const AddActiveModifierContext&); - AddActiveModifierContext& operator=(const AddActiveModifierContext&); - }; + private: + // not implemented + AddActiveModifierContext(const AddActiveModifierContext&); + AddActiveModifierContext& operator=(const AddActiveModifierContext&); + }; private: - - class ButtonToKeyLess { - public: - bool operator()(const synergy::KeyMap::ButtonToKeyMap::value_type& a, - const synergy::KeyMap::ButtonToKeyMap::value_type b) const - { - return (a.first < b.first); - } - }; + + class ButtonToKeyLess { + public: + bool operator()(const synergy::KeyMap::ButtonToKeyMap::value_type& a, + const synergy::KeyMap::ButtonToKeyMap::value_type b) const + { + return (a.first < b.first); + } + }; - // not implemented - KeyState(const KeyState&); - KeyState& operator=(const KeyState&); + // not implemented + KeyState(const KeyState&); + KeyState& operator=(const KeyState&); - // called by all ctors. - void init(); + // called by all ctors. + void init(); - // adds alias key sequences. these are sequences that are equivalent - // to other sequences. - void addAliasEntries(); + // adds alias key sequences. these are sequences that are equivalent + // to other sequences. + void addAliasEntries(); - // adds non-keypad key sequences for keypad KeyIDs - void addKeypadEntries(); + // adds non-keypad key sequences for keypad KeyIDs + void addKeypadEntries(); - // adds key sequences for combination KeyIDs (those built using - // dead keys) - void addCombinationEntries(); + // adds key sequences for combination KeyIDs (those built using + // dead keys) + void addCombinationEntries(); - // synthesize key events. synthesize auto-repeat events count times. - void fakeKeys(const Keystrokes&, UInt32 count); + // synthesize key events. synthesize auto-repeat events count times. + void fakeKeys(const Keystrokes&, UInt32 count); - // update key state to match changes to modifiers - void updateModifierKeyState(KeyButton button, - const ModifierToKeys& oldModifiers, - const ModifierToKeys& newModifiers); + // update key state to match changes to modifiers + void updateModifierKeyState(KeyButton button, + const ModifierToKeys& oldModifiers, + const ModifierToKeys& newModifiers); - // active modifiers collection callback - static void addActiveModifierCB(KeyID id, SInt32 group, - synergy::KeyMap::KeyItem& keyItem, void* vcontext); + // active modifiers collection callback + static void addActiveModifierCB(KeyID id, SInt32 group, + synergy::KeyMap::KeyItem& keyItem, void* vcontext); private: - // must be declared before m_keyMap. used when this class owns the key map. - synergy::KeyMap* m_keyMapPtr; + // must be declared before m_keyMap. used when this class owns the key map. + synergy::KeyMap* m_keyMapPtr; - // the keyboard map - synergy::KeyMap& m_keyMap; + // the keyboard map + synergy::KeyMap& m_keyMap; - // current modifier state - KeyModifierMask m_mask; + // current modifier state + KeyModifierMask m_mask; - // the active modifiers and the buttons activating them - ModifierToKeys m_activeModifiers; + // the active modifiers and the buttons activating them + ModifierToKeys m_activeModifiers; - // current keyboard state (> 0 if pressed, 0 otherwise). this is - // initialized to the keyboard state according to the system then - // it tracks synthesized events. - SInt32 m_keys[kNumButtons]; + // current keyboard state (> 0 if pressed, 0 otherwise). this is + // initialized to the keyboard state according to the system then + // it tracks synthesized events. + SInt32 m_keys[kNumButtons]; - // synthetic keyboard state (> 0 if pressed, 0 otherwise). this - // tracks the synthesized keyboard state. if m_keys[n] > 0 but - // m_syntheticKeys[n] == 0 then the key was pressed locally and - // not synthesized yet. - SInt32 m_syntheticKeys[kNumButtons]; + // synthetic keyboard state (> 0 if pressed, 0 otherwise). this + // tracks the synthesized keyboard state. if m_keys[n] > 0 but + // m_syntheticKeys[n] == 0 then the key was pressed locally and + // not synthesized yet. + SInt32 m_syntheticKeys[kNumButtons]; - // client data for each pressed key - UInt32 m_keyClientData[kNumButtons]; + // client data for each pressed key + UInt32 m_keyClientData[kNumButtons]; - // server keyboard state. an entry is 0 if not the key isn't pressed - // otherwise it's the local KeyButton synthesized for the server key. - KeyButton m_serverKeys[kNumButtons]; + // server keyboard state. an entry is 0 if not the key isn't pressed + // otherwise it's the local KeyButton synthesized for the server key. + KeyButton m_serverKeys[kNumButtons]; - IEventQueue* m_events; + IEventQueue* m_events; }; diff --git a/src/lib/synergy/PacketStreamFilter.cpp b/src/lib/synergy/PacketStreamFilter.cpp index b7ec7f0c..ba109dbc 100644 --- a/src/lib/synergy/PacketStreamFilter.cpp +++ b/src/lib/synergy/PacketStreamFilter.cpp @@ -29,170 +29,170 @@ // PacketStreamFilter::PacketStreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream) : - StreamFilter(events, stream, adoptStream), - m_size(0), - m_inputShutdown(false), - m_events(events) + StreamFilter(events, stream, adoptStream), + m_size(0), + m_inputShutdown(false), + m_events(events) { - // do nothing + // do nothing } PacketStreamFilter::~PacketStreamFilter() { - // do nothing + // do nothing } void PacketStreamFilter::close() { - Lock lock(&m_mutex); - m_size = 0; - m_buffer.pop(m_buffer.getSize()); - StreamFilter::close(); + Lock lock(&m_mutex); + m_size = 0; + m_buffer.pop(m_buffer.getSize()); + StreamFilter::close(); } UInt32 PacketStreamFilter::read(void* buffer, UInt32 n) { - if (n == 0) { - return 0; - } + if (n == 0) { + return 0; + } - Lock lock(&m_mutex); + Lock lock(&m_mutex); - // if not enough data yet then give up - if (!isReadyNoLock()) { - return 0; - } + // if not enough data yet then give up + if (!isReadyNoLock()) { + return 0; + } - // read no more than what's left in the buffered packet - if (n > m_size) { - n = m_size; - } + // read no more than what's left in the buffered packet + if (n > m_size) { + n = m_size; + } - // read it - if (buffer != NULL) { - memcpy(buffer, m_buffer.peek(n), n); - } - m_buffer.pop(n); - m_size -= n; + // read it + if (buffer != NULL) { + memcpy(buffer, m_buffer.peek(n), n); + } + m_buffer.pop(n); + m_size -= n; - // get next packet's size if we've finished with this packet and - // there's enough data to do so. - readPacketSize(); + // get next packet's size if we've finished with this packet and + // there's enough data to do so. + readPacketSize(); - if (m_inputShutdown && m_size == 0) { - m_events->addEvent(Event(m_events->forIStream().inputShutdown(), - getEventTarget(), NULL)); - } + if (m_inputShutdown && m_size == 0) { + m_events->addEvent(Event(m_events->forIStream().inputShutdown(), + getEventTarget(), NULL)); + } - return n; + return n; } void PacketStreamFilter::write(const void* buffer, UInt32 count) { - // write the length of the payload - UInt8 length[4]; - length[0] = (UInt8)((count >> 24) & 0xff); - length[1] = (UInt8)((count >> 16) & 0xff); - length[2] = (UInt8)((count >> 8) & 0xff); - length[3] = (UInt8)( count & 0xff); - getStream()->write(length, sizeof(length)); + // write the length of the payload + UInt8 length[4]; + length[0] = (UInt8)((count >> 24) & 0xff); + length[1] = (UInt8)((count >> 16) & 0xff); + length[2] = (UInt8)((count >> 8) & 0xff); + length[3] = (UInt8)( count & 0xff); + getStream()->write(length, sizeof(length)); - // write the payload - getStream()->write(buffer, count); + // write the payload + getStream()->write(buffer, count); } void PacketStreamFilter::shutdownInput() { - Lock lock(&m_mutex); - m_size = 0; - m_buffer.pop(m_buffer.getSize()); - StreamFilter::shutdownInput(); + Lock lock(&m_mutex); + m_size = 0; + m_buffer.pop(m_buffer.getSize()); + StreamFilter::shutdownInput(); } bool PacketStreamFilter::isReady() const { - Lock lock(&m_mutex); - return isReadyNoLock(); + Lock lock(&m_mutex); + return isReadyNoLock(); } UInt32 PacketStreamFilter::getSize() const { - Lock lock(&m_mutex); - return isReadyNoLock() ? m_size : 0; + Lock lock(&m_mutex); + return isReadyNoLock() ? m_size : 0; } bool PacketStreamFilter::isReadyNoLock() const { - return (m_size != 0 && m_buffer.getSize() >= m_size); + return (m_size != 0 && m_buffer.getSize() >= m_size); } void PacketStreamFilter::readPacketSize() { - // note -- m_mutex must be locked on entry + // note -- m_mutex must be locked on entry - if (m_size == 0 && m_buffer.getSize() >= 4) { - UInt8 buffer[4]; - memcpy(buffer, m_buffer.peek(sizeof(buffer)), sizeof(buffer)); - m_buffer.pop(sizeof(buffer)); - m_size = ((UInt32)buffer[0] << 24) | - ((UInt32)buffer[1] << 16) | - ((UInt32)buffer[2] << 8) | - (UInt32)buffer[3]; - } + if (m_size == 0 && m_buffer.getSize() >= 4) { + UInt8 buffer[4]; + memcpy(buffer, m_buffer.peek(sizeof(buffer)), sizeof(buffer)); + m_buffer.pop(sizeof(buffer)); + m_size = ((UInt32)buffer[0] << 24) | + ((UInt32)buffer[1] << 16) | + ((UInt32)buffer[2] << 8) | + (UInt32)buffer[3]; + } } bool PacketStreamFilter::readMore() { - // note if we have whole packet - bool wasReady = isReadyNoLock(); + // note if we have whole packet + bool wasReady = isReadyNoLock(); - // read more data - char buffer[4096]; - UInt32 n = getStream()->read(buffer, sizeof(buffer)); - while (n > 0) { - m_buffer.write(buffer, n); - n = getStream()->read(buffer, sizeof(buffer)); - } + // read more data + char buffer[4096]; + UInt32 n = getStream()->read(buffer, sizeof(buffer)); + while (n > 0) { + m_buffer.write(buffer, n); + n = getStream()->read(buffer, sizeof(buffer)); + } - // if we don't yet have the next packet size then get it, - // if possible. - readPacketSize(); + // if we don't yet have the next packet size then get it, + // if possible. + readPacketSize(); - // note if we now have a whole packet - bool isReady = isReadyNoLock(); + // note if we now have a whole packet + bool isReady = isReadyNoLock(); - // if we weren't ready before but now we are then send a - // input ready event apparently from the filtered stream. - return (wasReady != isReady); + // if we weren't ready before but now we are then send a + // input ready event apparently from the filtered stream. + return (wasReady != isReady); } void PacketStreamFilter::filterEvent(const Event& event) { - if (event.getType() == m_events->forIStream().inputReady()) { - Lock lock(&m_mutex); - if (!readMore()) { - return; - } - } - else if (event.getType() == m_events->forIStream().inputShutdown()) { - // discard this if we have buffered data - Lock lock(&m_mutex); - m_inputShutdown = true; - if (m_size != 0) { - return; - } - } + if (event.getType() == m_events->forIStream().inputReady()) { + Lock lock(&m_mutex); + if (!readMore()) { + return; + } + } + else if (event.getType() == m_events->forIStream().inputShutdown()) { + // discard this if we have buffered data + Lock lock(&m_mutex); + m_inputShutdown = true; + if (m_size != 0) { + return; + } + } - // pass event - StreamFilter::filterEvent(event); + // pass event + StreamFilter::filterEvent(event); } diff --git a/src/lib/synergy/PacketStreamFilter.h b/src/lib/synergy/PacketStreamFilter.h index 674a6a9b..e196235f 100644 --- a/src/lib/synergy/PacketStreamFilter.h +++ b/src/lib/synergy/PacketStreamFilter.h @@ -30,30 +30,30 @@ Filters a stream to read and write packets. */ class PacketStreamFilter : public StreamFilter { public: - PacketStreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream = true); - ~PacketStreamFilter(); + PacketStreamFilter(IEventQueue* events, synergy::IStream* stream, bool adoptStream = true); + ~PacketStreamFilter(); - // IStream overrides - virtual void close(); - virtual UInt32 read(void* buffer, UInt32 n); - virtual void write(const void* buffer, UInt32 n); - virtual void shutdownInput(); - virtual bool isReady() const; - virtual UInt32 getSize() const; + // IStream overrides + virtual void close(); + virtual UInt32 read(void* buffer, UInt32 n); + virtual void write(const void* buffer, UInt32 n); + virtual void shutdownInput(); + virtual bool isReady() const; + virtual UInt32 getSize() const; protected: - // StreamFilter overrides - virtual void filterEvent(const Event&); + // StreamFilter overrides + virtual void filterEvent(const Event&); private: - bool isReadyNoLock() const; - void readPacketSize(); - bool readMore(); + bool isReadyNoLock() const; + void readPacketSize(); + bool readMore(); private: - Mutex m_mutex; - UInt32 m_size; - StreamBuffer m_buffer; - bool m_inputShutdown; - IEventQueue* m_events; + Mutex m_mutex; + UInt32 m_size; + StreamBuffer m_buffer; + bool m_inputShutdown; + IEventQueue* m_events; }; diff --git a/src/lib/synergy/PlatformScreen.cpp b/src/lib/synergy/PlatformScreen.cpp index 59bf3a1f..e94b7755 100644 --- a/src/lib/synergy/PlatformScreen.cpp +++ b/src/lib/synergy/PlatformScreen.cpp @@ -21,103 +21,103 @@ #include "synergy/ArgsBase.h" PlatformScreen::PlatformScreen(IEventQueue* events) : - IPlatformScreen(events), - m_draggingStarted(false), - m_fakeDraggingStarted(false) + IPlatformScreen(events), + m_draggingStarted(false), + m_fakeDraggingStarted(false) { } PlatformScreen::~PlatformScreen() { - // do nothing + // do nothing } void PlatformScreen::updateKeyMap() { - getKeyState()->updateKeyMap(); + getKeyState()->updateKeyMap(); } void PlatformScreen::updateKeyState() { - getKeyState()->updateKeyState(); - updateButtons(); + getKeyState()->updateKeyState(); + updateButtons(); } void PlatformScreen::setHalfDuplexMask(KeyModifierMask mask) { - getKeyState()->setHalfDuplexMask(mask); + getKeyState()->setHalfDuplexMask(mask); } void PlatformScreen::fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button) + KeyButton button) { - getKeyState()->fakeKeyDown(id, mask, button); + getKeyState()->fakeKeyDown(id, mask, button); } bool PlatformScreen::fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button) + SInt32 count, KeyButton button) { - return getKeyState()->fakeKeyRepeat(id, mask, count, button); + return getKeyState()->fakeKeyRepeat(id, mask, count, button); } bool PlatformScreen::fakeKeyUp(KeyButton button) { - return getKeyState()->fakeKeyUp(button); + return getKeyState()->fakeKeyUp(button); } void PlatformScreen::fakeAllKeysUp() { - getKeyState()->fakeAllKeysUp(); + getKeyState()->fakeAllKeysUp(); } bool PlatformScreen::fakeCtrlAltDel() { - return getKeyState()->fakeCtrlAltDel(); + return getKeyState()->fakeCtrlAltDel(); } bool PlatformScreen::isKeyDown(KeyButton button) const { - return getKeyState()->isKeyDown(button); + return getKeyState()->isKeyDown(button); } KeyModifierMask PlatformScreen::getActiveModifiers() const { - return getKeyState()->getActiveModifiers(); + return getKeyState()->getActiveModifiers(); } KeyModifierMask PlatformScreen::pollActiveModifiers() const { - return getKeyState()->pollActiveModifiers(); + return getKeyState()->pollActiveModifiers(); } SInt32 PlatformScreen::pollActiveGroup() const { - return getKeyState()->pollActiveGroup(); + return getKeyState()->pollActiveGroup(); } void PlatformScreen::pollPressedKeys(KeyButtonSet& pressedKeys) const { - getKeyState()->pollPressedKeys(pressedKeys); + getKeyState()->pollPressedKeys(pressedKeys); } bool PlatformScreen::isDraggingStarted() { - if (App::instance().argsBase().m_enableDragDrop) { - return m_draggingStarted; - } - return false; + if (App::instance().argsBase().m_enableDragDrop) { + return m_draggingStarted; + } + return false; } diff --git a/src/lib/synergy/PlatformScreen.h b/src/lib/synergy/PlatformScreen.h index 8afccb76..16dc904a 100644 --- a/src/lib/synergy/PlatformScreen.h +++ b/src/lib/synergy/PlatformScreen.h @@ -30,98 +30,98 @@ subclasses to implement the rest. */ class PlatformScreen : public IPlatformScreen { public: - PlatformScreen(IEventQueue* events); - virtual ~PlatformScreen(); + PlatformScreen(IEventQueue* events); + virtual ~PlatformScreen(); - // IScreen overrides - virtual void* getEventTarget() const = 0; - virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const = 0; - virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; + // IScreen overrides + virtual void* getEventTarget() const = 0; + virtual bool getClipboard(ClipboardID id, IClipboard*) const = 0; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const = 0; + virtual void getCursorPos(SInt32& x, SInt32& y) const = 0; - // IPrimaryScreen overrides - virtual void reconfigure(UInt32 activeSides) = 0; - virtual void warpCursor(SInt32 x, SInt32 y) = 0; - virtual UInt32 registerHotKey(KeyID key, - KeyModifierMask mask) = 0; - virtual void unregisterHotKey(UInt32 id) = 0; - virtual void fakeInputBegin() = 0; - virtual void fakeInputEnd() = 0; - virtual SInt32 getJumpZoneSize() const = 0; - virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; - virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; + // IPrimaryScreen overrides + virtual void reconfigure(UInt32 activeSides) = 0; + virtual void warpCursor(SInt32 x, SInt32 y) = 0; + virtual UInt32 registerHotKey(KeyID key, + KeyModifierMask mask) = 0; + virtual void unregisterHotKey(UInt32 id) = 0; + virtual void fakeInputBegin() = 0; + virtual void fakeInputEnd() = 0; + virtual SInt32 getJumpZoneSize() const = 0; + virtual bool isAnyMouseButtonDown(UInt32& buttonID) const = 0; + virtual void getCursorCenter(SInt32& x, SInt32& y) const = 0; - // ISecondaryScreen overrides - virtual void fakeMouseButton(ButtonID id, bool press) = 0; - virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; - virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; - virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; + // ISecondaryScreen overrides + virtual void fakeMouseButton(ButtonID id, bool press) = 0; + virtual void fakeMouseMove(SInt32 x, SInt32 y) = 0; + virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const = 0; + virtual void fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const = 0; - // IKeyState overrides - virtual void updateKeyMap(); - virtual void updateKeyState(); - virtual void setHalfDuplexMask(KeyModifierMask); - virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, - KeyButton button); - virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, - SInt32 count, KeyButton button); - virtual bool fakeKeyUp(KeyButton button); - virtual void fakeAllKeysUp(); - virtual bool fakeCtrlAltDel(); - virtual bool isKeyDown(KeyButton) const; - virtual KeyModifierMask - getActiveModifiers() const; - virtual KeyModifierMask - pollActiveModifiers() const; - virtual SInt32 pollActiveGroup() const; - virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; + // IKeyState overrides + virtual void updateKeyMap(); + virtual void updateKeyState(); + virtual void setHalfDuplexMask(KeyModifierMask); + virtual void fakeKeyDown(KeyID id, KeyModifierMask mask, + KeyButton button); + virtual bool fakeKeyRepeat(KeyID id, KeyModifierMask mask, + SInt32 count, KeyButton button); + virtual bool fakeKeyUp(KeyButton button); + virtual void fakeAllKeysUp(); + virtual bool fakeCtrlAltDel(); + virtual bool isKeyDown(KeyButton) const; + virtual KeyModifierMask + getActiveModifiers() const; + virtual KeyModifierMask + pollActiveModifiers() const; + virtual SInt32 pollActiveGroup() const; + virtual void pollPressedKeys(KeyButtonSet& pressedKeys) const; - virtual void setDraggingStarted(bool started) { m_draggingStarted = started; } - virtual bool isDraggingStarted(); - virtual bool isFakeDraggingStarted() { return m_fakeDraggingStarted; } - virtual String& getDraggingFilename() { return m_draggingFilename; } - virtual void clearDraggingFilename() { } + virtual void setDraggingStarted(bool started) { m_draggingStarted = started; } + virtual bool isDraggingStarted(); + virtual bool isFakeDraggingStarted() { return m_fakeDraggingStarted; } + virtual String& getDraggingFilename() { return m_draggingFilename; } + virtual void clearDraggingFilename() { } - // IPlatformScreen overrides - virtual void enable() = 0; - virtual void disable() = 0; - virtual void enter() = 0; - virtual bool leave() = 0; - virtual bool setClipboard(ClipboardID, const IClipboard*) = 0; - virtual void checkClipboards() = 0; - virtual void openScreensaver(bool notify) = 0; - virtual void closeScreensaver() = 0; - virtual void screensaver(bool activate) = 0; - virtual void resetOptions() = 0; - virtual void setOptions(const OptionsList& options) = 0; - virtual void setSequenceNumber(UInt32) = 0; - virtual bool isPrimary() const = 0; - - virtual void fakeDraggingFiles(DragFileList fileList) { throw std::runtime_error("fakeDraggingFiles not implemented"); } - virtual const String& - getDropTarget() const { throw std::runtime_error("getDropTarget not implemented"); } + // IPlatformScreen overrides + virtual void enable() = 0; + virtual void disable() = 0; + virtual void enter() = 0; + virtual bool leave() = 0; + virtual bool setClipboard(ClipboardID, const IClipboard*) = 0; + virtual void checkClipboards() = 0; + virtual void openScreensaver(bool notify) = 0; + virtual void closeScreensaver() = 0; + virtual void screensaver(bool activate) = 0; + virtual void resetOptions() = 0; + virtual void setOptions(const OptionsList& options) = 0; + virtual void setSequenceNumber(UInt32) = 0; + virtual bool isPrimary() const = 0; + + virtual void fakeDraggingFiles(DragFileList fileList) { throw std::runtime_error("fakeDraggingFiles not implemented"); } + virtual const String& + getDropTarget() const { throw std::runtime_error("getDropTarget not implemented"); } protected: - //! Update mouse buttons - /*! - Subclasses must implement this method to update their internal mouse - button mapping and, if desired, state tracking. - */ - virtual void updateButtons() = 0; + //! Update mouse buttons + /*! + Subclasses must implement this method to update their internal mouse + button mapping and, if desired, state tracking. + */ + virtual void updateButtons() = 0; - //! Get the key state - /*! - Subclasses must implement this method to return the platform specific - key state object that each subclass must have. - */ - virtual IKeyState* getKeyState() const = 0; + //! Get the key state + /*! + Subclasses must implement this method to return the platform specific + key state object that each subclass must have. + */ + virtual IKeyState* getKeyState() const = 0; - // IPlatformScreen overrides - virtual void handleSystemEvent(const Event& event, void*) = 0; + // IPlatformScreen overrides + virtual void handleSystemEvent(const Event& event, void*) = 0; protected: - String m_draggingFilename; - bool m_draggingStarted; - bool m_fakeDraggingStarted; + String m_draggingFilename; + bool m_draggingStarted; + bool m_fakeDraggingStarted; }; diff --git a/src/lib/synergy/PortableTaskBarReceiver.cpp b/src/lib/synergy/PortableTaskBarReceiver.cpp index 594e328c..d103960a 100644 --- a/src/lib/synergy/PortableTaskBarReceiver.cpp +++ b/src/lib/synergy/PortableTaskBarReceiver.cpp @@ -28,94 +28,94 @@ // PortableTaskBarReceiver::PortableTaskBarReceiver(IEventQueue* events) : - m_state(kNotRunning), - m_events(events) + m_state(kNotRunning), + m_events(events) { - // do nothing + // do nothing } PortableTaskBarReceiver::~PortableTaskBarReceiver() { - // do nothing + // do nothing } void PortableTaskBarReceiver::updateStatus(INode* node, const String& errorMsg) { - { - // update our status - m_errorMessage = errorMsg; - if (node == NULL) { - if (m_errorMessage.empty()) { - m_state = kNotRunning; - } - else { - m_state = kNotWorking; - } - } - else { - m_state = kNotConnected; - } + { + // update our status + m_errorMessage = errorMsg; + if (node == NULL) { + if (m_errorMessage.empty()) { + m_state = kNotRunning; + } + else { + m_state = kNotWorking; + } + } + else { + m_state = kNotConnected; + } - // let subclasses have a go - onStatusChanged(node); - } + // let subclasses have a go + onStatusChanged(node); + } - // tell task bar - ARCH->updateReceiver(this); + // tell task bar + ARCH->updateReceiver(this); } PortableTaskBarReceiver::EState PortableTaskBarReceiver::getStatus() const { - return m_state; + return m_state; } const String& PortableTaskBarReceiver::getErrorMessage() const { - return m_errorMessage; + return m_errorMessage; } void PortableTaskBarReceiver::quit() { - m_events->addEvent(Event(Event::kQuit)); + m_events->addEvent(Event(Event::kQuit)); } void PortableTaskBarReceiver::onStatusChanged(INode*) { - // do nothing + // do nothing } void PortableTaskBarReceiver::lock() const { - // do nothing + // do nothing } void PortableTaskBarReceiver::unlock() const { - // do nothing + // do nothing } std::string PortableTaskBarReceiver::getToolTip() const { - switch (m_state) { - case kNotRunning: - return synergy::string::sprintf("%s: Not running", kAppVersion); + switch (m_state) { + case kNotRunning: + return synergy::string::sprintf("%s: Not running", kAppVersion); - case kNotWorking: - return synergy::string::sprintf("%s: %s", - kAppVersion, m_errorMessage.c_str()); - - case kNotConnected: - return synergy::string::sprintf("%s: Unknown", kAppVersion); + case kNotWorking: + return synergy::string::sprintf("%s: %s", + kAppVersion, m_errorMessage.c_str()); + + case kNotConnected: + return synergy::string::sprintf("%s: Unknown", kAppVersion); - default: - return ""; - } + default: + return ""; + } } diff --git a/src/lib/synergy/PortableTaskBarReceiver.h b/src/lib/synergy/PortableTaskBarReceiver.h index 88130c21..ab8e6c0c 100644 --- a/src/lib/synergy/PortableTaskBarReceiver.h +++ b/src/lib/synergy/PortableTaskBarReceiver.h @@ -31,66 +31,66 @@ class IEventQueue; //! Implementation of IArchTaskBarReceiver for the synergy server class PortableTaskBarReceiver : public IArchTaskBarReceiver { public: - PortableTaskBarReceiver(IEventQueue* events); - virtual ~PortableTaskBarReceiver(); + PortableTaskBarReceiver(IEventQueue* events); + virtual ~PortableTaskBarReceiver(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update status - /*! - Determine the status and query required information from the server. - */ - void updateStatus(INode*, const String& errorMsg); + //! Update status + /*! + Determine the status and query required information from the server. + */ + void updateStatus(INode*, const String& errorMsg); - //@} + //@} - // IArchTaskBarReceiver overrides - virtual void showStatus() = 0; - virtual void runMenu(int x, int y) = 0; - virtual void primaryAction() = 0; - virtual void lock() const; - virtual void unlock() const; - virtual const Icon getIcon() const = 0; - virtual std::string getToolTip() const; + // IArchTaskBarReceiver overrides + virtual void showStatus() = 0; + virtual void runMenu(int x, int y) = 0; + virtual void primaryAction() = 0; + virtual void lock() const; + virtual void unlock() const; + virtual const Icon getIcon() const = 0; + virtual std::string getToolTip() const; protected: - typedef std::vector Clients; - enum EState { - kNotRunning, - kNotWorking, - kNotConnected, - kConnected, - kMaxState - }; + typedef std::vector Clients; + enum EState { + kNotRunning, + kNotWorking, + kNotConnected, + kConnected, + kMaxState + }; - //! Get status - EState getStatus() const; + //! Get status + EState getStatus() const; - //! Get error message - const String& getErrorMessage() const; + //! Get error message + const String& getErrorMessage() const; - //! Quit app - /*! - Causes the application to quit gracefully - */ - void quit(); + //! Quit app + /*! + Causes the application to quit gracefully + */ + void quit(); - //! Status change notification - /*! - Called when status changes. The default implementation does - nothing. - */ - virtual void onStatusChanged(INode* node); + //! Status change notification + /*! + Called when status changes. The default implementation does + nothing. + */ + virtual void onStatusChanged(INode* node); private: - EState m_state; - String m_errorMessage; + EState m_state; + String m_errorMessage; - String m_server; - Clients m_clients; + String m_server; + Clients m_clients; - IEventQueue* m_events; + IEventQueue* m_events; }; IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events); diff --git a/src/lib/synergy/ProtocolUtil.cpp b/src/lib/synergy/ProtocolUtil.cpp index ae796fa9..d9f5dc32 100644 --- a/src/lib/synergy/ProtocolUtil.cpp +++ b/src/lib/synergy/ProtocolUtil.cpp @@ -31,505 +31,505 @@ void ProtocolUtil::writef(synergy::IStream* stream, const char* fmt, ...) { - assert(stream != NULL); - assert(fmt != NULL); - LOG((CLOG_DEBUG2 "writef(%s)", fmt)); + assert(stream != NULL); + assert(fmt != NULL); + LOG((CLOG_DEBUG2 "writef(%s)", fmt)); - va_list args; - va_start(args, fmt); - UInt32 size = getLength(fmt, args); - va_end(args); - va_start(args, fmt); - vwritef(stream, fmt, size, args); - va_end(args); + va_list args; + va_start(args, fmt); + UInt32 size = getLength(fmt, args); + va_end(args); + va_start(args, fmt); + vwritef(stream, fmt, size, args); + va_end(args); } bool ProtocolUtil::readf(synergy::IStream* stream, const char* fmt, ...) { - assert(stream != NULL); - assert(fmt != NULL); - LOG((CLOG_DEBUG2 "readf(%s)", fmt)); + assert(stream != NULL); + assert(fmt != NULL); + LOG((CLOG_DEBUG2 "readf(%s)", fmt)); - bool result; - va_list args; - va_start(args, fmt); - try { - vreadf(stream, fmt, args); - result = true; - } - catch (XIO&) { - result = false; - } - va_end(args); - return result; + bool result; + va_list args; + va_start(args, fmt); + try { + vreadf(stream, fmt, args); + result = true; + } + catch (XIO&) { + result = false; + } + va_end(args); + return result; } void ProtocolUtil::vwritef(synergy::IStream* stream, - const char* fmt, UInt32 size, va_list args) + const char* fmt, UInt32 size, va_list args) { - assert(stream != NULL); - assert(fmt != NULL); + assert(stream != NULL); + assert(fmt != NULL); - // done if nothing to write - if (size == 0) { - return; - } + // done if nothing to write + if (size == 0) { + return; + } - // fill buffer - UInt8* buffer = new UInt8[size]; - writef(buffer, fmt, args); + // fill buffer + UInt8* buffer = new UInt8[size]; + writef(buffer, fmt, args); - try { - // write buffer - stream->write(buffer, size); - LOG((CLOG_DEBUG2 "wrote %d bytes", size)); + try { + // write buffer + stream->write(buffer, size); + LOG((CLOG_DEBUG2 "wrote %d bytes", size)); - delete[] buffer; - } - catch (XBase&) { - delete[] buffer; - throw; - } + delete[] buffer; + } + catch (XBase&) { + delete[] buffer; + throw; + } } void ProtocolUtil::vreadf(synergy::IStream* stream, const char* fmt, va_list args) { - assert(stream != NULL); - assert(fmt != NULL); + assert(stream != NULL); + assert(fmt != NULL); - // begin scanning - while (*fmt) { - if (*fmt == '%') { - // format specifier. determine argument size. - ++fmt; - UInt32 len = eatLength(&fmt); - switch (*fmt) { - case 'i': { - // check for valid length - assert(len == 1 || len == 2 || len == 4); + // begin scanning + while (*fmt) { + if (*fmt == '%') { + // format specifier. determine argument size. + ++fmt; + UInt32 len = eatLength(&fmt); + switch (*fmt) { + case 'i': { + // check for valid length + assert(len == 1 || len == 2 || len == 4); - // read the data - UInt8 buffer[4]; - read(stream, buffer, len); + // read the data + UInt8 buffer[4]; + read(stream, buffer, len); - // convert it - void* v = va_arg(args, void*); - switch (len) { - case 1: - // 1 byte integer - *static_cast(v) = buffer[0]; - LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); - break; + // convert it + void* v = va_arg(args, void*); + switch (len) { + case 1: + // 1 byte integer + *static_cast(v) = buffer[0]; + LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); + break; - case 2: - // 2 byte integer - *static_cast(v) = - static_cast( - (static_cast(buffer[0]) << 8) | - static_cast(buffer[1])); - LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); - break; + case 2: + // 2 byte integer + *static_cast(v) = + static_cast( + (static_cast(buffer[0]) << 8) | + static_cast(buffer[1])); + LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); + break; - case 4: - // 4 byte integer - *static_cast(v) = - (static_cast(buffer[0]) << 24) | - (static_cast(buffer[1]) << 16) | - (static_cast(buffer[2]) << 8) | - static_cast(buffer[3]); - LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); - break; - } - break; - } + case 4: + // 4 byte integer + *static_cast(v) = + (static_cast(buffer[0]) << 24) | + (static_cast(buffer[1]) << 16) | + (static_cast(buffer[2]) << 8) | + static_cast(buffer[3]); + LOG((CLOG_DEBUG2 "readf: read %d byte integer: %d (0x%x)", len, *static_cast(v), *static_cast(v))); + break; + } + break; + } - case 'I': { - // check for valid length - assert(len == 1 || len == 2 || len == 4); + case 'I': { + // check for valid length + assert(len == 1 || len == 2 || len == 4); - // read the vector length - UInt8 buffer[4]; - read(stream, buffer, 4); - UInt32 n = (static_cast(buffer[0]) << 24) | - (static_cast(buffer[1]) << 16) | - (static_cast(buffer[2]) << 8) | - static_cast(buffer[3]); + // read the vector length + UInt8 buffer[4]; + read(stream, buffer, 4); + UInt32 n = (static_cast(buffer[0]) << 24) | + (static_cast(buffer[1]) << 16) | + (static_cast(buffer[2]) << 8) | + static_cast(buffer[3]); - // convert it - void* v = va_arg(args, void*); - switch (len) { - case 1: - // 1 byte integer - for (UInt32 i = 0; i < n; ++i) { - read(stream, buffer, 1); - static_cast*>(v)->push_back( - buffer[0]); - LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); - } - break; + // convert it + void* v = va_arg(args, void*); + switch (len) { + case 1: + // 1 byte integer + for (UInt32 i = 0; i < n; ++i) { + read(stream, buffer, 1); + static_cast*>(v)->push_back( + buffer[0]); + LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); + } + break; - case 2: - // 2 byte integer - for (UInt32 i = 0; i < n; ++i) { - read(stream, buffer, 2); - static_cast*>(v)->push_back( - static_cast( - (static_cast(buffer[0]) << 8) | - static_cast(buffer[1]))); - LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); - } - break; + case 2: + // 2 byte integer + for (UInt32 i = 0; i < n; ++i) { + read(stream, buffer, 2); + static_cast*>(v)->push_back( + static_cast( + (static_cast(buffer[0]) << 8) | + static_cast(buffer[1]))); + LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); + } + break; - case 4: - // 4 byte integer - for (UInt32 i = 0; i < n; ++i) { - read(stream, buffer, 4); - static_cast*>(v)->push_back( - (static_cast(buffer[0]) << 24) | - (static_cast(buffer[1]) << 16) | - (static_cast(buffer[2]) << 8) | - static_cast(buffer[3])); - LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); - } - break; - } - break; - } + case 4: + // 4 byte integer + for (UInt32 i = 0; i < n; ++i) { + read(stream, buffer, 4); + static_cast*>(v)->push_back( + (static_cast(buffer[0]) << 24) | + (static_cast(buffer[1]) << 16) | + (static_cast(buffer[2]) << 8) | + static_cast(buffer[3])); + LOG((CLOG_DEBUG2 "readf: read %d byte integer[%d]: %d (0x%x)", len, i, static_cast*>(v)->back(), static_cast*>(v)->back())); + } + break; + } + break; + } - case 's': { - assert(len == 0); + case 's': { + assert(len == 0); - // read the string length - UInt8 buffer[128]; - read(stream, buffer, 4); - UInt32 len = (static_cast(buffer[0]) << 24) | - (static_cast(buffer[1]) << 16) | - (static_cast(buffer[2]) << 8) | - static_cast(buffer[3]); + // read the string length + UInt8 buffer[128]; + read(stream, buffer, 4); + UInt32 len = (static_cast(buffer[0]) << 24) | + (static_cast(buffer[1]) << 16) | + (static_cast(buffer[2]) << 8) | + static_cast(buffer[3]); - // use a fixed size buffer if its big enough - const bool useFixed = (len <= sizeof(buffer)); + // use a fixed size buffer if its big enough + const bool useFixed = (len <= sizeof(buffer)); - // allocate a buffer to read the data - UInt8* sBuffer = buffer; - if (!useFixed) { - sBuffer = new UInt8[len]; - } + // allocate a buffer to read the data + UInt8* sBuffer = buffer; + if (!useFixed) { + sBuffer = new UInt8[len]; + } - // read the data - try { - read(stream, sBuffer, len); - } - catch (...) { - if (!useFixed) { - delete[] sBuffer; - } - throw; - } + // read the data + try { + read(stream, sBuffer, len); + } + catch (...) { + if (!useFixed) { + delete[] sBuffer; + } + throw; + } - LOG((CLOG_DEBUG2 "readf: read %d byte string", len)); + LOG((CLOG_DEBUG2 "readf: read %d byte string", len)); - // save the data - String* dst = va_arg(args, String*); - dst->assign((const char*)sBuffer, len); + // save the data + String* dst = va_arg(args, String*); + dst->assign((const char*)sBuffer, len); - // release the buffer - if (!useFixed) { - delete[] sBuffer; - } - break; - } + // release the buffer + if (!useFixed) { + delete[] sBuffer; + } + break; + } - case '%': - assert(len == 0); - break; + case '%': + assert(len == 0); + break; - default: - assert(0 && "invalid format specifier"); - } + default: + assert(0 && "invalid format specifier"); + } - // next format character - ++fmt; - } - else { - // read next character - char buffer[1]; - read(stream, buffer, 1); + // next format character + ++fmt; + } + else { + // read next character + char buffer[1]; + read(stream, buffer, 1); - // verify match - if (buffer[0] != *fmt) { - LOG((CLOG_DEBUG2 "readf: format mismatch: %c vs %c", *fmt, buffer[0])); - throw XIOReadMismatch(); - } + // verify match + if (buffer[0] != *fmt) { + LOG((CLOG_DEBUG2 "readf: format mismatch: %c vs %c", *fmt, buffer[0])); + throw XIOReadMismatch(); + } - // next format character - ++fmt; - } - } + // next format character + ++fmt; + } + } } UInt32 ProtocolUtil::getLength(const char* fmt, va_list args) { - UInt32 n = 0; - while (*fmt) { - if (*fmt == '%') { - // format specifier. determine argument size. - ++fmt; - UInt32 len = eatLength(&fmt); - switch (*fmt) { - case 'i': - assert(len == 1 || len == 2 || len == 4); - (void)va_arg(args, UInt32); - break; + UInt32 n = 0; + while (*fmt) { + if (*fmt == '%') { + // format specifier. determine argument size. + ++fmt; + UInt32 len = eatLength(&fmt); + switch (*fmt) { + case 'i': + assert(len == 1 || len == 2 || len == 4); + (void)va_arg(args, UInt32); + break; - case 'I': - assert(len == 1 || len == 2 || len == 4); - switch (len) { - case 1: - len = (UInt32)(va_arg(args, std::vector*))->size() + 4; - break; + case 'I': + assert(len == 1 || len == 2 || len == 4); + switch (len) { + case 1: + len = (UInt32)(va_arg(args, std::vector*))->size() + 4; + break; - case 2: - len = 2 * (UInt32)(va_arg(args, std::vector*))->size() + 4; - break; + case 2: + len = 2 * (UInt32)(va_arg(args, std::vector*))->size() + 4; + break; - case 4: - len = 4 * (UInt32)(va_arg(args, std::vector*))->size() + 4; - break; - } - break; + case 4: + len = 4 * (UInt32)(va_arg(args, std::vector*))->size() + 4; + break; + } + break; - case 's': - assert(len == 0); - len = (UInt32)(va_arg(args, String*))->size() + 4; - (void)va_arg(args, UInt8*); - break; + case 's': + assert(len == 0); + len = (UInt32)(va_arg(args, String*))->size() + 4; + (void)va_arg(args, UInt8*); + break; - case 'S': - assert(len == 0); - len = va_arg(args, UInt32) + 4; - (void)va_arg(args, UInt8*); - break; + case 'S': + assert(len == 0); + len = va_arg(args, UInt32) + 4; + (void)va_arg(args, UInt8*); + break; - case '%': - assert(len == 0); - len = 1; - break; + case '%': + assert(len == 0); + len = 1; + break; - default: - assert(0 && "invalid format specifier"); - } + default: + assert(0 && "invalid format specifier"); + } - // accumulate size - n += len; - ++fmt; - } - else { - // regular character - ++n; - ++fmt; - } - } - return n; + // accumulate size + n += len; + ++fmt; + } + else { + // regular character + ++n; + ++fmt; + } + } + return n; } void ProtocolUtil::writef(void* buffer, const char* fmt, va_list args) { - UInt8* dst = static_cast(buffer); + UInt8* dst = static_cast(buffer); - while (*fmt) { - if (*fmt == '%') { - // format specifier. determine argument size. - ++fmt; - UInt32 len = eatLength(&fmt); - switch (*fmt) { - case 'i': { - const UInt32 v = va_arg(args, UInt32); - switch (len) { - case 1: - // 1 byte integer - *dst++ = static_cast(v & 0xff); - break; + while (*fmt) { + if (*fmt == '%') { + // format specifier. determine argument size. + ++fmt; + UInt32 len = eatLength(&fmt); + switch (*fmt) { + case 'i': { + const UInt32 v = va_arg(args, UInt32); + switch (len) { + case 1: + // 1 byte integer + *dst++ = static_cast(v & 0xff); + break; - case 2: - // 2 byte integer - *dst++ = static_cast((v >> 8) & 0xff); - *dst++ = static_cast( v & 0xff); - break; + case 2: + // 2 byte integer + *dst++ = static_cast((v >> 8) & 0xff); + *dst++ = static_cast( v & 0xff); + break; - case 4: - // 4 byte integer - *dst++ = static_cast((v >> 24) & 0xff); - *dst++ = static_cast((v >> 16) & 0xff); - *dst++ = static_cast((v >> 8) & 0xff); - *dst++ = static_cast( v & 0xff); - break; + case 4: + // 4 byte integer + *dst++ = static_cast((v >> 24) & 0xff); + *dst++ = static_cast((v >> 16) & 0xff); + *dst++ = static_cast((v >> 8) & 0xff); + *dst++ = static_cast( v & 0xff); + break; - default: - assert(0 && "invalid integer format length"); - return; - } - break; - } + default: + assert(0 && "invalid integer format length"); + return; + } + break; + } - case 'I': { - switch (len) { - case 1: { - // 1 byte integers - const std::vector* list = - va_arg(args, const std::vector*); - const UInt32 n = (UInt32)list->size(); - *dst++ = static_cast((n >> 24) & 0xff); - *dst++ = static_cast((n >> 16) & 0xff); - *dst++ = static_cast((n >> 8) & 0xff); - *dst++ = static_cast( n & 0xff); - for (UInt32 i = 0; i < n; ++i) { - *dst++ = (*list)[i]; - } - break; - } + case 'I': { + switch (len) { + case 1: { + // 1 byte integers + const std::vector* list = + va_arg(args, const std::vector*); + const UInt32 n = (UInt32)list->size(); + *dst++ = static_cast((n >> 24) & 0xff); + *dst++ = static_cast((n >> 16) & 0xff); + *dst++ = static_cast((n >> 8) & 0xff); + *dst++ = static_cast( n & 0xff); + for (UInt32 i = 0; i < n; ++i) { + *dst++ = (*list)[i]; + } + break; + } - case 2: { - // 2 byte integers - const std::vector* list = - va_arg(args, const std::vector*); - const UInt32 n = (UInt32)list->size(); - *dst++ = static_cast((n >> 24) & 0xff); - *dst++ = static_cast((n >> 16) & 0xff); - *dst++ = static_cast((n >> 8) & 0xff); - *dst++ = static_cast( n & 0xff); - for (UInt32 i = 0; i < n; ++i) { - const UInt16 v = (*list)[i]; - *dst++ = static_cast((v >> 8) & 0xff); - *dst++ = static_cast( v & 0xff); - } - break; - } + case 2: { + // 2 byte integers + const std::vector* list = + va_arg(args, const std::vector*); + const UInt32 n = (UInt32)list->size(); + *dst++ = static_cast((n >> 24) & 0xff); + *dst++ = static_cast((n >> 16) & 0xff); + *dst++ = static_cast((n >> 8) & 0xff); + *dst++ = static_cast( n & 0xff); + for (UInt32 i = 0; i < n; ++i) { + const UInt16 v = (*list)[i]; + *dst++ = static_cast((v >> 8) & 0xff); + *dst++ = static_cast( v & 0xff); + } + break; + } - case 4: { - // 4 byte integers - const std::vector* list = - va_arg(args, const std::vector*); - const UInt32 n = (UInt32)list->size(); - *dst++ = static_cast((n >> 24) & 0xff); - *dst++ = static_cast((n >> 16) & 0xff); - *dst++ = static_cast((n >> 8) & 0xff); - *dst++ = static_cast( n & 0xff); - for (UInt32 i = 0; i < n; ++i) { - const UInt32 v = (*list)[i]; - *dst++ = static_cast((v >> 24) & 0xff); - *dst++ = static_cast((v >> 16) & 0xff); - *dst++ = static_cast((v >> 8) & 0xff); - *dst++ = static_cast( v & 0xff); - } - break; - } + case 4: { + // 4 byte integers + const std::vector* list = + va_arg(args, const std::vector*); + const UInt32 n = (UInt32)list->size(); + *dst++ = static_cast((n >> 24) & 0xff); + *dst++ = static_cast((n >> 16) & 0xff); + *dst++ = static_cast((n >> 8) & 0xff); + *dst++ = static_cast( n & 0xff); + for (UInt32 i = 0; i < n; ++i) { + const UInt32 v = (*list)[i]; + *dst++ = static_cast((v >> 24) & 0xff); + *dst++ = static_cast((v >> 16) & 0xff); + *dst++ = static_cast((v >> 8) & 0xff); + *dst++ = static_cast( v & 0xff); + } + break; + } - default: - assert(0 && "invalid integer vector format length"); - return; - } - break; - } + default: + assert(0 && "invalid integer vector format length"); + return; + } + break; + } - case 's': { - assert(len == 0); - const String* src = va_arg(args, String*); - const UInt32 len = (src != NULL) ? (UInt32)src->size() : 0; - *dst++ = static_cast((len >> 24) & 0xff); - *dst++ = static_cast((len >> 16) & 0xff); - *dst++ = static_cast((len >> 8) & 0xff); - *dst++ = static_cast( len & 0xff); - if (len != 0) { - memcpy(dst, src->data(), len); - dst += len; - } - break; - } + case 's': { + assert(len == 0); + const String* src = va_arg(args, String*); + const UInt32 len = (src != NULL) ? (UInt32)src->size() : 0; + *dst++ = static_cast((len >> 24) & 0xff); + *dst++ = static_cast((len >> 16) & 0xff); + *dst++ = static_cast((len >> 8) & 0xff); + *dst++ = static_cast( len & 0xff); + if (len != 0) { + memcpy(dst, src->data(), len); + dst += len; + } + break; + } - case 'S': { - assert(len == 0); - const UInt32 len = va_arg(args, UInt32); - const UInt8* src = va_arg(args, UInt8*); - *dst++ = static_cast((len >> 24) & 0xff); - *dst++ = static_cast((len >> 16) & 0xff); - *dst++ = static_cast((len >> 8) & 0xff); - *dst++ = static_cast( len & 0xff); - memcpy(dst, src, len); - dst += len; - break; - } + case 'S': { + assert(len == 0); + const UInt32 len = va_arg(args, UInt32); + const UInt8* src = va_arg(args, UInt8*); + *dst++ = static_cast((len >> 24) & 0xff); + *dst++ = static_cast((len >> 16) & 0xff); + *dst++ = static_cast((len >> 8) & 0xff); + *dst++ = static_cast( len & 0xff); + memcpy(dst, src, len); + dst += len; + break; + } - case '%': - assert(len == 0); - *dst++ = '%'; - break; + case '%': + assert(len == 0); + *dst++ = '%'; + break; - default: - assert(0 && "invalid format specifier"); - } + default: + assert(0 && "invalid format specifier"); + } - // next format character - ++fmt; - } - else { - // copy regular character - *dst++ = *fmt++; - } - } + // next format character + ++fmt; + } + else { + // copy regular character + *dst++ = *fmt++; + } + } } UInt32 ProtocolUtil::eatLength(const char** pfmt) { - const char* fmt = *pfmt; - UInt32 n = 0; - for (;;) { - UInt32 d; - switch (*fmt) { - case '0': d = 0; break; - case '1': d = 1; break; - case '2': d = 2; break; - case '3': d = 3; break; - case '4': d = 4; break; - case '5': d = 5; break; - case '6': d = 6; break; - case '7': d = 7; break; - case '8': d = 8; break; - case '9': d = 9; break; - default: *pfmt = fmt; return n; - } - n = 10 * n + d; - ++fmt; - } + const char* fmt = *pfmt; + UInt32 n = 0; + for (;;) { + UInt32 d; + switch (*fmt) { + case '0': d = 0; break; + case '1': d = 1; break; + case '2': d = 2; break; + case '3': d = 3; break; + case '4': d = 4; break; + case '5': d = 5; break; + case '6': d = 6; break; + case '7': d = 7; break; + case '8': d = 8; break; + case '9': d = 9; break; + default: *pfmt = fmt; return n; + } + n = 10 * n + d; + ++fmt; + } } void ProtocolUtil::read(synergy::IStream* stream, void* vbuffer, UInt32 count) { - assert(stream != NULL); - assert(vbuffer != NULL); + assert(stream != NULL); + assert(vbuffer != NULL); - UInt8* buffer = static_cast(vbuffer); - while (count > 0) { - // read more - UInt32 n = stream->read(buffer, count); + UInt8* buffer = static_cast(vbuffer); + while (count > 0) { + // read more + UInt32 n = stream->read(buffer, count); - // bail if stream has hungup - if (n == 0) { - LOG((CLOG_DEBUG2 "unexpected disconnect in readf(), %d bytes left", count)); - throw XIOEndOfStream(); - } + // bail if stream has hungup + if (n == 0) { + LOG((CLOG_DEBUG2 "unexpected disconnect in readf(), %d bytes left", count)); + throw XIOEndOfStream(); + } - // prepare for next read - buffer += n; - count -= n; - } + // prepare for next read + buffer += n; + count -= n; + } } @@ -540,5 +540,5 @@ ProtocolUtil::read(synergy::IStream* stream, void* vbuffer, UInt32 count) String XIOReadMismatch::getWhat() const throw() { - return format("XIOReadMismatch", "ProtocolUtil::readf() mismatch"); + return format("XIOReadMismatch", "ProtocolUtil::readf() mismatch"); } diff --git a/src/lib/synergy/ProtocolUtil.h b/src/lib/synergy/ProtocolUtil.h index 9251e1b3..b7e43836 100644 --- a/src/lib/synergy/ProtocolUtil.h +++ b/src/lib/synergy/ProtocolUtil.h @@ -32,56 +32,56 @@ protocol. */ class ProtocolUtil { public: - //! Write formatted data - /*! - Write formatted binary data to a stream. \c fmt consists of - regular characters and format specifiers. Format specifiers - begin with \%. All characters not part of a format specifier - are regular and are transmitted unchanged. - - Format specifiers are: - - \%\% -- literal `\%' - - \%1i -- converts integer argument to 1 byte integer - - \%2i -- converts integer argument to 2 byte integer in NBO - - \%4i -- converts integer argument to 4 byte integer in NBO - - \%1I -- converts std::vector* to 1 byte integers - - \%2I -- converts std::vector* to 2 byte integers in NBO - - \%4I -- converts std::vector* to 4 byte integers in NBO - - \%s -- converts String* to stream of bytes - - \%S -- converts integer N and const UInt8* to stream of N bytes - */ - static void writef(synergy::IStream*, - const char* fmt, ...); + //! Write formatted data + /*! + Write formatted binary data to a stream. \c fmt consists of + regular characters and format specifiers. Format specifiers + begin with \%. All characters not part of a format specifier + are regular and are transmitted unchanged. + + Format specifiers are: + - \%\% -- literal `\%' + - \%1i -- converts integer argument to 1 byte integer + - \%2i -- converts integer argument to 2 byte integer in NBO + - \%4i -- converts integer argument to 4 byte integer in NBO + - \%1I -- converts std::vector* to 1 byte integers + - \%2I -- converts std::vector* to 2 byte integers in NBO + - \%4I -- converts std::vector* to 4 byte integers in NBO + - \%s -- converts String* to stream of bytes + - \%S -- converts integer N and const UInt8* to stream of N bytes + */ + static void writef(synergy::IStream*, + const char* fmt, ...); - //! Read formatted data - /*! - Read formatted binary data from a buffer. This performs the - reverse operation of writef(). Returns true if the entire - format was successfully parsed, false otherwise. - - Format specifiers are: - - \%\% -- read (and discard) a literal `\%' - - \%1i -- reads a 1 byte integer; argument is a SInt32* or UInt32* - - \%2i -- reads an NBO 2 byte integer; arg is SInt32* or UInt32* - - \%4i -- reads an NBO 4 byte integer; arg is SInt32* or UInt32* - - \%1I -- reads 1 byte integers; arg is std::vector* - - \%2I -- reads NBO 2 byte integers; arg is std::vector* - - \%4I -- reads NBO 4 byte integers; arg is std::vector* - - \%s -- reads bytes; argument must be a String*, \b not a char* - */ - static bool readf(synergy::IStream*, - const char* fmt, ...); + //! Read formatted data + /*! + Read formatted binary data from a buffer. This performs the + reverse operation of writef(). Returns true if the entire + format was successfully parsed, false otherwise. + + Format specifiers are: + - \%\% -- read (and discard) a literal `\%' + - \%1i -- reads a 1 byte integer; argument is a SInt32* or UInt32* + - \%2i -- reads an NBO 2 byte integer; arg is SInt32* or UInt32* + - \%4i -- reads an NBO 4 byte integer; arg is SInt32* or UInt32* + - \%1I -- reads 1 byte integers; arg is std::vector* + - \%2I -- reads NBO 2 byte integers; arg is std::vector* + - \%4I -- reads NBO 4 byte integers; arg is std::vector* + - \%s -- reads bytes; argument must be a String*, \b not a char* + */ + static bool readf(synergy::IStream*, + const char* fmt, ...); private: - static void vwritef(synergy::IStream*, - const char* fmt, UInt32 size, va_list); - static void vreadf(synergy::IStream*, - const char* fmt, va_list); + static void vwritef(synergy::IStream*, + const char* fmt, UInt32 size, va_list); + static void vreadf(synergy::IStream*, + const char* fmt, va_list); - static UInt32 getLength(const char* fmt, va_list); - static void writef(void*, const char* fmt, va_list); - static UInt32 eatLength(const char** fmt); - static void read(synergy::IStream*, void*, UInt32); + static UInt32 getLength(const char* fmt, va_list); + static void writef(void*, const char* fmt, va_list); + static UInt32 eatLength(const char** fmt); + static void read(synergy::IStream*, void*, UInt32); }; //! Mismatched read exception @@ -91,6 +91,6 @@ match the format. */ class XIOReadMismatch : public XIO { public: - // XBase overrides - virtual String getWhat() const throw(); + // XBase overrides + virtual String getWhat() const throw(); }; diff --git a/src/lib/synergy/Screen.cpp b/src/lib/synergy/Screen.cpp index b69b5f1d..57cb865b 100644 --- a/src/lib/synergy/Screen.cpp +++ b/src/lib/synergy/Screen.cpp @@ -31,529 +31,529 @@ namespace synergy { // Screen::Screen(IPlatformScreen* platformScreen, IEventQueue* events) : - m_screen(platformScreen), - m_isPrimary(platformScreen->isPrimary()), - m_enabled(false), - m_entered(m_isPrimary), - m_screenSaverSync(true), - m_fakeInput(false), - m_events(events), - m_mock(false), - m_enableDragDrop(false) + m_screen(platformScreen), + m_isPrimary(platformScreen->isPrimary()), + m_enabled(false), + m_entered(m_isPrimary), + m_screenSaverSync(true), + m_fakeInput(false), + m_events(events), + m_mock(false), + m_enableDragDrop(false) { - assert(m_screen != NULL); + assert(m_screen != NULL); - // reset options - resetOptions(); + // reset options + resetOptions(); - LOG((CLOG_DEBUG "opened display")); + LOG((CLOG_DEBUG "opened display")); } Screen::~Screen() { - if (m_mock) { - return; - } + if (m_mock) { + return; + } - if (m_enabled) { - disable(); - } - assert(!m_enabled); - assert(m_entered == m_isPrimary); - delete m_screen; - LOG((CLOG_DEBUG "closed display")); + if (m_enabled) { + disable(); + } + assert(!m_enabled); + assert(m_entered == m_isPrimary); + delete m_screen; + LOG((CLOG_DEBUG "closed display")); } void Screen::enable() { - assert(!m_enabled); + assert(!m_enabled); - m_screen->updateKeyMap(); - m_screen->updateKeyState(); - m_screen->enable(); - if (m_isPrimary) { - enablePrimary(); - } - else { - enableSecondary(); - } + m_screen->updateKeyMap(); + m_screen->updateKeyState(); + m_screen->enable(); + if (m_isPrimary) { + enablePrimary(); + } + else { + enableSecondary(); + } - // note activation - m_enabled = true; + // note activation + m_enabled = true; } void Screen::disable() { - assert(m_enabled); + assert(m_enabled); - if (!m_isPrimary && m_entered) { - leave(); - } - else if (m_isPrimary && !m_entered) { - enter(0); - } - m_screen->disable(); - if (m_isPrimary) { - disablePrimary(); - } - else { - disableSecondary(); - } + if (!m_isPrimary && m_entered) { + leave(); + } + else if (m_isPrimary && !m_entered) { + enter(0); + } + m_screen->disable(); + if (m_isPrimary) { + disablePrimary(); + } + else { + disableSecondary(); + } - // note deactivation - m_enabled = false; + // note deactivation + m_enabled = false; } void Screen::enter(KeyModifierMask toggleMask) { - assert(m_entered == false); - LOG((CLOG_INFO "entering screen")); + assert(m_entered == false); + LOG((CLOG_INFO "entering screen")); - // now on screen - m_entered = true; + // now on screen + m_entered = true; - m_screen->enter(); - if (m_isPrimary) { - enterPrimary(); - } - else { - enterSecondary(toggleMask); - } + m_screen->enter(); + if (m_isPrimary) { + enterPrimary(); + } + else { + enterSecondary(toggleMask); + } } bool Screen::leave() { - assert(m_entered == true); - LOG((CLOG_INFO "leaving screen")); + assert(m_entered == true); + LOG((CLOG_INFO "leaving screen")); - if (!m_screen->leave()) { - return false; - } - if (m_isPrimary) { - leavePrimary(); - } - else { - leaveSecondary(); - } + if (!m_screen->leave()) { + return false; + } + if (m_isPrimary) { + leavePrimary(); + } + else { + leaveSecondary(); + } - // make sure our idea of clipboard ownership is correct - m_screen->checkClipboards(); + // make sure our idea of clipboard ownership is correct + m_screen->checkClipboards(); - // now not on screen - m_entered = false; + // now not on screen + m_entered = false; - return true; + return true; } void Screen::reconfigure(UInt32 activeSides) { - assert(m_isPrimary); - m_screen->reconfigure(activeSides); + assert(m_isPrimary); + m_screen->reconfigure(activeSides); } void Screen::warpCursor(SInt32 x, SInt32 y) { - assert(m_isPrimary); - m_screen->warpCursor(x, y); + assert(m_isPrimary); + m_screen->warpCursor(x, y); } void Screen::setClipboard(ClipboardID id, const IClipboard* clipboard) { - m_screen->setClipboard(id, clipboard); + m_screen->setClipboard(id, clipboard); } void Screen::grabClipboard(ClipboardID id) { - m_screen->setClipboard(id, NULL); + m_screen->setClipboard(id, NULL); } void Screen::screensaver(bool activate) { - if (!m_isPrimary) { - // activate/deactivation screen saver iff synchronization enabled - if (m_screenSaverSync) { - m_screen->screensaver(activate); - } - } + if (!m_isPrimary) { + // activate/deactivation screen saver iff synchronization enabled + if (m_screenSaverSync) { + m_screen->screensaver(activate); + } + } } void Screen::keyDown(KeyID id, KeyModifierMask mask, KeyButton button) { - // check for ctrl+alt+del emulation - if (id == kKeyDelete && - (mask & (KeyModifierControl | KeyModifierAlt)) == - (KeyModifierControl | KeyModifierAlt)) { - LOG((CLOG_DEBUG "emulating ctrl+alt+del press")); - if (m_screen->fakeCtrlAltDel()) { - return; - } - } - m_screen->fakeKeyDown(id, mask, button); + // check for ctrl+alt+del emulation + if (id == kKeyDelete && + (mask & (KeyModifierControl | KeyModifierAlt)) == + (KeyModifierControl | KeyModifierAlt)) { + LOG((CLOG_DEBUG "emulating ctrl+alt+del press")); + if (m_screen->fakeCtrlAltDel()) { + return; + } + } + m_screen->fakeKeyDown(id, mask, button); } void Screen::keyRepeat(KeyID id, - KeyModifierMask mask, SInt32 count, KeyButton button) + KeyModifierMask mask, SInt32 count, KeyButton button) { - assert(!m_isPrimary); - m_screen->fakeKeyRepeat(id, mask, count, button); + assert(!m_isPrimary); + m_screen->fakeKeyRepeat(id, mask, count, button); } void Screen::keyUp(KeyID, KeyModifierMask, KeyButton button) { - m_screen->fakeKeyUp(button); + m_screen->fakeKeyUp(button); } void Screen::mouseDown(ButtonID button) { - m_screen->fakeMouseButton(button, true); + m_screen->fakeMouseButton(button, true); } void Screen::mouseUp(ButtonID button) { - m_screen->fakeMouseButton(button, false); + m_screen->fakeMouseButton(button, false); } void Screen::mouseMove(SInt32 x, SInt32 y) { - assert(!m_isPrimary); - m_screen->fakeMouseMove(x, y); + assert(!m_isPrimary); + m_screen->fakeMouseMove(x, y); } void Screen::mouseRelativeMove(SInt32 dx, SInt32 dy) { - assert(!m_isPrimary); - m_screen->fakeMouseRelativeMove(dx, dy); + assert(!m_isPrimary); + m_screen->fakeMouseRelativeMove(dx, dy); } void Screen::mouseWheel(SInt32 xDelta, SInt32 yDelta) { - assert(!m_isPrimary); - m_screen->fakeMouseWheel(xDelta, yDelta); + assert(!m_isPrimary); + m_screen->fakeMouseWheel(xDelta, yDelta); } void Screen::resetOptions() { - // reset options - m_halfDuplex = 0; + // reset options + m_halfDuplex = 0; - // if screen saver synchronization was off then turn it on since - // that's the default option state. - if (!m_screenSaverSync) { - m_screenSaverSync = true; - if (!m_isPrimary) { - m_screen->openScreensaver(false); - } - } + // if screen saver synchronization was off then turn it on since + // that's the default option state. + if (!m_screenSaverSync) { + m_screenSaverSync = true; + if (!m_isPrimary) { + m_screen->openScreensaver(false); + } + } - // let screen handle its own options - m_screen->resetOptions(); + // let screen handle its own options + m_screen->resetOptions(); } void Screen::setOptions(const OptionsList& options) { - // update options - bool oldScreenSaverSync = m_screenSaverSync; - for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { - if (options[i] == kOptionScreenSaverSync) { - m_screenSaverSync = (options[i + 1] != 0); - LOG((CLOG_DEBUG1 "screen saver synchronization %s", m_screenSaverSync ? "on" : "off")); - } - else if (options[i] == kOptionHalfDuplexCapsLock) { - if (options[i + 1] != 0) { - m_halfDuplex |= KeyModifierCapsLock; - } - else { - m_halfDuplex &= ~KeyModifierCapsLock; - } - LOG((CLOG_DEBUG1 "half-duplex caps-lock %s", ((m_halfDuplex & KeyModifierCapsLock) != 0) ? "on" : "off")); - } - else if (options[i] == kOptionHalfDuplexNumLock) { - if (options[i + 1] != 0) { - m_halfDuplex |= KeyModifierNumLock; - } - else { - m_halfDuplex &= ~KeyModifierNumLock; - } - LOG((CLOG_DEBUG1 "half-duplex num-lock %s", ((m_halfDuplex & KeyModifierNumLock) != 0) ? "on" : "off")); - } - else if (options[i] == kOptionHalfDuplexScrollLock) { - if (options[i + 1] != 0) { - m_halfDuplex |= KeyModifierScrollLock; - } - else { - m_halfDuplex &= ~KeyModifierScrollLock; - } - LOG((CLOG_DEBUG1 "half-duplex scroll-lock %s", ((m_halfDuplex & KeyModifierScrollLock) != 0) ? "on" : "off")); - } - } + // update options + bool oldScreenSaverSync = m_screenSaverSync; + for (UInt32 i = 0, n = (UInt32)options.size(); i < n; i += 2) { + if (options[i] == kOptionScreenSaverSync) { + m_screenSaverSync = (options[i + 1] != 0); + LOG((CLOG_DEBUG1 "screen saver synchronization %s", m_screenSaverSync ? "on" : "off")); + } + else if (options[i] == kOptionHalfDuplexCapsLock) { + if (options[i + 1] != 0) { + m_halfDuplex |= KeyModifierCapsLock; + } + else { + m_halfDuplex &= ~KeyModifierCapsLock; + } + LOG((CLOG_DEBUG1 "half-duplex caps-lock %s", ((m_halfDuplex & KeyModifierCapsLock) != 0) ? "on" : "off")); + } + else if (options[i] == kOptionHalfDuplexNumLock) { + if (options[i + 1] != 0) { + m_halfDuplex |= KeyModifierNumLock; + } + else { + m_halfDuplex &= ~KeyModifierNumLock; + } + LOG((CLOG_DEBUG1 "half-duplex num-lock %s", ((m_halfDuplex & KeyModifierNumLock) != 0) ? "on" : "off")); + } + else if (options[i] == kOptionHalfDuplexScrollLock) { + if (options[i + 1] != 0) { + m_halfDuplex |= KeyModifierScrollLock; + } + else { + m_halfDuplex &= ~KeyModifierScrollLock; + } + LOG((CLOG_DEBUG1 "half-duplex scroll-lock %s", ((m_halfDuplex & KeyModifierScrollLock) != 0) ? "on" : "off")); + } + } - // update half-duplex options - m_screen->setHalfDuplexMask(m_halfDuplex); + // update half-duplex options + m_screen->setHalfDuplexMask(m_halfDuplex); - // update screen saver synchronization - if (!m_isPrimary && oldScreenSaverSync != m_screenSaverSync) { - if (m_screenSaverSync) { - m_screen->openScreensaver(false); - } - else { - m_screen->closeScreensaver(); - } - } + // update screen saver synchronization + if (!m_isPrimary && oldScreenSaverSync != m_screenSaverSync) { + if (m_screenSaverSync) { + m_screen->openScreensaver(false); + } + else { + m_screen->closeScreensaver(); + } + } - // let screen handle its own options - m_screen->setOptions(options); + // let screen handle its own options + m_screen->setOptions(options); } void Screen::setSequenceNumber(UInt32 seqNum) { - m_screen->setSequenceNumber(seqNum); + m_screen->setSequenceNumber(seqNum); } UInt32 Screen::registerHotKey(KeyID key, KeyModifierMask mask) { - return m_screen->registerHotKey(key, mask); + return m_screen->registerHotKey(key, mask); } void Screen::unregisterHotKey(UInt32 id) { - m_screen->unregisterHotKey(id); + m_screen->unregisterHotKey(id); } void Screen::fakeInputBegin() { - assert(!m_fakeInput); + assert(!m_fakeInput); - m_fakeInput = true; - m_screen->fakeInputBegin(); + m_fakeInput = true; + m_screen->fakeInputBegin(); } void Screen::fakeInputEnd() { - assert(m_fakeInput); + assert(m_fakeInput); - m_fakeInput = false; - m_screen->fakeInputEnd(); + m_fakeInput = false; + m_screen->fakeInputEnd(); } bool Screen::isOnScreen() const { - return m_entered; + return m_entered; } bool Screen::isLockedToScreen() const { - // check for pressed mouse buttons - // HACK: commented out as it breaks new drag drop feature - UInt32 buttonID = 0; + // check for pressed mouse buttons + // HACK: commented out as it breaks new drag drop feature + UInt32 buttonID = 0; - if (m_screen->isAnyMouseButtonDown(buttonID)) { - if (buttonID != kButtonLeft) { - LOG((CLOG_DEBUG "locked by mouse buttonID: %d", buttonID)); - } - - if (m_enableDragDrop) { - return (buttonID == kButtonLeft) ? false : true; - } - else { - return true; - } - } + if (m_screen->isAnyMouseButtonDown(buttonID)) { + if (buttonID != kButtonLeft) { + LOG((CLOG_DEBUG "locked by mouse buttonID: %d", buttonID)); + } + + if (m_enableDragDrop) { + return (buttonID == kButtonLeft) ? false : true; + } + else { + return true; + } + } - // not locked - return false; + // not locked + return false; } SInt32 Screen::getJumpZoneSize() const { - if (!m_isPrimary) { - return 0; - } - else { - return m_screen->getJumpZoneSize(); - } + if (!m_isPrimary) { + return 0; + } + else { + return m_screen->getJumpZoneSize(); + } } void Screen::getCursorCenter(SInt32& x, SInt32& y) const { - m_screen->getCursorCenter(x, y); + m_screen->getCursorCenter(x, y); } KeyModifierMask Screen::getActiveModifiers() const { - return m_screen->getActiveModifiers(); + return m_screen->getActiveModifiers(); } KeyModifierMask Screen::pollActiveModifiers() const { - return m_screen->pollActiveModifiers(); + return m_screen->pollActiveModifiers(); } bool Screen::isDraggingStarted() const { - return m_screen->isDraggingStarted(); + return m_screen->isDraggingStarted(); } bool Screen::isFakeDraggingStarted() const { - return m_screen->isFakeDraggingStarted(); + return m_screen->isFakeDraggingStarted(); } void Screen::setDraggingStarted(bool started) { - m_screen->setDraggingStarted(started); + m_screen->setDraggingStarted(started); } void Screen::startDraggingFiles(DragFileList& fileList) { - m_screen->fakeDraggingFiles(fileList); + m_screen->fakeDraggingFiles(fileList); } void Screen::setEnableDragDrop(bool enabled) { - m_enableDragDrop = enabled; + m_enableDragDrop = enabled; } String& Screen::getDraggingFilename() const { - return m_screen->getDraggingFilename(); + return m_screen->getDraggingFilename(); } void Screen::clearDraggingFilename() { - m_screen->clearDraggingFilename(); + m_screen->clearDraggingFilename(); } const String& Screen::getDropTarget() const { - return m_screen->getDropTarget(); + return m_screen->getDropTarget(); } void* Screen::getEventTarget() const { - return m_screen; + return m_screen; } bool Screen::getClipboard(ClipboardID id, IClipboard* clipboard) const { - return m_screen->getClipboard(id, clipboard); + return m_screen->getClipboard(id, clipboard); } void Screen::getShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) const { - m_screen->getShape(x, y, w, h); + m_screen->getShape(x, y, w, h); } void Screen::getCursorPos(SInt32& x, SInt32& y) const { - m_screen->getCursorPos(x, y); + m_screen->getCursorPos(x, y); } void Screen::enablePrimary() { - // get notified of screen saver activation/deactivation - m_screen->openScreensaver(true); + // get notified of screen saver activation/deactivation + m_screen->openScreensaver(true); - // claim screen changed size - m_events->addEvent(Event(m_events->forIScreen().shapeChanged(), getEventTarget())); + // claim screen changed size + m_events->addEvent(Event(m_events->forIScreen().shapeChanged(), getEventTarget())); } void Screen::enableSecondary() { - // assume primary has all clipboards - for (ClipboardID id = 0; id < kClipboardEnd; ++id) { - grabClipboard(id); - } + // assume primary has all clipboards + for (ClipboardID id = 0; id < kClipboardEnd; ++id) { + grabClipboard(id); + } - // disable the screen saver if synchronization is enabled - if (m_screenSaverSync) { - m_screen->openScreensaver(false); - } + // disable the screen saver if synchronization is enabled + if (m_screenSaverSync) { + m_screen->openScreensaver(false); + } } void Screen::disablePrimary() { - // done with screen saver - m_screen->closeScreensaver(); + // done with screen saver + m_screen->closeScreensaver(); } void Screen::disableSecondary() { - // done with screen saver - m_screen->closeScreensaver(); + // done with screen saver + m_screen->closeScreensaver(); } void Screen::enterPrimary() { - // do nothing + // do nothing } void Screen::enterSecondary(KeyModifierMask) { - // do nothing + // do nothing } void Screen::leavePrimary() { - // we don't track keys while on the primary screen so update our - // idea of them now. this is particularly to update the state of - // the toggle modifiers. - m_screen->updateKeyState(); + // we don't track keys while on the primary screen so update our + // idea of them now. this is particularly to update the state of + // the toggle modifiers. + m_screen->updateKeyState(); } void Screen::leaveSecondary() { - // release any keys we think are still down - m_screen->fakeAllKeysUp(); + // release any keys we think are still down + m_screen->fakeAllKeysUp(); } } diff --git a/src/lib/synergy/Screen.h b/src/lib/synergy/Screen.h index 83d60b59..9c45a482 100644 --- a/src/lib/synergy/Screen.h +++ b/src/lib/synergy/Screen.h @@ -39,307 +39,307 @@ primary or secondary screen. */ class Screen : public IScreen { public: - Screen(IPlatformScreen* platformScreen, IEventQueue* events); - virtual ~Screen(); + Screen(IPlatformScreen* platformScreen, IEventQueue* events); + virtual ~Screen(); #ifdef TEST_ENV - Screen() : m_mock(true) { } + Screen() : m_mock(true) { } #endif - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Activate screen - /*! - Activate the screen, preparing it to report system and user events. - For a secondary screen it also means disabling the screen saver if - synchronizing it and preparing to synthesize events. - */ - virtual void enable(); + //! Activate screen + /*! + Activate the screen, preparing it to report system and user events. + For a secondary screen it also means disabling the screen saver if + synchronizing it and preparing to synthesize events. + */ + virtual void enable(); - //! Deactivate screen - /*! - Undoes the operations in activate() and events are no longer - reported. It also releases keys that are logically pressed. - */ - virtual void disable(); + //! Deactivate screen + /*! + Undoes the operations in activate() and events are no longer + reported. It also releases keys that are logically pressed. + */ + virtual void disable(); - //! Enter screen - /*! - Called when the user navigates to this screen. \p toggleMask has the - toggle keys that should be turned on on the secondary screen. - */ - void enter(KeyModifierMask toggleMask); + //! Enter screen + /*! + Called when the user navigates to this screen. \p toggleMask has the + toggle keys that should be turned on on the secondary screen. + */ + void enter(KeyModifierMask toggleMask); - //! Leave screen - /*! - Called when the user navigates off this screen. - */ - bool leave(); + //! Leave screen + /*! + Called when the user navigates off this screen. + */ + bool leave(); - //! Update configuration - /*! - This is called when the configuration has changed. \c activeSides - is a bitmask of EDirectionMask indicating which sides of the - primary screen are linked to clients. - */ - void reconfigure(UInt32 activeSides); + //! Update configuration + /*! + This is called when the configuration has changed. \c activeSides + is a bitmask of EDirectionMask indicating which sides of the + primary screen are linked to clients. + */ + void reconfigure(UInt32 activeSides); - //! Warp cursor - /*! - Warps the cursor to the absolute coordinates \c x,y. Also - discards input events up to and including the warp before - returning. - */ - void warpCursor(SInt32 x, SInt32 y); + //! Warp cursor + /*! + Warps the cursor to the absolute coordinates \c x,y. Also + discards input events up to and including the warp before + returning. + */ + void warpCursor(SInt32 x, SInt32 y); - //! Set clipboard - /*! - Sets the system's clipboard contents. This is usually called - soon after an enter(). - */ - void setClipboard(ClipboardID, const IClipboard*); + //! Set clipboard + /*! + Sets the system's clipboard contents. This is usually called + soon after an enter(). + */ + void setClipboard(ClipboardID, const IClipboard*); - //! Grab clipboard - /*! - Grabs (i.e. take ownership of) the system clipboard. - */ - void grabClipboard(ClipboardID); + //! Grab clipboard + /*! + Grabs (i.e. take ownership of) the system clipboard. + */ + void grabClipboard(ClipboardID); - //! Activate/deactivate screen saver - /*! - Forcibly activates the screen saver if \c activate is true otherwise - forcibly deactivates it. - */ - void screensaver(bool activate); + //! Activate/deactivate screen saver + /*! + Forcibly activates the screen saver if \c activate is true otherwise + forcibly deactivates it. + */ + void screensaver(bool activate); - //! Notify of key press - /*! - Synthesize key events to generate a press of key \c id. If possible - match the given modifier mask. The KeyButton identifies the physical - key on the server that generated this key down. The client must - ensure that a key up or key repeat that uses the same KeyButton will - synthesize an up or repeat for the same client key synthesized by - keyDown(). - */ - void keyDown(KeyID id, KeyModifierMask, KeyButton); + //! Notify of key press + /*! + Synthesize key events to generate a press of key \c id. If possible + match the given modifier mask. The KeyButton identifies the physical + key on the server that generated this key down. The client must + ensure that a key up or key repeat that uses the same KeyButton will + synthesize an up or repeat for the same client key synthesized by + keyDown(). + */ + void keyDown(KeyID id, KeyModifierMask, KeyButton); - //! Notify of key repeat - /*! - Synthesize key events to generate a press and release of key \c id - \c count times. If possible match the given modifier mask. - */ - void keyRepeat(KeyID id, KeyModifierMask, - SInt32 count, KeyButton); + //! Notify of key repeat + /*! + Synthesize key events to generate a press and release of key \c id + \c count times. If possible match the given modifier mask. + */ + void keyRepeat(KeyID id, KeyModifierMask, + SInt32 count, KeyButton); - //! Notify of key release - /*! - Synthesize key events to generate a release of key \c id. If possible - match the given modifier mask. - */ - void keyUp(KeyID id, KeyModifierMask, KeyButton); + //! Notify of key release + /*! + Synthesize key events to generate a release of key \c id. If possible + match the given modifier mask. + */ + void keyUp(KeyID id, KeyModifierMask, KeyButton); - //! Notify of mouse press - /*! - Synthesize mouse events to generate a press of mouse button \c id. - */ - void mouseDown(ButtonID id); + //! Notify of mouse press + /*! + Synthesize mouse events to generate a press of mouse button \c id. + */ + void mouseDown(ButtonID id); - //! Notify of mouse release - /*! - Synthesize mouse events to generate a release of mouse button \c id. - */ - void mouseUp(ButtonID id); + //! Notify of mouse release + /*! + Synthesize mouse events to generate a release of mouse button \c id. + */ + void mouseUp(ButtonID id); - //! Notify of mouse motion - /*! - Synthesize mouse events to generate mouse motion to the absolute - screen position \c xAbs,yAbs. - */ - void mouseMove(SInt32 xAbs, SInt32 yAbs); + //! Notify of mouse motion + /*! + Synthesize mouse events to generate mouse motion to the absolute + screen position \c xAbs,yAbs. + */ + void mouseMove(SInt32 xAbs, SInt32 yAbs); - //! Notify of mouse motion - /*! - Synthesize mouse events to generate mouse motion by the relative - amount \c xRel,yRel. - */ - void mouseRelativeMove(SInt32 xRel, SInt32 yRel); + //! Notify of mouse motion + /*! + Synthesize mouse events to generate mouse motion by the relative + amount \c xRel,yRel. + */ + void mouseRelativeMove(SInt32 xRel, SInt32 yRel); - //! Notify of mouse wheel motion - /*! - Synthesize mouse events to generate mouse wheel motion of \c xDelta - and \c yDelta. Deltas are positive for motion away from the user or - to the right and negative for motion towards the user or to the left. - Each wheel click should generate a delta of +/-120. - */ - void mouseWheel(SInt32 xDelta, SInt32 yDelta); + //! Notify of mouse wheel motion + /*! + Synthesize mouse events to generate mouse wheel motion of \c xDelta + and \c yDelta. Deltas are positive for motion away from the user or + to the right and negative for motion towards the user or to the left. + Each wheel click should generate a delta of +/-120. + */ + void mouseWheel(SInt32 xDelta, SInt32 yDelta); - //! Notify of options changes - /*! - Resets all options to their default values. - */ - virtual void resetOptions(); + //! Notify of options changes + /*! + Resets all options to their default values. + */ + virtual void resetOptions(); - //! Notify of options changes - /*! - Set options to given values. Ignores unknown options and doesn't - modify options that aren't given in \c options. - */ - virtual void setOptions(const OptionsList& options); + //! Notify of options changes + /*! + Set options to given values. Ignores unknown options and doesn't + modify options that aren't given in \c options. + */ + virtual void setOptions(const OptionsList& options); - //! Set clipboard sequence number - /*! - Sets the sequence number to use in subsequent clipboard events. - */ - void setSequenceNumber(UInt32); + //! Set clipboard sequence number + /*! + Sets the sequence number to use in subsequent clipboard events. + */ + void setSequenceNumber(UInt32); - //! Register a system hotkey - /*! - Registers a system-wide hotkey for key \p key with modifiers \p mask. - Returns an id used to unregister the hotkey. - */ - UInt32 registerHotKey(KeyID key, KeyModifierMask mask); + //! Register a system hotkey + /*! + Registers a system-wide hotkey for key \p key with modifiers \p mask. + Returns an id used to unregister the hotkey. + */ + UInt32 registerHotKey(KeyID key, KeyModifierMask mask); - //! Unregister a system hotkey - /*! - Unregisters a previously registered hot key. - */ - void unregisterHotKey(UInt32 id); + //! Unregister a system hotkey + /*! + Unregisters a previously registered hot key. + */ + void unregisterHotKey(UInt32 id); - //! Prepare to synthesize input on primary screen - /*! - Prepares the primary screen to receive synthesized input. We do not - want to receive this synthesized input as user input so this method - ensures that we ignore it. Calls to \c fakeInputBegin() may not be - nested. - */ - void fakeInputBegin(); + //! Prepare to synthesize input on primary screen + /*! + Prepares the primary screen to receive synthesized input. We do not + want to receive this synthesized input as user input so this method + ensures that we ignore it. Calls to \c fakeInputBegin() may not be + nested. + */ + void fakeInputBegin(); - //! Done synthesizing input on primary screen - /*! - Undoes whatever \c fakeInputBegin() did. - */ - void fakeInputEnd(); + //! Done synthesizing input on primary screen + /*! + Undoes whatever \c fakeInputBegin() did. + */ + void fakeInputEnd(); - //! Change dragging status - void setDraggingStarted(bool started); - - //! Fake a files dragging operation - void startDraggingFiles(DragFileList& fileList); + //! Change dragging status + void setDraggingStarted(bool started); + + //! Fake a files dragging operation + void startDraggingFiles(DragFileList& fileList); - void setEnableDragDrop(bool enabled); - //@} - //! @name accessors - //@{ + void setEnableDragDrop(bool enabled); + //@} + //! @name accessors + //@{ - //! Test if cursor on screen - /*! - Returns true iff the cursor is on the screen. - */ - bool isOnScreen() const; + //! Test if cursor on screen + /*! + Returns true iff the cursor is on the screen. + */ + bool isOnScreen() const; - //! Get screen lock state - /*! - Returns true if there's any reason that the user should not be - allowed to leave the screen (usually because a button or key is - pressed). If this method returns true it logs a message as to - why at the CLOG_DEBUG level. - */ - bool isLockedToScreen() const; + //! Get screen lock state + /*! + Returns true if there's any reason that the user should not be + allowed to leave the screen (usually because a button or key is + pressed). If this method returns true it logs a message as to + why at the CLOG_DEBUG level. + */ + bool isLockedToScreen() const; - //! Get jump zone size - /*! - Return the jump zone size, the size of the regions on the edges of - the screen that cause the cursor to jump to another screen. - */ - SInt32 getJumpZoneSize() const; + //! Get jump zone size + /*! + Return the jump zone size, the size of the regions on the edges of + the screen that cause the cursor to jump to another screen. + */ + SInt32 getJumpZoneSize() const; - //! Get cursor center position - /*! - Return the cursor center position which is where we park the - cursor to compute cursor motion deltas and should be far from - the edges of the screen, typically the center. - */ - void getCursorCenter(SInt32& x, SInt32& y) const; + //! Get cursor center position + /*! + Return the cursor center position which is where we park the + cursor to compute cursor motion deltas and should be far from + the edges of the screen, typically the center. + */ + void getCursorCenter(SInt32& x, SInt32& y) const; - //! Get the active modifiers - /*! - Returns the modifiers that are currently active according to our - shadowed state. - */ - KeyModifierMask getActiveModifiers() const; + //! Get the active modifiers + /*! + Returns the modifiers that are currently active according to our + shadowed state. + */ + KeyModifierMask getActiveModifiers() const; - //! Get the active modifiers from OS - /*! - Returns the modifiers that are currently active according to the - operating system. - */ - KeyModifierMask pollActiveModifiers() const; + //! Get the active modifiers from OS + /*! + Returns the modifiers that are currently active according to the + operating system. + */ + KeyModifierMask pollActiveModifiers() const; - //! Test if file is dragged on primary screen - bool isDraggingStarted() const; - - //! Test if file is dragged on secondary screen - bool isFakeDraggingStarted() const; + //! Test if file is dragged on primary screen + bool isDraggingStarted() const; + + //! Test if file is dragged on secondary screen + bool isFakeDraggingStarted() const; - //! Get the filename of the file being dragged - String& getDraggingFilename() const; + //! Get the filename of the file being dragged + String& getDraggingFilename() const; - //! Clear the filename of the file that was dragged - void clearDraggingFilename(); + //! Clear the filename of the file that was dragged + void clearDraggingFilename(); - //! Get the drop target directory - const String& getDropTarget() const; + //! Get the drop target directory + const String& getDropTarget() const; - //@} + //@} - // IScreen overrides - virtual void* getEventTarget() const; - virtual bool getClipboard(ClipboardID id, IClipboard*) const; - virtual void getShape(SInt32& x, SInt32& y, - SInt32& width, SInt32& height) const; - virtual void getCursorPos(SInt32& x, SInt32& y) const; - - IPlatformScreen* getPlatformScreen() { return m_screen; } + // IScreen overrides + virtual void* getEventTarget() const; + virtual bool getClipboard(ClipboardID id, IClipboard*) const; + virtual void getShape(SInt32& x, SInt32& y, + SInt32& width, SInt32& height) const; + virtual void getCursorPos(SInt32& x, SInt32& y) const; + + IPlatformScreen* getPlatformScreen() { return m_screen; } protected: - void enablePrimary(); - void enableSecondary(); - void disablePrimary(); - void disableSecondary(); + void enablePrimary(); + void enableSecondary(); + void disablePrimary(); + void disableSecondary(); - void enterPrimary(); - void enterSecondary(KeyModifierMask toggleMask); - void leavePrimary(); - void leaveSecondary(); + void enterPrimary(); + void enterSecondary(KeyModifierMask toggleMask); + void leavePrimary(); + void leaveSecondary(); private: - // our platform dependent screen - IPlatformScreen* m_screen; + // our platform dependent screen + IPlatformScreen* m_screen; - // true if screen is being used as a primary screen, false otherwise - bool m_isPrimary; + // true if screen is being used as a primary screen, false otherwise + bool m_isPrimary; - // true if screen is enabled - bool m_enabled; + // true if screen is enabled + bool m_enabled; - // true if the cursor is on this screen - bool m_entered; + // true if the cursor is on this screen + bool m_entered; - // true if screen saver should be synchronized to server - bool m_screenSaverSync; + // true if screen saver should be synchronized to server + bool m_screenSaverSync; - // note toggle keys that toggles on up/down (false) or on - // transition (true) - KeyModifierMask m_halfDuplex; + // note toggle keys that toggles on up/down (false) or on + // transition (true) + KeyModifierMask m_halfDuplex; - // true if we're faking input on a primary screen - bool m_fakeInput; + // true if we're faking input on a primary screen + bool m_fakeInput; - IEventQueue* m_events; + IEventQueue* m_events; - bool m_mock; - bool m_enableDragDrop; + bool m_mock; + bool m_enableDragDrop; }; } diff --git a/src/lib/synergy/ServerApp.cpp b/src/lib/synergy/ServerApp.cpp index ae1a2077..5d49239a 100644 --- a/src/lib/synergy/ServerApp.cpp +++ b/src/lib/synergy/ServerApp.cpp @@ -65,14 +65,14 @@ // ServerApp::ServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : - App(events, createTaskBarReceiver, new ServerArgs()), - m_server(NULL), - m_serverState(kUninitialized), - m_serverScreen(NULL), - m_primaryClient(NULL), - m_listener(NULL), - m_timer(NULL), - m_synergyAddress(NULL) + App(events, createTaskBarReceiver, new ServerArgs()), + m_server(NULL), + m_serverState(kUninitialized), + m_serverScreen(NULL), + m_primaryClient(NULL), + m_listener(NULL), + m_timer(NULL), + m_synergyAddress(NULL) { } @@ -83,592 +83,592 @@ ServerApp::~ServerApp() void ServerApp::parseArgs(int argc, const char* const* argv) { - ArgParser argParser(this); - bool result = argParser.parseServerArgs(args(), argc, argv); + ArgParser argParser(this); + bool result = argParser.parseServerArgs(args(), argc, argv); - if (!result || args().m_shouldExit) { - m_bye(kExitArgs); - } - else { - if (!args().m_synergyAddress.empty()) { - try { - *m_synergyAddress = NetworkAddress(args().m_synergyAddress, - kDefaultPort); - m_synergyAddress->resolve(); - } - catch (XSocketAddress& e) { - LOG((CLOG_PRINT "%s: %s" BYE, - args().m_pname, e.what(), args().m_pname)); - m_bye(kExitArgs); - } - } - } + if (!result || args().m_shouldExit) { + m_bye(kExitArgs); + } + else { + if (!args().m_synergyAddress.empty()) { + try { + *m_synergyAddress = NetworkAddress(args().m_synergyAddress, + kDefaultPort); + m_synergyAddress->resolve(); + } + catch (XSocketAddress& e) { + LOG((CLOG_PRINT "%s: %s" BYE, + args().m_pname, e.what(), args().m_pname)); + m_bye(kExitArgs); + } + } + } } void ServerApp::help() { - // window api args (windows/x-windows/carbon) + // window api args (windows/x-windows/carbon) #if WINAPI_XWINDOWS # define WINAPI_ARGS \ - " [--display ] [--no-xinitthreads]" + " [--display ] [--no-xinitthreads]" # define WINAPI_INFO \ - " --display connect to the X server at \n" \ - " --no-xinitthreads do not call XInitThreads()\n" + " --display connect to the X server at \n" \ + " --no-xinitthreads do not call XInitThreads()\n" #else # define WINAPI_ARGS # define WINAPI_INFO #endif - char buffer[3000]; - sprintf( - buffer, - "Usage: %s" - " [--address
]" - " [--config ]" - WINAPI_ARGS - HELP_SYS_ARGS - HELP_COMMON_ARGS - "\n\n" - "Start the synergy mouse/keyboard sharing server.\n" - "\n" - " -a, --address
listen for clients on the given address.\n" - " -c, --config use the named configuration file instead.\n" - HELP_COMMON_INFO_1 - WINAPI_INFO - HELP_SYS_INFO - HELP_COMMON_INFO_2 - "\n" - "* marks defaults.\n" - "\n" - "The argument for --address is of the form: [][:]. The\n" - "hostname must be the address or hostname of an interface on the system.\n" - "The default is to listen on all interfaces. The port overrides the\n" - "default port, %d.\n" - "\n" - "If no configuration file pathname is provided then the first of the\n" - "following to load successfully sets the configuration:\n" - " %s\n" - " %s\n", - args().m_pname, kDefaultPort, - ARCH->concatPath(ARCH->getUserDirectory(), USR_CONFIG_NAME).c_str(), - ARCH->concatPath(ARCH->getSystemDirectory(), SYS_CONFIG_NAME).c_str() - ); + char buffer[3000]; + sprintf( + buffer, + "Usage: %s" + " [--address
]" + " [--config ]" + WINAPI_ARGS + HELP_SYS_ARGS + HELP_COMMON_ARGS + "\n\n" + "Start the synergy mouse/keyboard sharing server.\n" + "\n" + " -a, --address
listen for clients on the given address.\n" + " -c, --config use the named configuration file instead.\n" + HELP_COMMON_INFO_1 + WINAPI_INFO + HELP_SYS_INFO + HELP_COMMON_INFO_2 + "\n" + "* marks defaults.\n" + "\n" + "The argument for --address is of the form: [][:]. The\n" + "hostname must be the address or hostname of an interface on the system.\n" + "The default is to listen on all interfaces. The port overrides the\n" + "default port, %d.\n" + "\n" + "If no configuration file pathname is provided then the first of the\n" + "following to load successfully sets the configuration:\n" + " %s\n" + " %s\n", + args().m_pname, kDefaultPort, + ARCH->concatPath(ARCH->getUserDirectory(), USR_CONFIG_NAME).c_str(), + ARCH->concatPath(ARCH->getSystemDirectory(), SYS_CONFIG_NAME).c_str() + ); - LOG((CLOG_PRINT "%s", buffer)); + LOG((CLOG_PRINT "%s", buffer)); } void ServerApp::reloadSignalHandler(Arch::ESignal, void*) { - IEventQueue* events = App::instance().getEvents(); - events->addEvent(Event(events->forServerApp().reloadConfig(), - events->getSystemTarget())); + IEventQueue* events = App::instance().getEvents(); + events->addEvent(Event(events->forServerApp().reloadConfig(), + events->getSystemTarget())); } void ServerApp::reloadConfig(const Event&, void*) { - LOG((CLOG_DEBUG "reload configuration")); - if (loadConfig(args().m_configFile)) { - if (m_server != NULL) { - m_server->setConfig(*args().m_config); - } - LOG((CLOG_NOTE "reloaded configuration")); - } + LOG((CLOG_DEBUG "reload configuration")); + if (loadConfig(args().m_configFile)) { + if (m_server != NULL) { + m_server->setConfig(*args().m_config); + } + LOG((CLOG_NOTE "reloaded configuration")); + } } void ServerApp::loadConfig() { - bool loaded = false; + bool loaded = false; - // load the config file, if specified - if (!args().m_configFile.empty()) { - loaded = loadConfig(args().m_configFile); - } + // load the config file, if specified + if (!args().m_configFile.empty()) { + loaded = loadConfig(args().m_configFile); + } - // load the default configuration if no explicit file given - else { - // get the user's home directory - String path = ARCH->getUserDirectory(); - if (!path.empty()) { - // complete path - path = ARCH->concatPath(path, USR_CONFIG_NAME); + // load the default configuration if no explicit file given + else { + // get the user's home directory + String path = ARCH->getUserDirectory(); + if (!path.empty()) { + // complete path + path = ARCH->concatPath(path, USR_CONFIG_NAME); - // now try loading the user's configuration - if (loadConfig(path)) { - loaded = true; - args().m_configFile = path; - } - } - if (!loaded) { - // try the system-wide config file - path = ARCH->getSystemDirectory(); - if (!path.empty()) { - path = ARCH->concatPath(path, SYS_CONFIG_NAME); - if (loadConfig(path)) { - loaded = true; - args().m_configFile = path; - } - } - } - } + // now try loading the user's configuration + if (loadConfig(path)) { + loaded = true; + args().m_configFile = path; + } + } + if (!loaded) { + // try the system-wide config file + path = ARCH->getSystemDirectory(); + if (!path.empty()) { + path = ARCH->concatPath(path, SYS_CONFIG_NAME); + if (loadConfig(path)) { + loaded = true; + args().m_configFile = path; + } + } + } + } - if (!loaded) { - LOG((CLOG_PRINT "%s: no configuration available", args().m_pname)); - m_bye(kExitConfig); - } + if (!loaded) { + LOG((CLOG_PRINT "%s: no configuration available", args().m_pname)); + m_bye(kExitConfig); + } } bool ServerApp::loadConfig(const String& pathname) { - try { - // load configuration - LOG((CLOG_DEBUG "opening configuration \"%s\"", pathname.c_str())); - std::ifstream configStream(pathname.c_str()); - if (!configStream.is_open()) { - // report failure to open configuration as a debug message - // since we try several paths and we expect some to be - // missing. - LOG((CLOG_DEBUG "cannot open configuration \"%s\"", - pathname.c_str())); - return false; - } - configStream >> *args().m_config; - LOG((CLOG_DEBUG "configuration read successfully")); - return true; - } - catch (XConfigRead& e) { - // report error in configuration file - LOG((CLOG_ERR "cannot read configuration \"%s\": %s", - pathname.c_str(), e.what())); - } - return false; + try { + // load configuration + LOG((CLOG_DEBUG "opening configuration \"%s\"", pathname.c_str())); + std::ifstream configStream(pathname.c_str()); + if (!configStream.is_open()) { + // report failure to open configuration as a debug message + // since we try several paths and we expect some to be + // missing. + LOG((CLOG_DEBUG "cannot open configuration \"%s\"", + pathname.c_str())); + return false; + } + configStream >> *args().m_config; + LOG((CLOG_DEBUG "configuration read successfully")); + return true; + } + catch (XConfigRead& e) { + // report error in configuration file + LOG((CLOG_ERR "cannot read configuration \"%s\": %s", + pathname.c_str(), e.what())); + } + return false; } void ServerApp::forceReconnect(const Event&, void*) { - if (m_server != NULL) { - m_server->disconnect(); - } + if (m_server != NULL) { + m_server->disconnect(); + } } void ServerApp::handleClientConnected(const Event&, void* vlistener) { - ClientListener* listener = static_cast(vlistener); - ClientProxy* client = listener->getNextClient(); - if (client != NULL) { - m_server->adoptClient(client); - updateStatus(); - } + ClientListener* listener = static_cast(vlistener); + ClientProxy* client = listener->getNextClient(); + if (client != NULL) { + m_server->adoptClient(client); + updateStatus(); + } } void ServerApp::handleClientsDisconnected(const Event&, void*) { - m_events->addEvent(Event(Event::kQuit)); + m_events->addEvent(Event(Event::kQuit)); } void ServerApp::closeServer(Server* server) { - if (server == NULL) { - return; - } + if (server == NULL) { + return; + } - // tell all clients to disconnect - server->disconnect(); + // tell all clients to disconnect + server->disconnect(); - // wait for clients to disconnect for up to timeout seconds - double timeout = 3.0; - EventQueueTimer* timer = m_events->newOneShotTimer(timeout, NULL); - m_events->adoptHandler(Event::kTimer, timer, - new TMethodEventJob(this, &ServerApp::handleClientsDisconnected)); - m_events->adoptHandler(m_events->forServer().disconnected(), server, - new TMethodEventJob(this, &ServerApp::handleClientsDisconnected)); - - m_events->loop(); + // wait for clients to disconnect for up to timeout seconds + double timeout = 3.0; + EventQueueTimer* timer = m_events->newOneShotTimer(timeout, NULL); + m_events->adoptHandler(Event::kTimer, timer, + new TMethodEventJob(this, &ServerApp::handleClientsDisconnected)); + m_events->adoptHandler(m_events->forServer().disconnected(), server, + new TMethodEventJob(this, &ServerApp::handleClientsDisconnected)); + + m_events->loop(); - m_events->removeHandler(Event::kTimer, timer); - m_events->deleteTimer(timer); - m_events->removeHandler(m_events->forServer().disconnected(), server); + m_events->removeHandler(Event::kTimer, timer); + m_events->deleteTimer(timer); + m_events->removeHandler(m_events->forServer().disconnected(), server); - // done with server - delete server; + // done with server + delete server; } void ServerApp::stopRetryTimer() { - if (m_timer != NULL) { - m_events->deleteTimer(m_timer); - m_events->removeHandler(Event::kTimer, NULL); - m_timer = NULL; - } + if (m_timer != NULL) { + m_events->deleteTimer(m_timer); + m_events->removeHandler(Event::kTimer, NULL); + m_timer = NULL; + } } void ServerApp::updateStatus() { - updateStatus(""); + updateStatus(""); } void ServerApp::updateStatus(const String& msg) { - if (m_taskBarReceiver) - { - m_taskBarReceiver->updateStatus(m_server, msg); - } + if (m_taskBarReceiver) + { + m_taskBarReceiver->updateStatus(m_server, msg); + } } void ServerApp::closeClientListener(ClientListener* listen) { - if (listen != NULL) { - m_events->removeHandler(m_events->forClientListener().connected(), listen); - delete listen; - } + if (listen != NULL) { + m_events->removeHandler(m_events->forClientListener().connected(), listen); + delete listen; + } } void ServerApp::stopServer() { - if (m_serverState == kStarted) { - closeServer(m_server); - closeClientListener(m_listener); - m_server = NULL; - m_listener = NULL; - m_serverState = kInitialized; - } - else if (m_serverState == kStarting) { - stopRetryTimer(); - m_serverState = kInitialized; - } - assert(m_server == NULL); - assert(m_listener == NULL); + if (m_serverState == kStarted) { + closeServer(m_server); + closeClientListener(m_listener); + m_server = NULL; + m_listener = NULL; + m_serverState = kInitialized; + } + else if (m_serverState == kStarting) { + stopRetryTimer(); + m_serverState = kInitialized; + } + assert(m_server == NULL); + assert(m_listener == NULL); } void ServerApp::closePrimaryClient(PrimaryClient* primaryClient) { - delete primaryClient; + delete primaryClient; } void ServerApp::closeServerScreen(synergy::Screen* screen) { - if (screen != NULL) { - m_events->removeHandler(m_events->forIScreen().error(), - screen->getEventTarget()); - m_events->removeHandler(m_events->forIScreen().suspend(), - screen->getEventTarget()); - m_events->removeHandler(m_events->forIScreen().resume(), - screen->getEventTarget()); - delete screen; - } + if (screen != NULL) { + m_events->removeHandler(m_events->forIScreen().error(), + screen->getEventTarget()); + m_events->removeHandler(m_events->forIScreen().suspend(), + screen->getEventTarget()); + m_events->removeHandler(m_events->forIScreen().resume(), + screen->getEventTarget()); + delete screen; + } } void ServerApp::cleanupServer() { - stopServer(); - if (m_serverState == kInitialized) { - closePrimaryClient(m_primaryClient); - closeServerScreen(m_serverScreen); - m_primaryClient = NULL; - m_serverScreen = NULL; - m_serverState = kUninitialized; - } - else if (m_serverState == kInitializing || - m_serverState == kInitializingToStart) { - stopRetryTimer(); - m_serverState = kUninitialized; - } - assert(m_primaryClient == NULL); - assert(m_serverScreen == NULL); - assert(m_serverState == kUninitialized); + stopServer(); + if (m_serverState == kInitialized) { + closePrimaryClient(m_primaryClient); + closeServerScreen(m_serverScreen); + m_primaryClient = NULL; + m_serverScreen = NULL; + m_serverState = kUninitialized; + } + else if (m_serverState == kInitializing || + m_serverState == kInitializingToStart) { + stopRetryTimer(); + m_serverState = kUninitialized; + } + assert(m_primaryClient == NULL); + assert(m_serverScreen == NULL); + assert(m_serverState == kUninitialized); } void ServerApp::retryHandler(const Event&, void*) { - // discard old timer - assert(m_timer != NULL); - stopRetryTimer(); + // discard old timer + assert(m_timer != NULL); + stopRetryTimer(); - // try initializing/starting the server again - switch (m_serverState) { - case kUninitialized: - case kInitialized: - case kStarted: - assert(0 && "bad internal server state"); - break; + // try initializing/starting the server again + switch (m_serverState) { + case kUninitialized: + case kInitialized: + case kStarted: + assert(0 && "bad internal server state"); + break; - case kInitializing: - LOG((CLOG_DEBUG1 "retry server initialization")); - m_serverState = kUninitialized; - if (!initServer()) { - m_events->addEvent(Event(Event::kQuit)); - } - break; + case kInitializing: + LOG((CLOG_DEBUG1 "retry server initialization")); + m_serverState = kUninitialized; + if (!initServer()) { + m_events->addEvent(Event(Event::kQuit)); + } + break; - case kInitializingToStart: - LOG((CLOG_DEBUG1 "retry server initialization")); - m_serverState = kUninitialized; - if (!initServer()) { - m_events->addEvent(Event(Event::kQuit)); - } - else if (m_serverState == kInitialized) { - LOG((CLOG_DEBUG1 "starting server")); - if (!startServer()) { - m_events->addEvent(Event(Event::kQuit)); - } - } - break; + case kInitializingToStart: + LOG((CLOG_DEBUG1 "retry server initialization")); + m_serverState = kUninitialized; + if (!initServer()) { + m_events->addEvent(Event(Event::kQuit)); + } + else if (m_serverState == kInitialized) { + LOG((CLOG_DEBUG1 "starting server")); + if (!startServer()) { + m_events->addEvent(Event(Event::kQuit)); + } + } + break; - case kStarting: - LOG((CLOG_DEBUG1 "retry starting server")); - m_serverState = kInitialized; - if (!startServer()) { - m_events->addEvent(Event(Event::kQuit)); - } - break; - } + case kStarting: + LOG((CLOG_DEBUG1 "retry starting server")); + m_serverState = kInitialized; + if (!startServer()) { + m_events->addEvent(Event(Event::kQuit)); + } + break; + } } bool ServerApp::initServer() { - // skip if already initialized or initializing - if (m_serverState != kUninitialized) { - return true; - } + // skip if already initialized or initializing + if (m_serverState != kUninitialized) { + return true; + } - double retryTime; - synergy::Screen* serverScreen = NULL; - PrimaryClient* primaryClient = NULL; - try { - String name = args().m_config->getCanonicalName(args().m_name); - serverScreen = openServerScreen(); - primaryClient = openPrimaryClient(name, serverScreen); - m_serverScreen = serverScreen; - m_primaryClient = primaryClient; - m_serverState = kInitialized; - updateStatus(); - return true; - } - catch (XScreenUnavailable& e) { - LOG((CLOG_WARN "primary screen unavailable: %s", e.what())); - closePrimaryClient(primaryClient); - closeServerScreen(serverScreen); - updateStatus(String("primary screen unavailable: ") + e.what()); - retryTime = e.getRetryTime(); - } - catch (XScreenOpenFailure& e) { - LOG((CLOG_CRIT "failed to start server: %s", e.what())); - closePrimaryClient(primaryClient); - closeServerScreen(serverScreen); - return false; - } - catch (XBase& e) { - LOG((CLOG_CRIT "failed to start server: %s", e.what())); - closePrimaryClient(primaryClient); - closeServerScreen(serverScreen); - return false; - } + double retryTime; + synergy::Screen* serverScreen = NULL; + PrimaryClient* primaryClient = NULL; + try { + String name = args().m_config->getCanonicalName(args().m_name); + serverScreen = openServerScreen(); + primaryClient = openPrimaryClient(name, serverScreen); + m_serverScreen = serverScreen; + m_primaryClient = primaryClient; + m_serverState = kInitialized; + updateStatus(); + return true; + } + catch (XScreenUnavailable& e) { + LOG((CLOG_WARN "primary screen unavailable: %s", e.what())); + closePrimaryClient(primaryClient); + closeServerScreen(serverScreen); + updateStatus(String("primary screen unavailable: ") + e.what()); + retryTime = e.getRetryTime(); + } + catch (XScreenOpenFailure& e) { + LOG((CLOG_CRIT "failed to start server: %s", e.what())); + closePrimaryClient(primaryClient); + closeServerScreen(serverScreen); + return false; + } + catch (XBase& e) { + LOG((CLOG_CRIT "failed to start server: %s", e.what())); + closePrimaryClient(primaryClient); + closeServerScreen(serverScreen); + return false; + } - if (args().m_restartable) { - // install a timer and handler to retry later - assert(m_timer == NULL); - LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); - m_timer = m_events->newOneShotTimer(retryTime, NULL); - m_events->adoptHandler(Event::kTimer, m_timer, - new TMethodEventJob(this, &ServerApp::retryHandler)); - m_serverState = kInitializing; - return true; - } - else { - // don't try again - return false; - } + if (args().m_restartable) { + // install a timer and handler to retry later + assert(m_timer == NULL); + LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); + m_timer = m_events->newOneShotTimer(retryTime, NULL); + m_events->adoptHandler(Event::kTimer, m_timer, + new TMethodEventJob(this, &ServerApp::retryHandler)); + m_serverState = kInitializing; + return true; + } + else { + // don't try again + return false; + } } synergy::Screen* ServerApp::openServerScreen() { - synergy::Screen* screen = createScreen(); - screen->setEnableDragDrop(argsBase().m_enableDragDrop); - m_events->adoptHandler(m_events->forIScreen().error(), - screen->getEventTarget(), - new TMethodEventJob( - this, &ServerApp::handleScreenError)); - m_events->adoptHandler(m_events->forIScreen().suspend(), - screen->getEventTarget(), - new TMethodEventJob( - this, &ServerApp::handleSuspend)); - m_events->adoptHandler(m_events->forIScreen().resume(), - screen->getEventTarget(), - new TMethodEventJob( - this, &ServerApp::handleResume)); - return screen; + synergy::Screen* screen = createScreen(); + screen->setEnableDragDrop(argsBase().m_enableDragDrop); + m_events->adoptHandler(m_events->forIScreen().error(), + screen->getEventTarget(), + new TMethodEventJob( + this, &ServerApp::handleScreenError)); + m_events->adoptHandler(m_events->forIScreen().suspend(), + screen->getEventTarget(), + new TMethodEventJob( + this, &ServerApp::handleSuspend)); + m_events->adoptHandler(m_events->forIScreen().resume(), + screen->getEventTarget(), + new TMethodEventJob( + this, &ServerApp::handleResume)); + return screen; } bool ServerApp::startServer() { - // skip if already started or starting - if (m_serverState == kStarting || m_serverState == kStarted) { - return true; - } + // skip if already started or starting + if (m_serverState == kStarting || m_serverState == kStarted) { + return true; + } - // initialize if necessary - if (m_serverState != kInitialized) { - if (!initServer()) { - // hard initialization failure - return false; - } - if (m_serverState == kInitializing) { - // not ready to start - m_serverState = kInitializingToStart; - return true; - } - assert(m_serverState == kInitialized); - } + // initialize if necessary + if (m_serverState != kInitialized) { + if (!initServer()) { + // hard initialization failure + return false; + } + if (m_serverState == kInitializing) { + // not ready to start + m_serverState = kInitializingToStart; + return true; + } + assert(m_serverState == kInitialized); + } - double retryTime; - ClientListener* listener = NULL; - try { - listener = openClientListener(args().m_config->getSynergyAddress()); - m_server = openServer(*args().m_config, m_primaryClient); - listener->setServer(m_server); - m_server->setListener(listener); - m_listener = listener; - updateStatus(); - LOG((CLOG_NOTE "started server, waiting for clients")); - m_serverState = kStarted; - return true; - } - catch (XSocketAddressInUse& e) { - LOG((CLOG_WARN "cannot listen for clients: %s", e.what())); - closeClientListener(listener); - updateStatus(String("cannot listen for clients: ") + e.what()); - retryTime = 10.0; - } - catch (XBase& e) { - LOG((CLOG_CRIT "failed to start server: %s", e.what())); - closeClientListener(listener); - return false; - } + double retryTime; + ClientListener* listener = NULL; + try { + listener = openClientListener(args().m_config->getSynergyAddress()); + m_server = openServer(*args().m_config, m_primaryClient); + listener->setServer(m_server); + m_server->setListener(listener); + m_listener = listener; + updateStatus(); + LOG((CLOG_NOTE "started server, waiting for clients")); + m_serverState = kStarted; + return true; + } + catch (XSocketAddressInUse& e) { + LOG((CLOG_WARN "cannot listen for clients: %s", e.what())); + closeClientListener(listener); + updateStatus(String("cannot listen for clients: ") + e.what()); + retryTime = 10.0; + } + catch (XBase& e) { + LOG((CLOG_CRIT "failed to start server: %s", e.what())); + closeClientListener(listener); + return false; + } - if (args().m_restartable) { - // install a timer and handler to retry later - assert(m_timer == NULL); - LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); - m_timer = m_events->newOneShotTimer(retryTime, NULL); - m_events->adoptHandler(Event::kTimer, m_timer, - new TMethodEventJob(this, &ServerApp::retryHandler)); - m_serverState = kStarting; - return true; - } - else { - // don't try again - return false; - } + if (args().m_restartable) { + // install a timer and handler to retry later + assert(m_timer == NULL); + LOG((CLOG_DEBUG "retry in %.0f seconds", retryTime)); + m_timer = m_events->newOneShotTimer(retryTime, NULL); + m_events->adoptHandler(Event::kTimer, m_timer, + new TMethodEventJob(this, &ServerApp::retryHandler)); + m_serverState = kStarting; + return true; + } + else { + // don't try again + return false; + } } synergy::Screen* ServerApp::createScreen() { #if WINAPI_MSWINDOWS - return new synergy::Screen(new MSWindowsScreen( - true, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events); + return new synergy::Screen(new MSWindowsScreen( + true, args().m_noHooks, args().m_stopOnDeskSwitch, m_events), m_events); #elif WINAPI_XWINDOWS - return new synergy::Screen(new XWindowsScreen( - args().m_display, true, args().m_disableXInitThreads, 0, m_events), m_events); + return new synergy::Screen(new XWindowsScreen( + args().m_display, true, args().m_disableXInitThreads, 0, m_events), m_events); #elif WINAPI_CARBON - return new synergy::Screen(new OSXScreen(m_events, true), m_events); + return new synergy::Screen(new OSXScreen(m_events, true), m_events); #endif } PrimaryClient* ServerApp::openPrimaryClient(const String& name, synergy::Screen* screen) { - LOG((CLOG_DEBUG1 "creating primary screen")); - return new PrimaryClient(name, screen); + LOG((CLOG_DEBUG1 "creating primary screen")); + return new PrimaryClient(name, screen); } void ServerApp::handleScreenError(const Event&, void*) { - LOG((CLOG_CRIT "error on screen")); - m_events->addEvent(Event(Event::kQuit)); + LOG((CLOG_CRIT "error on screen")); + m_events->addEvent(Event(Event::kQuit)); } void ServerApp::handleSuspend(const Event&, void*) { - if (!m_suspended) { - LOG((CLOG_INFO "suspend")); - stopServer(); - m_suspended = true; - } + if (!m_suspended) { + LOG((CLOG_INFO "suspend")); + stopServer(); + m_suspended = true; + } } void ServerApp::handleResume(const Event&, void*) { - if (m_suspended) { - LOG((CLOG_INFO "resume")); - startServer(); - m_suspended = false; - } + if (m_suspended) { + LOG((CLOG_INFO "resume")); + startServer(); + m_suspended = false; + } } ClientListener* ServerApp::openClientListener(const NetworkAddress& address) { - ClientListener* listen = new ClientListener( - address, - new TCPSocketFactory(m_events, getSocketMultiplexer()), - m_events, - args().m_enableCrypto); - - m_events->adoptHandler( - m_events->forClientListener().connected(), listen, - new TMethodEventJob( - this, &ServerApp::handleClientConnected, listen)); - - return listen; + ClientListener* listen = new ClientListener( + address, + new TCPSocketFactory(m_events, getSocketMultiplexer()), + m_events, + args().m_enableCrypto); + + m_events->adoptHandler( + m_events->forClientListener().connected(), listen, + new TMethodEventJob( + this, &ServerApp::handleClientConnected, listen)); + + return listen; } Server* ServerApp::openServer(Config& config, PrimaryClient* primaryClient) { - Server* server = new Server(config, primaryClient, m_serverScreen, m_events, args()); - try { - m_events->adoptHandler( - m_events->forServer().disconnected(), server, - new TMethodEventJob(this, &ServerApp::handleNoClients)); + Server* server = new Server(config, primaryClient, m_serverScreen, m_events, args()); + try { + m_events->adoptHandler( + m_events->forServer().disconnected(), server, + new TMethodEventJob(this, &ServerApp::handleNoClients)); - m_events->adoptHandler( - m_events->forServer().screenSwitched(), server, - new TMethodEventJob(this, &ServerApp::handleScreenSwitched)); + m_events->adoptHandler( + m_events->forServer().screenSwitched(), server, + new TMethodEventJob(this, &ServerApp::handleScreenSwitched)); - } catch (std::bad_alloc &ba) { - delete server; - throw ba; - } + } catch (std::bad_alloc &ba) { + delete server; + throw ba; + } - return server; + return server; } void ServerApp::handleNoClients(const Event&, void*) { - updateStatus(); + updateStatus(); } void @@ -679,171 +679,171 @@ ServerApp::handleScreenSwitched(const Event& e, void*) int ServerApp::mainLoop() { - // create socket multiplexer. this must happen after daemonization - // on unix because threads evaporate across a fork(). - SocketMultiplexer multiplexer; - setSocketMultiplexer(&multiplexer); + // create socket multiplexer. this must happen after daemonization + // on unix because threads evaporate across a fork(). + SocketMultiplexer multiplexer; + setSocketMultiplexer(&multiplexer); - // if configuration has no screens then add this system - // as the default - if (args().m_config->begin() == args().m_config->end()) { - args().m_config->addScreen(args().m_name); - } + // if configuration has no screens then add this system + // as the default + if (args().m_config->begin() == args().m_config->end()) { + args().m_config->addScreen(args().m_name); + } - // set the contact address, if provided, in the config. - // otherwise, if the config doesn't have an address, use - // the default. - if (m_synergyAddress->isValid()) { - args().m_config->setSynergyAddress(*m_synergyAddress); - } - else if (!args().m_config->getSynergyAddress().isValid()) { - args().m_config->setSynergyAddress(NetworkAddress(kDefaultPort)); - } + // set the contact address, if provided, in the config. + // otherwise, if the config doesn't have an address, use + // the default. + if (m_synergyAddress->isValid()) { + args().m_config->setSynergyAddress(*m_synergyAddress); + } + else if (!args().m_config->getSynergyAddress().isValid()) { + args().m_config->setSynergyAddress(NetworkAddress(kDefaultPort)); + } - // canonicalize the primary screen name - String primaryName = args().m_config->getCanonicalName(args().m_name); - if (primaryName.empty()) { - LOG((CLOG_CRIT "unknown screen name `%s'", args().m_name.c_str())); - return kExitFailed; - } + // canonicalize the primary screen name + String primaryName = args().m_config->getCanonicalName(args().m_name); + if (primaryName.empty()) { + LOG((CLOG_CRIT "unknown screen name `%s'", args().m_name.c_str())); + return kExitFailed; + } - // start server, etc - appUtil().startNode(); - - // init ipc client after node start, since create a new screen wipes out - // the event queue (the screen ctors call adoptBuffer). - if (argsBase().m_enableIpc) { - initIpcClient(); - } + // start server, etc + appUtil().startNode(); + + // init ipc client after node start, since create a new screen wipes out + // the event queue (the screen ctors call adoptBuffer). + if (argsBase().m_enableIpc) { + initIpcClient(); + } - // handle hangup signal by reloading the server's configuration - ARCH->setSignalHandler(Arch::kHANGUP, &reloadSignalHandler, NULL); - m_events->adoptHandler(m_events->forServerApp().reloadConfig(), - m_events->getSystemTarget(), - new TMethodEventJob(this, &ServerApp::reloadConfig)); + // handle hangup signal by reloading the server's configuration + ARCH->setSignalHandler(Arch::kHANGUP, &reloadSignalHandler, NULL); + m_events->adoptHandler(m_events->forServerApp().reloadConfig(), + m_events->getSystemTarget(), + new TMethodEventJob(this, &ServerApp::reloadConfig)); - // handle force reconnect event by disconnecting clients. they'll - // reconnect automatically. - m_events->adoptHandler(m_events->forServerApp().forceReconnect(), - m_events->getSystemTarget(), - new TMethodEventJob(this, &ServerApp::forceReconnect)); + // handle force reconnect event by disconnecting clients. they'll + // reconnect automatically. + m_events->adoptHandler(m_events->forServerApp().forceReconnect(), + m_events->getSystemTarget(), + new TMethodEventJob(this, &ServerApp::forceReconnect)); - // to work around the sticky meta keys problem, we'll give users - // the option to reset the state of synergys - m_events->adoptHandler(m_events->forServerApp().resetServer(), - m_events->getSystemTarget(), - new TMethodEventJob(this, &ServerApp::resetServer)); + // to work around the sticky meta keys problem, we'll give users + // the option to reset the state of synergys + m_events->adoptHandler(m_events->forServerApp().resetServer(), + m_events->getSystemTarget(), + new TMethodEventJob(this, &ServerApp::resetServer)); - // run event loop. if startServer() failed we're supposed to retry - // later. the timer installed by startServer() will take care of - // that. - DAEMON_RUNNING(true); - + // run event loop. if startServer() failed we're supposed to retry + // later. the timer installed by startServer() will take care of + // that. + DAEMON_RUNNING(true); + #if defined(MAC_OS_X_VERSION_10_7) - - Thread thread( - new TMethodJob( - this, &ServerApp::runEventsLoop, - NULL)); - - // wait until carbon loop is ready - OSXScreen* screen = dynamic_cast( - m_serverScreen->getPlatformScreen()); - screen->waitForCarbonLoop(); - - runCocoaApp(); + + Thread thread( + new TMethodJob( + this, &ServerApp::runEventsLoop, + NULL)); + + // wait until carbon loop is ready + OSXScreen* screen = dynamic_cast( + m_serverScreen->getPlatformScreen()); + screen->waitForCarbonLoop(); + + runCocoaApp(); #else - m_events->loop(); + m_events->loop(); #endif - - DAEMON_RUNNING(false); + + DAEMON_RUNNING(false); - // close down - LOG((CLOG_DEBUG1 "stopping server")); - m_events->removeHandler(m_events->forServerApp().forceReconnect(), - m_events->getSystemTarget()); - m_events->removeHandler(m_events->forServerApp().reloadConfig(), - m_events->getSystemTarget()); - cleanupServer(); - updateStatus(); - LOG((CLOG_NOTE "stopped server")); + // close down + LOG((CLOG_DEBUG1 "stopping server")); + m_events->removeHandler(m_events->forServerApp().forceReconnect(), + m_events->getSystemTarget()); + m_events->removeHandler(m_events->forServerApp().reloadConfig(), + m_events->getSystemTarget()); + cleanupServer(); + updateStatus(); + LOG((CLOG_NOTE "stopped server")); - if (argsBase().m_enableIpc) { - cleanupIpcClient(); - } + if (argsBase().m_enableIpc) { + cleanupIpcClient(); + } - return kExitSuccess; + return kExitSuccess; } void ServerApp::resetServer(const Event&, void*) { - LOG((CLOG_DEBUG1 "resetting server")); - stopServer(); - cleanupServer(); - startServer(); + LOG((CLOG_DEBUG1 "resetting server")); + stopServer(); + cleanupServer(); + startServer(); } int ServerApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup) { - // general initialization - m_synergyAddress = new NetworkAddress; - args().m_config = new Config(m_events); - args().m_pname = ARCH->getBasename(argv[0]); + // general initialization + m_synergyAddress = new NetworkAddress; + args().m_config = new Config(m_events); + args().m_pname = ARCH->getBasename(argv[0]); - // install caller's output filter - if (outputter != NULL) { - CLOG->insert(outputter); - } + // install caller's output filter + if (outputter != NULL) { + CLOG->insert(outputter); + } - // run - int result = startup(argc, argv); + // run + int result = startup(argc, argv); - if (m_taskBarReceiver) - { - // done with task bar receiver - delete m_taskBarReceiver; - } + if (m_taskBarReceiver) + { + // done with task bar receiver + delete m_taskBarReceiver; + } - delete args().m_config; - delete m_synergyAddress; - return result; + delete args().m_config; + delete m_synergyAddress; + return result; } int daemonMainLoopStatic(int argc, const char** argv) { - return ServerApp::instance().daemonMainLoop(argc, argv); + return ServerApp::instance().daemonMainLoop(argc, argv); } int ServerApp::standardStartup(int argc, char** argv) { - initApp(argc, argv); + initApp(argc, argv); - // daemonize if requested - if (args().m_daemon) { - return ARCH->daemonize(daemonName(), daemonMainLoopStatic); - } - else { - return mainLoop(); - } + // daemonize if requested + if (args().m_daemon) { + return ARCH->daemonize(daemonName(), daemonMainLoopStatic); + } + else { + return mainLoop(); + } } int ServerApp::foregroundStartup(int argc, char** argv) { - initApp(argc, argv); + initApp(argc, argv); - // never daemonize - return mainLoop(); + // never daemonize + return mainLoop(); } const char* ServerApp::daemonName() const { #if SYSAPI_WIN32 - return "Synergy Server"; + return "Synergy Server"; #elif SYSAPI_UNIX - return "synergys"; + return "synergys"; #endif } @@ -851,19 +851,19 @@ const char* ServerApp::daemonInfo() const { #if SYSAPI_WIN32 - return "Shares this computers mouse and keyboard with other computers."; + return "Shares this computers mouse and keyboard with other computers."; #elif SYSAPI_UNIX - return ""; + return ""; #endif } void ServerApp::startNode() { - // start the server. if this return false then we've failed and - // we shouldn't retry. - LOG((CLOG_DEBUG1 "starting server")); - if (!startServer()) { - m_bye(kExitFailed); - } + // start the server. if this return false then we've failed and + // we shouldn't retry. + LOG((CLOG_DEBUG1 "starting server")); + if (!startServer()) { + m_bye(kExitFailed); + } } diff --git a/src/lib/synergy/ServerApp.h b/src/lib/synergy/ServerApp.h index b1f14f80..59f9f65a 100644 --- a/src/lib/synergy/ServerApp.h +++ b/src/lib/synergy/ServerApp.h @@ -31,12 +31,12 @@ #include enum EServerState { - kUninitialized, - kInitializing, - kInitializingToStart, - kInitialized, - kStarting, - kStarted + kUninitialized, + kInitializing, + kInitializingToStart, + kInitialized, + kStarting, + kStarted }; class Server; @@ -49,72 +49,72 @@ class ServerArgs; class ServerApp : public App { public: - ServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver); - virtual ~ServerApp(); - - // Parse server specific command line arguments. - void parseArgs(int argc, const char* const* argv); + ServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver); + virtual ~ServerApp(); + + // Parse server specific command line arguments. + void parseArgs(int argc, const char* const* argv); - // Prints help specific to server. - void help(); + // Prints help specific to server. + void help(); - // Returns arguments that are common and for server. - ServerArgs& args() const { return (ServerArgs&)argsBase(); } + // Returns arguments that are common and for server. + ServerArgs& args() const { return (ServerArgs&)argsBase(); } - const char* daemonName() const; - const char* daemonInfo() const; + const char* daemonName() const; + const char* daemonInfo() const; - // TODO: Document these functions. - static void reloadSignalHandler(Arch::ESignal, void*); + // TODO: Document these functions. + static void reloadSignalHandler(Arch::ESignal, void*); - void reloadConfig(const Event&, void*); - void loadConfig(); - bool loadConfig(const String& pathname); - void forceReconnect(const Event&, void*); - void resetServer(const Event&, void*); - void handleClientConnected(const Event&, void* vlistener); - void handleClientsDisconnected(const Event&, void*); - void closeServer(Server* server); - void stopRetryTimer(); - void updateStatus(); - void updateStatus(const String& msg); - void closeClientListener(ClientListener* listen); - void stopServer(); - void closePrimaryClient(PrimaryClient* primaryClient); - void closeServerScreen(synergy::Screen* screen); - void cleanupServer(); - bool initServer(); - void retryHandler(const Event&, void*); - synergy::Screen* openServerScreen(); - synergy::Screen* createScreen(); - PrimaryClient* openPrimaryClient(const String& name, synergy::Screen* screen); - void handleScreenError(const Event&, void*); - void handleSuspend(const Event&, void*); - void handleResume(const Event&, void*); - ClientListener* openClientListener(const NetworkAddress& address); - Server* openServer(Config& config, PrimaryClient* primaryClient); - void handleNoClients(const Event&, void*); - bool startServer(); - int mainLoop(); - int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); - int standardStartup(int argc, char** argv); - int foregroundStartup(int argc, char** argv); - void startNode(); + void reloadConfig(const Event&, void*); + void loadConfig(); + bool loadConfig(const String& pathname); + void forceReconnect(const Event&, void*); + void resetServer(const Event&, void*); + void handleClientConnected(const Event&, void* vlistener); + void handleClientsDisconnected(const Event&, void*); + void closeServer(Server* server); + void stopRetryTimer(); + void updateStatus(); + void updateStatus(const String& msg); + void closeClientListener(ClientListener* listen); + void stopServer(); + void closePrimaryClient(PrimaryClient* primaryClient); + void closeServerScreen(synergy::Screen* screen); + void cleanupServer(); + bool initServer(); + void retryHandler(const Event&, void*); + synergy::Screen* openServerScreen(); + synergy::Screen* createScreen(); + PrimaryClient* openPrimaryClient(const String& name, synergy::Screen* screen); + void handleScreenError(const Event&, void*); + void handleSuspend(const Event&, void*); + void handleResume(const Event&, void*); + ClientListener* openClientListener(const NetworkAddress& address); + Server* openServer(Config& config, PrimaryClient* primaryClient); + void handleNoClients(const Event&, void*); + bool startServer(); + int mainLoop(); + int runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc startup); + int standardStartup(int argc, char** argv); + int foregroundStartup(int argc, char** argv); + void startNode(); - static ServerApp& instance() { return (ServerApp&)App::instance(); } + static ServerApp& instance() { return (ServerApp&)App::instance(); } - Server* getServerPtr() { return m_server; } - - Server* m_server; - EServerState m_serverState; - synergy::Screen* m_serverScreen; - PrimaryClient* m_primaryClient; - ClientListener* m_listener; - EventQueueTimer* m_timer; - NetworkAddress* m_synergyAddress; + Server* getServerPtr() { return m_server; } + + Server* m_server; + EServerState m_serverState; + synergy::Screen* m_serverScreen; + PrimaryClient* m_primaryClient; + ClientListener* m_listener; + EventQueueTimer* m_timer; + NetworkAddress* m_synergyAddress; private: - void handleScreenSwitched(const Event&, void* data); + void handleScreenSwitched(const Event&, void* data); }; // configuration file name diff --git a/src/lib/synergy/ServerArgs.cpp b/src/lib/synergy/ServerArgs.cpp index 52166f2a..9d8052c6 100644 --- a/src/lib/synergy/ServerArgs.cpp +++ b/src/lib/synergy/ServerArgs.cpp @@ -18,9 +18,9 @@ #include "synergy/ServerArgs.h" ServerArgs::ServerArgs() : - m_configFile(), - m_serial(), - m_config(NULL) + m_configFile(), + m_serial(), + m_config(NULL) { } diff --git a/src/lib/synergy/ServerArgs.h b/src/lib/synergy/ServerArgs.h index e139d110..4c91e568 100644 --- a/src/lib/synergy/ServerArgs.h +++ b/src/lib/synergy/ServerArgs.h @@ -25,10 +25,10 @@ class Config; class ServerArgs : public ArgsBase { public: - ServerArgs(); + ServerArgs(); public: - String m_configFile; - SerialKey m_serial; - Config* m_config; + String m_configFile; + SerialKey m_serial; + Config* m_config; }; diff --git a/src/lib/synergy/ServerTaskBarReceiver.cpp b/src/lib/synergy/ServerTaskBarReceiver.cpp index 230619af..8a53dc2a 100644 --- a/src/lib/synergy/ServerTaskBarReceiver.cpp +++ b/src/lib/synergy/ServerTaskBarReceiver.cpp @@ -29,110 +29,110 @@ // ServerTaskBarReceiver::ServerTaskBarReceiver(IEventQueue* events) : - m_state(kNotRunning), - m_events(events) + m_state(kNotRunning), + m_events(events) { - // do nothing + // do nothing } ServerTaskBarReceiver::~ServerTaskBarReceiver() { - // do nothing + // do nothing } void ServerTaskBarReceiver::updateStatus(Server* server, const String& errorMsg) { - { - // update our status - m_errorMessage = errorMsg; - if (server == NULL) { - if (m_errorMessage.empty()) { - m_state = kNotRunning; - } - else { - m_state = kNotWorking; - } - } - else { - m_clients.clear(); - server->getClients(m_clients); - if (m_clients.size() <= 1) { - m_state = kNotConnected; - } - else { - m_state = kConnected; - } - } + { + // update our status + m_errorMessage = errorMsg; + if (server == NULL) { + if (m_errorMessage.empty()) { + m_state = kNotRunning; + } + else { + m_state = kNotWorking; + } + } + else { + m_clients.clear(); + server->getClients(m_clients); + if (m_clients.size() <= 1) { + m_state = kNotConnected; + } + else { + m_state = kConnected; + } + } - // let subclasses have a go - onStatusChanged(server); - } + // let subclasses have a go + onStatusChanged(server); + } - // tell task bar - ARCH->updateReceiver(this); + // tell task bar + ARCH->updateReceiver(this); } ServerTaskBarReceiver::EState ServerTaskBarReceiver::getStatus() const { - return m_state; + return m_state; } const String& ServerTaskBarReceiver::getErrorMessage() const { - return m_errorMessage; + return m_errorMessage; } const ServerTaskBarReceiver::Clients& ServerTaskBarReceiver::getClients() const { - return m_clients; + return m_clients; } void ServerTaskBarReceiver::quit() { - m_events->addEvent(Event(Event::kQuit)); + m_events->addEvent(Event(Event::kQuit)); } void ServerTaskBarReceiver::onStatusChanged(Server*) { - // do nothing + // do nothing } void ServerTaskBarReceiver::lock() const { - // do nothing + // do nothing } void ServerTaskBarReceiver::unlock() const { - // do nothing + // do nothing } std::string ServerTaskBarReceiver::getToolTip() const { - switch (m_state) { - case kNotRunning: - return synergy::string::sprintf("%s: Not running", kAppVersion); + switch (m_state) { + case kNotRunning: + return synergy::string::sprintf("%s: Not running", kAppVersion); - case kNotWorking: - return synergy::string::sprintf("%s: %s", - kAppVersion, m_errorMessage.c_str()); - - case kNotConnected: - return synergy::string::sprintf("%s: Waiting for clients", kAppVersion); + case kNotWorking: + return synergy::string::sprintf("%s: %s", + kAppVersion, m_errorMessage.c_str()); + + case kNotConnected: + return synergy::string::sprintf("%s: Waiting for clients", kAppVersion); - case kConnected: - return synergy::string::sprintf("%s: Connected", kAppVersion); + case kConnected: + return synergy::string::sprintf("%s: Connected", kAppVersion); - default: - return ""; - } + default: + return ""; + } } diff --git a/src/lib/synergy/ServerTaskBarReceiver.h b/src/lib/synergy/ServerTaskBarReceiver.h index da82b56b..274fd54e 100644 --- a/src/lib/synergy/ServerTaskBarReceiver.h +++ b/src/lib/synergy/ServerTaskBarReceiver.h @@ -31,68 +31,68 @@ class IEventQueue; //! Implementation of IArchTaskBarReceiver for the synergy server class ServerTaskBarReceiver : public IArchTaskBarReceiver { public: - ServerTaskBarReceiver(IEventQueue* events); - virtual ~ServerTaskBarReceiver(); + ServerTaskBarReceiver(IEventQueue* events); + virtual ~ServerTaskBarReceiver(); - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Update status - /*! - Determine the status and query required information from the server. - */ - void updateStatus(Server*, const String& errorMsg); + //! Update status + /*! + Determine the status and query required information from the server. + */ + void updateStatus(Server*, const String& errorMsg); - void updateStatus(INode* n, const String& errorMsg) { updateStatus((Server*)n, errorMsg); } + void updateStatus(INode* n, const String& errorMsg) { updateStatus((Server*)n, errorMsg); } - //@} + //@} - // IArchTaskBarReceiver overrides - virtual void showStatus() = 0; - virtual void runMenu(int x, int y) = 0; - virtual void primaryAction() = 0; - virtual void lock() const; - virtual void unlock() const; - virtual const Icon getIcon() const = 0; - virtual std::string getToolTip() const; + // IArchTaskBarReceiver overrides + virtual void showStatus() = 0; + virtual void runMenu(int x, int y) = 0; + virtual void primaryAction() = 0; + virtual void lock() const; + virtual void unlock() const; + virtual const Icon getIcon() const = 0; + virtual std::string getToolTip() const; protected: - typedef std::vector Clients; - enum EState { - kNotRunning, - kNotWorking, - kNotConnected, - kConnected, - kMaxState - }; + typedef std::vector Clients; + enum EState { + kNotRunning, + kNotWorking, + kNotConnected, + kConnected, + kMaxState + }; - //! Get status - EState getStatus() const; + //! Get status + EState getStatus() const; - //! Get error message - const String& getErrorMessage() const; + //! Get error message + const String& getErrorMessage() const; - //! Get connected clients - const Clients& getClients() const; + //! Get connected clients + const Clients& getClients() const; - //! Quit app - /*! - Causes the application to quit gracefully - */ - void quit(); + //! Quit app + /*! + Causes the application to quit gracefully + */ + void quit(); - //! Status change notification - /*! - Called when status changes. The default implementation does - nothing. - */ - virtual void onStatusChanged(Server* server); + //! Status change notification + /*! + Called when status changes. The default implementation does + nothing. + */ + virtual void onStatusChanged(Server* server); private: - EState m_state; - String m_errorMessage; - Clients m_clients; - IEventQueue* m_events; + EState m_state; + String m_errorMessage; + Clients m_clients; + IEventQueue* m_events; }; IArchTaskBarReceiver* createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events); diff --git a/src/lib/synergy/StreamChunker.cpp b/src/lib/synergy/StreamChunker.cpp index 2ad64a03..da5ba414 100644 --- a/src/lib/synergy/StreamChunker.cpp +++ b/src/lib/synergy/StreamChunker.cpp @@ -43,124 +43,124 @@ Mutex* StreamChunker::s_interruptMutex = NULL; void StreamChunker::sendFile( - char* filename, - IEventQueue* events, - void* eventTarget) + char* filename, + IEventQueue* events, + void* eventTarget) { - s_isChunkingFile = true; - - std::fstream file(static_cast(filename), std::ios::in | std::ios::binary); + s_isChunkingFile = true; + + std::fstream file(static_cast(filename), std::ios::in | std::ios::binary); - if (!file.is_open()) { - throw runtime_error("failed to open file"); - } + if (!file.is_open()) { + throw runtime_error("failed to open file"); + } - // check file size - file.seekg (0, std::ios::end); - size_t size = (size_t)file.tellg(); + // check file size + file.seekg (0, std::ios::end); + size_t size = (size_t)file.tellg(); - // send first message (file size) - String fileSize = synergy::string::sizeTypeToString(size); - FileChunk* sizeMessage = FileChunk::start(fileSize); + // send first message (file size) + String fileSize = synergy::string::sizeTypeToString(size); + FileChunk* sizeMessage = FileChunk::start(fileSize); - events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, sizeMessage)); + events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, sizeMessage)); - // send chunk messages with a fixed chunk size - size_t sentLength = 0; - size_t chunkSize = g_chunkSize; - file.seekg (0, std::ios::beg); + // send chunk messages with a fixed chunk size + size_t sentLength = 0; + size_t chunkSize = g_chunkSize; + file.seekg (0, std::ios::beg); - while (true) { - if (s_interruptFile) { - s_interruptFile = false; - LOG((CLOG_DEBUG "file transmission interrupted")); - break; - } - - events->addEvent(Event(events->forFile().keepAlive(), eventTarget)); - - // make sure we don't read too much from the mock data. - if (sentLength + chunkSize > size) { - chunkSize = size - sentLength; - } + while (true) { + if (s_interruptFile) { + s_interruptFile = false; + LOG((CLOG_DEBUG "file transmission interrupted")); + break; + } + + events->addEvent(Event(events->forFile().keepAlive(), eventTarget)); + + // make sure we don't read too much from the mock data. + if (sentLength + chunkSize > size) { + chunkSize = size - sentLength; + } - char* chunkData = new char[chunkSize]; - file.read(chunkData, chunkSize); - UInt8* data = reinterpret_cast(chunkData); - FileChunk* fileChunk = FileChunk::data(data, chunkSize); - delete[] chunkData; + char* chunkData = new char[chunkSize]; + file.read(chunkData, chunkSize); + UInt8* data = reinterpret_cast(chunkData); + FileChunk* fileChunk = FileChunk::data(data, chunkSize); + delete[] chunkData; - events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, fileChunk)); + events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, fileChunk)); - sentLength += chunkSize; - file.seekg (sentLength, std::ios::beg); + sentLength += chunkSize; + file.seekg (sentLength, std::ios::beg); - if (sentLength == size) { - break; - } - } + if (sentLength == size) { + break; + } + } - // send last message - FileChunk* end = FileChunk::end(); + // send last message + FileChunk* end = FileChunk::end(); - events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, end)); + events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, end)); - file.close(); - - s_isChunkingFile = false; + file.close(); + + s_isChunkingFile = false; } void StreamChunker::sendClipboard( - String& data, - size_t size, - ClipboardID id, - UInt32 sequence, - IEventQueue* events, - void* eventTarget) + String& data, + size_t size, + ClipboardID id, + UInt32 sequence, + IEventQueue* events, + void* eventTarget) { - // send first message (data size) - String dataSize = synergy::string::sizeTypeToString(size); - ClipboardChunk* sizeMessage = ClipboardChunk::start(id, sequence, dataSize); - - events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, sizeMessage)); + // send first message (data size) + String dataSize = synergy::string::sizeTypeToString(size); + ClipboardChunk* sizeMessage = ClipboardChunk::start(id, sequence, dataSize); + + events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, sizeMessage)); - // send clipboard chunk with a fixed size - size_t sentLength = 0; - size_t chunkSize = g_chunkSize; - - while (true) { - events->addEvent(Event(events->forFile().keepAlive(), eventTarget)); - - // make sure we don't read too much from the mock data. - if (sentLength + chunkSize > size) { - chunkSize = size - sentLength; - } + // send clipboard chunk with a fixed size + size_t sentLength = 0; + size_t chunkSize = g_chunkSize; + + while (true) { + events->addEvent(Event(events->forFile().keepAlive(), eventTarget)); + + // make sure we don't read too much from the mock data. + if (sentLength + chunkSize > size) { + chunkSize = size - sentLength; + } - String chunk(data.substr(sentLength, chunkSize).c_str(), chunkSize); - ClipboardChunk* dataChunk = ClipboardChunk::data(id, sequence, chunk); - - events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, dataChunk)); + String chunk(data.substr(sentLength, chunkSize).c_str(), chunkSize); + ClipboardChunk* dataChunk = ClipboardChunk::data(id, sequence, chunk); + + events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, dataChunk)); - sentLength += chunkSize; - if (sentLength == size) { - break; - } - } + sentLength += chunkSize; + if (sentLength == size) { + break; + } + } - // send last message - ClipboardChunk* end = ClipboardChunk::end(id, sequence); + // send last message + ClipboardChunk* end = ClipboardChunk::end(id, sequence); - events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, end)); - - LOG((CLOG_DEBUG "sent clipboard size=%d", sentLength)); + events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, end)); + + LOG((CLOG_DEBUG "sent clipboard size=%d", sentLength)); } void StreamChunker::interruptFile() { - if (s_isChunkingFile) { - s_interruptFile = true; - LOG((CLOG_INFO "previous dragged file has become invalid")); - } + if (s_isChunkingFile) { + s_interruptFile = true; + LOG((CLOG_INFO "previous dragged file has become invalid")); + } } diff --git a/src/lib/synergy/StreamChunker.h b/src/lib/synergy/StreamChunker.h index e834bf2b..a67d3777 100644 --- a/src/lib/synergy/StreamChunker.h +++ b/src/lib/synergy/StreamChunker.h @@ -25,21 +25,21 @@ class Mutex; class StreamChunker { public: - static void sendFile( - char* filename, - IEventQueue* events, - void* eventTarget); - static void sendClipboard( - String& data, - size_t size, - ClipboardID id, - UInt32 sequence, - IEventQueue* events, - void* eventTarget); - static void interruptFile(); - + static void sendFile( + char* filename, + IEventQueue* events, + void* eventTarget); + static void sendClipboard( + String& data, + size_t size, + ClipboardID id, + UInt32 sequence, + IEventQueue* events, + void* eventTarget); + static void interruptFile(); + private: - static bool s_isChunkingFile; - static bool s_interruptFile; - static Mutex* s_interruptMutex; + static bool s_isChunkingFile; + static bool s_interruptFile; + static Mutex* s_interruptMutex; }; diff --git a/src/lib/synergy/ToolApp.cpp b/src/lib/synergy/ToolApp.cpp index 3dcfd05d..8a9e1faf 100644 --- a/src/lib/synergy/ToolApp.cpp +++ b/src/lib/synergy/ToolApp.cpp @@ -32,79 +32,79 @@ #define JSON_URL "https://symless.com/account/json/" enum { - kErrorOk, - kErrorArgs, - kErrorException, - kErrorUnknown + kErrorOk, + kErrorArgs, + kErrorException, + kErrorUnknown }; UInt32 ToolApp::run(int argc, char** argv) { - if (argc <= 1) { - std::cerr << "no args" << std::endl; - return kErrorArgs; - } + if (argc <= 1) { + std::cerr << "no args" << std::endl; + return kErrorArgs; + } - try { - ArgParser argParser(this); - bool result = argParser.parseToolArgs(m_args, argc, argv); + try { + ArgParser argParser(this); + bool result = argParser.parseToolArgs(m_args, argc, argv); - if (!result) { - m_bye(kExitArgs); - } + if (!result) { + m_bye(kExitArgs); + } - if (m_args.m_printActiveDesktopName) { + if (m_args.m_printActiveDesktopName) { #if SYSAPI_WIN32 - MSWindowsSession session; - String name = session.getActiveDesktopName(); - if (name.empty()) { - LOG((CLOG_CRIT "failed to get active desktop name")); - return kExitFailed; - } - else { - String output = synergy::string::sprintf("activeDesktop:%s", name.c_str()); - LOG((CLOG_INFO "%s", output.c_str())); - } + MSWindowsSession session; + String name = session.getActiveDesktopName(); + if (name.empty()) { + LOG((CLOG_CRIT "failed to get active desktop name")); + return kExitFailed; + } + else { + String output = synergy::string::sprintf("activeDesktop:%s", name.c_str()); + LOG((CLOG_INFO "%s", output.c_str())); + } #endif - } - else if (m_args.m_loginAuthenticate) { - loginAuth(); - } - else if (m_args.m_getInstalledDir) { - std::cout << ARCH->getInstalledDirectory() << std::endl; - } - else if (m_args.m_getProfileDir) { - std::cout << ARCH->getProfileDirectory() << std::endl; - } - else if (m_args.m_getArch) { - std::cout << ARCH->getPlatformName() << std::endl; - } - else if (m_args.m_notifyUpdate) { - notifyUpdate(); - } - else if (m_args.m_notifyActivation) { - notifyActivation(); - } - else { - throw XSynergy("Nothing to do"); - } - } - catch (std::exception& e) { - LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); - return kExitFailed; - } - catch (...) { - LOG((CLOG_CRIT "An unknown error occurred.\n")); - return kExitFailed; - } + } + else if (m_args.m_loginAuthenticate) { + loginAuth(); + } + else if (m_args.m_getInstalledDir) { + std::cout << ARCH->getInstalledDirectory() << std::endl; + } + else if (m_args.m_getProfileDir) { + std::cout << ARCH->getProfileDirectory() << std::endl; + } + else if (m_args.m_getArch) { + std::cout << ARCH->getPlatformName() << std::endl; + } + else if (m_args.m_notifyUpdate) { + notifyUpdate(); + } + else if (m_args.m_notifyActivation) { + notifyActivation(); + } + else { + throw XSynergy("Nothing to do"); + } + } + catch (std::exception& e) { + LOG((CLOG_CRIT "An error occurred: %s\n", e.what())); + return kExitFailed; + } + catch (...) { + LOG((CLOG_CRIT "An unknown error occurred.\n")); + return kExitFailed; + } #if WINAPI_XWINDOWS - // HACK: avoid sigsegv on linux - m_bye(kErrorOk); + // HACK: avoid sigsegv on linux + m_bye(kErrorOk); #endif - return kErrorOk; + return kErrorOk; } void @@ -115,36 +115,36 @@ ToolApp::help() void ToolApp::loginAuth() { - String credentials; - std::cin >> credentials; + String credentials; + std::cin >> credentials; - std::vector parts = synergy::string::splitString(credentials, ':'); - size_t count = parts.size(); + std::vector parts = synergy::string::splitString(credentials, ':'); + size_t count = parts.size(); - if (count == 2 ) { - String email = parts[0]; - String password = parts[1]; + if (count == 2 ) { + String email = parts[0]; + String password = parts[1]; - std::stringstream ss; - ss << JSON_URL << "auth/"; - ss << "?email=" << ARCH->internet().urlEncode(email); - ss << "&password=" << password; + std::stringstream ss; + ss << JSON_URL << "auth/"; + ss << "?email=" << ARCH->internet().urlEncode(email); + ss << "&password=" << password; - std::cout << ARCH->internet().get(ss.str()) << std::endl; - } - else { - throw XSynergy("Invalid credentials."); - } + std::cout << ARCH->internet().get(ss.str()) << std::endl; + } + else { + throw XSynergy("Invalid credentials."); + } } void ToolApp::notifyUpdate() { - String data; - std::cin >> data; + String data; + std::cin >> data; - std::vector parts = synergy::string::splitString(data, ':'); - size_t count = parts.size(); + std::vector parts = synergy::string::splitString(data, ':'); + size_t count = parts.size(); if (count == 3) { std::stringstream ss; @@ -153,54 +153,54 @@ ToolApp::notifyUpdate() ss << "&to=" << parts[1]; ss << "&serial=" << parts[2]; - std::cout << ARCH->internet().get(ss.str()) << std::endl; - } - else { - throw XSynergy("Invalid update data."); - } + std::cout << ARCH->internet().get(ss.str()) << std::endl; + } + else { + throw XSynergy("Invalid update data."); + } } void ToolApp::notifyActivation() { - String info; - std::cin >> info; + String info; + std::cin >> info; - std::vector parts = synergy::string::splitString(info, ':'); - size_t count = parts.size(); + std::vector parts = synergy::string::splitString(info, ':'); + size_t count = parts.size(); - if (count == 3 || count == 4) { - String action = parts[0]; - String identity = parts[1]; - String macHash = parts[2]; - String os; + if (count == 3 || count == 4) { + String action = parts[0]; + String identity = parts[1]; + String macHash = parts[2]; + String os; - if (count == 4) { - os = parts[3]; - } - else { - os = ARCH->getOSName(); - } + if (count == 4) { + os = parts[3]; + } + else { + os = ARCH->getOSName(); + } - std::stringstream ss; - ss << JSON_URL << "notify/"; - ss << "?action=" << action; - ss << "&identity=" << ARCH->internet().urlEncode(identity); - ss << "&mac=" << ARCH->internet().urlEncode(macHash); - ss << "&os=" << ARCH->internet().urlEncode(ARCH->getOSName()); - ss << "&arch=" << ARCH->internet().urlEncode(ARCH->getPlatformName()); + std::stringstream ss; + ss << JSON_URL << "notify/"; + ss << "?action=" << action; + ss << "&identity=" << ARCH->internet().urlEncode(identity); + ss << "&mac=" << ARCH->internet().urlEncode(macHash); + ss << "&os=" << ARCH->internet().urlEncode(ARCH->getOSName()); + ss << "&arch=" << ARCH->internet().urlEncode(ARCH->getPlatformName()); - try { - std::cout << ARCH->internet().get(ss.str()) << std::endl; - } - catch (std::exception& e) { - LOG((CLOG_NOTE "An error occurred during notification: %s\n", e.what())); - } - catch (...) { - LOG((CLOG_NOTE "An unknown error occurred during notification.\n")); - } - } - else { - LOG((CLOG_NOTE "notification failed")); - } + try { + std::cout << ARCH->internet().get(ss.str()) << std::endl; + } + catch (std::exception& e) { + LOG((CLOG_NOTE "An error occurred during notification: %s\n", e.what())); + } + catch (...) { + LOG((CLOG_NOTE "An unknown error occurred during notification.\n")); + } + } + else { + LOG((CLOG_NOTE "notification failed")); + } } diff --git a/src/lib/synergy/ToolApp.h b/src/lib/synergy/ToolApp.h index 771b298f..d0eb6cb4 100644 --- a/src/lib/synergy/ToolApp.h +++ b/src/lib/synergy/ToolApp.h @@ -24,14 +24,14 @@ class ToolApp : public MinimalApp { public: - UInt32 run(int argc, char** argv); - void help(); + UInt32 run(int argc, char** argv); + void help(); private: - void loginAuth(); - void notifyActivation(); - void notifyUpdate(); + void loginAuth(); + void notifyActivation(); + void notifyUpdate(); private: - ToolArgs m_args; + ToolArgs m_args; }; diff --git a/src/lib/synergy/ToolArgs.cpp b/src/lib/synergy/ToolArgs.cpp index 2685c1df..07c3aa22 100644 --- a/src/lib/synergy/ToolArgs.cpp +++ b/src/lib/synergy/ToolArgs.cpp @@ -18,12 +18,12 @@ #include "synergy/ToolArgs.h" ToolArgs::ToolArgs() : - m_printActiveDesktopName(false), - m_loginAuthenticate(false), - m_getInstalledDir(false), - m_getProfileDir(false), - m_getArch(false), - m_notifyActivation(false), - m_notifyUpdate(false) + m_printActiveDesktopName(false), + m_loginAuthenticate(false), + m_getInstalledDir(false), + m_getProfileDir(false), + m_getArch(false), + m_notifyActivation(false), + m_notifyUpdate(false) { } diff --git a/src/lib/synergy/ToolArgs.h b/src/lib/synergy/ToolArgs.h index 4619efc1..43928dd4 100644 --- a/src/lib/synergy/ToolArgs.h +++ b/src/lib/synergy/ToolArgs.h @@ -21,14 +21,14 @@ class ToolArgs { public: - ToolArgs(); + ToolArgs(); public: - bool m_printActiveDesktopName; - bool m_loginAuthenticate; - bool m_getInstalledDir; - bool m_getProfileDir; - bool m_getArch; - bool m_notifyActivation; - bool m_notifyUpdate; + bool m_printActiveDesktopName; + bool m_loginAuthenticate; + bool m_getInstalledDir; + bool m_getProfileDir; + bool m_getArch; + bool m_notifyActivation; + bool m_notifyUpdate; }; diff --git a/src/lib/synergy/XScreen.cpp b/src/lib/synergy/XScreen.cpp index 512abbb2..5e34ef63 100644 --- a/src/lib/synergy/XScreen.cpp +++ b/src/lib/synergy/XScreen.cpp @@ -25,7 +25,7 @@ String XScreenOpenFailure::getWhat() const throw() { - return format("XScreenOpenFailure", "unable to open screen"); + return format("XScreenOpenFailure", "unable to open screen"); } @@ -36,7 +36,7 @@ XScreenOpenFailure::getWhat() const throw() String XScreenXInputFailure::getWhat() const throw() { - return ""; + return ""; } @@ -45,24 +45,24 @@ XScreenXInputFailure::getWhat() const throw() // XScreenUnavailable::XScreenUnavailable(double timeUntilRetry) : - m_timeUntilRetry(timeUntilRetry) + m_timeUntilRetry(timeUntilRetry) { - // do nothing + // do nothing } XScreenUnavailable::~XScreenUnavailable() _NOEXCEPT { - // do nothing + // do nothing } double XScreenUnavailable::getRetryTime() const { - return m_timeUntilRetry; + return m_timeUntilRetry; } String XScreenUnavailable::getWhat() const throw() { - return format("XScreenUnavailable", "unable to open screen"); + return format("XScreenUnavailable", "unable to open screen"); } diff --git a/src/lib/synergy/XScreen.h b/src/lib/synergy/XScreen.h index cb72225b..6b508316 100644 --- a/src/lib/synergy/XScreen.h +++ b/src/lib/synergy/XScreen.h @@ -42,27 +42,27 @@ may be successful. */ class XScreenUnavailable : public XScreenOpenFailure { public: - /*! - \c timeUntilRetry is the suggested time the caller should wait until - trying to open the screen again. - */ - XScreenUnavailable(double timeUntilRetry); - virtual ~XScreenUnavailable() _NOEXCEPT; + /*! + \c timeUntilRetry is the suggested time the caller should wait until + trying to open the screen again. + */ + XScreenUnavailable(double timeUntilRetry); + virtual ~XScreenUnavailable() _NOEXCEPT; - //! @name manipulators - //@{ + //! @name manipulators + //@{ - //! Get retry time - /*! - Returns the suggested time to wait until retrying to open the screen. - */ - double getRetryTime() const; + //! Get retry time + /*! + Returns the suggested time to wait until retrying to open the screen. + */ + double getRetryTime() const; - //@} + //@} protected: - virtual String getWhat() const throw(); + virtual String getWhat() const throw(); private: - double m_timeUntilRetry; + double m_timeUntilRetry; }; diff --git a/src/lib/synergy/XSynergy.cpp b/src/lib/synergy/XSynergy.cpp index 40514edd..77d04477 100644 --- a/src/lib/synergy/XSynergy.cpp +++ b/src/lib/synergy/XSynergy.cpp @@ -26,7 +26,7 @@ String XBadClient::getWhat() const throw() { - return "XBadClient"; + return "XBadClient"; } @@ -35,30 +35,30 @@ XBadClient::getWhat() const throw() // XIncompatibleClient::XIncompatibleClient(int major, int minor) : - m_major(major), - m_minor(minor) + m_major(major), + m_minor(minor) { - // do nothing + // do nothing } int XIncompatibleClient::getMajor() const throw() { - return m_major; + return m_major; } int XIncompatibleClient::getMinor() const throw() { - return m_minor; + return m_minor; } String XIncompatibleClient::getWhat() const throw() { - return format("XIncompatibleClient", "incompatible client %{1}.%{2}", - synergy::string::sprintf("%d", m_major).c_str(), - synergy::string::sprintf("%d", m_minor).c_str()); + return format("XIncompatibleClient", "incompatible client %{1}.%{2}", + synergy::string::sprintf("%d", m_major).c_str(), + synergy::string::sprintf("%d", m_minor).c_str()); } @@ -67,21 +67,21 @@ XIncompatibleClient::getWhat() const throw() // XDuplicateClient::XDuplicateClient(const String& name) : - m_name(name) + m_name(name) { - // do nothing + // do nothing } const String& XDuplicateClient::getName() const throw() { - return m_name; + return m_name; } String XDuplicateClient::getWhat() const throw() { - return format("XDuplicateClient", "duplicate client %{1}", m_name.c_str()); + return format("XDuplicateClient", "duplicate client %{1}", m_name.c_str()); } @@ -90,21 +90,21 @@ XDuplicateClient::getWhat() const throw() // XUnknownClient::XUnknownClient(const String& name) : - m_name(name) + m_name(name) { - // do nothing + // do nothing } const String& XUnknownClient::getName() const throw() { - return m_name; + return m_name; } String XUnknownClient::getWhat() const throw() { - return format("XUnknownClient", "unknown client %{1}", m_name.c_str()); + return format("XUnknownClient", "unknown client %{1}", m_name.c_str()); } @@ -113,21 +113,21 @@ XUnknownClient::getWhat() const throw() // XExitApp::XExitApp(int code) : - m_code(code) + m_code(code) { - // do nothing + // do nothing } int XExitApp::getCode() const throw() { - return m_code; + return m_code; } String XExitApp::getWhat() const throw() { - return format( - "XExitApp", "exiting with code %{1}", - synergy::string::sprintf("%d", m_code).c_str()); + return format( + "XExitApp", "exiting with code %{1}", + synergy::string::sprintf("%d", m_code).c_str()); } diff --git a/src/lib/synergy/XSynergy.h b/src/lib/synergy/XSynergy.h index b2575c81..20a97424 100644 --- a/src/lib/synergy/XSynergy.h +++ b/src/lib/synergy/XSynergy.h @@ -41,24 +41,24 @@ Thrown when a client attempting to connect has an incompatible version. */ class XIncompatibleClient : public XSynergy { public: - XIncompatibleClient(int major, int minor); + XIncompatibleClient(int major, int minor); - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get client's major version number - int getMajor() const throw(); - //! Get client's minor version number - int getMinor() const throw(); + //! Get client's major version number + int getMajor() const throw(); + //! Get client's minor version number + int getMinor() const throw(); - //@} + //@} protected: - virtual String getWhat() const throw(); + virtual String getWhat() const throw(); private: - int m_major; - int m_minor; + int m_major; + int m_minor; }; //! Client already connected exception @@ -68,23 +68,23 @@ a client that is already connected. */ class XDuplicateClient : public XSynergy { public: - XDuplicateClient(const String& name); - virtual ~XDuplicateClient() _NOEXCEPT { } + XDuplicateClient(const String& name); + virtual ~XDuplicateClient() _NOEXCEPT { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get client's name - virtual const String& - getName() const throw(); + //! Get client's name + virtual const String& + getName() const throw(); - //@} + //@} protected: - virtual String getWhat() const throw(); + virtual String getWhat() const throw(); private: - String m_name; + String m_name; }; //! Client not in map exception @@ -94,23 +94,23 @@ unknown to the server. */ class XUnknownClient : public XSynergy { public: - XUnknownClient(const String& name); - virtual ~XUnknownClient() _NOEXCEPT { } + XUnknownClient(const String& name); + virtual ~XUnknownClient() _NOEXCEPT { } - //! @name accessors - //@{ + //! @name accessors + //@{ - //! Get the client's name - virtual const String& - getName() const throw(); + //! Get the client's name + virtual const String& + getName() const throw(); - //@} + //@} protected: - virtual String getWhat() const throw(); + virtual String getWhat() const throw(); private: - String m_name; + String m_name; }; //! Generic exit eception @@ -121,15 +121,15 @@ exit(int). */ class XExitApp : public XSynergy { public: - XExitApp(int code); - virtual ~XExitApp() _NOEXCEPT { } + XExitApp(int code); + virtual ~XExitApp() _NOEXCEPT { } - //! Get the exit code - int getCode() const throw(); + //! Get the exit code + int getCode() const throw(); protected: - virtual String getWhat() const throw(); - + virtual String getWhat() const throw(); + private: - int m_code; + int m_code; }; diff --git a/src/lib/synergy/clipboard_types.h b/src/lib/synergy/clipboard_types.h index a6cbef99..d8275d1b 100644 --- a/src/lib/synergy/clipboard_types.h +++ b/src/lib/synergy/clipboard_types.h @@ -24,7 +24,7 @@ /*! Type to hold a clipboard identifier. */ -typedef UInt8 ClipboardID; +typedef UInt8 ClipboardID; //! @name Clipboard identifiers //@{ @@ -34,9 +34,9 @@ typedef UInt8 ClipboardID; // platforms that can treat the selection as a clipboard (e.g. X // windows). clipboard identifiers must be sequential starting // at zero. -static const ClipboardID kClipboardClipboard = 0; -static const ClipboardID kClipboardSelection = 1; +static const ClipboardID kClipboardClipboard = 0; +static const ClipboardID kClipboardSelection = 1; // the number of clipboards (i.e. one greater than the last clipboard id) -static const ClipboardID kClipboardEnd = 2; +static const ClipboardID kClipboardEnd = 2; //@} diff --git a/src/lib/synergy/key_types.cpp b/src/lib/synergy/key_types.cpp index 130b163f..e82feaae 100644 --- a/src/lib/synergy/key_types.cpp +++ b/src/lib/synergy/key_types.cpp @@ -19,190 +19,190 @@ #include "synergy/key_types.h" const KeyNameMapEntry kKeyNameMap[] = { - { "AltGr", kKeyAltGr }, - { "Alt_L", kKeyAlt_L }, - { "Alt_R", kKeyAlt_R }, - { "AppMail", kKeyAppMail }, - { "AppMedia", kKeyAppMedia }, - { "AppUser1", kKeyAppUser1 }, - { "AppUser2", kKeyAppUser2 }, - { "AudioDown", kKeyAudioDown }, - { "AudioMute", kKeyAudioMute }, - { "AudioNext", kKeyAudioNext }, - { "AudioPlay", kKeyAudioPlay }, - { "AudioPrev", kKeyAudioPrev }, - { "AudioStop", kKeyAudioStop }, - { "AudioUp", kKeyAudioUp }, - { "BackSpace", kKeyBackSpace }, - { "Begin", kKeyBegin }, - { "Break", kKeyBreak }, - { "Cancel", kKeyCancel }, - { "CapsLock", kKeyCapsLock }, - { "Clear", kKeyClear }, - { "Control_L", kKeyControl_L }, - { "Control_R", kKeyControl_R }, - { "Delete", kKeyDelete }, - { "Down", kKeyDown }, - { "Eject", kKeyEject }, - { "End", kKeyEnd }, - { "Escape", kKeyEscape }, - { "Execute", kKeyExecute }, - { "F1", kKeyF1 }, - { "F2", kKeyF2 }, - { "F3", kKeyF3 }, - { "F4", kKeyF4 }, - { "F5", kKeyF5 }, - { "F6", kKeyF6 }, - { "F7", kKeyF7 }, - { "F8", kKeyF8 }, - { "F9", kKeyF9 }, - { "F10", kKeyF10 }, - { "F11", kKeyF11 }, - { "F12", kKeyF12 }, - { "F13", kKeyF13 }, - { "F14", kKeyF14 }, - { "F15", kKeyF15 }, - { "F16", kKeyF16 }, - { "F17", kKeyF17 }, - { "F18", kKeyF18 }, - { "F19", kKeyF19 }, - { "F20", kKeyF20 }, - { "F21", kKeyF21 }, - { "F22", kKeyF22 }, - { "F23", kKeyF23 }, - { "F24", kKeyF24 }, - { "F25", kKeyF25 }, - { "F26", kKeyF26 }, - { "F27", kKeyF27 }, - { "F28", kKeyF28 }, - { "F29", kKeyF29 }, - { "F30", kKeyF30 }, - { "F31", kKeyF31 }, - { "F32", kKeyF32 }, - { "F33", kKeyF33 }, - { "F34", kKeyF34 }, - { "F35", kKeyF35 }, - { "Find", kKeyFind }, - { "Help", kKeyHelp }, - { "Henkan", kKeyHenkan }, - { "Home", kKeyHome }, - { "Hyper_L", kKeyHyper_L }, - { "Hyper_R", kKeyHyper_R }, - { "Insert", kKeyInsert }, - { "KP_0", kKeyKP_0 }, - { "KP_1", kKeyKP_1 }, - { "KP_2", kKeyKP_2 }, - { "KP_3", kKeyKP_3 }, - { "KP_4", kKeyKP_4 }, - { "KP_5", kKeyKP_5 }, - { "KP_6", kKeyKP_6 }, - { "KP_7", kKeyKP_7 }, - { "KP_8", kKeyKP_8 }, - { "KP_9", kKeyKP_9 }, - { "KP_Add", kKeyKP_Add }, - { "KP_Begin", kKeyKP_Begin }, - { "KP_Decimal", kKeyKP_Decimal }, - { "KP_Delete", kKeyKP_Delete }, - { "KP_Divide", kKeyKP_Divide }, - { "KP_Down", kKeyKP_Down }, - { "KP_End", kKeyKP_End }, - { "KP_Enter", kKeyKP_Enter }, - { "KP_Equal", kKeyKP_Equal }, - { "KP_F1", kKeyKP_F1 }, - { "KP_F2", kKeyKP_F2 }, - { "KP_F3", kKeyKP_F3 }, - { "KP_F4", kKeyKP_F4 }, - { "KP_Home", kKeyKP_Home }, - { "KP_Insert", kKeyKP_Insert }, - { "KP_Left", kKeyKP_Left }, - { "KP_Multiply", kKeyKP_Multiply }, - { "KP_PageDown", kKeyKP_PageDown }, - { "KP_PageUp", kKeyKP_PageUp }, - { "KP_Right", kKeyKP_Right }, - { "KP_Separator", kKeyKP_Separator }, - { "KP_Space", kKeyKP_Space }, - { "KP_Subtract", kKeyKP_Subtract }, - { "KP_Tab", kKeyKP_Tab }, - { "KP_Up", kKeyKP_Up }, - { "Left", kKeyLeft }, - { "LeftTab", kKeyLeftTab }, - { "Linefeed", kKeyLinefeed }, - { "Menu", kKeyMenu }, - { "Meta_L", kKeyMeta_L }, - { "Meta_R", kKeyMeta_R }, - { "NumLock", kKeyNumLock }, - { "PageDown", kKeyPageDown }, - { "PageUp", kKeyPageUp }, - { "Pause", kKeyPause }, - { "Print", kKeyPrint }, - { "Redo", kKeyRedo }, - { "Return", kKeyReturn }, - { "Right", kKeyRight }, - { "ScrollLock", kKeyScrollLock }, - { "Select", kKeySelect }, - { "ShiftLock", kKeyShiftLock }, - { "Shift_L", kKeyShift_L }, - { "Shift_R", kKeyShift_R }, - { "Sleep", kKeySleep }, - { "Super_L", kKeySuper_L }, - { "Super_R", kKeySuper_R }, - { "SysReq", kKeySysReq }, - { "Tab", kKeyTab }, - { "Undo", kKeyUndo }, - { "Up", kKeyUp }, - { "WWWBack", kKeyWWWBack }, - { "WWWFavorites", kKeyWWWFavorites }, - { "WWWForward", kKeyWWWForward }, - { "WWWHome", kKeyWWWHome }, - { "WWWRefresh", kKeyWWWRefresh }, - { "WWWSearch", kKeyWWWSearch }, - { "WWWStop", kKeyWWWStop }, - { "Zenkaku", kKeyZenkaku }, - { "Space", 0x0020 }, - { "Exclaim", 0x0021 }, - { "DoubleQuote", 0x0022 }, - { "Number", 0x0023 }, - { "Dollar", 0x0024 }, - { "Percent", 0x0025 }, - { "Ampersand", 0x0026 }, - { "Apostrophe", 0x0027 }, - { "ParenthesisL", 0x0028 }, - { "ParenthesisR", 0x0029 }, - { "Asterisk", 0x002a }, - { "Plus", 0x002b }, - { "Comma", 0x002c }, - { "Minus", 0x002d }, - { "Period", 0x002e }, - { "Slash", 0x002f }, - { "Colon", 0x003a }, - { "Semicolon", 0x003b }, - { "Less", 0x003c }, - { "Equal", 0x003d }, - { "Greater", 0x003e }, - { "Question", 0x003f }, - { "At", 0x0040 }, - { "BracketL", 0x005b }, - { "Backslash", 0x005c }, - { "BracketR", 0x005d }, - { "Circumflex", 0x005e }, - { "Underscore", 0x005f }, - { "Grave", 0x0060 }, - { "BraceL", 0x007b }, - { "Bar", 0x007c }, - { "BraceR", 0x007d }, - { "Tilde", 0x007e }, - { NULL, 0 }, + { "AltGr", kKeyAltGr }, + { "Alt_L", kKeyAlt_L }, + { "Alt_R", kKeyAlt_R }, + { "AppMail", kKeyAppMail }, + { "AppMedia", kKeyAppMedia }, + { "AppUser1", kKeyAppUser1 }, + { "AppUser2", kKeyAppUser2 }, + { "AudioDown", kKeyAudioDown }, + { "AudioMute", kKeyAudioMute }, + { "AudioNext", kKeyAudioNext }, + { "AudioPlay", kKeyAudioPlay }, + { "AudioPrev", kKeyAudioPrev }, + { "AudioStop", kKeyAudioStop }, + { "AudioUp", kKeyAudioUp }, + { "BackSpace", kKeyBackSpace }, + { "Begin", kKeyBegin }, + { "Break", kKeyBreak }, + { "Cancel", kKeyCancel }, + { "CapsLock", kKeyCapsLock }, + { "Clear", kKeyClear }, + { "Control_L", kKeyControl_L }, + { "Control_R", kKeyControl_R }, + { "Delete", kKeyDelete }, + { "Down", kKeyDown }, + { "Eject", kKeyEject }, + { "End", kKeyEnd }, + { "Escape", kKeyEscape }, + { "Execute", kKeyExecute }, + { "F1", kKeyF1 }, + { "F2", kKeyF2 }, + { "F3", kKeyF3 }, + { "F4", kKeyF4 }, + { "F5", kKeyF5 }, + { "F6", kKeyF6 }, + { "F7", kKeyF7 }, + { "F8", kKeyF8 }, + { "F9", kKeyF9 }, + { "F10", kKeyF10 }, + { "F11", kKeyF11 }, + { "F12", kKeyF12 }, + { "F13", kKeyF13 }, + { "F14", kKeyF14 }, + { "F15", kKeyF15 }, + { "F16", kKeyF16 }, + { "F17", kKeyF17 }, + { "F18", kKeyF18 }, + { "F19", kKeyF19 }, + { "F20", kKeyF20 }, + { "F21", kKeyF21 }, + { "F22", kKeyF22 }, + { "F23", kKeyF23 }, + { "F24", kKeyF24 }, + { "F25", kKeyF25 }, + { "F26", kKeyF26 }, + { "F27", kKeyF27 }, + { "F28", kKeyF28 }, + { "F29", kKeyF29 }, + { "F30", kKeyF30 }, + { "F31", kKeyF31 }, + { "F32", kKeyF32 }, + { "F33", kKeyF33 }, + { "F34", kKeyF34 }, + { "F35", kKeyF35 }, + { "Find", kKeyFind }, + { "Help", kKeyHelp }, + { "Henkan", kKeyHenkan }, + { "Home", kKeyHome }, + { "Hyper_L", kKeyHyper_L }, + { "Hyper_R", kKeyHyper_R }, + { "Insert", kKeyInsert }, + { "KP_0", kKeyKP_0 }, + { "KP_1", kKeyKP_1 }, + { "KP_2", kKeyKP_2 }, + { "KP_3", kKeyKP_3 }, + { "KP_4", kKeyKP_4 }, + { "KP_5", kKeyKP_5 }, + { "KP_6", kKeyKP_6 }, + { "KP_7", kKeyKP_7 }, + { "KP_8", kKeyKP_8 }, + { "KP_9", kKeyKP_9 }, + { "KP_Add", kKeyKP_Add }, + { "KP_Begin", kKeyKP_Begin }, + { "KP_Decimal", kKeyKP_Decimal }, + { "KP_Delete", kKeyKP_Delete }, + { "KP_Divide", kKeyKP_Divide }, + { "KP_Down", kKeyKP_Down }, + { "KP_End", kKeyKP_End }, + { "KP_Enter", kKeyKP_Enter }, + { "KP_Equal", kKeyKP_Equal }, + { "KP_F1", kKeyKP_F1 }, + { "KP_F2", kKeyKP_F2 }, + { "KP_F3", kKeyKP_F3 }, + { "KP_F4", kKeyKP_F4 }, + { "KP_Home", kKeyKP_Home }, + { "KP_Insert", kKeyKP_Insert }, + { "KP_Left", kKeyKP_Left }, + { "KP_Multiply", kKeyKP_Multiply }, + { "KP_PageDown", kKeyKP_PageDown }, + { "KP_PageUp", kKeyKP_PageUp }, + { "KP_Right", kKeyKP_Right }, + { "KP_Separator", kKeyKP_Separator }, + { "KP_Space", kKeyKP_Space }, + { "KP_Subtract", kKeyKP_Subtract }, + { "KP_Tab", kKeyKP_Tab }, + { "KP_Up", kKeyKP_Up }, + { "Left", kKeyLeft }, + { "LeftTab", kKeyLeftTab }, + { "Linefeed", kKeyLinefeed }, + { "Menu", kKeyMenu }, + { "Meta_L", kKeyMeta_L }, + { "Meta_R", kKeyMeta_R }, + { "NumLock", kKeyNumLock }, + { "PageDown", kKeyPageDown }, + { "PageUp", kKeyPageUp }, + { "Pause", kKeyPause }, + { "Print", kKeyPrint }, + { "Redo", kKeyRedo }, + { "Return", kKeyReturn }, + { "Right", kKeyRight }, + { "ScrollLock", kKeyScrollLock }, + { "Select", kKeySelect }, + { "ShiftLock", kKeyShiftLock }, + { "Shift_L", kKeyShift_L }, + { "Shift_R", kKeyShift_R }, + { "Sleep", kKeySleep }, + { "Super_L", kKeySuper_L }, + { "Super_R", kKeySuper_R }, + { "SysReq", kKeySysReq }, + { "Tab", kKeyTab }, + { "Undo", kKeyUndo }, + { "Up", kKeyUp }, + { "WWWBack", kKeyWWWBack }, + { "WWWFavorites", kKeyWWWFavorites }, + { "WWWForward", kKeyWWWForward }, + { "WWWHome", kKeyWWWHome }, + { "WWWRefresh", kKeyWWWRefresh }, + { "WWWSearch", kKeyWWWSearch }, + { "WWWStop", kKeyWWWStop }, + { "Zenkaku", kKeyZenkaku }, + { "Space", 0x0020 }, + { "Exclaim", 0x0021 }, + { "DoubleQuote", 0x0022 }, + { "Number", 0x0023 }, + { "Dollar", 0x0024 }, + { "Percent", 0x0025 }, + { "Ampersand", 0x0026 }, + { "Apostrophe", 0x0027 }, + { "ParenthesisL", 0x0028 }, + { "ParenthesisR", 0x0029 }, + { "Asterisk", 0x002a }, + { "Plus", 0x002b }, + { "Comma", 0x002c }, + { "Minus", 0x002d }, + { "Period", 0x002e }, + { "Slash", 0x002f }, + { "Colon", 0x003a }, + { "Semicolon", 0x003b }, + { "Less", 0x003c }, + { "Equal", 0x003d }, + { "Greater", 0x003e }, + { "Question", 0x003f }, + { "At", 0x0040 }, + { "BracketL", 0x005b }, + { "Backslash", 0x005c }, + { "BracketR", 0x005d }, + { "Circumflex", 0x005e }, + { "Underscore", 0x005f }, + { "Grave", 0x0060 }, + { "BraceL", 0x007b }, + { "Bar", 0x007c }, + { "BraceR", 0x007d }, + { "Tilde", 0x007e }, + { NULL, 0 }, }; const KeyModifierNameMapEntry kModifierNameMap[] = { - { "Alt", KeyModifierAlt }, - { "AltGr", KeyModifierAltGr }, -// { "CapsLock", KeyModifierCapsLock }, - { "Control", KeyModifierControl }, - { "Meta", KeyModifierMeta }, -// { "NumLock", KeyModifierNumLock }, -// { "ScrollLock", KeyModifierScrollLock }, - { "Shift", KeyModifierShift }, - { "Super", KeyModifierSuper }, - { NULL, 0 }, + { "Alt", KeyModifierAlt }, + { "AltGr", KeyModifierAltGr }, +// { "CapsLock", KeyModifierCapsLock }, + { "Control", KeyModifierControl }, + { "Meta", KeyModifierMeta }, +// { "NumLock", KeyModifierNumLock }, +// { "ScrollLock", KeyModifierScrollLock }, + { "Shift", KeyModifierShift }, + { "Super", KeyModifierSuper }, + { NULL, 0 }, }; diff --git a/src/lib/synergy/mouse_types.h b/src/lib/synergy/mouse_types.h index be9f1920..61c2c5a2 100644 --- a/src/lib/synergy/mouse_types.h +++ b/src/lib/synergy/mouse_types.h @@ -24,15 +24,15 @@ /*! Type to hold a mouse button identifier. */ -typedef UInt8 ButtonID; +typedef UInt8 ButtonID; //! @name Mouse button identifiers //@{ -static const ButtonID kButtonNone = 0; -static const ButtonID kButtonLeft = 1; -static const ButtonID kButtonMiddle = 2; -static const ButtonID kButtonRight = 3; -static const ButtonID kButtonExtra0 = 4; +static const ButtonID kButtonNone = 0; +static const ButtonID kButtonLeft = 1; +static const ButtonID kButtonMiddle = 2; +static const ButtonID kButtonRight = 3; +static const ButtonID kButtonExtra0 = 4; static const ButtonID kMacButtonRight = 2; static const ButtonID kMacButtonMiddle = 3; diff --git a/src/lib/synergy/option_types.h b/src/lib/synergy/option_types.h index 22f7292b..9c92dc7e 100644 --- a/src/lib/synergy/option_types.h +++ b/src/lib/synergy/option_types.h @@ -25,74 +25,74 @@ /*! Type to hold an option identifier. */ -typedef UInt32 OptionID; +typedef UInt32 OptionID; //! Option Value /*! Type to hold an option value. */ -typedef SInt32 OptionValue; +typedef SInt32 OptionValue; // for now, options are just pairs of integers typedef std::vector OptionsList; // macro for packing 4 character strings into 4 byte integers -#define OPTION_CODE(_s) \ - (static_cast(static_cast(_s[0]) << 24) | \ - static_cast(static_cast(_s[1]) << 16) | \ - static_cast(static_cast(_s[2]) << 8) | \ - static_cast(static_cast(_s[3]) )) +#define OPTION_CODE(_s) \ + (static_cast(static_cast(_s[0]) << 24) | \ + static_cast(static_cast(_s[1]) << 16) | \ + static_cast(static_cast(_s[2]) << 8) | \ + static_cast(static_cast(_s[3]) )) //! @name Option identifiers //@{ -static const OptionID kOptionHalfDuplexCapsLock = OPTION_CODE("HDCL"); -static const OptionID kOptionHalfDuplexNumLock = OPTION_CODE("HDNL"); -static const OptionID kOptionHalfDuplexScrollLock = OPTION_CODE("HDSL"); -static const OptionID kOptionModifierMapForShift = OPTION_CODE("MMFS"); -static const OptionID kOptionModifierMapForControl = OPTION_CODE("MMFC"); -static const OptionID kOptionModifierMapForAlt = OPTION_CODE("MMFA"); -static const OptionID kOptionModifierMapForAltGr = OPTION_CODE("MMFG"); -static const OptionID kOptionModifierMapForMeta = OPTION_CODE("MMFM"); -static const OptionID kOptionModifierMapForSuper = OPTION_CODE("MMFR"); -static const OptionID kOptionHeartbeat = OPTION_CODE("HART"); -static const OptionID kOptionScreenSwitchCorners = OPTION_CODE("SSCM"); -static const OptionID kOptionScreenSwitchCornerSize = OPTION_CODE("SSCS"); -static const OptionID kOptionScreenSwitchDelay = OPTION_CODE("SSWT"); -static const OptionID kOptionScreenSwitchTwoTap = OPTION_CODE("SSTT"); -static const OptionID kOptionScreenSwitchNeedsShift = OPTION_CODE("SSNS"); -static const OptionID kOptionScreenSwitchNeedsControl = OPTION_CODE("SSNC"); -static const OptionID kOptionScreenSwitchNeedsAlt = OPTION_CODE("SSNA"); -static const OptionID kOptionScreenSaverSync = OPTION_CODE("SSVR"); -static const OptionID kOptionXTestXineramaUnaware = OPTION_CODE("XTXU"); -static const OptionID kOptionScreenPreserveFocus = OPTION_CODE("SFOC"); -static const OptionID kOptionRelativeMouseMoves = OPTION_CODE("MDLT"); -static const OptionID kOptionWin32KeepForeground = OPTION_CODE("_KFW"); -static const OptionID kOptionClipboardSharing = OPTION_CODE("CLPS"); +static const OptionID kOptionHalfDuplexCapsLock = OPTION_CODE("HDCL"); +static const OptionID kOptionHalfDuplexNumLock = OPTION_CODE("HDNL"); +static const OptionID kOptionHalfDuplexScrollLock = OPTION_CODE("HDSL"); +static const OptionID kOptionModifierMapForShift = OPTION_CODE("MMFS"); +static const OptionID kOptionModifierMapForControl = OPTION_CODE("MMFC"); +static const OptionID kOptionModifierMapForAlt = OPTION_CODE("MMFA"); +static const OptionID kOptionModifierMapForAltGr = OPTION_CODE("MMFG"); +static const OptionID kOptionModifierMapForMeta = OPTION_CODE("MMFM"); +static const OptionID kOptionModifierMapForSuper = OPTION_CODE("MMFR"); +static const OptionID kOptionHeartbeat = OPTION_CODE("HART"); +static const OptionID kOptionScreenSwitchCorners = OPTION_CODE("SSCM"); +static const OptionID kOptionScreenSwitchCornerSize = OPTION_CODE("SSCS"); +static const OptionID kOptionScreenSwitchDelay = OPTION_CODE("SSWT"); +static const OptionID kOptionScreenSwitchTwoTap = OPTION_CODE("SSTT"); +static const OptionID kOptionScreenSwitchNeedsShift = OPTION_CODE("SSNS"); +static const OptionID kOptionScreenSwitchNeedsControl = OPTION_CODE("SSNC"); +static const OptionID kOptionScreenSwitchNeedsAlt = OPTION_CODE("SSNA"); +static const OptionID kOptionScreenSaverSync = OPTION_CODE("SSVR"); +static const OptionID kOptionXTestXineramaUnaware = OPTION_CODE("XTXU"); +static const OptionID kOptionScreenPreserveFocus = OPTION_CODE("SFOC"); +static const OptionID kOptionRelativeMouseMoves = OPTION_CODE("MDLT"); +static const OptionID kOptionWin32KeepForeground = OPTION_CODE("_KFW"); +static const OptionID kOptionClipboardSharing = OPTION_CODE("CLPS"); //@} //! @name Screen switch corner enumeration //@{ enum EScreenSwitchCorners { - kNoCorner, - kTopLeft, - kTopRight, - kBottomLeft, - kBottomRight, - kFirstCorner = kTopLeft, - kLastCorner = kBottomRight + kNoCorner, + kTopLeft, + kTopRight, + kBottomLeft, + kBottomRight, + kFirstCorner = kTopLeft, + kLastCorner = kBottomRight }; //@} //! @name Screen switch corner masks //@{ enum EScreenSwitchCornerMasks { - kNoCornerMask = 0, - kTopLeftMask = 1 << (kTopLeft - kFirstCorner), - kTopRightMask = 1 << (kTopRight - kFirstCorner), - kBottomLeftMask = 1 << (kBottomLeft - kFirstCorner), - kBottomRightMask = 1 << (kBottomRight - kFirstCorner), - kAllCornersMask = kTopLeftMask | kTopRightMask | - kBottomLeftMask | kBottomRightMask + kNoCornerMask = 0, + kTopLeftMask = 1 << (kTopLeft - kFirstCorner), + kTopRightMask = 1 << (kTopRight - kFirstCorner), + kBottomLeftMask = 1 << (kBottomLeft - kFirstCorner), + kBottomRightMask = 1 << (kBottomRight - kFirstCorner), + kAllCornersMask = kTopLeftMask | kTopRightMask | + kBottomLeftMask | kBottomRightMask }; //@} diff --git a/src/lib/synergy/protocol_types.cpp b/src/lib/synergy/protocol_types.cpp index db5c9767..e4834fce 100644 --- a/src/lib/synergy/protocol_types.cpp +++ b/src/lib/synergy/protocol_types.cpp @@ -18,36 +18,36 @@ #include "synergy/protocol_types.h" -const char* kMsgHello = "Synergy%2i%2i"; -const char* kMsgHelloBack = "Synergy%2i%2i%s"; -const char* kMsgCNoop = "CNOP"; -const char* kMsgCClose = "CBYE"; -const char* kMsgCEnter = "CINN%2i%2i%4i%2i"; -const char* kMsgCLeave = "COUT"; -const char* kMsgCClipboard = "CCLP%1i%4i"; -const char* kMsgCScreenSaver = "CSEC%1i"; -const char* kMsgCResetOptions = "CROP"; -const char* kMsgCInfoAck = "CIAK"; -const char* kMsgCKeepAlive = "CALV"; -const char* kMsgDKeyDown = "DKDN%2i%2i%2i"; -const char* kMsgDKeyDown1_0 = "DKDN%2i%2i"; -const char* kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i"; -const char* kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i"; -const char* kMsgDKeyUp = "DKUP%2i%2i%2i"; -const char* kMsgDKeyUp1_0 = "DKUP%2i%2i"; -const char* kMsgDMouseDown = "DMDN%1i"; -const char* kMsgDMouseUp = "DMUP%1i"; -const char* kMsgDMouseMove = "DMMV%2i%2i"; -const char* kMsgDMouseRelMove = "DMRM%2i%2i"; -const char* kMsgDMouseWheel = "DMWM%2i%2i"; -const char* kMsgDMouseWheel1_0 = "DMWM%2i"; -const char* kMsgDClipboard = "DCLP%1i%4i%1i%s"; -const char* kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i"; -const char* kMsgDSetOptions = "DSOP%4I"; -const char* kMsgDFileTransfer = "DFTR%1i%s"; -const char* kMsgDDragInfo = "DDRG%2i%s"; -const char* kMsgQInfo = "QINF"; -const char* kMsgEIncompatible = "EICV%2i%2i"; -const char* kMsgEBusy = "EBSY"; -const char* kMsgEUnknown = "EUNK"; -const char* kMsgEBad = "EBAD"; +const char* kMsgHello = "Synergy%2i%2i"; +const char* kMsgHelloBack = "Synergy%2i%2i%s"; +const char* kMsgCNoop = "CNOP"; +const char* kMsgCClose = "CBYE"; +const char* kMsgCEnter = "CINN%2i%2i%4i%2i"; +const char* kMsgCLeave = "COUT"; +const char* kMsgCClipboard = "CCLP%1i%4i"; +const char* kMsgCScreenSaver = "CSEC%1i"; +const char* kMsgCResetOptions = "CROP"; +const char* kMsgCInfoAck = "CIAK"; +const char* kMsgCKeepAlive = "CALV"; +const char* kMsgDKeyDown = "DKDN%2i%2i%2i"; +const char* kMsgDKeyDown1_0 = "DKDN%2i%2i"; +const char* kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i"; +const char* kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i"; +const char* kMsgDKeyUp = "DKUP%2i%2i%2i"; +const char* kMsgDKeyUp1_0 = "DKUP%2i%2i"; +const char* kMsgDMouseDown = "DMDN%1i"; +const char* kMsgDMouseUp = "DMUP%1i"; +const char* kMsgDMouseMove = "DMMV%2i%2i"; +const char* kMsgDMouseRelMove = "DMRM%2i%2i"; +const char* kMsgDMouseWheel = "DMWM%2i%2i"; +const char* kMsgDMouseWheel1_0 = "DMWM%2i"; +const char* kMsgDClipboard = "DCLP%1i%4i%1i%s"; +const char* kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i"; +const char* kMsgDSetOptions = "DSOP%4I"; +const char* kMsgDFileTransfer = "DFTR%1i%s"; +const char* kMsgDDragInfo = "DDRG%2i%s"; +const char* kMsgQInfo = "QINF"; +const char* kMsgEIncompatible = "EICV%2i%2i"; +const char* kMsgEBusy = "EBSY"; +const char* kMsgEUnknown = "EUNK"; +const char* kMsgEBad = "EBAD"; diff --git a/src/lib/synergy/protocol_types.h b/src/lib/synergy/protocol_types.h index 089b22be..e3f7f42c 100644 --- a/src/lib/synergy/protocol_types.h +++ b/src/lib/synergy/protocol_types.h @@ -30,59 +30,59 @@ // 1.5: adds file transfer and removes home brew crypto // 1.6: adds clipboard streaming // NOTE: with new version, synergy minor version should increment -static const SInt16 kProtocolMajorVersion = 1; -static const SInt16 kProtocolMinorVersion = 6; +static const SInt16 kProtocolMajorVersion = 1; +static const SInt16 kProtocolMinorVersion = 6; // default contact port number -static const UInt16 kDefaultPort = 24800; +static const UInt16 kDefaultPort = 24800; // maximum total length for greeting returned by client -static const UInt32 kMaxHelloLength = 1024; +static const UInt32 kMaxHelloLength = 1024; // time between kMsgCKeepAlive (in seconds). a non-positive value disables // keep alives. this is the default rate that can be overridden using an // option. -static const double kKeepAliveRate = 3.0; +static const double kKeepAliveRate = 3.0; // number of skipped kMsgCKeepAlive messages that indicates a problem -static const double kKeepAlivesUntilDeath = 3.0; +static const double kKeepAlivesUntilDeath = 3.0; // obsolete heartbeat stuff -static const double kHeartRate = -1.0; -static const double kHeartBeatsUntilDeath = 3.0; +static const double kHeartRate = -1.0; +static const double kHeartBeatsUntilDeath = 3.0; // direction constants enum EDirection { - kNoDirection, - kLeft, - kRight, - kTop, - kBottom, - kFirstDirection = kLeft, - kLastDirection = kBottom, - kNumDirections = kLastDirection - kFirstDirection + 1 + kNoDirection, + kLeft, + kRight, + kTop, + kBottom, + kFirstDirection = kLeft, + kLastDirection = kBottom, + kNumDirections = kLastDirection - kFirstDirection + 1 }; enum EDirectionMask { - kNoDirMask = 0, - kLeftMask = 1 << kLeft, - kRightMask = 1 << kRight, - kTopMask = 1 << kTop, - kBottomMask = 1 << kBottom + kNoDirMask = 0, + kLeftMask = 1 << kLeft, + kRightMask = 1 << kRight, + kTopMask = 1 << kTop, + kBottomMask = 1 << kBottom }; // Data transfer constants enum EDataTransfer { - kDataStart = 1, - kDataChunk = 2, - kDataEnd = 3 + kDataStart = 1, + kDataChunk = 2, + kDataEnd = 3 }; // Data received constants enum EDataReceived { - kStart, - kNotFinish, - kFinish, - kError + kStart, + kNotFinish, + kFinish, + kError }; // @@ -103,13 +103,13 @@ enum EDataReceived { // say hello to client; primary -> secondary // $1 = protocol major version number supported by server. $2 = // protocol minor version number supported by server. -extern const char* kMsgHello; +extern const char* kMsgHello; // respond to hello from server; secondary -> primary // $1 = protocol major version number supported by client. $2 = // protocol minor version number supported by client. $3 = client // name. -extern const char* kMsgHelloBack; +extern const char* kMsgHelloBack; // @@ -117,10 +117,10 @@ extern const char* kMsgHelloBack; // // no operation; secondary -> primary -extern const char* kMsgCNoop; +extern const char* kMsgCNoop; // close connection; primary -> secondary -extern const char* kMsgCClose; +extern const char* kMsgCClose; // enter screen: primary -> secondary // entering screen at screen position $1 = x, $2 = y. x,y are @@ -130,7 +130,7 @@ extern const char* kMsgCClose; // mask. this will have bits set for each toggle modifier key // that is activated on entry to the screen. the secondary screen // should adjust its toggle modifiers to reflect that state. -extern const char* kMsgCEnter; +extern const char* kMsgCEnter; // leave screen: primary -> secondary // leaving screen. the secondary screen should send clipboard @@ -139,28 +139,28 @@ extern const char* kMsgCEnter; // not received a kMsgCClipboard for with a greater sequence // number) and that were grabbed or have changed since the // last leave. -extern const char* kMsgCLeave; +extern const char* kMsgCLeave; // grab clipboard: primary <-> secondary // sent by screen when some other app on that screen grabs a // clipboard. $1 = the clipboard identifier, $2 = sequence number. // secondary screens must use the sequence number passed in the // most recent kMsgCEnter. the primary always sends 0. -extern const char* kMsgCClipboard; +extern const char* kMsgCClipboard; // screensaver change: primary -> secondary // screensaver on primary has started ($1 == 1) or closed ($1 == 0) -extern const char* kMsgCScreenSaver; +extern const char* kMsgCScreenSaver; // reset options: primary -> secondary // client should reset all of its options to their defaults. -extern const char* kMsgCResetOptions; +extern const char* kMsgCResetOptions; // resolution change acknowledgment: primary -> secondary // sent by primary in response to a secondary screen's kMsgDInfo. // this is sent for every kMsgDInfo, whether or not the primary // had sent a kMsgQInfo. -extern const char* kMsgCInfoAck; +extern const char* kMsgCInfoAck; // keep connection alive: primary <-> secondary // sent by the server periodically to verify that connections are still @@ -170,7 +170,7 @@ extern const char* kMsgCInfoAck; // client doesn't receive these (or any message) periodically then it // should disconnect from the server. the appropriate interval is // defined by an option. -extern const char* kMsgCKeepAlive; +extern const char* kMsgCKeepAlive; // // data codes @@ -187,57 +187,57 @@ extern const char* kMsgCKeepAlive; // the press. this can happen with combining (dead) keys or if // the keyboard layouts are not identical and the user releases // a modifier key before releasing the modified key. -extern const char* kMsgDKeyDown; +extern const char* kMsgDKeyDown; // key pressed 1.0: same as above but without KeyButton -extern const char* kMsgDKeyDown1_0; +extern const char* kMsgDKeyDown1_0; // key auto-repeat: primary -> secondary // $1 = KeyID, $2 = KeyModifierMask, $3 = number of repeats, $4 = KeyButton -extern const char* kMsgDKeyRepeat; +extern const char* kMsgDKeyRepeat; // key auto-repeat 1.0: same as above but without KeyButton -extern const char* kMsgDKeyRepeat1_0; +extern const char* kMsgDKeyRepeat1_0; // key released: primary -> secondary // $1 = KeyID, $2 = KeyModifierMask, $3 = KeyButton -extern const char* kMsgDKeyUp; +extern const char* kMsgDKeyUp; // key released 1.0: same as above but without KeyButton -extern const char* kMsgDKeyUp1_0; +extern const char* kMsgDKeyUp1_0; // mouse button pressed: primary -> secondary // $1 = ButtonID -extern const char* kMsgDMouseDown; +extern const char* kMsgDMouseDown; // mouse button released: primary -> secondary // $1 = ButtonID -extern const char* kMsgDMouseUp; +extern const char* kMsgDMouseUp; // mouse moved: primary -> secondary // $1 = x, $2 = y. x,y are absolute screen coordinates. -extern const char* kMsgDMouseMove; +extern const char* kMsgDMouseMove; // relative mouse move: primary -> secondary // $1 = dx, $2 = dy. dx,dy are motion deltas. -extern const char* kMsgDMouseRelMove; +extern const char* kMsgDMouseRelMove; // mouse scroll: primary -> secondary // $1 = xDelta, $2 = yDelta. the delta should be +120 for one tick forward // (away from the user) or right and -120 for one tick backward (toward // the user) or left. -extern const char* kMsgDMouseWheel; +extern const char* kMsgDMouseWheel; // mouse vertical scroll: primary -> secondary // like as kMsgDMouseWheel except only sends $1 = yDelta. -extern const char* kMsgDMouseWheel1_0; +extern const char* kMsgDMouseWheel1_0; // clipboard data: primary <-> secondary // $2 = sequence number, $3 = mark $4 = clipboard data. the sequence number // is 0 when sent by the primary. secondary screens should use the // sequence number from the most recent kMsgCEnter. $1 = clipboard // identifier. -extern const char* kMsgDClipboard; +extern const char* kMsgDClipboard; // client data: secondary -> primary // $1 = coordinate of leftmost pixel on secondary screen, @@ -253,25 +253,25 @@ extern const char* kMsgDClipboard; // should ignore any kMsgDMouseMove messages until it receives a // kMsgCInfoAck in order to prevent attempts to move the mouse off // the new screen area. -extern const char* kMsgDInfo; +extern const char* kMsgDInfo; // set options: primary -> secondary // client should set the given option/value pairs. $1 = option/value // pairs. -extern const char* kMsgDSetOptions; +extern const char* kMsgDSetOptions; // file data: primary <-> secondary // transfer file data. A mark is used in the first byte. // 0 means the content followed is the file size. // 1 means the content followed is the chunk data. // 2 means the file transfer is finished. -extern const char* kMsgDFileTransfer; +extern const char* kMsgDFileTransfer; // drag infomation: primary <-> secondary // transfer drag infomation. The first 2 bytes are used for storing // the number of dragging objects. Then the following string consists // of each object's directory. -extern const char* kMsgDDragInfo; +extern const char* kMsgDDragInfo; // // query codes @@ -279,7 +279,7 @@ extern const char* kMsgDDragInfo; // query screen info: primary -> secondary // client should reply with a kMsgDInfo. -extern const char* kMsgQInfo; +extern const char* kMsgQInfo; // @@ -288,19 +288,19 @@ extern const char* kMsgQInfo; // incompatible versions: primary -> secondary // $1 = major version of primary, $2 = minor version of primary. -extern const char* kMsgEIncompatible; +extern const char* kMsgEIncompatible; // name provided when connecting is already in use: primary -> secondary -extern const char* kMsgEBusy; +extern const char* kMsgEBusy; // unknown client: primary -> secondary // name provided when connecting is not in primary's screen // configuration map. -extern const char* kMsgEUnknown; +extern const char* kMsgEUnknown; // protocol violation: primary -> secondary // primary should disconnect after sending this message. -extern const char* kMsgEBad; +extern const char* kMsgEBad; // @@ -313,25 +313,25 @@ This class contains information about a screen. */ class ClientInfo { public: - //! Screen position - /*! - The position of the upper-left corner of the screen. This is - typically 0,0. - */ - SInt32 m_x, m_y; + //! Screen position + /*! + The position of the upper-left corner of the screen. This is + typically 0,0. + */ + SInt32 m_x, m_y; - //! Screen size - /*! - The size of the screen in pixels. - */ - SInt32 m_w, m_h; + //! Screen size + /*! + The size of the screen in pixels. + */ + SInt32 m_w, m_h; - //! Obsolete (jump zone size) - SInt32 obsolete1; + //! Obsolete (jump zone size) + SInt32 obsolete1; - //! Mouse position - /*! - The current location of the mouse cursor. - */ - SInt32 m_mx, m_my; + //! Mouse position + /*! + The current location of the mouse cursor. + */ + SInt32 m_mx, m_my; }; diff --git a/src/lib/synergy/unix/AppUtilUnix.cpp b/src/lib/synergy/unix/AppUtilUnix.cpp index e1a4f7e0..a052bfd9 100644 --- a/src/lib/synergy/unix/AppUtilUnix.cpp +++ b/src/lib/synergy/unix/AppUtilUnix.cpp @@ -30,17 +30,17 @@ AppUtilUnix::~AppUtilUnix() int standardStartupStatic(int argc, char** argv) { - return AppUtil::instance().app().standardStartup(argc, argv); + return AppUtil::instance().app().standardStartup(argc, argv); } int AppUtilUnix::run(int argc, char** argv) { - return app().runInner(argc, argv, NULL, &standardStartupStatic); + return app().runInner(argc, argv, NULL, &standardStartupStatic); } void AppUtilUnix::startNode() { - app().startNode(); + app().startNode(); } diff --git a/src/lib/synergy/unix/AppUtilUnix.h b/src/lib/synergy/unix/AppUtilUnix.h index 74e0a3fc..ba235dcc 100644 --- a/src/lib/synergy/unix/AppUtilUnix.h +++ b/src/lib/synergy/unix/AppUtilUnix.h @@ -26,9 +26,9 @@ class IEventQueue; class AppUtilUnix : public AppUtil { public: - AppUtilUnix(IEventQueue* events); - virtual ~AppUtilUnix(); - - int run(int argc, char** argv); - void startNode(); + AppUtilUnix(IEventQueue* events); + virtual ~AppUtilUnix(); + + int run(int argc, char** argv); + void startNode(); }; diff --git a/src/lib/synergy/win32/AppUtilWindows.cpp b/src/lib/synergy/win32/AppUtilWindows.cpp index 421f05b5..bfe3740a 100644 --- a/src/lib/synergy/win32/AppUtilWindows.cpp +++ b/src/lib/synergy/win32/AppUtilWindows.cpp @@ -38,12 +38,12 @@ #include AppUtilWindows::AppUtilWindows(IEventQueue* events) : - m_events(events), - m_exitMode(kExitModeNormal) + m_events(events), + m_exitMode(kExitModeNormal) { - if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)consoleHandler, TRUE) == FALSE) + if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)consoleHandler, TRUE) == FALSE) { - throw XArch(new XArchEvalWindows()); + throw XArch(new XArchEvalWindows()); } } @@ -53,9 +53,9 @@ AppUtilWindows::~AppUtilWindows() BOOL WINAPI AppUtilWindows::consoleHandler(DWORD) { - LOG((CLOG_INFO "got shutdown signal")); - IEventQueue* events = AppUtil::instance().app().getEvents(); - events->addEvent(Event(Event::kQuit)); + LOG((CLOG_INFO "got shutdown signal")); + IEventQueue* events = AppUtil::instance().app().getEvents(); + events->addEvent(Event(Event::kQuit)); return TRUE; } @@ -63,123 +63,123 @@ static int mainLoopStatic() { - return AppUtil::instance().app().mainLoop(); + return AppUtil::instance().app().mainLoop(); } int AppUtilWindows::daemonNTMainLoop(int argc, const char** argv) { - app().initApp(argc, argv); - debugServiceWait(); + app().initApp(argc, argv); + debugServiceWait(); - // NB: what the hell does this do?! - app().argsBase().m_backend = false; - - return ArchMiscWindows::runDaemon(mainLoopStatic); + // NB: what the hell does this do?! + app().argsBase().m_backend = false; + + return ArchMiscWindows::runDaemon(mainLoopStatic); } void AppUtilWindows::exitApp(int code) { - switch (m_exitMode) { + switch (m_exitMode) { - case kExitModeDaemon: - ArchMiscWindows::daemonFailed(code); - break; + case kExitModeDaemon: + ArchMiscWindows::daemonFailed(code); + break; - default: - throw XExitApp(code); - } + default: + throw XExitApp(code); + } } int daemonNTMainLoopStatic(int argc, const char** argv) { - return AppUtilWindows::instance().daemonNTMainLoop(argc, argv); + return AppUtilWindows::instance().daemonNTMainLoop(argc, argv); } int AppUtilWindows::daemonNTStartup(int, char**) { - SystemLogger sysLogger(app().daemonName(), false); - m_exitMode = kExitModeDaemon; - return ARCH->daemonize(app().daemonName(), daemonNTMainLoopStatic); + SystemLogger sysLogger(app().daemonName(), false); + m_exitMode = kExitModeDaemon; + return ARCH->daemonize(app().daemonName(), daemonNTMainLoopStatic); } static int daemonNTStartupStatic(int argc, char** argv) { - return AppUtilWindows::instance().daemonNTStartup(argc, argv); + return AppUtilWindows::instance().daemonNTStartup(argc, argv); } static int foregroundStartupStatic(int argc, char** argv) { - return AppUtil::instance().app().foregroundStartup(argc, argv); + return AppUtil::instance().app().foregroundStartup(argc, argv); } void AppUtilWindows::beforeAppExit() { - // this can be handy for debugging, since the application is launched in - // a new console window, and will normally close on exit (making it so - // that we can't see error messages). - if (app().argsBase().m_pauseOnExit) { - std::cout << std::endl << "press any key to exit..." << std::endl; - int c = _getch(); - } + // this can be handy for debugging, since the application is launched in + // a new console window, and will normally close on exit (making it so + // that we can't see error messages). + if (app().argsBase().m_pauseOnExit) { + std::cout << std::endl << "press any key to exit..." << std::endl; + int c = _getch(); + } } int AppUtilWindows::run(int argc, char** argv) { - if (!IsWindowsXPSP3OrGreater()) { - throw std::runtime_error("Synergy only supports Windows XP SP3 and above."); - } + if (!IsWindowsXPSP3OrGreater()) { + throw std::runtime_error("Synergy only supports Windows XP SP3 and above."); + } - // record window instance for tray icon, etc - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // record window instance for tray icon, etc + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); - MSWindowsScreen::init(ArchMiscWindows::instanceWin32()); - Thread::getCurrentThread().setPriority(-14); + MSWindowsScreen::init(ArchMiscWindows::instanceWin32()); + Thread::getCurrentThread().setPriority(-14); - StartupFunc startup; - if (ArchMiscWindows::wasLaunchedAsService()) { - startup = &daemonNTStartupStatic; - } else { - startup = &foregroundStartupStatic; - app().argsBase().m_daemon = false; - } + StartupFunc startup; + if (ArchMiscWindows::wasLaunchedAsService()) { + startup = &daemonNTStartupStatic; + } else { + startup = &foregroundStartupStatic; + app().argsBase().m_daemon = false; + } - return app().runInner(argc, argv, NULL, startup); + return app().runInner(argc, argv, NULL, startup); } AppUtilWindows& AppUtilWindows::instance() { - return (AppUtilWindows&)AppUtil::instance(); + return (AppUtilWindows&)AppUtil::instance(); } void AppUtilWindows::debugServiceWait() { - if (app().argsBase().m_debugServiceWait) - { - while(true) - { - // this code is only executed when the process is launched via the - // windows service controller (and --debug-service-wait arg is - // used). to debug, set a breakpoint on this line so that - // execution is delayed until the debugger is attached. - ARCH->sleep(1); - LOG((CLOG_INFO "waiting for debugger to attach")); - } - } + if (app().argsBase().m_debugServiceWait) + { + while(true) + { + // this code is only executed when the process is launched via the + // windows service controller (and --debug-service-wait arg is + // used). to debug, set a breakpoint on this line so that + // execution is delayed until the debugger is attached. + ARCH->sleep(1); + LOG((CLOG_INFO "waiting for debugger to attach")); + } + } } void AppUtilWindows::startNode() { - app().startNode(); + app().startNode(); } diff --git a/src/lib/synergy/win32/AppUtilWindows.h b/src/lib/synergy/win32/AppUtilWindows.h index e0dde6b2..04b6d424 100644 --- a/src/lib/synergy/win32/AppUtilWindows.h +++ b/src/lib/synergy/win32/AppUtilWindows.h @@ -29,34 +29,34 @@ class IEventQueue; enum AppExitMode { - kExitModeNormal, - kExitModeDaemon + kExitModeNormal, + kExitModeDaemon }; class AppUtilWindows : public AppUtil { public: - AppUtilWindows(IEventQueue* events); - virtual ~AppUtilWindows(); + AppUtilWindows(IEventQueue* events); + virtual ~AppUtilWindows(); - int daemonNTStartup(int, char**); - - int daemonNTMainLoop(int argc, const char** argv); + int daemonNTStartup(int, char**); + + int daemonNTMainLoop(int argc, const char** argv); - void debugServiceWait(); + void debugServiceWait(); - int run(int argc, char** argv); + int run(int argc, char** argv); - void exitApp(int code); + void exitApp(int code); - void beforeAppExit(); + void beforeAppExit(); - static AppUtilWindows& instance(); + static AppUtilWindows& instance(); - void startNode(); + void startNode(); private: - AppExitMode m_exitMode; - IEventQueue* m_events; + AppExitMode m_exitMode; + IEventQueue* m_events; - static BOOL WINAPI consoleHandler(DWORD Event); + static BOOL WINAPI consoleHandler(DWORD Event); }; diff --git a/src/lib/synwinhk/CMakeLists.txt b/src/lib/synwinhk/CMakeLists.txt index 2a93c936..98b709f5 100644 --- a/src/lib/synwinhk/CMakeLists.txt +++ b/src/lib/synwinhk/CMakeLists.txt @@ -17,15 +17,15 @@ file(GLOB headers "*.h") file(GLOB sources "*.cpp") if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../ + ../ ) add_library(synwinhk SHARED ${sources}) if (NOT MSVC_VERSION VERSION_LESS 1900) - target_link_libraries(synwinhk libucrt) + target_link_libraries(synwinhk libucrt) endif() diff --git a/src/lib/synwinhk/synwinhk.cpp b/src/lib/synwinhk/synwinhk.cpp index af8d5ed4..30ba1289 100644 --- a/src/lib/synwinhk/synwinhk.cpp +++ b/src/lib/synwinhk/synwinhk.cpp @@ -55,16 +55,16 @@ // enum EWheelSupport { - kWheelNone, - kWheelOld, - kWheelWin2000, - kWheelModern + kWheelNone, + kWheelOld, + kWheelWin2000, + kWheelModern }; // declare extended mouse hook struct. useable on win2k typedef struct tagMOUSEHOOKSTRUCTWin2000 { - MOUSEHOOKSTRUCT mhs; - DWORD mouseData; + MOUSEHOOKSTRUCT mhs; + DWORD mouseData; } MOUSEHOOKSTRUCTWin2000; #if !defined(SM_MOUSEWHEELPRESENT) @@ -73,16 +73,16 @@ typedef struct tagMOUSEHOOKSTRUCTWin2000 { // X button stuff #if !defined(WM_XBUTTONDOWN) -#define WM_XBUTTONDOWN 0x020B -#define WM_XBUTTONUP 0x020C -#define WM_XBUTTONDBLCLK 0x020D -#define WM_NCXBUTTONDOWN 0x00AB -#define WM_NCXBUTTONUP 0x00AC -#define WM_NCXBUTTONDBLCLK 0x00AD -#define MOUSEEVENTF_XDOWN 0x0080 -#define MOUSEEVENTF_XUP 0x0100 -#define XBUTTON1 0x0001 -#define XBUTTON2 0x0002 +#define WM_XBUTTONDOWN 0x020B +#define WM_XBUTTONUP 0x020C +#define WM_XBUTTONDBLCLK 0x020D +#define WM_NCXBUTTONDOWN 0x00AB +#define WM_NCXBUTTONUP 0x00AC +#define WM_NCXBUTTONDBLCLK 0x00AD +#define MOUSEEVENTF_XDOWN 0x0080 +#define MOUSEEVENTF_XUP 0x0100 +#define XBUTTON1 0x0001 +#define XBUTTON2 0x0002 #endif @@ -96,31 +96,31 @@ typedef struct tagMOUSEHOOKSTRUCTWin2000 { #endif // all data in this shared section *must* be initialized -static HINSTANCE g_hinstance = NULL; -static DWORD g_processID = 0; -static EWheelSupport g_wheelSupport = kWheelNone; -static UINT g_wmMouseWheel = 0; -static DWORD g_threadID = 0; -static HHOOK g_keyboard = NULL; -static HHOOK g_mouse = NULL; -static HHOOK g_getMessage = NULL; -static HHOOK g_keyboardLL = NULL; -static HHOOK g_mouseLL = NULL; -static bool g_screenSaver = false; -static EHookMode g_mode = kHOOK_DISABLE; -static UInt32 g_zoneSides = 0; -static SInt32 g_zoneSize = 0; -static SInt32 g_xScreen = 0; -static SInt32 g_yScreen = 0; -static SInt32 g_wScreen = 0; -static SInt32 g_hScreen = 0; -static WPARAM g_deadVirtKey = 0; -static WPARAM g_deadRelease = 0; -static LPARAM g_deadLParam = 0; -static BYTE g_deadKeyState[256] = { 0 }; -static BYTE g_keyState[256] = { 0 }; -static DWORD g_hookThread = 0; -static bool g_fakeInput = false; +static HINSTANCE g_hinstance = NULL; +static DWORD g_processID = 0; +static EWheelSupport g_wheelSupport = kWheelNone; +static UINT g_wmMouseWheel = 0; +static DWORD g_threadID = 0; +static HHOOK g_keyboard = NULL; +static HHOOK g_mouse = NULL; +static HHOOK g_getMessage = NULL; +static HHOOK g_keyboardLL = NULL; +static HHOOK g_mouseLL = NULL; +static bool g_screenSaver = false; +static EHookMode g_mode = kHOOK_DISABLE; +static UInt32 g_zoneSides = 0; +static SInt32 g_zoneSize = 0; +static SInt32 g_xScreen = 0; +static SInt32 g_yScreen = 0; +static SInt32 g_wScreen = 0; +static SInt32 g_hScreen = 0; +static WPARAM g_deadVirtKey = 0; +static WPARAM g_deadRelease = 0; +static LPARAM g_deadLParam = 0; +static BYTE g_deadKeyState[256] = { 0 }; +static BYTE g_keyState[256] = { 0 }; +static DWORD g_hookThread = 0; +static bool g_fakeInput = false; #if defined(_MSC_VER) #pragma data_seg() @@ -140,316 +140,316 @@ static WPARAM makeKeyMsg(UINT virtKey, char c, bool noAltGr) { - return MAKEWPARAM(MAKEWORD(virtKey & 0xff, (BYTE)c), noAltGr ? 1 : 0); + return MAKEWPARAM(MAKEWORD(virtKey & 0xff, (BYTE)c), noAltGr ? 1 : 0); } static void keyboardGetState(BYTE keys[256], DWORD vkCode, bool kf_up) { - // we have to use GetAsyncKeyState() rather than GetKeyState() because - // we don't pass through most keys so the event synchronous state - // doesn't get updated. we do that because certain modifier keys have - // side effects, like alt and the windows key. - if (vkCode < 0 || vkCode >= 256) { - return; - } + // we have to use GetAsyncKeyState() rather than GetKeyState() because + // we don't pass through most keys so the event synchronous state + // doesn't get updated. we do that because certain modifier keys have + // side effects, like alt and the windows key. + if (vkCode < 0 || vkCode >= 256) { + return; + } - // Keep track of key state on our own in case GetAsyncKeyState() fails - g_keyState[vkCode] = kf_up ? 0 : 0x80; - g_keyState[VK_SHIFT] = g_keyState[VK_LSHIFT] | g_keyState[VK_RSHIFT]; + // Keep track of key state on our own in case GetAsyncKeyState() fails + g_keyState[vkCode] = kf_up ? 0 : 0x80; + g_keyState[VK_SHIFT] = g_keyState[VK_LSHIFT] | g_keyState[VK_RSHIFT]; - SHORT key; - // Test whether GetAsyncKeyState() is being honest with us - key = GetAsyncKeyState(vkCode); + SHORT key; + // Test whether GetAsyncKeyState() is being honest with us + key = GetAsyncKeyState(vkCode); - if (key & 0x80) { - // The only time we know for sure that GetAsyncKeyState() is working - // is when it tells us that the current key is down. - // In this case, update g_keyState to reflect what GetAsyncKeyState() - // is telling us, just in case we have gotten out of sync + if (key & 0x80) { + // The only time we know for sure that GetAsyncKeyState() is working + // is when it tells us that the current key is down. + // In this case, update g_keyState to reflect what GetAsyncKeyState() + // is telling us, just in case we have gotten out of sync - for (int i = 0; i < 256; ++i) { - key = GetAsyncKeyState(i); - g_keyState[i] = (BYTE)((key < 0) ? 0x80u : 0); - } - } + for (int i = 0; i < 256; ++i) { + key = GetAsyncKeyState(i); + g_keyState[i] = (BYTE)((key < 0) ? 0x80u : 0); + } + } - // copy g_keyState to keys - for (int i = 0; i < 256; ++i) { - keys[i] = g_keyState[i]; - } + // copy g_keyState to keys + for (int i = 0; i < 256; ++i) { + keys[i] = g_keyState[i]; + } - key = GetKeyState(VK_CAPITAL); - keys[VK_CAPITAL] = (BYTE)(((key < 0) ? 0x80 : 0) | (key & 1)); + key = GetKeyState(VK_CAPITAL); + keys[VK_CAPITAL] = (BYTE)(((key < 0) ? 0x80 : 0) | (key & 1)); } static bool doKeyboardHookHandler(WPARAM wParam, LPARAM lParam) { - DWORD vkCode = static_cast(wParam); - bool kf_up = (lParam & (KF_UP << 16)) != 0; + DWORD vkCode = static_cast(wParam); + bool kf_up = (lParam & (KF_UP << 16)) != 0; - // check for special events indicating if we should start or stop - // passing events through and not report them to the server. this - // is used to allow the server to synthesize events locally but - // not pick them up as user events. - if (wParam == SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY && - ((lParam >> 16) & 0xffu) == SYNERGY_HOOK_FAKE_INPUT_SCANCODE) { - // update flag - g_fakeInput = ((lParam & 0x80000000u) == 0); - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - 0xff000000u | wParam, lParam); + // check for special events indicating if we should start or stop + // passing events through and not report them to the server. this + // is used to allow the server to synthesize events locally but + // not pick them up as user events. + if (wParam == SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY && + ((lParam >> 16) & 0xffu) == SYNERGY_HOOK_FAKE_INPUT_SCANCODE) { + // update flag + g_fakeInput = ((lParam & 0x80000000u) == 0); + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + 0xff000000u | wParam, lParam); - // discard event - return true; - } + // discard event + return true; + } - // if we're expecting fake input then just pass the event through - // and do not forward to the server - if (g_fakeInput) { - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - 0xfe000000u | wParam, lParam); - return false; - } + // if we're expecting fake input then just pass the event through + // and do not forward to the server + if (g_fakeInput) { + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + 0xfe000000u | wParam, lParam); + return false; + } - // VK_RSHIFT may be sent with an extended scan code but right shift - // is not an extended key so we reset that bit. - if (wParam == VK_RSHIFT) { - lParam &= ~0x01000000u; - } + // VK_RSHIFT may be sent with an extended scan code but right shift + // is not an extended key so we reset that bit. + if (wParam == VK_RSHIFT) { + lParam &= ~0x01000000u; + } - // tell server about event - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, wParam, lParam); + // tell server about event + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, wParam, lParam); - // ignore dead key release - if ((g_deadVirtKey == wParam || g_deadRelease == wParam) && - (lParam & 0x80000000u) != 0) { - g_deadRelease = 0; - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - wParam | 0x04000000, lParam); - return false; - } + // ignore dead key release + if ((g_deadVirtKey == wParam || g_deadRelease == wParam) && + (lParam & 0x80000000u) != 0) { + g_deadRelease = 0; + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + wParam | 0x04000000, lParam); + return false; + } - // we need the keyboard state for ToAscii() - BYTE keys[256]; - keyboardGetState(keys, vkCode, kf_up); + // we need the keyboard state for ToAscii() + BYTE keys[256]; + keyboardGetState(keys, vkCode, kf_up); - // ToAscii() maps ctrl+letter to the corresponding control code - // and ctrl+backspace to delete. we don't want those translations - // so clear the control modifier state. however, if we want to - // simulate AltGr (which is ctrl+alt) then we must not clear it. - UINT control = keys[VK_CONTROL] | keys[VK_LCONTROL] | keys[VK_RCONTROL]; - UINT menu = keys[VK_MENU] | keys[VK_LMENU] | keys[VK_RMENU]; - if ((control & 0x80) == 0 || (menu & 0x80) == 0) { - keys[VK_LCONTROL] = 0; - keys[VK_RCONTROL] = 0; - keys[VK_CONTROL] = 0; - } - else { - keys[VK_LCONTROL] = 0x80; - keys[VK_RCONTROL] = 0x80; - keys[VK_CONTROL] = 0x80; - keys[VK_LMENU] = 0x80; - keys[VK_RMENU] = 0x80; - keys[VK_MENU] = 0x80; - } + // ToAscii() maps ctrl+letter to the corresponding control code + // and ctrl+backspace to delete. we don't want those translations + // so clear the control modifier state. however, if we want to + // simulate AltGr (which is ctrl+alt) then we must not clear it. + UINT control = keys[VK_CONTROL] | keys[VK_LCONTROL] | keys[VK_RCONTROL]; + UINT menu = keys[VK_MENU] | keys[VK_LMENU] | keys[VK_RMENU]; + if ((control & 0x80) == 0 || (menu & 0x80) == 0) { + keys[VK_LCONTROL] = 0; + keys[VK_RCONTROL] = 0; + keys[VK_CONTROL] = 0; + } + else { + keys[VK_LCONTROL] = 0x80; + keys[VK_RCONTROL] = 0x80; + keys[VK_CONTROL] = 0x80; + keys[VK_LMENU] = 0x80; + keys[VK_RMENU] = 0x80; + keys[VK_MENU] = 0x80; + } - // ToAscii() needs to know if a menu is active for some reason. - // we don't know and there doesn't appear to be any way to find - // out. so we'll just assume a menu is active if the menu key - // is down. - // FIXME -- figure out some way to check if a menu is active - UINT flags = 0; - if ((menu & 0x80) != 0) - flags |= 1; + // ToAscii() needs to know if a menu is active for some reason. + // we don't know and there doesn't appear to be any way to find + // out. so we'll just assume a menu is active if the menu key + // is down. + // FIXME -- figure out some way to check if a menu is active + UINT flags = 0; + if ((menu & 0x80) != 0) + flags |= 1; - // if we're on the server screen then just pass numpad keys with alt - // key down as-is. we won't pick up the resulting character but the - // local app will. if on a client screen then grab keys as usual; - // if the client is a windows system it'll synthesize the expected - // character. if not then it'll probably just do nothing. - if (g_mode != kHOOK_RELAY_EVENTS) { - // we don't use virtual keys because we don't know what the - // state of the numlock key is. we'll hard code the scan codes - // instead. hopefully this works across all keyboards. - UINT sc = (lParam & 0x01ff0000u) >> 16; - if (menu && - (sc >= 0x47u && sc <= 0x52u && sc != 0x4au && sc != 0x4eu)) { - return false; - } - } + // if we're on the server screen then just pass numpad keys with alt + // key down as-is. we won't pick up the resulting character but the + // local app will. if on a client screen then grab keys as usual; + // if the client is a windows system it'll synthesize the expected + // character. if not then it'll probably just do nothing. + if (g_mode != kHOOK_RELAY_EVENTS) { + // we don't use virtual keys because we don't know what the + // state of the numlock key is. we'll hard code the scan codes + // instead. hopefully this works across all keyboards. + UINT sc = (lParam & 0x01ff0000u) >> 16; + if (menu && + (sc >= 0x47u && sc <= 0x52u && sc != 0x4au && sc != 0x4eu)) { + return false; + } + } - WORD c = 0; + WORD c = 0; - // map the key event to a character. we have to put the dead - // key back first and this has the side effect of removing it. - if (g_deadVirtKey != 0) { - if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, - g_deadKeyState, &c, flags) == 2) - { - // If ToAscii returned 2, it means that we accidentally removed - // a double dead key instead of restoring it. Thus, we call - // ToAscii again with the same parameters to restore the - // internal dead key state. - ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, - g_deadKeyState, &c, flags); - - // We need to keep track of this because g_deadVirtKey will be - // cleared later on; this would cause the dead key release to - // incorrectly restore the dead key state. - g_deadRelease = g_deadVirtKey; - } - } - - UINT scanCode = ((lParam & 0x10ff0000u) >> 16); - int n = ToAscii((UINT)wParam, scanCode, keys, &c, flags); + // map the key event to a character. we have to put the dead + // key back first and this has the side effect of removing it. + if (g_deadVirtKey != 0) { + if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, + g_deadKeyState, &c, flags) == 2) + { + // If ToAscii returned 2, it means that we accidentally removed + // a double dead key instead of restoring it. Thus, we call + // ToAscii again with the same parameters to restore the + // internal dead key state. + ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, + g_deadKeyState, &c, flags); + + // We need to keep track of this because g_deadVirtKey will be + // cleared later on; this would cause the dead key release to + // incorrectly restore the dead key state. + g_deadRelease = g_deadVirtKey; + } + } + + UINT scanCode = ((lParam & 0x10ff0000u) >> 16); + int n = ToAscii((UINT)wParam, scanCode, keys, &c, flags); - // if mapping failed and ctrl and alt are pressed then try again - // with both not pressed. this handles the case where ctrl and - // alt are being used as individual modifiers rather than AltGr. - // we note that's the case in the message sent back to synergy - // because there's no simple way to deduce it after the fact. - // we have to put the dead key back first, if there was one. - bool noAltGr = false; - if (n == 0 && (control & 0x80) != 0 && (menu & 0x80) != 0) { - noAltGr = true; - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - wParam | 0x05000000, lParam); - if (g_deadVirtKey != 0) { - if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, - g_deadKeyState, &c, flags) == 2) - { - ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, - g_deadKeyState, &c, flags); - g_deadRelease = g_deadVirtKey; - } - } - BYTE keys2[256]; - for (size_t i = 0; i < sizeof(keys) / sizeof(keys[0]); ++i) { - keys2[i] = keys[i]; - } - keys2[VK_LCONTROL] = 0; - keys2[VK_RCONTROL] = 0; - keys2[VK_CONTROL] = 0; - keys2[VK_LMENU] = 0; - keys2[VK_RMENU] = 0; - keys2[VK_MENU] = 0; - n = ToAscii((UINT)wParam, scanCode, keys2, &c, flags); - } + // if mapping failed and ctrl and alt are pressed then try again + // with both not pressed. this handles the case where ctrl and + // alt are being used as individual modifiers rather than AltGr. + // we note that's the case in the message sent back to synergy + // because there's no simple way to deduce it after the fact. + // we have to put the dead key back first, if there was one. + bool noAltGr = false; + if (n == 0 && (control & 0x80) != 0 && (menu & 0x80) != 0) { + noAltGr = true; + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + wParam | 0x05000000, lParam); + if (g_deadVirtKey != 0) { + if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, + g_deadKeyState, &c, flags) == 2) + { + ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, + g_deadKeyState, &c, flags); + g_deadRelease = g_deadVirtKey; + } + } + BYTE keys2[256]; + for (size_t i = 0; i < sizeof(keys) / sizeof(keys[0]); ++i) { + keys2[i] = keys[i]; + } + keys2[VK_LCONTROL] = 0; + keys2[VK_RCONTROL] = 0; + keys2[VK_CONTROL] = 0; + keys2[VK_LMENU] = 0; + keys2[VK_RMENU] = 0; + keys2[VK_MENU] = 0; + n = ToAscii((UINT)wParam, scanCode, keys2, &c, flags); + } - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - wParam | ((c & 0xff) << 8) | - ((n & 0xff) << 16) | 0x06000000, - lParam); - WPARAM charAndVirtKey = 0; - bool clearDeadKey = false; - switch (n) { - default: - // key is a dead key + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + wParam | ((c & 0xff) << 8) | + ((n & 0xff) << 16) | 0x06000000, + lParam); + WPARAM charAndVirtKey = 0; + bool clearDeadKey = false; + switch (n) { + default: + // key is a dead key - if (lParam & 0x80000000u) - // This handles the obscure situation where a key has been - // pressed which is both a dead key and a normal character - // depending on which modifiers have been pressed. We - // break here to prevent it from being considered a dead - // key. - break; + if (lParam & 0x80000000u) + // This handles the obscure situation where a key has been + // pressed which is both a dead key and a normal character + // depending on which modifiers have been pressed. We + // break here to prevent it from being considered a dead + // key. + break; - g_deadVirtKey = wParam; - g_deadLParam = lParam; - for (size_t i = 0; i < sizeof(keys) / sizeof(keys[0]); ++i) { - g_deadKeyState[i] = keys[i]; - } - break; + g_deadVirtKey = wParam; + g_deadLParam = lParam; + for (size_t i = 0; i < sizeof(keys) / sizeof(keys[0]); ++i) { + g_deadKeyState[i] = keys[i]; + } + break; - case 0: - // key doesn't map to a character. this can happen if - // non-character keys are pressed after a dead key. - charAndVirtKey = makeKeyMsg((UINT)wParam, (char)0, noAltGr); - break; + case 0: + // key doesn't map to a character. this can happen if + // non-character keys are pressed after a dead key. + charAndVirtKey = makeKeyMsg((UINT)wParam, (char)0, noAltGr); + break; - case 1: - // key maps to a character composed with dead key - charAndVirtKey = makeKeyMsg((UINT)wParam, (char)LOBYTE(c), noAltGr); - clearDeadKey = true; - break; + case 1: + // key maps to a character composed with dead key + charAndVirtKey = makeKeyMsg((UINT)wParam, (char)LOBYTE(c), noAltGr); + clearDeadKey = true; + break; - case 2: { - // previous dead key not composed. send a fake key press - // and release for the dead key to our window. - WPARAM deadCharAndVirtKey = - makeKeyMsg((UINT)g_deadVirtKey, (char)LOBYTE(c), noAltGr); - PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, - deadCharAndVirtKey, g_deadLParam & 0x7fffffffu); - PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, - deadCharAndVirtKey, g_deadLParam | 0x80000000u); + case 2: { + // previous dead key not composed. send a fake key press + // and release for the dead key to our window. + WPARAM deadCharAndVirtKey = + makeKeyMsg((UINT)g_deadVirtKey, (char)LOBYTE(c), noAltGr); + PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, + deadCharAndVirtKey, g_deadLParam & 0x7fffffffu); + PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, + deadCharAndVirtKey, g_deadLParam | 0x80000000u); - // use uncomposed character - charAndVirtKey = makeKeyMsg((UINT)wParam, (char)HIBYTE(c), noAltGr); - clearDeadKey = true; - break; - } - } + // use uncomposed character + charAndVirtKey = makeKeyMsg((UINT)wParam, (char)HIBYTE(c), noAltGr); + clearDeadKey = true; + break; + } + } - // put back the dead key, if any, for the application to use - if (g_deadVirtKey != 0) { - ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, - g_deadKeyState, &c, flags); - } + // put back the dead key, if any, for the application to use + if (g_deadVirtKey != 0) { + ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16, + g_deadKeyState, &c, flags); + } - // clear out old dead key state - if (clearDeadKey) { - g_deadVirtKey = 0; - g_deadLParam = 0; - } + // clear out old dead key state + if (clearDeadKey) { + g_deadVirtKey = 0; + g_deadLParam = 0; + } - // forward message to our window. do this whether or not we're - // forwarding events to clients because this'll keep our thread's - // key state table up to date. that's important for querying - // the scroll lock toggle state. - // XXX -- with hot keys for actions we may only need to do this when - // forwarding. - if (charAndVirtKey != 0) { - PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, - charAndVirtKey | 0x07000000, lParam); - PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, charAndVirtKey, lParam); - } + // forward message to our window. do this whether or not we're + // forwarding events to clients because this'll keep our thread's + // key state table up to date. that's important for querying + // the scroll lock toggle state. + // XXX -- with hot keys for actions we may only need to do this when + // forwarding. + if (charAndVirtKey != 0) { + PostThreadMessage(g_threadID, SYNERGY_MSG_DEBUG, + charAndVirtKey | 0x07000000, lParam); + PostThreadMessage(g_threadID, SYNERGY_MSG_KEY, charAndVirtKey, lParam); + } - if (g_mode == kHOOK_RELAY_EVENTS) { - // let certain keys pass through - switch (wParam) { - case VK_CAPITAL: - case VK_NUMLOCK: - case VK_SCROLL: - // pass event on. we want to let these through to - // the window proc because otherwise the keyboard - // lights may not stay synchronized. - break; + if (g_mode == kHOOK_RELAY_EVENTS) { + // let certain keys pass through + switch (wParam) { + case VK_CAPITAL: + case VK_NUMLOCK: + case VK_SCROLL: + // pass event on. we want to let these through to + // the window proc because otherwise the keyboard + // lights may not stay synchronized. + break; - case VK_HANGUL: - // pass these modifiers if using a low level hook, discard - // them if not. - if (g_hookThread == 0) { - return true; - } - break; + case VK_HANGUL: + // pass these modifiers if using a low level hook, discard + // them if not. + if (g_hookThread == 0) { + return true; + } + break; - default: - // discard - return true; - } - } + default: + // discard + return true; + } + } - return false; + return false; } static bool keyboardHookHandler(WPARAM wParam, LPARAM lParam) { - return doKeyboardHookHandler(wParam, lParam); + return doKeyboardHookHandler(wParam, lParam); } #endif @@ -457,109 +457,109 @@ static bool doMouseHookHandler(WPARAM wParam, SInt32 x, SInt32 y, SInt32 data) { - switch (wParam) { - case WM_LBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_XBUTTONDOWN: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_XBUTTONDBLCLK: - case WM_LBUTTONUP: - case WM_MBUTTONUP: - case WM_RBUTTONUP: - case WM_XBUTTONUP: - case WM_NCLBUTTONDOWN: - case WM_NCMBUTTONDOWN: - case WM_NCRBUTTONDOWN: - case WM_NCXBUTTONDOWN: - case WM_NCLBUTTONDBLCLK: - case WM_NCMBUTTONDBLCLK: - case WM_NCRBUTTONDBLCLK: - case WM_NCXBUTTONDBLCLK: - case WM_NCLBUTTONUP: - case WM_NCMBUTTONUP: - case WM_NCRBUTTONUP: - case WM_NCXBUTTONUP: - // always relay the event. eat it if relaying. - PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_BUTTON, wParam, data); - return (g_mode == kHOOK_RELAY_EVENTS); + switch (wParam) { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_XBUTTONDOWN: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_XBUTTONDBLCLK: + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + case WM_XBUTTONUP: + case WM_NCLBUTTONDOWN: + case WM_NCMBUTTONDOWN: + case WM_NCRBUTTONDOWN: + case WM_NCXBUTTONDOWN: + case WM_NCLBUTTONDBLCLK: + case WM_NCMBUTTONDBLCLK: + case WM_NCRBUTTONDBLCLK: + case WM_NCXBUTTONDBLCLK: + case WM_NCLBUTTONUP: + case WM_NCMBUTTONUP: + case WM_NCRBUTTONUP: + case WM_NCXBUTTONUP: + // always relay the event. eat it if relaying. + PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_BUTTON, wParam, data); + return (g_mode == kHOOK_RELAY_EVENTS); - case WM_MOUSEWHEEL: - if (g_mode == kHOOK_RELAY_EVENTS) { - // relay event - PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_WHEEL, data, 0); - } - return (g_mode == kHOOK_RELAY_EVENTS); + case WM_MOUSEWHEEL: + if (g_mode == kHOOK_RELAY_EVENTS) { + // relay event + PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_WHEEL, data, 0); + } + return (g_mode == kHOOK_RELAY_EVENTS); - case WM_NCMOUSEMOVE: - case WM_MOUSEMOVE: - if (g_mode == kHOOK_RELAY_EVENTS) { - // relay and eat event - PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_MOVE, x, y); - return true; - } - else if (g_mode == kHOOK_WATCH_JUMP_ZONE) { - // low level hooks can report bogus mouse positions that are - // outside of the screen. jeez. naturally we end up getting - // fake motion in the other direction to get the position back - // on the screen, which plays havoc with switch on double tap. - // Server deals with that. we'll clamp positions onto the - // screen. also, if we discard events for positions outside - // of the screen then the mouse appears to get a bit jerky - // near the edge. we can either accept that or pass the bogus - // events. we'll try passing the events. - bool bogus = false; - if (x < g_xScreen) { - x = g_xScreen; - bogus = true; - } - else if (x >= g_xScreen + g_wScreen) { - x = g_xScreen + g_wScreen - 1; - bogus = true; - } - if (y < g_yScreen) { - y = g_yScreen; - bogus = true; - } - else if (y >= g_yScreen + g_hScreen) { - y = g_yScreen + g_hScreen - 1; - bogus = true; - } + case WM_NCMOUSEMOVE: + case WM_MOUSEMOVE: + if (g_mode == kHOOK_RELAY_EVENTS) { + // relay and eat event + PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_MOVE, x, y); + return true; + } + else if (g_mode == kHOOK_WATCH_JUMP_ZONE) { + // low level hooks can report bogus mouse positions that are + // outside of the screen. jeez. naturally we end up getting + // fake motion in the other direction to get the position back + // on the screen, which plays havoc with switch on double tap. + // Server deals with that. we'll clamp positions onto the + // screen. also, if we discard events for positions outside + // of the screen then the mouse appears to get a bit jerky + // near the edge. we can either accept that or pass the bogus + // events. we'll try passing the events. + bool bogus = false; + if (x < g_xScreen) { + x = g_xScreen; + bogus = true; + } + else if (x >= g_xScreen + g_wScreen) { + x = g_xScreen + g_wScreen - 1; + bogus = true; + } + if (y < g_yScreen) { + y = g_yScreen; + bogus = true; + } + else if (y >= g_yScreen + g_hScreen) { + y = g_yScreen + g_hScreen - 1; + bogus = true; + } - // check for mouse inside jump zone - bool inside = false; - if (!inside && (g_zoneSides & kLeftMask) != 0) { - inside = (x < g_xScreen + g_zoneSize); - } - if (!inside && (g_zoneSides & kRightMask) != 0) { - inside = (x >= g_xScreen + g_wScreen - g_zoneSize); - } - if (!inside && (g_zoneSides & kTopMask) != 0) { - inside = (y < g_yScreen + g_zoneSize); - } - if (!inside && (g_zoneSides & kBottomMask) != 0) { - inside = (y >= g_yScreen + g_hScreen - g_zoneSize); - } + // check for mouse inside jump zone + bool inside = false; + if (!inside && (g_zoneSides & kLeftMask) != 0) { + inside = (x < g_xScreen + g_zoneSize); + } + if (!inside && (g_zoneSides & kRightMask) != 0) { + inside = (x >= g_xScreen + g_wScreen - g_zoneSize); + } + if (!inside && (g_zoneSides & kTopMask) != 0) { + inside = (y < g_yScreen + g_zoneSize); + } + if (!inside && (g_zoneSides & kBottomMask) != 0) { + inside = (y >= g_yScreen + g_hScreen - g_zoneSize); + } - // relay the event - PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_MOVE, x, y); + // relay the event + PostThreadMessage(g_threadID, SYNERGY_MSG_MOUSE_MOVE, x, y); - // if inside and not bogus then eat the event - return inside && !bogus; - } - } + // if inside and not bogus then eat the event + return inside && !bogus; + } + } - // pass the event - return false; + // pass the event + return false; } static bool mouseHookHandler(WPARAM wParam, SInt32 x, SInt32 y, SInt32 data) { - return doMouseHookHandler(wParam, x, y, data); + return doMouseHookHandler(wParam, x, y, data); } #if !NO_GRAB_KEYBOARD @@ -567,14 +567,14 @@ static LRESULT CALLBACK keyboardHook(int code, WPARAM wParam, LPARAM lParam) { - if (code >= 0) { - // handle the message - if (keyboardHookHandler(wParam, lParam)) { - return 1; - } - } + if (code >= 0) { + // handle the message + if (keyboardHookHandler(wParam, lParam)) { + return 1; + } + } - return CallNextHookEx(g_keyboard, code, wParam, lParam); + return CallNextHookEx(g_keyboard, code, wParam, lParam); } #endif @@ -582,77 +582,77 @@ static LRESULT CALLBACK mouseHook(int code, WPARAM wParam, LPARAM lParam) { - if (code >= 0) { - // decode message - const MOUSEHOOKSTRUCT* info = (const MOUSEHOOKSTRUCT*)lParam; - SInt32 x = (SInt32)info->pt.x; - SInt32 y = (SInt32)info->pt.y; - SInt32 w = 0; - if (wParam == WM_MOUSEWHEEL) { - // win2k and other systems supporting WM_MOUSEWHEEL in - // the mouse hook are gratuitously different (and poorly - // documented). if a low-level mouse hook is in place - // it should capture these events so we'll never see - // them. - switch (g_wheelSupport) { - case kWheelModern: - w = static_cast(LOWORD(info->dwExtraInfo)); - break; + if (code >= 0) { + // decode message + const MOUSEHOOKSTRUCT* info = (const MOUSEHOOKSTRUCT*)lParam; + SInt32 x = (SInt32)info->pt.x; + SInt32 y = (SInt32)info->pt.y; + SInt32 w = 0; + if (wParam == WM_MOUSEWHEEL) { + // win2k and other systems supporting WM_MOUSEWHEEL in + // the mouse hook are gratuitously different (and poorly + // documented). if a low-level mouse hook is in place + // it should capture these events so we'll never see + // them. + switch (g_wheelSupport) { + case kWheelModern: + w = static_cast(LOWORD(info->dwExtraInfo)); + break; - case kWheelWin2000: { - const MOUSEHOOKSTRUCTWin2000* info2k = - (const MOUSEHOOKSTRUCTWin2000*)lParam; - w = static_cast(HIWORD(info2k->mouseData)); - break; - } + case kWheelWin2000: { + const MOUSEHOOKSTRUCTWin2000* info2k = + (const MOUSEHOOKSTRUCTWin2000*)lParam; + w = static_cast(HIWORD(info2k->mouseData)); + break; + } - default: - break; - } - } + default: + break; + } + } - // handle the message. note that we don't handle X buttons - // here. that's okay because they're only supported on - // win2k and winxp and up and on those platforms we'll get - // get the mouse events through the low level hook. - if (mouseHookHandler(wParam, x, y, w)) { - return 1; - } - } + // handle the message. note that we don't handle X buttons + // here. that's okay because they're only supported on + // win2k and winxp and up and on those platforms we'll get + // get the mouse events through the low level hook. + if (mouseHookHandler(wParam, x, y, w)) { + return 1; + } + } - return CallNextHookEx(g_mouse, code, wParam, lParam); + return CallNextHookEx(g_mouse, code, wParam, lParam); } static LRESULT CALLBACK getMessageHook(int code, WPARAM wParam, LPARAM lParam) { - if (code >= 0) { - if (g_screenSaver) { - MSG* msg = reinterpret_cast(lParam); - if (msg->message == WM_SYSCOMMAND && - msg->wParam == SC_SCREENSAVE) { - // broadcast screen saver started message - PostThreadMessage(g_threadID, - SYNERGY_MSG_SCREEN_SAVER, TRUE, 0); - } - } - if (g_mode == kHOOK_RELAY_EVENTS) { - MSG* msg = reinterpret_cast(lParam); - if (g_wheelSupport == kWheelOld && msg->message == g_wmMouseWheel) { - // post message to our window - PostThreadMessage(g_threadID, - SYNERGY_MSG_MOUSE_WHEEL, - static_cast(msg->wParam & 0xffffu), 0); + if (code >= 0) { + if (g_screenSaver) { + MSG* msg = reinterpret_cast(lParam); + if (msg->message == WM_SYSCOMMAND && + msg->wParam == SC_SCREENSAVE) { + // broadcast screen saver started message + PostThreadMessage(g_threadID, + SYNERGY_MSG_SCREEN_SAVER, TRUE, 0); + } + } + if (g_mode == kHOOK_RELAY_EVENTS) { + MSG* msg = reinterpret_cast(lParam); + if (g_wheelSupport == kWheelOld && msg->message == g_wmMouseWheel) { + // post message to our window + PostThreadMessage(g_threadID, + SYNERGY_MSG_MOUSE_WHEEL, + static_cast(msg->wParam & 0xffffu), 0); - // zero out the delta in the message so it's (hopefully) - // ignored - msg->wParam = 0; - } - } - } + // zero out the delta in the message so it's (hopefully) + // ignored + msg->wParam = 0; + } + } + } - return CallNextHookEx(g_getMessage, code, wParam, lParam); + return CallNextHookEx(g_getMessage, code, wParam, lParam); } #if (_WIN32_WINNT >= 0x0400) && defined(_MSC_VER) && !NO_LOWLEVEL_HOOKS @@ -668,32 +668,32 @@ static LRESULT CALLBACK keyboardLLHook(int code, WPARAM wParam, LPARAM lParam) { - if (code >= 0) { - // decode the message - KBDLLHOOKSTRUCT* info = reinterpret_cast(lParam); - WPARAM wParam = info->vkCode; - LPARAM lParam = 1; // repeat code - lParam |= (info->scanCode << 16); // scan code - if (info->flags & LLKHF_EXTENDED) { - lParam |= (1lu << 24); // extended key - } - if (info->flags & LLKHF_ALTDOWN) { - lParam |= (1lu << 29); // context code - } - if (info->flags & LLKHF_UP) { - lParam |= (1lu << 31); // transition - } - // FIXME -- bit 30 should be set if key was already down but - // we don't know that info. as a result we'll never generate - // key repeat events. + if (code >= 0) { + // decode the message + KBDLLHOOKSTRUCT* info = reinterpret_cast(lParam); + WPARAM wParam = info->vkCode; + LPARAM lParam = 1; // repeat code + lParam |= (info->scanCode << 16); // scan code + if (info->flags & LLKHF_EXTENDED) { + lParam |= (1lu << 24); // extended key + } + if (info->flags & LLKHF_ALTDOWN) { + lParam |= (1lu << 29); // context code + } + if (info->flags & LLKHF_UP) { + lParam |= (1lu << 31); // transition + } + // FIXME -- bit 30 should be set if key was already down but + // we don't know that info. as a result we'll never generate + // key repeat events. - // handle the message - if (keyboardHookHandler(wParam, lParam)) { - return 1; - } - } + // handle the message + if (keyboardHookHandler(wParam, lParam)) { + return 1; + } + } - return CallNextHookEx(g_keyboardLL, code, wParam, lParam); + return CallNextHookEx(g_keyboardLL, code, wParam, lParam); } #endif @@ -706,20 +706,20 @@ static LRESULT CALLBACK mouseLLHook(int code, WPARAM wParam, LPARAM lParam) { - if (code >= 0) { - // decode the message - MSLLHOOKSTRUCT* info = reinterpret_cast(lParam); - SInt32 x = static_cast(info->pt.x); - SInt32 y = static_cast(info->pt.y); - SInt32 w = static_cast(HIWORD(info->mouseData)); + if (code >= 0) { + // decode the message + MSLLHOOKSTRUCT* info = reinterpret_cast(lParam); + SInt32 x = static_cast(info->pt.x); + SInt32 y = static_cast(info->pt.y); + SInt32 w = static_cast(HIWORD(info->mouseData)); - // handle the message - if (mouseHookHandler(wParam, x, y, w)) { - return 1; - } - } + // handle the message + if (mouseHookHandler(wParam, x, y, w)) { + return 1; + } + } - return CallNextHookEx(g_mouseLL, code, wParam, lParam); + return CallNextHookEx(g_mouseLL, code, wParam, lParam); } #endif @@ -728,45 +728,45 @@ static EWheelSupport getWheelSupport() { - // see if modern wheel is present - if (GetSystemMetrics(SM_MOUSEWHEELPRESENT)) { - OSVERSIONINFOEX osvi; - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - osvi.dwPlatformId = VER_PLATFORM_WIN32_NT; - osvi.dwMajorVersion = 5; - osvi.dwMinorVersion = 0; - ULONGLONG condMask = 0; - VER_SET_CONDITION (condMask, VER_MAJORVERSION, VER_EQUAL); - VER_SET_CONDITION (condMask, VER_MINORVERSION, VER_EQUAL); - VER_SET_CONDITION (condMask, VER_PLATFORMID, VER_EQUAL); - if (VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | - VER_PLATFORMID, condMask)) { - return kWheelWin2000; - } - return kWheelModern; - } + // see if modern wheel is present + if (GetSystemMetrics(SM_MOUSEWHEELPRESENT)) { + OSVERSIONINFOEX osvi; + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + osvi.dwPlatformId = VER_PLATFORM_WIN32_NT; + osvi.dwMajorVersion = 5; + osvi.dwMinorVersion = 0; + ULONGLONG condMask = 0; + VER_SET_CONDITION (condMask, VER_MAJORVERSION, VER_EQUAL); + VER_SET_CONDITION (condMask, VER_MINORVERSION, VER_EQUAL); + VER_SET_CONDITION (condMask, VER_PLATFORMID, VER_EQUAL); + if (VerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | + VER_PLATFORMID, condMask)) { + return kWheelWin2000; + } + return kWheelModern; + } - // not modern. see if we've got old-style support. + // not modern. see if we've got old-style support. #if defined(MSH_WHEELSUPPORT) - UINT wheelSupportMsg = RegisterWindowMessage(MSH_WHEELSUPPORT); - HWND wheelSupportWindow = FindWindow(MSH_WHEELMODULE_CLASS, - MSH_WHEELMODULE_TITLE); - if (wheelSupportWindow != NULL && wheelSupportMsg != 0) { - if (SendMessage(wheelSupportWindow, wheelSupportMsg, 0, 0) != 0) { - g_wmMouseWheel = RegisterWindowMessage(MSH_MOUSEWHEEL); - if (g_wmMouseWheel != 0) { - return kWheelOld; - } - } - } + UINT wheelSupportMsg = RegisterWindowMessage(MSH_WHEELSUPPORT); + HWND wheelSupportWindow = FindWindow(MSH_WHEELMODULE_CLASS, + MSH_WHEELMODULE_TITLE); + if (wheelSupportWindow != NULL && wheelSupportMsg != 0) { + if (SendMessage(wheelSupportWindow, wheelSupportMsg, 0, 0) != 0) { + g_wmMouseWheel = RegisterWindowMessage(MSH_MOUSEWHEEL); + if (g_wmMouseWheel != 0) { + return kWheelOld; + } + } + } #endif - // assume modern. we don't do anything special in this case - // except respond to WM_MOUSEWHEEL messages. GetSystemMetrics() - // can apparently return FALSE even if a mouse wheel is present - // though i'm not sure exactly when it does that (WinME returns - // FALSE for my logitech USB trackball). - return kWheelModern; + // assume modern. we don't do anything special in this case + // except respond to WM_MOUSEWHEEL messages. GetSystemMetrics() + // can apparently return FALSE even if a mouse wheel is present + // though i'm not sure exactly when it does that (WinME returns + // FALSE for my logitech USB trackball). + return kWheelModern; } @@ -777,22 +777,22 @@ getWheelSupport() BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID) { - if (reason == DLL_PROCESS_ATTACH) { - DisableThreadLibraryCalls(instance); - if (g_processID == 0) { - g_hinstance = instance; - g_processID = GetCurrentProcessId(); - } - } - else if (reason == DLL_PROCESS_DETACH) { - if (g_processID == GetCurrentProcessId()) { - uninstall(); - uninstallScreenSaver(); - g_processID = 0; - g_hinstance = NULL; - } - } - return TRUE; + if (reason == DLL_PROCESS_ATTACH) { + DisableThreadLibraryCalls(instance); + if (g_processID == 0) { + g_hinstance = instance; + g_processID = GetCurrentProcessId(); + } + } + else if (reason == DLL_PROCESS_DETACH) { + if (g_processID == GetCurrentProcessId()) { + uninstall(); + uninstallScreenSaver(); + g_processID = 0; + g_hinstance = NULL; + } + } + return TRUE; } extern "C" { @@ -800,7 +800,7 @@ extern "C" { // VS2005 hack to not link with the CRT #if _MSC_VER >= 1400 BOOL WINAPI _DllMainCRTStartup( - HINSTANCE instance, DWORD reason, LPVOID lpreserved) + HINSTANCE instance, DWORD reason, LPVOID lpreserved) { return DllMain(instance, reason, lpreserved); } @@ -873,254 +873,254 @@ void * __cdecl memcpy(void * _Dst, const void * _Src, size_t _MaxCount) int init(DWORD threadID) { - assert(g_hinstance != NULL); + assert(g_hinstance != NULL); - // try to open process that last called init() to see if it's - // still running or if it died without cleaning up. - if (g_processID != 0 && g_processID != GetCurrentProcessId()) { - HANDLE process = OpenProcess(STANDARD_RIGHTS_REQUIRED, - FALSE, g_processID); - if (process != NULL) { - // old process (probably) still exists so refuse to - // reinitialize this DLL (and thus steal it from the - // old process). - int result = CloseHandle(process); - if (result == false) { - return 0; - } - } + // try to open process that last called init() to see if it's + // still running or if it died without cleaning up. + if (g_processID != 0 && g_processID != GetCurrentProcessId()) { + HANDLE process = OpenProcess(STANDARD_RIGHTS_REQUIRED, + FALSE, g_processID); + if (process != NULL) { + // old process (probably) still exists so refuse to + // reinitialize this DLL (and thus steal it from the + // old process). + int result = CloseHandle(process); + if (result == false) { + return 0; + } + } - // clean up after old process. the system should've already - // removed the hooks so we just need to reset our state. - g_hinstance = GetModuleHandle(_T("synwinhk")); - g_processID = GetCurrentProcessId(); - g_wheelSupport = kWheelNone; - g_threadID = 0; - g_keyboard = NULL; - g_mouse = NULL; - g_getMessage = NULL; - g_keyboardLL = NULL; - g_mouseLL = NULL; - g_screenSaver = false; - } + // clean up after old process. the system should've already + // removed the hooks so we just need to reset our state. + g_hinstance = GetModuleHandle(_T("synwinhk")); + g_processID = GetCurrentProcessId(); + g_wheelSupport = kWheelNone; + g_threadID = 0; + g_keyboard = NULL; + g_mouse = NULL; + g_getMessage = NULL; + g_keyboardLL = NULL; + g_mouseLL = NULL; + g_screenSaver = false; + } - // save thread id. we'll post messages to this thread's - // message queue. - g_threadID = threadID; + // save thread id. we'll post messages to this thread's + // message queue. + g_threadID = threadID; - // set defaults - g_mode = kHOOK_DISABLE; - g_zoneSides = 0; - g_zoneSize = 0; - g_xScreen = 0; - g_yScreen = 0; - g_wScreen = 0; - g_hScreen = 0; + // set defaults + g_mode = kHOOK_DISABLE; + g_zoneSides = 0; + g_zoneSize = 0; + g_xScreen = 0; + g_yScreen = 0; + g_wScreen = 0; + g_hScreen = 0; - return 1; + return 1; } int cleanup(void) { - assert(g_hinstance != NULL); + assert(g_hinstance != NULL); - if (g_processID == GetCurrentProcessId()) { - g_threadID = 0; - } + if (g_processID == GetCurrentProcessId()) { + g_threadID = 0; + } - return 1; + return 1; } EHookResult install() { - assert(g_hinstance != NULL); - assert(g_keyboard == NULL); - assert(g_mouse == NULL); - assert(g_getMessage == NULL || g_screenSaver); + assert(g_hinstance != NULL); + assert(g_keyboard == NULL); + assert(g_mouse == NULL); + assert(g_getMessage == NULL || g_screenSaver); - // must be initialized - if (g_threadID == 0) { - return kHOOK_FAILED; - } + // must be initialized + if (g_threadID == 0) { + return kHOOK_FAILED; + } - // discard old dead keys - g_deadVirtKey = 0; - g_deadLParam = 0; + // discard old dead keys + g_deadVirtKey = 0; + g_deadLParam = 0; - // reset fake input flag - g_fakeInput = false; + // reset fake input flag + g_fakeInput = false; - // check for mouse wheel support - g_wheelSupport = getWheelSupport(); + // check for mouse wheel support + g_wheelSupport = getWheelSupport(); - // install GetMessage hook (unless already installed) - if (g_wheelSupport == kWheelOld && g_getMessage == NULL) { - g_getMessage = SetWindowsHookEx(WH_GETMESSAGE, - &getMessageHook, - g_hinstance, - 0); - } + // install GetMessage hook (unless already installed) + if (g_wheelSupport == kWheelOld && g_getMessage == NULL) { + g_getMessage = SetWindowsHookEx(WH_GETMESSAGE, + &getMessageHook, + g_hinstance, + 0); + } - // install low-level hooks. we require that they both get installed. + // install low-level hooks. we require that they both get installed. #if (_WIN32_WINNT >= 0x0400) && defined(_MSC_VER) && !NO_LOWLEVEL_HOOKS - g_mouseLL = SetWindowsHookEx(WH_MOUSE_LL, - &mouseLLHook, - g_hinstance, - 0); + g_mouseLL = SetWindowsHookEx(WH_MOUSE_LL, + &mouseLLHook, + g_hinstance, + 0); #if !NO_GRAB_KEYBOARD - g_keyboardLL = SetWindowsHookEx(WH_KEYBOARD_LL, - &keyboardLLHook, - g_hinstance, - 0); - if (g_mouseLL == NULL || g_keyboardLL == NULL) { - if (g_keyboardLL != NULL) { - UnhookWindowsHookEx(g_keyboardLL); - g_keyboardLL = NULL; - } - if (g_mouseLL != NULL) { - UnhookWindowsHookEx(g_mouseLL); - g_mouseLL = NULL; - } - } + g_keyboardLL = SetWindowsHookEx(WH_KEYBOARD_LL, + &keyboardLLHook, + g_hinstance, + 0); + if (g_mouseLL == NULL || g_keyboardLL == NULL) { + if (g_keyboardLL != NULL) { + UnhookWindowsHookEx(g_keyboardLL); + g_keyboardLL = NULL; + } + if (g_mouseLL != NULL) { + UnhookWindowsHookEx(g_mouseLL); + g_mouseLL = NULL; + } + } #endif #endif - // install regular hooks - if (g_mouseLL == NULL) { - g_mouse = SetWindowsHookEx(WH_MOUSE, - &mouseHook, - g_hinstance, - 0); - } + // install regular hooks + if (g_mouseLL == NULL) { + g_mouse = SetWindowsHookEx(WH_MOUSE, + &mouseHook, + g_hinstance, + 0); + } #if !NO_GRAB_KEYBOARD - if (g_keyboardLL == NULL) { - g_keyboard = SetWindowsHookEx(WH_KEYBOARD, - &keyboardHook, - g_hinstance, - 0); - } + if (g_keyboardLL == NULL) { + g_keyboard = SetWindowsHookEx(WH_KEYBOARD, + &keyboardHook, + g_hinstance, + 0); + } #endif - // check that we got all the hooks we wanted - if ((g_getMessage == NULL && g_wheelSupport == kWheelOld) || + // check that we got all the hooks we wanted + if ((g_getMessage == NULL && g_wheelSupport == kWheelOld) || #if !NO_GRAB_KEYBOARD - (g_keyboardLL == NULL && g_keyboard == NULL) || + (g_keyboardLL == NULL && g_keyboard == NULL) || #endif - (g_mouseLL == NULL && g_mouse == NULL)) { - uninstall(); - return kHOOK_FAILED; - } + (g_mouseLL == NULL && g_mouse == NULL)) { + uninstall(); + return kHOOK_FAILED; + } - if (g_keyboardLL != NULL || g_mouseLL != NULL) { - g_hookThread = GetCurrentThreadId(); - return kHOOK_OKAY_LL; - } + if (g_keyboardLL != NULL || g_mouseLL != NULL) { + g_hookThread = GetCurrentThreadId(); + return kHOOK_OKAY_LL; + } - return kHOOK_OKAY; + return kHOOK_OKAY; } int uninstall(void) { - assert(g_hinstance != NULL); + assert(g_hinstance != NULL); - // discard old dead keys - g_deadVirtKey = 0; - g_deadLParam = 0; + // discard old dead keys + g_deadVirtKey = 0; + g_deadLParam = 0; - // uninstall hooks - if (g_keyboardLL != NULL) { - UnhookWindowsHookEx(g_keyboardLL); - g_keyboardLL = NULL; - } - if (g_mouseLL != NULL) { - UnhookWindowsHookEx(g_mouseLL); - g_mouseLL = NULL; - } - if (g_keyboard != NULL) { - UnhookWindowsHookEx(g_keyboard); - g_keyboard = NULL; - } - if (g_mouse != NULL) { - UnhookWindowsHookEx(g_mouse); - g_mouse = NULL; - } - if (g_getMessage != NULL && !g_screenSaver) { - UnhookWindowsHookEx(g_getMessage); - g_getMessage = NULL; - } - g_wheelSupport = kWheelNone; + // uninstall hooks + if (g_keyboardLL != NULL) { + UnhookWindowsHookEx(g_keyboardLL); + g_keyboardLL = NULL; + } + if (g_mouseLL != NULL) { + UnhookWindowsHookEx(g_mouseLL); + g_mouseLL = NULL; + } + if (g_keyboard != NULL) { + UnhookWindowsHookEx(g_keyboard); + g_keyboard = NULL; + } + if (g_mouse != NULL) { + UnhookWindowsHookEx(g_mouse); + g_mouse = NULL; + } + if (g_getMessage != NULL && !g_screenSaver) { + UnhookWindowsHookEx(g_getMessage); + g_getMessage = NULL; + } + g_wheelSupport = kWheelNone; - return 1; + return 1; } int installScreenSaver(void) { - assert(g_hinstance != NULL); + assert(g_hinstance != NULL); - // must be initialized - if (g_threadID == 0) { - return 0; - } + // must be initialized + if (g_threadID == 0) { + return 0; + } - // generate screen saver messages - g_screenSaver = true; + // generate screen saver messages + g_screenSaver = true; - // install hook unless it's already installed - if (g_getMessage == NULL) { - g_getMessage = SetWindowsHookEx(WH_GETMESSAGE, - &getMessageHook, - g_hinstance, - 0); - } + // install hook unless it's already installed + if (g_getMessage == NULL) { + g_getMessage = SetWindowsHookEx(WH_GETMESSAGE, + &getMessageHook, + g_hinstance, + 0); + } - return (g_getMessage != NULL) ? 1 : 0; + return (g_getMessage != NULL) ? 1 : 0; } int uninstallScreenSaver(void) { - assert(g_hinstance != NULL); + assert(g_hinstance != NULL); - // uninstall hook unless the mouse wheel hook is installed - if (g_getMessage != NULL && g_wheelSupport != kWheelOld) { - UnhookWindowsHookEx(g_getMessage); - g_getMessage = NULL; - } + // uninstall hook unless the mouse wheel hook is installed + if (g_getMessage != NULL && g_wheelSupport != kWheelOld) { + UnhookWindowsHookEx(g_getMessage); + g_getMessage = NULL; + } - // screen saver hook is no longer installed - g_screenSaver = false; + // screen saver hook is no longer installed + g_screenSaver = false; - return 1; + return 1; } void setSides(UInt32 sides) { - g_zoneSides = sides; + g_zoneSides = sides; } void setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, SInt32 jumpZoneSize) { - g_zoneSize = jumpZoneSize; - g_xScreen = x; - g_yScreen = y; - g_wScreen = w; - g_hScreen = h; + g_zoneSize = jumpZoneSize; + g_xScreen = x; + g_yScreen = y; + g_wScreen = w; + g_hScreen = h; } void setMode(EHookMode mode) { - if (mode == g_mode) { - // no change - return; - } - g_mode = mode; + if (mode == g_mode) { + // no change + return; + } + g_mode = mode; } } diff --git a/src/lib/synwinhk/synwinhk.h b/src/lib/synwinhk/synwinhk.h index b369520c..fe279248 100644 --- a/src/lib/synwinhk/synwinhk.h +++ b/src/lib/synwinhk/synwinhk.h @@ -37,55 +37,55 @@ #define CSYNERGYHOOK_API __declspec(dllimport) #endif -#define SYNERGY_MSG_MARK WM_APP + 0x0011 // mark id; -#define SYNERGY_MSG_KEY WM_APP + 0x0012 // vk code; key data -#define SYNERGY_MSG_MOUSE_BUTTON WM_APP + 0x0013 // button msg; -#define SYNERGY_MSG_MOUSE_WHEEL WM_APP + 0x0014 // delta; -#define SYNERGY_MSG_MOUSE_MOVE WM_APP + 0x0015 // x; y -#define SYNERGY_MSG_POST_WARP WM_APP + 0x0016 // ; -#define SYNERGY_MSG_PRE_WARP WM_APP + 0x0017 // x; y -#define SYNERGY_MSG_SCREEN_SAVER WM_APP + 0x0018 // activated; -#define SYNERGY_MSG_DEBUG WM_APP + 0x0019 // data, data -#define SYNERGY_MSG_INPUT_FIRST SYNERGY_MSG_KEY -#define SYNERGY_MSG_INPUT_LAST SYNERGY_MSG_PRE_WARP -#define SYNERGY_HOOK_LAST_MSG SYNERGY_MSG_DEBUG +#define SYNERGY_MSG_MARK WM_APP + 0x0011 // mark id; +#define SYNERGY_MSG_KEY WM_APP + 0x0012 // vk code; key data +#define SYNERGY_MSG_MOUSE_BUTTON WM_APP + 0x0013 // button msg; +#define SYNERGY_MSG_MOUSE_WHEEL WM_APP + 0x0014 // delta; +#define SYNERGY_MSG_MOUSE_MOVE WM_APP + 0x0015 // x; y +#define SYNERGY_MSG_POST_WARP WM_APP + 0x0016 // ; +#define SYNERGY_MSG_PRE_WARP WM_APP + 0x0017 // x; y +#define SYNERGY_MSG_SCREEN_SAVER WM_APP + 0x0018 // activated; +#define SYNERGY_MSG_DEBUG WM_APP + 0x0019 // data, data +#define SYNERGY_MSG_INPUT_FIRST SYNERGY_MSG_KEY +#define SYNERGY_MSG_INPUT_LAST SYNERGY_MSG_PRE_WARP +#define SYNERGY_HOOK_LAST_MSG SYNERGY_MSG_DEBUG -#define SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY VK_CANCEL -#define SYNERGY_HOOK_FAKE_INPUT_SCANCODE 0 +#define SYNERGY_HOOK_FAKE_INPUT_VIRTUAL_KEY VK_CANCEL +#define SYNERGY_HOOK_FAKE_INPUT_SCANCODE 0 extern "C" { enum EHookResult { - kHOOK_FAILED, - kHOOK_OKAY, - kHOOK_OKAY_LL + kHOOK_FAILED, + kHOOK_OKAY, + kHOOK_OKAY_LL }; enum EHookMode { - kHOOK_DISABLE, - kHOOK_WATCH_JUMP_ZONE, - kHOOK_RELAY_EVENTS + kHOOK_DISABLE, + kHOOK_WATCH_JUMP_ZONE, + kHOOK_RELAY_EVENTS }; -typedef int (*InitFunc)(DWORD targetQueueThreadID); -typedef int (*CleanupFunc)(void); -typedef EHookResult (*InstallFunc)(void); -typedef int (*UninstallFunc)(void); -typedef int (*InstallScreenSaverFunc)(void); -typedef int (*UninstallScreenSaverFunc)(void); -typedef void (*SetSidesFunc)(UInt32); -typedef void (*SetZoneFunc)(SInt32, SInt32, SInt32, SInt32, SInt32); -typedef void (*SetModeFunc)(int); +typedef int (*InitFunc)(DWORD targetQueueThreadID); +typedef int (*CleanupFunc)(void); +typedef EHookResult (*InstallFunc)(void); +typedef int (*UninstallFunc)(void); +typedef int (*InstallScreenSaverFunc)(void); +typedef int (*UninstallScreenSaverFunc)(void); +typedef void (*SetSidesFunc)(UInt32); +typedef void (*SetZoneFunc)(SInt32, SInt32, SInt32, SInt32, SInt32); +typedef void (*SetModeFunc)(int); -CSYNERGYHOOK_API int init(DWORD); -CSYNERGYHOOK_API int cleanup(void); -CSYNERGYHOOK_API EHookResult install(void); -CSYNERGYHOOK_API int uninstall(void); -CSYNERGYHOOK_API int installScreenSaver(void); -CSYNERGYHOOK_API int uninstallScreenSaver(void); -CSYNERGYHOOK_API void setSides(UInt32 sides); -CSYNERGYHOOK_API void setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, - SInt32 jumpZoneSize); -CSYNERGYHOOK_API void setMode(EHookMode mode); +CSYNERGYHOOK_API int init(DWORD); +CSYNERGYHOOK_API int cleanup(void); +CSYNERGYHOOK_API EHookResult install(void); +CSYNERGYHOOK_API int uninstall(void); +CSYNERGYHOOK_API int installScreenSaver(void); +CSYNERGYHOOK_API int uninstallScreenSaver(void); +CSYNERGYHOOK_API void setSides(UInt32 sides); +CSYNERGYHOOK_API void setZone(SInt32 x, SInt32 y, SInt32 w, SInt32 h, + SInt32 jumpZoneSize); +CSYNERGYHOOK_API void setMode(EHookMode mode); } diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 8812150a..06f97dc6 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -15,18 +15,18 @@ # along with this program. If not, see . include_directories( - ../../ext/gtest-1.6.0 - ../../ext/gtest-1.6.0/include - ../../ext/gmock-1.6.0 - ../../ext/gmock-1.6.0/include) - + ../../ext/gtest-1.6.0 + ../../ext/gtest-1.6.0/include + ../../ext/gmock-1.6.0 + ../../ext/gmock-1.6.0/include) + add_library(gtest STATIC ../../ext/gtest-1.6.0/src/gtest-all.cc) add_library(gmock STATIC ../../ext/gmock-1.6.0/src/gmock-all.cc) if (UNIX) - # ignore warnings in gtest and gmock - set_target_properties(gtest PROPERTIES COMPILE_FLAGS "-w") - set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w") + # ignore warnings in gtest and gmock + set_target_properties(gtest PROPERTIES COMPILE_FLAGS "-w") + set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w") endif() add_subdirectory(integtests) diff --git a/src/test/global/TestEventQueue.cpp b/src/test/global/TestEventQueue.cpp index a19e7a31..f28c46dd 100644 --- a/src/test/global/TestEventQueue.cpp +++ b/src/test/global/TestEventQueue.cpp @@ -25,29 +25,29 @@ void TestEventQueue::raiseQuitEvent() { - addEvent(Event(Event::kQuit)); + addEvent(Event(Event::kQuit)); } void TestEventQueue::initQuitTimeout(double timeout) { - assert(m_quitTimeoutTimer == nullptr); - m_quitTimeoutTimer = newOneShotTimer(timeout, NULL); - adoptHandler(Event::kTimer, m_quitTimeoutTimer, - new TMethodEventJob( - this, &TestEventQueue::handleQuitTimeout)); + assert(m_quitTimeoutTimer == nullptr); + m_quitTimeoutTimer = newOneShotTimer(timeout, NULL); + adoptHandler(Event::kTimer, m_quitTimeoutTimer, + new TMethodEventJob( + this, &TestEventQueue::handleQuitTimeout)); } void TestEventQueue::cleanupQuitTimeout() { - removeHandler(Event::kTimer, m_quitTimeoutTimer); - delete m_quitTimeoutTimer; - m_quitTimeoutTimer = nullptr; + removeHandler(Event::kTimer, m_quitTimeoutTimer); + delete m_quitTimeoutTimer; + m_quitTimeoutTimer = nullptr; } void TestEventQueue::handleQuitTimeout(const Event&, void* vclient) { - throw std::runtime_error("test event queue timeout"); + throw std::runtime_error("test event queue timeout"); } diff --git a/src/test/global/TestEventQueue.h b/src/test/global/TestEventQueue.h index 4a2fdb70..28a38758 100644 --- a/src/test/global/TestEventQueue.h +++ b/src/test/global/TestEventQueue.h @@ -23,16 +23,16 @@ class EventQueueTimer; class TestEventQueue : public EventQueue { public: - TestEventQueue() : m_quitTimeoutTimer(nullptr) { } + TestEventQueue() : m_quitTimeoutTimer(nullptr) { } - void handleQuitTimeout(const Event&, void* vclient); - void raiseQuitEvent(); - void initQuitTimeout(double timeout); - void cleanupQuitTimeout(); + void handleQuitTimeout(const Event&, void* vclient); + void raiseQuitEvent(); + void initQuitTimeout(double timeout); + void cleanupQuitTimeout(); private: - void timeoutThread(void*); + void timeoutThread(void*); private: - EventQueueTimer* m_quitTimeoutTimer; + EventQueueTimer* m_quitTimeoutTimer; }; diff --git a/src/test/global/gmock.h b/src/test/global/gmock.h index 1c2c7491..5008c9b7 100644 --- a/src/test/global/gmock.h +++ b/src/test/global/gmock.h @@ -22,7 +22,7 @@ // is that everything in the header file following this also has warnings // ignored, so we need to put it in a separate header file. #if __APPLE__ -# pragma GCC system_header +# pragma GCC system_header #endif // gmock includes gtest which has a warning on osx106 (signed/unsigned diff --git a/src/test/global/gtest.h b/src/test/global/gtest.h index 00161c52..3c729eb0 100644 --- a/src/test/global/gtest.h +++ b/src/test/global/gtest.h @@ -22,7 +22,7 @@ // is that everything in the header file following this also has warnings // ignored, so we need to put it in a separate header file. #if __APPLE__ -# pragma GCC system_header +# pragma GCC system_header #endif // gtest has a warning on osx106 (signed/unsigned int compare). diff --git a/src/test/guitests/src/VersionCheckerTests.cpp b/src/test/guitests/src/VersionCheckerTests.cpp index a463ac43..33d92f9f 100644 --- a/src/test/guitests/src/VersionCheckerTests.cpp +++ b/src/test/guitests/src/VersionCheckerTests.cpp @@ -24,24 +24,24 @@ void VersionCheckerTests::compareVersions() { - VersionChecker versionChecker; + VersionChecker versionChecker; - // compare majors - QCOMPARE(versionChecker.compareVersions("1.0.0", "2.0.0"), 1); - QCOMPARE(versionChecker.compareVersions("2.0.0", "1.0.0"), -1); - QCOMPARE(versionChecker.compareVersions("1.0.0", "1.0.0"), 0); - QCOMPARE(versionChecker.compareVersions("1.4.8", "2.4.7"), 1); - QCOMPARE(versionChecker.compareVersions("2.4.7", "1.4.8"), -1); + // compare majors + QCOMPARE(versionChecker.compareVersions("1.0.0", "2.0.0"), 1); + QCOMPARE(versionChecker.compareVersions("2.0.0", "1.0.0"), -1); + QCOMPARE(versionChecker.compareVersions("1.0.0", "1.0.0"), 0); + QCOMPARE(versionChecker.compareVersions("1.4.8", "2.4.7"), 1); + QCOMPARE(versionChecker.compareVersions("2.4.7", "1.4.8"), -1); - // compare minors - QCOMPARE(versionChecker.compareVersions("1.3.0", "1.4.0"), 1); - QCOMPARE(versionChecker.compareVersions("1.4.0", "1.3.0"), -1); - QCOMPARE(versionChecker.compareVersions("1.4.0", "1.4.0"), 0); - QCOMPARE(versionChecker.compareVersions("1.3.8", "1.4.7"), 1); - QCOMPARE(versionChecker.compareVersions("1.4.7", "1.3.8"), -1); + // compare minors + QCOMPARE(versionChecker.compareVersions("1.3.0", "1.4.0"), 1); + QCOMPARE(versionChecker.compareVersions("1.4.0", "1.3.0"), -1); + QCOMPARE(versionChecker.compareVersions("1.4.0", "1.4.0"), 0); + QCOMPARE(versionChecker.compareVersions("1.3.8", "1.4.7"), 1); + QCOMPARE(versionChecker.compareVersions("1.4.7", "1.3.8"), -1); - // compare revs - QCOMPARE(versionChecker.compareVersions("1.4.7", "1.4.8"), 1); - QCOMPARE(versionChecker.compareVersions("1.4.8", "1.4.7"), -1); - QCOMPARE(versionChecker.compareVersions("1.4.7", "1.4.7"), 0); + // compare revs + QCOMPARE(versionChecker.compareVersions("1.4.7", "1.4.8"), 1); + QCOMPARE(versionChecker.compareVersions("1.4.8", "1.4.7"), -1); + QCOMPARE(versionChecker.compareVersions("1.4.7", "1.4.7"), 0); } diff --git a/src/test/guitests/src/VersionCheckerTests.h b/src/test/guitests/src/VersionCheckerTests.h index ba288bff..818aaf62 100644 --- a/src/test/guitests/src/VersionCheckerTests.h +++ b/src/test/guitests/src/VersionCheckerTests.h @@ -22,7 +22,7 @@ class VersionCheckerTests : public QObject { - Q_OBJECT + Q_OBJECT private slots: - void compareVersions(); + void compareVersions(); }; diff --git a/src/test/guitests/src/main.cpp b/src/test/guitests/src/main.cpp index b94f5786..4ca2fb7f 100644 --- a/src/test/guitests/src/main.cpp +++ b/src/test/guitests/src/main.cpp @@ -21,6 +21,6 @@ int main(int argc, char *argv[]) { - VersionCheckerTests versionCheckerTests; - QTest::qExec(&versionCheckerTests, argc, argv); + VersionCheckerTests versionCheckerTests; + QTest::qExec(&versionCheckerTests, argc, argv); } diff --git a/src/test/integtests/CMakeLists.txt b/src/test/integtests/CMakeLists.txt index 2f1ca7f3..08a33bf0 100644 --- a/src/test/integtests/CMakeLists.txt +++ b/src/test/integtests/CMakeLists.txt @@ -24,14 +24,14 @@ list(REMOVE_ITEM sources ${remove_platform}) # platform if (WIN32) - file(GLOB platform_sources "platform/MSWindows*.cpp") - file(GLOB platform_headers "platform/MSWindows*.h") + file(GLOB platform_sources "platform/MSWindows*.cpp") + file(GLOB platform_headers "platform/MSWindows*.h") elseif (APPLE) - file(GLOB platform_sources "platform/OSX*.cpp") - file(GLOB platform_headers "platform/OSX*.h") + file(GLOB platform_sources "platform/OSX*.cpp") + file(GLOB platform_headers "platform/OSX*.h") elseif (UNIX) - file(GLOB platform_sources "platform/XWindows*.cpp") - file(GLOB platform_headers "platform/XWindows*.h") + file(GLOB platform_sources "platform/XWindows*.cpp") + file(GLOB platform_headers "platform/XWindows*.h") endif() list(APPEND sources ${platform_sources}) @@ -50,22 +50,22 @@ list(APPEND headers ${mock_headers}) list(APPEND sources ${mock_sources}) if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() include_directories( - ../../ - ../../lib/ - ../../../ext/gtest-1.6.0/include - ../../../ext/gmock-1.6.0/include + ../../ + ../../lib/ + ../../../ext/gtest-1.6.0/include + ../../../ext/gmock-1.6.0/include ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() add_executable(integtests ${sources}) target_link_libraries(integtests - arch base client common io ipc mt net platform server synergy gtest gmock ${libs} ${OPENSSL_LIBS}) + arch base client common io ipc mt net platform server synergy gtest gmock ${libs} ${OPENSSL_LIBS}) diff --git a/src/test/integtests/Main.cpp b/src/test/integtests/Main.cpp index 659f6eb1..15598db2 100644 --- a/src/test/integtests/Main.cpp +++ b/src/test/integtests/Main.cpp @@ -38,35 +38,35 @@ int main(int argc, char **argv) { #if SYSAPI_WIN32 - // record window instance for tray icon, etc - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // record window instance for tray icon, etc + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - Arch arch; - arch.init(); - - Log log; - log.setFilter(kDEBUG2); + Arch arch; + arch.init(); + + Log log; + log.setFilter(kDEBUG2); - string lockFile; - for (int i = 0; i < argc; i++) { - if (string(argv[i]).compare("--lock-file") == 0) { - lockFile = argv[i + 1]; - } - } + string lockFile; + for (int i = 0; i < argc; i++) { + if (string(argv[i]).compare("--lock-file") == 0) { + lockFile = argv[i + 1]; + } + } - if (!lockFile.empty()) { - lock(lockFile); - } + if (!lockFile.empty()) { + lock(lockFile); + } - testing::InitGoogleTest(&argc, argv); + testing::InitGoogleTest(&argc, argv); - int result = RUN_ALL_TESTS(); + int result = RUN_ALL_TESTS(); - if (!lockFile.empty()) { - unlock(lockFile); - } + if (!lockFile.empty()) { + unlock(lockFile); + } // gtest seems to randomly finish with error codes (e.g. -1, -1073741819) // even when no tests have failed. not sure what causes this, but it @@ -79,30 +79,30 @@ main(int argc, char **argv) void lock(string lockFile) { - double start = ARCH->time(); - - // keep checking until timeout is reached. - while ((ARCH->time() - start) < LOCK_TIMEOUT) { + double start = ARCH->time(); + + // keep checking until timeout is reached. + while ((ARCH->time() - start) < LOCK_TIMEOUT) { - ifstream is(lockFile.c_str()); - bool noLock = !is; - is.close(); + ifstream is(lockFile.c_str()); + bool noLock = !is; + is.close(); - if (noLock) { - break; - } + if (noLock) { + break; + } - // check every second if file has gone. - ARCH->sleep(1); - } + // check every second if file has gone. + ARCH->sleep(1); + } - // write empty lock file. - ofstream os(lockFile.c_str()); - os.close(); + // write empty lock file. + ofstream os(lockFile.c_str()); + os.close(); } void unlock(string lockFile) { - remove(lockFile.c_str()); + remove(lockFile.c_str()); } diff --git a/src/test/integtests/arch/ArchInternetTests.cpp b/src/test/integtests/arch/ArchInternetTests.cpp index e10f497d..95823e9f 100644 --- a/src/test/integtests/arch/ArchInternetTests.cpp +++ b/src/test/integtests/arch/ArchInternetTests.cpp @@ -24,14 +24,14 @@ TEST(ArchInternetTests, get) { - ARCH_INTERNET internet; - String result = internet.get(TEST_URL); - ASSERT_EQ("Hello world!", result); + ARCH_INTERNET internet; + String result = internet.get(TEST_URL); + ASSERT_EQ("Hello world!", result); } TEST(ArchInternetTests, urlEncode) { - ARCH_INTERNET internet; - String result = internet.urlEncode("hello=+&world"); - ASSERT_EQ("hello%3D%2B%26world", result); + ARCH_INTERNET internet; + String result = internet.urlEncode("hello=+&world"); + ASSERT_EQ("hello%3D%2B%26world", result); } diff --git a/src/test/integtests/ipc/IpcTests.cpp b/src/test/integtests/ipc/IpcTests.cpp index 8d5e3b70..fc9ed8da 100644 --- a/src/test/integtests/ipc/IpcTests.cpp +++ b/src/test/integtests/ipc/IpcTests.cpp @@ -44,103 +44,103 @@ class IpcTests : public ::testing::Test { public: - IpcTests(); - virtual ~IpcTests(); - - void connectToServer_handleMessageReceived(const Event&, void*); - void sendMessageToServer_serverHandleMessageReceived(const Event&, void*); - void sendMessageToClient_serverHandleClientConnected(const Event&, void*); - void sendMessageToClient_clientHandleMessageReceived(const Event&, void*); + IpcTests(); + virtual ~IpcTests(); + + void connectToServer_handleMessageReceived(const Event&, void*); + void sendMessageToServer_serverHandleMessageReceived(const Event&, void*); + void sendMessageToClient_serverHandleClientConnected(const Event&, void*); + void sendMessageToClient_clientHandleMessageReceived(const Event&, void*); public: - SocketMultiplexer m_multiplexer; - bool m_connectToServer_helloMessageReceived; - bool m_connectToServer_hasClientNode; - IpcServer* m_connectToServer_server; - String m_sendMessageToServer_receivedString; - String m_sendMessageToClient_receivedString; - IpcClient* m_sendMessageToServer_client; - IpcServer* m_sendMessageToClient_server; - TestEventQueue m_events; + SocketMultiplexer m_multiplexer; + bool m_connectToServer_helloMessageReceived; + bool m_connectToServer_hasClientNode; + IpcServer* m_connectToServer_server; + String m_sendMessageToServer_receivedString; + String m_sendMessageToClient_receivedString; + IpcClient* m_sendMessageToServer_client; + IpcServer* m_sendMessageToClient_server; + TestEventQueue m_events; }; TEST_F(IpcTests, connectToServer) { - SocketMultiplexer socketMultiplexer; - IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); - server.listen(); - m_connectToServer_server = &server; + SocketMultiplexer socketMultiplexer; + IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); + server.listen(); + m_connectToServer_server = &server; - m_events.adoptHandler( - m_events.forIpcServer().messageReceived(), &server, - new TMethodEventJob( - this, &IpcTests::connectToServer_handleMessageReceived)); - - IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); - client.connect(); - - m_events.initQuitTimeout(5); - m_events.loop(); - m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); - m_events.cleanupQuitTimeout(); - - EXPECT_EQ(true, m_connectToServer_helloMessageReceived); - EXPECT_EQ(true, m_connectToServer_hasClientNode); + m_events.adoptHandler( + m_events.forIpcServer().messageReceived(), &server, + new TMethodEventJob( + this, &IpcTests::connectToServer_handleMessageReceived)); + + IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); + client.connect(); + + m_events.initQuitTimeout(5); + m_events.loop(); + m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); + m_events.cleanupQuitTimeout(); + + EXPECT_EQ(true, m_connectToServer_helloMessageReceived); + EXPECT_EQ(true, m_connectToServer_hasClientNode); } TEST_F(IpcTests, sendMessageToServer) { - SocketMultiplexer socketMultiplexer; - IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); - server.listen(); - - // event handler sends "test" command to server. - m_events.adoptHandler( - m_events.forIpcServer().messageReceived(), &server, - new TMethodEventJob( - this, &IpcTests::sendMessageToServer_serverHandleMessageReceived)); - - IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); - client.connect(); - m_sendMessageToServer_client = &client; + SocketMultiplexer socketMultiplexer; + IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); + server.listen(); + + // event handler sends "test" command to server. + m_events.adoptHandler( + m_events.forIpcServer().messageReceived(), &server, + new TMethodEventJob( + this, &IpcTests::sendMessageToServer_serverHandleMessageReceived)); + + IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); + client.connect(); + m_sendMessageToServer_client = &client; - m_events.initQuitTimeout(5); - m_events.loop(); - m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(5); + m_events.loop(); + m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); + m_events.cleanupQuitTimeout(); - EXPECT_EQ("test", m_sendMessageToServer_receivedString); + EXPECT_EQ("test", m_sendMessageToServer_receivedString); } TEST_F(IpcTests, sendMessageToClient) { - SocketMultiplexer socketMultiplexer; - IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); - server.listen(); - m_sendMessageToClient_server = &server; + SocketMultiplexer socketMultiplexer; + IpcServer server(&m_events, &socketMultiplexer, TEST_IPC_PORT); + server.listen(); + m_sendMessageToClient_server = &server; - // event handler sends "test" log line to client. - m_events.adoptHandler( - m_events.forIpcServer().messageReceived(), &server, - new TMethodEventJob( - this, &IpcTests::sendMessageToClient_serverHandleClientConnected)); + // event handler sends "test" log line to client. + m_events.adoptHandler( + m_events.forIpcServer().messageReceived(), &server, + new TMethodEventJob( + this, &IpcTests::sendMessageToClient_serverHandleClientConnected)); - IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); - client.connect(); - - m_events.adoptHandler( - m_events.forIpcClient().messageReceived(), &client, - new TMethodEventJob( - this, &IpcTests::sendMessageToClient_clientHandleMessageReceived)); + IpcClient client(&m_events, &socketMultiplexer, TEST_IPC_PORT); + client.connect(); + + m_events.adoptHandler( + m_events.forIpcClient().messageReceived(), &client, + new TMethodEventJob( + this, &IpcTests::sendMessageToClient_clientHandleMessageReceived)); - m_events.initQuitTimeout(5); - m_events.loop(); - m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); - m_events.removeHandler(m_events.forIpcClient().messageReceived(), &client); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(5); + m_events.loop(); + m_events.removeHandler(m_events.forIpcServer().messageReceived(), &server); + m_events.removeHandler(m_events.forIpcClient().messageReceived(), &client); + m_events.cleanupQuitTimeout(); - EXPECT_EQ("test", m_sendMessageToClient_receivedString); + EXPECT_EQ("test", m_sendMessageToClient_receivedString); } IpcTests::IpcTests() : @@ -159,53 +159,53 @@ IpcTests::~IpcTests() void IpcTests::connectToServer_handleMessageReceived(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - if (m->type() == kIpcHello) { - m_connectToServer_hasClientNode = - m_connectToServer_server->hasClients(kIpcClientNode); - m_connectToServer_helloMessageReceived = true; - m_events.raiseQuitEvent(); - } + IpcMessage* m = static_cast(e.getDataObject()); + if (m->type() == kIpcHello) { + m_connectToServer_hasClientNode = + m_connectToServer_server->hasClients(kIpcClientNode); + m_connectToServer_helloMessageReceived = true; + m_events.raiseQuitEvent(); + } } void IpcTests::sendMessageToServer_serverHandleMessageReceived(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - if (m->type() == kIpcHello) { - LOG((CLOG_DEBUG "client said hello, sending test to server")); - IpcCommandMessage m("test", true); - m_sendMessageToServer_client->send(m); - } - else if (m->type() == kIpcCommand) { - IpcCommandMessage* cm = static_cast(m); - LOG((CLOG_DEBUG "got ipc command message, %d", cm->command().c_str())); - m_sendMessageToServer_receivedString = cm->command(); - m_events.raiseQuitEvent(); - } + IpcMessage* m = static_cast(e.getDataObject()); + if (m->type() == kIpcHello) { + LOG((CLOG_DEBUG "client said hello, sending test to server")); + IpcCommandMessage m("test", true); + m_sendMessageToServer_client->send(m); + } + else if (m->type() == kIpcCommand) { + IpcCommandMessage* cm = static_cast(m); + LOG((CLOG_DEBUG "got ipc command message, %d", cm->command().c_str())); + m_sendMessageToServer_receivedString = cm->command(); + m_events.raiseQuitEvent(); + } } void IpcTests::sendMessageToClient_serverHandleClientConnected(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - if (m->type() == kIpcHello) { - LOG((CLOG_DEBUG "client said hello, sending test to client")); - IpcLogLineMessage m("test"); - m_sendMessageToClient_server->send(m, kIpcClientNode); - } + IpcMessage* m = static_cast(e.getDataObject()); + if (m->type() == kIpcHello) { + LOG((CLOG_DEBUG "client said hello, sending test to client")); + IpcLogLineMessage m("test"); + m_sendMessageToClient_server->send(m, kIpcClientNode); + } } void IpcTests::sendMessageToClient_clientHandleMessageReceived(const Event& e, void*) { - IpcMessage* m = static_cast(e.getDataObject()); - if (m->type() == kIpcLogLine) { - IpcLogLineMessage* llm = static_cast(m); - LOG((CLOG_DEBUG "got ipc log message, %d", llm->logLine().c_str())); - m_sendMessageToClient_receivedString = llm->logLine(); - m_events.raiseQuitEvent(); - } + IpcMessage* m = static_cast(e.getDataObject()); + if (m->type() == kIpcLogLine) { + IpcLogLineMessage* llm = static_cast(m); + LOG((CLOG_DEBUG "got ipc log message, %d", llm->logLine().c_str())); + m_sendMessageToClient_receivedString = llm->logLine(); + m_events.raiseQuitEvent(); + } } #endif // WINAPI_CARBON diff --git a/src/test/integtests/net/NetworkTests.cpp b/src/test/integtests/net/NetworkTests.cpp index dbb3dd1e..996ead1a 100644 --- a/src/test/integtests/net/NetworkTests.cpp +++ b/src/test/integtests/net/NetworkTests.cpp @@ -68,458 +68,458 @@ void createFile(fstream& file, const char* filename, size_t size); class NetworkTests : public ::testing::Test { public: - NetworkTests() : - m_mockData(NULL), - m_mockDataSize(0), - m_mockFileSize(0) - { - m_mockData = newMockData(kMockDataSize); - createFile(m_mockFile, kMockFilename, kMockFileSize); - } + NetworkTests() : + m_mockData(NULL), + m_mockDataSize(0), + m_mockFileSize(0) + { + m_mockData = newMockData(kMockDataSize); + createFile(m_mockFile, kMockFilename, kMockFileSize); + } - ~NetworkTests() - { - remove(kMockFilename); - delete[] m_mockData; - } + ~NetworkTests() + { + remove(kMockFilename); + delete[] m_mockData; + } - void sendMockData(void* eventTarget); - - void sendToClient_mockData_handleClientConnected(const Event&, void* vlistener); - void sendToClient_mockData_fileRecieveCompleted(const Event&, void*); - - void sendToClient_mockFile_handleClientConnected(const Event&, void* vlistener); - void sendToClient_mockFile_fileRecieveCompleted(const Event& event, void*); - - void sendToServer_mockData_handleClientConnected(const Event&, void* vlistener); - void sendToServer_mockData_fileRecieveCompleted(const Event& event, void*); + void sendMockData(void* eventTarget); + + void sendToClient_mockData_handleClientConnected(const Event&, void* vlistener); + void sendToClient_mockData_fileRecieveCompleted(const Event&, void*); + + void sendToClient_mockFile_handleClientConnected(const Event&, void* vlistener); + void sendToClient_mockFile_fileRecieveCompleted(const Event& event, void*); + + void sendToServer_mockData_handleClientConnected(const Event&, void* vlistener); + void sendToServer_mockData_fileRecieveCompleted(const Event& event, void*); - void sendToServer_mockFile_handleClientConnected(const Event&, void* vlistener); - void sendToServer_mockFile_fileRecieveCompleted(const Event& event, void*); - + void sendToServer_mockFile_handleClientConnected(const Event&, void* vlistener); + void sendToServer_mockFile_fileRecieveCompleted(const Event& event, void*); + public: - TestEventQueue m_events; - UInt8* m_mockData; - size_t m_mockDataSize; - fstream m_mockFile; - size_t m_mockFileSize; + TestEventQueue m_events; + UInt8* m_mockData; + size_t m_mockDataSize; + fstream m_mockFile; + size_t m_mockFileSize; }; TEST_F(NetworkTests, sendToClient_mockData) { - // server and client - NetworkAddress serverAddress(TEST_HOST, TEST_PORT); + // server and client + NetworkAddress serverAddress(TEST_HOST, TEST_PORT); - serverAddress.resolve(); - - // server - SocketMultiplexer serverSocketMultiplexer; - TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); - NiceMock serverScreen; - NiceMock primaryClient; - NiceMock serverConfig; - NiceMock serverInputFilter; - - m_events.adoptHandler( - m_events.forClientListener().connected(), &listener, - new TMethodEventJob( - this, &NetworkTests::sendToClient_mockData_handleClientConnected, &listener)); + serverAddress.resolve(); + + // server + SocketMultiplexer serverSocketMultiplexer; + TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); + NiceMock serverScreen; + NiceMock primaryClient; + NiceMock serverConfig; + NiceMock serverInputFilter; + + m_events.adoptHandler( + m_events.forClientListener().connected(), &listener, + new TMethodEventJob( + this, &NetworkTests::sendToClient_mockData_handleClientConnected, &listener)); - ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); - ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); - - ServerArgs serverArgs; - serverArgs.m_enableDragDrop = true; - Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); - server.m_mock = true; - listener.setServer(&server); + ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); + ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); + + ServerArgs serverArgs; + serverArgs.m_enableDragDrop = true; + Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); + server.m_mock = true; + listener.setServer(&server); - // client - NiceMock clientScreen; - SocketMultiplexer clientSocketMultiplexer; - TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); - - ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); - ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); + // client + NiceMock clientScreen; + SocketMultiplexer clientSocketMultiplexer; + TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); + + ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); + ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - ClientArgs clientArgs; - clientArgs.m_enableDragDrop = true; - clientArgs.m_enableCrypto = false; - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); - - m_events.adoptHandler( - m_events.forFile().fileRecieveCompleted(), &client, - new TMethodEventJob( - this, &NetworkTests::sendToClient_mockData_fileRecieveCompleted)); + ClientArgs clientArgs; + clientArgs.m_enableDragDrop = true; + clientArgs.m_enableCrypto = false; + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); + + m_events.adoptHandler( + m_events.forFile().fileRecieveCompleted(), &client, + new TMethodEventJob( + this, &NetworkTests::sendToClient_mockData_fileRecieveCompleted)); - client.connect(); + client.connect(); - m_events.initQuitTimeout(10); - m_events.loop(); - m_events.removeHandler(m_events.forClientListener().connected(), &listener); - m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &client); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(10); + m_events.loop(); + m_events.removeHandler(m_events.forClientListener().connected(), &listener); + m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &client); + m_events.cleanupQuitTimeout(); } TEST_F(NetworkTests, sendToClient_mockFile) { - // server and client - NetworkAddress serverAddress(TEST_HOST, TEST_PORT); + // server and client + NetworkAddress serverAddress(TEST_HOST, TEST_PORT); - serverAddress.resolve(); - - // server - SocketMultiplexer serverSocketMultiplexer; - TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); - NiceMock serverScreen; - NiceMock primaryClient; - NiceMock serverConfig; - NiceMock serverInputFilter; - - m_events.adoptHandler( - m_events.forClientListener().connected(), &listener, - new TMethodEventJob( - this, &NetworkTests::sendToClient_mockFile_handleClientConnected, &listener)); + serverAddress.resolve(); + + // server + SocketMultiplexer serverSocketMultiplexer; + TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); + NiceMock serverScreen; + NiceMock primaryClient; + NiceMock serverConfig; + NiceMock serverInputFilter; + + m_events.adoptHandler( + m_events.forClientListener().connected(), &listener, + new TMethodEventJob( + this, &NetworkTests::sendToClient_mockFile_handleClientConnected, &listener)); - ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); - ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); - - ServerArgs serverArgs; - serverArgs.m_enableDragDrop = true; - Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); - server.m_mock = true; - listener.setServer(&server); + ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); + ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); + + ServerArgs serverArgs; + serverArgs.m_enableDragDrop = true; + Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); + server.m_mock = true; + listener.setServer(&server); - // client - NiceMock clientScreen; - SocketMultiplexer clientSocketMultiplexer; - TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); - - ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); - ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); + // client + NiceMock clientScreen; + SocketMultiplexer clientSocketMultiplexer; + TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); + + ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); + ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - ClientArgs clientArgs; - clientArgs.m_enableDragDrop = true; - clientArgs.m_enableCrypto = false; - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); - - m_events.adoptHandler( - m_events.forFile().fileRecieveCompleted(), &client, - new TMethodEventJob( - this, &NetworkTests::sendToClient_mockFile_fileRecieveCompleted)); + ClientArgs clientArgs; + clientArgs.m_enableDragDrop = true; + clientArgs.m_enableCrypto = false; + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); + + m_events.adoptHandler( + m_events.forFile().fileRecieveCompleted(), &client, + new TMethodEventJob( + this, &NetworkTests::sendToClient_mockFile_fileRecieveCompleted)); - client.connect(); + client.connect(); - m_events.initQuitTimeout(10); - m_events.loop(); - m_events.removeHandler(m_events.forClientListener().connected(), &listener); - m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &client); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(10); + m_events.loop(); + m_events.removeHandler(m_events.forClientListener().connected(), &listener); + m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &client); + m_events.cleanupQuitTimeout(); } TEST_F(NetworkTests, sendToServer_mockData) { - // server and client - NetworkAddress serverAddress(TEST_HOST, TEST_PORT); - serverAddress.resolve(); + // server and client + NetworkAddress serverAddress(TEST_HOST, TEST_PORT); + serverAddress.resolve(); - // server - SocketMultiplexer serverSocketMultiplexer; - TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); - NiceMock serverScreen; - NiceMock primaryClient; - NiceMock serverConfig; - NiceMock serverInputFilter; + // server + SocketMultiplexer serverSocketMultiplexer; + TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); + NiceMock serverScreen; + NiceMock primaryClient; + NiceMock serverConfig; + NiceMock serverInputFilter; - ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); - ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); - - ServerArgs serverArgs; - serverArgs.m_enableDragDrop = true; - Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); - server.m_mock = true; - listener.setServer(&server); + ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); + ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); + + ServerArgs serverArgs; + serverArgs.m_enableDragDrop = true; + Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); + server.m_mock = true; + listener.setServer(&server); - // client - NiceMock clientScreen; - SocketMultiplexer clientSocketMultiplexer; - TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); - - ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); - ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); + // client + NiceMock clientScreen; + SocketMultiplexer clientSocketMultiplexer; + TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); + + ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); + ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - ClientArgs clientArgs; - clientArgs.m_enableDragDrop = true; - clientArgs.m_enableCrypto = false; - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); - - m_events.adoptHandler( - m_events.forClientListener().connected(), &listener, - new TMethodEventJob( - this, &NetworkTests::sendToServer_mockData_handleClientConnected, &client)); + ClientArgs clientArgs; + clientArgs.m_enableDragDrop = true; + clientArgs.m_enableCrypto = false; + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); + + m_events.adoptHandler( + m_events.forClientListener().connected(), &listener, + new TMethodEventJob( + this, &NetworkTests::sendToServer_mockData_handleClientConnected, &client)); - m_events.adoptHandler( - m_events.forFile().fileRecieveCompleted(), &server, - new TMethodEventJob( - this, &NetworkTests::sendToServer_mockData_fileRecieveCompleted)); + m_events.adoptHandler( + m_events.forFile().fileRecieveCompleted(), &server, + new TMethodEventJob( + this, &NetworkTests::sendToServer_mockData_fileRecieveCompleted)); - client.connect(); + client.connect(); - m_events.initQuitTimeout(10); - m_events.loop(); - m_events.removeHandler(m_events.forClientListener().connected(), &listener); - m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &server); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(10); + m_events.loop(); + m_events.removeHandler(m_events.forClientListener().connected(), &listener); + m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &server); + m_events.cleanupQuitTimeout(); } TEST_F(NetworkTests, sendToServer_mockFile) { - // server and client - NetworkAddress serverAddress(TEST_HOST, TEST_PORT); + // server and client + NetworkAddress serverAddress(TEST_HOST, TEST_PORT); - serverAddress.resolve(); + serverAddress.resolve(); - // server - SocketMultiplexer serverSocketMultiplexer; - TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); - ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); - NiceMock serverScreen; - NiceMock primaryClient; - NiceMock serverConfig; - NiceMock serverInputFilter; + // server + SocketMultiplexer serverSocketMultiplexer; + TCPSocketFactory* serverSocketFactory = new TCPSocketFactory(&m_events, &serverSocketMultiplexer); + ClientListener listener(serverAddress, serverSocketFactory, &m_events, false); + NiceMock serverScreen; + NiceMock primaryClient; + NiceMock serverConfig; + NiceMock serverInputFilter; - ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); - ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); - - ServerArgs serverArgs; - serverArgs.m_enableDragDrop = true; - Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); - server.m_mock = true; - listener.setServer(&server); + ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true)); + ON_CALL(serverConfig, getInputFilter()).WillByDefault(Return(&serverInputFilter)); + + ServerArgs serverArgs; + serverArgs.m_enableDragDrop = true; + Server server(serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs); + server.m_mock = true; + listener.setServer(&server); - // client - NiceMock clientScreen; - SocketMultiplexer clientSocketMultiplexer; - TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); - - ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); - ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); + // client + NiceMock clientScreen; + SocketMultiplexer clientSocketMultiplexer; + TCPSocketFactory* clientSocketFactory = new TCPSocketFactory(&m_events, &clientSocketMultiplexer); + + ON_CALL(clientScreen, getShape(_, _, _, _)).WillByDefault(Invoke(getScreenShape)); + ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos)); - ClientArgs clientArgs; - clientArgs.m_enableDragDrop = true; - clientArgs.m_enableCrypto = false; - Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); + ClientArgs clientArgs; + clientArgs.m_enableDragDrop = true; + clientArgs.m_enableCrypto = false; + Client client(&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen, clientArgs); - m_events.adoptHandler( - m_events.forClientListener().connected(), &listener, - new TMethodEventJob( - this, &NetworkTests::sendToServer_mockFile_handleClientConnected, &client)); + m_events.adoptHandler( + m_events.forClientListener().connected(), &listener, + new TMethodEventJob( + this, &NetworkTests::sendToServer_mockFile_handleClientConnected, &client)); - m_events.adoptHandler( - m_events.forFile().fileRecieveCompleted(), &server, - new TMethodEventJob( - this, &NetworkTests::sendToServer_mockFile_fileRecieveCompleted)); + m_events.adoptHandler( + m_events.forFile().fileRecieveCompleted(), &server, + new TMethodEventJob( + this, &NetworkTests::sendToServer_mockFile_fileRecieveCompleted)); - client.connect(); + client.connect(); - m_events.initQuitTimeout(10); - m_events.loop(); - m_events.removeHandler(m_events.forClientListener().connected(), &listener); - m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &server); - m_events.cleanupQuitTimeout(); + m_events.initQuitTimeout(10); + m_events.loop(); + m_events.removeHandler(m_events.forClientListener().connected(), &listener); + m_events.removeHandler(m_events.forFile().fileRecieveCompleted(), &server); + m_events.cleanupQuitTimeout(); } void NetworkTests::sendToClient_mockData_handleClientConnected(const Event&, void* vlistener) { - ClientListener* listener = static_cast(vlistener); - Server* server = listener->getServer(); + ClientListener* listener = static_cast(vlistener); + Server* server = listener->getServer(); - ClientProxy* client = listener->getNextClient(); - if (client == NULL) { - throw runtime_error("client is null"); - } + ClientProxy* client = listener->getNextClient(); + if (client == NULL) { + throw runtime_error("client is null"); + } - BaseClientProxy* bcp = client; - server->adoptClient(bcp); - server->setActive(bcp); + BaseClientProxy* bcp = client; + server->adoptClient(bcp); + server->setActive(bcp); - sendMockData(server); + sendMockData(server); } void NetworkTests::sendToClient_mockData_fileRecieveCompleted(const Event& event, void*) { - Client* client = static_cast(event.getTarget()); - EXPECT_TRUE(client->isReceivedFileSizeValid()); + Client* client = static_cast(event.getTarget()); + EXPECT_TRUE(client->isReceivedFileSizeValid()); - m_events.raiseQuitEvent(); + m_events.raiseQuitEvent(); } void NetworkTests::sendToClient_mockFile_handleClientConnected(const Event&, void* vlistener) { - ClientListener* listener = static_cast(vlistener); - Server* server = listener->getServer(); + ClientListener* listener = static_cast(vlistener); + Server* server = listener->getServer(); - ClientProxy* client = listener->getNextClient(); - if (client == NULL) { - throw runtime_error("client is null"); - } + ClientProxy* client = listener->getNextClient(); + if (client == NULL) { + throw runtime_error("client is null"); + } - BaseClientProxy* bcp = client; - server->adoptClient(bcp); - server->setActive(bcp); + BaseClientProxy* bcp = client; + server->adoptClient(bcp); + server->setActive(bcp); - server->sendFileToClient(kMockFilename); + server->sendFileToClient(kMockFilename); } void NetworkTests::sendToClient_mockFile_fileRecieveCompleted(const Event& event, void*) { - Client* client = static_cast(event.getTarget()); - EXPECT_TRUE(client->isReceivedFileSizeValid()); + Client* client = static_cast(event.getTarget()); + EXPECT_TRUE(client->isReceivedFileSizeValid()); - m_events.raiseQuitEvent(); + m_events.raiseQuitEvent(); } void NetworkTests::sendToServer_mockData_handleClientConnected(const Event&, void* vclient) { - Client* client = static_cast(vclient); - sendMockData(client); + Client* client = static_cast(vclient); + sendMockData(client); } void NetworkTests::sendToServer_mockData_fileRecieveCompleted(const Event& event, void*) { - Server* server = static_cast(event.getTarget()); - EXPECT_TRUE(server->isReceivedFileSizeValid()); + Server* server = static_cast(event.getTarget()); + EXPECT_TRUE(server->isReceivedFileSizeValid()); - m_events.raiseQuitEvent(); + m_events.raiseQuitEvent(); } void NetworkTests::sendToServer_mockFile_handleClientConnected(const Event&, void* vclient) { - Client* client = static_cast(vclient); - client->sendFileToServer(kMockFilename); + Client* client = static_cast(vclient); + client->sendFileToServer(kMockFilename); } void NetworkTests::sendToServer_mockFile_fileRecieveCompleted(const Event& event, void*) { - Server* server = static_cast(event.getTarget()); - EXPECT_TRUE(server->isReceivedFileSizeValid()); + Server* server = static_cast(event.getTarget()); + EXPECT_TRUE(server->isReceivedFileSizeValid()); - m_events.raiseQuitEvent(); + m_events.raiseQuitEvent(); } void NetworkTests::sendMockData(void* eventTarget) { - // send first message (file size) - String size = synergy::string::sizeTypeToString(kMockDataSize); - FileChunk* sizeMessage = FileChunk::start(size); - - m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, sizeMessage)); + // send first message (file size) + String size = synergy::string::sizeTypeToString(kMockDataSize); + FileChunk* sizeMessage = FileChunk::start(size); + + m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, sizeMessage)); - // send chunk messages with incrementing chunk size - size_t lastSize = 0; - size_t sentLength = 0; - while (true) { - size_t dataSize = lastSize + kMockDataChunkIncrement; + // send chunk messages with incrementing chunk size + size_t lastSize = 0; + size_t sentLength = 0; + while (true) { + size_t dataSize = lastSize + kMockDataChunkIncrement; - // make sure we don't read too much from the mock data. - if (sentLength + dataSize > kMockDataSize) { - dataSize = kMockDataSize - sentLength; - } + // make sure we don't read too much from the mock data. + if (sentLength + dataSize > kMockDataSize) { + dataSize = kMockDataSize - sentLength; + } - // first byte is the chunk mark, last is \0 - FileChunk* chunk = FileChunk::data(m_mockData, dataSize); - m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, chunk)); + // first byte is the chunk mark, last is \0 + FileChunk* chunk = FileChunk::data(m_mockData, dataSize); + m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, chunk)); - sentLength += dataSize; - lastSize = dataSize; + sentLength += dataSize; + lastSize = dataSize; - if (sentLength == kMockDataSize) { - break; - } + if (sentLength == kMockDataSize) { + break; + } - } - - // send last message - FileChunk* transferFinished = FileChunk::end(); - m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, transferFinished)); + } + + // send last message + FileChunk* transferFinished = FileChunk::end(); + m_events.addEvent(Event(m_events.forFile().fileChunkSending(), eventTarget, transferFinished)); } UInt8* newMockData(size_t size) { - UInt8* buffer = new UInt8[size]; + UInt8* buffer = new UInt8[size]; - UInt8* data = buffer; - const UInt8 head[] = "mock head... "; - size_t headSize = sizeof(head) - 1; - const UInt8 tail[] = "... mock tail"; - size_t tailSize = sizeof(tail) - 1; - const UInt8 synergyRocks[] = "synergy\0 rocks! "; - size_t synergyRocksSize = sizeof(synergyRocks) - 1; + UInt8* data = buffer; + const UInt8 head[] = "mock head... "; + size_t headSize = sizeof(head) - 1; + const UInt8 tail[] = "... mock tail"; + size_t tailSize = sizeof(tail) - 1; + const UInt8 synergyRocks[] = "synergy\0 rocks! "; + size_t synergyRocksSize = sizeof(synergyRocks) - 1; - memcpy(data, head, headSize); - data += headSize; + memcpy(data, head, headSize); + data += headSize; - size_t times = (size - headSize - tailSize) / synergyRocksSize; - for (size_t i = 0; i < times; ++i) { - memcpy(data, synergyRocks, synergyRocksSize); - data += synergyRocksSize; - } + size_t times = (size - headSize - tailSize) / synergyRocksSize; + for (size_t i = 0; i < times; ++i) { + memcpy(data, synergyRocks, synergyRocksSize); + data += synergyRocksSize; + } - size_t remainder = (size - headSize - tailSize) % synergyRocksSize; - if (remainder != 0) { - memset(data, '.', remainder); - data += remainder; - } + size_t remainder = (size - headSize - tailSize) % synergyRocksSize; + if (remainder != 0) { + memset(data, '.', remainder); + data += remainder; + } - memcpy(data, tail, tailSize); - return buffer; + memcpy(data, tail, tailSize); + return buffer; } void createFile(fstream& file, const char* filename, size_t size) { - UInt8* buffer = newMockData(size); + UInt8* buffer = newMockData(size); - file.open(filename, ios::out | ios::binary); - if (!file.is_open()) { - throw runtime_error("file not open"); - } + file.open(filename, ios::out | ios::binary); + if (!file.is_open()) { + throw runtime_error("file not open"); + } - file.write(reinterpret_cast(buffer), size); - file.close(); + file.write(reinterpret_cast(buffer), size); + file.close(); - delete[] buffer; + delete[] buffer; } void getScreenShape(SInt32& x, SInt32& y, SInt32& w, SInt32& h) { - x = 0; - y = 0; - w = 1; - h = 1; + x = 0; + y = 0; + w = 1; + h = 1; } void getCursorPos(SInt32& x, SInt32& y) { - x = 0; - y = 0; + x = 0; + y = 0; } #endif // WINAPI_CARBON diff --git a/src/test/integtests/platform/MSWindowsClipboardTests.cpp b/src/test/integtests/platform/MSWindowsClipboardTests.cpp index ad91133f..bd5b7346 100644 --- a/src/test/integtests/platform/MSWindowsClipboardTests.cpp +++ b/src/test/integtests/platform/MSWindowsClipboardTests.cpp @@ -25,205 +25,205 @@ class MSWindowsClipboardTests : public ::testing::Test { protected: - virtual void SetUp() - { - emptyClipboard(); - } + virtual void SetUp() + { + emptyClipboard(); + } - virtual void TearDown() - { - emptyClipboard(); - } + virtual void TearDown() + { + emptyClipboard(); + } private: - void emptyClipboard() - { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.empty(); - } + void emptyClipboard() + { + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.empty(); + } }; class MockFacade : public IMSWindowsClipboardFacade { public: - MOCK_METHOD2(write, void(HANDLE, UINT)); + MOCK_METHOD2(write, void(HANDLE, UINT)); }; TEST_F(MSWindowsClipboardTests, emptyUnowned_openCalled_returnsTrue) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - bool actual = clipboard.emptyUnowned(); + bool actual = clipboard.emptyUnowned(); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST_F(MSWindowsClipboardTests, empty_openCalled_returnsTrue) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - bool actual = clipboard.empty(); + bool actual = clipboard.empty(); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST_F(MSWindowsClipboardTests, empty_singleFormat_hasReturnsFalse) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.add(MSWindowsClipboard::kText, "synergy rocks!"); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.add(MSWindowsClipboard::kText, "synergy rocks!"); - clipboard.empty(); + clipboard.empty(); - bool actual = clipboard.has(MSWindowsClipboard::kText); - EXPECT_EQ(false, actual); + bool actual = clipboard.has(MSWindowsClipboard::kText); + EXPECT_EQ(false, actual); } TEST_F(MSWindowsClipboardTests, add_newValue_valueWasStored) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "synergy rocks!"); - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } TEST_F(MSWindowsClipboardTests, add_newValue_writeWasCalled) { - MockFacade facade; - EXPECT_CALL(facade, write(testing::_, testing::_)); + MockFacade facade; + EXPECT_CALL(facade, write(testing::_, testing::_)); - MSWindowsClipboard clipboard(NULL); - clipboard.setFacade(facade); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.setFacade(facade); + clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "synergy rocks!"); } TEST_F(MSWindowsClipboardTests, add_replaceValue_valueWasReplaced) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("maxivista sucks", actual); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("maxivista sucks", actual); } TEST_F(MSWindowsClipboardTests, open_timeIsZero_returnsTrue) { - MSWindowsClipboard clipboard(NULL); + MSWindowsClipboard clipboard(NULL); - bool actual = clipboard.open(0); + bool actual = clipboard.open(0); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST_F(MSWindowsClipboardTests, open_timeIsOne_returnsTrue) { - MSWindowsClipboard clipboard(NULL); + MSWindowsClipboard clipboard(NULL); - bool actual = clipboard.open(1); + bool actual = clipboard.open(1); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST_F(MSWindowsClipboardTests, close_isOpen_noErrors) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - clipboard.close(); + clipboard.close(); - // can't assert anything + // can't assert anything } // looks like this test may fail intermittently: // * http://buildbot.symless.com:8000/builders/trunk-win32/builds/246/steps/shell_3/logs/stdio /*TEST_F(MSWindowsClipboardTests, getTime_openWithNoEmpty_returnsOne) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(1); + MSWindowsClipboard clipboard(NULL); + clipboard.open(1); - MSWindowsClipboard::Time actual = clipboard.getTime(); + MSWindowsClipboard::Time actual = clipboard.getTime(); - // this behavior is different to that of Clipboard which only - // returns the value passed into open(t) after empty() is called. - EXPECT_EQ(1, actual); + // this behavior is different to that of Clipboard which only + // returns the value passed into open(t) after empty() is called. + EXPECT_EQ(1, actual); }*/ // this also fails intermittently: // http://buildbot.symless.com:8000/builders/trunk-win32/builds/266/steps/shell_3/logs/stdio /*TEST_F(MSWindowsClipboardTests, getTime_openAndEmpty_returnsOne) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(1); - clipboard.empty(); + MSWindowsClipboard clipboard(NULL); + clipboard.open(1); + clipboard.empty(); - MSWindowsClipboard::Time actual = clipboard.getTime(); + MSWindowsClipboard::Time actual = clipboard.getTime(); - EXPECT_EQ(1, actual); + EXPECT_EQ(1, actual); }*/ TEST_F(MSWindowsClipboardTests, has_withFormatAdded_returnsTrue) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.empty(); - clipboard.add(IClipboard::kText, "synergy rocks!"); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.empty(); + clipboard.add(IClipboard::kText, "synergy rocks!"); - bool actual = clipboard.has(IClipboard::kText); + bool actual = clipboard.has(IClipboard::kText); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST_F(MSWindowsClipboardTests, has_withNoFormats_returnsFalse) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.empty(); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.empty(); - bool actual = clipboard.has(IClipboard::kText); + bool actual = clipboard.has(IClipboard::kText); - EXPECT_EQ(false, actual); + EXPECT_EQ(false, actual); } TEST_F(MSWindowsClipboardTests, get_withNoFormats_returnsEmpty) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.empty(); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.empty(); - String actual = clipboard.get(IClipboard::kText); + String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("", actual); + EXPECT_EQ("", actual); } TEST_F(MSWindowsClipboardTests, get_withFormatAdded_returnsExpected) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); - clipboard.empty(); - clipboard.add(IClipboard::kText, "synergy rocks!"); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); + clipboard.empty(); + clipboard.add(IClipboard::kText, "synergy rocks!"); - String actual = clipboard.get(IClipboard::kText); + String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + EXPECT_EQ("synergy rocks!", actual); } TEST_F(MSWindowsClipboardTests, isOwnedBySynergy_defaultState_noError) { - MSWindowsClipboard clipboard(NULL); - clipboard.open(0); + MSWindowsClipboard clipboard(NULL); + clipboard.open(0); - bool actual = clipboard.isOwnedBySynergy(); + bool actual = clipboard.isOwnedBySynergy(); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } diff --git a/src/test/integtests/platform/OSXClipboardTests.cpp b/src/test/integtests/platform/OSXClipboardTests.cpp index e84791d1..c2222a5b 100644 --- a/src/test/integtests/platform/OSXClipboardTests.cpp +++ b/src/test/integtests/platform/OSXClipboardTests.cpp @@ -23,142 +23,142 @@ TEST(OSXClipboardTests, empty_openCalled_returnsTrue) { - OSXClipboard clipboard; - clipboard.open(0); - - bool actual = clipboard.empty(); - - EXPECT_EQ(true, actual); + OSXClipboard clipboard; + clipboard.open(0); + + bool actual = clipboard.empty(); + + EXPECT_EQ(true, actual); } TEST(OSXClipboardTests, empty_singleFormat_hasReturnsFalse) { - OSXClipboard clipboard; - clipboard.open(0); - clipboard.add(OSXClipboard::kText, "synergy rocks!"); - - clipboard.empty(); - - bool actual = clipboard.has(OSXClipboard::kText); - EXPECT_EQ(false, actual); + OSXClipboard clipboard; + clipboard.open(0); + clipboard.add(OSXClipboard::kText, "synergy rocks!"); + + clipboard.empty(); + + bool actual = clipboard.has(OSXClipboard::kText); + EXPECT_EQ(false, actual); } TEST(OSXClipboardTests, add_newValue_valueWasStored) { - OSXClipboard clipboard; - clipboard.open(0); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + OSXClipboard clipboard; + clipboard.open(0); + + clipboard.add(IClipboard::kText, "synergy rocks!"); + + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } TEST(OSXClipboardTests, add_replaceValue_valueWasReplaced) { - OSXClipboard clipboard; - clipboard.open(0); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. - - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("maxivista sucks", actual); + OSXClipboard clipboard; + clipboard.open(0); + + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. + + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("maxivista sucks", actual); } TEST(OSXClipboardTests, open_timeIsZero_returnsTrue) { - OSXClipboard clipboard; - - bool actual = clipboard.open(0); - - EXPECT_EQ(true, actual); + OSXClipboard clipboard; + + bool actual = clipboard.open(0); + + EXPECT_EQ(true, actual); } TEST(OSXClipboardTests, open_timeIsOne_returnsTrue) { - OSXClipboard clipboard; - - bool actual = clipboard.open(1); - - EXPECT_EQ(true, actual); + OSXClipboard clipboard; + + bool actual = clipboard.open(1); + + EXPECT_EQ(true, actual); } TEST(OSXClipboardTests, close_isOpen_noErrors) { - OSXClipboard clipboard; - clipboard.open(0); - - clipboard.close(); - - // can't assert anything + OSXClipboard clipboard; + clipboard.open(0); + + clipboard.close(); + + // can't assert anything } TEST(OSXClipboardTests, getTime_openWithNoEmpty_returnsOne) { - OSXClipboard clipboard; - clipboard.open(1); - - OSXClipboard::Time actual = clipboard.getTime(); - - // this behavior is different to that of Clipboard which only - // returns the value passed into open(t) after empty() is called. - EXPECT_EQ((UInt32)1, actual); + OSXClipboard clipboard; + clipboard.open(1); + + OSXClipboard::Time actual = clipboard.getTime(); + + // this behavior is different to that of Clipboard which only + // returns the value passed into open(t) after empty() is called. + EXPECT_EQ((UInt32)1, actual); } TEST(OSXClipboardTests, getTime_openAndEmpty_returnsOne) { - OSXClipboard clipboard; - clipboard.open(1); - clipboard.empty(); - - OSXClipboard::Time actual = clipboard.getTime(); - - EXPECT_EQ((UInt32)1, actual); + OSXClipboard clipboard; + clipboard.open(1); + clipboard.empty(); + + OSXClipboard::Time actual = clipboard.getTime(); + + EXPECT_EQ((UInt32)1, actual); } TEST(OSXClipboardTests, has_withFormatAdded_returnsTrue) { - OSXClipboard clipboard; - clipboard.open(0); - clipboard.empty(); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_EQ(true, actual); + OSXClipboard clipboard; + clipboard.open(0); + clipboard.empty(); + clipboard.add(IClipboard::kText, "synergy rocks!"); + + bool actual = clipboard.has(IClipboard::kText); + + EXPECT_EQ(true, actual); } TEST(OSXClipboardTests, has_withNoFormats_returnsFalse) { - OSXClipboard clipboard; - clipboard.open(0); - clipboard.empty(); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_EQ(false, actual); + OSXClipboard clipboard; + clipboard.open(0); + clipboard.empty(); + + bool actual = clipboard.has(IClipboard::kText); + + EXPECT_EQ(false, actual); } TEST(OSXClipboardTests, get_withNoFormats_returnsEmpty) { - OSXClipboard clipboard; - clipboard.open(0); - clipboard.empty(); - - String actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("", actual); + OSXClipboard clipboard; + clipboard.open(0); + clipboard.empty(); + + String actual = clipboard.get(IClipboard::kText); + + EXPECT_EQ("", actual); } TEST(OSXClipboardTests, get_withFormatAdded_returnsExpected) { - OSXClipboard clipboard; - clipboard.open(0); - clipboard.empty(); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - String actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("synergy rocks!", actual); + OSXClipboard clipboard; + clipboard.open(0); + clipboard.empty(); + clipboard.add(IClipboard::kText, "synergy rocks!"); + + String actual = clipboard.get(IClipboard::kText); + + EXPECT_EQ("synergy rocks!", actual); } diff --git a/src/test/integtests/platform/OSXKeyStateTests.cpp b/src/test/integtests/platform/OSXKeyStateTests.cpp index 5a3a4b07..963794d7 100644 --- a/src/test/integtests/platform/OSXKeyStateTests.cpp +++ b/src/test/integtests/platform/OSXKeyStateTests.cpp @@ -32,7 +32,7 @@ class OSXKeyStateTests : public ::testing::Test { public: - static bool isKeyPressed(const OSXKeyState& keyState, KeyButton button); + static bool isKeyPressed(const OSXKeyState& keyState, KeyButton button); }; // fakeAndPoll_shift seems to always fail on osx10.6 @@ -40,79 +40,79 @@ public: TEST_F(OSXKeyStateTests, fakeAndPoll_shift) { - synergy::KeyMap keyMap; - MockEventQueue eventQueue; - OSXKeyState keyState(&eventQueue, keyMap); - keyState.updateKeyMap(); + synergy::KeyMap keyMap; + MockEventQueue eventQueue; + OSXKeyState keyState(&eventQueue, keyMap); + keyState.updateKeyMap(); - keyState.fakeKeyDown(SHIFT_ID_L, 0, 1); - EXPECT_TRUE(isKeyPressed(keyState, SHIFT_BUTTON)); + keyState.fakeKeyDown(SHIFT_ID_L, 0, 1); + EXPECT_TRUE(isKeyPressed(keyState, SHIFT_BUTTON)); - keyState.fakeKeyUp(1); - EXPECT_TRUE(!isKeyPressed(keyState, SHIFT_BUTTON)); + keyState.fakeKeyUp(1); + EXPECT_TRUE(!isKeyPressed(keyState, SHIFT_BUTTON)); - keyState.fakeKeyDown(SHIFT_ID_R, 0, 2); - EXPECT_TRUE(isKeyPressed(keyState, SHIFT_BUTTON)); + keyState.fakeKeyDown(SHIFT_ID_R, 0, 2); + EXPECT_TRUE(isKeyPressed(keyState, SHIFT_BUTTON)); - keyState.fakeKeyUp(2); - EXPECT_TRUE(!isKeyPressed(keyState, SHIFT_BUTTON)); + keyState.fakeKeyUp(2); + EXPECT_TRUE(!isKeyPressed(keyState, SHIFT_BUTTON)); } TEST_F(OSXKeyStateTests, fakeAndPoll_charKey) { - synergy::KeyMap keyMap; - MockEventQueue eventQueue; - OSXKeyState keyState(&eventQueue, keyMap); - keyState.updateKeyMap(); + synergy::KeyMap keyMap; + MockEventQueue eventQueue; + OSXKeyState keyState(&eventQueue, keyMap); + keyState.updateKeyMap(); - keyState.fakeKeyDown(A_CHAR_ID, 0, 1); - EXPECT_TRUE(isKeyPressed(keyState, A_CHAR_BUTTON)); + keyState.fakeKeyDown(A_CHAR_ID, 0, 1); + EXPECT_TRUE(isKeyPressed(keyState, A_CHAR_BUTTON)); - keyState.fakeKeyUp(1); - EXPECT_TRUE(!isKeyPressed(keyState, A_CHAR_BUTTON)); + keyState.fakeKeyUp(1); + EXPECT_TRUE(!isKeyPressed(keyState, A_CHAR_BUTTON)); - // HACK: delete the key in case it was typed into a text editor. - // we should really set focus to an invisible window. - keyState.fakeKeyDown(kKeyBackSpace, 0, 2); - keyState.fakeKeyUp(2); + // HACK: delete the key in case it was typed into a text editor. + // we should really set focus to an invisible window. + keyState.fakeKeyDown(kKeyBackSpace, 0, 2); + keyState.fakeKeyUp(2); } TEST_F(OSXKeyStateTests, fakeAndPoll_charKeyAndModifier) { - synergy::KeyMap keyMap; - MockEventQueue eventQueue; - OSXKeyState keyState(&eventQueue, keyMap); - keyState.updateKeyMap(); + synergy::KeyMap keyMap; + MockEventQueue eventQueue; + OSXKeyState keyState(&eventQueue, keyMap); + keyState.updateKeyMap(); - keyState.fakeKeyDown(A_CHAR_ID, KeyModifierShift, 1); - EXPECT_TRUE(isKeyPressed(keyState, A_CHAR_BUTTON)); + keyState.fakeKeyDown(A_CHAR_ID, KeyModifierShift, 1); + EXPECT_TRUE(isKeyPressed(keyState, A_CHAR_BUTTON)); - keyState.fakeKeyUp(1); - EXPECT_TRUE(!isKeyPressed(keyState, A_CHAR_BUTTON)); + keyState.fakeKeyUp(1); + EXPECT_TRUE(!isKeyPressed(keyState, A_CHAR_BUTTON)); - // HACK: delete the key in case it was typed into a text editor. - // we should really set focus to an invisible window. - keyState.fakeKeyDown(kKeyBackSpace, 0, 2); - keyState.fakeKeyUp(2); + // HACK: delete the key in case it was typed into a text editor. + // we should really set focus to an invisible window. + keyState.fakeKeyDown(kKeyBackSpace, 0, 2); + keyState.fakeKeyUp(2); } bool OSXKeyStateTests::isKeyPressed(const OSXKeyState& keyState, KeyButton button) { - // HACK: allow os to realize key state changes. - ARCH->sleep(.2); + // HACK: allow os to realize key state changes. + ARCH->sleep(.2); - IKeyState::KeyButtonSet pressed; - keyState.pollPressedKeys(pressed); + IKeyState::KeyButtonSet pressed; + keyState.pollPressedKeys(pressed); - IKeyState::KeyButtonSet::const_iterator it; - for (it = pressed.begin(); it != pressed.end(); ++it) { - LOG((CLOG_DEBUG "checking key %d", *it)); - if (*it == button) { - return true; - } - } - return false; + IKeyState::KeyButtonSet::const_iterator it; + for (it = pressed.begin(); it != pressed.end(); ++it) { + LOG((CLOG_DEBUG "checking key %d", *it)); + if (*it == button) { + return true; + } + } + return false; } #endif diff --git a/src/test/integtests/platform/OSXScreenTests.cpp b/src/test/integtests/platform/OSXScreenTests.cpp index 2118a280..66f37e09 100644 --- a/src/test/integtests/platform/OSXScreenTests.cpp +++ b/src/test/integtests/platform/OSXScreenTests.cpp @@ -25,27 +25,27 @@ /* TEST(OSXScreenTests, hideCursor_notPrimary) { - EventQueue queue; - OSXScreen screen(true, false); + EventQueue queue; + OSXScreen screen(true, false); - screen.hideCursor(); + screen.hideCursor(); - EXPECT_EQ(false, CGCursorIsVisible()); + EXPECT_EQ(false, CGCursorIsVisible()); - // workaround for screen class race condition. - ARCH->sleep(.1f); + // workaround for screen class race condition. + ARCH->sleep(.1f); } TEST(OSXScreenTests, showCursor_notPrimary) { - EventQueue queue; - OSXScreen screen(false, false); + EventQueue queue; + OSXScreen screen(false, false); - screen.showCursor(); + screen.showCursor(); - EXPECT_EQ(true, CGCursorIsVisible()); + EXPECT_EQ(true, CGCursorIsVisible()); - // workaround for screen class race condition. - ARCH->sleep(.1f); + // workaround for screen class race condition. + ARCH->sleep(.1f); } */ diff --git a/src/test/integtests/platform/XWindowsClipboardTests.cpp b/src/test/integtests/platform/XWindowsClipboardTests.cpp index 36a8acad..0cd0f710 100644 --- a/src/test/integtests/platform/XWindowsClipboardTests.cpp +++ b/src/test/integtests/platform/XWindowsClipboardTests.cpp @@ -27,131 +27,131 @@ class CXWindowsClipboardTests : public ::testing::Test { protected: - virtual void - SetUp() - { - m_display = XOpenDisplay(NULL); - int screen = DefaultScreen(m_display); - Window root = XRootWindow(m_display, screen); - - XSetWindowAttributes attr; - attr.do_not_propagate_mask = 0; - attr.override_redirect = True; - attr.cursor = Cursor(); - - m_window = XCreateWindow( - m_display, root, 0, 0, 1, 1, 0, 0, - InputOnly, CopyFromParent, 0, &attr); - } + virtual void + SetUp() + { + m_display = XOpenDisplay(NULL); + int screen = DefaultScreen(m_display); + Window root = XRootWindow(m_display, screen); + + XSetWindowAttributes attr; + attr.do_not_propagate_mask = 0; + attr.override_redirect = True; + attr.cursor = Cursor(); + + m_window = XCreateWindow( + m_display, root, 0, 0, 1, 1, 0, 0, + InputOnly, CopyFromParent, 0, &attr); + } - virtual void - TearDown() - { - XDestroyWindow(m_display, m_window); - XCloseDisplay(m_display); - } + virtual void + TearDown() + { + XDestroyWindow(m_display, m_window); + XCloseDisplay(m_display); + } - CXWindowsClipboard& - createClipboard() - { - CXWindowsClipboard* clipboard; - clipboard = new CXWindowsClipboard(m_display, m_window, 0); - clipboard->open(0); // needed to empty the clipboard - clipboard->empty(); // needed to own the clipboard - return *clipboard; - } + CXWindowsClipboard& + createClipboard() + { + CXWindowsClipboard* clipboard; + clipboard = new CXWindowsClipboard(m_display, m_window, 0); + clipboard->open(0); // needed to empty the clipboard + clipboard->empty(); // needed to own the clipboard + return *clipboard; + } - Display* m_display; - Window m_window; + Display* m_display; + Window m_window; }; TEST_F(CXWindowsClipboardTests, empty_openCalled_returnsTrue) { - CXWindowsClipboard clipboard = createClipboard(); - - bool actual = clipboard.empty(); - - EXPECT_EQ(true, actual); + CXWindowsClipboard clipboard = createClipboard(); + + bool actual = clipboard.empty(); + + EXPECT_EQ(true, actual); } TEST_F(CXWindowsClipboardTests, empty_singleFormat_hasReturnsFalse) { - CXWindowsClipboard clipboard = createClipboard(); - clipboard.add(CXWindowsClipboard::kText, "synergy rocks!"); - - clipboard.empty(); - - bool actual = clipboard.has(CXWindowsClipboard::kText); - EXPECT_FALSE(actual); + CXWindowsClipboard clipboard = createClipboard(); + clipboard.add(CXWindowsClipboard::kText, "synergy rocks!"); + + clipboard.empty(); + + bool actual = clipboard.has(CXWindowsClipboard::kText); + EXPECT_FALSE(actual); } TEST_F(CXWindowsClipboardTests, add_newValue_valueWasStored) { - CXWindowsClipboard clipboard = createClipboard(); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + CXWindowsClipboard clipboard = createClipboard(); + + clipboard.add(IClipboard::kText, "synergy rocks!"); + + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } TEST_F(CXWindowsClipboardTests, add_replaceValue_valueWasReplaced) { - CXWindowsClipboard clipboard = createClipboard(); - - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. - - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("maxivista sucks", actual); + CXWindowsClipboard clipboard = createClipboard(); + + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. + + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("maxivista sucks", actual); } TEST_F(CXWindowsClipboardTests, close_isOpen_noErrors) { - CXWindowsClipboard clipboard = createClipboard(); - - // clipboard opened in createClipboard() - clipboard.close(); - - // can't assert anything + CXWindowsClipboard clipboard = createClipboard(); + + // clipboard opened in createClipboard() + clipboard.close(); + + // can't assert anything } TEST_F(CXWindowsClipboardTests, has_withFormatAdded_returnsTrue) { - CXWindowsClipboard clipboard = createClipboard(); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_EQ(true, actual); + CXWindowsClipboard clipboard = createClipboard(); + clipboard.add(IClipboard::kText, "synergy rocks!"); + + bool actual = clipboard.has(IClipboard::kText); + + EXPECT_EQ(true, actual); } TEST_F(CXWindowsClipboardTests, has_withNoFormats_returnsFalse) { - CXWindowsClipboard clipboard = createClipboard(); - - bool actual = clipboard.has(IClipboard::kText); - - EXPECT_FALSE(actual); + CXWindowsClipboard clipboard = createClipboard(); + + bool actual = clipboard.has(IClipboard::kText); + + EXPECT_FALSE(actual); } TEST_F(CXWindowsClipboardTests, get_withNoFormats_returnsEmpty) { - CXWindowsClipboard clipboard = createClipboard(); - - String actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("", actual); + CXWindowsClipboard clipboard = createClipboard(); + + String actual = clipboard.get(IClipboard::kText); + + EXPECT_EQ("", actual); } TEST_F(CXWindowsClipboardTests, get_withFormatAdded_returnsExpected) { - CXWindowsClipboard clipboard = createClipboard(); - clipboard.add(IClipboard::kText, "synergy rocks!"); - - String actual = clipboard.get(IClipboard::kText); - - EXPECT_EQ("synergy rocks!", actual); + CXWindowsClipboard clipboard = createClipboard(); + clipboard.add(IClipboard::kText, "synergy rocks!"); + + String actual = clipboard.get(IClipboard::kText); + + EXPECT_EQ("synergy rocks!", actual); } #endif diff --git a/src/test/integtests/platform/XWindowsKeyStateTests.cpp b/src/test/integtests/platform/XWindowsKeyStateTests.cpp index 62fdd770..69fe64a9 100644 --- a/src/test/integtests/platform/XWindowsKeyStateTests.cpp +++ b/src/test/integtests/platform/XWindowsKeyStateTests.cpp @@ -28,7 +28,7 @@ #include #if HAVE_XKB_EXTENSION -# include +# include #endif #include "test/global/gtest.h" @@ -38,209 +38,209 @@ class XWindowsKeyStateTests : public ::testing::Test { protected: - XWindowsKeyStateTests() : - m_display(NULL) - { - } + XWindowsKeyStateTests() : + m_display(NULL) + { + } - ~XWindowsKeyStateTests() - { - if (m_display != NULL) { - LOG((CLOG_DEBUG "closing display")); - XCloseDisplay(m_display); - } - } + ~XWindowsKeyStateTests() + { + if (m_display != NULL) { + LOG((CLOG_DEBUG "closing display")); + XCloseDisplay(m_display); + } + } - virtual void - SetUp() - { - // open the display only once for the entire test suite - if (this->m_display == NULL) { - LOG((CLOG_DEBUG "opening display")); - this->m_display = XOpenDisplay(NULL); + virtual void + SetUp() + { + // open the display only once for the entire test suite + if (this->m_display == NULL) { + LOG((CLOG_DEBUG "opening display")); + this->m_display = XOpenDisplay(NULL); - ASSERT_TRUE(this->m_display != NULL) - << "unable to open display: " << errno; - } - } + ASSERT_TRUE(this->m_display != NULL) + << "unable to open display: " << errno; + } + } - virtual void - TearDown() - { - } + virtual void + TearDown() + { + } - Display* m_display; + Display* m_display; }; TEST_F(XWindowsKeyStateTests, setActiveGroup_pollAndSet_groupIsZero) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - keyState.setActiveGroup(XWindowsKeyState::kGroupPollAndSet); + keyState.setActiveGroup(XWindowsKeyState::kGroupPollAndSet); - ASSERT_EQ(0, keyState.group()); + ASSERT_EQ(0, keyState.group()); } TEST_F(XWindowsKeyStateTests, setActiveGroup_poll_groupIsNotSet) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - keyState.setActiveGroup(XWindowsKeyState::kGroupPoll); + keyState.setActiveGroup(XWindowsKeyState::kGroupPoll); - ASSERT_LE(-1, keyState.group()); + ASSERT_LE(-1, keyState.group()); } TEST_F(XWindowsKeyStateTests, setActiveGroup_customGroup_groupWasSet) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - keyState.setActiveGroup(1); + keyState.setActiveGroup(1); - ASSERT_EQ(1, keyState.group()); + ASSERT_EQ(1, keyState.group()); } TEST_F(XWindowsKeyStateTests, mapModifiersFromX_zeroState_zeroMask) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - int mask = keyState.mapModifiersFromX(0); + int mask = keyState.mapModifiersFromX(0); - ASSERT_EQ(0, mask); + ASSERT_EQ(0, mask); } TEST_F(XWindowsKeyStateTests, mapModifiersToX_zeroMask_resultIsTrue) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - unsigned int modifiers = 0; - bool result = keyState.mapModifiersToX(0, modifiers); + unsigned int modifiers = 0; + bool result = keyState.mapModifiersToX(0, modifiers); - ASSERT_TRUE(result); + ASSERT_TRUE(result); } TEST_F(XWindowsKeyStateTests, fakeCtrlAltDel_default_returnsFalse) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - bool result = keyState.fakeCtrlAltDel(); + bool result = keyState.fakeCtrlAltDel(); - ASSERT_FALSE(result); + ASSERT_FALSE(result); } TEST_F(XWindowsKeyStateTests, pollActiveModifiers_defaultState_returnsZero) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - KeyModifierMask actual = keyState.pollActiveModifiers(); + KeyModifierMask actual = keyState.pollActiveModifiers(); - ASSERT_EQ(0, actual); + ASSERT_EQ(0, actual); } #if 0 // TODO: fix, causes sigsegv TEST_F(XWindowsKeyStateTests, pollActiveModifiers_shiftKeyDownThenUp_masksAreCorrect) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - // set mock modifier mapping - std::fill(keyState.modifierFromX().begin(), keyState.modifierFromX().end(), 0); - keyState.modifierFromX()[ShiftMapIndex] = KeyModifierShift; + // set mock modifier mapping + std::fill(keyState.modifierFromX().begin(), keyState.modifierFromX().end(), 0); + keyState.modifierFromX()[ShiftMapIndex] = KeyModifierShift; - KeyCode key = XKeysymToKeycode(m_display, XK_Shift_L); + KeyCode key = XKeysymToKeycode(m_display, XK_Shift_L); - // fake shift key down (without using synergy) - XTestFakeKeyEvent(m_display, key, true, CurrentTime); + // fake shift key down (without using synergy) + XTestFakeKeyEvent(m_display, key, true, CurrentTime); - // function under test (1st call) - KeyModifierMask modDown = keyState.pollActiveModifiers(); + // function under test (1st call) + KeyModifierMask modDown = keyState.pollActiveModifiers(); - // fake shift key up (without using synergy) - XTestFakeKeyEvent(m_display, key, false, CurrentTime); + // fake shift key up (without using synergy) + XTestFakeKeyEvent(m_display, key, false, CurrentTime); - // function under test (2nd call) - KeyModifierMask modUp = keyState.pollActiveModifiers(); + // function under test (2nd call) + KeyModifierMask modUp = keyState.pollActiveModifiers(); - EXPECT_TRUE((modDown & KeyModifierShift) == KeyModifierShift) - << "shift key not in mask - key was not pressed"; + EXPECT_TRUE((modDown & KeyModifierShift) == KeyModifierShift) + << "shift key not in mask - key was not pressed"; - EXPECT_TRUE((modUp & KeyModifierShift) == 0) - << "shift key still in mask - make sure no keys are being held down"; + EXPECT_TRUE((modUp & KeyModifierShift) == 0) + << "shift key still in mask - make sure no keys are being held down"; } #endif TEST_F(XWindowsKeyStateTests, pollActiveGroup_defaultState_returnsZero) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - SInt32 actual = keyState.pollActiveGroup(); + SInt32 actual = keyState.pollActiveGroup(); - ASSERT_EQ(0, actual); + ASSERT_EQ(0, actual); } TEST_F(XWindowsKeyStateTests, pollActiveGroup_positiveGroup_returnsGroup) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - keyState.group(3); + keyState.group(3); - SInt32 actual = keyState.pollActiveGroup(); + SInt32 actual = keyState.pollActiveGroup(); - ASSERT_EQ(3, actual); + ASSERT_EQ(3, actual); } TEST_F(XWindowsKeyStateTests, pollActiveGroup_xkb_areEqual) { #if HAVE_XKB_EXTENSION - MockKeyMap keyMap; - MockEventQueue eventQueue; - XWindowsKeyState keyState( - m_display, true, &eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + XWindowsKeyState keyState( + m_display, true, &eventQueue, keyMap); - // reset the group - keyState.group(-1); + // reset the group + keyState.group(-1); - XkbStateRec state; + XkbStateRec state; - // compare pollActiveGroup() with XkbGetState() - if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) { - SInt32 actual = keyState.pollActiveGroup(); + // compare pollActiveGroup() with XkbGetState() + if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) { + SInt32 actual = keyState.pollActiveGroup(); - ASSERT_EQ(state.group, actual); - } - else { - FAIL() << "XkbGetState() returned error " << errno; - } + ASSERT_EQ(state.group, actual); + } + else { + FAIL() << "XkbGetState() returned error " << errno; + } #else - SUCCEED() << "Xkb extension not installed"; + SUCCEED() << "Xkb extension not installed"; #endif } diff --git a/src/test/integtests/platform/XWindowsScreenSaverTests.cpp b/src/test/integtests/platform/XWindowsScreenSaverTests.cpp index 8bb8d10c..e9a5e937 100644 --- a/src/test/integtests/platform/XWindowsScreenSaverTests.cpp +++ b/src/test/integtests/platform/XWindowsScreenSaverTests.cpp @@ -30,19 +30,19 @@ using ::testing::_; // TODO: not working on build machine for some reason TEST(CXWindowsScreenSaverTests, activate_defaultScreen_todo) { - Display* display = XOpenDisplay(":0.0"); - Window window = DefaultRootWindow(display); - MockEventQueue eventQueue; - EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(1); - CXWindowsScreenSaver screenSaver( - display, window, NULL, &eventQueue); + Display* display = XOpenDisplay(":0.0"); + Window window = DefaultRootWindow(display); + MockEventQueue eventQueue; + EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(1); + CXWindowsScreenSaver screenSaver( + display, window, NULL, &eventQueue); - screenSaver.activate(); + screenSaver.activate(); - bool isActive = screenSaver.isActive(); + bool isActive = screenSaver.isActive(); - screenSaver.deactivate(); + screenSaver.deactivate(); - ASSERT_EQ(true, isActive); + ASSERT_EQ(true, isActive); } #endif diff --git a/src/test/integtests/platform/XWindowsScreenTests.cpp b/src/test/integtests/platform/XWindowsScreenTests.cpp index ea503c99..a328cee9 100644 --- a/src/test/integtests/platform/XWindowsScreenTests.cpp +++ b/src/test/integtests/platform/XWindowsScreenTests.cpp @@ -25,17 +25,17 @@ using ::testing::_; TEST(CXWindowsScreenTests, fakeMouseMove_nonPrimary_getCursorPosValuesCorrect) { - MockEventQueue eventQueue; - EXPECT_CALL(eventQueue, adoptHandler(_, _, _)).Times(2); - EXPECT_CALL(eventQueue, adoptBuffer(_)).Times(2); - EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(2); - XWindowsScreen screen( - ":0.0", false, false, 0, &eventQueue); + MockEventQueue eventQueue; + EXPECT_CALL(eventQueue, adoptHandler(_, _, _)).Times(2); + EXPECT_CALL(eventQueue, adoptBuffer(_)).Times(2); + EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(2); + XWindowsScreen screen( + ":0.0", false, false, 0, &eventQueue); - screen.fakeMouseMove(10, 20); + screen.fakeMouseMove(10, 20); - int x, y; - screen.getCursorPos(x, y); - ASSERT_EQ(10, x); - ASSERT_EQ(20, y); + int x, y; + screen.getCursorPos(x, y); + ASSERT_EQ(10, x); + ASSERT_EQ(20, y); } diff --git a/src/test/mock/io/MockStream.h b/src/test/mock/io/MockStream.h index 74b4d13e..6265578d 100644 --- a/src/test/mock/io/MockStream.h +++ b/src/test/mock/io/MockStream.h @@ -27,18 +27,18 @@ class IEventQueue; class MockStream : public synergy::IStream { public: - MockStream() { } - MOCK_METHOD0(close, void()); - MOCK_METHOD2(read, UInt32(void*, UInt32)); - MOCK_METHOD2(write, void(const void*, UInt32)); - MOCK_METHOD0(flush, void()); - MOCK_METHOD0(shutdownInput, void()); - MOCK_METHOD0(shutdownOutput, void()); - MOCK_METHOD0(getInputReadyEvent, Event::Type()); - MOCK_METHOD0(getOutputErrorEvent, Event::Type()); - MOCK_METHOD0(getInputShutdownEvent, Event::Type()); - MOCK_METHOD0(getOutputShutdownEvent, Event::Type()); - MOCK_CONST_METHOD0(getEventTarget, void*()); - MOCK_CONST_METHOD0(isReady, bool()); - MOCK_CONST_METHOD0(getSize, UInt32()); + MockStream() { } + MOCK_METHOD0(close, void()); + MOCK_METHOD2(read, UInt32(void*, UInt32)); + MOCK_METHOD2(write, void(const void*, UInt32)); + MOCK_METHOD0(flush, void()); + MOCK_METHOD0(shutdownInput, void()); + MOCK_METHOD0(shutdownOutput, void()); + MOCK_METHOD0(getInputReadyEvent, Event::Type()); + MOCK_METHOD0(getOutputErrorEvent, Event::Type()); + MOCK_METHOD0(getInputShutdownEvent, Event::Type()); + MOCK_METHOD0(getOutputShutdownEvent, Event::Type()); + MOCK_CONST_METHOD0(getEventTarget, void*()); + MOCK_CONST_METHOD0(isReady, bool()); + MOCK_CONST_METHOD0(getSize, UInt32()); }; diff --git a/src/test/mock/ipc/MockIpcServer.h b/src/test/mock/ipc/MockIpcServer.h index 3193722c..1ea4d33b 100644 --- a/src/test/mock/ipc/MockIpcServer.h +++ b/src/test/mock/ipc/MockIpcServer.h @@ -31,38 +31,38 @@ class IEventQueue; class MockIpcServer : public IpcServer { public: - MockIpcServer() : - m_sendCond(ARCH->newCondVar()), - m_sendMutex(ARCH->newMutex()) { } - - ~MockIpcServer() { - if (m_sendCond != NULL) { - ARCH->closeCondVar(m_sendCond); - } + MockIpcServer() : + m_sendCond(ARCH->newCondVar()), + m_sendMutex(ARCH->newMutex()) { } + + ~MockIpcServer() { + if (m_sendCond != NULL) { + ARCH->closeCondVar(m_sendCond); + } - if (m_sendMutex != NULL) { - ARCH->closeMutex(m_sendMutex); - } - } + if (m_sendMutex != NULL) { + ARCH->closeMutex(m_sendMutex); + } + } - MOCK_METHOD0(listen, void()); - MOCK_METHOD2(send, void(const IpcMessage&, EIpcClientType)); - MOCK_CONST_METHOD1(hasClients, bool(EIpcClientType)); + MOCK_METHOD0(listen, void()); + MOCK_METHOD2(send, void(const IpcMessage&, EIpcClientType)); + MOCK_CONST_METHOD1(hasClients, bool(EIpcClientType)); - void delegateToFake() { - ON_CALL(*this, send(_, _)).WillByDefault(Invoke(this, &MockIpcServer::mockSend)); - } + void delegateToFake() { + ON_CALL(*this, send(_, _)).WillByDefault(Invoke(this, &MockIpcServer::mockSend)); + } - void waitForSend() { - ARCH->waitCondVar(m_sendCond, m_sendMutex, 5); - } + void waitForSend() { + ARCH->waitCondVar(m_sendCond, m_sendMutex, 5); + } private: - void mockSend(const IpcMessage&, EIpcClientType) { - ArchMutexLock lock(m_sendMutex); - ARCH->broadcastCondVar(m_sendCond); - } + void mockSend(const IpcMessage&, EIpcClientType) { + ArchMutexLock lock(m_sendMutex); + ARCH->broadcastCondVar(m_sendCond); + } - ArchCond m_sendCond; - ArchMutex m_sendMutex; + ArchCond m_sendCond; + ArchMutex m_sendMutex; }; diff --git a/src/test/mock/server/MockConfig.h b/src/test/mock/server/MockConfig.h index 5151fc25..72fa02c0 100644 --- a/src/test/mock/server/MockConfig.h +++ b/src/test/mock/server/MockConfig.h @@ -26,7 +26,7 @@ class MockConfig : public Config { public: - MockConfig() : Config() { } - MOCK_METHOD0(getInputFilter, InputFilter*()); - MOCK_CONST_METHOD1(isScreen, bool(const String&)); + MockConfig() : Config() { } + MOCK_METHOD0(getInputFilter, InputFilter*()); + MOCK_CONST_METHOD1(isScreen, bool(const String&)); }; diff --git a/src/test/mock/server/MockInputFilter.h b/src/test/mock/server/MockInputFilter.h index f8869f04..12815752 100644 --- a/src/test/mock/server/MockInputFilter.h +++ b/src/test/mock/server/MockInputFilter.h @@ -26,5 +26,5 @@ class MockInputFilter : public InputFilter { public: - MOCK_METHOD1(setPrimaryClient, void(PrimaryClient*)); + MOCK_METHOD1(setPrimaryClient, void(PrimaryClient*)); }; diff --git a/src/test/mock/server/MockPrimaryClient.h b/src/test/mock/server/MockPrimaryClient.h index 21c41060..253a6ceb 100644 --- a/src/test/mock/server/MockPrimaryClient.h +++ b/src/test/mock/server/MockPrimaryClient.h @@ -27,15 +27,15 @@ class MockPrimaryClient : public PrimaryClient { public: - MOCK_CONST_METHOD0(getEventTarget, void*()); - MOCK_CONST_METHOD2(getCursorPos, void(SInt32&, SInt32&)); - MOCK_CONST_METHOD2(setJumpCursorPos, void(SInt32, SInt32)); - MOCK_METHOD1(reconfigure, void(UInt32)); - MOCK_METHOD0(resetOptions, void()); - MOCK_METHOD1(setOptions, void(const OptionsList&)); - MOCK_METHOD0(enable, void()); - MOCK_METHOD0(disable, void()); - MOCK_METHOD2(registerHotKey, UInt32(KeyID, KeyModifierMask)); - MOCK_CONST_METHOD0(getToggleMask, KeyModifierMask()); - MOCK_METHOD1(unregisterHotKey, void(UInt32)); + MOCK_CONST_METHOD0(getEventTarget, void*()); + MOCK_CONST_METHOD2(getCursorPos, void(SInt32&, SInt32&)); + MOCK_CONST_METHOD2(setJumpCursorPos, void(SInt32, SInt32)); + MOCK_METHOD1(reconfigure, void(UInt32)); + MOCK_METHOD0(resetOptions, void()); + MOCK_METHOD1(setOptions, void(const OptionsList&)); + MOCK_METHOD0(enable, void()); + MOCK_METHOD0(disable, void()); + MOCK_METHOD2(registerHotKey, UInt32(KeyID, KeyModifierMask)); + MOCK_CONST_METHOD0(getToggleMask, KeyModifierMask()); + MOCK_METHOD1(unregisterHotKey, void(UInt32)); }; diff --git a/src/test/mock/server/MockServer.h b/src/test/mock/server/MockServer.h index 546a5993..a2fa75b0 100644 --- a/src/test/mock/server/MockServer.h +++ b/src/test/mock/server/MockServer.h @@ -28,5 +28,5 @@ class IEventQueue; class MockServer : public Server { public: - MockServer() : Server() { } + MockServer() : Server() { } }; diff --git a/src/test/mock/synergy/MockApp.h b/src/test/mock/synergy/MockApp.h index dfe3f955..ba437b4d 100644 --- a/src/test/mock/synergy/MockApp.h +++ b/src/test/mock/synergy/MockApp.h @@ -26,19 +26,19 @@ class MockApp : public App { public: - MockApp() : App(NULL, NULL, NULL) { } + MockApp() : App(NULL, NULL, NULL) { } - MOCK_METHOD0(help, void()); - MOCK_METHOD0(loadConfig, void()); - MOCK_METHOD1(loadConfig, bool(const String&)); - MOCK_CONST_METHOD0(daemonInfo, const char*()); - MOCK_CONST_METHOD0(daemonName, const char*()); - MOCK_METHOD2(parseArgs, void(int, const char* const*)); - MOCK_METHOD0(version, void()); - MOCK_METHOD2(standardStartup, int(int, char**)); - MOCK_METHOD4(runInner, int(int, char**, ILogOutputter*, StartupFunc)); - MOCK_METHOD0(startNode, void()); - MOCK_METHOD0(mainLoop, int()); - MOCK_METHOD2(foregroundStartup, int(int, char**)); - MOCK_METHOD0(createScreen, synergy::Screen*()); + MOCK_METHOD0(help, void()); + MOCK_METHOD0(loadConfig, void()); + MOCK_METHOD1(loadConfig, bool(const String&)); + MOCK_CONST_METHOD0(daemonInfo, const char*()); + MOCK_CONST_METHOD0(daemonName, const char*()); + MOCK_METHOD2(parseArgs, void(int, const char* const*)); + MOCK_METHOD0(version, void()); + MOCK_METHOD2(standardStartup, int(int, char**)); + MOCK_METHOD4(runInner, int(int, char**, ILogOutputter*, StartupFunc)); + MOCK_METHOD0(startNode, void()); + MOCK_METHOD0(mainLoop, int()); + MOCK_METHOD2(foregroundStartup, int(int, char**)); + MOCK_METHOD0(createScreen, synergy::Screen*()); }; diff --git a/src/test/mock/synergy/MockArgParser.h b/src/test/mock/synergy/MockArgParser.h index 33e1849a..66b14057 100644 --- a/src/test/mock/synergy/MockArgParser.h +++ b/src/test/mock/synergy/MockArgParser.h @@ -26,8 +26,8 @@ class MockArgParser : public ArgParser { public: - MockArgParser() : ArgParser(NULL) { } + MockArgParser() : ArgParser(NULL) { } - MOCK_METHOD3(parseGenericArgs, bool(int, const char* const*, int&)); - MOCK_METHOD0(checkUnexpectedArgs, bool()); + MOCK_METHOD3(parseGenericArgs, bool(int, const char* const*, int&)); + MOCK_METHOD0(checkUnexpectedArgs, bool()); }; diff --git a/src/test/mock/synergy/MockEventQueue.h b/src/test/mock/synergy/MockEventQueue.h index fedc226c..dbfbe3bb 100644 --- a/src/test/mock/synergy/MockEventQueue.h +++ b/src/test/mock/synergy/MockEventQueue.h @@ -25,43 +25,43 @@ class MockEventQueue : public IEventQueue { public: - MOCK_METHOD0(loop, void()); - MOCK_METHOD2(newOneShotTimer, EventQueueTimer*(double, void*)); - MOCK_METHOD2(newTimer, EventQueueTimer*(double, void*)); - MOCK_METHOD2(getEvent, bool(Event&, double)); - MOCK_METHOD1(adoptBuffer, void(IEventQueueBuffer*)); - MOCK_METHOD2(registerTypeOnce, Event::Type(Event::Type&, const char*)); - MOCK_METHOD1(removeHandlers, void(void*)); - MOCK_METHOD1(registerType, Event::Type(const char*)); - MOCK_CONST_METHOD0(isEmpty, bool()); - MOCK_METHOD3(adoptHandler, void(Event::Type, void*, IEventJob*)); - MOCK_METHOD1(getTypeName, const char*(Event::Type)); - MOCK_METHOD1(addEvent, void(const Event&)); - MOCK_METHOD2(removeHandler, void(Event::Type, void*)); - MOCK_METHOD1(dispatchEvent, bool(const Event&)); - MOCK_CONST_METHOD2(getHandler, IEventJob*(Event::Type, void*)); - MOCK_METHOD1(deleteTimer, void(EventQueueTimer*)); - MOCK_CONST_METHOD1(getRegisteredType, Event::Type(const String&)); - MOCK_METHOD0(getSystemTarget, void*()); - MOCK_METHOD0(forClient, ClientEvents&()); - MOCK_METHOD0(forIStream, IStreamEvents&()); - MOCK_METHOD0(forIpcClient, IpcClientEvents&()); - MOCK_METHOD0(forIpcClientProxy, IpcClientProxyEvents&()); - MOCK_METHOD0(forIpcServer, IpcServerEvents&()); - MOCK_METHOD0(forIpcServerProxy, IpcServerProxyEvents&()); - MOCK_METHOD0(forIDataSocket, IDataSocketEvents&()); - MOCK_METHOD0(forIListenSocket, IListenSocketEvents&()); - MOCK_METHOD0(forISocket, ISocketEvents&()); - MOCK_METHOD0(forOSXScreen, OSXScreenEvents&()); - MOCK_METHOD0(forClientListener, ClientListenerEvents&()); - MOCK_METHOD0(forClientProxy, ClientProxyEvents&()); - MOCK_METHOD0(forClientProxyUnknown, ClientProxyUnknownEvents&()); - MOCK_METHOD0(forServer, ServerEvents&()); - MOCK_METHOD0(forServerApp, ServerAppEvents&()); - MOCK_METHOD0(forIKeyState, IKeyStateEvents&()); - MOCK_METHOD0(forIPrimaryScreen, IPrimaryScreenEvents&()); - MOCK_METHOD0(forIScreen, IScreenEvents&()); - MOCK_METHOD0(forClipboard, ClipboardEvents&()); - MOCK_METHOD0(forFile, FileEvents&()); - MOCK_CONST_METHOD0(waitForReady, void()); + MOCK_METHOD0(loop, void()); + MOCK_METHOD2(newOneShotTimer, EventQueueTimer*(double, void*)); + MOCK_METHOD2(newTimer, EventQueueTimer*(double, void*)); + MOCK_METHOD2(getEvent, bool(Event&, double)); + MOCK_METHOD1(adoptBuffer, void(IEventQueueBuffer*)); + MOCK_METHOD2(registerTypeOnce, Event::Type(Event::Type&, const char*)); + MOCK_METHOD1(removeHandlers, void(void*)); + MOCK_METHOD1(registerType, Event::Type(const char*)); + MOCK_CONST_METHOD0(isEmpty, bool()); + MOCK_METHOD3(adoptHandler, void(Event::Type, void*, IEventJob*)); + MOCK_METHOD1(getTypeName, const char*(Event::Type)); + MOCK_METHOD1(addEvent, void(const Event&)); + MOCK_METHOD2(removeHandler, void(Event::Type, void*)); + MOCK_METHOD1(dispatchEvent, bool(const Event&)); + MOCK_CONST_METHOD2(getHandler, IEventJob*(Event::Type, void*)); + MOCK_METHOD1(deleteTimer, void(EventQueueTimer*)); + MOCK_CONST_METHOD1(getRegisteredType, Event::Type(const String&)); + MOCK_METHOD0(getSystemTarget, void*()); + MOCK_METHOD0(forClient, ClientEvents&()); + MOCK_METHOD0(forIStream, IStreamEvents&()); + MOCK_METHOD0(forIpcClient, IpcClientEvents&()); + MOCK_METHOD0(forIpcClientProxy, IpcClientProxyEvents&()); + MOCK_METHOD0(forIpcServer, IpcServerEvents&()); + MOCK_METHOD0(forIpcServerProxy, IpcServerProxyEvents&()); + MOCK_METHOD0(forIDataSocket, IDataSocketEvents&()); + MOCK_METHOD0(forIListenSocket, IListenSocketEvents&()); + MOCK_METHOD0(forISocket, ISocketEvents&()); + MOCK_METHOD0(forOSXScreen, OSXScreenEvents&()); + MOCK_METHOD0(forClientListener, ClientListenerEvents&()); + MOCK_METHOD0(forClientProxy, ClientProxyEvents&()); + MOCK_METHOD0(forClientProxyUnknown, ClientProxyUnknownEvents&()); + MOCK_METHOD0(forServer, ServerEvents&()); + MOCK_METHOD0(forServerApp, ServerAppEvents&()); + MOCK_METHOD0(forIKeyState, IKeyStateEvents&()); + MOCK_METHOD0(forIPrimaryScreen, IPrimaryScreenEvents&()); + MOCK_METHOD0(forIScreen, IScreenEvents&()); + MOCK_METHOD0(forClipboard, ClipboardEvents&()); + MOCK_METHOD0(forFile, FileEvents&()); + MOCK_CONST_METHOD0(waitForReady, void()); }; diff --git a/src/test/mock/synergy/MockKeyMap.h b/src/test/mock/synergy/MockKeyMap.h index 40923121..d1419ec4 100644 --- a/src/test/mock/synergy/MockKeyMap.h +++ b/src/test/mock/synergy/MockKeyMap.h @@ -25,12 +25,12 @@ class MockKeyMap : public synergy::KeyMap { public: - MOCK_METHOD1(swap, void(KeyMap&)); - MOCK_METHOD0(finish, void()); - MOCK_METHOD2(foreachKey, void(ForeachKeyCallback, void*)); - MOCK_METHOD1(addHalfDuplexModifier, void(KeyID)); - MOCK_CONST_METHOD2(isHalfDuplex, bool(KeyID, KeyButton)); - MOCK_CONST_METHOD7(mapKey, const KeyMap::KeyItem*( - Keystrokes&, KeyID, SInt32, ModifierToKeys&, KeyModifierMask&, - KeyModifierMask, bool)); + MOCK_METHOD1(swap, void(KeyMap&)); + MOCK_METHOD0(finish, void()); + MOCK_METHOD2(foreachKey, void(ForeachKeyCallback, void*)); + MOCK_METHOD1(addHalfDuplexModifier, void(KeyID)); + MOCK_CONST_METHOD2(isHalfDuplex, bool(KeyID, KeyButton)); + MOCK_CONST_METHOD7(mapKey, const KeyMap::KeyItem*( + Keystrokes&, KeyID, SInt32, ModifierToKeys&, KeyModifierMask&, + KeyModifierMask, bool)); }; diff --git a/src/test/mock/synergy/MockKeyState.h b/src/test/mock/synergy/MockKeyState.h index 37823315..052201c7 100644 --- a/src/test/mock/synergy/MockKeyState.h +++ b/src/test/mock/synergy/MockKeyState.h @@ -30,23 +30,23 @@ class MockEventQueue; class MockKeyState : public KeyState { public: - MockKeyState(const MockEventQueue& eventQueue) : - KeyState((IEventQueue*)&eventQueue) - { - } + MockKeyState(const MockEventQueue& eventQueue) : + KeyState((IEventQueue*)&eventQueue) + { + } - MockKeyState(const MockEventQueue& eventQueue, const MockKeyMap& keyMap) : - KeyState((IEventQueue*)&eventQueue, (synergy::KeyMap&)keyMap) - { - } + MockKeyState(const MockEventQueue& eventQueue, const MockKeyMap& keyMap) : + KeyState((IEventQueue*)&eventQueue, (synergy::KeyMap&)keyMap) + { + } - MOCK_CONST_METHOD0(pollActiveGroup, SInt32()); - MOCK_CONST_METHOD0(pollActiveModifiers, KeyModifierMask()); - MOCK_METHOD0(fakeCtrlAltDel, bool()); - MOCK_METHOD1(getKeyMap, void(synergy::KeyMap&)); - MOCK_METHOD1(fakeKey, void(const Keystroke&)); - MOCK_METHOD1(fakeMediaKey, bool(KeyID)); - MOCK_CONST_METHOD1(pollPressedKeys, void(KeyButtonSet&)); + MOCK_CONST_METHOD0(pollActiveGroup, SInt32()); + MOCK_CONST_METHOD0(pollActiveModifiers, KeyModifierMask()); + MOCK_METHOD0(fakeCtrlAltDel, bool()); + MOCK_METHOD1(getKeyMap, void(synergy::KeyMap&)); + MOCK_METHOD1(fakeKey, void(const Keystroke&)); + MOCK_METHOD1(fakeMediaKey, bool(KeyID)); + MOCK_CONST_METHOD1(pollPressedKeys, void(KeyButtonSet&)); }; typedef ::testing::NiceMock KeyStateImpl; @@ -54,4 +54,4 @@ typedef ::testing::NiceMock KeyStateImpl; typedef UInt32 KeyID; typedef void (*ForeachKeyCallback)( - KeyID, SInt32 group, synergy::KeyMap::KeyItem&, void* userData); + KeyID, SInt32 group, synergy::KeyMap::KeyItem&, void* userData); diff --git a/src/test/mock/synergy/MockScreen.h b/src/test/mock/synergy/MockScreen.h index 47f2917c..2ad2f8e3 100644 --- a/src/test/mock/synergy/MockScreen.h +++ b/src/test/mock/synergy/MockScreen.h @@ -26,11 +26,11 @@ class MockScreen : public synergy::Screen { public: - MockScreen() : synergy::Screen() { } - MOCK_METHOD0(disable, void()); - MOCK_CONST_METHOD4(getShape, void(SInt32&, SInt32&, SInt32&, SInt32&)); - MOCK_CONST_METHOD2(getCursorPos, void(SInt32&, SInt32&)); - MOCK_METHOD0(resetOptions, void()); - MOCK_METHOD1(setOptions, void(const OptionsList&)); - MOCK_METHOD0(enable, void()); + MockScreen() : synergy::Screen() { } + MOCK_METHOD0(disable, void()); + MOCK_CONST_METHOD4(getShape, void(SInt32&, SInt32&, SInt32&, SInt32&)); + MOCK_CONST_METHOD2(getCursorPos, void(SInt32&, SInt32&)); + MOCK_METHOD0(resetOptions, void()); + MOCK_METHOD1(setOptions, void(const OptionsList&)); + MOCK_METHOD0(enable, void()); }; diff --git a/src/test/unittests/CMakeLists.txt b/src/test/unittests/CMakeLists.txt index 3e49dc3c..9d422f7f 100644 --- a/src/test/unittests/CMakeLists.txt +++ b/src/test/unittests/CMakeLists.txt @@ -35,37 +35,37 @@ list(APPEND sources ${mock_sources}) # platform if (WIN32) - file(GLOB platform_sources "platform/MSWindows*.cpp") - file(GLOB platform_headers "platform/MSWindows*.h") + file(GLOB platform_sources "platform/MSWindows*.cpp") + file(GLOB platform_headers "platform/MSWindows*.h") elseif (APPLE) - file(GLOB platform_sources "platform/OSX*.cpp") - file(GLOB platform_headers "platform/OSX*.h") + file(GLOB platform_sources "platform/OSX*.cpp") + file(GLOB platform_headers "platform/OSX*.h") elseif (UNIX) - file(GLOB platform_sources "platform/XWindows*.cpp") - file(GLOB platform_headers "platform/XWindows*.h") + file(GLOB platform_sources "platform/XWindows*.cpp") + file(GLOB platform_headers "platform/XWindows*.h") endif() list(APPEND sources ${platform_headers}) list(APPEND headers ${platform_sources}) include_directories( - ../../ - ../../lib/ - ../../../ext/gtest-1.6.0/include - ../../../ext/gmock-1.6.0/include - ../../../ext + ../../ + ../../lib/ + ../../../ext/gtest-1.6.0/include + ../../../ext/gmock-1.6.0/include + ../../../ext ) if (UNIX) - include_directories( - ../../.. - ) + include_directories( + ../../.. + ) endif() if (SYNERGY_ADD_HEADERS) - list(APPEND sources ${headers}) + list(APPEND sources ${headers}) endif() add_executable(unittests ${sources}) target_link_libraries(unittests - arch base client server common io net platform server synergy mt ipc gtest gmock shared ${libs} ${OPENSSL_LIBS}) + arch base client server common io net platform server synergy mt ipc gtest gmock shared ${libs} ${OPENSSL_LIBS}) diff --git a/src/test/unittests/Main.cpp b/src/test/unittests/Main.cpp index 16ff8006..46e586a5 100644 --- a/src/test/unittests/Main.cpp +++ b/src/test/unittests/Main.cpp @@ -29,17 +29,17 @@ int main(int argc, char **argv) { #if SYSAPI_WIN32 - // HACK: shouldn't be needed, but logging fails without this. - ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); + // HACK: shouldn't be needed, but logging fails without this. + ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL)); #endif - Arch arch; - arch.init(); - - Log log; - log.setFilter(kDEBUG4); + Arch arch; + arch.init(); + + Log log; + log.setFilter(kDEBUG4); - testing::InitGoogleTest(&argc, argv); + testing::InitGoogleTest(&argc, argv); // gtest seems to randomly finish with error codes (e.g. -1, -1073741819) // even when no tests have failed. not sure what causes this, but it diff --git a/src/test/unittests/base/StringTests.cpp b/src/test/unittests/base/StringTests.cpp index 35e9a1c0..7d5e939e 100644 --- a/src/test/unittests/base/StringTests.cpp +++ b/src/test/unittests/base/StringTests.cpp @@ -23,155 +23,155 @@ using namespace synergy; TEST(StringTests, format_formatWithArguments_formatedString) { - const char* format = "%%%{1}=%{2}"; - const char* arg1 = "answer"; - const char* arg2 = "42"; + const char* format = "%%%{1}=%{2}"; + const char* arg1 = "answer"; + const char* arg2 = "42"; - String result = string::format(format, arg1, arg2); + String result = string::format(format, arg1, arg2); - EXPECT_EQ("%answer=42", result); + EXPECT_EQ("%answer=42", result); } TEST(StringTests, findReplaceAll_inputString_replacedString) { - String subject = "foobar"; - String find = "bar"; - String replace = "baz"; + String subject = "foobar"; + String find = "bar"; + String replace = "baz"; - string::findReplaceAll(subject, find, replace); + string::findReplaceAll(subject, find, replace); - EXPECT_EQ("foobaz", subject); + EXPECT_EQ("foobaz", subject); } TEST(StringTests, sprintf_formatWithArgument_formatedString) { - const char* format = "%s=%d"; - const char* arg1 = "answer"; - int arg2 = 42; + const char* format = "%s=%d"; + const char* arg1 = "answer"; + int arg2 = 42; - String result = string::sprintf(format, arg1, arg2); + String result = string::sprintf(format, arg1, arg2); - EXPECT_EQ("answer=42", result); + EXPECT_EQ("answer=42", result); } TEST(StringTests, toHex_plaintext_hexString) { - String subject = "foobar"; - int width = 2; + String subject = "foobar"; + int width = 2; - string::toHex(subject, width); + string::toHex(subject, width); - EXPECT_EQ("666f6f626172", subject); + EXPECT_EQ("666f6f626172", subject); } TEST(StringTests, uppercase_lowercaseInput_uppercaseOutput) { - String subject = "12foo3BaR"; + String subject = "12foo3BaR"; - string::uppercase(subject); + string::uppercase(subject); - EXPECT_EQ("12FOO3BAR", subject); + EXPECT_EQ("12FOO3BAR", subject); } TEST(StringTests, removeChar_inputString_removeAllSpecifiedCharactors) { - String subject = "foobar"; - const char c = 'o'; + String subject = "foobar"; + const char c = 'o'; - string::removeChar(subject, c); + string::removeChar(subject, c); - EXPECT_EQ("fbar", subject); + EXPECT_EQ("fbar", subject); } TEST(StringTests, intToString_inputInt_outputString) { - size_t value = 123; + size_t value = 123; - String number = string::sizeTypeToString(value); + String number = string::sizeTypeToString(value); - EXPECT_EQ("123", number); + EXPECT_EQ("123", number); } TEST(StringTests, stringToUint_inputString_outputInt) { - String number = "123"; + String number = "123"; - size_t value = string::stringToSizeType(number); + size_t value = string::stringToSizeType(number); - EXPECT_EQ(123, value); + EXPECT_EQ(123, value); } TEST(StringTests, splitString_twoSeparator_returnThreeParts) { - String string = "stub1:stub2:stub3"; + String string = "stub1:stub2:stub3"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(3, results.size()); - EXPECT_EQ("stub1", results[0]); - EXPECT_EQ("stub2", results[1]); - EXPECT_EQ("stub3", results[2]); + EXPECT_EQ(3, results.size()); + EXPECT_EQ("stub1", results[0]); + EXPECT_EQ("stub2", results[1]); + EXPECT_EQ("stub3", results[2]); } TEST(StringTests, splitString_oneSeparator_returnTwoParts) { - String string = "stub1:stub2"; + String string = "stub1:stub2"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(2, results.size()); - EXPECT_EQ("stub1", results[0]); - EXPECT_EQ("stub2", results[1]); + EXPECT_EQ(2, results.size()); + EXPECT_EQ("stub1", results[0]); + EXPECT_EQ("stub2", results[1]); } TEST(StringTests, splitString_noSeparator_returnOriginalString) { - String string = "stub1"; + String string = "stub1"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(1, results.size()); - EXPECT_EQ("stub1", results[0]); + EXPECT_EQ(1, results.size()); + EXPECT_EQ("stub1", results[0]); } TEST(StringTests, splitString_emptyString_returnEmptyVector) { - String string; + String string; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(0, results.size()); + EXPECT_EQ(0, results.size()); } TEST(StringTests, splitString_tailSeparator_returnTwoParts) { - String string = "stub1:stub2:"; + String string = "stub1:stub2:"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(2, results.size()); - EXPECT_EQ("stub1", results[0]); - EXPECT_EQ("stub2", results[1]); + EXPECT_EQ(2, results.size()); + EXPECT_EQ("stub1", results[0]); + EXPECT_EQ("stub2", results[1]); } TEST(StringTests, splitString_headSeparator_returnTwoParts) { - String string = ":stub1:stub2"; + String string = ":stub1:stub2"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(2, results.size()); - EXPECT_EQ("stub1", results[0]); - EXPECT_EQ("stub2", results[1]); + EXPECT_EQ(2, results.size()); + EXPECT_EQ("stub1", results[0]); + EXPECT_EQ("stub2", results[1]); } TEST(StringTests, splitString_headAndTailSeparators_returnTwoParts) { - String string = ":stub1:stub2:"; + String string = ":stub1:stub2:"; - std::vector results = string::splitString(string, ':'); + std::vector results = string::splitString(string, ':'); - EXPECT_EQ(2, results.size()); - EXPECT_EQ("stub1", results[0]); - EXPECT_EQ("stub2", results[1]); + EXPECT_EQ(2, results.size()); + EXPECT_EQ("stub1", results[0]); + EXPECT_EQ("stub2", results[1]); } diff --git a/src/test/unittests/ipc/IpcLogOutputterTests.cpp b/src/test/unittests/ipc/IpcLogOutputterTests.cpp index c512a6af..22adfdf1 100644 --- a/src/test/unittests/ipc/IpcLogOutputterTests.cpp +++ b/src/test/unittests/ipc/IpcLogOutputterTests.cpp @@ -41,63 +41,63 @@ using ::testing::AtLeast; using namespace synergy; inline const Matcher IpcLogLineMessageEq(const String& s) { - const Matcher m( - Property(&IpcLogLineMessage::logLine, StrEq(s))); - return MatcherCast(m); + const Matcher m( + Property(&IpcLogLineMessage::logLine, StrEq(s))); + return MatcherCast(m); } TEST(IpcLogOutputterTests, write_threadingEnabled_bufferIsSent) { - MockIpcServer mockServer; - mockServer.delegateToFake(); - - ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); + MockIpcServer mockServer; + mockServer.delegateToFake(); + + ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); - EXPECT_CALL(mockServer, hasClients(_)).Times(AtLeast(3)); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\n"), _)).Times(1); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 2\n"), _)).Times(1); + EXPECT_CALL(mockServer, hasClients(_)).Times(AtLeast(3)); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\n"), _)).Times(1); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 2\n"), _)).Times(1); - IpcLogOutputter outputter(mockServer, kIpcClientUnknown, true); - outputter.write(kNOTE, "mock 1"); - mockServer.waitForSend(); - outputter.write(kNOTE, "mock 2"); - mockServer.waitForSend(); + IpcLogOutputter outputter(mockServer, kIpcClientUnknown, true); + outputter.write(kNOTE, "mock 1"); + mockServer.waitForSend(); + outputter.write(kNOTE, "mock 2"); + mockServer.waitForSend(); } TEST(IpcLogOutputterTests, write_overBufferMaxSize_firstLineTruncated) { - MockIpcServer mockServer; - - ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); - EXPECT_CALL(mockServer, hasClients(_)).Times(1); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 2\nmock 3\n"), _)).Times(1); + MockIpcServer mockServer; + + ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); + EXPECT_CALL(mockServer, hasClients(_)).Times(1); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 2\nmock 3\n"), _)).Times(1); - IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); - outputter.bufferMaxSize(2); + IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); + outputter.bufferMaxSize(2); - // log more lines than the buffer can contain - outputter.write(kNOTE, "mock 1"); - outputter.write(kNOTE, "mock 2"); - outputter.write(kNOTE, "mock 3"); - outputter.sendBuffer(); + // log more lines than the buffer can contain + outputter.write(kNOTE, "mock 1"); + outputter.write(kNOTE, "mock 2"); + outputter.write(kNOTE, "mock 3"); + outputter.sendBuffer(); } TEST(IpcLogOutputterTests, write_underBufferMaxSize_allLinesAreSent) { - MockIpcServer mockServer; - - ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); + MockIpcServer mockServer; + + ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); - EXPECT_CALL(mockServer, hasClients(_)).Times(1); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); + EXPECT_CALL(mockServer, hasClients(_)).Times(1); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); - IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); - outputter.bufferMaxSize(2); + IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); + outputter.bufferMaxSize(2); - // log more lines than the buffer can contain - outputter.write(kNOTE, "mock 1"); - outputter.write(kNOTE, "mock 2"); - outputter.sendBuffer(); + // log more lines than the buffer can contain + outputter.write(kNOTE, "mock 1"); + outputter.write(kNOTE, "mock 2"); + outputter.sendBuffer(); } // HACK: temporarily disable this intermittently failing unit test. @@ -106,60 +106,60 @@ TEST(IpcLogOutputterTests, write_underBufferMaxSize_allLinesAreSent) #if 0 TEST(IpcLogOutputterTests, write_overBufferRateLimit_lastLineTruncated) { - MockIpcServer mockServer; - - ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); + MockIpcServer mockServer; + + ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); - EXPECT_CALL(mockServer, hasClients(_)).Times(2); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 4\nmock 5\n"), _)).Times(1); + EXPECT_CALL(mockServer, hasClients(_)).Times(2); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 4\nmock 5\n"), _)).Times(1); - IpcLogOutputter outputter(mockServer, false); - outputter.bufferRateLimit(2, 1); // 1s + IpcLogOutputter outputter(mockServer, false); + outputter.bufferRateLimit(2, 1); // 1s - // log 1 more line than the buffer can accept in time limit. - outputter.write(kNOTE, "mock 1"); - outputter.write(kNOTE, "mock 2"); - outputter.write(kNOTE, "mock 3"); + // log 1 more line than the buffer can accept in time limit. + outputter.write(kNOTE, "mock 1"); + outputter.write(kNOTE, "mock 2"); + outputter.write(kNOTE, "mock 3"); - outputter.sendBuffer(); - - // after waiting the time limit send another to make sure - // we can log after the time limit passes. - // HACK: sleep causes the unit test to fail intermittently, - // so lets try 100ms (there must be a better way to solve this) - ARCH->sleep(2); // 2s - outputter.write(kNOTE, "mock 4"); - outputter.write(kNOTE, "mock 5"); - outputter.write(kNOTE, "mock 6"); + outputter.sendBuffer(); + + // after waiting the time limit send another to make sure + // we can log after the time limit passes. + // HACK: sleep causes the unit test to fail intermittently, + // so lets try 100ms (there must be a better way to solve this) + ARCH->sleep(2); // 2s + outputter.write(kNOTE, "mock 4"); + outputter.write(kNOTE, "mock 5"); + outputter.write(kNOTE, "mock 6"); - outputter.sendBuffer(); + outputter.sendBuffer(); } #endif TEST(IpcLogOutputterTests, write_underBufferRateLimit_allLinesAreSent) { - MockIpcServer mockServer; - - ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); + MockIpcServer mockServer; + + ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true)); - EXPECT_CALL(mockServer, hasClients(_)).Times(2); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); - EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 3\nmock 4\n"), _)).Times(1); + EXPECT_CALL(mockServer, hasClients(_)).Times(2); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"), _)).Times(1); + EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 3\nmock 4\n"), _)).Times(1); - IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); - outputter.bufferRateLimit(4, 1); // 1s (should be plenty of time) + IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false); + outputter.bufferRateLimit(4, 1); // 1s (should be plenty of time) - // log 1 more line than the buffer can accept in time limit. - outputter.write(kNOTE, "mock 1"); - outputter.write(kNOTE, "mock 2"); - outputter.sendBuffer(); - - // after waiting the time limit send another to make sure - // we can log after the time limit passes. - outputter.write(kNOTE, "mock 3"); - outputter.write(kNOTE, "mock 4"); - outputter.sendBuffer(); + // log 1 more line than the buffer can accept in time limit. + outputter.write(kNOTE, "mock 1"); + outputter.write(kNOTE, "mock 2"); + outputter.sendBuffer(); + + // after waiting the time limit send another to make sure + // we can log after the time limit passes. + outputter.write(kNOTE, "mock 3"); + outputter.write(kNOTE, "mock 4"); + outputter.sendBuffer(); } #endif // WINAPI_MSWINDOWS diff --git a/src/test/unittests/platform/OSXKeyStateTests.cpp b/src/test/unittests/platform/OSXKeyStateTests.cpp index 5892e6c3..3222c19f 100644 --- a/src/test/unittests/platform/OSXKeyStateTests.cpp +++ b/src/test/unittests/platform/OSXKeyStateTests.cpp @@ -25,33 +25,33 @@ TEST(OSXKeyStateTests, mapModifiersFromOSX_OSXMask_returnSynergyMask) { - synergy::KeyMap keyMap; - MockEventQueue eventQueue; - OSXKeyState keyState(&eventQueue, keyMap); + synergy::KeyMap keyMap; + MockEventQueue eventQueue; + OSXKeyState keyState(&eventQueue, keyMap); - KeyModifierMask outMask = 0; - - UInt32 shiftMask = 0 | kCGEventFlagMaskShift; - outMask = keyState.mapModifiersFromOSX(shiftMask); - EXPECT_EQ(KeyModifierShift, outMask); - - UInt32 ctrlMask = 0 | kCGEventFlagMaskControl; - outMask = keyState.mapModifiersFromOSX(ctrlMask); - EXPECT_EQ(KeyModifierControl, outMask); - - UInt32 altMask = 0 | kCGEventFlagMaskAlternate; - outMask = keyState.mapModifiersFromOSX(altMask); - EXPECT_EQ(KeyModifierAlt, outMask); - - UInt32 cmdMask = 0 | kCGEventFlagMaskCommand; - outMask = keyState.mapModifiersFromOSX(cmdMask); - EXPECT_EQ(KeyModifierSuper, outMask); - - UInt32 capsMask = 0 | kCGEventFlagMaskAlphaShift; - outMask = keyState.mapModifiersFromOSX(capsMask); - EXPECT_EQ(KeyModifierCapsLock, outMask); - - UInt32 numMask = 0 | kCGEventFlagMaskNumericPad; - outMask = keyState.mapModifiersFromOSX(numMask); - EXPECT_EQ(KeyModifierNumLock, outMask); + KeyModifierMask outMask = 0; + + UInt32 shiftMask = 0 | kCGEventFlagMaskShift; + outMask = keyState.mapModifiersFromOSX(shiftMask); + EXPECT_EQ(KeyModifierShift, outMask); + + UInt32 ctrlMask = 0 | kCGEventFlagMaskControl; + outMask = keyState.mapModifiersFromOSX(ctrlMask); + EXPECT_EQ(KeyModifierControl, outMask); + + UInt32 altMask = 0 | kCGEventFlagMaskAlternate; + outMask = keyState.mapModifiersFromOSX(altMask); + EXPECT_EQ(KeyModifierAlt, outMask); + + UInt32 cmdMask = 0 | kCGEventFlagMaskCommand; + outMask = keyState.mapModifiersFromOSX(cmdMask); + EXPECT_EQ(KeyModifierSuper, outMask); + + UInt32 capsMask = 0 | kCGEventFlagMaskAlphaShift; + outMask = keyState.mapModifiersFromOSX(capsMask); + EXPECT_EQ(KeyModifierCapsLock, outMask); + + UInt32 numMask = 0 | kCGEventFlagMaskNumericPad; + outMask = keyState.mapModifiersFromOSX(numMask); + EXPECT_EQ(KeyModifierNumLock, outMask); } diff --git a/src/test/unittests/shared/SerialKeyTests.cpp b/src/test/unittests/shared/SerialKeyTests.cpp index 126d26e8..37d811d4 100644 --- a/src/test/unittests/shared/SerialKeyTests.cpp +++ b/src/test/unittests/shared/SerialKeyTests.cpp @@ -23,125 +23,125 @@ TEST(SerialKeyTests, decode_empty_returnEmptyString) { - std::string plainText = SerialKey::decode(""); - EXPECT_EQ(0, plainText.size()); + std::string plainText = SerialKey::decode(""); + EXPECT_EQ(0, plainText.size()); } TEST(SerialKeyTests, decode_invalidDigit_returnEmptyString) { - std::string plainText = SerialKey::decode("MOCKZ"); - EXPECT_EQ(0, plainText.size()); + std::string plainText = SerialKey::decode("MOCKZ"); + EXPECT_EQ(0, plainText.size()); } TEST(SerialKeyTests, decode_validSerial_returnPlainText) { - std::string plainText = SerialKey::decode("53796E6572677920726F636B7321"); - EXPECT_EQ("Synergy rocks!", plainText); + std::string plainText = SerialKey::decode("53796E6572677920726F636B7321"); + EXPECT_EQ("Synergy rocks!", plainText); } TEST(SerialKeyTests, parse_noParty_invalid) { - SerialKey serial; - bool r = serial.parse("MOCK"); - EXPECT_FALSE(r); + SerialKey serial; + bool r = serial.parse("MOCK"); + EXPECT_FALSE(r); } TEST(SerialKeyTests, parse_invalidPartsLenghth_invalid) { - SerialKey serial; - bool r = serial.parse("{Synergy;Rocks}"); - EXPECT_FALSE(r); + SerialKey serial; + bool r = serial.parse("{Synergy;Rocks}"); + EXPECT_FALSE(r); } TEST(SerialKeyTests, parse_validV1Serial_valid) { - SerialKey serial; - bool r = serial.parse("{v1;basic;Bob;1;email;company name;0;86400}"); - EXPECT_EQ(true, r); - EXPECT_EQ(kBasic, serial.edition()); - EXPECT_FALSE(serial.isExpired(0)); - EXPECT_EQ(true, serial.daysLeft(0)); - EXPECT_FALSE(serial.isExpiring(1)); + SerialKey serial; + bool r = serial.parse("{v1;basic;Bob;1;email;company name;0;86400}"); + EXPECT_EQ(true, r); + EXPECT_EQ(kBasic, serial.edition()); + EXPECT_FALSE(serial.isExpired(0)); + EXPECT_EQ(true, serial.daysLeft(0)); + EXPECT_FALSE(serial.isExpiring(1)); } TEST(SerialKeyTests, parse_validV2Serial_valid) { - SerialKey serial; - bool r = serial.parse("{v2;trial;pro;Bob;1;email;company name;0;86400}"); - EXPECT_EQ(true, r); - EXPECT_EQ(kPro, serial.edition()); - EXPECT_FALSE(serial.isExpired(0)); - EXPECT_EQ(true, serial.daysLeft(0)); - EXPECT_EQ(true, serial.isExpiring(1)); - EXPECT_EQ(true, serial.isTrial()); + SerialKey serial; + bool r = serial.parse("{v2;trial;pro;Bob;1;email;company name;0;86400}"); + EXPECT_EQ(true, r); + EXPECT_EQ(kPro, serial.edition()); + EXPECT_FALSE(serial.isExpired(0)); + EXPECT_EQ(true, serial.daysLeft(0)); + EXPECT_EQ(true, serial.isExpiring(1)); + EXPECT_EQ(true, serial.isTrial()); } TEST(SerialKeyTests, isExpiring_validV2TrialBasicSerial_returnFalse) { - // {v2;trial;basic;Bob;1;email;company name;1;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B313B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_FALSE(serial.isExpiring(0)); - EXPECT_EQ(kBasic, serial.edition()); + // {v2;trial;basic;Bob;1;email;company name;1;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B313B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_FALSE(serial.isExpiring(0)); + EXPECT_EQ(kBasic, serial.edition()); } TEST(SerialKeyTests, isExpiring_expiringV2TrialBasicSerial_returnTrue) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_EQ(true, serial.isExpiring(1)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_EQ(true, serial.isExpiring(1)); } TEST(SerialKeyTests, isExpiring_expiredV2TrialBasicSerial_returnFalse) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_FALSE(serial.isExpiring(86401)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_FALSE(serial.isExpiring(86401)); } TEST(SerialKeyTests, isExpired_validV2TrialBasicSerial_returnFalse) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_FALSE(serial.isExpired(0)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_FALSE(serial.isExpired(0)); } TEST(SerialKeyTests, isExpired_expiringV2TrialBasicSerial_returnFalse) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_FALSE(serial.isExpired(1)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_FALSE(serial.isExpired(1)); } TEST(SerialKeyTests, isExpired_expiredV2TrialBasicSerial_returnTrue) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(true, serial.isTrial()); - EXPECT_EQ(true, serial.isExpired(86401)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(true, serial.isTrial()); + EXPECT_EQ(true, serial.isExpired(86401)); } TEST(SerialKeyTests, daysLeft_validExactlyOneDayV2TrialBasicSerial_returnOne) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(1, serial.daysLeft(0)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(1, serial.daysLeft(0)); } TEST(SerialKeyTests, daysLeft_validWithinOneDayV2TrialBasicSerial_returnOne) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(1, serial.daysLeft(1)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(1, serial.daysLeft(1)); } TEST(SerialKeyTests, daysLeft_expiredV2TrialBasicSerial_returnZero) { - // {v2;trial;basic;Bob;1;email;company name;0;86400} - SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); - EXPECT_EQ(0, serial.daysLeft(86401)); + // {v2;trial;basic;Bob;1;email;company name;0;86400} + SerialKey serial("7B76323B747269616C3B62617369633B426F623B313B656D61696C3B636F6D70616E79206E616D653B303B38363430307D"); + EXPECT_EQ(0, serial.daysLeft(86401)); } diff --git a/src/test/unittests/synergy/ArgParserTests.cpp b/src/test/unittests/synergy/ArgParserTests.cpp index 25a5618f..504b690e 100644 --- a/src/test/unittests/synergy/ArgParserTests.cpp +++ b/src/test/unittests/synergy/ArgParserTests.cpp @@ -22,186 +22,186 @@ TEST(ArgParserTests, isArg_abbreviationsArg_returnTrue) { - int i = 1; - const int argc = 2; - const char* argv[argc] = { "stub", "-t" }; - bool result = ArgParser::isArg(i, argc, argv, "-t", NULL); + int i = 1; + const int argc = 2; + const char* argv[argc] = { "stub", "-t" }; + bool result = ArgParser::isArg(i, argc, argv, "-t", NULL); - EXPECT_EQ(true, result); + EXPECT_EQ(true, result); } TEST(ArgParserTests, isArg_fullArg_returnTrue) { - int i = 1; - const int argc = 2; - const char* argv[argc] = { "stub", "--test" }; - bool result = ArgParser::isArg(i, argc, argv, NULL, "--test"); + int i = 1; + const int argc = 2; + const char* argv[argc] = { "stub", "--test" }; + bool result = ArgParser::isArg(i, argc, argv, NULL, "--test"); - EXPECT_EQ(true, result); + EXPECT_EQ(true, result); } TEST(ArgParserTests, isArg_missingArgs_returnFalse) { - int i = 1; - const int argc = 2; - const char* argv[argc] = { "stub", "-t" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); + int i = 1; + const int argc = 2; + const char* argv[argc] = { "stub", "-t" }; + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); - bool result = ArgParser::isArg(i, argc, argv, "-t", NULL, 1); + bool result = ArgParser::isArg(i, argc, argv, "-t", NULL, 1); - EXPECT_FALSE(result); - EXPECT_EQ(true, argsBase.m_shouldExit); + EXPECT_FALSE(result); + EXPECT_EQ(true, argsBase.m_shouldExit); } TEST(ArgParserTests, searchDoubleQuotes_doubleQuotedArg_returnTrue) { - String command("\"stub\""); - size_t left = 0; - size_t right = 0; + String command("\"stub\""); + size_t left = 0; + size_t right = 0; - bool result = ArgParser::searchDoubleQuotes(command, left, right); + bool result = ArgParser::searchDoubleQuotes(command, left, right); - EXPECT_EQ(true, result); - EXPECT_EQ(0, left); - EXPECT_EQ(5, right); + EXPECT_EQ(true, result); + EXPECT_EQ(0, left); + EXPECT_EQ(5, right); } TEST(ArgParserTests, searchDoubleQuotes_noDoubleQuotedArg_returnfalse) { - String command("stub"); - size_t left = 0; - size_t right = 0; + String command("stub"); + size_t left = 0; + size_t right = 0; - bool result = ArgParser::searchDoubleQuotes(command, left, right); + bool result = ArgParser::searchDoubleQuotes(command, left, right); - EXPECT_FALSE(result); - EXPECT_EQ(0, left); - EXPECT_EQ(0, right); + EXPECT_FALSE(result); + EXPECT_EQ(0, left); + EXPECT_EQ(0, right); } TEST(ArgParserTests, searchDoubleQuotes_oneDoubleQuoteArg_returnfalse) { - String command("\"stub"); - size_t left = 0; - size_t right = 0; + String command("\"stub"); + size_t left = 0; + size_t right = 0; - bool result = ArgParser::searchDoubleQuotes(command, left, right); + bool result = ArgParser::searchDoubleQuotes(command, left, right); - EXPECT_FALSE(result); - EXPECT_EQ(0, left); - EXPECT_EQ(0, right); + EXPECT_FALSE(result); + EXPECT_EQ(0, left); + EXPECT_EQ(0, right); } TEST(ArgParserTests, splitCommandString_oneArg_returnArgv) { - String command("stub"); - std::vector argv; + String command("stub"); + std::vector argv; - ArgParser::splitCommandString(command, argv); + ArgParser::splitCommandString(command, argv); - EXPECT_EQ(1, argv.size()); - EXPECT_EQ("stub", argv.at(0)); + EXPECT_EQ(1, argv.size()); + EXPECT_EQ("stub", argv.at(0)); } TEST(ArgParserTests, splitCommandString_twoArgs_returnArgv) { - String command("stub1 stub2"); - std::vector argv; + String command("stub1 stub2"); + std::vector argv; - ArgParser::splitCommandString(command, argv); + ArgParser::splitCommandString(command, argv); - EXPECT_EQ(2, argv.size()); - EXPECT_EQ("stub1", argv.at(0)); - EXPECT_EQ("stub2", argv.at(1)); + EXPECT_EQ(2, argv.size()); + EXPECT_EQ("stub1", argv.at(0)); + EXPECT_EQ("stub2", argv.at(1)); } TEST(ArgParserTests, splitCommandString_doubleQuotedArgs_returnArgv) { - String command("\"stub1\" stub2 \"stub3\""); - std::vector argv; + String command("\"stub1\" stub2 \"stub3\""); + std::vector argv; - ArgParser::splitCommandString(command, argv); + ArgParser::splitCommandString(command, argv); - EXPECT_EQ(3, argv.size()); - EXPECT_EQ("stub1", argv.at(0)); - EXPECT_EQ("stub2", argv.at(1)); - EXPECT_EQ("stub3", argv.at(2)); + EXPECT_EQ(3, argv.size()); + EXPECT_EQ("stub1", argv.at(0)); + EXPECT_EQ("stub2", argv.at(1)); + EXPECT_EQ("stub3", argv.at(2)); } TEST(ArgParserTests, splitCommandString_spaceDoubleQuotedArgs_returnArgv) { - String command("\"stub1\" stub2 \"stub3 space\""); - std::vector argv; + String command("\"stub1\" stub2 \"stub3 space\""); + std::vector argv; - ArgParser::splitCommandString(command, argv); + ArgParser::splitCommandString(command, argv); - EXPECT_EQ(3, argv.size()); - EXPECT_EQ("stub1", argv.at(0)); - EXPECT_EQ("stub2", argv.at(1)); - EXPECT_EQ("stub3 space", argv.at(2)); + EXPECT_EQ(3, argv.size()); + EXPECT_EQ("stub1", argv.at(0)); + EXPECT_EQ("stub2", argv.at(1)); + EXPECT_EQ("stub3 space", argv.at(2)); } TEST(ArgParserTests, getArgv_stringArray_return2DArray) { - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - argArray.push_back("stub3 space"); - const char** argv = ArgParser::getArgv(argArray); + std::vector argArray; + argArray.push_back("stub1"); + argArray.push_back("stub2"); + argArray.push_back("stub3 space"); + const char** argv = ArgParser::getArgv(argArray); - String row1(argv[0]); - String row2(argv[1]); - String row3(argv[2]); + String row1(argv[0]); + String row2(argv[1]); + String row3(argv[2]); - EXPECT_EQ("stub1", row1); - EXPECT_EQ("stub2", row2); - EXPECT_EQ("stub3 space", row3); + EXPECT_EQ("stub1", row1); + EXPECT_EQ("stub2", row2); + EXPECT_EQ("stub3 space", row3); - delete[] argv; + delete[] argv; } TEST(ArgParserTests, assembleCommand_stringArray_returnCommand) { - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - String command = ArgParser::assembleCommand(argArray); + std::vector argArray; + argArray.push_back("stub1"); + argArray.push_back("stub2"); + String command = ArgParser::assembleCommand(argArray); - EXPECT_EQ("stub1 stub2", command); + EXPECT_EQ("stub1 stub2", command); } TEST(ArgParserTests, assembleCommand_ignoreSecondArg_returnCommand) { - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - String command = ArgParser::assembleCommand(argArray, "stub2"); + std::vector argArray; + argArray.push_back("stub1"); + argArray.push_back("stub2"); + String command = ArgParser::assembleCommand(argArray, "stub2"); - EXPECT_EQ("stub1", command); + EXPECT_EQ("stub1", command); } TEST(ArgParserTests, assembleCommand_ignoreSecondArgWithOneParameter_returnCommand) { - std::vector argArray; - argArray.push_back("stub1"); - argArray.push_back("stub2"); - argArray.push_back("stub3"); - argArray.push_back("stub4"); - String command = ArgParser::assembleCommand(argArray, "stub2", 1); + std::vector argArray; + argArray.push_back("stub1"); + argArray.push_back("stub2"); + argArray.push_back("stub3"); + argArray.push_back("stub4"); + String command = ArgParser::assembleCommand(argArray, "stub2", 1); - EXPECT_EQ("stub1 stub4", command); + EXPECT_EQ("stub1 stub4", command); } TEST(ArgParserTests, assembleCommand_stringArrayWithSpace_returnCommand) { - std::vector argArray; - argArray.push_back("stub1 space"); - argArray.push_back("stub2"); - argArray.push_back("stub3 space"); - String command = ArgParser::assembleCommand(argArray); + std::vector argArray; + argArray.push_back("stub1 space"); + argArray.push_back("stub2"); + argArray.push_back("stub3 space"); + String command = ArgParser::assembleCommand(argArray); - EXPECT_EQ("\"stub1 space\" stub2 \"stub3 space\"", command); + EXPECT_EQ("\"stub1 space\" stub2 \"stub3 space\"", command); } diff --git a/src/test/unittests/synergy/ClientArgsParsingTests.cpp b/src/test/unittests/synergy/ClientArgsParsingTests.cpp index 4a215b06..7a4f9473 100644 --- a/src/test/unittests/synergy/ClientArgsParsingTests.cpp +++ b/src/test/unittests/synergy/ClientArgsParsingTests.cpp @@ -28,68 +28,68 @@ using ::testing::NiceMock; bool client_stubParseGenericArgs(int, const char* const*, int&) { - return false; + return false; } bool client_stubCheckUnexpectedArgs() { - return false; + return false; } TEST(ClientArgsParsingTests, parseClientArgs_yScrollArg_setYScroll) { - NiceMock argParser; - ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); - ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); - ClientArgs clientArgs; - const int argc = 3; - const char* kYScrollCmd[argc] = { "stub", "--yscroll", "1" }; + NiceMock argParser; + ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); + ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); + ClientArgs clientArgs; + const int argc = 3; + const char* kYScrollCmd[argc] = { "stub", "--yscroll", "1" }; - argParser.parseClientArgs(clientArgs, argc, kYScrollCmd); + argParser.parseClientArgs(clientArgs, argc, kYScrollCmd); - EXPECT_EQ(1, clientArgs.m_yscroll); + EXPECT_EQ(1, clientArgs.m_yscroll); } TEST(ClientArgsParsingTests, parseClientArgs_addressArg_setSynergyAddress) { - NiceMock argParser; - ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); - ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); - ClientArgs clientArgs; - const int argc = 2; - const char* kAddressCmd[argc] = { "stub", "mock_address" }; + NiceMock argParser; + ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); + ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); + ClientArgs clientArgs; + const int argc = 2; + const char* kAddressCmd[argc] = { "stub", "mock_address" }; - bool result = argParser.parseClientArgs(clientArgs, argc, kAddressCmd); + bool result = argParser.parseClientArgs(clientArgs, argc, kAddressCmd); - EXPECT_EQ("mock_address", clientArgs.m_synergyAddress); - EXPECT_EQ(true, result); + EXPECT_EQ("mock_address", clientArgs.m_synergyAddress); + EXPECT_EQ(true, result); } TEST(ClientArgsParsingTests, parseClientArgs_noAddressArg_returnFalse) { - NiceMock argParser; - ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); - ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); - ClientArgs clientArgs; - const int argc = 1; - const char* kNoAddressCmd[argc] = { "stub" }; + NiceMock argParser; + ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); + ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); + ClientArgs clientArgs; + const int argc = 1; + const char* kNoAddressCmd[argc] = { "stub" }; - bool result = argParser.parseClientArgs(clientArgs, argc, kNoAddressCmd); + bool result = argParser.parseClientArgs(clientArgs, argc, kNoAddressCmd); - EXPECT_FALSE(result); + EXPECT_FALSE(result); } TEST(ClientArgsParsingTests, parseClientArgs_unrecognizedArg_returnFalse) { - NiceMock argParser; - ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); - ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); - ClientArgs clientArgs; - const int argc = 3; - const char* kUnrecognizedCmd[argc] = { "stub", "mock_arg", "mock_address"}; + NiceMock argParser; + ON_CALL(argParser, parseGenericArgs(_, _, _)).WillByDefault(Invoke(client_stubParseGenericArgs)); + ON_CALL(argParser, checkUnexpectedArgs()).WillByDefault(Invoke(client_stubCheckUnexpectedArgs)); + ClientArgs clientArgs; + const int argc = 3; + const char* kUnrecognizedCmd[argc] = { "stub", "mock_arg", "mock_address"}; - bool result = argParser.parseClientArgs(clientArgs, argc, kUnrecognizedCmd); + bool result = argParser.parseClientArgs(clientArgs, argc, kUnrecognizedCmd); - EXPECT_FALSE(result); + EXPECT_FALSE(result); } diff --git a/src/test/unittests/synergy/ClipboardChunkTests.cpp b/src/test/unittests/synergy/ClipboardChunkTests.cpp index 2460778a..1283b79f 100644 --- a/src/test/unittests/synergy/ClipboardChunkTests.cpp +++ b/src/test/unittests/synergy/ClipboardChunkTests.cpp @@ -22,55 +22,55 @@ TEST(ClipboardChunkTests, start_formatStartChunk) { - ClipboardID id = 0; - UInt32 sequence = 0; - String mockDataSize("10"); - ClipboardChunk* chunk = ClipboardChunk::start(id, sequence, mockDataSize); + ClipboardID id = 0; + UInt32 sequence = 0; + String mockDataSize("10"); + ClipboardChunk* chunk = ClipboardChunk::start(id, sequence, mockDataSize); - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); - EXPECT_EQ(kDataStart, chunk->m_chunk[5]); - EXPECT_EQ('1', chunk->m_chunk[6]); - EXPECT_EQ('0', chunk->m_chunk[7]); - EXPECT_EQ('\0', chunk->m_chunk[8]); + EXPECT_EQ(id, chunk->m_chunk[0]); + EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); + EXPECT_EQ(kDataStart, chunk->m_chunk[5]); + EXPECT_EQ('1', chunk->m_chunk[6]); + EXPECT_EQ('0', chunk->m_chunk[7]); + EXPECT_EQ('\0', chunk->m_chunk[8]); - delete chunk; + delete chunk; } TEST(ClipboardChunkTests, data_formatDataChunk) { - ClipboardID id = 0; - UInt32 sequence = 1; - String mockData("mock data"); - ClipboardChunk* chunk = ClipboardChunk::data(id, sequence, mockData); + ClipboardID id = 0; + UInt32 sequence = 1; + String mockData("mock data"); + ClipboardChunk* chunk = ClipboardChunk::data(id, sequence, mockData); - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); - EXPECT_EQ(kDataChunk, chunk->m_chunk[5]); - EXPECT_EQ('m', chunk->m_chunk[6]); - EXPECT_EQ('o', chunk->m_chunk[7]); - EXPECT_EQ('c', chunk->m_chunk[8]); - EXPECT_EQ('k', chunk->m_chunk[9]); - EXPECT_EQ(' ', chunk->m_chunk[10]); - EXPECT_EQ('d', chunk->m_chunk[11]); - EXPECT_EQ('a', chunk->m_chunk[12]); - EXPECT_EQ('t', chunk->m_chunk[13]); - EXPECT_EQ('a', chunk->m_chunk[14]); - EXPECT_EQ('\0', chunk->m_chunk[15]); + EXPECT_EQ(id, chunk->m_chunk[0]); + EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); + EXPECT_EQ(kDataChunk, chunk->m_chunk[5]); + EXPECT_EQ('m', chunk->m_chunk[6]); + EXPECT_EQ('o', chunk->m_chunk[7]); + EXPECT_EQ('c', chunk->m_chunk[8]); + EXPECT_EQ('k', chunk->m_chunk[9]); + EXPECT_EQ(' ', chunk->m_chunk[10]); + EXPECT_EQ('d', chunk->m_chunk[11]); + EXPECT_EQ('a', chunk->m_chunk[12]); + EXPECT_EQ('t', chunk->m_chunk[13]); + EXPECT_EQ('a', chunk->m_chunk[14]); + EXPECT_EQ('\0', chunk->m_chunk[15]); - delete chunk; + delete chunk; } TEST(ClipboardChunkTests, end_formatDataChunk) { - ClipboardID id = 1; - UInt32 sequence = 1; - ClipboardChunk* chunk = ClipboardChunk::end(id, sequence); + ClipboardID id = 1; + UInt32 sequence = 1; + ClipboardChunk* chunk = ClipboardChunk::end(id, sequence); - EXPECT_EQ(id, chunk->m_chunk[0]); - EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); - EXPECT_EQ(kDataEnd, chunk->m_chunk[5]); - EXPECT_EQ('\0', chunk->m_chunk[6]); + EXPECT_EQ(id, chunk->m_chunk[0]); + EXPECT_EQ(sequence, (UInt32)chunk->m_chunk[1]); + EXPECT_EQ(kDataEnd, chunk->m_chunk[5]); + EXPECT_EQ('\0', chunk->m_chunk[6]); - delete chunk; + delete chunk; } diff --git a/src/test/unittests/synergy/ClipboardTests.cpp b/src/test/unittests/synergy/ClipboardTests.cpp index a37a3f6a..2b1b8494 100644 --- a/src/test/unittests/synergy/ClipboardTests.cpp +++ b/src/test/unittests/synergy/ClipboardTests.cpp @@ -22,174 +22,174 @@ TEST(ClipboardTests, empty_openCalled_returnsTrue) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - bool actual = clipboard.empty(); + bool actual = clipboard.empty(); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST(ClipboardTests, empty_singleFormat_hasReturnsFalse) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(Clipboard::kText, "synergy rocks!"); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(Clipboard::kText, "synergy rocks!"); - clipboard.empty(); + clipboard.empty(); - bool actual = clipboard.has(Clipboard::kText); - EXPECT_FALSE(actual); + bool actual = clipboard.has(Clipboard::kText); + EXPECT_FALSE(actual); } TEST(ClipboardTests, add_newValue_valueWasStored) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "synergy rocks!"); - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } TEST(ClipboardTests, add_replaceValue_valueWasReplaced) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.add(IClipboard::kText, "maxivista sucks"); // haha, just kidding. - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("maxivista sucks", actual); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("maxivista sucks", actual); } TEST(ClipboardTests, open_timeIsZero_returnsTrue) { - Clipboard clipboard; + Clipboard clipboard; - bool actual = clipboard.open(0); + bool actual = clipboard.open(0); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST(ClipboardTests, open_timeIsOne_returnsTrue) { - Clipboard clipboard; + Clipboard clipboard; - bool actual = clipboard.open(1); + bool actual = clipboard.open(1); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST(ClipboardTests, close_isOpen_noErrors) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - clipboard.close(); + clipboard.close(); - // can't assert anything + // can't assert anything } TEST(ClipboardTests, getTime_openWithNoEmpty_returnsZero) { - Clipboard clipboard; - clipboard.open(1); + Clipboard clipboard; + clipboard.open(1); - Clipboard::Time actual = clipboard.getTime(); + Clipboard::Time actual = clipboard.getTime(); - EXPECT_EQ(0, actual); + EXPECT_EQ(0, actual); } TEST(ClipboardTests, getTime_openAndEmpty_returnsOne) { - Clipboard clipboard; - clipboard.open(1); - clipboard.empty(); + Clipboard clipboard; + clipboard.open(1); + clipboard.empty(); - Clipboard::Time actual = clipboard.getTime(); + Clipboard::Time actual = clipboard.getTime(); - EXPECT_EQ(1, actual); + EXPECT_EQ(1, actual); } TEST(ClipboardTests, has_withFormatAdded_returnsTrue) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks!"); - bool actual = clipboard.has(IClipboard::kText); + bool actual = clipboard.has(IClipboard::kText); - EXPECT_EQ(true, actual); + EXPECT_EQ(true, actual); } TEST(ClipboardTests, has_withNoFormats_returnsFalse) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - bool actual = clipboard.has(IClipboard::kText); + bool actual = clipboard.has(IClipboard::kText); - EXPECT_FALSE(actual); + EXPECT_FALSE(actual); } TEST(ClipboardTests, get_withNoFormats_returnsEmpty) { - Clipboard clipboard; - clipboard.open(0); + Clipboard clipboard; + clipboard.open(0); - String actual = clipboard.get(IClipboard::kText); + String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("", actual); + EXPECT_EQ("", actual); } TEST(ClipboardTests, get_withFormatAdded_returnsExpected) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks!"); - String actual = clipboard.get(IClipboard::kText); + String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + EXPECT_EQ("synergy rocks!", actual); } TEST(ClipboardTests, marshall_addNotCalled_firstCharIsZero) { - Clipboard clipboard; + Clipboard clipboard; - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // seems to return "\0\0\0\0" but EXPECT_EQ can't assert this, - // so instead, just assert that first char is '\0'. - EXPECT_EQ(0, (int)actual[0]); + // seems to return "\0\0\0\0" but EXPECT_EQ can't assert this, + // so instead, just assert that first char is '\0'. + EXPECT_EQ(0, (int)actual[0]); } TEST(ClipboardTests, marshall_withTextAdded_typeCharIsText) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // string contains other data, but 8th char should be kText. - EXPECT_EQ(IClipboard::kText, (int)actual[7]); + // string contains other data, but 8th char should be kText. + EXPECT_EQ(IClipboard::kText, (int)actual[7]); } TEST(ClipboardTests, marshall_withTextAdded_lastSizeCharIs14) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); // 14 chars - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks!"); // 14 chars + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - EXPECT_EQ(14, (int)actual[11]); + EXPECT_EQ(14, (int)actual[11]); } // TODO: there's some integer -> char encoding going on here. i find it @@ -197,208 +197,208 @@ TEST(ClipboardTests, marshall_withTextAdded_lastSizeCharIs14) // we should refactor this stuff out of the clipboard. TEST(ClipboardTests, marshall_withTextSize285_sizeCharsValid) { - // 285 chars - String data; - data.append("Synergy is Free and Open Source Software that lets you "); - data.append("easily share your mouse and keyboard between multiple "); - data.append("computers, where each computer has it's own display. No "); - data.append("special hardware is required, all you need is a local area "); - data.append("network. Synergy is supported on Windows, Mac OS X and Linux."); + // 285 chars + String data; + data.append("Synergy is Free and Open Source Software that lets you "); + data.append("easily share your mouse and keyboard between multiple "); + data.append("computers, where each computer has it's own display. No "); + data.append("special hardware is required, all you need is a local area "); + data.append("network. Synergy is supported on Windows, Mac OS X and Linux."); - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, data); - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, data); + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // 4 asserts here, but that's ok because we're really just asserting 1 - // thing. the 32-bit size value is split into 4 chars. if the size is 285 - // (29 more than the 8-bit max size), the last char "rolls over" to 29 - // (this is caused by a bit-wise & on 0xff and 8-bit truncation). each - // char before the last stores a bit-shifted version of the number, each - // 1 more power than the last, which is done by bit-shifting [0] by 24, - // [1] by 16, [2] by 8 ([3] is not bit-shifted). - EXPECT_EQ(0, actual[8]); // 285 >> 24 = 285 / (256^3) = 0 - EXPECT_EQ(0, actual[9]); // 285 >> 16 = 285 / (256^2) = 0 - EXPECT_EQ(1, actual[10]); // 285 >> 8 = 285 / (256^1) = 1(.11328125) - EXPECT_EQ(29, actual[11]); // 285 - 256 = 29 + // 4 asserts here, but that's ok because we're really just asserting 1 + // thing. the 32-bit size value is split into 4 chars. if the size is 285 + // (29 more than the 8-bit max size), the last char "rolls over" to 29 + // (this is caused by a bit-wise & on 0xff and 8-bit truncation). each + // char before the last stores a bit-shifted version of the number, each + // 1 more power than the last, which is done by bit-shifting [0] by 24, + // [1] by 16, [2] by 8 ([3] is not bit-shifted). + EXPECT_EQ(0, actual[8]); // 285 >> 24 = 285 / (256^3) = 0 + EXPECT_EQ(0, actual[9]); // 285 >> 16 = 285 / (256^2) = 0 + EXPECT_EQ(1, actual[10]); // 285 >> 8 = 285 / (256^1) = 1(.11328125) + EXPECT_EQ(29, actual[11]); // 285 - 256 = 29 } TEST(ClipboardTests, marshall_withHtmlAdded_typeCharIsHtml) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kHTML, "html sucks"); - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kHTML, "html sucks"); + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // string contains other data, but 8th char should be kHTML. - EXPECT_EQ(IClipboard::kHTML, (int)actual[7]); + // string contains other data, but 8th char should be kHTML. + EXPECT_EQ(IClipboard::kHTML, (int)actual[7]); } TEST(ClipboardTests, marshall_withHtmlAndText_has2Formats) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks"); - clipboard.add(IClipboard::kHTML, "html sucks"); - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks"); + clipboard.add(IClipboard::kHTML, "html sucks"); + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // the number of formats is stored inside the first 4 chars. - // the writeUInt32 function right-aligns numbers in 4 chars, - // so if you right align 2, it will be "\0\0\0\2" in a string. - // we assert that the char at the 4th index is 2 (the number of - // formats that we've added). - EXPECT_EQ(2, (int)actual[3]); + // the number of formats is stored inside the first 4 chars. + // the writeUInt32 function right-aligns numbers in 4 chars, + // so if you right align 2, it will be "\0\0\0\2" in a string. + // we assert that the char at the 4th index is 2 (the number of + // formats that we've added). + EXPECT_EQ(2, (int)actual[3]); } TEST(ClipboardTests, marshall_withTextAdded_endsWithAdded) { - Clipboard clipboard; - clipboard.open(0); - clipboard.add(IClipboard::kText, "synergy rocks!"); - clipboard.close(); + Clipboard clipboard; + clipboard.open(0); + clipboard.add(IClipboard::kText, "synergy rocks!"); + clipboard.close(); - String actual = clipboard.marshall(); + String actual = clipboard.marshall(); - // string contains other data, but should end in the string we added. - EXPECT_EQ("synergy rocks!", actual.substr(12)); + // string contains other data, but should end in the string we added. + EXPECT_EQ("synergy rocks!", actual.substr(12)); } TEST(ClipboardTests, unmarshall_emptyData_hasTextIsFalse) { - Clipboard clipboard; + Clipboard clipboard; - String data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)0; // 0 formats added + String data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)0; // 0 formats added - clipboard.unmarshall(data, 0); + clipboard.unmarshall(data, 0); - clipboard.open(0); - bool actual = clipboard.has(IClipboard::kText); - EXPECT_FALSE(actual); + clipboard.open(0); + bool actual = clipboard.has(IClipboard::kText); + EXPECT_FALSE(actual); } TEST(ClipboardTests, unmarshall_withTextSize285_getTextIsValid) { - Clipboard clipboard; + Clipboard clipboard; - // 285 chars - String text; - text.append("Synergy is Free and Open Source Software that lets you "); - text.append("easily share your mouse and keyboard between multiple "); - text.append("computers, where each computer has it's own display. No "); - text.append("special hardware is required, all you need is a local area "); - text.append("network. Synergy is supported on Windows, Mac OS X and Linux."); + // 285 chars + String text; + text.append("Synergy is Free and Open Source Software that lets you "); + text.append("easily share your mouse and keyboard between multiple "); + text.append("computers, where each computer has it's own display. No "); + text.append("special hardware is required, all you need is a local area "); + text.append("network. Synergy is supported on Windows, Mac OS X and Linux."); - String data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)1; // 1 format added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; // 285 >> 24 = 285 / (256^3) = 0 - data += (char)0; // 285 >> 16 = 285 / (256^2) = 0 - data += (char)1; // 285 >> 8 = 285 / (256^1) = 1(.11328125) - data += (char)29; // 285 - 256 = 29 - data += text; + String data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)1; // 1 format added + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kText; + data += (char)0; // 285 >> 24 = 285 / (256^3) = 0 + data += (char)0; // 285 >> 16 = 285 / (256^2) = 0 + data += (char)1; // 285 >> 8 = 285 / (256^1) = 1(.11328125) + data += (char)29; // 285 - 256 = 29 + data += text; - clipboard.unmarshall(data, 0); + clipboard.unmarshall(data, 0); - clipboard.open(0); - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ(text, actual); + clipboard.open(0); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ(text, actual); } TEST(ClipboardTests, unmarshall_withTextAndHtml_getTextIsValid) { - Clipboard clipboard; - String data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)2; // 2 formats added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)14; - data += "synergy rocks!"; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kHTML; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)10; - data += "html sucks"; + Clipboard clipboard; + String data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)2; // 2 formats added + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kText; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)14; + data += "synergy rocks!"; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kHTML; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)10; + data += "html sucks"; - clipboard.unmarshall(data, 0); + clipboard.unmarshall(data, 0); - clipboard.open(0); - String actual = clipboard.get(IClipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + clipboard.open(0); + String actual = clipboard.get(IClipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } TEST(ClipboardTests, unmarshall_withTextAndHtml_getHtmlIsValid) { - Clipboard clipboard; - String data; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)2; // 2 formats added - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kText; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)14; - data += "synergy rocks!"; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)IClipboard::kHTML; - data += (char)0; - data += (char)0; - data += (char)0; - data += (char)10; - data += "html sucks"; + Clipboard clipboard; + String data; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)2; // 2 formats added + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kText; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)14; + data += "synergy rocks!"; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)IClipboard::kHTML; + data += (char)0; + data += (char)0; + data += (char)0; + data += (char)10; + data += "html sucks"; - clipboard.unmarshall(data, 0); + clipboard.unmarshall(data, 0); - clipboard.open(0); - String actual = clipboard.get(IClipboard::kHTML); - EXPECT_EQ("html sucks", actual); + clipboard.open(0); + String actual = clipboard.get(IClipboard::kHTML); + EXPECT_EQ("html sucks", actual); } TEST(ClipboardTests, copy_withSingleText_clipboardsAreEqual) { - Clipboard clipboard1; - clipboard1.open(0); - clipboard1.add(Clipboard::kText, "synergy rocks!"); - clipboard1.close(); + Clipboard clipboard1; + clipboard1.open(0); + clipboard1.add(Clipboard::kText, "synergy rocks!"); + clipboard1.close(); - Clipboard clipboard2; - Clipboard::copy(&clipboard2, &clipboard1); + Clipboard clipboard2; + Clipboard::copy(&clipboard2, &clipboard1); - clipboard2.open(0); - String actual = clipboard2.get(Clipboard::kText); - EXPECT_EQ("synergy rocks!", actual); + clipboard2.open(0); + String actual = clipboard2.get(Clipboard::kText); + EXPECT_EQ("synergy rocks!", actual); } diff --git a/src/test/unittests/synergy/DeprecatedArgsParsingTests.cpp b/src/test/unittests/synergy/DeprecatedArgsParsingTests.cpp index 4fb49bff..7996c99b 100644 --- a/src/test/unittests/synergy/DeprecatedArgsParsingTests.cpp +++ b/src/test/unittests/synergy/DeprecatedArgsParsingTests.cpp @@ -23,28 +23,28 @@ using namespace synergy; TEST(DeprecatedArgsParsingTests, parseDeprecatedArgs_cryptoPass_returnTrue) { - int i = 1; - const int argc = 3; - const char* kCryptoPassCmd[argc] = { "stub", "--crypto-pass", "mock_pass" }; + int i = 1; + const int argc = 3; + const char* kCryptoPassCmd[argc] = { "stub", "--crypto-pass", "mock_pass" }; - ArgParser argParser(NULL); + ArgParser argParser(NULL); - bool result = argParser.parseDeprecatedArgs(argc, kCryptoPassCmd, i); + bool result = argParser.parseDeprecatedArgs(argc, kCryptoPassCmd, i); - EXPECT_EQ(true, result); - EXPECT_EQ(2, i); + EXPECT_EQ(true, result); + EXPECT_EQ(2, i); } TEST(DeprecatedArgsParsingTests, parseDeprecatedArgs_cryptoPass_returnFalse) { - int i = 1; - const int argc = 3; - const char* kCryptoPassCmd[argc] = { "stub", "--mock-arg", "mock_value" }; + int i = 1; + const int argc = 3; + const char* kCryptoPassCmd[argc] = { "stub", "--mock-arg", "mock_value" }; - ArgParser argParser(NULL); + ArgParser argParser(NULL); - bool result = argParser.parseDeprecatedArgs(argc, kCryptoPassCmd, i); + bool result = argParser.parseDeprecatedArgs(argc, kCryptoPassCmd, i); - EXPECT_FALSE(result); - EXPECT_EQ(1, i); + EXPECT_FALSE(result); + EXPECT_EQ(1, i); } diff --git a/src/test/unittests/synergy/GenericArgsParsingTests.cpp b/src/test/unittests/synergy/GenericArgsParsingTests.cpp index 8fa7d753..e2fa954a 100644 --- a/src/test/unittests/synergy/GenericArgsParsingTests.cpp +++ b/src/test/unittests/synergy/GenericArgsParsingTests.cpp @@ -32,284 +32,284 @@ bool g_versionShowed = false; void showMockHelp() { - g_helpShowed = true; + g_helpShowed = true; } void showMockVersion() { - g_versionShowed = true; + g_versionShowed = true; } TEST(GenericArgsParsingTests, parseGenericArgs_logLevelCmd_setLogLevel) { - int i = 1; - const int argc = 3; - const char* kLogLevelCmd[argc] = { "stub", "--debug", "DEBUG" }; + int i = 1; + const int argc = 3; + const char* kLogLevelCmd[argc] = { "stub", "--debug", "DEBUG" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kLogLevelCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kLogLevelCmd, i); - String logFilter(argsBase.m_logFilter); + String logFilter(argsBase.m_logFilter); - EXPECT_EQ("DEBUG", logFilter); - EXPECT_EQ(2, i); + EXPECT_EQ("DEBUG", logFilter); + EXPECT_EQ(2, i); } TEST(GenericArgsParsingTests, parseGenericArgs_logFileCmd_saveLogFilename) { - int i = 1; - const int argc = 3; - const char* kLogFileCmd[argc] = { "stub", "--log", "mock_filename" }; + int i = 1; + const int argc = 3; + const char* kLogFileCmd[argc] = { "stub", "--log", "mock_filename" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kLogFileCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kLogFileCmd, i); - String logFile(argsBase.m_logFile); + String logFile(argsBase.m_logFile); - EXPECT_EQ("mock_filename", logFile); - EXPECT_EQ(2, i); + EXPECT_EQ("mock_filename", logFile); + EXPECT_EQ(2, i); } TEST(GenericArgsParsingTests, parseGenericArgs_logFileCmdWithSpace_saveLogFilename) { - int i = 1; - const int argc = 3; - const char* kLogFileCmdWithSpace[argc] = { "stub", "--log", "mo ck_filename" }; + int i = 1; + const int argc = 3; + const char* kLogFileCmdWithSpace[argc] = { "stub", "--log", "mo ck_filename" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kLogFileCmdWithSpace, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kLogFileCmdWithSpace, i); - String logFile(argsBase.m_logFile); + String logFile(argsBase.m_logFile); - EXPECT_EQ("mo ck_filename", logFile); - EXPECT_EQ(2, i); + EXPECT_EQ("mo ck_filename", logFile); + EXPECT_EQ(2, i); } TEST(GenericArgsParsingTests, parseGenericArgs_noDeamonCmd_daemonFalse) { - int i = 1; - const int argc = 2; - const char* kNoDeamonCmd[argc] = { "stub", "-f" }; + int i = 1; + const int argc = 2; + const char* kNoDeamonCmd[argc] = { "stub", "-f" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kNoDeamonCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kNoDeamonCmd, i); - EXPECT_FALSE(argsBase.m_daemon); - EXPECT_EQ(1, i); + EXPECT_FALSE(argsBase.m_daemon); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_deamonCmd_daemonTrue) { - int i = 1; - const int argc = 2; - const char* kDeamonCmd[argc] = { "stub", "--daemon" }; + int i = 1; + const int argc = 2; + const char* kDeamonCmd[argc] = { "stub", "--daemon" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kDeamonCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kDeamonCmd, i); - EXPECT_EQ(true, argsBase.m_daemon); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_daemon); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_nameCmd_saveName) { - int i = 1; - const int argc = 3; - const char* kNameCmd[argc] = { "stub", "--name", "mock" }; + int i = 1; + const int argc = 3; + const char* kNameCmd[argc] = { "stub", "--name", "mock" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kNameCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kNameCmd, i); - EXPECT_EQ("mock", argsBase.m_name); - EXPECT_EQ(2, i); + EXPECT_EQ("mock", argsBase.m_name); + EXPECT_EQ(2, i); } TEST(GenericArgsParsingTests, parseGenericArgs_noRestartCmd_restartFalse) { - int i = 1; - const int argc = 2; - const char* kNoRestartCmd[argc] = { "stub", "--no-restart" }; + int i = 1; + const int argc = 2; + const char* kNoRestartCmd[argc] = { "stub", "--no-restart" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kNoRestartCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kNoRestartCmd, i); - EXPECT_FALSE(argsBase.m_restartable); - EXPECT_EQ(1, i); + EXPECT_FALSE(argsBase.m_restartable); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_restartCmd_restartTrue) { - int i = 1; - const int argc = 2; - const char* kRestartCmd[argc] = { "stub", "--restart" }; + int i = 1; + const int argc = 2; + const char* kRestartCmd[argc] = { "stub", "--restart" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kRestartCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kRestartCmd, i); - EXPECT_EQ(true, argsBase.m_restartable); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_restartable); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_backendCmd_backendTrue) { - int i = 1; - const int argc = 2; - const char* kBackendCmd[argc] = { "stub", "-z" }; + int i = 1; + const int argc = 2; + const char* kBackendCmd[argc] = { "stub", "-z" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kBackendCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kBackendCmd, i); - EXPECT_EQ(true, argsBase.m_backend); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_backend); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_noHookCmd_noHookTrue) { - int i = 1; - const int argc = 2; - const char* kNoHookCmd[argc] = { "stub", "--no-hooks" }; + int i = 1; + const int argc = 2; + const char* kNoHookCmd[argc] = { "stub", "--no-hooks" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kNoHookCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kNoHookCmd, i); - EXPECT_EQ(true, argsBase.m_noHooks); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_noHooks); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_helpCmd_showHelp) { - g_helpShowed = false; - int i = 1; - const int argc = 2; - const char* kHelpCmd[argc] = { "stub", "--help" }; + g_helpShowed = false; + int i = 1; + const int argc = 2; + const char* kHelpCmd[argc] = { "stub", "--help" }; - NiceMock app; - ArgParser argParser(&app); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - ON_CALL(app, help()).WillByDefault(Invoke(showMockHelp)); - - argParser.parseGenericArgs(argc, kHelpCmd, i); + NiceMock app; + ArgParser argParser(&app); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + ON_CALL(app, help()).WillByDefault(Invoke(showMockHelp)); + + argParser.parseGenericArgs(argc, kHelpCmd, i); - EXPECT_EQ(true, g_helpShowed); - EXPECT_EQ(1, i); + EXPECT_EQ(true, g_helpShowed); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_versionCmd_showVersion) { - g_versionShowed = false; - int i = 1; - const int argc = 2; - const char* kVersionCmd[argc] = { "stub", "--version" }; + g_versionShowed = false; + int i = 1; + const int argc = 2; + const char* kVersionCmd[argc] = { "stub", "--version" }; - NiceMock app; - ArgParser argParser(&app); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - ON_CALL(app, version()).WillByDefault(Invoke(showMockVersion)); - - argParser.parseGenericArgs(argc, kVersionCmd, i); + NiceMock app; + ArgParser argParser(&app); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + ON_CALL(app, version()).WillByDefault(Invoke(showMockVersion)); + + argParser.parseGenericArgs(argc, kVersionCmd, i); - EXPECT_EQ(true, g_versionShowed); - EXPECT_EQ(1, i); + EXPECT_EQ(true, g_versionShowed); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_noTrayCmd_disableTrayTrue) { - int i = 1; - const int argc = 2; - const char* kNoTrayCmd[argc] = { "stub", "--no-tray" }; + int i = 1; + const int argc = 2; + const char* kNoTrayCmd[argc] = { "stub", "--no-tray" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kNoTrayCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kNoTrayCmd, i); - EXPECT_EQ(true, argsBase.m_disableTray); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_disableTray); + EXPECT_EQ(1, i); } TEST(GenericArgsParsingTests, parseGenericArgs_ipcCmd_enableIpcTrue) { - int i = 1; - const int argc = 2; - const char* kIpcCmd[argc] = { "stub", "--ipc" }; + int i = 1; + const int argc = 2; + const char* kIpcCmd[argc] = { "stub", "--ipc" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kIpcCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kIpcCmd, i); - EXPECT_EQ(true, argsBase.m_enableIpc); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_enableIpc); + EXPECT_EQ(1, i); } #ifndef WINAPI_XWINDOWS TEST(GenericArgsParsingTests, parseGenericArgs_dragDropCmdOnNonLinux_enableDragDropTrue) { - int i = 1; - const int argc = 2; - const char* kDragDropCmd[argc] = { "stub", "--enable-drag-drop" }; + int i = 1; + const int argc = 2; + const char* kDragDropCmd[argc] = { "stub", "--enable-drag-drop" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kDragDropCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kDragDropCmd, i); - EXPECT_EQ(true, argsBase.m_enableDragDrop); - EXPECT_EQ(1, i); + EXPECT_EQ(true, argsBase.m_enableDragDrop); + EXPECT_EQ(1, i); } #endif #ifdef WINAPI_XWINDOWS TEST(GenericArgsParsingTests, parseGenericArgs_dragDropCmdOnLinux_enableDragDropFalse) { - int i = 1; - const int argc = 2; - const char* kDragDropCmd[argc] = { "stub", "--enable-drag-drop" }; + int i = 1; + const int argc = 2; + const char* kDragDropCmd[argc] = { "stub", "--enable-drag-drop" }; - ArgParser argParser(NULL); - ArgsBase argsBase; - argParser.setArgsBase(argsBase); - - argParser.parseGenericArgs(argc, kDragDropCmd, i); + ArgParser argParser(NULL); + ArgsBase argsBase; + argParser.setArgsBase(argsBase); + + argParser.parseGenericArgs(argc, kDragDropCmd, i); - EXPECT_FALSE(argsBase.m_enableDragDrop); - EXPECT_EQ(1, i); + EXPECT_FALSE(argsBase.m_enableDragDrop); + EXPECT_EQ(1, i); } #endif diff --git a/src/test/unittests/synergy/KeyMapTests.cpp b/src/test/unittests/synergy/KeyMapTests.cpp index 1a195af5..43847c11 100644 --- a/src/test/unittests/synergy/KeyMapTests.cpp +++ b/src/test/unittests/synergy/KeyMapTests.cpp @@ -28,189 +28,189 @@ using ::testing::ReturnRef; using ::testing::SaveArg; namespace synergy { - + TEST(KeyMapTests, findBestKey_requiredDown_matchExactFirstItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList; - KeyMap::KeyItem item; - item.m_required = KeyModifierShift; - item.m_sensitive = KeyModifierShift; - KeyModifierMask currentState = KeyModifierShift; - KeyModifierMask desiredState = KeyModifierShift; - itemList.push_back(item); - entryList.push_back(itemList); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList; + KeyMap::KeyItem item; + item.m_required = KeyModifierShift; + item.m_sensitive = KeyModifierShift; + KeyModifierMask currentState = KeyModifierShift; + KeyModifierMask desiredState = KeyModifierShift; + itemList.push_back(item); + entryList.push_back(itemList); - EXPECT_EQ(0, keyMap.findBestKey(entryList, currentState, desiredState)); + EXPECT_EQ(0, keyMap.findBestKey(entryList, currentState, desiredState)); } - + TEST(KeyMapTests, findBestKey_requiredAndExtraSensitiveDown_matchExactFirstItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList; - KeyMap::KeyItem item; - item.m_required = KeyModifierShift; - item.m_sensitive = KeyModifierShift | KeyModifierAlt; - KeyModifierMask currentState = KeyModifierShift; - KeyModifierMask desiredState = KeyModifierShift; - itemList.push_back(item); - entryList.push_back(itemList); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList; + KeyMap::KeyItem item; + item.m_required = KeyModifierShift; + item.m_sensitive = KeyModifierShift | KeyModifierAlt; + KeyModifierMask currentState = KeyModifierShift; + KeyModifierMask desiredState = KeyModifierShift; + itemList.push_back(item); + entryList.push_back(itemList); - EXPECT_EQ(0, keyMap.findBestKey(entryList, currentState, desiredState)); + EXPECT_EQ(0, keyMap.findBestKey(entryList, currentState, desiredState)); } TEST(KeyMapTests, findBestKey_requiredAndExtraSensitiveDown_matchExactSecondItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList1; - KeyMap::KeyItem item1; - item1.m_required = KeyModifierAlt; - item1.m_sensitive = KeyModifierShift | KeyModifierAlt; - KeyMap::KeyItemList itemList2; - KeyMap::KeyItem item2; - item2.m_required = KeyModifierShift; - item2.m_sensitive = KeyModifierShift | KeyModifierAlt; - KeyModifierMask currentState = KeyModifierShift; - KeyModifierMask desiredState = KeyModifierShift; - itemList1.push_back(item1); - itemList2.push_back(item2); - entryList.push_back(itemList1); - entryList.push_back(itemList2); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList1; + KeyMap::KeyItem item1; + item1.m_required = KeyModifierAlt; + item1.m_sensitive = KeyModifierShift | KeyModifierAlt; + KeyMap::KeyItemList itemList2; + KeyMap::KeyItem item2; + item2.m_required = KeyModifierShift; + item2.m_sensitive = KeyModifierShift | KeyModifierAlt; + KeyModifierMask currentState = KeyModifierShift; + KeyModifierMask desiredState = KeyModifierShift; + itemList1.push_back(item1); + itemList2.push_back(item2); + entryList.push_back(itemList1); + entryList.push_back(itemList2); - EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); + EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); } - + TEST(KeyMapTests, findBestKey_extraSensitiveDown_matchExactSecondItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList1; - KeyMap::KeyItem item1; - item1.m_required = 0; - item1.m_sensitive = KeyModifierAlt; - KeyMap::KeyItemList itemList2; - KeyMap::KeyItem item2; - item2.m_required = 0; - item2.m_sensitive = KeyModifierShift; - KeyModifierMask currentState = KeyModifierAlt; - KeyModifierMask desiredState = KeyModifierAlt; - itemList1.push_back(item1); - itemList2.push_back(item2); - entryList.push_back(itemList1); - entryList.push_back(itemList2); - - EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList1; + KeyMap::KeyItem item1; + item1.m_required = 0; + item1.m_sensitive = KeyModifierAlt; + KeyMap::KeyItemList itemList2; + KeyMap::KeyItem item2; + item2.m_required = 0; + item2.m_sensitive = KeyModifierShift; + KeyModifierMask currentState = KeyModifierAlt; + KeyModifierMask desiredState = KeyModifierAlt; + itemList1.push_back(item1); + itemList2.push_back(item2); + entryList.push_back(itemList1); + entryList.push_back(itemList2); + + EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); } TEST(KeyMapTests, findBestKey_noRequiredDown_matchOneRequiredChangeItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList1; - KeyMap::KeyItem item1; - item1.m_required = KeyModifierShift | KeyModifierAlt; - item1.m_sensitive = KeyModifierShift | KeyModifierAlt; - KeyMap::KeyItemList itemList2; - KeyMap::KeyItem item2; - item2.m_required = KeyModifierShift; - item2.m_sensitive = KeyModifierShift | KeyModifierAlt; - KeyModifierMask currentState = 0; - KeyModifierMask desiredState = 0; - itemList1.push_back(item1); - itemList2.push_back(item2); - entryList.push_back(itemList1); - entryList.push_back(itemList2); - - EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList1; + KeyMap::KeyItem item1; + item1.m_required = KeyModifierShift | KeyModifierAlt; + item1.m_sensitive = KeyModifierShift | KeyModifierAlt; + KeyMap::KeyItemList itemList2; + KeyMap::KeyItem item2; + item2.m_required = KeyModifierShift; + item2.m_sensitive = KeyModifierShift | KeyModifierAlt; + KeyModifierMask currentState = 0; + KeyModifierMask desiredState = 0; + itemList1.push_back(item1); + itemList2.push_back(item2); + entryList.push_back(itemList1); + entryList.push_back(itemList2); + + EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); } TEST(KeyMapTests, findBestKey_onlyOneRequiredDown_matchTwoRequiredChangesItem) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList1; - KeyMap::KeyItem item1; - item1.m_required = KeyModifierShift | KeyModifierAlt | KeyModifierControl; - item1.m_sensitive = KeyModifierShift | KeyModifierAlt | KeyModifierControl; - KeyMap::KeyItemList itemList2; - KeyMap::KeyItem item2; - item2.m_required = KeyModifierShift| KeyModifierAlt; - item2.m_sensitive = KeyModifierShift | KeyModifierAlt | KeyModifierControl; - KeyModifierMask currentState = 0; - KeyModifierMask desiredState = 0; - itemList1.push_back(item1); - itemList2.push_back(item2); - entryList.push_back(itemList1); - entryList.push_back(itemList2); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList1; + KeyMap::KeyItem item1; + item1.m_required = KeyModifierShift | KeyModifierAlt | KeyModifierControl; + item1.m_sensitive = KeyModifierShift | KeyModifierAlt | KeyModifierControl; + KeyMap::KeyItemList itemList2; + KeyMap::KeyItem item2; + item2.m_required = KeyModifierShift| KeyModifierAlt; + item2.m_sensitive = KeyModifierShift | KeyModifierAlt | KeyModifierControl; + KeyModifierMask currentState = 0; + KeyModifierMask desiredState = 0; + itemList1.push_back(item1); + itemList2.push_back(item2); + entryList.push_back(itemList1); + entryList.push_back(itemList2); - EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); + EXPECT_EQ(1, keyMap.findBestKey(entryList, currentState, desiredState)); } - + TEST(KeyMapTests, findBestKey_noRequiredDown_cannotMatch) { - KeyMap keyMap; - KeyMap::KeyEntryList entryList; - KeyMap::KeyItemList itemList; - KeyMap::KeyItem item; - item.m_required = 0xffffffff; - item.m_sensitive = 0xffffffff; - KeyModifierMask currentState = 0; - KeyModifierMask desiredState = 0; - itemList.push_back(item); - entryList.push_back(itemList); - - EXPECT_EQ(-1, keyMap.findBestKey(entryList, currentState, desiredState)); + KeyMap keyMap; + KeyMap::KeyEntryList entryList; + KeyMap::KeyItemList itemList; + KeyMap::KeyItem item; + item.m_required = 0xffffffff; + item.m_sensitive = 0xffffffff; + KeyModifierMask currentState = 0; + KeyModifierMask desiredState = 0; + itemList.push_back(item); + entryList.push_back(itemList); + + EXPECT_EQ(-1, keyMap.findBestKey(entryList, currentState, desiredState)); } - + TEST(KeyMapTests, isCommand_shiftMask_returnFalse) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierShift; - - EXPECT_FALSE(keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierShift; + + EXPECT_FALSE(keyMap.isCommand(mask)); } - + TEST(KeyMapTests, isCommand_controlMask_returnTrue) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierControl; - - EXPECT_EQ(true, keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierControl; + + EXPECT_EQ(true, keyMap.isCommand(mask)); } - + TEST(KeyMapTests, isCommand_alternateMask_returnTrue) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierAlt; - - EXPECT_EQ(true, keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierAlt; + + EXPECT_EQ(true, keyMap.isCommand(mask)); } TEST(KeyMapTests, isCommand_alternateGraphicMask_returnTrue) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierAltGr; - - EXPECT_EQ(true, keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierAltGr; + + EXPECT_EQ(true, keyMap.isCommand(mask)); } - + TEST(KeyMapTests, isCommand_metaMask_returnTrue) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierMeta; - - EXPECT_EQ(true, keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierMeta; + + EXPECT_EQ(true, keyMap.isCommand(mask)); } TEST(KeyMapTests, isCommand_superMask_returnTrue) { - KeyMap keyMap; - KeyModifierMask mask= KeyModifierSuper; - - EXPECT_EQ(true, keyMap.isCommand(mask)); + KeyMap keyMap; + KeyModifierMask mask= KeyModifierSuper; + + EXPECT_EQ(true, keyMap.isCommand(mask)); } - + } diff --git a/src/test/unittests/synergy/KeyStateTests.cpp b/src/test/unittests/synergy/KeyStateTests.cpp index 146144b8..bbe3b79f 100644 --- a/src/test/unittests/synergy/KeyStateTests.cpp +++ b/src/test/unittests/synergy/KeyStateTests.cpp @@ -38,451 +38,451 @@ assertMaskIsOne(ForeachKeyCallback cb, void* userData); const synergy::KeyMap::KeyItem* stubMapKey( - synergy::KeyMap::Keystrokes& keys, KeyID id, SInt32 group, - synergy::KeyMap::ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat); + synergy::KeyMap::Keystrokes& keys, KeyID id, SInt32 group, + synergy::KeyMap::ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat); synergy::KeyMap::Keystroke s_stubKeystroke(1, false, false); synergy::KeyMap::KeyItem s_stubKeyItem; TEST(CKeyStateTests, onKey_aKeyDown_keyStateOne) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - keyState.onKey(1, true, KeyModifierAlt); + keyState.onKey(1, true, KeyModifierAlt); - EXPECT_EQ(1, keyState.getKeyState(1)); + EXPECT_EQ(1, keyState.getKeyState(1)); } TEST(KeyStateTests, onKey_aKeyUp_keyStateZero) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - keyState.onKey(1, false, KeyModifierAlt); + keyState.onKey(1, false, KeyModifierAlt); - EXPECT_EQ(0, keyState.getKeyState(1)); + EXPECT_EQ(0, keyState.getKeyState(1)); } TEST(KeyStateTests, onKey_invalidKey_keyStateZero) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - keyState.onKey(0, true, KeyModifierAlt); + keyState.onKey(0, true, KeyModifierAlt); - EXPECT_EQ(0, keyState.getKeyState(0)); + EXPECT_EQ(0, keyState.getKeyState(0)); } TEST(KeyStateTests, sendKeyEvent_halfDuplexAndRepeat_addEventNotCalled) { - NiceMock keyMap; - NiceMock eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + NiceMock eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - ON_CALL(keyMap, isHalfDuplex(_, _)).WillByDefault(Return(true)); + ON_CALL(keyMap, isHalfDuplex(_, _)).WillByDefault(Return(true)); - EXPECT_CALL(eventQueue, addEvent(_)).Times(0); + EXPECT_CALL(eventQueue, addEvent(_)).Times(0); - keyState.sendKeyEvent(NULL, false, true, kKeyCapsLock, 0, 0, 0); + keyState.sendKeyEvent(NULL, false, true, kKeyCapsLock, 0, 0, 0); } TEST(KeyStateTests, sendKeyEvent_halfDuplex_addEventCalledTwice) { - NiceMock keyMap; - NiceMock eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - IKeyStateEvents keyStateEvents; - keyStateEvents.setEvents(&eventQueue); - - ON_CALL(keyMap, isHalfDuplex(_, _)).WillByDefault(Return(true)); - ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); + NiceMock keyMap; + NiceMock eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + IKeyStateEvents keyStateEvents; + keyStateEvents.setEvents(&eventQueue); + + ON_CALL(keyMap, isHalfDuplex(_, _)).WillByDefault(Return(true)); + ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); - EXPECT_CALL(eventQueue, addEvent(_)).Times(2); + EXPECT_CALL(eventQueue, addEvent(_)).Times(2); - keyState.sendKeyEvent(NULL, false, false, kKeyCapsLock, 0, 0, 0); + keyState.sendKeyEvent(NULL, false, false, kKeyCapsLock, 0, 0, 0); } TEST(KeyStateTests, sendKeyEvent_keyRepeat_addEventCalledOnce) { - NiceMock keyMap; - NiceMock eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - IKeyStateEvents keyStateEvents; - keyStateEvents.setEvents(&eventQueue); - - ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); + NiceMock keyMap; + NiceMock eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + IKeyStateEvents keyStateEvents; + keyStateEvents.setEvents(&eventQueue); + + ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); - EXPECT_CALL(eventQueue, addEvent(_)).Times(1); + EXPECT_CALL(eventQueue, addEvent(_)).Times(1); - keyState.sendKeyEvent(NULL, false, true, 1, 0, 0, 0); + keyState.sendKeyEvent(NULL, false, true, 1, 0, 0, 0); } TEST(KeyStateTests, sendKeyEvent_keyDown_addEventCalledOnce) { - NiceMock keyMap; - NiceMock eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - IKeyStateEvents keyStateEvents; - keyStateEvents.setEvents(&eventQueue); - - ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); + NiceMock keyMap; + NiceMock eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + IKeyStateEvents keyStateEvents; + keyStateEvents.setEvents(&eventQueue); + + ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); - EXPECT_CALL(eventQueue, addEvent(_)).Times(1); + EXPECT_CALL(eventQueue, addEvent(_)).Times(1); - keyState.sendKeyEvent(NULL, true, false, 1, 0, 0, 0); + keyState.sendKeyEvent(NULL, true, false, 1, 0, 0, 0); } TEST(KeyStateTests, sendKeyEvent_keyUp_addEventCalledOnce) { - NiceMock keyMap; - NiceMock eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - IKeyStateEvents keyStateEvents; - keyStateEvents.setEvents(&eventQueue); - - ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); + NiceMock keyMap; + NiceMock eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + IKeyStateEvents keyStateEvents; + keyStateEvents.setEvents(&eventQueue); + + ON_CALL(eventQueue, forIKeyState()).WillByDefault(ReturnRef(keyStateEvents)); - EXPECT_CALL(eventQueue, addEvent(_)).Times(1); + EXPECT_CALL(eventQueue, addEvent(_)).Times(1); - keyState.sendKeyEvent(NULL, false, false, 1, 0, 0, 0); + keyState.sendKeyEvent(NULL, false, false, 1, 0, 0, 0); } TEST(KeyStateTests, updateKeyMap_mockKeyMap_keyMapGotMock) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // key map member gets a new key map via swap() - EXPECT_CALL(keyMap, swap(_)); + // key map member gets a new key map via swap() + EXPECT_CALL(keyMap, swap(_)); - keyState.updateKeyMap(); + keyState.updateKeyMap(); } TEST(KeyStateTests, updateKeyState_pollInsertsSingleKey_keyIsDown) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - ON_CALL(keyState, pollPressedKeys(_)).WillByDefault(Invoke(stubPollPressedKeys)); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + ON_CALL(keyState, pollPressedKeys(_)).WillByDefault(Invoke(stubPollPressedKeys)); - keyState.updateKeyState(); + keyState.updateKeyState(); - bool actual = keyState.isKeyDown(1); - ASSERT_TRUE(actual); + bool actual = keyState.isKeyDown(1); + ASSERT_TRUE(actual); } TEST(KeyStateTests, updateKeyState_pollDoesNothing_keyNotSet) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - keyState.updateKeyState(); + keyState.updateKeyState(); - bool actual = keyState.isKeyDown(1); - ASSERT_FALSE(actual); + bool actual = keyState.isKeyDown(1); + ASSERT_FALSE(actual); } TEST(KeyStateTests, updateKeyState_activeModifiers_maskSet) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(KeyModifierAlt)); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(KeyModifierAlt)); - keyState.updateKeyState(); + keyState.updateKeyState(); - KeyModifierMask actual = keyState.getActiveModifiers(); - ASSERT_EQ(KeyModifierAlt, actual); + KeyModifierMask actual = keyState.getActiveModifiers(); + ASSERT_EQ(KeyModifierAlt, actual); } TEST(KeyStateTests, updateKeyState_activeModifiers_maskNotSet) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - keyState.updateKeyState(); + keyState.updateKeyState(); - KeyModifierMask actual = keyState.getActiveModifiers(); - ASSERT_EQ(0, actual); + KeyModifierMask actual = keyState.getActiveModifiers(); + ASSERT_EQ(0, actual); } TEST(KeyStateTests, updateKeyState_activeModifiers_keyMapGotModifers) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(1)); - ON_CALL(keyMap, foreachKey(_, _)).WillByDefault(Invoke(assertMaskIsOne)); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(1)); + ON_CALL(keyMap, foreachKey(_, _)).WillByDefault(Invoke(assertMaskIsOne)); - // key map gets new modifiers via foreachKey() - EXPECT_CALL(keyMap, foreachKey(_, _)); + // key map gets new modifiers via foreachKey() + EXPECT_CALL(keyMap, foreachKey(_, _)); - keyState.updateKeyState(); + keyState.updateKeyState(); } TEST(KeyStateTests, setHalfDuplexMask_capsLock_halfDuplexCapsLockAdded) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyCapsLock)); + EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyCapsLock)); - keyState.setHalfDuplexMask(KeyModifierCapsLock); + keyState.setHalfDuplexMask(KeyModifierCapsLock); } TEST(KeyStateTests, setHalfDuplexMask_numLock_halfDuplexNumLockAdded) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyNumLock)); + EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyNumLock)); - keyState.setHalfDuplexMask(KeyModifierNumLock); + keyState.setHalfDuplexMask(KeyModifierNumLock); } TEST(KeyStateTests, setHalfDuplexMask_scrollLock_halfDuplexScollLockAdded) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyScrollLock)); + EXPECT_CALL(keyMap, addHalfDuplexModifier(kKeyScrollLock)); - keyState.setHalfDuplexMask(KeyModifierScrollLock); + keyState.setHalfDuplexMask(KeyModifierScrollLock); } TEST(KeyStateTests, fakeKeyDown_serverKeyAlreadyDown_fakeKeyCalledTwice) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - s_stubKeyItem.m_client = 0; - s_stubKeyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + s_stubKeyItem.m_client = 0; + s_stubKeyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - // 2 calls to fakeKeyDown should still call fakeKey, even though - // repeated keys are handled differently. - EXPECT_CALL(keyState, fakeKey(_)).Times(2); + // 2 calls to fakeKeyDown should still call fakeKey, even though + // repeated keys are handled differently. + EXPECT_CALL(keyState, fakeKey(_)).Times(2); - // call twice to simulate server key already down (a misreported autorepeat). - keyState.fakeKeyDown(1, 0, 0); - keyState.fakeKeyDown(1, 0, 0); + // call twice to simulate server key already down (a misreported autorepeat). + keyState.fakeKeyDown(1, 0, 0); + keyState.fakeKeyDown(1, 0, 0); } TEST(KeyStateTests, fakeKeyDown_isIgnoredKey_fakeKeyNotCalled) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - EXPECT_CALL(keyState, fakeKey(_)).Times(0); + EXPECT_CALL(keyState, fakeKey(_)).Times(0); - keyState.fakeKeyDown(kKeyCapsLock, 0, 0); + keyState.fakeKeyDown(kKeyCapsLock, 0, 0); } TEST(KeyStateTests, fakeKeyDown_mapReturnsKeystrokes_fakeKeyCalled) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - s_stubKeyItem.m_button = 0; - s_stubKeyItem.m_client = 0; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + s_stubKeyItem.m_button = 0; + s_stubKeyItem.m_client = 0; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - EXPECT_CALL(keyState, fakeKey(_)).Times(1); + EXPECT_CALL(keyState, fakeKey(_)).Times(1); - keyState.fakeKeyDown(1, 0, 0); + keyState.fakeKeyDown(1, 0, 0); } TEST(KeyStateTests, fakeKeyRepeat_invalidKey_returnsFalse) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - bool actual = keyState.fakeKeyRepeat(0, 0, 0, 0); + bool actual = keyState.fakeKeyRepeat(0, 0, 0, 0); - ASSERT_FALSE(actual); + ASSERT_FALSE(actual); } TEST(KeyStateTests, fakeKeyRepeat_nullKey_returnsFalse) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // set the key to down (we need to make mapKey return a valid key to do this). - synergy::KeyMap::KeyItem keyItem; - keyItem.m_client = 0; - keyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); - keyState.fakeKeyDown(1, 0, 0); + // set the key to down (we need to make mapKey return a valid key to do this). + synergy::KeyMap::KeyItem keyItem; + keyItem.m_client = 0; + keyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); + keyState.fakeKeyDown(1, 0, 0); - // change mapKey to return NULL so that fakeKeyRepeat exits early. - synergy::KeyMap::KeyItem* nullKeyItem = NULL; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(nullKeyItem)); + // change mapKey to return NULL so that fakeKeyRepeat exits early. + synergy::KeyMap::KeyItem* nullKeyItem = NULL; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(nullKeyItem)); - bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); + bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); - ASSERT_FALSE(actual); + ASSERT_FALSE(actual); } TEST(KeyStateTests, fakeKeyRepeat_invalidButton_returnsFalse) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // set the key to down (we need to make mapKey return a valid key to do this). - synergy::KeyMap::KeyItem keyItem; - keyItem.m_client = 0; - keyItem.m_button = 1; // set to 1 to make fakeKeyDown work. - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); - keyState.fakeKeyDown(1, 0, 0); + // set the key to down (we need to make mapKey return a valid key to do this). + synergy::KeyMap::KeyItem keyItem; + keyItem.m_client = 0; + keyItem.m_button = 1; // set to 1 to make fakeKeyDown work. + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); + keyState.fakeKeyDown(1, 0, 0); - // change button to 0 so that fakeKeyRepeat will return early. - keyItem.m_button = 0; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); + // change button to 0 so that fakeKeyRepeat will return early. + keyItem.m_button = 0; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Return(&keyItem)); - bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); + bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); - ASSERT_FALSE(actual); + ASSERT_FALSE(actual); } TEST(KeyStateTests, fakeKeyRepeat_validKey_returnsTrue) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); - s_stubKeyItem.m_client = 0; - s_stubKeystroke.m_type = synergy::KeyMap::Keystroke::kButton; - s_stubKeystroke.m_data.m_button.m_button = 2; + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); + s_stubKeyItem.m_client = 0; + s_stubKeystroke.m_type = synergy::KeyMap::Keystroke::kButton; + s_stubKeystroke.m_data.m_button.m_button = 2; - // set the button to 1 for fakeKeyDown call - s_stubKeyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - keyState.fakeKeyDown(1, 0, 0); + // set the button to 1 for fakeKeyDown call + s_stubKeyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + keyState.fakeKeyDown(1, 0, 0); - // change the button to 2 - s_stubKeyItem.m_button = 2; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + // change the button to 2 + s_stubKeyItem.m_button = 2; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); + bool actual = keyState.fakeKeyRepeat(1, 0, 0, 0); - ASSERT_TRUE(actual); + ASSERT_TRUE(actual); } TEST(KeyStateTests, fakeKeyUp_buttonNotDown_returnsFalse) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - bool actual = keyState.fakeKeyUp(0); + bool actual = keyState.fakeKeyUp(0); - ASSERT_FALSE(actual); + ASSERT_FALSE(actual); } TEST(KeyStateTests, fakeKeyUp_buttonAlreadyDown_returnsTrue) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // press alt down so we get full coverage. - ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(KeyModifierAlt)); - keyState.updateKeyState(); + // press alt down so we get full coverage. + ON_CALL(keyState, pollActiveModifiers()).WillByDefault(Return(KeyModifierAlt)); + keyState.updateKeyState(); - // press button 1 down. - s_stubKeyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - keyState.fakeKeyDown(1, 0, 1); + // press button 1 down. + s_stubKeyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + keyState.fakeKeyDown(1, 0, 1); - // this takes the button id, which is the 3rd arg of fakeKeyDown - bool actual = keyState.fakeKeyUp(1); + // this takes the button id, which is the 3rd arg of fakeKeyDown + bool actual = keyState.fakeKeyUp(1); - ASSERT_TRUE(actual); + ASSERT_TRUE(actual); } TEST(KeyStateTests, fakeAllKeysUp_keysWereDown_keysAreUp) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // press button 1 down. - s_stubKeyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - keyState.fakeKeyDown(1, 0, 1); + // press button 1 down. + s_stubKeyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + keyState.fakeKeyDown(1, 0, 1); - // method under test - keyState.fakeAllKeysUp(); + // method under test + keyState.fakeAllKeysUp(); - bool actual = keyState.isKeyDown(1); - ASSERT_FALSE(actual); + bool actual = keyState.isKeyDown(1); + ASSERT_FALSE(actual); } TEST(KeyStateTests, isKeyDown_keyDown_returnsTrue) { - NiceMock keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + NiceMock keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // press button 1 down. - s_stubKeyItem.m_button = 1; - ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); - keyState.fakeKeyDown(1, 0, 1); + // press button 1 down. + s_stubKeyItem.m_button = 1; + ON_CALL(keyMap, mapKey(_, _, _, _, _, _, _)).WillByDefault(Invoke(stubMapKey)); + keyState.fakeKeyDown(1, 0, 1); - // method under test - bool actual = keyState.isKeyDown(1); + // method under test + bool actual = keyState.isKeyDown(1); - ASSERT_TRUE(actual); + ASSERT_TRUE(actual); } TEST(KeyStateTests, isKeyDown_noKeysDown_returnsFalse) { - MockKeyMap keyMap; - MockEventQueue eventQueue; - KeyStateImpl keyState(eventQueue, keyMap); + MockKeyMap keyMap; + MockEventQueue eventQueue; + KeyStateImpl keyState(eventQueue, keyMap); - // method under test - bool actual = keyState.isKeyDown(1); + // method under test + bool actual = keyState.isKeyDown(1); - ASSERT_FALSE(actual); + ASSERT_FALSE(actual); } void stubPollPressedKeys(IKeyState::KeyButtonSet& pressedKeys) { - pressedKeys.insert(1); + pressedKeys.insert(1); } void assertMaskIsOne(ForeachKeyCallback cb, void* userData) { - ASSERT_EQ(1, ((KeyState::AddActiveModifierContext*)userData)->m_mask); + ASSERT_EQ(1, ((KeyState::AddActiveModifierContext*)userData)->m_mask); } const synergy::KeyMap::KeyItem* stubMapKey( - synergy::KeyMap::Keystrokes& keys, KeyID id, SInt32 group, - synergy::KeyMap::ModifierToKeys& activeModifiers, - KeyModifierMask& currentState, - KeyModifierMask desiredMask, - bool isAutoRepeat) + synergy::KeyMap::Keystrokes& keys, KeyID id, SInt32 group, + synergy::KeyMap::ModifierToKeys& activeModifiers, + KeyModifierMask& currentState, + KeyModifierMask desiredMask, + bool isAutoRepeat) { - keys.push_back(s_stubKeystroke); - return &s_stubKeyItem; + keys.push_back(s_stubKeystroke); + return &s_stubKeyItem; }