refactor: IClipboard::EFormat => enum class Clipboard::Format

This commit is contained in:
sithlord48 2025-07-30 08:19:15 -04:00 committed by Nick Bolton
parent 943141d65c
commit 8977d70dd9
39 changed files with 164 additions and 156 deletions

View file

@ -27,7 +27,7 @@ bool Clipboard::empty()
} }
// clear all data // clear all data
for (int32_t index = 0; index < kNumFormats; ++index) { for (int32_t index = 0; index < static_cast<int>(Format::TotalFormats); ++index) {
m_data[index] = ""; m_data[index] = "";
m_added[index] = false; m_added[index] = false;
} }
@ -41,7 +41,7 @@ bool Clipboard::empty()
return true; return true;
} }
void Clipboard::add(EFormat format, const std::string &data) void Clipboard::add(Format format, const std::string &data)
{ {
if (!m_open) { if (!m_open) {
LOG_WARN("cannot add to clipboard, not open"); LOG_WARN("cannot add to clipboard, not open");
@ -53,8 +53,9 @@ void Clipboard::add(EFormat format, const std::string &data)
return; return;
} }
m_data[format] = data; const auto formatID = static_cast<int>(format);
m_added[format] = true; m_data[formatID] = data;
m_added[formatID] = true;
} }
bool Clipboard::open(Time time) const bool Clipboard::open(Time time) const
@ -83,22 +84,22 @@ Clipboard::Time Clipboard::getTime() const
return m_timeOwned; return m_timeOwned;
} }
bool Clipboard::has(EFormat format) const bool Clipboard::has(Format format) const
{ {
if (!m_open) { if (!m_open) {
LOG_WARN("cannot check for clipboard format, not open"); LOG_WARN("cannot check for clipboard format, not open");
return false; return false;
} }
return m_added[format]; return m_added[static_cast<int>(format)];
} }
std::string Clipboard::get(EFormat format) const std::string Clipboard::get(Format format) const
{ {
if (!m_open) { if (!m_open) {
LOG_WARN("cannot get clipboard format, not open"); LOG_WARN("cannot get clipboard format, not open");
return ""; return "";
} }
return m_data[format]; return m_data[static_cast<int>(format)];
} }
void Clipboard::unmarshall(const std::string &data, Time time) void Clipboard::unmarshall(const std::string &data, Time time)

View file

@ -44,18 +44,18 @@ public:
// IClipboard overrides // IClipboard overrides
bool empty() final; bool empty() final;
void add(EFormat, const std::string &data) override; void add(Format, const std::string &data) override;
bool open(Time) const final; bool open(Time) const final;
void close() const override; void close() const override;
Time getTime() const override; Time getTime() const override;
bool has(EFormat) const override; bool has(Format) const override;
std::string get(EFormat) const override; std::string get(Format) const override;
private: private:
mutable bool m_open = false; mutable bool m_open = false;
mutable Time m_time; mutable Time m_time;
bool m_owner = false; bool m_owner = false;
Time m_timeOwned; Time m_timeOwned;
bool m_added[kNumFormats] = {false, false, false}; bool m_added[static_cast<int>(Format::TotalFormats)] = {false, false, false};
std::string m_data[kNumFormats] = {"", "", ""}; std::string m_data[static_cast<int>(Format::TotalFormats)] = {"", "", ""};
}; };

View file

