summaryrefslogtreecommitdiff
path: root/ui/qt/cache_proxy_model.h
diff options
context:
space:
mode:
authorPeter Wu <peter@lekensteyn.nl>2017-03-17 00:51:08 +0100
committerPeter Wu <peter@lekensteyn.nl>2017-03-24 23:02:43 +0000
commit370f3b358cd9ee7dcd2b7274f7ee6c90d5906c7a (patch)
treef71b56580079e13f017bda7e6c504e30eaa61be8 /ui/qt/cache_proxy_model.h
parentb4bc6c72c79fa121753cf94ae179ea73f1e911dd (diff)
downloadwireshark-370f3b358cd9ee7dcd2b7274f7ee6c90d5906c7a.tar.gz
Qt: add cache proxy model for Voip Calls dialog
When a capture file is reloaded, the information stored in VoipCallsInfoModel is invalidated. Add another cache layer to fix this: VoipCallsInfoModel wraps around raw data (invalid on close) CacheProxyModel NEW: use prev. data or cache on close VoipCallsInfoSortedModel provided sorting, etc. VoipCallsDialog actual user of model (callTreeView) This also fixes a UAF after a file was closed, and when a call is selected (that got worse with the last model/view patch and is "fixed" in this patch with the caching layer. Note that the Flow sequence and Play Streams dialog are not that useful when the file is closed). Change-Id: Ib4daff9dc01a54863fe1d943bdbdb876418924ee Reviewed-on: https://code.wireshark.org/review/20574 Petri-Dish: Peter Wu <peter@lekensteyn.nl> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Peter Wu <peter@lekensteyn.nl>
Diffstat (limited to 'ui/qt/cache_proxy_model.h')
-rw-r--r--ui/qt/cache_proxy_model.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/ui/qt/cache_proxy_model.h b/ui/qt/cache_proxy_model.h
new file mode 100644
index 0000000000..9163a4695c
--- /dev/null
+++ b/ui/qt/cache_proxy_model.h
@@ -0,0 +1,59 @@
+/* cache_proxy_model.h
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef CACHE_PROXY_MODEL_H
+#define CACHE_PROXY_MODEL_H
+
+#include <config.h>
+
+#include <QIdentityProxyModel>
+#include <QStandardItemModel>
+
+/**
+ * Caches any data read access to the source model, returning an older copy if
+ * the source model is invalidated.
+ *
+ * Only flat data is supported at the moment, tree models (with parents) are
+ * unsupported.
+ */
+class CacheProxyModel : public QIdentityProxyModel
+{
+ Q_OBJECT
+
+public:
+ CacheProxyModel(QObject *parent = 0);
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+ Qt::ItemFlags flags(const QModelIndex &index) const;
+ QVariant headerData(int section, Qt::Orientation orientation,
+ int role = Qt::DisplayRole) const;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ int columnCount(const QModelIndex &parent = QModelIndex()) const;
+ void setSourceModel(QAbstractItemModel *newSourceModel);
+
+private:
+ mutable QStandardItemModel cache;
+
+ bool hasModel() const { return sourceModel() != &cache; }
+
+private slots:
+ void resetCacheModel();
+};
+#endif