2013-08-09 06:57:18 +02:00
|
|
|
#include "lc_global.h"
|
|
|
|
#include "lc_application.h"
|
2013-08-12 02:26:52 +02:00
|
|
|
#include "lc_qupdatedialog.h"
|
2013-08-16 03:25:51 +02:00
|
|
|
#include "lc_mainwindow.h"
|
2014-12-08 08:32:39 +01:00
|
|
|
#include "project.h"
|
2015-01-02 02:07:41 +01:00
|
|
|
#include "lc_colors.h"
|
2016-12-28 22:30:31 +01:00
|
|
|
#include "lc_partselectionwidget.h"
|
2013-08-09 06:57:18 +02:00
|
|
|
#include <QApplication>
|
2017-01-24 07:20:43 +01:00
|
|
|
#include <locale.h>
|
2013-08-09 06:57:18 +02:00
|
|
|
|
2013-08-13 06:29:47 +02:00
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
2016-03-06 21:19:02 +01:00
|
|
|
#pragma warning(push)
|
|
|
|
#pragma warning(disable : 4091)
|
2013-08-13 06:54:12 +02:00
|
|
|
#include <dbghelp.h>
|
|
|
|
#include <direct.h>
|
|
|
|
#include <shlobj.h>
|
2016-03-06 21:19:02 +01:00
|
|
|
#pragma warning(pop)
|
2013-08-13 06:54:12 +02:00
|
|
|
|
|
|
|
#ifdef UNICODE
|
|
|
|
#ifndef _UNICODE
|
|
|
|
#define _UNICODE
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <tchar.h>
|
|
|
|
|
|
|
|
static TCHAR minidumpPath[_MAX_PATH];
|
|
|
|
|
|
|
|
static LONG WINAPI lcSehHandler(PEXCEPTION_POINTERS exceptionPointers)
|
|
|
|
{
|
|
|
|
if (IsDebuggerPresent())
|
|
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
|
|
|
|
|
|
HMODULE dbgHelp = LoadLibrary(TEXT("dbghelp.dll"));
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
if (dbgHelp == nullptr)
|
2013-08-13 06:54:12 +02:00
|
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
HANDLE file = CreateFile(minidumpPath, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
|
2013-08-13 06:54:12 +02:00
|
|
|
|
|
|
|
if (file == INVALID_HANDLE_VALUE)
|
|
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
|
|
|
|
typedef BOOL (WINAPI *LPMINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserEncoderParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
|
|
|
|
LPMINIDUMPWRITEDUMP miniDumpWriteDump = (LPMINIDUMPWRITEDUMP)GetProcAddress(dbgHelp, "MiniDumpWriteDump");
|
|
|
|
if (!miniDumpWriteDump)
|
|
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
|
|
|
|
MINIDUMP_EXCEPTION_INFORMATION mei;
|
|
|
|
|
|
|
|
mei.ThreadId = GetCurrentThreadId();
|
|
|
|
mei.ExceptionPointers = exceptionPointers;
|
|
|
|
mei.ClientPointers = TRUE;
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
BOOL writeDump = miniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpNormal, exceptionPointers ? &mei : nullptr, nullptr, nullptr);
|
2013-08-13 06:54:12 +02:00
|
|
|
|
|
|
|
CloseHandle(file);
|
|
|
|
FreeLibrary(dbgHelp);
|
|
|
|
|
|
|
|
if (writeDump)
|
|
|
|
{
|
|
|
|
TCHAR message[_MAX_PATH + 256];
|
|
|
|
lstrcpy(message, TEXT("LeoCAD just crashed. Crash information was saved to the file '"));
|
|
|
|
lstrcat(message, minidumpPath);
|
|
|
|
lstrcat(message, TEXT("', please send it to the developers for debugging."));
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
MessageBox(nullptr, message, TEXT("LeoCAD"), MB_OK);
|
2013-08-13 06:54:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return EXCEPTION_EXECUTE_HANDLER;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void lcSehInit()
|
|
|
|
{
|
2017-04-14 02:26:40 +02:00
|
|
|
if (SHGetFolderPath(nullptr, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, nullptr, SHGFP_TYPE_CURRENT, minidumpPath) == S_OK)
|
2013-08-13 06:54:12 +02:00
|
|
|
{
|
|
|
|
lstrcat(minidumpPath, TEXT("\\LeoCAD\\"));
|
|
|
|
_tmkdir(minidumpPath);
|
|
|
|
lstrcat(minidumpPath, TEXT("minidump.dmp"));
|
|
|
|
}
|
|
|
|
|
|
|
|
SetUnhandledExceptionFilter(lcSehHandler);
|
|
|
|
}
|
|
|
|
|
2013-08-13 06:29:47 +02:00
|
|
|
static void lcRegisterShellFileTypes()
|
|
|
|
{
|
|
|
|
TCHAR modulePath[_MAX_PATH], longModulePath[_MAX_PATH];
|
|
|
|
TCHAR temp[2*_MAX_PATH];
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
GetModuleFileName(nullptr, longModulePath, _MAX_PATH);
|
2013-08-13 06:29:47 +02:00
|
|
|
if (GetShortPathName(longModulePath, modulePath, _MAX_PATH) == 0)
|
|
|
|
lstrcpy(modulePath, longModulePath);
|
|
|
|
|
|
|
|
if (RegSetValue(HKEY_CLASSES_ROOT, TEXT("LeoCAD.Project"), REG_SZ, TEXT("LeoCAD Project"), lstrlen(TEXT("LeoCAD Project")) * sizeof(TCHAR)) != ERROR_SUCCESS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
lstrcpy(temp, modulePath);
|
|
|
|
lstrcat(temp, TEXT(",0"));
|
|
|
|
if (RegSetValue(HKEY_CLASSES_ROOT, TEXT("LeoCAD.Project\\DefaultIcon"), REG_SZ, temp, lstrlen(temp) * sizeof(TCHAR)) != ERROR_SUCCESS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
lstrcpy(temp, modulePath);
|
|
|
|
lstrcat(temp, TEXT(" \"%1\""));
|
|
|
|
if (RegSetValue(HKEY_CLASSES_ROOT, TEXT("LeoCAD.Project\\shell\\open\\command"), REG_SZ, temp, lstrlen(temp) * sizeof(TCHAR)) != ERROR_SUCCESS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
LONG size = 2 * _MAX_PATH;
|
|
|
|
LONG result = RegQueryValue(HKEY_CLASSES_ROOT, TEXT(".lcd"), temp, &size);
|
|
|
|
|
|
|
|
if (result != ERROR_SUCCESS || !lstrlen(temp) || lstrcmp(temp, TEXT("LeoCAD.Project")))
|
|
|
|
{
|
|
|
|
if (RegSetValue(HKEY_CLASSES_ROOT, TEXT(".lcd"), REG_SZ, TEXT("LeoCAD.Project"), lstrlen(TEXT("LeoCAD.Project")) * sizeof(TCHAR)) != ERROR_SUCCESS)
|
|
|
|
return;
|
|
|
|
|
|
|
|
HKEY key;
|
|
|
|
DWORD disposition = 0;
|
|
|
|
|
2017-04-14 02:26:40 +02:00
|
|
|
if (RegCreateKeyEx(HKEY_CLASSES_ROOT, TEXT(".lcd\\ShellNew"), 0, REG_NONE, REG_OPTION_NON_VOLATILE, KEY_WRITE | KEY_READ, nullptr, &key, &disposition) != ERROR_SUCCESS)
|
2013-08-13 06:29:47 +02:00
|
|
|
return;
|
|
|
|
|
2017-04-03 02:15:09 +02:00
|
|
|
result = RegSetValueEx(key, TEXT("NullFile"), 0, REG_SZ, (CONST BYTE*)TEXT(""), (lstrlen(TEXT("")) + 1) * sizeof(TCHAR));
|
2013-08-13 06:29:47 +02:00
|
|
|
|
|
|
|
if (RegCloseKey(key) != ERROR_SUCCESS || result != ERROR_SUCCESS)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2013-08-09 06:57:18 +02:00
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
QApplication app(argc, argv);
|
2016-01-28 19:48:57 +01:00
|
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0))
|
2016-01-19 03:40:18 +01:00
|
|
|
app.setApplicationDisplayName("LeoCAD");
|
2016-01-28 19:48:57 +01:00
|
|
|
#endif
|
2013-08-09 06:57:18 +02:00
|
|
|
|
|
|
|
QCoreApplication::setOrganizationDomain("leocad.org");
|
2013-08-12 02:26:52 +02:00
|
|
|
QCoreApplication::setOrganizationName("LeoCAD Software");
|
2013-08-09 06:57:18 +02:00
|
|
|
QCoreApplication::setApplicationName("LeoCAD");
|
|
|
|
QCoreApplication::setApplicationVersion(LC_VERSION_TEXT);
|
|
|
|
|
2014-09-16 01:41:46 +02:00
|
|
|
QTranslator Translator;
|
2014-09-18 00:17:42 +02:00
|
|
|
Translator.load(QString("leocad_") + QLocale::system().name().section('_', 0, 0) + ".qm", ":/resources");
|
2014-09-16 01:41:46 +02:00
|
|
|
app.installTranslator(&Translator);
|
|
|
|
|
2017-02-06 23:20:09 +01:00
|
|
|
qRegisterMetaTypeStreamOperators<QList<int> >("QList<int>");
|
|
|
|
|
2013-08-09 06:57:18 +02:00
|
|
|
g_App = new lcApplication();
|
2017-08-29 04:13:17 +02:00
|
|
|
QList<QPair<QString, bool>> LibraryPaths;
|
2013-08-09 06:57:18 +02:00
|
|
|
|
2017-08-29 04:13:17 +02:00
|
|
|
#ifdef Q_OS_WIN
|
2013-08-13 06:29:47 +02:00
|
|
|
lcRegisterShellFileTypes();
|
2013-08-13 06:54:12 +02:00
|
|
|
lcSehInit();
|
2017-08-29 04:13:17 +02:00
|
|
|
|
|
|
|
LibraryPaths += qMakePair(QDir::cleanPath(QCoreApplication::applicationDirPath() + "/library.bin"), true);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef Q_OS_LINUX
|
|
|
|
LibraryPaths += qMakePair(QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../share/leocad/library.bin"), true);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef Q_OS_MAC
|
|
|
|
LibraryPaths += qMakePair(QDir::cleanPath(QCoreApplication::applicationDirPath() + "/../../Contents/Resources/library.bin"), true);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LC_INSTALL_PREFIX
|
|
|
|
LibraryPaths += qMakePair(QLatin1String(LC_INSTALL_PREFIX "/share/leocad/"), false);
|
2014-09-13 00:47:08 +02:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LC_LDRAW_LIBRARY_PATH
|
2017-08-29 04:13:17 +02:00
|
|
|
LibraryPaths += qMakePair(QLatin1String(LC_LDRAW_LIBRARY_PATH), false);
|
2013-08-09 06:57:18 +02:00
|
|
|
#endif
|
2017-01-24 05:46:52 +01:00
|
|
|
|
|
|
|
setlocale(LC_NUMERIC, "C");
|
2013-08-09 06:57:18 +02:00
|
|
|
|
2016-12-07 18:24:47 +01:00
|
|
|
bool ShowWindow;
|
2017-08-29 04:13:17 +02:00
|
|
|
if (!g_App->Initialize(argc, argv, LibraryPaths, ShowWindow))
|
2013-08-09 06:57:18 +02:00
|
|
|
return 1;
|
|
|
|
|
2016-12-07 18:24:47 +01:00
|
|
|
int ExecReturn = 0;
|
|
|
|
|
|
|
|
if (ShowWindow)
|
|
|
|
{
|
|
|
|
gMainWindow->SetColorIndex(lcGetColorIndex(4));
|
2016-12-28 22:30:31 +01:00
|
|
|
gMainWindow->GetPartSelectionWidget()->SetDefaultPart();
|
2016-12-07 18:24:47 +01:00
|
|
|
gMainWindow->UpdateRecentFiles();
|
|
|
|
gMainWindow->show();
|
2013-08-09 06:57:18 +02:00
|
|
|
|
2014-09-13 00:17:22 +02:00
|
|
|
#if !LC_DISABLE_UPDATE_CHECK
|
2016-12-07 18:24:47 +01:00
|
|
|
lcDoInitialUpdateCheck();
|
2014-09-13 00:17:22 +02:00
|
|
|
#endif
|
2013-08-12 02:26:52 +02:00
|
|
|
|
2016-12-07 18:24:47 +01:00
|
|
|
ExecReturn = app.exec();
|
|
|
|
}
|
2013-08-09 06:57:18 +02:00
|
|
|
|
|
|
|
delete gMainWindow;
|
2017-04-14 02:26:40 +02:00
|
|
|
gMainWindow = nullptr;
|
2013-08-09 06:57:18 +02:00
|
|
|
delete g_App;
|
2017-04-14 02:26:40 +02:00
|
|
|
g_App = nullptr;
|
2013-08-09 06:57:18 +02:00
|
|
|
|
2016-12-07 18:24:47 +01:00
|
|
|
return ExecReturn;
|
2013-08-09 06:57:18 +02:00
|
|
|
}
|