source: trunk/synergy/lib/platform/CPMClipboardHTMLConverter.cpp

Last change on this file was 2752, checked in by bird, 19 years ago

Two classes (CPMScreen and CPMKeyState) + the hook dll left (and debugging of course).

File size: 2.9 KB
Line 
1/*
2 * synergy -- mouse and keyboard sharing utility
3 * Copyright (C) 2004 Chris Schoeneman
4 * Copyright (C) 2006 Knut St. Osmundsen
5 *
6 * This package is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * found in the file COPYING that should have accompanied this file.
9 *
10 * This package is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 */
15
16#include "CPMClipboardHTMLConverter.h"
17#include "CStringUtil.h"
18
19//
20// CPMClipboardHTMLConverter
21//
22
23CPMClipboardHTMLConverter::CPMClipboardHTMLConverter()
24{
25 m_format = WinAddAtom(WinQuerySystemAtomTable(), (PCSZ)"HTML Format");
26 if (!m_format) {
27 m_format = WinFindAtom(WinQuerySystemAtomTable(), (PCSZ)"HTML Format");
28 assert(m_format);
29 }
30}
31
32CPMClipboardHTMLConverter::~CPMClipboardHTMLConverter()
33{
34 // do nothing
35}
36
37IClipboard::EFormat
38CPMClipboardHTMLConverter::getFormat() const
39{
40 return IClipboard::kHTML;
41}
42
43ULONG
44CPMClipboardHTMLConverter::getPMFormat() const
45{
46 return m_format;
47}
48
49CString
50CPMClipboardHTMLConverter::doFromIClipboard(const CString& data) const
51{
52 // prepare to CF_HTML format prefix and suffix
53 CString prefix("Version:0.9\nStartHTML:-1\nEndHTML:-1\n"
54 "StartFragment:XXXXXXXXXX\nEndFragment:YYYYYYYYYY\n"
55 "<!DOCTYPE><HTML><BODY><!--StartFragment-->");
56 CString suffix("<!--EndFragment--></BODY></HTML>\n");
57 UInt32 start = prefix.size();
58 UInt32 end = start + data.size();
59 prefix.replace(prefix.find("XXXXXXXXXX"), 10,
60 CStringUtil::print("%010u", start));
61 prefix.replace(prefix.find("YYYYYYYYYY"), 10,
62 CStringUtil::print("%010u", end));
63
64 // concatenate
65 prefix += data;
66 prefix += suffix;
67 return prefix;
68}
69
70CString
71CPMClipboardHTMLConverter::doToIClipboard(const CString& data) const
72{
73 // get fragment start/end args
74 CString startArg = findArg(data, "StartFragment");
75 CString endArg = findArg(data, "EndFragment");
76 if (startArg.empty() || endArg.empty()) {
77 return CString();
78 }
79
80 // convert args to integers
81 SInt32 start = (SInt32)atoi(startArg.c_str());
82 SInt32 end = (SInt32)atoi(endArg.c_str());
83 if (start <= 0 || end <= 0 || start >= end) {
84 return CString();
85 }
86
87 // extract the fragment
88 return data.substr(start, end - start);
89}
90
91CString
92CPMClipboardHTMLConverter::findArg(
93 const CString& data, const CString& name) const
94{
95 CString::size_type i = data.find(name);
96 if (i == CString::npos) {
97 return CString();
98 }
99 i = data.find_first_of(":\r\n", i);
100 if (i == CString::npos || data[i] != ':') {
101 return CString();
102 }
103 i = data.find_first_of("0123456789\r\n", i + 1);
104 if (i == CString::npos || data[i] == '\r' || data[i] == '\n') {
105 return CString();
106 }
107 CString::size_type j = data.find_first_not_of("0123456789", i);
108 if (j == CString::npos) {
109 j = data.size();
110 }
111 return data.substr(i, j - i);
112}
Note: See TracBrowser for help on using the repository browser.