Add "Export Packet Bytes".

svn path=/trunk/; revision=45567
This commit is contained in:
Gerald Combs 2012-10-16 00:01:23 +00:00
parent be4c14ff77
commit 677c913f42
5 changed files with 164 additions and 7 deletions

View File

@ -86,6 +86,7 @@ MainWindow::MainWindow(QWidget *parent) :
gbl_cur_main_window = this;
main_ui_->setupUi(this);
setMenusForCaptureFile();
setMenusForSelectedTreeRow();
setForCaptureInProgress(false);
setMenusForFileSet(false);
@ -203,6 +204,8 @@ MainWindow::MainWindow(QWidget *parent) :
connect(proto_tree, SIGNAL(protoItemSelected(bool)),
main_ui_->actionViewExpandSubtrees, SLOT(setEnabled(bool)));
connect(proto_tree, SIGNAL(protoItemSelected(field_info *)),
this, SLOT(setMenusForSelectedTreeRow(field_info *)));
connect(&file_set_dialog_, SIGNAL(fileSetOpenCaptureFile(QString&)),
this, SLOT(openCaptureFile(QString&)));

View File

@ -150,6 +150,7 @@ private slots:
void updateRecentFiles();
void recentActionTriggered();
void setMenusForSelectedTreeRow(field_info *fi = NULL);
void on_actionFileOpen_triggered();
void on_actionFileMerge_triggered();
@ -167,6 +168,7 @@ private slots:
void on_actionFileExportAsCArrays_triggered();
void on_actionFileExportAsPSML_triggered();
void on_actionFileExportAsPDML_triggered();
void on_actionFileExportPacketBytes_triggered();
void on_actionGoGoToPacket_triggered();
void resetPreviousFocus();

View File

