diff --git a/compilerplugins/clang/unusedenumconstants.writeonly.results b/compilerplugins/clang/unusedenumconstants.writeonly.results index a5416adbffd5..eec437d8220a 100644 --- a/compilerplugins/clang/unusedenumconstants.writeonly.results +++ b/compilerplugins/clang/unusedenumconstants.writeonly.results @@ -1316,9 +1316,9 @@ desktop/source/lib/init.cxx:8046 enum (unnamed at /home/noel/libo-plugin/desktop/source/lib/init.cxx:8043:5) FULL_INIT desktop/source/migration/services/oo3extensionmigration.hxx:62 enum migration::OO3ExtensionMigration::ScanResult SCANRESULT_DONTMIGRATE_EXTENSION -desktop/unx/source/start.c:178 +desktop/unx/source/start.cxx:178 int ProgressExit -desktop/unx/source/start.c:178 +desktop/unx/source/start.cxx:178 int ProgressRestart drawinglayer/source/tools/emfphelperdata.hxx:250 enum emfplushelper::EmfPlusHelperData::Direction vertical diff --git a/desktop/Executable_oosplash.mk b/desktop/Executable_oosplash.mk index 2808e0113510..d1a5013a44cc 100644 --- a/desktop/Executable_oosplash.mk +++ b/desktop/Executable_oosplash.mk @@ -12,6 +12,7 @@ $(eval $(call gb_Executable_Executable,oosplash)) $(eval $(call gb_Executable_set_targettype_gui,oosplash,YES)) $(eval $(call gb_Executable_use_libraries,oosplash,\ + comphelper \ sal \ )) @@ -20,6 +21,9 @@ $(eval $(call gb_Executable_add_cobjects,oosplash,\ desktop/unx/source/file_image_unx \ $(if $(ENABLE_PAGEIN),desktop/unx/source/pagein) \ desktop/unx/source/splashx \ +)) + +$(eval $(call gb_Executable_add_cxxobjects,oosplash,\ desktop/unx/source/start \ )) diff --git a/desktop/source/deployment/misc/dp_misc.cxx b/desktop/source/deployment/misc/dp_misc.cxx index 0161452bbc93..3ed39a649bfa 100644 --- a/desktop/source/deployment/misc/dp_misc.cxx +++ b/desktop/source/deployment/misc/dp_misc.cxx @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include #include @@ -299,27 +299,18 @@ OUString generateOfficePipeId() throw Exception(u"Extension Manager: Could not obtain path for UserInstallation."_ustr, nullptr); } - rtlDigest digest = rtl_digest_create( rtl_Digest_AlgorithmMD5 ); - if (!digest) { - throw RuntimeException(u"cannot get digest rtl_Digest_AlgorithmMD5!"_ustr, nullptr ); - } - sal_uInt8 const * data = reinterpret_cast(userPath.getStr()); std::size_t size = userPath.getLength() * sizeof (sal_Unicode); - sal_uInt32 md5_key_len = rtl_digest_queryLength( digest ); - std::unique_ptr md5_buf( new sal_uInt8 [ md5_key_len ] ); - rtl_digest_init( digest, data, static_cast(size) ); - rtl_digest_update( digest, data, static_cast(size) ); - rtl_digest_get( digest, md5_buf.get(), md5_key_len ); - rtl_digest_destroy( digest ); + std::vector hash{ + ::comphelper::Hash::calculateHash(data, size, ::comphelper::HashType::MD5)}; // create hex-value string from the MD5 value to keep // the string size minimal OUStringBuffer buf( "SingleOfficeIPC_" ); - for ( sal_uInt32 i = 0; i < md5_key_len; ++i ) { - buf.append( static_cast(md5_buf[ i ]), 0x10 ); + for (unsigned char b : hash) { + buf.append( static_cast(b), 0x10 ); } return buf.makeStringAndClear(); } diff --git a/desktop/unx/source/args.h b/desktop/unx/source/args.h index f0fe7ce39b11..e60e61c26f83 100644 --- a/desktop/unx/source/args.h +++ b/desktop/unx/source/args.h @@ -9,6 +9,10 @@ #include #include +#ifdef __cplusplus +extern "C" { +#endif + typedef struct { rtl_uString *pAppPath; const char *pPageinType; // @pagein-writer for - writer etc. else NULL @@ -25,4 +29,8 @@ typedef struct { Args *args_parse (void); void args_free (Args *args); +#ifdef __cplusplus +} +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/unx/source/pagein.h b/desktop/unx/source/pagein.h index 7fb8b6a918a6..eaf11cad20fa 100644 --- a/desktop/unx/source/pagein.h +++ b/desktop/unx/source/pagein.h @@ -21,6 +21,10 @@ #include +#ifdef __cplusplus +extern "C" { +#endif + #if HAVE_FEATURE_PAGEIN void pagein_execute(char const* path, char const* file); #else @@ -31,4 +35,8 @@ inline void pagein_execute(char const* path, char const* file) } #endif +#ifdef __cplusplus +} +#endif + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/unx/source/start.c b/desktop/unx/source/start.cxx similarity index 85% rename from desktop/unx/source/start.c rename to desktop/unx/source/start.cxx index 2529e214ff8c..6db3ae68ea9e 100644 --- a/desktop/unx/source/start.c +++ b/desktop/unx/source/start.cxx @@ -23,11 +23,11 @@ #include #include +#include #include #include #include #include -#include #include #include #include @@ -42,7 +42,7 @@ /* Easier conversions: rtl_uString to rtl_String */ static rtl_String *ustr_to_str(rtl_uString *pStr) { - rtl_String *pOut = NULL; + rtl_String *pOut = nullptr; rtl_uString2String(&pOut, rtl_uString_getStr(pStr), rtl_uString_getLength(pStr), osl_getThreadTextEncoding(), OUSTRING_TO_OSTRING_CVTFLAGS); @@ -53,18 +53,22 @@ static rtl_String *ustr_to_str(rtl_uString *pStr) /* Easier conversions: char * to rtl_uString */ static rtl_uString *charp_to_ustr(const char *pStr) { - rtl_uString *pOut = NULL; + rtl_uString *pOut = nullptr; rtl_string2UString(&pOut, pStr, strlen(pStr), osl_getThreadTextEncoding(), OSTRING_TO_OUSTRING_CVTFLAGS); return pOut; } +namespace { + typedef struct { int status_fd; oslProcess child; } ChildInfo; +} // namespace + static int child_info_get_status_fd(ChildInfo const *info) { @@ -79,16 +83,16 @@ child_info_destroy(ChildInfo *info) free (info); } -static ChildInfo * child_spawn(Args *args, sal_Bool bAllArgs, sal_Bool bWithStatus) +static ChildInfo * child_spawn(Args *args, bool bAllArgs, bool bWithStatus) { - rtl_uString *pApp = NULL, *pTmp = NULL; + rtl_uString *pApp = nullptr, *pTmp = nullptr; rtl_uString **ppArgs; sal_uInt32 nArgs, i; ChildInfo *info; int status_pipe[2]; oslProcessError nError; - info = calloc (1, sizeof (ChildInfo)); + info = static_cast(calloc (1, sizeof (ChildInfo))); /* create pipe */ if (pipe(status_pipe) < 0) @@ -104,11 +108,11 @@ static ChildInfo * child_spawn(Args *args, sal_Bool bAllArgs, sal_Bool bWithStat rtl_uString_newFromAscii(&pTmp, "soffice.bin"); rtl_uString_newConcat(&pApp, pApp, pTmp); rtl_uString_release(pTmp); - pTmp = NULL; + pTmp = nullptr; /* copy args */ nArgs = bAllArgs ? args->nArgsTotal : args->nArgsEnv; - ppArgs = (rtl_uString **)calloc(nArgs + 1, sizeof(rtl_uString*)); + ppArgs = static_cast(calloc(nArgs + 1, sizeof(rtl_uString*))); for (i = 0; i < nArgs; ++i) ppArgs[i] = args->ppArgs[i]; @@ -126,9 +130,9 @@ static ChildInfo * child_spawn(Args *args, sal_Bool bAllArgs, sal_Bool bWithStat /* start the main process */ nError = osl_executeProcess(pApp, ppArgs, nArgs, osl_Process_NORMAL, - NULL, - NULL, - NULL, 0, + nullptr, + nullptr, + nullptr, 0, &info->child ); if (pTmp) @@ -148,7 +152,7 @@ static ChildInfo * child_spawn(Args *args, sal_Bool bAllArgs, sal_Bool bWithStat return info; } -static sal_Bool child_exited_wait(ChildInfo *info, sal_Bool bShortWait) +static bool child_exited_wait(ChildInfo *info, bool bShortWait) { TimeValue t = { 0, 250 /* ms */ * 1000 * 1000 }; if (!bShortWait) @@ -173,8 +177,12 @@ static int child_get_exit_code(ChildInfo *info) return inf.Code; } +namespace { + typedef enum { ProgressContinue, ProgressRestart, ProgressExit } ProgressStatus; +} // namespace + /* Path of the application, with trailing slash. */ static rtl_uString *get_app_path(const char *pAppExec) { @@ -194,7 +202,7 @@ static rtl_uString *get_app_path(const char *pAppExec) len = rtl_uString_getLength(pResult); if (len > 0 && rtl_uString_getStr(pResult)[len - 1] != '/') { - rtl_uString *pSlash = NULL; + rtl_uString *pSlash = nullptr; rtl_uString_newFromAscii(&pSlash, "/"); rtl_uString_newConcat(&pResult, pResult, pSlash); rtl_uString_release(pSlash); @@ -206,60 +214,44 @@ static rtl_uString *get_app_path(const char *pAppExec) /* Compute the OOo md5 hash from 'pText' */ static rtl_uString *get_md5hash(rtl_uString *pText) { - rtl_uString *pResult = NULL; + rtl_uString *pResult = nullptr; sal_Int32 nCapacity = 100; - unsigned char *pData = NULL; + unsigned char *pData = nullptr; sal_uInt32 nSize = 0; - rtlDigest digest; - sal_uInt32 md5_key_len = 0; - sal_uInt8* md5_buf = NULL; - sal_uInt32 i = 0; if ( !pText ) - return NULL; + return nullptr; - pData = (unsigned char *)rtl_uString_getStr(pText); + pData = reinterpret_cast(rtl_uString_getStr(pText)); nSize = rtl_uString_getLength(pText) * sizeof(sal_Unicode); if (!pData) - return NULL; + return nullptr; - digest = rtl_digest_create(rtl_Digest_AlgorithmMD5); - if (!digest) - return NULL; - - md5_key_len = rtl_digest_queryLength(digest); - md5_buf = (sal_uInt8 *)calloc(md5_key_len, sizeof(sal_uInt8)); - - rtl_digest_init(digest, pData , nSize); - rtl_digest_update(digest, pData, nSize); - rtl_digest_get(digest, md5_buf, md5_key_len); - rtl_digest_destroy(digest); + const std::vector md5_buf = + comphelper::Hash::calculateHash(pData, nSize, comphelper::HashType::MD5); /* create hex-value string from the MD5 value to keep the string size minimal */ rtl_uString_new_WithLength(&pResult, nCapacity); - for (; i < md5_key_len; ++i) + for (unsigned char b : md5_buf) { char val[3]; - snprintf(val, 3, "%x", md5_buf[i]); /* sic! we ignore some of the 0's */ + snprintf(val, 3, "%x", b); /* sic! we ignore some of the 0's */ rtl_uStringbuffer_insert_ascii(&pResult, &nCapacity, rtl_uString_getLength(pResult), val, strlen(val)); } - /* cleanup */ - free(md5_buf); - return pResult; } /* Construct the pipe name */ static rtl_uString *get_pipe_path(rtl_uString *pAppPath) { - rtl_uString *pPath = NULL, *pTmp = NULL, *pUserInstallation = NULL; - rtl_uString *pResult = NULL, *pBasePath = NULL, *pAbsUserInstallation = NULL; + rtl_uString *pPath = nullptr, *pTmp = nullptr, *pUserInstallation = nullptr; + rtl_uString *pResult = nullptr, *pBasePath = nullptr, *pAbsUserInstallation = nullptr; rtlBootstrapHandle handle; - rtl_uString *pMd5hash = NULL; + rtl_uString *pMd5hash = nullptr; sal_Unicode pUnicode[RTL_USTR_MAX_VALUEOFINT32]; /* setup bootstrap filename */ @@ -273,7 +265,7 @@ static rtl_uString *get_pipe_path(rtl_uString *pAppPath) handle = rtl_bootstrap_args_open(pPath); rtl_uString_newFromAscii(&pTmp, "UserInstallation"); - rtl_bootstrap_get_from_handle(handle, pTmp, &pUserInstallation, NULL); + rtl_bootstrap_get_from_handle(handle, pTmp, &pUserInstallation, nullptr); rtl_bootstrap_args_close(handle); @@ -304,7 +296,7 @@ static rtl_uString *get_pipe_path(rtl_uString *pAppPath) rtl_uString_newFromAscii(&pTmp, "/OSL_PIPE_"); rtl_uString_newConcat(&pResult, pResult, pTmp); - rtl_ustr_valueOfInt32(pUnicode, (int)getuid(), 10); + rtl_ustr_valueOfInt32(pUnicode, static_cast(getuid()), 10); rtl_uString_newFromStr(&pTmp, pUnicode); rtl_uString_newConcat(&pResult, pResult, pTmp); @@ -354,7 +346,7 @@ static int connect_pipe(rtl_uString *pPipePath) len = sizeof(addr); #endif - if (connect(fd, (struct sockaddr *)&addr, len) < 0) + if (connect(fd, reinterpret_cast(&addr), len) < 0) { close(fd); fd = -1; @@ -365,7 +357,7 @@ static int connect_pipe(rtl_uString *pPipePath) /* Escape: "," -> "\\,", "\0" -> "\\0", "\\" -> "\\\\" */ static rtl_uString *escape_path(rtl_uString const *pToEscape) { - rtl_uString *pBuffer = NULL; + rtl_uString *pBuffer = nullptr; sal_Int32 nCapacity = 1000; sal_Int32 i = 0; sal_Int32 nEscapeLength = rtl_uString_getLength(pToEscape); @@ -403,12 +395,12 @@ static rtl_uString *escape_path(rtl_uString const *pToEscape) } /* Send args to the LO instance (using the 'fd' file descriptor) */ -static sal_Bool send_args(int fd, rtl_uString const *pCwdPath) +static bool send_args(int fd, rtl_uString const *pCwdPath) { - rtl_uString *pBuffer = NULL, *pTmp = NULL; + rtl_uString *pBuffer = nullptr, *pTmp = nullptr; sal_Int32 nCapacity = 1000; - rtl_String *pOut = NULL; - sal_Bool bResult; + rtl_String *pOut = nullptr; + bool bResult; size_t nLen; rtl_uString *pEscapedCwdPath = escape_path(pCwdPath); sal_uInt32 nArg = 0; @@ -441,7 +433,7 @@ static sal_Bool send_args(int fd, rtl_uString const *pCwdPath) for (nArg = 0; nArg < nArgCount; ++nArg) { - rtl_uString *pEscapedTmp = NULL; + rtl_uString *pEscapedTmp = nullptr; rtl_uStringbuffer_insert_ascii(&pBuffer, &nCapacity, rtl_uString_getLength(pBuffer), ",", 1); @@ -470,7 +462,7 @@ static sal_Bool send_args(int fd, rtl_uString const *pCwdPath) nLen = rtl_string_getLength(pOut) + 1; ssize_t n = write(fd, rtl_string_getStr(pOut), nLen); - bResult = (n >= 0 && (size_t) n == nLen); + bResult = (n >= 0 && static_cast(n) == nLen); if ( bResult ) { @@ -581,7 +573,7 @@ static void exec_pagein (Args *args) static void extend_library_path(const char *new_element) { - rtl_uString *pEnvName=NULL, *pOrigEnvVar=NULL, *pNewEnvVar=NULL; + rtl_uString *pEnvName=nullptr, *pOrigEnvVar=nullptr, *pNewEnvVar=nullptr; rtl_uString_newFromAscii(&pEnvName, "LD_LIBRARY_PATH"); rtl_string2UString(&pNewEnvVar, new_element, strlen(new_element), RTL_TEXTENCODING_UTF8, OSTRING_TO_OUSTRING_CVTFLAGS); @@ -589,7 +581,7 @@ static void extend_library_path(const char *new_element) osl_getEnvironment(pEnvName, &pOrigEnvVar); if (pOrigEnvVar && pOrigEnvVar->length) { - rtl_uString *pDelim = NULL; + rtl_uString *pDelim = nullptr; rtl_uString_newFromAscii(&pDelim, ":"); rtl_uString_newConcat(&pNewEnvVar, pNewEnvVar, pDelim); rtl_uString_newConcat(&pNewEnvVar, pNewEnvVar, pOrigEnvVar); @@ -613,20 +605,20 @@ static void exec_javaldx(Args *args) rtl_uString **ppArgs; rtl_uString *pTmp, *pTmp2; - oslProcess javaldx = NULL; - oslFileHandle fileOut = NULL; + oslProcess javaldx = nullptr; + oslFileHandle fileOut = nullptr; oslProcessError err; - ppArgs = (rtl_uString **)calloc(args->nArgsEnv + 2, sizeof(rtl_uString*)); + ppArgs = static_cast(calloc(args->nArgsEnv + 2, sizeof(rtl_uString*))); for (nArgs = 0; nArgs < args->nArgsEnv; ++nArgs) ppArgs[nArgs] = args->ppArgs[nArgs]; /* Use absolute path to redirectrc */ - pTmp = NULL; + pTmp = nullptr; rtl_uString_newFromAscii(&pTmp, "-env:INIFILENAME=vnd.sun.star.pathname:"); rtl_uString_newConcat(&pTmp, pTmp, args->pAppPath); - pTmp2 = NULL; + pTmp2 = nullptr; rtl_uString_newFromAscii(&pTmp2, "redirectrc"); rtl_uString_newConcat(&pTmp, pTmp, pTmp2); ppArgs[nArgs] = pTmp; @@ -634,23 +626,23 @@ static void exec_javaldx(Args *args) nArgs++; /* And also to javaldx */ - pApp = NULL; + pApp = nullptr; rtl_uString_newFromAscii(&pApp, "file://"); rtl_uString_newConcat(&pApp, pApp, args->pAppPath); - pTmp = NULL; + pTmp = nullptr; rtl_uString_newFromAscii(&pTmp, "javaldx"); rtl_uString_newConcat(&pApp, pApp, pTmp); rtl_uString_release(pTmp); err = osl_executeProcess_WithRedirectedIO(pApp, ppArgs, nArgs, osl_Process_NORMAL, - NULL, // security - NULL, // work dir - NULL, 0, + nullptr, // security + nullptr, // work dir + nullptr, 0, &javaldx, // process handle - NULL, + nullptr, &fileOut, - NULL); + nullptr); rtl_uString_release(ppArgs[nArgs-1]); rtl_uString_release(pApp); @@ -658,7 +650,7 @@ static void exec_javaldx(Args *args) if(err != osl_Process_E_None) { - putenv("javaldx_warn=failed to launch javaldx - java may not function correctly"); + putenv(const_cast("javaldx_warn=failed to launch javaldx - java may not function correctly")); if (javaldx) osl_freeProcessHandle(javaldx); @@ -676,7 +668,7 @@ static void exec_javaldx(Args *args) if (bytes_read <= 0) { - putenv("javaldx_warn=failed to read path from javaldx"); + putenv(const_cast("javaldx_warn=failed to read path from javaldx")); if (javaldx) osl_freeProcessHandle(javaldx); @@ -707,14 +699,12 @@ static void exec_javaldx(Args *args) #endif // has to be a global :( -static oslProcess * volatile g_pProcess = NULL; +static oslProcess volatile g_pProcess = nullptr; -static void sigterm_handler(int ignored) +static void sigterm_handler(int /*ignored*/) { - (void) ignored; - if (g_pProcess) { - int SigTermSucceded = 0; + bool SigTermSucceded = false; oslProcessInfo info; info.Size = sizeof(oslProcessInfo); @@ -739,12 +729,12 @@ static void sigterm_handler(int ignored) SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { - sal_Bool bSentArgs = sal_False; + bool bSentArgs = false; const char* pUsePlugin; - rtl_uString *pPipePath = NULL; + rtl_uString *pPipePath = nullptr; Args *args; int status = 0; - struct splash* splash = NULL; + struct splash* splash = nullptr; struct sigaction sigpipe_action; struct sigaction sigterm_action; @@ -752,11 +742,11 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) memset(&sigpipe_action, 0, sizeof(struct sigaction)); sigpipe_action.sa_handler = SIG_IGN; sigemptyset(&sigpipe_action.sa_mask); - sigaction(SIGPIPE, &sigpipe_action, NULL); + sigaction(SIGPIPE, &sigpipe_action, nullptr); memset(&sigterm_action, 0, sizeof(struct sigaction)); sigterm_action.sa_handler = &sigterm_handler; sigemptyset(&sigterm_action.sa_mask); - sigaction(SIGTERM, &sigterm_action, NULL); + sigaction(SIGTERM, &sigterm_action, nullptr); args = args_parse(); args->pAppPath = get_app_path(argv[0]); @@ -768,12 +758,12 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) #ifndef ENABLE_QUICKSTART_LIBPNG /* we can't load and render it anyway */ - args->bInhibitSplash = sal_True; + args->bInhibitSplash = true; #endif pUsePlugin = getenv("SAL_USE_VCLPLUGIN"); if (pUsePlugin && !strcmp(pUsePlugin, "svp")) - args->bInhibitSplash = sal_True; + args->bInhibitSplash = true; if (!args->bInhibitPipe && !getenv("LIBO_FLATPAK")) { @@ -785,11 +775,11 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) // Wait for answer char resp[27]; // strlen("InternalIPC::SendArguments") + 1 ssize_t n = read(fd, resp, SAL_N_ELEMENTS(resp)); - if (n == (ssize_t) SAL_N_ELEMENTS(resp) && + if (n == static_cast(SAL_N_ELEMENTS(resp)) && (memcmp(resp, "InternalIPC::SendArguments", SAL_N_ELEMENTS(resp) - 1) == 0)) { - rtl_uString *pCwdPath = NULL; + rtl_uString *pCwdPath = nullptr; osl_getProcessWorkingDir(&pCwdPath); // Then send args @@ -805,8 +795,8 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) /* we have to prepare for, and exec the binary */ int nPercent = 0; ChildInfo *info; - sal_Bool bAllArgs = sal_True; - sal_Bool bShortWait, bRestart; + bool bAllArgs = true; + bool bShortWait, bRestart; /* sanity check pieces */ system_checks(); @@ -827,10 +817,10 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) do { - bRestart = sal_False; + bRestart = false; /* fast updates if we have somewhere to update it to */ - bShortWait = splash ? sal_True : sal_False; + bShortWait = splash != nullptr; /* Periodically update the splash & the percent according to what status_fd says, poll quickly only while starting */ @@ -847,23 +837,23 @@ SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) if (eResult != ProgressContinue) { splash_destroy(splash); - splash = NULL; - bShortWait = sal_False; + splash = nullptr; + bShortWait = false; } } status = child_get_exit_code(info); - g_pProcess = NULL; // reset + g_pProcess = nullptr; // reset switch (status) { case EXITHELPER_CRASH_WITH_RESTART: // re-start with just -env: parameters - bRestart = sal_True; - bAllArgs = sal_False; + bRestart = true; + bAllArgs = false; break; case EXITHELPER_NORMAL_RESTART: // re-start with all arguments - bRestart = sal_True; - bAllArgs = sal_True; + bRestart = true; + bAllArgs = true; break; default: break; diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index e0851f07d0be..6a6be29f01d5 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -3013,7 +3013,7 @@ desktop/unx/source/file_image.h desktop/unx/source/file_image_unx.c desktop/unx/source/pagein.c desktop/unx/source/splashx.c -desktop/unx/source/start.c +desktop/unx/source/start.cxx desktop/win32/source/QuickStart/QuickStart.cxx desktop/win32/source/QuickStart/resource.h desktop/win32/source/applauncher/launcher.cxx