xca/lib/main.cpp
Christian Hohnstaedt 775939b3ae Close #552: issues with icons in gnome dock
coreApp->setOrganizationDomain() expects the domain
in DNS order (hohnstaedt.de) and not reversed.

Change the WM_CLASS property to "de.hohnstaedt.xca"
via setApplicationName().
While Qt6 prepends the reversed "OrganizationDomain",
Qt5 does not and setting the complete name with
domain-prefix works for both.

Also adopt the ".desktop" file name to follow the application-name
and fix issues found by "desktop-file-validate"
2024-09-07 21:52:29 +02:00

209 lines
4.8 KiB
C++

/* vi: set sw=4 ts=4:
*
* Copyright (C) 2001 - 2015 Christian Hohnstaedt.
*
* All rights reserved.
*/
#include <signal.h>
#include <QDir>
#include <QDebug>
#include "widgets/MainWindow.h"
#include "ui_MainWindow.h"
#include "widgets/XcaApplication.h"
#include "func.h"
#include "entropy.h"
#include "settings.h"
#include "pki_multi.h"
#include "arguments.h"
#include "pki_export.h"
#include "debug_info.h"
#if defined(Q_OS_WIN32)
//For the segfault handler
#include <windows.h>
#endif
#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
#include <openssl/provider.h>
#endif
#include <openssl/ui.h>
#include <QTextStream>
char segv_data[1024];
#if defined(Q_OS_WIN32)
static LONG CALLBACK w32_segfault(LPEXCEPTION_POINTERS e)
{
if (e->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION) {
if (segv_data[0]) {
XCA_WARN(QString(segv_data));
abort();
}
return EXCEPTION_CONTINUE_EXECUTION;
} else
return EXCEPTION_CONTINUE_SEARCH;
}
#else
static void segv_handler_gui(int)
{
if (segv_data[0])
XCA_WARN(QString(segv_data));
abort();
}
#endif
int uiwriter(UI *, UI_STRING *uis)
{
qWarning() << "ui-writer callled:" << UI_get0_action_string(uis)
<< UI_get0_output_string(uis);
return 1;
}
int read_cmdline(int, char **, bool, pki_multi **);
int main(int argc, char *argv[])
{
const char *xca_special = getenv("XCA_ARGUMENTS");
if (xca_special && *xca_special) {
puts(CCHAR(arguments::doc(xca_special)));
return 0;
}
debug_info::init();
#if defined(Q_OS_WIN32)
// If no style provided externally
if (!QApplication::style())
QApplication::setStyle("Fusion");
AttachConsole(-1);
int wargc;
wchar_t **wargv = CommandLineToArgvW(GetCommandLineW(), &wargc);
if (wargv && wargc) {
int i;
if (argc != wargc)
qWarning() << "argc != wargc" << argc << wargc;
if (argc > wargc)
argc = wargc;
qDebug() << "wargc" << wargc << argc;
for (i = 0; i < argc; i++) {
QString s = QString::fromWCharArray(wargv[i]);
QByteArray ba = s.toUtf8();
argv[i] = strdup(ba.constData());
qDebug() << "wargv" << i << argv[i] << s;
}
argv[i] = NULL;
LocalFree(wargv);
}
SetUnhandledExceptionFilter(w32_segfault);
#else
signal(SIGSEGV, segv_handler_gui);
#endif
bool console_only = arguments::is_console(argc, argv);
XcaApplication *gui = nullptr;
QCoreApplication *coreApp = nullptr;
#if !defined(Q_OS_WIN32)
if (console_only) {
coreApp = new QCoreApplication(argc, argv);
} else
#endif
{
/* On windows, always instantiate a GUI app */
coreApp = gui = new XcaApplication(argc, argv);
is_gui_app = true;
}
#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
{
QString path;
#if defined(Q_OS_WIN32)
path = QCoreApplication::applicationDirPath();
#elif defined(Q_OS_MACOS)
path = QCoreApplication::applicationDirPath() + "/../PlugIns";
#endif
if (!path.isEmpty()) {
OSSL_PROVIDER_set_default_search_path(NULL, path.toUtf8().data());
qDebug() << "OSSL_PROVIDER_set_default_search_path" << path;
}
}
MainWindow::legacy_loaded = OSSL_PROVIDER_try_load(0, "legacy", 1);
if (MainWindow::legacy_loaded)
qDebug() << "Legacy provider loaded";
else
qWarning() << "Legacy provider NOT loaded";
#endif
QSharedPointer<UI_METHOD> uimeth(
UI_create_method("xca-method"), UI_destroy_method);
UI_method_set_writer(uimeth.data(), uiwriter);
UI_set_default_method(uimeth.data());
coreApp->setApplicationName("de.hohnstaedt.xca");
coreApp->setOrganizationDomain("hohnstaedt.de");
coreApp->setApplicationVersion(XCA_VERSION);
xcaWarning::setGui(new xcaWarningCore());
migrateOldPaths();
pki_multi *cmdline_items = nullptr;
Entropy entropy;
Settings.clear();
try {
initOIDs();
} catch (errorEx &e) {
XCA_ERROR(e);
}
int ret = EXIT_SUCCESS;
for (int i=0; i < argc; i++)
qDebug() << "wargv" << argc << i << argv[i];
try {
if (gui && !console_only) {
mainwin = new MainWindow();
gui->setMainwin(mainwin);
read_cmdline(argc, argv, console_only, &cmdline_items);
if (cmdline_items)
qDebug() << "CMD Items" << cmdline_items->get().size();
if (cmdline_items && cmdline_items->get().size() > 0) {
mainwin->importMulti(cmdline_items, 1);
cmdline_items = nullptr;
} else {
delete cmdline_items;
enum open_result r = open_abort;
if (!Database.isOpen())
r = mainwin->init_database(QString());
else
r = mainwin->setup_open_database();
qDebug() << "PWret" << r << pw_cancel << pw_ok;
if (r != pw_exit) {
mainwin->show();
gui->exec();
}
}
} else {
ret = read_cmdline(argc, argv, console_only, &cmdline_items);
delete cmdline_items;
}
} catch (errorEx &ex) {
XCA_ERROR(ex);
} catch (enum open_result r) {
qDebug() << "DB open failed: " << r;
}
Database.close();
delete mainwin;
delete gui;
pki_export::free_elements();
#if defined(Q_OS_WIN32)
FreeConsole();
#endif
return ret;
}