@ -21,6 +21,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <unistd.h>
#include <fcntl.h>
#include "main_window.h"
#include "ui_main_window.h"
@ -40,9 +43,12 @@
#include "capture_ui_utils.h"
#endif
#include "ui/main_statusbar.h"
#include "wsutil/file_util.h"
#include "ui/alert_box.h"
#include "ui/capture_globals.h"
#include "ui/help_url.h"
#include "ui/main_statusbar.h"
#include "wireshark_application.h"
#include "capture_file_dialog.h"
@ -310,6 +316,8 @@ void MainWindow::captureFileClosed(const capture_file *cf) {
main_ui_->statusBar->popFileStatus();
cap_file_ = NULL;
setMenusForSelectedTreeRow();
}
//
@ -503,6 +511,113 @@ void MainWindow::recentActionTriggered() {
}
}
void MainWindow::setMenusForSelectedTreeRow(field_info *fi) {
gboolean properties;
gint id;
// XXX Add commented items below
if (cap_file_) {
cap_file_->finfo_selected = fi;
}
if (cap_file_ != NULL && fi != NULL) {
header_field_info *hfinfo = fi->hfinfo;
const char *abbrev;
// char *prev_abbrev;
if (hfinfo->parent == -1) {
abbrev = hfinfo->abbrev;
id = (hfinfo->type == FT_PROTOCOL) ? proto_get_id((protocol_t *)hfinfo->strings) : -1;
} else {
abbrev = proto_registrar_get_abbrev(hfinfo->parent);
id = hfinfo->parent;
}
properties = prefs_is_registered_protocol(abbrev);
// set_menu_sensitivity(ui_manager_tree_view_menu,
// "/TreeViewPopup/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy",
// TRUE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy/AsFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyasColumn",
// hfinfo->type != FT_NONE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyAsFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/PrepareaFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ColorizewithFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences",
// properties);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DisableProtocol",
// (id == -1) ? FALSE : proto_can_toggle_protocol(id));
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandSubtrees",
// cf->finfo_selected->tree_type != -1);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
// (id == -1) ? FALSE : TRUE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
// (id == -1) ? FALSE : TRUE);
// set_menu_sensitivity(ui_manager_main_menubar,
main_ui_->actionFileExportPacketBytes->setEnabled(true);
// set_menu_sensitivity(ui_manager_main_menubar,
// "/Menubar/GoMenu/GotoCorrespondingPacket", hfinfo->type == FT_FRAMENUM);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Description",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Fieldname",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Value",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/AsFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyasColumn",
// hfinfo->type != FT_NONE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyAsFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/PrepareaFilter",
// proto_can_match_selected(cf->finfo_selected, cf->edt));
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandSubtrees",
// cf->finfo_selected->tree_type != -1);
// prev_abbrev = g_object_get_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev");
// if (!prev_abbrev || (strcmp (prev_abbrev, abbrev) != 0)) {
// /* No previous protocol or protocol changed - update Protocol Preferences menu */
// module_t *prefs_module_p = prefs_find_module(abbrev);
// rebuild_protocol_prefs_menu (prefs_module_p, properties);
// g_object_set_data(G_OBJECT(ui_manager_tree_view_menu), "menu_abbrev", g_strdup(abbrev));
// g_free (prev_abbrev);
// }
} else {
// set_menu_sensitivity(ui_manager_tree_view_menu,
// "/TreeViewPopup/GotoCorrespondingPacket", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/Copy", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyasColumn", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ApplyAsFilter", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/PrepareaFilter", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ColorizewithFilter", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ProtocolPreferences",
// FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/DisableProtocol", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/ExpandSubtrees", FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/WikiProtocolPage",
// FALSE);
// set_menu_sensitivity(ui_manager_tree_view_menu, "/TreeViewPopup/FilterFieldReference",
// FALSE);
main_ui_->actionFileExportPacketBytes->setEnabled(false);
// set_menu_sensitivity(ui_manager_main_menubar,
// "/Menubar/GoMenu/GotoCorrespondingPacket", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Description", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Fieldname", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/Value", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/EditMenu/Copy/AsFilter", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyasColumn", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/ApplyAsFilter", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/AnalyzeMenu/PrepareaFilter", FALSE);
// set_menu_sensitivity(ui_manager_main_menubar, "/Menubar/ViewMenu/ExpandSubtrees", FALSE);
}
}
// File Menu
@ -592,6 +707,43 @@ void MainWindow::on_actionFileExportAsPDML_triggered()
exportDissections(export_type_pdml);
}
void MainWindow::on_actionFileExportPacketBytes_triggered()
{
QString file_name;
if (!cap_file_ || !cap_file_->finfo_selected) return;
file_name = QFileDialog::getSaveFileName(this,
tr("Wireshark: Export Selected Packet Bytes"),
wsApp->lastOpenDir().absolutePath(),
tr("Raw data (*.bin *.dat *.raw);;Any File (*.*)")
);
if (file_name.length() > 0) {
const guint8 *data_p;
int fd;
data_p = tvb_get_ptr(cap_file_->finfo_selected->ds_tvb, 0, -1) +
cap_file_->finfo_selected->start;
fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
if (fd == -1) {
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
return;
}
if (write(fd, data_p, cfile.finfo_selected->length) < 0) {
write_failure_alert_box(file_name.toUtf8().constData(), errno);
::close(fd);
return;
}
if (::close(fd) < 0) {
write_failure_alert_box(file_name.toUtf8().constData(), errno);
return;
}
/* Save the directory name for future file dialogs. */
wsApp->setLastOpenDir(&file_name);
}
}
// View Menu

View File

@ -202,10 +202,10 @@ void ProtoTree::updateSelectionStatus(QTreeWidgetItem* item) {
itemInfo.append(QString(tr(", %1 bytes")).arg(finfo_length));
}
emit protoItemSelected(new QString());
emit protoItemSelected(false);
emit protoItemSelected(*new QString());
emit protoItemSelected(NULL);
emit protoItemSelected(itemInfo);
emit protoItemSelected(true);
emit protoItemSelected(fi);
} // else the GTK+ version pushes an empty string as described below.
/*
* Don't show anything if the field name is zero-length;
@ -228,8 +228,8 @@ void ProtoTree::updateSelectionStatus(QTreeWidgetItem* item) {
*/
} else {
emit protoItemSelected(new QString());
emit protoItemSelected(false);
emit protoItemSelected(*new QString());
emit protoItemSelected(NULL);
}
}

View File

@ -44,7 +44,7 @@ private:
signals:
void protoItemSelected(QString &);
void protoItemSelected(bool);
void protoItemSelected(field_info *);
void goToFrame(int);
public slots: