From 39503419163aff0cb1cd305de924f4edc68833b0 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 29 Apr 2021 17:37:26 +0300 Subject: SL-15177 Added LLTextureFetchTester to log texture fetching state timers --- indra/llcommon/llmetricperformancetester.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp index f8a93baf45..100eb57555 100644 --- a/indra/llcommon/llmetricperformancetester.cpp +++ b/indra/llcommon/llmetricperformancetester.cpp @@ -189,7 +189,6 @@ LLMetricPerformanceTesterBasic::~LLMetricPerformanceTesterBasic() void LLMetricPerformanceTesterBasic::preOutputTestResults(LLSD* sd) { incrementCurrentCount() ; - (*sd)[getCurrentLabelName()]["Name"] = mName ; } void LLMetricPerformanceTesterBasic::postOutputTestResults(LLSD* sd) -- cgit v1.3 From 0a745b47880fb16b1db8cd3327377a383dbfe6a8 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Tue, 8 Jun 2021 05:06:21 +0300 Subject: Revert "Merge branch 'DRTVWR-520-apple-notarization' into DRTVWR-540-maint" This reverts commit 681298dd726b2d00910fe71646147fadd1aba980, reversing changes made to 323f41f4892248762fc8505d8df17d70bd833cf3. --- autobuild.xml | 372 +- indra/CMakeLists.txt | 6 + indra/cmake/CEFPlugin.cmake | 4 +- indra/cmake/CMakeLists.txt | 2 + indra/cmake/Copy3rdPartyLibs.cmake | 12 +- indra/cmake/FindGoogleBreakpad.cmake | 40 + indra/cmake/GoogleBreakpad.cmake | 22 + indra/cmake/OpenSSL.cmake | 2 +- indra/llcommon/CMakeLists.txt | 3 + indra/llcommon/llapp.cpp | 243 +- indra/llcommon/llapp.h | 8 + indra/llcorehttp/CMakeLists.txt | 1 + indra/llcorehttp/httpcommon.cpp | 55 + indra/llmessage/llblowfishcipher.cpp | 28 +- indra/llplugin/llpluginprocessparent.cpp | 6 +- indra/mac_crash_logger/CMakeLists.txt | 95 + indra/mac_crash_logger/CrashReporter.nib | Bin 0 -> 32286 bytes indra/mac_crash_logger/CrashReporter.xib | 3895 ++++++++++++++++++++ indra/mac_crash_logger/Info.plist | 28 + indra/mac_crash_logger/llcrashloggermac.cpp | 91 + indra/mac_crash_logger/llcrashloggermac.h | 45 + indra/mac_crash_logger/llcrashloggermacdelegate.h | 52 + indra/mac_crash_logger/llcrashloggermacdelegate.mm | 75 + indra/mac_crash_logger/mac_crash_logger.cpp | 58 + indra/media_plugins/libvlc/media_plugin_libvlc.cpp | 5 - indra/newview/CMakeLists.txt | 72 +- indra/newview/generate_breakpad_symbols.py | 166 + indra/newview/installers/darwin/apple-notarize.sh | 44 - indra/newview/llappviewer.cpp | 2 +- indra/newview/llappviewer.h | 1 + indra/newview/llappviewermacosx.cpp | 27 +- indra/newview/llappviewermacosx.h | 1 + indra/newview/llappviewerwin32.cpp | 54 + indra/newview/llappviewerwin32.h | 1 + indra/newview/llsecapi.h | 2 +- indra/newview/llsechandler_basic.cpp | 48 +- indra/newview/llsechandler_basic.h | 4 +- indra/newview/tests/llsecapi_test.cpp | 2 +- indra/newview/tests/llsechandler_basic_test.cpp | 32 +- indra/newview/viewer_manifest.py | 60 +- indra/win_crash_logger/CMakeLists.txt | 105 + indra/win_crash_logger/StdAfx.cpp | 34 + indra/win_crash_logger/StdAfx.h | 56 + indra/win_crash_logger/ll_icon.ico | Bin 0 -> 2238 bytes indra/win_crash_logger/llcrashloggerwindows.cpp | 536 +++ indra/win_crash_logger/llcrashloggerwindows.h | 86 + indra/win_crash_logger/resource.h | 63 + indra/win_crash_logger/win_crash_logger.cpp | 70 + indra/win_crash_logger/win_crash_logger.h | 38 + indra/win_crash_logger/win_crash_logger.ico | Bin 0 -> 1078 bytes indra/win_crash_logger/win_crash_logger.rc | 188 + 51 files changed, 6525 insertions(+), 315 deletions(-) create mode 100644 indra/cmake/FindGoogleBreakpad.cmake create mode 100644 indra/cmake/GoogleBreakpad.cmake create mode 100644 indra/mac_crash_logger/CMakeLists.txt create mode 100755 indra/mac_crash_logger/CrashReporter.nib create mode 100755 indra/mac_crash_logger/CrashReporter.xib create mode 100644 indra/mac_crash_logger/Info.plist create mode 100644 indra/mac_crash_logger/llcrashloggermac.cpp create mode 100644 indra/mac_crash_logger/llcrashloggermac.h create mode 100644 indra/mac_crash_logger/llcrashloggermacdelegate.h create mode 100644 indra/mac_crash_logger/llcrashloggermacdelegate.mm create mode 100644 indra/mac_crash_logger/mac_crash_logger.cpp create mode 100755 indra/newview/generate_breakpad_symbols.py delete mode 100755 indra/newview/installers/darwin/apple-notarize.sh create mode 100644 indra/win_crash_logger/CMakeLists.txt create mode 100644 indra/win_crash_logger/StdAfx.cpp create mode 100644 indra/win_crash_logger/StdAfx.h create mode 100644 indra/win_crash_logger/ll_icon.ico create mode 100644 indra/win_crash_logger/llcrashloggerwindows.cpp create mode 100644 indra/win_crash_logger/llcrashloggerwindows.h create mode 100644 indra/win_crash_logger/resource.h create mode 100644 indra/win_crash_logger/win_crash_logger.cpp create mode 100644 indra/win_crash_logger/win_crash_logger.h create mode 100644 indra/win_crash_logger/win_crash_logger.ico create mode 100755 indra/win_crash_logger/win_crash_logger.rc (limited to 'indra/llcommon') diff --git a/autobuild.xml b/autobuild.xml index fc7226c346..2470b2e5aa 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -76,9 +76,9 @@ archive hash - b6357ef3a0ec37877a5831820f25094e + 9b8bcc3be6dbe40a04c9c81c313f70dc url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80557/759704/apr_suite-1.4.5.558565-darwin64-558565.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2 name darwin64 @@ -112,9 +112,9 @@ archive hash - cb48ac069440f6dcd564cfa9fd02a4c2 + 6bdf460c18ee004b41a46afc80041a92 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80556/759710/apr_suite-1.4.5.558565-windows-558565.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2 name windows @@ -124,16 +124,16 @@ archive hash - 646dc3828d9c39fb1e77c4eec44ed739 + 83104bfa4dabb77cd70d185e38a95b49 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80555/759709/apr_suite-1.4.5.558565-windows64-558565.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2 name windows64 version - 1.4.5.558565 + 1.4.5.548882 boost @@ -166,9 +166,9 @@ archive hash - 35cc090d942b85c9126ceac9912d52d6 + 3cc73623c9a976b4f8346a3837f7a916 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78585/744021/boost-1.72-darwin64-557045.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64088/601256/boost-1.72-darwin64-545361.tar.bz2 name darwin64 @@ -202,9 +202,9 @@ archive hash - 9aa4ce32df5f5e36124c990e2d77b885 + 7d4b2511976449e9a4ec7be41dc8310f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78586/743982/boost-1.72-windows-557045.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64092/601270/boost-1.72-windows-545361.tar.bz2 name windows @@ -214,9 +214,9 @@ archive hash - a79511c9d8b956767ebaa405155d4238 + 4ad8df0700745201cddf6b71d7b0949f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78584/743961/boost-1.72-windows64-557045.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64091/601265/boost-1.72-windows64-545361.tar.bz2 name windows64 @@ -308,9 +308,9 @@ archive hash - 1d063cf1783e7788f17486c234adb1db + 02e6a8207dcdaf243dcb6da19b8c3534 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78635/744249/colladadom-2.3.557064-darwin64-557064.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64099/601302/colladadom-2.3.545362-darwin64-545362.tar.bz2 name darwin64 @@ -344,9 +344,9 @@ archive hash - e78ecf919eee01567556787c3a358d15 + 8a02a10fc69c8f504dc5335644db184a url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78637/744269/colladadom-2.3.557064-windows-557064.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64104/601313/colladadom-2.3.545362-windows-545362.tar.bz2 name windows @@ -356,16 +356,16 @@ archive hash - 7e63a212c8909a25236138422fe01298 + 742180324fca7ab92b6a61a36aab4f9d url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78636/744273/colladadom-2.3.557064-windows64-557064.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64103/601314/colladadom-2.3.545362-windows64-545362.tar.bz2 name windows64 version - 2.3.557064 + 2.3.545362 curl @@ -398,9 +398,9 @@ archive hash - 13f74f43a6363ec998569f731fd869c5 + f5ae57117a6518d11f49ccfbfbe0969d url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82637/774617/curl-7.54.1.560191-darwin64-560191.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64131/601402/curl-7.54.1.545369-darwin64-545369.tar.bz2 name darwin64 @@ -434,11 +434,11 @@ archive hash - 0df99bd685dc3561ca8ea347b2921987 + 2796ae7b09e730a55ac03f74ed669520 hash_algorithm md5 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82639/774610/curl-7.54.1.560191-windows-560191.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64130/601396/curl-7.54.1.545369-windows-545369.tar.bz2 name windows @@ -448,16 +448,16 @@ archive hash - 50db2a9e6b74ec4b0c38b1ea8f135735 + a8f96e5cdb8128b23d49ff4c3f2233a4 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82638/774608/curl-7.54.1.560191-windows64-560191.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64129/601382/curl-7.54.1.545369-windows64-545369.tar.bz2 name windows64 version - 7.54.1.560191 + 7.54.1.545369 db @@ -580,9 +580,9 @@ archive hash - 77d2bc0c26c5047ac9f8126f8fa5aa0f + 856ba0e5b7be4bf683cf2849bce845e0 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80680/760744/dullahan-1.7.0.202104220619_81.3.10_gb223419_chromium-81.0.4044.138-darwin64-558653.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72458/699860/dullahan-1.7.0.202011160759_81.3.10_gb223419_chromium-81.0.4044.138-darwin64-552313.tar.bz2 name darwin64 @@ -592,9 +592,9 @@ archive hash - 6a110e6b902617bab404b259110824bc + 515950c911a53ff910b18c7c417ea984 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80683/760762/dullahan-1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138-windows-558653.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72460/699870/dullahan-1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138-windows-552313.tar.bz2 name windows @@ -604,16 +604,16 @@ archive hash - 3826abcf9dd5a2b137aa69f4a2a881d1 + f1dccbdfe0603f488eeee4c8f518c959 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80684/760763/dullahan-1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138-windows64-558653.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72459/699874/dullahan-1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138-windows64-552313.tar.bz2 name windows64 version - 1.7.0.202104220629_81.3.10_gb223419_chromium-81.0.4044.138 + 1.7.0.202011161603_81.3.10_gb223419_chromium-81.0.4044.138 elfio @@ -670,9 +670,9 @@ archive hash - f4e80e0dfcab713a3da90cd8f7f23e7b + 3656b7f7b655cb267fd94f089d2e145c url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76341/727265/expat-2.1.1.555519-darwin64-555519.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54860/510198/expat-2.1.1.538990-darwin64-538990.tar.bz2 name darwin64 @@ -706,9 +706,9 @@ archive hash - cd4fe03473076c324d80ae3bd91a85bb + c509f8afa1e02f4c16232cce7f6855f8 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76343/727273/expat-2.1.1.555519-windows-555519.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55056/512080/expat-2.1.1.538990-windows-538990.tar.bz2 name windows @@ -718,16 +718,16 @@ archive hash - d2d74d73b914150982b1883a3b96e60b + aba97cfdf44c04dbfcac89c7cb472580 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76344/727279/expat-2.1.1.555519-windows64-555519.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55054/512068/expat-2.1.1.538990-windows64-538990.tar.bz2 name windows64 version - 2.1.1.555519 + 2.1.1.538990 fmodstudio @@ -748,9 +748,9 @@ archive hash - d5528538e67c710387ae0c061a90cb23 + 89c37441a806ed80c0102d380eec6fd0 url - https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76868/730756/fmodstudio-2.01.07.555883-darwin64-555883.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65400/612632/fmodstudio-2.00.11.546392-darwin64-546392.tar.bz2 name darwin64 @@ -784,9 +784,9 @@ archive hash - a2bb6eaf51f933993b26a5fe7503a761 + 0f44323b0d03b7d0d8a17eec83e103ce url - https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76869/730763/fmodstudio-2.01.07.555883-windows-555883.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65401/612647/fmodstudio-2.00.11.546392-windows-546392.tar.bz2 name windows @@ -796,16 +796,16 @@ archive hash - 138d07dd516a9ad5b9787192fe6134dd + 462d28eacf731a5d36ab031e7071c32a url - https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76867/730751/fmodstudio-2.01.07.555883-windows64-555883.tar.bz2 + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65402/612648/fmodstudio-2.00.11.546392-windows64-546392.tar.bz2 name windows64 version - 2.01.07.555883 + 2.00.11.546392 fontconfig @@ -880,9 +880,9 @@ archive hash - 3a478d6c8a10d49d9161ef864394b03c + 81a2e9aca3e33c4eecf0081854540b07 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78592/744013/freetype-2.4.4.557047-darwin64-557047.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56309/526711/freetype-2.4.4.539865-darwin64-539865.tar.bz2 name darwin64 @@ -916,9 +916,9 @@ archive hash - 7ee200d6b5fa282c7f973ade5615aa86 + 1d1c7b60f71a5152ced60bee87f5bba8 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78594/744011/freetype-2.4.4.557047-windows-557047.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56312/526734/freetype-2.4.4.539865-windows-539865.tar.bz2 name windows @@ -928,16 +928,16 @@ archive hash - 69307aaba16ac71531c9c4d930ace993 + 53e78d4a607e959637e98a82a3cf5bea url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78593/744010/freetype-2.4.4.557047-windows64-557047.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56310/526723/freetype-2.4.4.539865-windows64-539865.tar.bz2 name windows64 version - 2.4.4.557047 + 2.4.4.539865 glext @@ -1078,9 +1078,9 @@ archive hash - a9eaa005ff9d387f946283fbcb69b3c8 + 343913fe1434da228c2210c23d2e3a1a url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76353/727324/glod-1.0pre3.555522-darwin64-555522.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54850/510134/glod-1.0pre3.538980-darwin64-538980.tar.bz2 name darwin64 @@ -1139,7 +1139,97 @@ version - 1.0pre3.555522 + 1.0pre3.538980 + + google_breakpad + + copyright + Copyright (c) 2006, Google Inc. + description + Breakpad is a crossplatform library for capturing crash callstacks and runtime data. + license + bsd + license_file + LICENSES/google_breakpad.txt + name + google_breakpad + platforms + + darwin + + archive + + hash + 171b39db6d0702535b41fad5b476e39d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Darwin/installer/google_breakpad-1413.298033-darwin-298033.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + ca33f234aae399b9e704e262f7e15d35 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56338/526869/google_breakpad-1413.539880-darwin64-539880.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 352e673897e8f36f8470150b8ace6ce9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-google-breakpad/rev/314225/arch/Linux/installer/google_breakpad-1413.314225-linux-314225.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 6bddcc1ac470dd5eab459220102df9e9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1835/4114/google_breakpad-1413.501824-linux64-501824.tar.bz2 + + name + linux64 + + windows + + archive + + hash + bfee0438617f57f02f7e8515a801cb20 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56359/526982/google_breakpad-1413.539880-windows-539880.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 6f983e754bb3046f065806b510b408c5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56358/526975/google_breakpad-1413.539880-windows64-539880.tar.bz2 + + name + windows64 + + + version + 1413.539880 googlemock @@ -1172,9 +1262,9 @@ archive hash - 19e925604bc1a91efb4b130e1edd8bf2 + f9831360ced94943ab9dfb3fbf5256d3 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78620/744140/googlemock-1.7.0.557057-darwin64-557057.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64101/601290/googlemock-1.7.0.545363-darwin64-545363.tar.bz2 name darwin64 @@ -1208,9 +1298,9 @@ archive hash - eed7b41d0d1f41b24f315349ef78c728 + 8149e46b4f7abb3ac284415cfe1366e1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78622/744148/googlemock-1.7.0.557057-windows-557057.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64102/601296/googlemock-1.7.0.545363-windows-545363.tar.bz2 name windows @@ -1220,16 +1310,16 @@ archive hash - a6ad6fe722d2fe4e8137495af3f374c9 + f3851eba809ead2810d702041569d36d url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78621/744152/googlemock-1.7.0.557057-windows64-557057.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64100/601284/googlemock-1.7.0.545363-windows64-545363.tar.bz2 name windows64 version - 1.7.0.557057 + 1.7.0.545363 gstreamer @@ -1702,9 +1792,9 @@ archive hash - 2021ea3a19b81c82993e733709683303 + c327e6d6573fc0a808677de47f08acd9 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76371/727419/libhunspell-1.3.2.555528-darwin64-555528.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54844/510092/libhunspell-1.3.2.538974-darwin64-538974.tar.bz2 name darwin64 @@ -1738,9 +1828,9 @@ archive hash - 2253ec09136cc7c208481030d78d9dd7 + ec22ec25160bcfd2a74f1c7bc8ff6133 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76369/727412/libhunspell-1.3.2.555528-windows-555528.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54986/511824/libhunspell-1.3.2.538974-windows-538974.tar.bz2 name windows @@ -1750,16 +1840,16 @@ archive hash - 858d1708f6b3a74738a3d57a5387e20f + f470c6f3f7b0559e95e76467b808de10 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76370/727413/libhunspell-1.3.2.555528-windows64-555528.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54985/511817/libhunspell-1.3.2.538974-windows64-538974.tar.bz2 name windows64 version - 1.3.2.555528 + 1.3.2.538974 libndofdev @@ -1792,9 +1882,9 @@ archive hash - a487fff84208a45844602c4a1f68c974 + bf765dfe0b928ef3c531cd9618fee89b url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76356/727333/libndofdev-0.1.555523-darwin64-555523.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54843/510085/libndofdev-0.1.538973-darwin64-538973.tar.bz2 name darwin64 @@ -1804,9 +1894,9 @@ archive hash - 4c839555bf0ed9ae60ffc3f8a7c96f9b + 8abb7d216535009f6c0a7e43b0734b1e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76354/727340/libndofdev-0.1.555523-windows-555523.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54984/511810/libndofdev-0.1.538973-windows-538973.tar.bz2 name windows @@ -1816,16 +1906,16 @@ archive hash - cbc033ae3b034b992b59f6de1034247c + 9da7aed5a914174dcb2be12ecd4a656f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76355/727341/libndofdev-0.1.555523-windows64-555523.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54983/511803/libndofdev-0.1.538973-windows64-538973.tar.bz2 name windows64 version - 0.1.555523 + 0.1.538973 libpng @@ -1858,9 +1948,9 @@ archive hash - 2a41acc3116ce19a443873216cb882ad + 0932b19bb6a8e2641706afd13d92951d url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78587/743948/libpng-1.6.8.557046-darwin64-557046.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56313/526740/libpng-1.6.8.539868-darwin64-539868.tar.bz2 name darwin64 @@ -1894,9 +1984,9 @@ archive hash - b935b440947f63c69700bdcf5095a8e1 + f498782698428888113b64a7505c8f7f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78591/743970/libpng-1.6.8.557046-windows-557046.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56319/526770/libpng-1.6.8.539868-windows-539868.tar.bz2 name windows @@ -1906,16 +1996,16 @@ archive hash - d1cc8354ac4e877eefedf16b1be3aac6 + f8ac4f690a2925418866bccf6eba3cf4 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78589/743991/libpng-1.6.8.557046-windows64-557046.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56317/526762/libpng-1.6.8.539868-windows64-539868.tar.bz2 name windows64 version - 1.6.8.557046 + 1.6.8.539868 libuuid @@ -1990,9 +2080,9 @@ archive hash - 6677173bbbb0ea32369b5e9b6c9aa641 + 0706b9c3889d767af9f5105d9ffa9b51 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78631/744225/libxml2-2.9.4.557062-darwin64-557062.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56327/526819/libxml2-2.9.4.539866-darwin64-539866.tar.bz2 name darwin64 @@ -2026,9 +2116,9 @@ archive hash - ad6a596fbf0e83a21d95762da78437bc + 1b7b979a8387fbb0f278dc681558b9ef url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78633/744239/libxml2-2.9.4.557062-windows-557062.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56316/526755/libxml2-2.9.4.539866-windows-539866.tar.bz2 name windows @@ -2038,16 +2128,16 @@ archive hash - 6b5bb230684ecf28386d7c91c47bb6e1 + 4f8ff97d6a9ab350306b62eec8adc810 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78634/744240/libxml2-2.9.4.557062-windows64-557062.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56314/526748/libxml2-2.9.4.539866-windows64-539866.tar.bz2 name windows64 version - 2.9.4.557062 + 2.9.4.539866 llappearance_utility @@ -2324,9 +2414,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - e4f784d8a035c51921a1562ca7a1bab6 + 937ce1a2158c0cfff37f5989f5b24aba url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76357/727350/nghttp2-1.40.0.555524-darwin64-555524.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64066/601156/nghttp2-1.40.0.545354-darwin64-545354.tar.bz2 name darwin64 @@ -2360,9 +2450,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - af05aa2994c9845308fecd094b7b2d25 + 138b881bdf37dff4e626e022a50dd11f url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76359/727360/nghttp2-1.40.0.555524-windows-555524.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64069/601181/nghttp2-1.40.0.545354-windows-545354.tar.bz2 name windows @@ -2372,9 +2462,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 5a55cede40eef16b9d1e47c418a2b77a + c23c6480c7cbea60a2bd26e257adc0a7 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76358/727359/nghttp2-1.40.0.555524-windows64-555524.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64068/601177/nghttp2-1.40.0.545354-windows64-545354.tar.bz2 name windows64 @@ -2383,7 +2473,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors source_type hg version - 1.40.0.555524 + 1.40.0.545354 nvapi @@ -2738,9 +2828,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 5503e4928bcdb0a29685b3242c4a409b + 18aef0c8fc471b6539addbdc019aea25 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82619/774464/openssl-1.1.1l.560177-darwin64-560177.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56325/526804/openssl-1.0.2l.539874-darwin64-539874.tar.bz2 name darwin64 @@ -2774,9 +2864,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - d2153f20dc2d35c609b876a9f019a748 + 2b2f61313b1cbd2893c1ba5bf15061fa url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82623/774521/openssl-1.1.1l.560177-windows-560177.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56328/526826/openssl-1.0.2l.539874-windows-539874.tar.bz2 name windows @@ -2786,16 +2876,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - f40b8622ba38084b0962e273988d748f + 59aae854155bc7119e0dca25e65828c0 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82624/774520/openssl-1.1.1l.560177-windows64-560177.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56326/526811/openssl-1.0.2l.539874-windows64-539874.tar.bz2 name windows64 version - 1.1.1l.560177 + 1.0.2l.539874 pcre @@ -2918,9 +3008,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 6ce3cbaed968a69fb7a2cca80220874d + 321a8542e7b693fbe8e44ebface06087 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55966/524403/slvoice-4.10.0000.32327.5fc3fe7c.539691-darwin64-539691.tar.bz2 name darwin64 @@ -2954,9 +3044,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 2eb38c5eff4d0f18fbb89d0c30c4f0a4 + fb1a57a1cf5e38a3d51b32307b93ffba url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55968/524423/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows-539691.tar.bz2 name windows @@ -2966,16 +3056,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 9ee8f3cbc5369c598a998c61961ed16d + 81df970eb0c97d415d7bd12049c82042 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55967/524409/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows64-539691.tar.bz2 name windows64 version - 4.10.0000.32327.5fc3fe7c.558436 + 4.10.0000.32327.5fc3fe7c.539691 tut @@ -3038,9 +3128,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - c42575ac8997de979eadb082c33a578e + 60f008c5fd31641ad4e61ac751ce15d1 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81322/765512/uriparser-0.9.4-darwin64-559132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75748/723495/uriparser-0.9.4-darwin64-555117.tar.bz2 name darwin64 @@ -3074,9 +3164,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 901b1063556fc6b2575e745eef2bf744 + 00aff37a6f5e1fe08456702d28706cf6 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81323/765528/uriparser-0.9.4-windows-559132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75751/723507/uriparser-0.9.4-windows-555117.tar.bz2 name windows @@ -3086,9 +3176,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 962c01d553f286c430102998129fb0d6 + ff27a91f3941c7bef5e1613a064cb048 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81324/765527/uriparser-0.9.4-windows64-559132.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75750/723506/uriparser-0.9.4-windows64-555117.tar.bz2 name windows64 @@ -3172,9 +3262,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - b639d0035f4a8c9b4973be428a1b7e61 + 5e553a4358203f283c74744aed2fcd8c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69569/671323/vlc_bin-3.0.9.549888-darwin64-549888.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54836/510036/vlc_bin-2.2.8.538966-darwin64-538966.tar.bz2 name darwin64 @@ -3196,9 +3286,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 4f50b0c47daa081dd4fcb83763d5b0b2 + ca84b7c5f86e702fb35727eed8f0c8c4 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69567/671314/vlc_bin-3.0.9.549888-windows-549888.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54958/511725/vlc_bin-2.2.8.538966-windows-538966.tar.bz2 name windows @@ -3208,16 +3298,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - c2f8c01fb6c261b72beb07f0c4cd423f + 93cd88d90cb8aedbed5cd90ff9262409 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69568/671315/vlc_bin-3.0.9.549888-windows64-549888.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54954/511718/vlc_bin-2.2.8.538966-windows64-538966.tar.bz2 name windows64 version - 3.0.9.549888 + 2.2.8.538966 xmlrpc-epi @@ -3250,9 +3340,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 922a0dea32266897ed1911200438e1e1 + 99ea1808ee9f5b55029daa9fdef86776 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76372/727426/xmlrpc_epi-0.54.1.555529-darwin64-555529.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55063/512104/xmlrpc_epi-0.54.1.539072-darwin64-539072.tar.bz2 name darwin64 @@ -3286,9 +3376,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 34b847e6b280048465fe7c6ce67fe05c + 94643b7cebb449f049fa9e32ae682bcd url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76374/727436/xmlrpc_epi-0.54.1.555529-windows-555529.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55138/512288/xmlrpc_epi-0.54.1.539072-windows-539072.tar.bz2 name windows @@ -3298,16 +3388,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8fbe7c4ea22bb7f23a93c73884ebb34c + c409de1974a879291ce7daaf52348d85 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76373/727435/xmlrpc_epi-0.54.1.555529-windows64-555529.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55137/512279/xmlrpc_epi-0.54.1.539072-windows64-539072.tar.bz2 name windows64 version - 0.54.1.555529 + 0.54.1.539072 zlib @@ -3340,9 +3430,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 9181bc8229f1a8e480d2a40a2744ec28 + 9785bda5b4d3b41bf391b33d0da78c9e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78578/743913/zlib-1.2.11.557041-darwin64-557041.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54858/510190/zlib-1.2.8.538988-darwin64-538988.tar.bz2 name darwin64 @@ -3378,9 +3468,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 8308cbd2ea0fe290541698b0f63482e2 + ebdb07d4aaa5312005a8773f625032a4 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78579/743926/zlib-1.2.11.557041-windows-557041.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55048/512031/zlib-1.2.8.538988-windows-538988.tar.bz2 name windows @@ -3390,16 +3480,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 36bdc34f67d3ad3c57125dc1b16a3129 + 0ac95f3dece7d575ba45cf5728f53eea url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78577/743920/zlib-1.2.11.557041-windows64-557041.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55047/512024/zlib-1.2.8.538988-windows64-538988.tar.bz2 name windows64 version - 1.2.11.557041 + 1.2.8.538988 package_description diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index eb205ccb11..53e5d7b6a5 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -70,11 +70,17 @@ if (LINUX) add_subdirectory(${LLAPPEARANCEUTILITY_SRC_DIR} ${LLAPPEARANCEUTILITY_BIN_DIR}) endif (INSTALL_PROPRIETARY) add_dependencies(viewer linux-crash-logger-strip-target) +elseif (DARWIN) + add_subdirectory(${VIEWER_PREFIX}mac_crash_logger) + add_dependencies(viewer mac-crash-logger) elseif (WINDOWS) + add_subdirectory(${VIEWER_PREFIX}win_crash_logger) # cmake EXISTS requires an absolute path, see indra/cmake/Variables.cmake if (EXISTS ${VIEWER_DIR}win_setup) add_subdirectory(${VIEWER_DIR}win_setup) endif (EXISTS ${VIEWER_DIR}win_setup) + # add_dependencies(viewer windows-setup windows-crash-logger) + add_dependencies(viewer windows-crash-logger) endif (LINUX) add_subdirectory(${VIEWER_PREFIX}newview) diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index 7d8bfb1b0f..b8e569d3a8 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -24,7 +24,7 @@ elseif (DARWIN) message(FATAL_ERROR "AppKit not found") endif() - set(CEF_LIBRARY "'${ARCH_PREBUILT_DIRS_RELEASE}/Chromium\ Embedded\ Framework.framework'") + FIND_LIBRARY(CEF_LIBRARY "Chromium Embedded Framework" ${ARCH_PREBUILT_DIRS_RELEASE}) if (NOT CEF_LIBRARY) message(FATAL_ERROR "CEF not found") endif() @@ -33,7 +33,7 @@ elseif (DARWIN) ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a ${APPKIT_LIBRARY} - "-F ${CEF_LIBRARY}" + ${CEF_LIBRARY} ) elseif (LINUX) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index cca305c741..a17e37cd32 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -28,6 +28,7 @@ set(cmake_SOURCE_FILES FindAutobuild.cmake FindBerkeleyDB.cmake FindGLH.cmake + FindGoogleBreakpad.cmake FindHUNSPELL.cmake FindJsonCpp.cmake FindNDOF.cmake @@ -42,6 +43,7 @@ set(cmake_SOURCE_FILES GLH.cmake GLOD.cmake ## GStreamer010Plugin.cmake + GoogleBreakpad.cmake GoogleMock.cmake Havok.cmake Hunspell.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 848547f2a2..de81512eef 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -56,21 +56,14 @@ if(WINDOWS) libapr-1.dll libaprutil-1.dll libapriconv-1.dll + ssleay32.dll + libeay32.dll nghttp2.dll glod.dll libhunspell.dll uriparser.dll ) - # OpenSSL - if(ADDRESS_SIZE EQUAL 64) - set(release_files ${release_files} libcrypto-1_1-x64.dll) - set(release_files ${release_files} libssl-1_1-x64.dll) - else(ADDRESS_SIZE EQUAL 64) - set(release_files ${release_files} libcrypto-1_1.dll) - set(release_files ${release_files} libssl-1_1.dll) - endif(ADDRESS_SIZE EQUAL 64) - # Filenames are different for 32/64 bit BugSplat file and we don't # have any control over them so need to branch. if (BUGSPLAT_DB) @@ -165,6 +158,7 @@ elseif(DARWIN) libapr-1.dylib libaprutil-1.0.dylib libaprutil-1.dylib + libexception_handler.dylib ${EXPAT_COPY} libGLOD.dylib libhunspell-1.3.0.dylib diff --git a/indra/cmake/FindGoogleBreakpad.cmake b/indra/cmake/FindGoogleBreakpad.cmake new file mode 100644 index 0000000000..1a0493be5e --- /dev/null +++ b/indra/cmake/FindGoogleBreakpad.cmake @@ -0,0 +1,40 @@ +# -*- cmake -*- + +# - Find Google BreakPad +# Find the Google BreakPad includes and library +# This module defines +# BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR, where to find exception_handler.h, etc. +# BREAKPAD_EXCEPTION_HANDLER_LIBRARIES, the libraries needed to use Google BreakPad. +# BREAKPAD_EXCEPTION_HANDLER_FOUND, If false, do not try to use Google BreakPad. +# also defined, but not for general use are +# BREAKPAD_EXCEPTION_HANDLER_LIBRARY, where to find the Google BreakPad library. + +FIND_PATH(BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR google_breakpad/exception_handler.h) + +SET(BREAKPAD_EXCEPTION_HANDLER_NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} breakpad_client) +FIND_LIBRARY(BREAKPAD_EXCEPTION_HANDLER_LIBRARY + NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} + ) + +IF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + SET(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES ${BREAKPAD_EXCEPTION_HANDLER_LIBRARY}) + SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "YES") +ELSE (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "NO") +ENDIF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + + +IF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + IF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) + MESSAGE(STATUS "Found Google BreakPad: ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}") + ENDIF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +ELSE (BREAKPAD_EXCEPTION_HANDLER_FOUND) + IF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Google BreakPad library") + ENDIF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +ENDIF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + +MARK_AS_ADVANCED( + BREAKPAD_EXCEPTION_HANDLER_LIBRARY + BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR + ) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake new file mode 100644 index 0000000000..829e1ac08a --- /dev/null +++ b/indra/cmake/GoogleBreakpad.cmake @@ -0,0 +1,22 @@ +# -*- cmake -*- +include(Prebuilt) + +if (USESYSTEMLIBS) + set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON) + include(FindGoogleBreakpad) +else (USESYSTEMLIBS) + use_prebuilt_binary(google_breakpad) + if (DARWIN) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler) + endif (DARWIN) + if (LINUX) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client) + endif (LINUX) + if (WINDOWS) + set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client crash_generation_server common) + endif (WINDOWS) + # yes, this does look dumb, no, it's not incorrect + # + set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad") +endif (USESYSTEMLIBS) + diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index 32400f5e4e..eb548bdcc1 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -9,7 +9,7 @@ if (USESYSTEMLIBS) else (USESYSTEMLIBS) use_prebuilt_binary(openssl) if (WINDOWS) - set(OPENSSL_LIBRARIES libssl libcrypto) + set(OPENSSL_LIBRARIES ssleay32 libeay32) else (WINDOWS) set(OPENSSL_LIBRARIES ssl crypto) endif (WINDOWS) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index b16fedfc3e..cecfadcd91 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -8,6 +8,7 @@ include(Linking) include(Boost) include(LLSharedLibs) include(JsonCpp) +include(GoogleBreakpad) include(Copy3rdPartyLibs) include(ZLIB) include(URIPARSER) @@ -17,6 +18,7 @@ include_directories( ${LLCOMMON_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} + ${BREAKPAD_INCLUDE_DIRECTORIES} ${URIPARSER_INCLUDE_DIRS} ) @@ -285,6 +287,7 @@ endif(LLCOMMON_LINK_SHARED) target_link_libraries( llcommon + ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} ${APRUTIL_LIBRARIES} ${APR_LIBRARIES} ${EXPAT_LIBRARIES} diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 72dd0ea048..a90b294550 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -46,6 +46,7 @@ #include "llstl.h" // for DeletePointer() #include "llstring.h" #include "lleventtimer.h" +#include "google_breakpad/exception_handler.h" #include "stringize.h" #include "llcleanup.h" #include "llevents.h" @@ -61,6 +62,12 @@ LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); +bool windows_post_minidump_callback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded); #else # include # include // for fork() @@ -139,6 +146,8 @@ void LLApp::commonCtor() // Set the application to this instance. sApplication = this; + + mExceptionHandler = 0; // initialize the buffer to write the minidump filename to // (this is used to avoid allocating memory in the crash handler) @@ -168,6 +177,8 @@ LLApp::~LLApp() delete mThreadErrorp; mThreadErrorp = NULL; } + + if(mExceptionHandler != 0) delete mExceptionHandler; SUBSYSTEM_CLEANUP_DBG(LLCommon); } @@ -383,18 +394,139 @@ void LLApp::setupErrorHandling(bool second_instance) #if LL_WINDOWS +#if LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT) + EnableCrashingOnCrashes(); + + // This sets a callback to handle w32 signals to the console window. + // The viewer shouldn't be affected, sicne its a windowed app. + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); + + // Install the Google Breakpad crash handler for Windows + if(mExceptionHandler == 0) + { + if ( second_instance ) //BUG-5707 Firing teleport from a web browser causes second + { + mExceptionHandler = new google_breakpad::ExceptionHandler( + L"C:\\Temp\\", + 0, //No filter + windows_post_minidump_callback, + 0, + google_breakpad::ExceptionHandler::HANDLER_ALL); //No custom client info. + } + else + { + LL_WARNS() << "adding breakpad exception handler" << LL_ENDL; + + std::wstring wpipe_name; + wpipe_name = mCrashReportPipeStr + wstringize(getPid()); + + const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath)); + + int retries = 30; + for (; retries > 0; --retries) + { + if (mExceptionHandler != 0) delete mExceptionHandler; + + mExceptionHandler = new google_breakpad::ExceptionHandler( + wdump_path, + NULL, //No filter + windows_post_minidump_callback, + 0, + google_breakpad::ExceptionHandler::HANDLER_ALL, + MiniDumpNormal, //Generate a 'normal' minidump. + wpipe_name.c_str(), + NULL); //No custom client info. + if (mExceptionHandler->IsOutOfProcess()) + { + LL_INFOS("CRASHREPORT") << "Successfully attached to Out of Process exception handler." << LL_ENDL; + break; + } + else + { + LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler. " << retries << " retries remaining." << LL_ENDL; + ::Sleep(100); //Wait a tick and try again. + } + } + + if (retries == 0) LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler." << LL_ENDL; + } + + if (mExceptionHandler) + { + mExceptionHandler->set_handle_debug_exceptions(true); + } + } +#endif // LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT) #else // ! LL_WINDOWS -#if ! defined(LL_BUGSPLAT) - // - // Start up signal handling. - // - // There are two different classes of signals. Synchronous signals are delivered to a specific - // thread, asynchronous signals can be delivered to any thread (in theory) - // - setup_signals(); +#if defined(LL_BUGSPLAT) + // Don't install our own signal handlers -- BugSplat needs to hook them, + // or it's completely ineffectual. + bool installHandler = false; + +#else // ! LL_BUGSPLAT + // + // Start up signal handling. + // + // There are two different classes of signals. Synchronous signals are delivered to a specific + // thread, asynchronous signals can be delivered to any thread (in theory) + // + setup_signals(); + + // Add google breakpad exception handler configured for Darwin/Linux. + bool installHandler = true; #endif // ! LL_BUGSPLAT +#if LL_DARWIN + // For the special case of Darwin, we do not want to install the handler if + // the process is being debugged as the app will exit with value ABRT (6) if + // we do. Unfortunately, the code below which performs that test relies on + // the structure kinfo_proc which has been tagged by apple as an unstable + // API. We disable this test for shipping versions to avoid conflicts with + // future releases of Darwin. This test is really only needed for developers + // starting the app from a debugger anyway. + #ifndef LL_RELEASE_FOR_DOWNLOAD + int mib[4]; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PID; + mib[3] = getpid(); + + struct kinfo_proc info; + memset(&info, 0, sizeof(info)); + + size_t size = sizeof(info); + int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); + if((result == 0) || (errno == ENOMEM)) + { + // P_TRACED flag is set, so this process is being debugged; do not install + // the handler + if(info.kp_proc.p_flag & P_TRACED) installHandler = false; + } + else + { + // Failed to discover if the process is being debugged; default to + // installing the handler. + installHandler = true; + } + #endif // ! LL_RELEASE_FOR_DOWNLOAD + + if(installHandler && (mExceptionHandler == 0)) + { + mExceptionHandler = new google_breakpad::ExceptionHandler(mDumpPath, 0, &unix_post_minidump_callback, 0, true, 0); + } +#elif LL_LINUX + if(installHandler && (mExceptionHandler == 0)) + { + if (mDumpPath.empty()) + { + mDumpPath = "/tmp"; + } + google_breakpad::MinidumpDescriptor desc(mDumpPath); + mExceptionHandler = new google_breakpad::ExceptionHandler(desc, NULL, unix_minidump_callback, NULL, true, -1); + } +#endif // LL_LINUX + #endif // ! LL_WINDOWS startErrorThread(); } @@ -477,6 +609,31 @@ void LLApp::setError() setStatus(APP_STATUS_ERROR); } +void LLApp::setMiniDumpDir(const std::string &path) +{ + if (path.empty()) + { + mDumpPath = "/tmp"; + } + else + { + mDumpPath = path; + } + + if(mExceptionHandler == 0) return; +#ifdef LL_WINDOWS + std::wstring buffer(utf8str_to_utf16str(mDumpPath)); + if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH); + mExceptionHandler->set_dump_path(buffer); +#elif LL_LINUX + //google_breakpad::MinidumpDescriptor desc("/tmp"); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. + google_breakpad::MinidumpDescriptor desc(mDumpPath); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. + mExceptionHandler->set_minidump_descriptor(desc); +#else + mExceptionHandler->set_dump_path(mDumpPath); +#endif +} + void LLApp::setDebugFileNames(const std::string &path) { mStaticDebugFileName = path + "static_debug_info.log"; @@ -485,6 +642,8 @@ void LLApp::setDebugFileNames(const std::string &path) void LLApp::writeMiniDump() { + if(mExceptionHandler == 0) return; + mExceptionHandler->WriteMinidump(); } // static @@ -541,6 +700,13 @@ bool LLApp::isExiting() void LLApp::disableCrashlogger() { + // Disable Breakpad exception handler. + if (mExceptionHandler != 0) + { + delete mExceptionHandler; + mExceptionHandler = 0; + } + sDisableCrashlogger = TRUE; } @@ -929,3 +1095,64 @@ bool unix_post_minidump_callback(const char *dump_dir, } #endif // !WINDOWS +#ifdef LL_WINDOWS +bool windows_post_minidump_callback(const wchar_t* dump_path, + const wchar_t* minidump_id, + void* context, + EXCEPTION_POINTERS* exinfo, + MDRawAssertionInfo* assertion, + bool succeeded) +{ + char * path = LLApp::instance()->getMiniDumpFilename(); + S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; + size_t bytesUsed; + + LL_INFOS("MINIDUMPCALLBACK") << "Dump file was generated." << LL_ENDL; + bytesUsed = wcstombs(path, dump_path, static_cast(remaining)); + remaining -= bytesUsed; + path += bytesUsed; + if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\') + { + *path++ = '\\'; + --remaining; + } + if(remaining > 0) + { + bytesUsed = wcstombs(path, minidump_id, static_cast(remaining)); + remaining -= bytesUsed; + path += bytesUsed; + } + if(remaining > 0) + { + strncpy(path, ".dmp", remaining); + } + + LL_INFOS("CRASHREPORT") << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << LL_ENDL; + // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. + //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); + // *TODO: Translate the signals/exceptions into cross-platform stuff + // Windows implementation + LL_INFOS() << "Entering Windows Exception Handler..." << LL_ENDL; + + if (LLApp::isError()) + { + LL_WARNS() << "Got another fatal signal while in the error handler, die now!" << LL_ENDL; + } + + // Flag status to error, so thread_error starts its work + LLApp::setError(); + + // Block in the exception handler until the app has stopped + // This is pretty sketchy, but appears to work just fine + while (!LLApp::isStopped()) + { + ms_sleep(10); + } + +#ifndef LL_RELEASE_FOR_DOWNLOAD + return false; +#else + return true; +#endif +} +#endif diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index e590e5eafd..245c73e3a2 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -49,6 +49,10 @@ void clear_signals(); #endif +namespace google_breakpad { + class ExceptionHandler; // See exception_handler.h +} + class LL_COMMON_API LLApp { friend class LLErrorThread; @@ -232,6 +236,7 @@ public: static const U32 MAX_MINDUMP_PATH_LENGTH = 256; // change the directory where Breakpad minidump files are written to + void setMiniDumpDir(const std::string &path); void setDebugFileNames(const std::string &path); // Return the Google Breakpad minidump filename after a crash. @@ -307,6 +312,9 @@ private: private: // the static application instance if it was created. static LLApp* sApplication; + + google_breakpad::ExceptionHandler * mExceptionHandler; + #if !LL_WINDOWS friend void default_unix_signal_handler(int signum, siginfo_t *info, void *); diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt index d90d148ee6..240ea2da83 100644 --- a/indra/llcorehttp/CMakeLists.txt +++ b/indra/llcorehttp/CMakeLists.txt @@ -176,6 +176,7 @@ if (DARWIN) set(copy_dylibs libapr-1.0.dylib libaprutil-1.0.dylib + libexception_handler.dylib libnghttp2*.dylib liburiparser*.dylib ${EXPAT_COPY} diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index bbf23a6d70..e37a38b05f 100644 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -23,6 +23,13 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ +#if LL_WINDOWS +#define SAFE_SSL 1 +#elif LL_DARWIN +#define SAFE_SSL 1 +#else +#define SAFE_SSL 1 +#endif #include "linden_common.h" // Modifies curl/curl.h interfaces #include "httpcommon.h" @@ -31,6 +38,10 @@ #include #include #include +#if SAFE_SSL +#include +#include // std::hash +#endif namespace LLCore @@ -337,6 +348,34 @@ void deallocateEasyCurl(CURL *curlp) } +#if SAFE_SSL +//static +void ssl_locking_callback(int mode, int type, const char *file, int line) +{ + if (type >= sSSLMutex.size()) + { + LL_WARNS() << "Attempt to get unknown MUTEX in SSL Lock." << LL_ENDL; + } + + if (mode & CRYPTO_LOCK) + { + sSSLMutex[type]->lock(); + } + else + { + sSSLMutex[type]->unlock(); + } +} + +//static +unsigned long ssl_thread_id(void) +{ + // std::thread::id is very deliberately opaque, but we can hash it + return std::hash()(LLThread::currentID()); +} +#endif + + } void initialize() @@ -348,11 +387,27 @@ void initialize() check_curl_code(code, CURL_GLOBAL_ALL); +#if SAFE_SSL + S32 mutex_count = CRYPTO_num_locks(); + for (S32 i = 0; i < mutex_count; i++) + { + sSSLMutex.push_back(LLMutex_ptr(new LLMutex())); + } + CRYPTO_set_id_callback(&ssl_thread_id); + CRYPTO_set_locking_callback(&ssl_locking_callback); +#endif + } void cleanup() { +#if SAFE_SSL + CRYPTO_set_id_callback(NULL); + CRYPTO_set_locking_callback(NULL); + sSSLMutex.clear(); +#endif + curl_global_cleanup(); } diff --git a/indra/llmessage/llblowfishcipher.cpp b/indra/llmessage/llblowfishcipher.cpp index 949d4cc0c7..0b5025a422 100644 --- a/indra/llmessage/llblowfishcipher.cpp +++ b/indra/llmessage/llblowfishcipher.cpp @@ -52,28 +52,24 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) if (src_len > dst_len) return 0; // OpenSSL uses "cipher contexts" to hold encryption parameters. - EVP_CIPHER_CTX *context = EVP_CIPHER_CTX_new(); - if (!context) - { - LL_WARNS() << "LLBlowfishCipher::encrypt EVP_CIPHER_CTX initiation failure" << LL_ENDL; - return 0; - } + EVP_CIPHER_CTX context; + EVP_CIPHER_CTX_init(&context); // We want a blowfish cyclic block chain cipher, but need to set // the key length before we pass in a key, so call EncryptInit // first with NULLs. - EVP_EncryptInit_ex(context, EVP_bf_cbc(), NULL, NULL, NULL); - EVP_CIPHER_CTX_set_key_length(context, (int)mSecretSize); + EVP_EncryptInit_ex(&context, EVP_bf_cbc(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(&context, (int)mSecretSize); // Complete initialization. Per EVP_EncryptInit man page, the // cipher pointer must be NULL. Apparently initial_vector must // be 8 bytes for blowfish, as this is the block size. unsigned char initial_vector[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - EVP_EncryptInit_ex(context, NULL, NULL, mSecret, initial_vector); + EVP_EncryptInit_ex(&context, NULL, NULL, mSecret, initial_vector); - int blocksize = EVP_CIPHER_CTX_block_size(context); - int keylen = EVP_CIPHER_CTX_key_length(context); - int iv_length = EVP_CIPHER_CTX_iv_length(context); + int blocksize = EVP_CIPHER_CTX_block_size(&context); + int keylen = EVP_CIPHER_CTX_key_length(&context); + int iv_length = EVP_CIPHER_CTX_iv_length(&context); LL_DEBUGS() << "LLBlowfishCipher blocksize " << blocksize << " keylen " << keylen << " iv_len " << iv_length @@ -81,7 +77,7 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) int output_len = 0; int temp_len = 0; - if (!EVP_EncryptUpdate(context, + if (!EVP_EncryptUpdate(&context, dst, &output_len, src, @@ -93,18 +89,18 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) // There may be some final data left to encrypt if the input is // not an exact multiple of the block size. - if (!EVP_EncryptFinal_ex(context, (unsigned char*)(dst + output_len), &temp_len)) + if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len)) { LL_WARNS() << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << LL_ENDL; goto ERROR; } output_len += temp_len; - EVP_CIPHER_CTX_free(context); + EVP_CIPHER_CTX_cleanup(&context); return output_len; ERROR: - EVP_CIPHER_CTX_free(context); + EVP_CIPHER_CTX_cleanup(&context); return 0; } diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index e5b4dec1bd..7d18bae947 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -154,9 +154,9 @@ void LLPluginProcessParent::shutdown() { EState state = (*it).second->mState; if (state != STATE_CLEANUP - && state != STATE_EXITING - && state != STATE_DONE - && state != STATE_ERROR) + || state != STATE_EXITING + || state != STATE_DONE + || state != STATE_ERROR) { (*it).second->setState(STATE_GOODBYE); } diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt new file mode 100644 index 0000000000..95637c9a28 --- /dev/null +++ b/indra/mac_crash_logger/CMakeLists.txt @@ -0,0 +1,95 @@ +# -*- cmake -*- + +project(mac_crash_logger) + +include(00-Common) +include(LLCommon) +include(LLCoreHttp) +include(LLCrashLogger) +include(LLMath) +include(LLMessage) +include(LLVFS) +include(LLXML) +include(Linking) +include(LLSharedLibs) +include(Boost) + +include_directories( + ${LLCOREHTTP_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${LLCRASHLOGGER_INCLUDE_DIRS} + ${LLMATH_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} + ${LLXML_INCLUDE_DIRS} + ) +include_directories(SYSTEM + ${LLCOMMON_SYSTEM_INCLUDE_DIRS} + ${LLXML_SYSTEM_INCLUDE_DIRS} + ) + +set(mac_crash_logger_SOURCE_FILES + mac_crash_logger.cpp + llcrashloggermac.cpp + llcrashloggermacdelegate.mm + ) + +set(mac_crash_logger_HEADER_FILES + CMakeLists.txt + + llcrashloggermac.h + llcrashloggermacdelegate.h + ) + +set_source_files_properties(${mac_crash_logger_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) +list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES}) + +set(mac_crash_logger_RESOURCE_FILES + CrashReporter.nib/ + ) +set_source_files_properties( + ${mac_crash_logger_RESOURCE_FILES} + PROPERTIES + HEADER_FILE_ONLY TRUE + ) +SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES}) +list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES}) + +add_executable(mac-crash-logger + MACOSX_BUNDLE + ${mac_crash_logger_SOURCE_FILES}) + +set_target_properties(mac-crash-logger + PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist + ) + +find_library(COCOA_LIBRARY Cocoa) + +target_link_libraries(mac-crash-logger + ${LLCRASHLOGGER_LIBRARIES} + ${LLVFS_LIBRARIES} + ${COCOA_LIBRARIES} + ${LLXML_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOREHTTP_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${BOOST_CONTEXT_LIBRARY} + ${BOOST_FIBER_LIBRARY} + ) + +add_custom_command( + TARGET mac-crash-logger POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/CrashReporter.nib + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib + ) + +ll_deploy_sharedlibs_command(mac-crash-logger) + + diff --git a/indra/mac_crash_logger/CrashReporter.nib b/indra/mac_crash_logger/CrashReporter.nib new file mode 100755 index 0000000000..e9d9e05985 Binary files /dev/null and b/indra/mac_crash_logger/CrashReporter.nib differ diff --git a/indra/mac_crash_logger/CrashReporter.xib b/indra/mac_crash_logger/CrashReporter.xib new file mode 100755 index 0000000000..f6d4776d51 --- /dev/null +++ b/indra/mac_crash_logger/CrashReporter.xib @@ -0,0 +1,3895 @@ + + + + 1070 + 11G63 + 2182 + 1138.51 + 569.00 + + com.apple.InterfaceBuilder.CocoaPlugin + 2182 + + + NSTextField + NSView + NSWindowTemplate + NSMenu + NSMenuItem + NSTextFieldCell + NSButtonCell + IBNSLayoutConstraint + NSButton + NSCustomObject + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + Second Life Crash Logger + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + Second Life Crash Logger + + + + About Second Life Crash Logger + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide Second Life Crash Logger + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit Second Life Crash Logger + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + Format + + + + Font + + 2147483647 + + + submenuAction: + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + Ligature + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + Help + + + + Second Life Crash Logger Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + 15 + 2 + {{335, 390}, {508, 477}} + 1954021376 + Second Life Crash Logger + NSWindow + + + + + 256 + + + + 268 + {{17, 228}, {474, 229}} + + + + _NS:9 + {250, 750} + YES + + 67239424 + 272891904 + + U2Vjb25kIExpZmUgYXBwZWFycyB0byBoYXZlIGNyYXNoZWQgb3IgZnJvemVuIHRoZSBsYXN0IHRpbWUg +aXQgcmFuLgoKVGhpcyBjcmFzaCByZXBvcnRlciBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB5b3Vy +IGNvbXB1dGVyJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIHNv +bWUgU2Vjb25kIExpZmUgbG9ncywgYWxsIG9mIHdoaWNoIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVy +cG9zZXMgb25seS4KCkluIHRoZSBzcGFjZSBiZWxvdywgcGxlYXNlIGJyaWVmbHkgZGVzY3JpYmUgd2hh +dCB5b3Ugd2VyZSBkb2luZyBvciB0cnlpbmcgdG8gZG8ganVzdCBwcmlvciB0byB0aGUgY3Jhc2guICBU +aGFuayB5b3UgZm9yIHlvdXIgaGVscCEKClRoaXMgcmVwb3J0IGlzIE5PVCByZWFkIGJ5IEN1c3RvbWVy +IFN1cHBvcnQuICBJZiB5b3UgaGF2ZSBiaWxsaW5nIG9yIG90aGVyIHF1ZXN0aW9ucywgcGxlYXNlIGdv +IHRvOiBodHRwOi8vd3d3LnNlY29uZGxpZmUuY29tL3N1cHBvcnQvCgpJZiB5b3UgZG9uJ3Qgd2lzaCB0 +byBzZW5kIExpbmRlbiBMYWIgYSBjcmFzaCByZXBvcnQsIHByZXNzIENhbmNlbC4 + + + LucidaGrande + 13 + 16 + + _NS:9 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{20, 64}, {468, 163}} + + + + _NS:9 + {250, 750} + YES + + -1805517311 + 272891904 + + + LucidaGrande + 9 + 3614 + + _NS:9 + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{16, 18}, {189, 30}} + + + + _NS:9 + YES + + -2080244224 + 262144 + Remember This Choice + + _NS:9 + + 1211912703 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 268 + {{285, 23}, {91, 17}} + + + + _NS:9 + YES + + -2080244224 + 134479872 + Send Report + + _NS:9 + + -2038152961 + 164 + + + 400 + 75 + + + + + 268 + {{388, 23}, {100, 17}} + + + + _NS:9 + YES + + -2080244224 + 134479872 + Don't Send + + _NS:9 + + -2038152961 + 164 + + + 400 + 75 + + + + {508, 477} + + + + + {{0, 0}, {1680, 1028}} + {10000000000000, 10000000000000} + YES + + + LLCrashLoggerMacDelegate + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 495 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + window + + + + 532 + + + + remember: + + + + 1176 + + + + send: + + + + 1177 + + + + cancel: + + + + 1178 + + + + crashText + + + + 1179 + + + + rememberCheck + + + + 1187 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + + + + 3 + 0 + + 3 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 4 + 0 + + 4 + 1 + + 64 + + 1000 + 3 + 9 + 3 + + + + + 6 + 0 + + 6 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 5 + 0 + + 5 + 1 + + 20 + + 1000 + 8 + 29 + 3 + + + + + 4 + 0 + + 4 + 1 + + 21 + + 1000 + 3 + 9 + 3 + + + + + 6 + 0 + + 6 + 1 + + 132 + + 1000 + 3 + 9 + 3 + + + + + 11 + 0 + + 11 + 1 + + 0.0 + + 1000 + 6 + 24 + 2 + + + + + 10 + 0 + + 10 + 1 + + 0.0 + + 1000 + 6 + 24 + 2 + + + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 494 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 536 + + + + + + 8 + 0 + + 0 + 1 + + 229 + + 1000 + 3 + 9 + 1 + + + + + + + 537 + + + + + 593 + + + + + + 8 + 0 + + 0 + 1 + + 163 + + 1000 + 3 + 9 + 1 + + + + + + + 594 + + + + + 727 + + + + + + 7 + 0 + + 0 + 1 + + 183 + + 1000 + 3 + 9 + 1 + + + + + 8 + 0 + + 0 + 1 + + 22 + + 1000 + 3 + 9 + 1 + + + + + + + 728 + + + + + 775 + + + + + + + + 776 + + + + + 780 + + + + + + 7 + 0 + + 0 + 1 + + 100 + + 1000 + 3 + 9 + 1 + + + + + + + 781 + + + + + 884 + + + + + 981 + + + + + 982 + + + + + 1022 + + + + + 1026 + + + + + 979 + + + + + 985 + + + + + 977 + + + + + 1099 + + + + + 1093 + + + + + 1100 + + + + + 1098 + + + + + 1168 + + + + + 1167 + + + + + 1095 + + + + + 1166 + + + + + 1076 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{380, 496}, {480, 360}} + + + + + + + + + + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 1187 + + + + + LLCrashLoggerMacDelegate + NSObject + + id + id + id + + + + cancel: + id + + + remember: + id + + + send: + id + + + + NSTextField + NSButton + NSWindow + + + + crashText + NSTextField + + + rememberCheck + NSButton + + + window + NSWindow + + + + IBProjectSource + ./Classes/LLCrashLoggerMacDelegate.h + + + + NSLayoutConstraint + NSObject + + IBProjectSource + ./Classes/NSLayoutConstraint.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + YES + 3 + + {11, 11} + {10, 3} + {15, 15} + + YES + + diff --git a/indra/mac_crash_logger/Info.plist b/indra/mac_crash_logger/Info.plist new file mode 100644 index 0000000000..2ebed11c3f --- /dev/null +++ b/indra/mac_crash_logger/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + mac-crash-logger + CFBundleGetInfoString + + CFBundleIconFile + + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleShortVersionString + + CFBundleSignature + ???? + CFBundleVersion + 1.0.0 + NSMainNibFile + CrashReporter + NSPrincipalClass + NSApplication + + diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp new file mode 100644 index 0000000000..ec3616e26a --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermac.cpp @@ -0,0 +1,91 @@ +/** + * @file llcrashloggermac.cpp + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&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 "llcrashloggermac.h" + +#include + +#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME +#include "llerror.h" +#include "llfile.h" +#include "lltimer.h" +#include "llstring.h" +#include "lldir.h" +#include "llsdserialize.h" + +// Windows Message Handlers + +BOOL gFirstDialog = TRUE; +LLFILE *gDebugFile = NULL; + +std::string gUserNotes = ""; +bool gSendReport = false; +bool gRememberChoice = false; + +LLCrashLoggerMac::LLCrashLoggerMac(void) +{ +} + +LLCrashLoggerMac::~LLCrashLoggerMac(void) +{ +} + +bool LLCrashLoggerMac::init(void) +{ + bool ok = LLCrashLogger::init(); + return ok; +} + +void LLCrashLoggerMac::gatherPlatformSpecificFiles() +{ +} + +bool LLCrashLoggerMac::frame() +{ + + if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) + { + gSendReport = true; + } + + if(gSendReport) + { + setUserText(gUserNotes); + sendCrashLogs(); + } + + LL_INFOS() << "Sending of logs complete" << LL_ENDL; + + return true; +} + +bool LLCrashLoggerMac::cleanup() +{ + commonCleanup(); + mKeyMaster.releaseMaster(); + return true; +} diff --git a/indra/mac_crash_logger/llcrashloggermac.h b/indra/mac_crash_logger/llcrashloggermac.h new file mode 100644 index 0000000000..05ef8c9f53 --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermac.h @@ -0,0 +1,45 @@ +/** + * @file llcrashloggermac.h + * @brief Mac OSX crash logger definition + * + * $LicenseInfo:firstyear=2003&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$ + */ + +#ifndef LLCRASHLOGGERMAC_H +#define LLCRASHLOGGERMAC_H + +#include "linden_common.h" +#include "llcrashlogger.h" +#include "llstring.h" + +class LLCrashLoggerMac : public LLCrashLogger +{ +public: + LLCrashLoggerMac(void); + ~LLCrashLoggerMac(void); + virtual bool init(); + virtual bool frame(); + virtual bool cleanup(); + virtual void gatherPlatformSpecificFiles(); +}; + +#endif diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.h b/indra/mac_crash_logger/llcrashloggermacdelegate.h new file mode 100644 index 0000000000..c998a8efe2 --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermacdelegate.h @@ -0,0 +1,52 @@ +/** + * @file llcrashloggermacdelegate.h + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&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$ + */ + +/* +#import + +@interface LLCrashLoggerMacDelegate : NSObject +{ + IBOutlet NSTextField *crashText; + IBOutlet NSButton *rememberCheck; + + NSWindow *_window; + bool mRemember; + +} + +- (void)setWindow:(NSWindow *)newWindow; +- (NSWindow *)window; + +- (IBAction)remember:(id)sender; +- (IBAction)send:(id)sender; +- (IBAction)cancel:(id)sender; + +@property (assign) IBOutlet NSWindow *window; + +@end +*/ + + diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.mm b/indra/mac_crash_logger/llcrashloggermacdelegate.mm new file mode 100644 index 0000000000..b2af76a47c --- /dev/null +++ b/indra/mac_crash_logger/llcrashloggermacdelegate.mm @@ -0,0 +1,75 @@ +/** + * @file llcrashloggermacdelegate.mm + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&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$ + */ + + +/* +#import "llcrashloggermacdelegate.h" +#include + +extern std::string gUserNotes; +extern bool gSendReport; +extern bool gRememberChoice; + +@implementation LLCrashLoggerMacDelegate + +- (void)setWindow:(NSWindow *)window +{ + _window = window; +} + +- (NSWindow *)window +{ + return _window; +} + +- (void)dealloc +{ + [super dealloc]; +} + +std::string* NSToString( NSString *ns_str ) +{ + return ( new std::string([ns_str UTF8String]) ); +} + +- (IBAction)remember:(id)sender +{ + gRememberChoice = [rememberCheck state]; +} + +- (IBAction)send:(id)sender +{ + std::string* user_input = NSToString([crashText stringValue]); + gUserNotes = *user_input; + gSendReport = true; +} + +- (IBAction)cancel:(id)sender +{ + [ _window close]; +} +@end +*/ \ No newline at end of file diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp new file mode 100644 index 0000000000..54e41a1954 --- /dev/null +++ b/indra/mac_crash_logger/mac_crash_logger.cpp @@ -0,0 +1,58 @@ +/** + * @file mac_crash_logger.cpp + * @brief Mac OSX crash logger implementation + * + * $LicenseInfo:firstyear=2003&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 "linden_common.h" +#include "llcrashloggermac.h" +#include "indra_constants.h" +#include "llpidlock.h" + +#include + +int main(int argc, char **argv) +{ + LLCrashLoggerMac app; + app.parseCommandOptions(argc, argv); + + LLSD options = LLApp::instance()->getOptionData( + LLApp::PRIORITY_COMMAND_LINE); + + if (! app.init()) + { + LL_WARNS() << "Unable to initialize application." << LL_ENDL; + return 1; + } + + if (app.getCrashBehavior() != CRASH_BEHAVIOR_ALWAYS_SEND) + { +// return NSApplicationMain(argc, (const char **)argv); + } + app.frame(); + app.cleanup(); + + LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; + + return 0; +} diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index 5d4a488e64..f7d35b33c2 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -34,11 +34,6 @@ #include "llpluginmessageclasses.h" #include "media_plugin_base.h" -#if defined(_MSC_VER) -#include -typedef SSIZE_T ssize_t; -#endif - #include "vlc/vlc.h" #include "vlc/libvlc_version.h" diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index b6fb2dccba..fc8d8b805b 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1829,27 +1829,28 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt + ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll ${viewer_APPSETTINGS_FILES} SLPlugin media_plugin_cef media_plugin_libvlc media_plugin_example winmm_shim + windows-crash-logger ) if (ADDRESS_SIZE EQUAL 64) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp_x64.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1-x64.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1-x64.dll ) else (ADDRESS_SIZE EQUAL 64) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1.dll ) endif (ADDRESS_SIZE EQUAL 64) @@ -1905,6 +1906,7 @@ if (WINDOWS) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin + windows-crash-logger ) # sets the 'working directory' for debugging from visual studio. @@ -2209,7 +2211,8 @@ if (DARWIN) ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) + add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef mac-crash-logger) + add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger) if (ENABLE_SIGNING) set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}") @@ -2252,7 +2255,62 @@ endif (INSTALL) # Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) - if (BUGSPLAT_DB) + if (NOT BUGSPLAT_DB) + # Breakpad symbol-file generation + set(SYMBOL_SEARCH_DIRS "") + if (WINDOWS) + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") + # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad + # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") + set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") + set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") + set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) + endif (WINDOWS) + if (DARWIN) + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") + # *TODO: Generate these search dirs in the cmake files related to each binary. + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") + set(VIEWER_EXE_GLOBS "'${product}' SLPlugin mac-crash-logger") + set(VIEWER_EXE_GLOBS "'${product}' mac-crash-logger") + set(VIEWER_LIB_GLOB "*.dylib") + endif (DARWIN) + if (LINUX) + list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") + set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") + set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") + set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") + set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) + endif (LINUX) + + if(CMAKE_CFG_INTDIR STREQUAL ".") + set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) + else(CMAKE_CFG_INTDIR STREQUAL ".") + # set LLBUILD_CONFIG to be a shell variable evaluated at build time + # reflecting the configuration we are currently building. + set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) + endif(CMAKE_CFG_INTDIR STREQUAL ".") + add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" + COMMAND "${PYTHON_EXECUTABLE}" + ARGS + "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" + "${LLBUILD_CONFIG}" + "${SYMBOL_SEARCH_DIRS}" + "${VIEWER_EXE_GLOBS}" + "${VIEWER_LIB_GLOB}" + "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" + "${VIEWER_SYMBOL_FILE}" + DEPENDS generate_breakpad_symbols.py + VERBATIM) + + add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME} "${VIEWER_COPY_MANIFEST}") + add_dependencies(generate_symbols ${VIEWER_BINARY_NAME}) + if (WINDOWS OR LINUX) + add_dependencies(generate_symbols "${VIEWER_COPY_MANIFEST}") + endif (WINDOWS OR LINUX) + + else (NOT BUGSPLAT_DB) # BugSplat symbol-file generation if (WINDOWS) # Just pack up a tarball containing only the .pdb file for the @@ -2336,7 +2394,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE if (LINUX) # TBD endif (LINUX) - endif (BUGSPLAT_DB) + endif (NOT BUGSPLAT_DB) # for both BUGSPLAT_DB and Breakpad add_dependencies(llpackage generate_symbols) diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py new file mode 100755 index 0000000000..d351c406bc --- /dev/null +++ b/indra/newview/generate_breakpad_symbols.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +"""\ +@file generate_breakpad_symbols.py +@author Brad Kittenbrink +@brief Simple tool for generating google_breakpad symbol information + for the crash reporter. + +$LicenseInfo:firstyear=2010&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2010-2011, 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$ +""" + + +import collections +import fnmatch +import itertools +import os +import re +import sys +import shlex +import subprocess +import tarfile +import StringIO +import pprint + +DEBUG=False + +def usage(): + print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] + +class MissingModuleError(Exception): + def __init__(self, modules): + Exception.__init__(self, "Failed to find required modules: %r" % modules) + self.modules = modules + +def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): + print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + + if not re.match("release", configuration, re.IGNORECASE): + print "skipping breakpad symbol generation for non-release build." + return 0 + + # split up list of viewer_exes + # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] + viewer_exes = shlex.split(viewer_exes) + + found_required = dict([(module, False) for module in viewer_exes]) + + def matches(f): + if f in viewer_exes: + found_required[f] = True + return True + return fnmatch.fnmatch(f, libs_suffix) + + search_dirs = search_dirs.split(";") + + def list_files(): + for search_dir in search_dirs: + for (dirname, subdirs, filenames) in os.walk(search_dir): + if DEBUG: + print "scanning '%s' for modules..." % dirname + for f in itertools.ifilter(matches, filenames): + yield os.path.join(dirname, f) + + def dump_module(m): + print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) + dsym_full_path = m + child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE) + out, err = child.communicate() + return (m,child.returncode, out, err) + + + modules = {} + + for m in list_files(): + if DEBUG: + print "examining module '%s' ... " % m, + filename=os.path.basename(m) + if -1 != m.find("DWARF"): + # Just use this module; it has the symbols we want. + modules[filename] = m + if DEBUG: + print "found dSYM entry" + elif filename not in modules: + # Only use this if we don't already have a (possibly better) entry. + modules[filename] = m + if DEBUG: + print "found new entry" + elif DEBUG: + print "ignoring entry" + + + print "Found these following modules:" + pprint.pprint( modules ) + + out = tarfile.open(viewer_symbol_file, 'w:bz2') + for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()): + if status == 0: + module_line = symbols[:symbols.index('\n')] + module_line = module_line.split() + hash_id = module_line[3] + module = ' '.join(module_line[4:]) + if sys.platform in ['win32', 'cygwin']: + mod_name = module[:module.rindex('.pdb')] + else: + mod_name = module + symbolfile = StringIO.StringIO(symbols) + info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) + info.size = symbolfile.len + out.addfile(info, symbolfile) + else: + print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) + + out.close() + + missing_modules = [m for (m,_) in + itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) + ] + if missing_modules: + print >> sys.stderr, "failed to generate %s" % viewer_symbol_file + os.remove(viewer_symbol_file) + raise MissingModuleError(missing_modules) + + symbols = tarfile.open(viewer_symbol_file, 'r:bz2') + tarfile_members = symbols.getnames() + symbols.close() + + for required_module in viewer_exes: + def match_module_basename(m): + return os.path.splitext(required_module)[0].lower() \ + == os.path.splitext(os.path.basename(m))[0].lower() + # there must be at least one .sym file in tarfile_members that matches + # each required module (ignoring file extensions) + if not any(itertools.imap(match_module_basename, tarfile_members)): + print >> sys.stderr, "failed to find required %s in generated %s" \ + % (required_module, viewer_symbol_file) + os.remove(viewer_symbol_file) + raise MissingModuleError([required_module]) + + print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) + + return 0 + +if __name__ == "__main__": + if len(sys.argv) != 7: + usage() + sys.exit(1) + sys.exit(main(*sys.argv[1:])) + diff --git a/indra/newview/installers/darwin/apple-notarize.sh b/indra/newview/installers/darwin/apple-notarize.sh deleted file mode 100755 index b953af81af..0000000000 --- a/indra/newview/installers/darwin/apple-notarize.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/sh -CONFIG_FILE="$build_secrets_checkout/code-signing-osx/notarize_creds.sh" -if [ -f "$CONFIG_FILE" ]; then - source $CONFIG_FILE - app_file="$1" - zip_file=${app_file/app/zip} - ditto -c -k --keepParent "$app_file" "$zip_file" - if [ -f "$zip_file" ]; then - requestUUID=$(xcrun altool --notarize-app --primary-bundle-id "com.secondlife.viewer" \ - --username $USERNAME \ - --password $PASSWORD \ - --asc-provider $ASC_PROVIDER \ - --file "$zip_file" 2>&1 \ - | awk '/RequestUUID/ { print $NF; }') - - echo "Apple Notarization RequestUUID: $requestUUID" - - if [[ -n $requestUUID ]]; then - status="in progress" - while [[ "$status" == "in progress" ]]; do - sleep 30 - status=$(xcrun altool --notarization-info "$requestUUID" \ - --username $USERNAME \ - --password $PASSWORD 2>&1 \ - | awk -F ': ' '/Status:/ { print $2; }' ) - echo "$status" - done - # log results - xcrun altool --notarization-info "$requestUUID" \ - --username $USERNAME \ - --password $PASSWORD - - #remove temporary file - rm "$zip_file" - - if [["$status" == "success"]]; then - xcrun stapler staple "$app_file" - elif [["$status" == "invalid"]]; then - exit 1 - fi - fi - fi -fi - diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 66a33ed6ae..053c0a5ab7 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -738,7 +738,7 @@ LLAppViewer::LLAppViewer() std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); #endif // ! LL_BUGSPLAT mDumpPath = logdir; - + setMiniDumpDir(logdir); setDebugFileNames(logdir); } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index e9c467bd01..5ceb540784 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -108,6 +108,7 @@ public: virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism. // return false if the error trap needed restoration. + virtual void initCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report? static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. void checkForCrash(); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 862e2b45df..662164af2d 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -240,7 +240,17 @@ LLAppViewerMacOSX::~LLAppViewerMacOSX() bool LLAppViewerMacOSX::init() { - return LLAppViewer::init(); + bool success = LLAppViewer::init(); + +#if LL_SEND_CRASH_REPORTS + if (success) + { + LLAppViewer* pApp = LLAppViewer::instance(); + pApp->initCrashReporting(); + } +#endif + + return success; } // MacOSX may add and addition command line arguement for the process serial number. @@ -357,6 +367,21 @@ bool LLAppViewerMacOSX::restoreErrorTrap() return reset_count == 0; } +void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze) +{ + std::string command_str = "mac-crash-logger.app"; + + std::stringstream pid_str; + pid_str << LLApp::getPid(); + std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); + std::string appname = gDirUtilp->getExecutableFilename(); + std::string str[] = { "-pid", pid_str.str(), "-dumpdir", logdir, "-procname", appname.c_str() }; + std::vector< std::string > args( str, str + ( sizeof ( str ) / sizeof ( std::string ) ) ); + LL_WARNS() << "about to launch mac-crash-logger" << pid_str.str() + << " " << logdir << " " << appname << LL_ENDL; + launchApplication(&command_str, &args); +} + std::string LLAppViewerMacOSX::generateSerialNumber() { char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index b0e325a955..d5a80864be 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -44,6 +44,7 @@ public: protected: virtual bool restoreErrorTrap(); + virtual void initCrashReporting(bool reportFreeze); std::string generateSerialNumber(); virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index f0bede5321..9b1c0d1f8b 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -603,6 +603,9 @@ bool LLAppViewerWin32::init() #if ! defined(LL_BUGSPLAT) #pragma message("Building without BugSplat") + LLAppViewer* pApp = LLAppViewer::instance(); + pApp->initCrashReporting(); + #else // LL_BUGSPLAT #pragma message("Building with BugSplat") @@ -814,6 +817,57 @@ bool LLAppViewerWin32::restoreErrorTrap() //return LLWinDebug::checkExceptionHandler(); } +void LLAppViewerWin32::initCrashReporting(bool reportFreeze) +{ + if (isSecondInstance()) return; //BUG-5707 do not start another crash reporter for second instance. + + const char* logger_name = "win_crash_logger.exe"; + std::string exe_path = gDirUtilp->getExecutableDir(); + exe_path += gDirUtilp->getDirDelimiter(); + exe_path += logger_name; + + std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); + std::string appname = gDirUtilp->getExecutableFilename(); + + S32 slen = logdir.length() -1; + S32 end = slen; + while (logdir.at(end) == '/' || logdir.at(end) == '\\') end--; + + if (slen !=end) + { + logdir = logdir.substr(0,end+1); + } + //std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); + //_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str.c_str(), NULL); + std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); + + STARTUPINFO startInfo={sizeof(startInfo)}; + PROCESS_INFORMATION processInfo; + + std::wstring exe_wstr; + exe_wstr = utf8str_to_utf16str(exe_path); + + std::wstring arg_wstr; + arg_wstr = utf8str_to_utf16str(arg_str); + + LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL; + if(CreateProcess(exe_wstr.c_str(), + &arg_wstr[0], // Application arguments + 0, + 0, + FALSE, + CREATE_DEFAULT_ERROR_MODE, + 0, + 0, // Working directory + &startInfo, + &processInfo) == FALSE) + // Could not start application -> call 'GetLastError()' + { + LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL; + return; + } +} + //virtual bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url) { diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 2699224e58..c5fae6a3a3 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -51,6 +51,7 @@ protected: virtual bool beingDebugged(); virtual bool restoreErrorTrap(); + virtual void initCrashReporting(bool reportFreeze); virtual bool sendURLToOtherInstance(const std::string& url); diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 1e6f2154bc..14059f828a 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -452,7 +452,7 @@ public: virtual LLPointer getCertificate(X509* openssl_cert)=0; // instantiate a chain from an X509_STORE_CTX - virtual LLPointer getCertificateChain(X509_STORE_CTX* chain)=0; + virtual LLPointer getCertificateChain(const X509_STORE_CTX* chain)=0; // instantiate a cert store given it's id. if a persisted version // exists, it'll be loaded. If not, one will be created (but not diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 94331fddfa..737ef30ada 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -95,7 +95,7 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert, LLBasicCertificate::LLBasicCertificate(X509* pCert, const LLSD* validation_params) { - if (!pCert) + if (!pCert || !pCert->cert_info) { LLTHROW(LLInvalidCertificate(LLSD::emptyMap())); } @@ -355,8 +355,8 @@ LLSD cert_name_from_X509_NAME(X509_NAME* name) char buffer[32]; X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index); - std::string name_value = std::string((const char*)ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)), - ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); + std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)), + M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry); OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0); @@ -683,29 +683,29 @@ std::string LLBasicCertificateStore::storeId() const // LLBasicCertificateChain // This class represents a chain of certs, each cert being signed by the next cert // in the chain. Certs must be properly signed by the parent -LLBasicCertificateChain::LLBasicCertificateChain(X509_STORE_CTX* store) +LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store) { // we're passed in a context, which contains a cert, and a blob of untrusted // certificates which compose the chain. - if((store == NULL) || X509_STORE_CTX_get0_cert(store) == NULL) + if((store == NULL) || (store->cert == NULL)) { LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL; return; } // grab the child cert - LLPointer current = new LLBasicCertificate(X509_STORE_CTX_get0_cert(store)); + LLPointer current = new LLBasicCertificate(store->cert); add(current); - if(X509_STORE_CTX_get0_untrusted(store) != NULL) + if(store->untrusted != NULL) { // if there are other certs in the chain, we build up a vector // of untrusted certs so we can search for the parents of each // consecutive cert. LLBasicCertificateVector untrusted_certs; - for(int i = 0; i < sk_X509_num(X509_STORE_CTX_get0_untrusted(store)); i++) + for(int i = 0; i < sk_X509_num(store->untrusted); i++) { - LLPointer cert = new LLBasicCertificate(sk_X509_value(X509_STORE_CTX_get0_untrusted(store), i)); + LLPointer cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i)); untrusted_certs.add(cert); } @@ -1340,10 +1340,9 @@ void LLSecAPIBasicHandler::_readProtectedData() // read in the rest of the file. - EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); - // todo: ctx error handling - - EVP_DecryptInit(ctx, EVP_rc4(), salt, NULL); + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL); // allocate memory: std::string decrypted_data; @@ -1351,14 +1350,14 @@ void LLSecAPIBasicHandler::_readProtectedData() // read data as a block: protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE); - EVP_DecryptUpdate(ctx, decrypted_buffer, &decrypted_length, + EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length, buffer, protected_data_stream.gcount()); decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount()); } // RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is // no block padding. - EVP_CIPHER_CTX_free(ctx); + EVP_CIPHER_CTX_cleanup(&ctx); std::istringstream parse_stream(decrypted_data); if (parser->parse(parse_stream, mProtectedDataMap, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) @@ -1394,14 +1393,12 @@ void LLSecAPIBasicHandler::_writeProtectedData() llofstream protected_data_stream(tmp_filename.c_str(), std::ios_base::binary); - EVP_CIPHER_CTX *ctx = NULL; try { - ctx = EVP_CIPHER_CTX_new(); - // todo: ctx error handling - - EVP_EncryptInit(ctx, EVP_rc4(), salt, NULL); + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL); unsigned char unique_id[MAC_ADDRESS_BYTES]; LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); LLXORCipher cipher(unique_id, sizeof(unique_id)); @@ -1416,13 +1413,13 @@ void LLSecAPIBasicHandler::_writeProtectedData() break; } int encrypted_length; - EVP_EncryptUpdate(ctx, encrypted_buffer, &encrypted_length, + EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length, buffer, formatted_data_istream.gcount()); protected_data_stream.write((const char *)encrypted_buffer, encrypted_length); } // no EVP_EncrypteFinal, as this is a stream cipher - EVP_CIPHER_CTX_free(ctx); + EVP_CIPHER_CTX_cleanup(&ctx); protected_data_stream.close(); } @@ -1434,11 +1431,6 @@ void LLSecAPIBasicHandler::_writeProtectedData() // it may be, however. LLFile::remove(tmp_filename); - if (ctx) - { - EVP_CIPHER_CTX_free(ctx); - } - // EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData() // Decided throwing an exception here was overkill until we figure out why this happens //LLTHROW(LLProtectedDataException("Error writing Protected Data Store")); @@ -1491,7 +1483,7 @@ LLPointer LLSecAPIBasicHandler::getCertificate(X509* openssl_cert } // instantiate a chain from an X509_STORE_CTX -LLPointer LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) +LLPointer LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { LLPointer result = new LLBasicCertificateChain(chain); return result; diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h index 82670f9083..0bc7f5230f 100644 --- a/indra/newview/llsechandler_basic.h +++ b/indra/newview/llsechandler_basic.h @@ -197,7 +197,7 @@ class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public { public: - LLBasicCertificateChain(X509_STORE_CTX * store); + LLBasicCertificateChain(const X509_STORE_CTX * store); virtual ~LLBasicCertificateChain() {} @@ -241,7 +241,7 @@ public: virtual LLPointer getCertificate(X509* openssl_cert); // instantiate a chain from an X509_STORE_CTX - virtual LLPointer getCertificateChain(X509_STORE_CTX* chain); + virtual LLPointer getCertificateChain(const X509_STORE_CTX* chain); // instantiate a cert store given it's id. if a persisted version // exists, it'll be loaded. If not, one will be created (but not diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp index 37fbbb449b..caa3016d2e 100644 --- a/indra/newview/tests/llsecapi_test.cpp +++ b/indra/newview/tests/llsecapi_test.cpp @@ -57,7 +57,7 @@ void LLSecAPIBasicHandler::init() {} LLSecAPIBasicHandler::~LLSecAPIBasicHandler() {} LLPointer LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert) { return NULL; } LLPointer LLSecAPIBasicHandler::getCertificate(X509* openssl_cert) { return NULL; } -LLPointer LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) { return NULL; } +LLPointer LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; } LLPointer LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; } void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {} void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {} diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index 4c8d6c51b0..e5d226a2a4 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -1217,8 +1217,8 @@ namespace tut // Single cert in the chain. X509_STORE_CTX *test_store = X509_STORE_CTX_new(); - X509_STORE_CTX_set_cert(test_store, mX509ChildCert); - X509_STORE_CTX_set0_untrusted(test_store, NULL); + test_store->cert = mX509ChildCert; + test_store->untrusted = NULL; test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 1); @@ -1229,9 +1229,9 @@ namespace tut // cert + CA test_store = X509_STORE_CTX_new(); - X509_STORE_CTX_set_cert(test_store, mX509ChildCert); - X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 2); @@ -1245,9 +1245,9 @@ namespace tut // cert + nonrelated test_store = X509_STORE_CTX_new(); - X509_STORE_CTX_set_cert(test_store, mX509ChildCert); - X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509TestCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 1); @@ -1257,10 +1257,10 @@ namespace tut // cert + CA + nonrelated test_store = X509_STORE_CTX_new(); - X509_STORE_CTX_set_cert(test_store, mX509ChildCert); - X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); + sk_X509_push(test_store->untrusted, mX509TestCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 2); @@ -1273,10 +1273,10 @@ namespace tut // cert + intermediate + CA test_store = X509_STORE_CTX_new(); - X509_STORE_CTX_set_cert(test_store, mX509ChildCert); - X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); - sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509RootCert); + test_store->cert = mX509ChildCert; + test_store->untrusted = sk_X509_new_null(); + sk_X509_push(test_store->untrusted, mX509IntermediateCert); + sk_X509_push(test_store->untrusted, mX509RootCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("three elements in store", test_chain->size(), 3); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index c0a0a7ec46..adac7af712 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -553,13 +553,9 @@ class WindowsManifest(ViewerManifest): self.path("vivoxsdk.dll") self.path("ortp.dll") - # OpenSSL - if (self.address_size == 64): - self.path("libcrypto-1_1-x64.dll") - self.path("libssl-1_1-x64.dll") - else: - self.path("libcrypto-1_1.dll") - self.path("libssl-1_1.dll") + # Security + self.path("ssleay32.dll") + self.path("libeay32.dll") # HTTP/2 self.path("nghttp2.dll") @@ -687,6 +683,11 @@ class WindowsManifest(ViewerManifest): self.path("libvlccore.dll") self.path("plugins/") + # pull in the crash logger from other projects + # tag:"crash-logger" here as a cue to the exporter + self.path(src='../win_crash_logger/%s/windows-crash-logger.exe' % self.args['configuration'], + dst="win_crash_logger.exe") + if not self.is_packaging_viewer(): self.package_file = "copied_deps" @@ -1031,6 +1032,7 @@ class DarwinManifest(ViewerManifest): "libapr-1.0.dylib", "libaprutil-1.0.dylib", "libexpat.1.dylib", + "libexception_handler.dylib", "libGLOD.dylib", # libnghttp2.dylib is a symlink to # libnghttp2.major.dylib, which is a symlink to @@ -1066,15 +1068,21 @@ class DarwinManifest(ViewerManifest): # our apps executable_path = {} - self.path2basename(os.path.join(os.pardir, os.path.join("llplugin", "slplugin"), self.args['configuration']), "SLPlugin.app") - executable_path["SLPlugin.app"] = \ - self.dst_path_of(os.path.join("SLPlugin.app", "Contents", "MacOS")) - - # our apps dependencies on shared libs - # for each app, for each dylib we collected in dylibs, - # create a symlink to the real copy of the dylib. - with self.prefix(dst=os.path.join("SLPlugin.app", "Contents", "Resources")): - for libfile in dylibs: + for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), + # plugin launcher + (os.path.join("llplugin", "slplugin"), "SLPlugin.app"), + ): + self.path2basename(os.path.join(os.pardir, + app_bld_dir, self.args['configuration']), + app) + executable_path[app] = \ + self.dst_path_of(os.path.join(app, "Contents", "MacOS")) + + # our apps dependencies on shared libs + # for each app, for each dylib we collected in dylibs, + # create a symlink to the real copy of the dylib. + with self.prefix(dst=os.path.join(app, "Contents", "Resources")): + for libfile in dylibs: self.relsymlinkf(os.path.join(libfile_parent, libfile)) # Dullahan helper apps go inside SLPlugin.app @@ -1295,19 +1303,14 @@ class DarwinManifest(ViewerManifest): signed=False sign_attempts=3 sign_retry_wait=15 - libvlc_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_libvlc.dylib" - cef_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_cef.dylib" - slplugin_path = app_in_dmg + "/Contents/Resources/SLPlugin.app/Contents/MacOS/SLPlugin" - greenlet_path = app_in_dmg + "/Contents/Resources/updater/greenlet/_greenlet.so" while (not signed) and (sign_attempts > 0): try: - sign_attempts-=1 - # Note: See blurb above about names of keychains - self.run_command(['codesign', '--force', '--timestamp','--keychain', viewer_keychain, '--sign', identity, libvlc_path]) - self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, cef_path]) - self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, greenlet_path]) - self.run_command(['codesign', '--verbose', '--deep', '--force', '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, slplugin_path]) - self.run_command(['codesign', '--verbose', '--deep', '--force', '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, app_in_dmg]) + sign_attempts-=1; + self.run_command( + # Note: See blurb above about names of keychains + ['codesign', '--verbose', '--deep', '--force', + '--keychain', viewer_keychain, '--sign', identity, + app_in_dmg]) signed=True # if no exception was raised, the codesign worked except ManifestError as err: if sign_attempts: @@ -1318,7 +1321,6 @@ class DarwinManifest(ViewerManifest): print >> sys.stderr, "Maximum codesign attempts exceeded; giving up" raise self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg]) - self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg]) finally: # Unmount the image even if exceptions from any of the above @@ -1371,7 +1373,7 @@ class LinuxManifest(ViewerManifest): with self.prefix(dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") - self.path2basename("../llplugin/slplugin", "SLPlugin") + self.path2basename("../llplugin/slplugin", "SLPlugin") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 with self.prefix(src="../viewer_components/manager", dst=""): self.path("*.py") diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt new file mode 100644 index 0000000000..86aa655f03 --- /dev/null +++ b/indra/win_crash_logger/CMakeLists.txt @@ -0,0 +1,105 @@ +# -*- cmake -*- + +project(win_crash_logger) + +include(00-Common) +include(LLCommon) +include(LLCoreHttp) +include(LLCrashLogger) +include(LLMath) +include(LLMessage) +include(LLVFS) +include(LLWindow) +include(LLXML) +include(Linking) +include(LLSharedLibs) +include(GoogleBreakpad) +include(Boost) + +include_directories( + ${LLCOREHTTP_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${LLCRASHLOGGER_INCLUDE_DIRS} + ${LLMATH_INCLUDE_DIRS} + ${LLWINDOW_INCLUDE_DIRS} + ${LLXML_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} + ${BREAKPAD_INCLUDE_DIRECTORIES} + ) +include_directories(SYSTEM + ${LLCOMMON_SYSTEM_INCLUDE_DIRS} + ${LLXML_SYSTEM_INCLUDE_DIRS} + ) + +set(win_crash_logger_SOURCE_FILES + win_crash_logger.cpp + llcrashloggerwindows.cpp + ) + +set(win_crash_logger_HEADER_FILES + CMakeLists.txt + + llcrashloggerwindows.h + resource.h + StdAfx.h + win_crash_logger.h + ) + +set_source_files_properties(${win_crash_logger_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +set(win_crash_logger_RESOURCE_FILES + ll_icon.ico + ) + +set_source_files_properties(${win_crash_logger_RESOURCE_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +set(win_crash_logger_RESOURCE_FILES + win_crash_logger.rc + ${win_crash_logger_RESOURCE_FILES} + ) + +SOURCE_GROUP("Resource Files" FILES ${win_crash_logger_RESOURCE_FILES}) + +list(APPEND + win_crash_logger_SOURCE_FILES + ${win_crash_logger_HEADER_FILES} + ${win_crash_logger_RESOURCE_FILES} + ) + +add_executable(windows-crash-logger WIN32 ${win_crash_logger_SOURCE_FILES}) + + +target_link_libraries(windows-crash-logger + ${LEGACY_STDIO_LIBS} + ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} + ${LLCRASHLOGGER_LIBRARIES} + ${LLWINDOW_LIBRARIES} + ${LLVFS_LIBRARIES} + ${LLXML_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLMATH_LIBRARIES} + ${LLCOREHTTP_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${BOOST_CONTEXT_LIBRARY} + ${BOOST_FIBER_LIBRARY} + ${WINDOWS_LIBRARIES} + dxguid + ${GOOGLE_PERFTOOLS_LIBRARIES} + user32 + gdi32 + oleaut32 + wininet + Wldap32 + ) + +if (WINDOWS) + set_target_properties(windows-crash-logger + PROPERTIES + LINK_FLAGS "/NODEFAULTLIB:LIBCMT" + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" + ) +endif (WINDOWS) + +ll_deploy_sharedlibs_command(windows-crash-logger) diff --git a/indra/win_crash_logger/StdAfx.cpp b/indra/win_crash_logger/StdAfx.cpp new file mode 100644 index 0000000000..f56711af73 --- /dev/null +++ b/indra/win_crash_logger/StdAfx.cpp @@ -0,0 +1,34 @@ +/** + * @file StdAfx.cpp + * @brief windows crash logger source file for includes + * + * $LicenseInfo:firstyear=2003&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$ + */ + +// stdafx.cpp : source file that includes just the standard includes +// win_crash_logger.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h new file mode 100644 index 0000000000..35976658ac --- /dev/null +++ b/indra/win_crash_logger/StdAfx.h @@ -0,0 +1,56 @@ +/** + * @file StdAfx.h + * @brief standard system includes + * + * $LicenseInfo:firstyear=2003&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$ + */ + +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +// Windows Header Files: +#include + +// C RunTime Header Files +#include +#include +#include + +// Local Header Files + +// TODO: reference additional headers your program requires here + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/indra/win_crash_logger/ll_icon.ico b/indra/win_crash_logger/ll_icon.ico new file mode 100644 index 0000000000..566346dfe3 Binary files /dev/null and b/indra/win_crash_logger/ll_icon.ico differ diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp new file mode 100644 index 0000000000..267224a79b --- /dev/null +++ b/indra/win_crash_logger/llcrashloggerwindows.cpp @@ -0,0 +1,536 @@ +/** +* @file llcrashloggerwindows.cpp +* @brief Windows crash logger implementation +* +* $LicenseInfo:firstyear=2003&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 "linden_common.h" + +#include "stdafx.h" +#include "resource.h" +#include "llcrashloggerwindows.h" + +#include + +#include "boost/tokenizer.hpp" + +#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME +#include "llerror.h" +#include "llfile.h" +#include "lltimer.h" +#include "llstring.h" +#include "lldxhardware.h" +#include "lldir.h" +#include "llsdserialize.h" +#include "llsdutil.h" +#include "stringize.h" + +#include +#include + +#define MAX_LOADSTRING 100 +#define MAX_STRING 2048 +const char* const SETTINGS_FILE_HEADER = "version"; +const S32 SETTINGS_FILE_VERSION = 101; + +// Windows Message Handlers + +// Global Variables: +HINSTANCE hInst= NULL; // current instance +TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text +TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text + +std::string gProductName; +HWND gHwndReport = NULL; // Send/Don't Send dialog +HWND gHwndProgress = NULL; // Progress window +HCURSOR gCursorArrow = NULL; +HCURSOR gCursorWait = NULL; +BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog? +std::stringstream gDXInfo; +bool gSendLogs = false; + +LLCrashLoggerWindows* LLCrashLoggerWindows::sInstance = NULL; + +//Conversion from char* to wchar* +//Replacement for ATL macros, doesn't allocate memory +//For more info see: http://www.codeguru.com/forum/showthread.php?t=337247 +void ConvertLPCSTRToLPWSTR (const char* pCstring, WCHAR* outStr) +{ + if (pCstring != NULL) + { + int nInputStrLen = strlen (pCstring); + // Double NULL Termination + int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2; + if (outStr) + { + memset (outStr, 0x00, sizeof (WCHAR)*nOutputStrLen); + MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, outStr, nInputStrLen); + } + } +} + +void write_debug(const char *str) +{ + gDXInfo << str; /* Flawfinder: ignore */ +} + +void write_debug(std::string& str) +{ + write_debug(str.c_str()); +} + +void show_progress(const std::string& message) +{ + std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message)); + if (gHwndProgress) + { + SendDlgItemMessage(gHwndProgress, // handle to destination window + IDC_LOG, + WM_SETTEXT, // message to send + FALSE, // undo option + (LPARAM)msg.c_str()); + } +} + +void update_messages() +{ + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + exit(0); + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +void sleep_and_pump_messages( U32 seconds ) +{ + const U32 CYCLES_PER_SECOND = 10; + U32 cycles = seconds * CYCLES_PER_SECOND; + while( cycles-- ) + { + update_messages(); + ms_sleep(1000 / CYCLES_PER_SECOND); + } +} + +// Include product name in the window caption. +void LLCrashLoggerWindows::ProcessCaption(HWND hWnd) +{ + TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */ + TCHAR header[MAX_STRING]; + std::string final; + GetWindowText(hWnd, templateText, sizeof(templateText)); + final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str()); + ConvertLPCSTRToLPWSTR(final.c_str(), header); + SetWindowText(hWnd, header); +} + + +// Include product name in the diaog item text. +void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem) +{ + TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */ + TCHAR header[MAX_STRING]; + std::string final; + GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText)); + final = llformat(ll_convert_wide_to_string(templateText, CP_ACP).c_str(), gProductName.c_str()); + ConvertLPCSTRToLPWSTR(final.c_str(), header); + SetDlgItemText(hWnd, nIDDlgItem, header); +} + +bool handle_button_click(WORD button_id) +{ + // Is this something other than Send or Don't Send? + if (button_id != IDOK + && button_id != IDCANCEL) + { + return false; + } + + // We're done with this dialog. + gFirstDialog = FALSE; + + // Send the crash report if requested + if (button_id == IDOK) + { + gSendLogs = TRUE; + WCHAR wbuffer[20000]; + GetDlgItemText(gHwndReport, // handle to dialog box + IDC_EDIT1, // control identifier + wbuffer, // pointer to buffer for text + 20000 // maximum size of string + ); + std::string user_text(ll_convert_wide_to_string(wbuffer, CP_ACP)); + // Activate and show the window. + ShowWindow(gHwndProgress, SW_SHOW); + // Try doing this second to make the progress window go frontmost. + ShowWindow(gHwndReport, SW_HIDE); + ((LLCrashLoggerWindows*)LLCrashLogger::instance())->setUserText(user_text); + ((LLCrashLoggerWindows*)LLCrashLogger::instance())->sendCrashLogs(); + } + // Quit the app + LLApp::setQuitting(); + return true; +} + + +LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) +{ + switch( message ) + { + case WM_CREATE: + return 0; + + case WM_COMMAND: + if( gFirstDialog ) + { + WORD button_id = LOWORD(wParam); + bool handled = handle_button_click(button_id); + if (handled) + { + return 0; + } + } + break; + + case WM_DESTROY: + // Closing the window cancels + LLApp::setQuitting(); + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hwnd, message, wParam, lParam); +} + + +LLCrashLoggerWindows::LLCrashLoggerWindows(void) +{ + if (LLCrashLoggerWindows::sInstance==NULL) + { + sInstance = this; + } +} + +LLCrashLoggerWindows::~LLCrashLoggerWindows(void) +{ + sInstance = NULL; +} + +bool LLCrashLoggerWindows::getMessageWithTimeout(MSG *msg, UINT to) +{ + bool res; + UINT_PTR timerID = SetTimer(NULL, NULL, to, NULL); + res = GetMessage(msg, NULL, 0, 0); + KillTimer(NULL, timerID); + if (!res) + return false; + if (msg->message == WM_TIMER && msg->hwnd == NULL && msg->wParam == 1) + return false; //TIMEOUT! You could call SetLastError() or something... + return true; +} + +int LLCrashLoggerWindows::processingLoop() { + const int millisecs=1000; + int retries = 0; + const int max_retries = 60; + + LL_DEBUGS("CRASHREPORT") << "Entering processing loop for OOP server" << LL_ENDL; + + LLSD options = getOptionData( LLApp::PRIORITY_COMMAND_LINE ); + + MSG msg; + + bool result; + + while (1) + { + result = getMessageWithTimeout(&msg, millisecs); + if ( result ) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + if ( retries < max_retries ) //Wait up to 1 minute for the viewer to say hello. + { + if (mClientsConnected == 0) + { + LL_DEBUGS("CRASHREPORT") << "Waiting for client to connect." << LL_ENDL; + ++retries; + } + else + { + LL_INFOS("CRASHREPORT") << "Client has connected!" << LL_ENDL; + retries = max_retries; + } + } + else + { + if (mClientsConnected == 0) + { + break; + } + if (!mKeyMaster.isProcessAlive(mPID, mProcName) ) + { + break; + } + } + } + + LL_INFOS() << "session ending.." << LL_ENDL; + + std::string per_run_dir = options["dumpdir"].asString(); + std::string per_run_file = per_run_dir + "\\SecondLife.log"; + std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log"); + + if (gDirUtilp->fileExists(per_run_dir)) + { + LL_INFOS ("CRASHREPORT") << "Copying " << log_file << " to " << per_run_file << LL_ENDL; + LLFile::copy(log_file, per_run_file); + } + return 0; +} + + +void LLCrashLoggerWindows::OnClientConnected(void* context, + const google_breakpad::ClientInfo* client_info) +{ + sInstance->mClientsConnected++; + LL_INFOS("CRASHREPORT") << "Client connected. pid = " << client_info->pid() << " total clients " << sInstance->mClientsConnected << LL_ENDL; +} + +void LLCrashLoggerWindows::OnClientExited(void* context, + const google_breakpad::ClientInfo* client_info) +{ + sInstance->mClientsConnected--; + LL_INFOS("CRASHREPORT") << "Client disconnected. pid = " << client_info->pid() << " total clients " << sInstance->mClientsConnected << LL_ENDL; +} + + +void LLCrashLoggerWindows::OnClientDumpRequest(void* context, + const google_breakpad::ClientInfo* client_info, + const std::wstring* file_path) +{ + if (!file_path) + { + LL_WARNS() << "dump with no file path" << LL_ENDL; + return; + } + if (!client_info) + { + LL_WARNS() << "dump with no client info" << LL_ENDL; + return; + } + + LLCrashLoggerWindows* self = static_cast(context); + if (!self) + { + LL_WARNS() << "dump with no context" << LL_ENDL; + return; + } + + //DWORD pid = client_info->pid(); +} + + +bool LLCrashLoggerWindows::initCrashServer() +{ + //For Breakpad on Windows we need a full Out of Process service to get good data. + //This routine starts up the service on a named pipe that the viewer will then + //communicate with. + using namespace google_breakpad; + + LLSD options = getOptionData( LLApp::PRIORITY_COMMAND_LINE ); + std::string dump_path = options["dumpdir"].asString(); + mClientsConnected = 0; + mPID = options["pid"].asInteger(); + mProcName = options["procname"].asString(); + + //Generate a quasi-uniq name for the named pipe. For our purposes + //this is unique-enough with least hassle. Worst case for duplicate name + //is a second instance of the viewer will not do crash reporting. + std::wstring wpipe_name; + wpipe_name = mCrashReportPipeStr + std::wstring(wstringize(mPID)); + + std::wstring wdump_path(utf8str_to_utf16str(dump_path)); + + //Pipe naming conventions: http://msdn.microsoft.com/en-us/library/aa365783%28v=vs.85%29.aspx + mCrashHandler = new CrashGenerationServer( wpipe_name, + NULL, + &LLCrashLoggerWindows::OnClientConnected, this, + /*NULL, NULL, */ &LLCrashLoggerWindows::OnClientDumpRequest, this, + &LLCrashLoggerWindows::OnClientExited, this, + NULL, NULL, + true, &wdump_path); + + if (!mCrashHandler) { + //Failed to start the crash server. + LL_WARNS() << "Failed to init crash server." << LL_ENDL; + return false; + } + + // Start servicing clients. + if (!mCrashHandler->Start()) { + LL_WARNS() << "Failed to start crash server." << LL_ENDL; + return false; + } + + LL_INFOS("CRASHREPORT") << "Initialized OOP server with pipe named " << stringize(wpipe_name) << LL_ENDL; + return true; +} + +bool LLCrashLoggerWindows::init(void) +{ + bool ok = LLCrashLogger::init(); + if(!ok) return false; + + initCrashServer(); + + /* + mbstowcs( gProductName, mProductName.c_str(), LL_ARRAY_SIZE(gProductName) ); + gProductName[ LL_ARRY_SIZE(gProductName) - 1 ] = 0; + swprintf(gProductName, L"Second Life"); + */ + + LL_INFOS() << "Loading dialogs" << LL_ENDL; + + // Initialize global strings + LoadString(mhInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); + LoadString(mhInst, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING); + + gCursorArrow = LoadCursor(NULL, IDC_ARROW); + gCursorWait = LoadCursor(NULL, IDC_WAIT); + + // Register a window class that will be used by our dialogs + WNDCLASS wndclass; + wndclass.style = CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = WndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = DLGWINDOWEXTRA; // Required, since this is used for dialogs! + wndclass.hInstance = mhInst; + wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) ); + wndclass.hCursor = gCursorArrow; + wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1); + wndclass.lpszMenuName = NULL; + wndclass.lpszClassName = szWindowClass; + RegisterClass( &wndclass ); + + return true; +} + +void LLCrashLoggerWindows::gatherPlatformSpecificFiles() +{ + updateApplication("Gathering hardware information. App may appear frozen."); + // DX hardware probe blocks, so we can't cancel during it + //Generate our dx_info.log file + SetCursor(gCursorWait); + // At this point we're responsive enough the user could click the close button + SetCursor(gCursorArrow); + //mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo(); //Not initialized. +} + +bool LLCrashLoggerWindows::frame() +{ + LL_INFOS() << "CrashSubmitBehavior is " << mCrashBehavior << LL_ENDL; + + // Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529 + // win_crash_logger.rc has been edited by hand. + // Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass) + gProductName = mProductName; + gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL); + ProcessCaption(gHwndProgress); + ShowWindow(gHwndProgress, SW_HIDE ); + + if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) + { + LL_INFOS() << "Showing crash report submit progress window." << LL_ENDL; + //ShowWindow(gHwndProgress, SW_SHOW ); Maint-5707 + sendCrashLogs(); + } + else if (mCrashBehavior == CRASH_BEHAVIOR_ASK) + { + gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL); + // Ignore result + (void) SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_SETCHECK, 0, 0); + // Include the product name in the caption and various dialog items. + ProcessCaption(gHwndReport); + ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG); + + // Update the header to include whether or not we crashed on the last run. + std::string headerStr; + TCHAR header[MAX_STRING]; + if (mCrashInPreviousExec) + { + headerStr = llformat("%s appears to have crashed or frozen the last time it ran.", mProductName.c_str()); + } + else + { + headerStr = llformat("%s appears to have crashed.", mProductName.c_str()); + } + ConvertLPCSTRToLPWSTR(headerStr.c_str(), header); + SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header); + ShowWindow(gHwndReport, SW_SHOW ); + + MSG msg; + memset(&msg, 0, sizeof(msg)); + while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return true; // msg.wParam; + } + else + { + LL_WARNS() << "Unknown crash behavior " << mCrashBehavior << LL_ENDL; + return true; // 1; + } + return true; // 0; +} + +void LLCrashLoggerWindows::updateApplication(const std::string& message) +{ + LLCrashLogger::updateApplication(message); + if(!message.empty()) show_progress(message); + update_messages(); +} + +bool LLCrashLoggerWindows::cleanup() +{ + if(gSendLogs) + { + if(mSentCrashLogs) show_progress("Done"); + else show_progress("Could not connect to servers, logs not sent"); + sleep_and_pump_messages(3); + } + PostQuitMessage(0); + commonCleanup(); + mKeyMaster.releaseMaster(); + return true; +} + diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h new file mode 100644 index 0000000000..f89b8708dc --- /dev/null +++ b/indra/win_crash_logger/llcrashloggerwindows.h @@ -0,0 +1,86 @@ +/** +* @file llcrashloggerwindows.h +* @brief Windows crash logger definition +* +* $LicenseInfo:firstyear=2003&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$ +*/ + +#ifndef LLCRASHLOGGERWINDOWS_H +#define LLCRASHLOGGERWINDOWS_H + +#include "llcrashlogger.h" +#include "windows.h" +#include "llstring.h" + +class LLSD; + +namespace google_breakpad { + class CrashGenerationServer; + class ClientInfo; +} + +class LLCrashLoggerWindows : public LLCrashLogger +{ +public: + LLCrashLoggerWindows(void); + ~LLCrashLoggerWindows(void); + static LLCrashLoggerWindows* sInstance; + + virtual bool init(); + virtual bool frame(); + virtual void updateApplication(const std::string& message = LLStringUtil::null); + virtual bool cleanup(); + virtual void gatherPlatformSpecificFiles(); + void setHandle(HINSTANCE hInst) { mhInst = hInst; } + int clients_connected() const { + return mClientsConnected; + } + bool getMessageWithTimeout(MSG *msg, UINT to); + + // Starts the processing loop. This function does not return unless the + // user is logging off or the user closes the crash service window. The + // return value is a good number to pass in ExitProcess(). + int processingLoop(); +private: + void ProcessDlgItemText(HWND hWnd, int nIDDlgItem); + void ProcessCaption(HWND hWnd); + bool initCrashServer(); + google_breakpad::CrashGenerationServer* mCrashHandler; + static void OnClientConnected(void* context, + const google_breakpad::ClientInfo* client_info); + + static void OnClientDumpRequest( + void* context, + const google_breakpad::ClientInfo* client_info, + const std::wstring* file_path); + + static void OnClientExited(void* context, + const google_breakpad::ClientInfo* client_info); + int mClientsConnected; + int mPID; + std::string mProcName; + + HINSTANCE mhInst; + +}; + +#endif diff --git a/indra/win_crash_logger/resource.h b/indra/win_crash_logger/resource.h new file mode 100644 index 0000000000..37a387275e --- /dev/null +++ b/indra/win_crash_logger/resource.h @@ -0,0 +1,63 @@ +/** +* @file resource.h +* @brief Windows crash logger windows resources +* +* $LicenseInfo:firstyear=2003&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$ +*/ + +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by win_crash_logger.rc +// +#define IDC_MYICON 2 +#define IDD_REPORT 9 +#define IDD_WIN_CRASH_LOGGER_DIALOG 102 +#define IDD_ABOUTBOX 103 +#define IDS_APP_TITLE 103 +#define IDM_ABOUT 104 +#define IDM_EXIT 105 +#define IDS_HELLO 106 +#define IDI_WIN_CRASH_LOGGER 107 +#define IDI_SMALL 108 +#define IDC_WIN_CRASH_LOGGER 109 +#define IDR_MAINFRAME 128 +#define IDD_PROGRESS 129 +#define IDD_PREVREPORTBOX 130 +#define IDC_EDIT1 1000 +#define IDC_LOG 1004 +#define IDC_CHECK_AUTO 1006 +#define IDC_STATIC_HEADER 1007 +#define IDC_STATIC_WHATINFO 1008 +#define IDC_STATIC_MOTIVATION 1009 +#define IDC_STATIC_MSG 1010 +#define IDC_STATIC -1 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 131 +#define _APS_NEXT_COMMAND_VALUE 32771 +#define _APS_NEXT_CONTROL_VALUE 1011 +#define _APS_NEXT_SYMED_VALUE 110 +#endif +#endif diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp new file mode 100644 index 0000000000..58746eba02 --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.cpp @@ -0,0 +1,70 @@ +/** + * @file win_crash_logger.cpp + * @brief Windows crash logger implementation + * + * $LicenseInfo:firstyear=2003&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 "linden_common.h" +#include "stdafx.h" +#include +#include "llcrashloggerwindows.h" + +#ifdef _UNICODE +int APIENTRY wWinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPWSTR lpCmdLine, + int nCmdShow) +#else +int APIENTRY WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) +#endif //_UNICODE +{ + LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL; + LLCrashLoggerWindows app; + app.setHandle(hInstance); +#ifdef _UNICODE + app.parseCommandOptions(__argc, __wargv); +#else + app.parseCommandOptions(__argc, __argv); +#endif //_UNICODE + + LLSD options = LLApp::instance()->getOptionData( + LLApp::PRIORITY_COMMAND_LINE); + if (!(options.has("pid") && options.has("dumpdir"))) + { + LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL; + } + if (! app.init()) + { + LL_WARNS() << "Unable to initialize application." << LL_ENDL; + return -1; + } + + app.processingLoop(); + app.frame(); + app.cleanup(); + LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; + return 0; +} diff --git a/indra/win_crash_logger/win_crash_logger.h b/indra/win_crash_logger/win_crash_logger.h new file mode 100644 index 0000000000..2cc2cf3dcf --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.h @@ -0,0 +1,38 @@ +/** + * @file win_crash_logger.h + * @brief Windows crash logger project includes + * + * $LicenseInfo:firstyear=2003&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$ + */ + + +#if !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) +#define AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +#include "resource.h" + + +#endif // !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) diff --git a/indra/win_crash_logger/win_crash_logger.ico b/indra/win_crash_logger/win_crash_logger.ico new file mode 100644 index 0000000000..386883523b Binary files /dev/null and b/indra/win_crash_logger/win_crash_logger.ico differ diff --git a/indra/win_crash_logger/win_crash_logger.rc b/indra/win_crash_logger/win_crash_logger.rc new file mode 100755 index 0000000000..2819722f63 --- /dev/null +++ b/indra/win_crash_logger/win_crash_logger.rc @@ -0,0 +1,188 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#define APSTUDIO_HIDDEN_SYMBOLS +#include "windows.h" +#undef APSTUDIO_HIDDEN_SYMBOLS +#include "resource.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_WIN_CRASH_LOGGER ICON "ll_icon.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +IDC_WIN_CRASH_LOGGER MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "E&xit", IDM_EXIT + END + POPUP "&Help" + BEGIN + MENUITEM "&About ...", IDM_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_PROGRESS DIALOGEX 100, 100, 234, 33 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + LTEXT "Static",IDC_LOG,7,7,220,8 +END + +IDD_REPORT DIALOGEX 100, 100, 297, 125 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP + PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP + LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288,14 + LTEXT "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.",IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP + CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 + LTEXT "Sending crash reports is the best way to help us improve the quality of %s.",IDC_STATIC_MOTIVATION,4,43,288,8 + LTEXT "If you continue to experience this problem, please try:",IDC_STATIC,4,57,251,8 + LTEXT "- Contacting support by visiting http://www.secondlife.com/support",IDC_STATIC,4,67,231,8 +END + +IDD_PREVREPORTBOX DIALOGEX 100, 100, 232, 213 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU +CAPTION "%s Crash Logger" +CLASS "WIN_CRASH_LOGGER" +FONT 8, "MS Sans Serif", 0, 0, 0x0 +BEGIN + DEFPUSHBUTTON "Send Report",IDOK,131,193,45,15,WS_GROUP + EDITTEXT IDC_EDIT1,3,100,223,89,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL + PUSHBUTTON "Don't Send",IDCANCEL,181,193,45,15,WS_GROUP + LTEXT "%s appears to have crashed or frozen the last time it ran.",IDC_STATIC_HEADER,4,4,214,8 + LTEXT "This crash reporter collects information about your computer's",IDC_STATIC,4,17,201,8 + LTEXT "hardware configuration, operating system, and some %s",IDC_STATIC_MSG,4,25,212,8 + LTEXT "logs, all of which are used for debugging purposes only.",IDC_STATIC,4,33,210,8 + LTEXT "In the space below, please briefly describe what you were doing",IDC_STATIC,3,48,208,8 + LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3,56,204,8 + LTEXT "If you don't wish to send Linden Lab a crash report, press Don't Send.",IDC_STATIC,3,90,223,8 + LTEXT "This report is NOT read by customer support. If you have billing or",IDC_STATIC,3,68,208,8 + LTEXT "other questions, please go to: www.secondlife.com/support",IDC_STATIC,3,76,206,8 + CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,193,89,13 +END + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +2 TEXTINCLUDE +BEGIN + "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""windows.h""\r\n" + "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" + "#include ""resource.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_PROGRESS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 227 + TOPMARGIN, 7 + BOTTOMMARGIN, 26 + END + + IDD_REPORT, DIALOG + BEGIN + RIGHTMARGIN, 292 + VERTGUIDE, 4 + BOTTOMMARGIN, 119 + HORZGUIDE, 4 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE +BEGIN + IDS_APP_TITLE "win_crash_logger" + IDS_HELLO "Hello World!" + IDC_WIN_CRASH_LOGGER "WIN_CRASH_LOGGER" +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + -- cgit v1.3 From d358cca943f48a443e89630944383cb049ad9ef1 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 9 Jun 2021 00:27:17 +0300 Subject: SL-15365 LLCoros::launch crash Superficially looks like an out of memory crash, redirect allocation failures into LL_ERRS. --- indra/llcommon/llcoros.cpp | 27 ++++++++++++++++++-------- indra/newview/llavatarrenderinfoaccountant.cpp | 2 ++ 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 23419a52a7..e2ed0b0c16 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -236,14 +236,25 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl // protected_fixedsize_stack sets a guard page past the end of the new // stack so that stack underflow will result in an access violation // instead of weird, subtle, possibly undiagnosed memory stomps. - boost::fibers::fiber newCoro(boost::fibers::launch::dispatch, - std::allocator_arg, - boost::fibers::protected_fixedsize_stack(mStackSize), - [this, &name, &callable](){ toplevel(name, callable); }); - // You have two choices with a fiber instance: you can join() it or you - // can detach() it. If you try to destroy the instance before doing - // either, the program silently terminates. We don't need this handle. - newCoro.detach(); + + try + { + boost::fibers::fiber newCoro(boost::fibers::launch::dispatch, + std::allocator_arg, + boost::fibers::protected_fixedsize_stack(mStackSize), + [this, &name, &callable]() { toplevel(name, callable); }); + + // You have two choices with a fiber instance: you can join() it or you + // can detach() it. If you try to destroy the instance before doing + // either, the program silently terminates. We don't need this handle. + newCoro.detach(); + } + catch (std::bad_alloc&) + { + // Out of memory on stack allocation? + LL_ERRS("LLCoros") << "Bad memory allocation in LLCoros::launch(" << prefix << ")!" << LL_ENDL; + } + return name; } diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index ca83afb5ab..04dbf03e31 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -345,6 +345,8 @@ void LLAvatarRenderInfoAccountant::idle() && regionp->capabilitiesReceived()) { // each of these is further governed by and resets its own timer + // Note: We can have multiple regions, each launches up to two coroutines, + // it likely is expensive sendRenderInfoToRegion(regionp); getRenderInfoFromRegion(regionp); } -- cgit v1.3 From a9b82b9d89aa3d0460d142fc520bc6a8ba79574e Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 11 Jun 2021 17:06:50 -0400 Subject: SL-15393: Use non-overloaded name for function returning LLSD&. --- indra/llcommon/lleventcoro.cpp | 2 +- indra/llcommon/llsdutil.cpp | 7 ++++--- indra/llcommon/llsdutil.h | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/lleventcoro.cpp b/indra/llcommon/lleventcoro.cpp index 995356dc52..067b5e6fbc 100644 --- a/indra/llcommon/lleventcoro.cpp +++ b/indra/llcommon/lleventcoro.cpp @@ -101,7 +101,7 @@ void storeToLLSDPath(LLSD& dest, const LLSD& path, const LLSD& value) } // Drill down to where we should store 'value'. - llsd::drill(dest, path) = value; + llsd::drill_ref(dest, path) = value; } } // anonymous diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp index eb3a96b133..fc10fcece3 100644 --- a/indra/llcommon/llsdutil.cpp +++ b/indra/llcommon/llsdutil.cpp @@ -29,6 +29,7 @@ #include "linden_common.h" #include "llsdutil.h" +#include #if LL_WINDOWS # define WIN32_LEAN_AND_MEAN @@ -862,7 +863,7 @@ bool llsd_equals(const LLSD& lhs, const LLSD& rhs, int bits) namespace llsd { -LLSD& drill(LLSD& blob, const LLSD& rawPath) +LLSD& drill_ref(LLSD& blob, const LLSD& rawPath) { // Treat rawPath uniformly as an array. If it's not already an array, // store it as the only entry in one. (But let's say Undefined means an @@ -917,9 +918,9 @@ LLSD& drill(LLSD& blob, const LLSD& rawPath) LLSD drill(const LLSD& blob, const LLSD& path) { - // non-const drill() does exactly what we want. Temporarily cast away + // drill_ref() does exactly what we want. Temporarily cast away // const-ness and use that. - return drill(const_cast(blob), path); + return drill_ref(const_cast(blob), path); } } // namespace llsd diff --git a/indra/llcommon/llsdutil.h b/indra/llcommon/llsdutil.h index 8678ca97f2..1321615805 100644 --- a/indra/llcommon/llsdutil.h +++ b/indra/llcommon/llsdutil.h @@ -184,10 +184,10 @@ namespace llsd * - Anything else is an error. * * By implication, if path.isUndefined() or otherwise equivalent to an empty - * LLSD::Array, drill() returns 'blob' as is. + * LLSD::Array, drill[_ref]() returns 'blob' as is. */ LLSD drill(const LLSD& blob, const LLSD& path); -LLSD& drill( LLSD& blob, const LLSD& path); +LLSD& drill_ref( LLSD& blob, const LLSD& path); } -- cgit v1.3 From ab3261f901d34fab154c63edd3248c6231dc0798 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 14 Sep 2021 18:30:57 +0300 Subject: SL-15997 Windows 11 version detection --- indra/llcommon/llsys.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 4e61fb8a58..94f669b0f9 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -140,7 +140,13 @@ LLOSInfo::LLOSInfo() : #if LL_WINDOWS - if (IsWindowsVersionOrGreater(10, 0, 0)) + if (IsWindowsVersionOrGreater(11, 0, 0)) + { + mMajorVer = 11; + mMinorVer = 0; + mOSStringSimple = "Microsoft Windows 11 "; + } + else if (IsWindows10OrGreater()) { mMajorVer = 10; mMinorVer = 0; -- cgit v1.3 From 96d7cd29f636fa570498b7fa4b71eabc4e1923eb Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 15 Sep 2021 22:31:02 +0300 Subject: SL-16004 Fix bugsplat displaying wrong top function bugsplat shows KERNELBASE!RaiseException and flush() insread of forceErrorLLError, function crashes too early. --- indra/llcommon/llerror.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 8355df9045..b45411ad9d 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -1397,7 +1397,10 @@ namespace LLError if (site.mLevel == LEVEL_ERROR) { g->mFatalMessage = message; - s->mCrashFunction(message); + if (s->mCrashFunction) + { + s->mCrashFunction(message); + } } } } -- cgit v1.3 From 4be6981c6d8eefb28383358b7a0beaeca8100a0d Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 19 Oct 2021 00:41:19 +0300 Subject: SL-15964 Fix gzip failing to compress files into unicode paths --- indra/llcommon/llsys.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 94f669b0f9..e94973ac29 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -1261,7 +1261,12 @@ BOOL gunzip_file(const std::string& srcfile, const std::string& dstfile) LLFILE *dst = NULL; S32 bytes = 0; tmpfile = dstfile + ".t"; - src = gzopen(srcfile.c_str(), "rb"); +#ifdef LL_WINDOWS + llutf16string utf16filename = utf8str_to_utf16str(srcfile); + src = gzopen_w(utf16filename.c_str(), "rb"); +#else + src = gzopen(srcfile.c_str(), "rb"); +#endif if (! src) goto err; dst = LLFile::fopen(tmpfile, "wb"); /* Flawfinder: ignore */ if (! dst) goto err; @@ -1295,7 +1300,14 @@ BOOL gzip_file(const std::string& srcfile, const std::string& dstfile) LLFILE *src = NULL; S32 bytes = 0; tmpfile = dstfile + ".t"; - dst = gzopen(tmpfile.c_str(), "wb"); /* Flawfinder: ignore */ + +#ifdef LL_WINDOWS + llutf16string utf16filename = utf8str_to_utf16str(tmpfile); + dst = gzopen_w(utf16filename.c_str(), "wb"); +#else + dst = gzopen(tmpfile.c_str(), "wb"); +#endif + if (! dst) goto err; src = LLFile::fopen(srcfile, "rb"); /* Flawfinder: ignore */ if (! src) goto err; -- cgit v1.3 From 1b5d151c156f0528e58c02b494d4b515ea9cb11c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 20 Oct 2021 23:57:48 +0300 Subject: SL-15997 Windows 11 detection --- indra/llcommon/llsys.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index e94973ac29..4fe5b6bf20 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -140,13 +140,7 @@ LLOSInfo::LLOSInfo() : #if LL_WINDOWS - if (IsWindowsVersionOrGreater(11, 0, 0)) - { - mMajorVer = 11; - mMinorVer = 0; - mOSStringSimple = "Microsoft Windows 11 "; - } - else if (IsWindows10OrGreater()) + if (IsWindows10OrGreater()) { mMajorVer = 10; mMinorVer = 0; @@ -279,6 +273,21 @@ LLOSInfo::LLOSInfo() : ubr = data; } } + + if (mBuild >= 22000) + { + // At release Windows 11 version was 10.0.22000.194 + // Windows 10 version was 10.0.19043.1266 + // There is no warranty that Win10 build won't increase, + // so until better solution is found or Microsoft updates + // SDK with IsWindows11OrGreater(), indicate "10/11" + // + // Current alternatives: + // Query WMI's Win32_OperatingSystem for OS string. Slow + // and likely to return 'compatibility' string. + // Check presence of dlls/libs or may be their version. + mOSStringSimple = "Microsoft Windows 10/11"; + } } mOSString = mOSStringSimple; -- cgit v1.3 From 98d96f0dea03d96b5be2947d05cd3cb55950afc6 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 2 Nov 2021 22:45:42 +0200 Subject: Manually resolving conflicts after merge with DRTVWR-520 This reverts commit 0a745b47880fb16b1db8cd3327377a383dbfe6a8. --- autobuild.xml | 344 +- indra/cmake/CEFPlugin.cmake | 4 +- indra/cmake/CMakeLists.txt | 2 - indra/cmake/Copy3rdPartyLibs.cmake | 12 +- indra/cmake/FindGoogleBreakpad.cmake | 40 - indra/cmake/GoogleBreakpad.cmake | 22 - indra/cmake/OpenSSL.cmake | 2 +- indra/llcommon/CMakeLists.txt | 3 - indra/llcommon/llapp.cpp | 243 +- indra/llcommon/llapp.h | 8 - indra/llcorehttp/CMakeLists.txt | 1 - indra/llcorehttp/httpcommon.cpp | 58 - indra/llmessage/llblowfishcipher.cpp | 28 +- indra/mac_crash_logger/CMakeLists.txt | 95 - indra/mac_crash_logger/CrashReporter.nib | Bin 32286 -> 0 bytes indra/mac_crash_logger/CrashReporter.xib | 3895 -------------------- indra/mac_crash_logger/Info.plist | 28 - indra/mac_crash_logger/llcrashloggermac.cpp | 91 - indra/mac_crash_logger/llcrashloggermac.h | 45 - indra/mac_crash_logger/llcrashloggermacdelegate.h | 52 - indra/mac_crash_logger/llcrashloggermacdelegate.mm | 75 - indra/mac_crash_logger/mac_crash_logger.cpp | 58 - indra/media_plugins/libvlc/media_plugin_libvlc.cpp | 5 + indra/newview/CMakeLists.txt | 8 +- indra/newview/generate_breakpad_symbols.py | 166 - indra/newview/llappviewer.cpp | 2 +- indra/newview/llappviewer.h | 1 - indra/newview/llappviewermacosx.h | 1 - indra/newview/llappviewerwin32.cpp | 54 - indra/newview/llsecapi.h | 2 +- indra/newview/llsechandler_basic.cpp | 48 +- indra/newview/llsechandler_basic.h | 4 +- indra/newview/tests/llsecapi_test.cpp | 2 +- indra/newview/tests/llsechandler_basic_test.cpp | 32 +- indra/newview/viewer_manifest.py | 40 +- indra/win_crash_logger/CMakeLists.txt | 105 - indra/win_crash_logger/StdAfx.cpp | 34 - indra/win_crash_logger/StdAfx.h | 56 - indra/win_crash_logger/ll_icon.ico | Bin 2238 -> 0 bytes indra/win_crash_logger/llcrashloggerwindows.h | 86 - indra/win_crash_logger/resource.h | 63 - indra/win_crash_logger/win_crash_logger.cpp | 70 - indra/win_crash_logger/win_crash_logger.h | 38 - indra/win_crash_logger/win_crash_logger.ico | Bin 1078 -> 0 bytes indra/win_crash_logger/win_crash_logger.rc | 188 - 45 files changed, 243 insertions(+), 5868 deletions(-) delete mode 100644 indra/cmake/FindGoogleBreakpad.cmake delete mode 100644 indra/cmake/GoogleBreakpad.cmake delete mode 100644 indra/mac_crash_logger/CMakeLists.txt delete mode 100755 indra/mac_crash_logger/CrashReporter.nib delete mode 100755 indra/mac_crash_logger/CrashReporter.xib delete mode 100644 indra/mac_crash_logger/Info.plist delete mode 100644 indra/mac_crash_logger/llcrashloggermac.cpp delete mode 100644 indra/mac_crash_logger/llcrashloggermac.h delete mode 100644 indra/mac_crash_logger/llcrashloggermacdelegate.h delete mode 100644 indra/mac_crash_logger/llcrashloggermacdelegate.mm delete mode 100644 indra/mac_crash_logger/mac_crash_logger.cpp delete mode 100755 indra/newview/generate_breakpad_symbols.py delete mode 100644 indra/win_crash_logger/CMakeLists.txt delete mode 100644 indra/win_crash_logger/StdAfx.cpp delete mode 100644 indra/win_crash_logger/StdAfx.h delete mode 100644 indra/win_crash_logger/ll_icon.ico delete mode 100644 indra/win_crash_logger/llcrashloggerwindows.h delete mode 100644 indra/win_crash_logger/resource.h delete mode 100644 indra/win_crash_logger/win_crash_logger.cpp delete mode 100644 indra/win_crash_logger/win_crash_logger.h delete mode 100644 indra/win_crash_logger/win_crash_logger.ico delete mode 100755 indra/win_crash_logger/win_crash_logger.rc (limited to 'indra/llcommon') diff --git a/autobuild.xml b/autobuild.xml index d62a00fab9..05af33a300 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -76,9 +76,9 @@ archive hash - 9b8bcc3be6dbe40a04c9c81c313f70dc + b6357ef3a0ec37877a5831820f25094e url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80557/759704/apr_suite-1.4.5.558565-darwin64-558565.tar.bz2 name darwin64 @@ -112,9 +112,9 @@ archive hash - 6bdf460c18ee004b41a46afc80041a92 + cb48ac069440f6dcd564cfa9fd02a4c2 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80556/759710/apr_suite-1.4.5.558565-windows-558565.tar.bz2 name windows @@ -124,16 +124,16 @@ archive hash - 83104bfa4dabb77cd70d185e38a95b49 + 646dc3828d9c39fb1e77c4eec44ed739 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80555/759709/apr_suite-1.4.5.558565-windows64-558565.tar.bz2 name windows64 version - 1.4.5.548882 + 1.4.5.558565 boost @@ -166,9 +166,9 @@ archive hash - 3cc73623c9a976b4f8346a3837f7a916 + 35cc090d942b85c9126ceac9912d52d6 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64088/601256/boost-1.72-darwin64-545361.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78585/744021/boost-1.72-darwin64-557045.tar.bz2 name darwin64 @@ -202,9 +202,9 @@ archive hash - 7d4b2511976449e9a4ec7be41dc8310f + 9aa4ce32df5f5e36124c990e2d77b885 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64092/601270/boost-1.72-windows-545361.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78586/743982/boost-1.72-windows-557045.tar.bz2 name windows @@ -214,9 +214,9 @@ archive hash - 4ad8df0700745201cddf6b71d7b0949f + a79511c9d8b956767ebaa405155d4238 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64091/601265/boost-1.72-windows64-545361.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78584/743961/boost-1.72-windows64-557045.tar.bz2 name windows64 @@ -308,9 +308,9 @@ archive hash - 02e6a8207dcdaf243dcb6da19b8c3534 + 1d063cf1783e7788f17486c234adb1db url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64099/601302/colladadom-2.3.545362-darwin64-545362.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78635/744249/colladadom-2.3.557064-darwin64-557064.tar.bz2 name darwin64 @@ -344,9 +344,9 @@ archive hash - 8a02a10fc69c8f504dc5335644db184a + e78ecf919eee01567556787c3a358d15 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64104/601313/colladadom-2.3.545362-windows-545362.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78637/744269/colladadom-2.3.557064-windows-557064.tar.bz2 name windows @@ -356,16 +356,16 @@ archive hash - 742180324fca7ab92b6a61a36aab4f9d + 7e63a212c8909a25236138422fe01298 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64103/601314/colladadom-2.3.545362-windows64-545362.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78636/744273/colladadom-2.3.557064-windows64-557064.tar.bz2 name windows64 version - 2.3.545362 + 2.3.557064 curl @@ -398,9 +398,9 @@ archive hash - f5ae57117a6518d11f49ccfbfbe0969d + 13f74f43a6363ec998569f731fd869c5 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64131/601402/curl-7.54.1.545369-darwin64-545369.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82637/774617/curl-7.54.1.560191-darwin64-560191.tar.bz2 name darwin64 @@ -434,11 +434,11 @@ archive hash - 2796ae7b09e730a55ac03f74ed669520 + 0df99bd685dc3561ca8ea347b2921987 hash_algorithm md5 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64130/601396/curl-7.54.1.545369-windows-545369.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82639/774610/curl-7.54.1.560191-windows-560191.tar.bz2 name windows @@ -448,16 +448,16 @@ archive hash - a8f96e5cdb8128b23d49ff4c3f2233a4 + 50db2a9e6b74ec4b0c38b1ea8f135735 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64129/601382/curl-7.54.1.545369-windows64-545369.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82638/774608/curl-7.54.1.560191-windows64-560191.tar.bz2 name windows64 version - 7.54.1.545369 + 7.54.1.560191 db @@ -670,9 +670,9 @@ archive hash - 3656b7f7b655cb267fd94f089d2e145c + f4e80e0dfcab713a3da90cd8f7f23e7b url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54860/510198/expat-2.1.1.538990-darwin64-538990.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76341/727265/expat-2.1.1.555519-darwin64-555519.tar.bz2 name darwin64 @@ -706,9 +706,9 @@ archive hash - c509f8afa1e02f4c16232cce7f6855f8 + cd4fe03473076c324d80ae3bd91a85bb url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55056/512080/expat-2.1.1.538990-windows-538990.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76343/727273/expat-2.1.1.555519-windows-555519.tar.bz2 name windows @@ -718,16 +718,16 @@ archive hash - aba97cfdf44c04dbfcac89c7cb472580 + d2d74d73b914150982b1883a3b96e60b url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55054/512068/expat-2.1.1.538990-windows64-538990.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76344/727279/expat-2.1.1.555519-windows64-555519.tar.bz2 name windows64 version - 2.1.1.538990 + 2.1.1.555519 fmodstudio @@ -880,9 +880,9 @@ archive hash - 81a2e9aca3e33c4eecf0081854540b07 + 3a478d6c8a10d49d9161ef864394b03c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56309/526711/freetype-2.4.4.539865-darwin64-539865.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78592/744013/freetype-2.4.4.557047-darwin64-557047.tar.bz2 name darwin64 @@ -916,9 +916,9 @@ archive hash - 1d1c7b60f71a5152ced60bee87f5bba8 + 7ee200d6b5fa282c7f973ade5615aa86 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56312/526734/freetype-2.4.4.539865-windows-539865.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78594/744011/freetype-2.4.4.557047-windows-557047.tar.bz2 name windows @@ -928,16 +928,16 @@ archive hash - 53e78d4a607e959637e98a82a3cf5bea + 69307aaba16ac71531c9c4d930ace993 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56310/526723/freetype-2.4.4.539865-windows64-539865.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78593/744010/freetype-2.4.4.557047-windows64-557047.tar.bz2 name windows64 version - 2.4.4.539865 + 2.4.4.557047 glext @@ -1078,9 +1078,9 @@ archive hash - 343913fe1434da228c2210c23d2e3a1a + a9eaa005ff9d387f946283fbcb69b3c8 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54850/510134/glod-1.0pre3.538980-darwin64-538980.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76353/727324/glod-1.0pre3.555522-darwin64-555522.tar.bz2 name darwin64 @@ -1139,97 +1139,7 @@ version - 1.0pre3.538980 - - google_breakpad - - copyright - Copyright (c) 2006, Google Inc. - description - Breakpad is a crossplatform library for capturing crash callstacks and runtime data. - license - bsd - license_file - LICENSES/google_breakpad.txt - name - google_breakpad - platforms - - darwin - - archive - - hash - 171b39db6d0702535b41fad5b476e39d - url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Darwin/installer/google_breakpad-1413.298033-darwin-298033.tar.bz2 - - name - darwin - - darwin64 - - archive - - hash - ca33f234aae399b9e704e262f7e15d35 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56338/526869/google_breakpad-1413.539880-darwin64-539880.tar.bz2 - - name - darwin64 - - linux - - archive - - hash - 352e673897e8f36f8470150b8ace6ce9 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-google-breakpad/rev/314225/arch/Linux/installer/google_breakpad-1413.314225-linux-314225.tar.bz2 - - name - linux - - linux64 - - archive - - hash - 6bddcc1ac470dd5eab459220102df9e9 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1835/4114/google_breakpad-1413.501824-linux64-501824.tar.bz2 - - name - linux64 - - windows - - archive - - hash - bfee0438617f57f02f7e8515a801cb20 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56359/526982/google_breakpad-1413.539880-windows-539880.tar.bz2 - - name - windows - - windows64 - - archive - - hash - 6f983e754bb3046f065806b510b408c5 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56358/526975/google_breakpad-1413.539880-windows64-539880.tar.bz2 - - name - windows64 - - - version - 1413.539880 + 1.0pre3.555522 googlemock @@ -1262,9 +1172,9 @@ archive hash - f9831360ced94943ab9dfb3fbf5256d3 + 19e925604bc1a91efb4b130e1edd8bf2 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64101/601290/googlemock-1.7.0.545363-darwin64-545363.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78620/744140/googlemock-1.7.0.557057-darwin64-557057.tar.bz2 name darwin64 @@ -1298,9 +1208,9 @@ archive hash - 8149e46b4f7abb3ac284415cfe1366e1 + eed7b41d0d1f41b24f315349ef78c728 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64102/601296/googlemock-1.7.0.545363-windows-545363.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78622/744148/googlemock-1.7.0.557057-windows-557057.tar.bz2 name windows @@ -1310,16 +1220,16 @@ archive hash - f3851eba809ead2810d702041569d36d + a6ad6fe722d2fe4e8137495af3f374c9 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64100/601284/googlemock-1.7.0.545363-windows64-545363.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78621/744152/googlemock-1.7.0.557057-windows64-557057.tar.bz2 name windows64 version - 1.7.0.545363 + 1.7.0.557057 gstreamer @@ -1792,9 +1702,9 @@ archive hash - c327e6d6573fc0a808677de47f08acd9 + 2021ea3a19b81c82993e733709683303 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54844/510092/libhunspell-1.3.2.538974-darwin64-538974.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76371/727419/libhunspell-1.3.2.555528-darwin64-555528.tar.bz2 name darwin64 @@ -1828,9 +1738,9 @@ archive hash - ec22ec25160bcfd2a74f1c7bc8ff6133 + 2253ec09136cc7c208481030d78d9dd7 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54986/511824/libhunspell-1.3.2.538974-windows-538974.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76369/727412/libhunspell-1.3.2.555528-windows-555528.tar.bz2 name windows @@ -1840,16 +1750,16 @@ archive hash - f470c6f3f7b0559e95e76467b808de10 + 858d1708f6b3a74738a3d57a5387e20f url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54985/511817/libhunspell-1.3.2.538974-windows64-538974.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76370/727413/libhunspell-1.3.2.555528-windows64-555528.tar.bz2 name windows64 version - 1.3.2.538974 + 1.3.2.555528 libndofdev @@ -1882,9 +1792,9 @@ archive hash - bf765dfe0b928ef3c531cd9618fee89b + a487fff84208a45844602c4a1f68c974 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54843/510085/libndofdev-0.1.538973-darwin64-538973.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76356/727333/libndofdev-0.1.555523-darwin64-555523.tar.bz2 name darwin64 @@ -1894,9 +1804,9 @@ archive hash - 8abb7d216535009f6c0a7e43b0734b1e + 4c839555bf0ed9ae60ffc3f8a7c96f9b url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54984/511810/libndofdev-0.1.538973-windows-538973.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76354/727340/libndofdev-0.1.555523-windows-555523.tar.bz2 name windows @@ -1906,16 +1816,16 @@ archive hash - 9da7aed5a914174dcb2be12ecd4a656f + cbc033ae3b034b992b59f6de1034247c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54983/511803/libndofdev-0.1.538973-windows64-538973.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76355/727341/libndofdev-0.1.555523-windows64-555523.tar.bz2 name windows64 version - 0.1.538973 + 0.1.555523 libpng @@ -1948,9 +1858,9 @@ archive hash - 0932b19bb6a8e2641706afd13d92951d + 2a41acc3116ce19a443873216cb882ad url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56313/526740/libpng-1.6.8.539868-darwin64-539868.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78587/743948/libpng-1.6.8.557046-darwin64-557046.tar.bz2 name darwin64 @@ -1984,9 +1894,9 @@ archive hash - f498782698428888113b64a7505c8f7f + b935b440947f63c69700bdcf5095a8e1 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56319/526770/libpng-1.6.8.539868-windows-539868.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78591/743970/libpng-1.6.8.557046-windows-557046.tar.bz2 name windows @@ -1996,16 +1906,16 @@ archive hash - f8ac4f690a2925418866bccf6eba3cf4 + d1cc8354ac4e877eefedf16b1be3aac6 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56317/526762/libpng-1.6.8.539868-windows64-539868.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78589/743991/libpng-1.6.8.557046-windows64-557046.tar.bz2 name windows64 version - 1.6.8.539868 + 1.6.8.557046 libuuid @@ -2080,9 +1990,9 @@ archive hash - 0706b9c3889d767af9f5105d9ffa9b51 + 6677173bbbb0ea32369b5e9b6c9aa641 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56327/526819/libxml2-2.9.4.539866-darwin64-539866.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78631/744225/libxml2-2.9.4.557062-darwin64-557062.tar.bz2 name darwin64 @@ -2116,9 +2026,9 @@ archive hash - 1b7b979a8387fbb0f278dc681558b9ef + ad6a596fbf0e83a21d95762da78437bc url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56316/526755/libxml2-2.9.4.539866-windows-539866.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78633/744239/libxml2-2.9.4.557062-windows-557062.tar.bz2 name windows @@ -2128,16 +2038,16 @@ archive hash - 4f8ff97d6a9ab350306b62eec8adc810 + 6b5bb230684ecf28386d7c91c47bb6e1 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56314/526748/libxml2-2.9.4.539866-windows64-539866.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78634/744240/libxml2-2.9.4.557062-windows64-557062.tar.bz2 name windows64 version - 2.9.4.539866 + 2.9.4.557062 llappearance_utility @@ -2414,9 +2324,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 937ce1a2158c0cfff37f5989f5b24aba + e4f784d8a035c51921a1562ca7a1bab6 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64066/601156/nghttp2-1.40.0.545354-darwin64-545354.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76357/727350/nghttp2-1.40.0.555524-darwin64-555524.tar.bz2 name darwin64 @@ -2450,9 +2360,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 138b881bdf37dff4e626e022a50dd11f + af05aa2994c9845308fecd094b7b2d25 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64069/601181/nghttp2-1.40.0.545354-windows-545354.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76359/727360/nghttp2-1.40.0.555524-windows-555524.tar.bz2 name windows @@ -2462,9 +2372,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - c23c6480c7cbea60a2bd26e257adc0a7 + 5a55cede40eef16b9d1e47c418a2b77a url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64068/601177/nghttp2-1.40.0.545354-windows64-545354.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76358/727359/nghttp2-1.40.0.555524-windows64-555524.tar.bz2 name windows64 @@ -2473,7 +2383,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors source_type hg version - 1.40.0.545354 + 1.40.0.555524 nvapi @@ -2828,9 +2738,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 18aef0c8fc471b6539addbdc019aea25 + 5503e4928bcdb0a29685b3242c4a409b url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56325/526804/openssl-1.0.2l.539874-darwin64-539874.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82619/774464/openssl-1.1.1l.560177-darwin64-560177.tar.bz2 name darwin64 @@ -2864,9 +2774,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 2b2f61313b1cbd2893c1ba5bf15061fa + d2153f20dc2d35c609b876a9f019a748 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56328/526826/openssl-1.0.2l.539874-windows-539874.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82623/774521/openssl-1.1.1l.560177-windows-560177.tar.bz2 name windows @@ -2876,16 +2786,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 59aae854155bc7119e0dca25e65828c0 + f40b8622ba38084b0962e273988d748f url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/56326/526811/openssl-1.0.2l.539874-windows64-539874.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82624/774520/openssl-1.1.1l.560177-windows64-560177.tar.bz2 name windows64 version - 1.0.2l.539874 + 1.1.1l.560177 pcre @@ -3008,9 +2918,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 321a8542e7b693fbe8e44ebface06087 + 6ce3cbaed968a69fb7a2cca80220874d url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55966/524403/slvoice-4.10.0000.32327.5fc3fe7c.539691-darwin64-539691.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2 name darwin64 @@ -3044,9 +2954,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - fb1a57a1cf5e38a3d51b32307b93ffba + 2eb38c5eff4d0f18fbb89d0c30c4f0a4 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55968/524423/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows-539691.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2 name windows @@ -3056,16 +2966,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 81df970eb0c97d415d7bd12049c82042 + 9ee8f3cbc5369c598a998c61961ed16d url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55967/524409/slvoice-4.10.0000.32327.5fc3fe7c.539691-windows64-539691.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2 name windows64 version - 4.10.0000.32327.5fc3fe7c.539691 + 4.10.0000.32327.5fc3fe7c.558436 tut @@ -3128,9 +3038,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 60f008c5fd31641ad4e61ac751ce15d1 + c42575ac8997de979eadb082c33a578e url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75748/723495/uriparser-0.9.4-darwin64-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81322/765512/uriparser-0.9.4-darwin64-559132.tar.bz2 name darwin64 @@ -3164,9 +3074,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 00aff37a6f5e1fe08456702d28706cf6 + 901b1063556fc6b2575e745eef2bf744 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75751/723507/uriparser-0.9.4-windows-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81323/765528/uriparser-0.9.4-windows-559132.tar.bz2 name windows @@ -3176,9 +3086,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - ff27a91f3941c7bef5e1613a064cb048 + 962c01d553f286c430102998129fb0d6 url - https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/75750/723506/uriparser-0.9.4-windows64-555117.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81324/765527/uriparser-0.9.4-windows64-559132.tar.bz2 name windows64 @@ -3262,9 +3172,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 5e553a4358203f283c74744aed2fcd8c + b639d0035f4a8c9b4973be428a1b7e61 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54836/510036/vlc_bin-2.2.8.538966-darwin64-538966.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69569/671323/vlc_bin-3.0.9.549888-darwin64-549888.tar.bz2 name darwin64 @@ -3286,9 +3196,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - ca84b7c5f86e702fb35727eed8f0c8c4 + 4f50b0c47daa081dd4fcb83763d5b0b2 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54958/511725/vlc_bin-2.2.8.538966-windows-538966.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69567/671314/vlc_bin-3.0.9.549888-windows-549888.tar.bz2 name windows @@ -3298,16 +3208,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 93cd88d90cb8aedbed5cd90ff9262409 + c2f8c01fb6c261b72beb07f0c4cd423f url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54954/511718/vlc_bin-2.2.8.538966-windows64-538966.tar.bz2 + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69568/671315/vlc_bin-3.0.9.549888-windows64-549888.tar.bz2 name windows64 version - 2.2.8.538966 + 3.0.9.549888 xmlrpc-epi @@ -3340,9 +3250,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 99ea1808ee9f5b55029daa9fdef86776 + 922a0dea32266897ed1911200438e1e1 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55063/512104/xmlrpc_epi-0.54.1.539072-darwin64-539072.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76372/727426/xmlrpc_epi-0.54.1.555529-darwin64-555529.tar.bz2 name darwin64 @@ -3376,9 +3286,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 94643b7cebb449f049fa9e32ae682bcd + 34b847e6b280048465fe7c6ce67fe05c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55138/512288/xmlrpc_epi-0.54.1.539072-windows-539072.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76374/727436/xmlrpc_epi-0.54.1.555529-windows-555529.tar.bz2 name windows @@ -3388,16 +3298,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - c409de1974a879291ce7daaf52348d85 + 8fbe7c4ea22bb7f23a93c73884ebb34c url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55137/512279/xmlrpc_epi-0.54.1.539072-windows64-539072.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76373/727435/xmlrpc_epi-0.54.1.555529-windows64-555529.tar.bz2 name windows64 version - 0.54.1.539072 + 0.54.1.555529 zlib @@ -3430,9 +3340,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 9785bda5b4d3b41bf391b33d0da78c9e + 9181bc8229f1a8e480d2a40a2744ec28 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54858/510190/zlib-1.2.8.538988-darwin64-538988.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78578/743913/zlib-1.2.11.557041-darwin64-557041.tar.bz2 name darwin64 @@ -3468,9 +3378,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - ebdb07d4aaa5312005a8773f625032a4 + 8308cbd2ea0fe290541698b0f63482e2 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55048/512031/zlib-1.2.8.538988-windows-538988.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78579/743926/zlib-1.2.11.557041-windows-557041.tar.bz2 name windows @@ -3480,16 +3390,16 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors archive hash - 0ac95f3dece7d575ba45cf5728f53eea + 36bdc34f67d3ad3c57125dc1b16a3129 url - http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55047/512024/zlib-1.2.8.538988-windows64-538988.tar.bz2 + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78577/743920/zlib-1.2.11.557041-windows64-557041.tar.bz2 name windows64 version - 1.2.8.538988 + 1.2.11.557041 package_description diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake index b8e569d3a8..7d8bfb1b0f 100644 --- a/indra/cmake/CEFPlugin.cmake +++ b/indra/cmake/CEFPlugin.cmake @@ -24,7 +24,7 @@ elseif (DARWIN) message(FATAL_ERROR "AppKit not found") endif() - FIND_LIBRARY(CEF_LIBRARY "Chromium Embedded Framework" ${ARCH_PREBUILT_DIRS_RELEASE}) + set(CEF_LIBRARY "'${ARCH_PREBUILT_DIRS_RELEASE}/Chromium\ Embedded\ Framework.framework'") if (NOT CEF_LIBRARY) message(FATAL_ERROR "CEF not found") endif() @@ -33,7 +33,7 @@ elseif (DARWIN) ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a ${ARCH_PREBUILT_DIRS_RELEASE}/libdullahan.a ${APPKIT_LIBRARY} - ${CEF_LIBRARY} + "-F ${CEF_LIBRARY}" ) elseif (LINUX) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index a17e37cd32..cca305c741 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -28,7 +28,6 @@ set(cmake_SOURCE_FILES FindAutobuild.cmake FindBerkeleyDB.cmake FindGLH.cmake - FindGoogleBreakpad.cmake FindHUNSPELL.cmake FindJsonCpp.cmake FindNDOF.cmake @@ -43,7 +42,6 @@ set(cmake_SOURCE_FILES GLH.cmake GLOD.cmake ## GStreamer010Plugin.cmake - GoogleBreakpad.cmake GoogleMock.cmake Havok.cmake Hunspell.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 46ddb9d15b..b20d23cead 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -56,14 +56,21 @@ if(WINDOWS) libapr-1.dll libaprutil-1.dll libapriconv-1.dll - ssleay32.dll - libeay32.dll nghttp2.dll glod.dll libhunspell.dll uriparser.dll ) + # OpenSSL + if(ADDRESS_SIZE EQUAL 64) + set(release_files ${release_files} libcrypto-1_1-x64.dll) + set(release_files ${release_files} libssl-1_1-x64.dll) + else(ADDRESS_SIZE EQUAL 64) + set(release_files ${release_files} libcrypto-1_1.dll) + set(release_files ${release_files} libssl-1_1.dll) + endif(ADDRESS_SIZE EQUAL 64) + # Filenames are different for 32/64 bit BugSplat file and we don't # have any control over them so need to branch. if (USE_BUGSPLAT) @@ -158,7 +165,6 @@ elseif(DARWIN) libapr-1.dylib libaprutil-1.0.dylib libaprutil-1.dylib - libexception_handler.dylib ${EXPAT_COPY} libGLOD.dylib libhunspell-1.3.0.dylib diff --git a/indra/cmake/FindGoogleBreakpad.cmake b/indra/cmake/FindGoogleBreakpad.cmake deleted file mode 100644 index 1a0493be5e..0000000000 --- a/indra/cmake/FindGoogleBreakpad.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# -*- cmake -*- - -# - Find Google BreakPad -# Find the Google BreakPad includes and library -# This module defines -# BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR, where to find exception_handler.h, etc. -# BREAKPAD_EXCEPTION_HANDLER_LIBRARIES, the libraries needed to use Google BreakPad. -# BREAKPAD_EXCEPTION_HANDLER_FOUND, If false, do not try to use Google BreakPad. -# also defined, but not for general use are -# BREAKPAD_EXCEPTION_HANDLER_LIBRARY, where to find the Google BreakPad library. - -FIND_PATH(BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR google_breakpad/exception_handler.h) - -SET(BREAKPAD_EXCEPTION_HANDLER_NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} breakpad_client) -FIND_LIBRARY(BREAKPAD_EXCEPTION_HANDLER_LIBRARY - NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} - ) - -IF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) - SET(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES ${BREAKPAD_EXCEPTION_HANDLER_LIBRARY}) - SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "YES") -ELSE (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) - SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "NO") -ENDIF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) - - -IF (BREAKPAD_EXCEPTION_HANDLER_FOUND) - IF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) - MESSAGE(STATUS "Found Google BreakPad: ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}") - ENDIF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) -ELSE (BREAKPAD_EXCEPTION_HANDLER_FOUND) - IF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) - MESSAGE(FATAL_ERROR "Could not find Google BreakPad library") - ENDIF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) -ENDIF (BREAKPAD_EXCEPTION_HANDLER_FOUND) - -MARK_AS_ADVANCED( - BREAKPAD_EXCEPTION_HANDLER_LIBRARY - BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR - ) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake deleted file mode 100644 index 829e1ac08a..0000000000 --- a/indra/cmake/GoogleBreakpad.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -if (USESYSTEMLIBS) - set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON) - include(FindGoogleBreakpad) -else (USESYSTEMLIBS) - use_prebuilt_binary(google_breakpad) - if (DARWIN) - set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler) - endif (DARWIN) - if (LINUX) - set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client) - endif (LINUX) - if (WINDOWS) - set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client crash_generation_server common) - endif (WINDOWS) - # yes, this does look dumb, no, it's not incorrect - # - set(BREAKPAD_INCLUDE_DIRECTORIES "${LIBS_PREBUILT_DIR}/include/google_breakpad" "${LIBS_PREBUILT_DIR}/include/google_breakpad/google_breakpad") -endif (USESYSTEMLIBS) - diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index eb548bdcc1..32400f5e4e 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -9,7 +9,7 @@ if (USESYSTEMLIBS) else (USESYSTEMLIBS) use_prebuilt_binary(openssl) if (WINDOWS) - set(OPENSSL_LIBRARIES ssleay32 libeay32) + set(OPENSSL_LIBRARIES libssl libcrypto) else (WINDOWS) set(OPENSSL_LIBRARIES ssl crypto) endif (WINDOWS) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index dd266630ea..22dfe12e40 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -9,7 +9,6 @@ include(Linking) include(Boost) include(LLSharedLibs) include(JsonCpp) -include(GoogleBreakpad) include(Copy3rdPartyLibs) include(ZLIB) include(URIPARSER) @@ -19,7 +18,6 @@ include_directories( ${LLCOMMON_INCLUDE_DIRS} ${JSONCPP_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} - ${BREAKPAD_INCLUDE_DIRECTORIES} ${URIPARSER_INCLUDE_DIRS} ) @@ -288,7 +286,6 @@ endif(LLCOMMON_LINK_SHARED) target_link_libraries( llcommon - ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} ${APRUTIL_LIBRARIES} ${APR_LIBRARIES} ${EXPAT_LIBRARIES} diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index 6064a843ae..df2a066f62 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -46,7 +46,6 @@ #include "llstl.h" // for DeletePointer() #include "llstring.h" #include "lleventtimer.h" -#include "google_breakpad/exception_handler.h" #include "stringize.h" #include "llcleanup.h" #include "llevents.h" @@ -62,12 +61,6 @@ LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); BOOL ConsoleCtrlHandler(DWORD fdwCtrlType); -bool windows_post_minidump_callback(const wchar_t* dump_path, - const wchar_t* minidump_id, - void* context, - EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion, - bool succeeded); #else # include # include // for fork() @@ -146,8 +139,6 @@ void LLApp::commonCtor() // Set the application to this instance. sApplication = this; - - mExceptionHandler = 0; // initialize the buffer to write the minidump filename to // (this is used to avoid allocating memory in the crash handler) @@ -177,8 +168,6 @@ LLApp::~LLApp() delete mThreadErrorp; mThreadErrorp = NULL; } - - if(mExceptionHandler != 0) delete mExceptionHandler; SUBSYSTEM_CLEANUP_DBG(LLCommon); } @@ -394,139 +383,18 @@ void LLApp::setupErrorHandling(bool second_instance) #if LL_WINDOWS -#if LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT) - EnableCrashingOnCrashes(); - - // This sets a callback to handle w32 signals to the console window. - // The viewer shouldn't be affected, sicne its a windowed app. - SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE); - - // Install the Google Breakpad crash handler for Windows - if(mExceptionHandler == 0) - { - if ( second_instance ) //BUG-5707 Firing teleport from a web browser causes second - { - mExceptionHandler = new google_breakpad::ExceptionHandler( - L"C:\\Temp\\", - 0, //No filter - windows_post_minidump_callback, - 0, - google_breakpad::ExceptionHandler::HANDLER_ALL); //No custom client info. - } - else - { - LL_WARNS() << "adding breakpad exception handler" << LL_ENDL; - - std::wstring wpipe_name; - wpipe_name = mCrashReportPipeStr + wstringize(getPid()); - - const std::wstring wdump_path(utf8str_to_utf16str(mDumpPath)); - - int retries = 30; - for (; retries > 0; --retries) - { - if (mExceptionHandler != 0) delete mExceptionHandler; - - mExceptionHandler = new google_breakpad::ExceptionHandler( - wdump_path, - NULL, //No filter - windows_post_minidump_callback, - 0, - google_breakpad::ExceptionHandler::HANDLER_ALL, - MiniDumpNormal, //Generate a 'normal' minidump. - wpipe_name.c_str(), - NULL); //No custom client info. - if (mExceptionHandler->IsOutOfProcess()) - { - LL_INFOS("CRASHREPORT") << "Successfully attached to Out of Process exception handler." << LL_ENDL; - break; - } - else - { - LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler. " << retries << " retries remaining." << LL_ENDL; - ::Sleep(100); //Wait a tick and try again. - } - } - - if (retries == 0) LL_WARNS("CRASHREPORT") << "Unable to attach to Out of Process exception handler." << LL_ENDL; - } - - if (mExceptionHandler) - { - mExceptionHandler->set_handle_debug_exceptions(true); - } - } -#endif // LL_SEND_CRASH_REPORTS && ! defined(LL_BUGSPLAT) #else // ! LL_WINDOWS -#if defined(LL_BUGSPLAT) - // Don't install our own signal handlers -- BugSplat needs to hook them, - // or it's completely ineffectual. - bool installHandler = false; - -#else // ! LL_BUGSPLAT - // - // Start up signal handling. - // - // There are two different classes of signals. Synchronous signals are delivered to a specific - // thread, asynchronous signals can be delivered to any thread (in theory) - // - setup_signals(); - - // Add google breakpad exception handler configured for Darwin/Linux. - bool installHandler = true; +#if ! defined(LL_BUGSPLAT) + // + // Start up signal handling. + // + // There are two different classes of signals. Synchronous signals are delivered to a specific + // thread, asynchronous signals can be delivered to any thread (in theory) + // + setup_signals(); #endif // ! LL_BUGSPLAT -#if LL_DARWIN - // For the special case of Darwin, we do not want to install the handler if - // the process is being debugged as the app will exit with value ABRT (6) if - // we do. Unfortunately, the code below which performs that test relies on - // the structure kinfo_proc which has been tagged by apple as an unstable - // API. We disable this test for shipping versions to avoid conflicts with - // future releases of Darwin. This test is really only needed for developers - // starting the app from a debugger anyway. - #ifndef LL_RELEASE_FOR_DOWNLOAD - int mib[4]; - mib[0] = CTL_KERN; - mib[1] = KERN_PROC; - mib[2] = KERN_PROC_PID; - mib[3] = getpid(); - - struct kinfo_proc info; - memset(&info, 0, sizeof(info)); - - size_t size = sizeof(info); - int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); - if((result == 0) || (errno == ENOMEM)) - { - // P_TRACED flag is set, so this process is being debugged; do not install - // the handler - if(info.kp_proc.p_flag & P_TRACED) installHandler = false; - } - else - { - // Failed to discover if the process is being debugged; default to - // installing the handler. - installHandler = true; - } - #endif // ! LL_RELEASE_FOR_DOWNLOAD - - if(installHandler && (mExceptionHandler == 0)) - { - mExceptionHandler = new google_breakpad::ExceptionHandler(mDumpPath, 0, &unix_post_minidump_callback, 0, true, 0); - } -#elif LL_LINUX - if(installHandler && (mExceptionHandler == 0)) - { - if (mDumpPath.empty()) - { - mDumpPath = "/tmp"; - } - google_breakpad::MinidumpDescriptor desc(mDumpPath); - mExceptionHandler = new google_breakpad::ExceptionHandler(desc, NULL, unix_minidump_callback, NULL, true, -1); - } -#endif // LL_LINUX - #endif // ! LL_WINDOWS #ifdef LL_BUGSPLAT @@ -614,31 +482,6 @@ void LLApp::setError() setStatus(APP_STATUS_ERROR); } -void LLApp::setMiniDumpDir(const std::string &path) -{ - if (path.empty()) - { - mDumpPath = "/tmp"; - } - else - { - mDumpPath = path; - } - - if(mExceptionHandler == 0) return; -#ifdef LL_WINDOWS - std::wstring buffer(utf8str_to_utf16str(mDumpPath)); - if (buffer.size() > MAX_MINDUMP_PATH_LENGTH) buffer.resize(MAX_MINDUMP_PATH_LENGTH); - mExceptionHandler->set_dump_path(buffer); -#elif LL_LINUX - //google_breakpad::MinidumpDescriptor desc("/tmp"); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. - google_breakpad::MinidumpDescriptor desc(mDumpPath); //path works in debug fails in production inside breakpad lib so linux gets a little less stack reporting until it is patched. - mExceptionHandler->set_minidump_descriptor(desc); -#else - mExceptionHandler->set_dump_path(mDumpPath); -#endif -} - void LLApp::setDebugFileNames(const std::string &path) { mStaticDebugFileName = path + "static_debug_info.log"; @@ -647,8 +490,6 @@ void LLApp::setDebugFileNames(const std::string &path) void LLApp::writeMiniDump() { - if(mExceptionHandler == 0) return; - mExceptionHandler->WriteMinidump(); } // static @@ -705,13 +546,6 @@ bool LLApp::isExiting() void LLApp::disableCrashlogger() { - // Disable Breakpad exception handler. - if (mExceptionHandler != 0) - { - delete mExceptionHandler; - mExceptionHandler = 0; - } - sDisableCrashlogger = TRUE; } @@ -1105,64 +939,3 @@ bool unix_post_minidump_callback(const char *dump_dir, } #endif // !WINDOWS -#ifdef LL_WINDOWS -bool windows_post_minidump_callback(const wchar_t* dump_path, - const wchar_t* minidump_id, - void* context, - EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion, - bool succeeded) -{ - char * path = LLApp::instance()->getMiniDumpFilename(); - S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH; - size_t bytesUsed; - - LL_INFOS("MINIDUMPCALLBACK") << "Dump file was generated." << LL_ENDL; - bytesUsed = wcstombs(path, dump_path, static_cast(remaining)); - remaining -= bytesUsed; - path += bytesUsed; - if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\') - { - *path++ = '\\'; - --remaining; - } - if(remaining > 0) - { - bytesUsed = wcstombs(path, minidump_id, static_cast(remaining)); - remaining -= bytesUsed; - path += bytesUsed; - } - if(remaining > 0) - { - strncpy(path, ".dmp", remaining); - } - - LL_INFOS("CRASHREPORT") << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << LL_ENDL; - // *NOTE:Mani - this code is stolen from LLApp, where its never actually used. - //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK); - // *TODO: Translate the signals/exceptions into cross-platform stuff - // Windows implementation - LL_INFOS() << "Entering Windows Exception Handler..." << LL_ENDL; - - if (LLApp::isError()) - { - LL_WARNS() << "Got another fatal signal while in the error handler, die now!" << LL_ENDL; - } - - // Flag status to error, so thread_error starts its work - LLApp::setError(); - - // Block in the exception handler until the app has stopped - // This is pretty sketchy, but appears to work just fine - while (!LLApp::isStopped()) - { - ms_sleep(10); - } - -#ifndef LL_RELEASE_FOR_DOWNLOAD - return false; -#else - return true; -#endif -} -#endif diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index 5fa91b8bf5..83f3bf3f93 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -49,10 +49,6 @@ void clear_signals(); #endif -namespace google_breakpad { - class ExceptionHandler; // See exception_handler.h -} - class LL_COMMON_API LLApp { friend class LLErrorThread; @@ -236,7 +232,6 @@ public: static const U32 MAX_MINDUMP_PATH_LENGTH = 256; // change the directory where Breakpad minidump files are written to - void setMiniDumpDir(const std::string &path); void setDebugFileNames(const std::string &path); // Return the Google Breakpad minidump filename after a crash. @@ -316,9 +311,6 @@ private: private: // the static application instance if it was created. static LLApp* sApplication; - - google_breakpad::ExceptionHandler * mExceptionHandler; - #if !LL_WINDOWS friend void default_unix_signal_handler(int signum, siginfo_t *info, void *); diff --git a/indra/llcorehttp/CMakeLists.txt b/indra/llcorehttp/CMakeLists.txt index 8bb6a657b1..6a301ad50d 100644 --- a/indra/llcorehttp/CMakeLists.txt +++ b/indra/llcorehttp/CMakeLists.txt @@ -177,7 +177,6 @@ if (DARWIN) set(copy_dylibs libapr-1.0.dylib libaprutil-1.0.dylib - libexception_handler.dylib libnghttp2*.dylib liburiparser*.dylib ${EXPAT_COPY} diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index e37a38b05f..61ba83594e 100644 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -23,13 +23,6 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ -#if LL_WINDOWS -#define SAFE_SSL 1 -#elif LL_DARWIN -#define SAFE_SSL 1 -#else -#define SAFE_SSL 1 -#endif #include "linden_common.h" // Modifies curl/curl.h interfaces #include "httpcommon.h" @@ -38,10 +31,6 @@ #include #include #include -#if SAFE_SSL -#include -#include // std::hash -#endif namespace LLCore @@ -281,9 +270,6 @@ namespace LLHttp { namespace { -typedef boost::shared_ptr LLMutex_ptr; -std::vector sSSLMutex; - CURL *getCurlTemplateHandle() { static CURL *curlpTemplateHandle = NULL; @@ -348,34 +334,6 @@ void deallocateEasyCurl(CURL *curlp) } -#if SAFE_SSL -//static -void ssl_locking_callback(int mode, int type, const char *file, int line) -{ - if (type >= sSSLMutex.size()) - { - LL_WARNS() << "Attempt to get unknown MUTEX in SSL Lock." << LL_ENDL; - } - - if (mode & CRYPTO_LOCK) - { - sSSLMutex[type]->lock(); - } - else - { - sSSLMutex[type]->unlock(); - } -} - -//static -unsigned long ssl_thread_id(void) -{ - // std::thread::id is very deliberately opaque, but we can hash it - return std::hash()(LLThread::currentID()); -} -#endif - - } void initialize() @@ -387,27 +345,11 @@ void initialize() check_curl_code(code, CURL_GLOBAL_ALL); -#if SAFE_SSL - S32 mutex_count = CRYPTO_num_locks(); - for (S32 i = 0; i < mutex_count; i++) - { - sSSLMutex.push_back(LLMutex_ptr(new LLMutex())); - } - CRYPTO_set_id_callback(&ssl_thread_id); - CRYPTO_set_locking_callback(&ssl_locking_callback); -#endif - } void cleanup() { -#if SAFE_SSL - CRYPTO_set_id_callback(NULL); - CRYPTO_set_locking_callback(NULL); - sSSLMutex.clear(); -#endif - curl_global_cleanup(); } diff --git a/indra/llmessage/llblowfishcipher.cpp b/indra/llmessage/llblowfishcipher.cpp index 0b5025a422..949d4cc0c7 100644 --- a/indra/llmessage/llblowfishcipher.cpp +++ b/indra/llmessage/llblowfishcipher.cpp @@ -52,24 +52,28 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) if (src_len > dst_len) return 0; // OpenSSL uses "cipher contexts" to hold encryption parameters. - EVP_CIPHER_CTX context; - EVP_CIPHER_CTX_init(&context); + EVP_CIPHER_CTX *context = EVP_CIPHER_CTX_new(); + if (!context) + { + LL_WARNS() << "LLBlowfishCipher::encrypt EVP_CIPHER_CTX initiation failure" << LL_ENDL; + return 0; + } // We want a blowfish cyclic block chain cipher, but need to set // the key length before we pass in a key, so call EncryptInit // first with NULLs. - EVP_EncryptInit_ex(&context, EVP_bf_cbc(), NULL, NULL, NULL); - EVP_CIPHER_CTX_set_key_length(&context, (int)mSecretSize); + EVP_EncryptInit_ex(context, EVP_bf_cbc(), NULL, NULL, NULL); + EVP_CIPHER_CTX_set_key_length(context, (int)mSecretSize); // Complete initialization. Per EVP_EncryptInit man page, the // cipher pointer must be NULL. Apparently initial_vector must // be 8 bytes for blowfish, as this is the block size. unsigned char initial_vector[] = { 0, 0, 0, 0, 0, 0, 0, 0 }; - EVP_EncryptInit_ex(&context, NULL, NULL, mSecret, initial_vector); + EVP_EncryptInit_ex(context, NULL, NULL, mSecret, initial_vector); - int blocksize = EVP_CIPHER_CTX_block_size(&context); - int keylen = EVP_CIPHER_CTX_key_length(&context); - int iv_length = EVP_CIPHER_CTX_iv_length(&context); + int blocksize = EVP_CIPHER_CTX_block_size(context); + int keylen = EVP_CIPHER_CTX_key_length(context); + int iv_length = EVP_CIPHER_CTX_iv_length(context); LL_DEBUGS() << "LLBlowfishCipher blocksize " << blocksize << " keylen " << keylen << " iv_len " << iv_length @@ -77,7 +81,7 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) int output_len = 0; int temp_len = 0; - if (!EVP_EncryptUpdate(&context, + if (!EVP_EncryptUpdate(context, dst, &output_len, src, @@ -89,18 +93,18 @@ U32 LLBlowfishCipher::encrypt(const U8* src, U32 src_len, U8* dst, U32 dst_len) // There may be some final data left to encrypt if the input is // not an exact multiple of the block size. - if (!EVP_EncryptFinal_ex(&context, (unsigned char*)(dst + output_len), &temp_len)) + if (!EVP_EncryptFinal_ex(context, (unsigned char*)(dst + output_len), &temp_len)) { LL_WARNS() << "LLBlowfishCipher::encrypt EVP_EncryptFinal failure" << LL_ENDL; goto ERROR; } output_len += temp_len; - EVP_CIPHER_CTX_cleanup(&context); + EVP_CIPHER_CTX_free(context); return output_len; ERROR: - EVP_CIPHER_CTX_cleanup(&context); + EVP_CIPHER_CTX_free(context); return 0; } diff --git a/indra/mac_crash_logger/CMakeLists.txt b/indra/mac_crash_logger/CMakeLists.txt deleted file mode 100644 index 95637c9a28..0000000000 --- a/indra/mac_crash_logger/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -# -*- cmake -*- - -project(mac_crash_logger) - -include(00-Common) -include(LLCommon) -include(LLCoreHttp) -include(LLCrashLogger) -include(LLMath) -include(LLMessage) -include(LLVFS) -include(LLXML) -include(Linking) -include(LLSharedLibs) -include(Boost) - -include_directories( - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLCRASHLOGGER_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLVFS_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) - -set(mac_crash_logger_SOURCE_FILES - mac_crash_logger.cpp - llcrashloggermac.cpp - llcrashloggermacdelegate.mm - ) - -set(mac_crash_logger_HEADER_FILES - CMakeLists.txt - - llcrashloggermac.h - llcrashloggermacdelegate.h - ) - -set_source_files_properties(${mac_crash_logger_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) -list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_HEADER_FILES}) - -set(mac_crash_logger_RESOURCE_FILES - CrashReporter.nib/ - ) -set_source_files_properties( - ${mac_crash_logger_RESOURCE_FILES} - PROPERTIES - HEADER_FILE_ONLY TRUE - ) -SOURCE_GROUP("Resources" FILES ${mac_crash_logger_RESOURCE_FILES}) -list(APPEND mac_crash_logger_SOURCE_FILES ${mac_crash_logger_RESOURCE_FILES}) - -add_executable(mac-crash-logger - MACOSX_BUNDLE - ${mac_crash_logger_SOURCE_FILES}) - -set_target_properties(mac-crash-logger - PROPERTIES - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist - ) - -find_library(COCOA_LIBRARY Cocoa) - -target_link_libraries(mac-crash-logger - ${LLCRASHLOGGER_LIBRARIES} - ${LLVFS_LIBRARIES} - ${COCOA_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ) - -add_custom_command( - TARGET mac-crash-logger POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/CrashReporter.nib - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/mac-crash-logger.app/Contents/Resources/CrashReporter.nib - ) - -ll_deploy_sharedlibs_command(mac-crash-logger) - - diff --git a/indra/mac_crash_logger/CrashReporter.nib b/indra/mac_crash_logger/CrashReporter.nib deleted file mode 100755 index e9d9e05985..0000000000 Binary files a/indra/mac_crash_logger/CrashReporter.nib and /dev/null differ diff --git a/indra/mac_crash_logger/CrashReporter.xib b/indra/mac_crash_logger/CrashReporter.xib deleted file mode 100755 index f6d4776d51..0000000000 --- a/indra/mac_crash_logger/CrashReporter.xib +++ /dev/null @@ -1,3895 +0,0 @@ - - - - 1070 - 11G63 - 2182 - 1138.51 - 569.00 - - com.apple.InterfaceBuilder.CocoaPlugin - 2182 - - - NSTextField - NSView - NSWindowTemplate - NSMenu - NSMenuItem - NSTextFieldCell - NSButtonCell - IBNSLayoutConstraint - NSButton - NSCustomObject - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - - - Second Life Crash Logger - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - Second Life Crash Logger - - - - About Second Life Crash Logger - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - Services - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Second Life Crash Logger - h - 1048576 - 2147483647 - - - - - - Hide Others - h - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit Second Life Crash Logger - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - File - - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - Open Recent - - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save… - s - 1048576 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - Print… - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - Edit - - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Paste and Match Style - V - 1572864 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - Find - - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find and Replace… - f - 1572864 - 2147483647 - - - 12 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - Spelling and Grammar - - - - Show Spelling and Grammar - : - 1048576 - 2147483647 - - - - - - Check Document Now - ; - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - Correct Spelling Automatically - - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - Substitutions - - - - Show Substitutions - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Dashes - - 2147483647 - - - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - Text Replacement - - 2147483647 - - - - - - - - - Transformations - - 2147483647 - - - submenuAction: - - Transformations - - - - Make Upper Case - - 2147483647 - - - - - - Make Lower Case - - 2147483647 - - - - - - Capitalize - - 2147483647 - - - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - Speech - - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 2147483647 - - - submenuAction: - - Format - - - - Font - - 2147483647 - - - submenuAction: - - Font - - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Bold - b - 1048576 - 2147483647 - - - 2 - - - - Italic - i - 1048576 - 2147483647 - - - 1 - - - - Underline - u - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Bigger - + - 1048576 - 2147483647 - - - 3 - - - - Smaller - - - 1048576 - 2147483647 - - - 4 - - - - YES - YES - - - 2147483647 - - - - - - Kern - - 2147483647 - - - submenuAction: - - Kern - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Tighten - - 2147483647 - - - - - - Loosen - - 2147483647 - - - - - - - - - Ligature - - 2147483647 - - - submenuAction: - - Ligature - - - - Use Default - - 2147483647 - - - - - - Use None - - 2147483647 - - - - - - Use All - - 2147483647 - - - - - - - - - Baseline - - 2147483647 - - - submenuAction: - - Baseline - - - - Use Default - - 2147483647 - - - - - - Superscript - - 2147483647 - - - - - - Subscript - - 2147483647 - - - - - - Raise - - 2147483647 - - - - - - Lower - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Colors - C - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Copy Style - c - 1572864 - 2147483647 - - - - - - Paste Style - v - 1572864 - 2147483647 - - - - - _NSFontMenu - - - - - Text - - 2147483647 - - - submenuAction: - - Text - - - - Align Left - { - 1048576 - 2147483647 - - - - - - Center - | - 1048576 - 2147483647 - - - - - - Justify - - 2147483647 - - - - - - Align Right - } - 1048576 - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - Writing Direction - - 2147483647 - - - submenuAction: - - Writing Direction - - - - YES - Paragraph - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - YES - YES - - - 2147483647 - - - - - - YES - Selection - - 2147483647 - - - - - - CURlZmF1bHQ - - 2147483647 - - - - - - CUxlZnQgdG8gUmlnaHQ - - 2147483647 - - - - - - CVJpZ2h0IHRvIExlZnQ - - 2147483647 - - - - - - - - - YES - YES - - - 2147483647 - - - - - - Show Ruler - - 2147483647 - - - - - - Copy Ruler - c - 1310720 - 2147483647 - - - - - - Paste Ruler - v - 1310720 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 2147483647 - - - submenuAction: - - Help - - - - Second Life Crash Logger Help - ? - 1048576 - 2147483647 - - - - - _NSHelpMenu - - - - _NSMainMenu - - - 15 - 2 - {{335, 390}, {508, 477}} - 1954021376 - Second Life Crash Logger - NSWindow - - - - - 256 - - - - 268 - {{17, 228}, {474, 229}} - - - - _NS:9 - {250, 750} - YES - - 67239424 - 272891904 - - U2Vjb25kIExpZmUgYXBwZWFycyB0byBoYXZlIGNyYXNoZWQgb3IgZnJvemVuIHRoZSBsYXN0IHRpbWUg -aXQgcmFuLgoKVGhpcyBjcmFzaCByZXBvcnRlciBjb2xsZWN0cyBpbmZvcm1hdGlvbiBhYm91dCB5b3Vy -IGNvbXB1dGVyJ3MgaGFyZHdhcmUgY29uZmlndXJhdGlvbiwgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIHNv -bWUgU2Vjb25kIExpZmUgbG9ncywgYWxsIG9mIHdoaWNoIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVy -cG9zZXMgb25seS4KCkluIHRoZSBzcGFjZSBiZWxvdywgcGxlYXNlIGJyaWVmbHkgZGVzY3JpYmUgd2hh -dCB5b3Ugd2VyZSBkb2luZyBvciB0cnlpbmcgdG8gZG8ganVzdCBwcmlvciB0byB0aGUgY3Jhc2guICBU -aGFuayB5b3UgZm9yIHlvdXIgaGVscCEKClRoaXMgcmVwb3J0IGlzIE5PVCByZWFkIGJ5IEN1c3RvbWVy -IFN1cHBvcnQuICBJZiB5b3UgaGF2ZSBiaWxsaW5nIG9yIG90aGVyIHF1ZXN0aW9ucywgcGxlYXNlIGdv -IHRvOiBodHRwOi8vd3d3LnNlY29uZGxpZmUuY29tL3N1cHBvcnQvCgpJZiB5b3UgZG9uJ3Qgd2lzaCB0 -byBzZW5kIExpbmRlbiBMYWIgYSBjcmFzaCByZXBvcnQsIHByZXNzIENhbmNlbC4 - - - LucidaGrande - 13 - 16 - - _NS:9 - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - - - - 268 - {{20, 64}, {468, 163}} - - - - _NS:9 - {250, 750} - YES - - -1805517311 - 272891904 - - - LucidaGrande - 9 - 3614 - - _NS:9 - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - System - textColor - - - - - - - 268 - {{16, 18}, {189, 30}} - - - - _NS:9 - YES - - -2080244224 - 262144 - Remember This Choice - - _NS:9 - - 1211912703 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - - - - 268 - {{285, 23}, {91, 17}} - - - - _NS:9 - YES - - -2080244224 - 134479872 - Send Report - - _NS:9 - - -2038152961 - 164 - - - 400 - 75 - - - - - 268 - {{388, 23}, {100, 17}} - - - - _NS:9 - YES - - -2080244224 - 134479872 - Don't Send - - _NS:9 - - -2038152961 - 164 - - - 400 - 75 - - - - {508, 477} - - - - - {{0, 0}, {1680, 1028}} - {10000000000000, 10000000000000} - YES - - - LLCrashLoggerMacDelegate - - - - - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 495 - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - saveDocument: - - - - 362 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 367 - - - - hideOtherApplications: - - - - 368 - - - - unhideAllApplications: - - - - 370 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - raiseBaseline: - - - - 426 - - - - lowerBaseline: - - - - 427 - - - - copyFont: - - - - 428 - - - - subscript: - - - - 429 - - - - superscript: - - - - 430 - - - - tightenKerning: - - - - 431 - - - - underline: - - - - 432 - - - - orderFrontColorPanel: - - - - 433 - - - - useAllLigatures: - - - - 434 - - - - loosenKerning: - - - - 435 - - - - pasteFont: - - - - 436 - - - - unscript: - - - - 437 - - - - useStandardKerning: - - - - 438 - - - - useStandardLigatures: - - - - 439 - - - - turnOffLigatures: - - - - 440 - - - - turnOffKerning: - - - - 441 - - - - toggleAutomaticSpellingCorrection: - - - - 456 - - - - orderFrontSubstitutionsPanel: - - - - 458 - - - - toggleAutomaticDashSubstitution: - - - - 461 - - - - toggleAutomaticTextReplacement: - - - - 463 - - - - uppercaseWord: - - - - 464 - - - - capitalizeWord: - - - - 467 - - - - lowercaseWord: - - - - 468 - - - - pasteAsPlainText: - - - - 486 - - - - performFindPanelAction: - - - - 487 - - - - performFindPanelAction: - - - - 488 - - - - performFindPanelAction: - - - - 489 - - - - showHelp: - - - - 493 - - - - alignCenter: - - - - 518 - - - - pasteRuler: - - - - 519 - - - - toggleRuler: - - - - 520 - - - - alignRight: - - - - 521 - - - - copyRuler: - - - - 522 - - - - alignJustified: - - - - 523 - - - - alignLeft: - - - - 524 - - - - makeBaseWritingDirectionNatural: - - - - 525 - - - - makeBaseWritingDirectionLeftToRight: - - - - 526 - - - - makeBaseWritingDirectionRightToLeft: - - - - 527 - - - - makeTextWritingDirectionNatural: - - - - 528 - - - - makeTextWritingDirectionLeftToRight: - - - - 529 - - - - makeTextWritingDirectionRightToLeft: - - - - 530 - - - - performFindPanelAction: - - - - 535 - - - - window - - - - 532 - - - - remember: - - - - 1176 - - - - send: - - - - 1177 - - - - cancel: - - - - 1178 - - - - crashText - - - - 1179 - - - - rememberCheck - - - - 1187 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - - - - 19 - - - - - - - - 56 - - - - - - - - 217 - - - - - - - - 83 - - - - - - - - 81 - - - - - - - - - - - - - - - - - 75 - - - - - 78 - - - - - 72 - - - - - 82 - - - - - 124 - - - - - - - - 77 - - - - - 73 - - - - - 79 - - - - - 112 - - - - - 74 - - - - - 125 - - - - - - - - 126 - - - - - 205 - - - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 57 - - - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - - - 144 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 131 - - - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - - - - 372 - - - - - - - - 3 - 0 - - 3 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 4 - 0 - - 4 - 1 - - 64 - - 1000 - 3 - 9 - 3 - - - - - 6 - 0 - - 6 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 5 - 0 - - 5 - 1 - - 20 - - 1000 - 8 - 29 - 3 - - - - - 4 - 0 - - 4 - 1 - - 21 - - 1000 - 3 - 9 - 3 - - - - - 6 - 0 - - 6 - 1 - - 132 - - 1000 - 3 - 9 - 3 - - - - - 11 - 0 - - 11 - 1 - - 0.0 - - 1000 - 6 - 24 - 2 - - - - - 10 - 0 - - 10 - 1 - - 0.0 - - 1000 - 6 - 24 - 2 - - - - - - - 375 - - - - - - - - 376 - - - - - - - - - 377 - - - - - - - - 388 - - - - - - - - - - - - - - - - - - - - - - - 389 - - - - - 390 - - - - - 391 - - - - - 392 - - - - - 393 - - - - - 394 - - - - - 395 - - - - - 396 - - - - - 397 - - - - - - - - 398 - - - - - - - - 399 - - - - - - - - 400 - - - - - 401 - - - - - 402 - - - - - 403 - - - - - 404 - - - - - 405 - - - - - - - - - - - - 406 - - - - - 407 - - - - - 408 - - - - - 409 - - - - - 410 - - - - - 411 - - - - - - - - - - 412 - - - - - 413 - - - - - 414 - - - - - 415 - - - - - - - - - - - 416 - - - - - 417 - - - - - 418 - - - - - 419 - - - - - 450 - - - - - - - - 451 - - - - - - - - - - 452 - - - - - 453 - - - - - 454 - - - - - 457 - - - - - 459 - - - - - 460 - - - - - 462 - - - - - 465 - - - - - 466 - - - - - 485 - - - - - 490 - - - - - - - - 491 - - - - - - - - 492 - - - - - 494 - - - - - 496 - - - - - - - - 497 - - - - - - - - - - - - - - - - - 498 - - - - - 499 - - - - - 500 - - - - - 501 - - - - - 502 - - - - - 503 - - - - - - - - 504 - - - - - 505 - - - - - 506 - - - - - 507 - - - - - 508 - - - - - - - - - - - - - - - - 509 - - - - - 510 - - - - - 511 - - - - - 512 - - - - - 513 - - - - - 514 - - - - - 515 - - - - - 516 - - - - - 517 - - - - - 534 - - - - - 536 - - - - - - 8 - 0 - - 0 - 1 - - 229 - - 1000 - 3 - 9 - 1 - - - - - - - 537 - - - - - 593 - - - - - - 8 - 0 - - 0 - 1 - - 163 - - 1000 - 3 - 9 - 1 - - - - - - - 594 - - - - - 727 - - - - - - 7 - 0 - - 0 - 1 - - 183 - - 1000 - 3 - 9 - 1 - - - - - 8 - 0 - - 0 - 1 - - 22 - - 1000 - 3 - 9 - 1 - - - - - - - 728 - - - - - 775 - - - - - - - - 776 - - - - - 780 - - - - - - 7 - 0 - - 0 - 1 - - 100 - - 1000 - 3 - 9 - 1 - - - - - - - 781 - - - - - 884 - - - - - 981 - - - - - 982 - - - - - 1022 - - - - - 1026 - - - - - 979 - - - - - 985 - - - - - 977 - - - - - 1099 - - - - - 1093 - - - - - 1100 - - - - - 1098 - - - - - 1168 - - - - - 1167 - - - - - 1095 - - - - - 1166 - - - - - 1076 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{380, 496}, {480, 360}} - - - - - - - - - - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 1187 - - - - - LLCrashLoggerMacDelegate - NSObject - - id - id - id - - - - cancel: - id - - - remember: - id - - - send: - id - - - - NSTextField - NSButton - NSWindow - - - - crashText - NSTextField - - - rememberCheck - NSButton - - - window - NSWindow - - - - IBProjectSource - ./Classes/LLCrashLoggerMacDelegate.h - - - - NSLayoutConstraint - NSObject - - IBProjectSource - ./Classes/NSLayoutConstraint.h - - - - - 0 - IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - YES - 3 - - {11, 11} - {10, 3} - {15, 15} - - YES - - diff --git a/indra/mac_crash_logger/Info.plist b/indra/mac_crash_logger/Info.plist deleted file mode 100644 index 2ebed11c3f..0000000000 --- a/indra/mac_crash_logger/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - mac-crash-logger - CFBundleGetInfoString - - CFBundleIconFile - - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - APPL - CFBundleShortVersionString - - CFBundleSignature - ???? - CFBundleVersion - 1.0.0 - NSMainNibFile - CrashReporter - NSPrincipalClass - NSApplication - - diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp deleted file mode 100644 index ec3616e26a..0000000000 --- a/indra/mac_crash_logger/llcrashloggermac.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @file llcrashloggermac.cpp - * @brief Mac OSX crash logger implementation - * - * $LicenseInfo:firstyear=2003&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 "llcrashloggermac.h" - -#include - -#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME -#include "llerror.h" -#include "llfile.h" -#include "lltimer.h" -#include "llstring.h" -#include "lldir.h" -#include "llsdserialize.h" - -// Windows Message Handlers - -BOOL gFirstDialog = TRUE; -LLFILE *gDebugFile = NULL; - -std::string gUserNotes = ""; -bool gSendReport = false; -bool gRememberChoice = false; - -LLCrashLoggerMac::LLCrashLoggerMac(void) -{ -} - -LLCrashLoggerMac::~LLCrashLoggerMac(void) -{ -} - -bool LLCrashLoggerMac::init(void) -{ - bool ok = LLCrashLogger::init(); - return ok; -} - -void LLCrashLoggerMac::gatherPlatformSpecificFiles() -{ -} - -bool LLCrashLoggerMac::frame() -{ - - if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND) - { - gSendReport = true; - } - - if(gSendReport) - { - setUserText(gUserNotes); - sendCrashLogs(); - } - - LL_INFOS() << "Sending of logs complete" << LL_ENDL; - - return true; -} - -bool LLCrashLoggerMac::cleanup() -{ - commonCleanup(); - mKeyMaster.releaseMaster(); - return true; -} diff --git a/indra/mac_crash_logger/llcrashloggermac.h b/indra/mac_crash_logger/llcrashloggermac.h deleted file mode 100644 index 05ef8c9f53..0000000000 --- a/indra/mac_crash_logger/llcrashloggermac.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * @file llcrashloggermac.h - * @brief Mac OSX crash logger definition - * - * $LicenseInfo:firstyear=2003&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$ - */ - -#ifndef LLCRASHLOGGERMAC_H -#define LLCRASHLOGGERMAC_H - -#include "linden_common.h" -#include "llcrashlogger.h" -#include "llstring.h" - -class LLCrashLoggerMac : public LLCrashLogger -{ -public: - LLCrashLoggerMac(void); - ~LLCrashLoggerMac(void); - virtual bool init(); - virtual bool frame(); - virtual bool cleanup(); - virtual void gatherPlatformSpecificFiles(); -}; - -#endif diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.h b/indra/mac_crash_logger/llcrashloggermacdelegate.h deleted file mode 100644 index c998a8efe2..0000000000 --- a/indra/mac_crash_logger/llcrashloggermacdelegate.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file llcrashloggermacdelegate.h - * @brief Mac OSX crash logger implementation - * - * $LicenseInfo:firstyear=2003&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$ - */ - -/* -#import - -@interface LLCrashLoggerMacDelegate : NSObject -{ - IBOutlet NSTextField *crashText; - IBOutlet NSButton *rememberCheck; - - NSWindow *_window; - bool mRemember; - -} - -- (void)setWindow:(NSWindow *)newWindow; -- (NSWindow *)window; - -- (IBAction)remember:(id)sender; -- (IBAction)send:(id)sender; -- (IBAction)cancel:(id)sender; - -@property (assign) IBOutlet NSWindow *window; - -@end -*/ - - diff --git a/indra/mac_crash_logger/llcrashloggermacdelegate.mm b/indra/mac_crash_logger/llcrashloggermacdelegate.mm deleted file mode 100644 index b2af76a47c..0000000000 --- a/indra/mac_crash_logger/llcrashloggermacdelegate.mm +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file llcrashloggermacdelegate.mm - * @brief Mac OSX crash logger implementation - * - * $LicenseInfo:firstyear=2003&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$ - */ - - -/* -#import "llcrashloggermacdelegate.h" -#include - -extern std::string gUserNotes; -extern bool gSendReport; -extern bool gRememberChoice; - -@implementation LLCrashLoggerMacDelegate - -- (void)setWindow:(NSWindow *)window -{ - _window = window; -} - -- (NSWindow *)window -{ - return _window; -} - -- (void)dealloc -{ - [super dealloc]; -} - -std::string* NSToString( NSString *ns_str ) -{ - return ( new std::string([ns_str UTF8String]) ); -} - -- (IBAction)remember:(id)sender -{ - gRememberChoice = [rememberCheck state]; -} - -- (IBAction)send:(id)sender -{ - std::string* user_input = NSToString([crashText stringValue]); - gUserNotes = *user_input; - gSendReport = true; -} - -- (IBAction)cancel:(id)sender -{ - [ _window close]; -} -@end -*/ \ No newline at end of file diff --git a/indra/mac_crash_logger/mac_crash_logger.cpp b/indra/mac_crash_logger/mac_crash_logger.cpp deleted file mode 100644 index 54e41a1954..0000000000 --- a/indra/mac_crash_logger/mac_crash_logger.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file mac_crash_logger.cpp - * @brief Mac OSX crash logger implementation - * - * $LicenseInfo:firstyear=2003&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 "linden_common.h" -#include "llcrashloggermac.h" -#include "indra_constants.h" -#include "llpidlock.h" - -#include - -int main(int argc, char **argv) -{ - LLCrashLoggerMac app; - app.parseCommandOptions(argc, argv); - - LLSD options = LLApp::instance()->getOptionData( - LLApp::PRIORITY_COMMAND_LINE); - - if (! app.init()) - { - LL_WARNS() << "Unable to initialize application." << LL_ENDL; - return 1; - } - - if (app.getCrashBehavior() != CRASH_BEHAVIOR_ALWAYS_SEND) - { -// return NSApplicationMain(argc, (const char **)argv); - } - app.frame(); - app.cleanup(); - - LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; - - return 0; -} diff --git a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp index f7d35b33c2..5d4a488e64 100644 --- a/indra/media_plugins/libvlc/media_plugin_libvlc.cpp +++ b/indra/media_plugins/libvlc/media_plugin_libvlc.cpp @@ -34,6 +34,11 @@ #include "llpluginmessageclasses.h" #include "media_plugin_base.h" +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + #include "vlc/vlc.h" #include "vlc/libvlc_version.h" diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index e77c062989..d9df04b6b6 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1835,10 +1835,6 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt - ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll - ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll - ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll ${viewer_APPSETTINGS_FILES} SLPlugin media_plugin_cef @@ -1855,11 +1851,15 @@ if (WINDOWS) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp_x64.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1-x64.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1-x64.dll ) else (ADDRESS_SIZE EQUAL 64) list(APPEND COPY_INPUT_DEPENDENCIES ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1.dll ) endif (ADDRESS_SIZE EQUAL 64) diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py deleted file mode 100755 index d351c406bc..0000000000 --- a/indra/newview/generate_breakpad_symbols.py +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env python -"""\ -@file generate_breakpad_symbols.py -@author Brad Kittenbrink -@brief Simple tool for generating google_breakpad symbol information - for the crash reporter. - -$LicenseInfo:firstyear=2010&license=viewerlgpl$ -Second Life Viewer Source Code -Copyright (C) 2010-2011, 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$ -""" - - -import collections -import fnmatch -import itertools -import os -import re -import sys -import shlex -import subprocess -import tarfile -import StringIO -import pprint - -DEBUG=False - -def usage(): - print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] - -class MissingModuleError(Exception): - def __init__(self, modules): - Exception.__init__(self, "Failed to find required modules: %r" % modules) - self.modules = modules - -def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): - print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) - - if not re.match("release", configuration, re.IGNORECASE): - print "skipping breakpad symbol generation for non-release build." - return 0 - - # split up list of viewer_exes - # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] - viewer_exes = shlex.split(viewer_exes) - - found_required = dict([(module, False) for module in viewer_exes]) - - def matches(f): - if f in viewer_exes: - found_required[f] = True - return True - return fnmatch.fnmatch(f, libs_suffix) - - search_dirs = search_dirs.split(";") - - def list_files(): - for search_dir in search_dirs: - for (dirname, subdirs, filenames) in os.walk(search_dir): - if DEBUG: - print "scanning '%s' for modules..." % dirname - for f in itertools.ifilter(matches, filenames): - yield os.path.join(dirname, f) - - def dump_module(m): - print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) - dsym_full_path = m - child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE) - out, err = child.communicate() - return (m,child.returncode, out, err) - - - modules = {} - - for m in list_files(): - if DEBUG: - print "examining module '%s' ... " % m, - filename=os.path.basename(m) - if -1 != m.find("DWARF"): - # Just use this module; it has the symbols we want. - modules[filename] = m - if DEBUG: - print "found dSYM entry" - elif filename not in modules: - # Only use this if we don't already have a (possibly better) entry. - modules[filename] = m - if DEBUG: - print "found new entry" - elif DEBUG: - print "ignoring entry" - - - print "Found these following modules:" - pprint.pprint( modules ) - - out = tarfile.open(viewer_symbol_file, 'w:bz2') - for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()): - if status == 0: - module_line = symbols[:symbols.index('\n')] - module_line = module_line.split() - hash_id = module_line[3] - module = ' '.join(module_line[4:]) - if sys.platform in ['win32', 'cygwin']: - mod_name = module[:module.rindex('.pdb')] - else: - mod_name = module - symbolfile = StringIO.StringIO(symbols) - info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) - info.size = symbolfile.len - out.addfile(info, symbolfile) - else: - print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) - - out.close() - - missing_modules = [m for (m,_) in - itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) - ] - if missing_modules: - print >> sys.stderr, "failed to generate %s" % viewer_symbol_file - os.remove(viewer_symbol_file) - raise MissingModuleError(missing_modules) - - symbols = tarfile.open(viewer_symbol_file, 'r:bz2') - tarfile_members = symbols.getnames() - symbols.close() - - for required_module in viewer_exes: - def match_module_basename(m): - return os.path.splitext(required_module)[0].lower() \ - == os.path.splitext(os.path.basename(m))[0].lower() - # there must be at least one .sym file in tarfile_members that matches - # each required module (ignoring file extensions) - if not any(itertools.imap(match_module_basename, tarfile_members)): - print >> sys.stderr, "failed to find required %s in generated %s" \ - % (required_module, viewer_symbol_file) - os.remove(viewer_symbol_file) - raise MissingModuleError([required_module]) - - print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) - - return 0 - -if __name__ == "__main__": - if len(sys.argv) != 7: - usage() - sys.exit(1) - sys.exit(main(*sys.argv[1:])) - diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index ebe1e3f826..74cb4491a0 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -739,7 +739,7 @@ LLAppViewer::LLAppViewer() std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); # endif // ! LL_BUGSPLAT mDumpPath = logdir; - setMiniDumpDir(logdir); + setDebugFileNames(logdir); } diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0afb70958c..95f6efa29a 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -109,7 +109,6 @@ public: virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism. // return false if the error trap needed restoration. - virtual void initCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report? static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon. void checkForCrash(); diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index d5a80864be..b0e325a955 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -44,7 +44,6 @@ public: protected: virtual bool restoreErrorTrap(); - virtual void initCrashReporting(bool reportFreeze); std::string generateSerialNumber(); virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 9daea515e5..25d18fa11f 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -599,9 +599,6 @@ bool LLAppViewerWin32::init() #if ! defined(LL_BUGSPLAT) #pragma message("Building without BugSplat") - LLAppViewer* pApp = LLAppViewer::instance(); - pApp->initCrashReporting(); - #else // LL_BUGSPLAT #pragma message("Building with BugSplat") @@ -846,57 +843,6 @@ bool LLAppViewerWin32::restoreErrorTrap() return true; // we don't check for handler collisions on windows, so just say they're ok } -void LLAppViewerWin32::initCrashReporting(bool reportFreeze) -{ - if (isSecondInstance()) return; //BUG-5707 do not start another crash reporter for second instance. - - const char* logger_name = "win_crash_logger.exe"; - std::string exe_path = gDirUtilp->getExecutableDir(); - exe_path += gDirUtilp->getDirDelimiter(); - exe_path += logger_name; - - std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); - std::string appname = gDirUtilp->getExecutableFilename(); - - S32 slen = logdir.length() -1; - S32 end = slen; - while (logdir.at(end) == '/' || logdir.at(end) == '\\') end--; - - if (slen !=end) - { - logdir = logdir.substr(0,end+1); - } - //std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); - //_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str.c_str(), NULL); - std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); - - STARTUPINFO startInfo={sizeof(startInfo)}; - PROCESS_INFORMATION processInfo; - - std::wstring exe_wstr; - exe_wstr = utf8str_to_utf16str(exe_path); - - std::wstring arg_wstr; - arg_wstr = utf8str_to_utf16str(arg_str); - - LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL; - if(CreateProcess(exe_wstr.c_str(), - &arg_wstr[0], // Application arguments - 0, - 0, - FALSE, - CREATE_DEFAULT_ERROR_MODE, - 0, - 0, // Working directory - &startInfo, - &processInfo) == FALSE) - // Could not start application -> call 'GetLastError()' - { - LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL; - return; - } -} - //virtual bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url) { diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 47091aa3b2..410737b27f 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -452,7 +452,7 @@ public: virtual LLPointer getCertificate(X509* openssl_cert)=0; // instantiate a chain from an X509_STORE_CTX - virtual LLPointer getCertificateChain(const X509_STORE_CTX* chain)=0; + virtual LLPointer getCertificateChain(X509_STORE_CTX* chain)=0; // instantiate a cert store given it's id. if a persisted version // exists, it'll be loaded. If not, one will be created (but not diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 19db020a31..b4853d270a 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -95,7 +95,7 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert, LLBasicCertificate::LLBasicCertificate(X509* pCert, const LLSD* validation_params) { - if (!pCert || !pCert->cert_info) + if (!pCert) { LLTHROW(LLInvalidCertificate(LLSD::emptyMap())); } @@ -355,8 +355,8 @@ LLSD cert_name_from_X509_NAME(X509_NAME* name) char buffer[32]; X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index); - std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)), - M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); + std::string name_value = std::string((const char*)ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)), + ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry); OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0); @@ -683,29 +683,29 @@ std::string LLBasicCertificateStore::storeId() const // LLBasicCertificateChain // This class represents a chain of certs, each cert being signed by the next cert // in the chain. Certs must be properly signed by the parent -LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store) +LLBasicCertificateChain::LLBasicCertificateChain(X509_STORE_CTX* store) { // we're passed in a context, which contains a cert, and a blob of untrusted // certificates which compose the chain. - if((store == NULL) || (store->cert == NULL)) + if((store == NULL) || X509_STORE_CTX_get0_cert(store) == NULL) { LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL; return; } // grab the child cert - LLPointer current = new LLBasicCertificate(store->cert); + LLPointer current = new LLBasicCertificate(X509_STORE_CTX_get0_cert(store)); add(current); - if(store->untrusted != NULL) + if(X509_STORE_CTX_get0_untrusted(store) != NULL) { // if there are other certs in the chain, we build up a vector // of untrusted certs so we can search for the parents of each // consecutive cert. LLBasicCertificateVector untrusted_certs; - for(int i = 0; i < sk_X509_num(store->untrusted); i++) + for(int i = 0; i < sk_X509_num(X509_STORE_CTX_get0_untrusted(store)); i++) { - LLPointer cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i)); + LLPointer cert = new LLBasicCertificate(sk_X509_value(X509_STORE_CTX_get0_untrusted(store), i)); untrusted_certs.add(cert); } @@ -1348,9 +1348,10 @@ void LLSecAPIBasicHandler::_readProtectedData() // read in the rest of the file. - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); - EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL); + EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); + // todo: ctx error handling + + EVP_DecryptInit(ctx, EVP_rc4(), salt, NULL); // allocate memory: std::string decrypted_data; @@ -1358,14 +1359,14 @@ void LLSecAPIBasicHandler::_readProtectedData() // read data as a block: protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE); - EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length, + EVP_DecryptUpdate(ctx, decrypted_buffer, &decrypted_length, buffer, protected_data_stream.gcount()); decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount()); } // RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is // no block padding. - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); std::istringstream parse_stream(decrypted_data); if (parser->parse(parse_stream, mProtectedDataMap, LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) @@ -1401,12 +1402,14 @@ void LLSecAPIBasicHandler::_writeProtectedData() llofstream protected_data_stream(tmp_filename.c_str(), std::ios_base::binary); + EVP_CIPHER_CTX *ctx = NULL; try { - EVP_CIPHER_CTX ctx; - EVP_CIPHER_CTX_init(&ctx); - EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL); + ctx = EVP_CIPHER_CTX_new(); + // todo: ctx error handling + + EVP_EncryptInit(ctx, EVP_rc4(), salt, NULL); unsigned char unique_id[MAC_ADDRESS_BYTES]; LLMachineID::getUniqueID(unique_id, sizeof(unique_id)); LLXORCipher cipher(unique_id, sizeof(unique_id)); @@ -1421,13 +1424,13 @@ void LLSecAPIBasicHandler::_writeProtectedData() break; } int encrypted_length; - EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length, + EVP_EncryptUpdate(ctx, encrypted_buffer, &encrypted_length, buffer, formatted_data_istream.gcount()); protected_data_stream.write((const char *)encrypted_buffer, encrypted_length); } // no EVP_EncrypteFinal, as this is a stream cipher - EVP_CIPHER_CTX_cleanup(&ctx); + EVP_CIPHER_CTX_free(ctx); protected_data_stream.close(); } @@ -1439,6 +1442,11 @@ void LLSecAPIBasicHandler::_writeProtectedData() // it may be, however. LLFile::remove(tmp_filename); + if (ctx) + { + EVP_CIPHER_CTX_free(ctx); + } + // EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData() // Decided throwing an exception here was overkill until we figure out why this happens //LLTHROW(LLProtectedDataException("Error writing Protected Data Store")); @@ -1491,7 +1499,7 @@ LLPointer LLSecAPIBasicHandler::getCertificate(X509* openssl_cert } // instantiate a chain from an X509_STORE_CTX -LLPointer LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) +LLPointer LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) { LLPointer result = new LLBasicCertificateChain(chain); return result; diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h index 0bc7f5230f..82670f9083 100644 --- a/indra/newview/llsechandler_basic.h +++ b/indra/newview/llsechandler_basic.h @@ -197,7 +197,7 @@ class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public { public: - LLBasicCertificateChain(const X509_STORE_CTX * store); + LLBasicCertificateChain(X509_STORE_CTX * store); virtual ~LLBasicCertificateChain() {} @@ -241,7 +241,7 @@ public: virtual LLPointer getCertificate(X509* openssl_cert); // instantiate a chain from an X509_STORE_CTX - virtual LLPointer getCertificateChain(const X509_STORE_CTX* chain); + virtual LLPointer getCertificateChain(X509_STORE_CTX* chain); // instantiate a cert store given it's id. if a persisted version // exists, it'll be loaded. If not, one will be created (but not diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp index caa3016d2e..37fbbb449b 100644 --- a/indra/newview/tests/llsecapi_test.cpp +++ b/indra/newview/tests/llsecapi_test.cpp @@ -57,7 +57,7 @@ void LLSecAPIBasicHandler::init() {} LLSecAPIBasicHandler::~LLSecAPIBasicHandler() {} LLPointer LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert) { return NULL; } LLPointer LLSecAPIBasicHandler::getCertificate(X509* openssl_cert) { return NULL; } -LLPointer LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; } +LLPointer LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) { return NULL; } LLPointer LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; } void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {} void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {} diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index e5d226a2a4..4c8d6c51b0 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -1217,8 +1217,8 @@ namespace tut // Single cert in the chain. X509_STORE_CTX *test_store = X509_STORE_CTX_new(); - test_store->cert = mX509ChildCert; - test_store->untrusted = NULL; + X509_STORE_CTX_set_cert(test_store, mX509ChildCert); + X509_STORE_CTX_set0_untrusted(test_store, NULL); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 1); @@ -1229,9 +1229,9 @@ namespace tut // cert + CA test_store = X509_STORE_CTX_new(); - test_store->cert = mX509ChildCert; - test_store->untrusted = sk_X509_new_null(); - sk_X509_push(test_store->untrusted, mX509IntermediateCert); + X509_STORE_CTX_set_cert(test_store, mX509ChildCert); + X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 2); @@ -1245,9 +1245,9 @@ namespace tut // cert + nonrelated test_store = X509_STORE_CTX_new(); - test_store->cert = mX509ChildCert; - test_store->untrusted = sk_X509_new_null(); - sk_X509_push(test_store->untrusted, mX509TestCert); + X509_STORE_CTX_set_cert(test_store, mX509ChildCert); + X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 1); @@ -1257,10 +1257,10 @@ namespace tut // cert + CA + nonrelated test_store = X509_STORE_CTX_new(); - test_store->cert = mX509ChildCert; - test_store->untrusted = sk_X509_new_null(); - sk_X509_push(test_store->untrusted, mX509IntermediateCert); - sk_X509_push(test_store->untrusted, mX509TestCert); + X509_STORE_CTX_set_cert(test_store, mX509ChildCert); + X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("two elements in store", test_chain->size(), 2); @@ -1273,10 +1273,10 @@ namespace tut // cert + intermediate + CA test_store = X509_STORE_CTX_new(); - test_store->cert = mX509ChildCert; - test_store->untrusted = sk_X509_new_null(); - sk_X509_push(test_store->untrusted, mX509IntermediateCert); - sk_X509_push(test_store->untrusted, mX509RootCert); + X509_STORE_CTX_set_cert(test_store, mX509ChildCert); + X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); + sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509RootCert); test_chain = new LLBasicCertificateChain(test_store); X509_STORE_CTX_free(test_store); ensure_equals("three elements in store", test_chain->size(), 3); diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 8b4184d13c..001cdb29f3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -553,9 +553,13 @@ class WindowsManifest(ViewerManifest): self.path("vivoxsdk.dll") self.path("ortp.dll") - # Security - self.path("ssleay32.dll") - self.path("libeay32.dll") + # OpenSSL + if (self.address_size == 64): + self.path("libcrypto-1_1-x64.dll") + self.path("libssl-1_1-x64.dll") + else: + self.path("libcrypto-1_1.dll") + self.path("libssl-1_1.dll") # HTTP/2 self.path("nghttp2.dll") @@ -1025,7 +1029,6 @@ class DarwinManifest(ViewerManifest): "libapr-1.0.dylib", "libaprutil-1.0.dylib", "libexpat.1.dylib", - "libexception_handler.dylib", "libGLOD.dylib", # libnghttp2.dylib is a symlink to # libnghttp2.major.dylib, which is a symlink to @@ -1061,19 +1064,15 @@ class DarwinManifest(ViewerManifest): # our apps executable_path = {} - embedded_apps = [ (os.path.join("llplugin", "slplugin"), "SLPlugin.app") ] - for app_bld_dir, app in embedded_apps: - self.path2basename(os.path.join(os.pardir, - app_bld_dir, self.args['configuration']), - app) - executable_path[app] = \ - self.dst_path_of(os.path.join(app, "Contents", "MacOS")) - - # our apps dependencies on shared libs - # for each app, for each dylib we collected in dylibs, - # create a symlink to the real copy of the dylib. - with self.prefix(dst=os.path.join(app, "Contents", "Resources")): - for libfile in dylibs: + self.path2basename(os.path.join(os.pardir, os.path.join("llplugin", "slplugin"), self.args['configuration']), "SLPlugin.app") + executable_path["SLPlugin.app"] = \ + self.dst_path_of(os.path.join("SLPlugin.app", "Contents", "MacOS")) + + # our apps dependencies on shared libs + # for each app, for each dylib we collected in dylibs, + # create a symlink to the real copy of the dylib. + with self.prefix(dst=os.path.join("SLPlugin.app", "Contents", "Resources")): + for libfile in dylibs: self.relsymlinkf(os.path.join(libfile_parent, libfile)) # Dullahan helper apps go inside SLPlugin.app @@ -1294,6 +1293,10 @@ class DarwinManifest(ViewerManifest): signed=False sign_attempts=3 sign_retry_wait=15 + libvlc_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_libvlc.dylib" + cef_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_cef.dylib" + slplugin_path = app_in_dmg + "/Contents/Resources/SLPlugin.app/Contents/MacOS/SLPlugin" + greenlet_path = app_in_dmg + "/Contents/Resources/updater/greenlet/_greenlet.so" while (not signed) and (sign_attempts > 0): try: sign_attempts-=1 @@ -1313,6 +1316,7 @@ class DarwinManifest(ViewerManifest): print >> sys.stderr, "Maximum codesign attempts exceeded; giving up" raise self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg]) + self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg]) finally: # Unmount the image even if exceptions from any of the above @@ -1365,7 +1369,7 @@ class LinuxManifest(ViewerManifest): with self.prefix(dst="bin"): self.path("secondlife-bin","do-not-directly-run-secondlife-bin") self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") - self.path2basename("../llplugin/slplugin", "SLPlugin") + self.path2basename("../llplugin/slplugin", "SLPlugin") #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323 with self.prefix(src="../viewer_components/manager", dst=""): self.path("*.py") diff --git a/indra/win_crash_logger/CMakeLists.txt b/indra/win_crash_logger/CMakeLists.txt deleted file mode 100644 index 86aa655f03..0000000000 --- a/indra/win_crash_logger/CMakeLists.txt +++ /dev/null @@ -1,105 +0,0 @@ -# -*- cmake -*- - -project(win_crash_logger) - -include(00-Common) -include(LLCommon) -include(LLCoreHttp) -include(LLCrashLogger) -include(LLMath) -include(LLMessage) -include(LLVFS) -include(LLWindow) -include(LLXML) -include(Linking) -include(LLSharedLibs) -include(GoogleBreakpad) -include(Boost) - -include_directories( - ${LLCOREHTTP_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LLCRASHLOGGER_INCLUDE_DIRS} - ${LLMATH_INCLUDE_DIRS} - ${LLWINDOW_INCLUDE_DIRS} - ${LLXML_INCLUDE_DIRS} - ${LLVFS_INCLUDE_DIRS} - ${BREAKPAD_INCLUDE_DIRECTORIES} - ) -include_directories(SYSTEM - ${LLCOMMON_SYSTEM_INCLUDE_DIRS} - ${LLXML_SYSTEM_INCLUDE_DIRS} - ) - -set(win_crash_logger_SOURCE_FILES - win_crash_logger.cpp - llcrashloggerwindows.cpp - ) - -set(win_crash_logger_HEADER_FILES - CMakeLists.txt - - llcrashloggerwindows.h - resource.h - StdAfx.h - win_crash_logger.h - ) - -set_source_files_properties(${win_crash_logger_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -set(win_crash_logger_RESOURCE_FILES - ll_icon.ico - ) - -set_source_files_properties(${win_crash_logger_RESOURCE_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -set(win_crash_logger_RESOURCE_FILES - win_crash_logger.rc - ${win_crash_logger_RESOURCE_FILES} - ) - -SOURCE_GROUP("Resource Files" FILES ${win_crash_logger_RESOURCE_FILES}) - -list(APPEND - win_crash_logger_SOURCE_FILES - ${win_crash_logger_HEADER_FILES} - ${win_crash_logger_RESOURCE_FILES} - ) - -add_executable(windows-crash-logger WIN32 ${win_crash_logger_SOURCE_FILES}) - - -target_link_libraries(windows-crash-logger - ${LEGACY_STDIO_LIBS} - ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} - ${LLCRASHLOGGER_LIBRARIES} - ${LLWINDOW_LIBRARIES} - ${LLVFS_LIBRARIES} - ${LLXML_LIBRARIES} - ${LLMESSAGE_LIBRARIES} - ${LLMATH_LIBRARIES} - ${LLCOREHTTP_LIBRARIES} - ${LLCOMMON_LIBRARIES} - ${BOOST_CONTEXT_LIBRARY} - ${BOOST_FIBER_LIBRARY} - ${WINDOWS_LIBRARIES} - dxguid - ${GOOGLE_PERFTOOLS_LIBRARIES} - user32 - gdi32 - oleaut32 - wininet - Wldap32 - ) - -if (WINDOWS) - set_target_properties(windows-crash-logger - PROPERTIES - LINK_FLAGS "/NODEFAULTLIB:LIBCMT" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - ) -endif (WINDOWS) - -ll_deploy_sharedlibs_command(windows-crash-logger) diff --git a/indra/win_crash_logger/StdAfx.cpp b/indra/win_crash_logger/StdAfx.cpp deleted file mode 100644 index f56711af73..0000000000 --- a/indra/win_crash_logger/StdAfx.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/** - * @file StdAfx.cpp - * @brief windows crash logger source file for includes - * - * $LicenseInfo:firstyear=2003&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$ - */ - -// stdafx.cpp : source file that includes just the standard includes -// win_crash_logger.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file diff --git a/indra/win_crash_logger/StdAfx.h b/indra/win_crash_logger/StdAfx.h deleted file mode 100644 index 35976658ac..0000000000 --- a/indra/win_crash_logger/StdAfx.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * @file StdAfx.h - * @brief standard system includes - * - * $LicenseInfo:firstyear=2003&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$ - */ - -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) -#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -// Windows Header Files: -#include - -// C RunTime Header Files -#include -#include -#include - -// Local Header Files - -// TODO: reference additional headers your program requires here - -//{{AFX_INSERT_LOCATION}} -// Microsoft Visual C++ will insert additional declarations immediately before the previous line. - -#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) diff --git a/indra/win_crash_logger/ll_icon.ico b/indra/win_crash_logger/ll_icon.ico deleted file mode 100644 index 566346dfe3..0000000000 Binary files a/indra/win_crash_logger/ll_icon.ico and /dev/null differ diff --git a/indra/win_crash_logger/llcrashloggerwindows.h b/indra/win_crash_logger/llcrashloggerwindows.h deleted file mode 100644 index f89b8708dc..0000000000 --- a/indra/win_crash_logger/llcrashloggerwindows.h +++ /dev/null @@ -1,86 +0,0 @@ -/** -* @file llcrashloggerwindows.h -* @brief Windows crash logger definition -* -* $LicenseInfo:firstyear=2003&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$ -*/ - -#ifndef LLCRASHLOGGERWINDOWS_H -#define LLCRASHLOGGERWINDOWS_H - -#include "llcrashlogger.h" -#include "windows.h" -#include "llstring.h" - -class LLSD; - -namespace google_breakpad { - class CrashGenerationServer; - class ClientInfo; -} - -class LLCrashLoggerWindows : public LLCrashLogger -{ -public: - LLCrashLoggerWindows(void); - ~LLCrashLoggerWindows(void); - static LLCrashLoggerWindows* sInstance; - - virtual bool init(); - virtual bool frame(); - virtual void updateApplication(const std::string& message = LLStringUtil::null); - virtual bool cleanup(); - virtual void gatherPlatformSpecificFiles(); - void setHandle(HINSTANCE hInst) { mhInst = hInst; } - int clients_connected() const { - return mClientsConnected; - } - bool getMessageWithTimeout(MSG *msg, UINT to); - - // Starts the processing loop. This function does not return unless the - // user is logging off or the user closes the crash service window. The - // return value is a good number to pass in ExitProcess(). - int processingLoop(); -private: - void ProcessDlgItemText(HWND hWnd, int nIDDlgItem); - void ProcessCaption(HWND hWnd); - bool initCrashServer(); - google_breakpad::CrashGenerationServer* mCrashHandler; - static void OnClientConnected(void* context, - const google_breakpad::ClientInfo* client_info); - - static void OnClientDumpRequest( - void* context, - const google_breakpad::ClientInfo* client_info, - const std::wstring* file_path); - - static void OnClientExited(void* context, - const google_breakpad::ClientInfo* client_info); - int mClientsConnected; - int mPID; - std::string mProcName; - - HINSTANCE mhInst; - -}; - -#endif diff --git a/indra/win_crash_logger/resource.h b/indra/win_crash_logger/resource.h deleted file mode 100644 index 37a387275e..0000000000 --- a/indra/win_crash_logger/resource.h +++ /dev/null @@ -1,63 +0,0 @@ -/** -* @file resource.h -* @brief Windows crash logger windows resources -* -* $LicenseInfo:firstyear=2003&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$ -*/ - -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by win_crash_logger.rc -// -#define IDC_MYICON 2 -#define IDD_REPORT 9 -#define IDD_WIN_CRASH_LOGGER_DIALOG 102 -#define IDD_ABOUTBOX 103 -#define IDS_APP_TITLE 103 -#define IDM_ABOUT 104 -#define IDM_EXIT 105 -#define IDS_HELLO 106 -#define IDI_WIN_CRASH_LOGGER 107 -#define IDI_SMALL 108 -#define IDC_WIN_CRASH_LOGGER 109 -#define IDR_MAINFRAME 128 -#define IDD_PROGRESS 129 -#define IDD_PREVREPORTBOX 130 -#define IDC_EDIT1 1000 -#define IDC_LOG 1004 -#define IDC_CHECK_AUTO 1006 -#define IDC_STATIC_HEADER 1007 -#define IDC_STATIC_WHATINFO 1008 -#define IDC_STATIC_MOTIVATION 1009 -#define IDC_STATIC_MSG 1010 -#define IDC_STATIC -1 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 131 -#define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1011 -#define _APS_NEXT_SYMED_VALUE 110 -#endif -#endif diff --git a/indra/win_crash_logger/win_crash_logger.cpp b/indra/win_crash_logger/win_crash_logger.cpp deleted file mode 100644 index 58746eba02..0000000000 --- a/indra/win_crash_logger/win_crash_logger.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file win_crash_logger.cpp - * @brief Windows crash logger implementation - * - * $LicenseInfo:firstyear=2003&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 "linden_common.h" -#include "stdafx.h" -#include -#include "llcrashloggerwindows.h" - -#ifdef _UNICODE -int APIENTRY wWinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPWSTR lpCmdLine, - int nCmdShow) -#else -int APIENTRY WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) -#endif //_UNICODE -{ - LL_INFOS() << "Starting crash reporter with args" << &lpCmdLine << LL_ENDL; - LLCrashLoggerWindows app; - app.setHandle(hInstance); -#ifdef _UNICODE - app.parseCommandOptions(__argc, __wargv); -#else - app.parseCommandOptions(__argc, __argv); -#endif //_UNICODE - - LLSD options = LLApp::instance()->getOptionData( - LLApp::PRIORITY_COMMAND_LINE); - if (!(options.has("pid") && options.has("dumpdir"))) - { - LL_WARNS() << "Insufficient parameters to crash report." << LL_ENDL; - } - if (! app.init()) - { - LL_WARNS() << "Unable to initialize application." << LL_ENDL; - return -1; - } - - app.processingLoop(); - app.frame(); - app.cleanup(); - LL_INFOS() << "Crash reporter finished normally." << LL_ENDL; - return 0; -} diff --git a/indra/win_crash_logger/win_crash_logger.h b/indra/win_crash_logger/win_crash_logger.h deleted file mode 100644 index 2cc2cf3dcf..0000000000 --- a/indra/win_crash_logger/win_crash_logger.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @file win_crash_logger.h - * @brief Windows crash logger project includes - * - * $LicenseInfo:firstyear=2003&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$ - */ - - -#if !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) -#define AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_ - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "resource.h" - - -#endif // !defined(AFX_WIN_CRASH_LOGGER_H__79802F4B_7C37_4F63_A2BB_0768788C3A27__INCLUDED_) diff --git a/indra/win_crash_logger/win_crash_logger.ico b/indra/win_crash_logger/win_crash_logger.ico deleted file mode 100644 index 386883523b..0000000000 Binary files a/indra/win_crash_logger/win_crash_logger.ico and /dev/null differ diff --git a/indra/win_crash_logger/win_crash_logger.rc b/indra/win_crash_logger/win_crash_logger.rc deleted file mode 100755 index 2819722f63..0000000000 --- a/indra/win_crash_logger/win_crash_logger.rc +++ /dev/null @@ -1,188 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS -#include "resource.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_WIN_CRASH_LOGGER ICON "ll_icon.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// Menu -// - -IDC_WIN_CRASH_LOGGER MENU -BEGIN - POPUP "&File" - BEGIN - MENUITEM "E&xit", IDM_EXIT - END - POPUP "&Help" - BEGIN - MENUITEM "&About ...", IDM_ABOUT - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_PROGRESS DIALOGEX 100, 100, 234, 33 -STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU -CAPTION "%s Crash Logger" -CLASS "WIN_CRASH_LOGGER" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - LTEXT "Static",IDC_LOG,7,7,220,8 -END - -IDD_REPORT DIALOGEX 100, 100, 297, 125 -STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU -CAPTION "%s Crash Logger" -CLASS "WIN_CRASH_LOGGER" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP - PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP - LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288,14 - LTEXT "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.",IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP - CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 - LTEXT "Sending crash reports is the best way to help us improve the quality of %s.",IDC_STATIC_MOTIVATION,4,43,288,8 - LTEXT "If you continue to experience this problem, please try:",IDC_STATIC,4,57,251,8 - LTEXT "- Contacting support by visiting http://www.secondlife.com/support",IDC_STATIC,4,67,231,8 -END - -IDD_PREVREPORTBOX DIALOGEX 100, 100, 232, 213 -STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU -CAPTION "%s Crash Logger" -CLASS "WIN_CRASH_LOGGER" -FONT 8, "MS Sans Serif", 0, 0, 0x0 -BEGIN - DEFPUSHBUTTON "Send Report",IDOK,131,193,45,15,WS_GROUP - EDITTEXT IDC_EDIT1,3,100,223,89,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL - PUSHBUTTON "Don't Send",IDCANCEL,181,193,45,15,WS_GROUP - LTEXT "%s appears to have crashed or frozen the last time it ran.",IDC_STATIC_HEADER,4,4,214,8 - LTEXT "This crash reporter collects information about your computer's",IDC_STATIC,4,17,201,8 - LTEXT "hardware configuration, operating system, and some %s",IDC_STATIC_MSG,4,25,212,8 - LTEXT "logs, all of which are used for debugging purposes only.",IDC_STATIC,4,33,210,8 - LTEXT "In the space below, please briefly describe what you were doing",IDC_STATIC,3,48,208,8 - LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3,56,204,8 - LTEXT "If you don't wish to send Linden Lab a crash report, press Don't Send.",IDC_STATIC,3,90,223,8 - LTEXT "This report is NOT read by customer support. If you have billing or",IDC_STATIC,3,68,208,8 - LTEXT "other questions, please go to: www.secondlife.com/support",IDC_STATIC,3,76,206,8 - CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,193,89,13 -END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -2 TEXTINCLUDE -BEGIN - "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""windows.h""\r\n" - "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" - "#include ""resource.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_PROGRESS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 227 - TOPMARGIN, 7 - BOTTOMMARGIN, 26 - END - - IDD_REPORT, DIALOG - BEGIN - RIGHTMARGIN, 292 - VERTGUIDE, 4 - BOTTOMMARGIN, 119 - HORZGUIDE, 4 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_APP_TITLE "win_crash_logger" - IDS_HELLO "Hello World!" - IDC_WIN_CRASH_LOGGER "WIN_CRASH_LOGGER" -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - -- cgit v1.3 From 7f0fcfa33240bf54371fb689cc61ee83e6991150 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 17 Nov 2021 23:27:17 +0200 Subject: SL-15241 Cleanup --- indra/llcommon/llerror.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index f0aacfa1be..2fe2e1bbce 100644 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -498,8 +498,6 @@ namespace protected: Globals(); public: - std::ostringstream messageStream; - bool messageStreamInUse; std::string mFatalMessage; void addCallSite(LLError::CallSite&); @@ -516,8 +514,7 @@ namespace }; Globals::Globals() - : messageStream(), - messageStreamInUse(false), + : callSites(), mSettingsConfig(new SettingsConfig()) { -- cgit v1.3 From f729cfc33f258781c5fd85a3d8773bf6149d12db Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Sat, 5 Jun 2021 22:02:54 -0700 Subject: SL-15742: Convert build scripts to Python 3 This changeset makes it possible to build the Second Life viewer using Python 3. It is designed to be used with an equivalent Autobuild branch so that a developer can compile without needing Python 2 on their machine. Breaking change: Python 2 support ending Rather than supporting two versions of Python, including one that was discontinued at the beginning of the year, this branch focuses on pouring future effort into Python 3 only. As a result, scripts do not need to be backwards compatible. This means that build environments, be they on personal computers and on build agents, need to have a compatible interpreter. Notes - SLVersionChecker will still use Python 2 on macOS - Fixed the message template url used by template_verifier.py --- BuildParams | 3 + autobuild.xml | 10 +- indra/cmake/Python.cmake | 48 ++----- indra/cmake/Variables.cmake | 2 +- indra/cmake/run_build_test.py | 18 ++- indra/copy_win_scripts/start-client.py | 10 +- indra/fix-incredibuild.py | 4 +- indra/lib/python/indra/ipc/llmessage.py | 12 +- indra/lib/python/indra/ipc/tokenstream.py | 2 +- indra/lib/python/indra/util/llmanifest.py | 99 ++++++------- indra/lib/python/indra/util/test_win32_manifest.py | 48 +++---- indra/llcommon/llleap.cpp | 2 +- indra/llcommon/tests/llleap_test.cpp | 41 +++--- indra/llcommon/tests/llprocess_test.cpp | 30 ++-- indra/llcommon/tests/llsdserialize_test.cpp | 15 +- indra/llcorehttp/tests/test_httprequest.hpp | 41 +++++- indra/llcorehttp/tests/test_llcorehttp_peer.py | 46 +++--- indra/llmessage/tests/test_llsdmessage_peer.py | 6 +- indra/llmessage/tests/testrunner.py | 36 ++--- indra/newview/build_win32_appConfig.py | 2 +- indra/newview/llappviewer.cpp | 1 + indra/newview/tests/test_llxmlrpc_peer.py | 6 +- indra/newview/viewer_manifest.py | 109 +++++++------- indra/test/test_llmanifest.py | 10 +- scripts/code_tools/modified_strings.py | 12 +- scripts/content_tools/anim_tool.py | 130 ++++++++--------- scripts/content_tools/arche_tool.py | 22 +-- scripts/content_tools/dae_tool.py | 30 ++-- scripts/content_tools/skel_tool.py | 160 ++++++++++----------- scripts/md5check.py | 12 +- scripts/metrics/viewer_asset_logs.py | 10 +- scripts/metrics/viewerstats.py | 54 +++---- scripts/packages-formatter.py | 23 +-- scripts/setup-path.py | 2 +- scripts/template_verifier.py | 75 +++++----- 35 files changed, 576 insertions(+), 555 deletions(-) (limited to 'indra/llcommon') diff --git a/BuildParams b/BuildParams index c5f96d5ee3..ce2eee73df 100644 --- a/BuildParams +++ b/BuildParams @@ -16,6 +16,9 @@ build_Linux_Doxygen = true # Need viewer-build-variables as well as other shared repositories buildscripts_shared_more_NAMEs="build_secrets build_variables" +# Python 3 / SL-15742 +BUILDSCRIPTS_PY3 = "true" + ################################################################ #### Examples of how to set the viewer_channel #### # diff --git a/autobuild.xml b/autobuild.xml index 5424e0629a..7beed38ffe 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -2127,9 +2127,9 @@ archive hash - 14fac452271ebfba37ba5ddcf5bffa54 + da57838d80cf332f4a3026713a13f086 url - http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/54842/510078/llphysicsextensions_source-1.0.538972-darwin64-538972.tar.bz2 + https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/90708/824484/llphysicsextensions_source-1.0.565754-darwin64-565754.tar.bz2 name darwin64 @@ -2151,16 +2151,16 @@ archive hash - f3c066c1aebed8a6519a3e5ce64b9a3c + 28ad884012aa0bb70cf4101853af2f9a url - http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/54982/511796/llphysicsextensions_source-1.0.538972-windows-538972.tar.bz2 + https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/90733/824570/llphysicsextensions_source-1.0.565768-windows-565768.tar.bz2 name windows version - 1.0.538972 + 1.0.565768 llphysicsextensions_stub diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index a81c9307fc..ed595f6966 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -6,47 +6,27 @@ if (WINDOWS) # On Windows, explicitly avoid Cygwin Python. find_program(PYTHON_EXECUTABLE - NAMES python25.exe python23.exe python.exe + NAMES python.exe NO_DEFAULT_PATH # added so that cmake does not find cygwin python PATHS - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] - [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] - [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] - ) -elseif (EXISTS /etc/debian_version) - # On Debian and Ubuntu, avoid Python 2.4 if possible. - - find_program(PYTHON_EXECUTABLE python PATHS /usr/bin) - - if (PYTHON_EXECUTABLE) - set(PYTHONINTERP_FOUND ON) - endif (PYTHON_EXECUTABLE) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - # On MAC OS X be sure to search standard locations first - - string(REPLACE ":" ";" PATH_LIST "$ENV{PATH}") - find_program(PYTHON_EXECUTABLE - NAMES python python25 python24 python23 - NO_DEFAULT_PATH # Avoid searching non-standard locations first - PATHS - /bin - /usr/bin - /usr/local/bin - ${PATH_LIST} + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.7\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.8\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.9\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.10\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.11\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\3.7\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\3.8\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\3.9\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\3.10\\InstallPath] + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\3.11\\InstallPath] ) + include(FindPythonInterp) +else() + find_program(PYTHON_EXECUTABLE python3) if (PYTHON_EXECUTABLE) set(PYTHONINTERP_FOUND ON) endif (PYTHON_EXECUTABLE) -else (WINDOWS) - include(FindPythonInterp) endif (WINDOWS) if (NOT PYTHON_EXECUTABLE) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index c81b22e572..e72475cbc4 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -60,7 +60,7 @@ if (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) set(INSTALL_PROPRIETARY ON CACHE BOOL "Install proprietary binaries") endif (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) set(TEMPLATE_VERIFIER_OPTIONS "" CACHE STRING "Options for scripts/template_verifier.py") -set(TEMPLATE_VERIFIER_MASTER_URL "http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg" CACHE STRING "Location of the master message template") +set(TEMPLATE_VERIFIER_MASTER_URL "https://bitbucket.org/lindenlab/master-message-template-git/raw/master/message_template.msg" CACHE STRING "Location of the master message template") if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index ec5d33f902..1e92868ae7 100755 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file run_build_test.py @author Nat Goodspeed @@ -17,7 +17,7 @@ line. Example: -python run_build_test.py -DFOO=bar myprog somearg otherarg +python3 run_build_test.py -DFOO=bar myprog somearg otherarg sets environment variable FOO=bar, then runs: myprog somearg otherarg @@ -47,7 +47,7 @@ $/LicenseInfo$ import os import sys import errno -import HTMLParser +import html.parser import re import signal import subprocess @@ -111,10 +111,10 @@ def main(command, arguments=[], libpath=[], vars={}): # Now handle arbitrary environment variables. The tricky part is ensuring # that all the keys and values we try to pass are actually strings. if vars: - for key, value in vars.items(): + for key, value in list(vars.items()): # As noted a few lines above, facilitate copy-paste rerunning. log.info("%s='%s' \\" % (key, value)) - os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()])) + os.environ.update(dict([(str(key), str(value)) for key, value in vars.items()])) # Run the child process. command_list = [command] command_list.extend(arguments) @@ -177,7 +177,7 @@ def translate_rc(rc): try: table = get_windows_table() symbol, desc = table[hexrc] - except Exception, err: + except Exception as err: log.error("(%s -- carrying on)" % err) log.error("terminated with rc %s (%s)" % (rc, hexrc)) else: @@ -194,7 +194,7 @@ def translate_rc(rc): strc = str(rc) return "terminated by signal %s" % strc -class TableParser(HTMLParser.HTMLParser): +class TableParser(html.parser.HTMLParser): """ This HTMLParser subclass is designed to parse the table we know exists in windows-rcs.html, hopefully without building in too much knowledge of @@ -204,9 +204,7 @@ class TableParser(HTMLParser.HTMLParser): whitespace = re.compile(r'\s*$') def __init__(self): - # Because Python 2.x's HTMLParser is an old-style class, we must use - # old-style syntax to forward the __init__() call -- not super(). - HTMLParser.HTMLParser.__init__(self) + super().__init__() # this will collect all the data, eventually self.table = [] # Stack whose top (last item) indicates where to append current diff --git a/indra/copy_win_scripts/start-client.py b/indra/copy_win_scripts/start-client.py index 5699f5273f..6e5628c211 100755 --- a/indra/copy_win_scripts/start-client.py +++ b/indra/copy_win_scripts/start-client.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file start-client.py @@ -28,12 +28,12 @@ import os import llstart def usage(): - print """start-client.py + print("""start-client.py --grid --farm --region - """ + """) def start_client(grid, slurl, build_config, my_args): login_url = "https://login.%s.lindenlab.com/cgi-bin/login.cgi" % (grid) @@ -42,7 +42,7 @@ def start_client(grid, slurl, build_config, my_args): "--loginuri" : login_url } viewer_args.update(my_args) # *sigh* We must put --url at the end of the argument list. - if viewer_args.has_key("--url"): + if "--url" in viewer_args: slurl = viewer_args["--url"] del(viewer_args["--url"]) viewer_args = llstart.get_args_from_dict(viewer_args) @@ -54,7 +54,7 @@ def start_client(grid, slurl, build_config, my_args): # but the exe is at indra/build-/newview/ build_path = os.path.dirname(os.getcwd()); f = open("start-client.log", "w") - print >>f, "Viewer startup arguments:" + print("Viewer startup arguments:", file=f) llstart.start("viewer", "../../newview", "%s/newview/%s/secondlife-bin.exe" % (build_path, build_config), viewer_args, f) diff --git a/indra/fix-incredibuild.py b/indra/fix-incredibuild.py index 98f16e9d97..678ee4329e 100755 --- a/indra/fix-incredibuild.py +++ b/indra/fix-incredibuild.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 ## ## $LicenseInfo:firstyear=2011&license=viewerlgpl$ ## Second Life Viewer Source Code @@ -27,7 +27,7 @@ import glob def delete_file_types(path, filetypes): if os.path.exists(path): - print 'Cleaning: ' + path + print('Cleaning: ' + path) orig_dir = os.getcwd(); os.chdir(path) filelist = [] diff --git a/indra/lib/python/indra/ipc/llmessage.py b/indra/lib/python/indra/ipc/llmessage.py index 91fb36b72c..663e2d9c63 100755 --- a/indra/lib/python/indra/ipc/llmessage.py +++ b/indra/lib/python/indra/ipc/llmessage.py @@ -26,8 +26,8 @@ THE SOFTWARE. $/LicenseInfo$ """ -from compatibility import Incompatible, Older, Newer, Same -from tokenstream import TokenStream +from .compatibility import Incompatible, Older, Newer, Same +from .tokenstream import TokenStream ### ### Message Template @@ -42,8 +42,8 @@ class Template: def compatibleWithBase(self, base): messagenames = ( - frozenset(self.messages.keys()) - | frozenset(base.messages.keys()) + frozenset(list(self.messages.keys())) + | frozenset(list(base.messages.keys())) ) compatibility = Same() @@ -142,7 +142,7 @@ class Message: baselen = len(base.blocks) samelen = min(selflen, baselen) - for i in xrange(0, samelen): + for i in range(0, samelen): selfblock = self.blocks[i] baseblock = base.blocks[i] @@ -196,7 +196,7 @@ class Block(object): selflen = len(self.variables) baselen = len(base.variables) - for i in xrange(0, min(selflen, baselen)): + for i in range(0, min(selflen, baselen)): selfvar = self.variables[i] basevar = base.variables[i] diff --git a/indra/lib/python/indra/ipc/tokenstream.py b/indra/lib/python/indra/ipc/tokenstream.py index b96f26d3ff..ab97e94846 100755 --- a/indra/lib/python/indra/ipc/tokenstream.py +++ b/indra/lib/python/indra/ipc/tokenstream.py @@ -60,7 +60,7 @@ class ParseError(Exception): return "line %d: %s @ ... %s" % ( self.line, self.reason, self._contextString()) - def __nonzero__(self): + def __bool__(self): return False diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 4bc70b2ca4..30b7228289 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -28,7 +28,7 @@ $/LicenseInfo$ """ from collections import namedtuple, defaultdict -import commands +import subprocess import errno import filecmp import fnmatch @@ -162,20 +162,20 @@ BASE_ARGUMENTS=[ def usage(arguments, srctree=""): nd = {'name':sys.argv[0]} - print """Usage: + print("""Usage: %(name)s [options] [destdir] Options: - """ % nd + """ % nd) for arg in arguments: default = arg['default'] if hasattr(default, '__call__'): default = "(computed value) \"" + str(default(srctree)) + '"' elif default is not None: default = '"' + default + '"' - print "\t--%s Default: %s\n\t%s\n" % ( + print("\t--%s Default: %s\n\t%s\n" % ( arg['name'], default, - arg['description'] % nd) + arg['description'] % nd)) def main(extra=[]): ## print ' '.join((("'%s'" % item) if ' ' in item else item) @@ -200,10 +200,10 @@ def main(extra=[]): for k in 'artwork build dest source'.split(): args[k] = os.path.normpath(args[k]) - print "Source tree:", args['source'] - print "Artwork tree:", args['artwork'] - print "Build tree:", args['build'] - print "Destination tree:", args['dest'] + print("Source tree:", args['source']) + print("Artwork tree:", args['artwork']) + print("Build tree:", args['build']) + print("Destination tree:", args['dest']) # early out for help if 'help' in args: @@ -226,7 +226,7 @@ def main(extra=[]): vf = open(args['versionfile'], 'r') args['version'] = vf.read().strip().split('.') except: - print "Unable to read versionfile '%s'" % args['versionfile'] + print("Unable to read versionfile '%s'" % args['versionfile']) raise # unspecified, default, and agni are default @@ -238,7 +238,7 @@ def main(extra=[]): # debugging for opt in args: - print "Option:", opt, "=", args[opt] + print("Option:", opt, "=", args[opt]) # pass in sourceid as an argument now instead of an environment variable args['sourceid'] = os.environ.get("sourceid", "") @@ -246,18 +246,18 @@ def main(extra=[]): # Build base package. touch = args.get('touch') if touch: - print '================ Creating base package' + print('================ Creating base package') else: - print '================ Starting base copy' + print('================ Starting base copy') wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) wm.do(*args['actions']) # Store package file for later if making touched file. base_package_file = "" if touch: - print '================ Created base package ', wm.package_file + print('================ Created base package ', wm.package_file) base_package_file = "" + wm.package_file else: - print '================ Finished base copy' + print('================ Finished base copy') # handle multiple packages if set # ''.split() produces empty list @@ -284,26 +284,26 @@ def main(extra=[]): args['sourceid'] = os.environ.get(package_id + "_sourceid") args['dest'] = base_dest_template.format(package_id) if touch: - print '================ Creating additional package for "', package_id, '" in ', args['dest'] + print('================ Creating additional package for "', package_id, '" in ', args['dest']) else: - print '================ Starting additional copy for "', package_id, '" in ', args['dest'] + print('================ Starting additional copy for "', package_id, '" in ', args['dest']) try: wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) wm.do(*args['actions']) except Exception as err: sys.exit(str(err)) if touch: - print '================ Created additional package ', wm.package_file, ' for ', package_id + print('================ Created additional package ', wm.package_file, ' for ', package_id) with open(base_touch_template.format(package_id), 'w') as fp: fp.write('set package_file=%s\n' % wm.package_file) else: - print '================ Finished additional copy "', package_id, '" in ', args['dest'] + print('================ Finished additional copy "', package_id, '" in ', args['dest']) # Write out the package file in this format, so that it can easily be called # and used in a .bat file - yeah, it sucks, but this is the simplest... if touch: with open(touch, 'w') as fp: fp.write('set package_file=%s\n' % base_package_file) - print 'touched', touch + print('touched', touch) return 0 class LLManifestRegistry(type): @@ -315,8 +315,7 @@ class LLManifestRegistry(type): MissingFile = namedtuple("MissingFile", ("pattern", "tried")) -class LLManifest(object): - __metaclass__ = LLManifestRegistry +class LLManifest(object, metaclass=LLManifestRegistry): manifests = {} def for_platform(self, platform, arch = None): if arch: @@ -408,8 +407,8 @@ class LLManifest(object): def display_stacks(self): width = 1 + max(len(stack) for stack in self.PrefixManager.stacks) for stack in self.PrefixManager.stacks: - print "{} {}".format((stack + ':').ljust(width), - os.path.join(*getattr(self, stack))) + print("{} {}".format((stack + ':').ljust(width), + os.path.join(*getattr(self, stack)))) class PrefixManager(object): # stack attributes we manage in this LLManifest (sub)class @@ -426,7 +425,7 @@ class LLManifest(object): self.prevlen = { stack: len(getattr(self.manifest, stack)) - 1 for stack in self.stacks } - def __nonzero__(self): + def __bool__(self): # If the caller wrote: # if self.prefix(...): # then a value of this class had better evaluate as 'True'. @@ -452,7 +451,7 @@ class LLManifest(object): # if we restore the length of each stack to what it was before the # current prefix() block, it doesn't matter whether end_prefix() # was called or not. - for stack, prevlen in self.prevlen.items(): + for stack, prevlen in list(self.prevlen.items()): # find the attribute in 'self.manifest' named by 'stack', and # truncate that list back to 'prevlen' del getattr(self.manifest, stack)[prevlen:] @@ -471,7 +470,7 @@ class LLManifest(object): build = self.build_prefix.pop() dst = self.dst_prefix.pop() if descr and not(src == descr or build == descr or dst == descr): - raise ValueError, "End prefix '" + descr + "' didn't match '" +src+ "' or '" +dst + "'" + raise ValueError("End prefix '" + descr + "' didn't match '" +src+ "' or '" +dst + "'") def get_src_prefix(self): """ Returns the current source prefix.""" @@ -538,7 +537,7 @@ class LLManifest(object): Runs an external command. Raises ManifestError exception if the command returns a nonzero status. """ - print "Running command:", command + print("Running command:", command) sys.stdout.flush() try: subprocess.check_call(command) @@ -551,18 +550,15 @@ class LLManifest(object): a) verify that you really have created it b) schedule it for cleanup""" if not os.path.exists(path): - raise ManifestError, "Should be something at path " + path + raise ManifestError("Should be something at path " + path) self.created_paths.append(path) def put_in_file(self, contents, dst, src=None): # write contents as dst dst_path = self.dst_path_of(dst) self.cmakedirs(os.path.dirname(dst_path)) - f = open(dst_path, "wb") - try: + with open(dst_path, 'wb') as f: f.write(contents) - finally: - f.close() # Why would we create a file in the destination tree if not to include # it in the installer? The default src=None (plus the fact that the @@ -575,13 +571,12 @@ class LLManifest(object): if dst == None: dst = src # read src - f = open(self.src_path_of(src), "rbU") - contents = f.read() - f.close() + with open(self.src_path_of(src), "r") as f: + contents = f.read() # apply dict replacements - for old, new in searchdict.iteritems(): + for old, new in searchdict.items(): contents = contents.replace(old, new) - self.put_in_file(contents, dst) + self.put_in_file(contents.encode(), dst) self.created_paths.append(dst) def copy_action(self, src, dst): @@ -591,7 +586,7 @@ class LLManifest(object): self.created_paths.append(dst) self.ccopymumble(src, dst) else: - print "Doesn't exist:", src + print("Doesn't exist:", src) def package_action(self, src, dst): pass @@ -609,8 +604,8 @@ class LLManifest(object): # file error until all were resolved. This way permits the developer # to resolve them all at once. if self.missing: - print '*' * 72 - print "Missing files:" + print('*' * 72) + print("Missing files:") # Instead of just dumping each missing file and all the places we # looked for it, group by common sets of places we looked. Use a # set to store the 'tried' directories, to avoid mismatches due to @@ -621,13 +616,13 @@ class LLManifest(object): organize[frozenset(missingfile.tried)].add(missingfile.pattern) # Now dump all the patterns sought in each group of 'tried' # directories. - for tried, patterns in organize.items(): - print " Could not find in:" + for tried, patterns in list(organize.items()): + print(" Could not find in:") for dir in sorted(tried): - print " %s" % dir + print(" %s" % dir) for pattern in sorted(patterns): - print " %s" % pattern - print '*' * 72 + print(" %s" % pattern) + print('*' * 72) raise MissingError('%s patterns could not be found' % len(self.missing)) def copy_finish(self): @@ -640,7 +635,7 @@ class LLManifest(object): unpacked_file_name = "unpacked_%(plat)s_%(vers)s.tar" % { 'plat':self.args['platform'], 'vers':'_'.join(self.args['version'])} - print "Creating unpacked file:", unpacked_file_name + print("Creating unpacked file:", unpacked_file_name) # could add a gz here but that doubles the time it takes to do this step tf = tarfile.open(self.src_path_of(unpacked_file_name), 'w:') # add the entire installation package, at the very top level @@ -651,7 +646,7 @@ class LLManifest(object): """ Delete paths that were specified to have been created by this script""" for c in self.created_paths: # *TODO is this gonna be useful? - print "Cleaning up " + c + print("Cleaning up " + c) def process_either(self, src, dst): # If it's a real directory, recurse through it -- @@ -700,7 +695,7 @@ class LLManifest(object): def remove(self, *paths): for path in paths: if os.path.exists(path): - print "Removing path", path + print("Removing path", path) if os.path.isdir(path): shutil.rmtree(path) else: @@ -762,7 +757,7 @@ class LLManifest(object): except (IOError, os.error) as why: errors.append((srcname, dstname, why)) if errors: - raise ManifestError, errors + raise ManifestError(errors) def cmakedirs(self, path): @@ -874,13 +869,13 @@ class LLManifest(object): break else: # no more prefixes left to try - print("\nunable to find '%s'; looked in:\n %s" % (src, '\n '.join(try_prefixes))) + print(("\nunable to find '%s'; looked in:\n %s" % (src, '\n '.join(try_prefixes)))) self.missing.append(MissingFile(pattern=src, tried=try_prefixes)) # At this point 'count' might never have been successfully # assigned! Even if it was, though, we can be sure it is 0. return 0 - print "%d files" % count + print("%d files" % count) # Let caller check whether we processed as many files as expected. In # particular, let caller notice 0. diff --git a/indra/lib/python/indra/util/test_win32_manifest.py b/indra/lib/python/indra/util/test_win32_manifest.py index 0532cb0065..98faef9bf9 100755 --- a/indra/lib/python/indra/util/test_win32_manifest.py +++ b/indra/lib/python/indra/util/test_win32_manifest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file test_win32_manifest.py @brief Test an assembly binding version and uniqueness in a windows dll or exe. @@ -44,10 +44,10 @@ class NoMatchingAssemblyException(AssemblyTestException): pass def get_HKLM_registry_value(key_str, value_str): - import _winreg - reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) - key = _winreg.OpenKey(reg, key_str) - value = _winreg.QueryValueEx(key, value_str)[0] + import winreg + reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + key = winreg.OpenKey(reg, key_str) + value = winreg.QueryValueEx(key, value_str)[0] #print 'Found: %s' % value return value @@ -62,13 +62,13 @@ def find_vc_dir(): (product, version)) try: return get_HKLM_registry_value(key_str, value_str) - except WindowsError, err: + except WindowsError as err: x64_key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' % version) try: return get_HKLM_registry_value(x64_key_str, value_str) except: - print >> sys.stderr, "Didn't find MS %s version %s " % (product,version) + print("Didn't find MS %s version %s " % (product,version), file=sys.stderr) raise @@ -78,7 +78,7 @@ def find_mt_path(): return mt_path def test_assembly_binding(src_filename, assembly_name, assembly_ver): - print "checking %s dependency %s..." % (src_filename, assembly_name) + print("checking %s dependency %s..." % (src_filename, assembly_name)) (tmp_file_fd, tmp_file_name) = tempfile.mkstemp(suffix='.xml') tmp_file = os.fdopen(tmp_file_fd) @@ -89,10 +89,10 @@ def test_assembly_binding(src_filename, assembly_name, assembly_ver): if os.path.splitext(src_filename)[1].lower() == ".dll": resource_id = ";#2" system_call = '%s -nologo -inputresource:%s%s -out:%s > NUL' % (mt_path, src_filename, resource_id, tmp_file_name) - print "Executing: %s" % system_call + print("Executing: %s" % system_call) mt_result = os.system(system_call) if mt_result == 31: - print "No manifest found in %s" % src_filename + print("No manifest found in %s" % src_filename) raise NoManifestException() manifest_dom = parse(tmp_file_name) @@ -104,30 +104,30 @@ def test_assembly_binding(src_filename, assembly_name, assembly_ver): versions.append(node.getAttribute('version')) if len(versions) == 0: - print "No matching assemblies found in %s" % src_filename + print("No matching assemblies found in %s" % src_filename) raise NoMatchingAssemblyException() elif len(versions) > 1: - print "Multiple bindings to %s found:" % assembly_name - print versions - print + print("Multiple bindings to %s found:" % assembly_name) + print(versions) + print() raise MultipleBindingsException(versions) elif versions[0] != assembly_ver: - print "Unexpected version found for %s:" % assembly_name - print "Wanted %s, found %s" % (assembly_ver, versions[0]) - print + print("Unexpected version found for %s:" % assembly_name) + print("Wanted %s, found %s" % (assembly_ver, versions[0])) + print() raise UnexpectedVersionException(assembly_ver, versions[0]) os.remove(tmp_file_name) - print "SUCCESS: %s OK!" % src_filename - print + print("SUCCESS: %s OK!" % src_filename) + print() if __name__ == '__main__': - print - print "Running test_win32_manifest.py..." + print() + print("Running test_win32_manifest.py...") usage = 'test_win32_manfest ' @@ -136,9 +136,9 @@ if __name__ == '__main__': assembly_name = sys.argv[2] assembly_ver = sys.argv[3] except: - print "Usage:" - print usage - print + print("Usage:") + print(usage) + print() raise test_assembly_binding(src_filename, assembly_name, assembly_ver) diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index e8ea0ab398..2704f8b6de 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -86,7 +86,7 @@ public: // notice Python specially: we provide Python LLSD serialization // support, so there's a pretty good reason to implement plugins // in that language. - if (cparams.args.size() && (desclower == "python" || desclower == "python.exe")) + if (cparams.args.size() && (desclower == "python" || desclower == "python3" || desclower == "python.exe")) { mDesc = LLProcess::basename(cparams.args()[0]); } diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 9d71e327d8..9754353ab0 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -145,13 +145,13 @@ namespace tut " data = ''.join(parts)\n" " assert len(data) == length\n" " try:\n" - " return llsd.parse(data)\n" + " return llsd.parse(data.encode())\n" // Seems the old indra.base.llsd module didn't properly // convert IndexError (from running off end of string) to // LLSDParseError. - " except (IndexError, llsd.LLSDParseError), e:\n" + " except (IndexError, llsd.LLSDParseError) as e:\n" " msg = 'Bad received packet (%s)' % e\n" - " print >>sys.stderr, '%s, %s bytes:' % (msg, len(data))\n" + " print('%s, %s bytes:' % (msg, len(data)), file=sys.stderr)\n" " showmax = 40\n" // We've observed failures with very large packets; // dumping the entire packet wastes time and space. @@ -167,12 +167,12 @@ namespace tut " data = data[:trunc]\n" " ellipsis = '... (%s more)' % (length - trunc)\n" " offset = -showmax\n" - " for offset in xrange(0, len(data)-showmax, showmax):\n" - " print >>sys.stderr, '%04d: %r +' % \\\n" - " (offset, data[offset:offset+showmax])\n" + " for offset in range(0, len(data)-showmax, showmax):\n" + " print('%04d: %r +' % \\\n" + " (offset, data[offset:offset+showmax]), file=sys.stderr)\n" " offset += showmax\n" - " print >>sys.stderr, '%04d: %r%s' % \\\n" - " (offset, data[offset:], ellipsis)\n" + " print('%04d: %r%s' % \\\n" + " (offset, data[offset:], ellipsis), file=sys.stderr)\n" " raise ParseError(msg, data)\n" "\n" "# deal with initial stdin message\n" @@ -189,7 +189,7 @@ namespace tut " sys.stdout.flush()\n" "\n" "def send(pump, data):\n" - " put(llsd.format_notation(dict(pump=pump, data=data)))\n" + " put(llsd.format_notation(dict(pump=pump, data=data)).decode())\n" "\n" "def request(pump, data):\n" " # we expect 'data' is a dict\n" @@ -253,7 +253,7 @@ namespace tut { set_test_name("bad stdout protocol"); NamedTempFile script("py", - "print 'Hello from Python!'\n"); + "print('Hello from Python!')\n"); CaptureLog log(LLError::LEVEL_WARN); waitfor(LLLeap::create(get_test_name(), sv(list_of(PYTHON)(script.getName())))); @@ -438,8 +438,8 @@ namespace tut // guess how many messages it will take to // accumulate BUFFERED_LENGTH "count = int(" << BUFFERED_LENGTH << "/samplen)\n" - "print >>sys.stderr, 'Sending %s requests' % count\n" - "for i in xrange(count):\n" + "print('Sending %s requests' % count, file=sys.stderr)\n" + "for i in range(count):\n" " request('" << api.getName() << "', dict(reqid=i))\n" // The assumption in this specific test that // replies will arrive in the same order as @@ -450,7 +450,7 @@ namespace tut // arbitrary order, and we'd have to tick them // off from a set. "result = ''\n" - "for i in xrange(count):\n" + "for i in range(count):\n" " resp = get()\n" " if resp['data']['reqid'] != i:\n" " result = 'expected reqid=%s in %s' % (i, resp)\n" @@ -476,13 +476,13 @@ namespace tut "desired = int(sys.argv[1])\n" // 7 chars per item: 6 digits, 1 comma "count = int((desired - 50)/7)\n" - "large = ''.join('%06d,' % i for i in xrange(count))\n" + "large = ''.join('%06d,' % i for i in range(count))\n" // Pass 'large' as reqid because we know the API // will echo reqid, and we want to receive it back. "request('" << api.getName() << "', dict(reqid=large))\n" "try:\n" " resp = get()\n" - "except ParseError, e:\n" + "except ParseError as e:\n" " # try to find where e.data diverges from expectation\n" // Normally we'd expect a 'pump' key in there, // too, with value replypump(). But Python @@ -493,17 +493,18 @@ namespace tut // strange. " expect = llsd.format_notation(dict(data=dict(reqid=large)))\n" " chunk = 40\n" - " for offset in xrange(0, max(len(e.data), len(expect)), chunk):\n" + " for offset in range(0, max(len(e.data), len(expect)), chunk):\n" " if e.data[offset:offset+chunk] != \\\n" " expect[offset:offset+chunk]:\n" - " print >>sys.stderr, 'Offset %06d: expect %r,\\n'\\\n" + " print('Offset %06d: expect %r,\\n'\\\n" " ' get %r' %\\\n" " (offset,\n" " expect[offset:offset+chunk],\n" - " e.data[offset:offset+chunk])\n" + " e.data[offset:offset+chunk]),\n" + " file=sys.stderr)\n" " break\n" " else:\n" - " print >>sys.stderr, 'incoming data matches expect?!'\n" + " print('incoming data matches expect?!', file=sys.stderr)\n" " send('" << result.getName() << "', '%s: %s' % (e.__class__.__name__, e))\n" " sys.exit(1)\n" "\n" @@ -512,7 +513,7 @@ namespace tut " send('" << result.getName() << "', '')\n" " sys.exit(0)\n" // Here we know echoed did NOT match; try to find where - "for i in xrange(count):\n" + "for i in range(count):\n" " start = 7*i\n" " end = 7*(i+1)\n" " if end > len(echoed)\\\n" diff --git a/indra/llcommon/tests/llprocess_test.cpp b/indra/llcommon/tests/llprocess_test.cpp index f0eafa8201..e530975e86 100644 --- a/indra/llcommon/tests/llprocess_test.cpp +++ b/indra/llcommon/tests/llprocess_test.cpp @@ -360,10 +360,10 @@ namespace tut "import time" EOL EOL "time.sleep(2)" EOL - "print >>sys.stdout, 'stdout after wait'" EOL + "print('stdout after wait', file=sys.stdout)" EOL "sys.stdout.flush()" EOL "time.sleep(2)" EOL - "print >>sys.stderr, 'stderr after wait'" EOL + "print('stderr after wait', file=sys.stderr)" EOL "sys.stderr.flush()" EOL ); @@ -381,7 +381,11 @@ namespace tut std::vector argv; apr_proc_t child; +#if defined(LL_WINDOWS) argv.push_back("python"); +#else + argv.push_back("python3"); +#endif // Have to have a named copy of this std::string so its c_str() value // will persist. std::string scriptname(script.getName()); @@ -573,7 +577,7 @@ namespace tut // note nonstandard output-file arg! "with open(sys.argv[3], 'w') as f:\n" " for arg in sys.argv[1:]:\n" - " print >>f, arg\n"); + " print(arg, file=f)\n"); // We expect that PythonProcessLauncher has already appended // its own NamedTempFile to mParams.args (sys.argv[0]). py.mParams.args.add("first arg"); // sys.argv[1] @@ -742,7 +746,7 @@ namespace tut "with open(sys.argv[1], 'w') as f:\n" " f.write('ok')\n" "# wait for 'go' from test program\n" - "for i in xrange(60):\n" + "for i in range(60):\n" " time.sleep(1)\n" " with open(sys.argv[2]) as f:\n" " go = f.read()\n" @@ -804,7 +808,7 @@ namespace tut "with open(sys.argv[1], 'w') as f:\n" " f.write('ok')\n" "# wait for 'go' from test program\n" - "for i in xrange(60):\n" + "for i in range(60):\n" " time.sleep(1)\n" " with open(sys.argv[2]) as f:\n" " go = f.read()\n" @@ -857,7 +861,7 @@ namespace tut set_test_name("'bogus' test"); CaptureLog recorder; PythonProcessLauncher py(get_test_name(), - "print 'Hello world'\n"); + "print('Hello world')\n"); py.mParams.files.add(LLProcess::FileParam("bogus")); py.mPy = LLProcess::create(py.mParams); ensure("should have rejected 'bogus'", ! py.mPy); @@ -872,7 +876,7 @@ namespace tut // Replace this test with one or more real 'file' tests when we // implement 'file' support PythonProcessLauncher py(get_test_name(), - "print 'Hello world'\n"); + "print('Hello world')\n"); py.mParams.files.add(LLProcess::FileParam()); py.mParams.files.add(LLProcess::FileParam("file")); py.mPy = LLProcess::create(py.mParams); @@ -887,7 +891,7 @@ namespace tut // implement 'tpipe' support CaptureLog recorder; PythonProcessLauncher py(get_test_name(), - "print 'Hello world'\n"); + "print('Hello world')\n"); py.mParams.files.add(LLProcess::FileParam()); py.mParams.files.add(LLProcess::FileParam("tpipe")); py.mPy = LLProcess::create(py.mParams); @@ -904,7 +908,7 @@ namespace tut // implement 'npipe' support CaptureLog recorder; PythonProcessLauncher py(get_test_name(), - "print 'Hello world'\n"); + "print('Hello world')\n"); py.mParams.files.add(LLProcess::FileParam()); py.mParams.files.add(LLProcess::FileParam()); py.mParams.files.add(LLProcess::FileParam("npipe")); @@ -980,7 +984,7 @@ namespace tut { set_test_name("get*Pipe() validation"); PythonProcessLauncher py(get_test_name(), - "print 'this output is expected'\n"); + "print('this output is expected)'\n"); py.mParams.files.add(LLProcess::FileParam("pipe")); // pipe for stdin py.mParams.files.add(LLProcess::FileParam()); // inherit stdout py.mParams.files.add(LLProcess::FileParam("pipe")); // pipe for stderr @@ -1001,13 +1005,13 @@ namespace tut set_test_name("talk to stdin/stdout"); PythonProcessLauncher py(get_test_name(), "import sys, time\n" - "print 'ok'\n" + "print('ok')\n" "sys.stdout.flush()\n" "# wait for 'go' from test program\n" "go = sys.stdin.readline()\n" "if go != 'go\\n':\n" " sys.exit('expected \"go\", saw %r' % go)\n" - "print 'ack'\n"); + "print('ack')\n"); py.mParams.files.add(LLProcess::FileParam("pipe")); // stdin py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout py.launch(); @@ -1118,7 +1122,7 @@ namespace tut { set_test_name("ReadPipe \"eof\" event"); PythonProcessLauncher py(get_test_name(), - "print 'Hello from Python!'\n"); + "print('Hello from Python!')\n"); py.mParams.files.add(LLProcess::FileParam()); // stdin py.mParams.files.add(LLProcess::FileParam("pipe")); // stdout py.launch(); diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 642c1c3879..c246f5ee56 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -1795,7 +1795,7 @@ namespace tut set_test_name("verify NamedTempFile"); python("platform", "import sys\n" - "print 'Running on', sys.platform\n"); + "print('Running on', sys.platform)\n"); } // helper for test<3> @@ -1825,14 +1825,14 @@ namespace tut const char pydata[] = "def verify(iterable):\n" " it = iter(iterable)\n" - " assert it.next() == 17\n" - " assert abs(it.next() - 3.14) < 0.01\n" - " assert it.next() == '''\\\n" + " assert next(it) == 17\n" + " assert abs(next(it) - 3.14) < 0.01\n" + " assert next(it) == '''\\\n" "This string\n" "has several\n" "lines.'''\n" " try:\n" - " it.next()\n" + " next(it)\n" " except StopIteration:\n" " pass\n" " else:\n" @@ -1855,7 +1855,7 @@ namespace tut " yield llsd.parse(item)\n" << pydata << // Don't forget raw-string syntax for Windows pathnames. - "verify(parse_each(open(r'" << file.getName() << "')))\n"); + "verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n"); } template<> template<> @@ -1870,7 +1870,6 @@ namespace tut python("write Python notation", placeholders::arg1 << - "from __future__ import with_statement\n" << import_llsd << "DATA = [\n" " 17,\n" @@ -1884,7 +1883,7 @@ namespace tut // N.B. Using 'print' implicitly adds newlines. "with open(r'" << file.getName() << "', 'w') as f:\n" " for item in DATA:\n" - " print >>f, llsd.format_notation(item)\n"); + " print(llsd.format_notation(item).decode(), file=f)\n"); std::ifstream inf(file.getName().c_str()); LLSD item; diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp index 3cdd17919d..154f6b12e9 100644 --- a/indra/llcorehttp/tests/test_httprequest.hpp +++ b/indra/llcorehttp/tests/test_httprequest.hpp @@ -135,7 +135,9 @@ public: } } std::ostringstream str; - str << "Required header # " << i << " found in response"; + str << "Required header #" << i << " " + << mHeadersRequired[i].first << "=" << mHeadersRequired[i].second + << " not found in response"; ensure(str.str(), found); } } @@ -154,7 +156,9 @@ public: mHeadersDisallowed[i].second)) { std::ostringstream str; - str << "Disallowed header # " << i << " not found in response"; + str << "Disallowed header #" << i << " " + << mHeadersDisallowed[i].first << "=" << mHeadersDisallowed[i].second + << " found in response"; ensure(str.str(), false); } } @@ -2127,6 +2131,17 @@ void HttpRequestTestObjectType::test<18>() template <> template <> void HttpRequestTestObjectType::test<19>() { + // It appears that HttpRequest is fully capable of sending duplicate header values in violation of + // this test's expectations. Something needs to budge: is sending duplicate header values desired? + // + // Test server /reflect/ response headers (mirrored from request) + // + // X-Reflect-content-type: text/plain + // X-Reflect-content-type: text/html + // X-Reflect-content-type: application/llsd+xml + // + skip("FIXME: Bad assertions or broken functionality."); + ScopedCurlInit ready; // Warmup boost::regex to pre-alloc memory for memory size tests @@ -2307,6 +2322,17 @@ void HttpRequestTestObjectType::test<19>() template <> template <> void HttpRequestTestObjectType::test<20>() { + // It appears that HttpRequest is fully capable of sending duplicate header values in violation of + // this test's expectations. Something needs to budge: is sending duplicate header values desired? + // + // Test server /reflect/ response headers (mirrored from request) + // + // X-Reflect-content-type: text/plain + // X-Reflect-content-type: text/html + // X-Reflect-content-type: application/llsd+xml + // + skip("FIXME: Bad assertions or broken functionality."); + ScopedCurlInit ready; // Warmup boost::regex to pre-alloc memory for memory size tests @@ -2512,6 +2538,17 @@ void HttpRequestTestObjectType::test<20>() template <> template <> void HttpRequestTestObjectType::test<21>() { + // It appears that HttpRequest is fully capable of sending duplicate header values in violation of + // this test's expectations. Something needs to budge: is sending duplicate header values desired? + // + // Test server /reflect/ response headers (mirrored from request) + // + // X-Reflect-content-type: text/plain + // X-Reflect-content-type: text/html + // X-Reflect-content-type: application/llsd+xml + // + skip("FIXME: Bad assertions or broken functionality."); + ScopedCurlInit ready; // Warmup boost::regex to pre-alloc memory for memory size tests diff --git a/indra/llcorehttp/tests/test_llcorehttp_peer.py b/indra/llcorehttp/tests/test_llcorehttp_peer.py index 493143641b..778de90962 100755 --- a/indra/llcorehttp/tests/test_llcorehttp_peer.py +++ b/indra/llcorehttp/tests/test_llcorehttp_peer.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file test_llsdmessage_peer.py @author Nat Goodspeed @@ -34,11 +34,9 @@ import sys import time import select import getopt -try: - from cStringIO import StringIO -except ImportError: - from StringIO import StringIO -from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from io import StringIO +from http.server import HTTPServer, BaseHTTPRequestHandler + from llbase.fastest_elementtree import parse as xml_parse from llbase import llsd @@ -97,13 +95,13 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): except (KeyError, ValueError): return "" max_chunk_size = 10*1024*1024 - L = [] + L = bytes() while size_remaining: chunk_size = min(size_remaining, max_chunk_size) chunk = self.rfile.read(chunk_size) - L.append(chunk) + L += chunk size_remaining -= len(chunk) - return ''.join(L) + return L.decode("utf-8") # end of swiped read() logic def read_xml(self): @@ -127,8 +125,8 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): try: self.answer(dict(reply="success", status=200, reason="Your GET operation worked")) - except self.ignore_exceptions, e: - print >> sys.stderr, "Exception during GET (ignoring): %s" % str(e) + except self.ignore_exceptions as e: + print("Exception during GET (ignoring): %s" % str(e), file=sys.stderr) def do_POST(self): # Read the provided POST data. @@ -136,8 +134,8 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): try: self.answer(dict(reply="success", status=200, reason=self.read())) - except self.ignore_exceptions, e: - print >> sys.stderr, "Exception during POST (ignoring): %s" % str(e) + except self.ignore_exceptions as e: + print("Exception during POST (ignoring): %s" % str(e), file=sys.stderr) def do_PUT(self): # Read the provided PUT data. @@ -145,8 +143,8 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): try: self.answer(dict(reply="success", status=200, reason=self.read())) - except self.ignore_exceptions, e: - print >> sys.stderr, "Exception during PUT (ignoring): %s" % str(e) + except self.ignore_exceptions as e: + print("Exception during PUT (ignoring): %s" % str(e), file=sys.stderr) def answer(self, data, withdata=True): debug("%s.answer(%s): self.path = %r", self.__class__.__name__, data, self.path) @@ -221,7 +219,7 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): self.send_header("Content-type", "text/plain") self.end_headers() if body: - self.wfile.write(body) + self.wfile.write(body.encode("utf-8")) elif "fail" not in self.path: data = data.copy() # we're going to modify # Ensure there's a "reply" key in data, even if there wasn't before @@ -255,9 +253,9 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): self.end_headers() def reflect_headers(self): - for name in self.headers.keys(): - # print "Header: %s: %s" % (name, self.headers[name]) - self.send_header("X-Reflect-" + name, self.headers[name]) + for (name, val) in self.headers.items(): + # print("Header: %s %s" % (name, val), file=sys.stderr) + self.send_header("X-Reflect-" + name, val) if not VERBOSE: # When VERBOSE is set, skip both these overrides because they exist to @@ -283,10 +281,10 @@ class Server(HTTPServer): # default behavior which *shouldn't* cause the program to return # a failure status. def handle_error(self, request, client_address): - print '-'*40 - print 'Ignoring exception during processing of request from', - print client_address - print '-'*40 + print('-'*40) + print('Ignoring exception during processing of request from %' % (client_address)) + print('-'*40) + if __name__ == "__main__": do_valgrind = False @@ -307,7 +305,7 @@ if __name__ == "__main__": # "Then there's Windows" # Instantiate a Server(TestHTTPRequestHandler) on the first free port # in the specified port range. - httpd, port = freeport(xrange(8000, 8020), make_server) + httpd, port = freeport(range(8000, 8020), make_server) # Pass the selected port number to the subject test program via the # environment. We don't want to impose requirements on the test program's diff --git a/indra/llmessage/tests/test_llsdmessage_peer.py b/indra/llmessage/tests/test_llsdmessage_peer.py index 9cd2959ea1..5ba0749e31 100755 --- a/indra/llmessage/tests/test_llsdmessage_peer.py +++ b/indra/llmessage/tests/test_llsdmessage_peer.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file test_llsdmessage_peer.py @author Nat Goodspeed @@ -31,7 +31,7 @@ $/LicenseInfo$ import os import sys -from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from http.server import HTTPServer, BaseHTTPRequestHandler from llbase.fastest_elementtree import parse as xml_parse from llbase import llsd @@ -165,7 +165,7 @@ if __name__ == "__main__": # "Then there's Windows" # Instantiate a Server(TestHTTPRequestHandler) on the first free port # in the specified port range. - httpd, port = freeport(xrange(8000, 8020), make_server) + httpd, port = freeport(range(8000, 8020), make_server) # Pass the selected port number to the subject test program via the # environment. We don't want to impose requirements on the test program's diff --git a/indra/llmessage/tests/testrunner.py b/indra/llmessage/tests/testrunner.py index c25945067e..47c09ca245 100755 --- a/indra/llmessage/tests/testrunner.py +++ b/indra/llmessage/tests/testrunner.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file testrunner.py @author Nat Goodspeed @@ -41,7 +41,7 @@ VERBOSE = not re.match(r"(0|off|false|quiet)$", VERBOSE, re.IGNORECASE) if VERBOSE: def debug(fmt, *args): - print fmt % args + print(fmt % args) sys.stdout.flush() else: debug = lambda *args: None @@ -99,14 +99,14 @@ def freeport(portlist, expr): # error because we can't return meaningful values. We have no 'port', # therefore no 'expr(port)'. portiter = iter(portlist) - port = portiter.next() + port = next(portiter) while True: try: # If this value of port works, return as promised. value = expr(port) - except socket.error, err: + except socket.error as err: # Anything other than 'Address already in use', propagate if err.args[0] != errno.EADDRINUSE: raise @@ -117,9 +117,9 @@ def freeport(portlist, expr): type, value, tb = sys.exc_info() try: try: - port = portiter.next() + port = next(portiter) except StopIteration: - raise type, value, tb + raise type(value).with_traceback(tb) finally: # Clean up local traceback, see docs for sys.exc_info() del tb @@ -138,7 +138,7 @@ def freeport(portlist, expr): # If we've actually arrived at this point, portiter.next() delivered a # new port value. Loop back to pass that to expr(port). - except Exception, err: + except Exception as err: debug("*** freeport() raising %s: %s", err.__class__.__name__, err) raise @@ -227,13 +227,13 @@ def test_freeport(): def exc(exception_class, *args): try: yield - except exception_class, err: + except exception_class as err: for i, expected_arg in enumerate(args): assert expected_arg == err.args[i], \ "Raised %s, but args[%s] is %r instead of %r" % \ (err.__class__.__name__, i, err.args[i], expected_arg) - print "Caught expected exception %s(%s)" % \ - (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args)) + print("Caught expected exception %s(%s)" % \ + (err.__class__.__name__, ', '.join(repr(arg) for arg in err.args))) else: assert False, "Failed to raise " + exception_class.__class__.__name__ @@ -270,18 +270,18 @@ def test_freeport(): # This is the magic exception that should prompt us to retry inuse = socket.error(errno.EADDRINUSE, 'Address already in use') # Get the iterator to our ports list so we can check later if we've used all - ports = iter(xrange(5)) + ports = iter(range(5)) with exc(socket.error, errno.EADDRINUSE): freeport(ports, lambda port: raiser(inuse)) # did we entirely exhaust 'ports'? with exc(StopIteration): - ports.next() + next(ports) - ports = iter(xrange(2)) + ports = iter(range(2)) # Any exception but EADDRINUSE should quit immediately with exc(SomeError): freeport(ports, lambda port: raiser(SomeError())) - assert_equals(ports.next(), 1) + assert_equals(next(ports), 1) # ----------- freeport() with platform-dependent socket stuff ------------ # This is what we should've had unit tests to begin with (see CHOP-661). @@ -290,14 +290,14 @@ def test_freeport(): sock.bind(('127.0.0.1', port)) return sock - bound0, port0 = freeport(xrange(7777, 7780), newbind) + bound0, port0 = freeport(range(7777, 7780), newbind) assert_equals(port0, 7777) - bound1, port1 = freeport(xrange(7777, 7780), newbind) + bound1, port1 = freeport(range(7777, 7780), newbind) assert_equals(port1, 7778) - bound2, port2 = freeport(xrange(7777, 7780), newbind) + bound2, port2 = freeport(range(7777, 7780), newbind) assert_equals(port2, 7779) with exc(socket.error, errno.EADDRINUSE): - bound3, port3 = freeport(xrange(7777, 7780), newbind) + bound3, port3 = freeport(range(7777, 7780), newbind) if __name__ == "__main__": test_freeport() diff --git a/indra/newview/build_win32_appConfig.py b/indra/newview/build_win32_appConfig.py index 9fdceee1be..d18d7b88cb 100755 --- a/indra/newview/build_win32_appConfig.py +++ b/indra/newview/build_win32_appConfig.py @@ -38,7 +38,7 @@ def munge_binding_redirect_version(src_manifest_name, src_config_name, dst_confi comment = config_dom.createComment("This file is automatically generated by the build. see indra/newview/build_win32_appConfig.py") config_dom.insertBefore(comment, config_dom.childNodes[0]) - print "Writing: " + dst_config_name + print("Writing: " + dst_config_name) f = open(dst_config_name, 'w') config_dom.writexml(f) f.close() diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 69606793db..d65cbbe3a5 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1194,6 +1194,7 @@ bool LLAppViewer::init() updater.executable = gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, updater_file); #elif LL_DARWIN // explicitly run the system Python interpreter on SLVersionChecker.py + // Keep using python2 until SLVersionChecker is converted to python3. updater.executable = "python"; updater_file = "SLVersionChecker.py"; updater.args.add(gDirUtilp->add(gDirUtilp->getAppRODataDir(), "updater", updater_file)); diff --git a/indra/newview/tests/test_llxmlrpc_peer.py b/indra/newview/tests/test_llxmlrpc_peer.py index cff40aa4c2..365848b819 100755 --- a/indra/newview/tests/test_llxmlrpc_peer.py +++ b/indra/newview/tests/test_llxmlrpc_peer.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file test_llxmlrpc_peer.py @author Nat Goodspeed @@ -31,7 +31,7 @@ $/LicenseInfo$ import os import sys -from SimpleXMLRPCServer import SimpleXMLRPCServer +from xmlrpc.server import SimpleXMLRPCServer mydir = os.path.dirname(__file__) # expected to be .../indra/newview/tests/ sys.path.insert(0, os.path.join(mydir, os.pardir, os.pardir, "llmessage", "tests")) @@ -85,7 +85,7 @@ if __name__ == "__main__": # "Then there's Windows" # Instantiate a TestServer on the first free port in the specified # port range. - xmlrpcd, port = freeport(xrange(8000, 8020), make_server) + xmlrpcd, port = freeport(range(8000, 8020), make_server) # Pass the selected port number to the subject test program via the # environment. We don't want to impose requirements on the test program's diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index b932f43141..d6f5e4985b 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file viewer_manifest.py @author Ryan Williams @@ -76,7 +76,7 @@ class ViewerManifest(LLManifest): # include the extracted list of contributors contributions_path = "../../doc/contributions.txt" contributor_names = self.extract_names(contributions_path) - self.put_in_file(contributor_names, "contributors.txt", src=contributions_path) + self.put_in_file(contributor_names.encode(), "contributors.txt", src=contributions_path) # ... and the default camera position settings self.path("camera") @@ -115,17 +115,17 @@ class ViewerManifest(LLManifest): if sourceid: settings_install['sourceid'] = settings_template['sourceid'].copy() settings_install['sourceid']['Value'] = sourceid - print "Set sourceid in settings_install.xml to '%s'" % sourceid + print("Set sourceid in settings_install.xml to '%s'" % sourceid) if self.args.get('channel_suffix'): settings_install['CmdLineChannel'] = settings_template['CmdLineChannel'].copy() settings_install['CmdLineChannel']['Value'] = self.channel_with_pkg_suffix() - print "Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix() + print("Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix()) if self.args.get('grid'): settings_install['CmdLineGridChoice'] = settings_template['CmdLineGridChoice'].copy() settings_install['CmdLineGridChoice']['Value'] = self.grid() - print "Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid() + print("Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid()) # put_in_file(src=) need not be an actual pathname; it # only needs to be non-empty @@ -191,7 +191,7 @@ class ViewerManifest(LLManifest): #we likely no longer need the test, since we will throw an exception above, but belt and suspenders and we get the #return code for free. if not self.path2basename(os.pardir, "build_data.json"): - print "No build_data.json file" + print("No build_data.json file") def finish_build_data_dict(self, build_data_dict): return build_data_dict @@ -270,13 +270,13 @@ class ViewerManifest(LLManifest): return "icons/" + self.channel_type() def extract_names(self,src): + """Extract contributor names from source file, returns string""" try: - contrib_file = open(src,'r') + with open(src, 'r') as contrib_file: + lines = contrib_file.readlines() except IOError: - print "Failed to open '%s'" % src + print("Failed to open '%s'" % src) raise - lines = contrib_file.readlines() - contrib_file.close() # All lines up to and including the first blank line are the file header; skip them lines.reverse() # so that pop will pull from first to last line @@ -312,7 +312,7 @@ class ViewerManifest(LLManifest): """ Like ln -sf, but uses os.symlink() instead of running ln. This creates a symlink at 'dst' that points to 'src' -- see: - https://docs.python.org/2/library/os.html#os.symlink + https://docs.python.org/3/library/os.html#os.symlink If you omit 'dst', this creates a symlink with basename(src) at get_dst_prefix() -- in other words: put a symlink to this pathname @@ -374,11 +374,11 @@ class ViewerManifest(LLManifest): os.remove(dst) os.symlink(src, dst) elif os.path.isdir(dst): - print "Requested symlink (%s) exists but is a directory; replacing" % dst + print("Requested symlink (%s) exists but is a directory; replacing" % dst) shutil.rmtree(dst) os.symlink(src, dst) elif os.path.exists(dst): - print "Requested symlink (%s) exists but is a file; replacing" % dst + print("Requested symlink (%s) exists but is a file; replacing" % dst) os.remove(dst) os.symlink(src, dst) else: @@ -386,8 +386,8 @@ class ViewerManifest(LLManifest): raise except Exception as err: # report - print "Can't symlink %r -> %r: %s: %s" % \ - (dst, src, err.__class__.__name__, err) + print("Can't symlink %r -> %r: %s: %s" % \ + (dst, src, err.__class__.__name__, err)) # if caller asked us not to catch, re-raise this exception if not catch: raise @@ -448,7 +448,7 @@ class WindowsManifest(ViewerManifest): else: raise Exception("Directories are not supported by test_CRT_and_copy_action()") else: - print "Doesn't exist:", src + print("Doesn't exist:", src) def test_for_no_msvcrt_manifest_and_copy_action(self, src, dst): # This is used to test that no manifest for the msvcrt exists. @@ -477,7 +477,7 @@ class WindowsManifest(ViewerManifest): else: raise Exception("Directories are not supported by test_CRT_and_copy_action()") else: - print "Doesn't exist:", src + print("Doesn't exist:", src) def construct(self): super(WindowsManifest, self).construct() @@ -515,8 +515,8 @@ class WindowsManifest(ViewerManifest): try: self.path("glod.dll") except RuntimeError as err: - print err.message - print "Skipping GLOD library (assumming linked statically)" + print(err.message) + print("Skipping GLOD library (assumming linked statically)") # Get fmodstudio dll if needed if self.args['fmodstudio'] == 'ON': @@ -698,8 +698,7 @@ class WindowsManifest(ViewerManifest): result = "" dest_files = [pair[1] for pair in self.file_list if pair[0] and os.path.isfile(pair[1])] # sort deepest hierarchy first - dest_files.sort(lambda a,b: cmp(a.count(os.path.sep),b.count(os.path.sep)) or cmp(a,b)) - dest_files.reverse() + dest_files.sort(key=lambda f: (f.count(os.path.sep), f), reverse=True) out_path = None for pkg_file in dest_files: rel_file = os.path.normpath(pkg_file.replace(self.get_dst_prefix()+os.path.sep,'')) @@ -722,8 +721,7 @@ class WindowsManifest(ViewerManifest): for d in deleted_file_dirs: deleted_dirs.extend(path_ancestors(d)) # sort deepest hierarchy first - deleted_dirs.sort(lambda a,b: cmp(a.count(os.path.sep),b.count(os.path.sep)) or cmp(a,b)) - deleted_dirs.reverse() + deleted_dirs.sort(key=lambda f: (f.count(os.path.sep), f), reverse=True) prev = None for d in deleted_dirs: if d != prev: # skip duplicates @@ -809,19 +807,19 @@ class WindowsManifest(ViewerManifest): installer_created=False nsis_attempts=3 nsis_retry_wait=15 - for attempt in xrange(nsis_attempts): + for attempt in range(nsis_attempts): try: self.run_command([NSIS_path, '/V2', self.dst_path_of(tempfile)]) except ManifestError as err: if attempt+1 < nsis_attempts: - print >> sys.stderr, "nsis failed, waiting %d seconds before retrying" % nsis_retry_wait + print("nsis failed, waiting %d seconds before retrying" % nsis_retry_wait, file=sys.stderr) time.sleep(nsis_retry_wait) nsis_retry_wait*=2 else: # NSIS worked! Done! break else: - print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" + print("Maximum nsis attempts exceeded; giving up", file=sys.stderr) raise self.sign(installer_file) @@ -833,10 +831,10 @@ class WindowsManifest(ViewerManifest): python = os.environ.get('PYTHON', sys.executable) if os.path.exists(sign_py): dst_path = self.dst_path_of(exe) - print "about to run signing of: ", dst_path + print("about to run signing of: ", dst_path) self.run_command([python, sign_py, dst_path]) else: - print "Skipping code signing of %s %s: %s not found" % (self.dst_path_of(exe), exe, sign_py) + print("Skipping code signing of %s %s: %s not found" % (self.dst_path_of(exe), exe, sign_py)) def escape_slashes(self, path): return path.replace('\\', '\\\\\\\\') @@ -880,14 +878,15 @@ class DarwinManifest(ViewerManifest): if bugsplat_db: # Inject BugsplatServerURL into Info.plist if provided. Info_plist = self.dst_path_of("Info.plist") - Info = plistlib.readPlist(Info_plist) - # https://www.bugsplat.com/docs/platforms/os-x#configuration - Info["BugsplatServerURL"] = \ - "https://{}.bugsplat.com/".format(bugsplat_db) - self.put_in_file( - plistlib.writePlistToString(Info), - os.path.basename(Info_plist), - "Info.plist") + with open(Info_plist, 'rb') as f: + Info = plistlib.load(f) + # https://www.bugsplat.com/docs/platforms/os-x#configuration + Info["BugsplatServerURL"] = \ + "https://{}.bugsplat.com/".format(bugsplat_db) + self.put_in_file( + plistlib.dumps(Info), + os.path.basename(Info_plist), + "Info.plist") # CEF framework goes inside Contents/Frameworks. # Remember where we parked this car. @@ -1013,10 +1012,10 @@ class DarwinManifest(ViewerManifest): added = [os.path.relpath(d, self.get_dst_prefix()) for s, d in self.file_list[oldlen:]] except MissingError as err: - print >> sys.stderr, "Warning: "+err.msg + print("Warning: "+err.msg, file=sys.stderr) added = [] if not added: - print "Skipping %s" % dst + print("Skipping %s" % dst) return added # dylibs is a list of all the .dylib files we expect to need @@ -1208,7 +1207,7 @@ class DarwinManifest(ViewerManifest): # mount the image and get the name of the mount point and device node try: - hdi_output = subprocess.check_output(['hdiutil', 'attach', '-private', sparsename]) + hdi_output = subprocess.check_output(['hdiutil', 'attach', '-private', sparsename], text=True) except subprocess.CalledProcessError as err: sys.exit("failed to mount image at '%s'" % sparsename) @@ -1233,11 +1232,11 @@ class DarwinManifest(ViewerManifest): if not os.path.exists (self.src_path_of(dmg_template)): dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') - for s,d in {self.get_dst_prefix():app_name + ".app", + for s,d in list({self.get_dst_prefix():app_name + ".app", os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns", os.path.join(dmg_template, "background.jpg"): "background.jpg", - os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items(): - print "Copying to dmg", s, d + os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items()): + print("Copying to dmg", s, d) self.copy_action(self.src_path_of(s), os.path.join(volpath, d)) # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit) @@ -1262,7 +1261,7 @@ class DarwinManifest(ViewerManifest): # and invalidate the signatures. if 'signature' in self.args: app_in_dmg=os.path.join(volpath,self.app_name()+".app") - print "Attempting to sign '%s'" % app_in_dmg + print("Attempting to sign '%s'" % app_in_dmg) identity = self.args['signature'] if identity == '': identity = 'Developer ID Application' @@ -1313,11 +1312,11 @@ class DarwinManifest(ViewerManifest): signed=True # if no exception was raised, the codesign worked except ManifestError as err: if sign_attempts: - print >> sys.stderr, "codesign failed, waiting %d seconds before retrying" % sign_retry_wait + print("codesign failed, waiting %d seconds before retrying" % sign_retry_wait, file=sys.stderr) time.sleep(sign_retry_wait) sign_retry_wait*=2 else: - print >> sys.stderr, "Maximum codesign attempts exceeded; giving up" + print("Maximum codesign attempts exceeded; giving up", file=sys.stderr) raise self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg]) self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg]) @@ -1326,7 +1325,7 @@ class DarwinManifest(ViewerManifest): # Unmount the image even if exceptions from any of the above self.run_command(['hdiutil', 'detach', '-force', devfile]) - print "Converting temp disk image to final disk image" + print("Converting temp disk image to final disk image") self.run_command(['hdiutil', 'convert', sparsename, '-format', 'UDZO', '-imagekey', 'zlib-level=9', '-o', finalname]) # get rid of the temp file @@ -1383,7 +1382,7 @@ class LinuxManifest(ViewerManifest): # Get the icons based on the channel type icon_path = self.icon_path() - print "DEBUG: icon_path '%s'" % icon_path + print("DEBUG: icon_path '%s'" % icon_path) with self.prefix(src=icon_path) : self.path("secondlife_256.png","secondlife_icon.png") with self.prefix(dst="res-sdl") : @@ -1404,7 +1403,7 @@ class LinuxManifest(ViewerManifest): # llcommon if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"): - print "Skipping llcommon.so (assuming llcommon was linked statically)" + print("Skipping llcommon.so (assuming llcommon was linked statically)") self.path("featuretable_linux.txt") @@ -1439,14 +1438,14 @@ class LinuxManifest(ViewerManifest): '--numeric-owner', '-cjf', tempname + '.tar.bz2', installer_name]) else: - print "Skipping %s.tar.bz2 for non-Release build (%s)" % \ - (installer_name, self.args['buildtype']) + print("Skipping %s.tar.bz2 for non-Release build (%s)" % \ + (installer_name, self.args['buildtype'])) finally: self.run_command(["mv", tempname, realname]) def strip_binaries(self): if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): - print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + print("* Going strip-crazy on the packaged binaries, since this is a RELEASE build") # makes some small assumptions about our packaged dir structure self.run_command( ["find"] + @@ -1513,7 +1512,7 @@ class Linux_i686_Manifest(LinuxManifest): self.path("libtcmalloc.so*") #formerly called google perf tools pass except: - print "tcmalloc files not found, skipping" + print("tcmalloc files not found, skipping") pass if self.args['fmodstudio'] == 'ON': @@ -1523,7 +1522,7 @@ class Linux_i686_Manifest(LinuxManifest): self.path("libfmod.so") pass except: - print "Skipping libfmod.so - not found" + print("Skipping libfmod.so - not found") pass # Vivox runtimes @@ -1552,9 +1551,9 @@ class Linux_x86_64_Manifest(LinuxManifest): if __name__ == "__main__": # Report our own command line so that, in case of trouble, a developer can # manually rerun the same command. - print('%s \\\n%s' % + print(('%s \\\n%s' % (sys.executable, - ' '.join((("'%s'" % arg) if ' ' in arg else arg) for arg in sys.argv))) + ' '.join((("'%s'" % arg) if ' ' in arg else arg) for arg in sys.argv)))) # fmodstudio and openal can be used simultaneously and controled by environment extra_arguments = [ dict(name='bugsplat', description="""BugSplat database to which to post crashes, diff --git a/indra/test/test_llmanifest.py b/indra/test/test_llmanifest.py index a97abbc6ee..c746d59ff2 100755 --- a/indra/test/test_llmanifest.py +++ b/indra/test/test_llmanifest.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ @file test_llmanifest.py @author Ryan Williams @@ -124,10 +124,10 @@ class TestLLManifest(unittest.TestCase): def testcmakedirs(self): self.m.cmakedirs("test_dir_DELETE/nested/dir") - self.assert_(os.path.exists("test_dir_DELETE/nested/dir")) - self.assert_(os.path.isdir("test_dir_DELETE")) - self.assert_(os.path.isdir("test_dir_DELETE/nested")) - self.assert_(os.path.isdir("test_dir_DELETE/nested/dir")) + self.assertTrue(os.path.exists("test_dir_DELETE/nested/dir")) + self.assertTrue(os.path.isdir("test_dir_DELETE")) + self.assertTrue(os.path.isdir("test_dir_DELETE/nested")) + self.assertTrue(os.path.isdir("test_dir_DELETE/nested/dir")) os.removedirs("test_dir_DELETE/nested/dir") if __name__ == '__main__': diff --git a/scripts/code_tools/modified_strings.py b/scripts/code_tools/modified_strings.py index 6a763b6ec5..e7a9d239dc 100644 --- a/scripts/code_tools/modified_strings.py +++ b/scripts/code_tools/modified_strings.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ This script scans the SL codebase for translation-related strings. @@ -25,7 +25,7 @@ Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA $/LicenseInfo$ """ -from __future__ import print_function + import xml.etree.ElementTree as ET import argparse @@ -75,10 +75,10 @@ translate_attribs = [ ] def codify_for_print(val): - if isinstance(val, unicode): + if isinstance(val, str): return val.encode("utf-8") else: - return unicode(val, 'utf-8').encode("utf-8") + return str(val, 'utf-8').encode("utf-8") # Returns a dict of { name => xml_node } def read_xml_elements(blob): @@ -186,7 +186,7 @@ def make_translation_table(mod_tree, base_tree, lang, args): transl_dict = read_xml_elements(transl_blob) rows = 0 - for name in mod_dict.keys(): + for name in list(mod_dict.keys()): if not name in base_dict or mod_dict[name].text != base_dict[name].text or (args.missing and not name in transl_dict): elt = mod_dict[name] val = elt.text @@ -307,7 +307,7 @@ def save_translation_file(per_lang_data, aux_data, outfile): print("Added", num_translations, "rows for language", lang) # Reference info, not for translation - for aux, data in aux_data.items(): + for aux, data in list(aux_data.items()): df = pd.DataFrame(data, columns = ["Key", "Value"]) df.to_excel(writer, index=False, sheet_name=aux) worksheet = writer.sheets[aux] diff --git a/scripts/content_tools/anim_tool.py b/scripts/content_tools/anim_tool.py index 3aef8cd5ab..e7b86a88fa 100644 --- a/scripts/content_tools/anim_tool.py +++ b/scripts/content_tools/anim_tool.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 """\ @file anim_tool.py @author Brad Payne, Nat Goodspeed @@ -39,7 +39,7 @@ $/LicenseInfo$ import math import os import random -from cStringIO import StringIO +from io import StringIO import struct import sys from xml.etree import ElementTree @@ -179,7 +179,7 @@ class RotKey(object): return this def dump(self, f): - print >>f, " rot_key: t %.3f" % self.time,"st",self.time_short,"rot",",".join("%.3f" % f for f in self.rotation) + print(" rot_key: t %.3f" % self.time,"st",self.time_short,"rot",",".join("%.3f" % f for f in self.rotation), file=f) def pack(self, fp): fp.pack(">f, " pos_key: t %.3f" % self.time,"pos ",",".join("%.3f" % f for f in self.position) + print(" pos_key: t %.3f" % self.time,"pos ",",".join("%.3f" % f for f in self.position), file=f) def pack(self, fp): fp.pack(">f, " constraint:" - print >>f, " chain_length",self.chain_length - print >>f, " constraint_type",self.constraint_type - print >>f, " source_volume",self.source_volume - print >>f, " source_offset",self.source_offset - print >>f, " target_volume",self.target_volume - print >>f, " target_offset",self.target_offset - print >>f, " target_dir",self.target_dir - print >>f, " ease_in_start",self.ease_in_start - print >>f, " ease_in_stop",self.ease_in_stop - print >>f, " ease_out_start",self.ease_out_start - print >>f, " ease_out_stop",self.ease_out_stop + print(" constraint:", file=f) + print(" chain_length",self.chain_length, file=f) + print(" constraint_type",self.constraint_type, file=f) + print(" source_volume",self.source_volume, file=f) + print(" source_offset",self.source_offset, file=f) + print(" target_volume",self.target_volume, file=f) + print(" target_offset",self.target_offset, file=f) + print(" target_dir",self.target_dir, file=f) + print(" ease_in_start",self.ease_in_start, file=f) + print(" ease_in_stop",self.ease_in_stop, file=f) + print(" ease_out_start",self.ease_out_start, file=f) + print(" ease_out_stop",self.ease_out_stop, file=f) class Constraints(object): @staticmethod @@ -266,7 +266,7 @@ class Constraints(object): this = Constraints() (num_constraints, ) = fup.unpack(">f, "constraints:",len(self.constraints) + print("constraints:",len(self.constraints), file=f) for c in self.constraints: c.dump(f) @@ -296,7 +296,7 @@ class PositionCurve(object): this = PositionCurve() (num_pos_keys, ) = fup.unpack(">f, " position_curve:" - print >>f, " num_pos_keys", len(self.keys) + print(" position_curve:", file=f) + print(" num_pos_keys", len(self.keys), file=f) for k in self.keys: k.dump(f) @@ -327,7 +327,7 @@ class RotationCurve(object): this = RotationCurve() (num_rot_keys, ) = fup.unpack(">f, " rotation_curve:" - print >>f, " num_rot_keys", len(self.keys) + print(" rotation_curve:", file=f) + print(" num_rot_keys", len(self.keys), file=f) for k in self.keys: k.dump(f) @@ -364,9 +364,9 @@ class JointInfo(object): self.position_curve.pack(fp) def dump(self, f): - print >>f, "joint:" - print >>f, " joint_name:",self.joint_name - print >>f, " joint_priority:",self.joint_priority + print("joint:", file=f) + print(" joint_name:",self.joint_name, file=f) + print(" joint_priority:",self.joint_priority, file=f) self.rotation_curve.dump(f) self.position_curve.dump(f) @@ -440,10 +440,10 @@ class Anim(object): fup.unpack("@ffiffII") self.joints = [JointInfo.unpack(self.duration, fup) - for j in xrange(num_joints)] + for j in range(num_joints)] if self.verbose: for joint_info in self.joints: - print "unpacked joint",joint_info.joint_name + print("unpacked joint",joint_info.joint_name) self.constraints = Constraints.unpack(self.duration, fup) self.buffer = fup.buffer @@ -461,17 +461,17 @@ class Anim(object): f = sys.stdout else: f = open(filename,"w") - print >>f, "versions: ", self.version, self.sub_version - print >>f, "base_priority: ", self.base_priority - print >>f, "duration: ", self.duration - print >>f, "emote_name: ", self.emote_name - print >>f, "loop_in_point: ", self.loop_in_point - print >>f, "loop_out_point: ", self.loop_out_point - print >>f, "loop: ", self.loop - print >>f, "ease_in_duration: ", self.ease_in_duration - print >>f, "ease_out_duration: ", self.ease_out_duration - print >>f, "hand_pose", self.hand_pose - print >>f, "num_joints", len(self.joints) + print("versions: ", self.version, self.sub_version, file=f) + print("base_priority: ", self.base_priority, file=f) + print("duration: ", self.duration, file=f) + print("emote_name: ", self.emote_name, file=f) + print("loop_in_point: ", self.loop_in_point, file=f) + print("loop_out_point: ", self.loop_out_point, file=f) + print("loop: ", self.loop, file=f) + print("ease_in_duration: ", self.ease_in_duration, file=f) + print("ease_out_duration: ", self.ease_out_duration, file=f) + print("hand_pose", self.hand_pose, file=f) + print("num_joints", len(self.joints), file=f) for j in self.joints: j.dump(f) self.constraints.dump(f) @@ -482,7 +482,7 @@ class Anim(object): fp.write(filename) def write_src_data(self, filename): - print "write file",filename + print("write file",filename) with open(filename,"wb") as f: f.write(self.buffer) @@ -501,11 +501,11 @@ class Anim(object): j = self.find_joint(name) if j: if self.verbose: - print "removing joint", name + print("removing joint", name) self.joints.remove(j) else: if self.verbose: - print "joint not found to remove", name + print("joint not found to remove", name) def summary(self): nj = len(self.joints) @@ -513,13 +513,13 @@ class Anim(object): nstatic = len([j for j in self.joints if j.rotation_curve.is_static() and j.position_curve.is_static()]) - print "summary: %d joints, non-zero priority %d, static %d" % (nj, nz, nstatic) + print("summary: %d joints, non-zero priority %d, static %d" % (nj, nz, nstatic)) def add_pos(self, joint_names, positions): js = [joint for joint in self.joints if joint.joint_name in joint_names] for j in js: if self.verbose: - print "adding positions",j.joint_name,positions + print("adding positions",j.joint_name,positions) j.joint_priority = 4 j.position_curve.keys = [PosKey(self.duration * i / (len(positions) - 1), self.duration, @@ -529,7 +529,7 @@ class Anim(object): def add_rot(self, joint_names, rotations): js = [joint for joint in self.joints if joint.joint_name in joint_names] for j in js: - print "adding rotations",j.joint_name + print("adding rotations",j.joint_name) j.joint_priority = 4 j.rotation_curve.keys = [RotKey(self.duration * i / (len(rotations) - 1), self.duration, @@ -539,8 +539,8 @@ class Anim(object): def twistify(anim, joint_names, rot1, rot2): js = [joint for joint in anim.joints if joint.joint_name in joint_names] for j in js: - print "twisting",j.joint_name - print len(j.rotation_curve.keys) + print("twisting",j.joint_name) + print(len(j.rotation_curve.keys)) j.joint_priority = 4 # Set the joint(s) to rot1 at time 0, rot2 at the full duration. j.rotation_curve.keys = [ @@ -563,7 +563,7 @@ def get_joint_by_name(tree,name): if len(matches)==1: return matches[0] elif len(matches)>1: - print "multiple matches for name",name + print("multiple matches for name",name) return None else: return None @@ -577,7 +577,7 @@ def get_elt_pos(elt): return (0.0, 0.0, 0.0) def resolve_joints(names, skel_tree, lad_tree, no_hud=False): - print "resolve joints, no_hud is",no_hud + print("resolve joints, no_hud is",no_hud) if skel_tree and lad_tree: all_elts = [elt for elt in skel_tree.getroot().iter()] all_elts.extend([elt for elt in lad_tree.getroot().iter()]) @@ -641,12 +641,12 @@ def main(*argv): parser.add_argument("outfilename", nargs="?", help="name of a .anim file to output") args = parser.parse_args(argv) - print "anim_tool.py: " + " ".join(argv) - print "dump is", args.dump - print "infilename",args.infilename,"outfilename",args.outfilename - print "rot",args.rot - print "pos",args.pos - print "joints",args.joints + print("anim_tool.py: " + " ".join(argv)) + print("dump is", args.dump) + print("infilename",args.infilename,"outfilename",args.outfilename) + print("rot",args.rot) + print("pos",args.pos) + print("joints",args.joints) anim = Anim(args.infilename, args.verbose) skel_tree = None @@ -663,7 +663,7 @@ def main(*argv): if args.joints: joints = resolve_joints(args.joints, skel_tree, lad_tree, args.no_hud) if args.verbose: - print "joints resolved to",joints + print("joints resolved to",joints) for name in joints: anim.add_joint(name,0) if args.delete_joints: @@ -677,8 +677,8 @@ def main(*argv): # pick a random sequence of positions for each joint specified for joint in joints: # generate a list of rand_pos triples - pos_array = [tuple(random.uniform(-1,1) for i in xrange(3)) - for j in xrange(args.rand_pos)] + pos_array = [tuple(random.uniform(-1,1) for i in range(3)) + for j in range(args.rand_pos)] # close the loop by cycling back to the first entry pos_array.append(pos_array[0]) anim.add_pos([joint], pos_array) @@ -688,26 +688,26 @@ def main(*argv): if elt is not None: anim.add_pos([joint], 2*[get_elt_pos(elt)]) else: - print "no elt or no pos data for",joint + print("no elt or no pos data for",joint) if args.set_version: anim.version, anim.sub_version = args.set_version if args.base_priority is not None: - print "set base priority",args.base_priority + print("set base priority",args.base_priority) anim.base_priority = args.base_priority # --joint_priority sets priority for ALL joints, not just the explicitly- # specified ones if args.joint_priority is not None: - print "set joint priority",args.joint_priority + print("set joint priority",args.joint_priority) for joint in anim.joints: joint.joint_priority = args.joint_priority if args.duration is not None: - print "set duration",args.duration + print("set duration",args.duration) anim.duration = args.duration if args.loop_in is not None: - print "set loop_in",args.loop_in + print("set loop_in",args.loop_in) anim.loop_in_point = args.loop_in if args.loop_out is not None: - print "set loop_out",args.loop_out + print("set loop_out",args.loop_out) anim.loop_out_point = args.loop_out if args.dump: anim.dump("-") diff --git a/scripts/content_tools/arche_tool.py b/scripts/content_tools/arche_tool.py index f99d7be39a..677af62d2f 100644 --- a/scripts/content_tools/arche_tool.py +++ b/scripts/content_tools/arche_tool.py @@ -1,4 +1,4 @@ -#!runpy.sh +#!/usr/bin/env python3 """\ @@ -42,23 +42,23 @@ def node_key(e): def compare_matched_nodes(key,items,summary): tags = list(set([e.tag for e in items])) if len(tags) != 1: - print "different tag types for key",key + print("different tag types for key",key) summary.setdefault("tag_mismatch",0) summary["tag_mismatch"] += 1 return - all_attrib = list(set(chain.from_iterable([e.attrib.keys() for e in items]))) + all_attrib = list(set(chain.from_iterable([list(e.attrib.keys()) for e in items]))) #print key,"all_attrib",all_attrib for attr in all_attrib: vals = [e.get(attr) for e in items] #print "key",key,"attr",attr,"vals",vals if len(set(vals)) != 1: - print key,"- attr",attr,"multiple values",vals + print(key,"- attr",attr,"multiple values",vals) summary.setdefault("attr",{}) summary["attr"].setdefault(attr,0) summary["attr"][attr] += 1 def compare_trees(file_trees): - print "compare_trees" + print("compare_trees") summary = {} all_keys = list(set([node_key(e) for tree in file_trees for e in tree.getroot().iter() if node_key(e)])) #print "keys",all_keys @@ -70,14 +70,14 @@ def compare_trees(file_trees): items = [] for nodes in tree_nodes: if not key in nodes: - print "file",i,"missing item for key",key + print("file",i,"missing item for key",key) summary.setdefault("missing",0) summary["missing"] += 1 else: items.append(nodes[key]) compare_matched_nodes(key,items,summary) - print "Summary:" - print summary + print("Summary:") + print(summary) def dump_appearance_params(tree): vals = [] @@ -88,7 +88,7 @@ def dump_appearance_params(tree): vals.append("{" + e.get("id") + "," +e.get("u8") + "}") #print e.get("id"), e.get("name"), e.get("group"), e.get("u8") if len(vals)==253: - print ", ".join(vals) + print(", ".join(vals)) if __name__ == "__main__": @@ -101,9 +101,9 @@ if __name__ == "__main__": args = parser.parse_args() - print "files",args.files + print("files",args.files) file_trees = [etree.parse(filename) for filename in args.files] - print args + print(args) if args.compare: compare_trees(file_trees) if args.appearance_params: diff --git a/scripts/content_tools/dae_tool.py b/scripts/content_tools/dae_tool.py index 823f69cb85..2454fafa46 100644 --- a/scripts/content_tools/dae_tool.py +++ b/scripts/content_tools/dae_tool.py @@ -1,4 +1,4 @@ -#!runpy.sh +#!/usr/bin/env python3 """\ @@ -35,14 +35,14 @@ from collada import * from lxml import etree def mesh_summary(mesh): - print "scenes",mesh.scenes + print("scenes",mesh.scenes) for scene in mesh.scenes: - print "scene",scene + print("scene",scene) for node in scene.nodes: - print "node",node + print("node",node) def mesh_lock_offsets(tree, joints): - print "mesh_lock_offsets",tree,joints + print("mesh_lock_offsets",tree,joints) for joint_node in tree.iter(): if "node" not in joint_node.tag: continue @@ -57,11 +57,11 @@ def mesh_lock_offsets(tree, joints): floats[7] += 0.0001 floats[11] += 0.0001 matrix_node.text = " ".join([str(f) for f in floats]) - print joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats + print(joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats) def mesh_random_offsets(tree, joints): - print "mesh_random_offsets",tree,joints + print("mesh_random_offsets",tree,joints) for joint_node in tree.iter(): if "node" not in joint_node.tag: continue @@ -73,13 +73,13 @@ def mesh_random_offsets(tree, joints): for matrix_node in list(joint_node): if "matrix" in matrix_node.tag: floats = [float(x) for x in matrix_node.text.split()] - print "randomizing",floats + print("randomizing",floats) if len(floats) == 16: floats[3] += random.uniform(-1.0,1.0) floats[7] += random.uniform(-1.0,1.0) floats[11] += random.uniform(-1.0,1.0) matrix_node.text = " ".join([str(f) for f in floats]) - print joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats + print(joint_node.get("name"),matrix_node.tag,"text",matrix_node.text,len(floats),floats) if __name__ == "__main__": @@ -96,24 +96,24 @@ if __name__ == "__main__": tree = None if args.infilename: - print "reading",args.infilename + print("reading",args.infilename) mesh = Collada(args.infilename) tree = etree.parse(args.infilename) if args.summary: - print "summarizing",args.infilename + print("summarizing",args.infilename) mesh_summary(mesh) if args.lock_offsets: - print "locking offsets for",args.lock_offsets + print("locking offsets for",args.lock_offsets) mesh_lock_offsets(tree, args.lock_offsets) if args.random_offsets: - print "adding random offsets for",args.random_offsets + print("adding random offsets for",args.random_offsets) mesh_random_offsets(tree, args.random_offsets) if args.outfilename: - print "writing",args.outfilename + print("writing",args.outfilename) f = open(args.outfilename,"w") - print >>f, etree.tostring(tree, pretty_print=True) #need update to get: , short_empty_elements=True) + print(etree.tostring(tree, pretty_print=True), file=f) #need update to get: , short_empty_elements=True) diff --git a/scripts/content_tools/skel_tool.py b/scripts/content_tools/skel_tool.py index 26f63326f1..449ecd6a6c 100644 --- a/scripts/content_tools/skel_tool.py +++ b/scripts/content_tools/skel_tool.py @@ -1,4 +1,4 @@ -#!runpy.sh +#!/usr/bin/env python3 """\ @@ -32,14 +32,14 @@ from lxml import etree def get_joint_names(tree): joints = [element.get('name') for element in tree.getroot().iter() if element.tag in ['bone','collision_volume']] - print "joints:",joints + print("joints:",joints) return joints def get_aliases(tree): aliases = {} alroot = tree.getroot() for element in alroot.iter(): - for key in element.keys(): + for key in list(element.keys()): if key == 'aliases': name = element.get('name') val = element.get('aliases') @@ -58,19 +58,19 @@ def float_tuple(str, n=3): if len(result)==n: return result else: - print "tuple length wrong:", str,"gave",result,"wanted len",n,"got len",len(result) + print("tuple length wrong:", str,"gave",result,"wanted len",n,"got len",len(result)) raise Exception() except: - print "convert failed for:",str + print("convert failed for:",str) raise def check_symmetry(name, field, vec1, vec2): if vec1[0] != vec2[0]: - print name,field,"x match fail" + print(name,field,"x match fail") if vec1[1] != -vec2[1]: - print name,field,"y mirror image fail" + print(name,field,"y mirror image fail") if vec1[2] != vec2[2]: - print name,field,"z match fail" + print(name,field,"z match fail") def enforce_symmetry(tree, element, field, fix=False): name = element.get("name") @@ -92,7 +92,7 @@ def get_element_by_name(tree,name): if len(matches)==1: return matches[0] elif len(matches)>1: - print "multiple matches for name",name + print("multiple matches for name",name) return None else: return None @@ -100,7 +100,7 @@ def get_element_by_name(tree,name): def list_skel_tree(tree): for element in tree.getroot().iter(): if element.tag == "bone": - print element.get("name"),"-",element.get("support") + print(element.get("name"),"-",element.get("support")) def validate_child_order(tree, ogtree, fix=False): unfixable = 0 @@ -116,12 +116,12 @@ def validate_child_order(tree, ogtree, fix=False): if og_element is not None: for echild,ochild in zip(list(element),list(og_element)): if echild.get("name") != ochild.get("name"): - print "Child ordering error, parent",element.get("name"),echild.get("name"),"vs",ochild.get("name") + print("Child ordering error, parent",element.get("name"),echild.get("name"),"vs",ochild.get("name")) if fix: tofix.add(element.get("name")) children = {} for name in tofix: - print "FIX",name + print("FIX",name) element = get_element_by_name(tree,name) og_element = get_element_by_name(ogtree,name) children = [] @@ -130,20 +130,20 @@ def validate_child_order(tree, ogtree, fix=False): elt = get_element_by_name(tree,og_elt.get("name")) if elt is not None: children.append(elt) - print "b:",elt.get("name") + print("b:",elt.get("name")) else: - print "b missing:",og_elt.get("name") + print("b missing:",og_elt.get("name")) # then add children that are not present in the original joints for elt in list(element): og_elt = get_element_by_name(ogtree,elt.get("name")) if og_elt is None: children.append(elt) - print "e:",elt.get("name") + print("e:",elt.get("name")) # if we've done this right, we have a rearranged list of the same length if len(children)!=len(element): - print "children",[e.get("name") for e in children] - print "element",[e.get("name") for e in element] - print "children changes for",name,", cannot reconcile" + print("children",[e.get("name") for e in children]) + print("element",[e.get("name") for e in element]) + print("children changes for",name,", cannot reconcile") else: element[:] = children @@ -163,7 +163,7 @@ def validate_child_order(tree, ogtree, fix=False): # - digits of precision should be consistent (again, except for old joints) # - new bones should have pos, pivot the same def validate_skel_tree(tree, ogtree, reftree, fix=False): - print "validate_skel_tree" + print("validate_skel_tree") (num_bones,num_cvs) = (0,0) unfixable = 0 defaults = {"connected": "false", @@ -175,7 +175,7 @@ def validate_skel_tree(tree, ogtree, reftree, fix=False): # Preserve values from og_file: for f in ["pos","rot","scale","pivot"]: if og_element is not None and og_element.get(f) and (str(element.get(f)) != str(og_element.get(f))): - print element.get("name"),"field",f,"has changed:",og_element.get(f),"!=",element.get(f) + print(element.get("name"),"field",f,"has changed:",og_element.get(f),"!=",element.get(f)) if fix: element.set(f, og_element.get(f)) @@ -187,17 +187,17 @@ def validate_skel_tree(tree, ogtree, reftree, fix=False): fields.extend(["end","connected"]) for f in fields: if not element.get(f): - print element.get("name"),"missing required field",f + print(element.get("name"),"missing required field",f) if fix: if og_element is not None and og_element.get(f): - print "fix from ogtree" + print("fix from ogtree") element.set(f,og_element.get(f)) elif ref_element is not None and ref_element.get(f): - print "fix from reftree" + print("fix from reftree") element.set(f,ref_element.get(f)) else: if f in defaults: - print "fix by using default value",f,"=",defaults[f] + print("fix by using default value",f,"=",defaults[f]) element.set(f,defaults[f]) elif f == "support": if og_element is not None: @@ -205,7 +205,7 @@ def validate_skel_tree(tree, ogtree, reftree, fix=False): else: element.set(f,"extended") else: - print "unfixable:",element.get("name"),"no value for field",f + print("unfixable:",element.get("name"),"no value for field",f) unfixable += 1 fix_name(element) @@ -214,7 +214,7 @@ def validate_skel_tree(tree, ogtree, reftree, fix=False): enforce_symmetry(tree, element, field, fix) if element.get("support")=="extended": if element.get("pos") != element.get("pivot"): - print "extended joint",element.get("name"),"has mismatched pos, pivot" + print("extended joint",element.get("name"),"has mismatched pos, pivot") if element.tag == "linden_skeleton": @@ -223,19 +223,19 @@ def validate_skel_tree(tree, ogtree, reftree, fix=False): all_bones = [e for e in tree.getroot().iter() if e.tag=="bone"] all_cvs = [e for e in tree.getroot().iter() if e.tag=="collision_volume"] if num_bones != len(all_bones): - print "wrong bone count, expected",len(all_bones),"got",num_bones + print("wrong bone count, expected",len(all_bones),"got",num_bones) if fix: element.set("num_bones", str(len(all_bones))) if num_cvs != len(all_cvs): - print "wrong cv count, expected",len(all_cvs),"got",num_cvs + print("wrong cv count, expected",len(all_cvs),"got",num_cvs) if fix: element.set("num_collision_volumes", str(len(all_cvs))) - print "skipping child order code" + print("skipping child order code") #unfixable += validate_child_order(tree, ogtree, fix) if fix and (unfixable > 0): - print "BAD FILE:", unfixable,"errs could not be fixed" + print("BAD FILE:", unfixable,"errs could not be fixed") def slider_info(ladtree,skeltree): @@ -243,37 +243,37 @@ def slider_info(ladtree,skeltree): for skel_param in param.iter("param_skeleton"): bones = [b for b in skel_param.iter("bone")] if bones: - print "param",param.get("name"),"id",param.get("id") + print("param",param.get("name"),"id",param.get("id")) value_min = float(param.get("value_min")) value_max = float(param.get("value_max")) neutral = 100.0 * (0.0-value_min)/(value_max-value_min) - print " neutral",neutral + print(" neutral",neutral) for b in bones: scale = float_tuple(b.get("scale","0 0 0")) offset = float_tuple(b.get("offset","0 0 0")) - print " bone", b.get("name"), "scale", scale, "offset", offset + print(" bone", b.get("name"), "scale", scale, "offset", offset) scale_min = [value_min * s for s in scale] scale_max = [value_max * s for s in scale] offset_min = [value_min * t for t in offset] offset_max = [value_max * t for t in offset] if (scale_min != scale_max): - print " Scale MinX", scale_min[0] - print " Scale MinY", scale_min[1] - print " Scale MinZ", scale_min[2] - print " Scale MaxX", scale_max[0] - print " Scale MaxY", scale_max[1] - print " Scale MaxZ", scale_max[2] + print(" Scale MinX", scale_min[0]) + print(" Scale MinY", scale_min[1]) + print(" Scale MinZ", scale_min[2]) + print(" Scale MaxX", scale_max[0]) + print(" Scale MaxY", scale_max[1]) + print(" Scale MaxZ", scale_max[2]) if (offset_min != offset_max): - print " Offset MinX", offset_min[0] - print " Offset MinY", offset_min[1] - print " Offset MinZ", offset_min[2] - print " Offset MaxX", offset_max[0] - print " Offset MaxY", offset_max[1] - print " Offset MaxZ", offset_max[2] + print(" Offset MinX", offset_min[0]) + print(" Offset MinY", offset_min[1]) + print(" Offset MinZ", offset_min[2]) + print(" Offset MaxX", offset_max[0]) + print(" Offset MaxY", offset_max[1]) + print(" Offset MaxZ", offset_max[2]) # Check contents of avatar_lad file relative to a specified skeleton def validate_lad_tree(ladtree,skeltree,orig_ladtree): - print "validate_lad_tree" + print("validate_lad_tree") bone_names = [elt.get("name") for elt in skeltree.iter("bone")] bone_names.append("mScreen") bone_names.append("mRoot") @@ -285,7 +285,7 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): #print "attachment",att_name joint_name = att.get("joint") if not joint_name in bone_names: - print "att",att_name,"linked to invalid joint",joint_name + print("att",att_name,"linked to invalid joint",joint_name) for skel_param in ladtree.iter("param_skeleton"): skel_param_id = skel_param.get("id") skel_param_name = skel_param.get("name") @@ -297,13 +297,13 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): for bone in skel_param.iter("bone"): bone_name = bone.get("name") if not bone_name in bone_names: - print "skel param references invalid bone",bone_name - print etree.tostring(bone) + print("skel param references invalid bone",bone_name) + print(etree.tostring(bone)) bone_scale = float_tuple(bone.get("scale","0 0 0")) bone_offset = float_tuple(bone.get("offset","0 0 0")) param = bone.getparent().getparent() if bone_scale==(0, 0, 0) and bone_offset==(0, 0, 0): - print "no-op bone",bone_name,"in param",param.get("id","-1") + print("no-op bone",bone_name,"in param",param.get("id","-1")) # check symmetry of sliders if "Right" in bone.get("name"): left_name = bone_name.replace("Right","Left") @@ -312,12 +312,12 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): if b.get("name")==left_name: left_bone = b if left_bone is None: - print "left_bone not found",left_name,"in",param.get("id","-1") + print("left_bone not found",left_name,"in",param.get("id","-1")) else: left_scale = float_tuple(left_bone.get("scale","0 0 0")) left_offset = float_tuple(left_bone.get("offset","0 0 0")) if left_scale != bone_scale: - print "scale mismatch between",bone_name,"and",left_name,"in param",param.get("id","-1") + print("scale mismatch between",bone_name,"and",left_name,"in param",param.get("id","-1")) param_id = int(param.get("id","-1")) if param_id in [661]: # shear expected_offset = tuple([bone_offset[0],bone_offset[1],-bone_offset[2]]) @@ -326,7 +326,7 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): else: expected_offset = tuple([bone_offset[0],-bone_offset[1],bone_offset[2]]) if left_offset != expected_offset: - print "offset mismatch between",bone_name,"and",left_name,"in param",param.get("id","-1") + print("offset mismatch between",bone_name,"and",left_name,"in param",param.get("id","-1")) drivers = {} for driven_param in ladtree.iter("driven"): @@ -340,15 +340,15 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): if (actual_param.get("value_min") != driver.get("value_min") or \ actual_param.get("value_max") != driver.get("value_max")): if args.verbose: - print "MISMATCH min max:",driver.get("id"),"drives",driven_param.get("id"),"min",driver.get("value_min"),actual_param.get("value_min"),"max",driver.get("value_max"),actual_param.get("value_max") + print("MISMATCH min max:",driver.get("id"),"drives",driven_param.get("id"),"min",driver.get("value_min"),actual_param.get("value_min"),"max",driver.get("value_max"),actual_param.get("value_max")) for driven_id in drivers: dset = drivers[driven_id] if len(dset) != 1: - print "driven_id",driven_id,"has multiple drivers",dset + print("driven_id",driven_id,"has multiple drivers",dset) else: if args.verbose: - print "driven_id",driven_id,"has one driver",dset + print("driven_id",driven_id,"has one driver",dset) if orig_ladtree: # make sure expected message format is unchanged orig_message_params_by_id = dict((int(param.get("id")),param) for param in orig_ladtree.iter("param") if param.get("group") in ["0","3"]) @@ -358,25 +358,25 @@ def validate_lad_tree(ladtree,skeltree,orig_ladtree): message_ids = sorted(message_params_by_id.keys()) #print "message_ids",message_ids if (set(message_ids) != set(orig_message_ids)): - print "mismatch in message ids!" - print "added",set(message_ids) - set(orig_message_ids) - print "removed",set(orig_message_ids) - set(message_ids) + print("mismatch in message ids!") + print("added",set(message_ids) - set(orig_message_ids)) + print("removed",set(orig_message_ids) - set(message_ids)) else: - print "message ids OK" + print("message ids OK") def remove_joint_by_name(tree, name): - print "remove joint:",name + print("remove joint:",name) elt = get_element_by_name(tree,name) while elt is not None: children = list(elt) parent = elt.getparent() - print "graft",[e.get("name") for e in children],"into",parent.get("name") - print "remove",elt.get("name") + print("graft",[e.get("name") for e in children],"into",parent.get("name")) + print("remove",elt.get("name")) #parent_children = list(parent) loc = parent.index(elt) parent[loc:loc+1] = children elt[:] = [] - print "parent now:",[e.get("name") for e in list(parent)] + print("parent now:",[e.get("name") for e in list(parent)]) elt = get_element_by_name(tree,name) def compare_skel_trees(atree,btree): @@ -386,9 +386,9 @@ def compare_skel_trees(atree,btree): b_missing = set() a_names = set(e.get("name") for e in atree.getroot().iter() if e.get("name")) b_names = set(e.get("name") for e in btree.getroot().iter() if e.get("name")) - print "a_names\n ",str("\n ").join(sorted(list(a_names))) - print - print "b_names\n ","\n ".join(sorted(list(b_names))) + print("a_names\n ",str("\n ").join(sorted(list(a_names)))) + print() + print("b_names\n ","\n ".join(sorted(list(b_names)))) all_names = set.union(a_names,b_names) for name in all_names: if not name: @@ -396,38 +396,38 @@ def compare_skel_trees(atree,btree): a_element = get_element_by_name(atree,name) b_element = get_element_by_name(btree,name) if a_element is None or b_element is None: - print "something not found for",name,a_element,b_element + print("something not found for",name,a_element,b_element) if a_element is not None and b_element is not None: all_attrib = set.union(set(a_element.attrib.keys()),set(b_element.attrib.keys())) - print name,all_attrib + print(name,all_attrib) for att in all_attrib: if a_element.get(att) != b_element.get(att): if not att in diffs: diffs[att] = set() diffs[att].add(name) - print "tuples",name,att,float_tuple(a_element.get(att)),float_tuple(b_element.get(att)) + print("tuples",name,att,float_tuple(a_element.get(att)),float_tuple(b_element.get(att))) if float_tuple(a_element.get(att)) != float_tuple(b_element.get(att)): - print "diff in",name,att + print("diff in",name,att) if not att in realdiffs: realdiffs[att] = set() realdiffs[att].add(name) for att in diffs: - print "Differences in",att + print("Differences in",att) for name in sorted(diffs[att]): - print " ",name + print(" ",name) for att in realdiffs: - print "Real differences in",att + print("Real differences in",att) for name in sorted(diffs[att]): - print " ",name + print(" ",name) a_missing = b_names.difference(a_names) b_missing = a_names.difference(b_names) if len(a_missing) or len(b_missing): - print "Missing from comparison" + print("Missing from comparison") for name in a_missing: - print " ",name - print "Missing from infile" + print(" ",name) + print("Missing from infile") for name in b_missing: - print " ",name + print(" ",name) if __name__ == "__main__": @@ -499,5 +499,5 @@ if __name__ == "__main__": if args.outfilename: f = open(args.outfilename,"w") - print >>f, etree.tostring(tree, pretty_print=True) #need update to get: , short_empty_elements=True) + print(etree.tostring(tree, pretty_print=True), file=f) #need update to get: , short_empty_elements=True) diff --git a/scripts/md5check.py b/scripts/md5check.py index 1a54a2844c..20ebfa6656 100755 --- a/scripts/md5check.py +++ b/scripts/md5check.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file md5check.py @brief Replacement for message template compatibility verifier. @@ -29,14 +29,14 @@ import sys import hashlib if len(sys.argv) != 3: - print """Usage: %s --create| + print("""Usage: %s --create| Creates an md5sum hash digest of the specified file content and compares it with the given hash digest. If --create is used instead of a hash digest, it will simply print out the hash digest of specified file content. -""" % sys.argv[0] +""" % sys.argv[0]) sys.exit(1) if sys.argv[2] == '-': @@ -48,9 +48,9 @@ else: hexdigest = hashlib.md5(fh.read()).hexdigest() if sys.argv[1] == '--create': - print hexdigest + print(hexdigest) elif hexdigest == sys.argv[1]: - print "md5sum check passed:", filename + print("md5sum check passed:", filename) else: - print "md5sum check FAILED:", filename + print("md5sum check FAILED:", filename) sys.exit(1) diff --git a/scripts/metrics/viewer_asset_logs.py b/scripts/metrics/viewer_asset_logs.py index e48286f696..0365936188 100644 --- a/scripts/metrics/viewer_asset_logs.py +++ b/scripts/metrics/viewer_asset_logs.py @@ -40,7 +40,7 @@ def get_metrics_record(infiles): context = iter(context) # get the root element - event, root = context.next() + event, root = next(context) try: for event, elem in context: if event == "end" and elem.tag == "llsd": @@ -48,7 +48,7 @@ def get_metrics_record(infiles): sd = llsd.parse_xml(xmlstr) yield sd except etree.XMLSyntaxError: - print "Fell off end of document" + print("Fell off end of document") f.close() @@ -56,7 +56,7 @@ def update_stats(stats,rec): for region in rec["regions"]: region_key = (region["grid_x"],region["grid_y"]) #print "region",region_key - for field, val in region.iteritems(): + for field, val in region.items(): if field in ["duration","grid_x","grid_y"]: continue if field == "fps": @@ -96,7 +96,7 @@ if __name__ == "__main__": for key in sorted(stats.keys()): val = stats[key] if val["count"] > 0: - print key,"count",val["count"],"mean_time",val["sum"]/val["count"],"mean_bytes",val["sum_bytes"]/val["count"],"net bytes/sec",val["sum_bytes"]/val["sum"],"enqueued",val["enqueued"],"dequeued",val["dequeued"] + print(key,"count",val["count"],"mean_time",val["sum"]/val["count"],"mean_bytes",val["sum_bytes"]/val["count"],"net bytes/sec",val["sum_bytes"]/val["sum"],"enqueued",val["enqueued"],"dequeued",val["dequeued"]) else: - print key,"count",val["count"],"enqueued",val["enqueued"],"dequeued",val["dequeued"] + print(key,"count",val["count"],"enqueued",val["enqueued"],"dequeued",val["dequeued"]) diff --git a/scripts/metrics/viewerstats.py b/scripts/metrics/viewerstats.py index f7be3d967e..7e19539e15 100755 --- a/scripts/metrics/viewerstats.py +++ b/scripts/metrics/viewerstats.py @@ -54,11 +54,11 @@ def show_stats_by_key(recs,indices,settings_sd = None): v = tuple(v) per_key_cnt[k][v] += 1 except Exception as e: - print "err", e - print "d", d, "k", k, "v", v + print("err", e) + print("d", d, "k", k, "v", v) raise mc = cnt.most_common() - print "=========================" + print("=========================") keyprefix = "" if len(indices)>0: keyprefix = ".".join(indices) + "." @@ -67,32 +67,32 @@ def show_stats_by_key(recs,indices,settings_sd = None): bigc = m[1] unset_cnt = len(recs) - bigc kmc = per_key_cnt[k].most_common(5) - print i, keyprefix+str(k), bigc + print(i, keyprefix+str(k), bigc) if settings_sd is not None and k in settings_sd and "Value" in settings_sd[k]: - print " ", "default",settings_sd[k]["Value"],"count",unset_cnt + print(" ", "default",settings_sd[k]["Value"],"count",unset_cnt) for v in kmc: - print " ", "value",v[0],"count",v[1] + print(" ", "value",v[0],"count",v[1]) if settings_sd is not None: - print "Total keys in settings", len(settings_sd.keys()) + print("Total keys in settings", len(settings_sd.keys())) unused_keys = list(set(settings_sd.keys()) - set(cnt.keys())) unused_keys_non_str = [k for k in unused_keys if settings_sd[k]["Type"] != "String"] unused_keys_str = [k for k in unused_keys if settings_sd[k]["Type"] == "String"] # Things that no one in the sample has set to a non-default value. Possible candidates for removal. - print "\nUnused_keys_non_str", len(unused_keys_non_str) - print "======================" - print "\n".join(sorted(unused_keys_non_str)) + print("\nUnused_keys_non_str", len(unused_keys_non_str)) + print( "======================") + print("\n".join(sorted(unused_keys_non_str))) # Strings are not currently logged, so we have no info on usage. - print "\nString keys (usage unknown)", len(unused_keys_str) - print "======================" - print "\n".join(sorted(unused_keys_str)) + print("\nString keys (usage unknown)", len(unused_keys_str)) + print( "======================") + print("\n".join(sorted(unused_keys_str))) # Things that someone has set but that aren't recognized settings. unrec_keys = list(set(cnt.keys()) - set(settings_sd.keys())) - print "\nUnrecognized keys", len(unrec_keys) - print "======================" - print "\n".join(sorted(unrec_keys)) + print("\nUnrecognized keys", len(unrec_keys)) + print( "======================") + print("\n".join(sorted(unrec_keys))) result = (settings_sd.keys(), unused_keys_str, unused_keys_non_str, unrec_keys) return result @@ -138,7 +138,7 @@ def get_used_strings(root_dir): for dir_name, sub_dir_list, file_list in os.walk(root_dir): for fname in file_list: if fname in ["settings.xml", "settings.xml.edit", "settings_per_account.xml"]: - print "skip", fname + print("skip", fname) continue (base,ext) = os.path.splitext(fname) #if ext not in [".cpp", ".hpp", ".h", ".xml"]: @@ -155,8 +155,8 @@ def get_used_strings(root_dir): for m in ms: #print "used_str",m used_str.add(m) - print "skipped extensions", skipped_ext - print "got used_str", len(used_str) + print("skipped extensions", skipped_ext) + print("got used_str", len(used_str)) return used_str @@ -171,7 +171,7 @@ if __name__ == "__main__": args = parser.parse_args() for fname in args.infiles: - print "process", fname + print("process", fname) df = pd.read_csv(fname,sep='\t') #print "DF", df.describe() jstrs = df['RAW_LOG:BODY'] @@ -182,12 +182,12 @@ if __name__ == "__main__": show_stats_by_key(recs,[]) show_stats_by_key(recs,["agent"]) if args.preferences: - print "\nSETTINGS.XML" + print("\nSETTINGS.XML") settings_sd = parse_settings_xml("settings.xml") #for skey,svals in settings_sd.items(): # print skey, "=>", svals (all_str,_,_,_) = show_stats_by_key(recs,["preferences","settings"],settings_sd) - print + print() #print "\nSETTINGS_PER_ACCOUNT.XML" #settings_pa_sd = parse_settings_xml("settings_per_account.xml") @@ -201,19 +201,19 @@ if __name__ == "__main__": unref_strings = all_str_set-used_strings_set # Some settings names are generated by appending to a prefix. Need to look for this case. prefix_used = set() - print "checking unref_strings", len(unref_strings) + print("checking unref_strings", len(unref_strings)) for u in unref_strings: for k in range(6,len(u)): prefix = u[0:k] if prefix in all_str_set and prefix in used_strings_set: prefix_used.add(u) #print "PREFIX_USED",u,prefix - print "PREFIX_USED", len(prefix_used), ",".join(list(prefix_used)) - print + print("PREFIX_USED", len(prefix_used), ",".join(list(prefix_used))) + print() unref_strings = unref_strings - prefix_used - print "\nUNREF_IN_CODE " + str(len(unref_strings)) + "\n" - print "\n".join(list(unref_strings)) + print("\nUNREF_IN_CODE " + str(len(unref_strings)) + "\n") + print("\n".join(list(unref_strings))) settings_str = read_raw_settings_xml("settings.xml") # Do this via direct string munging to generate minimal changeset settings_edited = remove_settings(settings_str,unref_strings) diff --git a/scripts/packages-formatter.py b/scripts/packages-formatter.py index b1eef3c721..ff7c892577 100755 --- a/scripts/packages-formatter.py +++ b/scripts/packages-formatter.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ This module formats the package version and copyright information for the viewer and its dependent packages. @@ -37,6 +37,9 @@ parser.add_argument('version', help='viewer version number') args = parser.parse_args() _autobuild=os.getenv('AUTOBUILD', 'autobuild') +_autobuild_env=os.environ.copy() +# Coerce stdout encoding to utf-8 as cygwin's will be detected as cp1252 otherwise. +_autobuild_env["PYTHONIOENCODING"] = "utf-8" pkg_line=re.compile('^([\w-]+):\s+(.*)$') @@ -50,7 +53,7 @@ def autobuild(*args): try: child = subprocess.Popen(command, stdin=None, stdout=subprocess.PIPE, - universal_newlines=True) + universal_newlines=True, env=_autobuild_env) except OSError as err: if err.errno != errno.ENOENT: # Don't attempt to interpret anything but ENOENT @@ -110,20 +113,20 @@ for key, rawdata in ("versions", versions), ("copyrights", copyrights): break # Now that we've run through all of both outputs -- are there duplicates? -if any(pkgs for pkgs in dups.values()): - for key, pkgs in dups.items(): +if any(pkgs for pkgs in list(dups.values())): + for key, pkgs in list(dups.items()): if pkgs: - print >>sys.stderr, "Duplicate %s for %s" % (key, ", ".join(pkgs)) + print("Duplicate %s for %s" % (key, ", ".join(pkgs)), file=sys.stderr) sys.exit(1) -print "%s %s" % (args.channel, args.version) -print viewer_copyright +print("%s %s" % (args.channel, args.version)) +print(viewer_copyright) version = list(info['versions'].items()) version.sort() for pkg, pkg_version in version: - print ': '.join([pkg, pkg_version]) + print(': '.join([pkg, pkg_version])) try: - print info['copyrights'][pkg] + print(info['copyrights'][pkg]) except KeyError: sys.exit("No copyright for %s" % pkg) - print + print() diff --git a/scripts/setup-path.py b/scripts/setup-path.py index ce83d815bf..427d119520 100755 --- a/scripts/setup-path.py +++ b/scripts/setup-path.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file setup-path.py @brief Get the python library directory in the path, so we don't have diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py index b44410cdd8..0f5135fae6 100755 --- a/scripts/template_verifier.py +++ b/scripts/template_verifier.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """\ @file template_verifier.py @brief Message template compatibility verifier. @@ -58,14 +58,14 @@ def add_indra_lib_path(): sys.path.insert(0, dir) break else: - print >>sys.stderr, "This script is not inside a valid installation." + print("This script is not inside a valid installation.", file=sys.stderr) sys.exit(1) add_indra_lib_path() import optparse import os -import urllib +import urllib.request, urllib.parse, urllib.error import hashlib from indra.ipc import compatibility @@ -90,7 +90,7 @@ def getstatusoutput(command): def die(msg): - print >>sys.stderr, msg + print(msg, file=sys.stderr) sys.exit(1) MESSAGE_TEMPLATE = 'message_template.msg' @@ -106,7 +106,7 @@ def retry(times, function, *args, **kwargs): for i in range(times): try: return function(*args, **kwargs) - except Exception, e: + except Exception as e: if i == times - 1: raise e # we retried all the times we could @@ -138,10 +138,14 @@ def fetch(url): if url.startswith('file://'): # just open the file directly because urllib is dumb about these things file_name = url[len('file://'):] - return open(file_name).read() + with open(file_name, 'rb') as f: + return f.read() else: - # *FIX: this doesn't throw an exception for a 404, and oddly enough the sl.com 404 page actually gets parsed successfully - return ''.join(urllib.urlopen(url).readlines()) + with urllib.request.urlopen(url) as res: + body = res.read() + if res.status > 299: + sys.exit("ERROR: Unable to download %s. HTTP status %d.\n%s" % (url, res.status, body.decode("utf-8"))) + return body def cache_master(master_url): """Using the url for the master, updates the local cache, and returns an url to the local cache.""" @@ -153,23 +157,22 @@ def cache_master(master_url): and time.time() - os.path.getmtime(master_cache) < MAX_MASTER_AGE): return master_cache_url # our cache is fresh # new master doesn't exist or isn't fresh - print "Refreshing master cache from %s" % master_url + print("Refreshing master cache from %s" % master_url) def get_and_test_master(): new_master_contents = fetch(master_url) - llmessage.parseTemplateString(new_master_contents) + llmessage.parseTemplateString(new_master_contents.decode("utf-8")) return new_master_contents try: new_master_contents = retry(3, get_and_test_master) - except IOError, e: + except IOError as e: # the refresh failed, so we should just soldier on - print "WARNING: unable to download new master, probably due to network error. Your message template compatibility may be suspect." - print "Cause: %s" % e + print("WARNING: unable to download new master, probably due to network error. Your message template compatibility may be suspect.") + print("Cause: %s" % e) return master_cache_url try: tmpname = '%s.%d' % (master_cache, os.getpid()) - mc = open(tmpname, 'wb') - mc.write(new_master_contents) - mc.close() + with open(tmpname, "wb") as mc: + mc.write(new_master_contents) try: os.rename(tmpname, master_cache) except OSError: @@ -180,9 +183,9 @@ def cache_master(master_url): # a single day. os.unlink(master_cache) os.rename(tmpname, master_cache) - except IOError, e: - print "WARNING: Unable to write master message template to %s, proceeding without cache." % master_cache - print "Cause: %s" % e + except IOError as e: + print("WARNING: Unable to write master message template to %s, proceeding without cache." % master_cache) + print("Cause: %s" % e) return master_url return master_cache_url @@ -229,7 +232,7 @@ http://wiki.secondlife.com/wiki/Template_verifier.py """) parser.add_option( '-u', '--master_url', type='string', dest='master_url', - default='http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg', + default='https://bitbucket.org/lindenlab/master-message-template-git/raw/master/message_template.msg', help="""The url of the master message template.""") parser.add_option( '-c', '--cache_master', action='store_true', dest='cache_master', @@ -246,16 +249,16 @@ http://wiki.secondlife.com/wiki/Template_verifier.py # both current and master supplied in positional params if len(args) == 2: master_filename, current_filename = args - print "master:", master_filename - print "current:", current_filename + print("master:", master_filename) + print("current:", current_filename) master_url = 'file://%s' % master_filename current_url = 'file://%s' % current_filename # only current supplied in positional param elif len(args) == 1: master_url = None current_filename = args[0] - print "master:", options.master_url - print "current:", current_filename + print("master:", options.master_url) + print("current:", current_filename) current_url = 'file://%s' % current_filename # nothing specified, use defaults for everything elif len(args) == 0: @@ -269,8 +272,8 @@ http://wiki.secondlife.com/wiki/Template_verifier.py if current_url is None: current_filename = local_template_filename() - print "master:", options.master_url - print "current:", current_filename + print("master:", options.master_url) + print("current:", current_filename) current_url = 'file://%s' % current_filename # retrieve the contents of the local template @@ -281,42 +284,42 @@ http://wiki.secondlife.com/wiki/Template_verifier.py sha_url = "%s.sha1" % current_url current_sha = fetch(sha_url) if hexdigest == current_sha: - print "Message template SHA_1 has not changed." + print("Message template SHA_1 has not changed.") sys.exit(0) # and check for syntax - current_parsed = llmessage.parseTemplateString(current) + current_parsed = llmessage.parseTemplateString(current.decode("utf-8")) if options.cache_master: # optionally return a url to a locally-cached master so we don't hit the network all the time master_url = cache_master(master_url) def parse_master_url(): - master = fetch(master_url) + master = fetch(master_url).decode("utf-8") return llmessage.parseTemplateString(master) try: master_parsed = retry(3, parse_master_url) - except (IOError, tokenstream.ParseError), e: + except (IOError, tokenstream.ParseError) as e: if options.mode == 'production': raise e else: - print "WARNING: problems retrieving the master from %s." % master_url - print "Syntax-checking the local template ONLY, no compatibility check is being run." - print "Cause: %s\n\n" % e + print("WARNING: problems retrieving the master from %s." % master_url) + print("Syntax-checking the local template ONLY, no compatibility check is being run.") + print("Cause: %s\n\n" % e) return 0 acceptable, compat = compare( master_parsed, current_parsed, options.mode) def explain(header, compat): - print header + print(header) # indent compatibility explanation - print '\n\t'.join(compat.explain().split('\n')) + print('\n\t'.join(compat.explain().split('\n'))) if acceptable: explain("--- PASS ---", compat) if options.force_verification == False: - print "Updating sha1 to %s" % hexdigest + print("Updating sha1 to %s" % hexdigest) sha_filename = "%s.sha1" % current_filename sha_file = open(sha_filename, 'w') sha_file.write(hexdigest) -- cgit v1.3 From a3d14e89a3a8102119e36e86cf3cd31c161b3826 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 20 Oct 2021 23:57:48 +0300 Subject: SL-15997 Windows 11 detection --- indra/llcommon/llsys.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 2ca15a31c6..3190dbafcc 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -107,7 +107,7 @@ LLOSInfo::LLOSInfo() : #if LL_WINDOWS - if (IsWindowsVersionOrGreater(10, 0, 0)) + if (IsWindows10OrGreater()) { mMajorVer = 10; mMinorVer = 0; @@ -240,6 +240,21 @@ LLOSInfo::LLOSInfo() : ubr = data; } } + + if (mBuild >= 22000) + { + // At release Windows 11 version was 10.0.22000.194 + // Windows 10 version was 10.0.19043.1266 + // There is no warranty that Win10 build won't increase, + // so until better solution is found or Microsoft updates + // SDK with IsWindows11OrGreater(), indicate "10/11" + // + // Current alternatives: + // Query WMI's Win32_OperatingSystem for OS string. Slow + // and likely to return 'compatibility' string. + // Check presence of dlls/libs or may be their version. + mOSStringSimple = "Microsoft Windows 10/11"; + } } mOSString = mOSStringSimple; -- cgit v1.3 From 093395b48977d89d0c390952ef487f6cb9243c02 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 12 Jan 2022 21:29:36 +0200 Subject: SL-15997 Windows 11 detection #2 --- indra/llcommon/llsys.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'indra/llcommon') diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 3190dbafcc..67d4ee0969 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -195,18 +195,6 @@ LLOSInfo::LLOSInfo() : GetSystemInfo(&si); //if it fails get regular system info //(Warning: If GetSystemInfo it may result in incorrect information in a WOW64 machine, if the kernel fails to load) - //msdn microsoft finds 32 bit and 64 bit flavors this way.. - //http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors - //of windows than this code does (in case it is needed for the future) - if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit - { - mOSStringSimple += "64-bit "; - } - else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) - { - mOSStringSimple += "32-bit "; - } - // Try calling GetVersionEx using the OSVERSIONINFOEX structure. OSVERSIONINFOEX osvi; ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); @@ -253,9 +241,21 @@ LLOSInfo::LLOSInfo() : // Query WMI's Win32_OperatingSystem for OS string. Slow // and likely to return 'compatibility' string. // Check presence of dlls/libs or may be their version. - mOSStringSimple = "Microsoft Windows 10/11"; + mOSStringSimple = "Microsoft Windows 10/11 "; } - } + } + + //msdn microsoft finds 32 bit and 64 bit flavors this way.. + //http://msdn.microsoft.com/en-us/library/ms724429(VS.85).aspx (example code that contains quite a few more flavors + //of windows than this code does (in case it is needed for the future) + if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) //check for 64 bit + { + mOSStringSimple += "64-bit "; + } + else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) + { + mOSStringSimple += "32-bit "; + } mOSString = mOSStringSimple; if (mBuild > 0) -- cgit v1.3