@ -30,7 +30,7 @@ void IClipboard::unmarshall(IClipboard *clipboard, const std::string_view &data,
// read each format // read each format
for (uint32_t i = 0; i < numFormats; ++i) { for (uint32_t i = 0; i < numFormats; ++i) {
// get the format id // get the format id
auto format = static_cast<IClipboard::EFormat>(readUInt32(index)); auto format = static_cast<IClipboard::Format>(readUInt32(index));
index += 4; index += 4;
// get the size of the format data // get the size of the format data
@ -40,7 +40,7 @@ void IClipboard::unmarshall(IClipboard *clipboard, const std::string_view &data,
// save the data if it's a known format. if either the client // save the data if it's a known format. if either the client
// or server supports more clipboard formats than the other // or server supports more clipboard formats than the other
// then one of them will get a format >= kNumFormats here. // then one of them will get a format >= kNumFormats here.
if (format < IClipboard::kNumFormats) { if (format < IClipboard::Format::TotalFormats) {
clipboard->add(format, std::string(index, size)); clipboard->add(format, std::string(index, size));
} }
index += size; index += size;
@ -63,19 +63,19 @@ std::string IClipboard::marshall(const IClipboard *clipboard)
assert(clipboard != nullptr); assert(clipboard != nullptr);
std::string data; std::string data;
static const auto totalClipboardFormats = static_cast<int>(Format::TotalFormats);
std::vector<std::string> formatData; std::vector<std::string> formatData;
formatData.resize(IClipboard::kNumFormats); formatData.resize(totalClipboardFormats);
// FIXME -- use current time // FIXME -- use current time
if (clipboard->open(0)) { if (clipboard->open(0)) {
// compute size of marshalled data // compute size of marshalled data
uint32_t size = 4; uint32_t size = 4;
uint32_t numFormats = 0; uint32_t numFormats = 0;
for (uint32_t format = 0; format != IClipboard::kNumFormats; ++format) { for (uint32_t format = 0; format != totalClipboardFormats; ++format) {
if (clipboard->has(static_cast<IClipboard::EFormat>(format))) { if (clipboard->has(static_cast<IClipboard::Format>(format))) {
++numFormats; ++numFormats;
formatData[format] = clipboard->get(static_cast<IClipboard::EFormat>(format)); formatData[format] = clipboard->get(static_cast<IClipboard::Format>(format));
size += 4 + 4 + (uint32_t)formatData[format].size(); size += 4 + 4 + (uint32_t)formatData[format].size();
} }
} }
@ -85,8 +85,8 @@ std::string IClipboard::marshall(const IClipboard *clipboard)
// marshall the data // marshall the data
writeUInt32(&data, numFormats); writeUInt32(&data, numFormats);
for (uint32_t format = 0; format != IClipboard::kNumFormats; ++format) { for (uint32_t format = 0; format != totalClipboardFormats; ++format) {
if (clipboard->has(static_cast<IClipboard::EFormat>(format))) { if (clipboard->has(static_cast<IClipboard::Format>(format))) {
writeUInt32(&data, format); writeUInt32(&data, format);
writeUInt32(&data, (uint32_t)formatData[format].size()); writeUInt32(&data, (uint32_t)formatData[format].size());
data += formatData[format]; data += formatData[format];
@ -115,8 +115,8 @@ bool IClipboard::copy(IClipboard *dst, const IClipboard *src, Time time)
if (src->open(time)) { if (src->open(time)) {
if (dst->open(time)) { if (dst->open(time)) {
if (dst->empty()) { if (dst->empty()) {
for (int32_t format = 0; format != IClipboard::kNumFormats; ++format) { for (int32_t format = 0; format != static_cast<int>(Format::TotalFormats); ++format) {
auto eFormat = (IClipboard::EFormat)format; auto eFormat = (IClipboard::Format)format;
if (src->has(eFormat)) { if (src->has(eFormat)) {
dst->add(eFormat, src->get(eFormat)); dst->add(eFormat, src->get(eFormat));
} }

View file

@ -46,12 +46,12 @@ public:
HTML fragment (but not necessarily a complete HTML document). HTML fragment (but not necessarily a complete HTML document).
Newlines are LF. Newlines are LF.
*/ */
enum EFormat enum class Format
{ {
kText, //!< Text format, UTF-8, newline is LF Text, //!< Text format, UTF-8, newline is LF
kHTML, //!< HTML format, HTML fragment, UTF-8, newline is LF HTML, //!< HTML format, HTML fragment, UTF-8, newline is LF
kBitmap, //!< Bitmap format, BMP 24/32bpp, BI_RGB Bitmap, //!< Bitmap format, BMP 24/32bpp, BI_RGB
kNumFormats //!< The number of clipboard formats TotalFormats //!< The number of clipboard formats supported
}; };
//! @name manipulators //! @name manipulators
@ -71,7 +71,7 @@ public:
Add data in the given format to the clipboard. May only be Add data in the given format to the clipboard. May only be
called after a successful empty(). called after a successful empty().
*/ */
virtual void add(EFormat, const std::string &data) = 0; virtual void add(Format, const std::string &data) = 0;
//@} //@}
//! @name accessors //! @name accessors
@ -109,7 +109,7 @@ public:
Return true iff the clipboard contains data in the given Return true iff the clipboard contains data in the given
format. Must be called between a successful open() and close(). format. Must be called between a successful open() and close().
*/ */
virtual bool has(EFormat) const = 0; virtual bool has(Format) const = 0;
//! Get data //! Get data
/*! /*!
@ -117,7 +117,7 @@ public:
if there is no data in that format. Must be called between if there is no data in that format. Must be called between
a successful open() and close(). a successful open() and close().
*/ */
virtual std::string get(EFormat) const = 0; virtual std::string get(Format) const = 0;
//! Marshall clipboard data //! Marshall clipboard data
/*! /*!

View file

@ -83,7 +83,7 @@ bool MSWindowsClipboard::empty()
return true; return true;
} }
void MSWindowsClipboard::add(EFormat format, const std::string &data) void MSWindowsClipboard::add(Format format, const std::string &data)
{ {
// exit early if there is no data to prevent spurious "failed to convert clipboard data" errors // exit early if there is no data to prevent spurious "failed to convert clipboard data" errors
if (data.empty()) { if (data.empty()) {
@ -139,7 +139,7 @@ IClipboard::Time MSWindowsClipboard::getTime() const
return m_time; return m_time;
} }
bool MSWindowsClipboard::has(EFormat format) const bool MSWindowsClipboard::has(Format format) const
{ {
for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) { for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) {
IMSWindowsClipboardConverter *converter = *index; IMSWindowsClipboardConverter *converter = *index;
@ -152,7 +152,7 @@ bool MSWindowsClipboard::has(EFormat format) const
return false; return false;
} }
std::string MSWindowsClipboard::get(EFormat format) const std::string MSWindowsClipboard::get(Format format) const
{ {
// find the converter for the first clipboard format we can handle // find the converter for the first clipboard format we can handle
IMSWindowsClipboardConverter *converter = nullptr; IMSWindowsClipboardConverter *converter = nullptr;

View file

@ -46,19 +46,19 @@ public:
// IClipboard overrides // IClipboard overrides
bool empty() override; bool empty() override;
void add(EFormat, const std::string &data) override; void add(Format, const std::string &data) override;
bool open(Time) const override; bool open(Time) const override;
void close() const override; void close() const override;
Time getTime() const override; Time getTime() const override;
bool has(EFormat) const override; bool has(Format) const override;
std::string get(EFormat) const override; std::string get(Format) const override;
void setFacade(IMSWindowsClipboardFacade &facade); void setFacade(IMSWindowsClipboardFacade &facade);
private: private:
void clearConverters(); void clearConverters();
UINT convertFormatToWin32(EFormat) const; UINT convertFormatToWin32(Format) const;
HANDLE convertTextToWin32(const std::string &data) const; HANDLE convertTextToWin32(const std::string &data) const;
std::string convertTextFromWin32(HANDLE) const; std::string convertTextFromWin32(HANDLE) const;
@ -86,7 +86,7 @@ public:
// accessors // accessors
// return the clipboard format this object converts from/to // return the clipboard format this object converts from/to
virtual IClipboard::EFormat getFormat() const = 0; virtual IClipboard::Format getFormat() const = 0;
// return the atom representing the win32 clipboard format that // return the atom representing the win32 clipboard format that
// this object converts from/to // this object converts from/to

View file

@ -11,9 +11,9 @@
// MSWindowsClipboardAnyTextConverter // MSWindowsClipboardAnyTextConverter
// //
IClipboard::EFormat MSWindowsClipboardAnyTextConverter::getFormat() const IClipboard::Format MSWindowsClipboardAnyTextConverter::getFormat() const
{ {
return IClipboard::kText; return IClipboard::Format::Text;
} }
HANDLE HANDLE

View file

@ -17,7 +17,7 @@ public:
~MSWindowsClipboardAnyTextConverter() override = default; ~MSWindowsClipboardAnyTextConverter() override = default;
// IMSWindowsClipboardConverter overrides // IMSWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
UINT getWin32Format() const override = 0; UINT getWin32Format() const override = 0;
HANDLE fromIClipboard(const std::string &) const override; HANDLE fromIClipboard(const std::string &) const override;
std::string toIClipboard(HANDLE) const override; std::string toIClipboard(HANDLE) const override;

View file

@ -13,9 +13,9 @@
// MSWindowsClipboardBitmapConverter // MSWindowsClipboardBitmapConverter
// //
IClipboard::EFormat MSWindowsClipboardBitmapConverter::getFormat() const IClipboard::Format MSWindowsClipboardBitmapConverter::getFormat() const
{ {
return IClipboard::kBitmap; return IClipboard::Format::Bitmap;
} }
UINT MSWindowsClipboardBitmapConverter::getWin32Format() const UINT MSWindowsClipboardBitmapConverter::getWin32Format() const

View file

@ -17,7 +17,7 @@ public:
~MSWindowsClipboardBitmapConverter() override = default; ~MSWindowsClipboardBitmapConverter() override = default;
// IMSWindowsClipboardConverter overrides // IMSWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
UINT getWin32Format() const override; UINT getWin32Format() const override;
HANDLE fromIClipboard(const std::string &) const override; HANDLE fromIClipboard(const std::string &) const override;
std::string toIClipboard(HANDLE) const override; std::string toIClipboard(HANDLE) const override;

View file

@ -18,9 +18,9 @@ MSWindowsClipboardHTMLConverter::MSWindowsClipboardHTMLConverter()
m_format = RegisterClipboardFormat("HTML Format"); m_format = RegisterClipboardFormat("HTML Format");
} }
IClipboard::EFormat MSWindowsClipboardHTMLConverter::getFormat() const IClipboard::Format MSWindowsClipboardHTMLConverter::getFormat() const
{ {
return IClipboard::kHTML; return IClipboard::Format::HTML;
} }
UINT MSWindowsClipboardHTMLConverter::getWin32Format() const UINT MSWindowsClipboardHTMLConverter::getWin32Format() const

View file

@ -17,7 +17,7 @@ public:
~MSWindowsClipboardHTMLConverter() override = default; ~MSWindowsClipboardHTMLConverter() override = default;
// IMSWindowsClipboardConverter overrides // IMSWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
UINT getWin32Format() const override; UINT getWin32Format() const override;
protected: protected:

View file

@ -76,17 +76,17 @@ bool OSXClipboard::synchronize()
return false; return false;
} }
void OSXClipboard::add(EFormat format, const std::string &data) void OSXClipboard::add(Format format, const std::string &data)
{ {
if (m_pboard == nullptr) if (m_pboard == nullptr)
return; return;
LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format)); LOG((CLOG_DEBUG "add %d bytes to clipboard format: %d", data.size(), format));
if (format == IClipboard::kText) { if (format == IClipboard::Format::Text) {
LOG((CLOG_DEBUG "format of data to be added to clipboard was kText")); LOG((CLOG_DEBUG "format of data to be added to clipboard was kText"));
} else if (format == IClipboard::kBitmap) { } else if (format == IClipboard::Format::Bitmap) {
LOG((CLOG_DEBUG "format of data to be added to clipboard was kBitmap")); LOG((CLOG_DEBUG "format of data to be added to clipboard was kBitmap"));
} else if (format == IClipboard::kHTML) { } else if (format == IClipboard::Format::HTML) {
LOG((CLOG_DEBUG "format of data to be added to clipboard was kHTML")); LOG((CLOG_DEBUG "format of data to be added to clipboard was kHTML"));
} }
@ -132,7 +132,7 @@ IClipboard::Time OSXClipboard::getTime() const
return m_time; return m_time;
} }
bool OSXClipboard::has(EFormat format) const bool OSXClipboard::has(Format format) const
{ {
if (m_pboard == nullptr) if (m_pboard == nullptr)
return false; return false;
@ -157,7 +157,7 @@ bool OSXClipboard::has(EFormat format) const
return false; return false;
} }
std::string OSXClipboard::get(EFormat format) const std::string OSXClipboard::get(Format format) const
{ {
CFStringRef type; CFStringRef type;
PasteboardItemID item; PasteboardItemID item;

View file

@ -26,12 +26,12 @@ public:
// IClipboard overrides // IClipboard overrides
bool empty() override; bool empty() override;
void add(EFormat, const std::string &data) override; void add(Format, const std::string &data) override;
bool open(Time) const override; bool open(Time) const override;
void close() const override; void close() const override;
Time getTime() const override; Time getTime() const override;
bool has(EFormat) const override; bool has(Format) const override;
std::string get(EFormat) const override; std::string get(Format) const override;
bool synchronize(); bool synchronize();
@ -60,7 +60,7 @@ public:
/*! /*!
Return the clipboard format this object converts from/to. Return the clipboard format this object converts from/to.
*/ */
virtual IClipboard::EFormat getFormat() const = 0; virtual IClipboard::Format getFormat() const = 0;
//! returns the scrap flavor type that this object converts from/to //! returns the scrap flavor type that this object converts from/to
virtual CFStringRef getOSXFormat() const = 0; virtual CFStringRef getOSXFormat() const = 0;

View file

@ -8,9 +8,9 @@
#include "platform/OSXClipboardAnyBitmapConverter.h" #include "platform/OSXClipboardAnyBitmapConverter.h"
#include <algorithm> #include <algorithm>
IClipboard::EFormat OSXClipboardAnyBitmapConverter::getFormat() const IClipboard::Format OSXClipboardAnyBitmapConverter::getFormat() const
{ {
return IClipboard::kBitmap; return IClipboard::Format::Bitmap;
} }
std::string OSXClipboardAnyBitmapConverter::fromIClipboard(const std::string &data) const std::string OSXClipboardAnyBitmapConverter::fromIClipboard(const std::string &data) const

View file

@ -17,7 +17,7 @@ public:
~OSXClipboardAnyBitmapConverter() override = default; ~OSXClipboardAnyBitmapConverter() override = default;
// IOSXClipboardConverter overrides // IOSXClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
CFStringRef getOSXFormat() const override = 0; CFStringRef getOSXFormat() const override = 0;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;
std::string toIClipboard(const std::string &) const override; std::string toIClipboard(const std::string &) const override;

View file

@ -13,9 +13,9 @@
// OSXClipboardAnyTextConverter // OSXClipboardAnyTextConverter
// //
IClipboard::EFormat OSXClipboardAnyTextConverter::getFormat() const IClipboard::Format OSXClipboardAnyTextConverter::getFormat() const
{ {
return IClipboard::kText; return IClipboard::Format::Text;
} }
std::string OSXClipboardAnyTextConverter::fromIClipboard(const std::string &data) const std::string OSXClipboardAnyTextConverter::fromIClipboard(const std::string &data) const

View file

@ -17,7 +17,7 @@ public:
~OSXClipboardAnyTextConverter() override = default; ~OSXClipboardAnyTextConverter() override = default;
// IOSXClipboardConverter overrides // IOSXClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;
std::string toIClipboard(const std::string &) const override; std::string toIClipboard(const std::string &) const override;
CFStringRef getOSXFormat() const override = 0; CFStringRef getOSXFormat() const override = 0;

View file

@ -48,9 +48,9 @@ static void toLE(uint8_t *&dst, uint32_t src)
dst += 4; dst += 4;
} }
IClipboard::EFormat OSXClipboardBMPConverter::getFormat() const IClipboard::Format OSXClipboardBMPConverter::getFormat() const
{ {
return IClipboard::kBitmap; return IClipboard::Format::Bitmap;
} }
CFStringRef OSXClipboardBMPConverter::getOSXFormat() const CFStringRef OSXClipboardBMPConverter::getOSXFormat() const

View file

@ -17,7 +17,7 @@ public:
~OSXClipboardBMPConverter() override = default; ~OSXClipboardBMPConverter() override = default;
// IMSWindowsClipboardConverter overrides // IMSWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
CFStringRef getOSXFormat() const override; CFStringRef getOSXFormat() const override;
// OSXClipboardAnyBMPConverter overrides // OSXClipboardAnyBMPConverter overrides

View file

@ -9,9 +9,9 @@
#include "base/Unicode.h" #include "base/Unicode.h"
IClipboard::EFormat OSXClipboardHTMLConverter::getFormat() const IClipboard::Format OSXClipboardHTMLConverter::getFormat() const
{ {
return IClipboard::kHTML; return IClipboard::Format::HTML;
} }
CFStringRef OSXClipboardHTMLConverter::getOSXFormat() const CFStringRef OSXClipboardHTMLConverter::getOSXFormat() const

View file

@ -17,7 +17,7 @@ public:
~OSXClipboardHTMLConverter() override = default; ~OSXClipboardHTMLConverter() override = default;
// IMSWindowsClipboardConverter overrides // IMSWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
CFStringRef getOSXFormat() const override; CFStringRef getOSXFormat() const override;
protected: protected:

View file

@ -147,7 +147,7 @@ bool XWindowsClipboard::addSimpleRequest(Window requestor, Atom target, ::Time t
} else { } else {
const IXWindowsClipboardConverter *converter = getConverter(target); const IXWindowsClipboardConverter *converter = getConverter(target);
if (converter != nullptr) { if (converter != nullptr) {
IClipboard::EFormat clipboardFormat = converter->getFormat(); const auto clipboardFormat = static_cast<int>(converter->getFormat());
if (m_added[clipboardFormat]) { if (m_added[clipboardFormat]) {
try { try {
data = converter->fromIClipboard(m_data[clipboardFormat]); data = converter->fromIClipboard(m_data[clipboardFormat]);
@ -262,15 +262,16 @@ bool XWindowsClipboard::empty()
return true; return true;
} }
void XWindowsClipboard::add(EFormat format, const std::string &data) void XWindowsClipboard::add(Format format, const std::string &data)
{ {
assert(m_open); assert(m_open);
assert(m_owner); assert(m_owner);
LOG((CLOG_DEBUG "add %d bytes to clipboard %d format: %d", data.size(), m_id, format)); LOG((CLOG_DEBUG "add %d bytes to clipboard %d format: %d", data.size(), m_id, format));
m_data[format] = data; const auto formatID = static_cast<int>(format);
m_added[format] = true; m_data[formatID] = data;
m_added[formatID] = true;
// FIXME -- set motif clipboard item? // FIXME -- set motif clipboard item?
} }
@ -333,20 +334,20 @@ IClipboard::Time XWindowsClipboard::getTime() const
return m_timeOwned; return m_timeOwned;
} }
bool XWindowsClipboard::has(EFormat format) const bool XWindowsClipboard::has(Format format) const
{ {
assert(m_open); assert(m_open);
fillCache(); fillCache();
return m_added[format]; return m_added[static_cast<int>(format)];
} }
std::string XWindowsClipboard::get(EFormat format) const std::string XWindowsClipboard::get(Format format) const
{ {
assert(m_open); assert(m_open);
fillCache(); fillCache();
return m_data[format]; return m_data[static_cast<int>(format)];
} }
void XWindowsClipboard::clearConverters() void XWindowsClipboard::clearConverters()
@ -372,8 +373,8 @@ IXWindowsClipboardConverter *XWindowsClipboard::getConverter(Atom target, bool o
} }
// optionally skip already handled targets // optionally skip already handled targets
if (onlyIfNotAdded && m_added[converter->getFormat()]) { if (const auto formatID = static_cast<int>(converter->getFormat()); onlyIfNotAdded && m_added[formatID]) {
LOG((CLOG_DEBUG1 " skipping handled format %d", converter->getFormat())); LOG((CLOG_DEBUG1 " skipping handled format %d", formatID));
return nullptr; return nullptr;
} }
@ -415,7 +416,7 @@ void XWindowsClipboard::doClearCache()
{ {
m_checkCache = false; m_checkCache = false;
m_cached = false; m_cached = false;
for (int32_t index = 0; index < kNumFormats; ++index) { for (int32_t index = 0; index < static_cast<int>(Format::TotalFormats); ++index) {
m_data[index] = ""; m_data[index] = "";
m_added[index] = false; m_added[index] = false;
} }
@ -468,9 +469,10 @@ void XWindowsClipboard::icccmFillCache()
// preference). // preference).
for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) { for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) {
const IXWindowsClipboardConverter *converter = *index; const IXWindowsClipboardConverter *converter = *index;
const auto formatID = static_cast<int>(converter->getFormat());
// skip already handled targets // skip already handled targets
if (m_added[converter->getFormat()]) { if (m_added[formatID]) {
continue; continue;
} }
@ -501,11 +503,10 @@ void XWindowsClipboard::icccmFillCache()
} }
// add to clipboard and note we've done it // add to clipboard and note we've done it
IClipboard::EFormat format = converter->getFormat(); m_data[formatID] = converter->toIClipboard(targetData);
m_data[format] = converter->toIClipboard(targetData); m_added[formatID] = true;
m_added[format] = true;
LOG( LOG(
(CLOG_DEBUG "added format %d for target %s (%u %s)", format, (CLOG_DEBUG "added format %d for target %s (%u %s)", formatID,
XWindowsUtil::atomToString(m_display, target).c_str(), targetData.size(), XWindowsUtil::atomToString(m_display, target).c_str(), targetData.size(),
targetData.size() == 1 ? "byte" : "bytes") targetData.size() == 1 ? "byte" : "bytes")
); );
@ -693,9 +694,10 @@ void XWindowsClipboard::motifFillCache()
// preference). // preference).
for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) { for (ConverterList::const_iterator index = m_converters.begin(); index != m_converters.end(); ++index) {
const IXWindowsClipboardConverter *converter = *index; const IXWindowsClipboardConverter *converter = *index;
const auto formatID = static_cast<int>(converter->getFormat());
// skip already handled targets // skip already handled targets
if (m_added[converter->getFormat()]) { if (m_added[formatID]) {
continue; continue;
} }
@ -719,9 +721,8 @@ void XWindowsClipboard::motifFillCache()
} }
// add to clipboard and note we've done it // add to clipboard and note we've done it
IClipboard::EFormat format = converter->getFormat(); m_data[formatID] = converter->toIClipboard(targetData);
m_data[format] = converter->toIClipboard(targetData); m_added[formatID] = true;
m_added[format] = true;
LOG((CLOG_DEBUG "added format %d for target %s", format, XWindowsUtil::atomToString(m_display, target).c_str())); LOG((CLOG_DEBUG "added format %d for target %s", format, XWindowsUtil::atomToString(m_display, target).c_str()));
} }
} }
@ -1123,7 +1124,7 @@ Atom XWindowsClipboard::getTargetsData(std::string &data, int *format) const
const IXWindowsClipboardConverter *converter = *index; const IXWindowsClipboardConverter *converter = *index;
// skip formats we don't have // skip formats we don't have
if (m_added[converter->getFormat()]) { if (m_added[static_cast<int>(converter->getFormat())]) {
XWindowsUtil::appendAtomData(data, converter->getAtom()); XWindowsUtil::appendAtomData(data, converter->getAtom());
} }
} }

View file

@ -77,12 +77,12 @@ public:
// IClipboard overrides // IClipboard overrides
bool empty() override; bool empty() override;
void add(EFormat, const std::string &data) override; void add(Format, const std::string &data) override;
bool open(Time) const override; bool open(Time) const override;
void close() const override; void close() const override;
Time getTime() const override; Time getTime() const override;
bool has(EFormat) const override; bool has(Format) const override;
std::string get(EFormat) const override; std::string get(Format) const override;
private: private:
// remove all converters from our list // remove all converters from our list
@ -95,7 +95,7 @@ private:
IXWindowsClipboardConverter *getConverter(Atom target, bool onlyIfNotAdded = false) const; IXWindowsClipboardConverter *getConverter(Atom target, bool onlyIfNotAdded = false) const;
// convert target atom to clipboard format // convert target atom to clipboard format
EFormat getFormat(Atom target) const; Format getFormat(Atom target) const;
// add a non-MULTIPLE request. does not verify that the selection // add a non-MULTIPLE request. does not verify that the selection
// was owned at the given time. returns true if the conversion // was owned at the given time. returns true if the conversion
@ -296,8 +296,8 @@ private:
mutable bool m_checkCache; mutable bool m_checkCache;
bool m_cached; bool m_cached;
Time m_cacheTime; Time m_cacheTime;
bool m_added[kNumFormats]; bool m_added[static_cast<int>(IClipboard::Format::TotalFormats)];
std::string m_data[kNumFormats]; std::string m_data[static_cast<int>(IClipboard::Format::TotalFormats)];
// conversion request replies // conversion request replies
ReplyMap m_replies; ReplyMap m_replies;
@ -336,7 +336,7 @@ public:
/*! /*!
Return the clipboard format this object converts from/to. Return the clipboard format this object converts from/to.
*/ */
virtual IClipboard::EFormat getFormat() const = 0; virtual IClipboard::Format getFormat() const = 0;
//! Get X11 format atom //! Get X11 format atom
/*! /*!

View file

@ -74,9 +74,9 @@ static inline uint32_t fromLEU32(const uint8_t *data)
// XWindowsClipboardAnyBitmapConverter // XWindowsClipboardAnyBitmapConverter
// //
IClipboard::EFormat XWindowsClipboardAnyBitmapConverter::getFormat() const IClipboard::Format XWindowsClipboardAnyBitmapConverter::getFormat() const
{ {
return IClipboard::kBitmap; return IClipboard::Format::Bitmap;
} }
int XWindowsClipboardAnyBitmapConverter::getDataSize() const int XWindowsClipboardAnyBitmapConverter::getDataSize() const

View file

@ -17,7 +17,7 @@ public:
~XWindowsClipboardAnyBitmapConverter() override = default; ~XWindowsClipboardAnyBitmapConverter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override = 0; Atom getAtom() const override = 0;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -57,9 +57,9 @@ XWindowsClipboardBMPConverter::XWindowsClipboardBMPConverter(Display *display)
// do nothing // do nothing
} }
IClipboard::EFormat XWindowsClipboardBMPConverter::getFormat() const IClipboard::Format XWindowsClipboardBMPConverter::getFormat() const
{ {
return IClipboard::kBitmap; return IClipboard::Format::Bitmap;
} }
Atom XWindowsClipboardBMPConverter::getAtom() const Atom XWindowsClipboardBMPConverter::getAtom() const

View file

@ -17,7 +17,7 @@ public:
~XWindowsClipboardBMPConverter() override = default; ~XWindowsClipboardBMPConverter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override; Atom getAtom() const override;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -19,9 +19,9 @@ XWindowsClipboardHTMLConverter::XWindowsClipboardHTMLConverter(Display *display,
// do nothing // do nothing
} }
IClipboard::EFormat XWindowsClipboardHTMLConverter::getFormat() const IClipboard::Format XWindowsClipboardHTMLConverter::getFormat() const
{ {
return IClipboard::kHTML; return IClipboard::Format::HTML;
} }
Atom XWindowsClipboardHTMLConverter::getAtom() const Atom XWindowsClipboardHTMLConverter::getAtom() const

View file

@ -20,7 +20,7 @@ public:
~XWindowsClipboardHTMLConverter() override = default; ~XWindowsClipboardHTMLConverter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override; Atom getAtom() const override;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -19,9 +19,9 @@ XWindowsClipboardTextConverter::XWindowsClipboardTextConverter(Display *display,
// do nothing // do nothing
} }
IClipboard::EFormat XWindowsClipboardTextConverter::getFormat() const IClipboard::Format XWindowsClipboardTextConverter::getFormat() const
{ {
return IClipboard::kText; return IClipboard::Format::Text;
} }
Atom XWindowsClipboardTextConverter::getAtom() const Atom XWindowsClipboardTextConverter::getAtom() const

View file

@ -20,7 +20,7 @@ public:
~XWindowsClipboardTextConverter() override = default; ~XWindowsClipboardTextConverter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override; Atom getAtom() const override;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -19,9 +19,9 @@ XWindowsClipboardUCS2Converter::XWindowsClipboardUCS2Converter(Display *display,
// do nothing // do nothing
} }
IClipboard::EFormat XWindowsClipboardUCS2Converter::getFormat() const IClipboard::Format XWindowsClipboardUCS2Converter::getFormat() const
{ {
return IClipboard::kText; return IClipboard::Format::Text;
} }
Atom XWindowsClipboardUCS2Converter::getAtom() const Atom XWindowsClipboardUCS2Converter::getAtom() const

View file

@ -20,7 +20,7 @@ public:
~XWindowsClipboardUCS2Converter() override = default; ~XWindowsClipboardUCS2Converter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override; Atom getAtom() const override;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -20,9 +20,9 @@ XWindowsClipboardUTF8Converter::XWindowsClipboardUTF8Converter(Display *display,
// do nothing // do nothing
} }
IClipboard::EFormat XWindowsClipboardUTF8Converter::getFormat() const IClipboard::Format XWindowsClipboardUTF8Converter::getFormat() const
{ {
return IClipboard::kText; return IClipboard::Format::Text;
} }
Atom XWindowsClipboardUTF8Converter::getAtom() const Atom XWindowsClipboardUTF8Converter::getAtom() const

View file

@ -20,7 +20,7 @@ public:
~XWindowsClipboardUTF8Converter() override = default; ~XWindowsClipboardUTF8Converter() override = default;
// IXWindowsClipboardConverter overrides // IXWindowsClipboardConverter overrides
IClipboard::EFormat getFormat() const override; IClipboard::Format getFormat() const override;
Atom getAtom() const override; Atom getAtom() const override;
int getDataSize() const override; int getDataSize() const override;
std::string fromIClipboard(const std::string &) const override; std::string fromIClipboard(const std::string &) const override;

View file

@ -37,26 +37,28 @@ void ClipboardTests::basicFunction()
void ClipboardTests::basicText() void ClipboardTests::basicText()
{ {
using enum IClipboard::Format;
Clipboard clipboard; Clipboard clipboard;
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
QVERIFY(!clipboard.has(Clipboard::kText)); QVERIFY(!clipboard.has(Text));
QCOMPARE(clipboard.get(IClipboard::kText), ""); QCOMPARE(clipboard.get(Text), "");
clipboard.add(Clipboard::kText, kTestString1); clipboard.add(Text, kTestString1);
QVERIFY(clipboard.has(Clipboard::kText)); QVERIFY(clipboard.has(Text));
QCOMPARE(clipboard.get(IClipboard::kText), kTestString1); QCOMPARE(clipboard.get(Text), kTestString1);
std::string actual = clipboard.marshall(); std::string actual = clipboard.marshall();
// string contains other data, but 8th char should be kText. // string contains other data, but 8th char should be kText.
QCOMPARE(IClipboard::kText, actual[7]); QCOMPARE(static_cast<char>(Text), actual.at(7));
QCOMPARE((int)actual[11], kTestString1.length()); QCOMPARE((int)actual[11], kTestString1.length());
// // marshall closes the clipboard // // marshall closes the clipboard
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
clipboard.add(Clipboard::kText, kTestString2); clipboard.add(Text, kTestString2);
QCOMPARE(clipboard.get(IClipboard::kText), kTestString2); QCOMPARE(clipboard.get(Text), kTestString2);
clipboard.close(); clipboard.close();
} }
@ -71,7 +73,7 @@ void ClipboardTests::longerText()
Clipboard clipboard; Clipboard clipboard;
clipboard.open(0); clipboard.open(0);
clipboard.add(IClipboard::kText, text); clipboard.add(IClipboard::Format::Text, text);
clipboard.close(); clipboard.close();
std::string actual = clipboard.marshall(); std::string actual = clipboard.marshall();
@ -94,21 +96,21 @@ void ClipboardTests::htmlText()
{ {
Clipboard clipboard; Clipboard clipboard;
clipboard.open(0); clipboard.open(0);
clipboard.add(IClipboard::kHTML, kTestString1); clipboard.add(IClipboard::Format::HTML, kTestString1);
clipboard.close(); clipboard.close();
std::string actual = clipboard.marshall(); std::string actual = clipboard.marshall();
// string contains other data, but 8th char should be kHTML. // string contains other data, but 8th char should be kHTML.
QCOMPARE(IClipboard::kHTML, (int)actual[7]); QCOMPARE(static_cast<int>(IClipboard::Format::HTML), static_cast<int>(actual.at(7)));
} }
void ClipboardTests::dualText() void ClipboardTests::dualText()
{ {
Clipboard clipboard; Clipboard clipboard;
clipboard.open(0); clipboard.open(0);
clipboard.add(IClipboard::kText, kTestString1); clipboard.add(IClipboard::Format::Text, kTestString1);
clipboard.add(IClipboard::kHTML, kTestString2); clipboard.add(IClipboard::Format::HTML, kTestString2);
clipboard.close(); clipboard.close();
std::string actual = clipboard.marshall(); std::string actual = clipboard.marshall();
@ -125,7 +127,7 @@ void ClipboardTests::marshalText()
{ {
Clipboard clipboard; Clipboard clipboard;
clipboard.open(0); clipboard.open(0);
clipboard.add(IClipboard::kText, kTestString1); clipboard.add(IClipboard::Format::Text, kTestString1);
clipboard.close(); clipboard.close();
std::string actual = clipboard.marshall(); std::string actual = clipboard.marshall();
@ -144,7 +146,7 @@ void ClipboardTests::unMarshalText()
clipboard.unmarshall(data, 0); clipboard.unmarshall(data, 0);
clipboard.open(0); clipboard.open(0);
QVERIFY(!clipboard.has(IClipboard::kText)); QVERIFY(!clipboard.has(IClipboard::Format::Text));
clipboard.close(); clipboard.close();
} }
@ -167,7 +169,7 @@ void ClipboardTests::unMarshalLongerText()
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)IClipboard::kText; data += (char)IClipboard::Format::Text;
data += (char)0; // 287 >> 24 = 287 / (256^3) = 0 data += (char)0; // 287 >> 24 = 287 / (256^3) = 0
data += (char)0; // 287 >> 16 = 287 / (256^2) = 0 data += (char)0; // 287 >> 16 = 287 / (256^2) = 0
data += (char)1; // 287 >> 8 = 287 / (256^1) = 1(.121) data += (char)1; // 287 >> 8 = 287 / (256^1) = 1(.121)
@ -176,7 +178,7 @@ void ClipboardTests::unMarshalLongerText()
clipboard.unmarshall(data, 0); clipboard.unmarshall(data, 0);
clipboard.open(0); clipboard.open(0);
QCOMPARE(clipboard.get(IClipboard::kText), text); QCOMPARE(clipboard.get(IClipboard::Format::Text), text);
clipboard.close(); clipboard.close();
} }
@ -191,7 +193,7 @@ void ClipboardTests::unMarshalTextAndHtml()
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)IClipboard::kText; data += (char)IClipboard::Format::Text;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
@ -200,7 +202,7 @@ void ClipboardTests::unMarshalTextAndHtml()
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)IClipboard::kHTML; data += (char)IClipboard::Format::HTML;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
data += (char)0; data += (char)0;
@ -209,8 +211,8 @@ void ClipboardTests::unMarshalTextAndHtml()
clipboard.unmarshall(data, 0); clipboard.unmarshall(data, 0);
clipboard.open(0); clipboard.open(0);
QCOMPARE(clipboard.get(IClipboard::kText), kTestString1); QCOMPARE(clipboard.get(IClipboard::Format::Text), kTestString1);
QCOMPARE(clipboard.get(IClipboard::kHTML), kTestString2); QCOMPARE(clipboard.get(IClipboard::Format::HTML), kTestString2);
clipboard.close(); clipboard.close();
} }
@ -218,14 +220,14 @@ void ClipboardTests::equalClipboards()
{ {
Clipboard clipboard1; Clipboard clipboard1;
clipboard1.open(0); clipboard1.open(0);
clipboard1.add(Clipboard::kText, kTestString1); clipboard1.add(IClipboard::Format::Text, kTestString1);
clipboard1.close(); clipboard1.close();
Clipboard clipboard2; Clipboard clipboard2;
Clipboard::copy(&clipboard2, &clipboard1); Clipboard::copy(&clipboard2, &clipboard1);
clipboard2.open(0); clipboard2.open(0);
QCOMPARE(clipboard2.get(Clipboard::kText), kTestString1); QCOMPARE(clipboard2.get(IClipboard::Format::Text), kTestString1);
clipboard2.close(); clipboard2.close();
} }

View file

@ -45,9 +45,9 @@ void MSWindowsClipboardTests::emptySingleFormat()
MSWindowsClipboard clipboard(NULL); MSWindowsClipboard clipboard(NULL);
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
clipboard.add(MSWindowsClipboard::kText, m_testString); clipboard.add(IClipboard::Format::Text, m_testString);
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
QVERIFY(!clipboard.has(MSWindowsClipboard::kText)); QVERIFY(!clipboard.has(IClipboard::Format::Text));
} }
void MSWindowsClipboardTests::addValue() void MSWindowsClipboardTests::addValue()
@ -55,19 +55,21 @@ void MSWindowsClipboardTests::addValue()
MSWindowsClipboard clipboard(NULL); MSWindowsClipboard clipboard(NULL);
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
clipboard.add(IClipboard::kText, m_testString); clipboard.add(IClipboard::Format::Text, m_testString);
QCOMPARE(clipboard.get(IClipboard::kText), m_testString); QCOMPARE(clipboard.get(IClipboard::Format::Text), m_testString);
} }
void MSWindowsClipboardTests::replaceValue() void MSWindowsClipboardTests::replaceValue()
{ {
using enum IClipboard::Format;
MSWindowsClipboard clipboard(NULL); MSWindowsClipboard clipboard(NULL);
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
clipboard.add(IClipboard::kText, m_testString); clipboard.add(Text, m_testString);
clipboard.add(IClipboard::kText, m_testString2); clipboard.add(Text, m_testString2);
QCOMPARE(clipboard.get(IClipboard::kText), m_testString2); QCOMPARE(clipboard.get(Text), m_testString2);
} }
void MSWindowsClipboardTests::openTimeIsOne() void MSWindowsClipboardTests::openTimeIsOne()
@ -106,8 +108,8 @@ void MSWindowsClipboardTests::has_withFormatAdded()
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
clipboard.add(IClipboard::kText, m_testString); clipboard.add(IClipboard::Format::Text, m_testString);
QVERIFY(clipboard.has(IClipboard::kText)); QVERIFY(clipboard.has(IClipboard::Format::Text));
} }
void MSWindowsClipboardTests::has_withNoFormatAdded() void MSWindowsClipboardTests::has_withNoFormatAdded()
@ -115,7 +117,7 @@ void MSWindowsClipboardTests::has_withNoFormatAdded()
MSWindowsClipboard clipboard(NULL); MSWindowsClipboard clipboard(NULL);
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
QCOMPARE(clipboard.get(IClipboard::kText), ""); QCOMPARE(clipboard.get(IClipboard::Format::Text), "");
} }
void MSWindowsClipboardTests::getNonEmptyText() void MSWindowsClipboardTests::getNonEmptyText()
@ -124,8 +126,8 @@ void MSWindowsClipboardTests::getNonEmptyText()
QVERIFY(clipboard.open(0)); QVERIFY(clipboard.open(0));
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
clipboard.add(IClipboard::kText, m_testString); clipboard.add(IClipboard::Format::Text, m_testString);
QCOMPARE(clipboard.get(IClipboard::kText), m_testString); QCOMPARE(clipboard.get(IClipboard::Format::Text), m_testString);
} }
void MSWindowsClipboardTests::isOwnedByDeskflow() void MSWindowsClipboardTests::isOwnedByDeskflow()

View file

@ -21,17 +21,19 @@ void OSXClipboardTests::open()
void OSXClipboardTests::singleFormat() void OSXClipboardTests::singleFormat()
{ {
using enum IClipboard::Format;
OSXClipboard clipboard; OSXClipboard clipboard;
QVERIFY(clipboard.empty()); QVERIFY(clipboard.empty());
clipboard.add(OSXClipboard::kText, m_testString); clipboard.add(Text, m_testString);
QVERIFY(clipboard.has(OSXClipboard::kText)); QVERIFY(clipboard.has(Text));
QCOMPARE(clipboard.get(OSXClipboard::kText), m_testString); QCOMPARE(clipboard.get(Text), m_testString);
} }
void OSXClipboardTests::formatConvert_UTF8() void OSXClipboardTests::formatConvert_UTF8()
{ {
OSXClipboardUTF8Converter converter; OSXClipboardUTF8Converter converter;
QCOMPARE(IClipboard::kText, converter.getFormat()); QCOMPARE(IClipboard::Format::Text, converter.getFormat());
QCOMPARE(converter.getOSXFormat(), CFSTR("public.utf8-plain-text")); QCOMPARE(converter.getOSXFormat(), CFSTR("public.utf8-plain-text"));
QCOMPARE(converter.fromIClipboard("test data\n"), "test data\r"); QCOMPARE(converter.fromIClipboard("test data\n"), "test data\r");
QCOMPARE(converter.toIClipboard("test data\r"), "test data\n"); QCOMPARE(converter.toIClipboard("test data\r"), "test data\n");