genode/repos/libports/src/lib/qt5/qtbase/src/plugins/platforms/nitpicker/qgenodeclipboard.cpp

141 lines
2.9 KiB
C++

/*
* \brief QGenodeClipboard
* \author Christian Prochaska
* \date 2015-09-18
*/
/*
* Copyright (C) 2015 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#include "qgenodeclipboard.h"
#ifndef QT_NO_CLIPBOARD
/* Genode includes */
#include <os/config.h>
#include <util/xml_node.h>
/* Qt includes */
#include <QMimeData>
QT_BEGIN_NAMESPACE
static constexpr bool verbose = false;
QGenodeClipboard::QGenodeClipboard(Genode::Signal_receiver &sig_rcv)
: _clipboard_signal_dispatcher(sig_rcv, *this, &QGenodeClipboard::_handle_clipboard)
{
try {
if (Genode::config()->xml_node().attribute("clipboard").has_value("yes")) {
try {
_clipboard_ds = new (Genode::env()->heap())
Genode::Attached_rom_dataspace("clipboard");
_clipboard_ds->sigh(_clipboard_signal_dispatcher);
_clipboard_ds->update();
} catch (...) { }
try {
_clipboard_reporter = new (Genode::env()->heap())
Genode::Reporter("clipboard");
_clipboard_reporter->enabled(true);
} catch (...) { }
}
} catch (...) { }
}
QGenodeClipboard::~QGenodeClipboard()
{
free(_decoded_clipboard_content);
destroy(Genode::env()->heap(), _clipboard_ds);
destroy(Genode::env()->heap(), _clipboard_reporter);
}
void QGenodeClipboard::_handle_clipboard(unsigned int)
{
emitChanged(QClipboard::Clipboard);
}
QMimeData *QGenodeClipboard::mimeData(QClipboard::Mode mode)
{
if (!_clipboard_ds)
return 0;
_clipboard_ds->update();
if (!_clipboard_ds->is_valid()) {
if (verbose)
PERR("invalid clipboard dataspace");
return 0;
}
char *xml_data = _clipboard_ds->local_addr<char>();
try {
Genode::Xml_node node(xml_data);
if (!node.has_type("clipboard")) {
PERR("invalid clipboard xml syntax");
return 0;
}
free(_decoded_clipboard_content);
_decoded_clipboard_content = (char*)malloc(node.content_size());
if (!_decoded_clipboard_content) {
PERR("could not allocate buffer for decoded clipboard content");
return 0;
}
_mimedata->setText(QString::fromUtf8(_decoded_clipboard_content,
node.decoded_content(_decoded_clipboard_content,
node.content_size())));
} catch (Genode::Xml_node::Invalid_syntax) {
PERR("invalid clipboard xml syntax");
return 0;
}
return _mimedata;
}
void QGenodeClipboard::setMimeData(QMimeData *data, QClipboard::Mode mode)
{
if (!data || !data->hasText() || !supportsMode(mode))
return;
QString text = data->text();
QByteArray utf8text = text.toUtf8();
if (!_clipboard_reporter)
return;
try {
Genode::Reporter::Xml_generator xml(*_clipboard_reporter, [&] () {
xml.append_sanitized(utf8text.constData(), utf8text.size()); });
} catch (...) {
PERR("could not write clipboard data");
}
}
QT_END_NAMESPACE
#endif /* QT_NO_CLIPBOARD */