2002-08-02 19:57:46 +00:00
|
|
|
/*
|
|
|
|
* synergy -- mouse and keyboard sharing utility
|
|
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
|
|
*
|
|
|
|
* This package is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* found in the file COPYING that should have accompanied this file.
|
|
|
|
*
|
|
|
|
* This package is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*/
|
|
|
|
|
2001-11-19 00:33:36 +00:00
|
|
|
#include "CMSWindowsClipboard.h"
|
2002-07-23 15:26:40 +00:00
|
|
|
#include "CMSWindowsClipboardTextConverter.h"
|
|
|
|
#include "CMSWindowsClipboardUTF16Converter.h"
|
2001-11-19 00:33:36 +00:00
|
|
|
#include "CLog.h"
|
|
|
|
|
|
|
|
//
|
|
|
|
// CMSWindowsClipboard
|
|
|
|
//
|
|
|
|
|
2002-06-17 13:31:21 +00:00
|
|
|
CMSWindowsClipboard::CMSWindowsClipboard(HWND window) :
|
2002-06-10 22:06:45 +00:00
|
|
|
m_window(window),
|
|
|
|
m_time(0)
|
2001-11-19 00:33:36 +00:00
|
|
|
{
|
2002-07-23 15:26:40 +00:00
|
|
|
// add converters, most desired first
|
|
|
|
m_converters.push_back(new CMSWindowsClipboardUTF16Converter);
|
|
|
|
m_converters.push_back(new CMSWindowsClipboardTextConverter);
|
2001-11-19 00:33:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
CMSWindowsClipboard::~CMSWindowsClipboard()
|
|
|
|
{
|
2002-07-23 15:26:40 +00:00
|
|
|
clearConverters();
|
2001-11-19 00:33:36 +00:00
|
|
|
}
|
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
bool
|
|
|
|
CMSWindowsClipboard::empty()
|
2001-11-19 00:33:36 +00:00
|
|
|
{
|
2002-05-27 18:55:51 +00:00
|
|
|
log((CLOG_DEBUG "empty clipboard"));
|
2001-11-25 18:32:41 +00:00
|
|
|
|
2002-05-27 18:55:51 +00:00
|
|
|
if (!EmptyClipboard()) {
|
|
|
|
log((CLOG_DEBUG "failed to grab clipboard"));
|
2002-04-30 16:23:03 +00:00
|
|
|
return false;
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2002-04-30 16:23:03 +00:00
|
|
|
|
2001-11-25 18:32:41 +00:00
|
|
|
return true;
|
2001-11-19 00:33:36 +00:00
|
|
|
}
|
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
void
|
2002-06-17 13:31:21 +00:00
|
|
|
CMSWindowsClipboard::add(EFormat format, const CString& data)
|
2001-11-19 00:33:36 +00:00
|
|
|
{
|
2002-05-22 17:08:37 +00:00
|
|
|
log((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format));
|
2001-11-25 18:32:41 +00:00
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
// convert data to win32 form
|
|
|
|
for (ConverterList::const_iterator index = m_converters.begin();
|
|
|
|
index != m_converters.end(); ++index) {
|
|
|
|
IMSWindowsClipboardConverter* converter = *index;
|
|
|
|
|
|
|
|
// skip converters for other formats
|
|
|
|
if (converter->getFormat() == format) {
|
|
|
|
HANDLE win32Data = converter->fromIClipboard(data);
|
|
|
|
if (win32Data != NULL) {
|
|
|
|
UINT win32Format = converter->getWin32Format();
|
|
|
|
if (SetClipboardData(win32Format, win32Data) == NULL) {
|
|
|
|
// free converted data if we couldn't put it on
|
|
|
|
// the clipboard
|
|
|
|
GlobalFree(win32Data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2002-05-27 18:55:51 +00:00
|
|
|
}
|
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
bool
|
2002-06-17 13:31:21 +00:00
|
|
|
CMSWindowsClipboard::open(Time time) const
|
2002-05-27 18:55:51 +00:00
|
|
|
{
|
|
|
|
log((CLOG_DEBUG "open clipboard"));
|
|
|
|
|
|
|
|
if (!OpenClipboard(m_window)) {
|
|
|
|
log((CLOG_WARN "failed to open clipboard"));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
m_time = time;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2001-11-25 18:32:41 +00:00
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
void
|
|
|
|
CMSWindowsClipboard::close() const
|
2002-05-27 18:55:51 +00:00
|
|
|
{
|
|
|
|
log((CLOG_DEBUG "close clipboard"));
|
2001-11-25 18:32:41 +00:00
|
|
|
CloseClipboard();
|
|
|
|
}
|
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
IClipboard::Time
|
|
|
|
CMSWindowsClipboard::getTime() const
|
2002-04-30 16:23:03 +00:00
|
|
|
{
|
|
|
|
return m_time;
|
|
|
|
}
|
|
|
|
|
2002-06-10 22:06:45 +00:00
|
|
|
bool
|
2002-06-17 13:31:21 +00:00
|
|
|
CMSWindowsClipboard::has(EFormat format) const
|
2001-11-25 18:32:41 +00:00
|
|
|
{
|
2002-07-23 15:26:40 +00:00
|
|
|
for (ConverterList::const_iterator index = m_converters.begin();
|
|
|
|
index != m_converters.end(); ++index) {
|
|
|
|
IMSWindowsClipboardConverter* converter = *index;
|
|
|
|
if (converter->getFormat() == format) {
|
|
|
|
if (IsClipboardFormatAvailable(converter->getWin32Format())) {
|
|
|
|
return true;
|
|
|
|
}
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
|
|
|
}
|
2002-07-23 15:26:40 +00:00
|
|
|
return false;
|
2001-11-19 00:33:36 +00:00
|
|
|
}
|
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
CString
|
|
|
|
CMSWindowsClipboard::get(EFormat format) const
|
2001-11-19 00:33:36 +00:00
|
|
|
{
|
2002-07-23 15:26:40 +00:00
|
|
|
// find the converter for the first clipboard format we can handle
|
|
|
|
IMSWindowsClipboardConverter* converter = NULL;
|
|
|
|
UINT win32Format = EnumClipboardFormats(0);
|
2002-07-23 18:59:44 +00:00
|
|
|
while (converter == NULL && win32Format != 0) {
|
2002-07-23 15:26:40 +00:00
|
|
|
for (ConverterList::const_iterator index = m_converters.begin();
|
|
|
|
index != m_converters.end(); ++index) {
|
|
|
|
converter = *index;
|
|
|
|
if (converter->getWin32Format() == win32Format &&
|
|
|
|
converter->getFormat() == format) {
|
|
|
|
break;
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2002-07-23 15:26:40 +00:00
|
|
|
converter = NULL;
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2002-07-23 15:26:40 +00:00
|
|
|
win32Format = EnumClipboardFormats(win32Format);
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2001-11-19 00:33:36 +00:00
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
// if no converter then we don't recognize any formats
|
|
|
|
if (converter == NULL) {
|
2001-11-25 18:32:41 +00:00
|
|
|
return CString();
|
2002-06-10 22:06:45 +00:00
|
|
|
}
|
2001-11-25 18:32:41 +00:00
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
// get a handle to the clipboard data
|
|
|
|
HANDLE win32Data = GetClipboardData(converter->getWin32Format());
|
|
|
|
if (win32Data == NULL) {
|
|
|
|
return CString();
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
// convert
|
|
|
|
return converter->toIClipboard(win32Data);
|
|
|
|
}
|
2001-11-25 18:32:41 +00:00
|
|
|
|
2002-07-23 15:26:40 +00:00
|
|
|
void
|
|
|
|
CMSWindowsClipboard::clearConverters()
|
|
|
|
{
|
|
|
|
for (ConverterList::iterator index = m_converters.begin();
|
|
|
|
index != m_converters.end(); ++index) {
|
|
|
|
delete *index;
|
2001-11-25 18:32:41 +00:00
|
|
|
}
|
2002-07-23 15:26:40 +00:00
|
|
|
m_converters.clear();
|
2001-11-19 00:33:36 +00:00
|
|
|
}
|