summaryrefslogtreecommitdiffstats
path: root/application/xulrunner/stub/nsXULStub.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'application/xulrunner/stub/nsXULStub.cpp')
-rw-r--r--application/xulrunner/stub/nsXULStub.cpp445
1 files changed, 0 insertions, 445 deletions
diff --git a/application/xulrunner/stub/nsXULStub.cpp b/application/xulrunner/stub/nsXULStub.cpp
deleted file mode 100644
index 8638ae43e..000000000
--- a/application/xulrunner/stub/nsXULStub.cpp
+++ /dev/null
@@ -1,445 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsXPCOMGlue.h"
-#include "nsINIParser.h"
-#include "nsXPCOMPrivate.h" // for XP MAXPATHLEN
-#include "nsXULAppAPI.h"
-#include "nsIFile.h"
-
-#include <stdarg.h>
-
-#ifdef XP_WIN
-#include <windows.h>
-#include <io.h>
-#if defined(_MSC_VER) && _MSC_VER < 1900
-#define snprintf _snprintf
-#define vsnprintf _vsnprintf
-#endif
-#define strcasecmp _stricmp
-#define PATH_SEPARATOR_CHAR '\\'
-#define R_OK 04
-#elif defined(XP_MACOSX)
-#include <unistd.h>
-#include <sys/stat.h>
-#include <CoreFoundation/CoreFoundation.h>
-#define PATH_SEPARATOR_CHAR '/'
-#else
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#define PATH_SEPARATOR_CHAR '/'
-#endif
-
-#ifdef XP_WIN
-#define XRE_DONT_PROTECT_DLL_LOAD
-#include "nsWindowsWMain.cpp"
-#endif
-
-#define VERSION_MAXLEN 128
-
-static void Output(bool isError, const char *fmt, ... )
-{
- va_list ap;
- va_start(ap, fmt);
-
-#if (defined(XP_WIN) && !MOZ_WINCONSOLE)
- char msg[2048];
-
- vsnprintf(msg, sizeof(msg), fmt, ap);
-
- UINT flags = MB_OK;
- if (isError)
- flags |= MB_ICONERROR;
- else
- flags |= MB_ICONINFORMATION;
-
- wchar_t wide_msg[1024];
- MultiByteToWideChar(CP_ACP,
- 0,
- msg,
- -1,
- wide_msg,
- sizeof(wide_msg) / sizeof(wchar_t));
-
- MessageBoxW(nullptr, wide_msg, L"XULRunner", flags);
-#else
- vfprintf(stderr, fmt, ap);
-#endif
-
- va_end(ap);
-}
-
-/**
- * Return true if |arg| matches the given argument name.
- */
-static bool IsArg(const char* arg, const char* s)
-{
- if (*arg == '-')
- {
- if (*++arg == '-')
- ++arg;
- return !strcasecmp(arg, s);
- }
-
-#if defined(XP_WIN)
- if (*arg == '/')
- return !strcasecmp(++arg, s);
-#endif
-
- return false;
-}
-
-/**
- * Return true if |aDir| is a valid file/directory.
- */
-static bool FolderExists(const char* aDir)
-{
-#ifdef XP_WIN
- wchar_t wideDir[MAX_PATH];
- MultiByteToWideChar(CP_UTF8, 0, aDir, -1, wideDir, MAX_PATH);
- DWORD fileAttrs = GetFileAttributesW(wideDir);
- return fileAttrs != INVALID_FILE_ATTRIBUTES;
-#else
- return access(aDir, R_OK) == 0;
-#endif
-}
-
-static nsresult GetRealPath(const char* appDataFile, char* *aResult)
-{
-#ifdef XP_WIN
- wchar_t wAppDataFile[MAX_PATH];
- wchar_t wIniPath[MAX_PATH];
- MultiByteToWideChar(CP_UTF8, 0, appDataFile, -1, wAppDataFile, MAX_PATH);
- _wfullpath(wIniPath, wAppDataFile, MAX_PATH);
- WideCharToMultiByte(CP_UTF8, 0, wIniPath, -1, *aResult, MAX_PATH, 0, 0);
-#else
- struct stat fileStat;
- if (!realpath(appDataFile, *aResult) || stat(*aResult, &fileStat))
- return NS_ERROR_FAILURE;
-#endif
- if (!*aResult || !**aResult)
- return NS_ERROR_FAILURE;
-
- return NS_OK;
-}
-
-class AutoAppData
-{
-public:
- AutoAppData(nsIFile* aINIFile) : mAppData(nullptr) {
- nsresult rv = XRE_CreateAppData(aINIFile, &mAppData);
- if (NS_FAILED(rv))
- mAppData = nullptr;
- }
- ~AutoAppData() {
- if (mAppData)
- XRE_FreeAppData(mAppData);
- }
-
- operator nsXREAppData*() const { return mAppData; }
- nsXREAppData* operator -> () const { return mAppData; }
-
-private:
- nsXREAppData* mAppData;
-};
-
-XRE_CreateAppDataType XRE_CreateAppData;
-XRE_FreeAppDataType XRE_FreeAppData;
-XRE_mainType XRE_main;
-
-int
-main(int argc, char **argv)
-{
- nsresult rv;
- char *lastSlash;
-
- char iniPath[MAXPATHLEN];
- char tmpPath[MAXPATHLEN];
- char greDir[MAXPATHLEN];
- bool greFound = false;
-
-#if defined(XP_MACOSX)
- CFBundleRef appBundle = CFBundleGetMainBundle();
- if (!appBundle)
- return 1;
-
- CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(appBundle);
- if (!resourcesURL)
- return 1;
-
- CFURLRef absResourcesURL = CFURLCopyAbsoluteURL(resourcesURL);
- CFRelease(resourcesURL);
- if (!absResourcesURL)
- return 1;
-
- CFURLRef iniFileURL =
- CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault,
- absResourcesURL,
- CFSTR("application.ini"),
- false);
- CFRelease(absResourcesURL);
- if (!iniFileURL)
- return 1;
-
- CFStringRef iniPathStr =
- CFURLCopyFileSystemPath(iniFileURL, kCFURLPOSIXPathStyle);
- CFRelease(iniFileURL);
- if (!iniPathStr)
- return 1;
-
- CFStringGetCString(iniPathStr, iniPath, sizeof(iniPath),
- kCFStringEncodingUTF8);
- CFRelease(iniPathStr);
-
-#else
-
-#ifdef XP_WIN
- wchar_t wide_path[MAX_PATH];
- if (!::GetModuleFileNameW(nullptr, wide_path, MAX_PATH))
- return 1;
-
- WideCharToMultiByte(CP_UTF8, 0, wide_path,-1,
- iniPath, MAX_PATH, nullptr, nullptr);
-
-#else
- // on unix, there is no official way to get the path of the current binary.
- // instead of using the MOZILLA_FIVE_HOME hack, which doesn't scale to
- // multiple applications, we will try a series of techniques:
- //
- // 1) use realpath() on argv[0], which works unless we're loaded from the
- // PATH
- // 2) manually walk through the PATH and look for ourself
- // 3) give up
-
- struct stat fileStat;
- strncpy(tmpPath, argv[0], sizeof(tmpPath));
- lastSlash = strrchr(tmpPath, '/');
- if (lastSlash) {
- *lastSlash = 0;
- realpath(tmpPath, iniPath);
- } else {
- const char *path = getenv("PATH");
- if (!path)
- return 1;
-
- char *pathdup = strdup(path);
- if (!pathdup)
- return 1;
-
- bool found = false;
- char *token = strtok(pathdup, ":");
- while (token) {
- sprintf(tmpPath, "%s/%s", token, argv[0]);
- if (stat(tmpPath, &fileStat) == 0) {
- found = true;
- lastSlash = strrchr(tmpPath, '/');
- *lastSlash = 0;
- realpath(tmpPath, iniPath);
- break;
- }
- token = strtok(nullptr, ":");
- }
- free (pathdup);
- if (!found)
- return 1;
- }
- lastSlash = iniPath + strlen(iniPath);
- *lastSlash = '/';
-#endif
-
-#ifndef XP_UNIX
- lastSlash = strrchr(iniPath, PATH_SEPARATOR_CHAR);
- if (!lastSlash)
- return 1;
-#endif
-
- *(++lastSlash) = '\0';
-
- // On Linux/Win, look for XULRunner in appdir/xulrunner
-
- snprintf(greDir, sizeof(greDir),
- "%sxulrunner" XPCOM_FILE_PATH_SEPARATOR XPCOM_DLL,
- iniPath);
-
- greFound = FolderExists(greDir);
-
-#ifdef XP_UNIX
- if (greFound) {
- char resolved_greDir[MAXPATHLEN] = "";
- if (realpath(greDir, resolved_greDir) && *resolved_greDir) {
- strncpy(greDir, resolved_greDir, MAXPATHLEN);
- }
- }
-#endif
-
- strncpy(lastSlash, "application.ini", sizeof(iniPath) - (lastSlash - iniPath));
-
-#endif
-
- // If -app parameter was passed in, it is now time to take it under
- // consideration.
- const char *appDataFile;
- appDataFile = getenv("XUL_APP_FILE");
- if (!appDataFile || !*appDataFile)
- if (argc > 1 && IsArg(argv[1], "app")) {
- if (argc == 2) {
- Output(false, "specify APP-FILE (optional)\n");
- return 1;
- }
- argv[1] = argv[0];
- ++argv;
- --argc;
-
- appDataFile = argv[1];
- argv[1] = argv[0];
- ++argv;
- --argc;
-
- char kAppEnv[MAXPATHLEN];
- snprintf(kAppEnv, MAXPATHLEN, "XUL_APP_FILE=%s", appDataFile);
- if (putenv(kAppEnv))
- Output(false, "Couldn't set %s.\n", kAppEnv);
-
- char *result = (char*) calloc(sizeof(char), MAXPATHLEN);
- if (NS_FAILED(GetRealPath(appDataFile, &result))) {
- Output(true, "Invalid application.ini path.\n");
- return 1;
- }
-
- // We have a valid application.ini path passed in to the -app parameter
- // but not yet a valid greDir, so lets look for it also on the same folder
- // as the stub.
- if (!greFound) {
- lastSlash = strrchr(iniPath, PATH_SEPARATOR_CHAR);
- if (!lastSlash)
- return 1;
-
- *(++lastSlash) = '\0';
-
- snprintf(greDir, sizeof(greDir), "%s" XPCOM_DLL, iniPath);
- greFound = FolderExists(greDir);
- }
-
- // copy it back.
- strcpy(iniPath, result);
- }
-
- nsINIParser parser;
- rv = parser.Init(iniPath);
- if (NS_FAILED(rv)) {
- fprintf(stderr, "Could not read application.ini\n");
- return 1;
- }
-
- if (!greFound) {
-#ifdef XP_MACOSX
- // The bundle can be found next to the executable, in the MacOS dir.
- CFURLRef exurl = CFBundleCopyExecutableURL(appBundle);
- CFURLRef absexurl = nullptr;
- if (exurl) {
- absexurl = CFURLCopyAbsoluteURL(exurl);
- CFRelease(exurl);
- }
-
- if (absexurl) {
- char tbuffer[MAXPATHLEN];
-
- if (CFURLGetFileSystemRepresentation(absexurl, true,
- (UInt8*) tbuffer,
- sizeof(tbuffer)) &&
- access(tbuffer, R_OK | X_OK) == 0) {
- if (realpath(tbuffer, greDir)) {
- greFound = true;
- }
- else {
- greDir[0] = '\0';
- }
- }
-
- CFRelease(absexurl);
- }
-#endif
- if (!greFound) {
- Output(false, "Could not find the Mozilla runtime.\n");
- return 1;
- }
- }
-
- rv = XPCOMGlueStartup(greDir);
- if (NS_FAILED(rv)) {
- if (rv == NS_ERROR_OUT_OF_MEMORY) {
- char applicationName[2000] = "this application";
- parser.GetString("App", "Name", applicationName, sizeof(applicationName));
- Output(true, "Not enough memory available to start %s.\n",
- applicationName);
- } else {
- Output(true, "Couldn't load XPCOM.\n");
- }
- return 1;
- }
-
- static const nsDynamicFunctionLoad kXULFuncs[] = {
- { "XRE_CreateAppData", (NSFuncPtr*) &XRE_CreateAppData },
- { "XRE_FreeAppData", (NSFuncPtr*) &XRE_FreeAppData },
- { "XRE_main", (NSFuncPtr*) &XRE_main },
- { nullptr, nullptr }
- };
-
- rv = XPCOMGlueLoadXULFunctions(kXULFuncs);
- if (NS_FAILED(rv)) {
- Output(true, "Couldn't load XRE functions.\n");
- return 1;
- }
-
- NS_LogInit();
-
- int retval;
-
- { // Scope COMPtr and AutoAppData
- nsCOMPtr<nsIFile> iniFile;
-#ifdef XP_WIN
- // On Windows iniPath is UTF-8 encoded so we need to convert it.
- rv = NS_NewLocalFile(NS_ConvertUTF8toUTF16(iniPath), false,
- getter_AddRefs(iniFile));
-#else
- rv = NS_NewNativeLocalFile(nsDependentCString(iniPath), false,
- getter_AddRefs(iniFile));
-#endif
- if (NS_FAILED(rv)) {
- Output(true, "Couldn't find application.ini file.\n");
- return 1;
- }
-
- AutoAppData appData(iniFile);
- if (!appData) {
- Output(true, "Error: couldn't parse application.ini.\n");
- return 1;
- }
-
- NS_ASSERTION(appData->directory, "Failed to get app directory.");
-
- if (!appData->xreDirectory) {
- // chop "libxul.so" off the GRE path
- lastSlash = strrchr(greDir, PATH_SEPARATOR_CHAR);
- if (lastSlash) {
- *lastSlash = '\0';
- }
-#ifdef XP_WIN
- // same as iniPath.
- NS_NewLocalFile(NS_ConvertUTF8toUTF16(greDir), false,
- &appData->xreDirectory);
-#else
- NS_NewNativeLocalFile(nsDependentCString(greDir), false,
- &appData->xreDirectory);
-#endif
- }
-
- retval = XRE_main(argc, argv, appData, 0);
- }
-
- NS_LogTerm();
-
- return retval;
-}