[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/KDE/4.7/kdenetwork/kget/core
From: Matthias Fuchs <mat69 () gmx ! net>
Date: 2011-11-30 21:05:42
Message-ID: 20111130210542.1CA61AC88F () svn ! kde ! org
[Download RAW message or body]
SVN commit 1266819 by mfuchs:
Backport r1264875
Does not assume that pointer size == int size in drag and drop
operations of transfers and also makes that operation more secure by
using a QWeakPointer to store the transfer pointer.
M +45 -45 transfertreemodel.cpp
M +25 -0 transfertreemodel.h
--- branches/KDE/4.7/kdenetwork/kget/core/transfertreemodel.cpp #1266818:1266819
@@ -27,8 +27,25 @@
#include <klocale.h>
#include <KMimeType>
-#include <qmimedata.h>
+ItemMimeData::ItemMimeData()
+ : QMimeData()
+{
+}
+ItemMimeData::~ItemMimeData()
+{
+}
+
+void ItemMimeData::appendTransfer(const QWeakPointer<TransferHandler> &transfer)
+{
+ m_transfers.append(transfer);
+}
+
+QList<QWeakPointer<TransferHandler> > ItemMimeData::transfers() const
+{
+ return m_transfers;
+}
+
ModelItem::ModelItem(Handler * handler)
: QStandardItem(),
m_handler(handler)
@@ -547,32 +564,26 @@
QStringList TransferTreeModel::mimeTypes() const
{
QStringList types;
- types << "application/vnd.text.list";
+ types << "kget/transfer_pointer";
return types;
}
QMimeData * TransferTreeModel::mimeData(const QModelIndexList &indexes) const
{
- QMimeData * mimeData = new QMimeData();
- QByteArray encodedData;
+ ItemMimeData *mimeData = new ItemMimeData();
- QDataStream stream(&encodedData, QIODevice::WriteOnly);
-
QModelIndexList sortedIndexes = indexes;
qSort(sortedIndexes.begin(), sortedIndexes.end(), qGreater<QModelIndex>());
- foreach (const QModelIndex &index, sortedIndexes)
- {
- if (index.isValid())
- {
- if(index.column() == 0 && index.parent().isValid())
- {
- stream << data(index.parent(), Qt::DisplayRole).toString();
- stream << QString::number((qulonglong) \
itemFromIndex(index)->handler(), 16); + foreach (const QModelIndex &index, \
sortedIndexes) { + if (index.isValid() && index.column() == 0 && \
index.parent().isValid()) { + ModelItem *item = itemFromIndex(index);
+ if (!item->isGroup()) {
+ mimeData->appendTransfer(QWeakPointer<TransferHandler>(item->asTransfer()->transferHandler()));
}
}
}
- mimeData->setData("application/vnd.text.list", encodedData);
+ mimeData->setData("kget/transfer_pointer", QByteArray());
return mimeData;
}
@@ -581,42 +592,28 @@
if (action == Qt::IgnoreAction)
return true;
- if (!mdata->hasFormat("application/vnd.text.list"))
+ const ItemMimeData *itemData = qobject_cast<const ItemMimeData*>(mdata);
+ if (!itemData) {
+ kWarning(5001) << "Unsuported mime data dropped.";
return false;
+ }
+ TransferGroup *destGroup = findGroup(data(parent, Qt::DisplayRole).toString());
+ if (!destGroup) {
+ kWarning(5001) << "No group could be found where the transfers should be \
inserted to."; + return false;
+ }
+
if (parent.isValid())
kDebug(5001) << "TransferTreeModel::dropMimeData" << " " << row << " "
<< column << endl;
- QByteArray encodedData = mdata->data("application/vnd.text.list");
- QDataStream stream(&encodedData, QIODevice::ReadOnly);
- QStringList stringList;
- int rows = 0;
+ QList<QWeakPointer<TransferHandler> > transfers = itemData->transfers();
+ kDebug(5001) << "TransferTreeModel::dropMimeData:" << transfers.count() << \
"transfers.";
- while (!stream.atEnd())
- {
- QString text;
- stream >> text;
- stringList << text;
- ++rows;
- }
-
- kDebug(5001) << "TransferTreeModel::dropMimeData DATA:";
- kDebug(5001) << stringList;
-
-
+ const bool droppedInsideGroup = parent.isValid();
Transfer * after = 0;
- for(int i=0; i < rows; i++)
- {
-// TransferGroup * group = findGroup(stringList[i]);
-
-// TransferGroup * destGroup = static_cast<TransferGroup *>(index(row, \
column, parent).internalPointer());
-
- TransferGroup * destGroup = findGroup(data(parent, \
Qt::DisplayRole).toString());
-
- TransferHandler * transferHandler = (TransferHandler *) \
stringList[++i].toInt(0, 16);
-
- if (destGroup) {
+ for (int i = 0; i < transfers.count(); ++i) {
bool b = destGroup->size() > row && row - 1 >= 0;
if (b)
kDebug(5001) << "TRANSFER AFTER:" << destGroup->operator[](row - \
1)->source(); @@ -624,13 +621,16 @@
kDebug(5001) << "TRANSFER AFTER NOT EXISTING";
if (!after) {
- bool droppedInsideGroup = parent.isValid();
bool rowValid = (row - 1 >= 0) && (destGroup->size() >= row);
if (droppedInsideGroup && rowValid) {
after = destGroup->operator[](row - 1);//insert at the correct \
position }
}
- moveTransfer(transferHandler->m_transfer, destGroup, after);
+
+ if (transfers[i].isNull()) {
+ kWarning() << "The moved transfer has been deleted inbetween.";
+ } else {
+ moveTransfer(transfers[i].data()->m_transfer, destGroup, after);
}
}
return true;
--- branches/KDE/4.7/kdenetwork/kget/core/transfertreemodel.h #1266818:1266819
@@ -15,6 +15,8 @@
#include <QStandardItemModel>
#include <QList>
+#include <QtCore/QMimeData>
+#include <QtCore/QWeakPointer>
#include "../kget_export.h"
#include "core/transfer.h"
@@ -31,6 +33,29 @@
class TransferModelItem;
class GroupModelItem;
+class ItemMimeData : public QMimeData
+{
+ Q_OBJECT
+ public:
+ ItemMimeData();
+ ~ItemMimeData();
+
+ /**
+ * Appends a transfer to the list of transfers.
+ * The weakpointer is there to check later on, that the transfer still \
exists + */
+ void appendTransfer(const QWeakPointer<TransferHandler> &transfer);
+
+ /**
+ * Returns all appended transfers
+ * The weakpointer is there to check later on, that the transfer still \
exists + */
+ QList<QWeakPointer<TransferHandler> > transfers() const;
+
+ private:
+ QList<QWeakPointer<TransferHandler> > m_transfers;
+};
+
class KGET_EXPORT ModelItem : public QStandardItem
{
public:
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic