qiosclipboard: take ownership over mime data

QClipboard is documented to take ownership over
the mime data set with "setMimeData" and the value
returned by "mimeData". So we need to implement
this to avoid memory leaks.

Change-Id: Ieb3a17368ed3a698c29a7f92c8ee87a0cca86b46
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com>
bb10
Richard Moe Gustavsen 2014-10-10 09:57:31 +02:00
parent 7c90778487
commit 65c542bc87
2 changed files with 14 additions and 1 deletions

View File

@ -36,6 +36,7 @@
#import <UIKit/UIKit.h>
#include <QMimeData>
#include <qpa/qplatformclipboard.h>
@class QUIClipboard;
@ -46,6 +47,8 @@ class QIOSClipboard : public QPlatformClipboard
{
public:
QIOSClipboard();
~QIOSClipboard();
QMimeData *mimeData(QClipboard::Mode mode = QClipboard::Clipboard) Q_DECL_OVERRIDE;
void setMimeData(QMimeData *mimeData, QClipboard::Mode mode = QClipboard::Clipboard) Q_DECL_OVERRIDE;
bool supportsMode(QClipboard::Mode mode) const Q_DECL_OVERRIDE;
@ -53,6 +56,7 @@ public:
private:
QUIClipboard *m_clipboard;
QMap<QClipboard::Mode, QMimeData *> m_mimeData;
};
QT_END_NAMESPACE

View File

@ -194,10 +194,17 @@ QIOSClipboard::QIOSClipboard()
{
}
QIOSClipboard::~QIOSClipboard()
{
qDeleteAll(m_mimeData);
}
QMimeData *QIOSClipboard::mimeData(QClipboard::Mode mode)
{
Q_ASSERT(supportsMode(mode));
return new QIOSMimeData(mode);
if (!m_mimeData.contains(mode))
return *m_mimeData.insert(mode, new QIOSMimeData(mode));
return m_mimeData[mode];
}
void QIOSClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
@ -209,6 +216,8 @@ void QIOSClipboard::setMimeData(QMimeData *mimeData, QClipboard::Mode mode)
pb.items = [NSArray array];
return;
}
mimeData->deleteLater();
NSMutableDictionary *pbItem = [NSMutableDictionary dictionaryWithCapacity:mimeData->formats().size()];
foreach (const QString &mimeType, mimeData->formats()) {