diff options
Diffstat (limited to 'indra/newview/llappviewermacosx.cpp')
-rw-r--r-- | indra/newview/llappviewermacosx.cpp | 332 |
1 files changed, 166 insertions, 166 deletions
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index c42c3b3daf..fcdcd3ab9b 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -5,29 +5,29 @@ * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - */ + */ #include "llviewerprecompiledheaders.h" #if !defined LL_DARWIN - #error "Use only with Mac OS X" + #error "Use only with Mac OS X" #endif #define LL_CARBON_CRASH_HANDLER 1 @@ -59,50 +59,50 @@ #include "lldir.h" #include "lldiriterator.h" #include <signal.h> -#include <CoreAudio/CoreAudio.h> // for systemwide mute -class LLMediaCtrl; // for LLURLDispatcher +#include <CoreAudio/CoreAudio.h> // for systemwide mute +class LLMediaCtrl; // for LLURLDispatcher -namespace +namespace { - // The command line args stored. - // They are not used immediately by the app. - int gArgC; - char** gArgV; - LLAppViewerMacOSX* gViewerAppPtr = NULL; + // The command line args stored. + // They are not used immediately by the app. + int gArgC; + char** gArgV; + LLAppViewerMacOSX* gViewerAppPtr = NULL; std::string gHandleSLURL; } void constructViewer() { - // Set the working dir to <bundle>/Contents/Resources - if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1) - { - LL_WARNS("InitOSX") << "Could not change directory to " - << gDirUtilp->getAppRODataDir() << ": " << strerror(errno) - << LL_ENDL; - } - - gViewerAppPtr = new LLAppViewerMacOSX(); + // Set the working dir to <bundle>/Contents/Resources + if (chdir(gDirUtilp->getAppRODataDir().c_str()) == -1) + { + LL_WARNS("InitOSX") << "Could not change directory to " + << gDirUtilp->getAppRODataDir() << ": " << strerror(errno) + << LL_ENDL; + } + + gViewerAppPtr = new LLAppViewerMacOSX(); } bool initViewer() { - bool ok = gViewerAppPtr->init(); - if(!ok) - { - LL_WARNS("InitOSX") << "Application init failed." << LL_ENDL; - } - else if (!gHandleSLURL.empty()) - { - dispatchUrl(gHandleSLURL); - gHandleSLURL = ""; - } - return ok; + bool ok = gViewerAppPtr->init(); + if(!ok) + { + LL_WARNS("InitOSX") << "Application init failed." << LL_ENDL; + } + else if (!gHandleSLURL.empty()) + { + dispatchUrl(gHandleSLURL); + gHandleSLURL = ""; + } + return ok; } void handleQuit() { - LLAppViewer::instance()->userQuit(); + LLAppViewer::instance()->userQuit(); } // This function is called pumpMainLoop() rather than runMainLoop() because @@ -112,27 +112,27 @@ void handleQuit() // (llappdelegate-objc.mm). bool pumpMainLoop() { - bool ret = LLApp::isQuitting(); - if (!ret && gViewerAppPtr != NULL) - { - ret = gViewerAppPtr->frame(); - } else { - ret = true; - } - - return ret; + bool ret = LLApp::isQuitting(); + if (!ret && gViewerAppPtr != NULL) + { + ret = gViewerAppPtr->frame(); + } else { + ret = true; + } + + return ret; } void cleanupViewer() { - if(!LLApp::isError()) - { + if(!LLApp::isError()) + { if (gViewerAppPtr) gViewerAppPtr->cleanup(); - } - - delete gViewerAppPtr; - gViewerAppPtr = NULL; + } + + delete gViewerAppPtr; + gViewerAppPtr = NULL; } void clearDumpLogsDir() @@ -197,7 +197,7 @@ CrashMetadataSingleton::CrashMetadataSingleton() LLStringUtil::replaceChar(agentFullname, '_', ' '); regionName = get_metadata(info, "CurrentRegion"); fatalMessage = get_metadata(info, "FatalMessage"); - + if (gDirUtilp->fileExists(gDirUtilp->getDumpLogsDirPath())) { LLDirIterator file_iter(gDirUtilp->getDumpLogsDirPath(), "*.log"); @@ -229,12 +229,12 @@ void infos(const std::string& message) LL_INFOS("InitOSX", "Bugsplat") << message << LL_ENDL; } -int main( int argc, char **argv ) +int main( int argc, char **argv ) { - // Store off the command line args for use later. - gArgC = argc; - gArgV = argv; - return createNSApp(argc, (const char**)argv); + // Store off the command line args for use later. + gArgC = argc; + gArgV = argv; + return createNSApp(argc, (const char**)argv); } LLAppViewerMacOSX::LLAppViewerMacOSX() @@ -261,54 +261,54 @@ void LLAppViewerMacOSX::forceErrorOSSpecificException() // look for this method to be added to the parser in parseAndStoreResults. std::pair<std::string, std::string> parse_psn(const std::string& s) { - if (s.find("-psn_") == 0) - { - // *FIX:Mani Not sure that the value makes sense. - // fix it once the actual -psn_XXX syntax is known. - return std::make_pair("psn", s.substr(5)); + if (s.find("-psn_") == 0) + { + // *FIX:Mani Not sure that the value makes sense. + // fix it once the actual -psn_XXX syntax is known. + return std::make_pair("psn", s.substr(5)); } - else - { + else + { return std::make_pair(std::string(), std::string()); } } bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp) { - // The next two lines add the support for parsing the mac -psn_XXX arg. - clp.addOptionDesc("psn", NULL, 1, "MacOSX process serial number"); - clp.setCustomParser(parse_psn); - - // parse the user's command line - if(clp.parseCommandLine(gArgC, gArgV) == false) - { - return false; - } - - // Get the user's preferred language string based on the Mac OS localization mechanism. - // To add a new localization: - // go to the "Resources" section of the project - // get info on "language.txt" - // in the "General" tab, click the "Add Localization" button - // create a new localization for the language you're adding - // set the contents of the new localization of the file to the string corresponding to our localization - // (i.e. "en", "ja", etc. Use the existing ones as a guide.) - CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL); - char path[MAX_PATH]; - if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path))) - { - std::string lang; - if(_read_file_into_string(lang, path)) /* Flawfinder: ignore*/ - { + // The next two lines add the support for parsing the mac -psn_XXX arg. + clp.addOptionDesc("psn", NULL, 1, "MacOSX process serial number"); + clp.setCustomParser(parse_psn); + + // parse the user's command line + if(clp.parseCommandLine(gArgC, gArgV) == false) + { + return false; + } + + // Get the user's preferred language string based on the Mac OS localization mechanism. + // To add a new localization: + // go to the "Resources" section of the project + // get info on "language.txt" + // in the "General" tab, click the "Add Localization" button + // create a new localization for the language you're adding + // set the contents of the new localization of the file to the string corresponding to our localization + // (i.e. "en", "ja", etc. Use the existing ones as a guide.) + CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL); + char path[MAX_PATH]; + if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path))) + { + std::string lang; + if(_read_file_into_string(lang, path)) /* Flawfinder: ignore*/ + { LLControlVariable* c = gSavedSettings.getControl("SystemLanguage"); if(c) { c->setValue(lang, false); } - } - } - CFRelease(url); - + } + } + CFRelease(url); + return true; } @@ -317,88 +317,88 @@ bool LLAppViewerMacOSX::initParseCommandLine(LLCommandLineParser& clp) extern void default_unix_signal_handler(int, siginfo_t *, void *); bool LLAppViewerMacOSX::restoreErrorTrap() { - // This method intends to reinstate signal handlers. - // *NOTE:Mani It was found that the first execution of a shader was overriding - // our initial signal handlers somehow. - // This method will be called (at least) once per mainloop execution. - // *NOTE:Mani The signals used below are copied over from the - // setup_signals() func in LLApp.cpp - // LLApp could use some way of overriding that func, but for this viewer - // fix I opt to avoid affecting the server code. - - // Set up signal handlers that may result in program termination - // - struct sigaction act; - struct sigaction old_act; - act.sa_sigaction = default_unix_signal_handler; - sigemptyset( &act.sa_mask ); - act.sa_flags = SA_SIGINFO; - - unsigned int reset_count = 0; - + // This method intends to reinstate signal handlers. + // *NOTE:Mani It was found that the first execution of a shader was overriding + // our initial signal handlers somehow. + // This method will be called (at least) once per mainloop execution. + // *NOTE:Mani The signals used below are copied over from the + // setup_signals() func in LLApp.cpp + // LLApp could use some way of overriding that func, but for this viewer + // fix I opt to avoid affecting the server code. + + // Set up signal handlers that may result in program termination + // + struct sigaction act; + struct sigaction old_act; + act.sa_sigaction = default_unix_signal_handler; + sigemptyset( &act.sa_mask ); + act.sa_flags = SA_SIGINFO; + + unsigned int reset_count = 0; + #define SET_SIG(SIGNAL) sigaction(SIGNAL, &act, &old_act); \ if(act.sa_sigaction != old_act.sa_sigaction) ++reset_count; - // Synchronous signals + // Synchronous signals # ifndef LL_BUGSPLAT - SET_SIG(SIGABRT) // let bugsplat catch this -# endif - SET_SIG(SIGALRM) - SET_SIG(SIGBUS) - SET_SIG(SIGFPE) - SET_SIG(SIGHUP) - SET_SIG(SIGILL) - SET_SIG(SIGPIPE) - SET_SIG(SIGSEGV) - SET_SIG(SIGSYS) - - SET_SIG(LL_HEARTBEAT_SIGNAL) - SET_SIG(LL_SMACKDOWN_SIGNAL) - - // Asynchronous signals that are normally ignored - SET_SIG(SIGCHLD) - SET_SIG(SIGUSR2) - - // Asynchronous signals that result in attempted graceful exit - SET_SIG(SIGHUP) - SET_SIG(SIGTERM) - SET_SIG(SIGINT) - - // Asynchronous signals that result in core - SET_SIG(SIGQUIT) + SET_SIG(SIGABRT) // let bugsplat catch this +# endif + SET_SIG(SIGALRM) + SET_SIG(SIGBUS) + SET_SIG(SIGFPE) + SET_SIG(SIGHUP) + SET_SIG(SIGILL) + SET_SIG(SIGPIPE) + SET_SIG(SIGSEGV) + SET_SIG(SIGSYS) + + SET_SIG(LL_HEARTBEAT_SIGNAL) + SET_SIG(LL_SMACKDOWN_SIGNAL) + + // Asynchronous signals that are normally ignored + SET_SIG(SIGCHLD) + SET_SIG(SIGUSR2) + + // Asynchronous signals that result in attempted graceful exit + SET_SIG(SIGHUP) + SET_SIG(SIGTERM) + SET_SIG(SIGINT) + + // Asynchronous signals that result in core + SET_SIG(SIGQUIT) #undef SET_SIG - - return reset_count == 0; + + return reset_count == 0; } std::string LLAppViewerMacOSX::generateSerialNumber() { - char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore - serial_md5[0] = 0; - - // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html - CFStringRef serialNumber = NULL; - io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, - IOServiceMatching("IOPlatformExpertDevice")); - if (platformExpert) + char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore + serial_md5[0] = 0; + + // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html + CFStringRef serialNumber = NULL; + io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, + IOServiceMatching("IOPlatformExpertDevice")); + if (platformExpert) + { + serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert, + CFSTR(kIOPlatformSerialNumberKey), + kCFAllocatorDefault, 0); + IOObjectRelease(platformExpert); + } + + if (serialNumber) { - serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert, - CFSTR(kIOPlatformSerialNumberKey), - kCFAllocatorDefault, 0); - IOObjectRelease(platformExpert); - } - - if (serialNumber) - { - char buffer[MAX_STRING]; // Flawfinder: ignore - if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII)) - { - LLMD5 md5( (unsigned char*)buffer ); - md5.hex_digest(serial_md5); - } - CFRelease(serialNumber); - } - - return serial_md5; + char buffer[MAX_STRING]; // Flawfinder: ignore + if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII)) + { + LLMD5 md5( (unsigned char*)buffer ); + md5.hex_digest(serial_md5); + } + CFRelease(serialNumber); + } + + return serial_md5; } void handleUrl(const char* url_utf8) @@ -426,7 +426,7 @@ void dispatchUrl(std::string url) { url.replace(0, prefix.length(), "secondlife:///app/"); } - + LLMediaCtrl* web = NULL; const bool trusted_browser = false; LLURLDispatcher::dispatch(url, "", web, trusted_browser); |