[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