Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members

CMSWindowsClipboardHTMLConverter.cpp

00001 /*
00002  * synergy -- mouse and keyboard sharing utility
00003  * Copyright (C) 2004 Chris Schoeneman
00004  * 
00005  * This package is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * found in the file COPYING that should have accompanied this file.
00008  * 
00009  * This package is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  */
00014 
00015 #include "CMSWindowsClipboardHTMLConverter.h"
00016 #include "CStringUtil.h"
00017 
00018 //
00019 // CMSWindowsClipboardHTMLConverter
00020 //
00021 
00022 CMSWindowsClipboardHTMLConverter::CMSWindowsClipboardHTMLConverter()
00023 {
00024     m_format = RegisterClipboardFormat("HTML Format");
00025 }
00026 
00027 CMSWindowsClipboardHTMLConverter::~CMSWindowsClipboardHTMLConverter()
00028 {
00029     // do nothing
00030 }
00031 
00032 IClipboard::EFormat
00033 CMSWindowsClipboardHTMLConverter::getFormat() const
00034 {
00035     return IClipboard::kHTML;
00036 }
00037 
00038 UINT
00039 CMSWindowsClipboardHTMLConverter::getWin32Format() const
00040 {
00041     return m_format;
00042 }
00043 
00044 CString
00045 CMSWindowsClipboardHTMLConverter::doFromIClipboard(const CString& data) const
00046 {
00047     // prepare to CF_HTML format prefix and suffix
00048     CString prefix("Version:0.9\nStartHTML:-1\nEndHTML:-1\n"
00049                     "StartFragment:XXXXXXXXXX\nEndFragment:YYYYYYYYYY\n"
00050                     "<!DOCTYPE><HTML><BODY><!--StartFragment-->");
00051     CString suffix("<!--EndFragment--></BODY></HTML>\n");
00052     UInt32 start = prefix.size();
00053     UInt32 end   = start + data.size();
00054     prefix.replace(prefix.find("XXXXXXXXXX"), 10,
00055                             CStringUtil::print("%010u", start));
00056     prefix.replace(prefix.find("YYYYYYYYYY"), 10,
00057                             CStringUtil::print("%010u", end));
00058 
00059     // concatenate
00060     prefix += data;
00061     prefix += suffix;
00062     return prefix;
00063 }
00064 
00065 CString
00066 CMSWindowsClipboardHTMLConverter::doToIClipboard(const CString& data) const
00067 {
00068     // get fragment start/end args
00069     CString startArg = findArg(data, "StartFragment");
00070     CString endArg   = findArg(data, "EndFragment");
00071     if (startArg.empty() || endArg.empty()) {
00072         return CString();
00073     }
00074 
00075     // convert args to integers
00076     SInt32 start = (SInt32)atoi(startArg.c_str());
00077     SInt32 end   = (SInt32)atoi(endArg.c_str());
00078     if (start <= 0 || end <= 0 || start >= end) {
00079         return CString();
00080     }
00081 
00082     // extract the fragment
00083     return data.substr(start, end - start);
00084 }
00085 
00086 CString
00087 CMSWindowsClipboardHTMLConverter::findArg(
00088                 const CString& data, const CString& name) const
00089 {
00090     CString::size_type i = data.find(name);
00091     if (i == CString::npos) {
00092         return CString();
00093     }
00094     i = data.find_first_of(":\r\n", i);
00095     if (i == CString::npos || data[i] != ':') {
00096         return CString();
00097     }
00098     i = data.find_first_of("0123456789\r\n", i + 1);
00099     if (i == CString::npos || data[i] == '\r' || data[i] == '\n') {
00100         return CString();
00101     }
00102     CString::size_type j = data.find_first_not_of("0123456789", i);
00103     if (j == CString::npos) {
00104         j = data.size();
00105     }
00106     return data.substr(i, j - i);
00107 }

Generated on Fri Nov 6 00:21:14 2009 for synergy-plus by  doxygen 1.3.9.1