From 8fceb9d957e7c16045a0ed655862ec3be485df19 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 11 Nov 2025 05:58:23 +0800 Subject: [PATCH] cabana: replace deprecated Qt and OpenSSL functions (#36605) replace deprecated functions --- tools/cabana/SConscript | 1 - tools/cabana/chart/chart.cc | 8 +++++--- tools/cabana/signalview.cc | 12 ++++++------ tools/cabana/utils/api.cc | 39 +++++++++++++++++++++++-------------- tools/cabana/videowidget.cc | 2 +- 5 files changed, 36 insertions(+), 26 deletions(-) diff --git a/tools/cabana/SConscript b/tools/cabana/SConscript index e3674452d5..d4cfc67280 100644 --- a/tools/cabana/SConscript +++ b/tools/cabana/SConscript @@ -50,7 +50,6 @@ qt_flags = [ "-DQT_MESSAGELOGCONTEXT", ] qt_env['CXXFLAGS'] += qt_flags -qt_env['CXXFLAGS'] += ["-Wno-deprecated-declarations"] qt_env['LIBPATH'] += ['#selfdrive/ui', ] qt_env['LIBS'] = qt_libs diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index 505b2b8053..bc2380e550 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -324,7 +324,8 @@ void ChartView::updateSeries(const cabana::Signal *sig, const MessageEventsMap * if (!can->liveStreaming()) { s.segment_tree.build(s.vals); } - s.series->replace(QVector::fromStdVector(series_type == SeriesType::StepLine ? s.step_vals : s.vals)); + const auto &points = series_type == SeriesType::StepLine ? s.step_vals : s.vals; + s.series->replace(QVector(points.cbegin(), points.cend())); } } updateAxisY(); @@ -382,7 +383,7 @@ void ChartView::updateAxisY() { QFontMetrics fm(axis_y->labelsFont()); for (int i = 0; i < tick_count; i++) { qreal value = min_y + (i * (max_y - min_y) / (tick_count - 1)); - max_label_width = std::max(max_label_width, fm.width(QString::number(value, 'f', n))); + max_label_width = std::max(max_label_width, fm.horizontalAdvance(QString::number(value, 'f', n))); } int title_spacing = unit.isEmpty() ? 0 : QFontMetrics(axis_y->titleFont()).size(Qt::TextSingleLine, unit).height(); @@ -838,7 +839,8 @@ void ChartView::setSeriesType(SeriesType type) { } for (auto &s : sigs) { s.series = createSeries(series_type, s.sig->color); - s.series->replace(QVector::fromStdVector(series_type == SeriesType::StepLine ? s.step_vals : s.vals)); + const auto &points = series_type == SeriesType::StepLine ? s.step_vals : s.vals; + s.series->replace(QVector(points.cbegin(), points.cend())); } updateSeriesPoints(); updateTitle(); diff --git a/tools/cabana/signalview.cc b/tools/cabana/signalview.cc index 35537d75e3..0a0c07a155 100644 --- a/tools/cabana/signalview.cc +++ b/tools/cabana/signalview.cc @@ -265,7 +265,7 @@ QSize SignalItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QMo text += item->sig->type == cabana::Signal::Type::Multiplexor ? QString(" M ") : QString(" m%1 ").arg(item->sig->multiplex_value); spacing += (option.widget->style()->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1) * 2; } - width = std::min(option.widget->size().width() / 3.0, option.fontMetrics.width(text) + spacing); + width = std::min(option.widget->size().width() / 3.0, option.fontMetrics.horizontalAdvance(text) + spacing); } return {width, option.fontMetrics.height() + option.widget->style()->pixelMetric(QStyle::PM_FocusFrameVMargin) * 2}; } @@ -308,7 +308,7 @@ void SignalItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op // multiplexer indicator if (item->sig->type != cabana::Signal::Type::Normal) { QString indicator = item->sig->type == cabana::Signal::Type::Multiplexor ? QString(" M ") : QString(" m%1 ").arg(item->sig->multiplex_value); - QRect indicator_rect{rect.x(), rect.y(), option.fontMetrics.width(indicator), rect.height()}; + QRect indicator_rect{rect.x(), rect.y(), option.fontMetrics.horizontalAdvance(indicator), rect.height()}; painter->setBrush(Qt::gray); painter->setPen(Qt::NoPen); painter->drawRoundedRect(indicator_rect, 3, 3); @@ -342,13 +342,13 @@ void SignalItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op painter->drawText(rect, Qt::AlignLeft | Qt::AlignTop, max); painter->drawText(rect, Qt::AlignLeft | Qt::AlignBottom, min); QFontMetrics fm(minmax_font); - value_adjust = std::max(fm.width(min), fm.width(max)) + 5; + value_adjust = std::max(fm.horizontalAdvance(min), fm.horizontalAdvance(max)) + 5; } else if (!item->sparkline.isEmpty() && item->sig->type == cabana::Signal::Type::Multiplexed) { // display freq of multiplexed signal painter->setFont(label_font); QString freq = QString("%1 hz").arg(item->sparkline.freq(), 0, 'g', 2); painter->drawText(rect.adjusted(5, 0, 0, 0), Qt::AlignLeft | Qt::AlignVCenter, freq); - value_adjust = QFontMetrics(label_font).width(freq) + 10; + value_adjust = QFontMetrics(label_font).horizontalAdvance(freq) + 10; } // signal value painter->setFont(option.font); @@ -622,13 +622,13 @@ void SignalView::updateState(const std::set *msgs) { double value = 0; if (item->sig->getValue(last_msg.dat.data(), last_msg.dat.size(), &value)) { item->sig_val = item->sig->formatValue(value); - max_value_width = std::max(max_value_width, fontMetrics().width(item->sig_val)); + max_value_width = std::max(max_value_width, fontMetrics().horizontalAdvance(item->sig_val)); } } auto [first_visible, last_visible] = visibleSignalRange(); if (first_visible.isValid() && last_visible.isValid()) { - const static int min_max_width = QFontMetrics(delegate->minmax_font).width("-000.00") + 5; + const static int min_max_width = QFontMetrics(delegate->minmax_font).horizontalAdvance("-000.00") + 5; int available_width = value_column_width - delegate->button_size.width(); int value_width = std::min(max_value_width + min_max_width, available_width / 2); QSize size(available_width - value_width, diff --git a/tools/cabana/utils/api.cc b/tools/cabana/utils/api.cc index 2ed461fdf6..89379a8434 100644 --- a/tools/cabana/utils/api.cc +++ b/tools/cabana/utils/api.cc @@ -1,7 +1,7 @@ #include "tools/cabana/utils/api.h" +#include #include -#include #include #include @@ -39,29 +39,38 @@ std::optional getDongleId() { namespace CommaApi { -RSA *get_rsa_private_key() { - static std::unique_ptr rsa_private(nullptr, RSA_free); - if (!rsa_private) { +EVP_PKEY *get_private_key() { + static std::unique_ptr pkey(nullptr, EVP_PKEY_free); + if (!pkey) { FILE *fp = fopen(Path::rsa_file().c_str(), "rb"); if (!fp) { - qDebug() << "No RSA private key found, please run manager.py or registration.py"; + qDebug() << "No private key found, please run manager.py or registration.py"; return nullptr; } - rsa_private.reset(PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)); + pkey.reset(PEM_read_PrivateKey(fp, nullptr, nullptr, nullptr)); fclose(fp); } - return rsa_private.get(); + return pkey.get(); } QByteArray rsa_sign(const QByteArray &data) { - RSA *rsa_private = get_rsa_private_key(); - if (!rsa_private) return {}; - - QByteArray sig(RSA_size(rsa_private), Qt::Uninitialized); - unsigned int sig_len; - int ret = RSA_sign(NID_sha256, (unsigned char*)data.data(), data.size(), (unsigned char*)sig.data(), &sig_len, rsa_private); - assert(ret == 1); - assert(sig.size() == sig_len); + EVP_PKEY *pkey = get_private_key(); + if (!pkey) return {}; + + EVP_MD_CTX *mdctx = EVP_MD_CTX_new(); + if (!mdctx) return {}; + + QByteArray sig(EVP_PKEY_size(pkey), Qt::Uninitialized); + size_t sig_len = sig.size(); + + int ret = EVP_DigestSignInit(mdctx, nullptr, EVP_sha256(), nullptr, pkey); + ret &= EVP_DigestSignUpdate(mdctx, data.data(), data.size()); + ret &= EVP_DigestSignFinal(mdctx, (unsigned char*)sig.data(), &sig_len); + + EVP_MD_CTX_free(mdctx); + + if (ret != 1) return {}; + sig.resize(sig_len); return sig; } diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index c857c9ffbe..55018f28f0 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -134,7 +134,7 @@ void VideoWidget::createSpeedDropdown(QToolBar *toolbar) { QFont font = speed_btn->font(); font.setBold(true); speed_btn->setFont(font); - speed_btn->setMinimumWidth(speed_btn->fontMetrics().width("0.05x ") + style()->pixelMetric(QStyle::PM_MenuButtonIndicator)); + speed_btn->setMinimumWidth(speed_btn->fontMetrics().horizontalAdvance("0.05x ") + style()->pixelMetric(QStyle::PM_MenuButtonIndicator)); } QWidget *VideoWidget::createCameraWidget() {