Route desktop codec diagnostics through the shared log

Quiet capability probes, preserve runtime errors, and register the desktop portal application. Add logging and desktop launcher regression coverage.
This commit is contained in:
evgeny committed 2026-10-21 15:45:40 +02:00
1 parent 9ba78c084b
commit 7c814f5cb9
17 files changed
+349 -44

No files matched your search

+38
View File
@@ -0,0 +1,38 @@
#include "desktop_integration.h"
#include "debug_config.h"
#include <QDir>
#include <QSaveFile>
#include <QStandardPaths>
bool registerDesktopApplication(const QString& executable) {
#ifdef Q_OS_LINUX
const QString relative = QStringLiteral("applications/org.utun.vibechat.desktop");
if (!QStandardPaths::locate(QStandardPaths::GenericDataLocation, relative).isEmpty()) return true;
const QString root = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation);
const QString path = root + '/' + relative;
if (root.isEmpty() || !QDir().mkpath(root + "/applications")) {
DEBUG_WARN(DEBUG_CATEGORY_GENERAL, "Desktop registration: cannot create applications directory in %s", qPrintable(root));
return false;
}
// Exec сначала разбирается как desktop string, затем как командная строка; shell не используется.
QString command;
for (QChar c : executable) {
if (c == '%') command += "%%";
else { if (c == '\\' || c == '"' || c == '$' || c == '`') command += '\\'; command += c; }
}
command = '"' + command + '"';
command.replace("\\", "\\\\"); command.replace('\n', "\\n"); command.replace('\r', "\\r"); command.replace('\t', "\\t");
// GLib проверяет executable до раскрытия %%; env оставляет путь аргументом и корректно обрабатывает '%' в имени.
const QByteArray content = QString("[Desktop Entry]\nType=Application\nName=VibeChat\nExec=/usr/bin/env %1\n"
"Icon=applications-internet\nTerminal=false\nCategories=Network;InstantMessaging;\n").arg(command).toUtf8();
QSaveFile file(path);
if (!file.open(QIODevice::WriteOnly) || file.write(content) != content.size() || !file.commit()) {
DEBUG_WARN(DEBUG_CATEGORY_GENERAL, "Desktop registration failed path=%s: %s", qPrintable(path), qPrintable(file.errorString()));
return false;
}
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "Desktop application registered path=%s", qPrintable(path));
#else
Q_UNUSED(executable);
#endif
return true;
}