diff options
author | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:36:48 +0000 |
---|---|---|
committer | Constantin Kaplinsky <const@tightvnc.com> | 2006-05-25 05:36:48 +0000 |
commit | d1e4e901e29d8ef27a6583648c7148b1a5b2facf (patch) | |
tree | fb34ead4006e43ac22aa6368c6a622320f234261 /rfb_win32 | |
parent | 729598cb00d791bbdfe23ebe0023d3a1c3962f83 (diff) | |
download | tigervnc-d1e4e901e29d8ef27a6583648c7148b1a5b2facf.tar.gz tigervnc-d1e4e901e29d8ef27a6583648c7148b1a5b2facf.zip |
Migrating to new directory structure adopted from the RealVNC's source tree. Windows part should be complete. For the Unix part, more changes will follow.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@592 3789f03b-4d11-0410-bbf8-ca57d06f2519
Diffstat (limited to 'rfb_win32')
100 files changed, 0 insertions, 12595 deletions
diff --git a/rfb_win32/AboutDialog.cxx b/rfb_win32/AboutDialog.cxx deleted file mode 100644 index 030be1b3..00000000 --- a/rfb_win32/AboutDialog.cxx +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/AboutDialog.h> -#include <rfb_win32/Win32Util.h> -#include <rfb_win32/TCharArray.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("AboutDialog"); - -AboutDialog AboutDialog::instance; - - -AboutDialog::AboutDialog() : Dialog(GetModuleHandle(0)) { -} - -bool AboutDialog::showDialog() { - return Dialog::showDialog(MAKEINTRESOURCE(DialogId)); -} - -void AboutDialog::initDialog() { - // Set the build time field - SetWindowText(GetDlgItem(handle, BuildTime), TStr(buildTime)); - - // Get our executable's version info - FileVersionInfo verInfo; - - SetWindowText(GetDlgItem(handle, Version), verInfo.getVerString(_T("ProductVersion"))); - SetWindowText(GetDlgItem(handle, Copyright), verInfo.getVerString(_T("LegalCopyright"))); - SetWindowText(GetDlgItem(handle, Description), verInfo.getVerString(_T("ProductName"))); -} diff --git a/rfb_win32/AboutDialog.h b/rfb_win32/AboutDialog.h deleted file mode 100644 index 0dd9d494..00000000 --- a/rfb_win32/AboutDialog.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- AboutDialog.h - -#ifndef __RFB_WIN32_ABOUT_DIALOG_H__ -#define __RFB_WIN32_ABOUT_DIALOG_H__ - -#include <rfb_win32/Dialog.h> -#include <rfb/util.h> - -extern const char* buildTime; - -namespace rfb { - - namespace win32 { - - class AboutDialog : Dialog { - public: - AboutDialog(); - virtual bool showDialog(); - virtual void initDialog(); - - static AboutDialog instance; - - typedef WORD LabelId; - static const LabelId DialogId; // Resource ID of the About dialog - static const LabelId BuildTime; // Resource ID of the BuildTime label in the dialog - static const LabelId Version; // etc... - static const LabelId Copyright; - static const LabelId Description; - protected: - WORD dialogId; - }; - - }; - -}; - -#endif diff --git a/rfb_win32/BitmapInfo.h b/rfb_win32/BitmapInfo.h deleted file mode 100644 index 6a6f0d24..00000000 --- a/rfb_win32/BitmapInfo.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_BITMAP_INFO_H__ -#define __RFB_WIN32_BITMAP_INFO_H__ - -#include <windows.h> -#include <rdr/types.h> - -namespace rfb { - namespace win32 { - - struct BitmapInfo { - BITMAPINFOHEADER bmiHeader; - union { - struct { - DWORD red; - DWORD green; - DWORD blue; - } mask; - RGBQUAD color[256]; - }; - }; - - inline void initMaxAndShift(DWORD mask, int* max, int* shift) { - for ((*shift) = 0; (mask & 1) == 0; (*shift)++) mask >>= 1; - (*max) = (rdr::U16)mask; - } - - }; -}; - -#endif diff --git a/rfb_win32/CKeyboard.cxx b/rfb_win32/CKeyboard.cxx deleted file mode 100644 index 28aceab7..00000000 --- a/rfb_win32/CKeyboard.cxx +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <map> - -#define XK_MISCELLANY -#define XK_LATIN1 -#define XK_CURRENCY -#include <rfb/keysymdef.h> - -#include <rfb_win32/CKeyboard.h> -#include <rfb/LogWriter.h> -#include <rfb_win32/OSVersion.h> -#include "keymap.h" - -using namespace rfb; - -static LogWriter vlog("CKeyboard"); - - -// Client-side RFB keyboard event sythesis - -class CKeymapper { - -public: - CKeymapper() - { - for (int i = 0; i < sizeof(keymap) / sizeof(keymap_t); i++) { - int extendedVkey = keymap[i].vk + (keymap[i].extended ? 256 : 0); - if (keysymMap.find(extendedVkey) == keysymMap.end()) { - keysymMap[extendedVkey] = keymap[i].keysym; - } - } - } - - // lookup() tries to find a match for vkey with the extended flag. We check - // first for an exact match including the extended flag, then try without the - // extended flag. - rdr::U32 lookup(int extendedVkey) { - if (keysymMap.find(extendedVkey) != keysymMap.end()) - return keysymMap[extendedVkey]; - if (keysymMap.find(extendedVkey ^ 256) != keysymMap.end()) - return keysymMap[extendedVkey ^ 256]; - return 0; - } - -private: - std::map<int,rdr::U32> keysymMap; -} ckeymapper; - - -class ModifierKeyReleaser { -public: - ModifierKeyReleaser(InputHandler* writer_, int vkCode, bool extended) - : writer(writer_), extendedVkey(vkCode + (extended ? 256 : 0)), - keysym(0) - {} - void release(std::map<int,rdr::U32>* downKeysym) { - if (downKeysym->find(extendedVkey) != downKeysym->end()) { - keysym = (*downKeysym)[extendedVkey]; - vlog.debug("fake release extendedVkey 0x%x, keysym 0x%x", - extendedVkey, keysym); - writer->keyEvent(keysym, false); - } - } - ~ModifierKeyReleaser() { - if (keysym) { - vlog.debug("fake press extendedVkey 0x%x, keysym 0x%x", - extendedVkey, keysym); - writer->keyEvent(keysym, true); - } - } - InputHandler* writer; - int extendedVkey; - rdr::U32 keysym; -}; - -// IS_PRINTABLE_LATIN1 tests if a character is either a printable latin1 -// character, or 128, which is the Euro symbol on Windows. -#define IS_PRINTABLE_LATIN1(c) (((c) >= 32 && (c) <= 126) || (c) == 128 || \ - ((c) >= 160 && (c) <= 255)) - -void win32::CKeyboard::keyEvent(InputHandler* writer, rdr::U8 vkey, - rdr::U32 flags, bool down) -{ - bool extended = (flags & 0x1000000); - int extendedVkey = vkey + (extended ? 256 : 0); - - // If it's a release, just release whichever keysym corresponded to the same - // key being pressed, regardless of how it would be interpreted in the - // current keyboard state. - if (!down) { - releaseKey(writer, extendedVkey); - return; - } - - // We should always pass every down event to ToAscii() otherwise it can get - // out of sync. - - // XXX should we pass CapsLock, ScrollLock or NumLock to ToAscii - they - // actually alter the lock state on the keyboard? - - BYTE keystate[256]; - GetKeyboardState(keystate); - rdr::U8 chars[2]; - - int nchars = ToAscii(vkey, 0, keystate, (WORD*)&chars, 0); - - // See if it's in the Windows VK code -> X keysym map. We do this before - // looking at the result of ToAscii so that e.g. we recognise that it's - // XK_KP_Add rather than '+'. - - rdr::U32 keysym = ckeymapper.lookup(extendedVkey); - if (keysym) { - vlog.debug("mapped key: extendedVkey 0x%x", extendedVkey); - pressKey(writer, extendedVkey, keysym); - return; - } - - if (nchars < 0) { - // Dead key - the next call to ToAscii() will give us either the accented - // character or two characters. - vlog.debug("ToAscii dead key (1): extendedVkey 0x%x", extendedVkey); - return; - } - - if (nchars > 0 && IS_PRINTABLE_LATIN1(chars[0])) { - // Got a printable latin1 character. We must release Control and Alt - // (AltGr) if they were both pressed, so that the latin1 character is seen - // without them by the VNC server. - ModifierKeyReleaser lctrl(writer, VK_CONTROL, 0); - ModifierKeyReleaser rctrl(writer, VK_CONTROL, 1); - ModifierKeyReleaser lalt(writer, VK_MENU, 0); - ModifierKeyReleaser ralt(writer, VK_MENU, 1); - - if ((keystate[VK_CONTROL] & 0x80) && (keystate[VK_MENU] & 0x80)) { - lctrl.release(&downKeysym); - rctrl.release(&downKeysym); - lalt.release(&downKeysym); - ralt.release(&downKeysym); - } - - for (int i = 0; i < nchars; i++) { - vlog.debug("ToAscii key (1): extendedVkey 0x%x", extendedVkey); - if (chars[i] == 128) { // special hack for euro! - pressKey(writer, extendedVkey, XK_EuroSign); - } else { - pressKey(writer, extendedVkey, chars[i]); - } - } - return; - } - - // Either no chars were generated, or something outside the printable - // character range. Try ToAscii() without the Control and Alt keys down to - // see if that yields an ordinary character. - - keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0; - keystate[VK_MENU] = keystate[VK_LMENU] = keystate[VK_RMENU] = 0; - - nchars = ToAscii(vkey, 0, keystate, (WORD*)&chars, 0); - - if (nchars < 0) { - // So it would be a dead key if neither control nor alt were pressed. - // However, we know that at least one of control and alt must be pressed. - // We can't leave it at this stage otherwise the next call to ToAscii() - // with a valid character will get wrongly interpreted in the context of - // this bogus dead key. Working on the assumption that a dead key followed - // by space usually returns the dead character itself, try calling ToAscii - // with VK_SPACE. - vlog.debug("ToAscii dead key (2): extendedVkey 0x%x", extendedVkey); - nchars = ToAscii(VK_SPACE, 0, keystate, (WORD*)&chars, 0); - if (nchars < 0) { - vlog.debug("ToAscii dead key (3): extendedVkey 0x%x - giving up!", - extendedVkey); - return; - } - } - - if (nchars > 0 && IS_PRINTABLE_LATIN1(chars[0])) { - for (int i = 0; i < nchars; i++) { - vlog.debug("ToAscii key (2) (no ctrl/alt): extendedVkey 0x%x", - extendedVkey); - if (chars[i] == 128) { // special hack for euro! - pressKey(writer, extendedVkey, XK_EuroSign); - } else { - pressKey(writer, extendedVkey, chars[i]); - } - } - return; - } - - vlog.debug("no chars regardless of control and alt: extendedVkey 0x%x", - extendedVkey); -} - -// releaseAllKeys() - write key release events to the server for all keys -// that are currently regarded as being down. -void win32::CKeyboard::releaseAllKeys(InputHandler* writer) { - std::map<int,rdr::U32>::iterator i, next_i; - for (i=downKeysym.begin(); i!=downKeysym.end(); i=next_i) { - next_i = i; next_i++; - writer->keyEvent((*i).second, false); - downKeysym.erase(i); - } -} - -// releaseKey() - write a key up event to the server, but only if we've -// actually sent a key down event for the given key. The key up event always -// contains the same keysym we used in the key down event, regardless of what -// it would look up as using the current keyboard state. -void win32::CKeyboard::releaseKey(InputHandler* writer, int extendedVkey) -{ - if (downKeysym.find(extendedVkey) != downKeysym.end()) { - vlog.debug("release extendedVkey 0x%x, keysym 0x%x", - extendedVkey, downKeysym[extendedVkey]); - writer->keyEvent(downKeysym[extendedVkey], false); - downKeysym.erase(extendedVkey); - } -} - -// pressKey() - write a key down event to the server, and record which keysym -// was sent as corresponding to the given extendedVkey. The only tricky bit is -// that if we are trying to press an extendedVkey which is already marked as -// down but with a different keysym, then we need to release the old keysym -// first. This can happen in two cases: (a) when a single key press results in -// more than one character, and (b) when shift is released while another key is -// autorepeating. -void win32::CKeyboard::pressKey(InputHandler* writer, int extendedVkey, - rdr::U32 keysym) -{ - if (downKeysym.find(extendedVkey) != downKeysym.end()) { - if (downKeysym[extendedVkey] != keysym) { - vlog.debug("release extendedVkey 0x%x, keysym 0x%x", - extendedVkey, downKeysym[extendedVkey]); - writer->keyEvent(downKeysym[extendedVkey], false); - } - } - vlog.debug("press extendedVkey 0x%x, keysym 0x%x", - extendedVkey, keysym); - writer->keyEvent(keysym, true); - downKeysym[extendedVkey] = keysym; -} diff --git a/rfb_win32/CKeyboard.h b/rfb_win32/CKeyboard.h deleted file mode 100644 index 666ebce5..00000000 --- a/rfb_win32/CKeyboard.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- CKeyboard.h -// -// Client-side keyboard handling for Win32 - -#ifndef __RFB_WIN32_CKEYBOARD_H__ -#define __RFB_WIN32_CKEYBOARD_H__ - -#include <rfb/InputHandler.h> -#include <map> - -namespace rfb { - - namespace win32 { - - class CKeyboard { - public: - void keyEvent(InputHandler* writer, rdr::U8 vkey, rdr::U32 flags, - bool down); - void releaseAllKeys(InputHandler* writer); - const std::map<int,rdr::U32>& pressedKeys() const {return downKeysym;}; - bool keyPressed(int k) const {return downKeysym.find(k)!=downKeysym.end();} - private: - void win32::CKeyboard::releaseKey(InputHandler* writer, int extendedVkey); - void win32::CKeyboard::pressKey(InputHandler* writer, int extendedVkey, - rdr::U32 keysym); - std::map<int,rdr::U32> downKeysym; - }; - - }; // win32 - -}; // rfb - -#endif // __RFB_WIN32_CKEYBOARD_H__ diff --git a/rfb_win32/CPointer.cxx b/rfb_win32/CPointer.cxx deleted file mode 100644 index 3d0d9342..00000000 --- a/rfb_win32/CPointer.cxx +++ /dev/null @@ -1,186 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <windows.h> -#include <rfb/LogWriter.h> -#include <rfb_win32/CPointer.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("CPointer"); - - -CPointer::CPointer() : currButtonMask(0), intervalQueued(false), threeEmulating(false) { -} - -CPointer::~CPointer() { - intervalTimer.stop(); - threeTimer.stop(); -} - - -void CPointer::pointerEvent(InputHandler* writer, const Point& pos, int buttonMask) { - // - // - Duplicate Event Filtering - // - - bool maskChanged = buttonMask != currButtonMask; - bool posChanged = !pos.equals(currPos); - if (!(posChanged || maskChanged)) - return; - - // Pass on the event to the event-interval handler - threePointerEvent(writer, pos, buttonMask); - - // Save the position and mask - currPos = pos; - currButtonMask = buttonMask; -} - - -inline abs(int x) {return x>0 ? x : 0;} - -int emulate3Mask(int buttonMask) { - // - Release left & right and press middle - vlog.debug("emulate3: active"); - buttonMask &= ~5; - buttonMask |= 2; - return buttonMask; -} - -void CPointer::threePointerEvent(InputHandler* writer, const Point& pos, int buttonMask) { - // - // - 3-Button Mouse Emulation - // - - if (emulate3) { - - bool leftChanged = (buttonMask & 1) != (currButtonMask & 1); - bool rightChanged = (buttonMask & 4) != (currButtonMask & 4); - - if (leftChanged || rightChanged) { - // - One of left or right have changed - - if ((buttonMask & 5) == 1 || (buttonMask & 5) == 4) { - // - One is up, one is down. Start a timer, so that if it - // expires then we know we should actually send this event - vlog.debug("emulate3: start timer"); - threeTimer.start(100); - threePos = pos; - threeMask = buttonMask; - return; - - } else if (threeTimer.isActive()) { - // - Both are up or both are down, and we were timing for an emulation event - // Stop the timer and flush the stored event - vlog.debug("emulate3: stop timer (state)"); - threeTimer.stop(); - if (threeEmulating == ((buttonMask & 5) == 5)) - intervalPointerEvent(writer, threePos, threeMask); - else - threeEmulating = ((buttonMask & 5) == 5); - } - - } else { - - if (threeTimer.isActive()) { - // - We are timing for an emulation event - - if (abs(threePos.x - pos.x) <= 4 || abs(threePos.y - pos.y) <= 4) { - // If the mouse has moved too far since the button-change event then flush - vlog.debug("emulate3: stop timer (moved)"); - threeTimer.stop(); - intervalPointerEvent(writer, threePos, threeMask); - - } else { - // Otherwise, we ignore the new event - return; - } - } - - } - - // - If neither left nor right are down, stop emulating - if ((buttonMask & 5) == 0) - threeEmulating = false; - - // - If emulating, release left & right and press middle - if (threeEmulating) - buttonMask = emulate3Mask(buttonMask); - - } - - // - Let the event pass through to the next stage of processing - intervalPointerEvent(writer, pos, buttonMask); -} - -void CPointer::intervalPointerEvent(InputHandler* writer, const Point& pos, int buttonMask) { - // - // - Pointer Event Interval - // - vlog.write(101, "ptrEvent: %d,%d (%lx)", pos.x, pos.y, buttonMask); - - // Send the event immediately if we haven't sent one for a while - bool sendNow = !intervalTimer.isActive(); - - if (intervalMask != buttonMask) { - // If the buttons have changed then flush queued events and send now - sendNow = true; - if (intervalQueued) - writer->pointerEvent(intervalPos, intervalMask); - intervalQueued = false; - } - - if (!sendNow) { - // If we're not sending now then just queue the event - intervalQueued = true; - intervalPos = pos; - intervalMask = buttonMask; - } else { - // Start the interval timer if required, and send the event - intervalQueued = false; - intervalMask = buttonMask; - if (pointerEventInterval) - intervalTimer.start(pointerEventInterval); - writer->pointerEvent(pos, buttonMask); - } -} - -void CPointer::handleTimer(InputHandler* writer, int timerId) { - if (timerId == intervalTimer.getId()) { - // Pointer interval has expired - send any queued events - if (intervalQueued) { - writer->pointerEvent(intervalPos, intervalMask); - intervalQueued = false; - } else { - intervalTimer.stop(); - } - - } else if (timerId = threeTimer.getId()) { - // 3-Button emulation timer has expired - send what we've got - vlog.debug("emulate3: timeout"); - threeTimer.stop(); - - // If emulating, release left & right and press middle - if (threeEmulating) - threeMask = emulate3Mask(threeMask); - - intervalPointerEvent(writer, threePos, threeMask); - } -} diff --git a/rfb_win32/CPointer.h b/rfb_win32/CPointer.h deleted file mode 100644 index b5916010..00000000 --- a/rfb_win32/CPointer.h +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- CPointer.h -// -// Client-side pointer event handling for Win32 - -#ifndef __RFB_WIN32_CPOINTER_H__ -#define __RFB_WIN32_CPOINTER_H__ - -#include <rdr/Exception.h> -#include <rfb/Configuration.h> -#include <rfb/InputHandler.h> -#include <rfb/Rect.h> -#include <rfb_win32/IntervalTimer.h> - -namespace rfb { - - namespace win32 { - - class CPointer { - public: - CPointer(); - ~CPointer(); - - void pointerEvent(InputHandler* writer, const Point& pos, int buttonMask); - void handleTimer(InputHandler* writer, int timerId); - - void setHWND(HWND w) {intervalTimer.setHWND(w); threeTimer.setHWND(w);} - void setIntervalTimerId(int id) {intervalTimer.setId(id);} - void set3ButtonTimerId(int id) {threeTimer.setId(id);} - - void enableEmulate3(bool enable) {emulate3 = enable;} - void enableInterval(int millis) {pointerEventInterval = millis;} - private: - Point currPos; - int currButtonMask; - - bool emulate3; - int pointerEventInterval; - - void intervalPointerEvent(InputHandler* writer, const Point& pos, int buttonMask); - IntervalTimer intervalTimer; - bool intervalQueued; - Point intervalPos; - int intervalMask; - - void threePointerEvent(InputHandler* writer, const Point& pos, int buttonMask); - IntervalTimer threeTimer; - Point threePos; - int threeMask; - bool threeEmulating; - }; - - }; // win32 - -}; // rfb - -#endif // __RFB_WIN32_CPOINTER_H__ diff --git a/rfb_win32/CleanDesktop.cxx b/rfb_win32/CleanDesktop.cxx deleted file mode 100644 index 39cca119..00000000 --- a/rfb_win32/CleanDesktop.cxx +++ /dev/null @@ -1,321 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- CleanDesktop.cxx - -#include <windows.h> -#include <wininet.h> -#include <shlobj.h> -#include <rfb_win32/CleanDesktop.h> -#include <rfb_win32/CurrentUser.h> -#include <rfb_win32/Registry.h> -#include <rfb_win32/OSVersion.h> -#include <rfb/LogWriter.h> -#include <rdr/Exception.h> -#include <set> - -#ifdef SPI_GETUIEFFECTS -#define RFB_HAVE_SPI_UIEFFECTS -#else -#pragma message(" NOTE: Not building Get/Set UI Effects support.") -#endif - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("CleanDesktop"); - - -struct ActiveDesktop { - ActiveDesktop() : handle(0) { - // - Contact Active Desktop - HRESULT result = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, - IID_IActiveDesktop, (PVOID*)&handle); - if (result != S_OK) - throw rdr::SystemException("failed to contact Active Desktop", result); - } - ~ActiveDesktop() { - if (handle) - handle->Release(); - } - - // enableItem - // enables or disables the Nth Active Desktop item - bool enableItem(int i, bool enable_) { - COMPONENT item; - memset(&item, 0, sizeof(item)); - item.dwSize = sizeof(item); - - HRESULT hr = handle->GetDesktopItem(i, &item, 0); - if (hr != S_OK) { - vlog.error("unable to GetDesktopItem %d: %ld", i, hr); - return false; - } - item.fChecked = enable_; - vlog.debug("%sbling %d: \"%s\"", enable_ ? "ena" : "disa", i, (const char*)CStr(item.wszFriendlyName)); - - hr = handle->ModifyDesktopItem(&item, COMP_ELEM_CHECKED); - return hr == S_OK; - } - - // enable - // Attempts to enable/disable Active Desktop, returns true if the setting changed, - // false otherwise. - // If Active Desktop *can* be enabled/disabled then that is done. - // If Active Desktop is always on (XP/2K3) then instead the individual items are - // disabled, and true is returned to indicate that they need to be restored later. - bool enable(bool enable_) { - bool modifyComponents = false; - - vlog.debug("ActiveDesktop::enable"); - - // - Firstly, try to disable Active Desktop entirely - HRESULT hr; - COMPONENTSOPT adOptions; - memset(&adOptions, 0, sizeof(adOptions)); - adOptions.dwSize = sizeof(adOptions); - - // Attempt to actually disable/enable AD - hr = handle->GetDesktopItemOptions(&adOptions, 0); - if (hr == S_OK) { - // If Active Desktop is already in the desired state then return false (no change) - // NB: If AD is enabled AND restoreItems is set then we regard it as disabled... - if (((adOptions.fActiveDesktop==0) && restoreItems.empty()) == (enable_==false)) - return false; - adOptions.fActiveDesktop = enable_; - hr = handle->SetDesktopItemOptions(&adOptions, 0); - } - // Apply the change, then test whether it actually took effect - if (hr == S_OK) - hr = handle->ApplyChanges(AD_APPLY_REFRESH); - if (hr == S_OK) - hr = handle->GetDesktopItemOptions(&adOptions, 0); - if (hr == S_OK) - modifyComponents = (adOptions.fActiveDesktop==0) != (enable_==false); - if (hr != S_OK) { - vlog.error("failed to get/set Active Desktop options: %ld", hr); - return false; - } - - if (enable_) { - // - We are re-enabling Active Desktop. If there are components in restoreItems - // then restore them! - std::set<int>::const_iterator i; - for (i=restoreItems.begin(); i!=restoreItems.end(); i++) { - enableItem(*i, true); - } - restoreItems.clear(); - } else if (modifyComponents) { - // - Disable all currently enabled items, and add the disabled ones to restoreItems - int itemCount = 0; - hr = handle->GetDesktopItemCount(&itemCount, 0); - if (hr != S_OK) { - vlog.error("failed to get desktop item count: %ld", hr); - return false; - } - for (unsigned int i=0; i<itemCount; i++) { - if (enableItem(i, false)) - restoreItems.insert(i); - } - } - - // - Apply whatever changes we have made, but DON'T save them! - hr = handle->ApplyChanges(AD_APPLY_REFRESH); - return hr == S_OK; - } - IActiveDesktop* handle; - std::set<int> restoreItems; -}; - - -DWORD SysParamsInfo(UINT action, UINT param, PVOID ptr, UINT ini) { - DWORD r = ERROR_SUCCESS; - if (!SystemParametersInfo(action, param, ptr, ini)) { - r = GetLastError(); - vlog.info("SPI error: %d", r); - } - return r; -} - - -CleanDesktop::CleanDesktop() : restoreActiveDesktop(false), restoreWallpaper(false), - restorePattern(false), restoreEffects(false) { - CoInitialize(0); -} - -CleanDesktop::~CleanDesktop() { - enableEffects(); - enablePattern(); - enableWallpaper(); - CoUninitialize(); -} - -void CleanDesktop::disableWallpaper() { - try { - ImpersonateCurrentUser icu; - - vlog.debug("disable desktop wallpaper/Active Desktop"); - - // -=- First attempt to remove the wallpaper using Active Desktop - try { - ActiveDesktop ad; - if (ad.enable(false)) - restoreActiveDesktop = true; - } catch (rdr::Exception& e) { - vlog.error(e.str()); - } - - // -=- Switch of normal wallpaper and notify apps - SysParamsInfo(SPI_SETDESKWALLPAPER, 0, "", SPIF_SENDCHANGE); - restoreWallpaper = true; - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} - -void CleanDesktop::enableWallpaper() { - try { - ImpersonateCurrentUser icu; - - if (restoreActiveDesktop) { - vlog.debug("restore Active Desktop"); - - // -=- First attempt to re-enable Active Desktop - try { - ActiveDesktop ad; - ad.enable(true); - restoreActiveDesktop = false; - } catch (rdr::Exception& e) { - vlog.error(e.str()); - } - } - - if (restoreWallpaper) { - vlog.debug("restore desktop wallpaper"); - - // -=- Then restore the standard wallpaper if required - SysParamsInfo(SPI_SETDESKWALLPAPER, 0, NULL, SPIF_SENDCHANGE); - restoreWallpaper = false; - } - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} - - -void CleanDesktop::disablePattern() { - try { - ImpersonateCurrentUser icu; - - vlog.debug("disable desktop pattern"); - SysParamsInfo(SPI_SETDESKPATTERN, 0, "", SPIF_SENDCHANGE); - restorePattern = true; - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} - -void CleanDesktop::enablePattern() { - try { - if (restorePattern) { - ImpersonateCurrentUser icu; - - vlog.debug("restoring pattern..."); - - TCharArray pattern; - if (osVersion.isPlatformWindows) { - RegKey cfgKey; - cfgKey.openKey(HKEY_CURRENT_USER, _T("Control Panel\\Desktop")); - pattern.buf = cfgKey.getString(_T("Pattern")); - } - SysParamsInfo(SPI_SETDESKPATTERN, 0, pattern.buf, SPIF_SENDCHANGE); - restorePattern = false; - } - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} - - -void CleanDesktop::disableEffects() { - try { - ImpersonateCurrentUser icu; - - vlog.debug("disable desktop effects"); - - SysParamsInfo(SPI_SETFONTSMOOTHING, FALSE, 0, SPIF_SENDCHANGE); -#ifdef RFB_HAVE_SPI_UIEFFECTS - if (SysParamsInfo(SPI_GETUIEFFECTS, 0, &uiEffects, 0) == ERROR_CALL_NOT_IMPLEMENTED) { - SysParamsInfo(SPI_GETCOMBOBOXANIMATION, 0, &comboBoxAnim, 0); - SysParamsInfo(SPI_GETGRADIENTCAPTIONS, 0, &gradientCaptions, 0); - SysParamsInfo(SPI_GETHOTTRACKING, 0, &hotTracking, 0); - SysParamsInfo(SPI_GETLISTBOXSMOOTHSCROLLING, 0, &listBoxSmoothScroll, 0); - SysParamsInfo(SPI_GETMENUANIMATION, 0, &menuAnim, 0); - SysParamsInfo(SPI_SETCOMBOBOXANIMATION, 0, FALSE, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETGRADIENTCAPTIONS, 0, FALSE, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETHOTTRACKING, 0, FALSE, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, FALSE, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETMENUANIMATION, 0, FALSE, SPIF_SENDCHANGE); - } else { - SysParamsInfo(SPI_SETUIEFFECTS, 0, FALSE, SPIF_SENDCHANGE); - - // We *always* restore UI effects overall, since there is no Windows GUI to do it - uiEffects = TRUE; - } -#else - vlog.debug(" not supported"); -#endif - restoreEffects = true; - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} - -void CleanDesktop::enableEffects() { - try { - if (restoreEffects) { - ImpersonateCurrentUser icu; - - vlog.debug("restore desktop effects"); - - RegKey desktopCfg; - desktopCfg.openKey(HKEY_CURRENT_USER, _T("Control Panel\\Desktop")); - SysParamsInfo(SPI_SETFONTSMOOTHING, desktopCfg.getInt(_T("FontSmoothing"), 0) != 0, 0, SPIF_SENDCHANGE); -#ifdef RFB_HAVE_SPI_UIEFFECTS - if (SysParamsInfo(SPI_SETUIEFFECTS, 0, (void*)uiEffects, SPIF_SENDCHANGE) == ERROR_CALL_NOT_IMPLEMENTED) { - SysParamsInfo(SPI_SETCOMBOBOXANIMATION, 0, (void*)comboBoxAnim, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETGRADIENTCAPTIONS, 0, (void*)gradientCaptions, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETHOTTRACKING, 0, (void*)hotTracking, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETLISTBOXSMOOTHSCROLLING, 0, (void*)listBoxSmoothScroll, SPIF_SENDCHANGE); - SysParamsInfo(SPI_SETMENUANIMATION, 0, (void*)menuAnim, SPIF_SENDCHANGE); - } - restoreEffects = false; -#else - vlog.info(" not supported"); -#endif - } - - } catch (rdr::Exception& e) { - vlog.info(e.str()); - } -} diff --git a/rfb_win32/CleanDesktop.h b/rfb_win32/CleanDesktop.h deleted file mode 100644 index 22e246fa..00000000 --- a/rfb_win32/CleanDesktop.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- CleanDesktop.h - -#ifndef __RFB_WIN32_CLEANDESKTOP_H__ -#define __RFB_WIN32_CLEANDESKTOP_H__ - -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - class CleanDesktop { - public: - CleanDesktop(); - ~CleanDesktop(); - - void disableWallpaper(); - void enableWallpaper(); - - void disablePattern(); - void enablePattern(); - - void disableEffects(); - void enableEffects(); - - private: - bool restoreActiveDesktop; - bool restoreWallpaper; - bool restorePattern; - bool restoreEffects; - BOOL uiEffects; - BOOL comboBoxAnim, gradientCaptions, hotTracking, listBoxSmoothScroll, menuAnim; - }; - - }; // win32 - -}; // rfb - -#endif // __RFB_WIN32_CLEANDESKTOP_H__ diff --git a/rfb_win32/Clipboard.cxx b/rfb_win32/Clipboard.cxx deleted file mode 100644 index a4c43f04..00000000 --- a/rfb_win32/Clipboard.cxx +++ /dev/null @@ -1,200 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Clipboard.cxx - -#include <rfb_win32/Clipboard.h> -#include <rfb_win32/WMShatter.h> -#include <rfb/util.h> - -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("Clipboard"); - - -// -// -=- CR/LF handlers -// - -char* -dos2unix(const char* text) { - int len = strlen(text)+1; - char* unix = new char[strlen(text)+1]; - int i, j=0; - for (i=0; i<len; i++) { - if (text[i] != '\x0d') - unix[j++] = text[i]; - } - return unix; -} - -char* -unix2dos(const char* text) { - int len = strlen(text)+1; - char* dos = new char[strlen(text)*2+1]; - int i, j=0; - for (i=0; i<len; i++) { - if (text[i] == '\x0a') - dos[j++] = '\x0d'; - dos[j++] = text[i]; - } - return dos; -} - - -// -// -=- ISO-8859-1 (Latin 1) filter (in-place) -// - -void -removeNonISOLatin1Chars(char* text) { - int len = strlen(text); - int i=0, j=0; - for (; i<len; i++) { - if (((text[i] >= 1) && (text[i] <= 127)) || - ((text[i] >= 160) && (text[i] <= 255))) - text[j++] = text[i]; - } - text[j] = 0; -} - -// -// -=- Clipboard object -// - -Clipboard::Clipboard() - : MsgWindow(_T("Clipboard")), notifier(0), next_window(0) { - next_window = SetClipboardViewer(getHandle()); - vlog.debug("registered clipboard handler"); -} - -Clipboard::~Clipboard() { - vlog.debug("removing %x from chain (next is %x)", getHandle(), next_window); - ChangeClipboardChain(getHandle(), next_window); -} - -LRESULT -Clipboard::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - switch (msg) { - - case WM_CHANGECBCHAIN: - vlog.debug("change clipboard chain (%x, %x)", wParam, lParam); - if ((HWND) wParam == next_window) - next_window = (HWND) lParam; - else if (next_window != 0) - SendMessage(next_window, msg, wParam, lParam); - else - vlog.error("bad clipboard chain change!"); - break; - - case WM_DRAWCLIPBOARD: - { - HWND owner = GetClipboardOwner(); - if (owner == getHandle()) { - vlog.debug("local clipboard changed by me"); - } else { - vlog.debug("local clipboard changed by %x", owner); - - // Open the clipboard - if (OpenClipboard(getHandle())) { - // Get the clipboard data - HGLOBAL cliphandle = GetClipboardData(CF_TEXT); - if (cliphandle) { - char* clipdata = (char*) GlobalLock(cliphandle); - - // Notify clients - if (notifier) { - if (!clipdata) { - notifier->notifyClipboardChanged(0, 0); - } else { - CharArray unix_text; - unix_text.buf = dos2unix(clipdata); - removeNonISOLatin1Chars(unix_text.buf); - notifier->notifyClipboardChanged(unix_text.buf, strlen(unix_text.buf)); - } - } else { - vlog.debug("no clipboard notifier registered"); - } - - // Release the buffer and close the clipboard - GlobalUnlock(cliphandle); - } - - CloseClipboard(); - } - } - } - if (next_window) - SendMessage(next_window, msg, wParam, lParam); - return 0; - - }; - return MsgWindow::processMessage(msg, wParam, lParam); -}; - -void -Clipboard::setClipText(const char* text) { - HANDLE clip_handle = 0; - - try { - - // - Firstly, we must open the clipboard - if (!OpenClipboard(getHandle())) - throw rdr::SystemException("unable to open Win32 clipboard", GetLastError()); - - // - Pre-process the supplied clipboard text into DOS format - CharArray dos_text; - dos_text.buf = unix2dos(text); - removeNonISOLatin1Chars(dos_text.buf); - int dos_text_len = strlen(dos_text.buf); - - // - Allocate global memory for the data - clip_handle = ::GlobalAlloc(GMEM_MOVEABLE, dos_text_len+1); - - char* data = (char*) GlobalLock(clip_handle); - memcpy(data, dos_text.buf, dos_text_len+1); - data[dos_text_len] = 0; - GlobalUnlock(clip_handle); - - // - Next, we must clear out any existing data - if (!EmptyClipboard()) - throw rdr::SystemException("unable to empty Win32 clipboard", GetLastError()); - - // - Set the new clipboard data - if (!SetClipboardData(CF_TEXT, clip_handle)) - throw rdr::SystemException("unable to set Win32 clipboard", GetLastError()); - clip_handle = 0; - - vlog.debug("set clipboard"); - } catch (rdr::Exception& e) { - vlog.debug(e.str()); - } - - // - Close the clipboard - if (!CloseClipboard()) - vlog.debug("unable to close Win32 clipboard: %u", GetLastError()); - else - vlog.debug("closed clipboard"); - if (clip_handle) { - vlog.debug("freeing clipboard handle"); - GlobalFree(clip_handle); - } -} diff --git a/rfb_win32/Clipboard.h b/rfb_win32/Clipboard.h deleted file mode 100644 index b79768f6..00000000 --- a/rfb_win32/Clipboard.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Clipboard.h -// -// The Clipboard is used to set the system clipboard, and to get callbacks -// when the system clipboard has changed. - -#ifndef __RFB_WIN32_CLIPBOARD_H__ -#define __RFB_WIN32_CLIPBOARD_H__ - -#include <rfb/SDesktop.h> -#include <rfb/Threading.h> -#include <rfb_win32/MsgWindow.h> -#include <rfb_win32/DeviceFrameBuffer.h> - -namespace rfb { - - namespace win32 { - - class Clipboard : MsgWindow { - public: - - // -=- Abstract base class for callback recipients - class Notifier { - public: - virtual void notifyClipboardChanged(const char* text, int len) = 0; - }; - - Clipboard(); - ~Clipboard(); - - // - Set the notifier to use - void setNotifier(Notifier* cbn) {notifier = cbn;} - - // - Set the clipboard contents - void setClipText(const char* text); - - protected: - // - Internal MsgWindow callback - virtual LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam); - - Notifier* notifier; - HWND next_window; - }; - - }; - -}; - -#endif // __RFB_WIN32_CLIPBOARD_H__ diff --git a/rfb_win32/CompatibleBitmap.h b/rfb_win32/CompatibleBitmap.h deleted file mode 100644 index 4beed8dc..00000000 --- a/rfb_win32/CompatibleBitmap.h +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_COMPAT_BITMAP_H__ -#define __RFB_WIN32_COMPAT_BITMAP_H__ - -#include <windows.h> -#include <rdr/Exception.h> - -namespace rfb { - namespace win32 { - - class CompatibleBitmap { - public: - CompatibleBitmap(HDC hdc, int width, int height) { - hbmp = CreateCompatibleBitmap(hdc, width, height); - if (!hbmp) - throw rdr::SystemException("CreateCompatibleBitmap() failed", GetLastError()); - } - virtual ~CompatibleBitmap() { - if (hbmp) DeleteObject(hbmp); - } - operator HBITMAP() const {return hbmp;} - protected: - HBITMAP hbmp; - }; - - }; -}; - -#endif diff --git a/rfb_win32/ComputerName.h b/rfb_win32/ComputerName.h deleted file mode 100644 index 110caa59..00000000 --- a/rfb_win32/ComputerName.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_COMPUTERNAME_H__ -#define __RFB_WIN32_COMPUTERNAME_H__ - -#include <windows.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - namespace win32 { - - // Get the computer name - struct ComputerName : TCharArray { - ComputerName() : TCharArray(MAX_COMPUTERNAME_LENGTH+1) { - ULONG namelength = MAX_COMPUTERNAME_LENGTH+1; - if (!GetComputerName(buf, &namelength)) - _tcscpy(buf, _T("")); - } - }; - - }; -}; - -#endif diff --git a/rfb_win32/CurrentUser.cxx b/rfb_win32/CurrentUser.cxx deleted file mode 100644 index 7562d29b..00000000 --- a/rfb_win32/CurrentUser.cxx +++ /dev/null @@ -1,152 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Currentuser.cxx - -#include <stdlib.h> -#include <rfb/LogWriter.h> -#include <rfb_win32/CurrentUser.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/Service.h> -#include <rfb_win32/OSVersion.h> -#include <lmcons.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("CurrentUser"); - - -const TCHAR* shellIconClass = _T("Shell_TrayWnd"); - -BOOL CALLBACK enumWindows(HWND hwnd, LPARAM lParam) { - TCHAR className[16]; - if (GetClassName(hwnd, className, sizeof(className)) && - (_tcscmp(className, shellIconClass) == 0)) { - vlog.debug("located tray icon window (%s)", (const char*)CStr(className)); - DWORD processId = 0; - GetWindowThreadProcessId(hwnd, &processId); - if (!processId) - return TRUE; - Handle process = OpenProcess(MAXIMUM_ALLOWED, FALSE, processId); - if (!process.h) - return TRUE; - if (!OpenProcessToken(process, MAXIMUM_ALLOWED, (HANDLE*)lParam)) - return TRUE; - vlog.debug("obtained user token"); - return FALSE; - } - return TRUE; -} - -BOOL CALLBACK enumDesktops(LPTSTR lpszDesktop, LPARAM lParam) { - HDESK desktop = OpenDesktop(lpszDesktop, 0, FALSE, DESKTOP_ENUMERATE); - vlog.debug("opening \"%s\"", lpszDesktop); - if (!desktop) { - vlog.info("desktop \"%s\" inaccessible", (const char*)CStr(lpszDesktop)); - return TRUE; - } - BOOL result = EnumDesktopWindows(desktop, enumWindows, lParam); - if (!CloseDesktop(desktop)) - vlog.info("unable to close desktop: %ld", GetLastError()); - return result; -} - - -CurrentUserToken::CurrentUserToken() : isSafe_(false) { - if (isServiceProcess()) { - // If the platform is Windows 95/98/Me then we must fake the token's presence - if (osVersion.isPlatformWindows) { - try { - UserName un; - h = INVALID_HANDLE_VALUE; - } catch (rdr::SystemException& e) { - if (e.err != ERROR_NOT_LOGGED_ON) - throw; - if (FindWindow(shellIconClass, 0)) - h = INVALID_HANDLE_VALUE; - } - isSafe_ = (h != 0); - return; - } - - // Try to get the user token using the Terminal Services APIs - // NB: This will only work under XP/2003 and later - typedef BOOL (WINAPI *WTSQueryUserToken_proto)(ULONG, PHANDLE); - DynamicFn<WTSQueryUserToken_proto> _WTSQueryUserToken(_T("wtsapi32.dll"), "WTSQueryUserToken"); - if (_WTSQueryUserToken.isValid()) { - (*_WTSQueryUserToken)(-1, &h); - isSafe_ = true; - return; - } - - // Try to find the Shell Tray Icon window and take its token - // NB: This will only work under NT/2K (and later, but they're dealt with above) - // NB: If the shell is not running then this will return an Unsafe Null token. - EnumDesktops(GetProcessWindowStation(), enumDesktops, (LONG)&h); - isSafe_ = (h != 0); - } else { - // Try to open the security token for the User-Mode process - if (!OpenProcessToken(GetCurrentProcess(), GENERIC_ALL, &h)) { - DWORD err = GetLastError(); - if (err != ERROR_CALL_NOT_IMPLEMENTED) - throw rdr::SystemException("OpenProcessToken failed", err); - // Under Windows 95/98/Me, we fake the handle value... - h = INVALID_HANDLE_VALUE; - } - isSafe_ = true; - } -} - - -ImpersonateCurrentUser::ImpersonateCurrentUser() { - RegCloseKey(HKEY_CURRENT_USER); - if (!isServiceProcess()) - return; - if (!token.canImpersonate()) - throw rdr::Exception("Cannot impersonate unsafe or null token"); - if (!ImpersonateLoggedOnUser(token)) { - DWORD err = GetLastError(); - if (err != ERROR_CALL_NOT_IMPLEMENTED) - throw rdr::SystemException("Failed to impersonate user", GetLastError()); - } -} - -ImpersonateCurrentUser::~ImpersonateCurrentUser() { - if (!RevertToSelf()) { - DWORD err = GetLastError(); - if (err != ERROR_CALL_NOT_IMPLEMENTED) - exit(err); - } - RegCloseKey(HKEY_CURRENT_USER); -} - - -UserName::UserName() : TCharArray(UNLEN+1) { - DWORD len = UNLEN+1; - if (!GetUserName(buf, &len)) - throw rdr::SystemException("GetUserName failed", GetLastError()); -} - - -UserSID::UserSID() { - CurrentUserToken token; - if (!token.canImpersonate()) - return; - setSID(Sid::FromToken(token.h)); -} diff --git a/rfb_win32/CurrentUser.h b/rfb_win32/CurrentUser.h deleted file mode 100644 index 794f27c6..00000000 --- a/rfb_win32/CurrentUser.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// CurrentUser.h - -// Helper class providing the session's logged on username, if -// a user is logged on. Also allows processes running under -// XP/2K3 etc to masquerade as the logged on user for security -// purposes - -#ifndef __RFB_WIN32_CURRENT_USER_H__ -#define __RFB_WIN32_CURRENT_USER_H__ - -#include <rfb_win32/Handle.h> -#include <rfb_win32/Security.h> - -namespace rfb { - - namespace win32 { - - // CurrentUserToken - // CurrentUserToken is a Handle containing the security token - // for the currently logged-on user, or null if no user is - // logged on. - // - // Under Windows 95/98/Me, which don't support security tokens, - // the token will be INVALID_HANDLE_VALUE if a user is logged on. - // - // Under Windows NT/2K, it may be the case that the token is - // null even when a user *is* logged on, because we use some hacks - // to detect the user's token and sometimes they fail. On these - // platforms, isSafe() will return False if the token is null. - // - // Under Windows XP, etc, isSafe() will always be True, and the token - // will always be set to the currently logged on user's token. - // - // canImpersonate() tests whether there is a user token that is safe - // to impersonate. - // - // noUserLoggedOn() tests whether there is *definitely* no user logged on. - - struct CurrentUserToken : public Handle { - CurrentUserToken(); - bool isSafe() const { return isSafe_; }; - bool canImpersonate() const { return h && isSafe(); } - bool noUserLoggedOn() const { return !h && isSafe(); } - private: - bool isSafe_; - }; - - // ImpersonateCurrentUser - // Throws an exception on failure. - // Succeeds (trivially) if process is not running as service. - // Fails if CurrentUserToken is not valid. - // Fails if platform is NT AND cannot impersonate token. - // Succeeds otherwise. - - struct ImpersonateCurrentUser { - ImpersonateCurrentUser(); - ~ImpersonateCurrentUser(); - CurrentUserToken token; - }; - - // UserName - // Returns the name of the user the thread is currently running as. - // Raises a SystemException in case of error. - // NB: Raises a SystemException with err == ERROR_NOT_LOGGED_ON if - // running under Windows 9x/95/Me and no user is logged on. - - struct UserName : public TCharArray { - UserName(); - }; - - // UserSID - // Returns the SID of the currently logged-on user (i.e. the session user) - - struct UserSID : public Sid { - UserSID(); - }; - - } - -} - -#endif diff --git a/rfb_win32/DIBSectionBuffer.cxx b/rfb_win32/DIBSectionBuffer.cxx deleted file mode 100644 index 18ce3ea4..00000000 --- a/rfb_win32/DIBSectionBuffer.cxx +++ /dev/null @@ -1,222 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/DIBSectionBuffer.h> -#include <rfb_win32/DeviceContext.h> -#include <rfb_win32/BitmapInfo.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("DIBSectionBuffer"); - - -DIBSectionBuffer::DIBSectionBuffer(HWND window_) - : bitmap(0), device(0), window(window_) { - memset(&format, 0, sizeof(format)); - memset(palette, 0, sizeof(palette)); -} - -DIBSectionBuffer::DIBSectionBuffer(HDC device_) - : bitmap(0), window(0), device(device_) { - memset(&format, 0, sizeof(format)); - memset(palette, 0, sizeof(palette)); -} - -DIBSectionBuffer::~DIBSectionBuffer() { - if (bitmap) - DeleteObject(bitmap); -} - - -void DIBSectionBuffer::setPF(const PixelFormat& pf) { - if (memcmp(&getPF(), &pf, sizeof(pf)) == 0) { - vlog.debug("pixel format unchanged by setPF()"); - return; - } - format = pf; - recreateBuffer(); - if ((pf.bpp <= 8) && pf.trueColour) { - vlog.info("creating %d-bit TrueColour palette", pf.depth); - for (int i=0; i < (1<<(pf.depth)); i++) { - palette[i].b = ((((i >> pf.blueShift) & pf.blueMax) * 65535) + pf.blueMax/2) / pf.blueMax; - palette[i].g = ((((i >> pf.greenShift) & pf.greenMax) * 65535) + pf.greenMax/2) / pf.greenMax; - palette[i].r = ((((i >> pf.redShift) & pf.redMax) * 65535) + pf.redMax/2) / pf.redMax; - } - refreshPalette(); - } -} - -void DIBSectionBuffer::setSize(int w, int h) { - if (width_ == w && height_ == h) { - vlog.debug("size unchanged by setSize()"); - return; - } - width_ = w; - height_ = h; - recreateBuffer(); -} - - -// * copyPaletteToDIB MUST NEVER be called on a truecolour DIB! * - -void copyPaletteToDIB(Colour palette[256], HDC wndDC, HBITMAP dib) { - BitmapDC dibDC(wndDC, dib); - RGBQUAD rgb[256]; - for (unsigned int i=0;i<256;i++) { - rgb[i].rgbRed = palette[i].r >> 8; - rgb[i].rgbGreen = palette[i].g >> 8; - rgb[i].rgbBlue = palette[i].b >> 8; - } - if (!SetDIBColorTable(dibDC, 0, 256, (RGBQUAD*) rgb)) - throw rdr::SystemException("unable to SetDIBColorTable", GetLastError()); -} - -inline void initMaxAndShift(DWORD mask, int* max, int* shift) { - for ((*shift) = 0; (mask & 1) == 0; (*shift)++) mask >>= 1; - (*max) = (rdr::U16)mask; -} - -void DIBSectionBuffer::recreateBuffer() { - HBITMAP new_bitmap = 0; - rdr::U8* new_data = 0; - - if (width_ && height_ && (format.depth != 0)) { - BitmapInfo bi; - memset(&bi, 0, sizeof(bi)); - // *** wrong? - UINT iUsage = format.trueColour ? DIB_RGB_COLORS : DIB_PAL_COLORS; - // *** - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biBitCount = format.bpp; - bi.bmiHeader.biSizeImage = (format.bpp / 8) * width_ * height_; - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biWidth = width_; - bi.bmiHeader.biHeight = -height_; - bi.bmiHeader.biCompression = (format.bpp > 8) ? BI_BITFIELDS : BI_RGB; - bi.mask.red = format.redMax << format.redShift; - bi.mask.green = format.greenMax << format.greenShift; - bi.mask.blue = format.blueMax << format.blueShift; - - // Create a DIBSection to draw into - if (device) - new_bitmap = ::CreateDIBSection(device, (BITMAPINFO*)&bi.bmiHeader, iUsage, - (void**)&new_data, NULL, 0); - else - new_bitmap = ::CreateDIBSection(WindowDC(window), (BITMAPINFO*)&bi.bmiHeader, iUsage, - (void**)&new_data, NULL, 0); - - if (!new_bitmap) { - int err = GetLastError(); - throw rdr::SystemException("unable to create DIB section", err); - } - - vlog.debug("recreateBuffer()"); - } else { - vlog.debug("one of area or format not set"); - } - - if (new_bitmap && bitmap) { - vlog.debug("preserving bitmap contents"); - - // Copy the contents across - if (device) { - if (format.bpp <= 8) - copyPaletteToDIB(palette, device, new_bitmap); - BitmapDC src_dev(device, bitmap); - BitmapDC dest_dev(device, new_bitmap); - BitBlt(dest_dev, 0, 0, width_, height_, src_dev, 0, 0, SRCCOPY); - } else { - WindowDC wndDC(window); - if (format.bpp <= 8) - copyPaletteToDIB(palette, wndDC, new_bitmap); - BitmapDC src_dev(wndDC, bitmap); - BitmapDC dest_dev(wndDC, new_bitmap); - BitBlt(dest_dev, 0, 0, width_, height_, src_dev, 0, 0, SRCCOPY); - } - } - - if (bitmap) { - // Delete the old bitmap - DeleteObject(bitmap); - bitmap = 0; - data = 0; - } - - if (new_bitmap) { - // Set up the new bitmap - bitmap = new_bitmap; - data = new_data; - - // Determine the *actual* DIBSection format - DIBSECTION ds; - if (!GetObject(bitmap, sizeof(ds), &ds)) - throw rdr::SystemException("GetObject", GetLastError()); - - // Correct the "stride" of the DIB - // *** This code DWORD aligns each row - is that right??? - stride = width_; - int bytesPerRow = stride * format.bpp/8; - if (bytesPerRow % 4) { - bytesPerRow += 4 - (bytesPerRow % 4); - stride = (bytesPerRow * 8) / format.bpp; - vlog.info("adjusting DIB stride: %d to %d", width_, stride); - } - - // Calculate the PixelFormat for the DIB - format.bigEndian = 0; - format.bpp = format.depth = ds.dsBm.bmBitsPixel; - format.trueColour = format.trueColour || format.bpp > 8; - if (format.bpp > 8) { - - // Get the truecolour format used by the DIBSection - initMaxAndShift(ds.dsBitfields[0], &format.redMax, &format.redShift); - initMaxAndShift(ds.dsBitfields[1], &format.greenMax, &format.greenShift); - initMaxAndShift(ds.dsBitfields[2], &format.blueMax, &format.blueShift); - - // Calculate the effective depth - format.depth = 0; - Pixel bits = ds.dsBitfields[0] | ds.dsBitfields[1] | ds.dsBitfields[2]; - while (bits) { - format.depth++; - bits = bits >> 1; - } - if (format.depth > format.bpp) - throw Exception("Bad DIBSection format (depth exceeds bpp)"); - } else { - // Set the DIBSection's palette - refreshPalette(); - } - - } -} - -void DIBSectionBuffer::refreshPalette() { - if (format.bpp > 8) { - vlog.error("refresh palette called for truecolor DIB"); - return; - } - vlog.debug("refreshing palette"); - if (device) - copyPaletteToDIB(palette, device, bitmap); - else - copyPaletteToDIB(palette, WindowDC(window), bitmap); -} - - diff --git a/rfb_win32/DIBSectionBuffer.h b/rfb_win32/DIBSectionBuffer.h deleted file mode 100644 index ad1a310c..00000000 --- a/rfb_win32/DIBSectionBuffer.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- DIBSectionBuffer.h - -// A DIBSectionBuffer acts much like a standard PixelBuffer, but is associated -// with a particular window on-screen and can be drawn into that window if -// required, using the standard Win32 drawing operations. - -#ifndef __RFB_WIN32_DIB_SECTION_BUFFER_H__ -#define __RFB_WIN32_DIB_SECTION_BUFFER_H__ - -#include <windows.h> -#include <rfb/PixelBuffer.h> -#include <rfb/Region.h> -#include <rfb/ColourMap.h> -#include <rfb/Exception.h> - -namespace rfb { - - namespace win32 { - - // - // -=- DIBSectionBuffer - // - - class DIBSectionBuffer : public FullFramePixelBuffer, ColourMap { - public: - DIBSectionBuffer(HWND window); - DIBSectionBuffer(HDC device); - virtual ~DIBSectionBuffer(); - - virtual void setPF(const PixelFormat &pf); - virtual void setSize(int w, int h); - - virtual int getStride() const {return stride;} - - virtual ColourMap* getColourMap() const {return (ColourMap*)this;} - - // - ColourMap interface - virtual void lookup(int index, int* r, int *g, int* b) { - *r = palette[index].r; - *g = palette[index].g; - *b = palette[index].b; - } - - // Custom colourmap interface - void setColour(int index, int r, int g, int b) { - palette[index].r = r; - palette[index].g = g; - palette[index].b = b; - } - void refreshPalette(); - - // *** virtual void copyRect(const Rect &dest, const Point &move_by_delta); - public: - HBITMAP bitmap; - protected: - void recreateBuffer(); - Colour palette[256]; - int stride; - HWND window; - HDC device; - }; - - }; - -}; - -#endif // __RFB_WIN32_DIB_SECTION_BUFFER_H__ diff --git a/rfb_win32/DeviceContext.cxx b/rfb_win32/DeviceContext.cxx deleted file mode 100644 index 4f70a1bf..00000000 --- a/rfb_win32/DeviceContext.cxx +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/DeviceContext.h> -#include <rfb_win32/CompatibleBitmap.h> -#include <rfb_win32/BitmapInfo.h> -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace win32; - - -static LogWriter vlog("DeviceContext"); - -PixelFormat DeviceContext::getPF() const { - return getPF(dc); -} - -PixelFormat DeviceContext::getPF(HDC dc) { - PixelFormat format; - CompatibleBitmap bitmap(dc, 1, 1); - - // -=- Get the bitmap format information - BitmapInfo bi; - memset(&bi, 0, sizeof(bi)); - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biBitCount = 0; - if (!::GetDIBits(dc, bitmap, 0, 1, NULL, (BITMAPINFO*)&bi, DIB_RGB_COLORS)) { - throw rdr::SystemException("unable to determine device pixel format", GetLastError()); - } - if (!::GetDIBits(dc, bitmap, 0, 1, NULL, (BITMAPINFO*)&bi, DIB_RGB_COLORS)) { - throw rdr::SystemException("unable to determine pixel shifts/palette", GetLastError()); - } - - // Set the initial format information - format.trueColour = bi.bmiHeader.biBitCount > 8; - format.bigEndian = 0; - format.bpp = bi.bmiHeader.biBitCount; - - if (format.trueColour) { - DWORD rMask=0, gMask=0, bMask=0; - - // Which true colour format is the DIB section using? - switch (bi.bmiHeader.biCompression) { - case BI_RGB: - // Default RGB layout - switch (bi.bmiHeader.biBitCount) { - case 16: - // RGB 555 - High Colour - vlog.info("16-bit High Colour"); - rMask = 0x7c00; - bMask = 0x001f; - gMask = 0x03e0; - break; - case 24: - case 32: - // RGB 888 - True Colour - vlog.info("24/32-bit High Colour"); - rMask = 0xff0000; - gMask = 0x00ff00; - bMask = 0x0000ff; - break; - default: - vlog.error("bits per pixel %u not supported", bi.bmiHeader.biBitCount); - throw rdr::Exception("unknown bits per pixel specified"); - }; - break; - case BI_BITFIELDS: - // Custom RGB layout - rMask = bi.mask.red; - gMask = bi.mask.green; - bMask = bi.mask.blue; - vlog.info("%lu-bit BitFields: (%lx, %lx, %lx)", - bi.bmiHeader.biBitCount, rMask, gMask, bMask); - break; - }; - - // Convert the data we just retrieved - initMaxAndShift(rMask, &format.redMax, &format.redShift); - initMaxAndShift(gMask, &format.greenMax, &format.greenShift); - initMaxAndShift(bMask, &format.blueMax, &format.blueShift); - - // Calculate the depth from the colour shifts - format.depth = 0; - Pixel bits = rMask | gMask | bMask; - while (bits) { - format.depth++; - bits = bits >> 1; - } - - // Check that the depth & bpp are valid - if (format.depth > format.bpp) { - vlog.error("depth exceeds bits per pixel!"); - format.bpp = format.depth; - } - - // Correct the bits-per-pixel to something we're happy with - if (format.bpp <= 16) - format.bpp = 16; - else if (format.bpp <= 32) - format.bpp = 32; - } else { - // Palettised format - depth reflects number of colours, - // but bits-per-pixel is ALWAYS 8 - format.depth = format.bpp; - if (format.bpp < 8) - format.bpp = 8; - vlog.info("%d-colour palettised", 1<<format.depth); - } - - return format; -} - -Rect DeviceContext::getClipBox() const { - return getClipBox(dc); -} - -Rect DeviceContext::getClipBox(HDC dc) { - // Get the display dimensions - RECT cr; - if (!GetClipBox(dc, &cr)) - throw rdr::SystemException("GetClipBox", GetLastError()); - return Rect(cr.left, cr.top, cr.right, cr.bottom); -} - - -DeviceDC::DeviceDC(const TCHAR* deviceName) { - dc = ::CreateDC(_T("DISPLAY"), deviceName, NULL, NULL); - if (!dc) - throw rdr::SystemException("failed to create DeviceDC", GetLastError()); -} - -DeviceDC::~DeviceDC() { - if (dc) - DeleteDC(dc); -} - - -WindowDC::WindowDC(HWND wnd) : hwnd(wnd) { - dc = GetDC(wnd); - if (!dc) - throw rdr::SystemException("GetDC failed", GetLastError()); -} - -WindowDC::~WindowDC() { - if (dc) - ReleaseDC(hwnd, dc); -} - - -CompatibleDC::CompatibleDC(HDC existing) { - dc = CreateCompatibleDC(existing); - if (!dc) - throw rdr::SystemException("CreateCompatibleDC failed", GetLastError()); -} - -CompatibleDC::~CompatibleDC() { - if (dc) - DeleteDC(dc); -} - - -BitmapDC::BitmapDC(HDC hdc, HBITMAP hbitmap) : CompatibleDC(hdc){ - oldBitmap = (HBITMAP)SelectObject(dc, hbitmap); - if (!oldBitmap) - throw rdr::SystemException("SelectObject to CompatibleDC failed", - GetLastError()); -} - -BitmapDC::~BitmapDC() { - SelectObject(dc, oldBitmap); -} diff --git a/rfb_win32/DeviceContext.h b/rfb_win32/DeviceContext.h deleted file mode 100644 index 9d91cec2..00000000 --- a/rfb_win32/DeviceContext.h +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// DeviceContext base class, wrapping Windows HDC, plus some -// helper classes tailored to particular types of DC, such as -// window and device DCs. - -#ifndef __RFB_WIN32_DEVICECONTEXT_H__ -#define __RFB_WIN32_DEVICECONTEXT_H__ - -#include <windows.h> -#include <rfb/PixelFormat.h> -#include <rfb/Rect.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - // Base class, providing methods to get the bounding (clip) box, - // and the pixel format, and access to the HDC itself. - class DeviceContext { - public: - DeviceContext() : dc(0) {} - virtual ~DeviceContext() {} - operator HDC() const {return dc;} - PixelFormat getPF() const; - static PixelFormat getPF(HDC dc); - Rect getClipBox() const; - static Rect getClipBox(HDC dc); - protected: - HDC dc; - }; - - // -=- DeviceContext that opens a specific display device - class DeviceDC : public DeviceContext { - public: - DeviceDC(const TCHAR* deviceName); - ~DeviceDC(); - }; - - // Get a DC for a particular window's client area. - class WindowDC : public DeviceContext { - public: - WindowDC(HWND wnd); - virtual ~WindowDC(); - protected: - HWND hwnd; - }; - - // Create a new DC, compatible with an existing one. - class CompatibleDC : public DeviceContext { - public: - CompatibleDC(HDC existing); - virtual ~CompatibleDC(); - }; - - // Create a new DC, compatible with an existing one, and - // select the specified bitmap into it. - class BitmapDC : public CompatibleDC { - public: - BitmapDC(HDC hdc, HBITMAP hbitmap); - ~BitmapDC(); - protected: - HBITMAP oldBitmap; - }; - - }; -}; - -#endif diff --git a/rfb_win32/DeviceFrameBuffer.cxx b/rfb_win32/DeviceFrameBuffer.cxx deleted file mode 100644 index 8da894e0..00000000 --- a/rfb_win32/DeviceFrameBuffer.cxx +++ /dev/null @@ -1,289 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- DeviceFrameBuffer.cxx -// -// The DeviceFrameBuffer class encapsulates the pixel data of the system -// display. - -#include <vector> -#include <rfb_win32/DeviceFrameBuffer.h> -#include <rfb_win32/DeviceContext.h> -#include <rfb_win32/OSVersion.h> -#include <rfb_win32/IconInfo.h> -#include <rfb/VNCServer.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("DeviceFrameBuffer"); - -BoolParameter DeviceFrameBuffer::useCaptureBlt("UseCaptureBlt", - "Use a slower capture method that ensures that alpha blended windows appear correctly", - true); - - -// -=- DeviceFrameBuffer class - -DeviceFrameBuffer::DeviceFrameBuffer(HDC deviceContext, const Rect& wRect) - : DIBSectionBuffer(deviceContext), device(deviceContext), cursorBm(deviceContext), - ignoreGrabErrors(false) -{ - - // -=- Firstly, let's check that the device has suitable capabilities - - int capabilities = GetDeviceCaps(device, RASTERCAPS); - if (!(capabilities & RC_BITBLT)) { - throw Exception("device does not support BitBlt"); - } - if (!(capabilities & RC_DI_BITMAP)) { - throw Exception("device does not support GetDIBits"); - } - /* - if (GetDeviceCaps(device, PLANES) != 1) { - throw Exception("device does not support planar displays"); - } - */ - - // -=- Get the display dimensions and pixel format - - // Get the display dimensions - deviceCoords = DeviceContext::getClipBox(device); - if (!wRect.is_empty()) - deviceCoords = wRect.translate(deviceCoords.tl); - int w = deviceCoords.width(); - int h = deviceCoords.height(); - - // We can't handle uneven widths :( - if (w % 2) w--; - - // Configure the underlying DIB to match the device - DIBSectionBuffer::setPF(DeviceContext::getPF(device)); - DIBSectionBuffer::setSize(w, h); - - // Configure the cursor buffer - cursorBm.setPF(format); - - // Set up a palette if required - if (!format.trueColour) - updateColourMap(); -} - -DeviceFrameBuffer::~DeviceFrameBuffer() { -} - - -void -DeviceFrameBuffer::setPF(const PixelFormat &pf) { - throw Exception("setPF not supported"); -} - -void -DeviceFrameBuffer::setSize(int w, int h) { - throw Exception("setSize not supported"); -} - - -#ifndef CAPTUREBLT -#define CAPTUREBLT 0x40000000 -#endif - -void -DeviceFrameBuffer::grabRect(const Rect &rect) { - BitmapDC tmpDC(device, bitmap); - - // Map the rectangle coords from VNC Desktop-relative to device relative - usually (0,0) - Point src = desktopToDevice(rect.tl); - - // Note: Microsoft's documentation lies directly about CAPTUREBLT and claims it works on 98/ME - // If you try CAPTUREBLT on 98 then you get blank output... - if (!::BitBlt(tmpDC, rect.tl.x, rect.tl.y, rect.width(), rect.height(), device, src.x, src.y, - (osVersion.isPlatformNT && useCaptureBlt) ? (CAPTUREBLT | SRCCOPY) : SRCCOPY)) { - if (ignoreGrabErrors) - vlog.error("BitBlt failed:%ld", GetLastError()); - else - throw rdr::SystemException("BitBlt failed", GetLastError()); - } -} - -void -DeviceFrameBuffer::grabRegion(const Region &rgn) { - std::vector<Rect> rects; - std::vector<Rect>::const_iterator i; - rgn.get_rects(&rects); - for(i=rects.begin(); i!=rects.end(); i++) { - grabRect(*i); - } - ::GdiFlush(); -} - - -void copyDevicePaletteToDIB(HDC dc, DIBSectionBuffer* dib) { - // - Fetch the system palette for the framebuffer - PALETTEENTRY syspalette[256]; - UINT entries = ::GetSystemPaletteEntries(dc, 0, 256, syspalette); - - if (entries == 0) { - vlog.info("resorting to standard 16 color palette"); - for (unsigned int i=0;i<256;i++) { - int v = (i%16) >= 8 ? 127 : 255; - syspalette[i].peRed = i & 1 ? v : 0; - syspalette[i].peGreen = i & 2 ? v : 0; - syspalette[i].peBlue = i & 4 ? v : 0; - } - } else { - vlog.info("framebuffer has %u palette entries", entries); - } - - // - Update the bitmap's stored copy of the palette - for (unsigned int i=0;i<256;i++) { - int r, g, b; - r = (syspalette[i].peRed << 8) + 0x80; - g = (syspalette[i].peGreen << 8) + 0x80; - b = (syspalette[i].peBlue << 8) + 0x80; - dib->setColour(i, r, g, b); - } - - // - Update the DIB section to use the palette - dib->refreshPalette(); -} - - -void DeviceFrameBuffer::setCursor(HCURSOR hCursor, VNCServer* server) -{ - // - If hCursor is null then there is no cursor - clear the old one - - if (hCursor == 0) { - server->setCursor(0, 0, Point(), 0, 0); - return; - } - - try { - - // - Get the size and other details about the cursor. - - IconInfo iconInfo((HICON)hCursor); - - BITMAP maskInfo; - if (!GetObject(iconInfo.hbmMask, sizeof(BITMAP), &maskInfo)) - throw rdr::SystemException("GetObject() failed", GetLastError()); - if (maskInfo.bmPlanes != 1) - throw rdr::Exception("unsupported multi-plane cursor"); - if (maskInfo.bmBitsPixel != 1) - throw rdr::Exception("unsupported cursor mask format"); - - // - Create the cursor pixel buffer and mask storage - // NB: The cursor pixel buffer is NOT used here. Instead, we - // pass the cursorBm.data pointer directly, to save overhead. - - cursor.setSize(maskInfo.bmWidth, maskInfo.bmHeight); - cursor.setPF(format); - cursor.hotspot = Point(iconInfo.xHotspot, iconInfo.yHotspot); - - // - Get the AND and XOR masks. There is only an XOR mask if this is not a - // colour cursor. - - if (!iconInfo.hbmColor) - cursor.setSize(cursor.width(), cursor.height() / 2); - rdr::U8Array mask(maskInfo.bmWidthBytes * maskInfo.bmHeight); - rdr::U8* xorMask = mask.buf + cursor.height() * maskInfo.bmWidthBytes; - - if (!GetBitmapBits(iconInfo.hbmMask, - maskInfo.bmWidthBytes * maskInfo.bmHeight, mask.buf)) - throw rdr::SystemException("GetBitmapBits failed", GetLastError()); - - // Configure the cursor bitmap - cursorBm.setSize(cursor.width(), cursor.height()); - - // Copy the palette into it if required - if (format.bpp <= 8) - copyDevicePaletteToDIB(device, &cursorBm); - - // Draw the cursor into the bitmap - BitmapDC dc(device, cursorBm.bitmap); - if (!DrawIconEx(dc, 0, 0, hCursor, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT)) - throw rdr::SystemException("unable to render cursor", GetLastError()); - - // Replace any XORed pixels with xorColour, because RFB doesn't support - // XORing of cursors. XORing is used for the I-beam cursor, which is most - // often used over a white background, but also sometimes over a black - // background. We set the XOR'd pixels to black, then draw a white outline - // around the whole cursor. - - // *** should we replace any pixels not set in mask to zero, to ensure - // that irrelevant data doesn't screw compression? - - bool doOutline = false; - if (!iconInfo.hbmColor) { - Pixel xorColour = format.pixelFromRGB(0, 0, 0, cursorBm.getColourMap()); - for (int y = 0; y < cursor.height(); y++) { - bool first = true; - for (int x = 0; x < cursor.width(); x++) { - int byte = y * maskInfo.bmWidthBytes + x / 8; - int bit = 7 - x % 8; - if ((mask.buf[byte] & (1 << bit)) && (xorMask[byte] & (1 << bit))) - { - mask.buf[byte] &= ~(1 << bit); - - switch (format.bpp) { - case 8: - ((rdr::U8*)cursorBm.data)[y * cursor.width() + x] = xorColour; break; - case 16: - ((rdr::U16*)cursorBm.data)[y * cursor.width() + x] = xorColour; break; - case 32: - ((rdr::U32*)cursorBm.data)[y * cursor.width() + x] = xorColour; break; - } - - doOutline = true; - } - } - } - } - - // Finally invert the AND mask so it's suitable for RFB and pack it into - // the minimum number of bytes per row. - - int maskBytesPerRow = (cursor.width() + 7) / 8; - - for (int j = 0; j < cursor.height(); j++) { - for (int i = 0; i < maskBytesPerRow; i++) - cursor.mask.buf[j * maskBytesPerRow + i] - = ~mask.buf[j * maskInfo.bmWidthBytes + i]; - } - - if (doOutline) { - vlog.debug("drawing cursor outline!"); - memcpy(cursor.data, cursorBm.data, cursor.dataLen()); - cursor.drawOutline(format.pixelFromRGB(0xffff, 0xffff, 0xffff, cursorBm.getColourMap())); - memcpy(cursorBm.data, cursor.data, cursor.dataLen()); - } - - server->setCursor(cursor.width(), cursor.height(), cursor.hotspot, - cursorBm.data, cursor.mask.buf); - } catch (rdr::Exception& e) { - vlog.error(e.str()); - } -} - - -void -DeviceFrameBuffer::updateColourMap() { - if (!format.trueColour) - copyDevicePaletteToDIB(device, this); -} diff --git a/rfb_win32/DeviceFrameBuffer.h b/rfb_win32/DeviceFrameBuffer.h deleted file mode 100644 index 7718c339..00000000 --- a/rfb_win32/DeviceFrameBuffer.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- DeviceFrameBuffer.h -// -// The DeviceFrameBuffer class encapsulates the pixel data of a supplied -// Device Context Handle (HDC) - -// *** THIS INTERFACE NEEDS TIDYING TO SEPARATE COORDINATE SYSTEMS BETTER *** - -#ifndef __RFB_WIN32_DEVICE_FRAME_BUFFER_H__ -#define __RFB_WIN32_DEVICE_FRAME_BUFFER_H__ - -#include <windows.h> -#include <rfb_win32/DIBSectionBuffer.h> -#include <rfb/Cursor.h> -#include <rfb/Region.h> -#include <rfb/Exception.h> -#include <rfb/Configuration.h> - -namespace rfb { - - class VNCServer; - - namespace win32 { - - // -=- DeviceFrameBuffer interface - - // DeviceFrameBuffer is passed an HDC referring to a window or to - // the entire display. It may also be passed a rectangle specifying - // the Device-relative coordinates of the actual rectangle to treat - // as the desktop. - - // Coordinate systems start getting really annoying here. There are - // three different "origins" to which coordinates might be relative: - // - // Desktop - VNC coordinates, top-left always (0,0) - // Device - DC coordinates. Top-left *usually (0,0) but could be other. - // Window - coordinates relative to the specified sub-rectangle within - // the supplied DC. - // Screen - Coordinates relative to the entire Windows virtual screen. - // The virtual screen includes all monitors that are part of - // the Windows desktop. - - // The data member is made to point to an internal mirror of the - // current display data. Individual rectangles or regions of the - // buffer can be brought up to date by calling the grab functions. - - class DeviceFrameBuffer : public DIBSectionBuffer { - public: - DeviceFrameBuffer(HDC deviceContext, const Rect& area_=Rect()); - virtual ~DeviceFrameBuffer(); - - // - FrameBuffer overrides - - virtual void grabRect(const Rect &rect); - virtual void grabRegion(const Region ®ion); - - // - DIBSectionBuffer overrides - - virtual void setPF(const PixelFormat& pf); - virtual void setSize(int w, int h); - - // - DeviceFrameBuffer specific methods - - void setCursor(HCURSOR c, VNCServer* server); - void updateColourMap(); - - // Set whether grabRect should ignore errors or throw exceptions - // Only set this if you are sure you'll capture the errors some other way! - void setIgnoreGrabErrors(bool ie) {ignoreGrabErrors=ie;} - - static BoolParameter useCaptureBlt; - - protected: - // Translate supplied Desktop coordinates into Device-relative coordinates - // This translation may have been affected at start-time by the supplied sub-rect. - Point desktopToDevice(const Point p) const {return p.translate(deviceCoords.tl);} - - HDC device; - DIBSectionBuffer cursorBm; - Cursor cursor; - Rect deviceCoords; - bool ignoreGrabErrors; - }; - - }; - -}; - -#endif // __RFB_WIN32_DEVICE_FRAME_BUFFER_H__ diff --git a/rfb_win32/Dialog.cxx b/rfb_win32/Dialog.cxx deleted file mode 100644 index 398334f0..00000000 --- a/rfb_win32/Dialog.cxx +++ /dev/null @@ -1,391 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Dialog.cxx - -// Base-class for any Dialog classes we might require - -#include <rfb_win32/Dialog.h> -#include <rfb_win32/TCharArray.h> -#include <rfb/LogWriter.h> -#include <rdr/Exception.h> -#include <rfb_win32/Win32Util.h> - -#ifdef _DIALOG_CAPTURE -#ifdef PropSheet_IndexToId -#include <rfb_win32/DeviceFrameBuffer.h> -#include <extra/LoadBMP.cxx> -#else -#undef _DIALOG_CAPTURE -#pragma message(" NOTE: Not building Dialog Capture support.") -#endif -#endif - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter dlog("Dialog"); -static LogWriter plog("PropSheet"); - - -Dialog::Dialog(HINSTANCE inst_) -: inst(inst_), alreadyShowing(false), handle(0) -{ -} - -Dialog::~Dialog() -{ -} - - -bool Dialog::showDialog(const TCHAR* resource, HWND owner) -{ - if (alreadyShowing) return false; - handle = 0; - alreadyShowing = true; - INT_PTR result = DialogBoxParam(inst, resource, owner, - staticDialogProc, (LPARAM)this); - if (result<0) - throw rdr::SystemException("DialogBoxParam failed", GetLastError()); - alreadyShowing = false; - return (result == 1); -} - - -bool Dialog::isItemChecked(int id) { - return SendMessage(GetDlgItem(handle, id), BM_GETCHECK, 0, 0) == BST_CHECKED; -} -int Dialog::getItemInt(int id) { - BOOL trans; - int result = GetDlgItemInt(handle, id, &trans, TRUE); - if (!trans) - throw rdr::Exception("unable to read dialog Int"); - return result; -} -TCHAR* Dialog::getItemString(int id) { - TCharArray tmp(256); - if (!GetDlgItemText(handle, id, tmp.buf, 256)) - tmp.buf[0] = 0; - return tmp.takeBuf(); -} - -void Dialog::setItemChecked(int id, bool state) { - dlog.debug("bool[%d]=%d", id, (int)state); - SendMessage(GetDlgItem(handle, id), BM_SETCHECK, state ? BST_CHECKED : BST_UNCHECKED, 0); -} -void Dialog::setItemInt(int id, int value) { - dlog.debug("int[%d]=%d", id, value); - SetDlgItemInt(handle, id, value, TRUE); -} -void Dialog::setItemString(int id, const TCHAR* s) { - dlog.debug("string[%d]=%s", id, (const char*)CStr(s)); - SetDlgItemText(handle, id, s); -} - - -void Dialog::enableItem(int id, bool state) { - dlog.debug("enable[%d]=%d", id, (int)state); - EnableWindow(GetDlgItem(handle, id), state); -} - - - - -BOOL CALLBACK Dialog::staticDialogProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - if (msg == WM_INITDIALOG) - SetWindowLong(hwnd, GWL_USERDATA, (LONG)lParam); - - LONG self = GetWindowLong(hwnd, GWL_USERDATA); - if (!self) return FALSE; - - return ((Dialog*)self)->dialogProc(hwnd, msg, wParam, lParam); -} - -BOOL Dialog::dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - - case WM_INITDIALOG: - handle = hwnd; - initDialog(); - return TRUE; - - case WM_COMMAND: - switch (LOWORD(wParam)) { - case IDOK: - if (onOk()) { - EndDialog(hwnd, 1); - return TRUE; - } - return FALSE; - case IDCANCEL: - EndDialog(hwnd, 0); - return TRUE; - default: - return onCommand(LOWORD(wParam), HIWORD(wParam)); - }; - - case WM_HELP: - return onHelp(((HELPINFO*)lParam)->iCtrlId); - - } - - return FALSE; -} - - -PropSheetPage::PropSheetPage(HINSTANCE inst, const TCHAR* id) : Dialog(inst), propSheet(0) { - page.dwSize = sizeof(page); - page.dwFlags = 0; // PSP_USECALLBACK; - page.hInstance = inst; - page.pszTemplate = id; - page.pfnDlgProc = staticPageProc; - page.lParam = (LPARAM)this; - page.pfnCallback = 0; // staticPageProc; -} - -PropSheetPage::~PropSheetPage() { -} - - -BOOL CALLBACK PropSheetPage::staticPageProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - if (msg == WM_INITDIALOG) - SetWindowLong(hwnd, GWL_USERDATA, ((PROPSHEETPAGE*)lParam)->lParam); - - LONG self = GetWindowLong(hwnd, GWL_USERDATA); - if (!self) return FALSE; - - return ((PropSheetPage*)self)->dialogProc(hwnd, msg, wParam, lParam); -} - -BOOL PropSheetPage::dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - switch (msg) { - - case WM_INITDIALOG: - handle = hwnd; - initDialog(); - return TRUE; - - case WM_NOTIFY: - switch (((NMHDR*)lParam)->code) { - case PSN_APPLY: - onOk(); - return FALSE; - }; - return FALSE; - - case WM_COMMAND: - return onCommand(LOWORD(wParam), HIWORD(wParam)); - - case WM_HELP: - return onHelp(((HELPINFO*)lParam)->iCtrlId); - - } - - return FALSE; -} - - -PropSheet::PropSheet(HINSTANCE inst_, const TCHAR* title_, std::list<PropSheetPage*> pages_, HICON icon_) -: title(tstrDup(title_)), inst(inst_), pages(pages_), alreadyShowing(0), handle(0), icon(icon_) { -} - -PropSheet::~PropSheet() { -} - - -// For some reason, DLGTEMPLATEEX isn't defined in the Windows headers - go figure... -struct DLGTEMPLATEEX { - WORD dlgVer; - WORD signature; - DWORD helpID; - DWORD exStyle; - DWORD style; - WORD cDlgItems; - short x; - short y; - short cx; - short cy; -}; - -static int CALLBACK removeCtxtHelp(HWND hwnd, UINT message, LPARAM lParam) { - if (message == PSCB_PRECREATE) { - // Remove the context-help style, to remove the titlebar ? button - // *** Nasty hack to cope with new & old dialog template formats... - if (((DLGTEMPLATEEX*)lParam)->signature == 0xffff) - ((DLGTEMPLATEEX*)lParam)->style &= ~DS_CONTEXTHELP; - else - ((LPDLGTEMPLATE)lParam)->style &= ~DS_CONTEXTHELP; - } - return TRUE; -} - - -bool PropSheet::showPropSheet(HWND owner, bool showApply, bool showCtxtHelp, bool capture) { - if (alreadyShowing) return false; - alreadyShowing = true; - int count = pages.size(); - - HPROPSHEETPAGE* hpages = new HPROPSHEETPAGE[count]; - try { - // Create the PropertSheet page GDI objects. - std::list<PropSheetPage*>::iterator pspi; - int i = 0; - for (pspi=pages.begin(); pspi!=pages.end(); pspi++) { - hpages[i] = CreatePropertySheetPage(&((*pspi)->page)); - (*pspi)->setPropSheet(this); - i++; - } - - // Initialise and create the PropertySheet itself - PROPSHEETHEADER header; - header.dwSize = PROPSHEETHEADER_V1_SIZE; - header.dwFlags = PSH_MODELESS | (showApply ? 0 : PSH_NOAPPLYNOW) | (showCtxtHelp ? 0 : PSH_USECALLBACK); - header.pfnCallback = removeCtxtHelp; - header.hwndParent = owner; - header.hInstance = inst; - header.pszCaption = title.buf; - header.nPages = count; - header.nStartPage = 0; - header.phpage = hpages; - if (icon) { - header.hIcon = icon; - header.dwFlags |= PSH_USEHICON; - } - - handle = (HWND)PropertySheet(&header); - if ((handle == 0) || (handle == (HWND)-1)) - throw rdr::SystemException("PropertySheet failed", GetLastError()); - centerWindow(handle, owner); - plog.info("created %lx", handle); - -#ifdef _DIALOG_CAPTURE - if (capture) { - plog.info("capturing \"%s\"", (const char*)CStr(title.buf)); - char* tmpdir = getenv("TEMP"); - HDC dc = GetWindowDC(handle); - DeviceFrameBuffer fb(dc); - int i=0; - while (true) { - int id = PropSheet_IndexToId(handle, i); - if (!id) break; - PropSheet_SetCurSelByID(handle, id); - MSG msg; - while (PeekMessage(&msg, handle, 0, 0, PM_REMOVE)) { - if (!PropSheet_IsDialogMessage(handle, &msg)) - DispatchMessage(&msg); - } - fb.grabRect(fb.getRect()); - TCHAR title[128]; - if (!GetWindowText(PropSheet_GetCurrentPageHwnd(handle), title, sizeof(title))) - _stprintf(title, _T("capture%d"), i); - CharArray pageTitle(strDup(title)); - for (int j=0; j<strlen(pageTitle.buf); j++) { - if (pageTitle.buf[j] == '/' || pageTitle.buf[j] == '\\' || pageTitle.buf[j] == ':') - pageTitle.buf[j] = '-'; - } - char filename[256]; - sprintf(filename, "%s\\%s.bmp", tmpdir, pageTitle.buf); - vlog.debug("writing to %s", filename); - saveBMP(filename, &fb); - i++; - } - ReleaseDC(handle, dc); - } else { -#endif - try { - if (owner) - EnableWindow(owner, FALSE); - // Run the PropertySheet - MSG msg; - while (GetMessage(&msg, 0, 0, 0)) { - if (!PropSheet_IsDialogMessage(handle, &msg)) - DispatchMessage(&msg); - if (!PropSheet_GetCurrentPageHwnd(handle)) - break; - } - if (owner) - EnableWindow(owner, TRUE); - } catch (...) { - if (owner) - EnableWindow(owner, TRUE); - throw; - } -#ifdef _DIALOG_CAPTURE - } -#endif - - plog.info("finished %lx", handle); - - DestroyWindow(handle); - handle = 0; - alreadyShowing = false; - - // Clear up the pages' GDI objects - for (pspi=pages.begin(); pspi!=pages.end(); pspi++) - (*pspi)->setPropSheet(0); - delete [] hpages; hpages = 0; - - return true; - } catch (rdr::Exception) { - alreadyShowing = false; - - std::list<PropSheetPage*>::iterator pspi; - for (pspi=pages.begin(); pspi!=pages.end(); pspi++) - (*pspi)->setPropSheet(0); - delete [] hpages; hpages = 0; - - throw; - } -} - -void PropSheet::reInitPages() { - plog.debug("reInitPages %lx", handle); - std::list<PropSheetPage*>::iterator pspi; - for (pspi=pages.begin(); pspi!=pages.end(); pspi++) { - if ((*pspi)->handle) - (*pspi)->initDialog(); - } -} - -bool PropSheet::commitPages() { - plog.debug("commitPages %lx", handle); - bool result = true; - std::list<PropSheetPage*>::iterator pspi; - for (pspi=pages.begin(); pspi!=pages.end(); pspi++) { - if ((*pspi)->handle) - result = result && (*pspi)->onOk(); - } - return result; -} - - -void PropSheetPage::setChanged(bool changed) { - if (propSheet) { - plog.debug("setChanged[%lx(%lx)]=%d", handle, propSheet->handle, (int)changed); - if (changed) - PropSheet_Changed(propSheet->handle, handle); - else - PropSheet_UnChanged(propSheet->handle, handle); - } -} diff --git a/rfb_win32/Dialog.h b/rfb_win32/Dialog.h deleted file mode 100644 index 9784ba46..00000000 --- a/rfb_win32/Dialog.h +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- RegConfig.h - -// Class which monitors the registry and reads in the registry settings -// whenever they change, or are added or removed. - -#ifndef __RFB_WIN32_DIALOG_H__ -#define __RFB_WIN32_DIALOG_H__ - -#include <windows.h> -#include <prsht.h> -#include <list> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - // Dialog - A simple Win32 Dialog box. A derived class of Dialog overrides the - // initDialog(), command() and ok() methods to take appropriate action. A - // simple dialog box can be displayed by creating a Dialog object and calling - // show(). - - class Dialog { - public: - - Dialog(HINSTANCE inst); - virtual ~Dialog(); - - // showDialog() displays the dialog box. It returns when it has been dismissed, - // returning true if "OK" was pressed, false otherwise. The resource - // argument identifies the dialog resource (often a MAKEINTRESOURCE macro - // expansion), and owner is an optional window handle - the corresponding - // window is disabled while the dialog box is displayed. - - bool showDialog(const TCHAR* resource, HWND owner=0); - - // initDialog() is called upon receipt of the WM_INITDIALOG message. - - virtual void initDialog() {} - - // onCommand() is called upon receipt of a WM_COMMAND message item other than IDOK - // or IDCANCEL. It should return true if the command has been handled. - - virtual bool onCommand(int item, int cmd) { return false; } - - // onHelp() is called upon receipt of a WM_MENU message. This indicates that - // context-specific help should be displayed, for a dialog control, for example. - // It should return true if the command has been handled. - - virtual bool onHelp(int item) { return false; } - - // onOk() is called when the OK button is pressed. The hwnd argument is the - // dialog box's window handle. - - virtual bool onOk() { return true; } - - // Read the states of items - bool isItemChecked(int id); - int getItemInt(int id); - TCHAR* getItemString(int id); // Recipient owns string storage - - // Set the states of items - void setItemChecked(int id, bool state); - void setItemInt(int id, int value); - void setItemString(int id, const TCHAR* s); - - // enableItem is used to grey out an item, making it inaccessible, or to - // re-enable it. - void enableItem(int id, bool state); - - protected: - static BOOL CALLBACK staticDialogProc(HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam); - virtual BOOL dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - HINSTANCE inst; - HWND handle; - bool alreadyShowing; - }; - - // PropertySheetPage - // Class used to define property pages within a PropertySheet. - // Each page is associated with a particular dialog resource, indicated by - // the "id" parameter supplied to the constructor. - - class PropSheetPage; - - class PropSheet { - public: - PropSheet(HINSTANCE inst, const TCHAR* title, std::list<PropSheetPage*> pages, HICON icon=0); - virtual ~PropSheet(); - - // Display the PropertySheet - bool showPropSheet(HWND owner, bool showApply = false, bool showCtxtHelp = false, bool capture=false); - - // Calls initDialog again for each page that has already had it called. - // Note: If a page hasn't been seen yet, it won't have been called. - // Note: This must only be called while the property sheet is visible. - void reInitPages(); - - // Calls onOk for each page that has had initDialog called, and returns - // false if any one of them returns false, or true otherwise. ALL the - // onOk() methods will be called, even if one of them fails. - // Note: If a page hasn't been seen yet, it won't have been called. - // Note: This must only be called while the property sheet is visible. - bool commitPages(); - - friend class PropSheetPage; - - protected: - HWND owner; - HICON icon; - std::list<PropSheetPage*> pages; - HINSTANCE inst; - TCharArray title; - HWND handle; - bool alreadyShowing; - }; - - class PropSheetPage : public Dialog { - public: - PropSheetPage(HINSTANCE inst, const TCHAR* id); - virtual ~PropSheetPage(); - - void setChanged(bool changed); - - friend class PropSheet; - - protected: - void setPropSheet(PropSheet* ps) {propSheet = ps;}; - static BOOL CALLBACK staticPageProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - virtual BOOL dialogProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - PROPSHEETPAGE page; - PropSheet* propSheet; - }; - - }; - -}; - -#endif // __RFB_WIN32_DIALOG_H__ diff --git a/rfb_win32/DynamicFn.cxx b/rfb_win32/DynamicFn.cxx deleted file mode 100644 index e933f249..00000000 --- a/rfb_win32/DynamicFn.cxx +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/TCharArray.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("DynamicFn"); - - -DynamicFnBase::DynamicFnBase(const TCHAR* dllName, const char* fnName) : dllHandle(0), fnPtr(0) { - dllHandle = LoadLibrary(dllName); - if (!dllHandle) { - vlog.info("DLL %s not found (%d)", (const char*)CStr(dllName), GetLastError()); - return; - } - fnPtr = GetProcAddress(dllHandle, fnName); - if (!fnPtr) - vlog.info("proc %s not found in %s (%d)", fnName, (const char*)CStr(dllName), GetLastError()); -} - -DynamicFnBase::~DynamicFnBase() { - if (dllHandle) - FreeLibrary(dllHandle); -} - - diff --git a/rfb_win32/DynamicFn.h b/rfb_win32/DynamicFn.h deleted file mode 100644 index 57fdbec5..00000000 --- a/rfb_win32/DynamicFn.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Helper class managing dynamic linkage to DLL functions. - -#ifndef __RFB_WIN32_DYNAMICFN_H__ -#define __RFB_WIN32_DYNAMICFN_H__ - -#include <windows.h> - -namespace rfb { - namespace win32 { - - class DynamicFnBase { - public: - DynamicFnBase(const TCHAR* dllName, const char* fnName); - ~DynamicFnBase(); - bool isValid() const {return fnPtr != 0;} - protected: - void* fnPtr; - HMODULE dllHandle; - private: - DynamicFnBase(const DynamicFnBase&); - DynamicFnBase operator=(const DynamicFnBase&); - }; - - template<class T> class DynamicFn : public DynamicFnBase { - public: - DynamicFn(const TCHAR* dllName, const char* fnName) : DynamicFnBase(dllName, fnName) {} - T operator *() const {return (T)fnPtr;}; - }; - - }; -}; - -#endif diff --git a/rfb_win32/EventManager.cxx b/rfb_win32/EventManager.cxx deleted file mode 100644 index 0f9993b7..00000000 --- a/rfb_win32/EventManager.cxx +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/EventManager.h> -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("EventManager"); - - -EventManager::EventManager() : eventCount(0) { -} - -EventManager::~EventManager() { -} - - -bool EventManager::addEvent(HANDLE event, EventHandler* ecb) { - if (eventCount >= MAXIMUM_WAIT_OBJECTS-1) - return false; - events[eventCount] = event; - handlers[eventCount] = ecb; - eventCount++; - return true; -} - -void EventManager::removeEvent(HANDLE event) { - for (int i=0; i<eventCount; i++) { - if (events[i] == event) { - for (int j=i; j<eventCount-1; j++) { - events[j] = events[j+1]; - handlers[j] = handlers[j+1]; - } - eventCount--; - return; - } - } - throw rdr::Exception("Event not registered"); -} - - -int EventManager::checkTimeouts() { - return 0; -} - -BOOL EventManager::getMessage(MSG* msg, HWND hwnd, UINT minMsg, UINT maxMsg) { - while (true) { - // - Process any pending timeouts - DWORD timeout = checkTimeouts(); - if (timeout == 0) - timeout = INFINITE; - - // - Events take precedence over messages - DWORD result; - if (eventCount) { - // - Check whether any events are set - result = WaitForMultipleObjects(eventCount, events, FALSE, 0); - if (result == WAIT_TIMEOUT) { - // - No events are set, so check for messages - if (PeekMessage(msg, hwnd, minMsg, maxMsg, PM_REMOVE)) - return msg->message != WM_QUIT; - - // - Block waiting for an event to be set, or a message - result = MsgWaitForMultipleObjects(eventCount, events, FALSE, timeout, - QS_ALLINPUT); - if (result == WAIT_OBJECT_0 + eventCount) { - // - Return the message, if any - if (PeekMessage(msg, hwnd, minMsg, maxMsg, PM_REMOVE)) - return msg->message != WM_QUIT; - continue; - } - } - } else - return GetMessage(msg, hwnd, minMsg, maxMsg); - - if ((result >= WAIT_OBJECT_0) && (result < (WAIT_OBJECT_0 + eventCount))) { - // - An event was set - call the handler - int index = result - WAIT_OBJECT_0; - handlers[index]->processEvent(events[index]); - } else if (result == WAIT_FAILED) { - // - An error has occurred, so return the error status code - return -1; - } - } -} diff --git a/rfb_win32/EventManager.h b/rfb_win32/EventManager.h deleted file mode 100644 index bb66e340..00000000 --- a/rfb_win32/EventManager.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- EventManager.h - -// Win32 event manager. Caller supplies event & handler pairs and -// then uses getMessage() in place of ::GetMessage() in the main -// loop. EventManager calls the event handler whenever the event -// is set. -// Ownership of events remains with the caller. -// It is the responsibility of handlers to reset events. - -#ifndef __RFB_WIN32_EVENT_MGR_H__ -#define __RFB_WIN32_EVENT_MGR_H__ - -#include <rfb_win32/Win32Util.h> - -namespace rfb { - namespace win32 { - - class EventHandler { - public: - virtual ~EventHandler() {} - virtual void processEvent(HANDLE event) = 0; - }; - - class EventManager { - public: - EventManager(); - virtual ~EventManager(); - - // Add a Win32 event & handler for it - // NB: The handler must call ResetEvent on the event. - // NB: The caller retains ownership of the event. - virtual bool addEvent(HANDLE event, EventHandler* ecb); - - // Remove a Win32 event - virtual void removeEvent(HANDLE event); - - // getMessage - // Waits for a message to become available on the thread's message queue, - // and returns it. If any registered events become set while waiting then - // their handlers are called before returning. - // Returns zero if the message is WM_QUIT, -1 in case of error, >0 otherwise. - virtual BOOL getMessage(MSG* msg, HWND hwnd, UINT minMsg, UINT maxMsg); - - protected: - // checkTimeouts - // Derived classes should override this to perform any extra processing, - // returning the maximum number of milliseconds after which the callback - // should be called again. - virtual int checkTimeouts(); - - HANDLE events[MAXIMUM_WAIT_OBJECTS]; - EventHandler* handlers[MAXIMUM_WAIT_OBJECTS-1]; - int eventCount; - }; - - }; -}; - -#endif diff --git a/rfb_win32/FolderManager.cxx b/rfb_win32/FolderManager.cxx deleted file mode 100644 index a2fa08d3..00000000 --- a/rfb_win32/FolderManager.cxx +++ /dev/null @@ -1,279 +0,0 @@ -/* Copyright (C) 2005 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- FolderManager.cxx - -#include <rfb_win32/FolderManager.h> - -using namespace rfb; -using namespace rfb::win32; - -FolderManager::FolderManager() -{ - -} - -FolderManager::~FolderManager() -{ - -} - -bool -FolderManager::createDir(char *pFullPath) -{ - if (CreateDirectory(pFullPath, NULL) == 0) return false; - - return true; -} - -bool -FolderManager::renameIt(char *pPath, char *pOldName, char *pNewName) -{ - char fullOldName[FT_FILENAME_SIZE]; - char fullNewName[FT_FILENAME_SIZE]; - - sprintf(fullOldName, "%s\\%s", pPath, pOldName); - sprintf(fullNewName, "%s\\%s", pPath, pNewName); - - return renameIt(fullOldName, fullNewName); -} - -bool -FolderManager::renameIt(char *pOldName, char *pNewName) -{ - if (MoveFile(pOldName, pNewName)) return true; - - return false; -} - -bool -FolderManager::deleteIt(char *pFullPath) -{ - FileInfo fileInfo; - - FILEINFO FIStruct; - if (!getInfo(pFullPath, &FIStruct)) return false; - - fileInfo.add(&FIStruct); - - return deleteIt(&fileInfo); -} - -bool -FolderManager::deleteIt(char *pPrefix, FileInfo *pFI) -{ - char buf[FT_FILENAME_SIZE]; - for (unsigned int i = 0; i < pFI->getNumEntries(); i++) { - sprintf(buf, "%s\\%s", pPrefix, pFI->getNameAt(i)); - pFI->setNameAt(i,buf); - } - return deleteIt(pFI); -} - -bool -FolderManager::deleteIt(FileInfo *pFI) -{ - unsigned int num = pFI->getNumEntries(); - unsigned int last = num - 1; - - while (num > 0) { - if (pFI->getFlagsAt(last) & FT_ATTR_DIR) { - if (RemoveDirectory(pFI->getNameAt(last)) == 0) { - if (GetLastError() == ERROR_DIR_NOT_EMPTY) { - if (!getFolderInfoWithPrefix(pFI->getNameAt(last), pFI)) { - pFI->free(); - return false; - } - } - } else { - pFI->deleteAt(last); - } - } else { - if (DeleteFile(pFI->getNameAt(last)) == 0) { - pFI->free(); - return false; - } else { - pFI->deleteAt(last); - } - } - num = pFI->getNumEntries(); - last = num - 1; - } - - return true; -} - -bool -FolderManager::getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo) -{ - char prefix[FT_FILENAME_SIZE]; - strcpy(prefix, pPrefix); - - FileInfo tmpFileInfo; - if (!getDirInfo(prefix, &tmpFileInfo, 0)) { - tmpFileInfo.free(); - return false; - } else { - char buf[FT_FILENAME_SIZE]; - for (unsigned int i = 0; i < tmpFileInfo.getNumEntries(); i++) { - sprintf(buf, "%s\\%s", prefix, tmpFileInfo.getNameAt(i)); - pFileInfo->add(buf, tmpFileInfo.getSizeAt(i), tmpFileInfo.getDataAt(i), tmpFileInfo.getFlagsAt(i)); - } - } - tmpFileInfo.free(); - return true; -} - -bool -FolderManager::getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly) -{ - if (strlen(pPath) == 0) return getDrivesInfo(pFileInfo); - - char path[FT_FILENAME_SIZE]; - sprintf(path, "%s\\*", pPath); - - WIN32_FIND_DATA FindFileData; - SetErrorMode(SEM_FAILCRITICALERRORS); - HANDLE handle = FindFirstFile(path, &FindFileData); - DWORD lastError = GetLastError(); - SetErrorMode(0); - - if (handle != INVALID_HANDLE_VALUE) { - do { - if (strcmp(FindFileData.cFileName, ".") != 0 && - strcmp(FindFileData.cFileName, "..") != 0) { - unsigned int lastWriteTime = getTime70(FindFileData.ftLastWriteTime); - if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - pFileInfo->add(FindFileData.cFileName, 0, lastWriteTime, FT_ATTR_DIR); - } else { - if (!dirOnly) - pFileInfo->add(FindFileData.cFileName, FindFileData.nFileSizeLow, lastWriteTime, FT_ATTR_FILE); - } - } - - } while (FindNextFile(handle, &FindFileData)); - } else { - return false; - } - FindClose(handle); - return true; -} - -bool -FolderManager::getDrivesInfo(FileInfo *pFileInfo) -{ - TCHAR szDrivesList[256]; - if (GetLogicalDriveStrings(255, szDrivesList) == 0) - return false; - - int i = 0; - while (szDrivesList[i] != '\0') { - char *drive = strdup(&szDrivesList[i]); - char *backslash = strrchr(drive, '\\'); - if (backslash != NULL) - *backslash = '\0'; - pFileInfo->add(drive, 0, 0, FT_ATTR_DIR); - free(drive); - i += strcspn(&szDrivesList[i], "\0") + 1; - } - return true; -} - -bool -FolderManager::getInfo(char *pFullPath, FILEINFO *pFIStruct) -{ - WIN32_FIND_DATA FindFileData; - SetErrorMode(SEM_FAILCRITICALERRORS); - HANDLE hFile = FindFirstFile(pFullPath, &FindFileData); - DWORD lastError = GetLastError(); - SetErrorMode(0); - if (hFile != INVALID_HANDLE_VALUE) { - FindClose(hFile); - strcpy(pFIStruct->name, pFullPath); - pFIStruct->info.data = getTime70(FindFileData.ftLastWriteTime); - if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - pFIStruct->info.size = 0; - pFIStruct->info.flags = FT_ATTR_DIR; - return true; - } else { - pFIStruct->info.size = FindFileData.nFileSizeLow; - pFIStruct->info.flags = FT_ATTR_FILE; - return true; - } - } - return false; -} - -unsigned int -FolderManager::getTime70(FILETIME ftime) -{ - LARGE_INTEGER uli; - uli.LowPart = ftime.dwLowDateTime; - uli.HighPart = ftime.dwHighDateTime; - uli.QuadPart = (uli.QuadPart - 116444736000000000) / 10000000; - return uli.LowPart; -} - -void -FolderManager::getFiletime(unsigned int time70, FILETIME *pftime) -{ - LONGLONG ll = Int32x32To64(time70, 10000000) + 116444736000000000; - pftime->dwLowDateTime = (DWORD) ll; - pftime->dwHighDateTime = (DWORD) (ll >> 32); -} - -bool -FolderManager::getDirSize(char *pFullPath, DWORD64 *dirSize) -{ - char fullPath[FT_FILENAME_SIZE]; - FileInfo fi; - fi.add(pFullPath, 0, 0, FT_ATTR_DIR); - DWORD64 dirFileSize64 = 0; - do { - sprintf(fullPath, "%s\\*", fi.getNameAt(0)); - WIN32_FIND_DATA FindFileData; - SetErrorMode(SEM_FAILCRITICALERRORS); - HANDLE hFile = FindFirstFile(fullPath, &FindFileData); - SetErrorMode(0); - - if (hFile != INVALID_HANDLE_VALUE) { - do { - if (strcmp(FindFileData.cFileName, ".") != 0 && - strcmp(FindFileData.cFileName, "..") != 0) { - char buff[MAX_PATH]; - if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - sprintf(buff, "%s\\%s", fi.getNameAt(0), FindFileData.cFileName); - fi.add(buff, 0, 0, FT_ATTR_DIR); - } else { - dirFileSize64 += FindFileData.nFileSizeLow; - } - } - } while (FindNextFile(hFile, &FindFileData)); - FindClose(hFile); - } - fi.deleteAt(0); - } while (fi.getNumEntries() > 0); - - *dirSize = dirFileSize64; - return true; -}
\ No newline at end of file diff --git a/rfb_win32/FolderManager.h b/rfb_win32/FolderManager.h deleted file mode 100644 index 24923dd6..00000000 --- a/rfb_win32/FolderManager.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 2005 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- FolderManager.h - -#ifndef __RFB_WIN32_FOLDERMANAGER_H__ -#define __RFB_WIN32_FOLDERMANAGER_H__ - -#include <windows.h> - -#include <rfb/FileInfo.h> -#include <rfb/DirManager.h> - -namespace rfb { - namespace win32{ - class FolderManager : public DirManager { - public: - FolderManager(); - ~FolderManager(); - - bool createDir(char *pFullPath); - - bool renameIt(char *pOldName, char *pNewName); - bool renameIt(char *pPath, char *pOldName, char *pNewName); - - bool deleteIt(char *pPrefix, FileInfo *pFI); - bool deleteIt(char *pFullPath); - bool deleteIt(FileInfo *pFI); - - bool getInfo(char *pFullPath, FILEINFO *pFIStruct); - - bool getDirInfo(char *pPath, FileInfo *pFileInfo, unsigned int dirOnly); - bool getDrivesInfo(FileInfo *pFI); - - unsigned int getTime70(FILETIME ftime); - void getFiletime(unsigned int time70, FILETIME *pftime); - - bool getDirSize(char *pFullPath, DWORD64 *dirSize); - - private: - bool getFolderInfoWithPrefix(char *pPrefix, FileInfo *pFileInfo); - }; - } -} - -#endif // __RFB_WIN32_FOLDERMANAGER_H__
\ No newline at end of file diff --git a/rfb_win32/Handle.h b/rfb_win32/Handle.h deleted file mode 100644 index d3baa580..00000000 --- a/rfb_win32/Handle.h +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Wrapper for Win32 HANDLEs that can/must be CloseHandle()d. - -#ifndef __RFB_WIN32_HANDLE_H__ -#define __RFB_WIN32_HANDLE_H__ - -#include <windows.h> - -namespace rfb { - namespace win32 { - - - class Handle { - public: - Handle(HANDLE h_=0) : h(h_) {} - ~Handle() { - if (h) CloseHandle(h); - } - operator HANDLE() {return h;} - HANDLE h; - }; - - }; -}; - -#endif diff --git a/rfb_win32/IconInfo.h b/rfb_win32/IconInfo.h deleted file mode 100644 index cb33a42d..00000000 --- a/rfb_win32/IconInfo.h +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_ICONINFO_H__ -#define __RFB_WIN32_ICONINFO_H__ - -#include <windows.h> -#include <rdr/Exception.h> - -namespace rfb { - namespace win32 { - - struct IconInfo : public ICONINFO { - IconInfo(HICON icon) { - if (!GetIconInfo(icon, this)) - throw rdr::SystemException("GetIconInfo() failed", GetLastError()); - } - ~IconInfo() { - if (hbmColor) - DeleteObject(hbmColor); - if (hbmMask) - DeleteObject(hbmMask); - } - }; - - }; -}; - -#endif diff --git a/rfb_win32/IntervalTimer.h b/rfb_win32/IntervalTimer.h deleted file mode 100644 index ddfae493..00000000 --- a/rfb_win32/IntervalTimer.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- IntervalTimer.h -// -// Simple wrapper for standard Win32 timers - -#ifndef __RFB_WIN32_INTERVAL_TIMER_H__ -#define __RFB_WIN32_INTERVAL_TIMER_H__ - -namespace rfb { - - namespace win32 { - - struct IntervalTimer { - IntervalTimer(HWND hwnd_, int id_) - : active(false), hwnd(hwnd_), id(id_) { - } - IntervalTimer() : active(false), hwnd(0), id(0) { - } - ~IntervalTimer() { - stop(); - } - - void start(int interval_) { - if (!active || interval_ != interval) { - interval = interval_; - if (!SetTimer(hwnd, id, interval, 0)) - throw rdr::SystemException("SetTimer", GetLastError()); - active = true; - } - } - void stop() { - if (active) - KillTimer(hwnd, id); - active = false; - } - - void setHWND(HWND hwnd_) {hwnd=hwnd_;} - void setId(int id_) {id = id_;} - int getId() const {return id;} - bool isActive() const {return active;} - - private: - HWND hwnd; - int id; - bool active; - int interval; - }; - - }; // win32 - -}; // rfb - -#endif // __RFB_WIN32_INTERVAL_TIMER_H__ diff --git a/rfb_win32/LaunchProcess.cxx b/rfb_win32/LaunchProcess.cxx deleted file mode 100644 index 56a712e6..00000000 --- a/rfb_win32/LaunchProcess.cxx +++ /dev/null @@ -1,103 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- LaunchProcess.cxx - -#include <rfb_win32/LaunchProcess.h> -#include <rfb_win32/ModuleFileName.h> -#include <rfb_win32/Win32Util.h> -#include <rdr/Exception.h> -#include <stdio.h> - -using namespace rfb; -using namespace win32; - - -LaunchProcess::LaunchProcess(const TCHAR* exeName_, const TCHAR* params_) -: exeName(tstrDup(exeName_)), params(tstrDup(params_)) { - memset(&procInfo, 0, sizeof(procInfo)); -} - -LaunchProcess::~LaunchProcess() { - await(); -} - - -void LaunchProcess::start(HANDLE userToken, bool createConsole) { - if (procInfo.hProcess && (WaitForSingleObject(procInfo.hProcess, 0) != WAIT_OBJECT_0)) - return; - await(); - returnCode = STILL_ACTIVE; - - // - Create storage for the process startup information - STARTUPINFO sinfo; - memset(&sinfo, 0, sizeof(sinfo)); - sinfo.cb = sizeof(sinfo); - - // - Concoct a suitable command-line - TCharArray exePath; - if (!tstrContains(exeName.buf, _T('\\'))) { - ModuleFileName filename; - TCharArray path; splitPath(filename.buf, &path.buf, 0); - exePath.buf = new TCHAR[_tcslen(path.buf) + _tcslen(exeName.buf) + 2]; - _stprintf(exePath.buf, _T("%s\\%s"), path.buf, exeName.buf); - } else { - exePath.buf = tstrDup(exeName.buf); - } - - // - Start the process - // Note: We specify the exe's precise path in the ApplicationName parameter, - // AND include the name as the first part of the CommandLine parameter, - // because CreateProcess doesn't make ApplicationName argv[0] in C programs. - TCharArray cmdLine(_tcslen(exeName.buf) + 3 + _tcslen(params.buf) + 1); - _stprintf(cmdLine.buf, _T("\"%s\" %s"), exeName.buf, params.buf); - DWORD flags = createConsole ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW; - BOOL success; - if (userToken != INVALID_HANDLE_VALUE) - success = CreateProcessAsUser(userToken, exePath.buf, cmdLine.buf, 0, 0, FALSE, flags, 0, 0, &sinfo, &procInfo); - else - success = CreateProcess(exePath.buf, cmdLine.buf, 0, 0, FALSE, flags, 0, 0, &sinfo, &procInfo); - if (!success) - throw rdr::SystemException("unable to launch process", GetLastError()); - - // Wait for it to finish initialising - WaitForInputIdle(procInfo.hProcess, 15000); -} - -void LaunchProcess::detach() -{ - if (!procInfo.hProcess) - return; - CloseHandle(procInfo.hProcess); - CloseHandle(procInfo.hThread); - memset(&procInfo, 0, sizeof(procInfo)); -} - -bool LaunchProcess::await(DWORD timeoutMs) { - if (!procInfo.hProcess) - return true; - DWORD result = WaitForSingleObject(procInfo.hProcess, timeoutMs); - if (result == WAIT_OBJECT_0) { - GetExitCodeProcess(procInfo.hProcess, &returnCode); - detach(); - return true; - } else if (result == WAIT_FAILED) { - throw rdr::SystemException("await() failed", GetLastError()); - } - return false; -} diff --git a/rfb_win32/LaunchProcess.h b/rfb_win32/LaunchProcess.h deleted file mode 100644 index 38521dcd..00000000 --- a/rfb_win32/LaunchProcess.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- LaunchProcess.h - -// Helper class to launch a names process from the same directory as -// the current process executable resides in. - -#ifndef __RFB_WIN32_LAUNCHPROCESS_H__ -#define __RFB_WIN32_LAUNCHPROCESS_H__ - -#include <windows.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - class LaunchProcess { - public: - LaunchProcess(const TCHAR* exeName_, const TCHAR* params); - ~LaunchProcess(); - - // start() starts the specified process with the supplied - // command-line. - // If userToken is INVALID_HANDLE_VALUE then starts the process - // as the current user, otherwise as the specified user. - // If createConsole is true then CREATE_CONSOLE_WINDOW is passed - // as an extra flag to the process creation call. - void start(HANDLE userToken, bool createConsole=false); - - // Detatch from the child process. After detatching from a child - // process, no other methods should be called on the object - // that started it - void detach(); - - // Wait for the process to quit, up to the specified timeout, and - // close the handles to it once it has quit. - // If the process quits within the timeout then true is returned - // and returnCode is set. If it has not quit then false is returned. - // If an error occurs then an exception will be thrown. - bool await(DWORD timeoutMs=INFINITE); - - PROCESS_INFORMATION procInfo; - DWORD returnCode; - protected: - TCharArray exeName; - TCharArray params; - }; - - - }; - -}; - -#endif diff --git a/rfb_win32/ListViewControl.cxx b/rfb_win32/ListViewControl.cxx deleted file mode 100644 index 12e04003..00000000 --- a/rfb_win32/ListViewControl.cxx +++ /dev/null @@ -1,103 +0,0 @@ -// ListViewControl.cxx: implementation of the ListViewControl class. -// -////////////////////////////////////////////////////////////////////// -#include <tchar.h> -#include "ListViewControl.h" -#include "commctrl.h" -////////////////////////////////////////////////////////////////////// -// Construction/Destruction -////////////////////////////////////////////////////////////////////// -using namespace rfb; -using namespace rfb::win32; - -ListViewControl::ListViewControl() -{ -} - -bool ListViewControl::IsSelectedLVItem(DWORD idListView, - HWND hDlg, int numberItem) -{ - return (ListView_GetItemState(GetDlgItem(hDlg, idListView), - numberItem, LVIS_SELECTED) == LVIS_SELECTED); -} - -void ListViewControl::SelectLVItem(DWORD idListView, HWND hDlg, int numberItem) -{ - ListView_SetItemState(GetDlgItem(hDlg, idListView), - numberItem, LVIS_SELECTED, LVIS_SELECTED); -} - -BOOL ListViewControl::InitLVColumns(DWORD idListView, HWND hDlg, int width, int columns, - TCHAR *title[], DWORD mask, DWORD LVStyle, DWORD format) -{ - ListView_SetExtendedListViewStyle(GetDlgItem(hDlg, idListView), LVStyle); - TCHAR szText[256]; - LVCOLUMN lvc; - int iCol; - - lvc.mask = mask; - - for (iCol = 0; iCol < columns; iCol++) { - lvc.iSubItem = iCol; - lvc.pszText = szText; - lvc.cx = width; - lvc.fmt = format; - - _tcscpy(szText, title[iCol]); - if (ListView_InsertColumn(GetDlgItem(hDlg, idListView), iCol, &lvc) == -1) - return FALSE; - } - return TRUE; -} - -BOOL ListViewControl::InsertLVItem(DWORD idListView, HWND hDlg, int number, TCHAR * texts[], - int columns) -{ - int i; - LVITEM lvI; - lvI.mask = LVIF_TEXT| LVIF_STATE; - lvI.state = 0; - lvI.stateMask = 0; - lvI.iItem = number; - lvI.iSubItem = 0; - lvI.pszText = texts[0]; - - if(ListView_InsertItem(GetDlgItem(hDlg, idListView), &lvI) == -1) - return NULL; - - for (i =1; i < columns; i++) { - SetLVItemText( - idListView, hDlg, - number, i, texts[i]); - } - return TRUE; -} - -void ListViewControl::SetLVItemText(DWORD idListView, HWND hDlg, int numberItem, - int namberColumn, TCHAR * text) -{ - ListView_SetItemText( - GetDlgItem(hDlg, idListView), - numberItem, namberColumn, text); -} - -void ListViewControl::GetLVItemText(DWORD idListView, HWND hDlg, int numberItem, - int namberColumn, TCHAR * text) -{ - ListView_GetItemText(GetDlgItem(hDlg, idListView), numberItem, - namberColumn, text, 256); -} - -void ListViewControl::DeleteLVItem(DWORD idListView, HWND hDlg, int number) -{ - ListView_DeleteItem(GetDlgItem(hDlg, idListView), number); -} - -void ListViewControl::DeleteAllLVItem(DWORD idListView, HWND hDlg) -{ - ListView_DeleteAllItems(GetDlgItem(hDlg, idListView)); -} - -ListViewControl::~ListViewControl() -{ -} diff --git a/rfb_win32/ListViewControl.h b/rfb_win32/ListViewControl.h deleted file mode 100644 index 8a163738..00000000 --- a/rfb_win32/ListViewControl.h +++ /dev/null @@ -1,35 +0,0 @@ -// ListViewControl.h: interface for the ListViewControl class. -// -////////////////////////////////////////////////////////////////////// - -#ifndef AFX_LISTVIEWCONTROL_H__ -#define AFX_LISTVIEWCONTROL_H__ - -#include <windows.h> -#include "commctrl.h" - -namespace rfb { - - namespace win32 { - class ListViewControl - { - public: - ListViewControl(); - bool IsSelectedLVItem(DWORD idListView, HWND hDlg, int numberItem); - void SelectLVItem(DWORD idListView, HWND hDlg, int numberItem); - BOOL InitLVColumns(DWORD idListView, HWND hDlg, int width, int columns, - TCHAR * title[], DWORD mask, DWORD style, DWORD format); - BOOL InsertLVItem(DWORD idListView, HWND hDlg, int number, TCHAR * texts[], - int columns); - void SetLVItemText(DWORD idListView, HWND hDlg, int numberItem, - int namberColumn, TCHAR * text); - void GetLVItemText(DWORD idListView, HWND hDlg, int numberItem, - int namberColumn, TCHAR * text); - void DeleteLVItem(DWORD idListView, HWND hDlg, int number); - void DeleteAllLVItem(DWORD idListView, HWND hDlg); - virtual ~ListViewControl(); - }; - }; -}; - -#endif;
\ No newline at end of file diff --git a/rfb_win32/LocalMem.h b/rfb_win32/LocalMem.h deleted file mode 100644 index a99d3241..00000000 --- a/rfb_win32/LocalMem.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_LOCALMEM_H__ -#define __RFB_WIN32_LOCALMEM_H__ - -#include <windows.h> -#include <rdr/Exception.h> - -namespace rfb { - namespace win32 { - - // Allocate and/or manage LocalAlloc memory. - struct LocalMem { - LocalMem(int size) : ptr(LocalAlloc(LMEM_FIXED, size)) { - if (!ptr) throw rdr::SystemException("LocalAlloc", GetLastError()); - } - LocalMem(void* p) : ptr(p) {} - ~LocalMem() {LocalFree(ptr);} - operator void*() {return ptr;} - void* takePtr() { - void* t = ptr; ptr = 0; return t; - } - void* ptr; - }; - - }; -}; - -#endif diff --git a/rfb_win32/LogicalPalette.h b/rfb_win32/LogicalPalette.h deleted file mode 100644 index 204f1081..00000000 --- a/rfb_win32/LogicalPalette.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_LOGPALETTE_H__ -#define __RFB_WIN32_LOGPALETTE_H__ - -#include <windows.h> -#include <rdr/Exception.h> - -namespace rfb { - namespace win32 { - - class LogicalPalette { - public: - LogicalPalette() { - BYTE buf[sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY)]; - LOGPALETTE* logpal = (LOGPALETTE*)buf; - logpal->palVersion = 0x300; - logpal->palNumEntries = 256; - for (int i=0; i<256;i++) { - logpal->palPalEntry[i].peRed = 0; - logpal->palPalEntry[i].peGreen = 0; - logpal->palPalEntry[i].peBlue = 0; - logpal->palPalEntry[i].peFlags = 0; - } - palette = CreatePalette(logpal); - if (!palette) - throw rdr::SystemException("failed to CreatePalette", GetLastError()); - } - ~LogicalPalette() { - if (palette && !DeleteObject(palette)) - throw rdr::SystemException("del palette failed", GetLastError()); - } - void setEntries(int start, int count, const Colour* cols) { - if (numEntries < count) { - ResizePalette(palette, start+count); - numEntries = start+count; - } - PALETTEENTRY* logpal = new PALETTEENTRY[count]; - for (int i=0; i<count; i++) { - logpal[i].peRed = cols[i].r >> 8; - logpal[i].peGreen = cols[i].g >> 8; - logpal[i].peBlue = cols[i].b >> 8; - logpal[i].peFlags = 0; - } - UnrealizeObject(palette); - SetPaletteEntries(palette, start, count, logpal); - delete [] logpal; - } - HPALETTE getHandle() {return palette;} - protected: - HPALETTE palette; - int numEntries; - }; - - class PaletteSelector { - public: - PaletteSelector(HDC dc, HPALETTE pal) : device(dc), redrawRequired(false) { - oldPal = SelectPalette(dc, pal, FALSE); - redrawRequired = RealizePalette(dc) > 0; - } - ~PaletteSelector() { - if (oldPal) SelectPalette(device, oldPal, TRUE); - } - bool isRedrawRequired() {return redrawRequired;} - protected: - HPALETTE oldPal; - HDC device; - bool redrawRequired; - }; - - }; -}; - -#endif diff --git a/rfb_win32/LowLevelKeyEvents.cxx b/rfb_win32/LowLevelKeyEvents.cxx deleted file mode 100644 index 322d1f40..00000000 --- a/rfb_win32/LowLevelKeyEvents.cxx +++ /dev/null @@ -1,96 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <windows.h> -#include <rfb_win32/LowLevelKeyEvents.h> -#include <rfb/Threading.h> -#include <rfb/LogWriter.h> -#include <list> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("LowLevelKeyEvents"); - - -HHOOK hook = 0; -std::list<HWND> windows; -Mutex windowLock; - - -static bool filterKeyEvent(int vkCode) { - switch (vkCode) { - case VK_LWIN: - case VK_RWIN: - case VK_SNAPSHOT: - return true; - case VK_TAB: - if (GetAsyncKeyState(VK_MENU) & 0x8000) - return true; - case VK_ESCAPE: - if (GetAsyncKeyState(VK_MENU) & 0x8000) - return true; - if (GetAsyncKeyState(VK_CONTROL) & 0x8000) - return true; - } - return false; -} - -LRESULT CALLBACK LowLevelKeyEventProc(int nCode, - WPARAM wParam, - LPARAM lParam) { - if (nCode >= 0) { - Lock l(windowLock); - HWND foreground = GetForegroundWindow(); - std::list<HWND>::iterator i; - for (i=windows.begin(); i!=windows.end(); i++) { - if (*i == foreground) { - UINT msgType = wParam; - KBDLLHOOKSTRUCT* msgInfo = (KBDLLHOOKSTRUCT*)lParam; - if (filterKeyEvent(msgInfo->vkCode)) { - vlog.debug("filtered event %lx(%lu) %lu", msgInfo->vkCode, msgInfo->vkCode, wParam); - PostMessage(*i, wParam, msgInfo->vkCode, (msgInfo->scanCode & 0xff) << 16); - return 1; - } - } - } - } - return CallNextHookEx(hook, nCode, wParam, lParam); -} - - -bool rfb::win32::enableLowLevelKeyEvents(HWND hwnd) { -// *** return false; // *** THIS CODE IS EXPERIMENTAL, SO DISABLED BY DEFAULT! - Lock l(windowLock); - if (windows.empty() && !hook) - hook = SetWindowsHookEx(WH_KEYBOARD_LL, &LowLevelKeyEventProc, GetModuleHandle(0), 0); - if (hook) - windows.push_back(hwnd); - vlog.debug("enable %p -> %s", hwnd, hook ? "success" : "failure"); - return hook != 0; -} - -void rfb::win32::disableLowLevelKeyEvents(HWND hwnd) { - vlog.debug("disable %p", hwnd); - Lock l(windowLock); - windows.remove(hwnd); - if (windows.empty() && hook) { - UnhookWindowsHookEx(hook); - hook = 0; - } -} diff --git a/rfb_win32/LowLevelKeyEvents.h b/rfb_win32/LowLevelKeyEvents.h deleted file mode 100644 index 40d2ecfa..00000000 --- a/rfb_win32/LowLevelKeyEvents.h +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- LowLevelKeyEvents.h -// -// This interface allows keyboard events destined for a particular window -// to be intercepted early in the keyboard message queue and posted directly -// to the window. This is used to avoid having the operating system process -// keys such as VK_LWIN, VK_RWIN, etc. -// - -#ifndef __RFB_WIN32_LOW_LEVEL_KEY_EVENTS_H__ -#define __RFB_WIN32_LOW_LEVEL_KEY_EVENTS_H__ - -namespace rfb { - - namespace win32 { - - // enableLowLevelKeyEvents - // Specifies that keyboard events destined for the specified window should - // be posted directly to the window, rather than being passed via the normal - // Windows keyboard message queue. - bool enableLowLevelKeyEvents(HWND hwnd); - - // disableLowLevelKeyEvents - // Causes the specified window to revert to the normal Windows keyboard - // event processing mechanism. - void disableLowLevelKeyEvents(HWND hwnd); - - }; - -}; - -#endif // __RFB_WIN32_LOW_LEVEL_KEY_EVENTS_H__ diff --git a/rfb_win32/ModuleFileName.h b/rfb_win32/ModuleFileName.h deleted file mode 100644 index 2264e89d..00000000 --- a/rfb_win32/ModuleFileName.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_MODULE_FILENAME_H__ -#define __RFB_WIN32_MODULE_FILENAME_H__ - -#include <windows.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - namespace win32 { - - struct ModuleFileName : public TCharArray { - ModuleFileName(HMODULE module=0) : TCharArray(MAX_PATH) { - if (!module) - module = GetModuleHandle(0); - if (!GetModuleFileName(module, buf, MAX_PATH)) - buf[0] = 0; - } - }; - - }; -}; - -#endif diff --git a/rfb_win32/MonitorInfo.cxx b/rfb_win32/MonitorInfo.cxx deleted file mode 100644 index 03772e97..00000000 --- a/rfb_win32/MonitorInfo.cxx +++ /dev/null @@ -1,205 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/MonitorInfo.h> -#include <rfb_win32/Win32Util.h> -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace win32; - -static LogWriter vlog("MonitorInfo"); - - -// If we are building in multi-monitor support (i.e. the headers support it) -// then do dynamic imports of the required system calls, and provide any -// other code that wouldn't otherwise compile. -#ifdef RFB_HAVE_MONITORINFO -#include <tchar.h> -typedef HMONITOR (WINAPI *_MonitorFromWindow_proto)(HWND,DWORD); -static rfb::win32::DynamicFn<_MonitorFromWindow_proto> _MonitorFromWindow(_T("user32.dll"), "MonitorFromWindow"); -typedef HMONITOR (WINAPI *_MonitorFromRect_proto)(LPCRECT,DWORD); -static rfb::win32::DynamicFn<_MonitorFromRect_proto> _MonitorFromRect(_T("user32.dll"), "MonitorFromRect"); -typedef BOOL (WINAPI *_GetMonitorInfo_proto)(HMONITOR,LPMONITORINFO); -static rfb::win32::DynamicFn<_GetMonitorInfo_proto> _GetMonitorInfo(_T("user32.dll"), "GetMonitorInfoA"); -typedef BOOL (WINAPI *_EnumDisplayMonitors_proto)(HDC, LPCRECT, MONITORENUMPROC, LPARAM); -static rfb::win32::DynamicFn<_EnumDisplayMonitors_proto> _EnumDisplayMonitors(_T("user32.dll"), "EnumDisplayMonitors"); -static void fillMonitorInfo(HMONITOR monitor, MonitorInfo* mi) { - vlog.debug("monitor=%lx", monitor); - if (!_GetMonitorInfo.isValid()) - throw rdr::Exception("no GetMonitorInfo"); - memset(mi, 0, sizeof(MONITORINFOEXA)); - mi->cbSize = sizeof(MONITORINFOEXA); - if (!(*_GetMonitorInfo)(monitor, mi)) - throw rdr::SystemException("failed to GetMonitorInfo", GetLastError()); - vlog.debug("monitor is %d,%d-%d,%d", mi->rcMonitor.left, mi->rcMonitor.top, mi->rcMonitor.right, mi->rcMonitor.bottom); - vlog.debug("work area is %d,%d-%d,%d", mi->rcWork.left, mi->rcWork.top, mi->rcWork.right, mi->rcWork.bottom); - vlog.debug("device is \"%s\"", mi->szDevice); -} -#else -#pragma message(" NOTE: Not building Multi-Monitor support.") -#endif - - -MonitorInfo::MonitorInfo(HWND window) { - cbSize = sizeof(MonitorInfo); - szDevice[0] = 0; - -#ifdef RFB_HAVE_MONITORINFO - try { - if (_MonitorFromWindow.isValid()) { - HMONITOR monitor = (*_MonitorFromWindow)(window, MONITOR_DEFAULTTONEAREST); - if (!monitor) - throw rdr::SystemException("failed to get monitor", GetLastError()); - fillMonitorInfo(monitor, this); - return; - } - } catch (rdr::Exception& e) { - vlog.error(e.str()); - } -#endif - - // Legacy fallbacks - just return the desktop settings - vlog.debug("using legacy fall-backs"); - HWND desktop = GetDesktopWindow(); - GetWindowRect(desktop, &rcMonitor); - SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0); - dwFlags = 0; -} - -MonitorInfo::MonitorInfo(const RECT& r) { - cbSize = sizeof(MonitorInfo); - szDevice[0] = 0; - -#ifdef RFB_HAVE_MONITORINFO - try { - if (_MonitorFromRect.isValid()) { - HMONITOR monitor = (*_MonitorFromRect)(&r, MONITOR_DEFAULTTONEAREST); - if (!monitor) - throw rdr::SystemException("failed to get monitor", GetLastError()); - fillMonitorInfo(monitor, this); - return; - } - } catch (rdr::Exception& e) { - vlog.error(e.str()); - } -#endif - - // Legacy fallbacks - just return the desktop settings - vlog.debug("using legacy fall-backs"); - HWND desktop = GetDesktopWindow(); - GetWindowRect(desktop, &rcMonitor); - SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0); - dwFlags = 0; -} - - -#ifdef RFB_HAVE_MONITORINFO - -struct monitorByNameData { - MonitorInfo* info; - const char* monitorName; -}; - -static BOOL CALLBACK monitorByNameEnumProc(HMONITOR monitor, - HDC dc, - LPRECT pos, - LPARAM d) { - monitorByNameData* data = (monitorByNameData*)d; - memset(data->info, 0, sizeof(MONITORINFOEXA)); - data->info->cbSize = sizeof(MONITORINFOEXA); - if ((*_GetMonitorInfo)(monitor, data->info)) { - if (stricmp(data->monitorName, data->info->szDevice) == 0) - return FALSE; - } - - return TRUE; -} - -#endif - -MonitorInfo::MonitorInfo(const char* devName) { -#ifdef RFB_HAVE_MONITORINFO - if (!_EnumDisplayMonitors.isValid()) { - vlog.debug("EnumDisplayMonitors not found"); - } else { - monitorByNameData data; - data.info = this; - data.monitorName = devName; - - (*_EnumDisplayMonitors)(0, 0, &monitorByNameEnumProc, (LPARAM)&data); - if (stricmp(data.monitorName, szDevice) == 0) - return; - } -#endif - // If multi-monitor is not built, or not supported by the OS, - // or if the named monitor is not found, revert to the primary monitor. - vlog.debug("reverting to primary monitor"); - cbSize = sizeof(MonitorInfo); - szDevice[0] = 0; - - HWND desktop = GetDesktopWindow(); - GetWindowRect(desktop, &rcMonitor); - SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0); - dwFlags = 0; -} - -void MonitorInfo::moveTo(HWND handle) { - vlog.debug("moveTo monitor=%s", szDevice); - -#ifdef RFB_HAVE_MONITORINFO - MonitorInfo mi(handle); - if (strcmp(szDevice, mi.szDevice) != 0) { - centerWindow(handle, rcWork); - clipTo(handle); - } -#endif -} - -void MonitorInfo::clipTo(RECT* r) { - vlog.debug("clipTo monitor=%s", szDevice); - - if (r->top < rcWork.top) { - r->bottom += rcWork.top - r->top; r->top = rcWork.top; - } - if (r->left < rcWork.left) { - r->right += rcWork.left - r->left; r->left = rcWork.left; - } - if (r->bottom > rcWork.bottom) { - r->top += rcWork.bottom - r->bottom; r->bottom = rcWork.bottom; - } - if (r->right > rcWork.right) { - r->left += rcWork.right - r->right; r->right = rcWork.right; - } - r->left = max(r->left, rcWork.left); - r->right = min(r->right, rcWork.right); - r->top = max(r->top, rcWork.top); - r->bottom = min(r->bottom, rcWork.bottom); -} - -void MonitorInfo::clipTo(HWND handle) { - RECT r; - GetWindowRect(handle, &r); - clipTo(&r); - SetWindowPos(handle, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, - SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOOWNERZORDER); -} - - diff --git a/rfb_win32/MonitorInfo.h b/rfb_win32/MonitorInfo.h deleted file mode 100644 index acf27755..00000000 --- a/rfb_win32/MonitorInfo.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Helper class used to obtain information about a particular monitor. -// This class wraps the Windows MONITORINFOEX ASCII structure, providing -// methods that can safely be called on both multi-monitor aware systems -// and older "legacy" systems. - - -#ifndef __RFB_WIN32_MONITORINFO_H__ -#define __RFB_WIN32_MONITORINFO_H__ - -#include <windows.h> -#ifdef MONITOR_DEFAULTTONULL -#define RFB_HAVE_MONITORINFO -#endif - -namespace rfb { - namespace win32 { - - // Structure containing info on the monitor nearest the window. - // Copes with multi-monitor OSes and older ones. -#ifdef RFB_HAVE_MONITORINFO - struct MonitorInfo : MONITORINFOEXA { -#else - struct MonitorInfo { - DWORD cbSize; - RECT rcMonitor; - RECT rcWork; - DWORD dwFlags; - char szDevice[1]; // Always null... -#endif - - // Constructor: Obtains monitor info for the monitor that has the - // greatest overlap with the supplied window or rectangle. - MonitorInfo(HWND hwnd); - MonitorInfo(const RECT& r); - - // Constructor: Obtains monitor info for the name monitor. Monitor - // names should be those obtained from the MonitorInfo - // szDevice field, and usually look like "\\.\DISPLAY<n>" - MonitorInfo(const char* devName); - - // Move the specified window to reside on the monitor. - void moveTo(HWND handle); - - // Clip the specified rectangle or window to the monitor's working area. - // The rectangle/window is moved so that as much as possible resides - // on the working area of the monitor, and is then intersected with it. - void clipTo(HWND handle); - void clipTo(RECT* r); - }; - - }; -}; - -#endif diff --git a/rfb_win32/MsgBox.h b/rfb_win32/MsgBox.h deleted file mode 100644 index 59571395..00000000 --- a/rfb_win32/MsgBox.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#ifndef __RFB_WIN32_MSGBOX_H__ -#define __RFB_WIN32_MSGBOX_H__ - -#include <windows.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - namespace win32 { - - // Define rfb::win32::AppName somewhere in the application. - // The MsgBox function will use the specified application name - // as the prefix for the message box title. - // Message box titles are based on the (standard Win32) flags - // passed to the MsgBox helper function. - - extern TStr AppName; - - // Wrapper around Win32 MessageBox() - static int MsgBox(HWND parent, const TCHAR* msg, UINT flags) { - const TCHAR* msgType = 0; - UINT tflags = flags & 0x70; - if (tflags == MB_ICONHAND) - msgType = _T("Error"); - else if (tflags == MB_ICONQUESTION) - msgType = _T("Question"); - else if (tflags == MB_ICONEXCLAMATION) - msgType = _T("Warning"); - else if (tflags == MB_ICONASTERISK) - msgType = _T("Information"); - flags |= MB_TOPMOST | MB_SETFOREGROUND; - int len = _tcslen(AppName.buf) + 1; - if (msgType) len += _tcslen(msgType) + 3; - TCharArray title = new TCHAR[len]; - _tcscpy(title.buf, AppName.buf); - if (msgType) { - _tcscat(title.buf, _T(" : ")); - _tcscat(title.buf, msgType); - } - return MessageBox(parent, msg, title.buf, flags); - } - - }; -}; - -#endif diff --git a/rfb_win32/MsgWindow.cxx b/rfb_win32/MsgWindow.cxx deleted file mode 100644 index 95bd5237..00000000 --- a/rfb_win32/MsgWindow.cxx +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- MsgWindow.cxx - -#include <rfb_win32/MsgWindow.h> -#include <rfb_win32/WMShatter.h> -#include <rfb/LogWriter.h> -#include <rdr/Exception.h> -#include <malloc.h> -#include <tchar.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("MsgWindow"); - -// -// -=- MsgWindowClass -// - -class MsgWindowClass { -public: - MsgWindowClass(); - ~MsgWindowClass(); - ATOM classAtom; - HINSTANCE instance; -}; - -LRESULT CALLBACK MsgWindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) { - LRESULT result; - - if (msg == WM_CREATE) - SetWindowLong(wnd, GWL_USERDATA, (long)((CREATESTRUCT*)lParam)->lpCreateParams); - else if (msg == WM_DESTROY) - SetWindowLong(wnd, GWL_USERDATA, 0); - MsgWindow* _this = (MsgWindow*) GetWindowLong(wnd, GWL_USERDATA); - if (!_this) { - vlog.info("null _this in %x, message %x", wnd, msg); - return SafeDefWindowProc(wnd, msg, wParam, lParam); - } - - try { - result = _this->processMessage(msg, wParam, lParam); - } catch (rdr::Exception& e) { - vlog.error("untrapped: %s", e.str()); - } - - return result; -}; - -MsgWindowClass::MsgWindowClass() : classAtom(0) { - WNDCLASS wndClass; - wndClass.style = 0; - wndClass.lpfnWndProc = MsgWindowProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 0; - wndClass.hInstance = instance = GetModuleHandle(0); - wndClass.hIcon = 0; - wndClass.hCursor = 0; - wndClass.hbrBackground = 0; - wndClass.lpszMenuName = 0; - wndClass.lpszClassName = _T("rfb::win32::MsgWindowClass"); - classAtom = RegisterClass(&wndClass); - if (!classAtom) { - throw rdr::SystemException("unable to register MsgWindow window class", GetLastError()); - } -} - -MsgWindowClass::~MsgWindowClass() { - if (classAtom) { - UnregisterClass((const TCHAR*)classAtom, instance); - } -} - -MsgWindowClass baseClass; - -// -// -=- MsgWindow -// - -MsgWindow::MsgWindow(const TCHAR* name_) : name(tstrDup(name_)), handle(0) { - vlog.debug("creating window \"%s\"", (const char*)CStr(name.buf)); - handle = CreateWindow((const TCHAR*)baseClass.classAtom, name.buf, WS_OVERLAPPED, - 0, 0, 10, 10, 0, 0, baseClass.instance, this); - if (!handle) { - throw rdr::SystemException("unable to create WMNotifier window instance", GetLastError()); - } - vlog.debug("created window \"%s\" (%x)", (const char*)CStr(name.buf), handle); -} - -MsgWindow::~MsgWindow() { - if (handle) - DestroyWindow(handle); - vlog.debug("destroyed window \"%s\" (%x)", (const char*)CStr(name.buf), handle); -} - -LRESULT -MsgWindow::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - return SafeDefWindowProc(getHandle(), msg, wParam, lParam); -} diff --git a/rfb_win32/MsgWindow.h b/rfb_win32/MsgWindow.h deleted file mode 100644 index 92b6cf20..00000000 --- a/rfb_win32/MsgWindow.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- MsgWindow.h - -// Base-class for any hidden message-handling windows used in the rfb::win32 -// implementation. - -#ifndef __RFB_WIN32_MSG_WINDOW_H__ -#define __RFB_WIN32_MSG_WINDOW_H__ - -#include <windows.h> -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - class MsgWindow { - public: - MsgWindow(const TCHAR* _name); - virtual ~MsgWindow(); - - const TCHAR* getName() {return name.buf;} - HWND getHandle() const {return handle;} - - virtual LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam); - - protected: - TCharArray name; - HWND handle; - }; - - }; - -}; - -#endif // __RFB_WIN32_MSG_WINDOW_H__ diff --git a/rfb_win32/OSVersion.cxx b/rfb_win32/OSVersion.cxx deleted file mode 100644 index 3d74c956..00000000 --- a/rfb_win32/OSVersion.cxx +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- OSVersion.cxx - -#include <rfb_win32/OSVersion.h> -#include <rdr/Exception.h> -#include <tchar.h> - -using namespace rfb; -using namespace win32; - - -OSVersionInfo::OSVersionInfo() { - // Get OS Version Info - ZeroMemory(static_cast<OSVERSIONINFO*>(this), sizeof(this)); - dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (!GetVersionEx(this)) - throw rdr::SystemException("unable to get system version info", GetLastError()); - - // Set the special extra flags - isPlatformNT = dwPlatformId == VER_PLATFORM_WIN32_NT; - isPlatformWindows = dwPlatformId == VER_PLATFORM_WIN32_WINDOWS; - - cannotSwitchDesktop = isPlatformNT && (dwMajorVersion==4) && - ((_tcscmp(szCSDVersion, _T("")) == 0) || - (_tcscmp(szCSDVersion, _T("Service Pack 1")) == 0) || - (_tcscmp(szCSDVersion, _T("Service Pack 2")) == 0)); - -} - -OSVersionInfo rfb::win32::osVersion; diff --git a/rfb_win32/OSVersion.h b/rfb_win32/OSVersion.h deleted file mode 100644 index 18ec003e..00000000 --- a/rfb_win32/OSVersion.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- OSVersion.h - -// Operating system version info. -// GetVersionInfo is called once at process initialisation, and any -// extra flags (such as isWinNT) are calculated and saved at that -// point. It is assumed that the OS Version seldom changes during a -// program's execution... - -#ifndef __RFB_WIN32_OS_VERSION_H__ -#define __RFB_WIN32_OS_VERSION_H__ - -#include <windows.h> - -namespace rfb { - - namespace win32 { - - extern struct OSVersionInfo : OSVERSIONINFO { - OSVersionInfo(); - - // Is the OS one of the NT family (NT 3.51, NT4.0, 2K, XP, etc.)? - bool isPlatformNT; - // Is one of the Windows family? - bool isPlatformWindows; - - // Is this OS one of those that blue-screens when grabbing another desktop (NT4 pre SP3)? - bool cannotSwitchDesktop; - - } osVersion; - - }; - -}; - -#endif // __RFB_WIN32_OS_VERSION_H__ diff --git a/rfb_win32/ProgressControl.cxx b/rfb_win32/ProgressControl.cxx deleted file mode 100644 index 85bd15f3..00000000 --- a/rfb_win32/ProgressControl.cxx +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2005 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- ProgressControl.cxx - -#include <rfb_win32/ProgressControl.h> - -using namespace rfb; -using namespace rfb::win32; - -#define MAX_RANGE 0xFFFF - -ProgressControl::ProgressControl(HWND hwndProgress) -{ - m_hwndProgress = hwndProgress; - - m_dw64MaxValue = 0; - m_dw64CurrentValue = 0; -} - -ProgressControl::~ProgressControl() -{ -} - -bool -ProgressControl::init(DWORD64 maxValue, DWORD64 position) -{ - if (m_dw64CurrentValue > m_dw64MaxValue) return false; - - m_dw64CurrentValue = position; - m_dw64MaxValue = maxValue; - - if (!SendMessage(m_hwndProgress, PBM_SETRANGE, (WPARAM) 0, MAKELPARAM(0, MAX_RANGE))) - return false; - - return true; -} - -bool -ProgressControl::clear() -{ - m_dw64CurrentValue = 0; - return show(); -} - -bool -ProgressControl::increase(DWORD64 value) -{ - if ((m_dw64MaxValue - m_dw64CurrentValue) > value) { - m_dw64CurrentValue += value; - } else { - m_dw64CurrentValue = m_dw64MaxValue; - } - return show(); -} - -bool -ProgressControl::show() -{ - DWORD curPos; - if (m_dw64MaxValue != 0) { - curPos = (DWORD) ((m_dw64CurrentValue * MAX_RANGE) / m_dw64MaxValue); - } else { - curPos = 0; - } - - if (!SendMessage(m_hwndProgress, PBM_SETPOS, (WPARAM) curPos, (LPARAM) 0)) - return false; - - return true; -} - -int -ProgressControl::getCurrentPercent() -{ - if (m_dw64MaxValue == 0) return 0; - - return ((int) ((m_dw64CurrentValue * 100) / m_dw64MaxValue)); -}
\ No newline at end of file diff --git a/rfb_win32/ProgressControl.h b/rfb_win32/ProgressControl.h deleted file mode 100644 index ceeb153f..00000000 --- a/rfb_win32/ProgressControl.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2005 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- ProgressControl.h - -#ifndef __RFB_WIN32_PROGRESSCONTROL_H__ -#define __RFB_WIN32_PROGRESSCONTROL_H__ - -#include <windows.h> -#include <commctrl.h> - -namespace rfb { - namespace win32 { - class ProgressControl - { - public: - ProgressControl(HWND hwndProgress); - ~ProgressControl(); - - bool init(DWORD64 maxValue, DWORD64 position); - - bool increase(DWORD64 value); - bool clear(); - - int getCurrentPercent(); - - private: - HWND m_hwndProgress; - - DWORD64 m_dw64MaxValue; - DWORD64 m_dw64CurrentValue; - - bool show(); - }; - } -} - -#endif // __RFB_WIN32_PROGRESSCONTROL_H__ diff --git a/rfb_win32/RegConfig.cxx b/rfb_win32/RegConfig.cxx deleted file mode 100644 index dd1c3b06..00000000 --- a/rfb_win32/RegConfig.cxx +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- RegConfig.cxx - -#include <malloc.h> - -#include <rfb_win32/RegConfig.h> -#include <rfb/LogWriter.h> -#include <rfb/util.h> -//#include <rdr/HexOutStream.h> - -using namespace rfb; -using namespace rfb::win32; - - -static LogWriter vlog("RegConfig"); - - -RegConfig::RegConfig(EventManager* em) : eventMgr(em), event(CreateEvent(0, TRUE, FALSE, 0)), callback(0) { - if (em->addEvent(event, this)) - eventMgr = em; -} - -RegConfig::~RegConfig() { - if (eventMgr) - eventMgr->removeEvent(event); -} - -bool RegConfig::setKey(const HKEY rootkey, const TCHAR* keyname) { - try { - key.createKey(rootkey, keyname); - processEvent(event); - return true; - } catch (rdr::Exception& e) { - vlog.debug(e.str()); - return false; - } -} - -void RegConfig::loadRegistryConfig(RegKey& key) { - DWORD i = 0; - try { - while (1) { - TCharArray name = tstrDup(key.getValueName(i++)); - if (!name.buf) break; - TCharArray value = key.getRepresentation(name.buf); - if (!value.buf || !Configuration::setParam(CStr(name.buf), CStr(value.buf))) - vlog.info("unable to process %s", CStr(name.buf)); - } - } catch (rdr::SystemException& e) { - if (e.err != 6) - vlog.error(e.str()); - } -} - -void RegConfig::processEvent(HANDLE event_) { - vlog.info("registry changed"); - - // Reinstate the registry change notifications - ResetEvent(event); - key.awaitChange(true, REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET, event); - - // Load settings - loadRegistryConfig(key); - - // Notify the callback, if supplied - if (callback) - callback->regConfigChanged(); -} - - -RegConfigThread::RegConfigThread() : Thread("RegConfigThread"), config(&eventMgr) { -} - -RegConfigThread::~RegConfigThread() { - join(); -} - -bool RegConfigThread::start(const HKEY rootKey, const TCHAR* keyname) { - if (config.setKey(rootKey, keyname)) { - Thread::start(); - return true; - } - return false; -} - -void RegConfigThread::run() { - DWORD result = 0; - MSG msg; - while ((result = eventMgr.getMessage(&msg, 0, 0, 0)) > 0) {} - if (result < 0) - throw rdr::SystemException("RegConfigThread failed", GetLastError()); -} - -Thread* RegConfigThread::join() { - PostThreadMessage(getThreadId(), WM_QUIT, 0, 0); - return Thread::join(); -} diff --git a/rfb_win32/RegConfig.h b/rfb_win32/RegConfig.h deleted file mode 100644 index e9c01b1d..00000000 --- a/rfb_win32/RegConfig.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- RegConfig.h - -// Class which monitors the registry and reads in the registry settings -// whenever they change, or are added or removed. - -#ifndef __RFB_WIN32_REG_CONFIG_H__ -#define __RFB_WIN32_REG_CONFIG_H__ - -#include <rfb/Threading.h> -#include <rfb/Configuration.h> -#include <rfb_win32/Registry.h> -#include <rfb_win32/EventManager.h> -#include <rfb_win32/Handle.h> - -namespace rfb { - - namespace win32 { - - class RegConfig : EventHandler { - public: - RegConfig(EventManager* em); - ~RegConfig(); - - // Specify the registry key to read Configuration items from - bool setKey(const HKEY rootkey, const TCHAR* keyname); - - // Support for a callback, run in the RegConfig host thread whenever - // the registry configuration changes - class Callback { - public: - virtual ~Callback() {} - virtual void regConfigChanged() = 0; - }; - void setCallback(Callback* cb) { callback = cb; } - - // Read entries from the specified key into the Configuration - static void loadRegistryConfig(RegKey& key); - protected: - // EventHandler interface and trigger event - virtual void processEvent(HANDLE event); - - EventManager* eventMgr; - Handle event; - Callback* callback; - RegKey key; - }; - - class RegConfigThread : Thread { - public: - RegConfigThread(); - ~RegConfigThread(); - - // Start the thread, reading from the specified key - bool start(const HKEY rootkey, const TCHAR* keyname); - protected: - void run(); - Thread* join(); - EventManager eventMgr; - RegConfig config; - }; - - }; - -}; - -#endif // __RFB_WIN32_REG_CONFIG_H__ diff --git a/rfb_win32/Registry.cxx b/rfb_win32/Registry.cxx deleted file mode 100644 index 4ece4bac..00000000 --- a/rfb_win32/Registry.cxx +++ /dev/null @@ -1,316 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Registry.cxx - -#include <rfb_win32/Registry.h> -#include <rfb_win32/Security.h> -#include <rfb_win32/DynamicFn.h> -#include <rdr/MemOutStream.h> -#include <rdr/HexOutstream.h> -#include <rdr/HexInStream.h> -#include <stdlib.h> -#include <rfb/LogWriter.h> - -// These flags are required to control access control inheritance, -// but are not defined by VC6's headers. These definitions comes -// from the Microsoft Platform SDK. -#ifndef PROTECTED_DACL_SECURITY_INFORMATION -#define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L) -#endif -#ifndef UNPROTECTED_DACL_SECURITY_INFORMATION -#define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L) -#endif - - -using namespace rfb; -using namespace rfb::win32; - - -static LogWriter vlog("Registry"); - - -RegKey::RegKey() : key(0), freeKey(false), valueNameBufLen(0) {} - -RegKey::RegKey(const HKEY k) : key(0), freeKey(false), valueNameBufLen(0) { - LONG result = RegOpenKeyEx(k, 0, 0, KEY_ALL_ACCESS, &key); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegOpenKeyEx(HKEY)", result); - vlog.debug("duplicated %x to %x", k, key); - freeKey = true; -} - -RegKey::RegKey(const RegKey& k) : key(0), freeKey(false), valueNameBufLen(0) { - LONG result = RegOpenKeyEx(k.key, 0, 0, KEY_ALL_ACCESS, &key); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegOpenKeyEx(RegKey&)", result); - vlog.debug("duplicated %x to %x", k.key, key); - freeKey = true; -} - -RegKey::~RegKey() { - close(); -} - - -void RegKey::setHKEY(HKEY k, bool fK) { - vlog.debug("setHKEY(%x,%d)", k, (int)fK); - close(); - freeKey = fK; - key = k; -} - - -bool RegKey::createKey(const RegKey& root, const TCHAR* name) { - close(); - LONG result = RegCreateKey(root.key, name, &key); - if (result != ERROR_SUCCESS) { - vlog.error("RegCreateKey(%x, %s): %x", root.key, name, result); - throw rdr::SystemException("RegCreateKeyEx", result); - } - vlog.debug("createKey(%x,%s) = %x", root.key, (const char*)CStr(name), key); - freeKey = true; - return true; -} - -void RegKey::openKey(const RegKey& root, const TCHAR* name, bool readOnly) { - close(); - LONG result = RegOpenKeyEx(root.key, name, 0, readOnly ? KEY_READ : KEY_ALL_ACCESS, &key); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegOpenKeyEx (open)", result); - vlog.debug("openKey(%x,%s,%s) = %x", root.key, (const char*)CStr(name), - readOnly ? "ro" : "rw", key); - freeKey = true; -} - -void RegKey::setDACL(const PACL acl, bool inherit) { - DWORD result; - typedef DWORD (WINAPI *_SetSecurityInfo_proto) (HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION, PSID, PSID, PACL, PACL); - DynamicFn<_SetSecurityInfo_proto> _SetSecurityInfo(_T("advapi32.dll"), "SetSecurityInfo"); - if (!_SetSecurityInfo.isValid()) - throw rdr::SystemException("RegKey::setDACL failed", ERROR_CALL_NOT_IMPLEMENTED); - if ((result = (*_SetSecurityInfo)(key, SE_REGISTRY_KEY, - DACL_SECURITY_INFORMATION | - (inherit ? UNPROTECTED_DACL_SECURITY_INFORMATION : PROTECTED_DACL_SECURITY_INFORMATION), - 0, 0, acl, 0)) != ERROR_SUCCESS) - throw rdr::SystemException("RegKey::setDACL failed", result); -} - -void RegKey::close() { - if (freeKey) { - vlog.debug("RegCloseKey(%x)", key); - RegCloseKey(key); - key = 0; - } -} - -void RegKey::deleteKey(const TCHAR* name) const { - LONG result = RegDeleteKey(key, name); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegDeleteKey", result); -} - -void RegKey::deleteValue(const TCHAR* name) const { - LONG result = RegDeleteValue(key, name); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegDeleteValue", result); -} - -void RegKey::awaitChange(bool watchSubTree, DWORD filter, HANDLE event) const { - LONG result = RegNotifyChangeKeyValue(key, watchSubTree, filter, event, event != 0); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegNotifyChangeKeyValue", result); -} - - -RegKey::operator HKEY() const {return key;} - - -void RegKey::setExpandString(const TCHAR* valname, const TCHAR* value) const { - LONG result = RegSetValueEx(key, valname, 0, REG_EXPAND_SZ, (const BYTE*)value, (_tcslen(value)+1)*sizeof(TCHAR)); - if (result != ERROR_SUCCESS) throw rdr::SystemException("setExpandString", result); -} - -void RegKey::setString(const TCHAR* valname, const TCHAR* value) const { - LONG result = RegSetValueEx(key, valname, 0, REG_SZ, (const BYTE*)value, (_tcslen(value)+1)*sizeof(TCHAR)); - if (result != ERROR_SUCCESS) throw rdr::SystemException("setString", result); -} - -void RegKey::setBinary(const TCHAR* valname, const void* value, int length) const { - LONG result = RegSetValueEx(key, valname, 0, REG_BINARY, (const BYTE*)value, length); - if (result != ERROR_SUCCESS) throw rdr::SystemException("setBinary", result); -} - -void RegKey::setInt(const TCHAR* valname, int value) const { - LONG result = RegSetValueEx(key, valname, 0, REG_DWORD, (const BYTE*)&value, sizeof(value)); - if (result != ERROR_SUCCESS) throw rdr::SystemException("setInt", result); -} - -void RegKey::setBool(const TCHAR* valname, bool value) const { - setInt(valname, value ? 1 : 0); -} - -TCHAR* RegKey::getString(const TCHAR* valname) const {return getRepresentation(valname);} -TCHAR* RegKey::getString(const TCHAR* valname, const TCHAR* def) const { - try { - return getString(valname); - } catch(rdr::Exception) { - return tstrDup(def); - } -} - -void RegKey::getBinary(const TCHAR* valname, void** data, int* length) const { - TCharArray hex = getRepresentation(valname); - if (!rdr::HexInStream::hexStrToBin(CStr(hex.buf), (char**)data, length)) - throw rdr::Exception("getBinary failed"); -} -void RegKey::getBinary(const TCHAR* valname, void** data, int* length, void* def, int deflen) const { - try { - getBinary(valname, data, length); - } catch(rdr::Exception) { - if (deflen) { - *data = new char[deflen]; - memcpy(*data, def, deflen); - } else - *data = 0; - *length = deflen; - } -} - -int RegKey::getInt(const TCHAR* valname) const { - TCharArray tmp = getRepresentation(valname); - return _ttoi(tmp.buf); -} -int RegKey::getInt(const TCHAR* valname, int def) const { - try { - return getInt(valname); - } catch(rdr::Exception) { - return def; - } -} - -bool RegKey::getBool(const TCHAR* valname) const { - return getInt(valname) > 0; -} -bool RegKey::getBool(const TCHAR* valname, bool def) const { - return getInt(valname, def ? 1 : 0) > 0; -} - -static inline TCHAR* terminateData(char* data, int length) -{ - // We must terminate the string, just to be sure. Stupid Win32... - int len = length/sizeof(TCHAR); - TCharArray str(len+1); - memcpy(str.buf, data, length); - str.buf[len] = 0; - return str.takeBuf(); -} - -TCHAR* RegKey::getRepresentation(const TCHAR* valname) const { - DWORD type, length; - LONG result = RegQueryValueEx(key, valname, 0, &type, 0, &length); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("get registry value length", result); - CharArray data(length); - result = RegQueryValueEx(key, valname, 0, &type, (BYTE*)data.buf, &length); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("get registry value", result); - - switch (type) { - case REG_BINARY: - { - TCharArray hex = rdr::HexOutStream::binToHexStr(data.buf, length); - return hex.takeBuf(); - } - case REG_SZ: - if (length) { - return terminateData(data.buf, length); - } else { - return tstrDup(_T("")); - } - case REG_DWORD: - { - TCharArray tmp(16); - _stprintf(tmp.buf, _T("%u"), *((DWORD*)data.buf)); - return tmp.takeBuf(); - } - case REG_EXPAND_SZ: - { - if (length) { - TCharArray str(terminateData(data.buf, length)); - DWORD required = ExpandEnvironmentStrings(str.buf, 0, 0); - if (required==0) - throw rdr::SystemException("ExpandEnvironmentStrings", GetLastError()); - TCharArray result(required); - length = ExpandEnvironmentStrings(str.buf, result.buf, required); - if (required<length) - rdr::Exception("unable to expand environment strings"); - return result.takeBuf(); - } else { - return tstrDup(_T("")); - } - } - default: - throw rdr::Exception("unsupported registry type"); - } -} - -bool RegKey::isValue(const TCHAR* valname) const { - try { - TCharArray tmp = getRepresentation(valname); - return true; - } catch(rdr::Exception) { - return false; - } -} - -const TCHAR* RegKey::getValueName(int i) { - DWORD maxValueNameLen; - LONG result = RegQueryInfoKey(key, 0, 0, 0, 0, 0, 0, 0, &maxValueNameLen, 0, 0, 0); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegQueryInfoKey", result); - if (valueNameBufLen < maxValueNameLen + 1) { - valueNameBufLen = maxValueNameLen + 1; - delete [] valueName.buf; - valueName.buf = new TCHAR[valueNameBufLen]; - } - DWORD length = valueNameBufLen; - result = RegEnumValue(key, i, valueName.buf, &length, NULL, 0, 0, 0); - if (result == ERROR_NO_MORE_ITEMS) return 0; - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegEnumValue", result); - return valueName.buf; -} - -const TCHAR* RegKey::getKeyName(int i) { - DWORD maxValueNameLen; - LONG result = RegQueryInfoKey(key, 0, 0, 0, 0, &maxValueNameLen, 0, 0, 0, 0, 0, 0); - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegQueryInfoKey", result); - if (valueNameBufLen < maxValueNameLen + 1) { - valueNameBufLen = maxValueNameLen + 1; - delete [] valueName.buf; - valueName.buf = new TCHAR[valueNameBufLen]; - } - DWORD length = valueNameBufLen; - result = RegEnumKeyEx(key, i, valueName.buf, &length, NULL, 0, 0, 0); - if (result == ERROR_NO_MORE_ITEMS) return 0; - if (result != ERROR_SUCCESS) - throw rdr::SystemException("RegEnumKey", result); - return valueName.buf; -} diff --git a/rfb_win32/Registry.h b/rfb_win32/Registry.h deleted file mode 100644 index 68d535cd..00000000 --- a/rfb_win32/Registry.h +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ -// -=- Registry.h - -// C++ wrappers around the Win32 Registry APIs - -#ifndef __RFB_WIN32_REGISTRY_H__ -#define __RFB_WIN32_REGISTRY_H__ - -#include <windows.h> -#include <rfb_win32/Security.h> -#include <rfb/util.h> - -namespace rfb { - - namespace win32 { - - class RegKey { - public: - // No key open - RegKey(); - - // Duplicate the specified existing key - RegKey(const HKEY k); - RegKey(const RegKey& k); - - // Calls close() internally - ~RegKey(); - - void setHKEY(HKEY key, bool freeKey); - private: - RegKey& operator=(const RegKey& k); - HKEY& operator=(const HKEY& k); - public: - - // Returns true if key was created, false if already existed - bool createKey(const RegKey& root, const TCHAR* name); - - // Opens key if it exists, or raises an exception if not - void openKey(const RegKey& root, const TCHAR* name, bool readOnly=false); - - // Set the (discretionary) access control list for the key - void setDACL(const PACL acl, bool inheritFromParent=true); - - // Closes current key, if required - void close(); - - // Delete a subkey/value - void deleteKey(const TCHAR* name) const; - void deleteValue(const TCHAR* name) const; - - - // Block waiting for a registry change, OR return immediately and notify the - // event when there is a change, if specified - void awaitChange(bool watchSubTree, DWORD filter, HANDLE event=0) const; - - void setExpandString(const TCHAR* valname, const TCHAR* s) const; - void setString(const TCHAR* valname, const TCHAR* s) const; - void setBinary(const TCHAR* valname, const void* data, int length) const; - void setInt(const TCHAR* valname, int i) const; - void setBool(const TCHAR* valname, bool b) const; - - TCHAR* getString(const TCHAR* valname) const; - TCHAR* getString(const TCHAR* valname, const TCHAR* def) const; - - void getBinary(const TCHAR* valname, void** data, int* length) const; - void getBinary(const TCHAR* valname, void** data, int* length, void* def, int deflength) const; - - int getInt(const TCHAR* valname) const; - int getInt(const TCHAR* valname, int def) const; - - bool getBool(const TCHAR* valname) const; - bool getBool(const TCHAR* valname, bool def) const; - - TCHAR* getRepresentation(const TCHAR* valname) const; - - bool isValue(const TCHAR* valname) const; - - // Get the name of value/key number "i" - // If there are fewer than "i" values then return 0 - // NAME IS OWNED BY RegKey OBJECT! - const TCHAR* getValueName(int i); - const TCHAR* getKeyName(int i); - - operator HKEY() const; - protected: - HKEY key; - bool freeKey; - TCharArray valueName; - DWORD valueNameBufLen; - }; - - }; - -}; - -#endif // __RFB_WIN32_REG_CONFIG_H__ diff --git a/rfb_win32/SDisplay.cxx b/rfb_win32/SDisplay.cxx deleted file mode 100644 index 0af50649..00000000 --- a/rfb_win32/SDisplay.cxx +++ /dev/null @@ -1,524 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplay.cxx -// -// The SDisplay class encapsulates a particular system display. - -#include <rfb_win32/SDisplay.h> -#include <rfb_win32/Service.h> -#include <rfb_win32/TsSessions.h> -#include <rfb_win32/CleanDesktop.h> -#include <rfb_win32/CurrentUser.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/MonitorInfo.h> -#include <rfb_win32/SDisplayCorePolling.h> -#include <rfb_win32/SDisplayCoreWMHooks.h> -#include <rfb_win32/SDisplayCoreDriver.h> -#include <rfb/Exception.h> -#include <rfb/LogWriter.h> - - -using namespace rdr; -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("SDisplay"); - -// - SDisplay-specific configuration options - -IntParameter rfb::win32::SDisplay::updateMethod("UpdateMethod", - "How to discover desktop updates; 0 - Polling, 1 - Application hooking, 2 - Driver hooking.", 1); -BoolParameter rfb::win32::SDisplay::disableLocalInputs("DisableLocalInputs", - "Disable local keyboard and pointer input while the server is in use", false); -StringParameter rfb::win32::SDisplay::disconnectAction("DisconnectAction", - "Action to perform when all clients have disconnected. (None, Lock, Logoff)", "None"); -StringParameter displayDevice("DisplayDevice", - "Display device name of the monitor to be remoted, or empty to export the whole desktop.", ""); -BoolParameter rfb::win32::SDisplay::removeWallpaper("RemoveWallpaper", - "Remove the desktop wallpaper when the server is in use.", false); -BoolParameter rfb::win32::SDisplay::removePattern("RemovePattern", - "Remove the desktop background pattern when the server is in use.", false); -BoolParameter rfb::win32::SDisplay::disableEffects("DisableEffects", - "Disable desktop user interface effects when the server is in use.", false); - - -////////////////////////////////////////////////////////////////////////////// -// -// SDisplay -// - -typedef BOOL (WINAPI *_LockWorkStation_proto)(); -DynamicFn<_LockWorkStation_proto> _LockWorkStation(_T("user32.dll"), "LockWorkStation"); - -// -=- Constructor/Destructor - -SDisplay::SDisplay() - : server(0), pb(0), device(0), - core(0), ptr(0), kbd(0), clipboard(0), - inputs(0), monitor(0), cleanDesktop(0), cursor(0), - statusLocation(0) -{ - updateEvent.h = CreateEvent(0, TRUE, FALSE, 0); -} - -SDisplay::~SDisplay() -{ - // XXX when the VNCServer has been deleted with clients active, stop() - // doesn't get called - this ought to be fixed in VNCServerST. In any event, - // we should never call any methods on VNCServer once we're being deleted. - // This is because it is supposed to be guaranteed that the SDesktop exists - // throughout the lifetime of the VNCServer. So if we're being deleted, then - // the VNCServer ought not to exist and therefore we shouldn't invoke any - // methods on it. Setting server to zero here ensures that stop() doesn't - // call setPixelBuffer(0) on the server. - server = 0; - if (core) stop(); -} - - -// -=- SDesktop interface - -void SDisplay::start(VNCServer* vs) -{ - vlog.debug("starting"); - - // Try to make session zero the console session - if (!inConsoleSession()) - setConsoleSession(); - - // Start the SDisplay core - server = vs; - startCore(); - - vlog.debug("started"); - - if (statusLocation) *statusLocation = true; -} - -void SDisplay::stop() -{ - vlog.debug("stopping"); - - // If we successfully start()ed then perform the DisconnectAction - if (core) { - CurrentUserToken cut; - CharArray action = disconnectAction.getData(); - if (stricmp(action.buf, "Logoff") == 0) { - if (!cut.h) - vlog.info("ignoring DisconnectAction=Logoff - no current user"); - else - ExitWindowsEx(EWX_LOGOFF, 0); - } else if (stricmp(action.buf, "Lock") == 0) { - if (!cut.h) { - vlog.info("ignoring DisconnectAction=Lock - no current user"); - } else { - if (_LockWorkStation.isValid()) - (*_LockWorkStation)(); - else - ExitWindowsEx(EWX_LOGOFF, 0); - } - } - } - - // Stop the SDisplayCore - if (server) - server->setPixelBuffer(0); - stopCore(); - server = 0; - - vlog.debug("stopped"); - - if (statusLocation) *statusLocation = false; -} - - -void SDisplay::startCore() { - - // Currently, we just check whether we're in the console session, and - // fail if not - if (!inConsoleSession()) - throw rdr::Exception("Console is not session zero - oreconnect to restore Console sessin"); - - // Switch to the current input desktop - if (rfb::win32::desktopChangeRequired()) { - if (!rfb::win32::changeDesktop()) - throw rdr::Exception("unable to switch into input desktop"); - } - - // Initialise the change tracker and clipper - updates.clear(); - clipper.setUpdateTracker(server); - - // Create the framebuffer object - recreatePixelBuffer(true); - - // Create the SDisplayCore - updateMethod_ = updateMethod; - int tryMethod = updateMethod_; - while (!core) { - try { - if (tryMethod == 2) - core = new SDisplayCoreDriver(this, &updates); - else if (tryMethod == 1) - core = new SDisplayCoreWMHooks(this, &updates); - else - core = new SDisplayCorePolling(this, &updates); - core->setScreenRect(screenRect); - } catch (rdr::Exception& e) { - delete core; core = 0; - if (tryMethod == 0) - throw rdr::Exception("unable to access desktop"); - tryMethod--; - vlog.error(e.str()); - } - } - vlog.info("Started %s", core->methodName()); - - // Start display monitor, clipboard handler and input handlers - monitor = new WMMonitor; - monitor->setNotifier(this); - clipboard = new Clipboard; - clipboard->setNotifier(this); - ptr = new SPointer; - kbd = new SKeyboard; - inputs = new WMBlockInput; - cursor = new WMCursor; - - // Apply desktop optimisations - cleanDesktop = new CleanDesktop; - if (removePattern) - cleanDesktop->disablePattern(); - if (removeWallpaper) - cleanDesktop->disableWallpaper(); - if (disableEffects) - cleanDesktop->disableEffects(); - isWallpaperRemoved = removeWallpaper; - isPatternRemoved = removePattern; - areEffectsDisabled = disableEffects; -} - -void SDisplay::stopCore() { - if (core) - vlog.info("Stopping %s", core->methodName()); - delete core; core = 0; - delete pb; pb = 0; - delete device; device = 0; - delete monitor; monitor = 0; - delete clipboard; clipboard = 0; - delete inputs; inputs = 0; - delete ptr; ptr = 0; - delete kbd; kbd = 0; - delete cleanDesktop; cleanDesktop = 0; - delete cursor; cursor = 0; - ResetEvent(updateEvent); -} - - -bool SDisplay::areHooksAvailable() { - return WMHooks::areAvailable(); -} - -bool SDisplay::isDriverAvailable() { - return SDisplayCoreDriver::isAvailable(); -} - - -bool SDisplay::isRestartRequired() { - // - We must restart the SDesktop if: - // 1. We are no longer in the input desktop. - // 2. The any setting has changed. - - // - Check that our session is the Console - if (!inConsoleSession()) - return true; - - // - Check that we are in the input desktop - if (rfb::win32::desktopChangeRequired()) - return true; - - // - Check that the update method setting hasn't changed - // NB: updateMethod reflects the *selected* update method, not - // necessarily the one in use, since we fall back to simpler - // methods if more advanced ones fail! - if (updateMethod_ != updateMethod) - return true; - - // - Check that the desktop optimisation settings haven't changed - // This isn't very efficient, but it shouldn't change very often! - if ((isWallpaperRemoved != removeWallpaper) || - (isPatternRemoved != removePattern) || - (areEffectsDisabled != disableEffects)) - return true; - - return false; -} - - -void SDisplay::restartCore() { - vlog.info("restarting"); - - // Stop the existing Core related resources - stopCore(); - try { - // Start a new Core if possible - startCore(); - vlog.info("restarted"); - } catch (rdr::Exception& e) { - // If startCore() fails then we MUST disconnect all clients, - // to cause the server to stop() the desktop. - // Otherwise, the SDesktop is in an inconsistent state - // and the server will crash. - server->closeClients(e.str()); - } -} - - -void SDisplay::pointerEvent(const Point& pos, int buttonmask) { - if (pb->getRect().contains(pos)) { - Point screenPos = pos.translate(screenRect.tl); - // - Check that the SDesktop doesn't need restarting - if (isRestartRequired()) - restartCore(); - if (ptr) - ptr->pointerEvent(screenPos, buttonmask); - } -} - -void SDisplay::keyEvent(rdr::U32 key, bool down) { - // - Check that the SDesktop doesn't need restarting - if (isRestartRequired()) - restartCore(); - if (kbd) - kbd->keyEvent(key, down); -} - -void SDisplay::clientCutText(const char* text, int len) { - CharArray clip_sz(len+1); - memcpy(clip_sz.buf, text, len); - clip_sz.buf[len] = 0; - clipboard->setClipText(clip_sz.buf); -} - - -void SDisplay::framebufferUpdateRequest() -{ - SetEvent(updateEvent); -} - -Point SDisplay::getFbSize() { - bool startAndStop = !core; - - // If not started, do minimal initialisation to get desktop size. - if (startAndStop) - recreatePixelBuffer(); - Point result = Point(pb->width(), pb->height()); - - // Destroy the initialised structures. - if (startAndStop) - stopCore(); - return result; -} - - -void -SDisplay::notifyClipboardChanged(const char* text, int len) { - vlog.debug("clipboard text changed"); - if (server) - server->serverCutText(text, len); -} - - -void -SDisplay::notifyDisplayEvent(WMMonitor::Notifier::DisplayEventType evt) { - switch (evt) { - case WMMonitor::Notifier::DisplaySizeChanged: - vlog.debug("desktop size changed"); - recreatePixelBuffer(); - break; - case WMMonitor::Notifier::DisplayPixelFormatChanged: - vlog.debug("desktop format changed"); - recreatePixelBuffer(); - break; - case WMMonitor::Notifier::DisplayColourMapChanged: - vlog.debug("desktop colormap changed"); - pb->updateColourMap(); - if (server) - server->setColourMapEntries(); - break; - default: - vlog.error("unknown display event received"); - } -} - -void -SDisplay::processEvent(HANDLE event) { - if (event == updateEvent) { - vlog.write(120, "processEvent"); - ResetEvent(updateEvent); - - // - If the SDisplay isn't even started then quit now - if (!core) { - vlog.error("not start()ed"); - return; - } - - // - Ensure that the disableLocalInputs flag is respected - inputs->blockInputs(disableLocalInputs); - - // - Only process updates if the server is ready - if (server && server->clientsReadyForUpdate()) { - bool try_update = false; - - // - Check that the SDesktop doesn't need restarting - if (isRestartRequired()) { - restartCore(); - return; - } - - // - Flush any updates from the core - try { - core->flushUpdates(); - } catch (rdr::Exception& e) { - vlog.error(e.str()); - restartCore(); - return; - } - - // Ensure the cursor is up to date - WMCursor::Info info = cursor->getCursorInfo(); - if (old_cursor != info) { - // Update the cursor shape if the visibility has changed - bool set_cursor = info.visible != old_cursor.visible; - // OR if the cursor is visible and the shape has changed. - set_cursor |= info.visible && (old_cursor.cursor != info.cursor); - - // Update the cursor shape - if (set_cursor) - pb->setCursor(info.visible ? info.cursor : 0, server); - - // Update the cursor position - // NB: First translate from Screen coordinates to Desktop - Point desktopPos = info.position.translate(screenRect.tl.negate()); - server->setCursorPos(desktopPos); - try_update = true; - - old_cursor = info; - } - - // Flush any changes to the server - try_update = flushChangeTracker() || try_update; - if (try_update) { - server->tryUpdate(); - } - } - return; - } - throw rdr::Exception("No such event"); -} - - -// -=- Protected methods - -void -SDisplay::recreatePixelBuffer(bool force) { - // Open the specified display device - // If no device is specified, open entire screen using GetDC(). - // Opening the whole display with CreateDC doesn't work on multi-monitor - // systems for some reason. - DeviceContext* new_device = 0; - TCharArray deviceName(displayDevice.getData()); - if (deviceName.buf[0]) { - vlog.info("Attaching to device %s", (const char*)CStr(deviceName.buf)); - new_device = new DeviceDC(deviceName.buf); - } - if (!new_device) { - vlog.info("Attaching to virtual desktop"); - new_device = new WindowDC(0); - } - - // Get the coordinates of the specified dispay device - Rect newScreenRect; - if (deviceName.buf[0]) { - MonitorInfo info(CStr(deviceName.buf)); - newScreenRect = Rect(info.rcMonitor.left, info.rcMonitor.top, - info.rcMonitor.right, info.rcMonitor.bottom); - } else { - newScreenRect = new_device->getClipBox(); - } - - // If nothing has changed & a recreate has not been forced, delete - // the new device context and return - if (pb && !force && - newScreenRect.equals(screenRect) && - new_device->getPF().equal(pb->getPF())) { - delete new_device; - return; - } - - // Flush any existing changes to the server - flushChangeTracker(); - - // Delete the old pixelbuffer and device context - vlog.debug("deleting old pixel buffer & device"); - if (pb) - delete pb; - if (device) - delete device; - - // Create a DeviceFrameBuffer attached to the new device - vlog.debug("creating pixel buffer"); - DeviceFrameBuffer* new_buffer = new DeviceFrameBuffer(*new_device); - - // Replace the old PixelBuffer - screenRect = newScreenRect; - pb = new_buffer; - device = new_device; - - // Initialise the pixels - pb->grabRegion(pb->getRect()); - - // Prevent future grabRect operations from throwing exceptions - pb->setIgnoreGrabErrors(true); - - // Update the clipping update tracker - clipper.setClipRect(pb->getRect()); - - // Inform the core of the changes - if (core) - core->setScreenRect(screenRect); - - // Inform the server of the changes - if (server) - server->setPixelBuffer(pb); -} - -bool SDisplay::flushChangeTracker() { - if (updates.is_empty()) - return false; - - vlog.write(120, "flushChangeTracker"); - - // Translate the update coordinates from Screen coords to Desktop - updates.translate(screenRect.tl.negate()); - - // Clip the updates & flush them to the server - updates.copyTo(&clipper); - updates.clear(); - return true; -} diff --git a/rfb_win32/SDisplay.h b/rfb_win32/SDisplay.h deleted file mode 100644 index 6dbb50a5..00000000 --- a/rfb_win32/SDisplay.h +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplay.h -// -// The SDisplay class encapsulates a system display. - -#ifndef __RFB_SDISPLAY_H__ -#define __RFB_SDISPLAY_H__ - -#include <rfb/SDesktop.h> -#include <rfb/UpdateTracker.h> -#include <rfb/Configuration.h> -#include <rfb_win32/Handle.h> -#include <rfb_win32/EventManager.h> -#include <rfb_win32/SInput.h> -#include <rfb_win32/Clipboard.h> -#include <rfb_win32/CleanDesktop.h> -#include <rfb_win32/WMCursor.h> -#include <rfb_win32/WMNotifier.h> -#include <rfb_win32/DeviceFrameBuffer.h> -#include <rfb_win32/DeviceContext.h> - -namespace rfb { - - namespace win32 { - - // - // -=- SDisplay - // - - class SDisplayCore { - public: - virtual ~SDisplayCore() {}; - virtual void setScreenRect(const Rect& screenRect_) = 0; - virtual void flushUpdates() = 0; - virtual const char* methodName() const = 0; - }; - - class SDisplay : public SDesktop, - WMMonitor::Notifier, - Clipboard::Notifier, - public EventHandler - { - public: - SDisplay(); - virtual ~SDisplay(); - - // -=- SDesktop interface - - virtual void start(VNCServer* vs); - virtual void stop(); - virtual void pointerEvent(const Point& pos, int buttonmask); - virtual void keyEvent(rdr::U32 key, bool down); - virtual void clientCutText(const char* str, int len); - virtual void framebufferUpdateRequest(); - virtual Point getFbSize(); - - // -=- Clipboard - - virtual void notifyClipboardChanged(const char* text, int len); - - // -=- Display events - - virtual void notifyDisplayEvent(WMMonitor::Notifier::DisplayEventType evt); - - // -=- EventHandler interface - - HANDLE getUpdateEvent() {return updateEvent;} - virtual void processEvent(HANDLE event); - - // -=- Notification of whether or not SDisplay is started - - void setStatusLocation(bool* status) {statusLocation = status;} - - friend class SDisplayCore; - - static IntParameter updateMethod; - static BoolParameter disableLocalInputs; - static StringParameter disconnectAction; - static BoolParameter removeWallpaper; - static BoolParameter removePattern; - static BoolParameter disableEffects; - - // -=- Use by VNC Config to determine whether hooks, driver, etc are available - static bool areHooksAvailable(); - static bool isDriverAvailable(); - - - protected: - bool isRestartRequired(); - void startCore(); - void stopCore(); - void restartCore(); - void recreatePixelBuffer(bool force=false); - bool flushChangeTracker(); // true if flushed, false if empty - - VNCServer* server; - - // -=- Display pixel buffer - DeviceFrameBuffer* pb; - DeviceContext* device; - - // -=- The coordinates of Window's entire virtual Screen - Rect screenRect; - - // -=- All changes are collected in UN-CLIPPED Display coords and merged - // When they are to be flushed to the VNCServer, they are changed - // to server coords and clipped appropriately. - SimpleUpdateTracker updates; - ClippingUpdateTracker clipper; - - // -=- Internal SDisplay implementation - SDisplayCore* core; - int updateMethod_; - - // Inputs - SPointer* ptr; - SKeyboard* kbd; - Clipboard* clipboard; - WMBlockInput* inputs; - - // Desktop state - WMMonitor* monitor; - - // Desktop optimisation - CleanDesktop* cleanDesktop; - bool isWallpaperRemoved; - bool isPatternRemoved; - bool areEffectsDisabled; - - // Cursor - WMCursor* cursor; - WMCursor::Info old_cursor; - Region old_cursor_region; - Point cursor_renderpos; - - // -=- Event signalled to trigger an update to be flushed - Handle updateEvent; - - // -=- Where to write the active/inactive indicator to - bool* statusLocation; - }; - - } -} - -#endif // __RFB_SDISPLAY_H__ diff --git a/rfb_win32/SDisplayCoreDriver.h b/rfb_win32/SDisplayCoreDriver.h deleted file mode 100644 index 5fea75cc..00000000 --- a/rfb_win32/SDisplayCoreDriver.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplayCoreDriver.h -// -// Placeholder for SDisplayCore mirror-driver implementation. - -#ifndef __RFB_SDISPLAY_CORE_DRIVER_H__ -#define __RFB_SDISPLAY_CORE_DRIVER_H__ - -#include <rfb_win32/SDisplay.h> - -namespace rfb { - namespace win32 { - - class SDisplayCoreDriver: public SDisplayCore { - public: - SDisplayCoreDriver(SDisplay* display, UpdateTracker* ut) { - throw rdr::Exception("Not supported"); - } - - // - Called by SDisplay to inform Core of the screen size - virtual void setScreenRect(const Rect& screenRect_) {} - - // - Called by SDisplay to flush updates to the specified tracker - virtual void flushUpdates() {} - - virtual const char* methodName() const { return "VNC Mirror Driver"; } - - // - Determine whether the display driver is installed & usable - static bool isAvailable() { return false; } - }; - - }; -}; - -#endif diff --git a/rfb_win32/SDisplayCorePolling.cxx b/rfb_win32/SDisplayCorePolling.cxx deleted file mode 100644 index fc57ecd0..00000000 --- a/rfb_win32/SDisplayCorePolling.cxx +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplayCorePolling.cxx - -#include <rfb_win32/SDisplayCorePolling.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("SDisplayCorePolling"); - -const int POLLING_SEGMENTS = 16; - -const int SDisplayCorePolling::pollTimerId = 1; - -SDisplayCorePolling::SDisplayCorePolling(SDisplay* d, UpdateTracker* ut, int pollInterval_) - : MsgWindow(_T("rfb::win32::SDisplayCorePolling")), updateTracker(ut), - pollTimer(getHandle(), pollTimerId), pollNextStrip(false), display(d) { - pollInterval = max(10, (pollInterval_ / POLLING_SEGMENTS)); - copyrect.setUpdateTracker(ut); -} - -SDisplayCorePolling::~SDisplayCorePolling() { -} - -LRESULT SDisplayCorePolling::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg == WM_TIMER && wParam == pollTimerId) { - pollNextStrip = true; - SetEvent(display->getUpdateEvent()); - return 0; - } - return MsgWindow::processMessage(msg, wParam, lParam); -} - -void SDisplayCorePolling::setScreenRect(const Rect& screenRect_) { - vlog.info("setScreenRect"); - screenRect = screenRect_; - pollIncrementY = (screenRect.height()+POLLING_SEGMENTS-1)/POLLING_SEGMENTS; - pollNextY = screenRect.tl.y; - pollTimer.start(pollInterval); -} - -void SDisplayCorePolling::flushUpdates() { - vlog.write(120, "flushUpdates"); - - // Check for window movement - while (copyrect.processEvent()) {} - - if (pollNextStrip) { - // Poll the next strip of the screen (in Screen coordinates) - pollNextStrip = false; - Rect pollrect = screenRect; - if (pollNextY >= pollrect.br.y) { - // Yes. Reset the counter and return - pollNextY = pollrect.tl.y; - } else { - // No. Poll the next section - pollrect.tl.y = pollNextY; - pollNextY += pollIncrementY; - pollrect.br.y = min(pollNextY, pollrect.br.y); - updateTracker->add_changed(pollrect); - } - } -} diff --git a/rfb_win32/SDisplayCorePolling.h b/rfb_win32/SDisplayCorePolling.h deleted file mode 100644 index 9e1b5ad1..00000000 --- a/rfb_win32/SDisplayCorePolling.h +++ /dev/null @@ -1,75 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplayCorePolling.h -// -// SDisplayCore implementation that simply polls the screen, in sections, -// in order to detect changes. This Core will signal the SDisplay's -// updateEvent regularly, causing it to call the Core back to propagate -// changes to the VNC Server. - - -#ifndef __RFB_SDISPLAY_CORE_POLLING_H__ -#define __RFB_SDISPLAY_CORE_POLLING_H__ - -#include <rfb_win32/SDisplay.h> -#include <rfb_win32/IntervalTimer.h> -#include <rfb_win32/WMWindowCopyRect.h> - -namespace rfb { - namespace win32 { - - class SDisplayCorePolling : public SDisplayCore, protected MsgWindow { - public: - SDisplayCorePolling(SDisplay* display, UpdateTracker* ut, int pollIntervalMs=50); - ~SDisplayCorePolling(); - - // - Called by SDisplay to inform Core of the screen size - virtual void setScreenRect(const Rect& screenRect_); - - // - Called by SDisplay to flush updates to the specified tracker - virtual void flushUpdates(); - - virtual const char* methodName() const { return "Polling"; } - - protected: - // - MsgWindow overrides - // processMessage is used to service the cursor & polling timers - virtual LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam); - - // - Hooking subcomponents used to track the desktop state - WMCopyRect copyrect; - - // - Background full screen polling fields - IntervalTimer pollTimer; - static const int pollTimerId; - Rect screenRect; - int pollInterval; - int pollNextY; - int pollIncrementY; - bool pollNextStrip; - - // - Handle back to the owning SDisplay, and to the UpdateTracker to flush to - SDisplay* display; - UpdateTracker* updateTracker; - }; - - }; -}; - -#endif
\ No newline at end of file diff --git a/rfb_win32/SDisplayCoreWMHooks.cxx b/rfb_win32/SDisplayCoreWMHooks.cxx deleted file mode 100644 index 10b88e08..00000000 --- a/rfb_win32/SDisplayCoreWMHooks.cxx +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplayCoreWMHooks.cxx - -#include <rfb_win32/SDisplayCoreWMHooks.h> -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("SDisplayCoreWMHooks"); - -const int SDisplayCoreWMHooks::cursorTimerId = 2; -const int SDisplayCoreWMHooks::consolePollTimerId = 3; - - -SDisplayCoreWMHooks::SDisplayCoreWMHooks(SDisplay* d, UpdateTracker* ut) - : SDisplayCorePolling(d, ut, 5000), - cursorTimer(getHandle(), cursorTimerId), - consolePollTimer(getHandle(), consolePollTimerId), - pollConsoles(false) { - if (!hooks.setEvent(display->getUpdateEvent())) - throw rdr::Exception("hook subsystem failed to initialise"); - poller.setUpdateTracker(updateTracker); - cursorTimer.start(20); - consolePollTimer.start(200); -} - -SDisplayCoreWMHooks::~SDisplayCoreWMHooks() { -} - -LRESULT SDisplayCoreWMHooks::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg == WM_TIMER) { - if (wParam == cursorTimerId) { - SetEvent(display->getUpdateEvent()); - return 0; - } else if (wParam == consolePollTimerId) { - pollConsoles = true; - SetEvent(display->getUpdateEvent()); - return 0; - } - } - return SDisplayCorePolling::processMessage(msg, wParam, lParam); -} - -void SDisplayCoreWMHooks::flushUpdates() { - // Poll any visible console windows - if (pollConsoles) { - pollConsoles = false; - poller.processEvent(); - } - - // Check for updates from the hooks - hooks.getUpdates(updateTracker); - - // Check for updates from the polling Core - SDisplayCorePolling::flushUpdates(); -} diff --git a/rfb_win32/SDisplayCoreWMHooks.h b/rfb_win32/SDisplayCoreWMHooks.h deleted file mode 100644 index 24fa5cdc..00000000 --- a/rfb_win32/SDisplayCoreWMHooks.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SDisplayCoreWMHooks.h -// -// SDisplayCore implementation that uses WMHooks to capture changes to -// the display. -// Whenever changes are detected, the SDisplay's updateEvent is signalled, -// so that it can perform housekeeping tasks (like ensuring the currently -// active desktop is the correct one), before flushing changes from the -// Core to the VNC Server. The SDisplay will clip the changes before they -// reach the VNC Server. - - -#ifndef __RFB_SDISPLAY_CORE_WMHOOKS_H__ -#define __RFB_SDISPLAY_CORE_WMHOOKS_H__ - -#include <rfb_win32/SDisplayCorePolling.h> -#include <rfb_win32/WMHooks.h> -#include <rfb_win32/WMPoller.h> - -namespace rfb { - namespace win32 { - - class SDisplayCoreWMHooks : public SDisplayCorePolling { - public: - SDisplayCoreWMHooks(SDisplay* display, UpdateTracker* ut); - ~SDisplayCoreWMHooks(); - - // - Called by SDisplay to flush updates to the specified tracker - virtual void flushUpdates(); - - virtual const char* methodName() const { return "VNC Hooks"; } - - protected: - // - MsgWindow overrides - // processMessage is used to service the cursor & polling timers - virtual LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam); - - // - Hooking subcomponents used to track the desktop state - WMHooks hooks; - WMPoller poller; - IntervalTimer cursorTimer; - IntervalTimer consolePollTimer; - bool pollConsoles; - static const int consolePollTimerId; - static const int cursorTimerId; - }; - - }; -}; - -#endif diff --git a/rfb_win32/SFileTransferManagerWin32.cxx b/rfb_win32/SFileTransferManagerWin32.cxx deleted file mode 100644 index edc898be..00000000 --- a/rfb_win32/SFileTransferManagerWin32.cxx +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- SFileTransferManagerWin32.cxx - -#include <rfb_win32/SFileTransferManagerWin32.h> - -using namespace rfb; -using namespace win32; - -SFileTransferManagerWin32::SFileTransferManagerWin32() -{ - -} - -SFileTransferManagerWin32::~SFileTransferManagerWin32() -{ - -} - -SFileTransfer * -SFileTransferManagerWin32::createObject(network::Socket *sock) -{ - rfb::SFileTransfer *pFT = 0; - rfb::win32::SFileTransferWin32 *pFTWin32 = 0; - - pFTWin32 = new SFileTransferWin32(sock); - if (pFTWin32 == NULL) return NULL; - - pFT = (SFileTransfer *) pFTWin32; - - m_lstFTObjects.push_front(pFT); - - return pFT; -} - -void -SFileTransferManagerWin32::processDownloadMsg(MSG msg) -{ - SFileTransfer *pFT = (SFileTransfer *)msg.lParam; - - if (pFT != NULL) { - std::list<SFileTransfer*>::iterator i; - for (i=m_lstFTObjects.begin(); i!=m_lstFTObjects.end(); i++) { - if ((*i) == pFT) { - (*i)->sendFileDownloadPortion(); - return; - } - } - } -} diff --git a/rfb_win32/SFileTransferManagerWin32.h b/rfb_win32/SFileTransferManagerWin32.h deleted file mode 100644 index ed1f997a..00000000 --- a/rfb_win32/SFileTransferManagerWin32.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- SFileTransferManagerWin32.h - -#ifndef __RFB_WIN32_SFILETRANSFERMANAGERWIN32_H__ -#define __RFB_WIN32_SFILETRANSFERMANAGERWIN32_H__ - -#include <rfb/SFileTransfer.h> -#include <rfb/SFileTransferManager.h> -#include <rfb_win32/SFileTransferWin32.h> - -namespace rfb { - namespace win32 { - class SFileTransferManagerWin32 : public rfb::SFileTransferManager - { - public: - SFileTransferManagerWin32(); - virtual ~SFileTransferManagerWin32(); - - void processDownloadMsg(MSG msg); - - virtual SFileTransfer *createObject(network::Socket *sock); - }; - }; -} - -#endif // __RFB_WIN32_SFILETRANSFERMANAGERWIN32_H__ diff --git a/rfb_win32/SFileTransferWin32.cxx b/rfb_win32/SFileTransferWin32.cxx deleted file mode 100644 index 5aea4126..00000000 --- a/rfb_win32/SFileTransferWin32.cxx +++ /dev/null @@ -1,125 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- SFileTransferWin32.cxx - -#include <rfb/msgTypes.h> -#include <rfb_win32/FolderManager.h> -#include <rfb_win32/SFileTransferWin32.h> - -using namespace rfb; -using namespace rfb::win32; - -SFileTransferWin32::SFileTransferWin32(network::Socket *sock) : SFileTransfer(sock) -{ -} - -SFileTransferWin32::~SFileTransferWin32() -{ -} - -bool -SFileTransferWin32::initDownloadCallback() -{ - PostThreadMessage(GetCurrentThreadId(), VNCM_FT_DOWNLOAD, (WPARAM) 0, (LPARAM) this); - return true; -} - -bool -SFileTransferWin32::processDownloadCallback() -{ - return sendFileDownloadPortion(); -} - -bool -SFileTransferWin32::convertPathFromNet(char *pszPath) -{ - int len = strlen(pszPath); - if (pszPath[0] == '/') { - if (len == 1) { - pszPath[0] = '\0'; - return true; - } - } else { - return false; - } - - for(int i = 0; i < (len - 1); i++) { - if(pszPath[i+1] == '/') pszPath[i+1] = '\\'; - pszPath[i] = pszPath[i+1]; - } - - pszPath[len-1] = '\0'; - return true; -} - -bool -SFileTransferWin32::makeFileList(char *pszPath, FileInfo *pFI, bool bDirOnly) -{ - FolderManager fm; - if (fm.getDirInfo(pszPath, pFI, bDirOnly)) - return true; - else - return false; -} - -bool -SFileTransferWin32::deleteIt(char *pszPath) -{ - FolderManager fm; - - return fm.deleteIt(pszPath); -} - -bool -SFileTransferWin32::renameIt(char *pszOldPath, char *pszNewPath) -{ - FolderManager fm; - - return fm.renameIt(pszOldPath, pszNewPath); -} - -bool -SFileTransferWin32::createDir(char *pszPath) -{ - FolderManager fm; - - return fm.createDir(pszPath); -} - -bool -SFileTransferWin32::getDirSize(char *pszName, unsigned short *pHighSize16, - unsigned int *pLowSize32) -{ - FolderManager fm; - DWORD64 dw64DirSize = 0; - - if (!fm.getDirSize(pszName, &dw64DirSize)) return false; - - if (dw64DirSize & 0xFFFF000000000000) return false; - - *pHighSize16 = ((dw64DirSize & 0x0000FFFF00000000) >> 32); - *pLowSize32 = (dw64DirSize & 0x00000000FFFFFFFF); - - return true; -} diff --git a/rfb_win32/SFileTransferWin32.h b/rfb_win32/SFileTransferWin32.h deleted file mode 100644 index 5f682a44..00000000 --- a/rfb_win32/SFileTransferWin32.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * Developed by Dennis Syrovatsky. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- SFileTransferWin32.h - -#ifndef __RFB_SFILETRANSFERWIN32_H__ -#define __RFB_SFILETRANSFERWIN32_H__ - -#include <windows.h> - -#include <rfb/SFileTransfer.h> - -const UINT VNCM_FT_DOWNLOAD = WM_USER + 2; - -namespace rfb { - namespace win32 { - class SFileTransferWin32 : public rfb::SFileTransfer - { - public: - SFileTransferWin32(network::Socket *sock); - virtual ~SFileTransferWin32(); - - bool processDownloadCallback(); - virtual bool initDownloadCallback(); - - virtual bool convertPathFromNet(char *pszPath); - virtual bool makeFileList(char *pszPath, FileInfo *pFI, bool bDirOnly); - - virtual bool deleteIt(char *pszPath); - virtual bool renameIt(char *pszOldPath, char *pszNewPath); - virtual bool createDir(char *pszPath); - - virtual bool getDirSize(char *pszName, unsigned short *pHighSize16, unsigned int *pLowSize32); - - }; - }; -} - -#endif // __RFB_SFILETRANSFERWIN32_H__ diff --git a/rfb_win32/SInput.cxx b/rfb_win32/SInput.cxx deleted file mode 100644 index db59287a..00000000 --- a/rfb_win32/SInput.cxx +++ /dev/null @@ -1,466 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SInput.cxx -// -// A number of routines that accept VNC input event data and perform -// the appropriate actions under Win32 - -#define XK_MISCELLANY -#define XK_LATIN1 -#define XK_CURRENCY -#include <rfb/keysymdef.h> - -#include <tchar.h> -#include <rfb_win32/SInput.h> -#include <rfb_win32/MonitorInfo.h> -#include <rfb_win32/Service.h> -#include <rfb_win32/OSVersion.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/keymap.h> -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> - -#if(defined(INPUT_MOUSE) && defined(RFB_HAVE_MONITORINFO)) -#define RFB_HAVE_SENDINPUT -#else -#pragma message(" NOTE: Not building SendInput support.") -#endif - -using namespace rfb; - -static LogWriter vlog("SInput"); - -#ifdef RFB_HAVE_SENDINPUT -typedef UINT (WINAPI *_SendInput_proto)(UINT, LPINPUT, int); -static win32::DynamicFn<_SendInput_proto> _SendInput(_T("user32.dll"), "SendInput"); -#endif - -// -// -=- Pointer implementation for Win32 -// - -static DWORD buttonDownMapping[8] = { - MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN, - MOUSEEVENTF_WHEEL, MOUSEEVENTF_WHEEL, 0, 0, 0 -}; - -static DWORD buttonUpMapping[8] = { - MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP, - MOUSEEVENTF_WHEEL, MOUSEEVENTF_WHEEL, 0, 0, 0 -}; - -static DWORD buttonDataMapping[8] = { - 0, 0, 0, 120, -120, 0, 0, 0 -}; - -win32::SPointer::SPointer() - : last_buttonmask(0) -{ -} - -void -win32::SPointer::pointerEvent(const Point& pos, int buttonmask) -{ - // - We are specifying absolute coordinates - DWORD flags = MOUSEEVENTF_ABSOLUTE; - - // - Has the pointer moved since the last event? - if (!last_position.equals(pos)) - flags |= MOUSEEVENTF_MOVE; - - // - If the system swaps left and right mouse buttons then we must - // swap them here to negate the effect, so that we do the actual - // action we mean to do - if (::GetSystemMetrics(SM_SWAPBUTTON)) { - bool leftDown = buttonmask & 1; - bool rightDown = buttonmask & 4; - buttonmask = (buttonmask & ~(1 | 4)); - if (leftDown) buttonmask |= 4; - if (rightDown) buttonmask |= 1; - } - - DWORD data = 0; - for (int i = 0; i < 8; i++) { - if ((buttonmask & (1<<i)) != (last_buttonmask & (1<<i))) { - if (buttonmask & (1<<i)) { - flags |= buttonDownMapping[i]; - if (buttonDataMapping[i]) { - if (data) vlog.info("warning - two buttons set mouse_event data field"); - data = buttonDataMapping[i]; - } - } else { - flags |= buttonUpMapping[i]; - } - } - } - - last_position = pos; - last_buttonmask = buttonmask; - - Rect primaryDisplay(0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN)); - if (primaryDisplay.contains(pos)) { - // mouse_event wants coordinates specified as a proportion of the - // primary display's size, scaled to the range 0 to 65535 - Point scaled; - scaled.x = (pos.x * 65535) / (primaryDisplay.width()-1); - scaled.y = (pos.y * 65535) / (primaryDisplay.height()-1); - ::mouse_event(flags, scaled.x, scaled.y, data, 0); - } else { - // The event lies outside the primary monitor. Under Win2K, we can just use - // SendInput, which allows us to provide coordinates scaled to the virtual desktop. - // SendInput is available on all multi-monitor-aware platforms. -#ifdef RFB_HAVE_SENDINPUT - if (osVersion.isPlatformNT) { - if (!_SendInput.isValid()) - throw rdr::Exception("SendInput not available"); - INPUT evt; - evt.type = INPUT_MOUSE; - Point vPos(pos.x-GetSystemMetrics(SM_XVIRTUALSCREEN), - pos.y-GetSystemMetrics(SM_YVIRTUALSCREEN)); - evt.mi.dx = (vPos.x * 65535) / (GetSystemMetrics(SM_CXVIRTUALSCREEN)-1); - evt.mi.dy = (vPos.y * 65535) / (GetSystemMetrics(SM_CYVIRTUALSCREEN)-1); - evt.mi.dwFlags = flags | MOUSEEVENTF_VIRTUALDESK; - evt.mi.dwExtraInfo = 0; - evt.mi.mouseData = data; - evt.mi.time = 0; - if ((*_SendInput)(1, &evt, sizeof(evt)) != 1) - throw rdr::SystemException("SendInput", GetLastError()); - } else { - // Under Win9x, this is not addressable by either mouse_event or SendInput - // *** STUPID KLUDGY HACK *** - POINT cursorPos; GetCursorPos(&cursorPos); - ULONG oldSpeed, newSpeed = 10; - ULONG mouseInfo[3]; - if (flags & MOUSEEVENTF_MOVE) { - flags &= ~MOUSEEVENTF_ABSOLUTE; - SystemParametersInfo(SPI_GETMOUSE, 0, &mouseInfo, 0); - SystemParametersInfo(SPI_GETMOUSESPEED, 0, &oldSpeed, 0); - vlog.debug("SPI_GETMOUSE %d, %d, %d, speed %d", mouseInfo[0], mouseInfo[1], mouseInfo[2], oldSpeed); - ULONG idealMouseInfo[] = {10, 0, 0}; - SystemParametersInfo(SPI_SETMOUSESPEED, 0, &newSpeed, 0); - SystemParametersInfo(SPI_SETMOUSE, 0, &idealMouseInfo, 0); - } - ::mouse_event(flags, pos.x-cursorPos.x, pos.y-cursorPos.y, data, 0); - if (flags & MOUSEEVENTF_MOVE) { - SystemParametersInfo(SPI_SETMOUSE, 0, &mouseInfo, 0); - SystemParametersInfo(SPI_SETMOUSESPEED, 0, &oldSpeed, 0); - } - } -#endif - } -} - -// -// -=- Keyboard implementation -// - -BoolParameter rfb::win32::SKeyboard::deadKeyAware("DeadKeyAware", - "Whether to assume the viewer has already interpreted dead key sequences " - "into latin-1 characters", true); - -static bool oneShift; - -// The keysymToAscii table transforms a couple of awkward keysyms into their -// ASCII equivalents. -struct keysymToAscii_t { - rdr::U32 keysym; - rdr::U8 ascii; -}; - -keysymToAscii_t keysymToAscii[] = { - { XK_KP_Space, ' ' }, - { XK_KP_Equal, '=' }, -}; - -rdr::U8 latin1DeadChars[] = { - XK_grave, XK_acute, XK_asciicircum, XK_diaeresis, XK_degree, XK_cedilla, - XK_asciitilde -}; - -struct latin1ToDeadChars_t { - rdr::U8 latin1Char; - rdr::U8 deadChar; - rdr::U8 baseChar; -}; - -latin1ToDeadChars_t latin1ToDeadChars[] = { - - { XK_Agrave, XK_grave, XK_A }, - { XK_Egrave, XK_grave, XK_E }, - { XK_Igrave, XK_grave, XK_I }, - { XK_Ograve, XK_grave, XK_O }, - { XK_Ugrave, XK_grave, XK_U }, - { XK_agrave, XK_grave, XK_a }, - { XK_egrave, XK_grave, XK_e }, - { XK_igrave, XK_grave, XK_i }, - { XK_ograve, XK_grave, XK_o}, - { XK_ugrave, XK_grave, XK_u }, - - { XK_Aacute, XK_acute, XK_A }, - { XK_Eacute, XK_acute, XK_E }, - { XK_Iacute, XK_acute, XK_I }, - { XK_Oacute, XK_acute, XK_O }, - { XK_Uacute, XK_acute, XK_U }, - { XK_Yacute, XK_acute, XK_Y }, - { XK_aacute, XK_acute, XK_a }, - { XK_eacute, XK_acute, XK_e }, - { XK_iacute, XK_acute, XK_i }, - { XK_oacute, XK_acute, XK_o}, - { XK_uacute, XK_acute, XK_u }, - { XK_yacute, XK_acute, XK_y }, - - { XK_Acircumflex, XK_asciicircum, XK_A }, - { XK_Ecircumflex, XK_asciicircum, XK_E }, - { XK_Icircumflex, XK_asciicircum, XK_I }, - { XK_Ocircumflex, XK_asciicircum, XK_O }, - { XK_Ucircumflex, XK_asciicircum, XK_U }, - { XK_acircumflex, XK_asciicircum, XK_a }, - { XK_ecircumflex, XK_asciicircum, XK_e }, - { XK_icircumflex, XK_asciicircum, XK_i }, - { XK_ocircumflex, XK_asciicircum, XK_o}, - { XK_ucircumflex, XK_asciicircum, XK_u }, - - { XK_Adiaeresis, XK_diaeresis, XK_A }, - { XK_Ediaeresis, XK_diaeresis, XK_E }, - { XK_Idiaeresis, XK_diaeresis, XK_I }, - { XK_Odiaeresis, XK_diaeresis, XK_O }, - { XK_Udiaeresis, XK_diaeresis, XK_U }, - { XK_adiaeresis, XK_diaeresis, XK_a }, - { XK_ediaeresis, XK_diaeresis, XK_e }, - { XK_idiaeresis, XK_diaeresis, XK_i }, - { XK_odiaeresis, XK_diaeresis, XK_o}, - { XK_udiaeresis, XK_diaeresis, XK_u }, - { XK_ydiaeresis, XK_diaeresis, XK_y }, - - { XK_Aring, XK_degree, XK_A }, - { XK_aring, XK_degree, XK_a }, - - { XK_Ccedilla, XK_cedilla, XK_C }, - { XK_ccedilla, XK_cedilla, XK_c }, - - { XK_Atilde, XK_asciitilde, XK_A }, - { XK_Ntilde, XK_asciitilde, XK_N }, - { XK_Otilde, XK_asciitilde, XK_O }, - { XK_atilde, XK_asciitilde, XK_a }, - { XK_ntilde, XK_asciitilde, XK_n }, - { XK_otilde, XK_asciitilde, XK_o }, -}; - -// doKeyboardEvent wraps the system keybd_event function and attempts to find -// the appropriate scancode corresponding to the supplied virtual keycode. - -inline void doKeyboardEvent(BYTE vkCode, DWORD flags) { - vlog.debug("vkCode 0x%x flags 0x%x", vkCode, flags); - keybd_event(vkCode, MapVirtualKey(vkCode, 0), flags, 0); -} - -// KeyStateModifier is a class which helps simplify generating a "fake" press -// or release of shift, ctrl, alt, etc. An instance of the class is created -// for every key which may need to be pressed or released. Then either press() -// or release() may be called to make sure that the corresponding key is in the -// right state. The destructor of the class automatically reverts to the -// previous state. - -class KeyStateModifier { -public: - KeyStateModifier(int vkCode_, int flags_=0) - : vkCode(vkCode_), flags(flags_), pressed(false), released(false) - {} - void press() { - if (!(GetAsyncKeyState(vkCode) & 0x8000)) { - doKeyboardEvent(vkCode, flags); - pressed = true; - } - } - void release() { - if (GetAsyncKeyState(vkCode) & 0x8000) { - doKeyboardEvent(vkCode, flags | KEYEVENTF_KEYUP); - released = true; - } - } - ~KeyStateModifier() { - if (pressed) { - doKeyboardEvent(vkCode, flags | KEYEVENTF_KEYUP); - } else if (released) { - doKeyboardEvent(vkCode, flags); - } - } - int vkCode; - int flags; - bool pressed; - bool released; -}; - - -// doKeyEventWithModifiers() generates a key event having first "pressed" or -// "released" the shift, ctrl or alt modifiers if necessary. - -void doKeyEventWithModifiers(BYTE vkCode, BYTE modifierState, bool down) -{ - KeyStateModifier ctrl(VK_CONTROL); - KeyStateModifier alt(VK_MENU); - KeyStateModifier shift(VK_SHIFT); - - if (down) { - if (modifierState & 2) ctrl.press(); - if (modifierState & 4) alt.press(); - if (modifierState & 1) { - shift.press(); - } else { - shift.release(); - } - } - doKeyboardEvent(vkCode, down ? 0 : KEYEVENTF_KEYUP); -} - - -win32::SKeyboard::SKeyboard() -{ - oneShift = rfb::win32::osVersion.isPlatformWindows; - for (int i = 0; i < sizeof(keymap) / sizeof(keymap_t); i++) { - vkMap[keymap[i].keysym] = keymap[i].vk; - extendedMap[keymap[i].keysym] = keymap[i].extended; - } - - // Find dead characters for the current keyboard layout - // XXX how could we handle the keyboard layout changing? - BYTE keystate[256]; - memset(keystate, 0, 256); - for (int j = 0; j < sizeof(latin1DeadChars); j++) { - SHORT s = VkKeyScan(latin1DeadChars[j]); - if (s != -1) { - BYTE vkCode = LOBYTE(s); - BYTE modifierState = HIBYTE(s); - keystate[VK_SHIFT] = (modifierState & 1) ? 0x80 : 0; - keystate[VK_CONTROL] = (modifierState & 2) ? 0x80 : 0; - keystate[VK_MENU] = (modifierState & 4) ? 0x80 : 0; - rdr::U8 chars[2]; - int nchars = ToAscii(vkCode, 0, keystate, (WORD*)&chars, 0); - if (nchars < 0) { - vlog.debug("Found dead key 0x%x '%c'", - latin1DeadChars[j], latin1DeadChars[j]); - deadChars.push_back(latin1DeadChars[j]); - ToAscii(vkCode, 0, keystate, (WORD*)&chars, 0); - } - } - } -} - - -void win32::SKeyboard::keyEvent(rdr::U32 keysym, bool down) -{ - for (int i = 0; i < sizeof(keysymToAscii) / sizeof(keysymToAscii_t); i++) { - if (keysymToAscii[i].keysym == keysym) { - keysym = keysymToAscii[i].ascii; - break; - } - } - - if ((keysym >= 32 && keysym <= 126) || - (keysym >= 160 && keysym <= 255)) - { - // ordinary Latin-1 character - - if (deadKeyAware) { - // Detect dead chars and generate the dead char followed by space so - // that we'll end up with the original char. - for (int i = 0; i < deadChars.size(); i++) { - if (keysym == deadChars[i]) { - SHORT dc = VkKeyScan(keysym); - if (dc != -1) { - if (down) { - vlog.info("latin-1 dead key: 0x%x vkCode 0x%x mod 0x%x " - "followed by space", keysym, LOBYTE(dc), HIBYTE(dc)); - doKeyEventWithModifiers(LOBYTE(dc), HIBYTE(dc), true); - doKeyEventWithModifiers(LOBYTE(dc), HIBYTE(dc), false); - doKeyEventWithModifiers(VK_SPACE, 0, true); - doKeyEventWithModifiers(VK_SPACE, 0, false); - } - return; - } - } - } - } - - SHORT s = VkKeyScan(keysym); - if (s == -1) { - if (down) { - // not a single keypress - try synthesizing dead chars. - for (int j = 0; - j < sizeof(latin1ToDeadChars) / sizeof(latin1ToDeadChars_t); - j++) { - if (keysym == latin1ToDeadChars[j].latin1Char) { - for (int i = 0; i < deadChars.size(); i++) { - if (deadChars[i] == latin1ToDeadChars[j].deadChar) { - SHORT dc = VkKeyScan(latin1ToDeadChars[j].deadChar); - SHORT bc = VkKeyScan(latin1ToDeadChars[j].baseChar); - if (dc != -1 && bc != -1) { - vlog.info("latin-1 key: 0x%x dead key vkCode 0x%x mod 0x%x " - "followed by vkCode 0x%x mod 0x%x", - keysym, LOBYTE(dc), HIBYTE(dc), - LOBYTE(bc), HIBYTE(bc)); - doKeyEventWithModifiers(LOBYTE(dc), HIBYTE(dc), true); - doKeyEventWithModifiers(LOBYTE(dc), HIBYTE(dc), false); - doKeyEventWithModifiers(LOBYTE(bc), HIBYTE(bc), true); - doKeyEventWithModifiers(LOBYTE(bc), HIBYTE(bc), false); - return; - } - break; - } - } - break; - } - } - vlog.info("ignoring unrecognised Latin-1 keysym 0x%x",keysym); - } - return; - } - - BYTE vkCode = LOBYTE(s); - BYTE modifierState = HIBYTE(s); - vlog.debug("latin-1 key: 0x%x vkCode 0x%x mod 0x%x down %d", - keysym, vkCode, modifierState, down); - doKeyEventWithModifiers(vkCode, modifierState, down); - - } else { - - // see if it's a recognised keyboard key, otherwise ignore it - - if (vkMap.find(keysym) == vkMap.end()) { - vlog.info("ignoring unknown keysym 0x%x",keysym); - return; - } - BYTE vkCode = vkMap[keysym]; - DWORD flags = 0; - if (extendedMap[keysym]) flags |= KEYEVENTF_EXTENDEDKEY; - if (!down) flags |= KEYEVENTF_KEYUP; - - vlog.debug("keyboard key: keysym 0x%x vkCode 0x%x ext %d down %d", - keysym, vkCode, extendedMap[keysym], down); - if (down && (vkCode == VK_DELETE) && - ((GetAsyncKeyState(VK_CONTROL) & 0x8000) != 0) && - ((GetAsyncKeyState(VK_MENU) & 0x8000) != 0)) - { - rfb::win32::emulateCtrlAltDel(); - return; - } - - doKeyboardEvent(vkCode, flags); - } -} diff --git a/rfb_win32/SInput.h b/rfb_win32/SInput.h deleted file mode 100644 index 2a0b3e67..00000000 --- a/rfb_win32/SInput.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Input.h -// -// A number of routines that accept VNC-style input event data and perform -// the appropriate actions under Win32 - -#ifndef __RFB_WIN32_INPUT_H__ -#define __RFB_WIN32_INPUT_H__ - -#include <rfb/Rect.h> -#include <rfb/Configuration.h> -#include <rdr/types.h> -#include <map> -#include <vector> - -namespace rfb { - - namespace win32 { - - // -=- Pointer event handling - - class SPointer { - public: - SPointer(); - // - Create a pointer event at a the given coordinates, with the - // specified button state. The event must be specified using - // Screen coordinates. - void pointerEvent(const Point& pos, int buttonmask); - protected: - Point last_position; - rdr::U8 last_buttonmask; - }; - - // -=- Keyboard event handling - - class SKeyboard { - public: - SKeyboard(); - void keyEvent(rdr::U32 key, bool down); - static BoolParameter deadKeyAware; - private: - std::map<rdr::U32,rdr::U8> vkMap; - std::map<rdr::U32,bool> extendedMap; - std::vector<rdr::U8> deadChars; - }; - - }; // win32 - -}; // rfb - -#endif // __RFB_WIN32_INPUT_H__ diff --git a/rfb_win32/ScaledDIBSectionBuffer.cxx b/rfb_win32/ScaledDIBSectionBuffer.cxx deleted file mode 100644 index bd6b4d37..00000000 --- a/rfb_win32/ScaledDIBSectionBuffer.cxx +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- ScaledDIBSectionBuffer.cxx - -#include <math.h> - -#include <rfb_win32/ScaledDIBSectionBuffer.h> - -using namespace rfb; -using namespace win32; - -ScaledDIBSectionBuffer::ScaledDIBSectionBuffer(HWND window) - : src_buffer(0), scaling(false), DIBSectionBuffer(window) { - scaled_data = data; -} - -ScaledDIBSectionBuffer::~ScaledDIBSectionBuffer() { - if (src_buffer) delete src_buffer; -} - -void ScaledDIBSectionBuffer::setScale(int scale_) { - if (scale_ == getScale()) return; - - if (scale_ != 100) { - scaling = true; - if (!src_buffer) { - src_buffer = new ManagedPixelBuffer(format, src_width, src_height); - src_data = &(src_buffer->data); - } - } else { - scaling = false; - if (src_buffer) delete src_buffer; - src_buffer = 0; - src_data = 0; - } - ScaledPixelBuffer::setScale(scale_); - recreateScaledBuffer(); -} - -void ScaledDIBSectionBuffer::setPF(const PixelFormat &pf_) { - if (scaling) { - ScaledPixelBuffer::setPF(pf_); - src_buffer->setPF(pf_); - } - DIBSectionBuffer::setPF(pf_); - scaled_data = data; -} - -void ScaledDIBSectionBuffer::setSize(int src_width_, int src_height_) { - src_width = src_width_; - src_height = src_height_; - if (scaling) { - src_buffer->setSize(src_width, src_height); - } - calculateScaledBufferSize(); - recreateScaledBuffer(); - scaled_data = data; -} - -void ScaledDIBSectionBuffer::recreateScaledBuffer() { - width_ = scaled_width; - height_ = scaled_height; - DIBSectionBuffer::recreateBuffer(); - scaled_data = data; -} - -void ScaledDIBSectionBuffer::fillRect(const Rect &dest, Pixel pix) { - if (scaling) { - src_buffer->fillRect(dest, pix); - scaleRect(dest); - } else { - DIBSectionBuffer::fillRect(dest, pix); - } -} - -void ScaledDIBSectionBuffer::imageRect(const Rect &dest, const void* pixels, int stride) { - if (scaling) { - src_buffer->imageRect(dest, pixels, stride); - scaleRect(dest); - } else { - DIBSectionBuffer::imageRect(dest, pixels, stride); - } -} - -void ScaledDIBSectionBuffer::copyRect(const Rect &dest, const Point &move_by_delta) { - if (scaling) { - src_buffer->copyRect(dest, move_by_delta); - scaleRect(dest); - } else { - DIBSectionBuffer::copyRect(dest, move_by_delta); - } -} - -void ScaledDIBSectionBuffer::maskRect(const Rect& r, const void* pixels, const void* mask_) { - if (scaling) { - src_buffer->maskRect(r, pixels, mask_); - scaleRect(r); - } else { - DIBSectionBuffer::maskRect(r, pixels, mask_); - } -} - -void ScaledDIBSectionBuffer::maskRect(const Rect& r, Pixel pixel, const void* mask_) { - if (scaling) { - src_buffer->maskRect(r, pixel, mask_); - scaleRect(r); - } else { - DIBSectionBuffer::maskRect(r, pixel, mask_); - } -} diff --git a/rfb_win32/ScaledDIBSectionBuffer.h b/rfb_win32/ScaledDIBSectionBuffer.h deleted file mode 100644 index 3cc267b2..00000000 --- a/rfb_win32/ScaledDIBSectionBuffer.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright (C) 2006 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - * - * TightVNC distribution homepage on the Web: http://www.tightvnc.com/ - * - */ - -// -=- ScaledDIBSectionBuffer.h - -#ifndef __RFB_WIN32_SCALED_DIB_SECTION_BUFFER_H__ -#define __RFB_WIN32_SCALED_DIB_SECTION_BUFFER_H__ - -#include <rfb/ScaledPixelBuffer.h> - -#include <rfb_win32/DIBSectionBuffer.h> - -namespace rfb { - - namespace win32 { - - // - // -=- ScaledDIBSectionBuffer - // - - class ScaledDIBSectionBuffer : public ScaledPixelBuffer, public DIBSectionBuffer { - public: - ScaledDIBSectionBuffer(HWND window); - virtual ~ScaledDIBSectionBuffer(); - - int width() const { return scaled_width; } - int height() const { return scaled_height; } - bool isScaling() const { return scaling; } - - virtual void setPF(const PixelFormat &pf); - virtual void setSize(int w, int h); - virtual void setScale(int scale); - - Rect getRect() const { return ScaledPixelBuffer::getRect(); } - Rect getRect(const Point& pos) const { return ScaledPixelBuffer::getRect(pos); } - - // -=- Overrides basic rendering operations of - // FullFramePixelBuffer class - - virtual void fillRect(const Rect &dest, Pixel pix); - virtual void imageRect(const Rect &dest, const void* pixels, int stride=0); - virtual void copyRect(const Rect &dest, const Point &move_by_delta); - virtual void maskRect(const Rect& r, const void* pixels, const void* mask_); - virtual void maskRect(const Rect& r, Pixel pixel, const void* mask_); - - protected: - virtual void recreateScaledBuffer(); - virtual void recreateBuffer() { - recreateScaledBuffer(); - }; - - ManagedPixelBuffer *src_buffer; - bool scaling; - }; - - }; - -}; - -#endif // __RFB_WIN32_SCALED_DIB_SECTION_BUFFER_H__ diff --git a/rfb_win32/Security.cxx b/rfb_win32/Security.cxx deleted file mode 100644 index 985f00cb..00000000 --- a/rfb_win32/Security.cxx +++ /dev/null @@ -1,192 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Security.cxx - -#include <rfb_win32/Security.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb/LogWriter.h> - -#include <lmcons.h> -#include <Accctrl.h> -#include <list> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("SecurityWin32"); - - -Trustee::Trustee(const TCHAR* name, - TRUSTEE_FORM form, - TRUSTEE_TYPE type) { - pMultipleTrustee = 0; - MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE; - TrusteeForm = form; - TrusteeType = type; - ptstrName = (TCHAR*)name; -} - - -ExplicitAccess::ExplicitAccess(const TCHAR* name, - TRUSTEE_FORM type, - DWORD perms, - ACCESS_MODE mode, - DWORD inherit) { - Trustee = rfb::win32::Trustee(name, type); - grfAccessPermissions = perms; - grfAccessMode = mode; - grfInheritance = inherit; -} - - -AccessEntries::AccessEntries() : entries(0), entry_count(0) {} - -AccessEntries::~AccessEntries() { - delete [] entries; -} - -void AccessEntries::allocMinEntries(int count) { - if (count > entry_count) { - EXPLICIT_ACCESS* new_entries = new EXPLICIT_ACCESS[entry_count+1]; - if (entries) { - memcpy(new_entries, entries, sizeof(EXPLICIT_ACCESS) * entry_count); - delete entries; - } - entries = new_entries; - } -} - -void AccessEntries::addEntry(const TCHAR* trusteeName, - DWORD permissions, - ACCESS_MODE mode) { - allocMinEntries(entry_count+1); - ZeroMemory(&entries[entry_count], sizeof(EXPLICIT_ACCESS)); - entries[entry_count] = ExplicitAccess(trusteeName, TRUSTEE_IS_NAME, permissions, mode); - entry_count++; -} - -void AccessEntries::addEntry(const PSID sid, - DWORD permissions, - ACCESS_MODE mode) { - allocMinEntries(entry_count+1); - ZeroMemory(&entries[entry_count], sizeof(EXPLICIT_ACCESS)); - entries[entry_count] = ExplicitAccess((TCHAR*)sid, TRUSTEE_IS_SID, permissions, mode); - entry_count++; -} - - -PSID Sid::copySID(const PSID sid) { - if (!IsValidSid(sid)) - throw rdr::Exception("invalid SID in copyPSID"); - PSID buf = (PSID)new rdr::U8[GetLengthSid(sid)]; - if (!CopySid(GetLengthSid(sid), buf, sid)) - throw rdr::SystemException("CopySid failed", GetLastError()); - return buf; -} - -void Sid::setSID(const PSID sid) { - delete [] buf; - buf = (rdr::U8*)copySID(sid); -} - -void Sid::getUserNameAndDomain(TCHAR** name, TCHAR** domain) { - DWORD nameLen = 0; - DWORD domainLen = 0; - SID_NAME_USE use; - LookupAccountSid(0, (PSID)buf, 0, &nameLen, 0, &domainLen, &use); - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - throw rdr::SystemException("Unable to determine SID name lengths", GetLastError()); - vlog.info("nameLen=%d, domainLen=%d, use=%d", nameLen, domainLen, use); - *name = new TCHAR[nameLen]; - *domain = new TCHAR[domainLen]; - if (!LookupAccountSid(0, (PSID)buf, *name, &nameLen, *domain, &domainLen, &use)) - throw rdr::SystemException("Unable to lookup account SID", GetLastError()); -} - - -Sid::Administrators::Administrators() { - PSID sid = 0; - SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY; - if (!AllocateAndInitializeSid(&ntAuth, 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, &sid)) - throw rdr::SystemException("Sid::Administrators", GetLastError()); - setSID(sid); - FreeSid(sid); -} - -Sid::SYSTEM::SYSTEM() { - PSID sid = 0; - SID_IDENTIFIER_AUTHORITY ntAuth = SECURITY_NT_AUTHORITY; - if (!AllocateAndInitializeSid(&ntAuth, 1, - SECURITY_LOCAL_SYSTEM_RID, - 0, 0, 0, 0, 0, 0, 0, &sid)) - throw rdr::SystemException("Sid::SYSTEM", GetLastError()); - setSID(sid); - FreeSid(sid); -} - -Sid::FromToken::FromToken(HANDLE h) { - DWORD required = 0; - GetTokenInformation(h, TokenUser, 0, 0, &required); - rdr::U8Array tmp(required); - if (!GetTokenInformation(h, TokenUser, tmp.buf, required, &required)) - throw rdr::SystemException("GetTokenInformation", GetLastError()); - TOKEN_USER* tokenUser = (TOKEN_USER*)tmp.buf; - setSID(tokenUser->User.Sid); -} - - -PACL rfb::win32::CreateACL(const AccessEntries& ae, PACL existing_acl) { - typedef DWORD (WINAPI *_SetEntriesInAcl_proto) (ULONG, PEXPLICIT_ACCESS, PACL, PACL*); -#ifdef UNICODE - const char* fnName = "SetEntriesInAclW"; -#else - const char* fnName = "SetEntriesInAclA"; -#endif - DynamicFn<_SetEntriesInAcl_proto> _SetEntriesInAcl(_T("advapi32.dll"), fnName); - if (!_SetEntriesInAcl.isValid()) - throw rdr::SystemException("CreateACL failed; no SetEntriesInAcl", ERROR_CALL_NOT_IMPLEMENTED); - PACL new_dacl; - DWORD result; - if ((result = (*_SetEntriesInAcl)(ae.entry_count, ae.entries, existing_acl, &new_dacl)) != ERROR_SUCCESS) - throw rdr::SystemException("SetEntriesInAcl", result); - return new_dacl; -} - - -PSECURITY_DESCRIPTOR rfb::win32::CreateSdWithDacl(const PACL dacl) { - SECURITY_DESCRIPTOR absSD; - if (!InitializeSecurityDescriptor(&absSD, SECURITY_DESCRIPTOR_REVISION)) - throw rdr::SystemException("InitializeSecurityDescriptor", GetLastError()); - Sid::SYSTEM owner; - if (!SetSecurityDescriptorOwner(&absSD, owner, FALSE)) - throw rdr::SystemException("SetSecurityDescriptorOwner", GetLastError()); - Sid::Administrators group; - if (!SetSecurityDescriptorGroup(&absSD, group, FALSE)) - throw rdr::SystemException("SetSecurityDescriptorGroupp", GetLastError()); - if (!SetSecurityDescriptorDacl(&absSD, TRUE, dacl, FALSE)) - throw rdr::SystemException("SetSecurityDescriptorDacl", GetLastError()); - DWORD sdSize = GetSecurityDescriptorLength(&absSD); - SecurityDescriptorPtr sd(sdSize); - if (!MakeSelfRelativeSD(&absSD, sd, &sdSize)) - throw rdr::SystemException("MakeSelfRelativeSD", GetLastError()); - return sd.takeSD(); -} diff --git a/rfb_win32/Security.h b/rfb_win32/Security.h deleted file mode 100644 index 1e2e9068..00000000 --- a/rfb_win32/Security.h +++ /dev/null @@ -1,123 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Security.h - -// Wrapper classes for a few Windows NT security structures/functions -// that are used by VNC - -#ifndef __RFB_WIN32_SECURITY_H__ -#define __RFB_WIN32_SECURITY_H__ - -#include <rdr/types.h> -#include <rfb_win32/LocalMem.h> -#include <rfb_win32/TCharArray.h> -#include <aclapi.h> - -namespace rfb { - - namespace win32 { - - struct Trustee : public TRUSTEE { - Trustee(const TCHAR* name, - TRUSTEE_FORM form=TRUSTEE_IS_NAME, - TRUSTEE_TYPE type=TRUSTEE_IS_UNKNOWN); - }; - - struct ExplicitAccess : public EXPLICIT_ACCESS { - ExplicitAccess(const TCHAR* name, - TRUSTEE_FORM type, - DWORD perms, - ACCESS_MODE mode, - DWORD inherit=0); - }; - - // Helper class for building access control lists - struct AccessEntries { - AccessEntries(); - ~AccessEntries(); - void allocMinEntries(int count); - void addEntry(const TCHAR* trusteeName, - DWORD permissions, - ACCESS_MODE mode); - void addEntry(const PSID sid, - DWORD permissions, - ACCESS_MODE mode); - - EXPLICIT_ACCESS* entries; - int entry_count; - }; - - // Helper class for handling SIDs - struct Sid : rdr::U8Array { - Sid() {} - operator PSID() const {return (PSID)buf;} - PSID takePSID() {PSID r = (PSID)buf; buf = 0; return r;} - - static PSID copySID(const PSID sid); - - void setSID(const PSID sid); - - void getUserNameAndDomain(TCHAR** name, TCHAR** domain); - - struct Administrators; - struct SYSTEM; - struct FromToken; - - private: - Sid(const Sid&); - Sid& operator=(const Sid&); - }; - - struct Sid::Administrators : public Sid { - Administrators(); - }; - struct Sid::SYSTEM : public Sid { - SYSTEM(); - }; - struct Sid::FromToken : public Sid { - FromToken(HANDLE h); - }; - - // Helper class for handling & freeing ACLs - struct AccessControlList : public LocalMem { - AccessControlList(int size) : LocalMem(size) {} - AccessControlList(PACL acl_=0) : LocalMem(acl_) {} - operator PACL() {return (PACL)ptr;} - }; - - // Create a new ACL based on supplied entries and, if supplied, existing ACL - PACL CreateACL(const AccessEntries& ae, PACL existing_acl=0); - - // Helper class for memory-management of self-relative SecurityDescriptors - struct SecurityDescriptorPtr : LocalMem { - SecurityDescriptorPtr(int size) : LocalMem(size) {} - SecurityDescriptorPtr(PSECURITY_DESCRIPTOR sd_=0) : LocalMem(sd_) {} - PSECURITY_DESCRIPTOR takeSD() {return takePtr();} - }; - - // Create a new self-relative Security Descriptor, owned by SYSTEM/Administrators, - // with the supplied DACL and no SACL. The returned value can be assigned - // to a SecurityDescriptorPtr to be managed. - PSECURITY_DESCRIPTOR CreateSdWithDacl(const PACL dacl); - - } - -} - -#endif diff --git a/rfb_win32/Service.cxx b/rfb_win32/Service.cxx deleted file mode 100644 index 2b11a22d..00000000 --- a/rfb_win32/Service.cxx +++ /dev/null @@ -1,645 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Service.cxx - -#include <rfb_win32/Service.h> -#include <rfb_win32/MsgWindow.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/ModuleFileName.h> -#include <rfb_win32/Registry.h> -#include <rfb_win32/OSVersion.h> -#include <rfb/Threading.h> -#include <logmessages/messages.h> -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> - - -using namespace rdr; -using namespace rfb; -using namespace win32; - -static LogWriter vlog("Service"); - - -// - Internal service implementation functions - -Service* service = 0; - -VOID WINAPI serviceHandler(DWORD control) { - switch (control) { - case SERVICE_CONTROL_INTERROGATE: - vlog.info("cmd: report status"); - service->setStatus(); - return; - case SERVICE_CONTROL_PARAMCHANGE: - vlog.info("cmd: param change"); - service->readParams(); - return; - case SERVICE_CONTROL_SHUTDOWN: - vlog.info("cmd: OS shutdown"); - service->osShuttingDown(); - return; - case SERVICE_CONTROL_STOP: - vlog.info("cmd: stop"); - service->setStatus(SERVICE_STOP_PENDING); - service->stop(); - return; - }; - vlog.debug("cmd: unknown %lu", control); -} - - -// -=- Message window derived class used under Win9x to implement stopService - -#define WM_SMSG_SERVICE_STOP WM_USER - -class ServiceMsgWindow : public MsgWindow { -public: - ServiceMsgWindow(const TCHAR* name) : MsgWindow(name) {} - LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - switch (msg) { - case WM_SMSG_SERVICE_STOP: - service->stop(); - return TRUE; - } - return MsgWindow::processMessage(msg, wParam, lParam); - } - - static const TCHAR* baseName; -}; - -const TCHAR* ServiceMsgWindow::baseName = _T("ServiceWindow:"); - - -// -=- Service main procedure, used under WinNT/2K/XP by the SCM - -VOID WINAPI serviceProc(DWORD dwArgc, LPTSTR* lpszArgv) { - vlog.debug("entering %s serviceProc", service->getName()); - vlog.info("registering handler..."); - service->status_handle = RegisterServiceCtrlHandler(service->getName(), serviceHandler); - if (!service->status_handle) { - DWORD err = GetLastError(); - vlog.error("failed to register handler: %lu", err); - ExitProcess(err); - } - vlog.debug("registered handler (%lx)", service->status_handle); - service->setStatus(SERVICE_START_PENDING); - vlog.debug("entering %s serviceMain", service->getName()); - service->status.dwWin32ExitCode = service->serviceMain(dwArgc, lpszArgv); - vlog.debug("leaving %s serviceMain", service->getName()); - service->setStatus(SERVICE_STOPPED); -} - - -// -=- Service - -Service::Service(const TCHAR* name_) : name(name_) { - vlog.debug("Service"); - status_handle = 0; - status.dwControlsAccepted = SERVICE_CONTROL_INTERROGATE | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP; - status.dwServiceType = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS; - status.dwWin32ExitCode = NO_ERROR; - status.dwServiceSpecificExitCode = 0; - status.dwCheckPoint = 0; - status.dwWaitHint = 30000; - status.dwCurrentState = SERVICE_STOPPED; -} - -void -Service::start() { - if (osVersion.isPlatformNT) { - SERVICE_TABLE_ENTRY entry[2]; - entry[0].lpServiceName = (TCHAR*)name; - entry[0].lpServiceProc = serviceProc; - entry[1].lpServiceName = NULL; - entry[1].lpServiceProc = NULL; - vlog.debug("entering dispatcher"); - if (!SetProcessShutdownParameters(0x100, 0)) - vlog.error("unable to set shutdown parameters: %d", GetLastError()); - service = this; - if (!StartServiceCtrlDispatcher(entry)) - throw SystemException("unable to start service", GetLastError()); - } else { - - // - Create the service window, so the service can be stopped - TCharArray wndName(_tcslen(getName()) + _tcslen(ServiceMsgWindow::baseName) + 1); - _tcscpy(wndName.buf, ServiceMsgWindow::baseName); - _tcscat(wndName.buf, getName()); - ServiceMsgWindow service_window(wndName.buf); - - // - Locate the RegisterServiceProcess function - typedef DWORD (WINAPI * _RegisterServiceProcess_proto)(DWORD, DWORD); - DynamicFn<_RegisterServiceProcess_proto> _RegisterServiceProcess(_T("kernel32.dll"), "RegisterServiceProcess"); - if (!_RegisterServiceProcess.isValid()) - throw Exception("unable to find RegisterServiceProcess"); - - // - Run the service - (*_RegisterServiceProcess)(NULL, 1); - service = this; - serviceMain(0, 0); - (*_RegisterServiceProcess)(NULL, 0); - } -} - -void -Service::setStatus() { - setStatus(status.dwCurrentState); -} - -void -Service::setStatus(DWORD state) { - if (!osVersion.isPlatformNT) - return; - if (status_handle == 0) { - vlog.debug("warning - cannot setStatus"); - return; - } - status.dwCurrentState = state; - status.dwCheckPoint++; - if (!SetServiceStatus(status_handle, &status)) { - status.dwCurrentState = SERVICE_STOPPED; - status.dwWin32ExitCode = GetLastError(); - vlog.error("unable to set service status:%u", status.dwWin32ExitCode); - } - vlog.debug("set status to %u(%u)", state, status.dwCheckPoint); -} - -Service::~Service() { - vlog.debug("~Service"); - service = 0; -} - - -// Find out whether this process is running as the WinVNC service -bool thisIsService() { - return service && (service->status.dwCurrentState != SERVICE_STOPPED); -} - - -// -=- Desktop handling code - -// Switch the current thread to the specified desktop -static bool -switchToDesktop(HDESK desktop) { - HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); - if (!SetThreadDesktop(desktop)) { - vlog.debug("switchToDesktop failed:%u", GetLastError()); - return false; - } - if (!CloseDesktop(old_desktop)) - vlog.debug("unable to close old desktop:%u", GetLastError()); - return true; -} - -// Determine whether the thread's current desktop is the input one -static bool -inputDesktopSelected() { - HDESK current = GetThreadDesktop(GetCurrentThreadId()); - HDESK input = OpenInputDesktop(0, FALSE, - DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); - if (!input) { - vlog.debug("unable to OpenInputDesktop(1):%u", GetLastError()); - return false; - } - - DWORD size; - char currentname[256]; - char inputname[256]; - - if (!GetUserObjectInformation(current, UOI_NAME, currentname, 256, &size)) { - vlog.debug("unable to GetUserObjectInformation(1):%u", GetLastError()); - CloseDesktop(input); - return false; - } - if (!GetUserObjectInformation(input, UOI_NAME, inputname, 256, &size)) { - vlog.debug("unable to GetUserObjectInformation(2):%u", GetLastError()); - CloseDesktop(input); - return false; - } - if (!CloseDesktop(input)) - vlog.debug("unable to close input desktop:%u", GetLastError()); - - // *** vlog.debug("current=%s, input=%s", currentname, inputname); - bool result = strcmp(currentname, inputname) == 0; - return result; -} - -// Switch the current thread into the input desktop -static bool -selectInputDesktop() { - // - Open the input desktop - HDESK desktop = OpenInputDesktop(0, FALSE, - DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | GENERIC_WRITE); - if (!desktop) { - vlog.debug("unable to OpenInputDesktop(2):%u", GetLastError()); - return false; - } - - // - Switch into it - if (!switchToDesktop(desktop)) { - CloseDesktop(desktop); - return false; - } - - // *** - DWORD size = 256; - char currentname[256]; - if (GetUserObjectInformation(desktop, UOI_NAME, currentname, 256, &size)) { - vlog.debug("switched to %s", currentname); - } - // *** - - vlog.debug("switched to input desktop"); - - return true; -} - - -// -=- Access points to desktop-switching routines - -bool -rfb::win32::desktopChangeRequired() { - if (!osVersion.isPlatformNT) - return false; - - return !inputDesktopSelected(); -} - -bool -rfb::win32::changeDesktop() { - if (!osVersion.isPlatformNT) - return true; - if (osVersion.cannotSwitchDesktop) - return false; - - return selectInputDesktop(); -} - - -// -=- Ctrl-Alt-Del emulation - -class CADThread : public Thread { -public: - CADThread() : Thread("CtrlAltDel Emulator"), result(false) {} - virtual void run() { - HDESK old_desktop = GetThreadDesktop(GetCurrentThreadId()); - - if (switchToDesktop(OpenDesktop(_T("Winlogon"), 0, FALSE, DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | - DESKTOP_ENUMERATE | DESKTOP_HOOKCONTROL | - DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS | - DESKTOP_SWITCHDESKTOP | GENERIC_WRITE))) { - PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE)); - switchToDesktop(old_desktop); - result = true; - } - } - bool result; -}; - -bool -rfb::win32::emulateCtrlAltDel() { - if (!osVersion.isPlatformNT) - return false; - - CADThread* cad_thread = new CADThread(); - vlog.debug("emulate Ctrl-Alt-Del"); - if (cad_thread) { - cad_thread->start(); - cad_thread->join(); - bool result = cad_thread->result; - delete cad_thread; - return result; - } - return false; -} - - -// -=- Application Event Log target Logger class - -class Logger_EventLog : public Logger { -public: - Logger_EventLog(const TCHAR* srcname) : Logger("EventLog") { - eventlog = RegisterEventSource(NULL, srcname); - if (!eventlog) - printf("Unable to open event log:%ld\n", GetLastError()); - } - ~Logger_EventLog() { - if (eventlog) - DeregisterEventSource(eventlog); - } - - virtual void write(int level, const char *logname, const char *message) { - if (!eventlog) return; - TStr log(logname), msg(message); - const TCHAR* strings[] = {log, msg}; - WORD type = EVENTLOG_INFORMATION_TYPE; - if (level == 0) type = EVENTLOG_ERROR_TYPE; - if (!ReportEvent(eventlog, type, 0, VNC4LogMessage, NULL, 2, 0, strings, NULL)) { - // *** It's not at all clear what is the correct behaviour if this fails... - printf("ReportEvent failed:%ld\n", GetLastError()); - } - } - -protected: - HANDLE eventlog; -}; - -static Logger_EventLog* logger = 0; - -bool rfb::win32::initEventLogLogger(const TCHAR* srcname) { - if (logger) - return false; - if (osVersion.isPlatformNT) { - logger = new Logger_EventLog(srcname); - logger->registerLogger(); - return true; - } else { - return false; - } -} - - -// -=- Registering and unregistering the service - -bool rfb::win32::registerService(const TCHAR* name, const TCHAR* desc, - int argc, const char* argv[]) { - - // - Initialise the default service parameters - const TCHAR* defaultcmdline; - if (osVersion.isPlatformNT) - defaultcmdline = _T("-service"); - else - defaultcmdline = _T("-noconsole -service"); - - // - Get the full pathname of our executable - ModuleFileName buffer; - - // - Calculate the command-line length - int cmdline_len = _tcslen(buffer.buf) + 4; - int i; - for (i=0; i<argc; i++) { - cmdline_len += strlen(argv[i]) + 3; - } - - // - Add the supplied extra parameters to the command line - TCharArray cmdline(cmdline_len+_tcslen(defaultcmdline)); - _stprintf(cmdline.buf, _T("\"%s\" %s"), buffer.buf, defaultcmdline); - for (i=0; i<argc; i++) { - _tcscat(cmdline.buf, _T(" \"")); - _tcscat(cmdline.buf, TStr(argv[i])); - _tcscat(cmdline.buf, _T("\"")); - } - - // - Register the service - - if (osVersion.isPlatformNT) { - - // - Open the SCM - ServiceHandle scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); - if (!scm) - throw rdr::SystemException("unable to open Service Control Manager", GetLastError()); - - - ServiceHandle service = CreateService(scm, - name, desc, SC_MANAGER_ALL_ACCESS, - SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, - SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, - cmdline.buf, NULL, NULL, NULL, NULL, NULL); - if (!service) - throw rdr::SystemException("unable to create service", GetLastError()); - - // - Register the event log source - RegKey hk, hk2; - - hk2.createKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application")); - hk.createKey(hk2, name); - - for (i=_tcslen(buffer.buf); i>0; i--) { - if (buffer.buf[i] == _T('\\')) { - buffer.buf[i+1] = 0; - break; - } - } - - const TCHAR* dllFilename = _T("logmessages.dll"); - TCharArray dllPath(_tcslen(buffer.buf) + _tcslen(dllFilename) + 1); - _tcscpy(dllPath.buf, buffer.buf); - _tcscat(dllPath.buf, dllFilename); - - hk.setExpandString(_T("EventMessageFile"), dllPath.buf); - hk.setInt(_T("TypesSupported"), EVENTLOG_ERROR_TYPE | EVENTLOG_INFORMATION_TYPE); - - } else { - - RegKey services; - services.createKey(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices")); - services.setString(name, cmdline.buf); - - } - - Sleep(500); - - return true; -} - -bool rfb::win32::unregisterService(const TCHAR* name) { - if (osVersion.isPlatformNT) { - - // - Open the SCM - ServiceHandle scm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); - if (!scm) - throw rdr::SystemException("unable to open Service Control Manager", GetLastError()); - - // - Create the service - ServiceHandle service = OpenService(scm, name, SC_MANAGER_ALL_ACCESS); - if (!service) - throw rdr::SystemException("unable to locate the service", GetLastError()); - if (!DeleteService(service)) - throw rdr::SystemException("unable to remove the service", GetLastError()); - - // - Register the event log source - RegKey hk; - hk.openKey(HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application")); - hk.deleteKey(name); - - } else { - - RegKey services; - services.openKey(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices")); - services.deleteValue(name); - - } - - Sleep(500); - - return true; -} - - -// -=- Starting and stopping the service - -HWND findServiceWindow(const TCHAR* name) { - TCharArray wndName(_tcslen(ServiceMsgWindow::baseName)+_tcslen(name)+1); - _tcscpy(wndName.buf, ServiceMsgWindow::baseName); - _tcscat(wndName.buf, name); - vlog.debug("searching for %s window", CStr(wndName.buf)); - return FindWindow(0, wndName.buf); -} - -bool rfb::win32::startService(const TCHAR* name) { - - if (osVersion.isPlatformNT) { - // - Open the SCM - ServiceHandle scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if (!scm) - throw rdr::SystemException("unable to open Service Control Manager", GetLastError()); - - // - Locate the service - ServiceHandle service = OpenService(scm, name, SERVICE_START); - if (!service) - throw rdr::SystemException("unable to open the service", GetLastError()); - - // - Start the service - if (!StartService(service, 0, NULL)) - throw rdr::SystemException("unable to start the service", GetLastError()); - } else { - // - Check there is no service window - if (findServiceWindow(name)) - throw rdr::Exception("the service is already running"); - - // - Find the RunServices registry key - RegKey services; - services.openKey(HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\RunServices")); - - // - Read the command-line from it - TCharArray cmdLine = services.getString(name); - - // - Start the service - PROCESS_INFORMATION proc_info; - STARTUPINFO startup_info; - ZeroMemory(&startup_info, sizeof(startup_info)); - startup_info.cb = sizeof(startup_info); - if (!CreateProcess(0, cmdLine.buf, 0, 0, FALSE, CREATE_NEW_CONSOLE, 0, 0, &startup_info, &proc_info)) { - throw SystemException("unable to start service", GetLastError()); - } - } - - Sleep(500); - - return true; -} - -bool rfb::win32::stopService(const TCHAR* name) { - if (osVersion.isPlatformNT) { - // - Open the SCM - ServiceHandle scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if (!scm) - throw rdr::SystemException("unable to open Service Control Manager", GetLastError()); - - // - Locate the service - ServiceHandle service = OpenService(scm, name, SERVICE_STOP); - if (!service) - throw rdr::SystemException("unable to open the service", GetLastError()); - - // - Start the service - SERVICE_STATUS status; - if (!ControlService(service, SERVICE_CONTROL_STOP, &status)) - throw rdr::SystemException("unable to stop the service", GetLastError()); - - } else { - // - Find the service window - HWND service_window = findServiceWindow(name); - if (!service_window) - throw Exception("unable to locate running service"); - - // Tell it to quit - vlog.debug("sending service stop request"); - if (!SendMessage(service_window, WM_SMSG_SERVICE_STOP, 0, 0)) - throw Exception("unable to stop service"); - - // Check it's quitting... - DWORD process_id = 0; - HANDLE process = 0; - if (!GetWindowThreadProcessId(service_window, &process_id)) - throw SystemException("unable to verify service has quit", GetLastError()); - process = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, process_id); - if (!process) - throw SystemException("unable to obtain service handle", GetLastError()); - int retries = 5; - vlog.debug("checking status"); - while (retries-- && (WaitForSingleObject(process, 1000) != WAIT_OBJECT_0)) {} - if (!retries) { - vlog.debug("failed to quit - terminating"); - // May not have quit because of silly Win9x registry watching bug.. - if (!TerminateProcess(process, 1)) - throw SystemException("unable to terminate process!", GetLastError()); - throw Exception("service failed to quit - called TerminateProcess"); - } - } - - Sleep(500); - - return true; -} - -DWORD rfb::win32::getServiceState(const TCHAR* name) { - if (osVersion.isPlatformNT) { - // - Open the SCM - ServiceHandle scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if (!scm) - throw rdr::SystemException("unable to open Service Control Manager", GetLastError()); - - // - Locate the service - ServiceHandle service = OpenService(scm, name, SERVICE_INTERROGATE); - if (!service) - throw rdr::SystemException("unable to open the service", GetLastError()); - - // - Get the service status - SERVICE_STATUS status; - if (!ControlService(service, SERVICE_CONTROL_INTERROGATE, (SERVICE_STATUS*)&status)) - throw rdr::SystemException("unable to query the service", GetLastError()); - - return status.dwCurrentState; - } else { - HWND service_window = findServiceWindow(name); - return service_window ? SERVICE_RUNNING : SERVICE_STOPPED; - } -} - -char* rfb::win32::serviceStateName(DWORD state) { - switch (state) { - case SERVICE_RUNNING: return strDup("Running"); - case SERVICE_STOPPED: return strDup("Stopped"); - case SERVICE_STOP_PENDING: return strDup("Stopping"); - }; - CharArray tmp(32); - sprintf(tmp.buf, "Unknown (%lu)", state); - return tmp.takeBuf(); -} - - -bool rfb::win32::isServiceProcess() { - return service != 0; -} diff --git a/rfb_win32/Service.h b/rfb_win32/Service.h deleted file mode 100644 index 00abe108..00000000 --- a/rfb_win32/Service.h +++ /dev/null @@ -1,128 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Service.h -// -// Win32 service-mode code. -// Derive your service from this code and let it handle the annoying Win32 -// service API. -// The underlying implementation takes care of the differences between -// Windows NT and Windows 95 based systems - -#ifndef __RFB_WIN32_SERVICE_H__ -#define __RFB_WIN32_SERVICE_H__ - -#include <windows.h> - -namespace rfb { - - namespace win32 { - - // - // -=- Service - // - - // Application base-class for services. - - class Service { - public: - - Service(const TCHAR* name_); - virtual ~Service(); - - const TCHAR* getName() {return name;} - SERVICE_STATUS& getStatus() {return status;} - - void setStatus(DWORD status); - void setStatus(); - - // - Start the service, having initialised it - void start(); - - // - Service main procedure - override to implement a service - virtual DWORD serviceMain(int argc, TCHAR* argv[]) = 0; - - // - Service control notifications - - // To get notified when the OS is shutting down - virtual void osShuttingDown() {}; - - // To get notified when the service parameters change - virtual void readParams() {}; - - // To cause the serviceMain() routine to return - virtual void stop() {}; - - public: - SERVICE_STATUS_HANDLE status_handle; - SERVICE_STATUS status; - protected: - const TCHAR* name; - }; - - class ServiceHandle { - public: - ServiceHandle(SC_HANDLE h) : handle(h) {} - ~ServiceHandle() {CloseServiceHandle(handle);} - operator SC_HANDLE() const {return handle;} - protected: - SC_HANDLE handle; - }; - - // -=- Routines used by desktop back-end code to manage desktops/window stations - - // Returns false under Win9x - bool desktopChangeRequired(); - - // Returns true under Win9x - bool changeDesktop(); - - // -=- Routines used by the SInput Keyboard class to emulate Ctrl-Alt-Del - // Returns false under Win9x - bool emulateCtrlAltDel(); - - // -=- Routines to initialise the Event Log target Logger - // Returns false under Win9x - bool initEventLogLogger(const TCHAR* srcname); - - // -=- Routines to register/unregister the service - // These routines also take care of registering the required - // event source information, etc. - // *** should really accept TCHAR argv - - bool registerService(const TCHAR* name, const TCHAR* desc, int argc, const char* argv[]); - bool unregisterService(const TCHAR* name); - - bool startService(const TCHAR* name); - bool stopService(const TCHAR* name); - - // -=- Get the state of the named service (one of the NT service state values) - DWORD getServiceState(const TCHAR* name); - - // -=- Convert a supplied service state value to a printable string e.g. Running, Stopped... - // The caller must delete the returned string buffer - char* serviceStateName(DWORD state); - - // -=- Routine to determine whether the host process is running a service - bool isServiceProcess(); - - }; - -}; - -#endif // __RFB_WIN32_SERVICE_NT_H__ diff --git a/rfb_win32/SocketManager.cxx b/rfb_win32/SocketManager.cxx deleted file mode 100644 index 1d52bc86..00000000 --- a/rfb_win32/SocketManager.cxx +++ /dev/null @@ -1,213 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SocketManager.cxx - -#include <winsock2.h> -#include <list> -#include <rfb/LogWriter.h> -#include <rfb_win32/SocketManager.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("SocketManager"); - - -// -=- SocketManager - -SocketManager::SocketManager() { -} - -SocketManager::~SocketManager() { -} - - -static requestAddressChangeEvents(network::SocketListener* sock_) { - DWORD dummy = 0; - if (WSAIoctl(sock_->getFd(), SIO_ADDRESS_LIST_CHANGE, 0, 0, 0, 0, &dummy, 0, 0) == SOCKET_ERROR) { - DWORD err = WSAGetLastError(); - if (err != WSAEWOULDBLOCK) - vlog.error("Unable to track address changes", err); - } -} - - -void SocketManager::addListener(network::SocketListener* sock_, - network::SocketServer* srvr, - AddressChangeNotifier* acn) { - WSAEVENT event = WSACreateEvent(); - long flags = FD_ACCEPT | FD_CLOSE; - if (acn) - flags |= FD_ADDRESS_LIST_CHANGE; - try { - if (event && (WSAEventSelect(sock_->getFd(), event, flags) == SOCKET_ERROR)) - throw rdr::SystemException("Unable to select on listener", WSAGetLastError()); - - // requestAddressChangeEvents MUST happen after WSAEventSelect, so that the socket is non-blocking - if (acn) - requestAddressChangeEvents(sock_); - - // addEvent is the last thing we do, so that the event is NOT registered if previous steps fail - if (!event || !addEvent(event, this)) - throw rdr::Exception("Unable to add listener"); - } catch (rdr::Exception& e) { - if (event) - WSACloseEvent(event); - delete sock_; - vlog.error(e.str()); - throw; - } - - ListenInfo li; - li.sock = sock_; - li.server = srvr; - li.notifier = acn; - listeners[event] = li; -} - -void SocketManager::remListener(network::SocketListener* sock) { - std::map<HANDLE,ListenInfo>::iterator i; - for (i=listeners.begin(); i!=listeners.end(); i++) { - if (i->second.sock == sock) { - removeEvent(i->first); - WSACloseEvent(i->first); - delete sock; - listeners.erase(i); - return; - } - } - throw rdr::Exception("Listener not registered"); -} - - -void SocketManager::addSocket(network::Socket* sock_, network::SocketServer* srvr, bool outgoing) { - WSAEVENT event = WSACreateEvent(); - if (!event || !addEvent(event, this) || - (WSAEventSelect(sock_->getFd(), event, FD_READ | FD_CLOSE) == SOCKET_ERROR)) { - if (event) - WSACloseEvent(event); - delete sock_; - vlog.error("Unable to add connection"); - return; - } - ConnInfo ci; - ci.sock = sock_; - ci.server = srvr; - connections[event] = ci; - srvr->addSocket(sock_, outgoing); -} - -void SocketManager::remSocket(network::Socket* sock_) { - std::map<HANDLE,ConnInfo>::iterator i; - for (i=connections.begin(); i!=connections.end(); i++) { - if (i->second.sock == sock_) { - i->second.server->removeSocket(sock_); - removeEvent(i->first); - WSACloseEvent(i->first); - delete sock_; - connections.erase(i); - return; - } - } - throw rdr::Exception("Socket not registered"); -} - - -int SocketManager::checkTimeouts() { - network::SocketServer* server = 0; - int timeout = EventManager::checkTimeouts(); - - std::map<HANDLE,ListenInfo>::iterator i; - for (i=listeners.begin(); i!=listeners.end(); i++) - soonestTimeout(&timeout, i->second.server->checkTimeouts()); - - std::list<network::Socket*> shutdownSocks; - std::map<HANDLE,ConnInfo>::iterator j, j_next; - for (j=connections.begin(); j!=connections.end(); j=j_next) { - j_next = j; j_next++; - if (j->second.sock->isShutdown()) - shutdownSocks.push_back(j->second.sock); - } - - std::list<network::Socket*>::iterator k; - for (k=shutdownSocks.begin(); k!=shutdownSocks.end(); k++) - remSocket(*k); - - return timeout; -} - - -void SocketManager::processEvent(HANDLE event) { - if (listeners.count(event)) { - ListenInfo li = listeners[event]; - - // Accept an incoming connection - vlog.debug("accepting incoming connection"); - - // What kind of event is this? - WSANETWORKEVENTS network_events; - WSAEnumNetworkEvents(li.sock->getFd(), event, &network_events); - if (network_events.lNetworkEvents & FD_ACCEPT) { - network::Socket* new_sock = li.sock->accept(); - if (new_sock && li.server->getDisable()) { - delete new_sock; - new_sock = 0; - } - if (new_sock) - addSocket(new_sock, li.server, false); - } else if (network_events.lNetworkEvents & FD_CLOSE) { - vlog.info("deleting listening socket"); - remListener(li.sock); - } else if (network_events.lNetworkEvents & FD_ADDRESS_LIST_CHANGE) { - li.notifier->processAddressChange(li.sock); - DWORD dummy = 0; - requestAddressChangeEvents(li.sock); - } else { - vlog.error("unknown listener event: %lx", network_events.lNetworkEvents); - } - } else if (connections.count(event)) { - ConnInfo ci = connections[event]; - - try { - // Process data from an active connection - - // Cancel event notification for this socket - if (WSAEventSelect(ci.sock->getFd(), event, 0) == SOCKET_ERROR) - throw rdr::SystemException("unable to disable WSAEventSelect:%u", WSAGetLastError()); - - // Reset the event object - WSAResetEvent(event); - - // Call the socket server to process the event - ci.server->processSocketEvent(ci.sock); - if (ci.sock->isShutdown()) { - remSocket(ci.sock); - return; - } - - // Re-instate the required socket event - // If the read event is still valid, the event object gets set here - if (WSAEventSelect(ci.sock->getFd(), event, FD_READ | FD_CLOSE) == SOCKET_ERROR) - throw rdr::SystemException("unable to re-enable WSAEventSelect:%u", WSAGetLastError()); - } catch (rdr::Exception& e) { - vlog.error(e.str()); - remSocket(ci.sock); - } - } -} diff --git a/rfb_win32/SocketManager.h b/rfb_win32/SocketManager.h deleted file mode 100644 index ef359749..00000000 --- a/rfb_win32/SocketManager.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- SocketManager.h - -// Socket manager class for Win32. -// Passed a network::SocketListener and a network::SocketServer when -// constructed. Uses WSAAsyncSelect to get notifications of network -// connection attempts. When an incoming connection is received, -// the manager will call network::SocketServer::addClient(). If -// addClient returns true then the manager registers interest in -// network events on that socket, and calls -// network::SocketServer::processSocketEvent(). - -#ifndef __RFB_WIN32_SOCKET_MGR_H__ -#define __RFB_WIN32_SOCKET_MGR_H__ - -#include <map> -#include <network/Socket.h> -#include <rfb_win32/EventManager.h> - -namespace rfb { - namespace win32 { - - class SocketManager : public EventManager, EventHandler { - public: - SocketManager(); - virtual ~SocketManager(); - - // AddressChangeNotifier callback interface - // If an object implementing this is passed to addListener then it will be - // called whenever the SocketListener's address list changes - class AddressChangeNotifier { - public: - virtual ~AddressChangeNotifier() {} - virtual void processAddressChange(network::SocketListener* sl) = 0; - }; - - // Add a listening socket. Incoming connections will be added to the supplied - // SocketServer. - void addListener(network::SocketListener* sock_, - network::SocketServer* srvr, - AddressChangeNotifier* acn = 0); - - // Remove and delete a listening socket. - void remListener(network::SocketListener* sock); - - // Add an already-connected socket. Socket events will cause the supplied - // SocketServer to be called. The socket must ALREADY BE REGISTERED with - // the SocketServer. - void addSocket(network::Socket* sock_, network::SocketServer* srvr, bool outgoing=true); - - protected: - virtual int checkTimeouts(); - virtual void processEvent(HANDLE event); - virtual void remSocket(network::Socket* sock); - - struct ConnInfo { - network::Socket* sock; - network::SocketServer* server; - }; - struct ListenInfo { - network::SocketListener* sock; - network::SocketServer* server; - AddressChangeNotifier* notifier; - }; - std::map<HANDLE, ListenInfo> listeners; - std::map<HANDLE, ConnInfo> connections; - }; - - } - -} - -#endif diff --git a/rfb_win32/TCharArray.cxx b/rfb_win32/TCharArray.cxx deleted file mode 100644 index fd4c0783..00000000 --- a/rfb_win32/TCharArray.cxx +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - WCHAR* wstrDup(const WCHAR* s) { - if (!s) return 0; - WCHAR* t = new WCHAR[wcslen(s)+1]; - memcpy(t, s, sizeof(WCHAR)*(wcslen(s)+1)); - return t; - } - void wstrFree(WCHAR* s) {delete [] s;} - - char* strDup(const WCHAR* s) { - if (!s) return 0; - int len = wcslen(s); - char* t = new char[len+1]; - t[WideCharToMultiByte(CP_ACP, 0, s, len, t, len, 0, 0)] = 0; - return t; - } - - WCHAR* wstrDup(const char* s) { - if (!s) return 0; - int len = strlen(s); - WCHAR* t = new WCHAR[len+1]; - t[MultiByteToWideChar(CP_ACP, 0, s, len, t, len)] = 0; - return t; - } - - - bool wstrSplit(const WCHAR* src, const WCHAR limiter, WCHAR** out1, WCHAR** out2, bool fromEnd) { - WCharArray out1old, out2old; - if (out1) out1old.buf = *out1; - if (out2) out2old.buf = *out2; - int len = wcslen(src); - int i=0, increment=1, limit=len; - if (fromEnd) { - i=len-1; increment = -1; limit = -1; - } - while (i!=limit) { - if (src[i] == limiter) { - if (out1) { - *out1 = new WCHAR[i+1]; - if (i) memcpy(*out1, src, sizeof(WCHAR)*i); - (*out1)[i] = 0; - } - if (out2) { - *out2 = new WCHAR[len-i]; - if (len-i-1) memcpy(*out2, &src[i+1], sizeof(WCHAR)*(len-i-1)); - (*out2)[len-i-1] = 0; - } - return true; - } - i+=increment; - } - if (out1) *out1 = wstrDup(src); - if (out2) *out2 = 0; - return false; - } - - bool wstrContains(const WCHAR* src, WCHAR c) { - int l=wcslen(src); - for (int i=0; i<l; i++) - if (src[i] == c) return true; - return false; - } - -}; diff --git a/rfb_win32/TCharArray.h b/rfb_win32/TCharArray.h deleted file mode 100644 index dde63b78..00000000 --- a/rfb_win32/TCharArray.h +++ /dev/null @@ -1,135 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- TCharArray.h - -// This library contains the wide-character equivalent of CharArray, named -// WCharArray. In addition to providing wide-character equivalents of -// the char* string manipulation functions (strDup, strFree, etc), special -// versions of those functions are provided which attempt to convert from -// one format to the other. -// e.g. char* t = "hello world"; WCHAR* w = wstrDup(t); -// Results in w containing the wide-character text "hello world". -// For convenience, the WStr and CStr classes are also provided. These -// accept an existing (const) WCHAR* or char* null-terminated string and -// create a read-only copy of that in the desired format. The new copy -// will actually be the original copy if the format has not changed, otherwise -// it will be a new buffer owned by the WStr/CStr. - -// In addition to providing wide character functions, this header defines -// TCHAR* handling classes & functions. TCHAR is defined at compile time to -// either char or WCHAR. Programs can treat this as a third data type and -// call TStr() whenever a TCHAR* is required but a char* or WCHAR* is supplied, -// and TStr will do the right thing. - -#ifndef __RFB_WIN32_TCHARARRAY_H__ -#define __RFB_WIN32_TCHARARRAY_H__ - -#include <windows.h> -#include <tchar.h> -#include <rfb/util.h> -#include <rfb/Password.h> - -namespace rfb { - - // -=- String duplication and cleanup functions. - // These routines also handle conversion between WCHAR* and char* - - char* strDup(const WCHAR* s); - WCHAR* wstrDup(const WCHAR* s); - WCHAR* wstrDup(const char* s); - void wstrFree(WCHAR* s); - - bool wstrSplit(const WCHAR* src, const WCHAR limiter, WCHAR** out1, WCHAR** out2, bool fromEnd=false); - bool wstrContains(const WCHAR* src, WCHAR c); - - // -=- Temporary format conversion classes - // CStr accepts WCHAR* or char* and behaves like a char* - // WStr accepts WCHAR* or char* and behaves like a WCHAR* - - struct WStr { - WStr(const char* s) : buf(wstrDup(s)), free_(true) {} - WStr(const WCHAR* s) : buf(s), free_(false) {} - ~WStr() {if (free_) wstrFree((WCHAR*)buf);} - operator const WCHAR*() {return buf;} - const WCHAR* buf; - bool free_; - }; - - struct CStr { - CStr(const char* s) : buf(s), free_(false) {} - CStr(const WCHAR* s) : buf(strDup(s)), free_(true) {} - ~CStr() {if (free_) strFree((char*)buf);} - operator const char*() {return buf;} - const char* buf; - bool free_; - }; - - // -=- Class to handle cleanup of arrays of native Win32 characters - class WCharArray { - public: - WCharArray() : buf(0) {} - WCharArray(char* str) : buf(wstrDup(str)) {strFree(str);} // note: assumes ownership - WCharArray(WCHAR* str) : buf(str) {} // note: assumes ownership - WCharArray(int len) { - buf = new WCHAR[len]; - } - ~WCharArray() { - delete [] buf; - } - // Get the buffer pointer & clear it (i.e. caller takes ownership) - WCHAR* takeBuf() {WCHAR* tmp = buf; buf = 0; return tmp;} - void replaceBuf(WCHAR* str) {delete [] buf; buf = str;} - WCHAR* buf; - }; - - // -=- Wide-character-based password-buffer handler. Zeroes the password - // buffer when deleted or replaced. - class WPlainPasswd : public WCharArray { - public: - WPlainPasswd() {} - WPlainPasswd(WCHAR* str) : WCharArray(str) {} - ~WPlainPasswd() {replaceBuf(0);} - void replaceBuf(WCHAR* str) { - if (buf) - memset(buf, 0, sizeof(WCHAR)*wcslen(buf)); - WCharArray::replaceBuf(str); - } - }; - -#ifdef _UNICODE -#define tstrDup wstrDup -#define tstrFree wstrFree -#define tstrSplit wstrSplit -#define tstrContains wstrContains - typedef WCharArray TCharArray; - typedef WStr TStr; - typedef WPlainPasswd TPlainPasswd; -#else -#define tstrDup strDup -#define tstrFree strFree -#define tstrSplit strSplit -#define tstrContains strContains - typedef CharArray TCharArray; - typedef CStr TStr; - typedef PlainPasswd TPlainPasswd; -#endif - -}; - -#endif diff --git a/rfb_win32/Threading.cxx b/rfb_win32/Threading.cxx deleted file mode 100644 index c41ac38b..00000000 --- a/rfb_win32/Threading.cxx +++ /dev/null @@ -1,151 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Threading.cxx -// Win32 Threading interface implementation - -#include <malloc.h> - -#include <rdr/Exception.h> -#include <rfb/LogWriter.h> -#include <rfb/util.h> -#include <rfb_win32/Threading.h> - -using namespace rfb; - -static LogWriter vlog("Threading"); - -static DWORD threadStorage = TlsAlloc(); - - -inline void logAction(Thread* t, const char* action) { - vlog.debug("%-16.16s %s(%lx)", action, t->getName(), t); -} - -inline void logError(Thread* t, const char* err) { - vlog.error("%-16.16s %s(%lx):%s", "failed", t->getName(), t, err); -} - - -DWORD WINAPI -Thread::threadProc(LPVOID lpParameter) { - Thread* thread = (Thread*) lpParameter; - TlsSetValue(threadStorage, thread); - logAction(thread, "started"); - try { - thread->run(); - logAction(thread, "stopped"); - } catch (rdr::Exception& e) { - logError(thread, e.str()); - } - bool deleteThread = false; - { - Lock l(thread->mutex); - thread->state = ThreadStopped; - thread->sig->signal(); - deleteThread = thread->deleteAfterRun; - } - if (deleteThread) - delete thread; - return 0; -} - -Thread::Thread(const char* name_) : name(strDup(name_ ? name_ : "Unnamed")), sig(0), deleteAfterRun(false) { - sig = new Condition(mutex); - cond_event.h = CreateEvent(NULL, TRUE, FALSE, NULL); - thread.h = CreateThread(NULL, 0, threadProc, this, CREATE_SUSPENDED, &thread_id); - state = ThreadCreated; - logAction(this, "created"); -} - -Thread::Thread(HANDLE thread_, DWORD thread_id_) : name(strDup("Native")), sig(0), deleteAfterRun(false), - thread(thread_), thread_id(thread_id_) { - cond_event.h = CreateEvent(NULL, TRUE, FALSE, NULL); - state = ThreadNative; - logAction(this, "created"); -} - -Thread::~Thread() { - logAction(this, "destroying"); - if (!deleteAfterRun && state != ThreadNative) - this->join(); - if (sig) - delete sig; - logAction(this, "destroyed"); -} - -void -Thread::run() { -} - -void -Thread::start() { - Lock l(mutex); - if (state == ThreadCreated) { - state = ThreadStarted; - sig->signal(); - ResumeThread(thread); - } -} - -Thread* -Thread::join() { - if (deleteAfterRun) - throw rdr::Exception("attempt to join() with deleteAfterRun thread"); - Lock l(mutex); - if (state == ThreadJoined) { - logAction(this, "already joined"); - } else { - logAction(this, "joining"); - while (state == ThreadStarted) { - sig->wait(); - logAction(this, "checking"); - } - state = ThreadJoined; - logAction(this, "joined"); - } - return this; -} - -const char* -Thread::getName() const { - return name.buf; -} - -ThreadState -Thread::getState() const { - return state; -} - -unsigned long -Thread::getThreadId() const { - return thread_id; -} - - -Thread* -Thread::self() { - Thread* thread = (Thread*) TlsGetValue(threadStorage); - if (!thread) { - // *** memory leak - could use GetExitCodeThread to lazily detect when - // to clean up native thread objects - thread = new Thread(GetCurrentThread(), GetCurrentThreadId()); - TlsSetValue(threadStorage, thread); - } - return thread; -} diff --git a/rfb_win32/Threading.h b/rfb_win32/Threading.h deleted file mode 100644 index 850f04dd..00000000 --- a/rfb_win32/Threading.h +++ /dev/null @@ -1,154 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Threading_win32.h -// Win32 Threading interface implementation - -#ifndef __RFB_THREADING_IMPL_WIN32 -#define __RFB_THREADING_IMPL_WIN32 - -#define __RFB_THREADING_IMPL WIN32 - -#include <rfb_win32/Handle.h> -#include <rfb/util.h> -#include <rdr/Exception.h> -//#include <stdio.h> - - -namespace rfb { - - class Mutex { - public: - Mutex() { - InitializeCriticalSection(&crit); - } - ~Mutex() { - DeleteCriticalSection(&crit); - } - friend class Lock; - friend class Condition; - protected: - void enter() {EnterCriticalSection(&crit);} - void exit() {LeaveCriticalSection(&crit);} - CRITICAL_SECTION crit; - }; - - class Lock { - public: - Lock(Mutex& m) : mutex(m) {m.enter();} - ~Lock() {mutex.exit();} - protected: - Mutex& mutex; - }; - - enum ThreadState {ThreadCreated, ThreadStarted, ThreadStopped, ThreadJoined, ThreadNative}; - - class Thread { - public: - Thread(const char* name_=0); - virtual ~Thread(); - - virtual void run(); - - virtual void start(); - virtual Thread* join(); - - const char* getName() const; - ThreadState getState() const; - - // Determines whether the thread should delete itself when run() returns - // If you set this, you must NEVER call join()! - void setDeleteAfterRun() {deleteAfterRun = true;}; - - unsigned long getThreadId() const; - - static Thread* self(); - - friend class Condition; - - protected: - Thread(HANDLE thread_, DWORD thread_id_); - static DWORD WINAPI threadProc(LPVOID lpParameter); - - win32::Handle thread; - DWORD thread_id; - CharArray name; - ThreadState state; - Condition* sig; - Mutex mutex; - - win32::Handle cond_event; - Thread* cond_next; - - bool deleteAfterRun; - }; - - class Condition { - public: - Condition(Mutex& m) : mutex(m), waiting(0) { - } - ~Condition() { - } - - // Wake up the specified number of threads that are waiting - // on this Condition, or all of them if -1 is specified. - void signal(int howMany=1) { - Lock l(cond_lock); - while (waiting && howMany!=0) { - SetEvent(waiting->cond_event); - waiting = waiting->cond_next; - if (howMany>0) --howMany; - } - } - - // NB: Must hold "mutex" to call wait() - // Wait until either the Condition is signalled or the timeout - // expires. - void wait(DWORD timeout=INFINITE) { - Thread* self = Thread::self(); - ResetEvent(self->cond_event); - { Lock l(cond_lock); - self->cond_next = waiting; - waiting = self; - } - mutex.exit(); - DWORD result = WaitForSingleObject(self->cond_event, timeout); - mutex.enter(); - if (result == WAIT_TIMEOUT) { - Lock l(cond_lock); - // Remove this thread from the Condition - for (Thread** removeFrom = &waiting; *removeFrom; removeFrom = &(*removeFrom)->cond_next) { - if (*removeFrom == self) { - *removeFrom = self->cond_next; - break; - } - } - } else if (result == WAIT_FAILED) { - throw rdr::SystemException("failed to wait on Condition", GetLastError()); - } - } - - protected: - Mutex& mutex; - Mutex cond_lock; - Thread* waiting; - }; - -}; - -#endif // __RFB_THREADING_IMPL diff --git a/rfb_win32/ToolBar.cxx b/rfb_win32/ToolBar.cxx deleted file mode 100644 index 6392ebdc..00000000 --- a/rfb_win32/ToolBar.cxx +++ /dev/null @@ -1,216 +0,0 @@ -/* Copyright (C) 2004 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- ToolBar control class. - -#include "ToolBar.h" - -using namespace rfb::win32; - -ToolBar::ToolBar() : hwndToolBar(0), tbID(-1) { - INITCOMMONCONTROLSEX icex; - - // Ensure that the common control DLL is loaded - icex.dwSize = sizeof(INITCOMMONCONTROLSEX); - icex.dwICC = ICC_BAR_CLASSES; - InitCommonControlsEx(&icex); -} - -ToolBar::~ToolBar() { - DestroyWindow(getHandle()); -} - -bool ToolBar::create(int _tbID, HWND _parentHwnd, DWORD dwStyle) { - parentHwnd = _parentHwnd; - dwStyle |= WS_CHILD; - - // Create the ToolBar window - hwndToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, 0, dwStyle, - 0, 0, 25, 25, parentHwnd, (HMENU)_tbID, GetModuleHandle(0), 0); - - if (hwndToolBar) { - tbID = _tbID; - - // It's required for backward compatibility - SendMessage(hwndToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); - } - return (hwndToolBar ? true : false); -}; - -int ToolBar::addBitmap(int nButtons, UINT bitmapID) { - assert(nButtons > 0); - TBADDBITMAP resBitmap; - resBitmap.hInst = GetModuleHandle(0); - resBitmap.nID = bitmapID; - return SendMessage(getHandle(), TB_ADDBITMAP, nButtons, (LPARAM)&resBitmap); -} - -int ToolBar::addSystemBitmap(UINT stdBitmapID) { - TBADDBITMAP resBitmap; - resBitmap.hInst = HINST_COMMCTRL; - resBitmap.nID = stdBitmapID; - return SendMessage(getHandle(), TB_ADDBITMAP, 0, (LPARAM)&resBitmap); -} - -bool ToolBar::setBitmapSize(int width, int height) { - int result = SendMessage(getHandle(), TB_SETBITMAPSIZE, - 0, MAKELONG(width, height)); - return (result ? true : false); -} - -bool ToolBar::addButton(int iBitmap, int idCommand, BYTE state, BYTE style, UINT dwData, int iString) { - TBBUTTON tbb; - tbb.iBitmap = iBitmap; - tbb.idCommand = idCommand; - tbb.fsState = state; - tbb.fsStyle = style; - tbb.dwData = dwData; - tbb.iString = iString; - - int result = SendMessage(getHandle(), TB_ADDBUTTONS, 1, (LPARAM)&tbb); - if (result) { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - } - return (result ? true : false); -} - -bool ToolBar::addNButton(int nButtons, LPTBBUTTON tbb) { - assert(nButtons > 0); - assert(tbb > 0); - int result = SendMessage(getHandle(), TB_ADDBUTTONS, nButtons, (LPARAM)tbb); - if (result) { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - } - return (result ? true : false); -} - -bool ToolBar::deleteButton(int indexButton) { - assert(indexButton >= 0); - int result = SendMessage(getHandle(), TB_DELETEBUTTON, indexButton, 0); - - if (result) { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - } - return (result ? true : false); -} - -bool ToolBar::insertButton(int indexButton, LPTBBUTTON tbb) { - assert(indexButton >= 0); - assert(tbb > 0); - int result = SendMessage(getHandle(), TB_INSERTBUTTON, - indexButton, (LPARAM)tbb); - - if (result) { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - } - return (result ? true : false); -} - -int ToolBar::getButtonInfo(int idButton, TBBUTTONINFO *btnInfo) { - assert(idButton >= 0); - assert(btnInfo > 0); - return SendMessage(getHandle(), TB_GETBUTTONINFO, idButton, (LPARAM)btnInfo); -} - -int ToolBar::getButtonsHeight() { - return HIWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0)); -} - -int ToolBar::getButtonsWidth() { - return LOWORD(SendMessage(getHandle(), TB_GETBUTTONSIZE, 0, 0)); -} - -bool ToolBar::setButtonInfo(int idButton, TBBUTTONINFO* btnInfo) { - assert(idButton >= 0); - assert(btnInfo > 0); - int result = SendMessage(getHandle(), TB_SETBUTTONINFO, - idButton, (LPARAM)(LPTBBUTTONINFO)btnInfo); - return (result ? true : false); -} - -bool ToolBar::checkButton(int idButton, bool check) { - assert(idButton >= 0); - int result = SendMessage(getHandle(), TB_CHECKBUTTON, - idButton, MAKELONG(check, 0)); - return (result ? true : false); -} - -bool ToolBar::enableButton(int idButton, bool enable) { - assert(idButton >= 0); - int result = SendMessage(getHandle(), TB_ENABLEBUTTON, - idButton, MAKELONG(enable, 0)); - return (result ? true : false); -} - -bool ToolBar::pressButton(int idButton, bool press) { - assert(idButton >= 0); - int result = SendMessage(getHandle(), TB_PRESSBUTTON, - idButton, MAKELONG(press, 0)); - return (result ? true : false); -} - -bool ToolBar::getButtonRect(int nIndex, LPRECT buttonRect) { - int result = SendMessage(getHandle(), TB_GETITEMRECT, - nIndex, (LPARAM)buttonRect); - return (result ? true : false); -} - -bool ToolBar::setButtonSize(int width, int height) { - assert(width > 0); - assert(height > 0); - int result = SendMessage(getHandle(), TB_SETBUTTONSIZE, - 0, MAKELONG(width, height)); - if (result) { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - return true; - } - return false; -} - -void ToolBar::autoSize() { - DWORD style = SendMessage(getHandle(), TB_GETSTYLE, 0, 0); - if (style & CCS_NORESIZE) { - RECT r, btnRect; - GetClientRect(parentHwnd, &r); - getButtonRect(0, &btnRect); - int height = getButtonsHeight() + btnRect.top * 2 + 2; - SetWindowPos(getHandle(), HWND_TOP, 0, 0, r.right - r.left, height, - SWP_NOMOVE); - } else { - SendMessage(getHandle(), TB_AUTOSIZE, 0, 0); - } -} - -int ToolBar::getHeight() { - RECT r; - GetWindowRect(getHandle(), &r); - return r.bottom - r.top; -} - -void ToolBar::show() { - ShowWindow(getHandle(), SW_SHOW); -} - -void ToolBar::hide() { - ShowWindow(getHandle(), SW_HIDE); -} - -bool ToolBar::isVisible() { - DWORD style = GetWindowLong(getHandle(), GWL_STYLE); - return (bool)(style & WS_VISIBLE); -} diff --git a/rfb_win32/ToolBar.h b/rfb_win32/ToolBar.h deleted file mode 100644 index 2242c2a4..00000000 --- a/rfb_win32/ToolBar.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (C) 2004 TightVNC Team. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- ToolBar control class. - -#include <windows.h> -#include <commctrl.h> -#include <assert.h> - -namespace rfb { - - namespace win32 { - - class ToolBar { - public: - ToolBar(); - virtual ~ToolBar(); - - // create() creates a windows toolbar. dwStyle is a combination of - // the toolbar control and button styles. It returns TRUE if successful, - // or FALSE otherwise. - bool create(int tbID, HWND parentHwnd, - DWORD dwStyle = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT); - - // -=- Button images operations - - // addBitmap() adds one or more images from resources to - // the list of button images available for a toolbar. - // Returns the index of the first new image if successful, - // or -1 otherwise. - int addBitmap(int nButtons, UINT bitmapID); - - // addSystemBitmap() adds the system-defined button bitmaps to the list - // of the toolbar button specifying by stdBitmapID. Returns the index of - // the first new image if successful, or -1 otherwise. - int addSystemBitmap(UINT stdBitmapID); - - // setBitmapSize() sets the size of the bitmapped images to be added - // to a toolbar. It returns TRUE if successful, or FALSE otherwise. - // You must call it before addBitmap(). - bool setBitmapSize(int width, int height); - - // -=- Button operations - - // addButton() adds one button. - bool addButton(int iBitmap, int idCommand, BYTE state=TBSTATE_ENABLED, - BYTE style=TBSTYLE_BUTTON, UINT dwData=0, int iString=0); - - // addNButton() adds nButtons buttons to a toolbar. - bool addNButton(int nButtons, LPTBBUTTON tbb); - - // deleteButton() removes a button from the toolbar. - bool deleteButton(int nIndex); - - // insertButton() inserts a button in a toolbar control by index. - bool insertButton(int nIndex, LPTBBUTTON tbb); - - // getButtonInfo() retrieves extended information about a toolbar's - // button. It returns index of the button if successful, or -1 otherwise. - int getButtonInfo(int idButton, TBBUTTONINFO *btnInfo); - - // getButtonsHeight() retrieves the height of the toolbar buttons. - int getButtonsHeight(); - - // getButtonsWidth() retrieves the width of the toolbar buttons. - int getButtonsWidth(); - - // setButtonInfo() sets the information for an existing button - // in a toolbar. - bool setButtonInfo(int idButton, TBBUTTONINFO* ptbbi); - - // checkButton() checks or unchecks a given button in a toolbar control. - bool checkButton(int idButton, bool check); - - // enableButton() enables or disables the specified button - // in the toolbar. - bool enableButton(int idButton, bool enable); - - // pressButton() presses or releases the specified button in the toolbar. - bool pressButton(int idButton, bool press); - - // getButtonRect() gets the bounding rectangle of a button in a toolbar. - bool getButtonRect(int nIndex, LPRECT buttonRect); - - // setButtonSize() sets the size of the buttons to be added to a toolbar. - // Button size must be largen the button bitmap. - bool setButtonSize(int width, int height); - - // -=- ToolBar operations - - // autoSize() resizes the toolbar window. - void autoSize(); - - // getHandle() returns handle to a toolbar window. - HWND getHandle() { return hwndToolBar; } - - // getHeight() returns the toolbar window height. - int getHeight(); - - // show() displays the toolbar window. - void show(); - - // hide() hides the toolbar window. - void hide(); - - // isVisible() check the toolbar window on visible. - bool isVisible(); - - protected: - HWND hwndToolBar; - HWND parentHwnd; - int tbID; - }; - - }; // win32 - -}; // rfb diff --git a/rfb_win32/TrayIcon.h b/rfb_win32/TrayIcon.h deleted file mode 100644 index dc5102a9..00000000 --- a/rfb_win32/TrayIcon.h +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- CView.h - -// An instance of the CView class is created for each VNC Viewer connection. - -#ifndef __RFB_WIN32_TRAY_ICON_H__ -#define __RFB_WIN32_TRAY_ICON_H__ - -#include <windows.h> -#include <shellapi.h> -#include <rfb_win32/MsgWindow.h> -#include <rdr/Exception.h> - -namespace rfb { - - namespace win32 { - - class TrayIcon : public MsgWindow { - public: - TrayIcon() : MsgWindow(_T("VNCTray")) { -#ifdef NOTIFYICONDATA_V1_SIZE - nid.cbSize = NOTIFYICONDATA_V1_SIZE; -#else - nid.cbSize = sizeof(NOTIFYICONDATA); -#endif - - nid.hWnd = getHandle(); - nid.uID = 0; - nid.hIcon = 0; - nid.uFlags = NIF_ICON | NIF_MESSAGE; - nid.uCallbackMessage = WM_USER; - } - virtual ~TrayIcon() { - remove(); - } - bool setIcon(UINT icon) { - if (icon == 0) { - return remove(); - } else { - nid.hIcon = (HICON)LoadImage(GetModuleHandle(0), MAKEINTRESOURCE(icon), - IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_SHARED); - return refresh(); - } - } - bool setToolTip(const TCHAR* text) { - if (text == 0) { - nid.uFlags &= ~NIF_TIP; - } else { - const int tipLen = sizeof(nid.szTip)/sizeof(TCHAR); - _tcsncpy(nid.szTip, text, tipLen); - nid.szTip[tipLen-1] = 0; - nid.uFlags |= NIF_TIP; - } - return refresh(); - } - bool remove() { - return Shell_NotifyIcon(NIM_DELETE, &nid) != 0; - } - bool refresh() { - return Shell_NotifyIcon(NIM_MODIFY, &nid) || Shell_NotifyIcon(NIM_ADD, &nid); - } - protected: - NOTIFYICONDATA nid; - }; - - }; - -}; - -#endif - - diff --git a/rfb_win32/TsSessions.cxx b/rfb_win32/TsSessions.cxx deleted file mode 100644 index efe75640..00000000 --- a/rfb_win32/TsSessions.cxx +++ /dev/null @@ -1,93 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include <rfb_win32/TsSessions.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb/LogWriter.h> -#include <rdr/Exception.h> -#include <tchar.h> - -#ifdef ERROR_CTX_WINSTATION_BUSY -#define RFB_HAVE_WINSTATION_CONNECT -#else -#pragma message(" NOTE: Not building WinStationConnect support.") -#endif - -static rfb::LogWriter vlog("TsSessions"); - -namespace rfb { -namespace win32 { - - // Windows XP (and later) functions used to handle session Ids - typedef BOOLEAN (WINAPI *_WinStationConnect_proto) (HANDLE,ULONG,ULONG,PCWSTR,ULONG); - DynamicFn<_WinStationConnect_proto> _WinStationConnect(_T("winsta.dll"), "WinStationConnectW"); - typedef DWORD (WINAPI *_WTSGetActiveConsoleSessionId_proto) (); - DynamicFn<_WTSGetActiveConsoleSessionId_proto> _WTSGetActiveConsoleSessionId(_T("kernel32.dll"), "WTSGetActiveConsoleSessionId"); - typedef BOOL (WINAPI *_ProcessIdToSessionId_proto) (DWORD, DWORD*); - DynamicFn<_ProcessIdToSessionId_proto> _ProcessIdToSessionId(_T("kernel32.dll"), "ProcessIdToSessionId"); - typedef BOOL (WINAPI *_LockWorkStation_proto)(); - DynamicFn<_LockWorkStation_proto> _LockWorkStation(_T("user32.dll"), "LockWorkStation"); - - - ProcessSessionId::ProcessSessionId(DWORD processId) { - id = 0; - if (!_ProcessIdToSessionId.isValid()) - return; - if (processId == -1) - processId = GetCurrentProcessId(); - if (!(*_ProcessIdToSessionId)(GetCurrentProcessId(), &id)) - throw rdr::SystemException("ProcessIdToSessionId", GetLastError()); - } - - ProcessSessionId mySessionId; - - ConsoleSessionId::ConsoleSessionId() { - if (_WTSGetActiveConsoleSessionId.isValid()) - id = (*_WTSGetActiveConsoleSessionId)(); - else - id = 0; - } - - bool inConsoleSession() { - ConsoleSessionId console; - return console.id == mySessionId.id; - } - - void setConsoleSession(DWORD sessionId) { -#ifdef RFB_HAVE_WINSTATION_CONNECT - if (!_WinStationConnect.isValid()) - throw rdr::Exception("WinSta APIs missing"); - if (sessionId == -1) - sessionId = mySessionId.id; - - // Try to reconnect our session to the console - ConsoleSessionId console; - vlog.info("Console session is %d", console.id); - if (!(*_WinStationConnect)(0, sessionId, console.id, L"", 0)) - throw rdr::SystemException("Unable to connect session to Console", GetLastError()); - - // Lock the newly connected session, for security - if (_LockWorkStation.isValid()) - (*_LockWorkStation)(); -#else - throw rdr::Exception("setConsoleSession not implemented"); -#endif - } - -}; -}; diff --git a/rfb_win32/TsSessions.h b/rfb_win32/TsSessions.h deleted file mode 100644 index b15ada71..00000000 --- a/rfb_win32/TsSessions.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Windows version-independent Terminal Services Session discovery -// and manipulation API. This code will eventually be replaced -// by the full TS-compatibility scheme. - -#ifndef __RFB_WIN32_TSSESSIONS_H__ -#define __RFB_WIN32_TSSESSIONS_H__ - -#include <windows.h> - -namespace rfb { - - namespace win32 { - - struct SessionId { - DWORD id; - }; - - // Session Id for a given process - struct ProcessSessionId : SessionId { - ProcessSessionId(DWORD processId = -1); - }; - - // Session Id for current process - extern ProcessSessionId mySessionId; - - // Current console Session Id - struct ConsoleSessionId : SessionId { - ConsoleSessionId(); - }; - - // Check whether the process is in the Console session at present - bool inConsoleSession(); - - // Make the specified session the Console session. - // If sessionId is -1 then the process' session is - // made the Console session. - void setConsoleSession(DWORD sessionId = -1); - - }; - -}; - -#endif diff --git a/rfb_win32/WMCursor.cxx b/rfb_win32/WMCursor.cxx deleted file mode 100644 index 4d696cbc..00000000 --- a/rfb_win32/WMCursor.cxx +++ /dev/null @@ -1,104 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMCursor.cxx - -// *** DOESN'T SEEM TO WORK WITH GetCursorInfo POS CODE BUILT-IN UNDER NT4SP6 -// *** INSTEAD, WE LOOK FOR Win2000/Win98 OR ABOVE - -#include <rfb_win32/WMCursor.h> -#include <rfb_win32/OSVersion.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb/Exception.h> -#include <rfb/LogWriter.h> - -using namespace rdr; -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMCursor"); - - -#ifdef CURSOR_SHOWING -#define RFB_HAVE_GETCURSORINFO -#else -#pragma message(" NOTE: Not building GetCursorInfo support.") -#endif - -#ifdef RFB_HAVE_GETCURSORINFO -typedef BOOL (WINAPI *_GetCursorInfo_proto)(PCURSORINFO pci); -DynamicFn<_GetCursorInfo_proto> _GetCursorInfo(_T("user32.dll"), "GetCursorInfo"); -#endif - -WMCursor::WMCursor() : hooks(0), use_getCursorInfo(false), cursor(0) { -#ifdef RFB_HAVE_GETCURSORINFO - // Check the OS version - bool is_win98 = (osVersion.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && - (osVersion.dwMajorVersion > 4) || ((osVersion.dwMajorVersion == 4) && (osVersion.dwMinorVersion > 0)); - bool is_win2K = (osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT) && (osVersion.dwMajorVersion >= 5); - - // Use GetCursorInfo if OS version is sufficient - use_getCursorInfo = (is_win98 || is_win2K) && _GetCursorInfo.isValid(); -#endif - cursor = (HCURSOR)LoadImage(0, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); - if (!use_getCursorInfo) { - hooks = new WMCursorHooks(); - if (hooks && hooks->start()) { - vlog.info("falling back to cursor hooking: %p", hooks); - } else { - delete hooks; - hooks = 0; - vlog.error("unable to monitor cursor shape"); - } - } else { - vlog.info("using GetCursorInfo"); - } -} - -WMCursor::~WMCursor() { - vlog.debug("deleting WMCursorHooks (%p)", hooks); - if (hooks) - delete hooks; -} - -WMCursor::Info -WMCursor::getCursorInfo() { - Info result; -#ifdef RFB_HAVE_GETCURSORINFO - if (use_getCursorInfo) { - CURSORINFO info; - info.cbSize = sizeof(CURSORINFO); - if ((*_GetCursorInfo)(&info)) { - result.cursor = info.hCursor; - result.position = Point(info.ptScreenPos.x, info.ptScreenPos.y); - result.visible = info.flags & CURSOR_SHOWING; - return result; - } - } -#endif - // Fall back to the old way of doing things - POINT pos; - if (hooks) - cursor = hooks->getCursor(); - result.cursor = cursor; - result.visible = cursor != 0; - GetCursorPos(&pos); - result.position.x = pos.x; - result.position.y = pos.y; - return result; -} diff --git a/rfb_win32/WMCursor.h b/rfb_win32/WMCursor.h deleted file mode 100644 index 41f9ee84..00000000 --- a/rfb_win32/WMCursor.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMCursor.h - -// WMCursor provides a single API through which the cursor state can be obtained -// The underlying implementation will use either GetCursorInfo, or use the -// wm_hooks library if GetCursorInfo is not available. - -#ifndef __RFB_WIN32_WM_CURSOR_H__ -#define __RFB_WIN32_WM_CURSOR_H__ - -#include <windows.h> -#include <rfb_win32/WMHooks.h> - -namespace rfb { - namespace win32 { - - class WMCursor { - public: - WMCursor(); - ~WMCursor(); - - struct Info { - HCURSOR cursor; - Point position; - bool visible; - Info() : cursor(0), visible(false) {} - bool operator!=(const Info& info) { - return ((cursor != info.cursor) || - (!position.equals(info.position)) || - (visible != info.visible)); - } - }; - - Info getCursorInfo(); - protected: - WMCursorHooks* hooks; - bool use_getCursorInfo; - HCURSOR cursor; - }; - - }; -}; - -#endif // __RFB_WIN32_WM_CURSOR_H__ diff --git a/rfb_win32/WMHooks.cxx b/rfb_win32/WMHooks.cxx deleted file mode 100644 index 2d690538..00000000 --- a/rfb_win32/WMHooks.cxx +++ /dev/null @@ -1,394 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMHooks.cxx - -#include <rfb_win32/WMHooks.h> -#include <rfb_win32/DynamicFn.h> -#include <rfb_win32/Service.h> -#include <rfb_win32/MsgWindow.h> -#include <rfb_win32/IntervalTimer.h> -#include <rfb/Threading.h> -#include <rfb/LogWriter.h> - -#include <list> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMHooks"); - - -typedef UINT (*WM_Hooks_WMVAL_proto)(); -typedef BOOL (*WM_Hooks_Install_proto)(DWORD owner, DWORD thread); -typedef BOOL (*WM_Hooks_Remove_proto)(DWORD owner); -typedef BOOL (*WM_Hooks_EnableCursorShape_proto)(BOOL enable); -#ifdef _DEBUG -typedef void (*WM_Hooks_SetDiagnosticRange_proto)(UINT min, UINT max); -DynamicFn<WM_Hooks_SetDiagnosticRange_proto> WM_Hooks_SetDiagnosticRange(_T("wm_hooks.dll"), "WM_Hooks_SetDiagnosticRange"); -#endif - - -class WMHooksThread : public Thread { -public: - WMHooksThread() : Thread("WMHookThread"), active(true), - WM_Hooks_Install(_T("wm_hooks.dll"), "WM_Hooks_Install"), - WM_Hooks_Remove(_T("wm_hooks.dll"), "WM_Hooks_Remove"), - WM_Hooks_EnableCursorShape(_T("wm_hooks.dll"), "WM_Hooks_EnableCursorShape") { - } - virtual void run(); - virtual Thread* join(); - DynamicFn<WM_Hooks_Install_proto> WM_Hooks_Install;; - DynamicFn<WM_Hooks_Remove_proto> WM_Hooks_Remove; - DynamicFn<WM_Hooks_EnableCursorShape_proto> WM_Hooks_EnableCursorShape; -protected: - bool active; -}; - -WMHooksThread* hook_mgr = 0; -std::list<WMHooks*> hooks; -std::list<WMCursorHooks*> cursor_hooks; -Mutex hook_mgr_lock; -HCURSOR hook_cursor = (HCURSOR)LoadImage(0, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED); - - -static bool StartHookThread() { - if (hook_mgr) - return true; - vlog.debug("creating thread"); - hook_mgr = new WMHooksThread(); - if (!hook_mgr->WM_Hooks_Install.isValid() || - !hook_mgr->WM_Hooks_Remove.isValid()) { - vlog.debug("hooks not available"); - return false; - } - vlog.debug("installing hooks"); - if (!(*hook_mgr->WM_Hooks_Install)(hook_mgr->getThreadId(), 0)) { - vlog.error("failed to initialise hooks"); - delete hook_mgr->join(); - hook_mgr = 0; - return false; - } - vlog.debug("starting thread"); - hook_mgr->start(); - return true; -} - -static void StopHookThread() { - if (!hook_mgr) - return; - if (!hooks.empty() || !cursor_hooks.empty()) - return; - vlog.debug("closing thread"); - delete hook_mgr->join(); - hook_mgr = 0; -} - - -static bool AddHook(WMHooks* hook) { - vlog.debug("adding hook"); - Lock l(hook_mgr_lock); - if (!StartHookThread()) - return false; - hooks.push_back(hook); - return true; -} - -static bool AddCursorHook(WMCursorHooks* hook) { - vlog.debug("adding cursor hook"); - Lock l(hook_mgr_lock); - if (!StartHookThread()) - return false; - if (!hook_mgr->WM_Hooks_EnableCursorShape.isValid()) - return false; - if (cursor_hooks.empty() && !(*hook_mgr->WM_Hooks_EnableCursorShape)(TRUE)) - return false; - cursor_hooks.push_back(hook); - return true; -} - -static bool RemHook(WMHooks* hook) { - { - vlog.debug("removing hook"); - Lock l(hook_mgr_lock); - hooks.remove(hook); - } - StopHookThread(); - return true; -} - -static bool RemCursorHook(WMCursorHooks* hook) { - { - vlog.debug("removing cursor hook"); - Lock l(hook_mgr_lock); - cursor_hooks.remove(hook); - if (hook_mgr->WM_Hooks_EnableCursorShape.isValid() && - cursor_hooks.empty()) - (*hook_mgr->WM_Hooks_EnableCursorShape)(FALSE); - } - StopHookThread(); - return true; -} - -static void NotifyHooksRegion(const Region& r) { - Lock l(hook_mgr_lock); - std::list<WMHooks*>::iterator i; - for (i=hooks.begin(); i!=hooks.end(); i++) - (*i)->NotifyHooksRegion(r); -} - -static void NotifyHooksCursor(HCURSOR c) { - Lock l(hook_mgr_lock); - hook_cursor = c; -} - - -static UINT GetMsgVal(DynamicFn<WM_Hooks_WMVAL_proto>& fn) { - if (fn.isValid()) - return (*fn)(); - return WM_NULL; -} - -void -WMHooksThread::run() { - // Obtain message ids for all supported hook messages - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_WindowChanged(_T("wm_hooks.dll"), "WM_Hooks_WindowChanged"); - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_WindowBorderChanged(_T("wm_hooks.dll"), "WM_Hooks_WindowBorderChanged"); - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_WindowClientAreaChanged(_T("wm_hooks.dll"), "WM_Hooks_WindowClientAreaChanged"); - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_RectangleChanged(_T("wm_hooks.dll"), "WM_Hooks_RectangleChanged"); - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_CursorChanged(_T("wm_hooks.dll"), "WM_Hooks_CursorChanged"); - UINT windowMsg = GetMsgVal(WM_Hooks_WindowChanged); - UINT clientAreaMsg = GetMsgVal(WM_Hooks_WindowClientAreaChanged); - UINT borderMsg = GetMsgVal(WM_Hooks_WindowBorderChanged); - UINT rectangleMsg = GetMsgVal(WM_Hooks_RectangleChanged); - UINT cursorMsg = GetMsgVal(WM_Hooks_CursorChanged); -#ifdef _DEBUG - DynamicFn<WM_Hooks_WMVAL_proto> WM_Hooks_Diagnostic(_T("wm_hooks.dll"), "WM_Hooks_Diagnostic"); - UINT diagnosticMsg = GetMsgVal(WM_Hooks_Diagnostic); -#endif - MSG msg; - RECT wrect; - HWND hwnd; - int count = 0; - - // Update delay handling - // We delay updates by 40-80ms, so that the triggering application has time to - // actually complete them before we notify the hook callbacks & they go off - // capturing screen state. - const int updateDelayMs = 40; - MsgWindow updateDelayWnd(_T("WMHooks::updateDelay")); - IntervalTimer updateDelayTimer(updateDelayWnd.getHandle(), 1); - Region updates[2]; - int activeRgn = 0; - - vlog.debug("starting hook thread"); - - while (active && GetMessage(&msg, NULL, 0, 0)) { - count++; - - if (msg.message == WM_TIMER) { - // Actually notify callbacks of graphical updates - NotifyHooksRegion(updates[1-activeRgn]); - if (updates[activeRgn].is_empty()) - updateDelayTimer.stop(); - activeRgn = 1-activeRgn; - updates[activeRgn].clear(); - - } else if (msg.message == windowMsg) { - // An entire window has (potentially) changed - hwnd = (HWND) msg.lParam; - if (IsWindow(hwnd) && IsWindowVisible(hwnd) && !IsIconic(hwnd) && - GetWindowRect(hwnd, &wrect) && !IsRectEmpty(&wrect)) { - updates[activeRgn].assign_union(Rect(wrect.left, wrect.top, - wrect.right, wrect.bottom)); - updateDelayTimer.start(updateDelayMs); - } - - } else if (msg.message == clientAreaMsg) { - // The client area of a window has (potentially) changed - hwnd = (HWND) msg.lParam; - if (IsWindow(hwnd) && IsWindowVisible(hwnd) && !IsIconic(hwnd) && - GetClientRect(hwnd, &wrect) && !IsRectEmpty(&wrect)) - { - POINT pt = {0,0}; - if (ClientToScreen(hwnd, &pt)) { - updates[activeRgn].assign_union(Rect(wrect.left+pt.x, wrect.top+pt.y, - wrect.right+pt.x, wrect.bottom+pt.y)); - updateDelayTimer.start(updateDelayMs); - } - } - - } else if (msg.message == borderMsg) { - hwnd = (HWND) msg.lParam; - if (IsWindow(hwnd) && IsWindowVisible(hwnd) && !IsIconic(hwnd) && - GetWindowRect(hwnd, &wrect) && !IsRectEmpty(&wrect)) - { - Region changed(Rect(wrect.left, wrect.top, wrect.right, wrect.bottom)); - RECT crect; - POINT pt = {0,0}; - if (GetClientRect(hwnd, &crect) && ClientToScreen(hwnd, &pt) && - !IsRectEmpty(&crect)) - { - changed.assign_subtract(Rect(crect.left+pt.x, crect.top+pt.y, - crect.right+pt.x, crect.bottom+pt.y)); - } - if (!changed.is_empty()) { - updates[activeRgn].assign_union(changed); - updateDelayTimer.start(updateDelayMs); - } - } - } else if (msg.message == rectangleMsg) { - Rect r = Rect(LOWORD(msg.wParam), HIWORD(msg.wParam), - LOWORD(msg.lParam), HIWORD(msg.lParam)); - if (!r.is_empty()) { - updates[activeRgn].assign_union(r); - updateDelayTimer.start(updateDelayMs); - } - - } else if (msg.message == cursorMsg) { - NotifyHooksCursor((HCURSOR)msg.lParam); -#ifdef _DEBUG - } else if (msg.message == diagnosticMsg) { - vlog.info("DIAG msg=%x(%d) wnd=%lx", msg.wParam, msg.wParam, msg.lParam); -#endif - } - } - - vlog.debug("stopping hook thread - processed %d events", count); - (*WM_Hooks_Remove)(getThreadId()); -} - -Thread* -WMHooksThread::join() { - vlog.debug("stopping WMHooks thread"); - active = false; - PostThreadMessage(thread_id, WM_QUIT, 0, 0); - vlog.debug("joining WMHooks thread"); - return Thread::join(); -} - -// -=- WMHooks class - -rfb::win32::WMHooks::WMHooks() : updateEvent(0) { -} - -rfb::win32::WMHooks::~WMHooks() { - RemHook(this); -} - -bool rfb::win32::WMHooks::setEvent(HANDLE ue) { - if (updateEvent) - RemHook(this); - updateEvent = ue; - return AddHook(this); -} - -bool rfb::win32::WMHooks::getUpdates(UpdateTracker* ut) { - if (!updatesReady) return false; - Lock l(hook_mgr_lock); - updates.copyTo(ut); - updates.clear(); - updatesReady = false; - return true; -} - -bool rfb::win32::WMHooks::areAvailable() { - WMHooksThread wmht; - return wmht.WM_Hooks_Install.isValid(); -} - -#ifdef _DEBUG -void -rfb::win32::WMHooks::setDiagnosticRange(UINT min, UINT max) { - if (WM_Hooks_SetDiagnosticRange.isValid()) - (*WM_Hooks_SetDiagnosticRange)(min, max); -} -#endif - -void rfb::win32::WMHooks::NotifyHooksRegion(const Region& r) { - // hook_mgr_lock is already held at this point - updates.add_changed(r); - updatesReady = true; - SetEvent(updateEvent); -} - - -// -=- WMBlockInput class - -rfb::win32::WMBlockInput::WMBlockInput() : active(false) { -} - -rfb::win32::WMBlockInput::~WMBlockInput() { - blockInputs(false); -} - -typedef BOOL (*WM_Hooks_EnableRealInputs_proto)(BOOL pointer, BOOL keyboard); -DynamicFn<WM_Hooks_EnableRealInputs_proto>* WM_Hooks_EnableRealInputs = 0; -static bool blockRealInputs(bool block_) { - // NB: Requires blockMutex to be held! - if (block_) { - if (WM_Hooks_EnableRealInputs) - return true; - // Enable blocking - WM_Hooks_EnableRealInputs = new DynamicFn<WM_Hooks_EnableRealInputs_proto>(_T("wm_hooks.dll"), "WM_Hooks_EnableRealInputs"); - if (WM_Hooks_EnableRealInputs->isValid() && (**WM_Hooks_EnableRealInputs)(false, false)) - return true; - } - if (WM_Hooks_EnableRealInputs) { - // Clean up the DynamicFn, either if init failed, or block_ is false - if (WM_Hooks_EnableRealInputs->isValid()) - (**WM_Hooks_EnableRealInputs)(true, true); - delete WM_Hooks_EnableRealInputs; - WM_Hooks_EnableRealInputs = 0; - } - return block_ == (WM_Hooks_EnableRealInputs != 0); -} - -Mutex blockMutex; -int blockCount = 0; - -bool rfb::win32::WMBlockInput::blockInputs(bool on) { - if (active == on) return true; - Lock l(blockMutex); - int newCount = on ? blockCount+1 : blockCount-1; - if (!blockRealInputs(newCount > 0)) - return false; - blockCount = newCount; - active = on; - return true; -} - - -// -=- WMCursorHooks class - -rfb::win32::WMCursorHooks::WMCursorHooks() { -} - -rfb::win32::WMCursorHooks::~WMCursorHooks() { - RemCursorHook(this); -} - -bool -rfb::win32::WMCursorHooks::start() { - return AddCursorHook(this); -} - -HCURSOR -rfb::win32::WMCursorHooks::getCursor() const { - return hook_cursor; -} diff --git a/rfb_win32/WMHooks.h b/rfb_win32/WMHooks.h deleted file mode 100644 index 4713b416..00000000 --- a/rfb_win32/WMHooks.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMHooks.h - -#ifndef __RFB_WIN32_WM_HOOKS_H__ -#define __RFB_WIN32_WM_HOOKS_H__ - -#include <windows.h> -#include <rfb/UpdateTracker.h> -#include <rdr/Exception.h> -#include <rfb_win32/Win32Util.h> - -namespace rfb { - - namespace win32 { - - // -=- WMHooks - // Uses the wm_hooks DLL to intercept window messages, to get _hints_ as - // to what may have changed on-screen. Updates are notified via a Win32 - // event, and retrieved using the getUpdates method, which is thread-safe. - class WMHooks { - public: - WMHooks(); - ~WMHooks(); - - // Specify the event object to notify. Starts the hook subsystem if it is - // not already active, and returns false if the hooks fail to start. - bool setEvent(HANDLE updateEvent); - - // Copies any new updates to the UpdateTracker. Returns true if new updates - // were added, false otherwise. - bool getUpdates(UpdateTracker* ut); - - // Determine whether the hooks DLL is installed on the system - static bool areAvailable(); - -#ifdef _DEBUG - // Get notifications of any messages in the given range, to any hooked window - void setDiagnosticRange(UINT min, UINT max); -#endif - - // * INTERNAL NOTIFICATION FUNCTION * - void NotifyHooksRegion(const Region& r); - protected: - HANDLE updateEvent; - bool updatesReady; - SimpleUpdateTracker updates; - }; - - // -=- Support for filtering out local input events while remote connections are - // active. Implemented using SetWindowsHookEx for portability. - class WMBlockInput { - public: - WMBlockInput(); - ~WMBlockInput(); - bool blockInputs(bool block); - protected: - bool active; - }; - - // - Legacy cursor handling support - class WMCursorHooks { - public: - WMCursorHooks(); - ~WMCursorHooks(); - - bool start(); - - HCURSOR getCursor() const; - }; - - }; - -}; - -#endif // __RFB_WIN32_WM_HOOKS_H__ diff --git a/rfb_win32/WMNotifier.cxx b/rfb_win32/WMNotifier.cxx deleted file mode 100644 index 20a5445f..00000000 --- a/rfb_win32/WMNotifier.cxx +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMNotifier.cxx - -#include <rfb_win32/WMNotifier.h> -#include <rfb_win32/WMShatter.h> -#include <rfb_win32/MsgWindow.h> - -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMMonitor"); - - -WMMonitor::WMMonitor() : MsgWindow(_T("WMMonitor")), notifier(0) { -} - -WMMonitor::~WMMonitor() { -} - - -LRESULT -WMMonitor::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { - switch (msg) { - case WM_DISPLAYCHANGE: - if (notifier) { - notifier->notifyDisplayEvent(Notifier::DisplaySizeChanged); - notifier->notifyDisplayEvent(Notifier::DisplayPixelFormatChanged); - } - break; - case WM_SYSCOLORCHANGE: - case WM_PALETTECHANGED: - if (notifier) { - notifier->notifyDisplayEvent(Notifier::DisplayColourMapChanged); - } - break; - }; - return MsgWindow::processMessage(msg, wParam, lParam); -} diff --git a/rfb_win32/WMNotifier.h b/rfb_win32/WMNotifier.h deleted file mode 100644 index a7609642..00000000 --- a/rfb_win32/WMNotifier.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMNotifier.h -// -// The WMNotifier is used to get callbacks indicating changes in the state -// of the system, for instance in the size/format/palette of the display. -// The WMNotifier contains a Win32 window, which receives notifications of -// system events and stores them. Whenever processEvent is called, any -// incoming events are processed and the appropriate notifier called. - -#ifndef __RFB_WIN32_NOTIFIER_H__ -#define __RFB_WIN32_NOTIFIER_H__ - -#include <rfb/SDesktop.h> -#include <rfb/Threading.h> -#include <rfb_win32/MsgWindow.h> -#include <rfb_win32/DeviceFrameBuffer.h> -#include <rfb_win32/SInput.h> - -namespace rfb { - - namespace win32 { - - // -=- Window Message Monitor implementation - - class WMMonitor : MsgWindow { - public: - - class Notifier { - public: - typedef enum {DisplaySizeChanged, DisplayColourMapChanged, - DisplayPixelFormatChanged} DisplayEventType; - virtual void notifyDisplayEvent(DisplayEventType evt) = 0; - }; - - WMMonitor(); - virtual ~WMMonitor(); - - void setNotifier(Notifier* wmn) {notifier=wmn;} - - protected: - // - Internal MsgWindow callback - virtual LRESULT processMessage(UINT msg, WPARAM wParam, LPARAM lParam); - - Notifier* notifier; - }; - - }; - -}; - -#endif // __RFB_WIN32_WMNOTIFIER_H__ diff --git a/rfb_win32/WMPoller.cxx b/rfb_win32/WMPoller.cxx deleted file mode 100644 index f8505342..00000000 --- a/rfb_win32/WMPoller.cxx +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMPoller.cxx - -#include <rfb_win32/WMPoller.h> -#include <rfb/Exception.h> -#include <rfb/LogWriter.h> -#include <rfb/Configuration.h> - -#include <tchar.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMPoller"); - -BoolParameter rfb::win32::WMPoller::poll_console_windows("PollConsoleWindows", - "Server should poll console windows for updates", true); - -// -=- WMPoller class - -bool -rfb::win32::WMPoller::processEvent() { - PollInfo info; - if (poll_console_windows && ut) { - ::EnumWindows(WMPoller::enumWindowProc, (LPARAM) &info); - ut->add_changed(info.poll_include); - } - return false; -} - -bool -rfb::win32::WMPoller::setUpdateTracker(UpdateTracker* ut_) { - ut = ut_; - return true; -} - -bool -rfb::win32::WMPoller::checkPollWindow(HWND w) { - TCHAR buffer[128]; - if (!GetClassName(w, buffer, 128)) - throw rdr::SystemException("unable to get window class:%u", GetLastError()); - if ((_tcscmp(buffer, _T("tty")) != 0) && - (_tcscmp(buffer, _T("ConsoleWindowClass")) != 0)) { - return false; - } - return true; -} - -void -rfb::win32::WMPoller::pollWindow(HWND w, PollInfo* i) { - RECT r; - if (IsWindowVisible(w) && GetWindowRect(w, &r)) { - if (IsRectEmpty(&r)) return; - Region wrgn(Rect(r.left, r.top, r.right, r.bottom)); - if (checkPollWindow(w)) { - wrgn.assign_subtract(i->poll_exclude); - i->poll_include.assign_union(wrgn); - } else { - i->poll_exclude.assign_union(wrgn); - } - } -} - -BOOL CALLBACK -rfb::win32::WMPoller::enumWindowProc(HWND w, LPARAM lp) { - pollWindow(w, (PollInfo*)lp); - return TRUE; -} diff --git a/rfb_win32/WMPoller.h b/rfb_win32/WMPoller.h deleted file mode 100644 index 851b69f4..00000000 --- a/rfb_win32/WMPoller.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMPoller.h -// -// Polls the foreground window. If the pollOnlyConsoles flag is set, -// then checks the window class of the foreground window first and -// only polls it if it's a console. -// If the pollAllWindows flag is set then iterates through visible -// windows, and polls the visible bits. If pollOnlyConsoles is also -// set then only visible parts of console windows will be polled. - -#ifndef __RFB_WIN32_WM_POLLER_H__ -#define __RFB_WIN32_WM_POLLER_H__ - -#include <windows.h> -#include <rfb/UpdateTracker.h> -#include <rfb/Configuration.h> - -namespace rfb { - - namespace win32 { - - class WMPoller { - public: - WMPoller() : ut(0) {} - - bool processEvent(); - bool setUpdateTracker(UpdateTracker* ut); - - static BoolParameter poll_console_windows; - protected: - struct PollInfo { - Region poll_include; - Region poll_exclude; - }; - static bool checkPollWindow(HWND w); - static void pollWindow(HWND w, PollInfo* info); - static BOOL CALLBACK enumWindowProc(HWND w, LPARAM lp); - UpdateTracker* ut; - }; - - }; - -}; - -#endif // __RFB_WIN32_WM_POLLER_H__ diff --git a/rfb_win32/WMShatter.cxx b/rfb_win32/WMShatter.cxx deleted file mode 100644 index e68abfb1..00000000 --- a/rfb_win32/WMShatter.cxx +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMShatter.cxx - -#include <rfb_win32/WMShatter.h> - -#include <rfb/LogWriter.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMShatter"); - -bool -rfb::win32::IsSafeWM(HWND window, UINT msg, WPARAM wParam, LPARAM lParam) { - bool result = true; - switch (msg) { - // - UNSAFE MESSAGES - case WM_TIMER: - result = lParam == 0; - break; - }; - if (!result) { - vlog.info("IsSafeWM: 0x%x received 0x%x(%u, %lu) - not safe", window, msg, wParam, lParam); - } - return result; -} - -LRESULT -rfb::win32::SafeDefWindowProc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam) { - if (IsSafeWM(window, msg, wParam, lParam)) - return DefWindowProc(window, msg, wParam, lParam); - return 0; -} - -LRESULT -rfb::win32::SafeDispatchMessage(const MSG* msg) { - if (IsSafeWM(msg->hwnd, msg->message, msg->wParam, msg->lParam)) - return DispatchMessage(msg); - return 0; -} diff --git a/rfb_win32/WMShatter.h b/rfb_win32/WMShatter.h deleted file mode 100644 index 3ea63b1a..00000000 --- a/rfb_win32/WMShatter.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMShatter.h -// -// WMShatter provides the IsSafeWM routine, which returns true iff the -// supplied window message is safe to pass to DispatchMessage, or to -// process in the window procedure. -// -// This is only required, of course, to avoid so-called "shatter" attacks -// to be made against the VNC server, which take advantage of the noddy -// design of the Win32 window messaging system. -// -// The API here is designed to hopefully be future proof, so that if they -// ever come up with a proper way to determine whether a message is safe -// or not then it can just be reimplemented here... - -#ifndef __RFB_WIN32_SHATTER_H__ -#define __RFB_WIN32_SHATTER_H__ - -#include <windows.h> - -namespace rfb { - namespace win32 { - - bool IsSafeWM(HWND window, UINT msg, WPARAM wParam, LPARAM lParam); - - LRESULT SafeDefWindowProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam); - - LRESULT SafeDispatchMessage(const MSG* msg); - - }; -}; - -#endif // __RFB_WIN32_SHATTER_H__ diff --git a/rfb_win32/WMWindowCopyRect.cxx b/rfb_win32/WMWindowCopyRect.cxx deleted file mode 100644 index 63c1da2e..00000000 --- a/rfb_win32/WMWindowCopyRect.cxx +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMCopyRect.cxx - -#include <rfb_win32/WMWindowCopyRect.h> -#include <rfb/LogWriter.h> -#include <windows.h> - -using namespace rfb; -using namespace rfb::win32; - -static LogWriter vlog("WMCopyRect"); - -// -=- WMHooks class - -rfb::win32::WMCopyRect::WMCopyRect() : ut(0), fg_window(0) { -} - -bool -rfb::win32::WMCopyRect::processEvent() { - // See if the foreground window has moved - HWND window = GetForegroundWindow(); - if (window) { - RECT wrect; - if (IsWindow(window) && IsWindowVisible(window) && GetWindowRect(window, &wrect)) { - Rect winrect(wrect.left, wrect.top, wrect.right, wrect.bottom); - if (fg_window == window) { - if (!fg_window_rect.tl.equals(winrect.tl) && ut) { - // Window has moved - send a copyrect event to the client - Point delta = Point(winrect.tl.x-fg_window_rect.tl.x, winrect.tl.y-fg_window_rect.tl.y); - Region copy_dest = winrect; - ut->add_copied(copy_dest, delta); - ut->add_changed(Region(fg_window_rect).subtract(copy_dest)); - } - } - fg_window = window; - fg_window_rect = winrect; - } else { - fg_window = 0; - } - } else { - fg_window = 0; - } - return false; -} - -bool -rfb::win32::WMCopyRect::setUpdateTracker(UpdateTracker* ut_) { - ut = ut_; - return true; -} diff --git a/rfb_win32/WMWindowCopyRect.h b/rfb_win32/WMWindowCopyRect.h deleted file mode 100644 index 5a0e876d..00000000 --- a/rfb_win32/WMWindowCopyRect.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- WMWindowCopyRect.h -// -// Helper class which produces copyRect actions by monitoring the location -// of the current foreground window. -// Whenever processEvent is called, the foreground window's position is -// recalculated and a copy event flushed to the supplied UpdateTracker -// if appropriate. - -#ifndef __RFB_WIN32_WM_WINDOW_COPYRECT_H__ -#define __RFB_WIN32_WM_WINDOW_COPYRECT_H__ - -#include <rfb/UpdateTracker.h> - -namespace rfb { - - namespace win32 { - - class WMCopyRect { - public: - WMCopyRect(); - - bool processEvent(); - bool setUpdateTracker(UpdateTracker* ut); - - protected: - UpdateTracker* ut; - void* fg_window; - Rect fg_window_rect; - }; - - }; - -}; - -#endif // __RFB_WIN32_WM_WINDOW_COPYRECT_H__ diff --git a/rfb_win32/Win32Util.cxx b/rfb_win32/Win32Util.cxx deleted file mode 100644 index ef8039ab..00000000 --- a/rfb_win32/Win32Util.cxx +++ /dev/null @@ -1,114 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// Win32Util.cxx - -#include <rfb_win32/ModuleFileName.h> -#include <rfb_win32/Win32Util.h> -#include <rfb_win32/MonitorInfo.h> -#include <rfb_win32/Handle.h> -#include <rdr/HexOutStream.h> -#include <rdr/Exception.h> - -namespace rfb { -namespace win32 { - - -FileVersionInfo::FileVersionInfo(const TCHAR* filename) { - // Get executable name - ModuleFileName exeName; - if (!filename) - filename = exeName.buf; - - // Attempt to open the file, to cause Access Denied, etc, errors - // to be correctly reported, since the GetFileVersionInfoXXX calls lie... - { - Handle file(CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)); - if (file.h == INVALID_HANDLE_VALUE) - throw rdr::SystemException("Failed to open file", GetLastError()); - } - - // Get version info size - DWORD handle; - int size = GetFileVersionInfoSize((TCHAR*)filename, &handle); - if (!size) - throw rdr::SystemException("GetVersionInfoSize failed", GetLastError()); - - // Get version info - buf = new TCHAR[size]; - if (!GetFileVersionInfo((TCHAR*)filename, handle, size, buf)) - throw rdr::SystemException("GetVersionInfo failed", GetLastError()); -} - -const TCHAR* FileVersionInfo::getVerString(const TCHAR* name, DWORD langId) { - char langIdBuf[sizeof(langId)]; - for (int i=sizeof(langIdBuf)-1; i>=0; i--) { - langIdBuf[i] = (char) (langId & 0xff); - langId = langId >> 8; - } - - TCharArray langIdStr = rdr::HexOutStream::binToHexStr(langIdBuf, sizeof(langId)); - TCharArray infoName(_tcslen(_T("StringFileInfo")) + 4 + _tcslen(name) + _tcslen(langIdStr.buf)); - _stprintf(infoName.buf, _T("\\StringFileInfo\\%s\\%s"), langIdStr.buf, name); - - // Locate the required version string within the version info - TCHAR* buffer = 0; - UINT length = 0; - if (!VerQueryValue(buf, infoName.buf, (void**)&buffer, &length)) { - printf("unable to find %s version string", CStr(infoName.buf)); - throw rdr::Exception("VerQueryValue failed"); - } - return buffer; -} - - -bool splitPath(const TCHAR* path, TCHAR** dir, TCHAR** file) { - return tstrSplit(path, '\\', dir, file, true); -} - - -void centerWindow(HWND handle, HWND parent) { - RECT r; - MonitorInfo mi(parent ? parent : handle); - if (!parent || !IsWindowVisible(parent) || !GetWindowRect(parent, &r)) - r=mi.rcWork; - centerWindow(handle, r); - mi.clipTo(handle); -} - -void centerWindow(HWND handle, const RECT& r) { - RECT wr; - if (!GetWindowRect(handle, &wr)) return; - int w = wr.right-wr.left; - int h = wr.bottom-wr.top; - int x = (r.left + r.right - w)/2; - int y = (r.top + r.bottom - h)/2; - UINT flags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOSIZE; - SetWindowPos(handle, 0, x, y, 0, 0, flags); -} - -void resizeWindow(HWND handle, int width, int height) { - RECT r; - GetWindowRect(handle, &r); - SetWindowPos(handle, 0, 0, 0, width, height, SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE); - centerWindow(handle, r); -} - - -}; -}; diff --git a/rfb_win32/Win32Util.h b/rfb_win32/Win32Util.h deleted file mode 100644 index 8cc1a2b9..00000000 --- a/rfb_win32/Win32Util.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// -=- Win32Util.h - -// Miscellaneous but useful Win32 API utility functions & classes. -// In particular, a set of classes which wrap GDI objects, -// and some to handle palettes. - -#ifndef __RFB_WIN32_GDIUTIL_H__ -#define __RFB_WIN32_GDIUTIL_H__ - -#include <rfb_win32/TCharArray.h> - -namespace rfb { - - namespace win32 { - - struct FileVersionInfo : public TCharArray { - FileVersionInfo(const TCHAR* filename=0); - const TCHAR* getVerString(const TCHAR* name, DWORD langId = 0x080904b0); - }; - - bool splitPath(const TCHAR* path, TCHAR** dir, TCHAR** file); - - // Center the window to a rectangle, or to a parent window. - // Optionally, resize the window to lay within the rect or parent window - // If the parent window is NULL then the working area if the window's - // current monitor is used instead. - void centerWindow(HWND handle, const RECT& r); - void centerWindow(HWND handle, HWND parent); - - // resizeWindow resizes a window about its center - void resizeWindow(HWND handle, int width, int height); - - }; - -}; - -#endif diff --git a/rfb_win32/keymap.h b/rfb_win32/keymap.h deleted file mode 100644 index a340d09d..00000000 --- a/rfb_win32/keymap.h +++ /dev/null @@ -1,149 +0,0 @@ -/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -// keymap.h - this file is shared between SInput.cxx and CKeyboard.cxx -// -// Mapping of X keysyms to and from Windows VK codes. Ordering here must be -// such that when we look up a Windows VK code we get the preferred X keysym. -// Going the other way there is no problem because an X keysym always maps to -// exactly one Windows VK code. This map only contain keys which are not the -// normal keys for printable ASCII characters. For example it does not contain -// VK_SPACE (note that things like VK_ADD are for the plus key on the keypad, -// not on the main keyboard). - -struct keymap_t { - rdr::U32 keysym; - rdr::U8 vk; - bool extended; -}; - -static keymap_t keymap[] = { - - { XK_BackSpace, VK_BACK, 0 }, - { XK_Tab, VK_TAB, 0 }, - { XK_Clear, VK_CLEAR, 0 }, - { XK_Return, VK_RETURN, 0 }, - { XK_Pause, VK_PAUSE, 0 }, - { XK_Escape, VK_ESCAPE, 0 }, - { XK_Delete, VK_DELETE, 1 }, - - // Cursor control & motion - - { XK_Home, VK_HOME, 1 }, - { XK_Left, VK_LEFT, 1 }, - { XK_Up, VK_UP, 1 }, - { XK_Right, VK_RIGHT, 1 }, - { XK_Down, VK_DOWN, 1 }, - { XK_Page_Up, VK_PRIOR, 1 }, - { XK_Page_Down, VK_NEXT, 1 }, - { XK_End, VK_END, 1 }, - - // Misc functions - - { XK_Select, VK_SELECT, 0 }, - { XK_Print, VK_SNAPSHOT, 0 }, - { XK_Execute, VK_EXECUTE, 0 }, - { XK_Insert, VK_INSERT, 1 }, - { XK_Help, VK_HELP, 0 }, - { XK_Break, VK_CANCEL, 1 }, - - // Auxilliary Functions - must come before XK_KP_F1, etc - - { XK_F1, VK_F1, 0 }, - { XK_F2, VK_F2, 0 }, - { XK_F3, VK_F3, 0 }, - { XK_F4, VK_F4, 0 }, - { XK_F5, VK_F5, 0 }, - { XK_F6, VK_F6, 0 }, - { XK_F7, VK_F7, 0 }, - { XK_F8, VK_F8, 0 }, - { XK_F9, VK_F9, 0 }, - { XK_F10, VK_F10, 0 }, - { XK_F11, VK_F11, 0 }, - { XK_F12, VK_F12, 0 }, - { XK_F13, VK_F13, 0 }, - { XK_F14, VK_F14, 0 }, - { XK_F15, VK_F15, 0 }, - { XK_F16, VK_F16, 0 }, - { XK_F17, VK_F17, 0 }, - { XK_F18, VK_F18, 0 }, - { XK_F19, VK_F19, 0 }, - { XK_F20, VK_F20, 0 }, - { XK_F21, VK_F21, 0 }, - { XK_F22, VK_F22, 0 }, - { XK_F23, VK_F23, 0 }, - { XK_F24, VK_F24, 0 }, - - // Keypad Functions, keypad numbers - - { XK_KP_Tab, VK_TAB, 0 }, - { XK_KP_Enter, VK_RETURN, 1 }, - { XK_KP_F1, VK_F1, 0 }, - { XK_KP_F2, VK_F2, 0 }, - { XK_KP_F3, VK_F3, 0 }, - { XK_KP_F4, VK_F4, 0 }, - { XK_KP_Home, VK_HOME, 0 }, - { XK_KP_Left, VK_LEFT, 0 }, - { XK_KP_Up, VK_UP, 0 }, - { XK_KP_Right, VK_RIGHT, 0 }, - { XK_KP_Down, VK_DOWN, 0 }, - { XK_KP_End, VK_END, 0 }, - { XK_KP_Page_Up, VK_PRIOR, 0 }, - { XK_KP_Page_Down, VK_NEXT, 0 }, - { XK_KP_Begin, VK_CLEAR, 0 }, - { XK_KP_Insert, VK_INSERT, 0 }, - { XK_KP_Delete, VK_DELETE, 0 }, - { XK_KP_Multiply, VK_MULTIPLY, 0 }, - { XK_KP_Add, VK_ADD, 0 }, - { XK_KP_Separator, VK_SEPARATOR, 0 }, - { XK_KP_Subtract, VK_SUBTRACT, 0 }, - { XK_KP_Decimal, VK_DECIMAL, 0 }, - { XK_KP_Divide, VK_DIVIDE, 1 }, - - { XK_KP_0, VK_NUMPAD0, 0 }, - { XK_KP_1, VK_NUMPAD1, 0 }, - { XK_KP_2, VK_NUMPAD2, 0 }, - { XK_KP_3, VK_NUMPAD3, 0 }, - { XK_KP_4, VK_NUMPAD4, 0 }, - { XK_KP_5, VK_NUMPAD5, 0 }, - { XK_KP_6, VK_NUMPAD6, 0 }, - { XK_KP_7, VK_NUMPAD7, 0 }, - { XK_KP_8, VK_NUMPAD8, 0 }, - { XK_KP_9, VK_NUMPAD9, 0 }, - - // Modifiers - - { XK_Shift_L, VK_SHIFT, 0 }, - { XK_Shift_R, VK_SHIFT, 0 }, - { XK_Control_L, VK_CONTROL, 0 }, - { XK_Control_R, VK_CONTROL, 1 }, - { XK_Alt_L, VK_MENU, 0 }, - { XK_Alt_R, VK_MENU, 1 }, - - // Left & Right Windows keys & Windows Menu Key - - { XK_Super_L, VK_LWIN, 0 }, - { XK_Super_R, VK_RWIN, 0 }, - { XK_Menu, VK_APPS, 0 }, - - // Japanese stuff - almost certainly wrong... - - { XK_Kanji, VK_KANJI, 0 }, - { XK_Kana_Shift, VK_KANA, 0 }, - -}; diff --git a/rfb_win32/rfb_win32.dsp b/rfb_win32/rfb_win32.dsp deleted file mode 100644 index 664e3966..00000000 --- a/rfb_win32/rfb_win32.dsp +++ /dev/null @@ -1,513 +0,0 @@ -# Microsoft Developer Studio Project File - Name="rfb_win32" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=rfb_win32 - Win32 Debug Unicode
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "rfb_win32.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "rfb_win32.mak" CFG="rfb_win32 - Win32 Debug Unicode"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "rfb_win32 - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "rfb_win32 - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE "rfb_win32 - Win32 Debug Unicode" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "rfb_win32 - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I ".." /FI"rdr/msvcwarning.h" /D "NDEBUG" /D "_LIB" /D "WIN32" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x809 /d "NDEBUG"
-# ADD RSC /l 0x809 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "rfb_win32 - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /FI"rdr/msvcwarning.h" /D "_DEBUG" /D "_LIB" /D "WIN32" /D "_MBCS" /FR /YX /FD /GZ /c
-# ADD BASE RSC /l 0x809 /d "_DEBUG"
-# ADD RSC /l 0x809 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "rfb_win32 - Win32 Debug Unicode"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "rfb_win32___Win32_Debug_Unicode"
-# PROP BASE Intermediate_Dir "rfb_win32___Win32_Debug_Unicode"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug_Unicode"
-# PROP Intermediate_Dir "Debug_Unicode"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /FI"msvcwarning.h" /D "_DEBUG" /D "_LIB" /D "WIN32" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /FI"rdr/msvcwarning.h" /D "_LIB" /D "_DEBUG" /D "WIN32" /D "_UNICODE" /D "UNICODE" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x809 /d "_DEBUG"
-# ADD RSC /l 0x809 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "rfb_win32 - Win32 Release"
-# Name "rfb_win32 - Win32 Debug"
-# Name "rfb_win32 - Win32 Debug Unicode"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\AboutDialog.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\CKeyboard.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\CleanDesktop.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Clipboard.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\CPointer.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\CurrentUser.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\DeviceContext.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\DeviceFrameBuffer.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Dialog.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\DIBSectionBuffer.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\DynamicFn.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\EventManager.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\FolderManager.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\LaunchProcess.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\ListViewControl.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\LowLevelKeyEvents.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\MonitorInfo.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\MsgWindow.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\OSVersion.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\ProgressControl.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\RegConfig.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Registry.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\ScaledDIBSectionBuffer.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplay.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplayCorePolling.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplayCoreWMHooks.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Security.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Service.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SFileTransferManagerWin32.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SFileTransferWin32.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SInput.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\SocketManager.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\TCharArray.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Threading.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\ToolBar.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\TsSessions.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\Win32Util.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMCursor.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMHooks.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMNotifier.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMPoller.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMShatter.cxx
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMWindowCopyRect.cxx
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=.\AboutDialog.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\BitmapInfo.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\CKeyboard.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\CleanDesktop.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Clipboard.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\CompatibleBitmap.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ComputerName.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\CPointer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\CurrentUser.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\DeviceContext.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\DeviceFrameBuffer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Dialog.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\DIBSectionBuffer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\DynamicFn.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\EventManager.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\FolderManager.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Handle.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\IconInfo.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\IntervalTimer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\keymap.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\LaunchProcess.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ListViewControl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\LocalMem.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\LogicalPalette.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\LowLevelKeyEvents.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ModuleFileName.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\MonitorInfo.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\MsgBox.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\MsgWindow.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\OSVersion.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ProgressControl.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\RegConfig.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Registry.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ScaledDIBSectionBuffer.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplay.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplayCoreDriver.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplayCorePolling.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SDisplayCoreWMHooks.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Security.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Service.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SFileTransferManagerWin32.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SFileTransferWin32.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SInput.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\SocketManager.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\TCharArray.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Threading.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\ToolBar.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\TrayIcon.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\TsSessions.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Win32Util.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMCursor.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMHooks.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMNotifier.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMPoller.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMShatter.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\WMWindowCopyRect.h
-# End Source File
-# End Group
-# End Target
-# End Project
|