From 26d695837ed5d25052aecf3ba673b43b98a81eb3 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Thu, 7 May 2020 13:10:21 +0800 Subject: [PATCH] Fix issue of saving/loading file with special characters --- DSView/main.cpp | 3 +-- DSView/pv/device/file.cpp | 6 +++--- DSView/pv/device/inputfile.cpp | 8 ++++---- DSView/pv/device/sessionfile.cpp | 2 +- DSView/pv/mainwindow.cpp | 11 ++++++----- DSView/pv/storesession.cpp | 26 +++++++++++++------------- DSView/pv/view/dsosignal.cpp | 4 ++-- DSView/pv/view/signal.cpp | 2 +- DSView/pv/view/view.h | 5 +++-- 9 files changed, 34 insertions(+), 33 deletions(-) diff --git a/DSView/main.cpp b/DSView/main.cpp index 5f84b9e5..1b21d968 100755 --- a/DSView/main.cpp +++ b/DSView/main.cpp @@ -131,8 +131,7 @@ int main(int argc, char *argv[]) dir.cd(QApplication::applicationName()) && dir.cd("res")) { QString res_dir = dir.absolutePath() + "/"; - QByteArray str_tmp = res_dir.toLocal8Bit(); - strcpy(DS_RES_PATH, str_tmp.data()); + strcpy(DS_RES_PATH, res_dir.toUtf8().data()); } else { qDebug() << "ERROR: config files don't exist."; return 1; diff --git a/DSView/pv/device/file.cpp b/DSView/pv/device/file.cpp index 46376082..7efee676 100755 --- a/DSView/pv/device/file.cpp +++ b/DSView/pv/device/file.cpp @@ -47,7 +47,7 @@ QString File::format_device_title() const File* File::create(QString name) { - if (sr_session_load(name.toLocal8Bit().data()) == SR_OK) { + if (sr_session_load(name.toUtf8().data()) == SR_OK) { GSList *devlist = NULL; sr_session_dev_list(&devlist); sr_session_destroy(); @@ -76,7 +76,7 @@ QJsonArray File::get_decoders() QJsonArray dec_array; QJsonParseError error; - archive = zip_open(_path.toLocal8Bit().data(), 0, &ret); + archive = zip_open(_path.toUtf8().data(), 0, &ret); if (archive) { /* read "decoders" */ if (zip_stat(archive, "decoders", 0, &zs) != -1) { @@ -108,7 +108,7 @@ QJsonDocument File::get_session() QJsonDocument sessionDoc; QJsonParseError error; - archive = zip_open(_path.toLocal8Bit().data(), 0, &ret); + archive = zip_open(_path.toUtf8().data(), 0, &ret); if (archive) { /* read "decoders" */ if (zip_stat(archive, "session", 0, &zs) != -1) { diff --git a/DSView/pv/device/inputfile.cpp b/DSView/pv/device/inputfile.cpp index 32b63cc4..bd2feef7 100755 --- a/DSView/pv/device/inputfile.cpp +++ b/DSView/pv/device/inputfile.cpp @@ -87,7 +87,7 @@ sr_input_format* InputFile::determine_input_file_format(const QString filename) /* Otherwise, try to find an input module that can handle this file. */ for (i = 0; inputs[i]; i++) { - if (inputs[i]->format_match(filename.toLocal8Bit().data())) + if (inputs[i]->format_match(filename.toUtf8().data())) break; } @@ -112,7 +112,7 @@ sr_input* InputFile::load_input_file_format(const QString filename, throw tr("Failed to load file"); } - if (stat(filename.toLocal8Bit().data(), &st) == -1) + if (stat(filename.toUtf8().data(), &st) == -1) throw tr("Failed to load file"); /* Initialize the input module. */ @@ -123,7 +123,7 @@ sr_input* InputFile::load_input_file_format(const QString filename, in->format = format; in->param = NULL; if (in->format->init && - in->format->init(in, filename.toLocal8Bit().data()) != SR_OK) { + in->format->init(in, filename.toUtf8().data()) != SR_OK) { throw tr("Failed to load file"); } @@ -139,7 +139,7 @@ void InputFile::run() assert(_input); assert(_input->format); assert(_input->format->loadfile); - _input->format->loadfile(_input, _path.toLocal8Bit().data()); + _input->format->loadfile(_input, _path.toUtf8().data()); } } // device diff --git a/DSView/pv/device/sessionfile.cpp b/DSView/pv/device/sessionfile.cpp index 2a3368a5..2ce80e7e 100755 --- a/DSView/pv/device/sessionfile.cpp +++ b/DSView/pv/device/sessionfile.cpp @@ -39,7 +39,7 @@ void SessionFile::use(SigSession *owner) { assert(!_sdi); - if (sr_session_load(_path.toLocal8Bit().data()) != SR_OK) + if (sr_session_load(_path.toUtf8().data()) != SR_OK) throw tr("Failed to open file.\n"); GSList *devlist = NULL; diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index dec985fb..938bb492 100755 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -478,7 +478,7 @@ void MainWindow::reload() void MainWindow::load_file(QString file_name) { try { - if (strncmp(_session.get_device()->name().toLocal8Bit(), "virtual", 7)) + if (strncmp(_session.get_device()->name().toUtf8(), "virtual", 7)) session_save(); _session.set_file(file_name); } catch(QString e) { @@ -540,7 +540,7 @@ void MainWindow::device_detach() session_save(); _view->hide_calibration(); if (_session.get_device()->dev_inst()->mode != DSO && - strncmp(_session.get_device()->name().toLocal8Bit(), "virtual", 7)) { + strncmp(_session.get_device()->name().toUtf8(), "virtual", 7)) { const boost::shared_ptr logic_snapshot(_session.get_snapshot(SR_CHANNEL_LOGIC)); assert(logic_snapshot); const boost::shared_ptr analog_snapshot(_session.get_snapshot(SR_CHANNEL_ANALOG)); @@ -744,7 +744,7 @@ void MainWindow::session_save() QString file_name = dir.absolutePath() + "/" + driver_name + mode_name + lang_name + ".dsc"; - if (strncmp(driver_name.toLocal8Bit(), "virtual", 7) && + if (strncmp(driver_name.toUtf8(), "virtual", 7) && !file_name.isEmpty()) { store_session(file_name); } @@ -932,7 +932,7 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev) // check device and mode const sr_dev_inst *const sdi = _session.get_device()->dev_inst(); - if ((!file_dev && strcmp(sdi->driver->name, sessionObj["Device"].toString().toLocal8Bit()) != 0) || + if ((!file_dev && strcmp(sdi->driver->name, sessionObj["Device"].toString().toUtf8()) != 0) || sdi->mode != sessionObj["DeviceMode"].toDouble()) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Session Error")); @@ -1065,7 +1065,7 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev) if ((s->get_index() == obj["index"].toDouble()) && (s->get_type() == obj["type"].toDouble())) { s->set_colour(QColor(obj["colour"].toString())); - s->set_name(g_strdup(obj["name"].toString().toStdString().c_str())); + s->set_name(g_strdup(obj["name"].toString().toUtf8().data())); boost::shared_ptr logicSig; if ((logicSig = dynamic_pointer_cast(s))) { @@ -1095,6 +1095,7 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev) // update UI settings _sampling_bar->update_sample_rate_selector(); _trigger_widget->device_updated(); + _view->header_updated(); // load trigger settings if (sessionObj.contains("trigger")) { diff --git a/DSView/pv/storesession.cpp b/DSView/pv/storesession.cpp index 40958fdc..d2048246 100755 --- a/DSView/pv/storesession.cpp +++ b/DSView/pv/storesession.cpp @@ -182,12 +182,12 @@ bool StoreSession::save_start(QString session_file) if (meta_file == NULL) { _error = tr("Generate temp file failed."); } else { - int ret = sr_session_save_init(_file_name.toLocal8Bit().data(), - meta_file.toLocal8Bit().data(), - decoders_file.toLocal8Bit().data(), - session_file.toLocal8Bit().data()); + int ret = sr_session_save_init(_file_name.toUtf8().data(), + meta_file.toUtf8().data(), + decoders_file.toUtf8().data(), + session_file.toUtf8().data()); if (ret != SR_OK) { - _error = tr("Failed to create zip file. Please check write permission of this path."); + _error = tr("Failed to create zip file. Initialization error."); } else { _thread = boost::thread(&StoreSession::save_proc, this, snapshot); return !_has_error; @@ -196,7 +196,7 @@ bool StoreSession::save_start(QString session_file) } QFile::remove(_file_name); - _error.clear(); + //_error.clear(); return false; } @@ -239,7 +239,7 @@ void StoreSession::save_proc(shared_ptr snapshot) memset(buf, sample ? 0xff : 0x0, size); } } - ret = sr_session_append(_file_name.toLocal8Bit().data(), buf, size, + ret = sr_session_append(_file_name.toUtf8().data(), buf, size, i, ch_index, ch_type, File_Version); if (ret != SR_OK) { if (!_has_error) { @@ -285,13 +285,13 @@ void StoreSession::save_proc(shared_ptr snapshot) memcpy(tmp, buf, buf_end-buf); memcpy(tmp+(buf_end-buf), buf_start, buf+size-buf_end); } - ret = sr_session_append(_file_name.toLocal8Bit().data(), tmp, size, + ret = sr_session_append(_file_name.toUtf8().data(), tmp, size, i, 0, ch_type, File_Version); buf += (size - _unit_count); if (tmp) free(tmp); } else { - ret = sr_session_append(_file_name.toLocal8Bit().data(), buf, size, + ret = sr_session_append(_file_name.toUtf8().data(), buf, size, i, 0, ch_type, File_Version); buf += size; } @@ -342,7 +342,7 @@ QString StoreSession::meta_gen(boost::shared_ptr snapshot) } const sr_dev_inst *sdi = _session.get_device()->dev_inst(); - meta = fopen(metafile.toLocal8Bit().data(), "wb"); + meta = fopen(metafile.toUtf8().data(), "wb"); if (meta == NULL) { qDebug() << "Failed to create temp meta file."; return NULL; @@ -572,7 +572,7 @@ bool StoreSession::export_start() while(*supportedModules){ if(*supportedModules == NULL) break; - if(!strcmp((*supportedModules)->id, _suffix.toLocal8Bit().data())){ + if(!strcmp((*supportedModules)->id, _suffix.toUtf8().data())){ _outModule = *supportedModules; break; } @@ -613,7 +613,7 @@ void StoreSession::export_proc(shared_ptr snapshot) } GHashTable *params = g_hash_table_new(g_str_hash, g_str_equal); - GVariant* filenameGVariant = g_variant_new_bytestring(_file_name.toLocal8Bit().data()); + GVariant* filenameGVariant = g_variant_new_bytestring(_file_name.toUtf8().data()); g_hash_table_insert(params, (char*)"filename", filenameGVariant); GVariant* typeGVariant = g_variant_new_int16(channel_type); g_hash_table_insert(params, (char*)"type", typeGVariant); @@ -999,7 +999,7 @@ void StoreSession::load_decoders(dock::ProtocolDock *widget, QJsonArray dec_arra else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) new_value = g_variant_new_uint64(options_obj[opt->id].toInt()); } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) { - new_value = g_variant_new_string(options_obj[opt->id].toString().toLocal8Bit().data()); + new_value = g_variant_new_string(options_obj[opt->id].toString().toUtf8().data()); } if (new_value != NULL) diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index d5736a92..a359acad 100755 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -287,7 +287,7 @@ bool DsoSignal::load_settings() } else { _bits = DefaultBits; qDebug("Warning: config_get SR_CONF_UNIT_BITS failed, set to %d(default).", DefaultBits); - if (strncmp(_dev_inst->name().toLocal8Bit(), "virtual", 7)) + if (strncmp(_dev_inst->name().toUtf8().data(), "virtual", 7)) return false; } gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_REF_MIN); @@ -361,7 +361,7 @@ bool DsoSignal::load_settings() g_variant_unref(gvar); } else { qDebug() << "ERROR: config_get SR_CONF_TRIGGER_VALUE failed."; - if (strncmp(_dev_inst->name().toLocal8Bit(), "virtual", 7)) + if (strncmp(_dev_inst->name().toUtf8().data(), "virtual", 7)) return false; } diff --git a/DSView/pv/view/signal.cpp b/DSView/pv/view/signal.cpp index 84efd3be..d694c033 100755 --- a/DSView/pv/view/signal.cpp +++ b/DSView/pv/view/signal.cpp @@ -57,7 +57,7 @@ void Signal::set_name(QString name) { Trace::set_name(name); g_free(_probe->name); - _probe->name = g_strdup(name.toLocal8Bit().data()); + _probe->name = g_strdup(name.toUtf8().data()); } boost::shared_ptr Signal::get_device() const diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index c9654e25..58893ec8 100755 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -305,6 +305,9 @@ public slots: void set_trig_time(); bool trig_time_setted(); + // + void header_updated(); + private slots: void h_scroll_value_changed(int value); @@ -314,8 +317,6 @@ private slots: void on_traces_moved(); - void header_updated(); - void receive_trigger(quint64 trig_pos); void set_trig_pos(int percent);