forked from osmocom/wireshark
Qt: Add and use qUtf8Printable.
Qt 5.4 introduced qUtf8Printable, a convenience macro for converting QString to a UTF-8 const char *. Add a compatibility definition and start using it. Change-Id: I3cf88611b1ed1a34082cb2ba82394954e2e6c461 Reviewed-on: https://code.wireshark.org/review/24828 Petri-Dish: Gerald Combs <gerald@wireshark.org> Tested-by: Petri Dish Buildbot Reviewed-by: Gerald Combs <gerald@wireshark.org>
This commit is contained in:
parent
4cf7cd3ed2
commit
db740987ff
|
@ -163,12 +163,19 @@ it's not strictly required:
|
|||
|
||||
===== Strings
|
||||
|
||||
If you're using GLib string functions or plain old C character array idioms in
|
||||
Qt-only code you're probably doing something wrong. QStrings are generally
|
||||
*much* safer and easier to use. They also make translations easier.
|
||||
Wireshark's C code and GLib use UTF-8 encoded character arrays. Qt
|
||||
(specifically QString) uses UTF-16. You can convert a `char *` to a
|
||||
`QString` using simple assignment. You can convert a `QString` to a
|
||||
`const char *` using `qUtf8Printable`.
|
||||
|
||||
If you're using GLib string functions or plain old C character array
|
||||
idioms in Qt-only code you're probably doing something wrong,
|
||||
particularly if you're manually allocating and releasing memory.
|
||||
QStrings are generally *much* safer and easier to use. They also make
|
||||
translations easier.
|
||||
|
||||
If you need to pass strings between Qt and GLib you can use a number
|
||||
of convenience routines which are defined in 'ui/qt/qt_ui_utils.h'.
|
||||
of convenience routines which are defined in 'ui/qt/qt_ui_utils.h'.
|
||||
|
||||
If you're calling a function that returns wmem-allocated memory it might make
|
||||
more sense to add a wrapper function to 'qt_ui_utils' than to call wmem_free in
|
||||
|
|
|
@ -1284,7 +1284,7 @@ void MainWindow::mergeCaptureFile()
|
|||
if (merge_dlg.merge(file_name)) {
|
||||
gchar *err_msg;
|
||||
|
||||
if (!dfilter_compile(read_filter.toUtf8().constData(), &rfcode, &err_msg)) {
|
||||
if (!dfilter_compile(qUtf8Printable(read_filter), &rfcode, &err_msg)) {
|
||||
/* Not valid. Tell the user, and go back and run the file
|
||||
selection box again once they dismiss the alert. */
|
||||
// Similar to commandline_info.jfilter section in main().
|
||||
|
@ -1455,7 +1455,7 @@ bool MainWindow::saveCaptureFile(capture_file *cf, bool dont_reopen) {
|
|||
closes the current file and then opens and reloads the saved file,
|
||||
so make a copy and free it later. */
|
||||
file_name = cf->filename;
|
||||
status = cf_save_records(cf, file_name.toUtf8().constData(), cf->cd_t, cf->iscompressed,
|
||||
status = cf_save_records(cf, qUtf8Printable(file_name), cf->cd_t, cf->iscompressed,
|
||||
discard_comments, dont_reopen);
|
||||
switch (status) {
|
||||
|
||||
|
@ -1545,14 +1545,14 @@ bool MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments,
|
|||
//#ifndef _WIN32
|
||||
// /* If the file exists and it's user-immutable or not writable,
|
||||
// ask the user whether they want to override that. */
|
||||
// if (!file_target_unwritable_ui(top_level, file_name.toUtf8().constData())) {
|
||||
// if (!file_target_unwritable_ui(top_level, qUtf8Printable(file_name))) {
|
||||
// /* They don't. Let them try another file name or cancel. */
|
||||
// continue;
|
||||
// }
|
||||
//#endif
|
||||
|
||||
/* Attempt to save the file */
|
||||
status = cf_save_records(cf, file_name.toUtf8().constData(), file_type, compressed,
|
||||
status = cf_save_records(cf, qUtf8Printable(file_name), file_type, compressed,
|
||||
discard_comments, dont_reopen);
|
||||
switch (status) {
|
||||
|
||||
|
@ -1570,7 +1570,7 @@ bool MainWindow::saveAsCaptureFile(capture_file *cf, bool must_support_comments,
|
|||
cf->unsaved_changes = false; //we just saved so we signal that we have no unsaved changes
|
||||
updateForUnsavedChanges(); // we update the title bar to remove the *
|
||||
/* Add this filename to the list of recent files in the "Recent Files" submenu */
|
||||
add_menu_recent_capture_file(file_name.toUtf8().constData());
|
||||
add_menu_recent_capture_file(qUtf8Printable(file_name));
|
||||
return true;
|
||||
|
||||
case CF_WRITE_ERROR:
|
||||
|
@ -1647,9 +1647,9 @@ void MainWindow::exportSelectedPackets() {
|
|||
* name and the read file name may be relative (if supplied on
|
||||
* the command line). From Joerg Mayer.
|
||||
*/
|
||||
if (files_identical(capture_file_.capFile()->filename, file_name.toUtf8().constData())) {
|
||||
if (files_identical(capture_file_.capFile()->filename, qUtf8Printable(file_name))) {
|
||||
QMessageBox msg_box;
|
||||
gchar *display_basename = g_filename_display_basename(file_name.toUtf8().constData());
|
||||
gchar *display_basename = g_filename_display_basename(qUtf8Printable(file_name));
|
||||
|
||||
msg_box.setIcon(QMessageBox::Critical);
|
||||
msg_box.setText(QString(tr("Unable to export to \"%1\".").arg(display_basename)));
|
||||
|
@ -1668,14 +1668,14 @@ void MainWindow::exportSelectedPackets() {
|
|||
//#ifndef _WIN32
|
||||
// /* If the file exists and it's user-immutable or not writable,
|
||||
// ask the user whether they want to override that. */
|
||||
// if (!file_target_unwritable_ui(top_level, file_name.toUtf8().constData())) {
|
||||
// if (!file_target_unwritable_ui(top_level, qUtf8Printable(file_name))) {
|
||||
// /* They don't. Let them try another file name or cancel. */
|
||||
// continue;
|
||||
// }
|
||||
//#endif
|
||||
|
||||
/* Attempt to save the file */
|
||||
status = cf_export_specified_packets(capture_file_.capFile(), file_name.toUtf8().constData(), &range, file_type, compressed);
|
||||
status = cf_export_specified_packets(capture_file_.capFile(), qUtf8Printable(file_name), &range, file_type, compressed);
|
||||
switch (status) {
|
||||
|
||||
case CF_WRITE_OK:
|
||||
|
@ -1689,7 +1689,7 @@ void MainWindow::exportSelectedPackets() {
|
|||
if (discard_comments)
|
||||
packet_list_queue_draw();
|
||||
/* Add this filename to the list of recent files in the "Recent Files" submenu */
|
||||
add_menu_recent_capture_file(file_name.toUtf8().constData());
|
||||
add_menu_recent_capture_file(qUtf8Printable(file_name));
|
||||
return;
|
||||
|
||||
case CF_WRITE_ERROR:
|
||||
|
@ -2858,7 +2858,7 @@ void MainWindow::removeAdditionalToolbar(QString toolbarName)
|
|||
AdditionalToolBar *ifToolBar = dynamic_cast<AdditionalToolBar *>(tb);
|
||||
|
||||
if (ifToolBar && ifToolBar->menuName().compare(toolbarName)) {
|
||||
GList *entry = g_list_find_custom(recent.gui_additional_toolbars, ifToolBar->menuName().toStdString().c_str(), (GCompareFunc) strcmp);
|
||||
GList *entry = g_list_find_custom(recent.gui_additional_toolbars, qUtf8Printable(ifToolBar->menuName()), (GCompareFunc) strcmp);
|
||||
if (entry) {
|
||||
recent.gui_additional_toolbars = g_list_remove(recent.gui_additional_toolbars, entry->data);
|
||||
}
|
||||
|
|
|
@ -223,7 +223,7 @@ bool MainWindow::openCaptureFile(QString cf_path, QString read_filter, unsigned
|
|||
goto finish;
|
||||
}
|
||||
|
||||
if (dfilter_compile(read_filter.toUtf8().constData(), &rfcode, &err_msg)) {
|
||||
if (dfilter_compile(qUtf8Printable(read_filter), &rfcode, &err_msg)) {
|
||||
cf_set_rfcode(CaptureFile::globalCapFile(), rfcode);
|
||||
} else {
|
||||
/* Not valid. Tell the user, and go back and run the file
|
||||
|
@ -249,7 +249,7 @@ bool MainWindow::openCaptureFile(QString cf_path, QString read_filter, unsigned
|
|||
|
||||
/* Try to open the capture file. This closes the current file if it succeeds. */
|
||||
CaptureFile::globalCapFile()->window = this;
|
||||
if (cf_open(CaptureFile::globalCapFile(), cf_path.toUtf8().constData(), type, is_tempfile, &err) != CF_OK) {
|
||||
if (cf_open(CaptureFile::globalCapFile(), qUtf8Printable(cf_path), type, is_tempfile, &err) != CF_OK) {
|
||||
/* We couldn't open it; don't dismiss the open dialog box,
|
||||
just leave it around so that the user can, after they
|
||||
dismiss the alert box popped up for the open error,
|
||||
|
@ -514,7 +514,7 @@ void MainWindow::layoutToolbars()
|
|||
AdditionalToolBar *iftoolbar = dynamic_cast<AdditionalToolBar *>(bar);
|
||||
if (iftoolbar) {
|
||||
bool visible = false;
|
||||
if (g_list_find_custom(recent.gui_additional_toolbars, iftoolbar->menuName().toUtf8().constData(), (GCompareFunc) strcmp))
|
||||
if (g_list_find_custom(recent.gui_additional_toolbars, qUtf8Printable(iftoolbar->menuName()), (GCompareFunc) strcmp))
|
||||
visible = true;
|
||||
|
||||
iftoolbar->setVisible(visible);
|
||||
|
@ -1909,23 +1909,23 @@ void MainWindow::on_actionFileExportPacketBytes_triggered()
|
|||
|
||||
data_p = tvb_get_ptr(capture_file_.capFile()->finfo_selected->ds_tvb, 0, -1) +
|
||||
capture_file_.capFile()->finfo_selected->start;
|
||||
fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
|
||||
fd = ws_open(qUtf8Printable(file_name), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
|
||||
if (fd == -1) {
|
||||
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
|
||||
open_failure_alert_box(qUtf8Printable(file_name), errno, TRUE);
|
||||
return;
|
||||
}
|
||||
if (ws_write(fd, data_p, capture_file_.capFile()->finfo_selected->length) < 0) {
|
||||
write_failure_alert_box(file_name.toUtf8().constData(), errno);
|
||||
write_failure_alert_box(qUtf8Printable(file_name), errno);
|
||||
ws_close(fd);
|
||||
return;
|
||||
}
|
||||
if (ws_close(fd) < 0) {
|
||||
write_failure_alert_box(file_name.toUtf8().constData(), errno);
|
||||
write_failure_alert_box(qUtf8Printable(file_name), errno);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Save the directory name for future file dialogs. */
|
||||
wsApp->setLastOpenDir(&file_name);
|
||||
wsApp->setLastOpenDir(file_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1982,9 +1982,9 @@ void MainWindow::on_actionFileExportSSLSessionKeys_triggered()
|
|||
int fd;
|
||||
|
||||
keylist = ssl_export_sessions();
|
||||
fd = ws_open(file_name.toUtf8().constData(), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
|
||||
fd = ws_open(qUtf8Printable(file_name), O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
|
||||
if (fd == -1) {
|
||||
open_failure_alert_box(file_name.toUtf8().constData(), errno, TRUE);
|
||||
open_failure_alert_box(qUtf8Printable(file_name), errno, TRUE);
|
||||
g_free(keylist);
|
||||
return;
|
||||
}
|
||||
|
@ -1993,19 +1993,19 @@ void MainWindow::on_actionFileExportSSLSessionKeys_triggered()
|
|||
* _write(). Presumably this string will be <= 4GiB long....
|
||||
*/
|
||||
if (ws_write(fd, keylist, (unsigned int)strlen(keylist)) < 0) {
|
||||
write_failure_alert_box(file_name.toUtf8().constData(), errno);
|
||||
write_failure_alert_box(qUtf8Printable(file_name), errno);
|
||||
ws_close(fd);
|
||||
g_free(keylist);
|
||||
return;
|
||||
}
|
||||
if (ws_close(fd) < 0) {
|
||||
write_failure_alert_box(file_name.toUtf8().constData(), errno);
|
||||
write_failure_alert_box(qUtf8Printable(file_name), errno);
|
||||
g_free(keylist);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Save the directory name for future file dialogs. */
|
||||
wsApp->setLastOpenDir(&file_name);
|
||||
wsApp->setLastOpenDir(file_name);
|
||||
g_free(keylist);
|
||||
}
|
||||
}
|
||||
|
@ -4135,8 +4135,8 @@ void MainWindow::filterDropped(QString description, QString filter)
|
|||
if ( filter.length() == 0 )
|
||||
return;
|
||||
|
||||
filter_expression_new(description.toUtf8().constData(),
|
||||
filter.toUtf8().constData(), description.toUtf8().constData(), TRUE);
|
||||
filter_expression_new(qUtf8Printable(description),
|
||||
qUtf8Printable(filter), qUtf8Printable(description), TRUE);
|
||||
|
||||
uat_save(uat_get_table_by_name("Display expressions"), &err);
|
||||
g_free(err);
|
||||
|
|
|
@ -59,6 +59,11 @@ struct epan_range;
|
|||
#define Q_NULLPTR NULL
|
||||
#endif
|
||||
|
||||
// Introduced in Qt 5.4
|
||||
#ifndef qUtf8Printable
|
||||
#define qUtf8Printable(str) str.toUtf8().constData()
|
||||
#endif
|
||||
|
||||
/** Create a glib-compatible copy of a QString.
|
||||
*
|
||||
* @param q_string A QString.
|
||||
|
|
|
@ -220,7 +220,7 @@ extern "C" void menu_recent_file_write_all(FILE *rf) {
|
|||
/* get capture filename from the menu item label */
|
||||
cf_name = rii.previous()->filename;
|
||||
if (cf_name != NULL) {
|
||||
fprintf (rf, RECENT_KEY_CAPTURE_FILE ": %s\n", cf_name.toUtf8().constData());
|
||||
fprintf (rf, RECENT_KEY_CAPTURE_FILE ": %s\n", qUtf8Printable(cf_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -281,8 +281,8 @@ QDir WiresharkApplication::lastOpenDir() {
|
|||
return QDir(last_open_dir);
|
||||
}
|
||||
|
||||
void WiresharkApplication::setLastOpenDir(QString *dir_str) {
|
||||
setLastOpenDir(dir_str->toUtf8().constData());
|
||||
void WiresharkApplication::setLastOpenDir(QString dir_str) {
|
||||
setLastOpenDir(qUtf8Printable(dir_str));
|
||||
}
|
||||
|
||||
void WiresharkApplication::helpTopicAction(topic_action_e action)
|
||||
|
|
|
@ -109,7 +109,7 @@ public:
|
|||
void removeRecentItem(const QString &filename);
|
||||
QDir lastOpenDir();
|
||||
void setLastOpenDir(const char *dir_name);
|
||||
void setLastOpenDir(QString *dir_str);
|
||||
void setLastOpenDir(QString dir_str);
|
||||
void helpTopicAction(topic_action_e action);
|
||||
const QFont monospaceFont() const { return mono_font_; }
|
||||
void setMonospaceFont(const char *font_string);
|
||||
|
|
Loading…
Reference in New Issue