summaryrefslogtreecommitdiff
path: root/ui/qt/address_editor_frame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ui/qt/address_editor_frame.cpp')
-rw-r--r--ui/qt/address_editor_frame.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/ui/qt/address_editor_frame.cpp b/ui/qt/address_editor_frame.cpp
new file mode 100644
index 0000000000..bec9780beb
--- /dev/null
+++ b/ui/qt/address_editor_frame.cpp
@@ -0,0 +1,188 @@
+/* address_editor_frame.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.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+
+#include "file.h"
+#include "frame_tvbuff.h"
+
+#include "epan/addr_resolv.h"
+#include "epan/epan_dissect.h"
+#include "epan/frame_data.h"
+
+#include "address_editor_frame.h"
+#include <ui_address_editor_frame.h>
+
+#include "qt_ui_utils.h"
+
+// To do:
+// - Fill in currently resolved address.
+
+AddressEditorFrame::AddressEditorFrame(QWidget *parent) :
+ AccordionFrame(parent),
+ ui(new Ui::AddressEditorFrame)
+{
+ ui->setupUi(this);
+
+#ifdef Q_OS_MAC
+ foreach (QWidget *w, findChildren<QWidget *>()) {
+ w->setAttribute(Qt::WA_MacSmallSize, true);
+ }
+#endif
+
+}
+
+AddressEditorFrame::~AddressEditorFrame()
+{
+ delete ui;
+}
+
+void AddressEditorFrame::editAddresses(CaptureFile &cf, int column)
+{
+ if (!cf.capFile()->current_frame) {
+ on_cancelButton_clicked();
+ return;
+ }
+
+ if (!cf_read_record(cf.capFile(), cf.capFile()->current_frame)) {
+ on_cancelButton_clicked();
+ return; // error reading the frame
+ }
+
+ epan_dissect_t edt;
+ QStringList addresses;
+
+ ui->addressComboBox->clear();
+
+ epan_dissect_init(&edt, cf.capFile()->epan, FALSE, FALSE);
+ col_custom_prime_edt(&edt, &cf.capFile()->cinfo);
+
+ epan_dissect_run(&edt, cf.capFile()->cd_t, &cf.capFile()->phdr,
+ frame_tvbuff_new_buffer(cf.capFile()->current_frame, &cf.capFile()->buf), cf.capFile()->current_frame, &cf.capFile()->cinfo);
+ epan_dissect_fill_in_columns(&edt, TRUE, TRUE);
+
+ /* First check selected column */
+ if (isAddressColumn(&cf.capFile()->cinfo, column)) {
+ addresses << cf.capFile()->cinfo.col_expr.col_expr_val[column];
+ }
+
+ for (int col = 0; col < cf.capFile()->cinfo.num_cols; col++) {
+ /* Then check all columns except the selected */
+ if ((col != column) && (isAddressColumn(&cf.capFile()->cinfo, col))) {
+ addresses << cf.capFile()->cinfo.col_expr.col_expr_val[col];
+ }
+ }
+
+ epan_dissect_cleanup(&edt);
+
+ ui->addressComboBox->addItems(addresses);
+ ui->nameLineEdit->setFocus();
+ updateWidgets();
+}
+
+void AddressEditorFrame::updateWidgets()
+{
+ bool ok_enable = false;
+ if (ui->addressComboBox->count() > 0 && !ui->nameLineEdit->text().isEmpty()) {
+ ok_enable = true;
+ }
+
+ ui->okButton->setEnabled(ok_enable);
+}
+
+void AddressEditorFrame::on_nameResolutionPreferencesToolButton_clicked()
+{
+ static const QString module_name = "nameres";
+ on_cancelButton_clicked();
+ emit showNameResolutionPreferences(module_name);
+}
+
+void AddressEditorFrame::on_addressComboBox_currentIndexChanged(const QString &)
+{
+ updateWidgets();
+}
+
+void AddressEditorFrame::on_nameLineEdit_textEdited(const QString &)
+{
+ updateWidgets();
+}
+
+void AddressEditorFrame::on_nameLineEdit_returnPressed()
+{
+ if (ui->okButton->isEnabled()) {
+ on_okButton_clicked();
+ }
+}
+
+void AddressEditorFrame::on_okButton_clicked()
+{
+ if (ui->addressComboBox->count() < 1 || ui->nameLineEdit->text().isEmpty()) {
+ return;
+ }
+ QString addr = ui->addressComboBox->currentText();
+ QString name = ui->nameLineEdit->text().toUtf8();
+ if (!add_ip_name_from_string(addr.toUtf8().constData(), name.toUtf8().constData())) {
+ QString error_msg = tr("Can't assign %1 to %2").arg(name).arg(addr);
+ emit editAddressStatus(error_msg);
+ ui->okButton->setEnabled(false);
+ return;
+ }
+ on_cancelButton_clicked();
+ emit redissectPackets();
+}
+
+void AddressEditorFrame::on_cancelButton_clicked()
+{
+ ui->addressComboBox->clear();
+ ui->nameLineEdit->clear();
+ animatedHide();
+}
+
+bool AddressEditorFrame::isAddressColumn(epan_column_info *cinfo, int column)
+{
+ if (!cinfo || column < 0 || column >= cinfo->num_cols) return false;
+
+ if (((cinfo->columns[column].col_fmt == COL_DEF_SRC) ||
+ (cinfo->columns[column].col_fmt == COL_RES_SRC) ||
+ (cinfo->columns[column].col_fmt == COL_DEF_DST) ||
+ (cinfo->columns[column].col_fmt == COL_RES_DST)) &&
+ strlen(cinfo->col_expr.col_expr_val[column]))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * Editor modelines
+ *
+ * Local Variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * ex: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */