aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--linden/doc/contributions.txt1
-rw-r--r--linden/etc/message.xml10
-rw-r--r--linden/indra/SConstruct9
-rw-r--r--linden/indra/indra_complete/indra_complete.sln1
-rw-r--r--linden/indra/indra_complete/indra_complete_vc8.sln198
-rw-r--r--linden/indra/lib/python/indra/util/llmanifest.py7
-rw-r--r--linden/indra/linux_crash_logger/files.lst2
-rw-r--r--linden/indra/linux_crash_logger/linux_crash_logger.cpp538
-rw-r--r--linden/indra/linux_crash_logger/llcrashloggerlinux.cpp140
-rw-r--r--linden/indra/linux_crash_logger/llcrashloggerlinux.h49
-rw-r--r--linden/indra/llcommon/llapp.cpp34
-rw-r--r--linden/indra/llcommon/llavatarconstants.h1
-rw-r--r--linden/indra/llcommon/llcommon.vcproj3
-rw-r--r--linden/indra/llcommon/llcommon_vc8.vcproj2
-rw-r--r--linden/indra/llcommon/llsd.cpp20
-rw-r--r--linden/indra/llcommon/llsd.h1
-rw-r--r--linden/indra/llcommon/llsdserialize.cpp5
-rw-r--r--linden/indra/llcommon/llstring.cpp58
-rw-r--r--linden/indra/llcommon/llstring.h32
-rw-r--r--linden/indra/llcommon/llsys.cpp77
-rw-r--r--linden/indra/llcommon/llsys.h2
-rw-r--r--linden/indra/llcommon/lluri.cpp69
-rw-r--r--linden/indra/llcommon/lluri.h7
-rw-r--r--linden/indra/llcommon/llversionserver.h4
-rw-r--r--linden/indra/llcommon/llversionviewer.h4
-rwxr-xr-xlinden/indra/llcrashlogger/llcrashlogger.cpp309
-rwxr-xr-xlinden/indra/llcrashlogger/llcrashlogger.h85
-rw-r--r--linden/indra/llinventory/llparcel.cpp2760
-rw-r--r--linden/indra/llinventory/llparcel.h24
-rw-r--r--linden/indra/llinventory/llparcelflags.h14
-rw-r--r--linden/indra/llmessage/llcircuit.cpp19
-rw-r--r--linden/indra/llmessage/llcircuit.h5
-rw-r--r--linden/indra/llmessage/llcurl.cpp5
-rw-r--r--linden/indra/llmessage/llcurl.h3
-rw-r--r--linden/indra/llmessage/llregionflags.h8
-rw-r--r--linden/indra/llmessage/message.cpp7
-rw-r--r--linden/indra/llmessage/message.h2
-rw-r--r--linden/indra/llmessage/message_prehash.cpp5
-rw-r--r--linden/indra/llmessage/message_prehash.h2
-rw-r--r--linden/indra/llui/llalertdialog.cpp35
-rw-r--r--linden/indra/llui/llalertdialog.h24
-rw-r--r--linden/indra/llui/llbutton.cpp3
-rw-r--r--linden/indra/llui/llfloater.cpp29
-rw-r--r--linden/indra/llui/llfloater.h3
-rw-r--r--linden/indra/llui/lllineeditor.cpp14
-rw-r--r--linden/indra/llui/lllineeditor.h2
-rw-r--r--linden/indra/llui/llpanel.cpp10
-rw-r--r--linden/indra/llui/llpanel.h1
-rw-r--r--linden/indra/llui/llscrolllistctrl.cpp19
-rw-r--r--linden/indra/llui/llscrolllistctrl.h1
-rw-r--r--linden/indra/llui/lltextbox.cpp43
-rw-r--r--linden/indra/llui/lltextbox.h11
-rw-r--r--linden/indra/llui/lltexteditor.cpp14
-rw-r--r--linden/indra/llui/lltexteditor.h2
-rw-r--r--linden/indra/llui/llview.cpp18
-rw-r--r--linden/indra/llui/llview.h6
-rw-r--r--linden/indra/llvfs/lldir_win32.cpp1
-rw-r--r--linden/indra/llwindow/lldxhardware.cpp102
-rw-r--r--linden/indra/llwindow/lldxhardware.h3
-rw-r--r--linden/indra/llwindow/llgl.cpp19
-rw-r--r--linden/indra/llwindow/llgl.h3
-rw-r--r--linden/indra/llwindow/llwindowwin32.cpp7
-rw-r--r--linden/indra/llwindow/llwindowwin32.h1
-rw-r--r--linden/indra/lscript/lscript_compile/indra.l16
-rw-r--r--linden/indra/lscript/lscript_compile/lscript_compile.vcproj9
-rwxr-xr-xlinden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj8
-rw-r--r--linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj237
-rw-r--r--linden/indra/mac_crash_logger/llcrashloggermac.cpp342
-rw-r--r--linden/indra/mac_crash_logger/llcrashloggermac.h51
-rw-r--r--linden/indra/mac_crash_logger/mac_crash_logger.cpp668
-rw-r--r--linden/indra/mac_updater/AutoUpdater.nib/classes.nib4
-rw-r--r--linden/indra/mac_updater/AutoUpdater.nib/info.nib14
-rw-r--r--linden/indra/mac_updater/AutoUpdater.nib/objects.xib56
-rw-r--r--linden/indra/newview/CrashReporter.nib/info.nib8
-rw-r--r--linden/indra/newview/CrashReporter.nib/objects.xib78
-rw-r--r--linden/indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--linden/indra/newview/Info-SecondLife.plist2
-rw-r--r--linden/indra/newview/files.lst5
-rwxr-xr-xlinden/indra/newview/linux_tools/handle_secondlifeprotocol.sh17
-rwxr-xr-xlinden/indra/newview/linux_tools/register_secondlifeprotocol.sh46
-rwxr-xr-xlinden/indra/newview/linux_tools/wrapper.sh4
-rw-r--r--linden/indra/newview/llagent.cpp33
-rw-r--r--linden/indra/newview/llagent.h2
-rw-r--r--linden/indra/newview/llagentpilot.cpp4
-rw-r--r--linden/indra/newview/llappviewer.cpp3894
-rw-r--r--linden/indra/newview/llappviewer.h294
-rw-r--r--linden/indra/newview/llappviewerlinux.cpp414
-rw-r--r--linden/indra/newview/llappviewerlinux.h59
-rw-r--r--linden/indra/newview/llappviewermacosx.cpp373
-rw-r--r--linden/indra/newview/llappviewermacosx.h56
-rw-r--r--linden/indra/newview/llappviewerwin32.cpp461
-rw-r--r--linden/indra/newview/llappviewerwin32.h63
-rw-r--r--linden/indra/newview/llassetuploadresponders.cpp1
-rw-r--r--linden/indra/newview/llcallingcard.cpp2
-rw-r--r--linden/indra/newview/llcameraview.cpp8
-rw-r--r--linden/indra/newview/llclassifiedinfo.cpp1
-rw-r--r--linden/indra/newview/llcommandhandler.cpp11
-rw-r--r--linden/indra/newview/llcommandhandler.h9
-rw-r--r--linden/indra/newview/llcompass.cpp1
-rw-r--r--linden/indra/newview/llconsole.cpp1
-rw-r--r--linden/indra/newview/llcontroldef.cpp11
-rw-r--r--linden/indra/newview/llcurrencyuimanager.cpp5
-rw-r--r--linden/indra/newview/lldirpicker.cpp1
-rw-r--r--linden/indra/newview/lldrawable.h3
-rw-r--r--linden/indra/newview/lldrawpoolavatar.cpp2
-rw-r--r--linden/indra/newview/lldrawpoolwater.cpp1
-rw-r--r--linden/indra/newview/lleventinfo.cpp2
-rw-r--r--linden/indra/newview/llfasttimerview.cpp2
-rw-r--r--linden/indra/newview/llfeaturemanager.cpp4
-rw-r--r--linden/indra/newview/llfirstuse.cpp2
-rw-r--r--linden/indra/newview/llfloaterabout.cpp9
-rw-r--r--linden/indra/newview/llfloateranimpreview.cpp1
-rw-r--r--linden/indra/newview/llfloaterauction.cpp3
-rw-r--r--linden/indra/newview/llfloateravatarinfo.cpp4
-rw-r--r--linden/indra/newview/llfloateravatarpicker.cpp10
-rw-r--r--linden/indra/newview/llfloateravatartextures.cpp2
-rw-r--r--linden/indra/newview/llfloaterbump.cpp2
-rw-r--r--linden/indra/newview/llfloaterbuycurrency.cpp2
-rw-r--r--linden/indra/newview/llfloaterbuyland.cpp4
-rw-r--r--linden/indra/newview/llfloaterclassified.cpp4
-rw-r--r--linden/indra/newview/llfloatercolorpicker.cpp1
-rw-r--r--linden/indra/newview/llfloaterdirectory.cpp4
-rw-r--r--linden/indra/newview/llfloaterdirectory.h4
-rw-r--r--linden/indra/newview/llfloaterevent.cpp6
-rw-r--r--linden/indra/newview/llfloaterfriends.cpp34
-rw-r--r--linden/indra/newview/llfloatergroupinfo.cpp4
-rw-r--r--linden/indra/newview/llfloaterimagepreview.cpp1
-rw-r--r--linden/indra/newview/llfloaterimport.cpp1
-rw-r--r--linden/indra/newview/llfloaterlagmeter.cpp5
-rw-r--r--linden/indra/newview/llfloaterland.cpp713
-rw-r--r--linden/indra/newview/llfloaterland.h82
-rw-r--r--linden/indra/newview/llfloatermap.cpp4
-rw-r--r--linden/indra/newview/llfloaternewim.cpp1
-rw-r--r--linden/indra/newview/llfloaterparcel.cpp4
-rw-r--r--linden/indra/newview/llfloaterpostcard.cpp1
-rw-r--r--linden/indra/newview/llfloaterpreference.cpp46
-rw-r--r--linden/indra/newview/llfloaterpreference.h1
-rw-r--r--linden/indra/newview/llfloaterregioninfo.cpp52
-rw-r--r--linden/indra/newview/llfloaterregioninfo.h4
-rw-r--r--linden/indra/newview/llfloaterreleasemsg.cpp3
-rw-r--r--linden/indra/newview/llfloaterreporter.cpp2
-rw-r--r--linden/indra/newview/llfloatersnapshot.cpp1
-rw-r--r--linden/indra/newview/llfloatertest.cpp4
-rw-r--r--linden/indra/newview/llfloatertools.cpp3
-rw-r--r--linden/indra/newview/llfloatertos.cpp2
-rw-r--r--linden/indra/newview/llfloaterworldmap.cpp2
-rw-r--r--linden/indra/newview/llfolderview.cpp2
-rw-r--r--linden/indra/newview/llframestatview.cpp1
-rw-r--r--linden/indra/newview/llgesturemgr.cpp1
-rw-r--r--linden/indra/newview/llglsandbox.cpp1
-rw-r--r--linden/indra/newview/llgroupmgr.cpp16
-rw-r--r--linden/indra/newview/llgroupnotify.cpp4
-rw-r--r--linden/indra/newview/llhudtext.cpp1
-rw-r--r--linden/indra/newview/llimpanel.cpp2
-rw-r--r--linden/indra/newview/llimview.cpp2
-rw-r--r--linden/indra/newview/llinventoryactions.cpp1
-rw-r--r--linden/indra/newview/llinventorybridge.cpp1
-rw-r--r--linden/indra/newview/llinventorybridge.h1
-rw-r--r--linden/indra/newview/llinventorymodel.cpp2
-rw-r--r--linden/indra/newview/llinventoryview.cpp2
-rw-r--r--linden/indra/newview/lllcd.cpp6
-rw-r--r--linden/indra/newview/lllcd.h3
-rw-r--r--linden/indra/newview/lllogchat.cpp2
-rw-r--r--linden/indra/newview/llmanip.cpp1
-rw-r--r--linden/indra/newview/llmaniprotate.cpp3
-rw-r--r--linden/indra/newview/llmaniptranslate.cpp1
-rw-r--r--linden/indra/newview/llmemoryview.cpp1
-rw-r--r--linden/indra/newview/llmenucommands.cpp1
-rw-r--r--linden/indra/newview/llmorphview.cpp1
-rw-r--r--linden/indra/newview/llmoveview.cpp2
-rw-r--r--linden/indra/newview/llmutelist.cpp1
-rw-r--r--linden/indra/newview/llnetmap.cpp2
-rw-r--r--linden/indra/newview/llnotify.cpp35
-rw-r--r--linden/indra/newview/llnotify.h3
-rw-r--r--linden/indra/newview/lloverlaybar.cpp1
-rw-r--r--linden/indra/newview/llpanelLCD.cpp2
-rw-r--r--linden/indra/newview/llpanelaudioprefs.cpp2
-rw-r--r--linden/indra/newview/llpanelavatar.cpp10
-rw-r--r--linden/indra/newview/llpanelclassified.cpp4
-rw-r--r--linden/indra/newview/llpanelcontents.cpp1
-rw-r--r--linden/indra/newview/llpaneldirbrowser.cpp3
-rw-r--r--linden/indra/newview/llpaneldirevents.cpp2
-rw-r--r--linden/indra/newview/llpaneldirfind.cpp9
-rw-r--r--linden/indra/newview/llpaneldisplay.cpp2
-rw-r--r--linden/indra/newview/llpanelgeneral.cpp27
-rw-r--r--linden/indra/newview/llpanelgeneral.h1
-rw-r--r--linden/indra/newview/llpanelgroup.cpp4
-rw-r--r--linden/indra/newview/llpanelgrouplandmoney.cpp9
-rw-r--r--linden/indra/newview/llpanelgroupvoting.cpp6
-rw-r--r--linden/indra/newview/llpanelinput.cpp6
-rw-r--r--linden/indra/newview/llpanellogin.cpp642
-rw-r--r--linden/indra/newview/llpanellogin.h48
-rw-r--r--linden/indra/newview/llpanelobject.cpp2
-rw-r--r--linden/indra/newview/llpanelvolume.cpp1
-rw-r--r--linden/indra/newview/llprefsvoice.cpp2
-rw-r--r--linden/indra/newview/llpreviewgesture.cpp4
-rw-r--r--linden/indra/newview/llpreviewlandmark.cpp1
-rw-r--r--linden/indra/newview/llpreviewnotecard.cpp5
-rw-r--r--linden/indra/newview/llpreviewscript.cpp6
-rw-r--r--linden/indra/newview/llprogressview.cpp8
-rw-r--r--linden/indra/newview/llsky.cpp1
-rw-r--r--linden/indra/newview/llspatialpartition.cpp2
-rw-r--r--linden/indra/newview/llsprite.cpp1
-rw-r--r--linden/indra/newview/llstartup.cpp338
-rw-r--r--linden/indra/newview/llstartup.h2
-rw-r--r--linden/indra/newview/llstatgraph.cpp8
-rw-r--r--linden/indra/newview/llstatusbar.cpp4
-rw-r--r--linden/indra/newview/llsurface.cpp6
-rw-r--r--linden/indra/newview/lltexlayer.cpp1
-rw-r--r--linden/indra/newview/lltexturectrl.cpp8
-rw-r--r--linden/indra/newview/lltexturefetch.cpp17
-rw-r--r--linden/indra/newview/lltextureview.cpp16
-rw-r--r--linden/indra/newview/lltoolbar.cpp1
-rw-r--r--linden/indra/newview/lltoolbrush.cpp2
-rw-r--r--linden/indra/newview/lltooldraganddrop.cpp1
-rw-r--r--linden/indra/newview/lltoolfocus.cpp1
-rw-r--r--linden/indra/newview/lltoolgrab.cpp1
-rw-r--r--linden/indra/newview/lltoolgun.cpp1
-rw-r--r--linden/indra/newview/lltoolmgr.cpp5
-rw-r--r--linden/indra/newview/lltoolmgr.h2
-rw-r--r--linden/indra/newview/lltoolmorph.cpp1
-rw-r--r--linden/indra/newview/lltoolobjpicker.cpp1
-rw-r--r--linden/indra/newview/lltoolpie.cpp2
-rw-r--r--linden/indra/newview/lltoolplacer.cpp380
-rw-r--r--linden/indra/newview/lltoolplacer.h7
-rw-r--r--linden/indra/newview/lltoolselect.cpp1
-rw-r--r--linden/indra/newview/lltoolselectland.cpp1
-rw-r--r--linden/indra/newview/lltoolselectrect.cpp1
-rw-r--r--linden/indra/newview/lltracker.cpp3
-rw-r--r--linden/indra/newview/llurldispatcher.cpp64
-rw-r--r--linden/indra/newview/llurlsimstring.cpp1
-rw-r--r--linden/indra/newview/lluserauth.cpp10
-rw-r--r--linden/indra/newview/lluserauth.h4
-rw-r--r--linden/indra/newview/llvectorperfoptions.cpp121
-rw-r--r--linden/indra/newview/llvectorperfoptions.h31
-rw-r--r--linden/indra/newview/llvieweraudio.cpp228
-rw-r--r--linden/indra/newview/llvieweraudio.h30
-rw-r--r--linden/indra/newview/llviewercamera.h3
-rw-r--r--linden/indra/newview/llviewercontrol.cpp4
-rw-r--r--linden/indra/newview/llviewercontrol.h7
-rw-r--r--linden/indra/newview/llviewerdisplay.cpp199
-rw-r--r--linden/indra/newview/llviewerdisplay.h7
-rw-r--r--linden/indra/newview/llviewerimage.cpp27
-rw-r--r--linden/indra/newview/llviewerimagelist.cpp14
-rw-r--r--linden/indra/newview/llviewerinventory.cpp1
-rw-r--r--linden/indra/newview/llviewerjoystick.cpp2
-rw-r--r--linden/indra/newview/llviewermenu.cpp99
-rw-r--r--linden/indra/newview/llviewermenu.h1
-rw-r--r--linden/indra/newview/llviewermenufile.cpp16
-rw-r--r--linden/indra/newview/llviewermessage.cpp63
-rw-r--r--linden/indra/newview/llviewermessage.h2
-rw-r--r--linden/indra/newview/llviewernetwork.cpp28
-rw-r--r--linden/indra/newview/llviewernetwork.h38
-rw-r--r--linden/indra/newview/llviewerobject.cpp7
-rw-r--r--linden/indra/newview/llviewerobject.h3
-rw-r--r--linden/indra/newview/llviewerobjectlist.cpp7
-rw-r--r--linden/indra/newview/llviewerparcelmgr.cpp13
-rw-r--r--linden/indra/newview/llviewerregion.cpp23
-rw-r--r--linden/indra/newview/llviewerregion.h2
-rw-r--r--linden/indra/newview/llviewerstats.cpp449
-rw-r--r--linden/indra/newview/llviewerstats.h10
-rw-r--r--linden/indra/newview/llviewertexteditor.cpp7
-rw-r--r--linden/indra/newview/llviewerwindow.cpp74
-rw-r--r--linden/indra/newview/llviewerwindow.h6
-rw-r--r--linden/indra/newview/llvoavatar.cpp5
-rw-r--r--linden/indra/newview/llvoclouds.cpp4
-rw-r--r--linden/indra/newview/llvoiceclient.cpp12
-rw-r--r--linden/indra/newview/llvosky.cpp5
-rw-r--r--linden/indra/newview/llvosky.h6
-rw-r--r--linden/indra/newview/llwearable.cpp3
-rw-r--r--linden/indra/newview/llweb.cpp21
-rw-r--r--linden/indra/newview/llweb.h16
-rw-r--r--linden/indra/newview/llwebbrowserctrl.cpp12
-rw-r--r--linden/indra/newview/llwind.cpp1
-rw-r--r--linden/indra/newview/llwindebug.cpp406
-rw-r--r--linden/indra/newview/llwindebug.h2
-rw-r--r--linden/indra/newview/llworld.cpp14
-rw-r--r--linden/indra/newview/llworld.h2
-rw-r--r--linden/indra/newview/llworldmap.cpp2
-rw-r--r--linden/indra/newview/llworldmapview.cpp2
-rw-r--r--linden/indra/newview/llxmlrpctransaction.cpp2
-rw-r--r--linden/indra/newview/macutil_Prefix.h3
-rw-r--r--linden/indra/newview/macview.xcodeproj/default.pbxuser183
-rw-r--r--linden/indra/newview/macview.xcodeproj/project.pbxproj330
-rw-r--r--linden/indra/newview/macview_Prefix.h1
-rw-r--r--linden/indra/newview/newview.vcproj41
-rw-r--r--linden/indra/newview/newview_vc8.vcproj43
-rw-r--r--linden/indra/newview/pipeline.cpp40
-rw-r--r--linden/indra/newview/releasenotes.txt29
-rw-r--r--linden/indra/newview/res/newViewRes.rc8
-rw-r--r--linden/indra/newview/skins/xui/de/LCD_text.xml75
-rw-r--r--linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml10
-rw-r--r--linden/indra/newview/skins/xui/de/floater_preview_classified.xml2
-rw-r--r--linden/indra/newview/skins/xui/de/floater_preview_event.xml2
-rw-r--r--linden/indra/newview/skins/xui/de/floater_preview_url.xml2
-rw-r--r--linden/indra/newview/skins/xui/de/menu_slurl.xml6
-rw-r--r--linden/indra/newview/skins/xui/de/need_to_long.xml85
-rw-r--r--linden/indra/newview/skins/xui/de/need_to_translate.xml1056
-rw-r--r--linden/indra/newview/skins/xui/de/need_to_update.xml420
-rw-r--r--linden/indra/newview/skins/xui/de/panel_login.xml40
-rw-r--r--linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml30
-rw-r--r--linden/indra/newview/skins/xui/en-us/alerts.xml229
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_about_land.xml133
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_directory.xml4
-rw-r--r--linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml1
-rw-r--r--linden/indra/newview/skins/xui/en-us/menu_login.xml37
-rw-r--r--linden/indra/newview/skins/xui/en-us/menu_viewer.xml2
-rw-r--r--linden/indra/newview/skins/xui/en-us/notify.xml20
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_avatar.xml6
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_login.xml92
-rw-r--r--linden/indra/newview/skins/xui/en-us/panel_region_estate.xml63
-rw-r--r--linden/indra/newview/skins/xui/en-us/teleport_strings.xml34
-rw-r--r--linden/indra/newview/skins/xui/es/panel_login.xml36
-rw-r--r--linden/indra/newview/skins/xui/fr/panel_login.xml38
-rw-r--r--linden/indra/newview/skins/xui/ja/LCD_text.xml75
-rw-r--r--linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml12
-rw-r--r--linden/indra/newview/skins/xui/ja/floater_preview_classified.xml2
-rw-r--r--linden/indra/newview/skins/xui/ja/floater_preview_event.xml2
-rw-r--r--linden/indra/newview/skins/xui/ja/floater_preview_url.xml2
-rw-r--r--linden/indra/newview/skins/xui/ja/menu_slurl.xml6
-rw-r--r--linden/indra/newview/skins/xui/ja/need_to_long.xml85
-rw-r--r--linden/indra/newview/skins/xui/ja/need_to_translate.xml1059
-rw-r--r--linden/indra/newview/skins/xui/ja/need_to_update.xml419
-rw-r--r--linden/indra/newview/skins/xui/ja/panel_login.xml40
-rw-r--r--linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml33
-rw-r--r--linden/indra/newview/skins/xui/ko/LCD_text.xml75
-rw-r--r--linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml10
-rw-r--r--linden/indra/newview/skins/xui/ko/floater_preview_classified.xml2
-rw-r--r--linden/indra/newview/skins/xui/ko/floater_preview_event.xml2
-rw-r--r--linden/indra/newview/skins/xui/ko/floater_preview_url.xml2
-rw-r--r--linden/indra/newview/skins/xui/ko/menu_slurl.xml6
-rw-r--r--linden/indra/newview/skins/xui/ko/need_to_long.xml85
-rw-r--r--linden/indra/newview/skins/xui/ko/need_to_translate.xml1060
-rw-r--r--linden/indra/newview/skins/xui/ko/need_to_update.xml420
-rw-r--r--linden/indra/newview/skins/xui/ko/panel_login.xml39
-rw-r--r--linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml31
-rw-r--r--linden/indra/newview/skins/xui/pt/panel_login.xml27
-rw-r--r--linden/indra/newview/skins/xui/zh/panel_login.xml36
-rw-r--r--linden/indra/newview/viewer.cpp6368
-rw-r--r--linden/indra/newview/viewer.h325
-rwxr-xr-xlinden/indra/newview/viewer_manifest.py2
-rw-r--r--linden/indra/test/lluri_tut.cpp39
-rw-r--r--linden/indra/test/test.vcproj6
-rw-r--r--linden/indra/test/test_vc8.vcproj16
-rw-r--r--linden/indra/win_crash_logger/StdAfx.h1
-rw-r--r--linden/indra/win_crash_logger/llcrashloggerwindows.cpp378
-rw-r--r--linden/indra/win_crash_logger/llcrashloggerwindows.h59
-rw-r--r--linden/indra/win_crash_logger/resource.h34
-rw-r--r--linden/indra/win_crash_logger/win_crash_logger.cpp874
-rw-r--r--linden/indra/win_crash_logger/win_crash_logger.rc65
-rw-r--r--linden/indra/win_crash_logger/win_crash_logger.vcproj22
-rw-r--r--linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj29
-rw-r--r--linden/scripts/messages/message_template.msg12
353 files changed, 18888 insertions, 13019 deletions
diff --git a/linden/doc/contributions.txt b/linden/doc/contributions.txt
index 897977c..62210f0 100644
--- a/linden/doc/contributions.txt
+++ b/linden/doc/contributions.txt
@@ -215,6 +215,7 @@ Nicholaz Beresford
215 VWR-1861 215 VWR-1861
216 VWR-1872 216 VWR-1872
217 VWR-1968 217 VWR-1968
218 VWR-2046
218 VWR-2152 219 VWR-2152
219Nounouch Hapmouche 220Nounouch Hapmouche
220 VWR-238 221 VWR-238
diff --git a/linden/etc/message.xml b/linden/etc/message.xml
index 3d9d0eb..1e6e30e 100644
--- a/linden/etc/message.xml
+++ b/linden/etc/message.xml
@@ -255,7 +255,7 @@
255 <key>CoarseLocationUpdate</key> 255 <key>CoarseLocationUpdate</key>
256 <map> 256 <map>
257 <key>flavor</key> 257 <key>flavor</key>
258 <string>llsd</string> 258 <string>template</string>
259 <key>trusted-sender</key> 259 <key>trusted-sender</key>
260 <boolean>true</boolean> 260 <boolean>true</boolean>
261 </map> 261 </map>
@@ -399,6 +399,14 @@
399 <boolean>true</boolean> 399 <boolean>true</boolean>
400 </map> 400 </map>
401 401
402 <!-- UDPDeprecated Messages -->
403 <key>ScriptRunningReply</key>
404 <map>
405 <key>flavor</key>
406 <string>llsd</string>
407 <key>trusted-sender</key>
408 <boolean>false</boolean>
409 </map>
402 410
403 </map> 411 </map>
404 <key>capBans</key> 412 <key>capBans</key>
diff --git a/linden/indra/SConstruct b/linden/indra/SConstruct
index f1a6c89..0e68039 100644
--- a/linden/indra/SConstruct
+++ b/linden/indra/SConstruct
@@ -91,7 +91,7 @@ opts.AddOptions(
91 BoolOption('GSTREAMER', 'Enabled GStreamer support', True), 91 BoolOption('GSTREAMER', 'Enabled GStreamer support', True),
92 BoolOption('COLORGCC', 'Enabled colorgcc', True), 92 BoolOption('COLORGCC', 'Enabled colorgcc', True),
93 EnumOption('GRID', 'Client package\'s default grid', 'default', 93 EnumOption('GRID', 'Client package\'s default grid', 'default',
94 allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak')), 94 allowed_values=('default', 'aditi', 'agni', 'dmz', 'durga', 'ganga', 'shakti', 'siva', 'soma', 'uma', 'vaak', 'yami')),
95 EnumOption('CHANNEL', 'Client package\'s default channel', 'Release', 95 EnumOption('CHANNEL', 'Client package\'s default channel', 'Release',
96 allowed_values=('Release', 'Release Candidate', 'WindLight')), 96 allowed_values=('Release', 'Release Candidate', 'WindLight')),
97 BoolOption('ELFIO', 'Enabled enhanced backtraces with libELFIO symbol extraction support', True), 97 BoolOption('ELFIO', 'Enabled enhanced backtraces with libELFIO symbol extraction support', True),
@@ -203,7 +203,7 @@ for build_target in targets:
203 ### Base include directories ### 203 ### Base include directories ###
204 204
205 include_dirs = Split(""" 205 include_dirs = Split("""
206 ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter 206 ./llcommon ./llmath ./llwindow ./llaudio ./llcharacter ./llcrashlogger
207 ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage 207 ./lldatabase ./llhavok ./llimage ./llinventory ./llmedia ./llmessage
208 ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow 208 ./llprimitive ./llrender ./llscene ./llui ./llvfs ./llwindow
209 ./llxml ./lscript ./lscript/lscript_compile 209 ./llxml ./lscript ./lscript/lscript_compile
@@ -350,7 +350,7 @@ for build_target in targets:
350 releasenoopt_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 ' 350 releasenoopt_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 '
351 releasefordownload_cflags = cflags + '-O2 ' 351 releasefordownload_cflags = cflags + '-O2 '
352 releasefordownload_cxxflags = cxxflags + '-O2 ' 352 releasefordownload_cxxflags = cxxflags + '-O2 '
353 releasefordownload_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 ' 353 releasefordownload_cppflags = cppflags + '-DNDEBUG -DLL_RELEASE=1 -DLL_RELEASE_FOR_DOWNLOAD=1 -DLL_SEND_CRASH_REPORTS=1 '
354 354
355 ################ 355 ################
356 # ENVIRONMENT # 356 # ENVIRONMENT #
@@ -585,6 +585,7 @@ for build_target in targets:
585 create_cond_module('llvfs') 585 create_cond_module('llvfs')
586 create_cond_module('llimagej2coj', module_libs=['openjpeg']) 586 create_cond_module('llimagej2coj', module_libs=['openjpeg'])
587 create_cond_module('llimage', module_libs=['llimagej2coj', 'jpeg', 'png12']) 587 create_cond_module('llimage', module_libs=['llimagej2coj', 'jpeg', 'png12'])
588 create_static_module('llcrashlogger')
588 create_static_module('llmessage') 589 create_static_module('llmessage')
589 create_static_module('llinventory') 590 create_static_module('llinventory')
590 create_static_module('llcharacter') 591 create_static_module('llcharacter')
@@ -616,7 +617,7 @@ for build_target in targets:
616 pkgconfig('--libs-only-l', ['gtk+-2.0']).split()] 617 pkgconfig('--libs-only-l', ['gtk+-2.0']).split()]
617 else: 618 else:
618 external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ] 619 external_libs = net_external_libs + [ 'db-4.2', 'gtk-x11-2.0' ]
619 internal_libs = [ 'llvfs', 'llmath', 'llcommon' ] 620 internal_libs = [ 'llui', 'llxml', 'llmessage', 'llvfs', 'llmath', 'llcommon' ]
620 create_executable(output_crashlogger_bin + '-globalsyms', 621 create_executable(output_crashlogger_bin + '-globalsyms',
621 'linux_crash_logger', 622 'linux_crash_logger',
622 internal_libs + external_libs) 623 internal_libs + external_libs)
diff --git a/linden/indra/indra_complete/indra_complete.sln b/linden/indra/indra_complete/indra_complete.sln
index 513d9a8..83dbdc5 100644
--- a/linden/indra/indra_complete/indra_complete.sln
+++ b/linden/indra/indra_complete/indra_complete.sln
@@ -482,6 +482,7 @@ Global
482 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.ActiveCfg = Release|Win32 482 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.ActiveCfg = Release|Win32
483 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.Build.0 = Release|Win32 483 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload.Build.0 = Release|Win32
484 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.ActiveCfg = ReleaseNoOpt|Win32 484 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.ActiveCfg = ReleaseNoOpt|Win32
485 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt.Build.0 = ReleaseNoOpt|Win32
485 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.ActiveCfg = Debug|Win32 486 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.ActiveCfg = Debug|Win32
486 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.Build.0 = Debug|Win32 487 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug.Build.0 = Debug|Win32
487 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Release.ActiveCfg = Release|Win32 488 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Release.ActiveCfg = Release|Win32
diff --git a/linden/indra/indra_complete/indra_complete_vc8.sln b/linden/indra/indra_complete/indra_complete_vc8.sln
index 04e1e9a..f677d2c 100644
--- a/linden/indra/indra_complete/indra_complete_vc8.sln
+++ b/linden/indra/indra_complete/indra_complete_vc8.sln
@@ -26,28 +26,27 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llinventory", "..\llinvento
26EndProject 26EndProject
27Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "newview", "..\newview\newview_vc8.vcproj", "{E6F4CF1B-6109-4CA8-B58D-87FA936CDE08}" 27Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "newview", "..\newview\newview_vc8.vcproj", "{E6F4CF1B-6109-4CA8-B58D-87FA936CDE08}"
28 ProjectSection(ProjectDependencies) = postProject 28 ProjectSection(ProjectDependencies) = postProject
29 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} = {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}
30 {9D0C7E02-6506-4EE7-BC5C-75671D28D594} = {9D0C7E02-6506-4EE7-BC5C-75671D28D594}
31 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
32 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
33 {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3}
34 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
35 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
36 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
37 {076DD042-2E58-42EA-9401-53210B65C1FC} = {076DD042-2E58-42EA-9401-53210B65C1FC}
38 {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681}
39 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
40 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
41 {B771CF1B-E253-47BD-8B0A-6B0440CC9228} = {B771CF1B-E253-47BD-8B0A-6B0440CC9228}
42 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
43 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
44 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
45 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
46 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
47 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} = {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}
48 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
49 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} = {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}
50 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 29 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
30 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4} = {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}
31 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
32 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB} = {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}
33 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
34 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
35 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
36 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
37 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
38 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
39 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
40 {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681}
41 {076DD042-2E58-42EA-9401-53210B65C1FC} = {076DD042-2E58-42EA-9401-53210B65C1FC}
42 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
43 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
44 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
45 {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3}
46 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
47 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
48 {9D0C7E02-6506-4EE7-BC5C-75671D28D594} = {9D0C7E02-6506-4EE7-BC5C-75671D28D594}
49 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B} = {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}
51 EndProjectSection 50 EndProjectSection
52EndProject 51EndProject
53EndProject 52EndProject
@@ -70,45 +69,43 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile", "..\lscri
70 EndProjectSection 69 EndProjectSection
71EndProject 70EndProject
72 ProjectSection(ProjectDependencies) = postProject 71 ProjectSection(ProjectDependencies) = postProject
73 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
74 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
75 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
76 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
77 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
78 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
79 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
80 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
81 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
82 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
83 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
84 {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B}
85 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
86 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
87 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} = {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} 72 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE} = {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}
73 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
74 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
75 {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B}
76 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
77 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
78 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
79 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
80 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
81 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
82 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
83 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
84 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
85 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
86 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
88 EndProjectSection 87 EndProjectSection
89EndProject 88EndProject
90 ProjectSection(ProjectDependencies) = postProject 89 ProjectSection(ProjectDependencies) = postProject
91 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
92 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
93 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
94 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
95 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 90 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
91 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
92 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
93 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
94 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
96 EndProjectSection 95 EndProjectSection
97EndProject 96EndProject
98 ProjectSection(ProjectDependencies) = postProject 97 ProjectSection(ProjectDependencies) = postProject
99 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
100 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
101 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
102 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
103 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
104 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
105 {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B}
106 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
107 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 98 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
99 {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E} = {5EA5DDF0-C7E1-4F49-BEF5-9246A4656B2E}
100 {B4B838C7-2C72-428E-BBFD-25764E659A8B} = {B4B838C7-2C72-428E-BBFD-25764E659A8B}
101 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
102 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
103 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
104 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
105 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
106 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
108 EndProjectSection 107 EndProjectSection
109EndProject 108EndProject
110Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile_fb", "..\lscript\lscript_compile\lscript_compile_fb_vc8.vcproj", "{B771CF1B-E253-47BD-8B0A-6B0440CC9228}"
111EndProject
112 ProjectSection(ProjectDependencies) = postProject 109 ProjectSection(ProjectDependencies) = postProject
113 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808} 110 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
114 EndProjectSection 111 EndProjectSection
@@ -119,11 +116,11 @@ EndProject
119EndProject 116EndProject
120Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_crash_logger\win_crash_logger_vc8.vcproj", "{648685F3-8760-4CC5-BB2B-CAF9DECC25A4}" 117Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_crash_logger", "..\win_crash_logger\win_crash_logger_vc8.vcproj", "{648685F3-8760-4CC5-BB2B-CAF9DECC25A4}"
121 ProjectSection(ProjectDependencies) = postProject 118 ProjectSection(ProjectDependencies) = postProject
122 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
123 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
124 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
125 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
126 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 119 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
120 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
121 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
122 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
123 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
127 EndProjectSection 124 EndProjectSection
128EndProject 125EndProject
129Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_updater", "..\win_updater\win_updater_vc8.vcproj", "{E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}" 126Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win_updater", "..\win_updater\win_updater_vc8.vcproj", "{E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}"
@@ -133,16 +130,16 @@ EndProject
133 EndProjectSection 130 EndProjectSection
134EndProject 131EndProject
135 ProjectSection(ProjectDependencies) = postProject 132 ProjectSection(ProjectDependencies) = postProject
136 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
137 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
138 {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B}
139 {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3}
140 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
141 {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681}
142 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
143 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
144 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
145 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 133 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
134 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
135 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
136 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
137 {DE55D666-6A3D-476C-937F-109269B83681} = {DE55D666-6A3D-476C-937F-109269B83681}
138 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
139 {93B2BA29-FBE9-4376-92C1-6108DCFE09D3} = {93B2BA29-FBE9-4376-92C1-6108DCFE09D3}
140 {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B}
141 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
142 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
146 EndProjectSection 143 EndProjectSection
147EndProject 144EndProject
148Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llmedia", "..\llmedia\llmedia_vc8.vcproj", "{9D0C7E02-6506-4EE7-BC5C-75671D28D594}" 145Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llmedia", "..\llmedia\llmedia_vc8.vcproj", "{9D0C7E02-6506-4EE7-BC5C-75671D28D594}"
@@ -150,51 +147,52 @@ EndProject
150EndProject 147EndProject
151Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "..\test\test_vc8.vcproj", "{BBAA6588-CA96-4A87-A988-B02270B8D02B}" 148Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "..\test\test_vc8.vcproj", "{BBAA6588-CA96-4A87-A988-B02270B8D02B}"
152 ProjectSection(ProjectDependencies) = postProject 149 ProjectSection(ProjectDependencies) = postProject
153 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
154 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
155 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
156 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
157 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
158 {B771CF1B-E253-47BD-8B0A-6B0440CC9228} = {B771CF1B-E253-47BD-8B0A-6B0440CC9228}
159 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
160 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
161 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} = {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}
162 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
163 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
164 {777F38BE-2DFE-4051-9AAD-2832ABC474CC} = {777F38BE-2DFE-4051-9AAD-2832ABC474CC}
165 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
166 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 150 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
151 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
152 {777F38BE-2DFE-4051-9AAD-2832ABC474CC} = {777F38BE-2DFE-4051-9AAD-2832ABC474CC}
153 {BFA102B0-C891-4E13-B1CF-C2F28073DA8E} = {BFA102B0-C891-4E13-B1CF-C2F28073DA8E}
154 {A5470DA6-0C3A-4602-B930-43DB25511A59} = {A5470DA6-0C3A-4602-B930-43DB25511A59}
155 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC} = {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}
156 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
157 {44CE6D82-7320-4609-8FC3-5965C19F4808} = {44CE6D82-7320-4609-8FC3-5965C19F4808}
158 {328D1968-924F-4863-AAE8-5F9A95BA68E5} = {328D1968-924F-4863-AAE8-5F9A95BA68E5}
159 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
160 {F882263E-4F2A-43D9-A45A-FA4C8EC66552} = {F882263E-4F2A-43D9-A45A-FA4C8EC66552}
161 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
162 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
167 EndProjectSection 163 EndProjectSection
168EndProject 164EndProject
169 ProjectSection(ProjectDependencies) = postProject 165 ProjectSection(ProjectDependencies) = postProject
170 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
171 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
172 {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B}
173 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
174 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
175 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
176 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
177 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
178 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 166 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
167 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
168 {E5D94794-5671-4BD6-A16D-26EC18F3DB34} = {E5D94794-5671-4BD6-A16D-26EC18F3DB34}
169 {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4} = {4B19F64E-AB97-4FB9-8E1D-74A8104DE0C4}
170 {FCC4483C-5B84-4944-B91F-4589A219BC0B} = {FCC4483C-5B84-4944-B91F-4589A219BC0B}
171 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
172 {AF2D801E-EEE7-4B52-A025-F8E648ADC34B} = {AF2D801E-EEE7-4B52-A025-F8E648ADC34B}
173 {B5B53617-416F-404A-BF10-22EBCCA0E4FB} = {B5B53617-416F-404A-BF10-22EBCCA0E4FB}
174 {2ADE3C14-94C4-40BF-B033-70F3C954EE90} = {2ADE3C14-94C4-40BF-B033-70F3C954EE90}
179 EndProjectSection 175 EndProjectSection
180EndProject 176EndProject
181EndProject 177EndProject
182EndProject 178EndProject
183 ProjectSection(ProjectDependencies) = postProject 179 ProjectSection(ProjectDependencies) = postProject
184 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
185 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
186 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
187 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1} 180 {D37774F4-253D-4760-BF64-372A943224A1} = {D37774F4-253D-4760-BF64-372A943224A1}
181 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
182 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
183 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
188 EndProjectSection 184 EndProjectSection
189EndProject 185EndProject
190 ProjectSection(ProjectDependencies) = postProject 186 ProjectSection(ProjectDependencies) = postProject
191 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
192 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
193 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} 187 {E87FD9BE-BE42-4EA3-BF4D-D992223046D9} = {E87FD9BE-BE42-4EA3-BF4D-D992223046D9}
188 {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5} = {681FDD6C-2FAE-4CB9-AF6D-B952F2B151C5}
189 {7BCB4B2C-8378-4186-88EA-5742B5ABE17F} = {7BCB4B2C-8378-4186-88EA-5742B5ABE17F}
194 EndProjectSection 190 EndProjectSection
195EndProject 191EndProject
196Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llimagej2coj", "..\llimagej2coj\llimagej2coj_vc8.vcproj", "{4C8D64D5-649F-481E-96BE-EF1E82A77ACB}" 192Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "llimagej2coj", "..\llimagej2coj\llimagej2coj_vc8.vcproj", "{4C8D64D5-649F-481E-96BE-EF1E82A77ACB}"
197EndProject 193EndProject
194Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lscript_compile_fb_vc8", "..\lscript\lscript_compile\lscript_compile_fb_vc8.vcproj", "{B771CF1B-E253-47BD-8B0A-6B0440CC9228}"
195EndProject
198Global 196Global
199 GlobalSection(SolutionConfigurationPlatforms) = preSolution 197 GlobalSection(SolutionConfigurationPlatforms) = preSolution
200 Debug|Win32 = Debug|Win32 198 Debug|Win32 = Debug|Win32
@@ -414,16 +412,6 @@ Global
414 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseForDownload|Win32.Build.0 = Release|Win32 412 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseForDownload|Win32.Build.0 = Release|Win32
415 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 413 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32
416 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 414 {A5504A1E-8BA4-45D2-8144-1B6937E37E98}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32
417 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.ActiveCfg = Debug|Win32
418 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.Build.0 = Debug|Win32
419 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
420 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.Build.0 = Debug|Win32
421 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.ActiveCfg = Release|Win32
422 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.Build.0 = Release|Win32
423 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
424 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.Build.0 = Release|Win32
425 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32
426 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.Build.0 = Release|Win32
427 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.ActiveCfg = Debug|Win32 415 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.ActiveCfg = Debug|Win32
428 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.Build.0 = Debug|Win32 416 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Debug|Win32.Build.0 = Debug|Win32
429 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 417 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
@@ -432,6 +420,7 @@ Global
432 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Release|Win32.Build.0 = Release|Win32 420 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.Release|Win32.Build.0 = Release|Win32
433 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 421 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
434 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 422 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32
423 {777F38BE-2DFE-4051-9AAD-2832ABC474CC}.ReleaseNoOpt|Win32.Build.0 = Release|Win32
435 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.ActiveCfg = Debug|Win32 424 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.ActiveCfg = Debug|Win32
436 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.Build.0 = Debug|Win32 425 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Debug|Win32.Build.0 = Debug|Win32
437 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 426 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
@@ -440,6 +429,7 @@ Global
440 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Release|Win32.Build.0 = Release|Win32 429 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.Release|Win32.Build.0 = Release|Win32
441 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 430 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
442 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32 431 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32
432 {EC2A989E-3F8F-4B8B-9AE6-7C7EA37C84BC}.ReleaseNoOpt|Win32.Build.0 = Release|Win32
443 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.ActiveCfg = Debug|Win32 433 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.ActiveCfg = Debug|Win32
444 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.Build.0 = Debug|Win32 434 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.Debug|Win32.Build.0 = Debug|Win32
445 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 435 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
@@ -449,7 +439,6 @@ Global
449 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 439 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
450 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.Build.0 = Release|Win32 440 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseForDownload|Win32.Build.0 = Release|Win32
451 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 441 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32
452 {648685F3-8760-4CC5-BB2B-CAF9DECC25A4}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32
453 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.ActiveCfg = Debug|Win32 442 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.ActiveCfg = Debug|Win32
454 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.Build.0 = Debug|Win32 443 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.Debug|Win32.Build.0 = Debug|Win32
455 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 444 {E928F33B-E090-4FA8-818B-6B5D8B0F1F4B}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
@@ -513,6 +502,7 @@ Global
513 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32 502 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
514 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.Build.0 = Release|Win32 503 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseForDownload|Win32.Build.0 = Release|Win32
515 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 504 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32
505 {E9F5BD55-F8E8-4C61-B9B5-CCE7C1048241}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32
516 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.ActiveCfg = Debug|Win32 506 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.ActiveCfg = Debug|Win32
517 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.Build.0 = Debug|Win32 507 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.Debug|Win32.Build.0 = Debug|Win32
518 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32 508 {023011F7-3ADB-49D3-9EC5-6D392F6D15FE}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
@@ -563,6 +553,16 @@ Global
563 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseForDownload|Win32.Build.0 = Release|Win32 553 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseForDownload|Win32.Build.0 = Release|Win32
564 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32 554 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.ActiveCfg = ReleaseNoOpt|Win32
565 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32 555 {4C8D64D5-649F-481E-96BE-EF1E82A77ACB}.ReleaseNoOpt|Win32.Build.0 = ReleaseNoOpt|Win32
556 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.ActiveCfg = Debug|Win32
557 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Debug|Win32.Build.0 = Debug|Win32
558 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.ActiveCfg = Debug|Win32
559 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.DebugMesaHeadless|Win32.Build.0 = Debug|Win32
560 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.ActiveCfg = Release|Win32
561 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.Release|Win32.Build.0 = Release|Win32
562 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.ActiveCfg = Release|Win32
563 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseForDownload|Win32.Build.0 = Release|Win32
564 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.ActiveCfg = Release|Win32
565 {B771CF1B-E253-47BD-8B0A-6B0440CC9228}.ReleaseNoOpt|Win32.Build.0 = Release|Win32
566 EndGlobalSection 566 EndGlobalSection
567 GlobalSection(SolutionProperties) = preSolution 567 GlobalSection(SolutionProperties) = preSolution
568 HideSolutionNode = FALSE 568 HideSolutionNode = FALSE
diff --git a/linden/indra/lib/python/indra/util/llmanifest.py b/linden/indra/lib/python/indra/util/llmanifest.py
index 029b697..2408fab 100644
--- a/linden/indra/lib/python/indra/util/llmanifest.py
+++ b/linden/indra/lib/python/indra/util/llmanifest.py
@@ -38,6 +38,7 @@ import re
38import shutil 38import shutil
39import sys 39import sys
40import tarfile 40import tarfile
41import errno
41 42
42def path_ancestors(path): 43def path_ancestors(path):
43 path = os.path.normpath(path) 44 path = os.path.normpath(path)
@@ -463,6 +464,12 @@ class LLManifest(object):
463 return 464 return
464 # only copy if it's not excluded 465 # only copy if it's not excluded
465 if(self.includes(src, dst)): 466 if(self.includes(src, dst)):
467 try:
468 os.unlink(dst)
469 except OSError, err:
470 if err.errno != errno.ENOENT:
471 raise
472
466 shutil.copy2(src, dst) 473 shutil.copy2(src, dst)
467 474
468 def ccopytree(self, src, dst): 475 def ccopytree(self, src, dst):
diff --git a/linden/indra/linux_crash_logger/files.lst b/linden/indra/linux_crash_logger/files.lst
index 8bf99b0..5c8b9a2 100644
--- a/linden/indra/linux_crash_logger/files.lst
+++ b/linden/indra/linux_crash_logger/files.lst
@@ -1 +1,3 @@
1llcrashlogger/llcrashlogger.cpp
1linux_crash_logger/linux_crash_logger.cpp 2linux_crash_logger/linux_crash_logger.cpp
3linux_crash_logger/llcrashloggerlinux.cpp
diff --git a/linden/indra/linux_crash_logger/linux_crash_logger.cpp b/linden/indra/linux_crash_logger/linux_crash_logger.cpp
index e75a317..5310093 100644
--- a/linden/indra/linux_crash_logger/linux_crash_logger.cpp
+++ b/linden/indra/linux_crash_logger/linux_crash_logger.cpp
@@ -29,542 +29,16 @@
29 * $/LicenseInfo$ 29 * $/LicenseInfo$
30 */ 30 */
31 31
32#include "linden_common.h" 32#include "llcrashloggerlinux.h"
33
34#include <sys/types.h>
35#include <sys/stat.h>
36#include <unistd.h>
37
38#include <curl/curl.h>
39
40#if LL_GTK
41# include "gtk/gtk.h"
42#endif // LL_GTK
43
44#include "indra_constants.h" // CRASH_BEHAVIOR_ASK
45#include "llerror.h"
46#include "lltimer.h"
47#include "lldir.h"
48
49#include "llstring.h"
50
51
52// These need to be localized.
53static const char dialog_text[] =
54"Second Life appears to have crashed.\n"
55"This crash reporter collects information about your computer's hardware, operating system, and some Second Life logs, which are used for debugging purposes only.\n"
56"Sending crash reports is the best way to help us improve the quality of Second Life.\n"
57"If you continue to experience this problem, please try:\n"
58"- Contacting support by visiting http://www.secondlife.com/support\n"
59"\n"
60"Send crash report?";
61
62static const char dialog_title[] =
63"Second Life Crash Logger";
64
65
66class LLFileEncoder
67{
68public:
69 LLFileEncoder(const char *formname, const char *filename, bool isCrashLog = false);
70
71 BOOL isValid() const { return mIsValid; }
72 LLString encodeURL(const S32 max_length = 0);
73public:
74 BOOL mIsValid;
75 LLString mFilename;
76 LLString mFormname;
77 LLString mBuf;
78};
79
80LLString encode_string(const char *formname, const LLString &str);
81
82LLString gServerResponse;
83BOOL gSendReport = FALSE;
84LLString gUserserver;
85LLString gUserText;
86BOOL gCrashInPreviousExec = FALSE;
87time_t gLaunchTime;
88
89static size_t curl_download_callback(void *data, size_t size, size_t nmemb,
90 void *user_data)
91{
92 S32 bytes = size * nmemb;
93 char *cdata = (char *) data;
94 for (int i =0; i < bytes; i += 1)
95 {
96 gServerResponse += (cdata[i]);
97 }
98 return bytes;
99}
100
101#if LL_GTK
102static void response_callback (GtkDialog *dialog,
103 gint arg1,
104 gpointer user_data)
105{
106 gint *response = (gint*)user_data;
107 *response = arg1;
108 gtk_widget_destroy(GTK_WIDGET(dialog));
109 gtk_main_quit();
110}
111#endif // LL_GTK
112
113static BOOL do_ask_dialog(void)
114{
115#if LL_GTK
116 gtk_disable_setlocale();
117 if (!gtk_init_check(NULL, NULL)) {
118 llinfos << "Could not initialize GTK for 'ask to send crash report' dialog; not sending report." << llendl;
119 return FALSE;
120 }
121
122 GtkWidget *win = NULL;
123 GtkDialogFlags flags = GTK_DIALOG_MODAL;
124 GtkMessageType messagetype = GTK_MESSAGE_QUESTION;
125 GtkButtonsType buttons = GTK_BUTTONS_YES_NO;
126 gint response = GTK_RESPONSE_NONE;
127
128 win = gtk_message_dialog_new(NULL,
129 flags, messagetype, buttons,
130 dialog_text);
131 gtk_window_set_type_hint(GTK_WINDOW(win),
132 GDK_WINDOW_TYPE_HINT_DIALOG);
133 gtk_window_set_title(GTK_WINDOW(win), dialog_title);
134 g_signal_connect (win,
135 "response",
136 G_CALLBACK (response_callback),
137 &response);
138 gtk_widget_show_all (win);
139 gtk_main();
140
141 return (GTK_RESPONSE_OK == response ||
142 GTK_RESPONSE_YES == response ||
143 GTK_RESPONSE_APPLY == response);
144#else
145 return FALSE;
146#endif // LL_GTK
147}
148
149 33
150int main(int argc, char **argv) 34int main(int argc, char **argv)
151{ 35{
152 const S32 BT_MAX_SIZE = 100000; // Maximum size to transmit of the backtrace file 36 LLCrashLoggerLinux app;
153 const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file. 37 app.parseCommandOptions(argc, argv);
154 int i; 38 app.init();
155 S32 crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND; 39 app.mainLoop();
156 40 app.cleanup();
157 time(&gLaunchTime);
158
159 llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
160
161 for(i=1; i<argc; i++)
162 {
163 if(!strcmp(argv[i], "-dialog"))
164 {
165 llinfos << "Show the user dialog" << llendl;
166 crash_behavior = CRASH_BEHAVIOR_ASK;
167 }
168 if(!strcmp(argv[i], "-previous"))
169 {
170 gCrashInPreviousExec = TRUE;
171 }
172 if(!strcmp(argv[i], "-user"))
173 {
174 if ((i + 1) < argc)
175 {
176 i++;
177 gUserserver = argv[i];
178 llinfos << "Got userserver " << gUserserver << llendl;
179 }
180 }
181 }
182
183 if( gCrashInPreviousExec )
184 {
185 llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
186 }
187
188 if(!gCrashInPreviousExec)
189 {
190 // Wait a while to let the crashed client finish exiting,
191 // freeing up the screen/etc.
192 sleep(5);
193 }
194
195 // *FIX: do some dialog stuff here?
196 if (CRASH_BEHAVIOR_ALWAYS_SEND == crash_behavior)
197 {
198 gSendReport = TRUE;
199 }
200 else if (CRASH_BEHAVIOR_ASK == crash_behavior)
201 {
202 gSendReport = do_ask_dialog();
203 }
204
205 if(!gSendReport)
206 {
207 // Only send the report if the user agreed to it.
208 llinfos << "User cancelled, not sending report" << llendl;
209
210 return(0);
211 }
212
213 // We assume that all the logs we're looking for reside on the current drive
214 gDirUtilp->initAppDirs("SecondLife");
215
216 // Lots of silly variable, replicated for each log file.
217 LLString db_file_name;
218 LLString sl_file_name;
219 LLString bt_file_name; // stack_trace.log file
220 LLString st_file_name; // stats.log file
221 LLString si_file_name; // settings.xml file
222
223 LLFileEncoder *db_filep = NULL;
224 LLFileEncoder *sl_filep = NULL;
225 LLFileEncoder *st_filep = NULL;
226 LLFileEncoder *bt_filep = NULL;
227 LLFileEncoder *si_filep = NULL;
228
229 ///////////////////////////////////
230 //
231 // We do the parsing for the debug_info file first, as that will
232 // give us the location of the SecondLife.log file.
233 //
234
235 // Figure out the filename of the debug log
236 db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str();
237 db_filep = new LLFileEncoder("DB", db_file_name.c_str());
238
239 // Get the filename of the SecondLife.log file
240 // *NOTE: These buffer sizes are hardcoded into a scanf() below.
241 char tmp_sl_name[LL_MAX_PATH];
242 tmp_sl_name[0] = '\0';
243 char tmp_space[256];
244 tmp_space[0] = '\0';
245
246 // Look for it in the debug_info.log file
247 if (db_filep->isValid())
248 {
249 // This was originally scanning for "SL Log: %[^\r\n]", which happily skipped to the next line
250 // on debug logs (which don't have anything after "SL Log:" and tried to open a nonsensical filename.
251 sscanf(db_filep->mBuf.c_str(), "SL Log:%255[ ]%1023[^\r\n]", tmp_space, tmp_sl_name);
252 }
253 else
254 {
255 delete db_filep;
256 db_filep = NULL;
257 }
258
259 // If we actually have a legitimate file name, use it.
260 if (gCrashInPreviousExec)
261 {
262 // If we froze, the crash log this time around isn't useful.
263 // Use the old one.
264 sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old");
265 }
266 else if (tmp_sl_name[0])
267 {
268 sl_file_name = tmp_sl_name;
269 llinfos << "Using log file from debug log: " << sl_file_name << llendl;
270 }
271 else
272 {
273 // Figure out the filename of the second life log
274 sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log").c_str();
275 }
276
277 // Now we get the SecondLife.log file if it's there, and recent enough...
278 sl_filep = new LLFileEncoder("SL", sl_file_name.c_str());
279 if (!sl_filep->isValid())
280 {
281 delete sl_filep;
282 sl_filep = NULL;
283 }
284
285 st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log").c_str();
286 st_filep = new LLFileEncoder("ST", st_file_name.c_str());
287 if (!st_filep->isValid())
288 {
289 delete st_filep;
290 st_filep = NULL;
291 }
292
293 si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml").c_str();
294 si_filep = new LLFileEncoder("SI", si_file_name.c_str());
295 if (!si_filep->isValid())
296 {
297 delete si_filep;
298 si_filep = NULL;
299 }
300
301 // encode this as if it were a 'Dr Watson' plain-text backtrace
302 bt_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str();
303 bt_filep = new LLFileEncoder("DW", bt_file_name.c_str());
304 if (!bt_filep->isValid())
305 {
306 delete bt_filep;
307 bt_filep = NULL;
308 }
309
310 LLString post_data;
311 LLString tmp_url_buf;
312
313 // Append the userserver
314 tmp_url_buf = encode_string("USER", gUserserver);
315 post_data += tmp_url_buf;
316 llinfos << "PostData:" << post_data << llendl;
317
318 if (gCrashInPreviousExec)
319 {
320 post_data.append("&");
321 tmp_url_buf = encode_string("EF", "Y");
322 post_data += tmp_url_buf;
323 }
324
325 if (db_filep)
326 {
327 post_data.append("&");
328 tmp_url_buf = db_filep->encodeURL();
329 post_data += tmp_url_buf;
330 llinfos << "Sending DB log file" << llendl;
331 }
332 else
333 {
334 llinfos << "Not sending DB log file" << llendl;
335 }
336
337 if (sl_filep)
338 {
339 post_data.append("&");
340 tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE);
341 post_data += tmp_url_buf;
342 llinfos << "Sending SL log file" << llendl;
343 }
344 else
345 {
346 llinfos << "Not sending SL log file" << llendl;
347 }
348
349 if (st_filep)
350 {
351 post_data.append("&");
352 tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE);
353 post_data += tmp_url_buf;
354 llinfos << "Sending stats log file" << llendl;
355 }
356 else
357 {
358 llinfos << "Not sending stats log file" << llendl;
359 }
360
361 if (bt_filep)
362 {
363 post_data.append("&");
364 tmp_url_buf = bt_filep->encodeURL(BT_MAX_SIZE);
365 post_data += tmp_url_buf;
366 llinfos << "Sending crash log file" << llendl;
367 }
368 else
369 {
370 llinfos << "Not sending crash log file" << llendl;
371 }
372
373 if (si_filep)
374 {
375 post_data.append("&");
376 tmp_url_buf = si_filep->encodeURL();
377 post_data += tmp_url_buf;
378 llinfos << "Sending settings log file" << llendl;
379 }
380 else
381 {
382 llinfos << "Not sending settings.xml file" << llendl;
383 }
384
385 if (gUserText.size())
386 {
387 post_data.append("&");
388 tmp_url_buf = encode_string("UN", gUserText);
389 post_data += tmp_url_buf;
390 }
391
392 delete db_filep;
393 db_filep = NULL;
394 delete sl_filep;
395 sl_filep = NULL;
396 delete bt_filep;
397 bt_filep = NULL;
398
399 // Debugging spam
400#if 0
401 printf("Crash report post data:\n--------\n");
402 printf("%s", post_data.getString());
403 printf("\n--------\n");
404#endif
405
406 // Send the report. Yes, it's this easy.
407 {
408 CURL *curl = curl_easy_init();
409
410 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
411 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curl_download_callback);
412 curl_easy_setopt(curl, CURLOPT_POST, 1);
413 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
414 curl_easy_setopt(curl, CURLOPT_URL, "http://EXAMPLE.com/cgi-bin/viewer_crash_reporter2");
415
416 llinfos << "Connecting to crash report server" << llendl;
417 CURLcode result = curl_easy_perform(curl);
418
419 curl_easy_cleanup(curl);
420
421 if(result != CURLE_OK)
422 {
423 llinfos << "Couldn't talk to crash report server" << llendl;
424 }
425 else
426 {
427 llinfos << "Response from crash report server:" << llendl;
428 llinfos << gServerResponse << llendl;
429 }
430 }
431
432 return 0; 41 return 0;
433} 42}
434 43
435LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename, bool isCrashLog)
436{
437 mFormname = form_name;
438 mFilename = filename;
439 mIsValid = FALSE;
440
441 int res;
442
443 struct stat stat_data;
444 res = stat(mFilename.c_str(), &stat_data);
445 if (res)
446 {
447 llwarns << "File " << mFilename << " is missing!" << llendl;
448 return;
449 }
450 else
451 {
452 // Debugging spam
453// llinfos << "File " << mFilename << " is present..." << llendl;
454
455 if(!gCrashInPreviousExec && isCrashLog)
456 {
457 // Make sure the file isn't too old.
458 double age = difftime(gLaunchTime, stat_data.st_mtim.tv_sec);
459
460// llinfos << "age is " << age << llendl;
461 44
462 if(age > 60.0)
463 {
464 // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale.
465 llwarns << "File " << mFilename << " is too old!" << llendl;
466 return;
467 }
468 }
469
470 }
471
472 S32 buf_size = stat_data.st_size;
473 FILE *fp = fopen(mFilename.c_str(), "rb");
474 U8 *buf = new U8[buf_size + 1];
475 size_t nread = fread(buf, 1, buf_size, fp);
476 fclose(fp);
477 buf[nread] = 0;
478
479 mBuf = (char *)buf;
480
481 if(isCrashLog)
482 {
483 // Crash logs consist of a number of entries, one per crash.
484 // Each entry is preceeded by "**********" on a line by itself.
485 // We want only the most recent (i.e. last) one.
486 const char *sep = "**********";
487 const char *start = mBuf.c_str();
488 const char *cur = start;
489 const char *temp = strstr(cur, sep);
490
491 while(temp != NULL)
492 {
493 // Skip past the marker we just found
494 cur = temp + strlen(sep);
495
496 // and try to find another
497 temp = strstr(cur, sep);
498 }
499
500 // If there's more than one entry in the log file, strip all but the last one.
501 if(cur != start)
502 {
503 mBuf.erase(0, cur - start);
504 }
505 }
506
507 mIsValid = TRUE;
508 delete[] buf;
509}
510
511LLString LLFileEncoder::encodeURL(const S32 max_length)
512{
513 LLString result = mFormname;
514 result.append("=");
515
516 S32 i = 0;
517
518 if (max_length)
519 {
520 if ((S32)mBuf.size() > max_length)
521 {
522 i = mBuf.size() - max_length;
523 }
524 }
525
526#if 0
527 // Plain text version for debugging
528 result.append(mBuf);
529#else
530 // Not using LLString because of bad performance issues
531 S32 buf_size = mBuf.size();
532 S32 url_buf_size = 3*mBuf.size() + 1;
533 char *url_buf = new char[url_buf_size];
534
535 S32 cur_pos = 0;
536 for (; i < buf_size; i++)
537 {
538 sprintf(url_buf + cur_pos, "%%%02x", mBuf[i]);
539 cur_pos += 3;
540 }
541 url_buf[i*3] = 0;
542
543 result.append(url_buf);
544 delete[] url_buf;
545#endif
546 return result;
547}
548
549LLString encode_string(const char *formname, const LLString &str)
550{
551 LLString result = formname;
552 result.append("=");
553 // Not using LLString because of bad performance issues
554 S32 buf_size = str.size();
555 S32 url_buf_size = 3*str.size() + 1;
556 char *url_buf = new char[url_buf_size];
557
558 S32 cur_pos = 0;
559 S32 i;
560 for (i = 0; i < buf_size; i++)
561 {
562 sprintf(url_buf + cur_pos, "%%%02x", str[i]);
563 cur_pos += 3;
564 }
565 url_buf[i*3] = 0;
566
567 result.append(url_buf);
568 delete[] url_buf;
569 return result;
570}
diff --git a/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp
new file mode 100644
index 0000000..26a8f0c
--- /dev/null
+++ b/linden/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -0,0 +1,140 @@
1/**
2 * @file llcrashloggerlinux.cpp
3 * @brief Linux crash logger implementation
4 *
5 * $LicenseInfo:firstyear=2003&license=viewergpl$
6 *
7 * Copyright (c) 2003-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llcrashloggerlinux.h"
33
34#include <iostream>
35
36#include "linden_common.h"
37
38#include "boost/tokenizer.hpp"
39
40#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
41#include "llerror.h"
42#include "llfile.h"
43#include "lltimer.h"
44#include "llstring.h"
45#include "lldir.h"
46#include "llsdserialize.h"
47
48#if LL_GTK
49# include "gtk/gtk.h"
50#endif // LL_GTK
51
52#define MAX_LOADSTRING 100
53
54// These need to be localized.
55static const char dialog_text[] =
56"Second Life appears to have crashed or frozen last time it ran.\n"
57"This crash reporter collects information about your computer's hardware, operating system, and some Second Life logs, all of which are used for debugging purposes only.\n"
58"In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!\n"
59"This report is NOT read by Customer Support. If you have billing or other questions, contact support by visiting http://www.secondlife.com/support\n"
60"\n"
61"Send crash report?";
62
63static const char dialog_title[] =
64"Second Life Crash Logger";
65
66#if LL_GTK
67static void response_callback (GtkDialog *dialog,
68 gint arg1,
69 gpointer user_data)
70{
71 gint *response = (gint*)user_data;
72 *response = arg1;
73 gtk_widget_destroy(GTK_WIDGET(dialog));
74 gtk_main_quit();
75}
76#endif // LL_GTK
77
78static BOOL do_ask_dialog(void)
79{
80#if LL_GTK
81 gtk_disable_setlocale();
82 if (!gtk_init_check(NULL, NULL)) {
83 llinfos << "Could not initialize GTK for 'ask to send crash report' dialog; not sending report." << llendl;
84 return FALSE;
85 }
86
87 GtkWidget *win = NULL;
88 GtkDialogFlags flags = GTK_DIALOG_MODAL;
89 GtkMessageType messagetype = GTK_MESSAGE_QUESTION;
90 GtkButtonsType buttons = GTK_BUTTONS_YES_NO;
91 gint response = GTK_RESPONSE_NONE;
92
93 win = gtk_message_dialog_new(NULL,
94 flags, messagetype, buttons,
95 dialog_text);
96 gtk_window_set_type_hint(GTK_WINDOW(win),
97 GDK_WINDOW_TYPE_HINT_DIALOG);
98 gtk_window_set_title(GTK_WINDOW(win), dialog_title);
99 g_signal_connect (win,
100 "response",
101 G_CALLBACK (response_callback),
102 &response);
103 gtk_widget_show_all (win);
104 gtk_main();
105
106 return (GTK_RESPONSE_OK == response ||
107 GTK_RESPONSE_YES == response ||
108 GTK_RESPONSE_APPLY == response);
109#else
110 return FALSE;
111#endif // LL_GTK
112}
113
114LLCrashLoggerLinux::LLCrashLoggerLinux(void)
115{
116}
117
118LLCrashLoggerLinux::~LLCrashLoggerLinux(void)
119{
120}
121
122void LLCrashLoggerLinux::gatherPlatformSpecificFiles()
123{
124 mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str();
125}
126
127bool LLCrashLoggerLinux::mainLoop()
128{
129 if(!do_ask_dialog())
130 {
131 return true;
132 }
133 sendCrashLogs();
134 return true;
135}
136
137void LLCrashLoggerLinux::updateApplication(LLString message)
138{
139 LLCrashLogger::updateApplication(message);
140}
diff --git a/linden/indra/linux_crash_logger/llcrashloggerlinux.h b/linden/indra/linux_crash_logger/llcrashloggerlinux.h
new file mode 100644
index 0000000..a84ee00
--- /dev/null
+++ b/linden/indra/linux_crash_logger/llcrashloggerlinux.h
@@ -0,0 +1,49 @@
1/**
2 * @file llcrashloggerlinux.h
3 * @brief Linux crash logger definition
4 *
5 * $LicenseInfo:firstyear=2003&license=viewergpl$
6 *
7 * Copyright (c) 2003-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LLCRASHLOGGERLINUX_H
33#define LLCRASHLOGGERLINUX_H
34
35#include "linden_common.h"
36#include "llcrashlogger.h"
37#include "llstring.h"
38
39class LLCrashLoggerLinux : public LLCrashLogger
40{
41public:
42 LLCrashLoggerLinux(void);
43 ~LLCrashLoggerLinux(void);
44 virtual bool mainLoop();
45 virtual void updateApplication(LLString message = "");
46 virtual void gatherPlatformSpecificFiles();
47};
48
49#endif
diff --git a/linden/indra/llcommon/llapp.cpp b/linden/indra/llcommon/llapp.cpp
index b0751b8..2347ac9 100644
--- a/linden/indra/llcommon/llapp.cpp
+++ b/linden/indra/llcommon/llapp.cpp
@@ -47,6 +47,7 @@
47// 47//
48#if LL_WINDOWS 48#if LL_WINDOWS
49LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop); 49LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop);
50BOOL ConsoleCtrlHandler(DWORD fdwCtrlType);
50#else 51#else
51#include <unistd.h> // for fork() 52#include <unistd.h> // for fork()
52void setup_signals(); 53void setup_signals();
@@ -219,6 +220,11 @@ void LLApp::setupErrorHandling()
219 // Disable this until the viewer gets ported so server crashes can be JIT debugged. 220 // Disable this until the viewer gets ported so server crashes can be JIT debugged.
220 //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; 221 //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
221 //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler); 222 //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler);
223
224 // This sets a callback to handle w32 signals to the console window.
225 // The viewer shouldn't be affected, sicne its a windowed app.
226 SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE);
227
222#else 228#else
223 // 229 //
224 // Start up signal handling. 230 // Start up signal handling.
@@ -399,6 +405,34 @@ LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *except
399 return retval; 405 return retval;
400} 406}
401 407
408// Win32 doesn't support signals. This is used instead.
409BOOL ConsoleCtrlHandler(DWORD fdwCtrlType)
410{
411 switch (fdwCtrlType)
412 {
413 case CTRL_BREAK_EVENT:
414 case CTRL_LOGOFF_EVENT:
415 case CTRL_SHUTDOWN_EVENT:
416 case CTRL_CLOSE_EVENT: // From end task or the window close button.
417 case CTRL_C_EVENT: // from CTRL-C on the keyboard
418 // Just set our state to quitting, not error
419 if (LLApp::isQuitting() || LLApp::isError())
420 {
421 // We're already trying to die, just ignore this signal
422 if (LLApp::sLogInSignal)
423 {
424 llinfos << "Signal handler - Already trying to quit, ignoring signal!" << llendl;
425 }
426 return TRUE;
427 }
428 LLApp::setQuitting();
429 return TRUE;
430
431 default:
432 return FALSE;
433 }
434}
435
402#else //!LL_WINDOWS 436#else //!LL_WINDOWS
403void LLApp::setChildCallback(pid_t pid, LLAppChildCallback callback) 437void LLApp::setChildCallback(pid_t pid, LLAppChildCallback callback)
404{ 438{
diff --git a/linden/indra/llcommon/llavatarconstants.h b/linden/indra/llcommon/llavatarconstants.h
index c62cae2..4ba6642 100644
--- a/linden/indra/llcommon/llavatarconstants.h
+++ b/linden/indra/llcommon/llavatarconstants.h
@@ -49,6 +49,7 @@ const U32 AVATAR_MATURE_PUBLISH = 0x1 << 1; // profile is "mature"
49const U32 AVATAR_IDENTIFIED = 0x1 << 2; // whether avatar has provided payment info 49const U32 AVATAR_IDENTIFIED = 0x1 << 2; // whether avatar has provided payment info
50const U32 AVATAR_TRANSACTED = 0x1 << 3; // whether avatar has actively used payment info 50const U32 AVATAR_TRANSACTED = 0x1 << 3; // whether avatar has actively used payment info
51const U32 AVATAR_ONLINE = 0x1 << 4; // the online status of this avatar, if known. 51const U32 AVATAR_ONLINE = 0x1 << 4; // the online status of this avatar, if known.
52const U32 AVATAR_AGEVERIFIED = 0x1 << 5; // whether avatar has been age-verified
52 53
53static const std::string VISIBILITY_DEFAULT("default"); 54static const std::string VISIBILITY_DEFAULT("default");
54static const std::string VISIBILITY_HIDDEN("hidden"); 55static const std::string VISIBILITY_HIDDEN("hidden");
diff --git a/linden/indra/llcommon/llcommon.vcproj b/linden/indra/llcommon/llcommon.vcproj
index 80704af..0ab544e 100644
--- a/linden/indra/llcommon/llcommon.vcproj
+++ b/linden/indra/llcommon/llcommon.vcproj
@@ -415,6 +415,9 @@
415 RelativePath=".\llindexedqueue.h"> 415 RelativePath=".\llindexedqueue.h">
416 </File> 416 </File>
417 <File 417 <File
418 RelativePath=".\llkeythrottle.h">
419 </File>
420 <File
418 RelativePath=".\lllinkedqueue.h"> 421 RelativePath=".\lllinkedqueue.h">
419 </File> 422 </File>
420 <File 423 <File
diff --git a/linden/indra/llcommon/llcommon_vc8.vcproj b/linden/indra/llcommon/llcommon_vc8.vcproj
index 1687a89..4790b61 100644
--- a/linden/indra/llcommon/llcommon_vc8.vcproj
+++ b/linden/indra/llcommon/llcommon_vc8.vcproj
@@ -201,7 +201,9 @@
201 /> 201 />
202 <Tool 202 <Tool
203 Name="VCLibrarianTool" 203 Name="VCLibrarianTool"
204 AdditionalDependencies="psapi.lib"
204 OutputFile="$(OutDir)/llcommon.lib" 205 OutputFile="$(OutDir)/llcommon.lib"
206 AdditionalLibraryDirectories=""
205 /> 207 />
206 <Tool 208 <Tool
207 Name="VCALinkTool" 209 Name="VCALinkTool"
diff --git a/linden/indra/llcommon/llsd.cpp b/linden/indra/llcommon/llsd.cpp
index 305531b..829ea25 100644
--- a/linden/indra/llcommon/llsd.cpp
+++ b/linden/indra/llcommon/llsd.cpp
@@ -36,11 +36,23 @@
36#include "../llmath/llmath.h" 36#include "../llmath/llmath.h"
37#include "llformat.h" 37#include "llformat.h"
38 38
39#ifndef LL_RELEASE_FOR_DOWNLOAD
40#define NAME_UNNAMED_NAMESPACE
41#endif
42
43#ifdef NAME_UNNAMED_NAMESPACE
44namespace LLSDUnnamedNamespace {
45#else
39namespace { 46namespace {
47#endif
40 class ImplMap; 48 class ImplMap;
41 class ImplArray; 49 class ImplArray;
42} 50}
43 51
52#ifdef NAME_UNNAMED_NAMESPACE
53using namespace LLSDUnnamedNamespace;
54#endif
55
44class LLSD::Impl 56class LLSD::Impl
45 /**< This class is the abstract base class of the implementation of LLSD 57 /**< This class is the abstract base class of the implementation of LLSD
46 It provides the reference counting implementation, and the default 58 It provides the reference counting implementation, and the default
@@ -125,7 +137,11 @@ public:
125 static U32 sOutstandingCount; 137 static U32 sOutstandingCount;
126}; 138};
127 139
140#ifdef NAME_UNNAMED_NAMESPACE
141namespace LLSDUnnamedNamespace {
142#else
128namespace { 143namespace {
144#endif
129 template<LLSD::Type T, class Data, class DataRef = Data> 145 template<LLSD::Type T, class Data, class DataRef = Data>
130 class ImplBase : public LLSD::Impl 146 class ImplBase : public LLSD::Impl
131 ///< This class handles most of the work for a subclass of Impl 147 ///< This class handles most of the work for a subclass of Impl
@@ -632,7 +648,11 @@ U32 LLSD::Impl::sOutstandingCount = 0;
632 648
633 649
634 650
651#ifdef NAME_UNNAMED_NAMESPACE
652namespace LLSDUnnamedNamespace {
653#else
635namespace { 654namespace {
655#endif
636 inline LLSD::Impl& safe(LLSD::Impl* impl) 656 inline LLSD::Impl& safe(LLSD::Impl* impl)
637 { return LLSD::Impl::safe(impl); } 657 { return LLSD::Impl::safe(impl); }
638 658
diff --git a/linden/indra/llcommon/llsd.h b/linden/indra/llcommon/llsd.h
index 1fb917f..65ba7dd 100644
--- a/linden/indra/llcommon/llsd.h
+++ b/linden/indra/llcommon/llsd.h
@@ -376,6 +376,7 @@ struct llsd_select_string : public std::unary_function<LLSD, LLSD::String>
376 } 376 }
377}; 377};
378 378
379std::ostream& operator<<(std::ostream& s, const LLSD& llsd);
379 380
380/** QUESTIONS & TO DOS 381/** QUESTIONS & TO DOS
381 - Would Binary be more convenient as usigned char* buffer semantics? 382 - Would Binary be more convenient as usigned char* buffer semantics?
diff --git a/linden/indra/llcommon/llsdserialize.cpp b/linden/indra/llcommon/llsdserialize.cpp
index a7470be..5ab9471 100644
--- a/linden/indra/llcommon/llsdserialize.cpp
+++ b/linden/indra/llcommon/llsdserialize.cpp
@@ -1641,4 +1641,9 @@ void serialize_string(const std::string& value, std::ostream& str)
1641 } 1641 }
1642} 1642}
1643 1643
1644std::ostream& operator<<(std::ostream& s, const LLSD& llsd)
1645{
1646 s << LLSDNotationStreamer(llsd);
1647 return s;
1648}
1644 1649
diff --git a/linden/indra/llcommon/llstring.cpp b/linden/indra/llcommon/llstring.cpp
index 6dab598..e701ea0 100644
--- a/linden/indra/llcommon/llstring.cpp
+++ b/linden/indra/llcommon/llstring.cpp
@@ -34,6 +34,13 @@
34#include "llstring.h" 34#include "llstring.h"
35#include "llerror.h" 35#include "llerror.h"
36 36
37#if LL_WINDOWS
38#define WIN32_LEAN_AND_MEAN
39#include <winsock2.h>
40#include <windows.h>
41#include <winnls.h> // for WideCharToMultiByte
42#endif
43
37std::string ll_safe_string(const char* in) 44std::string ll_safe_string(const char* in)
38{ 45{
39 if(in) return std::string(in); 46 if(in) return std::string(in);
@@ -718,19 +725,7 @@ std::string utf8str_removeCRLF(const std::string& utf8str)
718} 725}
719 726
720#if LL_WINDOWS 727#if LL_WINDOWS
721/* If the size of the passed in buffer is not large enough to hold the string, 728// documentation moved to header. Phoenix 2007-11-27
722 * two bad things happen:
723 * 1. resulting formatted string is NOT null terminated
724 * 2. Depending on the platform, the return value could be a) the required
725 * size of the buffer to copy the entire formatted string or b) -1.
726 * On Windows with VS.Net 2003, it returns -1 e.g.
727 *
728 * safe_snprintf always adds a NULL terminator so that the caller does not
729 * need to check for return value or need to add the NULL terminator.
730 * It does not, however change the return value - to let the caller know
731 * that the passed in buffer size was not large enough to hold the formatted string.
732 *
733 */
734int safe_snprintf(char *str, size_t size, const char *format, ...) 729int safe_snprintf(char *str, size_t size, const char *format, ...)
735{ 730{
736 va_list args; 731 va_list args;
@@ -742,6 +737,43 @@ int safe_snprintf(char *str, size_t size, const char *format, ...)
742 str[size-1] = '\0'; // always null terminate 737 str[size-1] = '\0'; // always null terminate
743 return num_written; 738 return num_written;
744} 739}
740
741std::string ll_convert_wide_to_string(const wchar_t* in)
742{
743 std::string out;
744 if(in)
745 {
746 int len_in = wcslen(in);
747 int len_out = WideCharToMultiByte(
748 CP_ACP,
749 0,
750 in,
751 len_in,
752 NULL,
753 0,
754 0,
755 0);
756 // We will need two more bytes for the double NULL ending
757 // created in WideCharToMultiByte().
758 char* pout = new char [len_out + 2];
759 memset(pout, 0, len_out + 2);
760 if(pout)
761 {
762 WideCharToMultiByte(
763 CP_ACP,
764 0,
765 in,
766 len_in,
767 pout,
768 len_out,
769 0,
770 0);
771 out.assign(pout);
772 delete[] pout;
773 }
774 }
775 return out;
776}
745#endif // LL_WINDOWS 777#endif // LL_WINDOWS
746 778
747S32 LLStringOps::collate(const llwchar* a, const llwchar* b) 779S32 LLStringOps::collate(const llwchar* a, const llwchar* b)
diff --git a/linden/indra/llcommon/llstring.h b/linden/indra/llcommon/llstring.h
index 70f7d54..ae44ac3 100644
--- a/linden/indra/llcommon/llstring.h
+++ b/linden/indra/llcommon/llstring.h
@@ -481,7 +481,37 @@ std::ostream& operator<<(std::ostream &s, const LLStringBase<T> &str)
481std::ostream& operator<<(std::ostream &s, const LLWString &wstr); 481std::ostream& operator<<(std::ostream &s, const LLWString &wstr);
482 482
483#if LL_WINDOWS 483#if LL_WINDOWS
484int safe_snprintf(char *str, size_t size, const char *format, ...); 484/* @name Windows string helpers
485 */
486//@{
487
488/**
489 * @brief Implementation the expected snprintf interface.
490 *
491 * If the size of the passed in buffer is not large enough to hold the string,
492 * two bad things happen:
493 * 1. resulting formatted string is NOT null terminated
494 * 2. Depending on the platform, the return value could be a) the required
495 * size of the buffer to copy the entire formatted string or b) -1.
496 * On Windows with VS.Net 2003, it returns -1 e.g.
497 *
498 * safe_snprintf always adds a NULL terminator so that the caller does not
499 * need to check for return value or need to add the NULL terminator.
500 * It does not, however change the return value - to let the caller know
501 * that the passed in buffer size was not large enough to hold the
502 * formatted string.
503 *
504 */
505int safe_snprintf(char* str, size_t size, const char* format, ...);
506
507/**
508 * @brief Convert a wide string to std::string
509 *
510 * This replaces the unsafe W2A macro from ATL.
511 */
512std::string ll_convert_wide_to_string(const wchar_t* in);
513
514//@}
485#endif // LL_WINDOWS 515#endif // LL_WINDOWS
486 516
487/** 517/**
diff --git a/linden/indra/llcommon/llsys.cpp b/linden/indra/llcommon/llsys.cpp
index 3b57db7..7346b29 100644
--- a/linden/indra/llcommon/llsys.cpp
+++ b/linden/indra/llcommon/llsys.cpp
@@ -65,8 +65,7 @@ static const S32 CPUINFO_BUFFER_SIZE = 16383;
65LLCPUInfo gSysCPU; 65LLCPUInfo gSysCPU;
66 66
67LLOSInfo::LLOSInfo() : 67LLOSInfo::LLOSInfo() :
68 mMajorVer(0), mMinorVer(0), mBuild(0), 68 mMajorVer(0), mMinorVer(0), mBuild(0)
69 mOSString("")
70{ 69{
71 70
72#if LL_WINDOWS 71#if LL_WINDOWS
@@ -94,27 +93,28 @@ LLOSInfo::LLOSInfo() :
94 // Test for the product. 93 // Test for the product.
95 if(osvi.dwMajorVersion <= 4) 94 if(osvi.dwMajorVersion <= 4)
96 { 95 {
97 mOSString = "Microsoft Windows NT "; 96 mOSStringSimple = "Microsoft Windows NT ";
98 } 97 }
99 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) 98 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0)
100 { 99 {
101 mOSString = "Microsoft Windows 2000 "; 100 mOSStringSimple = "Microsoft Windows 2000 ";
102 } 101 }
103 else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1) 102 else if(osvi.dwMajorVersion ==5 && osvi.dwMinorVersion == 1)
104 { 103 {
105 mOSString = "Microsoft Windows XP "; 104 mOSStringSimple = "Microsoft Windows XP ";
106 } 105 }
107 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) 106 else if(osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2)
108 { 107 {
109 if(osvi.wProductType == VER_NT_WORKSTATION) 108 if(osvi.wProductType == VER_NT_WORKSTATION)
110 mOSString = "Microsoft Windows XP x64 Edition "; 109 mOSStringSimple = "Microsoft Windows XP x64 Edition ";
111 else mOSString = "Microsoft Windows Server 2003 "; 110 else
111 mOSStringSimple = "Microsoft Windows Server 2003 ";
112 } 112 }
113 else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) 113 else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
114 { 114 {
115 if(osvi.wProductType == VER_NT_WORKSTATION) 115 if(osvi.wProductType == VER_NT_WORKSTATION)
116 mOSString = "Microsoft Windows Vista "; 116 mOSStringSimple = "Microsoft Windows Vista ";
117 else mOSString = "Microsoft Windows Vista Server "; 117 else mOSStringSimple = "Microsoft Windows Vista Server ";
118 } 118 }
119 else // Use the registry on early versions of Windows NT. 119 else // Use the registry on early versions of Windows NT.
120 { 120 {
@@ -129,15 +129,15 @@ LLOSInfo::LLOSInfo() :
129 RegCloseKey( hKey ); 129 RegCloseKey( hKey );
130 if ( lstrcmpi( L"WINNT", szProductType) == 0 ) 130 if ( lstrcmpi( L"WINNT", szProductType) == 0 )
131 { 131 {
132 mOSString += "Professional "; 132 mOSStringSimple += "Professional ";
133 } 133 }
134 else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 ) 134 else if ( lstrcmpi( L"LANMANNT", szProductType) == 0 )
135 { 135 {
136 mOSString += "Server "; 136 mOSStringSimple += "Server ";
137 } 137 }
138 else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 ) 138 else if ( lstrcmpi( L"SERVERNT", szProductType) == 0 )
139 { 139 {
140 mOSString += "Advanced Server "; 140 mOSStringSimple += "Advanced Server ";
141 } 141 }
142 } 142 }
143 143
@@ -164,7 +164,7 @@ LLOSInfo::LLOSInfo() :
164 csdversion.c_str(), 164 csdversion.c_str(),
165 (osvi.dwBuildNumber & 0xffff)); 165 (osvi.dwBuildNumber & 0xffff));
166 } 166 }
167 mOSString += tmp; 167 mOSString = mOSStringSimple + tmp;
168 } 168 }
169 break; 169 break;
170 170
@@ -172,41 +172,65 @@ LLOSInfo::LLOSInfo() :
172 // Test for the Windows 95 product family. 172 // Test for the Windows 95 product family.
173 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) 173 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
174 { 174 {
175 mOSString = "Microsoft Windows 95 "; 175 mOSStringSimple = "Microsoft Windows 95 ";
176 if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' ) 176 if ( osvi.szCSDVersion[1] == 'C' || osvi.szCSDVersion[1] == 'B' )
177 { 177 {
178 mOSString += "OSR2 "; 178 mOSStringSimple += "OSR2 ";
179 } 179 }
180 } 180 }
181 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) 181 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10)
182 { 182 {
183 mOSString = "Microsoft Windows 98 "; 183 mOSStringSimple = "Microsoft Windows 98 ";
184 if ( osvi.szCSDVersion[1] == 'A' ) 184 if ( osvi.szCSDVersion[1] == 'A' )
185 { 185 {
186 mOSString += "SE "; 186 mOSStringSimple += "SE ";
187 } 187 }
188 } 188 }
189 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) 189 if(osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90)
190 { 190 {
191 mOSString = "Microsoft Windows Millennium Edition "; 191 mOSStringSimple = "Microsoft Windows Millennium Edition ";
192 } 192 }
193 mOSString = mOSStringSimple;
193 break; 194 break;
194 } 195 }
195#else 196#else
196 struct utsname un; 197 struct utsname un;
197 if(uname(&un) != -1) 198 if(uname(&un) != -1)
198 { 199 {
199 mOSString.append(un.sysname); 200 mOSStringSimple.append(un.sysname);
200 mOSString.append(" "); 201 mOSStringSimple.append(" ");
201 mOSString.append(un.release); 202 mOSStringSimple.append(un.release);
203
204 mOSString = mOSStringSimple;
202 mOSString.append(" "); 205 mOSString.append(" ");
203 mOSString.append(un.version); 206 mOSString.append(un.version);
204 mOSString.append(" "); 207 mOSString.append(" ");
205 mOSString.append(un.machine); 208 mOSString.append(un.machine);
209
210 // Simplify 'Simple'
211 std::string ostype = mOSStringSimple.substr(0, mOSStringSimple.find_first_of(" ", 0));
212 if (ostype == "Darwin")
213 {
214 // Only care about major Darwin versions, truncate at first '.'
215 S32 idx1 = mOSStringSimple.find_first_of(".", 0);
216 std::string simple = mOSStringSimple.substr(0, idx1);
217 if (simple.length() > 0)
218 mOSStringSimple = simple;
219 }
220 else if (ostype == "Linux")
221 {
222 // Only care about major and minor Linux versions, truncate at second '.'
223 S32 idx1 = mOSStringSimple.find_first_of(".", 0);
224 S32 idx2 = (idx1 != std::string::npos) ? mOSStringSimple.find_first_of(".", idx1+1) : std::string::npos;
225 std::string simple = mOSStringSimple.substr(0, idx2);
226 if (simple.length() > 0)
227 mOSStringSimple = simple;
228 }
206 } 229 }
207 else 230 else
208 { 231 {
209 mOSString.append("Unable to collect OS info"); 232 mOSStringSimple.append("Unable to collect OS info");
233 mOSString = mOSStringSimple;
210 } 234 }
211#endif 235#endif
212 236
@@ -255,6 +279,11 @@ const std::string& LLOSInfo::getOSString() const
255 return mOSString; 279 return mOSString;
256} 280}
257 281
282const std::string& LLOSInfo::getOSStringSimple() const
283{
284 return mOSStringSimple;
285}
286
258const S32 STATUS_SIZE = 8192; 287const S32 STATUS_SIZE = 8192;
259 288
260//static 289//static
diff --git a/linden/indra/llcommon/llsys.h b/linden/indra/llcommon/llsys.h
index fc4e027..332d62c 100644
--- a/linden/indra/llcommon/llsys.h
+++ b/linden/indra/llcommon/llsys.h
@@ -51,6 +51,7 @@ public:
51 void stream(std::ostream& s) const; 51 void stream(std::ostream& s) const;
52 52
53 const std::string& getOSString() const; 53 const std::string& getOSString() const;
54 const std::string& getOSStringSimple() const;
54 55
55 S32 mMajorVer; 56 S32 mMajorVer;
56 S32 mMinorVer; 57 S32 mMinorVer;
@@ -64,6 +65,7 @@ public:
64 static U32 getProcessResidentSizeKB(); 65 static U32 getProcessResidentSizeKB();
65private: 66private:
66 std::string mOSString; 67 std::string mOSString;
68 std::string mOSStringSimple;
67}; 69};
68 70
69 71
diff --git a/linden/indra/llcommon/lluri.cpp b/linden/indra/llcommon/lluri.cpp
index df79043..5e4dec7 100644
--- a/linden/indra/llcommon/lluri.cpp
+++ b/linden/indra/llcommon/lluri.cpp
@@ -40,6 +40,8 @@
40 40
41#include "../llmath/lluuid.h" 41#include "../llmath/lluuid.h"
42 42
43// system includes
44#include <boost/tokenizer.hpp>
43 45
44// static 46// static
45std::string LLURI::escape(const std::string& str, const std::string & allowed) 47std::string LLURI::escape(const std::string& str, const std::string & allowed)
@@ -130,7 +132,7 @@ LLURI::LLURI()
130 132
131LLURI::LLURI(const std::string& escaped_str) 133LLURI::LLURI(const std::string& escaped_str)
132{ 134{
133 std::string::size_type delim_pos, delim_pos2; 135 std::string::size_type delim_pos;
134 delim_pos = escaped_str.find(':'); 136 delim_pos = escaped_str.find(':');
135 std::string temp; 137 std::string temp;
136 if (delim_pos == std::string::npos) 138 if (delim_pos == std::string::npos)
@@ -144,13 +146,39 @@ LLURI::LLURI(const std::string& escaped_str)
144 mEscapedOpaque = escaped_str.substr(delim_pos+1); 146 mEscapedOpaque = escaped_str.substr(delim_pos+1);
145 } 147 }
146 148
147 if (mScheme == "http" || mScheme == "https" || mScheme == "ftp") 149 parseAuthorityAndPathUsingOpaque();
150
151 delim_pos = mEscapedPath.find('?');
152 if (delim_pos != std::string::npos)
153 {
154 mEscapedQuery = mEscapedPath.substr(delim_pos+1);
155 mEscapedPath = mEscapedPath.substr(0,delim_pos);
156 }
157}
158
159static BOOL isDefault(const std::string& scheme, U16 port)
160{
161 if (scheme == "http")
162 return port == 80;
163 if (scheme == "https")
164 return port == 443;
165 if (scheme == "ftp")
166 return port == 21;
167
168 return FALSE;
169}
170
171void LLURI::parseAuthorityAndPathUsingOpaque()
172{
173 if (mScheme == "http" || mScheme == "https" ||
174 mScheme == "ftp" || mScheme == "secondlife" )
148 { 175 {
149 if (mEscapedOpaque.substr(0,2) != "//") 176 if (mEscapedOpaque.substr(0,2) != "//")
150 { 177 {
151 return; 178 return;
152 } 179 }
153 180
181 std::string::size_type delim_pos, delim_pos2;
154 delim_pos = mEscapedOpaque.find('/', 2); 182 delim_pos = mEscapedOpaque.find('/', 2);
155 delim_pos2 = mEscapedOpaque.find('?', 2); 183 delim_pos2 = mEscapedOpaque.find('?', 2);
156 // no path, no query 184 // no path, no query
@@ -182,27 +210,12 @@ LLURI::LLURI(const std::string& escaped_str)
182 mEscapedPath = mEscapedOpaque.substr(delim_pos); 210 mEscapedPath = mEscapedOpaque.substr(delim_pos);
183 } 211 }
184 } 212 }
185 213 else if (mScheme == "about")
186 delim_pos = mEscapedPath.find('?');
187 if (delim_pos != std::string::npos)
188 { 214 {
189 mEscapedQuery = mEscapedPath.substr(delim_pos+1); 215 mEscapedPath = mEscapedOpaque;
190 mEscapedPath = mEscapedPath.substr(0,delim_pos);
191 } 216 }
192} 217}
193 218
194static BOOL isDefault(const std::string& scheme, U16 port)
195{
196 if (scheme == "http")
197 return port == 80;
198 if (scheme == "https")
199 return port == 443;
200 if (scheme == "ftp")
201 return port == 21;
202
203 return FALSE;
204}
205
206LLURI::LLURI(const std::string& scheme, 219LLURI::LLURI(const std::string& scheme,
207 const std::string& userName, 220 const std::string& userName,
208 const std::string& password, 221 const std::string& password,
@@ -440,6 +453,22 @@ std::string LLURI::path() const
440 return unescape(mEscapedPath); 453 return unescape(mEscapedPath);
441} 454}
442 455
456LLSD LLURI::pathArray() const
457{
458 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
459 boost::char_separator<char> sep("/", "", boost::drop_empty_tokens);
460 tokenizer tokens(mEscapedPath, sep);
461 tokenizer::iterator it = tokens.begin();
462 tokenizer::iterator end = tokens.end();
463
464 LLSD params;
465 for ( ; it != end; ++it)
466 {
467 params.append(*it);
468 }
469 return params;
470}
471
443std::string LLURI::query() const 472std::string LLURI::query() const
444{ 473{
445 return unescape(mEscapedQuery); 474 return unescape(mEscapedQuery);
diff --git a/linden/indra/llcommon/lluri.h b/linden/indra/llcommon/lluri.h
index 3246dcd..bfe673c 100644
--- a/linden/indra/llcommon/lluri.h
+++ b/linden/indra/llcommon/lluri.h
@@ -107,7 +107,7 @@ public:
107 BOOL defaultPort() const; // true if port is default for scheme 107 BOOL defaultPort() const; // true if port is default for scheme
108 const std::string& escapedPath() const { return mEscapedPath; } 108 const std::string& escapedPath() const { return mEscapedPath; }
109 std::string path() const; // ex.: "/abc/def", includes leading slash 109 std::string path() const; // ex.: "/abc/def", includes leading slash
110 // LLSD pathArray() const; // above decoded into an array of strings 110 LLSD pathArray() const; // above decoded into an array of strings
111 std::string query() const; // ex.: "x=34", section after "?" 111 std::string query() const; // ex.: "x=34", section after "?"
112 const std::string& escapedQuery() const { return mEscapedQuery; } 112 const std::string& escapedQuery() const { return mEscapedQuery; }
113 LLSD queryMap() const; // above decoded into a map 113 LLSD queryMap() const; // above decoded into a map
@@ -135,6 +135,11 @@ public:
135 //@} 135 //@}
136 136
137private: 137private:
138 // only "http", "https", "ftp", and "secondlife" schemes are parsed
139 // secondlife scheme parses authority as "" and includes it as part of
140 // the path. See lluri_tut.cpp
141 // i.e. secondlife://app/login has mAuthority = "" and mPath = "/app/login"
142 void parseAuthorityAndPathUsingOpaque();
138 std::string mScheme; 143 std::string mScheme;
139 std::string mEscapedOpaque; 144 std::string mEscapedOpaque;
140 std::string mEscapedAuthority; 145 std::string mEscapedAuthority;
diff --git a/linden/indra/llcommon/llversionserver.h b/linden/indra/llcommon/llversionserver.h
index e36702a..9e1a8f5 100644
--- a/linden/indra/llcommon/llversionserver.h
+++ b/linden/indra/llcommon/llversionserver.h
@@ -34,8 +34,8 @@
34 34
35const S32 LL_VERSION_MAJOR = 1; 35const S32 LL_VERSION_MAJOR = 1;
36const S32 LL_VERSION_MINOR = 18; 36const S32 LL_VERSION_MINOR = 18;
37const S32 LL_VERSION_PATCH = 3; 37const S32 LL_VERSION_PATCH = 6;
38const S32 LL_VERSION_BUILD = 73552; 38const S32 LL_VERSION_BUILD = 74522;
39 39
40const char * const LL_CHANNEL = "Second Life Server"; 40const char * const LL_CHANNEL = "Second Life Server";
41 41
diff --git a/linden/indra/llcommon/llversionviewer.h b/linden/indra/llcommon/llversionviewer.h
index 1df8a89..f9f3bf2 100644
--- a/linden/indra/llcommon/llversionviewer.h
+++ b/linden/indra/llcommon/llversionviewer.h
@@ -34,8 +34,8 @@
34 34
35const S32 LL_VERSION_MAJOR = 1; 35const S32 LL_VERSION_MAJOR = 1;
36const S32 LL_VERSION_MINOR = 18; 36const S32 LL_VERSION_MINOR = 18;
37const S32 LL_VERSION_PATCH = 5; 37const S32 LL_VERSION_PATCH = 6;
38const S32 LL_VERSION_BUILD = 3; 38const S32 LL_VERSION_BUILD = 0;
39 39
40const char * const LL_CHANNEL = "Second Life Release"; 40const char * const LL_CHANNEL = "Second Life Release";
41 41
diff --git a/linden/indra/llcrashlogger/llcrashlogger.cpp b/linden/indra/llcrashlogger/llcrashlogger.cpp
new file mode 100755
index 0000000..01e9901
--- /dev/null
+++ b/linden/indra/llcrashlogger/llcrashlogger.cpp
@@ -0,0 +1,309 @@
1/**
2* @file llcrashlogger.cpp
3* @brief Crash logger implementation
4*
5* $LicenseInfo:firstyear=2003&license=viewergpl$
6*
7* Copyright (c) 2003-2007, Linden Research, Inc.
8*
9* Second Life Viewer Source Code
10* The source code in this file ("Source Code") is provided by Linden Lab
11* to you under the terms of the GNU General Public License, version 2.0
12* ("GPL"), unless you have obtained a separate licensing agreement
13* ("Other License"), formally executed by you and Linden Lab. Terms of
14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15* online at http://secondlife.com/developers/opensource/gplv2
16*
17* There are special exceptions to the terms and conditions of the GPL as
18* it is applied to this Source Code. View the full text of the exception
19* in the file doc/FLOSS-exception.txt in this software distribution, or
20* online at http://secondlife.com/developers/opensource/flossexception
21*
22* By copying, modifying or distributing this software, you acknowledge
23* that you have read and understood your obligations described above,
24* and agree to abide by those obligations.
25*
26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28* COMPLETENESS OR PERFORMANCE.
29* $/LicenseInfo$
30*/
31#include <cstdio>
32#include <cstdlib>
33#include <sstream>
34#include <map>
35
36#include "llcrashlogger.h"
37#include "linden_common.h"
38#include "llstring.h"
39#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
40#include "llerror.h"
41#include "lltimer.h"
42#include "lldir.h"
43#include "llsdserialize.h"
44#include "lliopipe.h"
45#include "llpumpio.h"
46#include "llhttpclient.h"
47#include "llsdserialize.h"
48
49LLPumpIO* gServicePump;
50BOOL gBreak = false;
51BOOL gSent = false;
52
53class LLCrashLoggerResponder : public LLHTTPClient::Responder
54{
55public:
56 LLCrashLoggerResponder()
57 {
58 }
59
60 virtual void error(U32 status, const std::string& reason)
61 {
62 gBreak = true;
63 }
64
65 virtual void result(const LLSD& content)
66 {
67 gBreak = true;
68 gSent = true;
69 }
70};
71
72bool LLCrashLoggerText::mainLoop()
73{
74 std::cout << "Entering main loop" << std::endl;
75 sendCrashLogs();
76 return true;
77}
78
79void LLCrashLoggerText::updateApplication(LLString message)
80{
81 LLCrashLogger::updateApplication(message);
82 std::cout << message << std::endl;
83}
84
85LLCrashLogger::LLCrashLogger() :
86mSentCrashLogs(false)
87{
88
89}
90
91LLCrashLogger::~LLCrashLogger()
92{
93
94}
95
96void LLCrashLogger::gatherFiles()
97{
98
99 /*
100 //TODO:This function needs to be reimplemented somewhere in here...
101 if(!previous_crash && is_crash_log)
102 {
103 // Make sure the file isn't too old.
104 double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec);
105
106 // llinfos << "age is " << age << llendl;
107
108 if(age > 60.0)
109 {
110 // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale.
111 llwarns << "File " << mFilename << " is too old!" << llendl;
112 return;
113 }
114 }
115 */
116
117 updateApplication("Gathering logs...");
118
119 // Figure out the filename of the debug log
120 LLString db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str();
121 std::ifstream debug_log_file(db_file_name.c_str());
122
123 // Look for it in the debug_info.log file
124 if (debug_log_file.is_open())
125 {
126 LLSDSerialize::fromXML(mDebugLog, debug_log_file);
127 mFileMap["SecondLifeLog"] = mDebugLog["SLLog"].asString();
128 mFileMap["SettingsXml"] = mDebugLog["SettingsFilename"].asString();
129 LLHTTPClient::setCABundle(mDebugLog["CAFilename"].asString());
130 llinfos << "Using log file from debug log " << mFileMap["SecondLifeLog"] << llendl;
131 llinfos << "Using settings file from debug log " << mFileMap["SettingsXml"] << llendl;
132 }
133 else
134 {
135 // Figure out the filename of the second life log
136 LLHTTPClient::setCABundle(gDirUtilp->getCAFile());
137 mFileMap["SecondLifeLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log");
138 mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml");
139 }
140
141 gatherPlatformSpecificFiles();
142
143 //Use the debug log to reconstruct the URL to send the crash report to
144 mCrashHost = "https://";
145 mCrashHost += mDebugLog["CurrentSimHost"].asString();
146 mCrashHost += ":12043/crash/report";
147 mAltCrashHost = "https://";
148 mAltCrashHost += mDebugLog["GridUtilHost"].asString();
149 mAltCrashHost += ":12043/crash/report";
150
151 mCrashInfo["DebugLog"] = mDebugLog;
152 mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log");
153 mFileMap["StackTrace"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
154
155 updateApplication("Encoding files...");
156
157 for(std::map<LLString, LLString>::iterator itr = mFileMap.begin(); itr != mFileMap.end(); ++itr)
158 {
159 std::ifstream f((*itr).second.c_str());
160 if(!f.is_open())
161 {
162 std::cout << "Can't find file " << (*itr).second.c_str() << std::endl;
163 continue;
164 }
165 std::stringstream s;
166 s << f.rdbuf();
167 mCrashInfo[(*itr).first] = s.str();
168 }
169}
170
171LLSD LLCrashLogger::constructPostData()
172{
173 LLSD ret;
174
175 if(mCrashInPreviousExec)
176 {
177 mCrashInfo["CrashInPreviousExecution"] = "Y";
178 }
179
180 return mCrashInfo;
181}
182
183S32 LLCrashLogger::loadCrashBehaviorSetting()
184{
185 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
186
187 mCrashSettings.loadFromFile(filename);
188
189 S32 value = mCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
190
191 if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
192
193 return value;
194}
195
196bool LLCrashLogger::saveCrashBehaviorSetting(S32 crash_behavior)
197{
198 if (crash_behavior < CRASH_BEHAVIOR_ASK) return false;
199 if (crash_behavior > CRASH_BEHAVIOR_NEVER_SEND) return false;
200
201 mCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
202 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
203
204 mCrashSettings.saveToFile(filename, FALSE);
205
206 return true;
207}
208
209bool LLCrashLogger::sendCrashLogs()
210{
211 gatherFiles();
212
213 LLSD post_data;
214 post_data = constructPostData();
215
216 updateApplication("Sending reports...");
217
218 std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
219 "SecondLifeCrashReport");
220 std::string report_file = dump_path + ".log";
221
222 std::ofstream out_file(report_file.c_str());
223 LLSDSerialize::toPrettyXML(post_data, out_file);
224 out_file.close();
225 LLHTTPClient::post(mCrashHost, post_data, new LLCrashLoggerResponder(), 5);
226
227 gBreak = false;
228 while(!gBreak)
229 {
230 updateApplication("Sending logs...");
231 }
232
233 if(!gSent)
234 {
235 gBreak = false;
236 LLHTTPClient::post(mAltCrashHost, post_data, new LLCrashLoggerResponder(), 5);
237
238 while(!gBreak)
239 {
240 updateApplication("Sending logs to Alternate Server...");
241 }
242 }
243 mSentCrashLogs = gSent;
244
245 return true;
246}
247
248void LLCrashLogger::updateApplication(LLString message)
249{
250 gServicePump->pump();
251 gServicePump->callback();
252}
253
254bool LLCrashLogger::init()
255{
256 // We assume that all the logs we're looking for reside on the current drive
257 gDirUtilp->initAppDirs("SecondLife");
258
259 // Default to the product name "Second Life" (this is overridden by the -name argument)
260 mProductName = "Second Life";
261
262 mCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
263 "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
264
265 llinfos << "Loading crash behavior setting" << llendl;
266 mCrashBehavior = loadCrashBehaviorSetting();
267
268 //Run through command line options
269 if(getOption("previous").isDefined())
270 {
271 llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
272 mCrashInPreviousExec = TRUE;
273 }
274
275 if(getOption("dialog").isDefined())
276 {
277 llinfos << "Show the user dialog" << llendl;
278 mCrashBehavior = CRASH_BEHAVIOR_ASK;
279 }
280
281 LLSD server = getOption("user");
282 if(server.isDefined())
283 {
284 mGridName = server.asString();
285 llinfos << "Got userserver " << mGridName << llendl;
286 }
287 else
288 {
289 mGridName = "agni";
290 }
291
292 LLSD name = getOption("name");
293 if(name.isDefined())
294 {
295 mProductName = name.asString();
296 }
297
298 // If user doesn't want to send, bail out
299 if (mCrashBehavior == CRASH_BEHAVIOR_NEVER_SEND)
300 {
301 llinfos << "Crash behavior is never_send, quitting" << llendl;
302 return false;
303 }
304
305 gServicePump = new LLPumpIO(gAPRPoolp);
306 gServicePump->prime(gAPRPoolp);
307 LLHTTPClient::setPump(*gServicePump);
308 return true;
309}
diff --git a/linden/indra/llcrashlogger/llcrashlogger.h b/linden/indra/llcrashlogger/llcrashlogger.h
new file mode 100755
index 0000000..f797a2f
--- /dev/null
+++ b/linden/indra/llcrashlogger/llcrashlogger.h
@@ -0,0 +1,85 @@
1/**
2* @file llcrashlogger.h
3* @brief Crash Logger Definition
4*
5* $LicenseInfo:firstyear=2003&license=viewergpl$
6*
7* Copyright (c) 2003-2007, Linden Research, Inc.
8*
9* Second Life Viewer Source Code
10* The source code in this file ("Source Code") is provided by Linden Lab
11* to you under the terms of the GNU General Public License, version 2.0
12* ("GPL"), unless you have obtained a separate licensing agreement
13* ("Other License"), formally executed by you and Linden Lab. Terms of
14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15* online at http://secondlife.com/developers/opensource/gplv2
16*
17* There are special exceptions to the terms and conditions of the GPL as
18* it is applied to this Source Code. View the full text of the exception
19* in the file doc/FLOSS-exception.txt in this software distribution, or
20* online at http://secondlife.com/developers/opensource/flossexception
21*
22* By copying, modifying or distributing this software, you acknowledge
23* that you have read and understood your obligations described above,
24* and agree to abide by those obligations.
25*
26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28* COMPLETENESS OR PERFORMANCE.
29* $/LicenseInfo$
30*/
31#ifndef LLCRASHLOGGER_H
32#define LLCRASHLOGGER_H
33
34#include <vector>
35
36#include "linden_common.h"
37
38#include "llapp.h"
39#include "llsd.h"
40#include "llcontrol.h"
41
42class LLCrashLogger : public LLApp
43{
44public:
45 LLCrashLogger();
46 virtual ~LLCrashLogger();
47 S32 loadCrashBehaviorSetting();
48 void gatherFiles();
49 virtual void gatherPlatformSpecificFiles() {}
50 bool saveCrashBehaviorSetting(S32 crash_behavior);
51 bool sendCrashLogs();
52 LLSD constructPostData();
53 virtual void updateApplication(LLString message = "");
54 virtual bool init();
55 virtual bool mainLoop() = 0;
56 virtual bool cleanup() { return true; }
57 void setUserText(LLString& text) { mCrashInfo["UserNotes"] = text; }
58 S32 getCrashBehavior() { return mCrashBehavior; }
59protected:
60 S32 mCrashBehavior;
61 BOOL mCrashInPreviousExec;
62 std::map<LLString, LLString> mFileMap;
63 static const int mMaxSendSize = 200000;
64 LLString mGridName;
65 LLControlGroup mCrashSettings;
66 LLString mProductName;
67 LLSD mCrashInfo;
68 LLString mCrashHost;
69 LLString mAltCrashHost;
70 LLSD mDebugLog;
71 bool mSentCrashLogs;
72};
73
74class LLCrashLoggerText : public LLCrashLogger
75{
76public:
77 LLCrashLoggerText(void) {}
78 ~LLCrashLoggerText(void) {}
79
80 virtual bool mainLoop();
81 virtual void updateApplication(LLString message = "");
82};
83
84
85#endif //LLCRASHLOGGER_H
diff --git a/linden/indra/llinventory/llparcel.cpp b/linden/indra/llinventory/llparcel.cpp
index 7cc3e57..a20b307 100644
--- a/linden/indra/llinventory/llparcel.cpp
+++ b/linden/indra/llinventory/llparcel.cpp
@@ -1,33 +1,33 @@
1/** 1/**
2 * @file llparcel.cpp 2* @file llparcel.cpp
3 * @brief A land parcel. 3* @brief A land parcel.
4 * 4*
5 * $LicenseInfo:firstyear=2002&license=viewergpl$ 5* $LicenseInfo:firstyear=2002&license=viewergpl$
6 * 6*
7 * Copyright (c) 2002-2007, Linden Research, Inc. 7* Copyright (c) 2002-2007, Linden Research, Inc.
8 * 8*
9 * Second Life Viewer Source Code 9* Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab 10* The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0 11* to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement 12* ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of 13* ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or 14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2 15* online at http://secondlife.com/developers/opensource/gplv2
16 * 16*
17 * There are special exceptions to the terms and conditions of the GPL as 17* There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception 18* it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or 19* in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception 20* online at http://secondlife.com/developers/opensource/flossexception
21 * 21*
22 * By copying, modifying or distributing this software, you acknowledge 22* By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above, 23* that you have read and understood your obligations described above,
24 * and agree to abide by those obligations. 24* and agree to abide by those obligations.
25 * 25*
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO 26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, 27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE. 28* COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$ 29* $/LicenseInfo$
30 */ 30*/
31 31
32#include "linden_common.h" 32#include "linden_common.h"
33 33
@@ -49,9 +49,9 @@ static const F32 SOME_BIG_NUMBER = 1000.0f;
49static const F32 SOME_BIG_NEG_NUMBER = -1000.0f; 49static const F32 SOME_BIG_NEG_NUMBER = -1000.0f;
50static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] = 50static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] =
51{ 51{
52 "leased", 52 "leased",
53 "lease_pending", 53 "lease_pending",
54 "abandoned" 54 "abandoned"
55}; 55};
56 56
57// NOTE: Adding parcel categories also requires updating: 57// NOTE: Adding parcel categories also requires updating:
@@ -59,52 +59,52 @@ static const char* PARCEL_OWNERSHIP_STATUS_STRING[LLParcel::OS_COUNT] =
59// * Web site "create event" tools 59// * Web site "create event" tools
60static const char* PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] = 60static const char* PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
61{ 61{
62 "none", 62 "none",
63 "linden", 63 "linden",
64 "adult", 64 "adult",
65 "arts", 65 "arts",
66 "store", // "business" legacy name 66 "store", // "business" legacy name
67 "educational", 67 "educational",
68 "game", // "gaming" legacy name 68 "game", // "gaming" legacy name
69 "gather", // "hangout" legacy name 69 "gather", // "hangout" legacy name
70 "newcomer", 70 "newcomer",
71 "park", 71 "park",
72 "home", // "residential" legacy name 72 "home", // "residential" legacy name
73 "shopping", 73 "shopping",
74 "stage", 74 "stage",
75 "other", 75 "other",
76}; 76};
77static const char* PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] = 77static const char* PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
78{ 78{
79 "None", 79 "None",
80 "Linden Location", 80 "Linden Location",
81 "Adult", 81 "Adult",
82 "Arts & Culture", 82 "Arts & Culture",
83 "Business", 83 "Business",
84 "Educational", 84 "Educational",
85 "Gaming", 85 "Gaming",
86 "Hangout", 86 "Hangout",
87 "Newcomer Friendly", 87 "Newcomer Friendly",
88 "Parks & Nature", 88 "Parks & Nature",
89 "Residential", 89 "Residential",
90 "Shopping", 90 "Shopping",
91 "Stage", 91 "Stage",
92 "Other", 92 "Other",
93 "Any", // valid string for parcel searches 93 "Any", // valid string for parcel searches
94}; 94};
95 95
96static const char* PARCEL_ACTION_STRING[LLParcel::A_COUNT + 1] = 96static const char* PARCEL_ACTION_STRING[LLParcel::A_COUNT + 1] =
97{ 97{
98 "create", 98 "create",
99 "release", 99 "release",
100 "absorb", 100 "absorb",
101 "absorbed", 101 "absorbed",
102 "divide", 102 "divide",
103 "division", 103 "division",
104 "acquire", 104 "acquire",
105 "relinquish", 105 "relinquish",
106 "confirm", 106 "confirm",
107 "unknown" 107 "unknown"
108}; 108};
109 109
110// Timeouts for parcels 110// Timeouts for parcels
@@ -142,369 +142,365 @@ LLParcel::ECategory category_ui_string_to_category(const char* s);
142 142
143LLParcel::LLParcel() 143LLParcel::LLParcel()
144{ 144{
145 init(LLUUID::null, TRUE, FALSE, FALSE, 0, 0, 0, 0, 0, 1.f, 0); 145 init(LLUUID::null, TRUE, FALSE, FALSE, 0, 0, 0, 0, 0, 1.f, 0);
146} 146}
147 147
148 148
149LLParcel::LLParcel(const LLUUID &owner_id, 149LLParcel::LLParcel(const LLUUID &owner_id,
150 BOOL modify, BOOL terraform, BOOL damage, 150 BOOL modify, BOOL terraform, BOOL damage,
151 time_t claim_date, S32 claim_price_per_meter, 151 time_t claim_date, S32 claim_price_per_meter,
152 S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, 152 S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus,
153 BOOL is_group_owned) 153 BOOL is_group_owned)
154{ 154{
155 init( owner_id, modify, terraform, damage, claim_date, 155 init( owner_id, modify, terraform, damage, claim_date,
156 claim_price_per_meter, rent_price_per_meter, area, sim_object_limit, parcel_object_bonus, 156 claim_price_per_meter, rent_price_per_meter, area, sim_object_limit, parcel_object_bonus,
157 is_group_owned); 157 is_group_owned);
158} 158}
159 159
160 160
161// virtual 161// virtual
162LLParcel::~LLParcel() 162LLParcel::~LLParcel()
163{ 163{
164 // user list cleaned up by LLDynamicArray destructor. 164 // user list cleaned up by LLDynamicArray destructor.
165} 165}
166 166
167void LLParcel::init(const LLUUID &owner_id, 167void LLParcel::init(const LLUUID &owner_id,
168 BOOL modify, BOOL terraform, BOOL damage, 168 BOOL modify, BOOL terraform, BOOL damage,
169 time_t claim_date, S32 claim_price_per_meter, 169 time_t claim_date, S32 claim_price_per_meter,
170 S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus, 170 S32 rent_price_per_meter, S32 area, S32 sim_object_limit, F32 parcel_object_bonus,
171 BOOL is_group_owned) 171 BOOL is_group_owned)
172{ 172{
173 mID.setNull(); 173 mID.setNull();
174 mOwnerID = owner_id; 174 mOwnerID = owner_id;
175 mGroupOwned = is_group_owned; 175 mGroupOwned = is_group_owned;
176 mClaimDate = claim_date; 176 mClaimDate = claim_date;
177 mClaimPricePerMeter = claim_price_per_meter; 177 mClaimPricePerMeter = claim_price_per_meter;
178 mRentPricePerMeter = rent_price_per_meter; 178 mRentPricePerMeter = rent_price_per_meter;
179 mArea = area; 179 mArea = area;
180 mDiscountRate = 1.0f; 180 mDiscountRate = 1.0f;
181 mDrawDistance = 512.f; 181 mDrawDistance = 512.f;
182 182
183 mUserLookAt.setVec(0.0f, 0.f, 0.f); 183 mUserLookAt.setVec(0.0f, 0.f, 0.f);
184 // Default to using the parcel's landing point, if any. 184 // Default to using the parcel's landing point, if any.
185 mLandingType = L_LANDING_POINT; 185 mLandingType = L_LANDING_POINT;
186 186
187 // *FIX: if owner_id != null, should be owned or sale pending, 187 // *FIX: if owner_id != null, should be owned or sale pending,
188 // investigate init callers. 188 // investigate init callers.
189 mStatus = OS_NONE; 189 mStatus = OS_NONE;
190 mCategory = C_NONE; 190 mCategory = C_NONE;
191 mAuthBuyerID.setNull(); 191 mAuthBuyerID.setNull();
192 //mBuyerID.setNull(); 192 //mBuyerID.setNull();
193 //mJoinNeighbors = 0x0; 193 //mJoinNeighbors = 0x0;
194 mSaleTimerExpires.setTimerExpirySec(0); 194 mSaleTimerExpires.setTimerExpirySec(0);
195 mSaleTimerExpires.stop(); 195 mSaleTimerExpires.stop();
196 mGraceExtension = 0; 196 mGraceExtension = 0;
197 //mExpireAction = STEA_REVERT; 197 //mExpireAction = STEA_REVERT;
198 mRecordTransaction = FALSE; 198 mRecordTransaction = FALSE;
199 199
200 mAuctionID = 0; 200 mAuctionID = 0;
201 mInEscrow = false; 201 mInEscrow = false;
202 202
203 mParcelFlags = PF_DEFAULT; 203 mParcelFlags = PF_DEFAULT;
204 setParcelFlag(PF_CREATE_OBJECTS, modify); 204 setParcelFlag(PF_CREATE_OBJECTS, modify);
205 setParcelFlag(PF_ALLOW_TERRAFORM, terraform); 205 setParcelFlag(PF_ALLOW_TERRAFORM, terraform);
206 setParcelFlag(PF_ALLOW_DAMAGE, damage); 206 setParcelFlag(PF_ALLOW_DAMAGE, damage);
207 207
208 mSalePrice = 10000; 208 mSalePrice = 10000;
209 setName(NULL); 209 setName(NULL);
210 setDesc(NULL); 210 setDesc(NULL);
211 setMusicURL(NULL); 211 setMusicURL(NULL);
212 setMediaURL(NULL); 212 setMediaURL(NULL);
213 mMediaID.setNull(); 213 mMediaID.setNull();
214 mMediaAutoScale = 0; 214 mMediaAutoScale = 0;
215 215
216 mGroupID.setNull(); 216 mGroupID.setNull();
217 217
218 mPassPrice = PARCEL_PASS_PRICE_DEFAULT; 218 mPassPrice = PARCEL_PASS_PRICE_DEFAULT;
219 mPassHours = PARCEL_PASS_HOURS_DEFAULT; 219 mPassHours = PARCEL_PASS_HOURS_DEFAULT;
220 220
221 mAABBMin.setVec(SOME_BIG_NUMBER, SOME_BIG_NUMBER, SOME_BIG_NUMBER); 221 mAABBMin.setVec(SOME_BIG_NUMBER, SOME_BIG_NUMBER, SOME_BIG_NUMBER);
222 mAABBMax.setVec(SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER); 222 mAABBMax.setVec(SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER, SOME_BIG_NEG_NUMBER);
223 223
224 mLocalID = 0; 224 mLocalID = 0;
225 225
226 //mSimWidePrimCorrection = 0; 226 //mSimWidePrimCorrection = 0;
227 setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); 227 setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS)));
228 setSimWideMaxPrimCapacity(0); 228 setSimWideMaxPrimCapacity(0);
229 setSimWidePrimCount(0); 229 setSimWidePrimCount(0);
230 setOwnerPrimCount(0); 230 setOwnerPrimCount(0);
231 setGroupPrimCount(0); 231 setGroupPrimCount(0);
232 setOtherPrimCount(0); 232 setOtherPrimCount(0);
233 setSelectedPrimCount(0); 233 setSelectedPrimCount(0);
234 setTempPrimCount(0); 234 setTempPrimCount(0);
235 setCleanOtherTime(0); 235 setCleanOtherTime(0);
236 setParcelPrimBonus(parcel_object_bonus); 236 setParcelPrimBonus(parcel_object_bonus);
237 237
238 setPreviousOwnerID(LLUUID::null); 238 setPreviousOwnerID(LLUUID::null);
239 setPreviouslyGroupOwned(FALSE); 239 setPreviouslyGroupOwned(FALSE);
240} 240}
241 241
242void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned) 242void LLParcel::overrideOwner(const LLUUID& owner_id, BOOL is_group_owned)
243{ 243{
244 // Override with system permission (LLUUID::null) 244 // Override with system permission (LLUUID::null)
245 // Overridden parcels have no group 245 // Overridden parcels have no group
246 mOwnerID = owner_id; 246 mOwnerID = owner_id;
247 mGroupOwned = is_group_owned; 247 mGroupOwned = is_group_owned;
248 if(mGroupOwned) 248 if(mGroupOwned)
249 { 249 {
250 mGroupID = mOwnerID; 250 mGroupID = mOwnerID;
251 } 251 }
252 else 252 else
253 { 253 {
254 mGroupID.setNull(); 254 mGroupID.setNull();
255 } 255 }
256 mInEscrow = false; 256 mInEscrow = false;
257} 257}
258 258
259void LLParcel::overrideParcelFlags(U32 flags) 259void LLParcel::overrideParcelFlags(U32 flags)
260{ 260{
261 mParcelFlags = flags; 261 mParcelFlags = flags;
262} 262}
263 263
264void LLParcel::setName(const LLString& name) 264void LLParcel::setName(const LLString& name)
265{ 265{
266 // The escaping here must match the escaping in the database 266 // The escaping here must match the escaping in the database
267 // abstraction layer. 267 // abstraction layer.
268 mName = name; 268 mName = name;
269 LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR); 269 LLStringFn::replace_nonprintable(mName, LL_UNKNOWN_CHAR);
270} 270}
271 271
272void LLParcel::setDesc(const LLString& desc) 272void LLParcel::setDesc(const LLString& desc)
273{ 273{
274 // The escaping here must match the escaping in the database 274 // The escaping here must match the escaping in the database
275 // abstraction layer. 275 // abstraction layer.
276 mDesc = desc; 276 mDesc = desc;
277 mDesc = rawstr_to_utf8(mDesc); 277 mDesc = rawstr_to_utf8(mDesc);
278} 278}
279 279
280void LLParcel::setMusicURL(const LLString& url) 280void LLParcel::setMusicURL(const LLString& url)
281{ 281{
282 mMusicURL = url; 282 mMusicURL = url;
283 // The escaping here must match the escaping in the database 283 // The escaping here must match the escaping in the database
284 // abstraction layer. 284 // abstraction layer.
285 // This should really filter the url in some way. Other than 285 // This should really filter the url in some way. Other than
286 // simply requiring non-printable. 286 // simply requiring non-printable.
287 LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR); 287 LLStringFn::replace_nonprintable(mMusicURL, LL_UNKNOWN_CHAR);
288} 288}
289 289
290void LLParcel::setMediaURL(const LLString& url) 290void LLParcel::setMediaURL(const LLString& url)
291{ 291{
292 mMediaURL = url; 292 mMediaURL = url;
293 // The escaping here must match the escaping in the database 293 // The escaping here must match the escaping in the database
294 // abstraction layer if it's ever added. 294 // abstraction layer if it's ever added.
295 // This should really filter the url in some way. Other than 295 // This should really filter the url in some way. Other than
296 // simply requiring non-printable. 296 // simply requiring non-printable.
297 LLStringFn::replace_nonprintable(mMediaURL, LL_UNKNOWN_CHAR); 297 LLStringFn::replace_nonprintable(mMediaURL, LL_UNKNOWN_CHAR);
298} 298}
299 299
300// virtual 300// virtual
301void LLParcel::setLocalID(S32 local_id) 301void LLParcel::setLocalID(S32 local_id)
302{ 302{
303 mLocalID = local_id; 303 mLocalID = local_id;
304} 304}
305 305
306void LLParcel::setAllParcelFlags(U32 flags) 306void LLParcel::setAllParcelFlags(U32 flags)
307{ 307{
308 mParcelFlags = flags; 308 mParcelFlags = flags;
309} 309}
310 310
311void LLParcel::setParcelFlag(U32 flag, BOOL b) 311void LLParcel::setParcelFlag(U32 flag, BOOL b)
312{ 312{
313 if (b) 313 if (b)
314 { 314 {
315 mParcelFlags |= flag; 315 mParcelFlags |= flag;
316 } 316 }
317 else 317 else
318 { 318 {
319 mParcelFlags &= ~flag; 319 mParcelFlags &= ~flag;
320 } 320 }
321} 321}
322 322
323 323
324BOOL LLParcel::allowModifyBy(const LLUUID &agent_id, const LLUUID &group_id) const 324BOOL LLParcel::allowModifyBy(const LLUUID &agent_id, const LLUUID &group_id) const
325{ 325{
326 if (agent_id == LLUUID::null) 326 if (agent_id == LLUUID::null)
327 { 327 {
328 // system always can enter 328 // system always can enter
329 return TRUE; 329 return TRUE;
330 } 330 }
331 else if (isPublic()) 331 else if (isPublic())
332 { 332 {
333 return TRUE; 333 return TRUE;
334 } 334 }
335 else if (agent_id == mOwnerID) 335 else if (agent_id == mOwnerID)
336 { 336 {
337 // owner can always perform operations 337 // owner can always perform operations
338 return TRUE; 338 return TRUE;
339 } 339 }
340 else if (mParcelFlags & PF_CREATE_OBJECTS) 340 else if (mParcelFlags & PF_CREATE_OBJECTS)
341 { 341 {
342 return TRUE; 342 return TRUE;
343 } 343 }
344 else if ((mParcelFlags & PF_CREATE_GROUP_OBJECTS) 344 else if ((mParcelFlags & PF_CREATE_GROUP_OBJECTS)
345 && group_id.notNull() ) 345 && group_id.notNull() )
346 { 346 {
347 return (getGroupID() == group_id); 347 return (getGroupID() == group_id);
348 } 348 }
349 349
350 return FALSE; 350 return FALSE;
351} 351}
352 352
353BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const 353BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const
354{ 354{
355 if (agent_id == LLUUID::null) 355 if (agent_id == LLUUID::null)
356 { 356 {
357 // system always can enter 357 // system always can enter
358 return TRUE; 358 return TRUE;
359 } 359 }
360 else if(OS_LEASED == mStatus) 360 else if(OS_LEASED == mStatus)
361 { 361 {
362 if(agent_id == mOwnerID) 362 if(agent_id == mOwnerID)
363 { 363 {
364 // owner can modify leased land 364 // owner can modify leased land
365 return TRUE; 365 return TRUE;
366 } 366 }
367 else 367 else
368 { 368 {
369 // otherwise check other people 369 // otherwise check other people
370 return mParcelFlags & PF_ALLOW_TERRAFORM; 370 return mParcelFlags & PF_ALLOW_TERRAFORM;
371 } 371 }
372 } 372 }
373 else 373 else
374 { 374 {
375 return FALSE; 375 return FALSE;
376 } 376 }
377} 377}
378 378
379 379
380bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp, 380bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp,
381 const LLUUID& agent_id, 381 const LLUUID& agent_id,
382 const std::vector<LLUUID>& group_ids, 382 const std::vector<LLUUID>& group_ids,
383 const BOOL is_agent_identified, 383 const BOOL is_agent_identified,
384 const BOOL is_agent_transacted) 384 const BOOL is_agent_transacted,
385 const BOOL is_agent_ageverified)
385{ 386{
386 S32 current_group_access = parcelp->blockAccess(agent_id, LLUUID::null, is_agent_identified, is_agent_transacted); 387 S32 current_group_access = parcelp->blockAccess(agent_id, LLUUID::null, is_agent_identified, is_agent_transacted, is_agent_ageverified);
387 S32 count; 388 S32 count;
388 bool is_allowed = (current_group_access == BA_ALLOWED) ? true: false; 389 bool is_allowed = (current_group_access == BA_ALLOWED) ? true: false;
389 LLUUID group_id; 390 LLUUID group_id;
390 391
391 count = group_ids.size(); 392 count = group_ids.size();
392 for (int i = 0; i < count && !is_allowed; i++) 393 for (int i = 0; i < count && !is_allowed; i++)
393 { 394 {
394 group_id = group_ids[i]; 395 group_id = group_ids[i];
395 current_group_access = parcelp->blockAccess(agent_id, group_id, is_agent_identified, is_agent_transacted); 396 current_group_access = parcelp->blockAccess(agent_id, group_id, is_agent_identified, is_agent_transacted, is_agent_ageverified);
396 397
397 if (current_group_access == BA_ALLOWED) is_allowed = true; 398 if (current_group_access == BA_ALLOWED) is_allowed = true;
398 } 399 }
399 400
400 return !is_allowed; 401 return !is_allowed;
401} 402}
402 403
403BOOL LLParcel::isAgentBanned(const LLUUID& agent_id) const 404BOOL LLParcel::isAgentBanned(const LLUUID& agent_id) const
404{ 405{
405 // Test ban list 406 // Test ban list
406 if (getParcelFlag(PF_USE_BAN_LIST) 407 if (mBanList.find(agent_id) != mBanList.end())
407 && (mBanList.find(agent_id) != mBanList.end()))
408 { 408 {
409 return TRUE; 409 return TRUE;
410 } 410 }
411 411
412 return FALSE; 412 return FALSE;
413} 413}
414
414S32 LLParcel::blockAccess(const LLUUID& agent_id, const LLUUID& group_id, 415S32 LLParcel::blockAccess(const LLUUID& agent_id, const LLUUID& group_id,
415 const BOOL is_agent_identified, 416 const BOOL is_agent_identified,
416 const BOOL is_agent_transacted) const 417 const BOOL is_agent_transacted,
418 const BOOL is_agent_ageverified) const
417{ 419{
418 // Test ban list 420 // Test ban list
419 if (isAgentBanned(agent_id)) 421 if (isAgentBanned(agent_id))
420 { 422 {
421 return BA_BANNED; 423 return BA_BANNED;
422 } 424 }
423 425
424 // Always allow owner on (unless he banned himself, useful for 426 // Always allow owner on (unless he banned himself, useful for
425 // testing). We will also allow estate owners/managers in if they 427 // testing). We will also allow estate owners/managers in if they
426 // are not explicitly banned. 428 // are not explicitly banned.
427 if (agent_id == mOwnerID) 429 if (agent_id == mOwnerID)
428 { 430 {
429 return BA_ALLOWED; 431 return BA_ALLOWED;
430 } 432 }
431 433
432 // Special case when using pass list where group access is being restricted but not 434 // Special case when using pass list where group access is being restricted but not
433 // using access list. In this case group members are allowed only if they buy a pass. 435 // using access list. In this case group members are allowed only if they buy a pass.
434 // We return BA_NOT_IN_LIST if not in list 436 // We return BA_NOT_IN_LIST if not in list
435 BOOL passWithGroup = getParcelFlag(PF_USE_PASS_LIST) && !getParcelFlag(PF_USE_ACCESS_LIST) 437 BOOL passWithGroup = getParcelFlag(PF_USE_PASS_LIST) && !getParcelFlag(PF_USE_ACCESS_LIST)
436 && getParcelFlag(PF_USE_ACCESS_GROUP) && !mGroupID.isNull() && group_id == mGroupID; 438 && getParcelFlag(PF_USE_ACCESS_GROUP) && !mGroupID.isNull() && group_id == mGroupID;
437 439
438 440
439 // Test group list 441 // Test group list
440 if (getParcelFlag(PF_USE_ACCESS_GROUP) 442 if (getParcelFlag(PF_USE_ACCESS_GROUP)
441 && !mGroupID.isNull() 443 && !mGroupID.isNull()
442 && group_id == mGroupID 444 && group_id == mGroupID
443 && !passWithGroup) 445 && !passWithGroup)
444 { 446 {
445 return BA_ALLOWED; 447 return BA_ALLOWED;
446 } 448 }
447 449
448 // Test access list 450 // Test access list
449 if (getParcelFlag(PF_USE_ACCESS_LIST) || passWithGroup ) 451 if (getParcelFlag(PF_USE_ACCESS_LIST) || passWithGroup )
450 { 452 {
451 if (mAccessList.find(agent_id) != mAccessList.end()) 453 if (mAccessList.find(agent_id) != mAccessList.end())
452 { 454 {
453 return BA_ALLOWED; 455 return BA_ALLOWED;
454 } 456 }
455 457
456 return BA_NOT_ON_LIST; 458 return BA_NOT_ON_LIST;
457 } 459 }
458 460
459 // If we're not doing any other limitations, all users 461 // If we're not doing any other limitations, all users
460 // can enter, unless 462 // can enter, unless
461 if ( !getParcelFlag(PF_USE_ACCESS_GROUP) 463 if ( !getParcelFlag(PF_USE_ACCESS_GROUP)
462 && !getParcelFlag(PF_USE_ACCESS_LIST)) 464 && !getParcelFlag(PF_USE_ACCESS_LIST))
463 { 465 {
464 //If the land is group owned, and you are in the group, bypass these checks 466 //If the land is group owned, and you are in the group, bypass these checks
465 if(getIsGroupOwned() && group_id == mGroupID) 467 if(getIsGroupOwned() && group_id == mGroupID)
466 { 468 {
467 return BA_ALLOWED; 469 return BA_ALLOWED;
468 } 470 }
469 471
470 // Test for "payment" access levels 472 // Test for "payment" access levels
471 // Anonymous - No Payment Info on File 473 // Anonymous - No Payment Info on File
472 if(getParcelFlag(PF_DENY_ANONYMOUS) && !is_agent_identified && !is_agent_transacted) 474 if(getParcelFlag(PF_DENY_ANONYMOUS) && !is_agent_identified && !is_agent_transacted)
473 { 475 {
474 return BA_NO_ACCESS_LEVEL; 476 return BA_NO_ACCESS_LEVEL;
475 } 477 }
476 // Identified - Payment Info on File 478 // AgeUnverified - Not Age Verified
477 // Must check to make sure we're only banning Identified, since Transacted accounts 479 if(getParcelFlag(PF_DENY_AGEUNVERIFIED) && !is_agent_ageverified)
478 // also have their identified flag set 480 {
479 if(getParcelFlag(PF_DENY_IDENTIFIED) && is_agent_identified && !is_agent_transacted) 481 return BA_NOT_AGE_VERIFIED;
480 { 482 }
481 return BA_NO_ACCESS_LEVEL; 483
482 } 484 return BA_ALLOWED;
483 // Transacted - Payment Info Used 485 }
484 if(getParcelFlag(PF_DENY_TRANSACTED) && is_agent_transacted) 486
485 { 487 return BA_NOT_IN_GROUP;
486 return BA_NO_ACCESS_LEVEL; 488
487 }
488 return BA_ALLOWED;
489 }
490
491 return BA_NOT_IN_GROUP;
492
493} 489}
494 490
495 491
496void LLParcel::setArea(S32 area, S32 sim_object_limit) 492void LLParcel::setArea(S32 area, S32 sim_object_limit)
497{ 493{
498 mArea = area; 494 mArea = area;
499 setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS))); 495 setMaxPrimCapacity((S32)(sim_object_limit * area / (F32)(REGION_WIDTH_METERS * REGION_WIDTH_METERS)));
500} 496}
501 497
502void LLParcel::setDiscountRate(F32 rate) 498void LLParcel::setDiscountRate(F32 rate)
503{ 499{
504 // this is to make sure that the rate is at least sane - this is 500 // this is to make sure that the rate is at least sane - this is
505 // not intended to enforce economy rules. It only enfoces that the 501 // not intended to enforce economy rules. It only enfoces that the
506 // rate is a scaler between 0 and 1. 502 // rate is a scaler between 0 and 1.
507 mDiscountRate = llclampf(rate); 503 mDiscountRate = llclampf(rate);
508} 504}
509 505
510 506
@@ -516,909 +512,918 @@ void LLParcel::setDiscountRate(F32 rate)
516// WARNING: Area will be wrong until you calculate it. 512// WARNING: Area will be wrong until you calculate it.
517BOOL LLParcel::importStream(std::istream& input_stream) 513BOOL LLParcel::importStream(std::istream& input_stream)
518{ 514{
519 U32 setting; 515 U32 setting;
520 S32 secs_until_revert = 0; 516 S32 secs_until_revert = 0;
521 517
522 skip_to_end_of_next_keyword("{", input_stream); 518 skip_to_end_of_next_keyword("{", input_stream);
523 if (!input_stream.good()) 519 if (!input_stream.good())
524 { 520 {
525 llwarns << "LLParcel::importStream() - bad input_stream" << llendl; 521 llwarns << "LLParcel::importStream() - bad input_stream" << llendl;
526 return FALSE; 522 return FALSE;
527 } 523 }
528 524
529 while (input_stream.good()) 525 while (input_stream.good())
530 { 526 {
531 skip_comments_and_emptyspace(input_stream); 527 skip_comments_and_emptyspace(input_stream);
532 LLString line, keyword, value; 528 LLString line, keyword, value;
533 get_line(line, input_stream, MAX_STRING); 529 get_line(line, input_stream, MAX_STRING);
534 get_keyword_and_value(keyword, value, line); 530 get_keyword_and_value(keyword, value, line);
535 531
536 if ("}" == keyword) 532 if ("}" == keyword)
537 { 533 {
538 break; 534 break;
539 } 535 }
540 else if ("parcel_id" == keyword) 536 else if ("parcel_id" == keyword)
541 { 537 {
542 mID.set(value.c_str()); 538 mID.set(value.c_str());
543 } 539 }
544 else if ("status" == keyword) 540 else if ("status" == keyword)
545 { 541 {
546 mStatus = ownership_string_to_status(value.c_str()); 542 mStatus = ownership_string_to_status(value.c_str());
547 } 543 }
548 else if ("category" == keyword) 544 else if ("category" == keyword)
549 { 545 {
550 mCategory = category_string_to_category(value.c_str()); 546 mCategory = category_string_to_category(value.c_str());
551 } 547 }
552 else if ("local_id" == keyword) 548 else if ("local_id" == keyword)
553 { 549 {
554 LLString::convertToS32(value, mLocalID); 550 LLString::convertToS32(value, mLocalID);
555 } 551 }
556 else if ("name" == keyword) 552 else if ("name" == keyword)
557 { 553 {
558 setName( value ); 554 setName( value );
559 } 555 }
560 else if ("desc" == keyword) 556 else if ("desc" == keyword)
561 { 557 {
562 setDesc( value ); 558 setDesc( value );
563 } 559 }
564 else if ("music_url" == keyword) 560 else if ("music_url" == keyword)
565 { 561 {
566 setMusicURL( value ); 562 setMusicURL( value );
567 } 563 }
568 else if ("media_url" == keyword) 564 else if ("media_url" == keyword)
569 { 565 {
570 setMediaURL( value ); 566 setMediaURL( value );
571 } 567 }
572 else if ("media_id" == keyword) 568 else if ("media_id" == keyword)
573 { 569 {
574 mMediaID.set( value.c_str() ); 570 mMediaID.set( value.c_str() );
575 } 571 }
576 else if ("media_auto_scale" == keyword) 572 else if ("media_auto_scale" == keyword)
577 { 573 {
578 LLString::convertToU8(value, mMediaAutoScale); 574 LLString::convertToU8(value, mMediaAutoScale);
579 } 575 }
580 else if ("owner_id" == keyword) 576 else if ("owner_id" == keyword)
581 { 577 {
582 mOwnerID.set( value.c_str() ); 578 mOwnerID.set( value.c_str() );
583 } 579 }
584 else if ("group_owned" == keyword) 580 else if ("group_owned" == keyword)
585 { 581 {
586 LLString::convertToBOOL(value, mGroupOwned); 582 LLString::convertToBOOL(value, mGroupOwned);
587 } 583 }
588 else if ("clean_other_time" == keyword) 584 else if ("clean_other_time" == keyword)
589 { 585 {
590 S32 time; 586 S32 time;
591 LLString::convertToS32(value, time); 587 LLString::convertToS32(value, time);
592 setCleanOtherTime(time); 588 setCleanOtherTime(time);
593 } 589 }
594 else if ("auth_buyer_id" == keyword) 590 else if ("auth_buyer_id" == keyword)
595 { 591 {
596 mAuthBuyerID.set(value.c_str()); 592 mAuthBuyerID.set(value.c_str());
597 } 593 }
598 else if ("snapshot_id" == keyword) 594 else if ("snapshot_id" == keyword)
599 { 595 {
600 mSnapshotID.set(value.c_str()); 596 mSnapshotID.set(value.c_str());
601 } 597 }
602 else if ("user_location" == keyword) 598 else if ("user_location" == keyword)
603 { 599 {
604 sscanf(value.c_str(), "%f %f %f", 600 sscanf(value.c_str(), "%f %f %f",
605 &mUserLocation.mV[VX], 601 &mUserLocation.mV[VX],
606 &mUserLocation.mV[VY], 602 &mUserLocation.mV[VY],
607 &mUserLocation.mV[VZ]); 603 &mUserLocation.mV[VZ]);
608 } 604 }
609 else if ("user_look_at" == keyword) 605 else if ("user_look_at" == keyword)
610 { 606 {
611 sscanf(value.c_str(), "%f %f %f", 607 sscanf(value.c_str(), "%f %f %f",
612 &mUserLookAt.mV[VX], 608 &mUserLookAt.mV[VX],
613 &mUserLookAt.mV[VY], 609 &mUserLookAt.mV[VY],
614 &mUserLookAt.mV[VZ]); 610 &mUserLookAt.mV[VZ]);
615 } 611 }
616 else if ("landing_type" == keyword) 612 else if ("landing_type" == keyword)
617 { 613 {
618 S32 landing_type = 0; 614 S32 landing_type = 0;
619 LLString::convertToS32(value, landing_type); 615 LLString::convertToS32(value, landing_type);
620 mLandingType = (ELandingType) landing_type; 616 mLandingType = (ELandingType) landing_type;
621 } 617 }
622 else if ("join_neighbors" == keyword) 618 else if ("join_neighbors" == keyword)
623 { 619 {
624 llinfos << "found deprecated keyword join_neighbors" << llendl; 620 llinfos << "found deprecated keyword join_neighbors" << llendl;
625 } 621 }
626 else if ("revert_sale" == keyword) 622 else if ("revert_sale" == keyword)
627 { 623 {
628 LLString::convertToS32(value, secs_until_revert); 624 LLString::convertToS32(value, secs_until_revert);
629 if (secs_until_revert > 0) 625 if (secs_until_revert > 0)
630 { 626 {
631 mSaleTimerExpires.start(); 627 mSaleTimerExpires.start();
632 mSaleTimerExpires.setTimerExpirySec((F32)secs_until_revert); 628 mSaleTimerExpires.setTimerExpirySec((F32)secs_until_revert);
633 } 629 }
634 } 630 }
635 else if("extended_grace" == keyword) 631 else if("extended_grace" == keyword)
636 { 632 {
637 LLString::convertToS32(value, mGraceExtension); 633 LLString::convertToS32(value, mGraceExtension);
638 } 634 }
639 else if ("user_list_type" == keyword) 635 else if ("user_list_type" == keyword)
640 { 636 {
641 // deprecated 637 // deprecated
642 } 638 }
643 else if("auction_id" == keyword) 639 else if("auction_id" == keyword)
644 { 640 {
645 LLString::convertToU32(value, mAuctionID); 641 LLString::convertToU32(value, mAuctionID);
646 } 642 }
647 else if ("allow_modify" == keyword) 643 else if ("allow_modify" == keyword)
648 { 644 {
649 LLString::convertToU32(value, setting); 645 LLString::convertToU32(value, setting);
650 setParcelFlag(PF_CREATE_OBJECTS, setting); 646 setParcelFlag(PF_CREATE_OBJECTS, setting);
651 } 647 }
652 else if ("allow_group_modify" == keyword) 648 else if ("allow_group_modify" == keyword)
653 { 649 {
654 LLString::convertToU32(value, setting); 650 LLString::convertToU32(value, setting);
655 setParcelFlag(PF_CREATE_GROUP_OBJECTS, setting); 651 setParcelFlag(PF_CREATE_GROUP_OBJECTS, setting);
656 } 652 }
657 else if ("allow_all_object_entry" == keyword) 653 else if ("allow_all_object_entry" == keyword)
658 { 654 {
659 LLString::convertToU32(value, setting); 655 LLString::convertToU32(value, setting);
660 setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, setting); 656 setParcelFlag(PF_ALLOW_ALL_OBJECT_ENTRY, setting);
661 } 657 }
662 else if ("allow_group_object_entry" == keyword) 658 else if ("allow_group_object_entry" == keyword)
663 { 659 {
664 LLString::convertToU32(value, setting); 660 LLString::convertToU32(value, setting);
665 setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, setting); 661 setParcelFlag(PF_ALLOW_GROUP_OBJECT_ENTRY, setting);
666 } 662 }
667 else if ("allow_deed_to_group" == keyword) 663 else if ("allow_deed_to_group" == keyword)
668 { 664 {
669 LLString::convertToU32(value, setting); 665 LLString::convertToU32(value, setting);
670 setParcelFlag(PF_ALLOW_DEED_TO_GROUP, setting); 666 setParcelFlag(PF_ALLOW_DEED_TO_GROUP, setting);
671 } 667 }
672 else if("contribute_with_deed" == keyword) 668 else if("contribute_with_deed" == keyword)
673 { 669 {
674 LLString::convertToU32(value, setting); 670 LLString::convertToU32(value, setting);
675 setParcelFlag(PF_CONTRIBUTE_WITH_DEED, setting); 671 setParcelFlag(PF_CONTRIBUTE_WITH_DEED, setting);
676 } 672 }
677 else if ("allow_terraform" == keyword) 673 else if ("allow_terraform" == keyword)
678 { 674 {
679 LLString::convertToU32(value, setting); 675 LLString::convertToU32(value, setting);
680 setParcelFlag(PF_ALLOW_TERRAFORM, setting); 676 setParcelFlag(PF_ALLOW_TERRAFORM, setting);
681 } 677 }
682 else if ("allow_damage" == keyword) 678 else if ("allow_damage" == keyword)
683 { 679 {
684 LLString::convertToU32(value, setting); 680 LLString::convertToU32(value, setting);
685 setParcelFlag(PF_ALLOW_DAMAGE, setting); 681 setParcelFlag(PF_ALLOW_DAMAGE, setting);
686 } 682 }
687 else if ("allow_fly" == keyword) 683 else if ("allow_fly" == keyword)
688 { 684 {
689 LLString::convertToU32(value, setting); 685 LLString::convertToU32(value, setting);
690 setParcelFlag(PF_ALLOW_FLY, setting); 686 setParcelFlag(PF_ALLOW_FLY, setting);
691 } 687 }
692 else if ("allow_landmark" == keyword) 688 else if ("allow_landmark" == keyword)
693 { 689 {
694 LLString::convertToU32(value, setting); 690 LLString::convertToU32(value, setting);
695 setParcelFlag(PF_ALLOW_LANDMARK, setting); 691 setParcelFlag(PF_ALLOW_LANDMARK, setting);
696 } 692 }
697 else if ("sound_local" == keyword) 693 else if ("sound_local" == keyword)
698 { 694 {
699 LLString::convertToU32(value, setting); 695 LLString::convertToU32(value, setting);
700 setParcelFlag(PF_SOUND_LOCAL, setting); 696 setParcelFlag(PF_SOUND_LOCAL, setting);
701 } 697 }
702 else if ("allow_group_scripts" == keyword) 698 else if ("allow_group_scripts" == keyword)
703 { 699 {
704 LLString::convertToU32(value, setting); 700 LLString::convertToU32(value, setting);
705 setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, setting); 701 setParcelFlag(PF_ALLOW_GROUP_SCRIPTS, setting);
706 } 702 }
707 else if ("allow_voice_chat" == keyword) 703 else if ("allow_voice_chat" == keyword)
708 { 704 {
709 LLString::convertToU32(value, setting); 705 LLString::convertToU32(value, setting);
710 setParcelFlag(PF_ALLOW_VOICE_CHAT, setting); 706 setParcelFlag(PF_ALLOW_VOICE_CHAT, setting);
711 } 707 }
712 else if ("use_estate_voice_chan" == keyword) 708 else if ("use_estate_voice_chan" == keyword)
713 { 709 {
714 LLString::convertToU32(value, setting); 710 LLString::convertToU32(value, setting);
715 setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, setting); 711 setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, setting);
716 } 712 }
717 else if ("allow_scripts" == keyword) 713 else if ("allow_scripts" == keyword)
718 { 714 {
719 LLString::convertToU32(value, setting); 715 LLString::convertToU32(value, setting);
720 setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, setting); 716 setParcelFlag(PF_ALLOW_OTHER_SCRIPTS, setting);
721 } 717 }
722 else if ("for_sale" == keyword) 718 else if ("for_sale" == keyword)
723 { 719 {
724 LLString::convertToU32(value, setting); 720 LLString::convertToU32(value, setting);
725 setParcelFlag(PF_FOR_SALE, setting); 721 setParcelFlag(PF_FOR_SALE, setting);
726 } 722 }
727 else if ("sell_w_objects" == keyword) 723 else if ("sell_w_objects" == keyword)
728 { 724 {
729 LLString::convertToU32(value, setting); 725 LLString::convertToU32(value, setting);
730 setParcelFlag(PF_SELL_PARCEL_OBJECTS, setting); 726 setParcelFlag(PF_SELL_PARCEL_OBJECTS, setting);
731 } 727 }
732 else if ("use_pass_list" == keyword) 728 else if ("use_pass_list" == keyword)
733 { 729 {
734 LLString::convertToU32(value, setting); 730 LLString::convertToU32(value, setting);
735 setParcelFlag(PF_USE_PASS_LIST, setting); 731 setParcelFlag(PF_USE_PASS_LIST, setting);
736 } 732 }
737 else if ("show_directory" == keyword) 733 else if ("show_directory" == keyword)
738 { 734 {
739 LLString::convertToU32(value, setting); 735 LLString::convertToU32(value, setting);
740 setParcelFlag(PF_SHOW_DIRECTORY, setting); 736 setParcelFlag(PF_SHOW_DIRECTORY, setting);
741 } 737 }
742 else if ("allow_publish" == keyword) 738 else if ("allow_publish" == keyword)
743 { 739 {
744 LLString::convertToU32(value, setting); 740 LLString::convertToU32(value, setting);
745 setParcelFlag(PF_ALLOW_PUBLISH, setting); 741 setParcelFlag(PF_ALLOW_PUBLISH, setting);
746 } 742 }
747 else if ("mature_publish" == keyword) 743 else if ("mature_publish" == keyword)
748 { 744 {
749 LLString::convertToU32(value, setting); 745 LLString::convertToU32(value, setting);
750 setParcelFlag(PF_MATURE_PUBLISH, setting); 746 setParcelFlag(PF_MATURE_PUBLISH, setting);
751 } 747 }
752 else if ("claim_date" == keyword) 748 else if ("claim_date" == keyword)
753 { 749 {
754 // BUG: This will fail when time rolls over in 2038. 750 // BUG: This will fail when time rolls over in 2038.
755 S32 time; 751 S32 time;
756 LLString::convertToS32(value, time); 752 LLString::convertToS32(value, time);
757 mClaimDate = time; 753 mClaimDate = time;
758 } 754 }
759 else if ("claim_price" == keyword) 755 else if ("claim_price" == keyword)
760 { 756 {
761 LLString::convertToS32(value, mClaimPricePerMeter); 757 LLString::convertToS32(value, mClaimPricePerMeter);
762 } 758 }
763 else if ("rent_price" == keyword) 759 else if ("rent_price" == keyword)
764 { 760 {
765 LLString::convertToS32(value, mRentPricePerMeter); 761 LLString::convertToS32(value, mRentPricePerMeter);
766 } 762 }
767 else if ("discount_rate" == keyword) 763 else if ("discount_rate" == keyword)
768 { 764 {
769 LLString::convertToF32(value, mDiscountRate); 765 LLString::convertToF32(value, mDiscountRate);
770 } 766 }
771 else if ("draw_distance" == keyword) 767 else if ("draw_distance" == keyword)
772 { 768 {
773 LLString::convertToF32(value, mDrawDistance); 769 LLString::convertToF32(value, mDrawDistance);
774 } 770 }
775 else if ("sale_price" == keyword) 771 else if ("sale_price" == keyword)
776 { 772 {
777 LLString::convertToS32(value, mSalePrice); 773 LLString::convertToS32(value, mSalePrice);
778 } 774 }
779 else if ("pass_price" == keyword) 775 else if ("pass_price" == keyword)
780 { 776 {
781 LLString::convertToS32(value, mPassPrice); 777 LLString::convertToS32(value, mPassPrice);
782 } 778 }
783 else if ("pass_hours" == keyword) 779 else if ("pass_hours" == keyword)
784 { 780 {
785 LLString::convertToF32(value, mPassHours); 781 LLString::convertToF32(value, mPassHours);
786 } 782 }
787 else if ("box" == keyword) 783 else if ("box" == keyword)
788 { 784 {
789 // deprecated 785 // deprecated
790 } 786 }
791 else if ("aabb_min" == keyword) 787 else if ("aabb_min" == keyword)
792 { 788 {
793 sscanf(value.c_str(), "%f %f %f", 789 sscanf(value.c_str(), "%f %f %f",
794 &mAABBMin.mV[VX], &mAABBMin.mV[VY], &mAABBMin.mV[VZ]); 790 &mAABBMin.mV[VX], &mAABBMin.mV[VY], &mAABBMin.mV[VZ]);
795 } 791 }
796 else if ("use_access_group" == keyword) 792 else if ("use_access_group" == keyword)
797 { 793 {
798 LLString::convertToU32(value, setting); 794 LLString::convertToU32(value, setting);
799 setParcelFlag(PF_USE_ACCESS_GROUP, setting); 795 setParcelFlag(PF_USE_ACCESS_GROUP, setting);
800 } 796 }
801 else if ("use_access_list" == keyword) 797 else if ("use_access_list" == keyword)
802 { 798 {
803 LLString::convertToU32(value, setting); 799 LLString::convertToU32(value, setting);
804 setParcelFlag(PF_USE_ACCESS_LIST, setting); 800 setParcelFlag(PF_USE_ACCESS_LIST, setting);
805 } 801 }
806 else if ("use_ban_list" == keyword) 802 else if ("use_ban_list" == keyword)
807 { 803 {
808 LLString::convertToU32(value, setting); 804 LLString::convertToU32(value, setting);
809 setParcelFlag(PF_USE_BAN_LIST, setting); 805 setParcelFlag(PF_USE_BAN_LIST, setting);
810 } 806 }
811 else if ("group_name" == keyword) 807 else if ("group_name" == keyword)
812 { 808 {
813 llinfos << "found deprecated keyword group_name" << llendl; 809 llinfos << "found deprecated keyword group_name" << llendl;
814 } 810 }
815 else if ("group_id" == keyword) 811 else if ("group_id" == keyword)
816 { 812 {
817 mGroupID.set( value.c_str() ); 813 mGroupID.set( value.c_str() );
818 } 814 }
819 // TODO: DEPRECATED FLAG 815 // TODO: DEPRECATED FLAG
820 // Flag removed from simstate files in 1.11.1 816 // Flag removed from simstate files in 1.11.1
821 // Remove at some point where we have guarenteed this flag 817 // Keep if statement until we have guarenteed this flag
822 // no longer exists anywhere in simstate files. 818 // no longer exists anywhere in simstate files.
823 else if ("require_identified" == keyword) 819 else if ("require_identified" == keyword)
824 { 820 {
825 LLString::convertToU32(value, setting); 821// LLString::convertToU32(value, setting);
826 setParcelFlag(PF_DENY_ANONYMOUS, setting); 822// setParcelFlag(PF_DENY_ANONYMOUS, setting);
827 } 823 }
828 // TODO: DEPRECATED FLAG 824 // TODO: DEPRECATED FLAG
829 // Flag removed from simstate files in 1.11.1 825 // Flag removed from simstate files in 1.11.1
830 // Remove at some point where we have guarenteed this flag 826 // Keep if statement until we have guarenteed this flag
831 // no longer exists anywhere in simstate files. 827 // no longer exists anywhere in simstate files.
832 else if ("require_transacted" == keyword) 828 else if ("require_transacted" == keyword)
833 { 829 {
834 LLString::convertToU32(value, setting); 830// LLString::convertToU32(value, setting);
835 setParcelFlag(PF_DENY_ANONYMOUS, setting); 831// setParcelFlag(PF_DENY_ANONYMOUS, setting);
836 setParcelFlag(PF_DENY_IDENTIFIED, setting); 832// setParcelFlag(PF_DENY_IDENTIFIED, setting);
837 } 833 }
838 else if ("restrict_pushobject" == keyword) 834 else if ("restrict_pushobject" == keyword)
839 { 835 {
840 LLString::convertToU32(value, setting); 836 LLString::convertToU32(value, setting);
841 setParcelFlag(PF_RESTRICT_PUSHOBJECT, setting); 837 setParcelFlag(PF_RESTRICT_PUSHOBJECT, setting);
842 } 838 }
843 else if ("deny_anonymous" == keyword) 839 else if ("deny_anonymous" == keyword)
844 { 840 {
845 LLString::convertToU32(value, setting); 841 LLString::convertToU32(value, setting);
846 setParcelFlag(PF_DENY_ANONYMOUS, setting); 842 setParcelFlag(PF_DENY_ANONYMOUS, setting);
847 } 843 }
844 // TODO: DEPRECATED FLAG
845 // Keep if statement until we have guarenteed this flag
846 // no longer exists anywhere in simstate files.
848 else if ("deny_identified" == keyword) 847 else if ("deny_identified" == keyword)
849 { 848 {
850 LLString::convertToU32(value, setting); 849// LLString::convertToU32(value, setting);
851 setParcelFlag(PF_DENY_IDENTIFIED, setting); 850// setParcelFlag(PF_DENY_IDENTIFIED, setting);
852 } 851 }
853 else if ("deny_transacted" == keyword) 852 else if ("deny_transacted" == keyword)
854 { 853 {
855 LLString::convertToU32(value, setting); 854// LLString::convertToU32(value, setting);
856 setParcelFlag(PF_DENY_TRANSACTED, setting); 855// setParcelFlag(PF_DENY_TRANSACTED, setting);
857 } 856 }
858 else if ("access_list" == keyword) 857 else if ("deny_age_unverified" == keyword)
859 { 858 {
860 S32 entry_count = 0; 859 LLString::convertToU32(value, setting);
861 LLString::convertToS32(value, entry_count); 860 setParcelFlag(PF_DENY_AGEUNVERIFIED, setting);
862 for (S32 i = 0; i < entry_count; i++) 861 }
863 { 862 else if ("access_list" == keyword)
864 LLAccessEntry entry; 863 {
865 if (importAccessEntry(input_stream, &entry)) 864 S32 entry_count = 0;
866 { 865 LLString::convertToS32(value, entry_count);
867 mAccessList[entry.mID] = entry; 866 for (S32 i = 0; i < entry_count; i++)
868 } 867 {
869 } 868 LLAccessEntry entry;
870 } 869 if (importAccessEntry(input_stream, &entry))
871 else if ("ban_list" == keyword) 870 {
872 { 871 mAccessList[entry.mID] = entry;
873 S32 entry_count = 0; 872 }
874 LLString::convertToS32(value, entry_count); 873 }
875 for (S32 i = 0; i < entry_count; i++) 874 }
876 { 875 else if ("ban_list" == keyword)
877 LLAccessEntry entry; 876 {
878 if (importAccessEntry(input_stream, &entry)) 877 S32 entry_count = 0;
879 { 878 LLString::convertToS32(value, entry_count);
880 mBanList[entry.mID] = entry; 879 for (S32 i = 0; i < entry_count; i++)
881 } 880 {
882 } 881 LLAccessEntry entry;
883 } 882 if (importAccessEntry(input_stream, &entry))
884 else if ("renter_list" == keyword) 883 {
885 { 884 mBanList[entry.mID] = entry;
886 /* 885 }
887 S32 entry_count = 0; 886 }
888 LLString::convertToS32(value, entry_count); 887 }
889 for (S32 i = 0; i < entry_count; i++) 888 else if ("renter_list" == keyword)
890 { 889 {
891 LLAccessEntry entry; 890 /*
892 if (importAccessEntry(input_stream, &entry)) 891 S32 entry_count = 0;
893 { 892 LLString::convertToS32(value, entry_count);
894 mRenterList.put(entry); 893 for (S32 i = 0; i < entry_count; i++)
895 } 894 {
896 }*/ 895 LLAccessEntry entry;
897 } 896 if (importAccessEntry(input_stream, &entry))
898 else if ("pass_list" == keyword) 897 {
899 { 898 mRenterList.put(entry);
900 // legacy - put into access list 899 }
901 S32 entry_count = 0; 900 }*/
902 LLString::convertToS32(value, entry_count); 901 }
903 for (S32 i = 0; i < entry_count; i++) 902 else if ("pass_list" == keyword)
904 { 903 {
905 LLAccessEntry entry; 904 // legacy - put into access list
906 if (importAccessEntry(input_stream, &entry)) 905 S32 entry_count = 0;
907 { 906 LLString::convertToS32(value, entry_count);
908 mAccessList[entry.mID] = entry; 907 for (S32 i = 0; i < entry_count; i++)
909 } 908 {
910 } 909 LLAccessEntry entry;
911 } 910 if (importAccessEntry(input_stream, &entry))
912 911 {
913 else 912 mAccessList[entry.mID] = entry;
914 { 913 }
915 llwarns << "Unknown keyword in parcel section: <" 914 }
916 << keyword << ">" << llendl; 915 }
917 } 916
918 } 917 else
919 918 {
920 // this code block detects if we have loaded a 1.1 simstate file, 919 llwarns << "Unknown keyword in parcel section: <"
921 // and follows the conversion rules specified in 920 << keyword << ">" << llendl;
922 // design_docs/land/pay_for_parcel.txt. 921 }
923 F32 time_to_expire = 0.0f; 922 }
924 if(mID.isNull()) 923
925 { 924 // this code block detects if we have loaded a 1.1 simstate file,
926 mID.generate(); 925 // and follows the conversion rules specified in
927 mStatus = OS_LEASE_PENDING; 926 // design_docs/land/pay_for_parcel.txt.
928 //mBuyerID = mOwnerID; 927 F32 time_to_expire = 0.0f;
929 if(getIsGroupOwned()) 928 if(mID.isNull())
930 { 929 {
931 time_to_expire += GROUP_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; 930 mID.generate();
932 } 931 mStatus = OS_LEASE_PENDING;
933 else 932 //mBuyerID = mOwnerID;
934 { 933 if(getIsGroupOwned())
935 time_to_expire += DEFAULT_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC; 934 {
936 } 935 time_to_expire += GROUP_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC;
937 //mExpireAction = STEA_PUBLIC; 936 }
938 mRecordTransaction = TRUE; 937 else
939 } 938 {
940 939 time_to_expire += DEFAULT_USEC_CONVERSION_TIMEOUT / SEC_TO_MICROSEC;
941 // this code block deals with giving an extension to pending 940 }
942 // parcels to the midday of 2004-01-19 if they were originally set 941 //mExpireAction = STEA_PUBLIC;
943 // for some time on 2004-01-12. 942 mRecordTransaction = TRUE;
944 if((0 == mGraceExtension) 943 }
945 && (EXTEND_GRACE_IF_MORE_THAN_SEC < secs_until_revert)) 944
946 { 945 // this code block deals with giving an extension to pending
947 const S32 NEW_CONVERSION_DATE = 1074538800; // 2004-01-19T11:00:00 946 // parcels to the midday of 2004-01-19 if they were originally set
948 time_t now = time(NULL); // now in epoch 947 // for some time on 2004-01-12.
949 secs_until_revert = (S32)(NEW_CONVERSION_DATE - now); 948 if((0 == mGraceExtension)
950 time_to_expire = (F32)secs_until_revert; 949 && (EXTEND_GRACE_IF_MORE_THAN_SEC < secs_until_revert))
951 mGraceExtension = 1; 950 {
952 } 951 const S32 NEW_CONVERSION_DATE = 1074538800; // 2004-01-19T11:00:00
953 952 time_t now = time(NULL); // now in epoch
954 // This code block adds yet another week to the deadline. :( 953 secs_until_revert = (S32)(NEW_CONVERSION_DATE - now);
955 if(1 == mGraceExtension) 954 time_to_expire = (F32)secs_until_revert;
956 { 955 mGraceExtension = 1;
957 time_to_expire += SEVEN_DAYS_IN_USEC / SEC_TO_MICROSEC; 956 }
958 mGraceExtension = 2; 957
959 } 958 // This code block adds yet another week to the deadline. :(
960 959 if(1 == mGraceExtension)
961 if (time_to_expire > 0) 960 {
962 { 961 time_to_expire += SEVEN_DAYS_IN_USEC / SEC_TO_MICROSEC;
963 mSaleTimerExpires.setTimerExpirySec(time_to_expire); 962 mGraceExtension = 2;
964 mSaleTimerExpires.start(); 963 }
965 } 964
966 965 if (time_to_expire > 0)
967 // successful import 966 {
968 return TRUE; 967 mSaleTimerExpires.setTimerExpirySec(time_to_expire);
968 mSaleTimerExpires.start();
969 }
970
971 // successful import
972 return TRUE;
969} 973}
970 974
971 975
972BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entry) 976BOOL LLParcel::importAccessEntry(std::istream& input_stream, LLAccessEntry* entry)
973{ 977{
974 skip_to_end_of_next_keyword("{", input_stream); 978 skip_to_end_of_next_keyword("{", input_stream);
975 while (input_stream.good()) 979 while (input_stream.good())
976 { 980 {
977 skip_comments_and_emptyspace(input_stream); 981 skip_comments_and_emptyspace(input_stream);
978 LLString line, keyword, value; 982 LLString line, keyword, value;
979 get_line(line, input_stream, MAX_STRING); 983 get_line(line, input_stream, MAX_STRING);
980 get_keyword_and_value(keyword, value, line); 984 get_keyword_and_value(keyword, value, line);
981 985
982 if ("}" == keyword) 986 if ("}" == keyword)
983 { 987 {
984 break; 988 break;
985 } 989 }
986 else if ("id" == keyword) 990 else if ("id" == keyword)
987 { 991 {
988 entry->mID.set( value.c_str() ); 992 entry->mID.set( value.c_str() );
989 } 993 }
990 else if ("name" == keyword) 994 else if ("name" == keyword)
991 { 995 {
992 // deprecated 996 // deprecated
993 } 997 }
994 else if ("time" == keyword) 998 else if ("time" == keyword)
995 { 999 {
996 S32 when; 1000 S32 when;
997 LLString::convertToS32(value, when); 1001 LLString::convertToS32(value, when);
998 entry->mTime = when; 1002 entry->mTime = when;
999 } 1003 }
1000 else if ("flags" == keyword) 1004 else if ("flags" == keyword)
1001 { 1005 {
1002 U32 setting; 1006 U32 setting;
1003 LLString::convertToU32(value, setting); 1007 LLString::convertToU32(value, setting);
1004 entry->mFlags = setting; 1008 entry->mFlags = setting;
1005 } 1009 }
1006 else 1010 else
1007 { 1011 {
1008 llwarns << "Unknown keyword in parcel access entry section: <" 1012 llwarns << "Unknown keyword in parcel access entry section: <"
1009 << keyword << ">" << llendl; 1013 << keyword << ">" << llendl;
1010 } 1014 }
1011 } 1015 }
1012 return input_stream.good(); 1016 return input_stream.good();
1013} 1017}
1014 1018
1015BOOL LLParcel::exportStream(std::ostream& output_stream) 1019BOOL LLParcel::exportStream(std::ostream& output_stream)
1016{ 1020{
1017 S32 setting; 1021 S32 setting;
1018 char id_string[MAX_STRING]; /* Flawfinder: ignore */ 1022 char id_string[MAX_STRING]; /* Flawfinder: ignore */
1019 1023
1020 std::ios::fmtflags old_flags = output_stream.flags(); 1024 std::ios::fmtflags old_flags = output_stream.flags();
1021 output_stream.setf(std::ios::showpoint); 1025 output_stream.setf(std::ios::showpoint);
1022 output_stream << "\t{\n"; 1026 output_stream << "\t{\n";
1023 1027
1024 mID.toString(id_string); 1028 mID.toString(id_string);
1025 output_stream << "\t\t parcel_id " << id_string << "\n"; 1029 output_stream << "\t\t parcel_id " << id_string << "\n";
1026 output_stream << "\t\t status " << ownership_status_to_string(mStatus) << "\n"; 1030 output_stream << "\t\t status " << ownership_status_to_string(mStatus) << "\n";
1027 output_stream << "\t\t category " << category_to_string(mCategory) << "\n"; 1031 output_stream << "\t\t category " << category_to_string(mCategory) << "\n";
1028 1032
1029 output_stream << "\t\t local_id " << mLocalID << "\n"; 1033 output_stream << "\t\t local_id " << mLocalID << "\n";
1030 1034
1031 const char* name = (mName.empty() ? "" : mName.c_str() ); 1035 const char* name = (mName.empty() ? "" : mName.c_str() );
1032 output_stream << "\t\t name " << name << "\n"; 1036 output_stream << "\t\t name " << name << "\n";
1033 1037
1034 const char* desc = (mDesc.empty() ? "" : mDesc.c_str() ); 1038 const char* desc = (mDesc.empty() ? "" : mDesc.c_str() );
1035 output_stream << "\t\t desc " << desc << "\n"; 1039 output_stream << "\t\t desc " << desc << "\n";
1036 1040
1037 const char* music_url = (mMusicURL.empty() ? "" : mMusicURL.c_str() ); 1041 const char* music_url = (mMusicURL.empty() ? "" : mMusicURL.c_str() );
1038 output_stream << "\t\t music_url " << music_url << "\n"; 1042 output_stream << "\t\t music_url " << music_url << "\n";
1039 1043
1040 const char* media_url = (mMediaURL.empty() ? "" : mMediaURL.c_str() ); 1044 const char* media_url = (mMediaURL.empty() ? "" : mMediaURL.c_str() );
1041 output_stream << "\t\t media_url " << media_url << "\n"; 1045 output_stream << "\t\t media_url " << media_url << "\n";
1042 1046
1043 output_stream << "\t\t media_auto_scale " << (mMediaAutoScale ? 1 : 0) << "\n"; 1047 output_stream << "\t\t media_auto_scale " << (mMediaAutoScale ? 1 : 0) << "\n";
1044 1048
1045 mMediaID.toString(id_string); 1049 mMediaID.toString(id_string);
1046 output_stream << "\t\t media_id " << id_string << "\n"; 1050 output_stream << "\t\t media_id " << id_string << "\n";
1047 1051
1048 mOwnerID.toString(id_string); 1052 mOwnerID.toString(id_string);
1049 output_stream << "\t\t owner_id " << id_string << "\n"; 1053 output_stream << "\t\t owner_id " << id_string << "\n";
1050 output_stream << "\t\t group_owned " << (mGroupOwned ? 1 : 0) << "\n"; 1054 output_stream << "\t\t group_owned " << (mGroupOwned ? 1 : 0) << "\n";
1051 output_stream << "\t\t clean_other_time " << getCleanOtherTime() << "\n"; 1055 output_stream << "\t\t clean_other_time " << getCleanOtherTime() << "\n";
1052 1056
1053 if(!mAuthBuyerID.isNull()) 1057 if(!mAuthBuyerID.isNull())
1054 { 1058 {
1055 mAuthBuyerID.toString(id_string); 1059 mAuthBuyerID.toString(id_string);
1056 output_stream << "\t\t auth_buyer_id " << id_string << "\n"; 1060 output_stream << "\t\t auth_buyer_id " << id_string << "\n";
1057 } 1061 }
1058 if (!mSnapshotID.isNull()) 1062 if (!mSnapshotID.isNull())
1059 { 1063 {
1060 mSnapshotID.toString(id_string); 1064 mSnapshotID.toString(id_string);
1061 output_stream << "\t\t snapshot_id " << id_string << "\n"; 1065 output_stream << "\t\t snapshot_id " << id_string << "\n";
1062 } 1066 }
1063 if (!mUserLocation.isExactlyZero()) 1067 if (!mUserLocation.isExactlyZero())
1064 { 1068 {
1065 output_stream << "\t\t user_location " 1069 output_stream << "\t\t user_location "
1066 << (F64)mUserLocation.mV[VX] 1070 << (F64)mUserLocation.mV[VX]
1067 << " " << (F64)mUserLocation.mV[VY] 1071 << " " << (F64)mUserLocation.mV[VY]
1068 << " " << (F64)mUserLocation.mV[VZ] << "\n"; 1072 << " " << (F64)mUserLocation.mV[VZ] << "\n";
1069 output_stream << "\t\t user_look_at " 1073 output_stream << "\t\t user_look_at "
1070 << (F64)mUserLookAt.mV[VX] 1074 << (F64)mUserLookAt.mV[VX]
1071 << " " << (F64)mUserLookAt.mV[VY] 1075 << " " << (F64)mUserLookAt.mV[VY]
1072 << " " << (F64)mUserLookAt.mV[VZ] << "\n"; 1076 << " " << (F64)mUserLookAt.mV[VZ] << "\n";
1073 } 1077 }
1074 output_stream << "\t\t landing_type " << mLandingType << "\n"; 1078 output_stream << "\t\t landing_type " << mLandingType << "\n";
1075 //if(mJoinNeighbors) 1079 //if(mJoinNeighbors)
1076 //{ 1080 //{
1077 // output_stream << "\t\t join_neighbors " << mJoinNeighbors << "\n"; 1081 // output_stream << "\t\t join_neighbors " << mJoinNeighbors << "\n";
1078 //} 1082 //}
1079 if(mSaleTimerExpires.getStarted()) 1083 if(mSaleTimerExpires.getStarted())
1080 { 1084 {
1081 S32 dt_sec = (S32) mSaleTimerExpires.getRemainingTimeF32()+60; // Add a minute to prevent race conditions 1085 S32 dt_sec = (S32) mSaleTimerExpires.getRemainingTimeF32()+60; // Add a minute to prevent race conditions
1082 output_stream << "\t\t revert_sale " << dt_sec << "\n"; 1086 output_stream << "\t\t revert_sale " << dt_sec << "\n";
1083 //output_stream << "\t\t revert_action " << revert_action_to_string(mExpireAction) << "\n"; 1087 //output_stream << "\t\t revert_action " << revert_action_to_string(mExpireAction) << "\n";
1084 output_stream << "\t\t extended_grace " << mGraceExtension << "\n"; 1088 output_stream << "\t\t extended_grace " << mGraceExtension << "\n";
1085 } 1089 }
1086 1090
1087 if(0 != mAuctionID) 1091 if(0 != mAuctionID)
1088 { 1092 {
1089 output_stream << "\t\t auction_id " << mAuctionID << "\n"; 1093 output_stream << "\t\t auction_id " << mAuctionID << "\n";
1090 } 1094 }
1091 1095
1092 output_stream << "\t\t allow_modify " << getAllowModify() << "\n"; 1096 output_stream << "\t\t allow_modify " << getAllowModify() << "\n";
1093 output_stream << "\t\t allow_group_modify " << getAllowGroupModify() << "\n"; 1097 output_stream << "\t\t allow_group_modify " << getAllowGroupModify() << "\n";
1094 output_stream << "\t\t allow_all_object_entry " << getAllowAllObjectEntry() << "\n"; 1098 output_stream << "\t\t allow_all_object_entry " << getAllowAllObjectEntry() << "\n";
1095 output_stream << "\t\t allow_group_object_entry " << getAllowGroupObjectEntry() << "\n"; 1099 output_stream << "\t\t allow_group_object_entry " << getAllowGroupObjectEntry() << "\n";
1096 output_stream << "\t\t allow_terraform " << getAllowTerraform() << "\n"; 1100 output_stream << "\t\t allow_terraform " << getAllowTerraform() << "\n";
1097 output_stream << "\t\t allow_deed_to_group " << getAllowDeedToGroup() << "\n"; 1101 output_stream << "\t\t allow_deed_to_group " << getAllowDeedToGroup() << "\n";
1098 output_stream << "\t\t contribute_with_deed " << getContributeWithDeed() << "\n"; 1102 output_stream << "\t\t contribute_with_deed " << getContributeWithDeed() << "\n";
1099 output_stream << "\t\t allow_damage " << getAllowDamage() << "\n"; 1103 output_stream << "\t\t allow_damage " << getAllowDamage() << "\n";
1100 output_stream << "\t\t claim_date " << (S32)mClaimDate << "\n"; 1104 output_stream << "\t\t claim_date " << (S32)mClaimDate << "\n";
1101 output_stream << "\t\t claim_price " << mClaimPricePerMeter << "\n"; 1105 output_stream << "\t\t claim_price " << mClaimPricePerMeter << "\n";
1102 output_stream << "\t\t rent_price " << mRentPricePerMeter << "\n"; 1106 output_stream << "\t\t rent_price " << mRentPricePerMeter << "\n";
1103 output_stream << "\t\t discount_rate " << mDiscountRate << "\n"; 1107 output_stream << "\t\t discount_rate " << mDiscountRate << "\n";
1104 output_stream << "\t\t allow_fly " << (getAllowFly() ? 1 : 0) << "\n"; 1108 output_stream << "\t\t allow_fly " << (getAllowFly() ? 1 : 0) << "\n";
1105 output_stream << "\t\t allow_landmark " << (getAllowLandmark() ? 1 : 0) << "\n"; 1109 output_stream << "\t\t allow_landmark " << (getAllowLandmark() ? 1 : 0) << "\n";
1106 output_stream << "\t\t sound_local " << (getSoundLocal() ? 1 : 0) << "\n"; 1110 output_stream << "\t\t sound_local " << (getSoundLocal() ? 1 : 0) << "\n";
1107 output_stream << "\t\t allow_scripts " << (getAllowOtherScripts() ? 1 : 0) << "\n"; 1111 output_stream << "\t\t allow_scripts " << (getAllowOtherScripts() ? 1 : 0) << "\n";
1108 output_stream << "\t\t allow_group_scripts " << (getAllowGroupScripts() ? 1 : 0) << "\n"; 1112 output_stream << "\t\t allow_group_scripts " << (getAllowGroupScripts() ? 1 : 0) << "\n";
1109 output_stream << "\t\t allow_voice_chat " << (getVoiceEnabled() ? 1 : 0) << "\n"; 1113 output_stream << "\t\t allow_voice_chat " << (getVoiceEnabled() ? 1 : 0) << "\n";
1110 output_stream << "\t\t use_estate_voice_chan " << (getVoiceUseEstateChannel() ? 1 : 0) << "\n"; 1114 output_stream << "\t\t use_estate_voice_chan " << (getVoiceUseEstateChannel() ? 1 : 0) << "\n";
1111 output_stream << "\t\t for_sale " << (getForSale() ? 1 : 0) << "\n"; 1115 output_stream << "\t\t for_sale " << (getForSale() ? 1 : 0) << "\n";
1112 output_stream << "\t\t sell_w_objects " << (getSellWithObjects() ? 1 : 0) << "\n"; 1116 output_stream << "\t\t sell_w_objects " << (getSellWithObjects() ? 1 : 0) << "\n";
1113 output_stream << "\t\t draw_distance " << mDrawDistance << "\n"; 1117 output_stream << "\t\t draw_distance " << mDrawDistance << "\n";
1114 output_stream << "\t\t sale_price " << mSalePrice << "\n"; 1118 output_stream << "\t\t sale_price " << mSalePrice << "\n";
1115 1119
1116 setting = (getParcelFlag(PF_USE_ACCESS_GROUP) ? 1 : 0); 1120 setting = (getParcelFlag(PF_USE_ACCESS_GROUP) ? 1 : 0);
1117 output_stream << "\t\t use_access_group " << setting << "\n"; 1121 output_stream << "\t\t use_access_group " << setting << "\n";
1118 1122
1119 setting = (getParcelFlag(PF_USE_ACCESS_LIST) ? 1 : 0); 1123 setting = (getParcelFlag(PF_USE_ACCESS_LIST) ? 1 : 0);
1120 output_stream << "\t\t use_access_list " << setting << "\n"; 1124 output_stream << "\t\t use_access_list " << setting << "\n";
1121 1125
1122 setting = (getParcelFlag(PF_USE_BAN_LIST) ? 1 : 0); 1126 setting = (getParcelFlag(PF_USE_BAN_LIST) ? 1 : 0);
1123 output_stream << "\t\t use_ban_list " << setting << "\n"; 1127 output_stream << "\t\t use_ban_list " << setting << "\n";
1124 1128
1125 mGroupID.toString(id_string); 1129 mGroupID.toString(id_string);
1126 output_stream << "\t\t group_id " << id_string << "\n"; 1130 output_stream << "\t\t group_id " << id_string << "\n";
1127 1131
1128 //const char* group_name 1132 //const char* group_name
1129 // = (mGroupName.isEmpty() ? "" : mGroupName.c_str() ); 1133 // = (mGroupName.isEmpty() ? "" : mGroupName.c_str() );
1130 //output_stream << "\t\t group_name " << group_name << "\n"; 1134 //output_stream << "\t\t group_name " << group_name << "\n";
1131 1135
1132 setting = (getParcelFlag(PF_USE_PASS_LIST) ? 1 : 0); 1136 setting = (getParcelFlag(PF_USE_PASS_LIST) ? 1 : 0);
1133 output_stream << "\t\t use_pass_list " << setting << "\n"; 1137 output_stream << "\t\t use_pass_list " << setting << "\n";
1134 1138
1135 output_stream << "\t\t pass_price " << mPassPrice << "\n"; 1139 output_stream << "\t\t pass_price " << mPassPrice << "\n";
1136 output_stream << "\t\t pass_hours " << mPassHours << "\n"; 1140 output_stream << "\t\t pass_hours " << mPassHours << "\n";
1137 1141
1138 setting = (getParcelFlag(PF_SHOW_DIRECTORY) ? 1 : 0); 1142 setting = (getParcelFlag(PF_SHOW_DIRECTORY) ? 1 : 0);
1139 output_stream << "\t\t show_directory " << setting << "\n"; 1143 output_stream << "\t\t show_directory " << setting << "\n";
1140 1144
1141 setting = (getParcelFlag(PF_ALLOW_PUBLISH) ? 1 : 0); 1145 setting = (getParcelFlag(PF_ALLOW_PUBLISH) ? 1 : 0);
1142 output_stream << "\t\t allow_publish " << setting << "\n"; 1146 output_stream << "\t\t allow_publish " << setting << "\n";
1143 1147
1144 setting = (getParcelFlag(PF_MATURE_PUBLISH) ? 1 : 0); 1148 setting = (getParcelFlag(PF_MATURE_PUBLISH) ? 1 : 0);
1145 output_stream << "\t\t mature_publish " << setting << "\n"; 1149 output_stream << "\t\t mature_publish " << setting << "\n";
1146 1150
1147 setting = (getParcelFlag(PF_DENY_ANONYMOUS) ? 1 : 0); 1151 setting = (getParcelFlag(PF_DENY_ANONYMOUS) ? 1 : 0);
1148 output_stream << "\t\t deny_anonymous " << setting << "\n"; 1152 output_stream << "\t\t deny_anonymous " << setting << "\n";
1149 1153
1150 setting = (getParcelFlag(PF_DENY_IDENTIFIED) ? 1 : 0); 1154// setting = (getParcelFlag(PF_DENY_IDENTIFIED) ? 1 : 0);
1151 output_stream << "\t\t deny_identified " << setting << "\n"; 1155// output_stream << "\t\t deny_identified " << setting << "\n";
1152 1156
1153 setting = (getParcelFlag(PF_DENY_TRANSACTED) ? 1 : 0); 1157// setting = (getParcelFlag(PF_DENY_TRANSACTED) ? 1 : 0);
1154 output_stream << "\t\t deny_transacted " << setting << "\n"; 1158// output_stream << "\t\t deny_transacted " << setting << "\n";
1155 1159
1156 setting = (getParcelFlag(PF_RESTRICT_PUSHOBJECT) ? 1 : 0); 1160 setting = (getParcelFlag(PF_DENY_AGEUNVERIFIED) ? 1 : 0);
1157 output_stream << "\t\t restrict_pushobject " << setting << "\n"; 1161 output_stream << "\t\t deny_age_unverified " << setting << "\n";
1158 1162
1159 output_stream << "\t\t aabb_min " 1163 setting = (getParcelFlag(PF_RESTRICT_PUSHOBJECT) ? 1 : 0);
1160 << mAABBMin.mV[VX] 1164 output_stream << "\t\t restrict_pushobject " << setting << "\n";
1161 << " " << mAABBMin.mV[VY] 1165
1162 << " " << mAABBMin.mV[VZ] << "\n"; 1166 output_stream << "\t\t aabb_min "
1163 1167 << mAABBMin.mV[VX]
1164 if (!mAccessList.empty()) 1168 << " " << mAABBMin.mV[VY]
1165 { 1169 << " " << mAABBMin.mV[VZ] << "\n";
1166 output_stream << "\t\t access_list " << mAccessList.size() << "\n"; 1170
1167 access_map_const_iterator cit = mAccessList.begin(); 1171 if (!mAccessList.empty())
1168 access_map_const_iterator end = mAccessList.end(); 1172 {
1169 1173 output_stream << "\t\t access_list " << mAccessList.size() << "\n";
1170 for ( ; cit != end; ++cit) 1174 access_map_const_iterator cit = mAccessList.begin();
1171 { 1175 access_map_const_iterator end = mAccessList.end();
1172 output_stream << "\t\t{\n"; 1176
1173 const LLAccessEntry& entry = (*cit).second; 1177 for ( ; cit != end; ++cit)
1174 entry.mID.toString(id_string); 1178 {
1175 output_stream << "\t\t\tid " << id_string << "\n"; 1179 output_stream << "\t\t{\n";
1176 output_stream << "\t\t\ttime " << entry.mTime << "\n"; 1180 const LLAccessEntry& entry = (*cit).second;
1177 output_stream << "\t\t\tflags " << entry.mFlags << "\n"; 1181 entry.mID.toString(id_string);
1178 output_stream << "\t\t}\n"; 1182 output_stream << "\t\t\tid " << id_string << "\n";
1179 } 1183 output_stream << "\t\t\ttime " << entry.mTime << "\n";
1180 } 1184 output_stream << "\t\t\tflags " << entry.mFlags << "\n";
1181 1185 output_stream << "\t\t}\n";
1182 if (!mBanList.empty()) 1186 }
1183 { 1187 }
1184 output_stream << "\t\t ban_list " << mBanList.size() << "\n"; 1188
1185 access_map_const_iterator cit = mBanList.begin(); 1189 if (!mBanList.empty())
1186 access_map_const_iterator end = mBanList.end(); 1190 {
1187 1191 output_stream << "\t\t ban_list " << mBanList.size() << "\n";
1188 for ( ; cit != end; ++cit) 1192 access_map_const_iterator cit = mBanList.begin();
1189 { 1193 access_map_const_iterator end = mBanList.end();
1190 output_stream << "\t\t{\n"; 1194
1191 const LLAccessEntry& entry = (*cit).second; 1195 for ( ; cit != end; ++cit)
1192 entry.mID.toString(id_string); 1196 {
1193 output_stream << "\t\t\tid " << id_string << "\n"; 1197 output_stream << "\t\t{\n";
1194 output_stream << "\t\t\ttime " << entry.mTime << "\n"; 1198 const LLAccessEntry& entry = (*cit).second;
1195 output_stream << "\t\t\tflags " << entry.mFlags << "\n"; 1199 entry.mID.toString(id_string);
1196 output_stream << "\t\t}\n"; 1200 output_stream << "\t\t\tid " << id_string << "\n";
1197 } 1201 output_stream << "\t\t\ttime " << entry.mTime << "\n";
1198 } 1202 output_stream << "\t\t\tflags " << entry.mFlags << "\n";
1199 1203 output_stream << "\t\t}\n";
1200 /*if (mRenterList.count() > 0) 1204 }
1201 { 1205 }
1202 output_stream << "\t\t renter_list " << mRenterList.count() << "\n"; 1206
1203 for (i = 0; i < mRenterList.count(); i++) 1207 /*if (mRenterList.count() > 0)
1204 { 1208 {
1205 output_stream << "\t\t{\n"; 1209 output_stream << "\t\t renter_list " << mRenterList.count() << "\n";
1206 const LLAccessEntry& entry = mRenterList.get(i); 1210 for (i = 0; i < mRenterList.count(); i++)
1207 entry.mID.toString(id_string); 1211 {
1208 output_stream << "\t\t\tid " << id_string << "\n"; 1212 output_stream << "\t\t{\n";
1209 output_stream << "\t\t\ttime " << entry.mTime << "\n"; 1213 const LLAccessEntry& entry = mRenterList.get(i);
1210 output_stream << "\t\t\tflags " << entry.mFlags << "\n"; 1214 entry.mID.toString(id_string);
1211 output_stream << "\t\t}\n"; 1215 output_stream << "\t\t\tid " << id_string << "\n";
1212 } 1216 output_stream << "\t\t\ttime " << entry.mTime << "\n";
1213 }*/ 1217 output_stream << "\t\t\tflags " << entry.mFlags << "\n";
1214 1218 output_stream << "\t\t}\n";
1215 output_stream << "\t}\n"; 1219 }
1216 output_stream.flags(old_flags); 1220 }*/
1217 1221
1218 return TRUE; 1222 output_stream << "\t}\n";
1223 output_stream.flags(old_flags);
1224
1225 return TRUE;
1219} 1226}
1220 1227
1221 1228
1222// Assumes we are in a block "ParcelData" 1229// Assumes we are in a block "ParcelData"
1223void LLParcel::packMessage(LLMessageSystem* msg) 1230void LLParcel::packMessage(LLMessageSystem* msg)
1224{ 1231{
1225 msg->addU32Fast( _PREHASH_ParcelFlags, getParcelFlags() ); 1232 msg->addU32Fast( _PREHASH_ParcelFlags, getParcelFlags() );
1226 msg->addS32Fast( _PREHASH_SalePrice, getSalePrice() ); 1233 msg->addS32Fast( _PREHASH_SalePrice, getSalePrice() );
1227 msg->addStringFast( _PREHASH_Name, getName() ); 1234 msg->addStringFast( _PREHASH_Name, getName() );
1228 msg->addStringFast( _PREHASH_Desc, getDesc() ); 1235 msg->addStringFast( _PREHASH_Desc, getDesc() );
1229 msg->addStringFast( _PREHASH_MusicURL, getMusicURL() ); 1236 msg->addStringFast( _PREHASH_MusicURL, getMusicURL() );
1230 msg->addStringFast( _PREHASH_MediaURL, getMediaURL() ); 1237 msg->addStringFast( _PREHASH_MediaURL, getMediaURL() );
1231 msg->addU8 ( "MediaAutoScale", getMediaAutoScale () ); 1238 msg->addU8 ( "MediaAutoScale", getMediaAutoScale () );
1232 msg->addUUIDFast( _PREHASH_MediaID, getMediaID() ); 1239 msg->addUUIDFast( _PREHASH_MediaID, getMediaID() );
1233 msg->addUUIDFast( _PREHASH_GroupID, getGroupID() ); 1240 msg->addUUIDFast( _PREHASH_GroupID, getGroupID() );
1234 msg->addS32Fast( _PREHASH_PassPrice, mPassPrice ); 1241 msg->addS32Fast( _PREHASH_PassPrice, mPassPrice );
1235 msg->addF32Fast( _PREHASH_PassHours, mPassHours ); 1242 msg->addF32Fast( _PREHASH_PassHours, mPassHours );
1236 msg->addU8Fast( _PREHASH_Category, (U8)mCategory); 1243 msg->addU8Fast( _PREHASH_Category, (U8)mCategory);
1237 msg->addUUIDFast( _PREHASH_AuthBuyerID, mAuthBuyerID); 1244 msg->addUUIDFast( _PREHASH_AuthBuyerID, mAuthBuyerID);
1238 msg->addUUIDFast( _PREHASH_SnapshotID, mSnapshotID); 1245 msg->addUUIDFast( _PREHASH_SnapshotID, mSnapshotID);
1239 msg->addVector3Fast(_PREHASH_UserLocation, mUserLocation); 1246 msg->addVector3Fast(_PREHASH_UserLocation, mUserLocation);
1240 msg->addVector3Fast(_PREHASH_UserLookAt, mUserLookAt); 1247 msg->addVector3Fast(_PREHASH_UserLookAt, mUserLookAt);
1241 msg->addU8Fast( _PREHASH_LandingType, (U8)mLandingType); 1248 msg->addU8Fast( _PREHASH_LandingType, (U8)mLandingType);
1242} 1249}
1243 1250
1244 1251
1245void LLParcel::unpackMessage(LLMessageSystem* msg) 1252void LLParcel::unpackMessage(LLMessageSystem* msg)
1246{ 1253{
1247 char buffer[256]; /* Flawfinder: ignore */ 1254 char buffer[256]; /* Flawfinder: ignore */
1248 1255
1249 msg->getU32Fast( _PREHASH_ParcelData,_PREHASH_ParcelFlags, mParcelFlags ); 1256 msg->getU32Fast( _PREHASH_ParcelData,_PREHASH_ParcelFlags, mParcelFlags );
1250 msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_SalePrice, mSalePrice ); 1257 msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_SalePrice, mSalePrice );
1251 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Name, 256, buffer ); 1258 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Name, 256, buffer );
1252 setName(buffer); 1259 setName(buffer);
1253 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Desc, 256, buffer ); 1260 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_Desc, 256, buffer );
1254 setDesc(buffer); 1261 setDesc(buffer);
1255 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MusicURL, 256, buffer ); 1262 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MusicURL, 256, buffer );
1256 setMusicURL(buffer); 1263 setMusicURL(buffer);
1257 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, 256, buffer ); 1264 msg->getStringFast( _PREHASH_ParcelData,_PREHASH_MediaURL, 256, buffer );
1258 setMediaURL(buffer); 1265 setMediaURL(buffer);
1259 1266
1260 // non-optimized version 1267 // non-optimized version
1261 msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale ); 1268 msg->getU8 ( "ParcelData", "MediaAutoScale", mMediaAutoScale );
1262 1269
1263 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_MediaID, mMediaID ); 1270 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_MediaID, mMediaID );
1264 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_GroupID, mGroupID ); 1271 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_GroupID, mGroupID );
1265 msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_PassPrice, mPassPrice ); 1272 msg->getS32Fast( _PREHASH_ParcelData,_PREHASH_PassPrice, mPassPrice );
1266 msg->getF32Fast( _PREHASH_ParcelData,_PREHASH_PassHours, mPassHours ); 1273 msg->getF32Fast( _PREHASH_ParcelData,_PREHASH_PassHours, mPassHours );
1267 U8 category; 1274 U8 category;
1268 msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_Category, category); 1275 msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_Category, category);
1269 mCategory = (ECategory)category; 1276 mCategory = (ECategory)category;
1270 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_AuthBuyerID, mAuthBuyerID); 1277 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_AuthBuyerID, mAuthBuyerID);
1271 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_SnapshotID, mSnapshotID); 1278 msg->getUUIDFast( _PREHASH_ParcelData,_PREHASH_SnapshotID, mSnapshotID);
1272 msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLocation, mUserLocation); 1279 msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLocation, mUserLocation);
1273 msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLookAt, mUserLookAt); 1280 msg->getVector3Fast(_PREHASH_ParcelData,_PREHASH_UserLookAt, mUserLookAt);
1274 U8 landing_type; 1281 U8 landing_type;
1275 msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_LandingType, landing_type); 1282 msg->getU8Fast( _PREHASH_ParcelData,_PREHASH_LandingType, landing_type);
1276 mLandingType = (ELandingType)landing_type; 1283 mLandingType = (ELandingType)landing_type;
1277} 1284}
1278 1285
1279 1286
1280void LLParcel::packAccessEntries(LLMessageSystem* msg, 1287void LLParcel::packAccessEntries(LLMessageSystem* msg,
1281 const std::map<LLUUID,LLAccessEntry>& list) 1288 const std::map<LLUUID,LLAccessEntry>& list)
1282{ 1289{
1283 access_map_const_iterator cit = list.begin(); 1290 access_map_const_iterator cit = list.begin();
1284 access_map_const_iterator end = list.end(); 1291 access_map_const_iterator end = list.end();
1285 1292
1286 if (cit == end) 1293 if (cit == end)
1287 { 1294 {
1288 msg->nextBlockFast(_PREHASH_List); 1295 msg->nextBlockFast(_PREHASH_List);
1289 msg->addUUIDFast(_PREHASH_ID, LLUUID::null ); 1296 msg->addUUIDFast(_PREHASH_ID, LLUUID::null );
1290 msg->addS32Fast(_PREHASH_Time, 0 ); 1297 msg->addS32Fast(_PREHASH_Time, 0 );
1291 msg->addU32Fast(_PREHASH_Flags, 0 ); 1298 msg->addU32Fast(_PREHASH_Flags, 0 );
1292 return; 1299 return;
1293 } 1300 }
1294 1301
1295 for ( ; cit != end; ++cit) 1302 for ( ; cit != end; ++cit)
1296 { 1303 {
1297 const LLAccessEntry& entry = (*cit).second; 1304 const LLAccessEntry& entry = (*cit).second;
1298 1305
1299 msg->nextBlockFast(_PREHASH_List); 1306 msg->nextBlockFast(_PREHASH_List);
1300 msg->addUUIDFast(_PREHASH_ID, entry.mID ); 1307 msg->addUUIDFast(_PREHASH_ID, entry.mID );
1301 msg->addS32Fast(_PREHASH_Time, entry.mTime ); 1308 msg->addS32Fast(_PREHASH_Time, entry.mTime );
1302 msg->addU32Fast(_PREHASH_Flags, entry.mFlags ); 1309 msg->addU32Fast(_PREHASH_Flags, entry.mFlags );
1303 } 1310 }
1304} 1311}
1305 1312
1306 1313
1307void LLParcel::unpackAccessEntries(LLMessageSystem* msg, 1314void LLParcel::unpackAccessEntries(LLMessageSystem* msg,
1308 std::map<LLUUID,LLAccessEntry>* list) 1315 std::map<LLUUID,LLAccessEntry>* list)
1309{ 1316{
1310 LLUUID id; 1317 LLUUID id;
1311 S32 time; 1318 S32 time;
1312 U32 flags; 1319 U32 flags;
1313 1320
1314 S32 i; 1321 S32 i;
1315 S32 count = msg->getNumberOfBlocksFast(_PREHASH_List); 1322 S32 count = msg->getNumberOfBlocksFast(_PREHASH_List);
1316 for (i = 0; i < count; i++) 1323 for (i = 0; i < count; i++)
1317 { 1324 {
1318 msg->getUUIDFast(_PREHASH_List, _PREHASH_ID, id, i); 1325 msg->getUUIDFast(_PREHASH_List, _PREHASH_ID, id, i);
1319 msg->getS32Fast( _PREHASH_List, _PREHASH_Time, time, i); 1326 msg->getS32Fast( _PREHASH_List, _PREHASH_Time, time, i);
1320 msg->getU32Fast( _PREHASH_List, _PREHASH_Flags, flags, i); 1327 msg->getU32Fast( _PREHASH_List, _PREHASH_Flags, flags, i);
1321 1328
1322 if (id.notNull()) 1329 if (id.notNull())
1323 { 1330 {
1324 LLAccessEntry entry; 1331 LLAccessEntry entry;
1325 entry.mID = id; 1332 entry.mID = id;
1326 entry.mTime = time; 1333 entry.mTime = time;
1327 entry.mFlags = flags; 1334 entry.mFlags = flags;
1328 1335
1329 (*list)[entry.mID] = entry; 1336 (*list)[entry.mID] = entry;
1330 } 1337 }
1331 } 1338 }
1332} 1339}
1333 1340
1334 1341
1335void LLParcel::expirePasses(S32 now) 1342void LLParcel::expirePasses(S32 now)
1336{ 1343{
1337 access_map_iterator itor = mAccessList.begin(); 1344 access_map_iterator itor = mAccessList.begin();
1338 while (itor != mAccessList.end()) 1345 while (itor != mAccessList.end())
1339 { 1346 {
1340 const LLAccessEntry& entry = (*itor).second; 1347 const LLAccessEntry& entry = (*itor).second;
1341 1348
1342 if (entry.mTime != 0 && entry.mTime < now) 1349 if (entry.mTime != 0 && entry.mTime < now)
1343 { 1350 {
1344 mAccessList.erase(itor++); 1351 mAccessList.erase(itor++);
1345 } 1352 }
1346 else 1353 else
1347 { 1354 {
1348 ++itor; 1355 ++itor;
1349 } 1356 }
1350 } 1357 }
1351} 1358}
1352 1359
1353 1360
1354bool LLParcel::operator==(const LLParcel &rhs) const 1361bool LLParcel::operator==(const LLParcel &rhs) const
1355{ 1362{
1356 if (mOwnerID != rhs.mOwnerID) 1363 if (mOwnerID != rhs.mOwnerID)
1357 return FALSE; 1364 return FALSE;
1358 1365
1359 if (mParcelFlags != rhs.mParcelFlags) 1366 if (mParcelFlags != rhs.mParcelFlags)
1360 return FALSE; 1367 return FALSE;
1361 1368
1362 if (mClaimDate != rhs.mClaimDate) 1369 if (mClaimDate != rhs.mClaimDate)
1363 return FALSE; 1370 return FALSE;
1364 1371
1365 if (mClaimPricePerMeter != rhs.mClaimPricePerMeter) 1372 if (mClaimPricePerMeter != rhs.mClaimPricePerMeter)
1366 return FALSE; 1373 return FALSE;
1367 1374
1368 if (mRentPricePerMeter != rhs.mRentPricePerMeter) 1375 if (mRentPricePerMeter != rhs.mRentPricePerMeter)
1369 return FALSE; 1376 return FALSE;
1370 1377
1371 return TRUE; 1378 return TRUE;
1372} 1379}
1373 1380
1374// Calculate rent 1381// Calculate rent
1375S32 LLParcel::getTotalRent() const 1382S32 LLParcel::getTotalRent() const
1376{ 1383{
1377 return (S32)floor(0.5f + (F32)mArea * (F32)mRentPricePerMeter * (1.0f - mDiscountRate)); 1384 return (S32)floor(0.5f + (F32)mArea * (F32)mRentPricePerMeter * (1.0f - mDiscountRate));
1378} 1385}
1379 1386
1380F32 LLParcel::getAdjustedRentPerMeter() const 1387F32 LLParcel::getAdjustedRentPerMeter() const
1381{ 1388{
1382 return ((F32)mRentPricePerMeter * (1.0f - mDiscountRate)); 1389 return ((F32)mRentPricePerMeter * (1.0f - mDiscountRate));
1383} 1390}
1384 1391
1385LLVector3 LLParcel::getCenterpoint() const 1392LLVector3 LLParcel::getCenterpoint() const
1386{ 1393{
1387 LLVector3 rv; 1394 LLVector3 rv;
1388 rv.mV[VX] = (getAABBMin().mV[VX] + getAABBMax().mV[VX]) * 0.5f; 1395 rv.mV[VX] = (getAABBMin().mV[VX] + getAABBMax().mV[VX]) * 0.5f;
1389 rv.mV[VY] = (getAABBMin().mV[VY] + getAABBMax().mV[VY]) * 0.5f; 1396 rv.mV[VY] = (getAABBMin().mV[VY] + getAABBMax().mV[VY]) * 0.5f;
1390 rv.mV[VZ] = 0.0f; 1397 rv.mV[VZ] = 0.0f;
1391 return rv; 1398 return rv;
1392} 1399}
1393 1400
1394void LLParcel::extendAABB(const LLVector3& box_min, const LLVector3& box_max) 1401void LLParcel::extendAABB(const LLVector3& box_min, const LLVector3& box_max)
1395{ 1402{
1396 // Patch up min corner of AABB 1403 // Patch up min corner of AABB
1397 S32 i; 1404 S32 i;
1398 for (i=0; i<3; i++) 1405 for (i=0; i<3; i++)
1399 { 1406 {
1400 if (box_min.mV[i] < mAABBMin.mV[i]) 1407 if (box_min.mV[i] < mAABBMin.mV[i])
1401 { 1408 {
1402 mAABBMin.mV[i] = box_min.mV[i]; 1409 mAABBMin.mV[i] = box_min.mV[i];
1403 } 1410 }
1404 } 1411 }
1405 1412
1406 // Patch up max corner of AABB 1413 // Patch up max corner of AABB
1407 for (i=0; i<3; i++) 1414 for (i=0; i<3; i++)
1408 { 1415 {
1409 if (box_max.mV[i] > mAABBMax.mV[i]) 1416 if (box_max.mV[i] > mAABBMax.mV[i])
1410 { 1417 {
1411 mAABBMax.mV[i] = box_max.mV[i]; 1418 mAABBMax.mV[i] = box_max.mV[i];
1412 } 1419 }
1413 } 1420 }
1414} 1421}
1415 1422
1416BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time) 1423BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time)
1417{ 1424{
1418 if (!((mParcelFlags & PF_USE_ACCESS_LIST) || (mParcelFlags & PF_USE_PASS_LIST)) 1425 if (mAccessList.size() >= (U32) PARCEL_MAX_ACCESS_LIST)
1419 || mAccessList.size() >= (U32) PARCEL_MAX_ACCESS_LIST)
1420 { 1426 {
1421 // Not using access list, so not a rational thing to do
1422 return FALSE; 1427 return FALSE;
1423 } 1428 }
1424 if (agent_id == getOwnerID()) 1429 if (agent_id == getOwnerID())
@@ -1447,21 +1452,20 @@ BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time)
1447 ++itor; 1452 ++itor;
1448 } 1453 }
1449 } 1454 }
1450 1455
1451 removeFromBanList(agent_id); 1456 removeFromBanList(agent_id);
1452 1457
1453 LLAccessEntry new_entry; 1458 LLAccessEntry new_entry;
1454 new_entry.mID = agent_id; 1459 new_entry.mID = agent_id;
1455 new_entry.mTime = time; 1460 new_entry.mTime = time;
1456 new_entry.mFlags = 0x0; 1461 new_entry.mFlags = 0x0;
1457 mAccessList[new_entry.mID] = new_entry; 1462 mAccessList[new_entry.mID] = new_entry;
1458 return TRUE; 1463 return TRUE;
1459} 1464}
1460 1465
1461BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time) 1466BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time)
1462{ 1467{
1463 if (!(mParcelFlags & PF_USE_BAN_LIST) 1468 if (mBanList.size() >= (U32) PARCEL_MAX_ACCESS_LIST)
1464 || mBanList.size() >= (U32) PARCEL_MAX_ACCESS_LIST)
1465 { 1469 {
1466 // Not using ban list, so not a rational thing to do 1470 // Not using ban list, so not a rational thing to do
1467 return FALSE; 1471 return FALSE;
@@ -1471,127 +1475,127 @@ BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time)
1471 // Can't add owner to these lists 1475 // Can't add owner to these lists
1472 return FALSE; 1476 return FALSE;
1473 } 1477 }
1474 1478
1475 access_map_iterator itor = mBanList.begin(); 1479 access_map_iterator itor = mBanList.begin();
1476 while (itor != mBanList.end()) 1480 while (itor != mBanList.end())
1477 { 1481 {
1478 const LLAccessEntry& entry = (*itor).second; 1482 const LLAccessEntry& entry = (*itor).second;
1479 if (entry.mID == agent_id) 1483 if (entry.mID == agent_id)
1480 { 1484 {
1481 if (time == 0 || (entry.mTime != 0 && entry.mTime < time)) 1485 if (time == 0 || (entry.mTime != 0 && entry.mTime < time))
1482 { 1486 {
1483 mBanList.erase(itor++); 1487 mBanList.erase(itor++);
1484 } 1488 }
1485 else 1489 else
1486 { 1490 {
1487 // existing one expires later 1491 // existing one expires later
1488 return FALSE; 1492 return FALSE;
1489 } 1493 }
1490 } 1494 }
1491 else 1495 else
1492 { 1496 {
1493 ++itor; 1497 ++itor;
1494 } 1498 }
1495 } 1499 }
1496 1500
1497 removeFromAccessList(agent_id); 1501 removeFromAccessList(agent_id);
1498 1502
1499 LLAccessEntry new_entry; 1503 LLAccessEntry new_entry;
1500 new_entry.mID = agent_id; 1504 new_entry.mID = agent_id;
1501 new_entry.mTime = time; 1505 new_entry.mTime = time;
1502 new_entry.mFlags = 0x0; 1506 new_entry.mFlags = 0x0;
1503 mBanList[new_entry.mID] = new_entry; 1507 mBanList[new_entry.mID] = new_entry;
1504 return TRUE; 1508 return TRUE;
1505} 1509}
1506 1510
1507BOOL remove_from_access_array(std::map<LLUUID,LLAccessEntry>* list, 1511BOOL remove_from_access_array(std::map<LLUUID,LLAccessEntry>* list,
1508 const LLUUID& agent_id) 1512 const LLUUID& agent_id)
1509{ 1513{
1510 BOOL removed = FALSE; 1514 BOOL removed = FALSE;
1511 access_map_iterator itor = list->begin(); 1515 access_map_iterator itor = list->begin();
1512 while (itor != list->end()) 1516 while (itor != list->end())
1513 { 1517 {
1514 const LLAccessEntry& entry = (*itor).second; 1518 const LLAccessEntry& entry = (*itor).second;
1515 if (entry.mID == agent_id) 1519 if (entry.mID == agent_id)
1516 { 1520 {
1517 list->erase(itor++); 1521 list->erase(itor++);
1518 removed = TRUE; 1522 removed = TRUE;
1519 } 1523 }
1520 else 1524 else
1521 { 1525 {
1522 ++itor; 1526 ++itor;
1523 } 1527 }
1524 } 1528 }
1525 return removed; 1529 return removed;
1526} 1530}
1527 1531
1528BOOL LLParcel::removeFromAccessList(const LLUUID& agent_id) 1532BOOL LLParcel::removeFromAccessList(const LLUUID& agent_id)
1529{ 1533{
1530 return remove_from_access_array(&mAccessList, agent_id); 1534 return remove_from_access_array(&mAccessList, agent_id);
1531} 1535}
1532 1536
1533BOOL LLParcel::removeFromBanList(const LLUUID& agent_id) 1537BOOL LLParcel::removeFromBanList(const LLUUID& agent_id)
1534{ 1538{
1535 return remove_from_access_array(&mBanList, agent_id); 1539 return remove_from_access_array(&mBanList, agent_id);
1536} 1540}
1537 1541
1538// static 1542// static
1539const char* LLParcel::getOwnershipStatusString(EOwnershipStatus status) 1543const char* LLParcel::getOwnershipStatusString(EOwnershipStatus status)
1540{ 1544{
1541 return ownership_status_to_string(status); 1545 return ownership_status_to_string(status);
1542} 1546}
1543 1547
1544// static 1548// static
1545const char* LLParcel::getCategoryString(ECategory category) 1549const char* LLParcel::getCategoryString(ECategory category)
1546{ 1550{
1547 return category_to_string(category); 1551 return category_to_string(category);
1548} 1552}
1549 1553
1550// static 1554// static
1551const char* LLParcel::getCategoryUIString(ECategory category) 1555const char* LLParcel::getCategoryUIString(ECategory category)
1552{ 1556{
1553 return category_to_ui_string(category); 1557 return category_to_ui_string(category);
1554} 1558}
1555 1559
1556// static 1560// static
1557LLParcel::ECategory LLParcel::getCategoryFromString(const char* string) 1561LLParcel::ECategory LLParcel::getCategoryFromString(const char* string)
1558{ 1562{
1559 return category_string_to_category(string); 1563 return category_string_to_category(string);
1560} 1564}
1561 1565
1562// static 1566// static
1563LLParcel::ECategory LLParcel::getCategoryFromUIString(const char* string) 1567LLParcel::ECategory LLParcel::getCategoryFromUIString(const char* string)
1564{ 1568{
1565 return category_ui_string_to_category(string); 1569 return category_ui_string_to_category(string);
1566} 1570}
1567 1571
1568// static 1572// static
1569const char* LLParcel::getActionString(LLParcel::EAction action) 1573const char* LLParcel::getActionString(LLParcel::EAction action)
1570{ 1574{
1571 S32 index = 0; 1575 S32 index = 0;
1572 if((action >= 0) && (action < LLParcel::A_COUNT)) 1576 if((action >= 0) && (action < LLParcel::A_COUNT))
1573 { 1577 {
1574 index = action; 1578 index = action;
1575 } 1579 }
1576 else 1580 else
1577 { 1581 {
1578 index = A_COUNT; 1582 index = A_COUNT;
1579 } 1583 }
1580 return PARCEL_ACTION_STRING[index]; 1584 return PARCEL_ACTION_STRING[index];
1581} 1585}
1582 1586
1583BOOL LLParcel::isSaleTimerExpired(const U64& time) 1587BOOL LLParcel::isSaleTimerExpired(const U64& time)
1584{ 1588{
1585 if (mSaleTimerExpires.getStarted() == FALSE) 1589 if (mSaleTimerExpires.getStarted() == FALSE)
1586 { 1590 {
1587 return FALSE; 1591 return FALSE;
1588 } 1592 }
1589 BOOL expired = mSaleTimerExpires.checkExpirationAndReset(0.0); 1593 BOOL expired = mSaleTimerExpires.checkExpirationAndReset(0.0);
1590 if (expired) 1594 if (expired)
1591 { 1595 {
1592 mSaleTimerExpires.stop(); 1596 mSaleTimerExpires.stop();
1593 } 1597 }
1594 return expired; 1598 return expired;
1595} 1599}
1596 1600
1597 1601
@@ -1623,22 +1627,22 @@ void LLParcel::startSale(const LLUUID& buyer_id, BOOL is_buyer_group)
1623 1627
1624void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id) 1628void LLParcel::expireSale(U32& type, U8& flags, LLUUID& from_id, LLUUID& to_id)
1625{ 1629{
1626 mSaleTimerExpires.setTimerExpirySec(0.0); 1630 mSaleTimerExpires.setTimerExpirySec(0.0);
1627 mSaleTimerExpires.stop(); 1631 mSaleTimerExpires.stop();
1628 setPreviousOwnerID(LLUUID::null); 1632 setPreviousOwnerID(LLUUID::null);
1629 setPreviouslyGroupOwned(FALSE); 1633 setPreviouslyGroupOwned(FALSE);
1630 setSellWithObjects(FALSE); 1634 setSellWithObjects(FALSE);
1631 type = TRANS_LAND_RELEASE; 1635 type = TRANS_LAND_RELEASE;
1632 mStatus = OS_NONE; 1636 mStatus = OS_NONE;
1633 flags = pack_transaction_flags(mGroupOwned, FALSE); 1637 flags = pack_transaction_flags(mGroupOwned, FALSE);
1634 mAuthBuyerID.setNull(); 1638 mAuthBuyerID.setNull();
1635 from_id = mOwnerID; 1639 from_id = mOwnerID;
1636 mOwnerID.setNull(); 1640 mOwnerID.setNull();
1637 to_id.setNull(); 1641 to_id.setNull();
1638} 1642}
1639 1643
1640void LLParcel::completeSale(U32& type, U8& flags, 1644void LLParcel::completeSale(U32& type, U8& flags,
1641 LLUUID& to_id) 1645 LLUUID& to_id)
1642{ 1646{
1643 mSaleTimerExpires.setTimerExpirySec(0.0); 1647 mSaleTimerExpires.setTimerExpirySec(0.0);
1644 mSaleTimerExpires.stop(); 1648 mSaleTimerExpires.stop();
@@ -1660,7 +1664,6 @@ void LLParcel::completeSale(U32& type, U8& flags,
1660 //should be cleared on sale. 1664 //should be cleared on sale.
1661 mAccessList.clear(); 1665 mAccessList.clear();
1662 mBanList.clear(); 1666 mBanList.clear();
1663
1664} 1667}
1665 1668
1666void LLParcel::clearSale() 1669void LLParcel::clearSale()
@@ -1685,143 +1688,144 @@ void LLParcel::clearSale()
1685 1688
1686BOOL LLParcel::isPublic() const 1689BOOL LLParcel::isPublic() const
1687{ 1690{
1688 return (mOwnerID.isNull()); 1691 return (mOwnerID.isNull());
1689} 1692}
1690 1693
1691BOOL LLParcel::isBuyerAuthorized(const LLUUID& buyer_id) const 1694BOOL LLParcel::isBuyerAuthorized(const LLUUID& buyer_id) const
1692{ 1695{
1693 if(mAuthBuyerID.isNull()) 1696 if(mAuthBuyerID.isNull())
1694 { 1697 {
1695 return TRUE; 1698 return TRUE;
1696 } 1699 }
1697 return (mAuthBuyerID == buyer_id); 1700 return (mAuthBuyerID == buyer_id);
1698} 1701}
1699 1702
1700void LLParcel::clearParcel() 1703void LLParcel::clearParcel()
1701{ 1704{
1702 overrideParcelFlags(PF_DEFAULT); 1705 overrideParcelFlags(PF_DEFAULT);
1703 setName(NULL); 1706 setName(NULL);
1704 setDesc(NULL); 1707 setDesc(NULL);
1705 setMusicURL(NULL); 1708 setMusicURL(NULL);
1706 setMediaURL(NULL); 1709 setMediaURL(NULL);
1707 setMediaID(LLUUID::null); 1710 setMediaID(LLUUID::null);
1708 setMediaAutoScale(0); 1711 setMediaAutoScale(0);
1709 setInEscrow(FALSE); 1712 setInEscrow(FALSE);
1710 setAuthorizedBuyerID(LLUUID::null); 1713 setAuthorizedBuyerID(LLUUID::null);
1711 setCategory(C_NONE); 1714 setCategory(C_NONE);
1712 setSnapshotID(LLUUID::null); 1715 setSnapshotID(LLUUID::null);
1713 setUserLocation(LLVector3::zero); 1716 setUserLocation(LLVector3::zero);
1714 setUserLookAt(LLVector3::x_axis); 1717 setUserLookAt(LLVector3::x_axis);
1715 setLandingType(L_LANDING_POINT); 1718 setLandingType(L_LANDING_POINT);
1716 setAuctionID(0); 1719 setAuctionID(0);
1717 setGroupID(LLUUID::null); 1720 setGroupID(LLUUID::null);
1718 setPassPrice(0); 1721 setPassPrice(0);
1719 setPassHours(0.f); 1722 setPassHours(0.f);
1720 mAccessList.clear(); 1723 mAccessList.clear();
1721 mBanList.clear(); 1724 mBanList.clear();
1722 //mRenterList.reset(); 1725 //mRenterList.reset();
1723} 1726}
1724 1727
1725void LLParcel::dump() 1728void LLParcel::dump()
1726{ 1729{
1727 llinfos << "parcel " << mLocalID << " area " << mArea << llendl; 1730 llinfos << "parcel " << mLocalID << " area " << mArea << llendl;
1728 llinfos << " name <" << mName << ">" << llendl; 1731 llinfos << " name <" << mName << ">" << llendl;
1729 llinfos << " desc <" << mDesc << ">" << llendl; 1732 llinfos << " desc <" << mDesc << ">" << llendl;
1730} 1733}
1731 1734
1732const char* ownership_status_to_string(LLParcel::EOwnershipStatus status) 1735const char* ownership_status_to_string(LLParcel::EOwnershipStatus status)
1733{ 1736{
1734 if(status >= 0 && status < LLParcel::OS_COUNT) 1737 if(status >= 0 && status < LLParcel::OS_COUNT)
1735 { 1738 {
1736 return PARCEL_OWNERSHIP_STATUS_STRING[status]; 1739 return PARCEL_OWNERSHIP_STATUS_STRING[status];
1737 } 1740 }
1738 return "none"; 1741 return "none";
1739} 1742}
1740 1743
1741LLParcel::EOwnershipStatus ownership_string_to_status(const char* s) 1744LLParcel::EOwnershipStatus ownership_string_to_status(const char* s)
1742{ 1745{
1743 for(S32 i = 0; i < LLParcel::OS_COUNT; ++i) 1746 for(S32 i = 0; i < LLParcel::OS_COUNT; ++i)
1744 { 1747 {
1745 if(0 == strcmp(s, PARCEL_OWNERSHIP_STATUS_STRING[i])) 1748 if(0 == strcmp(s, PARCEL_OWNERSHIP_STATUS_STRING[i]))
1746 { 1749 {
1747 return (LLParcel::EOwnershipStatus)i; 1750 return (LLParcel::EOwnershipStatus)i;
1748 } 1751 }
1749 } 1752 }
1750 return LLParcel::OS_NONE; 1753 return LLParcel::OS_NONE;
1751} 1754}
1752 1755
1753//const char* revert_action_to_string(LLParcel::ESaleTimerExpireAction action) 1756//const char* revert_action_to_string(LLParcel::ESaleTimerExpireAction action)
1754//{ 1757//{
1755// S32 index = 0; 1758// S32 index = 0;
1756// if(action >= 0 && action < LLParcel::STEA_COUNT) 1759// if(action >= 0 && action < LLParcel::STEA_COUNT)
1757// { 1760// {
1758// index = action; 1761// index = action;
1759// } 1762// }
1760// return PARCEL_SALE_TIMER_ACTION[index]; 1763// return PARCEL_SALE_TIMER_ACTION[index];
1761//} 1764//}
1762 1765
1763//LLParcel::ESaleTimerExpireAction revert_string_to_action(const char* s) 1766//LLParcel::ESaleTimerExpireAction revert_string_to_action(const char* s)
1764//{ 1767//{
1765// for(S32 i = 0; i < LLParcel::STEA_COUNT; ++i) 1768// for(S32 i = 0; i < LLParcel::STEA_COUNT; ++i)
1766// { 1769// {
1767// if(0 == strcmp(s, PARCEL_SALE_TIMER_ACTION[i])) 1770// if(0 == strcmp(s, PARCEL_SALE_TIMER_ACTION[i]))
1768// { 1771// {
1769// return (LLParcel::ESaleTimerExpireAction)i; 1772// return (LLParcel::ESaleTimerExpireAction)i;
1770// } 1773// }
1771// } 1774// }
1772// return LLParcel::STEA_REVERT; 1775// return LLParcel::STEA_REVERT;
1773//} 1776//}
1774 1777
1775const char* category_to_string(LLParcel::ECategory category) 1778const char* category_to_string(LLParcel::ECategory category)
1776{ 1779{
1777 S32 index = 0; 1780 S32 index = 0;
1778 if((category >= 0) && (category < LLParcel::C_COUNT)) 1781 if((category >= 0) && (category < LLParcel::C_COUNT))
1779 { 1782 {
1780 index = category; 1783 index = category;
1781 } 1784 }
1782 return PARCEL_CATEGORY_STRING[index]; 1785 return PARCEL_CATEGORY_STRING[index];
1783} 1786}
1784 1787
1785const char* category_to_ui_string(LLParcel::ECategory category) 1788const char* category_to_ui_string(LLParcel::ECategory category)
1786{ 1789{
1787 S32 index = 0; 1790 S32 index = 0;
1788 if((category >= 0) && (category < LLParcel::C_COUNT)) 1791 if((category >= 0) && (category < LLParcel::C_COUNT))
1789 { 1792 {
1790 index = category; 1793 index = category;
1791 } 1794 }
1792 else 1795 else
1793 { 1796 {
1794 // C_ANY = -1 , but the "Any" string is at the end of the list 1797 // C_ANY = -1 , but the "Any" string is at the end of the list
1795 index = ((S32) LLParcel::C_COUNT); 1798 index = ((S32) LLParcel::C_COUNT);
1796 } 1799 }
1797 return PARCEL_CATEGORY_UI_STRING[index]; 1800 return PARCEL_CATEGORY_UI_STRING[index];
1798} 1801}
1799 1802
1800LLParcel::ECategory category_string_to_category(const char* s) 1803LLParcel::ECategory category_string_to_category(const char* s)
1801{ 1804{
1802 for(S32 i = 0; i < LLParcel::C_COUNT; ++i) 1805 for(S32 i = 0; i < LLParcel::C_COUNT; ++i)
1803 { 1806 {
1804 if(0 == strcmp(s, PARCEL_CATEGORY_STRING[i])) 1807 if(0 == strcmp(s, PARCEL_CATEGORY_STRING[i]))
1805 { 1808 {
1806 return (LLParcel::ECategory)i; 1809 return (LLParcel::ECategory)i;
1807 } 1810 }
1808 } 1811 }
1809 llwarns << "Parcel category outside of possibilities " << s << llendl; 1812 llwarns << "Parcel category outside of possibilities " << s << llendl;
1810 return LLParcel::C_NONE; 1813 return LLParcel::C_NONE;
1811} 1814}
1812 1815
1813LLParcel::ECategory category_ui_string_to_category(const char* s) 1816LLParcel::ECategory category_ui_string_to_category(const char* s)
1814{ 1817{
1815 for(S32 i = 0; i < LLParcel::C_COUNT; ++i) 1818 for(S32 i = 0; i < LLParcel::C_COUNT; ++i)
1816 { 1819 {
1817 if(0 == strcmp(s, PARCEL_CATEGORY_UI_STRING[i])) 1820 if(0 == strcmp(s, PARCEL_CATEGORY_UI_STRING[i]))
1818 { 1821 {
1819 return (LLParcel::ECategory)i; 1822 return (LLParcel::ECategory)i;
1820 } 1823 }
1821 } 1824 }
1822 // "Any" is a valid category for searches, and 1825 // "Any" is a valid category for searches, and
1823 // is a distinct option from "None" and "Other" 1826 // is a distinct option from "None" and "Other"
1824 return LLParcel::C_ANY; 1827 return LLParcel::C_ANY;
1825} 1828}
1826 1829
1827 1830
1831
diff --git a/linden/indra/llinventory/llparcel.h b/linden/indra/llinventory/llparcel.h
index 3af1824..a8143f2 100644
--- a/linden/indra/llinventory/llparcel.h
+++ b/linden/indra/llinventory/llparcel.h
@@ -253,8 +253,7 @@ public:
253 void setForSale(BOOL b) { setParcelFlag(PF_FOR_SALE, b); } 253 void setForSale(BOOL b) { setParcelFlag(PF_FOR_SALE, b); }
254 void setSoundOnly(BOOL b) { setParcelFlag(PF_SOUND_LOCAL, b); } 254 void setSoundOnly(BOOL b) { setParcelFlag(PF_SOUND_LOCAL, b); }
255 void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); } 255 void setDenyAnonymous(BOOL b) { setParcelFlag(PF_DENY_ANONYMOUS, b); }
256 void setDenyIdentified(BOOL b) { setParcelFlag(PF_DENY_IDENTIFIED, b); } 256 void setDenyAgeUnverified(BOOL b) { setParcelFlag(PF_DENY_AGEUNVERIFIED, b); }
257 void setDenyTransacted(BOOL b) { setParcelFlag(PF_DENY_TRANSACTED, b); }
258 void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); } 257 void setRestrictPushObject(BOOL b) { setParcelFlag(PF_RESTRICT_PUSHOBJECT, b); }
259 258
260 void setDrawDistance(F32 dist) { mDrawDistance = dist; } 259 void setDrawDistance(F32 dist) { mDrawDistance = dist; }
@@ -444,10 +443,8 @@ public:
444 { return mRegionPushOverride; } 443 { return mRegionPushOverride; }
445 BOOL getRegionDenyAnonymousOverride() const 444 BOOL getRegionDenyAnonymousOverride() const
446 { return mRegionDenyAnonymousOverride; } 445 { return mRegionDenyAnonymousOverride; }
447 BOOL getRegionDenyIdentifiedOverride() const 446 BOOL getRegionDenyAgeUnverifiedOverride() const
448 { return mRegionDenyIdentifiedOverride; } 447 { return mRegionDenyAgeUnverifiedOverride; }
449 BOOL getRegionDenyTransactedOverride() const
450 { return mRegionDenyTransactedOverride; }
451 448
452 F32 getDrawDistance() const { return mDrawDistance; } 449 F32 getDrawDistance() const { return mDrawDistance; }
453 S32 getSalePrice() const { return mSalePrice; } 450 S32 getSalePrice() const { return mSalePrice; }
@@ -471,7 +468,11 @@ public:
471 BOOL allowTerraformBy(const LLUUID &agent_id) const; 468 BOOL allowTerraformBy(const LLUUID &agent_id) const;
472 469
473 // Returns 0 if access is OK, otherwise a BA_ return code above. 470 // Returns 0 if access is OK, otherwise a BA_ return code above.
474 S32 blockAccess(const LLUUID& agent_id, const LLUUID& group_id, const BOOL is_agent_identified, const BOOL is_agent_transacted) const; 471 S32 blockAccess(const LLUUID& agent_id,
472 const LLUUID& group_id,
473 const BOOL is_agent_identified,
474 const BOOL is_agent_transacted,
475 const BOOL is_agent_ageverified) const;
475 476
476 // Only checks if the agent is explicitly banned from this parcel 477 // Only checks if the agent is explicitly banned from this parcel
477 BOOL isAgentBanned(const LLUUID& agent_id) const; 478 BOOL isAgentBanned(const LLUUID& agent_id) const;
@@ -480,7 +481,8 @@ public:
480 const LLUUID& agent_id, 481 const LLUUID& agent_id,
481 const std::vector<LLUUID>& group_ids, 482 const std::vector<LLUUID>& group_ids,
482 const BOOL is_agent_identified, 483 const BOOL is_agent_identified,
483 const BOOL is_agent_transacted); 484 const BOOL is_agent_transacted,
485 const BOOL is_agent_ageverified);
484 486
485 bool operator==(const LLParcel &rhs) const; 487 bool operator==(const LLParcel &rhs) const;
486 488
@@ -524,8 +526,7 @@ public:
524 void setCleanOtherTime(S32 time) { mCleanOtherTime = time; } 526 void setCleanOtherTime(S32 time) { mCleanOtherTime = time; }
525 void setRegionPushOverride(BOOL override) {mRegionPushOverride = override; } 527 void setRegionPushOverride(BOOL override) {mRegionPushOverride = override; }
526 void setRegionDenyAnonymousOverride(BOOL override) { mRegionDenyAnonymousOverride = override; } 528 void setRegionDenyAnonymousOverride(BOOL override) { mRegionDenyAnonymousOverride = override; }
527 void setRegionDenyIdentifiedOverride(BOOL override) { mRegionDenyIdentifiedOverride = override; } 529 void setRegionDenyAgeUnverifiedOverride(BOOL override) { mRegionDenyAgeUnverifiedOverride = override; }
528 void setRegionDenyTransactedOverride(BOOL override) { mRegionDenyTransactedOverride = override; }
529 530
530 // Accessors for parcel sellWithObjects 531 // Accessors for parcel sellWithObjects
531 void setPreviousOwnerID(LLUUID prev_owner) { mPreviousOwnerID = prev_owner; } 532 void setPreviousOwnerID(LLUUID prev_owner) { mPreviousOwnerID = prev_owner; }
@@ -594,8 +595,7 @@ protected:
594 S32 mCleanOtherTime; 595 S32 mCleanOtherTime;
595 BOOL mRegionPushOverride; 596 BOOL mRegionPushOverride;
596 BOOL mRegionDenyAnonymousOverride; 597 BOOL mRegionDenyAnonymousOverride;
597 BOOL mRegionDenyIdentifiedOverride; 598 BOOL mRegionDenyAgeUnverifiedOverride;
598 BOOL mRegionDenyTransactedOverride;
599 599
600 600
601public: 601public:
diff --git a/linden/indra/llinventory/llparcelflags.h b/linden/indra/llinventory/llparcelflags.h
index d691d4d..1806142 100644
--- a/linden/indra/llinventory/llparcelflags.h
+++ b/linden/indra/llinventory/llparcelflags.h
@@ -58,16 +58,20 @@ const U32 PF_URL_WEB_PAGE = 1 << 19; // The "media URL" is an HTML page
58const U32 PF_URL_RAW_HTML = 1 << 20; // The "media URL" is a raw HTML string like <H1>Foo</H1> 58const U32 PF_URL_RAW_HTML = 1 << 20; // The "media URL" is a raw HTML string like <H1>Foo</H1>
59const U32 PF_RESTRICT_PUSHOBJECT = 1 << 21; // Restrict push object to either on agent or on scripts owned by parcel owner 59const U32 PF_RESTRICT_PUSHOBJECT = 1 << 21; // Restrict push object to either on agent or on scripts owned by parcel owner
60const U32 PF_DENY_ANONYMOUS = 1 << 22; // Deny all non identified/transacted accounts 60const U32 PF_DENY_ANONYMOUS = 1 << 22; // Deny all non identified/transacted accounts
61const U32 PF_DENY_IDENTIFIED = 1 << 23; // Deny identified accounts 61// const U32 PF_DENY_IDENTIFIED = 1 << 23; // Deny identified accounts
62const U32 PF_DENY_TRANSACTED = 1 << 24; // Deny identified accounts 62// const U32 PF_DENY_TRANSACTED = 1 << 24; // Deny identified accounts
63const U32 PF_ALLOW_GROUP_SCRIPTS = 1 << 25; // Allow scripts owned by group 63const U32 PF_ALLOW_GROUP_SCRIPTS = 1 << 25; // Allow scripts owned by group
64const U32 PF_CREATE_GROUP_OBJECTS = 1 << 26; // Allow object creation by group members or objects 64const U32 PF_CREATE_GROUP_OBJECTS = 1 << 26; // Allow object creation by group members or objects
65const U32 PF_ALLOW_ALL_OBJECT_ENTRY = 1 << 27; // Allow all objects to enter a parcel 65const U32 PF_ALLOW_ALL_OBJECT_ENTRY = 1 << 27; // Allow all objects to enter a parcel
66const U32 PF_ALLOW_GROUP_OBJECT_ENTRY = 1 << 28; // Only allow group (and owner) objects to enter the parcel 66const U32 PF_ALLOW_GROUP_OBJECT_ENTRY = 1 << 28; // Only allow group (and owner) objects to enter the parcel
67const U32 PF_ALLOW_VOICE_CHAT = 1 << 29; // Allow residents to use voice chat on this parcel 67const U32 PF_ALLOW_VOICE_CHAT = 1 << 29; // Allow residents to use voice chat on this parcel
68const U32 PF_USE_ESTATE_VOICE_CHAN = 1 << 30; 68const U32 PF_USE_ESTATE_VOICE_CHAN = 1 << 30;
69const U32 PF_DENY_AGEUNVERIFIED = 1 << 31; // Prevent residents who aren't age-verified
70// NOTE: At one point we have used all of the bits.
71// We have deprecated two of them in 1.19.0 which *could* be reused,
72// but only after we are certain there are no simstates using those bits.
69 73
70const U32 PF_RESERVED = 1U << 31; 74//const U32 PF_RESERVED = 1U << 31;
71 75
72// If any of these are true the parcel is restricting access in some maner. 76// If any of these are true the parcel is restricting access in some maner.
73const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP 77const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP
@@ -75,8 +79,7 @@ const U32 PF_USE_RESTRICTED_ACCESS = PF_USE_ACCESS_GROUP
75 | PF_USE_BAN_LIST 79 | PF_USE_BAN_LIST
76 | PF_USE_PASS_LIST 80 | PF_USE_PASS_LIST
77 | PF_DENY_ANONYMOUS 81 | PF_DENY_ANONYMOUS
78 | PF_DENY_IDENTIFIED 82 | PF_DENY_AGEUNVERIFIED;
79 | PF_DENY_TRANSACTED;
80const U32 PF_NONE = 0x00000000; 83const U32 PF_NONE = 0x00000000;
81const U32 PF_ALL = 0x7FFFFFFF; 84const U32 PF_ALL = 0x7FFFFFFF;
82const U32 PF_DEFAULT = PF_ALLOW_FLY 85const U32 PF_DEFAULT = PF_ALLOW_FLY
@@ -104,6 +107,7 @@ const S32 BA_NOT_IN_GROUP = 1;
104const S32 BA_NOT_ON_LIST = 2; 107const S32 BA_NOT_ON_LIST = 2;
105const S32 BA_BANNED = 3; 108const S32 BA_BANNED = 3;
106const S32 BA_NO_ACCESS_LEVEL = 4; 109const S32 BA_NO_ACCESS_LEVEL = 4;
110const S32 BA_NOT_AGE_VERIFIED = 5;
107 111
108// ParcelRelease flags 112// ParcelRelease flags
109const U32 PR_NONE = 0x0; 113const U32 PR_NONE = 0x0;
diff --git a/linden/indra/llmessage/llcircuit.cpp b/linden/indra/llmessage/llcircuit.cpp
index 1d1be56..0db9f8e 100644
--- a/linden/indra/llmessage/llcircuit.cpp
+++ b/linden/indra/llmessage/llcircuit.cpp
@@ -1170,13 +1170,11 @@ std::ostream& operator<<(std::ostream& s, LLCircuitData& circuit)
1170 return s; 1170 return s;
1171} 1171}
1172 1172
1173const LLString LLCircuitData::getInfoString() const 1173void LLCircuitData::getInfo(LLSD& info) const
1174{ 1174{
1175 std::ostringstream info; 1175 info["Host"] = mHost.getIPandPort();
1176 info << "Circuit: " << mHost << std::endl 1176 info["Alive"] = mbAlive;
1177 << (mbAlive ? "Alive" : "Not Alive") << std::endl 1177 info["Age"] = mExistenceTimer.getElapsedTimeF32();
1178 << "Age: " << mExistenceTimer.getElapsedTimeF32() << std::endl;
1179 return LLString(info.str());
1180} 1178}
1181 1179
1182void LLCircuitData::dumpResendCountAndReset() 1180void LLCircuitData::dumpResendCountAndReset()
@@ -1200,17 +1198,16 @@ std::ostream& operator<<(std::ostream& s, LLCircuit &circuit)
1200 return s; 1198 return s;
1201} 1199}
1202 1200
1203const LLString LLCircuit::getInfoString() const 1201void LLCircuit::getInfo(LLSD& info) const
1204{ 1202{
1205 std::ostringstream info;
1206 info << "Circuit Info:" << std::endl;
1207 LLCircuit::circuit_data_map::const_iterator end = mCircuitData.end(); 1203 LLCircuit::circuit_data_map::const_iterator end = mCircuitData.end();
1208 LLCircuit::circuit_data_map::const_iterator it; 1204 LLCircuit::circuit_data_map::const_iterator it;
1205 LLSD circuit_info;
1209 for(it = mCircuitData.begin(); it != end; ++it) 1206 for(it = mCircuitData.begin(); it != end; ++it)
1210 { 1207 {
1211 info << (*it).second->getInfoString() << std::endl; 1208 (*it).second->getInfo(circuit_info);
1209 info["Circuits"].append(circuit_info);
1212 } 1210 }
1213 return LLString(info.str());
1214} 1211}
1215 1212
1216void LLCircuit::getCircuitRange( 1213void LLCircuit::getCircuitRange(
diff --git a/linden/indra/llmessage/llcircuit.h b/linden/indra/llmessage/llcircuit.h
index 128b1bc..1a6611f 100644
--- a/linden/indra/llmessage/llcircuit.h
+++ b/linden/indra/llmessage/llcircuit.h
@@ -75,6 +75,7 @@ const S32 LL_MAX_ACKED_PACKETS_PER_FRAME = 200;
75// 75//
76class LLMessageSystem; 76class LLMessageSystem;
77class LLEncodedDatagramService; 77class LLEncodedDatagramService;
78class LLSD;
78 79
79// 80//
80// Classes 81// Classes
@@ -158,7 +159,7 @@ public:
158 // 159 //
159 void checkPeriodTime(); // Reset per-period counters if necessary. 160 void checkPeriodTime(); // Reset per-period counters if necessary.
160 friend std::ostream& operator<<(std::ostream& s, LLCircuitData &circuit); 161 friend std::ostream& operator<<(std::ostream& s, LLCircuitData &circuit);
161 const LLString getInfoString() const; 162 void getInfo(LLSD& info) const;
162 163
163 friend class LLCircuit; 164 friend class LLCircuit;
164 friend class LLMessageSystem; 165 friend class LLMessageSystem;
@@ -304,7 +305,7 @@ public:
304 void sendAcks(); 305 void sendAcks();
305 306
306 friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit); 307 friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit);
307 const LLString getInfoString() const; 308 void getInfo(LLSD& info) const;
308 309
309 void dumpResends(); 310 void dumpResends();
310 311
diff --git a/linden/indra/llmessage/llcurl.cpp b/linden/indra/llmessage/llcurl.cpp
index 01976b1..9b5e6cd 100644
--- a/linden/indra/llmessage/llcurl.cpp
+++ b/linden/indra/llmessage/llcurl.cpp
@@ -367,6 +367,11 @@ LLCurl::getByteRange(const std::string& url, S32 offset, S32 length, ResponderPt
367 mainMulti()->getByteRange(url, offset, length, responder); 367 mainMulti()->getByteRange(url, offset, length, responder);
368} 368}
369 369
370void LLCurl::initClass()
371{
372 curl_global_init(CURL_GLOBAL_ALL);
373}
374
370void 375void
371LLCurl::process() 376LLCurl::process()
372{ 377{
diff --git a/linden/indra/llmessage/llcurl.h b/linden/indra/llmessage/llcurl.h
index d21cdc4..53287c2 100644
--- a/linden/indra/llmessage/llcurl.h
+++ b/linden/indra/llmessage/llcurl.h
@@ -130,8 +130,9 @@ public:
130 static void get(const std::string& url, ResponderPtr); 130 static void get(const std::string& url, ResponderPtr);
131 static void getByteRange(const std::string& url, S32 offset, S32 length, ResponderPtr responder); 131 static void getByteRange(const std::string& url, S32 offset, S32 length, ResponderPtr responder);
132 132
133 static void initClass(); // *NOTE:Mani - not thread safe!
133 static void process(); 134 static void process();
134 static void cleanup(); 135 static void cleanup(); // *NOTE:Mani - not thread safe!
135}; 136};
136 137
137namespace boost 138namespace boost
diff --git a/linden/indra/llmessage/llregionflags.h b/linden/indra/llmessage/llregionflags.h
index 72272c0..5f3fad8 100644
--- a/linden/indra/llmessage/llregionflags.h
+++ b/linden/indra/llmessage/llregionflags.h
@@ -84,8 +84,8 @@ const U32 REGION_FLAGS_ESTATE_SKIP_SCRIPTS = (1 << 21);
84const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT = (1 << 22); 84const U32 REGION_FLAGS_RESTRICT_PUSHOBJECT = (1 << 22);
85 85
86const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23); 86const U32 REGION_FLAGS_DENY_ANONYMOUS = (1 << 23);
87const U32 REGION_FLAGS_DENY_IDENTIFIED = (1 << 24); 87// const U32 REGION_FLAGS_DENY_IDENTIFIED = (1 << 24);
88const U32 REGION_FLAGS_DENY_TRANSACTED = (1 << 25); 88// const U32 REGION_FLAGS_DENY_TRANSACTED = (1 << 25);
89 89
90const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26); 90const U32 REGION_FLAGS_ALLOW_PARCEL_CHANGES = (1 << 26);
91 91
@@ -94,6 +94,7 @@ const U32 REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER = (1 << 27);
94const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28); 94const U32 REGION_FLAGS_ALLOW_VOICE = (1 << 28);
95 95
96const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29); 96const U32 REGION_FLAGS_BLOCK_PARCEL_SEARCH = (1 << 29);
97const U32 REGION_FLAGS_DENY_AGEUNVERIFIED = (1 << 30);
97 98
98 99
99const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK | 100const U32 REGION_FLAGS_DEFAULT = REGION_FLAGS_ALLOW_LANDMARK |
@@ -110,8 +111,7 @@ const U32 REGION_FLAGS_ESTATE_MASK = REGION_FLAGS_EXTERNALLY_VISIBLE
110 | REGION_FLAGS_PUBLIC_ALLOWED 111 | REGION_FLAGS_PUBLIC_ALLOWED
111 | REGION_FLAGS_SUN_FIXED 112 | REGION_FLAGS_SUN_FIXED
112 | REGION_FLAGS_DENY_ANONYMOUS 113 | REGION_FLAGS_DENY_ANONYMOUS
113 | REGION_FLAGS_DENY_IDENTIFIED 114 | REGION_FLAGS_DENY_AGEUNVERIFIED;
114 | REGION_FLAGS_DENY_TRANSACTED;
115 115
116inline BOOL is_prelude( U32 flags ) 116inline BOOL is_prelude( U32 flags )
117{ 117{
diff --git a/linden/indra/llmessage/message.cpp b/linden/indra/llmessage/message.cpp
index e2cd19b..d446730 100644
--- a/linden/indra/llmessage/message.cpp
+++ b/linden/indra/llmessage/message.cpp
@@ -1562,12 +1562,9 @@ U32 LLMessageSystem::getOurCircuitCode()
1562 return mOurCircuitCode; 1562 return mOurCircuitCode;
1563} 1563}
1564 1564
1565LLString LLMessageSystem::getCircuitInfoString() 1565void LLMessageSystem::getCircuitInfo(LLSD& info) const
1566{ 1566{
1567 LLString info_string; 1567 mCircuitInfo.getInfo(info);
1568
1569 info_string += mCircuitInfo.getInfoString();
1570 return info_string;
1571} 1568}
1572 1569
1573// returns whether the given host is on a trusted circuit 1570// returns whether the given host is on a trusted circuit
diff --git a/linden/indra/llmessage/message.h b/linden/indra/llmessage/message.h
index 4454b40..3381ece 100644
--- a/linden/indra/llmessage/message.h
+++ b/linden/indra/llmessage/message.h
@@ -529,7 +529,7 @@ public:
529 bool isMatchingDigestForWindow(const char* digest, const S32 window) const; 529 bool isMatchingDigestForWindow(const char* digest, const S32 window) const;
530 530
531 void showCircuitInfo(); 531 void showCircuitInfo();
532 LLString getCircuitInfoString(); 532 void getCircuitInfo(LLSD& info) const;
533 533
534 U32 getOurCircuitCode(); 534 U32 getOurCircuitCode();
535 535
diff --git a/linden/indra/llmessage/message_prehash.cpp b/linden/indra/llmessage/message_prehash.cpp
index 0185c0f..0b614d8 100644
--- a/linden/indra/llmessage/message_prehash.cpp
+++ b/linden/indra/llmessage/message_prehash.cpp
@@ -1369,6 +1369,9 @@ char * _PREHASH_AvatarNotesReply;
1369char * _PREHASH_CacheID; 1369char * _PREHASH_CacheID;
1370char * _PREHASH_OwnerMask; 1370char * _PREHASH_OwnerMask;
1371char * _PREHASH_TransferInventoryAck; 1371char * _PREHASH_TransferInventoryAck;
1372char * _PREHASH_RegionDenyAgeUnverified;
1373char * _PREHASH_AgeVerificationBlock;
1374
1372 1375
1373void init_prehash_data() 1376void init_prehash_data()
1374{ 1377{
@@ -2702,4 +2705,6 @@ void init_prehash_data()
2702 _PREHASH_CacheID = gMessageStringTable.getString("CacheID"); 2705 _PREHASH_CacheID = gMessageStringTable.getString("CacheID");
2703 _PREHASH_OwnerMask = gMessageStringTable.getString("OwnerMask"); 2706 _PREHASH_OwnerMask = gMessageStringTable.getString("OwnerMask");
2704 _PREHASH_TransferInventoryAck = gMessageStringTable.getString("TransferInventoryAck"); 2707 _PREHASH_TransferInventoryAck = gMessageStringTable.getString("TransferInventoryAck");
2708 _PREHASH_RegionDenyAgeUnverified = gMessageStringTable.getString("RegionDenyAgeUnverified");
2709 _PREHASH_AgeVerificationBlock = gMessageStringTable.getString("AgeVerificationBlock");
2705} 2710}
diff --git a/linden/indra/llmessage/message_prehash.h b/linden/indra/llmessage/message_prehash.h
index 2cea924..4210665 100644
--- a/linden/indra/llmessage/message_prehash.h
+++ b/linden/indra/llmessage/message_prehash.h
@@ -1369,6 +1369,8 @@ extern char * _PREHASH_AvatarNotesReply;
1369extern char * _PREHASH_CacheID; 1369extern char * _PREHASH_CacheID;
1370extern char * _PREHASH_OwnerMask; 1370extern char * _PREHASH_OwnerMask;
1371extern char * _PREHASH_TransferInventoryAck; 1371extern char * _PREHASH_TransferInventoryAck;
1372extern char * _PREHASH_RegionDenyAgeUnverified;
1373extern char * _PREHASH_AgeVerificationBlock;
1372 1374
1373 1375
1374void init_prehash_data(); 1376void init_prehash_data();
diff --git a/linden/indra/llui/llalertdialog.cpp b/linden/indra/llui/llalertdialog.cpp
index 258b523..716fffd 100644
--- a/linden/indra/llui/llalertdialog.cpp
+++ b/linden/indra/llui/llalertdialog.cpp
@@ -58,6 +58,8 @@ const S32 MSG_PAD = 8;
58/*static*/ LLAlertDialog::display_callback_t LLAlertDialog::sDisplayCallback; 58/*static*/ LLAlertDialog::display_callback_t LLAlertDialog::sDisplayCallback;
59/*static*/ LLString LLAlertDialog::sStringSkipNextTime("Skip this dialog next time"); 59/*static*/ LLString LLAlertDialog::sStringSkipNextTime("Skip this dialog next time");
60/*static*/ LLString LLAlertDialog::sStringAlwaysChoose("Always choose this option"); 60/*static*/ LLString LLAlertDialog::sStringAlwaysChoose("Always choose this option");
61/*static*/ LLAlertDialog::URLLoader* LLAlertDialog::sURLLoader;
62
61 63
62//static 64//static
63LLAlertDialog* LLAlertDialog::createXml( const LLString& xml_desc, 65LLAlertDialog* LLAlertDialog::createXml( const LLString& xml_desc,
@@ -147,8 +149,11 @@ LLAlertDialog::LLAlertDialog( const LLAlertDialogTemplate* xml_template,
147 mIgnoreLabel(xml_template->mIgnoreLabel), 149 mIgnoreLabel(xml_template->mIgnoreLabel),
148 mButtonData(NULL), 150 mButtonData(NULL),
149 mLineEditor(NULL), 151 mLineEditor(NULL),
150 mTextCallback(NULL) 152 mTextCallback(NULL),
153 mURLOption(0)
151{ 154{
155 mURL = xml_template->mURL;
156 mURLOption = xml_template->mURLOption;
152 createDialog(&(xml_template->mOptions), xml_template->mDefaultOption, 157 createDialog(&(xml_template->mOptions), xml_template->mDefaultOption,
153 xml_template->mMessage, args, 158 xml_template->mMessage, args,
154 xml_template->mEditLineText); 159 xml_template->mEditLineText);
@@ -237,12 +242,12 @@ bool LLAlertDialog::show()
237 return true; 242 return true;
238} 243}
239 244
240//static
241void LLAlertDialog::format(LLString& msg, const LLString::format_map_t& args) 245void LLAlertDialog::format(LLString& msg, const LLString::format_map_t& args)
242{ 246{
243 // XUI:translate! 247 // XUI:translate!
244 LLString::format_map_t targs = args; 248 LLString::format_map_t targs = args;
245 targs["[SECOND_LIFE]"] = "Second Life"; 249 targs["[SECOND_LIFE]"] = "Second Life";
250 targs["[_URL]"] = mURL;
246 LLString::format(msg, targs); 251 LLString::format(msg, targs);
247} 252}
248 253
@@ -288,7 +293,7 @@ void LLAlertDialog::createDialog(const std::vector<LLString>* optionsp, S32 defa
288 // Message: create text box using raw string, as text has been structure deliberately 293 // Message: create text box using raw string, as text has been structure deliberately
289 // Use size of created text box to generate dialog box size 294 // Use size of created text box to generate dialog box size
290 LLString msg = msg_in; 295 LLString msg = msg_in;
291 LLAlertDialog::format( msg, args ); 296 format( msg, args );
292 llwarns << "Alert: " << msg << llendl; 297 llwarns << "Alert: " << msg << llendl;
293 LLTextBox* msg_box = new LLTextBox( "Alert message", msg, (F32)MAX_ALLOWED_MSG_WIDTH, font ); 298 LLTextBox* msg_box = new LLTextBox( "Alert message", msg, (F32)MAX_ALLOWED_MSG_WIDTH, font );
294 299
@@ -424,6 +429,15 @@ LLAlertDialog::~LLAlertDialog()
424 mCallback(mOptionChosen, mUserData); 429 mCallback(mOptionChosen, mUserData);
425 } 430 }
426 431
432 // If we declared a URL and chose the URL option, go to the url
433 if (mOptionChosen == mURLOption)
434 {
435 if (!mURL.empty() && sURLLoader != NULL)
436 {
437 sURLLoader->load(mURL);
438 }
439 }
440
427 // Only change warn state if we actually warned. 441 // Only change warn state if we actually warned.
428 if (mCheck 442 if (mCheck
429 && sSettings->getWarning(mIgnoreLabel)) 443 && sSettings->getWarning(mIgnoreLabel))
@@ -547,7 +561,7 @@ void LLAlertDialog::setEditTextArgs(const LLString::format_map_t& edit_args)
547 if (mLineEditor) 561 if (mLineEditor)
548 { 562 {
549 LLString msg = mLineEditor->getText(); 563 LLString msg = mLineEditor->getText();
550 LLAlertDialog::format(msg, edit_args); 564 format(msg, edit_args);
551 mLineEditor->setText(msg); 565 mLineEditor->setText(msg);
552 } 566 }
553 else 567 else
@@ -790,6 +804,19 @@ bool LLAlertDialog::parseAlerts(const LLString& xml_filename, LLControlGroup* se
790 } 804 }
791 } 805 }
792 } 806 }
807
808 // <url>
809 if (child->hasName("url"))
810 {
811 S32 url_option = 0;
812 child->getAttributeS32("option", url_option);
813 if (xml_template)
814 {
815 xml_template->mURL = child->getTextContents();
816 xml_template->mURLOption = url_option;
817 }
818 }
819
793 } 820 }
794 if (xml_template) 821 if (xml_template)
795 { 822 {
diff --git a/linden/indra/llui/llalertdialog.h b/linden/indra/llui/llalertdialog.h
index ddf4112..07d20dc 100644
--- a/linden/indra/llui/llalertdialog.h
+++ b/linden/indra/llui/llalertdialog.h
@@ -50,6 +50,18 @@ public:
50 typedef bool (*display_callback_t)(S32 modal); 50 typedef bool (*display_callback_t)(S32 modal);
51 enum { IGNORE_USE_DEFAULT=1, IGNORE_USE_SAVED=2, IGNORE_SHOW_AGAIN=3 }; 51 enum { IGNORE_USE_DEFAULT=1, IGNORE_USE_SAVED=2, IGNORE_SHOW_AGAIN=3 };
52 52
53 class URLLoader
54 {
55 public:
56 virtual void load(const std::string& url) = 0;
57 virtual ~URLLoader() {}
58 };
59
60 static void setURLLoader(URLLoader* loader)
61 {
62 sURLLoader = loader;
63 };
64
53protected: 65protected:
54 struct ButtonData 66 struct ButtonData
55 { 67 {
@@ -98,7 +110,7 @@ public:
98 LLAlertDialog( const LLAlertDialogTemplate* xml_template, const LLString::format_map_t& args, 110 LLAlertDialog( const LLAlertDialogTemplate* xml_template, const LLString::format_map_t& args,
99 alert_callback_t callback = NULL, void *user_data = NULL); 111 alert_callback_t callback = NULL, void *user_data = NULL);
100 112
101 static void format(LLString& msg, const LLString::format_map_t& args); 113 void format(LLString& msg, const LLString::format_map_t& args);
102 114
103protected: 115protected:
104 void createDialog(const std::vector<LLString>* options, S32 default_option, 116 void createDialog(const std::vector<LLString>* options, S32 default_option,
@@ -126,6 +138,9 @@ protected:
126 // For Dialogs that take a line as text as input: 138 // For Dialogs that take a line as text as input:
127 LLLineEditor* mLineEditor; 139 LLLineEditor* mLineEditor;
128 alert_text_callback_t mTextCallback; 140 alert_text_callback_t mTextCallback;
141 // For Dialogs linked to a URL
142 LLString mURL; // Some alerts will direct the resident to a URL
143 S32 mURLOption;
129 144
130public: 145public:
131 // use LLPointer so they delete themselves when sTemplates is destroyed 146 // use LLPointer so they delete themselves when sTemplates is destroyed
@@ -138,6 +153,9 @@ public:
138 153
139 static LLString sStringSkipNextTime; 154 static LLString sStringSkipNextTime;
140 static LLString sStringAlwaysChoose; 155 static LLString sStringAlwaysChoose;
156
157private:
158 static URLLoader* sURLLoader;
141}; 159};
142 160
143//============================================================================ 161//============================================================================
@@ -145,7 +163,7 @@ public:
145class LLAlertDialogTemplate : public LLRefCount 163class LLAlertDialogTemplate : public LLRefCount
146{ 164{
147public: 165public:
148 LLAlertDialogTemplate() : mTitle(), mModal(FALSE), mUnique(FALSE), mIgnorable(0), mDefaultOption(0) {} 166 LLAlertDialogTemplate() : mTitle(), mURLOption(0), mModal(FALSE), mUnique(FALSE), mIgnorable(0), mDefaultOption(0) {}
149 167
150 void addOption(const LLString& label, const LLString& ignore_text, BOOL is_default = FALSE) 168 void addOption(const LLString& label, const LLString& ignore_text, BOOL is_default = FALSE)
151 { 169 {
@@ -184,6 +202,8 @@ public:
184 LLString mMessage; // Message to display 202 LLString mMessage; // Message to display
185 LLString mIgnoreListText; // Text to display in enable/disable dialog (if mIgnorable == TRUE) 203 LLString mIgnoreListText; // Text to display in enable/disable dialog (if mIgnorable == TRUE)
186 LLString mIgnoreLabel; // Handle for ignore variable (may be shared by multiple templates) 204 LLString mIgnoreLabel; // Handle for ignore variable (may be shared by multiple templates)
205 LLString mURL; // Some alerts will direct the resident to a URL
206 S32 mURLOption;
187 BOOL mModal; 207 BOOL mModal;
188 BOOL mUnique; 208 BOOL mUnique;
189 S32 mIgnorable; // 0 = Never Ignore, 1 = Do default option, 2 = Do saved option 209 S32 mIgnorable; // 0 = Never Ignore, 1 = Do default option, 2 = Do saved option
diff --git a/linden/indra/llui/llbutton.cpp b/linden/indra/llui/llbutton.cpp
index 36ccc32..26ce473 100644
--- a/linden/indra/llui/llbutton.cpp
+++ b/linden/indra/llui/llbutton.cpp
@@ -368,9 +368,6 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask)
368 (*mClickedCallback)( mCallbackUserData ); 368 (*mClickedCallback)( mCallbackUserData );
369 } 369 }
370 } 370 }
371
372 mMouseDownTimer.stop();
373 mMouseDownTimer.reset();
374 } 371 }
375 372
376 return TRUE; 373 return TRUE;
diff --git a/linden/indra/llui/llfloater.cpp b/linden/indra/llui/llfloater.cpp
index 41a67f2..ab6bc00 100644
--- a/linden/indra/llui/llfloater.cpp
+++ b/linden/indra/llui/llfloater.cpp
@@ -834,7 +834,7 @@ void LLFloater::setMinimized(BOOL minimize)
834 LLView* viewp = *child_it; 834 LLView* viewp = *child_it;
835 if (!viewp->getVisible()) 835 if (!viewp->getVisible())
836 { 836 {
837 mMinimizedHiddenChildren.push_back(viewp); 837 mMinimizedHiddenChildren.push_back(viewp->mViewHandle);
838 } 838 }
839 viewp->setVisible(FALSE); 839 viewp->setVisible(FALSE);
840 } 840 }
@@ -897,11 +897,14 @@ void LLFloater::setMinimized(BOOL minimize)
897 viewp->setVisible(TRUE); 897 viewp->setVisible(TRUE);
898 } 898 }
899 899
900 std::vector<LLView*>::iterator itor = mMinimizedHiddenChildren.begin(); 900 std::vector<LLViewHandle>::iterator itor = mMinimizedHiddenChildren.begin();
901 while (itor != mMinimizedHiddenChildren.end()) 901 for ( ; itor != mMinimizedHiddenChildren.end(); ++itor)
902 { 902 {
903 (*itor)->setVisible(FALSE); 903 LLView* viewp = LLView::getViewByHandle(*itor);
904 ++itor; 904 if(viewp)
905 {
906 viewp->setVisible(FALSE);
907 }
905 } 908 }
906 mMinimizedHiddenChildren.clear(); 909 mMinimizedHiddenChildren.clear();
907 910
@@ -2220,7 +2223,6 @@ BOOL LLFloaterView::allChildrenClosed()
2220{ 2223{
2221 // see if there are any visible floaters (some floaters "close" 2224 // see if there are any visible floaters (some floaters "close"
2222 // by setting themselves invisible) 2225 // by setting themselves invisible)
2223 S32 visible_count = 0;
2224 for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it) 2226 for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it)
2225 { 2227 {
2226 LLView* viewp = *it; 2228 LLView* viewp = *it;
@@ -2228,11 +2230,10 @@ BOOL LLFloaterView::allChildrenClosed()
2228 2230
2229 if (floaterp->getVisible() && floaterp->canClose()) 2231 if (floaterp->getVisible() && floaterp->canClose())
2230 { 2232 {
2231 visible_count++; 2233 return false;
2232 } 2234 }
2233 } 2235 }
2234 2236 return true;
2235 return (visible_count == 0);
2236} 2237}
2237 2238
2238 2239
@@ -2270,14 +2271,22 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
2270 S32 min_height; 2271 S32 min_height;
2271 floater->getResizeLimits( &min_width, &min_height ); 2272 floater->getResizeLimits( &min_width, &min_height );
2272 2273
2274 // Make sure floater isn't already smaller than its min height/width?
2273 S32 new_width = llmax( min_width, view_width ); 2275 S32 new_width = llmax( min_width, view_width );
2274 S32 new_height = llmax( min_height, view_height ); 2276 S32 new_height = llmax( min_height, view_height );
2275 2277
2276 if( (new_width > screen_width) || (new_height > screen_height) ) 2278 if( !allow_partial_outside
2279 && ( (new_width > screen_width)
2280 || (new_height > screen_height) ) )
2277 { 2281 {
2282 // We have to force this window to be inside the screen.
2278 new_width = llmin(new_width, screen_width); 2283 new_width = llmin(new_width, screen_width);
2279 new_height = llmin(new_height, screen_height); 2284 new_height = llmin(new_height, screen_height);
2280 2285
2286 // Still respect minimum width/height
2287 new_width = llmax(new_width, min_width);
2288 new_height = llmax(new_height, min_height);
2289
2281 floater->reshape( new_width, new_height, TRUE ); 2290 floater->reshape( new_width, new_height, TRUE );
2282 2291
2283 // Make sure the damn thing is actually onscreen. 2292 // Make sure the damn thing is actually onscreen.
diff --git a/linden/indra/llui/llfloater.h b/linden/indra/llui/llfloater.h
index d0494ea..1d88501 100644
--- a/linden/indra/llui/llfloater.h
+++ b/linden/indra/llui/llfloater.h
@@ -286,7 +286,7 @@ protected:
286 typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t; 286 typedef std::map<LLViewHandle, LLFloater*>::iterator handle_map_iter_t;
287 static handle_map_t sFloaterMap; 287 static handle_map_t sFloaterMap;
288 288
289 std::vector<LLView*> mMinimizedHiddenChildren; 289 std::vector<LLViewHandle> mMinimizedHiddenChildren;
290 290
291 BOOL mHasBeenDraggedWhileMinimized; 291 BOOL mHasBeenDraggedWhileMinimized;
292 S32 mPreviousMinimizedBottom; 292 S32 mPreviousMinimizedBottom;
@@ -429,3 +429,4 @@ extern LLFloaterView* gFloaterView;
429#endif // LL_FLOATER_H 429#endif // LL_FLOATER_H
430 430
431 431
432
diff --git a/linden/indra/llui/lllineeditor.cpp b/linden/indra/llui/lllineeditor.cpp
index 78fe29c..420970a 100644
--- a/linden/indra/llui/lllineeditor.cpp
+++ b/linden/indra/llui/lllineeditor.cpp
@@ -158,8 +158,7 @@ LLLineEditor::LLLineEditor(const LLString& name, const LLRect& rect,
158 mHandleEditKeysDirectly( FALSE ), 158 mHandleEditKeysDirectly( FALSE ),
159 mSelectAllonFocusReceived( FALSE ), 159 mSelectAllonFocusReceived( FALSE ),
160 mPassDelete(FALSE), 160 mPassDelete(FALSE),
161 mReadOnly(FALSE), 161 mReadOnly(FALSE)
162 mLastIMEPosition( -1, -1 )
163{ 162{
164 llassert( max_length_bytes > 0 ); 163 llassert( max_length_bytes > 0 );
165 164
@@ -1638,15 +1637,10 @@ void LLLineEditor::draw()
1638 S32 pixels_after_scroll = findPixelNearestPos(); // RCalculcate for IME position 1637 S32 pixels_after_scroll = findPixelNearestPos(); // RCalculcate for IME position
1639 LLRect screen_pos = getScreenRect(); 1638 LLRect screen_pos = getScreenRect();
1640 LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD ); 1639 LLCoordGL ime_pos( screen_pos.mLeft + pixels_after_scroll, screen_pos.mTop - UI_LINEEDITOR_V_PAD );
1641 if ( ime_pos.mX != mLastIMEPosition.mX || ime_pos.mY != mLastIMEPosition.mY )
1642 {
1643 mLastIMEPosition.mX = ime_pos.mX;
1644 mLastIMEPosition.mY = ime_pos.mY;
1645 1640
1646 ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); 1641 ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]);
1647 ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); 1642 ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]);
1648 getWindow()->setLanguageTextInput( ime_pos ); 1643 getWindow()->setLanguageTextInput( ime_pos );
1649 }
1650 } 1644 }
1651 } 1645 }
1652 1646
diff --git a/linden/indra/llui/lllineeditor.h b/linden/indra/llui/lllineeditor.h
index 2cd2ebf..f1b9fbe 100644
--- a/linden/indra/llui/lllineeditor.h
+++ b/linden/indra/llui/lllineeditor.h
@@ -279,8 +279,6 @@ protected:
279 279
280 S32 mBorderThickness; 280 S32 mBorderThickness;
281 281
282 LLCoordGL mLastIMEPosition; // Last screen position used for the IME editor
283
284 BOOL mIgnoreArrowKeys; 282 BOOL mIgnoreArrowKeys;
285 BOOL mIgnoreTab; 283 BOOL mIgnoreTab;
286 BOOL mDrawAsterixes; 284 BOOL mDrawAsterixes;
diff --git a/linden/indra/llui/llpanel.cpp b/linden/indra/llui/llpanel.cpp
index 3a0ee9b..ca1bc9c 100644
--- a/linden/indra/llui/llpanel.cpp
+++ b/linden/indra/llui/llpanel.cpp
@@ -982,6 +982,16 @@ BOOL LLPanel::childSetLabelArg(const LLString& id, const LLString& key, const LL
982 return FALSE; 982 return FALSE;
983} 983}
984 984
985BOOL LLPanel::childSetToolTipArg(const LLString& id, const LLString& key, const LLStringExplicit& text)
986{
987 LLView* child = getChildByName(id, true);
988 if (child)
989 {
990 return child->setToolTipArg(key, text);
991 }
992 return FALSE;
993}
994
985void LLPanel::childSetMinValue(const LLString& id, LLSD min_value) 995void LLPanel::childSetMinValue(const LLString& id, LLSD min_value)
986{ 996{
987 LLUICtrl* child = (LLUICtrl*)getChildByName(id, true); 997 LLUICtrl* child = (LLUICtrl*)getChildByName(id, true);
diff --git a/linden/indra/llui/llpanel.h b/linden/indra/llui/llpanel.h
index dfd7a51..78aa7cf 100644
--- a/linden/indra/llui/llpanel.h
+++ b/linden/indra/llui/llpanel.h
@@ -194,6 +194,7 @@ public:
194 // Not implemented for all types, defaults to noop, returns FALSE if not applicaple 194 // Not implemented for all types, defaults to noop, returns FALSE if not applicaple
195 BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text); 195 BOOL childSetTextArg(const LLString& id, const LLString& key, const LLStringExplicit& text);
196 BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text); 196 BOOL childSetLabelArg(const LLString& id, const LLString& key, const LLStringExplicit& text);
197 BOOL childSetToolTipArg(const LLString& id, const LLString& key, const LLStringExplicit& text);
197 198
198 // LLSlider / LLSpinCtrl 199 // LLSlider / LLSpinCtrl
199 void childSetMinValue(const LLString& id, LLSD min_value); 200 void childSetMinValue(const LLString& id, LLSD min_value);
diff --git a/linden/indra/llui/llscrolllistctrl.cpp b/linden/indra/llui/llscrolllistctrl.cpp
index f5eef29..96a7394 100644
--- a/linden/indra/llui/llscrolllistctrl.cpp
+++ b/linden/indra/llui/llscrolllistctrl.cpp
@@ -701,7 +701,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos )
701 break; 701 break;
702 } 702 }
703 703
704 updateLineHeight(); 704 updateLineHeightInsert(item);
705 mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0; 705 mPageLines = mLineHeight ? mItemListRect.getHeight() / mLineHeight : 0;
706 BOOL scrollbar_visible = mPageLines < getItemCount(); 706 BOOL scrollbar_visible = mPageLines < getItemCount();
707 707
@@ -753,12 +753,11 @@ void LLScrollListCtrl::updateMaxContentWidth(LLScrollListItem* added_item)
753 } 753 }
754} 754}
755 755
756const S32 SCROLL_LIST_ROW_PAD = 2;
756 757
757// Line height is the max height of all the cells in all the items. 758// Line height is the max height of all the cells in all the items.
758void LLScrollListCtrl::updateLineHeight() 759void LLScrollListCtrl::updateLineHeight()
759{ 760{
760 const S32 ROW_PAD = 2;
761
762 mLineHeight = 0; 761 mLineHeight = 0;
763 item_list::iterator iter; 762 item_list::iterator iter;
764 for (iter = mItemList.begin(); iter != mItemList.end(); iter++) 763 for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
@@ -768,11 +767,23 @@ void LLScrollListCtrl::updateLineHeight()
768 S32 i = 0; 767 S32 i = 0;
769 for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i)) 768 for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
770 { 769 {
771 mLineHeight = llmax( mLineHeight, cell->getHeight() + ROW_PAD ); 770 mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD );
772 } 771 }
773 } 772 }
774} 773}
775 774
775// when the only change to line height is from an insert, we needn't scan the entire list
776void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)
777{
778 S32 num_cols = itemp->getNumColumns();
779 S32 i = 0;
780 for (const LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
781 {
782 mLineHeight = llmax( mLineHeight, cell->getHeight() + SCROLL_LIST_ROW_PAD );
783 }
784}
785
786
776void LLScrollListCtrl::updateColumns() 787void LLScrollListCtrl::updateColumns()
777{ 788{
778 mColumnsIndexed.resize(mColumns.size()); 789 mColumnsIndexed.resize(mColumns.size());
diff --git a/linden/indra/llui/llscrolllistctrl.h b/linden/indra/llui/llscrolllistctrl.h
index 5ceee2e..a98a411 100644
--- a/linden/indra/llui/llscrolllistctrl.h
+++ b/linden/indra/llui/llscrolllistctrl.h
@@ -589,6 +589,7 @@ protected:
589 void selectNextItem(BOOL extend_selection); 589 void selectNextItem(BOOL extend_selection);
590 void drawItems(); 590 void drawItems();
591 void updateLineHeight(); 591 void updateLineHeight();
592 void updateLineHeightInsert(LLScrollListItem* item);
592 void reportInvalidInput(); 593 void reportInvalidInput();
593 BOOL isRepeatedChars(const LLWString& string) const; 594 BOOL isRepeatedChars(const LLWString& string) const;
594 void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE); 595 void selectItem(LLScrollListItem* itemp, BOOL single_select = TRUE);
diff --git a/linden/indra/llui/lltextbox.cpp b/linden/indra/llui/lltextbox.cpp
index c0b0788..efd4245 100644
--- a/linden/indra/llui/lltextbox.cpp
+++ b/linden/indra/llui/lltextbox.cpp
@@ -49,6 +49,9 @@ LLTextBox::LLTextBox(const LLString& name, const LLRect& rect, const LLString& t
49 mDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ), 49 mDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ),
50 mBackgroundColor( LLUI::sColorsGroup->getColor( "DefaultBackgroundColor" ) ), 50 mBackgroundColor( LLUI::sColorsGroup->getColor( "DefaultBackgroundColor" ) ),
51 mBorderColor( LLUI::sColorsGroup->getColor( "DefaultHighlightLight" ) ), 51 mBorderColor( LLUI::sColorsGroup->getColor( "DefaultHighlightLight" ) ),
52 mHoverColor( LLUI::sColorsGroup->getColor( "LabelSelectedColor" ) ),
53 mHoverActive( FALSE ),
54 mHasHover( FALSE ),
52 mBackgroundVisible( FALSE ), 55 mBackgroundVisible( FALSE ),
53 mBorderVisible( FALSE ), 56 mBorderVisible( FALSE ),
54 mFontStyle(LLFontGL::DROP_SHADOW_SOFT), 57 mFontStyle(LLFontGL::DROP_SHADOW_SOFT),
@@ -74,6 +77,9 @@ LLTextBox::LLTextBox(const LLString& name, const LLString& text, F32 max_width,
74 mDisabledColor(LLUI::sColorsGroup->getColor("LabelDisabledColor")), 77 mDisabledColor(LLUI::sColorsGroup->getColor("LabelDisabledColor")),
75 mBackgroundColor(LLUI::sColorsGroup->getColor("DefaultBackgroundColor")), 78 mBackgroundColor(LLUI::sColorsGroup->getColor("DefaultBackgroundColor")),
76 mBorderColor(LLUI::sColorsGroup->getColor("DefaultHighlightLight")), 79 mBorderColor(LLUI::sColorsGroup->getColor("DefaultHighlightLight")),
80 mHoverColor( LLUI::sColorsGroup->getColor( "LabelSelectedColor" ) ),
81 mHoverActive( FALSE ),
82 mHasHover( FALSE ),
77 mBackgroundVisible(FALSE), 83 mBackgroundVisible(FALSE),
78 mBorderVisible(FALSE), 84 mBorderVisible(FALSE),
79 mFontStyle(LLFontGL::DROP_SHADOW_SOFT), 85 mFontStyle(LLFontGL::DROP_SHADOW_SOFT),
@@ -161,6 +167,16 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask)
161 return handled; 167 return handled;
162} 168}
163 169
170BOOL LLTextBox::handleHover(S32 x, S32 y, MASK mask)
171{
172 if(mHoverActive)
173 {
174 mHasHover = TRUE; // This should be set every frame during a hover.
175 return TRUE;
176 }
177 return FALSE;
178}
179
164void LLTextBox::setText(const LLStringExplicit& text) 180void LLTextBox::setText(const LLStringExplicit& text)
165{ 181{
166 mText.assign(text); 182 mText.assign(text);
@@ -334,7 +350,15 @@ void LLTextBox::draw()
334 350
335 if ( getEnabled() ) 351 if ( getEnabled() )
336 { 352 {
337 drawText( text_x, text_y, mTextColor ); 353 if(mHasHover)
354 {
355 drawText( text_x, text_y, mHoverColor );
356 }
357 else
358 {
359 drawText( text_x, text_y, mTextColor );
360 }
361
338 } 362 }
339 else 363 else
340 { 364 {
@@ -346,6 +370,8 @@ void LLTextBox::draw()
346 drawDebugRect(); 370 drawDebugRect();
347 } 371 }
348 } 372 }
373
374 mHasHover = FALSE; // This is reset every frame.
349} 375}
350 376
351void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent) 377void LLTextBox::reshape(S32 width, S32 height, BOOL called_from_parent)
@@ -468,5 +494,20 @@ LLView* LLTextBox::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFactory *f
468 text_box->setColor(color); 494 text_box->setColor(color);
469 } 495 }
470 496
497 if(node->hasAttribute("hover_color"))
498 {
499 LLColor4 color;
500 LLUICtrlFactory::getAttributeColor(node, "hover_color", color);
501 text_box->setHoverColor(color);
502 text_box->setHoverActive(true);
503 }
504
505 BOOL hover_active = FALSE;
506 if(node->getAttributeBOOL("hover", hover_active))
507 {
508 text_box->setHoverActive(hover_active);
509 }
510
511
471 return text_box; 512 return text_box;
472} 513}
diff --git a/linden/indra/llui/lltextbox.h b/linden/indra/llui/lltextbox.h
index 7e7018a..c7c7946 100644
--- a/linden/indra/llui/lltextbox.h
+++ b/linden/indra/llui/lltextbox.h
@@ -66,11 +66,16 @@ public:
66 66
67 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); 67 virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
68 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); 68 virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
69 virtual BOOL handleHover(S32 x, S32 y, MASK mask);
69 70
70 void setColor( const LLColor4& c ) { mTextColor = c; } 71 void setColor( const LLColor4& c ) { mTextColor = c; }
71 void setDisabledColor( const LLColor4& c) { mDisabledColor = c; } 72 void setDisabledColor( const LLColor4& c) { mDisabledColor = c; }
72 void setBackgroundColor( const LLColor4& c) { mBackgroundColor = c; } 73 void setBackgroundColor( const LLColor4& c) { mBackgroundColor = c; }
73 void setBorderColor( const LLColor4& c) { mBorderColor = c; } 74 void setBorderColor( const LLColor4& c) { mBorderColor = c; }
75
76 void setHoverColor( const LLColor4& c ) { mHoverColor = c; }
77 void setHoverActive( BOOL active ) { mHoverActive = active; }
78
74 void setText( const LLStringExplicit& text ); 79 void setText( const LLStringExplicit& text );
75 void setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0); 80 void setWrappedText(const LLStringExplicit& text, F32 max_width = -1.0);
76 // default width means use existing control width 81 // default width means use existing control width
@@ -108,10 +113,12 @@ protected:
108 const LLFontGL* mFontGL; 113 const LLFontGL* mFontGL;
109 LLColor4 mTextColor; 114 LLColor4 mTextColor;
110 LLColor4 mDisabledColor; 115 LLColor4 mDisabledColor;
111
112 LLColor4 mBackgroundColor; 116 LLColor4 mBackgroundColor;
113 LLColor4 mBorderColor; 117 LLColor4 mBorderColor;
114 118 LLColor4 mHoverColor;
119
120 BOOL mHoverActive;
121 BOOL mHasHover;
115 BOOL mBackgroundVisible; 122 BOOL mBackgroundVisible;
116 BOOL mBorderVisible; 123 BOOL mBorderVisible;
117 124
diff --git a/linden/indra/llui/lltexteditor.cpp b/linden/indra/llui/lltexteditor.cpp
index 200cf29..d08997c 100644
--- a/linden/indra/llui/lltexteditor.cpp
+++ b/linden/indra/llui/lltexteditor.cpp
@@ -310,8 +310,7 @@ LLTextEditor::LLTextEditor(
310 mMouseDownX(0), 310 mMouseDownX(0),
311 mMouseDownY(0), 311 mMouseDownY(0),
312 mLastSelectionX(-1), 312 mLastSelectionX(-1),
313 mLastSelectionY(-1), 313 mLastSelectionY(-1)
314 mLastIMEPosition(-1,-1)
315{ 314{
316 mSourceID.generate(); 315 mSourceID.generate();
317 316
@@ -2817,15 +2816,10 @@ void LLTextEditor::drawCursor()
2817 // Make sure the IME is in the right place 2816 // Make sure the IME is in the right place
2818 LLRect screen_pos = getScreenRect(); 2817 LLRect screen_pos = getScreenRect();
2819 LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) ); 2818 LLCoordGL ime_pos( screen_pos.mLeft + llfloor(cursor_left), screen_pos.mBottom + llfloor(cursor_top) );
2820 if ( ime_pos.mX != mLastIMEPosition.mX || ime_pos.mY != mLastIMEPosition.mY )
2821 {
2822 mLastIMEPosition.mX = ime_pos.mX;
2823 mLastIMEPosition.mY = ime_pos.mY;
2824 2819
2825 ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]); 2820 ime_pos.mX = (S32) (ime_pos.mX * LLUI::sGLScaleFactor.mV[VX]);
2826 ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]); 2821 ime_pos.mY = (S32) (ime_pos.mY * LLUI::sGLScaleFactor.mV[VY]);
2827 getWindow()->setLanguageTextInput( ime_pos ); 2822 getWindow()->setLanguageTextInput( ime_pos );
2828 }
2829 } 2823 }
2830 } 2824 }
2831 } 2825 }
diff --git a/linden/indra/llui/lltexteditor.h b/linden/indra/llui/lltexteditor.h
index 55aba57..d38accc 100644
--- a/linden/indra/llui/lltexteditor.h
+++ b/linden/indra/llui/lltexteditor.h
@@ -439,8 +439,6 @@ protected:
439 439
440 BOOL mParseHTML; 440 BOOL mParseHTML;
441 LLString mHTML; 441 LLString mHTML;
442
443 LLCoordGL mLastIMEPosition; // Last position of the IME editor
444}; 442};
445 443
446class LLTextSegment 444class LLTextSegment
diff --git a/linden/indra/llui/llview.cpp b/linden/indra/llui/llview.cpp
index 9442a5c..a047f99 100644
--- a/linden/indra/llui/llview.cpp
+++ b/linden/indra/llui/llview.cpp
@@ -224,11 +224,17 @@ void LLView::setMouseOpaque(BOOL b)
224 mMouseOpaque = b; 224 mMouseOpaque = b;
225} 225}
226 226
227void LLView::setToolTip(const LLString& msg) 227void LLView::setToolTip(const LLStringExplicit& msg)
228{ 228{
229 mToolTipMsg = msg; 229 mToolTipMsg = msg;
230} 230}
231 231
232BOOL LLView::setToolTipArg(const LLStringExplicit& key, const LLStringExplicit& text)
233{
234 mToolTipMsg.setArg(key, text);
235 return TRUE;
236}
237
232// virtual 238// virtual
233void LLView::setRect(const LLRect& rect) 239void LLView::setRect(const LLRect& rect)
234{ 240{
@@ -288,7 +294,7 @@ void LLView::setSpanChildren( BOOL span_children )
288 294
289const LLString& LLView::getToolTip() 295const LLString& LLView::getToolTip()
290{ 296{
291 return mToolTipMsg; 297 return mToolTipMsg.getString();
292} 298}
293 299
294// virtual 300// virtual
@@ -884,18 +890,14 @@ BOOL LLView::handleToolTip(S32 x, S32 y, LLString& msg, LLRect* sticky_rect_scre
884 } 890 }
885 } 891 }
886 892
887 if (LLUI::sShowXUINames && (mToolTipMsg.find(".xml", 0) == LLString::npos) && 893 tool_tip = mToolTipMsg.getString();
894 if (LLUI::sShowXUINames && (tool_tip.find(".xml", 0) == LLString::npos) &&
888 (mName.find("Drag", 0) == LLString::npos)) 895 (mName.find("Drag", 0) == LLString::npos))
889 { 896 {
890 tool_tip = getShowNamesToolTip(); 897 tool_tip = getShowNamesToolTip();
891 } 898 }
892 else
893 {
894 tool_tip = mToolTipMsg;
895 }
896 899
897 900
898
899 BOOL showNamesTextBox = LLUI::sShowXUINames && (getWidgetType() == WIDGET_TYPE_TEXT_BOX); 901 BOOL showNamesTextBox = LLUI::sShowXUINames && (getWidgetType() == WIDGET_TYPE_TEXT_BOX);
900 902
901 if( !handled && (mMouseOpaque || showNamesTextBox) && pointInView( x, y ) && !tool_tip.empty()) 903 if( !handled && (mMouseOpaque || showNamesTextBox) && pointInView( x, y ) && !tool_tip.empty())
diff --git a/linden/indra/llui/llview.h b/linden/indra/llui/llview.h
index 63c1efc..8248d50 100644
--- a/linden/indra/llui/llview.h
+++ b/linden/indra/llui/llview.h
@@ -45,6 +45,7 @@
45#include "llstring.h" 45#include "llstring.h"
46#include "llrect.h" 46#include "llrect.h"
47#include "llui.h" 47#include "llui.h"
48#include "lluistring.h"
48#include "lluixmltags.h" 49#include "lluixmltags.h"
49#include "llviewquery.h" 50#include "llviewquery.h"
50#include "llxmlnode.h" 51#include "llxmlnode.h"
@@ -154,7 +155,7 @@ protected:
154 BOOL mEnabled; // Enabled means "accepts input that has an effect on the state of the application." 155 BOOL mEnabled; // Enabled means "accepts input that has an effect on the state of the application."
155 // A disabled view, for example, may still have a scrollbar that responds to mouse events. 156 // A disabled view, for example, may still have a scrollbar that responds to mouse events.
156 BOOL mMouseOpaque; // Opaque views handle all mouse events that are over their rect. 157 BOOL mMouseOpaque; // Opaque views handle all mouse events that are over their rect.
157 LLString mToolTipMsg; // isNull() is true if none. 158 LLUIString mToolTipMsg; // isNull() is true if none.
158 159
159 U8 mSoundFlags; 160 U8 mSoundFlags;
160 BOOL mSaveToXML; 161 BOOL mSaveToXML;
@@ -214,7 +215,8 @@ public:
214 // MANIPULATORS 215 // MANIPULATORS
215 // 216 //
216 void setMouseOpaque( BOOL b ); 217 void setMouseOpaque( BOOL b );
217 void setToolTip( const LLString& msg ); 218 void setToolTip( const LLStringExplicit& msg );
219 BOOL setToolTipArg( const LLStringExplicit& key, const LLStringExplicit& text );
218 220
219 virtual void setRect(const LLRect &rect); 221 virtual void setRect(const LLRect &rect);
220 void setFollows(U32 flags); 222 void setFollows(U32 flags);
diff --git a/linden/indra/llvfs/lldir_win32.cpp b/linden/indra/llvfs/lldir_win32.cpp
index b5db6ef..f415fe5 100644
--- a/linden/indra/llvfs/lldir_win32.cpp
+++ b/linden/indra/llvfs/lldir_win32.cpp
@@ -42,7 +42,6 @@
42#include <errno.h> 42#include <errno.h>
43#include <sys/types.h> 43#include <sys/types.h>
44#include <sys/stat.h> 44#include <sys/stat.h>
45#include <errno.h>
46 45
47// Utility stuff to get versions of the sh 46// Utility stuff to get versions of the sh
48#define PACKVERSION(major,minor) MAKELONG(minor,major) 47#define PACKVERSION(major,minor) MAKELONG(minor,major)
diff --git a/linden/indra/llwindow/lldxhardware.cpp b/linden/indra/llwindow/lldxhardware.cpp
index 1a39e68..2aff052 100644
--- a/linden/indra/llwindow/lldxhardware.cpp
+++ b/linden/indra/llwindow/lldxhardware.cpp
@@ -411,6 +411,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
411 } 411 }
412 412
413 std::string device_name = get_string(device_containerp, L"szDescription"); 413 std::string device_name = get_string(device_containerp, L"szDescription");
414
414 std::string device_id = get_string(device_containerp, L"szDeviceID"); 415 std::string device_id = get_string(device_containerp, L"szDeviceID");
415 416
416 LLDXDevice *dxdevicep = new LLDXDevice; 417 LLDXDevice *dxdevicep = new LLDXDevice;
@@ -451,6 +452,8 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
451 } 452 }
452 453
453 454
455
456
454 // Now, iterate through the related drivers 457 // Now, iterate through the related drivers
455 hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp); 458 hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp);
456 if (FAILED(hr) || !driver_containerp) 459 if (FAILED(hr) || !driver_containerp)
@@ -468,6 +471,7 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
468 S32 file_num = 0; 471 S32 file_num = 0;
469 for (file_num = 0; file_num < (S32)num_files; file_num++ ) 472 for (file_num = 0; file_num < (S32)num_files; file_num++ )
470 { 473 {
474
471 hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256); 475 hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256);
472 if (FAILED(hr)) 476 if (FAILED(hr))
473 { 477 {
@@ -522,6 +526,104 @@ LCleanup:
522 return ok; 526 return ok;
523} 527}
524 528
529LLSD LLDXHardware::getDisplayInfo()
530{
531 LLTimer hw_timer;
532 HRESULT hr;
533 LLSD ret;
534 CoInitialize(NULL);
535
536 IDxDiagProvider *dx_diag_providerp = NULL;
537 IDxDiagContainer *dx_diag_rootp = NULL;
538 IDxDiagContainer *devices_containerp = NULL;
539 IDxDiagContainer *device_containerp = NULL;
540 IDxDiagContainer *file_containerp = NULL;
541 IDxDiagContainer *driver_containerp = NULL;
542
543 // CoCreate a IDxDiagProvider*
544 llinfos << "CoCreateInstance IID_IDxDiagProvider" << llendl;
545 hr = CoCreateInstance(CLSID_DxDiagProvider,
546 NULL,
547 CLSCTX_INPROC_SERVER,
548 IID_IDxDiagProvider,
549 (LPVOID*) &dx_diag_providerp);
550
551 if (FAILED(hr))
552 {
553 llwarns << "No DXDiag provider found! DirectX 9 not installed!" << llendl;
554 gWriteDebug("No DXDiag provider found! DirectX 9 not installed!\n");
555 goto LCleanup;
556 }
557 if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed
558 {
559 // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize
560 // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are
561 // digital signed as logo'd by WHQL which may connect via internet to update
562 // WHQL certificates.
563 DXDIAG_INIT_PARAMS dx_diag_init_params;
564 ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS));
565
566 dx_diag_init_params.dwSize = sizeof(DXDIAG_INIT_PARAMS);
567 dx_diag_init_params.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
568 dx_diag_init_params.bAllowWHQLChecks = TRUE;
569 dx_diag_init_params.pReserved = NULL;
570
571 llinfos << "dx_diag_providerp->Initialize" << llendl;
572 hr = dx_diag_providerp->Initialize(&dx_diag_init_params);
573 if(FAILED(hr))
574 {
575 goto LCleanup;
576 }
577
578 llinfos << "dx_diag_providerp->GetRootContainer" << llendl;
579 hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp );
580 if(FAILED(hr) || !dx_diag_rootp)
581 {
582 goto LCleanup;
583 }
584
585 HRESULT hr;
586
587 // Get display driver information
588 llinfos << "dx_diag_rootp->GetChildContainer" << llendl;
589 hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
590 if(FAILED(hr) || !devices_containerp)
591 {
592 goto LCleanup;
593 }
594
595 // Get device 0
596 llinfos << "devices_containerp->GetChildContainer" << llendl;
597 hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
598 if(FAILED(hr) || !device_containerp)
599 {
600 goto LCleanup;
601 }
602
603 // Get the English VRAM string
604 std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
605
606
607 // Dump the string as an int into the structure
608 char *stopstring;
609 ret["VRAM"] = strtol(ram_str.c_str(), &stopstring, 10);
610 std::string device_name = get_string(device_containerp, L"szDescription");
611 ret["DeviceName"] = device_name;
612 std::string device_driver= get_string(device_containerp, L"szDriverVersion");
613 ret["DriverVersion"] = device_driver;
614 }
615LCleanup:
616 SAFE_RELEASE(file_containerp);
617 SAFE_RELEASE(driver_containerp);
618 SAFE_RELEASE(device_containerp);
619 SAFE_RELEASE(devices_containerp);
620 SAFE_RELEASE(dx_diag_rootp);
621 SAFE_RELEASE(dx_diag_providerp);
622
623 CoUninitialize();
624 return ret;
625}
626
525void LLDXHardware::setWriteDebugFunc(void (*func)(const char*)) 627void LLDXHardware::setWriteDebugFunc(void (*func)(const char*))
526{ 628{
527 gWriteDebug = func; 629 gWriteDebug = func;
diff --git a/linden/indra/llwindow/lldxhardware.h b/linden/indra/llwindow/lldxhardware.h
index 1d5d69d..e2a255d 100644
--- a/linden/indra/llwindow/lldxhardware.h
+++ b/linden/indra/llwindow/lldxhardware.h
@@ -36,6 +36,7 @@
36 36
37#include "stdtypes.h" 37#include "stdtypes.h"
38#include "llstring.h" 38#include "llstring.h"
39#include "llsd.h"
39 40
40class LLVersion 41class LLVersion
41{ 42{
@@ -93,6 +94,8 @@ public:
93 94
94 S32 getVRAM() const { return mVRAM; } 95 S32 getVRAM() const { return mVRAM; }
95 96
97 LLSD getDisplayInfo();
98
96 // Find a particular device that matches the following specs. 99 // Find a particular device that matches the following specs.
97 // Empty strings indicate that you don't care. 100 // Empty strings indicate that you don't care.
98 // You can separate multiple devices with '|' chars to indicate you want 101 // You can separate multiple devices with '|' chars to indicate you want
diff --git a/linden/indra/llwindow/llgl.cpp b/linden/indra/llwindow/llgl.cpp
index 35f20d3..df87591 100644
--- a/linden/indra/llwindow/llgl.cpp
+++ b/linden/indra/llwindow/llgl.cpp
@@ -36,6 +36,8 @@
36 36
37#include "linden_common.h" 37#include "linden_common.h"
38 38
39#include "boost/tokenizer.hpp"
40
39#include "llsys.h" 41#include "llsys.h"
40 42
41#include "llgl.h" 43#include "llgl.h"
@@ -459,6 +461,23 @@ bool LLGLManager::initGL()
459 return true; 461 return true;
460} 462}
461 463
464void LLGLManager::getGLInfo(LLSD& info)
465{
466 info["GLInfo"]["GLVendor"] = LLString((const char *)glGetString(GL_VENDOR));
467 info["GLInfo"]["GLRenderer"] = LLString((const char *)glGetString(GL_RENDERER));
468 info["GLInfo"]["GLVersion"] = LLString((const char *)glGetString(GL_VERSION));
469
470#if !LL_MESA_HEADLESS
471 LLString all_exts = (const char *)gGLHExts.mSysExts;
472 boost::char_separator<char> sep(" ");
473 boost::tokenizer<boost::char_separator<char> > tok(all_exts, sep);
474 for(boost::tokenizer<boost::char_separator<char> >::iterator i = tok.begin(); i != tok.end(); ++i)
475 {
476 info["GLInfo"]["GLExtensions"].append(*i);
477 }
478#endif
479}
480
462LLString LLGLManager::getGLInfoString() 481LLString LLGLManager::getGLInfoString()
463{ 482{
464 LLString info_str; 483 LLString info_str;
diff --git a/linden/indra/llwindow/llgl.h b/linden/indra/llwindow/llgl.h
index 2a23a23..a8e14b7 100644
--- a/linden/indra/llwindow/llgl.h
+++ b/linden/indra/llwindow/llgl.h
@@ -48,6 +48,8 @@
48 48
49#define LL_GL_ERRS llerrs 49#define LL_GL_ERRS llerrs
50 50
51class LLSD;
52
51// Manage GL extensions... 53// Manage GL extensions...
52class LLGLManager 54class LLGLManager
53{ 55{
@@ -122,6 +124,7 @@ public:
122 void getPixelFormat(); // Get the best pixel format 124 void getPixelFormat(); // Get the best pixel format
123 125
124 LLString getGLInfoString(); 126 LLString getGLInfoString();
127 void getGLInfo(LLSD& info);
125 128
126 // In ALL CAPS 129 // In ALL CAPS
127 LLString mGLVendor; 130 LLString mGLVendor;
diff --git a/linden/indra/llwindow/llwindowwin32.cpp b/linden/indra/llwindow/llwindowwin32.cpp
index c84611b..1fa50de 100644
--- a/linden/indra/llwindow/llwindowwin32.cpp
+++ b/linden/indra/llwindow/llwindowwin32.cpp
@@ -93,6 +93,7 @@ BOOL LLWindowWin32::sWinIMEOpened = FALSE;
93HKL LLWindowWin32::sWinInputLocale = 0; 93HKL LLWindowWin32::sWinInputLocale = 0;
94DWORD LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE; 94DWORD LLWindowWin32::sWinIMEConversionMode = IME_CMODE_NATIVE;
95DWORD LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC; 95DWORD LLWindowWin32::sWinIMESentenceMode = IME_SMODE_AUTOMATIC;
96LLCoordWindow LLWindowWin32::sWinIMEWindowPosition(-1,-1);
96 97
97// The following class LLWinImm delegates Windows IMM APIs. 98// The following class LLWinImm delegates Windows IMM APIs.
98// We need this because some language versions of Windows, 99// We need this because some language versions of Windows,
@@ -3381,7 +3382,8 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
3381 LLCoordWindow win_pos; 3382 LLCoordWindow win_pos;
3382 convertCoords( position, &win_pos ); 3383 convertCoords( position, &win_pos );
3383 3384
3384 if ( win_pos.mX >= 0 && win_pos.mY >= 0 ) 3385 if ( win_pos.mX >= 0 && win_pos.mY >= 0 &&
3386 (win_pos.mX != sWinIMEWindowPosition.mX) || (win_pos.mY != sWinIMEWindowPosition.mY) )
3385 { 3387 {
3386 COMPOSITIONFORM ime_form; 3388 COMPOSITIONFORM ime_form;
3387 memset( &ime_form, 0, sizeof(ime_form) ); 3389 memset( &ime_form, 0, sizeof(ime_form) );
@@ -3390,10 +3392,11 @@ void LLWindowWin32::setLanguageTextInput( const LLCoordGL & position )
3390 ime_form.ptCurrentPos.y = win_pos.mY; 3392 ime_form.ptCurrentPos.y = win_pos.mY;
3391 3393
3392 LLWinImm::setCompositionWindow( himc, &ime_form ); 3394 LLWinImm::setCompositionWindow( himc, &ime_form );
3395
3396 sWinIMEWindowPosition.set( win_pos.mX, win_pos.mY );
3393 } 3397 }
3394 3398
3395 LLWinImm::releaseContext(mWindowHandle, himc); 3399 LLWinImm::releaseContext(mWindowHandle, himc);
3396
3397 } 3400 }
3398} 3401}
3399 3402
diff --git a/linden/indra/llwindow/llwindowwin32.h b/linden/indra/llwindow/llwindowwin32.h
index f1e977e..602e066 100644
--- a/linden/indra/llwindow/llwindowwin32.h
+++ b/linden/indra/llwindow/llwindowwin32.h
@@ -188,6 +188,7 @@ protected:
188 static HKL sWinInputLocale; 188 static HKL sWinInputLocale;
189 static DWORD sWinIMEConversionMode; 189 static DWORD sWinIMEConversionMode;
190 static DWORD sWinIMESentenceMode; 190 static DWORD sWinIMESentenceMode;
191 static LLCoordWindow sWinIMEWindowPosition;
191 192
192 friend class LLWindowManager; 193 friend class LLWindowManager;
193}; 194};
diff --git a/linden/indra/lscript/lscript_compile/indra.l b/linden/indra/lscript/lscript_compile/indra.l
index 69e77fb..57aef07 100644
--- a/linden/indra/lscript/lscript_compile/indra.l
+++ b/linden/indra/lscript/lscript_compile/indra.l
@@ -651,14 +651,6 @@ int yyerror(const char *fmt, ...)
651 return 0; 651 return 0;
652} 652}
653 653
654#define LL_MKS_YACC 0
655#if LL_WINDOWS && LL_MKS_YACC
656int yyinput(void)
657{
658 return input();
659}
660#endif
661
662//#define EMERGENCY_DEBUG_PRINTOUTS 654//#define EMERGENCY_DEBUG_PRINTOUTS
663//#define EMIT_CIL_ASSEMBLER 655//#define EMIT_CIL_ASSEMBLER
664 656
@@ -685,11 +677,9 @@ BOOL lscript_compile(const char* src_filename, const char* dst_filename,
685 yyout = LLFile::fopen(err_filename, "w"); 677 yyout = LLFile::fopen(err_filename, "w");
686 678
687 // Reset the lexer's internal buffering. 679 // Reset the lexer's internal buffering.
688#if LL_DARWIN || LL_LINUX || !LL_MKS_YACC 680
689 yyrestart(yyin); 681 yyrestart(yyin);
690#else 682
691 yy_reset();
692#endif
693 b_parse_ok = !yyparse(); 683 b_parse_ok = !yyparse();
694 684
695 if (b_parse_ok) 685 if (b_parse_ok)
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile.vcproj
index fd03fa0..59822f2 100644
--- a/linden/indra/lscript/lscript_compile/lscript_compile.vcproj
+++ b/linden/indra/lscript/lscript_compile/lscript_compile.vcproj
@@ -30,7 +30,8 @@
30 WarningLevel="3" 30 WarningLevel="3"
31 WarnAsError="FALSE" 31 WarnAsError="FALSE"
32 Detect64BitPortabilityProblems="FALSE" 32 Detect64BitPortabilityProblems="FALSE"
33 DebugInformationFormat="4"/> 33 DebugInformationFormat="4"
34 DisableSpecificWarnings="4065"/>
34 <Tool 35 <Tool
35 Name="VCCustomBuildTool"/> 36 Name="VCCustomBuildTool"/>
36 <Tool 37 <Tool
@@ -72,7 +73,8 @@
72 WarningLevel="3" 73 WarningLevel="3"
73 WarnAsError="FALSE" 74 WarnAsError="FALSE"
74 Detect64BitPortabilityProblems="FALSE" 75 Detect64BitPortabilityProblems="FALSE"
75 DebugInformationFormat="3"/> 76 DebugInformationFormat="3"
77 DisableSpecificWarnings="4065"/>
76 <Tool 78 <Tool
77 Name="VCCustomBuildTool"/> 79 Name="VCCustomBuildTool"/>
78 <Tool 80 <Tool
@@ -115,7 +117,8 @@
115 WarningLevel="3" 117 WarningLevel="3"
116 WarnAsError="FALSE" 118 WarnAsError="FALSE"
117 Detect64BitPortabilityProblems="FALSE" 119 Detect64BitPortabilityProblems="FALSE"
118 DebugInformationFormat="3"/> 120 DebugInformationFormat="3"
121 DisableSpecificWarnings="4065"/>
119 <Tool 122 <Tool
120 Name="VCCustomBuildTool"/> 123 Name="VCCustomBuildTool"/>
121 <Tool 124 <Tool
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj
index c61e6ec..e65b8cd 100755
--- a/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj
+++ b/linden/indra/lscript/lscript_compile/lscript_compile_fb.vcproj
@@ -74,8 +74,7 @@
74 <Tool 74 <Tool
75 Name="VCCustomBuildTool" 75 Name="VCCustomBuildTool"
76 Description="Building lex_yy.cpp" 76 Description="Building lex_yy.cpp"
77 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l 77 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l"
78"
79 Outputs="lex_yy.cpp"/> 78 Outputs="lex_yy.cpp"/>
80 </FileConfiguration> 79 </FileConfiguration>
81 </File> 80 </File>
@@ -86,7 +85,7 @@
86 <Tool 85 <Tool
87 Name="VCCustomBuildTool" 86 Name="VCCustomBuildTool"
88 Description="Building ytab.cpp" 87 Description="Building ytab.cpp"
89 CommandLine="C:\cygwin\bin\bison.exe -o ytab.cpp -v -d indra.y 88 CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y
90" 89"
91 Outputs="ytab.cpp;ytab.h"/> 90 Outputs="ytab.cpp;ytab.h"/>
92 </FileConfiguration> 91 </FileConfiguration>
@@ -95,7 +94,8 @@
95 <Tool 94 <Tool
96 Name="VCCustomBuildTool" 95 Name="VCCustomBuildTool"
97 Description="Building ytab.cpp" 96 Description="Building ytab.cpp"
98 CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y 97 CommandLine="dir
98C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y
99C:\cygwin\bin\mv.exe ytab.hpp ytab.h" 99C:\cygwin\bin\mv.exe ytab.hpp ytab.h"
100 Outputs="ytab.cpp;ytab.h"/> 100 Outputs="ytab.cpp;ytab.h"/>
101 </FileConfiguration> 101 </FileConfiguration>
diff --git a/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj b/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj
index c61e6ec..1b2e3b7 100644
--- a/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj
+++ b/linden/indra/lscript/lscript_compile/lscript_compile_fb_vc8.vcproj
@@ -1,106 +1,131 @@
1<?xml version="1.0" encoding="Windows-1252"?> 1<?xml version="1.0" encoding="Windows-1252"?>
2<VisualStudioProject 2<VisualStudioProject
3 ProjectType="Visual C++" 3 ProjectType="Visual C++"
4 Version="7.10" 4 Version="8.00"
5 Name="lscript_compile_fb" 5 Name="lscript_compile_fb_vc8"
6 ProjectGUID="{B771CF1B-E253-47BD-8B0A-6B0440CC9228}" 6 ProjectGUID="{B771CF1B-E253-47BD-8B0A-6B0440CC9228}"
7 RootNamespace="lscript_compile_fb" 7 RootNamespace="lscript_compile_fb"
8 Keyword="MakeFileProj"> 8 Keyword="MakeFileProj"
9 <Platforms> 9 >
10 <Platform 10 <Platforms>
11 Name="Win32"/> 11 <Platform
12 </Platforms> 12 Name="Win32"
13 <Configurations> 13 />
14 <Configuration 14 </Platforms>
15 Name="Debug|Win32" 15 <ToolFiles>
16 OutputDirectory="." 16 </ToolFiles>
17 IntermediateDirectory="Debug_fb" 17 <Configurations>
18 ConfigurationType="10"> 18 <Configuration
19 <Tool 19 Name="Debug|Win32"
20 Name="VCCustomBuildTool"/> 20 OutputDirectory="."
21 <Tool 21 IntermediateDirectory="Debug_fb"
22 Name="VCMIDLTool"/> 22 ConfigurationType="10"
23 <Tool 23 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
24 Name="VCPostBuildEventTool"/> 24 >
25 <Tool 25 <Tool
26 Name="VCPreBuildEventTool"/> 26 Name="VCPreBuildEventTool"
27 </Configuration> 27 />
28 <Configuration 28 <Tool
29 Name="Release|Win32" 29 Name="VCCustomBuildTool"
30 OutputDirectory="." 30 />
31 IntermediateDirectory="Release_fb" 31 <Tool
32 ConfigurationType="10"> 32 Name="VCMIDLTool"
33 <Tool 33 />
34 Name="VCCustomBuildTool"/> 34 <Tool
35 <Tool 35 Name="VCPostBuildEventTool"
36 Name="VCMIDLTool"/> 36 />
37 <Tool 37 </Configuration>
38 Name="VCPostBuildEventTool"/> 38 <Configuration
39 <Tool 39 Name="Release|Win32"
40 Name="VCPreBuildEventTool"/> 40 OutputDirectory="."
41 </Configuration> 41 IntermediateDirectory="Release_fb"
42 </Configurations> 42 ConfigurationType="10"
43 <References> 43 InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
44 </References> 44 >
45 <Files> 45 <Tool
46 <Filter 46 Name="VCPreBuildEventTool"
47 Name="Source Files" 47 />
48 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" 48 <Tool
49 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> 49 Name="VCCustomBuildTool"
50 </Filter> 50 />
51 <Filter 51 <Tool
52 Name="Header Files" 52 Name="VCMIDLTool"
53 Filter="h;hpp;hxx;hm;inl;inc;xsd" 53 />
54 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> 54 <Tool
55 </Filter> 55 Name="VCPostBuildEventTool"
56 <Filter 56 />
57 Name="Resource Files" 57 </Configuration>
58 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" 58 </Configurations>
59 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"> 59 <References>
60 </Filter> 60 </References>
61 <File 61 <Files>
62 RelativePath=".\indra.l"> 62 <Filter
63 <FileConfiguration 63 Name="Source Files"
64 Name="Debug|Win32"> 64 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
65 <Tool 65 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
66 Name="VCCustomBuildTool" 66 >
67 Description="Building lex_yy.cpp" 67 </Filter>
68 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l 68 <Filter
69" 69 Name="Header Files"
70 Outputs="lex_yy.cpp"/> 70 Filter="h;hpp;hxx;hm;inl;inc;xsd"
71 </FileConfiguration> 71 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
72 <FileConfiguration 72 >
73 Name="Release|Win32"> 73 </Filter>
74 <Tool 74 <Filter
75 Name="VCCustomBuildTool" 75 Name="Resource Files"
76 Description="Building lex_yy.cpp" 76 Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
77 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l 77 UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
78" 78 >
79 Outputs="lex_yy.cpp"/> 79 </Filter>
80 </FileConfiguration> 80 <File
81 </File> 81 RelativePath=".\indra.l"
82 <File 82 >
83 RelativePath=".\indra.y"> 83 <FileConfiguration
84 <FileConfiguration 84 Name="Debug|Win32"
85 Name="Debug|Win32"> 85 >
86 <Tool 86 <Tool
87 Name="VCCustomBuildTool" 87 Name="VCCustomBuildTool"
88 Description="Building ytab.cpp" 88 Description="Building lex_yy.cpp"
89 CommandLine="C:\cygwin\bin\bison.exe -o ytab.cpp -v -d indra.y 89 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l&#x0D;&#x0A;"
90" 90 Outputs="lex_yy.cpp"
91 Outputs="ytab.cpp;ytab.h"/> 91 />
92 </FileConfiguration> 92 </FileConfiguration>
93 <FileConfiguration 93 <FileConfiguration
94 Name="Release|Win32"> 94 Name="Release|Win32"
95 <Tool 95 >
96 Name="VCCustomBuildTool" 96 <Tool
97 Description="Building ytab.cpp" 97 Name="VCCustomBuildTool"
98 CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y 98 Description="Building lex_yy.cpp"
99C:\cygwin\bin\mv.exe ytab.hpp ytab.h" 99 CommandLine="C:\cygwin\bin\flex.exe -olex_yy.cpp indra.l&#x0D;&#x0A;"
100 Outputs="ytab.cpp;ytab.h"/> 100 Outputs="lex_yy.cpp"
101 </FileConfiguration> 101 />
102 </File> 102 </FileConfiguration>
103 </Files> 103 </File>
104 <Globals> 104 <File
105 </Globals> 105 RelativePath=".\indra.y"
106</VisualStudioProject> 106 >
107 <FileConfiguration
108 Name="Debug|Win32"
109 >
110 <Tool
111 Name="VCCustomBuildTool"
112 Description="Building ytab.cpp"
113 CommandLine="C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y&#x0D;&#x0A;"
114 Outputs="ytab.cpp;ytab.h"
115 />
116 </FileConfiguration>
117 <FileConfiguration
118 Name="Release|Win32"
119 >
120 <Tool
121 Name="VCCustomBuildTool"
122 Description="Building ytab.cpp"
123 CommandLine="dir&#x0D;&#x0A;C:\cygwin\bin\bison.exe -y -d -v -o ytab.cpp indra.y&#x0D;&#x0A;C:\cygwin\bin\mv.exe ytab.hpp ytab.h&#x0D;&#x0A;"
124 Outputs="ytab.cpp;ytab.h"
125 />
126 </FileConfiguration>
127 </File>
128 </Files>
129 <Globals>
130 </Globals>
131</VisualStudioProject>
diff --git a/linden/indra/mac_crash_logger/llcrashloggermac.cpp b/linden/indra/mac_crash_logger/llcrashloggermac.cpp
new file mode 100644
index 0000000..3d8abe5
--- /dev/null
+++ b/linden/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -0,0 +1,342 @@
1/**
2 * @file llcrashloggermac.cpp
3 * @brief Mac OSX crash logger implementation
4 *
5 * $LicenseInfo:firstyear=2003&license=viewergpl$
6 *
7 * Copyright (c) 2003-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32
33#include "llcrashloggermac.h"
34
35#include <Carbon/Carbon.h>
36#include <iostream>
37#include <sstream>
38
39#include "boost/tokenizer.hpp"
40
41#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
42#include "llerror.h"
43#include "llfile.h"
44#include "lltimer.h"
45#include "llstring.h"
46#include "lldir.h"
47#include "llsdserialize.h"
48
49#define MAX_LOADSTRING 100
50const char* const SETTINGS_FILE_HEADER = "version";
51const S32 SETTINGS_FILE_VERSION = 101;
52
53// Windows Message Handlers
54
55BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog?
56FILE *gDebugFile = NULL;
57
58WindowRef gWindow = NULL;
59EventHandlerRef gEventHandler = NULL;
60LLString gUserNotes = "";
61bool gSendReport = false;
62bool gRememberChoice = false;
63IBNibRef nib = NULL;
64
65OSStatus dialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata)
66{
67 OSStatus result = eventNotHandledErr;
68 OSStatus err;
69 UInt32 evtClass = GetEventClass(event);
70 UInt32 evtKind = GetEventKind(event);
71 if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess))
72 {
73 HICommand cmd;
74 err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd);
75
76
77
78 if(err == noErr)
79 {
80 //Get the value of the checkbox
81 ControlID id;
82 ControlRef checkBox = NULL;
83 id.signature = 'remb';
84 id.id = 0;
85 err = GetControlByID(gWindow, &id, &checkBox);
86
87 if(err == noErr)
88 {
89 if(GetControl32BitValue(checkBox) == kControlCheckBoxCheckedValue)
90 {
91 gRememberChoice = true;
92 }
93 else
94 {
95 gRememberChoice = false;
96 }
97 }
98 switch(cmd.commandID)
99 {
100 case kHICommandOK:
101 {
102 char buffer[65535]; /* Flawfinder: ignore */
103 Size size = sizeof(buffer) - 1;
104 ControlRef textField = NULL;
105
106 id.signature = 'text';
107 id.id = 0;
108
109 err = GetControlByID(gWindow, &id, &textField);
110 if(err == noErr)
111 {
112 // Get the user response text
113 err = GetControlData(textField, kControlNoPart, kControlEditTextTextTag, size, (Ptr)buffer, &size);
114 }
115 if(err == noErr)
116 {
117 // Make sure the string is terminated.
118 buffer[size] = 0;
119 gUserNotes = buffer;
120
121 llinfos << buffer << llendl;
122 }
123
124 // Send the report.
125
126 QuitAppModalLoopForWindow(gWindow);
127 gSendReport = true;
128 result = noErr;
129 }
130 break;
131
132 case kHICommandCancel:
133 QuitAppModalLoopForWindow(gWindow);
134 result = noErr;
135 break;
136 }
137 }
138 }
139
140 return(result);
141}
142
143
144LLCrashLoggerMac::LLCrashLoggerMac(void)
145{
146}
147
148LLCrashLoggerMac::~LLCrashLoggerMac(void)
149{
150}
151
152bool LLCrashLoggerMac::init(void)
153{
154 bool ok = LLCrashLogger::init();
155 if(!ok) return false;
156 if(mCrashBehavior != CRASH_BEHAVIOR_ASK) return true;
157
158 // Real UI...
159 OSStatus err;
160
161 err = CreateNibReference(CFSTR("CrashReporter"), &nib);
162
163 if(err == noErr)
164 {
165 err = CreateWindowFromNib(nib, CFSTR("CrashReporter"), &gWindow);
166 }
167
168 if(err == noErr)
169 {
170 // Set focus to the edit text area
171 ControlRef textField = NULL;
172 ControlID id;
173
174 id.signature = 'text';
175 id.id = 0;
176
177 // Don't set err if any of this fails, since it's non-critical.
178 if(GetControlByID(gWindow, &id, &textField) == noErr)
179 {
180 SetKeyboardFocus(gWindow, textField, kControlFocusNextPart);
181 }
182 }
183
184 if(err == noErr)
185 {
186 ShowWindow(gWindow);
187 }
188
189 if(err == noErr)
190 {
191 // Set up an event handler for the window.
192 EventTypeSpec handlerEvents[] =
193 {
194 { kEventClassCommand, kEventCommandProcess }
195 };
196
197 InstallWindowEventHandler(
198 gWindow,
199 NewEventHandlerUPP(dialogHandler),
200 GetEventTypeCount (handlerEvents),
201 handlerEvents,
202 0,
203 &gEventHandler);
204 }
205 return true;
206}
207
208void LLCrashLoggerMac::gatherPlatformSpecificFiles()
209{
210 updateApplication("Gathering hardware information...");
211 char path[MAX_PATH];
212 FSRef folder;
213
214 if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr)
215 {
216 // folder is an FSRef to ~/Library/Logs/
217 if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr)
218 {
219 struct stat dw_stat;
220 LLString mBuf;
221 bool isLeopard = false;
222 // Try the 10.3 path first...
223 LLString dw_file_name = LLString(path) + LLString("/CrashReporter/Second Life.crash.log");
224 int res = stat(dw_file_name.c_str(), &dw_stat);
225
226 if (res)
227 {
228 // Try the 10.2 one next...
229 dw_file_name = LLString(path) + LLString("/Second Life.crash.log");
230 res = stat(dw_file_name.c_str(), &dw_stat);
231 }
232
233 if(res)
234 {
235 //10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up
236 //using asterisks. Get a directory listing, search for files starting with second life,
237 //use the last one found.
238 LLString old_file_name, current_file_name, pathname, mask;
239 pathname = LLString(path) + LLString("/CrashReporter/");
240 mask = "Second Life*";
241 while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false))
242 {
243 old_file_name = current_file_name;
244 }
245 if(old_file_name != "")
246 {
247 dw_file_name = pathname + old_file_name;
248 res=stat(dw_file_name.c_str(), &dw_stat);
249 isLeopard = true;
250 }
251 }
252
253 if (!res)
254 {
255 std::ifstream fp(dw_file_name.c_str());
256 std::stringstream str;
257 if(!fp.is_open()) return;
258 str << fp.rdbuf();
259 mBuf = str.str();
260
261 if(!isLeopard)
262 {
263 // Crash logs consist of a number of entries, one per crash.
264 // Each entry is preceeded by "**********" on a line by itself.
265 // We want only the most recent (i.e. last) one.
266 const char *sep = "**********";
267 const char *start = mBuf.c_str();
268 const char *cur = start;
269 const char *temp = strstr(cur, sep);
270
271 while(temp != NULL)
272 {
273 // Skip past the marker we just found
274 cur = temp + strlen(sep); /* Flawfinder: ignore */
275
276 // and try to find another
277 temp = strstr(cur, sep);
278 }
279
280 // If there's more than one entry in the log file, strip all but the last one.
281 if(cur != start)
282 {
283 mBuf.erase(0, cur - start);
284 }
285 }
286 mCrashInfo["CrashLog"] = mBuf;
287 }
288 else
289 {
290 llwarns << "Couldn't find any CrashReporter files..." << llendl;
291 }
292 }
293 }
294}
295
296bool LLCrashLoggerMac::mainLoop()
297{
298 OSStatus err = noErr;
299
300 if(err == noErr && mCrashBehavior == CRASH_BEHAVIOR_ASK)
301 {
302 RunAppModalLoopForWindow(gWindow);
303 }
304 else if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
305 {
306 gSendReport = true;
307 }
308
309 if(gRememberChoice)
310 {
311 if(gSendReport) saveCrashBehaviorSetting(CRASH_BEHAVIOR_ALWAYS_SEND);
312 else saveCrashBehaviorSetting(CRASH_BEHAVIOR_NEVER_SEND);
313 }
314
315 if(gSendReport)
316 {
317 setUserText(gUserNotes);
318 sendCrashLogs();
319 }
320
321 if(gWindow != NULL)
322 {
323 DisposeWindow(gWindow);
324 }
325
326 if(nib != NULL)
327 {
328 DisposeNibReference(nib);
329 }
330
331 return true;
332}
333
334void LLCrashLoggerMac::updateApplication(LLString message)
335{
336 LLCrashLogger::updateApplication();
337}
338
339bool LLCrashLoggerMac::cleanup()
340{
341 return true;
342}
diff --git a/linden/indra/mac_crash_logger/llcrashloggermac.h b/linden/indra/mac_crash_logger/llcrashloggermac.h
new file mode 100644
index 0000000..cf4e766
--- /dev/null
+++ b/linden/indra/mac_crash_logger/llcrashloggermac.h
@@ -0,0 +1,51 @@
1/**
2 * @file llcrashloggermac.h
3 * @brief Mac OSX crash logger definition
4 *
5 * $LicenseInfo:firstyear=2003&license=viewergpl$
6 *
7 * Copyright (c) 2003-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LLCRASHLOGGERMAC_H
33#define LLCRASHLOGGERMAC_H
34
35#include "linden_common.h"
36#include "llcrashlogger.h"
37#include "llstring.h"
38
39class LLCrashLoggerMac : public LLCrashLogger
40{
41public:
42 LLCrashLoggerMac(void);
43 ~LLCrashLoggerMac(void);
44 virtual bool init();
45 virtual bool mainLoop();
46 virtual void updateApplication(LLString message = "");
47 virtual bool cleanup();
48 virtual void gatherPlatformSpecificFiles();
49};
50
51#endif
diff --git a/linden/indra/mac_crash_logger/mac_crash_logger.cpp b/linden/indra/mac_crash_logger/mac_crash_logger.cpp
index 2501b4a..bf3151a 100644
--- a/linden/indra/mac_crash_logger/mac_crash_logger.cpp
+++ b/linden/indra/mac_crash_logger/mac_crash_logger.cpp
@@ -31,675 +31,21 @@
31 31
32#include "linden_common.h" 32#include "linden_common.h"
33 33
34#include <sys/types.h> 34#include "llcrashloggermac.h"
35#include <sys/stat.h>
36#include <unistd.h>
37
38#include <curl/curl.h>
39
40#include "llerror.h"
41#include "lltimer.h"
42#include "lldir.h"
43
44#include "llstring.h"
45
46class LLFileEncoder
47{
48public:
49 LLFileEncoder(const char *formname, const char *filename, bool isCrashLog = false);
50
51 BOOL isValid() const { return mIsValid; }
52 LLString encodeURL(const S32 max_length = 0);
53public:
54 BOOL mIsValid;
55 LLString mFilename;
56 LLString mFormname;
57 LLString mBuf;
58};
59
60LLString encode_string(const char *formname, const LLString &str);
61
62#include <Carbon/Carbon.h>
63
64LLString gServerResponse;
65BOOL gSendReport = FALSE;
66LLString gUserserver;
67LLString gUserText;
68WindowRef gWindow = NULL;
69EventHandlerRef gEventHandler = NULL;
70BOOL gCrashInPreviousExec = FALSE;
71time_t gLaunchTime;
72
73size_t curl_download_callback(void *data, size_t size, size_t nmemb,
74 void *user_data)
75{
76 S32 bytes = size * nmemb;
77 char *cdata = (char *) data;
78 for (int i =0; i < bytes; i += 1)
79 {
80 gServerResponse += (cdata[i]);
81 }
82 return bytes;
83}
84
85OSStatus dialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata)
86{
87 OSStatus result = eventNotHandledErr;
88 OSStatus err;
89 UInt32 evtClass = GetEventClass(event);
90 UInt32 evtKind = GetEventKind(event);
91
92 if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess))
93 {
94 HICommand cmd;
95 err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd);
96
97 if(err == noErr)
98 {
99 switch(cmd.commandID)
100 {
101 case kHICommandOK:
102 {
103 char buffer[65535]; /* Flawfinder: ignore */
104 Size size = sizeof(buffer) - 1;
105 ControlRef textField = NULL;
106 ControlID id;
107
108 id.signature = 'text';
109 id.id = 0;
110
111 err = GetControlByID(gWindow, &id, &textField);
112 if(err == noErr)
113 {
114 // Get the user response text
115 err = GetControlData(textField, kControlNoPart, kControlEditTextTextTag, size, (Ptr)buffer, &size);
116 }
117 if(err == noErr)
118 {
119 // Make sure the string is terminated.
120 buffer[size] = 0;
121 gUserText = buffer;
122 llinfos << buffer << llendl;
123 }
124
125 // Send the report.
126 gSendReport = TRUE;
127
128 QuitAppModalLoopForWindow(gWindow);
129 result = noErr;
130 }
131 break;
132
133 case kHICommandCancel:
134 QuitAppModalLoopForWindow(gWindow);
135 result = noErr;
136 break;
137 }
138 }
139 }
140
141 return(result);
142}
143 35
144int main(int argc, char **argv) 36int main(int argc, char **argv)
145{ 37{
146 const S32 DW_MAX_SIZE = 100000; // Maximum size to transmit of the Dr. Watson log file 38 //time(&gLaunchTime);
147 const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file.
148 int i;
149
150 time(&gLaunchTime);
151 39
152 llinfos << "Starting Second Life Viewer Crash Reporter" << llendl; 40 llinfos << "Starting Second Life Viewer Crash Reporter" << llendl;
153
154 for(i=1; i<argc; i++)
155 {
156 if(!strcmp(argv[i], "-previous"))
157 {
158 gCrashInPreviousExec = TRUE;
159 }
160 if(!strcmp(argv[i], "-user"))
161 {
162 if ((i + 1) < argc)
163 {
164 i++;
165 gUserserver = argv[i];
166 llinfos << "Got userserver " << gUserserver << llendl;
167 }
168 }
169 }
170
171 if( gCrashInPreviousExec )
172 {
173 llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
174 }
175
176 if(!gCrashInPreviousExec)
177 {
178 // Delay five seconds to let CrashReporter do its thing.
179 sleep(5);
180 }
181
182#if 1
183 // Real UI...
184 OSStatus err;
185 IBNibRef nib = NULL;
186
187 err = CreateNibReference(CFSTR("CrashReporter"), &nib);
188
189 if(err == noErr)
190 {
191 if(gCrashInPreviousExec)
192 {
193 err = CreateWindowFromNib(nib, CFSTR("CrashReporterDelayed"), &gWindow);
194 }
195 else
196 {
197 err = CreateWindowFromNib(nib, CFSTR("CrashReporter"), &gWindow);
198 }
199 }
200
201 if(err == noErr)
202 {
203 // Set focus to the edit text area
204 ControlRef textField = NULL;
205 ControlID id;
206
207 id.signature = 'text';
208 id.id = 0;
209
210 // Don't set err if any of this fails, since it's non-critical.
211 if(GetControlByID(gWindow, &id, &textField) == noErr)
212 {
213 SetKeyboardFocus(gWindow, textField, kControlFocusNextPart);
214 }
215 }
216
217 if(err == noErr)
218 {
219 ShowWindow(gWindow);
220 }
221
222 if(err == noErr)
223 {
224 // Set up an event handler for the window.
225 EventTypeSpec handlerEvents[] =
226 {
227 { kEventClassCommand, kEventCommandProcess }
228 };
229
230 InstallWindowEventHandler(
231 gWindow,
232 NewEventHandlerUPP(dialogHandler),
233 GetEventTypeCount (handlerEvents),
234 handlerEvents,
235 0,
236 &gEventHandler);
237 }
238
239 if(err == noErr)
240 {
241 RunAppModalLoopForWindow(gWindow);
242 }
243
244 if(gWindow != NULL)
245 {
246 DisposeWindow(gWindow);
247 }
248
249 if(nib != NULL)
250 {
251 DisposeNibReference(nib);
252 }
253#else
254 // Cheap version -- just use the standard system alert.
255 SInt16 itemHit = 0;
256 AlertStdCFStringAlertParamRec params;
257 OSStatus err = noErr;
258 DialogRef alert = NULL;
259
260 params.version = kStdCFStringAlertVersionOne;
261 params.movable = false;
262 params.helpButton = false;
263 params.defaultText = CFSTR("Send Report");
264 params.cancelText = CFSTR("Don't Send Report");
265 params.otherText = 0;
266 params.defaultButton = kAlertStdAlertOKButton;
267 params.cancelButton = kAlertStdAlertCancelButton;
268 params.position = kWindowDefaultPosition;
269 params.flags = 0;
270
271 err = CreateStandardAlert(
272 kAlertCautionAlert,
273 CFSTR("Second Life appears to have crashed."),
274 CFSTR(
275 "To help us debug the problem, you can send a crash report to Linden Lab. "
276 "The report contains information about your microprocessor type, graphics card, "
277 "memory, things that happened during the last run of the program, and the Crash Log "
278 "of where the crash occurred.\r"
279 "\r"
280 "You may also report crashes in the forums, or by sending e-mail to peter@lindenlab.com"),
281 &params,
282 &alert);
283
284 if(err == noErr)
285 {
286 err = RunStandardAlert(
287 alert,
288 NULL,
289 &itemHit);
290 }
291
292 if(itemHit == kAlertStdAlertOKButton)
293 gSendReport = TRUE;
294#endif
295
296 if(!gSendReport)
297 {
298 // Only send the report if the user agreed to it.
299 llinfos << "User cancelled, not sending report" << llendl;
300
301 return(0);
302 }
303
304 // We assume that all the logs we're looking for reside on the current drive
305 gDirUtilp->initAppDirs("SecondLife");
306
307 int res;
308
309 // Lots of silly variable, replicated for each log file.
310 LLString db_file_name;
311 LLString sl_file_name;
312 LLString dw_file_name; // DW file name is a hack for now...
313 LLString st_file_name; // stats.log file
314 LLString si_file_name; // settings.ini file
315
316 LLFileEncoder *db_filep = NULL;
317 LLFileEncoder *sl_filep = NULL;
318 LLFileEncoder *st_filep = NULL;
319 LLFileEncoder *dw_filep = NULL;
320 LLFileEncoder *si_filep = NULL;
321
322 ///////////////////////////////////
323 //
324 // We do the parsing for the debug_info file first, as that will
325 // give us the location of the SecondLife.log file.
326 //
327
328 // Figure out the filename of the debug log
329 db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log").c_str();
330 db_filep = new LLFileEncoder("DB", db_file_name.c_str());
331
332 // Get the filename of the SecondLife.log file
333
334 // *NOTE: changing the size of either of these buffers will
335 // require changing the sscanf() format string to correctly
336 // account for it.
337 char tmp_sl_name[LL_MAX_PATH]; /* Flawfinder: ignore */
338 tmp_sl_name[0] = '\0';
339 char tmp_space[MAX_STRING]; /* Flawfinder: ignore */
340 tmp_space[0] = '\0';
341
342 // Look for it in the debug_info.log file
343 if (db_filep->isValid())
344 {
345 // This was originally scanning for "SL Log: %[^\r\n]", which happily skipped to the next line
346 // on debug logs (which don't have anything after "SL Log:" and tried to open a nonsensical filename.
347 sscanf(
348 db_filep->mBuf.c_str(),
349 "SL Log:%254[ ]%1023[^\r\n]",
350 tmp_space,
351 tmp_sl_name);
352 }
353 else
354 {
355 delete db_filep;
356 db_filep = NULL;
357 }
358
359 // If we actually have a legitimate file name, use it.
360 if (tmp_sl_name[0])
361 {
362 sl_file_name = tmp_sl_name;
363 llinfos << "Using log file from debug log " << sl_file_name << llendl;
364 }
365 else
366 {
367 // Figure out the filename of the second life log
368 sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log").c_str();
369 }
370
371 // Now we get the SecondLife.log file if it's there, and recent enough...
372 sl_filep = new LLFileEncoder("SL", sl_file_name.c_str());
373 if (!sl_filep->isValid())
374 {
375 delete sl_filep;
376 sl_filep = NULL;
377 }
378
379 st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log").c_str();
380 st_filep = new LLFileEncoder("ST", st_file_name.c_str());
381 if (!st_filep->isValid())
382 {
383 delete st_filep;
384 st_filep = NULL;
385 }
386
387 si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.ini").c_str();
388 si_filep = new LLFileEncoder("SI", si_file_name.c_str());
389 if (!si_filep->isValid())
390 {
391 delete si_filep;
392 si_filep = NULL;
393 }
394
395 // MBW -- This needs to go find "~/Library/Logs/CrashReporter/Second Life.crash.log" on 10.3
396 // or "~/Library/Logs/Second Life.crash.log" on 10.2.
397 {
398 char path[MAX_PATH]; /* Flawfinder: ignore */
399 FSRef folder;
400
401 if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr)
402 {
403 // folder is an FSRef to ~/Library/Logs/
404 if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr)
405 {
406 struct stat dw_stat;
407// printf("path is %s\n", path);
408
409 // Try the 10.3 path first...
410 dw_file_name = LLString(path) + LLString("/CrashReporter/Second Life.crash.log");
411 res = stat(dw_file_name.c_str(), &dw_stat);
412
413 if (res)
414 {
415 // Try the 10.2 one next...
416 dw_file_name = LLString(path) + LLString("/Second Life.crash.log");
417 res = stat(dw_file_name.c_str(), &dw_stat);
418 }
419
420 if (!res)
421 {
422 dw_filep = new LLFileEncoder("DW", dw_file_name.c_str(), true);
423 if (!dw_filep->isValid())
424 {
425 delete dw_filep;
426 dw_filep = NULL;
427 }
428 }
429 else
430 {
431 llwarns << "Couldn't find any CrashReporter files..." << llendl;
432 }
433 }
434 }
435 }
436
437 LLString post_data;
438 LLString tmp_url_buf;
439
440 // Append the userserver
441 tmp_url_buf = encode_string("USER", gUserserver);
442 post_data += tmp_url_buf;
443 llinfos << "PostData:" << post_data << llendl;
444
445 if (gCrashInPreviousExec)
446 {
447 post_data.append("&");
448 tmp_url_buf = encode_string("EF", "Y");
449 post_data += tmp_url_buf;
450 }
451
452 if (db_filep)
453 {
454 post_data.append("&");
455 tmp_url_buf = db_filep->encodeURL();
456 post_data += tmp_url_buf;
457 llinfos << "Sending DB log file" << llendl;
458 }
459 else
460 {
461 llinfos << "Not sending DB log file" << llendl;
462 }
463
464 if (sl_filep)
465 {
466 post_data.append("&");
467 tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE);
468 post_data += tmp_url_buf;
469 llinfos << "Sending SL log file" << llendl;
470 }
471 else
472 {
473 llinfos << "Not sending SL log file" << llendl;
474 }
475
476 if (st_filep)
477 {
478 post_data.append("&");
479 tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE);
480 post_data += tmp_url_buf;
481 llinfos << "Sending stats log file" << llendl;
482 }
483 else
484 {
485 llinfos << "Not sending stats log file" << llendl;
486 }
487 41
488 if (dw_filep) 42 LLCrashLoggerMac app;
43 app.parseCommandOptions(argc, argv);
44 if(!app.init())
489 { 45 {
490 post_data.append("&"); 46 return 0;
491 tmp_url_buf = dw_filep->encodeURL(DW_MAX_SIZE);
492 post_data += tmp_url_buf;
493 } 47 }
494 else 48 app.mainLoop();
495 {
496 llinfos << "Not sending crash log file" << llendl;
497 }
498
499 if (si_filep)
500 {
501 post_data.append("&");
502 tmp_url_buf = si_filep->encodeURL();
503 post_data += tmp_url_buf;
504 llinfos << "Sending settings log file" << llendl;
505 }
506 else
507 {
508 llinfos << "Not sending settings.ini file" << llendl;
509 }
510
511 if (gUserText.size())
512 {
513 post_data.append("&");
514 tmp_url_buf = encode_string("UN", gUserText);
515 post_data += tmp_url_buf;
516 }
517
518 delete db_filep;
519 db_filep = NULL;
520 delete sl_filep;
521 sl_filep = NULL;
522 delete dw_filep;
523 dw_filep = NULL;
524
525 // Debugging spam
526#if 0
527 printf("Crash report post data:\n--------\n");
528 printf("%s", post_data.getString());
529 printf("\n--------\n");
530#endif
531
532 // Send the report. Yes, it's this easy.
533 {
534 CURL *curl = curl_easy_init();
535
536 curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
537 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &curl_download_callback);
538 curl_easy_setopt(curl, CURLOPT_POST, 1);
539 curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data.c_str());
540 curl_easy_setopt(curl, CURLOPT_URL, "http://secondlife.com/cgi-bin/viewer_crash_reporter2");
541
542 llinfos << "Connecting to crash report server" << llendl;
543 CURLcode result = curl_easy_perform(curl);
544
545 curl_easy_cleanup(curl);
546 49
547 if(result != CURLE_OK)
548 {
549 llinfos << "Couldn't talk to crash report server" << llendl;
550 }
551 else
552 {
553 llinfos << "Response from crash report server:" << llendl;
554 llinfos << gServerResponse << llendl;
555 }
556 }
557
558 return 0; 50 return 0;
559} 51}
560
561LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename, bool isCrashLog)
562{
563 mFormname = form_name;
564 mFilename = filename;
565 mIsValid = FALSE;
566
567 int res;
568
569 struct stat stat_data;
570 res = stat(mFilename.c_str(), &stat_data);
571 if (res)
572 {
573 llwarns << "File " << mFilename << " is missing!" << llendl;
574 return;
575 }
576 else
577 {
578 // Debugging spam
579// llinfos << "File " << mFilename << " is present..." << llendl;
580
581 if(!gCrashInPreviousExec && isCrashLog)
582 {
583 // Make sure the file isn't too old.
584 double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec);
585
586// llinfos << "age is " << age << llendl;
587
588 if(age > 60.0)
589 {
590 // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale.
591 llwarns << "File " << mFilename << " is too old!" << llendl;
592 return;
593 }
594 }
595
596 }
597
598 S32 buf_size = stat_data.st_size;
599 FILE* fp = fopen(mFilename.c_str(), "rb"); /* Flawfinder: ignore */
600 U8 *buf = new U8[buf_size + 1];
601 fread(buf, 1, buf_size, fp);
602 fclose(fp);
603 buf[buf_size] = 0;
604
605 mBuf = (char *)buf;
606
607 if(isCrashLog)
608 {
609 // Crash logs consist of a number of entries, one per crash.
610 // Each entry is preceeded by "**********" on a line by itself.
611 // We want only the most recent (i.e. last) one.
612 const char *sep = "**********";
613 const char *start = mBuf.c_str();
614 const char *cur = start;
615 const char *temp = strstr(cur, sep);
616
617 while(temp != NULL)
618 {
619 // Skip past the marker we just found
620 cur = temp + strlen(sep); /* Flawfinder: ignore */
621
622 // and try to find another
623 temp = strstr(cur, sep);
624 }
625
626 // If there's more than one entry in the log file, strip all but the last one.
627 if(cur != start)
628 {
629 mBuf.erase(0, cur - start);
630 }
631 }
632
633 mIsValid = TRUE;
634 delete[] buf;
635}
636
637LLString LLFileEncoder::encodeURL(const S32 max_length)
638{
639 LLString result = mFormname;
640 result.append("=");
641
642 S32 i = 0;
643
644 if (max_length)
645 {
646 if (mBuf.size() > max_length)
647 {
648 i = mBuf.size() - max_length;
649 }
650 }
651
652#if 0
653 // Plain text version for debugging
654 result.append(mBuf);
655#else
656 // Not using LLString because of bad performance issues
657 S32 buf_size = mBuf.size();
658 S32 url_buf_size = 3*mBuf.size() + 1;
659 char *url_buf = new char[url_buf_size];
660 if (url_buf == NULL)
661 {
662 llerrs << "Memory Allocation Failed" << llendl;
663 return result;
664 }
665 S32 cur_pos = 0;
666 for (; i < buf_size; i++)
667 {
668 sprintf(url_buf + cur_pos, "%%%02x", mBuf[i]); /* Flawfinder: ignore */
669 cur_pos += 3;
670 }
671 url_buf[i*3] = 0;
672
673 result.append(url_buf);
674 delete[] url_buf;
675#endif
676 return result;
677}
678
679LLString encode_string(const char *formname, const LLString &str)
680{
681 LLString result = formname;
682 result.append("=");
683 // Not using LLString because of bad performance issues
684 S32 buf_size = str.size();
685 S32 url_buf_size = 3*str.size() + 1;
686 char *url_buf = new char[url_buf_size];
687 if (url_buf == NULL)
688 {
689 llerrs << "Memory Allocation Failed" << llendl;
690 return result;
691 }
692
693 S32 cur_pos = 0;
694 S32 i;
695 for (i = 0; i < buf_size; i++)
696 {
697 sprintf(url_buf + cur_pos, "%%%02x", str[i]); /* Flawfinder: ignore */
698 cur_pos += 3;
699 }
700 url_buf[i*3] = 0;
701
702 result.append(url_buf);
703 delete[] url_buf;
704 return result;
705}
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/classes.nib b/linden/indra/mac_updater/AutoUpdater.nib/classes.nib
new file mode 100644
index 0000000..ea58db1
--- /dev/null
+++ b/linden/indra/mac_updater/AutoUpdater.nib/classes.nib
@@ -0,0 +1,4 @@
1{
2IBClasses = ();
3IBVersion = 1;
4}
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/info.nib b/linden/indra/mac_updater/AutoUpdater.nib/info.nib
new file mode 100644
index 0000000..a49a923
--- /dev/null
+++ b/linden/indra/mac_updater/AutoUpdater.nib/info.nib
@@ -0,0 +1,14 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3<plist version="1.0">
4<dict>
5 <key>IBDocumentLocation</key>
6 <string>103 138 356 240 0 0 1280 1002 </string>
7 <key>IBFramework Version</key>
8 <string>362.0</string>
9 <key>IBSystem Version</key>
10 <string>7D24</string>
11 <key>targetFramework</key>
12 <string>IBCarbonFramework</string>
13</dict>
14</plist>
diff --git a/linden/indra/mac_updater/AutoUpdater.nib/objects.xib b/linden/indra/mac_updater/AutoUpdater.nib/objects.xib
new file mode 100644
index 0000000..310411b
--- /dev/null
+++ b/linden/indra/mac_updater/AutoUpdater.nib/objects.xib
@@ -0,0 +1,56 @@
1<?xml version="1.0" standalone="yes"?>
2<object class="NSIBObjectData">
3 <string name="targetFramework">IBCarbonFramework</string>
4 <object name="rootObject" class="NSCustomObject" id="1">
5 <string name="customClass">NSApplication</string>
6 </object>
7 <array count="5" name="allObjects">
8 <object class="IBCarbonWindow" id="166">
9 <string name="windowRect">405 222 533 663 </string>
10 <string name="title">Second Life Updater</string>
11 <object name="rootControl" class="IBCarbonRootControl" id="167">
12 <string name="bounds">0 0 128 441 </string>
13 <array count="3" name="subviews">
14 <object class="IBCarbonStaticText" id="181">
15 <string name="bounds">20 20 44 421 </string>
16 <ostype name="controlSignature">what</ostype>
17 <string name="title">Initializing…</string>
18 </object>
19 <object class="IBCarbonButton" id="183">
20 <string name="bounds">88 351 108 421 </string>
21 <string name="title">Cancel</string>
22 <ostype name="command">not!</ostype>
23 <int name="buttonType">2</int>
24 </object>
25 <object class="IBCarbonProgressBar" id="193">
26 <string name="bounds">51 19 70 422 </string>
27 <ostype name="controlSignature">prog</ostype>
28 <int name="initialValue">50</int>
29 </object>
30 </array>
31 </object>
32 <boolean name="isResizable">FALSE</boolean>
33 <int name="carbonWindowClass">2</int>
34 <int name="themeBrush">3</int>
35 <int name="windowPosition">7</int>
36 </object>
37 <reference idRef="167"/>
38 <reference idRef="181"/>
39 <reference idRef="183"/>
40 <reference idRef="193"/>
41 </array>
42 <array count="5" name="allParents">
43 <reference idRef="1"/>
44 <reference idRef="166"/>
45 <reference idRef="167"/>
46 <reference idRef="167"/>
47 <reference idRef="167"/>
48 </array>
49 <dictionary count="2" name="nameTable">
50 <string>File&apos;s Owner</string>
51 <reference idRef="1"/>
52 <string>Updater</string>
53 <reference idRef="166"/>
54 </dictionary>
55 <unsigned_int name="nextObjectID">194</unsigned_int>
56</object>
diff --git a/linden/indra/newview/CrashReporter.nib/info.nib b/linden/indra/newview/CrashReporter.nib/info.nib
index 62e9cee..8eba931 100644
--- a/linden/indra/newview/CrashReporter.nib/info.nib
+++ b/linden/indra/newview/CrashReporter.nib/info.nib
@@ -3,11 +3,15 @@
3<plist version="1.0"> 3<plist version="1.0">
4<dict> 4<dict>
5 <key>IBDocumentLocation</key> 5 <key>IBDocumentLocation</key>
6 <string>508 20 476 367 0 0 1680 1028 </string> 6 <string>791 275 476 367 0 0 1600 1178 </string>
7 <key>IBFramework Version</key> 7 <key>IBFramework Version</key>
8 <string>446.1</string> 8 <string>446.1</string>
9 <key>IBOpenObjects</key>
10 <array>
11 <integer>166</integer>
12 </array>
9 <key>IBSystem Version</key> 13 <key>IBSystem Version</key>
10 <string>8L2127</string> 14 <string>8R2218</string>
11 <key>targetFramework</key> 15 <key>targetFramework</key>
12 <string>IBCarbonFramework</string> 16 <string>IBCarbonFramework</string>
13</dict> 17</dict>
diff --git a/linden/indra/newview/CrashReporter.nib/objects.xib b/linden/indra/newview/CrashReporter.nib/objects.xib
index 7ff2838..f62b8d5 100644
--- a/linden/indra/newview/CrashReporter.nib/objects.xib
+++ b/linden/indra/newview/CrashReporter.nib/objects.xib
@@ -4,33 +4,38 @@
4 <object name="rootObject" class="NSCustomObject" id="1"> 4 <object name="rootObject" class="NSCustomObject" id="1">
5 <string name="customClass">NSApplication</string> 5 <string name="customClass">NSApplication</string>
6 </object> 6 </object>
7 <array count="12" name="allObjects"> 7 <array count="7" name="allObjects">
8 <object class="IBCarbonWindow" id="166"> 8 <object class="IBCarbonWindow" id="166">
9 <string name="windowRect">123 251 577 758 </string> 9 <string name="windowRect">257 653 711 1160 </string>
10 <string name="title">Second Life Crash Logger</string> 10 <string name="title">Second Life Crash Logger</string>
11 <object name="rootControl" class="IBCarbonRootControl" id="167"> 11 <object name="rootControl" class="IBCarbonRootControl" id="167">
12 <string name="bounds">0 0 454 507 </string> 12 <string name="bounds">0 0 454 507 </string>
13 <array count="4" name="subviews"> 13 <array count="5" name="subviews">
14 <object class="IBCarbonStaticText" id="181"> 14 <object class="IBCarbonStaticText" id="181">
15 <string name="bounds">20 20 177 487 </string> 15 <string name="bounds">20 20 231 487 </string>
16 <string name="title">Second Life appears to have crashed.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string> 16 <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs, all of which are used for debugging purposes only.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;This report is NOT read by Customer Support. If you have billing or other questions, please go to: http://www.secondlife.com/support/&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
17 </object> 17 </object>
18 <object class="IBCarbonButton" id="182"> 18 <object class="IBCarbonButton" id="182">
19 <string name="bounds">414 417 434 487 </string> 19 <string name="bounds">414 273 434 378 </string>
20 <string name="title">OK</string> 20 <string name="title">Send Report</string>
21 <ostype name="command">ok </ostype> 21 <ostype name="command">ok </ostype>
22 </object> 22 </object>
23 <object class="IBCarbonButton" id="183"> 23 <object class="IBCarbonButton" id="183">
24 <string name="bounds">414 335 434 405 </string> 24 <string name="bounds">414 390 434 487 </string>
25 <string name="title">Cancel</string> 25 <string name="title">Don&apos;t Send</string>
26 <ostype name="command">not!</ostype> 26 <ostype name="command">not!</ostype>
27 <int name="buttonType">2</int> 27 <int name="buttonType">2</int>
28 </object> 28 </object>
29 <object class="IBCarbonEditText" id="185"> 29 <object class="IBCarbonEditText" id="185">
30 <string name="bounds">188 23 391 484 </string> 30 <string name="bounds">242 23 391 484 </string>
31 <ostype name="controlSignature">text</ostype> 31 <ostype name="controlSignature">text</ostype>
32 <boolean name="isUnicode">TRUE</boolean> 32 <boolean name="isUnicode">TRUE</boolean>
33 </object> 33 </object>
34 <object class="IBCarbonCheckBox" id="193">
35 <string name="bounds">415 20 433 186 </string>
36 <string name="title">Remember This Choice</string>
37 <ostype name="controlSignature">remb</ostype>
38 </object>
34 </array> 39 </array>
35 </object> 40 </object>
36 <int name="carbonWindowClass">2</int> 41 <int name="carbonWindowClass">2</int>
@@ -42,65 +47,22 @@
42 <reference idRef="182"/> 47 <reference idRef="182"/>
43 <reference idRef="183"/> 48 <reference idRef="183"/>
44 <reference idRef="185"/> 49 <reference idRef="185"/>
45 <object class="IBCarbonButton" id="187"> 50 <reference idRef="193"/>
46 <string name="bounds">414 335 434 405 </string>
47 <string name="title">Cancel</string>
48 <ostype name="command">not!</ostype>
49 <int name="buttonType">2</int>
50 </object>
51 <object class="IBCarbonButton" id="188">
52 <string name="bounds">414 417 434 487 </string>
53 <string name="title">OK</string>
54 <ostype name="command">ok </ostype>
55 </object>
56 <object class="IBCarbonEditText" id="189">
57 <string name="bounds">188 23 391 484 </string>
58 <ostype name="controlSignature">text</ostype>
59 <boolean name="isUnicode">TRUE</boolean>
60 </object>
61 <object class="IBCarbonWindow" id="190">
62 <string name="windowRect">104 65 558 572 </string>
63 <string name="title">Second Life Crash Logger</string>
64 <object name="rootControl" class="IBCarbonRootControl" id="192">
65 <string name="bounds">0 0 454 507 </string>
66 <array count="4" name="subviews">
67 <object class="IBCarbonStaticText" id="191">
68 <string name="bounds">20 20 177 487 </string>
69 <string name="title">Second Life appears to have crashed or frozen the last time it ran.&#10;&#10;This crash reporter collects information about your computer&apos;s hardware configuration, operating system, and some Second Life logs.&#10;&#10;In the space below, please briefly describe what you were doing or trying to do just prior to the crash. Thank you for your help!&#10;&#10;If you don&apos;t wish to send Linden Lab a crash report, press Cancel.&#10;</string>
70 </object>
71 <reference idRef="188"/>
72 <reference idRef="187"/>
73 <reference idRef="189"/>
74 </array>
75 </object>
76 <int name="carbonWindowClass">2</int>
77 <int name="themeBrush">3</int>
78 <int name="windowPosition">7</int>
79 </object>
80 <reference idRef="191"/>
81 <reference idRef="192"/>
82 </array> 51 </array>
83 <array count="12" name="allParents"> 52 <array count="7" name="allParents">
84 <reference idRef="1"/> 53 <reference idRef="1"/>
85 <reference idRef="166"/> 54 <reference idRef="166"/>
86 <reference idRef="167"/> 55 <reference idRef="167"/>
87 <reference idRef="167"/> 56 <reference idRef="167"/>
88 <reference idRef="167"/> 57 <reference idRef="167"/>
89 <reference idRef="167"/> 58 <reference idRef="167"/>
90 <reference idRef="192"/> 59 <reference idRef="167"/>
91 <reference idRef="192"/>
92 <reference idRef="192"/>
93 <reference idRef="1"/>
94 <reference idRef="192"/>
95 <reference idRef="190"/>
96 </array> 60 </array>
97 <dictionary count="3" name="nameTable"> 61 <dictionary count="2" name="nameTable">
98 <string>CrashReporter</string> 62 <string>CrashReporter</string>
99 <reference idRef="166"/> 63 <reference idRef="166"/>
100 <string>CrashReporterDelayed</string>
101 <reference idRef="190"/>
102 <string>File&apos;s Owner</string> 64 <string>File&apos;s Owner</string>
103 <reference idRef="1"/> 65 <reference idRef="1"/>
104 </dictionary> 66 </dictionary>
105 <unsigned_int name="nextObjectID">193</unsigned_int> 67 <unsigned_int name="nextObjectID">194</unsigned_int>
106</object> 68</object>
diff --git a/linden/indra/newview/English.lproj/InfoPlist.strings b/linden/indra/newview/English.lproj/InfoPlist.strings
index da89514..85f7e25 100644
--- a/linden/indra/newview/English.lproj/InfoPlist.strings
+++ b/linden/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
1/* Localized versions of Info.plist keys */ 1/* Localized versions of Info.plist keys */
2 2
3CFBundleName = "Second Life"; 3CFBundleName = "Second Life";
4CFBundleShortVersionString = "Second Life version 1.18.5.3"; 4CFBundleShortVersionString = "Second Life version 1.18.6.0";
5CFBundleGetInfoString = "Second Life version 1.18.5.3, Copyright 2004-2007 Linden Research, Inc."; 5CFBundleGetInfoString = "Second Life version 1.18.6.0, Copyright 2004-2007 Linden Research, Inc.";
diff --git a/linden/indra/newview/Info-SecondLife.plist b/linden/indra/newview/Info-SecondLife.plist
index 427651c..59822a1 100644
--- a/linden/indra/newview/Info-SecondLife.plist
+++ b/linden/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
32 </dict> 32 </dict>
33 </array> 33 </array>
34 <key>CFBundleVersion</key> 34 <key>CFBundleVersion</key>
35 <string>1.18.5.3</string> 35 <string>1.18.6.0</string>
36 <key>CSResourcesFileMapped</key> 36 <key>CSResourcesFileMapped</key>
37 <true/> 37 <true/>
38</dict> 38</dict>
diff --git a/linden/indra/newview/files.lst b/linden/indra/newview/files.lst
index fe864a3..a13abb7 100644
--- a/linden/indra/newview/files.lst
+++ b/linden/indra/newview/files.lst
@@ -3,6 +3,8 @@ newview/llagent.cpp
3newview/llagentdata.cpp 3newview/llagentdata.cpp
4newview/llagentpilot.cpp 4newview/llagentpilot.cpp
5newview/llanimalcontrols.cpp 5newview/llanimalcontrols.cpp
6newview/llappviewer.cpp
7newview/llappviewerlinux.cpp
6newview/llassetuploadresponders.cpp 8newview/llassetuploadresponders.cpp
7newview/llaudiosourcevo.cpp 9newview/llaudiosourcevo.cpp
8newview/llbbox.cpp 10newview/llbbox.cpp
@@ -269,9 +271,11 @@ newview/llurldispatcher.cpp
269newview/llurlsimstring.cpp 271newview/llurlsimstring.cpp
270newview/llurlwhitelist.cpp 272newview/llurlwhitelist.cpp
271newview/lluserauth.cpp 273newview/lluserauth.cpp
274newview/llvectorperfoptions.cpp
272newview/llvelocitybar.cpp 275newview/llvelocitybar.cpp
273newview/llviewchildren.cpp 276newview/llviewchildren.cpp
274newview/llviewerassetstorage.cpp 277newview/llviewerassetstorage.cpp
278newview/llvieweraudio.cpp
275newview/llviewercamera.cpp 279newview/llviewercamera.cpp
276newview/llviewercontrol.cpp 280newview/llviewercontrol.cpp
277newview/llviewerdisplay.cpp 281newview/llviewerdisplay.cpp
@@ -341,7 +345,6 @@ newview/llxmlrpctransaction.cpp
341newview/moviemaker.cpp 345newview/moviemaker.cpp
342newview/noise.cpp 346newview/noise.cpp
343newview/pipeline.cpp 347newview/pipeline.cpp
344newview/viewer.cpp
345newview/llremoteparcelrequest.cpp 348newview/llremoteparcelrequest.cpp
346newview/llfloaterurldisplay.cpp 349newview/llfloaterurldisplay.cpp
347newview/llfloaterevent.cpp 350newview/llfloaterevent.cpp
diff --git a/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh b/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh
new file mode 100755
index 0000000..7ff86d1
--- /dev/null
+++ b/linden/indra/newview/linux_tools/handle_secondlifeprotocol.sh
@@ -0,0 +1,17 @@
1#!/bin/bash
2
3# Send a URL of the form secondlife://... to Second Life.
4#
5
6URL="$1"
7
8if [ -z "$URL" ]; then
9 echo Usage: $0 secondlife://...
10 exit
11fi
12
13RUN_PATH=`dirname "$0" || echo .`
14cd "${RUN_PATH}"
15
16exec ./secondlife -url \'"${URL}"\'
17
diff --git a/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh b/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh
new file mode 100755
index 0000000..4ab96f9
--- /dev/null
+++ b/linden/indra/newview/linux_tools/register_secondlifeprotocol.sh
@@ -0,0 +1,46 @@
1#!/bin/bash
2
3# Register a protocol handler (default: handle_secondlifeprotocol.sh) for
4# URLs of the form secondlife://...
5#
6
7HANDLER="$1"
8
9RUN_PATH=`dirname "$0" || echo .`
10cd "${RUN_PATH}"
11
12if [ -z "$HANDLER" ]; then
13 HANDLER=`pwd`/handle_secondlifeprotocol.sh
14fi
15
16# Register handler for GNOME-aware apps
17LLGCONFTOOL2=gconftool-2
18if which ${LLGCONFTOOL2} >/dev/null; then
19 (${LLGCONFTOOL2} -s -t string /desktop/gnome/url-handlers/secondlife/command "${HANDLER} \"%s\"" && ${LLGCONFTOOL2} -s -t bool /desktop/gnome/url-handlers/secondlife/enabled true) || echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} failed.
20else
21 echo Warning: Did not register secondlife:// handler with GNOME: ${LLGCONFTOOL2} not found.
22fi
23
24# Register handler for KDE-aware apps
25if [ -z "$KDEHOME" ]; then
26 KDEHOME=~/.kde
27fi
28LLKDEPROTDIR=${KDEHOME}/share/services
29if [ -d "$LLKDEPROTDIR" ]; then
30 LLKDEPROTFILE=${LLKDEPROTDIR}/secondlife.protocol
31 cat > ${LLKDEPROTFILE} <<EOF || echo Warning: Did not register secondlife:// handler with KDE: Could not write ${LLKDEPROTFILE}
32[Protocol]
33exec=${HANDLER} '%u'
34protocol=secondlife
35input=none
36output=none
37helper=true
38listing=
39reading=false
40writing=false
41makedir=false
42deleting=false
43EOF
44else
45 echo Warning: Did not register secondlife:// handler with KDE: Directory $LLKDEPROTDIR does not exist.
46fi
diff --git a/linden/indra/newview/linux_tools/wrapper.sh b/linden/indra/newview/linux_tools/wrapper.sh
index 10041ee..638a0f0 100755
--- a/linden/indra/newview/linux_tools/wrapper.sh
+++ b/linden/indra/newview/linux_tools/wrapper.sh
@@ -61,6 +61,10 @@ fi
61 61
62RUN_PATH=`dirname "$0" || echo .` 62RUN_PATH=`dirname "$0" || echo .`
63cd "${RUN_PATH}" 63cd "${RUN_PATH}"
64
65# Re-register the secondlife:// protocol handler every launch, for now.
66./register_secondlifeprotocol.sh
67
64if [ -n "$LL_TCMALLOC" ]; then 68if [ -n "$LL_TCMALLOC" ]; then
65 tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0' 69 tcmalloc_libs='/usr/lib/libtcmalloc.so.0 /usr/lib/libstacktrace.so.0 /lib/libpthread.so.0'
66 all=1 70 all=1
diff --git a/linden/indra/newview/llagent.cpp b/linden/indra/newview/llagent.cpp
index 8b49d54..39d4a3f 100644
--- a/linden/indra/newview/llagent.cpp
+++ b/linden/indra/newview/llagent.cpp
@@ -112,6 +112,7 @@
112#include "llviewerregion.h" 112#include "llviewerregion.h"
113#include "llviewerstats.h" 113#include "llviewerstats.h"
114#include "llviewerwindow.h" 114#include "llviewerwindow.h"
115#include "llviewerdisplay.h"
115#include "llvoavatar.h" 116#include "llvoavatar.h"
116#include "llvoground.h" 117#include "llvoground.h"
117#include "llvosky.h" 118#include "llvosky.h"
@@ -121,7 +122,8 @@
121#include "llworldmap.h" 122#include "llworldmap.h"
122#include "pipeline.h" 123#include "pipeline.h"
123#include "roles_constants.h" 124#include "roles_constants.h"
124#include "viewer.h" 125#include "llviewercontrol.h"
126#include "llappviewer.h"
125#include "llvoiceclient.h" 127#include "llvoiceclient.h"
126 128
127// Ventrella 129// Ventrella
@@ -130,7 +132,6 @@
130 132
131extern LLMenuBarGL* gMenuBarView; 133extern LLMenuBarGL* gMenuBarView;
132extern U8 gLastPickAlpha; 134extern U8 gLastPickAlpha;
133extern F32 gFrameDTClamped;
134 135
135//drone wandering constants 136//drone wandering constants
136const F32 MAX_WANDER_TIME = 20.f; // seconds 137const F32 MAX_WANDER_TIME = 20.f; // seconds
@@ -222,6 +223,9 @@ const LLUUID BAKED_TEXTURE_HASH[BAKED_TEXTURE_COUNT] =
222 LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a") 223 LLUUID("ea800387-ea1a-14e0-56cb-24f2022f969a")
223}; 224};
224 225
226// The agent instance.
227LLAgent gAgent;
228
225// 229//
226// Statics 230// Statics
227// 231//
@@ -523,6 +527,21 @@ void LLAgent::resetView(BOOL reset_camera)
523 } 527 }
524} 528}
525 529
530// Handle any actions that need to be performed when the main app gains focus
531// (such as through alt-tab).
532//-----------------------------------------------------------------------------
533// onAppFocusGained()
534//-----------------------------------------------------------------------------
535void LLAgent::onAppFocusGained()
536{
537 if (CAMERA_MODE_MOUSELOOK == mCameraMode)
538 {
539 changeCameraToDefault();
540 gToolMgr->clearSavedTool();
541 }
542}
543
544
526void LLAgent::ageChat() 545void LLAgent::ageChat()
527{ 546{
528 if (mAvatarObject) 547 if (mAvatarObject)
@@ -2545,8 +2564,8 @@ void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y)
2545 LLVector3 headLookAxis; 2564 LLVector3 headLookAxis;
2546 LLCoordFrame frameCamera = *((LLCoordFrame*)gCamera); 2565 LLCoordFrame frameCamera = *((LLCoordFrame*)gCamera);
2547 2566
2548 F32 x_from_center = mouse_x_from_center( mouse_x ); // range from -0.5 to 0.5 2567 F32 x_from_center = ((F32) mouse_x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f;
2549 F32 y_from_center = mouse_y_from_center( mouse_y ); // range from -0.5 to 0.5 2568 F32 y_from_center = ((F32) mouse_y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f;
2550 2569
2551 if (cameraMouselook()) 2570 if (cameraMouselook())
2552 { 2571 {
@@ -2811,7 +2830,7 @@ void LLAgent::endAnimationUpdateUI()
2811 2830
2812 // HACK: If we're quitting, and we were in customize avatar, don't 2831 // HACK: If we're quitting, and we were in customize avatar, don't
2813 // let the mini-map go visible again. JC 2832 // let the mini-map go visible again. JC
2814 if (!gQuitRequested) 2833 if (!LLAppViewer::instance()->quitRequested())
2815 { 2834 {
2816 gFloaterMap->popVisible(); 2835 gFloaterMap->popVisible();
2817 } 2836 }
@@ -5836,7 +5855,7 @@ void LLAgent::requestEnterGodMode()
5836 msg->addBOOLFast(_PREHASH_Godlike, TRUE); 5855 msg->addBOOLFast(_PREHASH_Godlike, TRUE);
5837 msg->addUUIDFast(_PREHASH_Token, LLUUID::null); 5856 msg->addUUIDFast(_PREHASH_Token, LLUUID::null);
5838 5857
5839 // simulator and userserver need to know about your request 5858 // simulators need to know about your request
5840 sendReliableMessage(); 5859 sendReliableMessage();
5841} 5860}
5842 5861
@@ -5851,7 +5870,7 @@ void LLAgent::requestLeaveGodMode()
5851 msg->addBOOLFast(_PREHASH_Godlike, FALSE); 5870 msg->addBOOLFast(_PREHASH_Godlike, FALSE);
5852 msg->addUUIDFast(_PREHASH_Token, LLUUID::null); 5871 msg->addUUIDFast(_PREHASH_Token, LLUUID::null);
5853 5872
5854 // simulator and userserver need to know about your request 5873 // simulator needs to know about your request
5855 sendReliableMessage(); 5874 sendReliableMessage();
5856} 5875}
5857 5876
diff --git a/linden/indra/newview/llagent.h b/linden/indra/newview/llagent.h
index ad0606a..c6de97f 100644
--- a/linden/indra/newview/llagent.h
+++ b/linden/indra/newview/llagent.h
@@ -141,6 +141,8 @@ public:
141 // default position behind the avatar. 141 // default position behind the avatar.
142 void unlockView(); 142 void unlockView();
143 143
144 void onAppFocusGained();
145
144 void sendMessage(); // Send message to this agent's region. 146 void sendMessage(); // Send message to this agent's region.
145 void sendReliableMessage(); 147 void sendReliableMessage();
146 148
diff --git a/linden/indra/newview/llagentpilot.cpp b/linden/indra/newview/llagentpilot.cpp
index 9637c54..f0bd452 100644
--- a/linden/indra/newview/llagentpilot.cpp
+++ b/linden/indra/newview/llagentpilot.cpp
@@ -38,7 +38,7 @@
38#include "llagentpilot.h" 38#include "llagentpilot.h"
39#include "llagent.h" 39#include "llagent.h"
40#include "llframestats.h" 40#include "llframestats.h"
41#include "viewer.h" 41#include "llappviewer.h"
42#include "llviewercontrol.h" 42#include "llviewercontrol.h"
43 43
44LLAgentPilot gAgentPilot; 44LLAgentPilot gAgentPilot;
@@ -221,7 +221,7 @@ void LLAgentPilot::updateTarget()
221 else if (mQuitAfterRuns) 221 else if (mQuitAfterRuns)
222 { 222 {
223 llinfos << "Done with all runs, quitting viewer!" << llendl; 223 llinfos << "Done with all runs, quitting viewer!" << llendl;
224 app_force_quit(NULL); 224 LLAppViewer::instance()->forceQuit();
225 } 225 }
226 else 226 else
227 { 227 {
diff --git a/linden/indra/newview/llappviewer.cpp b/linden/indra/newview/llappviewer.cpp
new file mode 100644
index 0000000..45eaaa9
--- /dev/null
+++ b/linden/indra/newview/llappviewer.cpp
@@ -0,0 +1,3894 @@
1/**
2 * @file llappviewer.cpp
3 * @brief The LLAppViewer class definitions
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32
33#include "llviewerprecompiledheaders.h"
34#include "llappviewer.h"
35
36#include "llversionviewer.h"
37#include "llfeaturemanager.h"
38#include "llvieweruictrlfactory.h"
39#include "llalertdialog.h"
40#include "llerrorcontrol.h"
41#include "llviewerimagelist.h"
42#include "llgroupmgr.h"
43#include "llagent.h"
44#include "llwindow.h"
45#include "llviewerstats.h"
46#include "llmd5.h"
47#include "llpumpio.h"
48#include "llfloateractivespeakers.h"
49#include "llimpanel.h"
50#include "llstartup.h"
51#include "llfocusmgr.h"
52#include "llviewerjoystick.h"
53#include "llcurl.h"
54#include "llfloatersnapshot.h"
55#include "llviewerwindow.h"
56#include "llviewerdisplay.h"
57#include "llviewermessage.h"
58#include "llviewerobjectlist.h"
59#include "llworldmap.h"
60#include "llmutelist.h"
61#include "llurldispatcher.h"
62
63#include "llweb.h"
64#include "llsecondlifeurls.h"
65
66#if LL_WINDOWS
67 #include "llwindebug.h"
68#endif
69
70#if LL_WINDOWS
71# include <share.h> // For _SH_DENYWR in initMarkerFile
72#else
73# include <sys/file.h> // For initMarkerFile support
74#endif
75
76
77
78#include "llnotify.h"
79#include "llmediaengine.h"
80#include "llviewerkeyboard.h"
81#include "lllfsthread.h"
82#include "llworkerthread.h"
83#include "lltexturecache.h"
84#include "lltexturefetch.h"
85#include "llimageworker.h"
86
87// The files below handle dependencies from cleanup.
88#include "llkeyframemotion.h"
89#include "llworldmap.h"
90#include "llhudmanager.h"
91#include "lltoolmgr.h"
92#include "llassetstorage.h"
93#include "llpolymesh.h"
94#include "lleconomy.h"
95#include "llcachename.h"
96#include "audioengine.h"
97#include "llviewermenu.h"
98#include "llselectmgr.h"
99#include "lltracker.h"
100#include "llmozlib.h"
101#include "llviewerparcelmgr.h"
102#include "llworldmapview.h"
103
104#include "lldebugview.h"
105#include "llconsole.h"
106#include "llcontainerview.h"
107#include "llhoverview.h"
108
109#include "llsdserialize.h"
110
111#include "llworld.h"
112#include "llhudeffecttrail.h"
113#include "llvectorperfoptions.h"
114#include "llurlsimstring.h"
115
116// Included so that constants/settings might be initialized
117// in save_settings_to_globals()
118#include "llbutton.h"
119#include "llcombobox.h"
120#include "llstatusbar.h"
121#include "llsurface.h"
122#include "llvosky.h"
123#include "llvotree.h"
124#include "llvoavatar.h"
125#include "llfolderview.h"
126#include "lltoolbar.h"
127#include "llframestats.h"
128#include "llagentpilot.h"
129#include "llsrv.h"
130
131// includes for idle() idleShutdown()
132#include "llviewercontrol.h"
133#include "lleventnotifier.h"
134#include "llcallbacklist.h"
135#include "pipeline.h"
136#include "llgesturemgr.h"
137#include "llsky.h"
138#include "llvlmanager.h"
139#include "llviewercamera.h"
140#include "lldrawpoolbump.h"
141#include "llvieweraudio.h"
142#include "llimview.h"
143#include "llviewerthrottle.h"
144//
145
146#include "llinventoryview.h"
147
148// *FIX: Remove these once the command line params thing is figured out.
149// Yuck!
150static int gTempArgC = 0;
151static char** gTempArgV;
152
153// *FIX: These extern globals should be cleaned up.
154// The globals either represent state/config/resource-storage of either
155// this app, or another 'component' of the viewer. App globals should be
156// moved into the app class, where as the other globals should be
157// moved out of here.
158// If a global symbol reference seems valid, it will be included
159// via header files above.
160
161//----------------------------------------------------------------------------
162// llviewernetwork.h
163#include "llviewernetwork.h"
164// extern EGridInfo gGridChoice;
165
166
167////// Windows-specific includes to the bottom - nasty defines in these pollute the preprocessor
168//
169#if LL_WINDOWS && LL_LCD_COMPILE
170 #include "lllcd.h"
171#endif
172//
173#if LL_QUICKTIME_ENABLED
174 #if LL_DARWIN
175 #include <QuickTime/QuickTime.h>
176 #else
177 // quicktime specific includes
178 #include "MacTypes.h"
179 #include "QTML.h"
180 #include "Movies.h"
181 #include "FixMath.h"
182 #endif
183#endif
184//
185//////
186
187
188//----------------------------------------------------------------------------
189// viewer.cpp - these are only used in viewer, should be easily moved.
190extern void disable_win_error_reporting();
191
192//#define APPLE_PREVIEW // Define this if you're doing a preview build on the Mac
193#if LL_RELEASE_FOR_DOWNLOAD
194// Default userserver for production builds is agni
195#ifndef APPLE_PREVIEW
196static EGridInfo GridDefaultChoice = GRID_INFO_AGNI;
197#else
198static EGridInfo GridDefaultChoice = GRID_INFO_ADITI;
199#endif
200#else
201// Default userserver for development builds is dmz
202static EGridInfo GridDefaultChoice = GRID_INFO_DMZ;
203#endif
204
205#if LL_WINDOWS
206extern void create_console();
207#endif
208
209
210#if LL_DARWIN
211#include <Carbon/Carbon.h>
212extern void init_apple_menu(const char* product);
213extern OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
214extern OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
215extern OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata);
216extern OSStatus DisplayReleaseNotes(void);
217#include <boost/tokenizer.hpp>
218#endif // LL_DARWIN
219
220
221#include "moviemaker.h"
222extern BOOL gbCapturing;
223
224#if !LL_SOLARIS
225 extern MovieMaker gMovieMaker;
226#endif
227
228extern BOOL gRandomizeFramerate;
229extern BOOL gPeriodicSlowFrame;
230
231#if LL_GSTREAMER_ENABLED
232void UnloadGStreamer();
233#endif
234
235////////////////////////////////////////////////////////////
236// All from the last globals push...
237bool gVerifySSLCert = true;
238BOOL gHandleKeysAsync = FALSE;
239
240BOOL gProbeHardware = TRUE; // Use DirectX 9 to probe for hardware
241
242S32 gYieldMS = 0; // set in parse_args, used in mainLoop
243BOOL gYieldTime = FALSE;
244
245const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard
246
247F32 gSimLastTime; // Used in LLAppViewer::init and send_stats()
248F32 gSimFrames;
249
250LLString gDisabledMessage; // Set in LLAppViewer::initConfiguration used in idle_startup
251
252BOOL gHideLinks = FALSE; // Set in LLAppViewer::initConfiguration, used externally
253
254BOOL gInProductionGrid = FALSE;
255
256BOOL gAllowIdleAFK = TRUE;
257F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT;
258BOOL gShowObjectUpdates = FALSE;
259BOOL gLogMessages = FALSE;
260std::string gChannelName = LL_CHANNEL;
261BOOL gUseAudio = TRUE;
262LLString gCmdLineFirstName;
263LLString gCmdLineLastName;
264LLString gCmdLinePassword;
265
266BOOL gAutoLogin = FALSE;
267
268const char* DEFAULT_SETTINGS_FILE = "settings.xml";
269BOOL gRequestInventoryLibrary = TRUE;
270BOOL gGodConnect = FALSE;
271BOOL gAcceptTOS = FALSE;
272BOOL gAcceptCriticalMessage = FALSE;
273
274LLUUID gViewerDigest; // MD5 digest of the viewer's executable file.
275BOOL gLastExecFroze = FALSE;
276
277LLSD gDebugInfo;
278
279U32 gFrameCount = 0;
280U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground
281LLPumpIO* gServicePump = NULL;
282
283BOOL gPacificDaylightTime = FALSE;
284
285U64 gFrameTime = 0;
286F32 gFrameTimeSeconds = 0.f;
287F32 gFrameIntervalSeconds = 0.f;
288F32 gFPSClamped = 10.f; // Pretend we start at target rate.
289F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets
290U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds
291
292LLTimer gRenderStartTime;
293LLFrameTimer gForegroundTime;
294LLTimer gLogoutTimer;
295static const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg.
296F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
297
298LLUUID gInventoryLibraryOwner;
299LLUUID gInventoryLibraryRoot;
300
301BOOL gDisableVoice = FALSE;
302BOOL gDisconnected = FALSE;
303
304// Map scale in pixels per region
305F32 gMapScale = 128.f;
306F32 gMiniMapScale = 128.f;
307
308// used to restore texture state after a mode switch
309LLFrameTimer gRestoreGLTimer;
310BOOL gRestoreGL = FALSE;
311BOOL gUseWireframe = FALSE;
312
313F32 gMouseSensitivity = 3.f;
314BOOL gInvertMouse = FALSE;
315
316// VFS globals - see llappviewer.h
317LLVFS* gStaticVFS = NULL;
318
319LLMemoryInfo gSysMemory;
320
321bool gPreloadImages = true;
322bool gPreloadSounds = true;
323
324LLString gLastVersionChannel;
325
326LLVector3 gWindVec(3.0, 3.0, 0.0);
327LLVector3 gRelativeWindVec(0.0, 0.0, 0.0);
328
329U32 gPacketsIn = 0;
330
331BOOL gPrintMessagesThisFrame = FALSE;
332
333BOOL gUseConsole = TRUE;
334
335BOOL gRandomizeFramerate = FALSE;
336BOOL gPeriodicSlowFrame = FALSE;
337
338BOOL gQAMode = FALSE;
339
340////////////////////////////////////////////////////////////
341// Internal globals... that should be removed.
342static F32 gQuitAfterSeconds = 0.f;
343static BOOL gRotateRight = FALSE;
344static BOOL gIgnorePixelDepth = FALSE;
345
346// Allow multiple viewers in ReleaseForDownload
347#if LL_RELEASE_FOR_DOWNLOAD
348static BOOL gMultipleViewersOK = FALSE;
349#else
350static BOOL gMultipleViewersOK = TRUE;
351#endif
352
353static std::map<std::string, std::string> gCommandLineSettings;
354static std::map<std::string, std::string> gCommandLineForcedSettings;
355
356static LLString gArgs;
357
358static LLString gOldSettingsFileName;
359static const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini";
360static BOOL gDoDisconnect = FALSE;
361static LLString gLaunchFileOnQuit;
362
363//----------------------------------------------------------------------------
364// File scope definitons
365const char *VFS_DATA_FILE_BASE = "data.db2.x.";
366const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
367
368static LLString gSecondLife;
369static LLString gWindowTitle;
370#ifdef LL_WINDOWS
371 static char sWindowClass[] = "Second Life";
372#endif
373
374std::vector<std::string> gLoginURIs;
375static std::string gHelperURI;
376
377static const char USAGE[] = "\n"
378"usage:\tviewer [options]\n"
379"options:\n"
380" -login <first> <last> <password> log in as a user\n"
381" -autologin log in as last saved user\n"
382" -loginuri <URI> login server and CGI script to use\n"
383" -helperuri <URI> helper web CGI prefix to use\n"
384" -settings <filename> specify the filename of a\n"
385" configuration file\n"
386" default is settings.xml\n"
387" -setdefault <variable> <value> specify the value of a particular\n"
388" configuration variable which can be\n"
389" overridden by settings.xml\n"
390" -set <variable> <value> specify the value of a particular\n"
391" configuration variable that\n"
392" overrides all other settings\n"
393" -user <user_server_ip> specify userserver in dotted quad\n"
394#if !LL_RELEASE_FOR_DOWNLOAD
395" -sim <simulator_ip> specify the simulator ip address\n"
396#endif
397" -god log in as god if you have god access\n"
398" -purge delete files in cache\n"
399" -safe reset preferences, run in safe mode\n"
400" -noutc logs in local time, not UTC\n"
401" -nothread run vfs in single thread\n"
402" -noinvlib Do not request inventory library\n"
403" -multiple allow multiple viewers\n"
404" -nomultiple block multiple viewers\n"
405" -novoice disable voice\n"
406" -ignorepixeldepth ignore pixel depth settings\n"
407" -cooperative [ms] yield some idle time to local host\n"
408" -skin ui/branding skin folder to use\n"
409#if LL_WINDOWS
410" -noprobe disable hardware probe\n"
411#endif
412" -noquicktime disable QuickTime movies, speeds startup\n"
413" -nopreload don't preload UI images or sounds, speeds startup\n"
414// these seem to be unused
415//" -noenv turn off environmental effects\n"
416//" -proxy <proxy_ip> specify the proxy ip address\n"
417"\n";
418
419void idle_afk_check()
420{
421 // check idle timers
422 if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout))
423 {
424 gAgent.setAFK();
425 }
426}
427
428// A callback set in LLAppViewer::init()
429static void ui_audio_callback(const LLUUID& uuid)
430{
431 if (gAudiop)
432 {
433 F32 volume = gSavedSettings.getF32("AudioLevelUI");
434 gAudiop->triggerSound(uuid, gAgent.getID(), volume);
435 }
436}
437
438void request_initial_instant_messages()
439{
440 static BOOL requested = FALSE;
441 if (!requested
442 && gMuteListp
443 && gMuteListp->isLoaded()
444 && gAgent.getAvatarObject())
445 {
446 // Auto-accepted inventory items may require the avatar object
447 // to build a correct name. Likewise, inventory offers from
448 // muted avatars require the mute list to properly mute.
449 LLMessageSystem* msg = gMessageSystem;
450 msg->newMessageFast(_PREHASH_RetrieveInstantMessages);
451 msg->nextBlockFast(_PREHASH_AgentData);
452 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
453 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
454 gAgent.sendReliableMessage();
455 requested = TRUE;
456 }
457}
458
459// Use these strictly for things that are constructed at startup,
460// or for things that are performance critical. JC
461static void saved_settings_to_globals()
462{
463 LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad");
464 LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad");
465 BTN_HEIGHT_SMALL = gSavedSettings.getS32("ButtonHeightSmall");
466 BTN_HEIGHT = gSavedSettings.getS32("ButtonHeight");
467
468 MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight");
469 MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth");
470 STATUS_BAR_HEIGHT = gSavedSettings.getS32("StatusBarHeight");
471
472 LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2;
473 LLCOMBOBOX_WIDTH = 128;
474
475 LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize"));
476
477 LLVOSky::sNighttimeBrightness = gSavedSettings.getF32("RenderNightBrightness");
478
479 LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic");
480 LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor");
481 LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
482 LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
483 LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
484 LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
485 LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");
486 LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
487 // clamp auto-open time to some minimum usable value
488 LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
489 LLToolBar::sInventoryAutoOpenTime = gSavedSettings.getF32("InventoryAutoOpenDelay");
490 LLSelectMgr::sRectSelectInclusive = gSavedSettings.getBOOL("RectangleSelectInclusive");
491 LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
492 LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
493
494 gFrameStats.setTrackStats(gSavedSettings.getBOOL("StatsSessionTrackFrameStats"));
495 gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns");
496 gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns");
497 gAgent.mHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle");
498
499 gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
500 gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK");
501 gAFKTimeout = gSavedSettings.getF32("AFKTimeout");
502 gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity");
503 gInvertMouse = gSavedSettings.getBOOL("InvertMouse");
504 gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
505 gMapScale = gSavedSettings.getF32("MapScale");
506 gMiniMapScale = gSavedSettings.getF32("MiniMapScale");
507 gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard");
508 LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips");
509
510#if LL_VECTORIZE
511 if (gSysCPU.hasAltivec())
512 {
513 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
514 gSavedSettings.setU32("VectorizeProcessor", 0 );
515 }
516 else
517 if (gSysCPU.hasSSE2())
518 {
519 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
520 gSavedSettings.setU32("VectorizeProcessor", 2 );
521 }
522 else
523 if (gSysCPU.hasSSE())
524 {
525 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
526 gSavedSettings.setU32("VectorizeProcessor", 1 );
527 }
528 else
529 {
530 // Don't bother testing or running if CPU doesn't support it. JC
531 gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
532 gSavedSettings.setBOOL("VectorizeEnable", FALSE );
533 gSavedSettings.setU32("VectorizeProcessor", 0 );
534 gSavedSettings.setBOOL("VectorizeSkin", FALSE);
535 }
536#else
537 // This build target doesn't support SSE, don't test/run.
538 gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
539 gSavedSettings.setBOOL("VectorizeEnable", FALSE );
540 gSavedSettings.setU32("VectorizeProcessor", 0 );
541 gSavedSettings.setBOOL("VectorizeSkin", FALSE);
542#endif
543
544 // propagate push to talk preference to current status
545 gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk"));
546
547 settings_setup_listeners();
548
549 // gAgent.init() also loads from saved settings.
550}
551
552int parse_args(int argc, char **argv)
553{
554 // Sometimes IP addresses passed in on the command line have leading
555 // or trailing white space. Use LLString to clean that up.
556 LLString ip_string;
557 S32 j;
558
559 for (j = 1; j < argc; j++)
560 {
561 gArgs += argv[j];
562 gArgs += " ";
563
564 LLString argument = argv[j];
565 if ((!strcmp(argv[j], "-port")) && (++j < argc))
566 {
567 sscanf(argv[j], "%u", &(gAgent.mViewerPort));
568 }
569 else if ((!strcmp(argv[j], "-drop")) && (++j < argc))
570 {
571 sscanf(argv[j], "%f", &gPacketDropPercentage);
572 }
573 else if ((!strcmp(argv[j], "-inbw")) && (++j < argc))
574 {
575 sscanf(argv[j], "%f", &gInBandwidth);
576 }
577 else if ((!strcmp(argv[j], "-outbw")) && (++j < argc))
578 {
579 sscanf(argv[j], "%f", &gOutBandwidth);
580 }
581 else if (!strcmp(argv[j], "--aditi"))
582 {
583 gGridChoice = GRID_INFO_ADITI;
584 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
585 }
586 else if (!strcmp(argv[j], "--agni"))
587 {
588 gGridChoice = GRID_INFO_AGNI;
589 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
590 }
591 else if (!strcmp(argv[j], "--dmz"))
592 {
593 gGridChoice = GRID_INFO_DMZ;
594 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
595 }
596 else if (!strcmp(argv[j], "--siva"))
597 {
598 gGridChoice = GRID_INFO_SIVA;
599 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
600 }
601 else if (!strcmp(argv[j], "--shakti"))
602 {
603 gGridChoice = GRID_INFO_SHAKTI;
604 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
605 }
606 else if (!strcmp(argv[j], "--durga"))
607 {
608 gGridChoice = GRID_INFO_DURGA;
609 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
610 }
611 else if (!strcmp(argv[j], "--soma"))
612 {
613 gGridChoice = GRID_INFO_SOMA;
614 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); // Flawfinder: ignore
615 }
616 else if (!strcmp(argv[j], "--ganga"))
617 {
618 gGridChoice = GRID_INFO_GANGA;
619 sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
620 }
621 else if (!strcmp(argv[j], "--vaak"))
622 {
623 gGridChoice = GRID_INFO_VAAK;
624 sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
625 }
626 else if (!strcmp(argv[j], "--uma"))
627 {
628 gGridChoice = GRID_INFO_UMA;
629 sprintf(gGridName,"%s", gGridInfo[gGridChoice].mName);
630 }
631 else if (!strcmp(argv[j], "-user") && (++j < argc))
632 {
633 if (!strcmp(argv[j], "-"))
634 {
635 gGridChoice = GRID_INFO_LOCAL;
636 snprintf(gGridName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); // Flawfinder: ignore
637 }
638 else
639 {
640 gGridChoice = GRID_INFO_OTHER;
641 ip_string.assign( argv[j] );
642 LLString::trim(ip_string);
643 snprintf(gGridName, MAX_STRING, "%s", ip_string.c_str()); // Flawfinder: ignore
644 }
645 }
646 else if (!strcmp(argv[j], "-loginuri") && (++j < argc))
647 {
648 LLAppViewer::instance()->addLoginURI(utf8str_trim(argv[j]));
649 }
650 else if (!strcmp(argv[j], "-helperuri") && (++j < argc))
651 {
652 LLAppViewer::instance()->setHelperURI(utf8str_trim(argv[j]));
653 }
654 else if (!strcmp(argv[j], "-debugviews"))
655 {
656 LLView::sDebugRects = TRUE;
657 }
658 else if (!strcmp(argv[j], "-skin") && (++j < argc))
659 {
660 std::string folder(argv[j]);
661 gDirUtilp->setSkinFolder(folder);
662 }
663 else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility
664 {
665 gAutoLogin = TRUE;
666 }
667 else if (!strcmp(argv[j], "-quitafter") && (++j < argc))
668 {
669 gQuitAfterSeconds = (F32)atof(argv[j]);
670 }
671 else if (!strcmp(argv[j], "-rotate"))
672 {
673 gRotateRight = TRUE;
674 }
675// else if (!strcmp(argv[j], "-noenv"))
676// {
677 //turn OFF environmental effects for slow machines/video cards
678// gRequestParaboloidMap = FALSE;
679// }
680 else if (!strcmp(argv[j], "-noaudio"))
681 {
682 gUseAudio = FALSE;
683 }
684 else if (!strcmp(argv[j], "-nosound")) // tends to be popular cmdline on Linux.
685 {
686 gUseAudio = FALSE;
687 }
688 else if (!strcmp(argv[j], "-noprobe"))
689 {
690 gProbeHardware = FALSE;
691 }
692 else if (!strcmp(argv[j], "-noquicktime"))
693 {
694 // Developers can log in faster if they don't load all the
695 // quicktime dlls.
696 gUseQuickTime = false;
697 }
698 else if (!strcmp(argv[j], "-nopreload"))
699 {
700 // Developers can log in faster if they don't decode sounds
701 // or images on startup, ~5 seconds faster.
702 gPreloadSounds = false;
703 gPreloadImages = false;
704 }
705 else if (!strcmp(argv[j], "-purge"))
706 {
707 LLAppViewer::instance()->purgeCache();
708 }
709 else if(!strcmp(argv[j], "-noinvlib"))
710 {
711 gRequestInventoryLibrary = FALSE;
712 }
713 else if (!strcmp(argv[j], "-log"))
714 {
715 gLogMessages = TRUE;
716 continue;
717 }
718 else if (!strcmp(argv[j], "-logfile") && (++j < argc))
719 {
720 // *NOTE: This buffer size is hard coded into scanf() below.
721 char logfile[256]; // Flawfinder: ignore
722 sscanf(argv[j], "%255s", logfile); // Flawfinder: ignore
723 llinfos << "Setting log file to " << logfile << llendl;
724 LLFile::remove(logfile);
725 LLError::logToFile(logfile);
726 }
727 else if (!strcmp(argv[j], "-settings") && (++j < argc))
728 {
729 gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]);
730 }
731 else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc))
732 {
733 std::string control_name;
734 std::string control_value;
735
736 j++;
737 if (argv[j]) control_name = std::string(argv[j]);
738
739 j++;
740 if (argv[j]) control_value = std::string(argv[j]);
741
742 // grab control name and value
743 if (!control_name.empty())
744 {
745 gCommandLineSettings[control_name] = control_value;
746 }
747 }
748 else if (!strcmp(argv[j], "-set") && (j + 2 < argc))
749 {
750 std::string control_name;
751 std::string control_value;
752
753 j++;
754 if (argv[j]) control_name = std::string(argv[j]);
755
756 j++;
757 if (argv[j]) control_value = std::string(argv[j]);
758
759 // grab control name and value
760 if (!control_name.empty())
761 {
762 gCommandLineForcedSettings[control_name] = control_value;
763 }
764 }
765 else if (!strcmp(argv[j], "-login"))
766 {
767 if (j + 3 < argc)
768 {
769 j++;
770 gCmdLineFirstName = argv[j];
771 j++;
772 gCmdLineLastName = argv[j];
773 j++;
774 gCmdLinePassword = argv[j];
775 }
776 else
777 {
778 // only works if -login is last parameter on command line
779 llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl;
780 }
781 }
782 else if (!strcmp(argv[j], "-god"))
783 {
784 gGodConnect = TRUE;
785 }
786 else if (!strcmp(argv[j], "-noconsole"))
787 {
788 gUseConsole = FALSE;
789 }
790 else if (!strcmp(argv[j], "-safe"))
791 {
792 llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl;
793 gFeatureManagerp->setSafe(TRUE);
794 }
795 else if (!strcmp(argv[j], "-multiple"))
796 {
797 gMultipleViewersOK = TRUE;
798 }
799 else if (!strcmp(argv[j], "-nomultiple"))
800 {
801 gMultipleViewersOK = FALSE;
802 }
803 else if (!strcmp(argv[j], "-novoice"))
804 {
805 gDisableVoice = TRUE;
806 }
807 else if (!strcmp(argv[j], "-nothread"))
808 {
809 LLVFile::ALLOW_ASYNC = FALSE;
810 llinfos << "Running VFS in nothread mode" << llendl;
811 }
812 // some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera)
813 // so this allows us to parse the URL straight off the command line without a "-url" paramater
814 else if (LLURLDispatcher::isSLURL(argv[j])
815 || !strcmp(argv[j], "-url") && (++j < argc))
816 {
817 std::string slurl = argv[j];
818 if (LLURLDispatcher::isSLURLCommand(slurl))
819 {
820 LLStartUp::sSLURLCommand = slurl;
821 }
822 else
823 {
824 LLURLSimString::setString(slurl);
825 }
826 // *NOTE: After setting the url, bail. What can happen is
827 // that someone can use IE (or potentially other browsers)
828 // and do the rough equivalent of command injection and
829 // steal passwords. Phoenix. SL-55321
830 }
831 else if (!strcmp(argv[j], "-ignorepixeldepth"))
832 {
833 gIgnorePixelDepth = TRUE;
834 }
835 else if (!strcmp(argv[j], "-cooperative"))
836 {
837 S32 ms_to_yield = 0;
838 if(++j < argc)
839 {
840 S32 rv = sscanf(argv[j], "%d", &ms_to_yield);
841 if(0 == rv)
842 {
843 --j;
844 }
845 }
846 else
847 {
848 --j;
849 }
850 gYieldMS = ms_to_yield;
851 gYieldTime = TRUE;
852 }
853 else if (!strcmp(argv[j], "-no-verify-ssl-cert"))
854 {
855 gVerifySSLCert = false;
856 }
857 else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel")) && (++j < argc))
858 {
859 gChannelName = argv[j];
860 }
861#if LL_DARWIN
862 else if (!strncmp(argv[j], "-psn_", 5))
863 {
864 // this is the Finder passing the process session number
865 // we ignore this
866 }
867#endif
868 else if(!strncmp(argv[j], "-qa", 3))
869 {
870 gQAMode = TRUE;
871 }
872 else
873 {
874
875 // DBC - Mac OS X passes some stuff by default on the command line (e.g. psn).
876 // Second Life URLs are passed this way as well?
877 llwarns << "Possible unknown keyword " << argv[j] << llendl;
878
879 // print usage information
880 llinfos << USAGE << llendl;
881 // return 1;
882 }
883 }
884 return 0;
885}
886
887bool send_url_to_other_instance(const std::string& url)
888{
889#if LL_WINDOWS
890 wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars.
891 mbstowcs(window_class, sWindowClass, 255);
892 window_class[255] = 0;
893 // Use the class instead of the window name.
894 HWND other_window = FindWindow(window_class, NULL);
895 if (other_window != NULL)
896 {
897 lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl;
898 COPYDATASTRUCT cds;
899 const S32 SLURL_MESSAGE_TYPE = 0;
900 cds.dwData = SLURL_MESSAGE_TYPE;
901 cds.cbData = url.length() + 1;
902 cds.lpData = (void*)url.c_str();
903
904 LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
905 lldebugs << "SendMessage(WM_COPYDATA) to other window '"
906 << gWindowTitle << "' returned " << msg_result << llendl;
907 return true;
908 }
909#endif
910 return false;
911}
912
913//----------------------------------------------------------------------------
914// LLAppViewer definition
915
916// Static members.
917// The single viewer app.
918LLAppViewer* LLAppViewer::sInstance = NULL;
919
920LLTextureCache* LLAppViewer::sTextureCache = NULL;
921LLWorkerThread* LLAppViewer::sImageDecodeThread = NULL;
922LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
923
924LLAppViewer::LLAppViewer() :
925 mMarkerFile(NULL),
926 mLastExecFroze(false),
927 mCrashBehavior(CRASH_BEHAVIOR_ASK),
928 mReportedCrash(false),
929 mNumSessions(0),
930 mPurgeCache(false),
931 mPurgeOnExit(false),
932 mSecondInstance(false),
933 mSavedFinalSnapshot(false),
934 mQuitRequested(false),
935 mLogoutRequestSent(false)
936{
937 if(NULL != sInstance)
938 {
939 llerrs << "Oh no! An instance of LLAppViewer already exists! LLAppViewer is sort of like a singleton." << llendl;
940 }
941
942 sInstance = this;
943}
944
945LLAppViewer::~LLAppViewer()
946{
947 // If we got to this destructor somehow, the app didn't hang.
948 removeMarkerFile();
949}
950
951bool LLAppViewer::tempStoreCommandOptions(int argc, char** argv)
952{
953 gTempArgC = argc;
954 gTempArgV = argv;
955 return true;
956}
957
958bool LLAppViewer::init()
959{
960 // *NOTE:Mani - LLCurl::initClass is not thread safe.
961 // Called before threads are created.
962 LLCurl::initClass();
963
964 initThreads();
965
966 initEarlyConfiguration();
967
968 //
969 // Start of the application
970 //
971 // IMPORTANT! Do NOT put anything that will write
972 // into the log files during normal startup until AFTER
973 // we run the "program crashed last time" error handler below.
974 //
975
976 // Need to do this initialization before we do anything else, since anything
977 // that touches files should really go through the lldir API
978 gDirUtilp->initAppDirs("SecondLife");
979
980
981 initLogging();
982
983 //
984 // OK to write stuff to logs now, we've now crash reported if necessary
985 //
986
987 // Set up some defaults...
988 gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE);
989 gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE);
990
991 if (!initConfiguration())
992 return false;
993
994 //////////////////////////////////////////////////////////////////////////////
995 //////////////////////////////////////////////////////////////////////////////
996 //////////////////////////////////////////////////////////////////////////////
997 //////////////////////////////////////////////////////////////////////////////
998 // *FIX: The following code isn't grouped into functions yet.
999
1000 //
1001 // Write system information into the debug log (CPU, OS, etc.)
1002 //
1003 writeSystemInfo();
1004
1005 // Build a string representing the current version number.
1006 gCurrentVersion = llformat("%d.%d.%d", LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH );
1007
1008 //
1009 // Load the feature tables
1010 //
1011 llinfos << "Loading feature tables." << llendl;
1012
1013 gFeatureManagerp->loadFeatureTables();
1014 gFeatureManagerp->initCPUFeatureMasks();
1015
1016 // Merge with the command line overrides
1017 gSavedSettings.applyOverrides(gCommandLineSettings);
1018
1019 // Need to do this before calling parseAlerts
1020 gUICtrlFactory = new LLViewerUICtrlFactory();
1021
1022 // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/)
1023 // Do this *before* loading the settings file
1024 LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE);
1025
1026 // Overwrite default settings with user settings
1027 llinfos << "Loading configuration file " << gSettingsFileName << llendl;
1028 if (0 == gSavedSettings.loadFromFile(gSettingsFileName))
1029 {
1030 llinfos << "Failed to load settings from " << gSettingsFileName << llendl;
1031 llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl;
1032 gSavedSettings.loadFromFileLegacy(gOldSettingsFileName);
1033 }
1034
1035 // need to do this here - need to have initialized global settings first
1036 LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
1037 if ( nextLoginLocation.length() )
1038 {
1039 LLURLSimString::setString( nextLoginLocation.c_str() );
1040 };
1041
1042 // Merge with the command line overrides
1043 gSavedSettings.applyOverrides(gCommandLineForcedSettings);
1044
1045 gLastRunVersion = gSavedSettings.getString("LastRunVersion");
1046
1047 fixup_settings();
1048
1049 // Get the single value from the crash settings file, if it exists
1050 std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
1051 gCrashSettings.loadFromFile(crash_settings_filename.c_str());
1052
1053 /////////////////////////////////////////////////
1054 // OS-specific login dialogs
1055 /////////////////////////////////////////////////
1056#if LL_WINDOWS
1057 /*
1058 // Display initial login screen, comes up quickly. JC
1059 {
1060 LLSplashScreen::hide();
1061
1062 INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func);
1063 if (result < 0)
1064 {
1065 llwarns << "Connect dialog box failed, returned " << result << llendl;
1066 return 1;
1067 }
1068 // success, result contains which button user clicked
1069 llinfos << "Connect dialog box clicked " << result << llendl;
1070
1071 LLSplashScreen::show();
1072 }
1073 */
1074#endif
1075
1076 // track number of times that app has run
1077 mNumSessions = gSavedSettings.getS32("NumSessions");
1078 mNumSessions++;
1079 gSavedSettings.setS32("NumSessions", mNumSessions);
1080
1081 gSavedSettings.setString("HelpLastVisitedURL",gSavedSettings.getString("HelpHomeURL"));
1082
1083 if (gSavedSettings.getBOOL("VerboseLogs"))
1084 {
1085 LLError::setPrintLocation(true);
1086 }
1087
1088#if !LL_RELEASE_FOR_DOWNLOAD
1089 if (gGridChoice == GRID_INFO_NONE)
1090 {
1091 // Development version: load last server choice by default (overridden by cmd line args)
1092
1093 S32 server = gSavedSettings.getS32("ServerChoice");
1094 if (server != 0)
1095 gGridChoice = (EGridInfo)llclamp(server, 0, (S32)GRID_INFO_COUNT - 1);
1096 if (server == GRID_INFO_OTHER)
1097 {
1098 LLString custom_server = gSavedSettings.getString("CustomServer");
1099 if (custom_server.empty())
1100 {
1101 snprintf(gGridName, MAX_STRING, "none"); /* Flawfinder: ignore */
1102 }
1103 else
1104 {
1105 snprintf(gGridName, MAX_STRING, "%s", custom_server.c_str()); /* Flawfinder: ignore */
1106 }
1107 }
1108 }
1109#endif
1110
1111 if (gGridChoice == GRID_INFO_NONE)
1112 {
1113 gGridChoice = GridDefaultChoice;
1114 }
1115
1116 // Load art UUID information, don't require these strings to be declared in code.
1117 LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml");
1118 llinfos << "Loading art table from " << viewer_art_filename << llendl;
1119 gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE);
1120 LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml");
1121 llinfos << "Loading art table from " << textures_filename << llendl;
1122 gViewerArt.loadFromFile(textures_filename.c_str(), FALSE);
1123
1124 LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");
1125 llinfos << "Loading base colors from " << colors_base_filename << llendl;
1126 gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U);
1127
1128 // Load overrides from user colors file
1129 LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");
1130 llinfos << "Loading user colors from " << user_colors_filename << llendl;
1131 if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0)
1132 {
1133 llinfos << "Failed to load user colors from " << user_colors_filename << llendl;
1134 LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini");
1135 llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl;
1136 gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U);
1137 }
1138
1139 // Widget construction depends on LLUI being initialized
1140 LLUI::initClass(&gSavedSettings,
1141 &gColors,
1142 &gViewerArt,
1143 &gImageList,
1144 ui_audio_callback,
1145 &LLUI::sGLScaleFactor);
1146
1147 LLWeb::initClass(); // do this after LLUI
1148 gUICtrlFactory->setupPaths(); // update paths with correct language set
1149
1150 /////////////////////////////////////////////////
1151 //
1152 // Load settings files
1153 //
1154 //
1155 LLGroupMgr::parseRoleActions("role_actions.xml");
1156
1157 LLAgent::parseTeleportMessages("teleport_strings.xml");
1158
1159 mCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
1160
1161 LLVectorPerformanceOptions::initClass();
1162
1163 // Move certain saved settings into global variables for speed
1164 saved_settings_to_globals();
1165
1166
1167 // Find partition serial number (Windows) or hardware serial (Mac)
1168 mSerialNumber = generateSerialNumber();
1169
1170 if(false == initHardwareTest())
1171 {
1172 // Early out from user choice.
1173 return false;
1174 }
1175
1176 // Always fetch the Ethernet MAC address, needed both for login
1177 // and password load.
1178 LLUUID::getNodeID(gMACAddress);
1179
1180 // Prepare for out-of-memory situations, during which we will crash on
1181 // purpose and save a dump.
1182#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
1183 MemSetErrorHandler(first_mem_error_handler);
1184#endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
1185
1186 gViewerStats = new LLViewerStats();
1187
1188 //
1189 // Initialize the VFS, and gracefully handle initialization errors
1190 //
1191
1192 if (!initCache())
1193 {
1194 std::ostringstream msg;
1195 msg <<
1196 gSecondLife << " is unable to access a file that it needs.\n"
1197 "\n"
1198 "This can be because you somehow have multiple copies running, "
1199 "or your system incorrectly thinks a file is open. "
1200 "If this message persists, restart your computer and try again. "
1201 "If it continues to persist, you may need to completely uninstall " <<
1202 gSecondLife << " and reinstall it.";
1203 OSMessageBox(
1204 msg.str().c_str(),
1205 NULL,
1206 OSMB_OK);
1207 return 1;
1208 }
1209
1210#if LL_DARWIN
1211 // Display the release notes for the current version
1212 if(!gHideLinks && gCurrentVersion != gLastRunVersion)
1213 {
1214 // Current version and last run version don't match exactly. Display the release notes.
1215 DisplayReleaseNotes();
1216 }
1217#endif
1218
1219 //
1220 // Initialize the window
1221 //
1222 initWindow();
1223
1224 #if LL_WINDOWS && LL_LCD_COMPILE
1225 // start up an LCD window on a logitech keyboard, if there is one
1226 HINSTANCE hInstance = GetModuleHandle(NULL);
1227 gLcdScreen = new llLCD(hInstance);
1228 CreateLCDDebugWindows();
1229 #endif
1230
1231 gGLManager.getGLInfo(gDebugInfo);
1232 llinfos << gGLManager.getGLInfoString() << llendl;
1233
1234 //load key settings
1235 bind_keyboard_functions();
1236
1237 // Load Default bindings
1238 if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini").c_str()))
1239 {
1240 llerrs << "Unable to open keys.ini" << llendl;
1241 }
1242 // Load Custom bindings (override defaults)
1243 gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini").c_str());
1244
1245 // Calculate the digest for the executable (takes < 90ms on a fast machine).
1246 FILE* app_file = LLFile::fopen( gDirUtilp->getExecutablePathAndName().c_str(), "rb" ); /* Flawfinder: ignore */
1247 if( app_file )
1248 {
1249 LLMD5 app_md5;
1250 app_md5.update( app_file ); // Automatically closes the file
1251 app_md5.finalize();
1252 app_md5.raw_digest( gViewerDigest.mData );
1253 }
1254 llinfos << "Viewer Digest: " << gViewerDigest << llendl;
1255
1256 // If we don't have the right GL requirements, exit.
1257 // BUG: This should just be changed to a generic GL "Not good enough" flag
1258 if (!gGLManager.mHasMultitexture && !gNoRender)
1259 {
1260 std::ostringstream msg;
1261 msg <<
1262 "You do not appear to have the proper hardware requirements "
1263 "for " << gSecondLife << ". " << gSecondLife << " requires an OpenGL graphics "
1264 "card that has multitexture support. If this is the case, "
1265 "you may want to make sure that you have the latest drivers for "
1266 "your graphics card, and service packs and patches for your "
1267 "operating system.\n"
1268 "If you continue to have problems, please go to: "
1269 "www.secondlife.com/support ";
1270 OSMessageBox(
1271 msg.str().c_str(),
1272 NULL,
1273 OSMB_OK);
1274 return 0;
1275 }
1276
1277 // Save the current version to the prefs file
1278 gSavedSettings.setString("LastRunVersion", gCurrentVersion);
1279
1280 gSimLastTime = gRenderStartTime.getElapsedTimeF32();
1281 gSimFrames = (F32)gFrameCount;
1282
1283 return true;
1284}
1285
1286bool LLAppViewer::mainLoop()
1287{
1288 //-------------------------------------------
1289 // Run main loop until time to quit
1290 //-------------------------------------------
1291
1292 // Create IO Pump to use for HTTP Requests.
1293 gServicePump = new LLPumpIO(gAPRPoolp);
1294 LLHTTPClient::setPump(*gServicePump);
1295 LLHTTPClient::setCABundle(gDirUtilp->getCAFile());
1296
1297 // initialize voice stuff here
1298 gLocalSpeakerMgr = new LLLocalSpeakerMgr();
1299 gActiveChannelSpeakerMgr = new LLActiveSpeakerMgr();
1300
1301 LLVoiceChannel::initClass();
1302 LLVoiceClient::init(gServicePump);
1303
1304 LLMemType mt1(LLMemType::MTYPE_MAIN);
1305 LLTimer frameTimer,idleTimer;
1306 LLTimer debugTime;
1307
1308 // Handle messages
1309 while (!LLApp::isExiting())
1310 {
1311 LLFastTimer::reset(); // Should be outside of any timer instances
1312 {
1313 LLFastTimer t(LLFastTimer::FTM_FRAME);
1314
1315 {
1316 LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
1317 #if LL_WINDOWS
1318 if (!LLWinDebug::setupExceptionHandler())
1319 {
1320 llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl;
1321 }
1322 #endif
1323
1324 gViewerWindow->mWindow->gatherInput();
1325 }
1326
1327#if 1 && !RELEASE_FOR_DOWNLOAD
1328 // once per second debug info
1329 if (debugTime.getElapsedTimeF32() > 1.f)
1330 {
1331 debugTime.reset();
1332 }
1333#endif
1334 if (!LLApp::isExiting())
1335 {
1336 // Scan keyboard for movement keys. Command keys and typing
1337 // are handled by windows callbacks. Don't do this until we're
1338 // done initializing. JC
1339 if (gViewerWindow->mWindow->getVisible()
1340 && gViewerWindow->getActive()
1341 && !gViewerWindow->mWindow->getMinimized()
1342 && LLStartUp::getStartupState() == STATE_STARTED
1343 && !gViewerWindow->getShowProgress()
1344 && !gFocusMgr.focusLocked())
1345 {
1346 gKeyboard->scanKeyboard();
1347 LLViewerJoystick::scanJoystick();
1348 }
1349
1350 // Update state based on messages, user input, object idle.
1351 {
1352 LLFastTimer t3(LLFastTimer::FTM_IDLE);
1353 idle();
1354 LLCurl::process();
1355 // this pump is necessary to make the login screen show up
1356 gServicePump->pump();
1357 gServicePump->callback();
1358 }
1359
1360 if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED))
1361 {
1362 saveFinalSnapshot();
1363 disconnectViewer();
1364 }
1365
1366 // Render scene.
1367 if (!LLApp::isExiting())
1368 {
1369 display();
1370
1371 LLFloaterSnapshot::update(); // take snapshots
1372
1373#if !LL_SOLARIS
1374 if (gbCapturing)
1375 {
1376 gMovieMaker.Snap();
1377 }
1378#endif
1379#if LL_WINDOWS && LL_LCD_COMPILE
1380 // update LCD Screen
1381 gLcdScreen->UpdateDisplay();
1382#endif
1383 }
1384
1385 }
1386
1387 // Sleep and run background threads
1388 {
1389 LLFastTimer t2(LLFastTimer::FTM_SLEEP);
1390 bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads");
1391
1392 // yield some time to the os based on command line option
1393 if(gYieldTime)
1394 {
1395 ms_sleep(gYieldMS);
1396 }
1397
1398 // yield cooperatively when not running as foreground window
1399 if ( gNoRender
1400 || !gViewerWindow->mWindow->getVisible()
1401 || !gFocusMgr.getAppHasFocus())
1402 {
1403 // Sleep if we're not rendering, or the window is minimized.
1404 S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000);
1405 // don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads
1406 // of equal priority on Windows
1407 if (milliseconds_to_sleep > 0)
1408 {
1409 ms_sleep(milliseconds_to_sleep);
1410 // also pause worker threads during this wait period
1411 LLAppViewer::getTextureCache()->pause();
1412 LLAppViewer::getImageDecodeThread()->pause();
1413 }
1414 }
1415
1416 if (gRandomizeFramerate)
1417 {
1418 ms_sleep(rand() % 200);
1419 }
1420
1421 if (gPeriodicSlowFrame
1422 && (gFrameCount % 10 == 0))
1423 {
1424 llinfos << "Periodic slow frame - sleeping 500 ms" << llendl;
1425 ms_sleep(500);
1426 }
1427
1428
1429 const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps
1430 const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms
1431 const F64 max_idle_time = run_multiple_threads ? min_idle_time : .005; // 5 ms
1432 idleTimer.reset();
1433 while(1)
1434 {
1435 S32 work_pending = 0;
1436 S32 io_pending = 0;
1437 work_pending += LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
1438 work_pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
1439 work_pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
1440 io_pending += LLVFSThread::updateClass(1);
1441 io_pending += LLLFSThread::updateClass(1);
1442 if (io_pending > 1000)
1443 {
1444 ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up
1445 }
1446
1447 F64 frame_time = frameTimer.getElapsedTimeF64();
1448 F64 idle_time = idleTimer.getElapsedTimeF64();
1449 if (frame_time >= min_frame_time &&
1450 idle_time >= min_idle_time &&
1451 (!work_pending || idle_time >= max_idle_time))
1452 {
1453 break;
1454 }
1455 }
1456 frameTimer.reset();
1457
1458 // Prevent the worker threads from running while rendering.
1459 // if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client...
1460 if (run_multiple_threads == FALSE)
1461 {
1462 LLAppViewer::getTextureCache()->pause();
1463 LLAppViewer::getImageDecodeThread()->pause();
1464 // LLAppViewer::getTextureFetch()->pause(); // Don't pause the fetch (IO) thread
1465 }
1466 //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering.
1467 //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering.
1468 }
1469
1470 }
1471 }
1472
1473 // Save snapshot for next time, if we made it through initialization
1474 if (STATE_STARTED == LLStartUp::getStartupState())
1475 {
1476 saveFinalSnapshot();
1477 }
1478
1479 delete gServicePump;
1480
1481 llinfos << "Exiting main_loop" << llendflush;
1482
1483 return true;
1484}
1485
1486bool LLAppViewer::cleanup()
1487{
1488 //flag all elements as needing to be destroyed immediately
1489 // to ensure shutdown order
1490 LLMortician::setZealous(TRUE);
1491
1492 LLVoiceClient::terminate();
1493
1494 disconnectViewer();
1495
1496 llinfos << "Viewer disconnected" << llendflush;
1497
1498 display_cleanup();
1499
1500 release_start_screen(); // just in case
1501
1502 LLError::logToFixedBuffer(NULL);
1503
1504 llinfos << "Cleaning Up" << llendflush;
1505
1506 LLKeyframeDataCache::clear();
1507
1508 // Must clean up texture references before viewer window is destroyed.
1509 LLHUDObject::cleanupHUDObjects();
1510 llinfos << "HUD Objects cleaned up" << llendflush;
1511
1512 // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage)
1513#if 0 // this seems to get us stuck in an infinite loop...
1514 gTransferManager.cleanup();
1515#endif
1516
1517 // Clean up map data storage
1518 delete gWorldMap;
1519 gWorldMap = NULL;
1520
1521 delete gHUDManager;
1522 gHUDManager = NULL;
1523
1524 delete gToolMgr;
1525 gToolMgr = NULL;
1526
1527 delete gAssetStorage;
1528 gAssetStorage = NULL;
1529
1530 LLPolyMesh::freeAllMeshes();
1531
1532 delete gCacheName;
1533 gCacheName = NULL;
1534
1535 delete gGlobalEconomy;
1536 gGlobalEconomy = NULL;
1537
1538 delete gLocalSpeakerMgr;
1539 gLocalSpeakerMgr = NULL;
1540
1541 LLNotifyBox::cleanup();
1542
1543 llinfos << "Global stuff deleted" << llendflush;
1544
1545#if !LL_RELEASE_FOR_DOWNLOAD
1546 if (gAudiop)
1547 {
1548 gAudiop->shutdown();
1549 }
1550#else
1551 // This hack exists because fmod likes to occasionally hang forever
1552 // when shutting down for no apparent reason.
1553 llwarns << "Hack, skipping audio engine cleanup" << llendflush;
1554#endif
1555
1556
1557 // moved to main application shutdown for now because it's non-trivial and only needs to be done once
1558 // (even though it goes against the media framework design)
1559
1560 LLMediaEngine::cleanupClass();
1561
1562#if LL_QUICKTIME_ENABLED
1563 if (gQuickTimeInitialized)
1564 {
1565 // clean up media stuff
1566 llinfos << "Cleaning up QuickTime" << llendl;
1567 ExitMovies ();
1568 #if LL_WINDOWS
1569 // Only necessary/available on Windows.
1570 TerminateQTML ();
1571 #endif
1572 }
1573 llinfos << "Quicktime cleaned up" << llendflush;
1574#endif
1575
1576#if LL_GSTREAMER_ENABLED
1577 llinfos << "Cleaning up GStreamer" << llendl;
1578 UnloadGStreamer();
1579 llinfos << "GStreamer cleaned up" << llendflush;
1580#endif
1581
1582 llinfos << "Cleaning up feature manager" << llendflush;
1583 delete gFeatureManagerp;
1584 gFeatureManagerp = NULL;
1585
1586 // Patch up settings for next time
1587 // Must do this before we delete the viewer window,
1588 // such that we can suck rectangle information out of
1589 // it.
1590 cleanupSavedSettings();
1591 llinfos << "Settings patched up" << llendflush;
1592
1593 delete gAudiop;
1594 gAudiop = NULL;
1595
1596 // delete some of the files left around in the cache.
1597 removeCacheFiles("*.wav");
1598 removeCacheFiles("*.tmp");
1599 removeCacheFiles("*.lso");
1600 removeCacheFiles("*.out");
1601 removeCacheFiles("*.dsf");
1602 removeCacheFiles("*.bodypart");
1603 removeCacheFiles("*.clothing");
1604
1605 llinfos << "Cache files removed" << llendflush;
1606
1607
1608 cleanup_menus();
1609
1610 // Wait for any pending VFS IO
1611 while (1)
1612 {
1613 S32 pending = LLVFSThread::updateClass(0);
1614 pending += LLLFSThread::updateClass(0);
1615 if (!pending)
1616 {
1617 break;
1618 }
1619 llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
1620 ms_sleep(100);
1621 }
1622 llinfos << "Shutting down." << llendflush;
1623
1624 // Destroy Windows(R) window, and make sure we're not fullscreen
1625 // This may generate window reshape and activation events.
1626 // Therefore must do this before destroying the message system.
1627 delete gViewerWindow;
1628 gViewerWindow = NULL;
1629 llinfos << "ViewerWindow deleted" << llendflush;
1630
1631 // viewer UI relies on keyboard so keep it aound until viewer UI isa gone
1632 delete gKeyboard;
1633 gKeyboard = NULL;
1634
1635 // Clean up selection managers after UI is destroyed, as UI
1636 // may be observing them.
1637 LLSelectMgr::cleanupGlobals();
1638
1639 LLViewerObject::cleanupVOClasses();
1640
1641 LLTracker::cleanupInstance();
1642
1643#if LL_LIBXUL_ENABLED
1644 // this must be done after floater cleanup (delete gViewerWindow) since
1645 // floaters potentially need the manager to destroy their contents.
1646 LLMozLib::getInstance()->reset();
1647#endif
1648
1649 // *FIX: This is handled in LLAppViewerWin32::cleanup().
1650 // I'm keeping the comment to remember its order in cleanup,
1651 // in case of unforseen dependency.
1652//#if LL_WINDOWS
1653// gDXHardware.cleanup();
1654//#endif // LL_WINDOWS
1655
1656#if LL_WINDOWS && LL_LCD_COMPILE
1657 // shut down the LCD window on a logitech keyboard, if there is one
1658 delete gLcdScreen;
1659 gLcdScreen = NULL;
1660#endif
1661
1662 if (!gVolumeMgr->cleanup())
1663 {
1664 llwarns << "Remaining references in the volume manager!" << llendflush;
1665 }
1666
1667 LLViewerParcelMgr::cleanupGlobals();
1668
1669 delete gViewerStats;
1670 gViewerStats = NULL;
1671
1672 //end_messaging_system();
1673
1674 LLFollowCamMgr::cleanupClass();
1675 LLVolumeMgr::cleanupClass();
1676 LLWorldMapView::cleanupClass();
1677 LLUI::cleanupClass();
1678
1679 //
1680 // Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles).
1681 // Also after viewerwindow is deleted, since it may have image pointers (which have vfiles)
1682 // Also after shutting down the messaging system since it has VFS dependencies
1683 //
1684 LLVFile::cleanupClass();
1685 llinfos << "VFS cleaned up" << llendflush;
1686
1687 // Store the time of our current logoff
1688 gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
1689
1690 // Must do this after all panels have been deleted because panels that have persistent rects
1691 // save their rects on delete.
1692 gSavedSettings.saveToFile(gSettingsFileName, TRUE);
1693 if (!gPerAccountSettingsFileName.empty())
1694 {
1695 gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE);
1696 }
1697 llinfos << "Saved settings" << llendflush;
1698
1699 std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
1700 // save all settings, even if equals defaults
1701 gCrashSettings.saveToFile(crash_settings_filename.c_str(), FALSE);
1702
1703 delete gUICtrlFactory;
1704 gUICtrlFactory = NULL;
1705
1706 gSavedSettings.cleanup();
1707 gViewerArt.cleanup();
1708 gColors.cleanup();
1709 gCrashSettings.cleanup();
1710
1711 if (gMuteListp)
1712 {
1713 // save mute list
1714 gMuteListp->cache(gAgent.getID());
1715
1716 delete gMuteListp;
1717 gMuteListp = NULL;
1718 }
1719
1720 if (mPurgeOnExit)
1721 {
1722 llinfos << "Purging all cache files on exit" << llendflush;
1723 char mask[LL_MAX_PATH]; /* Flawfinder: ignore */
1724 snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); /* Flawfinder: ignore */
1725 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask);
1726 }
1727
1728 removeMarkerFile(); // Any crashes from here on we'll just have to ignore
1729
1730 closeDebug();
1731
1732 // Let threads finish
1733 LLTimer idleTimer;
1734 idleTimer.reset();
1735 const F64 max_idle_time = 5.f; // 5 seconds
1736 while(1)
1737 {
1738 S32 pending = 0;
1739 pending += LLAppViewer::getTextureCache()->update(1); // unpauses the worker thread
1740 pending += LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
1741 pending += LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
1742 pending += LLVFSThread::updateClass(0);
1743 pending += LLLFSThread::updateClass(0);
1744 F64 idle_time = idleTimer.getElapsedTimeF64();
1745 if (!pending || idle_time >= max_idle_time)
1746 {
1747 llwarns << "Quitting with pending background tasks." << llendl;
1748 break;
1749 }
1750 }
1751
1752 // Delete workers first
1753 // shotdown all worker threads before deleting them in case of co-dependencies
1754 sTextureCache->shutdown();
1755 sTextureFetch->shutdown();
1756 sImageDecodeThread->shutdown();
1757 delete sTextureCache;
1758 sTextureCache = NULL;
1759 delete sTextureFetch;
1760 sTextureFetch = NULL;
1761 delete sImageDecodeThread;
1762 sImageDecodeThread = NULL;
1763
1764 gImageList.shutdown(); // shutdown again in case a callback added something
1765
1766 // This should eventually be done in LLAppViewer
1767 LLImageJ2C::closeDSO();
1768 LLImageFormatted::cleanupClass();
1769 LLVFSThread::cleanupClass();
1770 LLLFSThread::cleanupClass();
1771
1772 llinfos << "VFS Thread finished" << llendflush;
1773
1774#ifndef LL_RELEASE_FOR_DOWNLOAD
1775 llinfos << "Auditing VFS" << llendl;
1776 gVFS->audit();
1777#endif
1778
1779 // For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
1780 // (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
1781 delete gStaticVFS;
1782 gStaticVFS = NULL;
1783 delete gVFS;
1784 gVFS = NULL;
1785
1786 end_messaging_system();
1787
1788 // *NOTE:Mani - The following call is not thread safe.
1789 LLCurl::cleanup();
1790
1791 // If we're exiting to launch an URL, do that here so the screen
1792 // is at the right resolution before we launch IE.
1793 if (!gLaunchFileOnQuit.empty())
1794 {
1795#if LL_WINDOWS
1796 // Indicate an application is starting.
1797 SetCursor(LoadCursor(NULL, IDC_WAIT));
1798#endif
1799
1800 // HACK: Attempt to wait until the screen res. switch is complete.
1801 ms_sleep(1000);
1802
1803 LLWeb::loadURLExternal( gLaunchFileOnQuit );
1804 }
1805
1806
1807 llinfos << "Goodbye" << llendflush;
1808 // return 0;
1809 return true;
1810}
1811
1812bool LLAppViewer::initEarlyConfiguration()
1813{
1814 // *FIX: globals - This method sets a bunch of globals early in the init process.
1815 int argc = gTempArgC;
1816 char** argv = gTempArgV;
1817
1818 // HACK! We REALLY want to know what grid they were trying to connect to if they
1819 // crashed hard.
1820 // So we walk through the command line args ONLY looking for the
1821 // userserver arguments first. And we don't do ANYTHING but set
1822 // the gGridName (which gets passed to the crash reporter).
1823 // We're assuming that they're trying to log into the same grid as last
1824 // time, which seems fairly reasonable.
1825 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GridDefaultChoice].mName); // Flawfinder: ignore
1826 S32 j;
1827 for (j = 1; j < argc; j++)
1828 {
1829 if (!strcmp(argv[j], "--aditi"))
1830 {
1831 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_ADITI].mName); // Flawfinder: ignore
1832 }
1833 else if (!strcmp(argv[j], "--agni"))
1834 {
1835 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_AGNI].mName); // Flawfinder: ignore
1836 }
1837 else if (!strcmp(argv[j], "--dmz"))
1838 {
1839 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DMZ].mName); // Flawfinder: ignore
1840 }
1841 else if (!strcmp(argv[j], "--siva"))
1842 {
1843 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SIVA].mName); // Flawfinder: ignore
1844 }
1845 else if (!strcmp(argv[j], "--shakti"))
1846 {
1847 sprintf(gGridName,"%s", gGridInfo[GRID_INFO_SHAKTI].mName);
1848 }
1849 else if (!strcmp(argv[j], "--durga"))
1850 {
1851 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_DURGA].mName); // Flawfinder: ignore
1852 }
1853 else if (!strcmp(argv[j], "--soma"))
1854 {
1855 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_SOMA].mName); // Flawfinder: ignore
1856 }
1857 else if (!strcmp(argv[j], "--ganga"))
1858 {
1859 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[GRID_INFO_GANGA].mName); // Flawfinder: ignore
1860 }
1861 else if (!strcmp(argv[j], "--vaak"))
1862 {
1863 sprintf(gGridName,"%s", gGridInfo[GRID_INFO_VAAK].mName);
1864 }
1865 else if (!strcmp(argv[j], "--uma"))
1866 {
1867 sprintf(gGridName,"%s", gGridInfo[GRID_INFO_UMA].mName);
1868 }
1869 else if (!strcmp(argv[j], "-user") && (++j < argc))
1870 {
1871 if (!strcmp(argv[j], "-"))
1872 {
1873 snprintf(gGridName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); // Flawfinder: ignore
1874 }
1875 else
1876 {
1877 snprintf(gGridName, MAX_STRING, "%s", argv[j]); // Flawfinder: ignore
1878 }
1879 }
1880 else if (!strcmp(argv[j], "-multiple"))
1881 {
1882 // Hack to detect -multiple so we can disable the marker file check (which will always fail)
1883 gMultipleViewersOK = TRUE;
1884 }
1885 else if (!strcmp(argv[j], "-novoice"))
1886 {
1887 // May need to know this early also
1888 gDisableVoice = TRUE;
1889 }
1890 else if (!strcmp(argv[j], "-url") && (++j < argc))
1891 {
1892 LLURLSimString::setString(argv[j]);
1893 }
1894 }
1895
1896 return true;
1897}
1898
1899bool LLAppViewer::initThreads()
1900{
1901#if MEM_TRACK_MEM
1902 static const bool enable_threads = false;
1903#else
1904 static const bool enable_threads = true;
1905#endif
1906 LLVFSThread::initClass(enable_threads && true);
1907 LLLFSThread::initClass(enable_threads && true);
1908
1909 // Image decoding
1910 LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
1911 LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
1912 LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), enable_threads && false);
1913 LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
1914 LLImageJ2C::openDSO();
1915
1916 // *FIX: no error handling here!
1917 return true;
1918}
1919
1920void errorCallback(const std::string &error_string)
1921{
1922#ifndef LL_RELEASE_FOR_DOWNLOAD
1923 OSMessageBox(error_string.c_str(), "Fatal Error", OSMB_OK);
1924#endif
1925 LLError::crashAndLoop(error_string);
1926}
1927
1928bool LLAppViewer::initLogging()
1929{
1930 //
1931 // Set up logging defaults for the viewer
1932 //
1933 LLError::initForApplication(
1934 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
1935 LLError::setFatalFunction(errorCallback);
1936
1937 // Remove the last ".old" log file.
1938 std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1939 "SecondLife.old");
1940 LLFile::remove(old_log_file.c_str());
1941
1942 // Rename current log file to ".old"
1943 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
1944 "SecondLife.log");
1945 LLFile::rename(log_file.c_str(), old_log_file.c_str());
1946
1947 // Set the log file to SecondLife.log
1948
1949 LLError::logToFile(log_file);
1950
1951 // *FIX:Mani no error handling here!
1952 return true;
1953}
1954
1955bool LLAppViewer::initConfiguration()
1956{
1957 // Ye olde parse_args()...
1958 if(!doConfigFromCommandLine())
1959 {
1960 return false;
1961 }
1962
1963 // XUI:translate
1964 gSecondLife = "Second Life";
1965
1966 // Read skin/branding settings if specified.
1967 if (! gDirUtilp->getSkinDir().empty() )
1968 {
1969 std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml");
1970 LLXmlTree skin_def_tree;
1971
1972 if (!skin_def_tree.parseFile(skin_def_file))
1973 {
1974 llerrs << "Failed to parse skin definition." << llendl;
1975 }
1976
1977 LLXmlTreeNode* rootp = skin_def_tree.getRoot();
1978 LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
1979 if (disabled_message_node)
1980 {
1981 gDisabledMessage = disabled_message_node->getContents();
1982 }
1983
1984 static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
1985 rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
1986
1987 // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
1988 // Just set gHideLinks instead.
1989 static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
1990 BOOL silent_update;
1991 rootp->getFastAttributeBOOL(silent_string, silent_update);
1992 gHideLinks = (gHideLinks || silent_update);
1993 }
1994
1995#if LL_DARWIN
1996 // Initialize apple menubar and various callbacks
1997 init_apple_menu(gSecondLife.c_str());
1998
1999#if __ppc__
2000 // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further.
2001 // Only test PowerPC - all Intel Macs have SSE.
2002 if(!gSysCPU.hasAltivec())
2003 {
2004 std::ostringstream msg;
2005 msg << gSecondLife << " requires a processor with AltiVec (G4 or later).";
2006 OSMessageBox(
2007 msg.str().c_str(),
2008 NULL,
2009 OSMB_OK);
2010 removeMarkerFile();
2011 return false;
2012 }
2013#endif
2014
2015#endif // LL_DARWIN
2016
2017 // Display splash screen. Must be after above check for previous
2018 // crash as this dialog is always frontmost.
2019 std::ostringstream splash_msg;
2020 splash_msg << "Loading " << gSecondLife << "...";
2021 LLSplashScreen::show();
2022 LLSplashScreen::update(splash_msg.str().c_str());
2023
2024 LLVolumeMgr::initClass();
2025
2026 // Initialize the feature manager
2027 // The feature manager is responsible for determining what features
2028 // are turned on/off in the app.
2029 gFeatureManagerp = new LLFeatureManager;
2030
2031 gStartTime = totalTime();
2032
2033 ////////////////////////////////////////
2034 //
2035 // Process ini files
2036 //
2037
2038 // declare all possible setting variables
2039 declare_settings();
2040
2041#if !LL_RELEASE_FOR_DOWNLOAD
2042// only write the defaults for non-release builds!
2043 gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE);
2044#endif
2045
2046 //
2047 // Set the name of the window
2048 //
2049#if LL_RELEASE_FOR_DOWNLOAD
2050 gWindowTitle = gSecondLife;
2051#elif LL_DEBUG
2052 gWindowTitle = gSecondLife + LLString(" [DEBUG] ") + gArgs;
2053#else
2054 gWindowTitle = gSecondLife + LLString(" ") + gArgs;
2055#endif
2056 LLString::truncate(gWindowTitle, 255);
2057
2058 if (!gMultipleViewersOK)
2059 {
2060 //
2061 // Check for another instance of the app running
2062 //
2063 //RN: if we received a URL, hand it off to the existing instance
2064 // don't call anotherInstanceRunning() when doing URL handoff, as
2065 // it relies on checking a marker file which will not work when running
2066 // out of different directories
2067 std::string slurl;
2068 if (!LLStartUp::sSLURLCommand.empty())
2069 {
2070 slurl = LLStartUp::sSLURLCommand;
2071 }
2072 else if (LLURLSimString::parse())
2073 {
2074 slurl = LLURLSimString::getURL();
2075 }
2076 if (!slurl.empty())
2077 {
2078 if (send_url_to_other_instance(slurl))
2079 {
2080 // successfully handed off URL to existing instance, exit
2081 return false;
2082 }
2083 }
2084
2085 mSecondInstance = anotherInstanceRunning();
2086
2087 if (mSecondInstance)
2088 {
2089 std::ostringstream msg;
2090 msg <<
2091 gSecondLife << " is already running.\n"
2092 "\n"
2093 "Check your task bar for a minimized copy of the program.\n"
2094 "If this message persists, restart your computer.",
2095 OSMessageBox(
2096 msg.str().c_str(),
2097 NULL,
2098 OSMB_OK);
2099 return false;
2100 }
2101
2102 initMarkerFile();
2103
2104#if LL_SEND_CRASH_REPORTS
2105 if (gLastExecFroze)
2106 {
2107 llinfos << "Last execution froze, requesting to send crash report." << llendl;
2108 //
2109 // Pop up a freeze or crash warning dialog
2110 //
2111 std::ostringstream msg;
2112 msg << gSecondLife
2113 << " appears to have frozen or crashed on the previous run.\n"
2114 << "Would you like to send a crash report?";
2115 std::string alert;
2116 alert = gSecondLife;
2117 alert += " Alert";
2118 S32 choice = OSMessageBox(msg.str().c_str(),
2119 alert.c_str(),
2120 OSMB_YESNO);
2121 if (OSBTN_YES == choice)
2122 {
2123 llinfos << "Sending crash report." << llendl;
2124
2125 removeMarkerFile();
2126#if LL_WINDOWS
2127 std::string exe_path = gDirUtilp->getAppRODataDir();
2128 exe_path += gDirUtilp->getDirDelimiter();
2129 exe_path += "win_crash_logger.exe";
2130
2131 std::string arg_string = "-previous -user ";
2132 arg_string += gGridName;
2133 arg_string += " -name \"";
2134 arg_string += gSecondLife;
2135 arg_string += "\"";
2136 // Spawn crash logger.
2137 // NEEDS to wait until completion, otherwise log files will get smashed.
2138 _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
2139#elif LL_DARWIN
2140 std::string command_str;
2141 command_str = "crashreporter.app/Contents/MacOS/crashreporter ";
2142 command_str += "-previous -user ";
2143 command_str += gGridName;
2144 // XXX -- We need to exit fullscreen mode for this to work.
2145 // XXX -- system() also doesn't wait for completion. Hmm...
2146 system(command_str.c_str()); /* Flawfinder: Ignore */
2147#elif LL_LINUX || LL_SOLARIS
2148 std::string cmd =gDirUtilp->getAppRODataDir();
2149 cmd += gDirUtilp->getDirDelimiter();
2150#if LL_LINUX
2151 cmd += "linux-crash-logger.bin";
2152#else // LL_SOLARIS
2153 cmd += "bin/solaris-crash-logger";
2154#endif
2155 char* const cmdargv[] =
2156 {(char*)cmd.c_str(),
2157 (char*)"-previous",
2158 (char*)"-user",
2159 (char*)gGridName,
2160 (char*)"-name",
2161 (char*)gSecondLife.c_str(),
2162 NULL};
2163 pid_t pid = fork();
2164 if (pid == 0)
2165 { // child
2166 execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */
2167 llwarns << "execv failure when trying to start " << cmd << llendl;
2168 _exit(1); // avoid atexit()
2169 } else {
2170 if (pid > 0)
2171 {
2172 // wait for child proc to die
2173 int childExitStatus;
2174 waitpid(pid, &childExitStatus, 0);
2175 } else {
2176 llwarns << "fork failure." << llendl;
2177 }
2178 }
2179#endif
2180 }
2181 else
2182 {
2183 llinfos << "Not sending crash report." << llendl;
2184 }
2185 }
2186#endif // #if LL_SEND_CRASH_REPORTS
2187 }
2188 else
2189 {
2190 mSecondInstance = anotherInstanceRunning();
2191
2192 if (mSecondInstance)
2193 {
2194 gDisableVoice = TRUE;
2195 /* Don't start another instance if using -multiple
2196 //RN: if we received a URL, hand it off to the existing instance
2197 if (LLURLSimString::parse())
2198 {
2199 LLURLSimString::send_to_other_instance();
2200 return 1;
2201 }
2202 */
2203 }
2204
2205 initMarkerFile();
2206 }
2207
2208 return true; // Config was successful.
2209}
2210
2211bool LLAppViewer::doConfigFromCommandLine()
2212{
2213 // *FIX: This is what parse args used to do, minus the arg reading part.
2214 // Now the arg parsing is handled by LLApp::parseCommandOptions() and this
2215 // method need only interpret settings. Perhaps some day interested parties
2216 // can ask an app about a setting rather than have the app set
2217 // a gazzillion globals.
2218
2219 /////////////////////////////////////////
2220 //
2221 // Process command line arguments
2222 //
2223 S32 args_result = 0;
2224
2225#if LL_DARWIN
2226 {
2227 // On the Mac, read in arguments.txt (if it exists) and process it for additional arguments.
2228 LLString args;
2229 if(_read_file_into_string(args, "arguments.txt")) /* Flawfinder: ignore*/
2230 {
2231 // The arguments file exists.
2232 // It should consist of command line arguments separated by newlines.
2233 // Split it into individual arguments and build a fake argv[] to pass to parse_args.
2234 std::vector<std::string> arglist;
2235
2236 arglist.push_back("newview");
2237
2238 llinfos << "Reading additional command line arguments from arguments.txt..." << llendl;
2239
2240 typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer;
2241 boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
2242 tokenizer tokens(args, sep);
2243 tokenizer::iterator token_iter;
2244
2245 for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
2246 {
2247 llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl;
2248
2249 arglist.push_back(*token_iter);
2250 }
2251
2252 char **fakeargv = new char*[arglist.size()];
2253 int i;
2254 for(i=0; i < arglist.size(); i++)
2255 fakeargv[i] = const_cast<char*>(arglist[i].c_str());
2256
2257 args_result = parse_args(arglist.size(), fakeargv);
2258 delete[] fakeargv;
2259 }
2260
2261 // Get the user's preferred language string based on the Mac OS localization mechanism.
2262 // To add a new localization:
2263 // go to the "Resources" section of the project
2264 // get info on "language.txt"
2265 // in the "General" tab, click the "Add Localization" button
2266 // create a new localization for the language you're adding
2267 // set the contents of the new localization of the file to the string corresponding to our localization
2268 // (i.e. "en-us", "ja", etc. Use the existing ones as a guide.)
2269 CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL);
2270 char path[MAX_PATH];
2271 if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path)))
2272 {
2273 LLString lang;
2274 if(_read_file_into_string(lang, path)) /* Flawfinder: ignore*/
2275 {
2276 gCommandLineForcedSettings["SystemLanguage"] = lang;
2277 }
2278 }
2279 CFRelease(url);
2280 }
2281#endif
2282
2283 int argc = gTempArgC;
2284 char** argv = gTempArgV;
2285
2286 //
2287 // Parse the command line arguments
2288 //
2289 args_result |= parse_args(argc, argv);
2290 if (args_result)
2291 {
2292 removeMarkerFile();
2293 return false;
2294 }
2295
2296 if (!strcmp(gGridName, gGridInfo[GRID_INFO_AGNI].mName))
2297 {
2298 gInProductionGrid = TRUE;
2299 }
2300
2301 return true;
2302}
2303
2304bool LLAppViewer::initWindow()
2305{
2306 llinfos << "Initializing window..." << llendl;
2307
2308 // store setting in a global for easy access and modification
2309 gNoRender = gSavedSettings.getBOOL("DisableRendering");
2310
2311 // Hide the splash screen
2312 LLSplashScreen::hide();
2313
2314 // HACK: Need a non-const char * for stupid window name (propagated deep down)
2315 char window_title_str[256]; /* Flawfinder: ignore */
2316 strncpy(window_title_str, gWindowTitle.c_str(), sizeof(window_title_str) - 1); /* Flawfinder: ignore */
2317 window_title_str[sizeof(window_title_str) - 1] = '\0';
2318
2319 // always start windowed
2320 gViewerWindow = new LLViewerWindow(window_title_str, "Second Life",
2321 gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
2322 gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
2323 FALSE, gIgnorePixelDepth);
2324
2325 if (gSavedSettings.getBOOL("FullScreen"))
2326 {
2327 gViewerWindow->toggleFullscreen(FALSE);
2328 // request to go full screen... which will be delayed until login
2329 }
2330
2331 if (gSavedSettings.getBOOL("WindowMaximized"))
2332 {
2333 gViewerWindow->mWindow->maximize();
2334 gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
2335 }
2336
2337 LLUI::sWindow = gViewerWindow->getWindow();
2338
2339 LLAlertDialog::parseAlerts("alerts.xml");
2340 LLNotifyBox::parseNotify("notify.xml");
2341
2342 LLMediaEngine::initClass();
2343
2344 //
2345 // Clean up the feature manager lookup table - settings were updated
2346 // in the LLViewerWindow constructor
2347 //
2348 gFeatureManagerp->cleanupFeatureTables();
2349
2350 // Show watch cursor
2351 gViewerWindow->setCursor(UI_CURSOR_WAIT);
2352
2353 // Finish view initialization
2354 gViewerWindow->initBase();
2355
2356 // show viewer window
2357 gViewerWindow->mWindow->show();
2358
2359 return true;
2360}
2361
2362void LLAppViewer::closeDebug()
2363{
2364 std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log");
2365 llinfos << "Opening debug file " << debug_filename << llendl;
2366 std::ofstream out_file(debug_filename.c_str());
2367 LLSDSerialize::toPrettyXML(gDebugInfo, out_file);
2368 out_file.close();
2369}
2370
2371void LLAppViewer::cleanupSavedSettings()
2372{
2373 gSavedSettings.setBOOL("MouseSun", FALSE);
2374
2375 gSavedSettings.setBOOL("FlyBtnState", FALSE);
2376
2377 gSavedSettings.setBOOL("FirstPersonBtnState", FALSE);
2378 gSavedSettings.setBOOL("ThirdPersonBtnState", TRUE);
2379 gSavedSettings.setBOOL("BuildBtnState", FALSE);
2380
2381 gSavedSettings.setBOOL("UseEnergy", TRUE); // force toggle to turn off, since sends message to simulator
2382
2383 gSavedSettings.setBOOL("DebugWindowProc", gDebugWindowProc);
2384
2385 gSavedSettings.setBOOL("AllowIdleAFK", gAllowIdleAFK);
2386 gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates);
2387
2388 if (!gNoRender)
2389 {
2390 if (gDebugView)
2391 {
2392 gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible());
2393 gSavedSettings.setBOOL("ShowDebugStats", gDebugView->mStatViewp->getVisible());
2394 }
2395 }
2396
2397 // save window position if not fullscreen
2398 // as we don't track it in callbacks
2399 BOOL fullscreen = gViewerWindow->mWindow->getFullscreen();
2400 BOOL maximized = gViewerWindow->mWindow->getMaximized();
2401 if (!fullscreen && !maximized)
2402 {
2403 LLCoordScreen window_pos;
2404
2405 if (gViewerWindow->mWindow->getPosition(&window_pos))
2406 {
2407 gSavedSettings.setS32("WindowX", window_pos.mX);
2408 gSavedSettings.setS32("WindowY", window_pos.mY);
2409 }
2410 }
2411
2412 gSavedSettings.setF32("MapScale", gMapScale );
2413 gSavedSettings.setF32("MiniMapScale", gMiniMapScale );
2414 gSavedSettings.setBOOL("AsyncKeyboard", gHandleKeysAsync);
2415 gSavedSettings.setBOOL("ShowHoverTips", LLHoverView::sShowHoverTips);
2416
2417 // Some things are cached in LLAgent.
2418 if (gAgent.mInitialized)
2419 {
2420 gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance);
2421 }
2422
2423 // *REMOVE: This is now done via LLAppViewer::setCrashBehavior()
2424 // Left vestigially in case I borked it.
2425 // gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior);
2426}
2427
2428void LLAppViewer::removeCacheFiles(const char* file_mask)
2429{
2430 char mask[LL_MAX_PATH]; /* Flawfinder: ignore */
2431 snprintf(mask, LL_MAX_PATH, "%s%s", gDirUtilp->getDirDelimiter().c_str(), file_mask); /* Flawfinder: ignore */
2432 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").c_str(), mask);
2433}
2434
2435void LLAppViewer::writeSystemInfo()
2436{
2437 gDebugInfo["SLLog"] = LLError::logFileName();
2438
2439 gDebugInfo["ClientInfo"]["Name"] = gSecondLife;
2440 gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
2441 gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
2442 gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
2443 gDebugInfo["ClientInfo"]["BuildVersion"] = LL_VERSION_BUILD;
2444
2445 gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily();
2446 gDebugInfo["CPUInfo"]["CPUMhz"] = gSysCPU.getMhz();
2447 gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec();
2448 gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE();
2449 gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2();
2450
2451 gDebugInfo["RAMInfo"] = llformat("%u", gSysMemory.getPhysicalMemoryKB());
2452 gDebugInfo["OSInfo"] = getOSInfo().getOSStringSimple();
2453
2454 // Dump some debugging info
2455 llinfos << gSecondLife
2456 << " version " << LL_VERSION_MAJOR << "." << LL_VERSION_MINOR << "." << LL_VERSION_PATCH
2457 << llendl;
2458
2459 // Dump the local time and time zone
2460 time_t now;
2461 time(&now);
2462 char tbuffer[256]; /* Flawfinder: ignore */
2463 strftime(tbuffer, 256, "%Y-%m-%dT%H:%M:%S %Z", localtime(&now));
2464 llinfos << "Local time: " << tbuffer << llendl;
2465
2466 // query some system information
2467 llinfos << "CPU info:\n" << gSysCPU << llendl;
2468 llinfos << "Memory info:\n" << gSysMemory << llendl;
2469 llinfos << "OS: " << getOSInfo().getOSStringSimple() << llendl;
2470 llinfos << "OS info: " << getOSInfo() << llendl;
2471}
2472
2473void LLAppViewer::handleViewerCrash()
2474{
2475 LLAppViewer* pApp = LLAppViewer::instance();
2476 if (pApp->beingDebugged())
2477 {
2478 // This will drop us into the debugger.
2479 abort();
2480 }
2481
2482 // Returns whether a dialog was shown.
2483 // Only do the logic in here once
2484 if (pApp->mReportedCrash)
2485 {
2486 return;
2487 }
2488 pApp->mReportedCrash = TRUE;
2489
2490 gDebugInfo["SettingsFilename"] = gSettingsFileName;
2491 gDebugInfo["CAFilename"] = gDirUtilp->getCAFile();
2492 gDebugInfo["ViewerExePath"] = gDirUtilp->getExecutablePathAndName().c_str();
2493 gDebugInfo["CurrentPath"] = gDirUtilp->getCurPath().c_str();
2494 gDebugInfo["CurrentSimHost"] = gAgent.getRegionHost().getHostName();
2495
2496 if (gMessageSystem && gDirUtilp)
2497 {
2498 std::string filename;
2499 filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "stats.log");
2500 llofstream file(filename.c_str(), llofstream::binary);
2501 if(file.good())
2502 {
2503 gMessageSystem->summarizeLogs(file);
2504 file.close();
2505 }
2506 }
2507
2508 if (gMessageSystem)
2509 {
2510 gMessageSystem->getCircuitInfo(gDebugInfo["CircuitInfo"]);
2511 gMessageSystem->stopLogging();
2512 }
2513 if (gWorldp)
2514 {
2515 gWorldp->getInfo(gDebugInfo);
2516 }
2517
2518 // Close the debug file
2519 pApp->closeDebug();
2520 LLError::logToFile("");
2521
2522 // Call to pure virtual, handled by platform specifc llappviewer instance.
2523 pApp->handleCrashReporting();
2524
2525 return;
2526}
2527
2528void LLAppViewer::setCrashBehavior(S32 cb)
2529{
2530 mCrashBehavior = cb;
2531 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, mCrashBehavior);
2532}
2533
2534bool LLAppViewer::anotherInstanceRunning()
2535{
2536 // We create a marker file when the program starts and remove the file when it finishes.
2537 // If the file is currently locked, that means another process is already running.
2538
2539 std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
2540 llinfos << "Checking marker file for lock..." << llendl;
2541
2542 // If file doesn't exist, we create it
2543 // If file does exist, try to get writing privilages
2544 FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); // Flawfinder: ignore
2545 if (fMarker != NULL)
2546 {
2547 // File exists, try opening with write permissions
2548 fclose(fMarker);
2549 fMarker = LLFile::fopen(marker_file.c_str(), "wb"); // Flawfinder: ignore
2550 if (fMarker == NULL)
2551 {
2552 llinfos << "Marker file is locked." << llendl;
2553 return TRUE;
2554 }
2555
2556 // *FIX:Mani - rather than have this exception here,
2557 // LLFile::fopen() have consistent behavior across platforms?
2558#if LL_DARWIN
2559 // Try to lock it. On Mac, this is the only way to test if it's actually locked.
2560 if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
2561 {
2562 // Lock failed - somebody else has it.
2563 fclose(fMarker);
2564 llinfos << "Marker file is locked." << llendl;
2565 return TRUE;
2566 }
2567#endif
2568 fclose(fMarker);
2569 }
2570 llinfos << "Marker file isn't locked." << llendl;
2571 return FALSE;
2572
2573}
2574
2575void LLAppViewer::initMarkerFile()
2576{
2577 // *FIX:Mani - an actually cross platform LLFile lib would be nice.
2578
2579#if LL_SOLARIS
2580 struct flock fl;
2581 fl.l_whence = SEEK_SET;
2582 fl.l_start = 0;
2583 fl.l_len = 1;
2584#endif
2585 // We create a marker file when the program starts and remove the file when it finishes.
2586 // If the file is currently locked, that means another process is already running.
2587 // If the file exists and isn't locked, we crashed on the last run.
2588
2589 std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
2590 llinfos << "Checking marker file for lock..." << llendl;
2591
2592 FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); // Flawfinder: ignore
2593 if (fMarker != NULL)
2594 {
2595 // File exists, try opening with write permissions
2596 fclose(fMarker);
2597 fMarker = LLFile::fopen(marker_file.c_str(), "wb"); // Flawfinder: ignxore
2598 if (fMarker == NULL)
2599 {
2600 // Another instance is running. Skip the rest of these operations.
2601 llinfos << "Marker file is locked." << llendl;
2602 return;
2603 }
2604#if LL_DARWIN
2605 // Try to lock it. On Mac, this is the only way to test if it's actually locked.
2606 if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
2607 {
2608 // Lock failed - somebody else has it.
2609 fclose(fMarker);
2610 llinfos << "Marker file is locked." << llendl;
2611 return;
2612 }
2613#endif
2614
2615 // No other instances; we'll lock this file now & delete on quit.
2616 fclose(fMarker);
2617 gLastExecFroze = TRUE;
2618 llinfos << "Exec marker found: program froze on previous execution" << llendl;
2619 }
2620
2621 // Create the marker file for this execution & lock it
2622// FILE *fp_executing_marker;
2623#if LL_WINDOWS
2624 mMarkerFile = LLFile::_fsopen(marker_file.c_str(), "w", _SH_DENYWR);
2625#else
2626 mMarkerFile = LLFile::fopen(marker_file.c_str(), "w"); // Flawfinder: ignore
2627 if (mMarkerFile)
2628 {
2629 int fd = fileno(mMarkerFile);
2630 // Attempt to lock
2631#if LL_SOLARIS
2632 fl.l_type = F_WRLCK;
2633 if (fcntl(fd, F_SETLK, &fl) == -1)
2634#else
2635 if (flock(fd, LOCK_EX | LOCK_NB) == -1)
2636#endif
2637 {
2638 llinfos << "Failed to lock file." << llendl;
2639 }
2640 }
2641#endif
2642 if (mMarkerFile)
2643 {
2644 llinfos << "Marker file created." << llendl;
2645 }
2646 else
2647 {
2648 llinfos << "Failed to create marker file." << llendl;
2649 }
2650
2651#if LL_WINDOWS
2652 // Clean up SecondLife.dmp files, to avoid confusion
2653 llinfos << "Removing SecondLife.dmp" << llendl;
2654 std::string dmp_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.dmp");
2655 LLFile::remove(dmp_filename.c_str());
2656#endif
2657
2658 // This is to keep the crash reporter from constantly sending stale message logs
2659 // We wipe the message file now.
2660 llinfos << "Removing message.log" << llendl;
2661 std::string message_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "message.log");
2662 LLFile::remove(message_filename.c_str());
2663
2664 llinfos << "Exiting initMarkerFile()." << llendl;
2665}
2666
2667void LLAppViewer::removeMarkerFile()
2668{
2669 llinfos << "removeMarkerFile()" << llendl;
2670 if (mMarkerFile != NULL)
2671 {
2672 fclose(mMarkerFile);
2673 mMarkerFile = NULL;
2674 }
2675 if( gDirUtilp )
2676 {
2677 LLString marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
2678 ll_apr_file_remove( marker_file );
2679 }
2680}
2681
2682void LLAppViewer::forceQuit()
2683{
2684 LLApp::setQuitting();
2685}
2686
2687void LLAppViewer::requestQuit()
2688{
2689 llinfos << "requestQuit" << llendl;
2690
2691 LLViewerRegion* region = gAgent.getRegion();
2692
2693 if( (LLStartUp::getStartupState() < STATE_STARTED) || !region )
2694 {
2695 // Quit immediately
2696 forceQuit();
2697 return;
2698 }
2699
2700 if (gHUDManager)
2701 {
2702 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
2703 effectp->setPositionGlobal(gAgent.getPositionGlobal());
2704 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
2705 gHUDManager->sendEffects();
2706 }
2707
2708 // Attempt to close all floaters that might be
2709 // editing things.
2710 if (gFloaterView)
2711 {
2712 // application is quitting
2713 gFloaterView->closeAllChildren(true);
2714 }
2715
2716 send_stats();
2717
2718 gLogoutTimer.reset();
2719 mQuitRequested = true;
2720}
2721
2722static void finish_quit(S32 option, void *userdata)
2723{
2724 if (option == 0)
2725 {
2726 LLAppViewer::instance()->requestQuit();
2727 }
2728}
2729
2730void LLAppViewer::userQuit()
2731{
2732 gViewerWindow->alertXml("ConfirmQuit", finish_quit, NULL);
2733}
2734
2735static void finish_early_exit(S32 option, void* userdata)
2736{
2737 LLAppViewer::instance()->forceQuit();
2738}
2739
2740void LLAppViewer::earlyExit(const LLString& msg)
2741{
2742 llwarns << "app_early_exit: " << msg << llendl;
2743 gDoDisconnect = TRUE;
2744// LLStringBase<char>::format_map_t args;
2745// args["[MESSAGE]"] = mesg;
2746// gViewerWindow->alertXml("AppEarlyExit", args, finish_early_exit);
2747 LLAlertDialog::showCritical(msg, finish_early_exit, NULL);
2748}
2749
2750void LLAppViewer::forceExit(S32 arg)
2751{
2752 removeMarkerFile();
2753
2754 // *FIX:Mani - This kind of exit hardly seems appropriate.
2755 exit(arg);
2756}
2757
2758void LLAppViewer::abortQuit()
2759{
2760 llinfos << "abortQuit()" << llendl;
2761 mQuitRequested = false;
2762}
2763
2764bool LLAppViewer::initCache()
2765{
2766 mPurgeCache = false;
2767 // Purge cache if user requested it
2768 if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
2769 gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
2770 {
2771 gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
2772 mPurgeCache = true;
2773 }
2774 // Purge cache if it belongs to an old version
2775 else
2776 {
2777 static const S32 cache_version = 5;
2778 if (gSavedSettings.getS32("LocalCacheVersion") != cache_version)
2779 {
2780 mPurgeCache = true;
2781 gSavedSettings.setS32("LocalCacheVersion", cache_version);
2782 }
2783 }
2784
2785 // Setup and verify the cache location
2786 LLString cache_location = gSavedSettings.getString("CacheLocation");
2787 LLString new_cache_location = gSavedSettings.getString("NewCacheLocation");
2788 if (new_cache_location != cache_location)
2789 {
2790 gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
2791 purgeCache(); // purge old cache
2792 gSavedSettings.setString("CacheLocation", new_cache_location);
2793 }
2794
2795 if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")))
2796 {
2797 llwarns << "Unable to set cache location" << llendl;
2798 gSavedSettings.setString("CacheLocation", "");
2799 }
2800
2801 if (mPurgeCache)
2802 {
2803 LLSplashScreen::update("Clearing cache...");
2804 purgeCache();
2805 }
2806
2807 LLSplashScreen::update("Initializing Texture Cache...");
2808
2809 // Init the texture cache
2810 // Allocate 80% of the cache size for textures
2811 BOOL read_only = mSecondInstance ? true : false;
2812 const S32 MB = 1024*1024;
2813 S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
2814 const S64 MAX_CACHE_SIZE = 1024*MB;
2815 cache_size = llmin(cache_size, MAX_CACHE_SIZE);
2816 S64 texture_cache_size = ((cache_size * 8)/10);
2817 S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, read_only);
2818 texture_cache_size -= extra;
2819
2820 LLSplashScreen::update("Initializing VFS...");
2821
2822 // Init the VFS
2823 S64 vfs_size = cache_size - texture_cache_size;
2824 const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
2825 vfs_size = llmin(vfs_size, MAX_VFS_SIZE);
2826 vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned
2827 U32 vfs_size_u32 = (U32)vfs_size;
2828 U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB;
2829 bool resize_vfs = (vfs_size_u32 != old_vfs_size);
2830 if (resize_vfs)
2831 {
2832 gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB);
2833 }
2834 llinfos << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << llendl;
2835
2836 // This has to happen BEFORE starting the vfs
2837 //time_t ltime;
2838 srand(time(NULL)); // Flawfinder: ignore
2839 U32 old_salt = gSavedSettings.getU32("VFSSalt");
2840 U32 new_salt;
2841 char old_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore
2842 char old_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore
2843 char new_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore
2844 char new_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore
2845 char static_vfs_index_file[LL_MAX_PATH]; // Flawfinder: ignore
2846 char static_vfs_data_file[LL_MAX_PATH]; // Flawfinder: ignore
2847
2848 if (gMultipleViewersOK)
2849 {
2850 // don't mess with renaming the VFS in this case
2851 new_salt = old_salt;
2852 }
2853 else
2854 {
2855 do
2856 {
2857 new_salt = rand();
2858 } while( new_salt == old_salt );
2859 }
2860
2861 snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore
2862 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(),
2863 old_salt);
2864
2865 // make sure this file exists
2866 llstat s;
2867 S32 stat_result = LLFile::stat(old_vfs_data_file, &s);
2868 if (stat_result)
2869 {
2870 // doesn't exist, look for a data file
2871 std::string mask;
2872 mask = gDirUtilp->getDirDelimiter();
2873 mask += VFS_DATA_FILE_BASE;
2874 mask += "*";
2875
2876 std::string dir;
2877 dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
2878
2879 std::string found_file;
2880 if (gDirUtilp->getNextFileInDir(dir, mask, found_file, false))
2881 {
2882 snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%s%s", dir.c_str(), gDirUtilp->getDirDelimiter().c_str(), found_file.c_str()); // Flawfinder: ignore
2883
2884 S32 start_pos;
2885 S32 length = strlen(found_file.c_str()); /* Flawfinder: ignore*/
2886 for (start_pos = length - 1; start_pos >= 0; start_pos--)
2887 {
2888 if (found_file[start_pos] == '.')
2889 {
2890 start_pos++;
2891 break;
2892 }
2893 }
2894 if (start_pos > 0)
2895 {
2896 sscanf(found_file.c_str() + start_pos, "%d", &old_salt);
2897 }
2898 llinfos << "Default vfs data file not present, found " << old_vfs_data_file << llendl;
2899 llinfos << "Old salt: " << old_salt << llendl;
2900 }
2901 }
2902
2903 snprintf(old_vfs_index_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore
2904 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE).c_str(),
2905 old_salt);
2906
2907 stat_result = LLFile::stat(old_vfs_index_file, &s);
2908 if (stat_result)
2909 {
2910 // We've got a bad/missing index file, nukem!
2911 llwarns << "Bad or missing vfx index file " << old_vfs_index_file << llendl;
2912 llwarns << "Removing old vfs data file " << old_vfs_data_file << llendl;
2913 LLFile::remove(old_vfs_data_file);
2914 LLFile::remove(old_vfs_index_file);
2915
2916 // Just in case, nuke any other old cache files in the directory.
2917 std::string dir;
2918 dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
2919
2920 std::string mask;
2921 mask = gDirUtilp->getDirDelimiter();
2922 mask += VFS_DATA_FILE_BASE;
2923 mask += "*";
2924
2925 gDirUtilp->deleteFilesInDir(dir, mask);
2926
2927 mask = gDirUtilp->getDirDelimiter();
2928 mask += VFS_INDEX_FILE_BASE;
2929 mask += "*";
2930
2931 gDirUtilp->deleteFilesInDir(dir, mask);
2932 }
2933
2934 snprintf(new_vfs_data_file, LL_MAX_PATH, "%s%u", // Flawfinder: ignore
2935 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(),
2936 new_salt);
2937
2938 snprintf(new_vfs_index_file, LL_MAX_PATH, "%s%u", gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE).c_str(), // Flawfinder: ignore
2939 new_salt);
2940
2941
2942 strncpy(static_vfs_data_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2").c_str(), LL_MAX_PATH -1); // Flawfinder: ignore
2943 static_vfs_data_file[LL_MAX_PATH -1] = '\0';
2944 strncpy(static_vfs_index_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2").c_str(), LL_MAX_PATH -1); // Flawfinder: ignore
2945 static_vfs_index_file[LL_MAX_PATH -1] = '\0';
2946
2947 if (resize_vfs)
2948 {
2949 llinfos << "Removing old vfs and re-sizing" << llendl;
2950
2951 LLFile::remove(old_vfs_data_file);
2952 LLFile::remove(old_vfs_index_file);
2953 }
2954 else if (old_salt != new_salt)
2955 {
2956 // move the vfs files to a new name before opening
2957 llinfos << "Renaming " << old_vfs_data_file << " to " << new_vfs_data_file << llendl;
2958 llinfos << "Renaming " << old_vfs_index_file << " to " << new_vfs_index_file << llendl;
2959 LLFile::rename(old_vfs_data_file, new_vfs_data_file);
2960 LLFile::rename(old_vfs_index_file, new_vfs_index_file);
2961 }
2962
2963 // Startup the VFS...
2964 gSavedSettings.setU32("VFSSalt", new_salt);
2965
2966 // Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
2967 gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
2968 if( VFSVALID_BAD_CORRUPT == gVFS->getValidState() )
2969 {
2970 // Try again with fresh files
2971 // (The constructor deletes corrupt files when it finds them.)
2972 llwarns << "VFS corrupt, deleted. Making new VFS." << llendl;
2973 delete gVFS;
2974 gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, false, vfs_size_u32, false);
2975 }
2976
2977 gStaticVFS = new LLVFS(static_vfs_index_file, static_vfs_data_file, true, 0, false);
2978
2979 BOOL success = gVFS->isValid() && gStaticVFS->isValid();
2980 if( !success )
2981 {
2982 return false;
2983 }
2984 else
2985 {
2986 LLVFile::initClass();
2987 return true;
2988 }
2989}
2990
2991void LLAppViewer::purgeCache()
2992{
2993 llinfos << "Purging Texture Cache..." << llendl;
2994 LLAppViewer::getTextureCache()->purgeCache(LL_PATH_CACHE);
2995 llinfos << "Purging Cache..." << llendl;
2996 std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
2997 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask);
2998}
2999
3000const LLString& LLAppViewer::getSecondLifeTitle() const
3001{
3002 return gSecondLife;
3003}
3004
3005const LLString& LLAppViewer::getWindowTitle() const
3006{
3007 return gWindowTitle;
3008}
3009
3010void LLAppViewer::resetURIs() const
3011{
3012 // Clear URIs when picking a new server
3013 gLoginURIs.clear();
3014 gHelperURI.clear();
3015}
3016
3017const std::vector<std::string>& LLAppViewer::getLoginURIs() const
3018{
3019 if (gLoginURIs.empty())
3020 {
3021 // not specified on the command line, use value from table
3022 gLoginURIs = LLSRV::rewriteURI(gGridInfo[gGridChoice].mLoginURI);
3023 }
3024 return gLoginURIs;
3025}
3026
3027const std::string& LLAppViewer::getHelperURI() const
3028{
3029 if (gHelperURI.empty())
3030 {
3031 // not specified on the command line, use value from table
3032 gHelperURI = gGridInfo[gGridChoice].mHelperURI;
3033 }
3034 return gHelperURI;
3035}
3036
3037void LLAppViewer::addLoginURI(const std::string& uri)
3038{
3039 gLoginURIs.push_back(uri);
3040}
3041
3042void LLAppViewer::setHelperURI(const std::string& uri)
3043{
3044 gHelperURI = uri;
3045}
3046
3047// Callback from a dialog indicating user was logged out.
3048void finish_disconnect(S32 option, void* userdata)
3049{
3050 if (1 == option)
3051 {
3052 LLAppViewer::instance()->forceQuit();
3053 }
3054}
3055
3056// Callback from an early disconnect dialog, force an exit
3057void finish_forced_disconnect(S32 /* option */, void* /* userdata */)
3058{
3059 LLAppViewer::instance()->forceQuit();
3060}
3061
3062
3063void LLAppViewer::forceDisconnect(const LLString& mesg)
3064{
3065 if (gDoDisconnect)
3066 {
3067 // Already popped up one of these dialogs, don't
3068 // do this again.
3069 return;
3070 }
3071
3072 // Translate the message if possible
3073 LLString big_reason = LLAgent::sTeleportErrorMessages[mesg];
3074 if ( big_reason.size() == 0 )
3075 {
3076 big_reason = mesg;
3077 }
3078
3079 LLStringBase<char>::format_map_t args;
3080 gDoDisconnect = TRUE;
3081
3082 if (LLStartUp::getStartupState() < STATE_STARTED)
3083 {
3084 // Tell users what happened
3085 args["[ERROR_MESSAGE]"] = big_reason;
3086 gViewerWindow->alertXml("ErrorMessage", args, finish_forced_disconnect);
3087 }
3088 else
3089 {
3090 args["[MESSAGE]"] = big_reason;
3091 gViewerWindow->alertXml("YouHaveBeenLoggedOut", args, finish_disconnect );
3092 }
3093}
3094
3095void LLAppViewer::badNetworkHandler()
3096{
3097 // Dump the packet
3098 gMessageSystem->dumpPacketToLog();
3099
3100 // Flush all of our caches on exit in the case of disconnect due to
3101 // invalid packets.
3102
3103 mPurgeOnExit = TRUE;
3104
3105#if LL_WINDOWS
3106 // Generates the minidump.
3107 LLWinDebug::handleException(NULL);
3108#endif
3109 LLAppViewer::handleViewerCrash();
3110
3111 std::ostringstream message;
3112 message <<
3113 "The viewer has detected mangled network data indicative\n"
3114 "of a bad upstream network connection or an incomplete\n"
3115 "local installation of " << LLAppViewer::instance()->getSecondLifeTitle() << ". \n"
3116 " \n"
3117 "Try uninstalling and reinstalling to see if this resolves \n"
3118 "the issue. \n"
3119 " \n"
3120 "If the problem continues, see the Tech Support FAQ at: \n"
3121 "www.secondlife.com/support";
3122 forceDisconnect(message.str());
3123}
3124
3125// This routine may get called more than once during the shutdown process.
3126// This can happen because we need to get the screenshot before the window
3127// is destroyed.
3128void LLAppViewer::saveFinalSnapshot()
3129{
3130 if (!mSavedFinalSnapshot && !gNoRender)
3131 {
3132 gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal());
3133 gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal());
3134 gViewerWindow->setCursor(UI_CURSOR_WAIT);
3135 gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch
3136 gSavedSettings.setBOOL("ShowParcelOwners", FALSE);
3137 idle();
3138
3139 LLString snap_filename = gDirUtilp->getLindenUserDir();
3140 snap_filename += gDirUtilp->getDirDelimiter();
3141 snap_filename += SCREEN_LAST_FILENAME;
3142 gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, TRUE);
3143 mSavedFinalSnapshot = TRUE;
3144 }
3145}
3146
3147void LLAppViewer::loadNameCache()
3148{
3149 if (!gCacheName) return;
3150
3151 std::string name_cache;
3152 name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache");
3153 FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "r"); // Flawfinder: ignore
3154 if (name_cache_fp)
3155 {
3156 gCacheName->importFile(name_cache_fp);
3157 fclose(name_cache_fp);
3158 }
3159}
3160
3161void LLAppViewer::saveNameCache()
3162{
3163 if (!gCacheName) return;
3164
3165 std::string name_cache;
3166 name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache");
3167 FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "w"); // Flawfinder: ignore
3168 if (name_cache_fp)
3169 {
3170 gCacheName->exportFile(name_cache_fp);
3171 fclose(name_cache_fp);
3172 }
3173}
3174
3175/*! @brief This class is an LLFrameTimer that can be created with
3176 an elapsed time that starts counting up from the given value
3177 rather than 0.0.
3178
3179 Otherwise it behaves the same way as LLFrameTimer.
3180*/
3181class LLFrameStatsTimer : public LLFrameTimer
3182{
3183public:
3184 LLFrameStatsTimer(F64 elapsed_already = 0.0)
3185 : LLFrameTimer()
3186 {
3187 mStartTime -= elapsed_already;
3188 }
3189};
3190
3191///////////////////////////////////////////////////////
3192// idle()
3193//
3194// Called every time the window is not doing anything.
3195// Receive packets, update statistics, and schedule a redisplay.
3196///////////////////////////////////////////////////////
3197void LLAppViewer::idle()
3198{
3199 // Update frame timers
3200 static LLTimer idle_timer;
3201
3202 LLControlBase::updateAllListeners();
3203
3204 LLFrameTimer::updateFrameTime();
3205 LLEventTimer::updateClass();
3206 LLCriticalDamp::updateInterpolants();
3207 LLMortician::updateClass();
3208 F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
3209
3210 // Cap out-of-control frame times
3211 // Too low because in menus, swapping, debugger, etc.
3212 // Too high because idle called with no objects in view, etc.
3213 const F32 MIN_FRAME_RATE = 1.f;
3214 const F32 MAX_FRAME_RATE = 200.f;
3215
3216 F32 frame_rate_clamped = 1.f / dt_raw;
3217 frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE);
3218 gFrameDTClamped = 1.f / frame_rate_clamped;
3219
3220 // Global frame timer
3221 // Smoothly weight toward current frame
3222 gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f;
3223
3224 if (gQuitAfterSeconds > 0.f)
3225 {
3226 if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds)
3227 {
3228 LLAppViewer::instance()->forceQuit();
3229 }
3230 }
3231
3232 // Must wait until both have avatar object and mute list, so poll
3233 // here.
3234 request_initial_instant_messages();
3235
3236 ///////////////////////////////////
3237 //
3238 // Special case idle if still starting up
3239 //
3240
3241 if (LLStartUp::getStartupState() < STATE_STARTED)
3242 {
3243 // Skip rest if idle startup returns false (essentially, no world yet)
3244 if (!idle_startup())
3245 {
3246 return;
3247 }
3248 }
3249
3250
3251 F32 yaw = 0.f; // radians
3252
3253 if (!gDisconnected)
3254 {
3255 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3256
3257 // Update spaceserver timeinfo
3258 gWorldp->setSpaceTimeUSec(gWorldp->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC));
3259
3260
3261 //////////////////////////////////////
3262 //
3263 // Update simulator agent state
3264 //
3265
3266 if (gRotateRight)
3267 {
3268 gAgent.moveYaw(-1.f);
3269 }
3270
3271 // Handle automatic walking towards points
3272 gAgentPilot.updateTarget();
3273 gAgent.autoPilot(&yaw);
3274
3275 static LLFrameTimer agent_update_timer;
3276 static U32 last_control_flags;
3277
3278 // When appropriate, update agent location to the simulator.
3279 F32 agent_update_time = agent_update_timer.getElapsedTimeF32();
3280 BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags());
3281
3282 if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND)))
3283 {
3284 // Send avatar and camera info
3285 last_control_flags = gAgent.getControlFlags();
3286 send_agent_update(TRUE);
3287 agent_update_timer.reset();
3288 }
3289 }
3290
3291 //////////////////////////////////////
3292 //
3293 // Manage statistics
3294 //
3295 //
3296
3297 {
3298 // Initialize the viewer_stats_timer with an already elapsed time
3299 // of SEND_STATS_PERIOD so that the initial stats report will
3300 // be sent immediately.
3301 static LLFrameStatsTimer viewer_stats_timer(SEND_STATS_PERIOD);
3302 reset_statistics();
3303
3304 // Update session stats every large chunk of time
3305 // *FIX: (???) SAMANTHA
3306 if (viewer_stats_timer.getElapsedTimeF32() >= SEND_STATS_PERIOD && !gDisconnected)
3307 {
3308 llinfos << "Transmitting sessions stats" << llendl;
3309 send_stats();
3310 viewer_stats_timer.reset();
3311 }
3312
3313 // Print the object debugging stats
3314 static LLFrameTimer object_debug_timer;
3315 if (object_debug_timer.getElapsedTimeF32() > 5.f)
3316 {
3317 object_debug_timer.reset();
3318 if (gObjectList.mNumDeadObjectUpdates)
3319 {
3320 llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl;
3321 gObjectList.mNumDeadObjectUpdates = 0;
3322 }
3323 if (gObjectList.mNumUnknownKills)
3324 {
3325 llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl;
3326 gObjectList.mNumUnknownKills = 0;
3327 }
3328 if (gObjectList.mNumUnknownUpdates)
3329 {
3330 llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl;
3331 gObjectList.mNumUnknownUpdates = 0;
3332 }
3333 }
3334 gFrameStats.addFrameData();
3335 }
3336
3337 if (!gDisconnected)
3338 {
3339 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3340
3341 ////////////////////////////////////////////////
3342 //
3343 // Network processing
3344 //
3345 // NOTE: Starting at this point, we may still have pointers to "dead" objects
3346 // floating throughout the various object lists.
3347 //
3348
3349 gFrameStats.start(LLFrameStats::IDLE_NETWORK);
3350 idleNetwork();
3351 stop_glerror();
3352
3353 gFrameStats.start(LLFrameStats::AGENT_MISC);
3354
3355 // Check for away from keyboard, kick idle agents.
3356 idle_afk_check();
3357
3358 // Update statistics for this frame
3359 update_statistics(gFrameCount);
3360
3361 gViewerWindow->updateDebugText();
3362 }
3363
3364 ////////////////////////////////////////
3365 //
3366 // Handle the regular UI idle callbacks as well as
3367 // hover callbacks
3368 //
3369
3370 {
3371// LLFastTimer t(LLFastTimer::FTM_IDLE_CB);
3372
3373 // Do event notifications if necessary. Yes, we may want to move this elsewhere.
3374 gEventNotifier.update();
3375
3376 gIdleCallbacks.callFunctions();
3377 }
3378
3379 if (gDisconnected)
3380 {
3381 return;
3382 }
3383
3384 gViewerWindow->handlePerFrameHover();
3385
3386 ///////////////////////////////////////
3387 // Agent and camera movement
3388 //
3389 LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
3390
3391// BOOL was_in_prelude = gAgent.inPrelude();
3392
3393 {
3394 //LLFastTimer t(LLFastTimer::FTM_TEMP1);
3395
3396 // After agent and camera moved, figure out if we need to
3397 // deselect objects.
3398 gSelectMgr->deselectAllIfTooFar();
3399
3400 }
3401
3402 {
3403 LLFastTimer t(LLFastTimer::FTM_RESET_DRAWORDER);
3404
3405 //////////////////////////////////////////////
3406 //
3407 // Clear draw orders
3408 //
3409 // Should actually be done after render, but handlePerFrameHover actually does a "render"
3410 // to do its selection.
3411 //
3412
3413 gPipeline.resetDrawOrders();
3414 }
3415 {
3416 // Handle pending gesture processing
3417 gGestureManager.update();
3418
3419 gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY);
3420 }
3421
3422 {
3423 LLFastTimer t(LLFastTimer::FTM_OBJECTLIST_UPDATE); // Actually "object update"
3424 gFrameStats.start(LLFrameStats::OBJECT_UPDATE);
3425
3426 if (!(logoutRequestSent() && hasSavedFinalSnapshot()))
3427 {
3428 gObjectList.update(gAgent, *gWorldp);
3429 }
3430 }
3431
3432 {
3433 LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY);
3434 gSky.updateSky();
3435 }
3436
3437 //////////////////////////////////////
3438 //
3439 // Deletes objects...
3440 // Has to be done after doing idleUpdates (which can kill objects)
3441 //
3442
3443 {
3444 LLFastTimer t(LLFastTimer::FTM_CLEANUP);
3445 gFrameStats.start(LLFrameStats::CLEAN_DEAD);
3446 gObjectList.cleanDeadObjects();
3447 LLDrawable::cleanupDeadDrawables();
3448 }
3449
3450 //
3451 // After this point, in theory we should never see a dead object
3452 // in the various object/drawable lists.
3453 //
3454
3455 //////////////////////////////////////
3456 //
3457 // Update/send HUD effects
3458 //
3459 // At this point, HUD effects may clean up some references to
3460 // dead objects.
3461 //
3462
3463 {
3464 //LLFastTimer t(LLFastTimer::FTM_TEMP3);
3465
3466 gFrameStats.start(LLFrameStats::UPDATE_EFFECTS);
3467 gSelectMgr->updateEffects();
3468 gHUDManager->cleanupEffects();
3469 gHUDManager->sendEffects();
3470 }
3471
3472 stop_glerror();
3473
3474 ////////////////////////////////////////
3475 //
3476 // Unpack layer data that we've received
3477 //
3478
3479 {
3480 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3481 gVLManager.unpackData();
3482 }
3483
3484 /////////////////////////
3485 //
3486 // Update surfaces, and surface textures as well.
3487 //
3488
3489 gWorldp->updateVisibilities();
3490 {
3491 const F32 max_region_update_time = .001f; // 1ms
3492 LLFastTimer t(LLFastTimer::FTM_REGION_UPDATE);
3493 gWorldp->updateRegions(max_region_update_time);
3494 }
3495
3496 /////////////////////////
3497 //
3498 // Update weather effects
3499 //
3500
3501 if (!gNoRender)
3502 {
3503 gWorldp->updateClouds(gFrameDTClamped);
3504 gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets
3505
3506 // Update wind vector
3507 LLVector3 wind_position_region;
3508 static LLVector3 average_wind;
3509
3510 LLViewerRegion *regionp;
3511 regionp = gWorldp->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position
3512 if (regionp)
3513 {
3514 gWindVec = regionp->mWind.getVelocity(wind_position_region);
3515
3516 // Compute average wind and use to drive motion of water
3517
3518 average_wind = regionp->mWind.getAverage();
3519 F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region);
3520
3521 gSky.setCloudDensityAtAgent(cloud_density);
3522 gSky.setWind(average_wind);
3523 //LLVOWater::setWind(average_wind);
3524 }
3525 else
3526 {
3527 gWindVec.setVec(0.0f, 0.0f, 0.0f);
3528 }
3529 }
3530 stop_glerror();
3531
3532 //////////////////////////////////////
3533 //
3534 // Update images, using the image stats generated during object update/culling
3535 //
3536 // Can put objects onto the retextured list.
3537 //
3538 gFrameStats.start(LLFrameStats::IMAGE_UPDATE);
3539
3540 LLFastTimer t(LLFastTimer::FTM_IMAGE_UPDATE);
3541
3542 LLViewerImage::updateClass(gCamera->getVelocityStat()->getMean(),
3543 gCamera->getAngularVelocityStat()->getMean());
3544
3545 gBumpImageList.updateImages(); // must be called before gImageList version so that it's textures are thrown out first.
3546
3547 const F32 max_image_decode_time = 0.005f; // 5 ms decode time
3548 gImageList.updateImages(max_image_decode_time);
3549 stop_glerror();
3550
3551 //////////////////////////////////////
3552 //
3553 // Sort and cull in the new renderer are moved to pipeline.cpp
3554 // Here, particles are updated and drawables are moved.
3555 //
3556
3557 if (!gNoRender)
3558 {
3559 gFrameStats.start(LLFrameStats::UPDATE_MOVE);
3560 gPipeline.updateMove();
3561
3562 gFrameStats.start(LLFrameStats::UPDATE_PARTICLES);
3563 gWorldp->updateParticles();
3564 }
3565 stop_glerror();
3566
3567 if (!LLViewerJoystick::sOverrideCamera)
3568 {
3569 gAgent.updateCamera();
3570 }
3571 else
3572 {
3573 LLViewerJoystick::updateCamera();
3574 }
3575
3576 // objects and camera should be in sync, do LOD calculations now
3577 {
3578 LLFastTimer t(LLFastTimer::FTM_LOD_UPDATE);
3579 gObjectList.updateApparentAngles(gAgent);
3580 }
3581
3582 {
3583 gFrameStats.start(LLFrameStats::AUDIO);
3584 LLFastTimer t(LLFastTimer::FTM_AUDIO_UPDATE);
3585
3586 if (gAudiop)
3587 {
3588 audio_update_volume(false);
3589 audio_update_listener();
3590 audio_update_wind(false);
3591
3592 // this line actually commits the changes we've made to source positions, etc.
3593 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time
3594 gAudiop->idle(max_audio_decode_time);
3595 }
3596 }
3597
3598 // Handle shutdown process, for example,
3599 // wait for floaters to close, send quit message,
3600 // forcibly quit if it has taken too long
3601 if (mQuitRequested)
3602 {
3603 idleShutdown();
3604 }
3605
3606 stop_glerror();
3607}
3608
3609void LLAppViewer::idleShutdown()
3610{
3611 // Wait for all modal alerts to get resolved
3612 if (LLModalDialog::activeCount() > 0)
3613 {
3614 return;
3615 }
3616
3617 // close IM interface
3618 if(gIMMgr)
3619 {
3620 gIMMgr->disconnectAllSessions();
3621 }
3622
3623 // Wait for all floaters to get resolved
3624 if (gFloaterView
3625 && !gFloaterView->allChildrenClosed())
3626 {
3627 return;
3628 }
3629
3630 static bool saved_snapshot = false;
3631 if (!saved_snapshot)
3632 {
3633 saved_snapshot = true;
3634 saveFinalSnapshot();
3635 return;
3636 }
3637
3638 const F32 SHUTDOWN_UPLOAD_SAVE_TIME = 5.f;
3639
3640 S32 pending_uploads = gAssetStorage->getNumPendingUploads();
3641 if (pending_uploads > 0
3642 && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME
3643 && !logoutRequestSent())
3644 {
3645 static S32 total_uploads = 0;
3646 // Sometimes total upload count can change during logout.
3647 total_uploads = llmax(total_uploads, pending_uploads);
3648 gViewerWindow->setShowProgress(TRUE);
3649 S32 finished_uploads = total_uploads - pending_uploads;
3650 F32 percent = 100.f * finished_uploads / total_uploads;
3651 gViewerWindow->setProgressPercent(percent);
3652 char buffer[MAX_STRING]; // Flawfinder: ignore
3653 snprintf(buffer, MAX_STRING, "Saving final data..."); // Flawfinder: ignore
3654 gViewerWindow->setProgressString(buffer);
3655 return;
3656 }
3657
3658 // All floaters are closed. Tell server we want to quit.
3659 if( !logoutRequestSent() )
3660 {
3661 sendLogoutRequest();
3662
3663 // Wait for a LogoutReply message
3664 gViewerWindow->setShowProgress(TRUE);
3665 gViewerWindow->setProgressPercent(100.f);
3666 gViewerWindow->setProgressString("Logging out...");
3667 return;
3668 }
3669
3670 // Make sure that we quit if we haven't received a reply from the server.
3671 if( logoutRequestSent()
3672 && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime )
3673 {
3674 forceQuit();
3675 return;
3676 }
3677}
3678
3679void LLAppViewer::sendLogoutRequest()
3680{
3681 if(!mLogoutRequestSent)
3682 {
3683 LLMessageSystem* msg = gMessageSystem;
3684 msg->newMessageFast(_PREHASH_LogoutRequest);
3685 msg->nextBlockFast(_PREHASH_AgentData);
3686 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
3687 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3688 gAgent.sendReliableMessage();
3689
3690 gLogoutTimer.reset();
3691 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
3692 mLogoutRequestSent = TRUE;
3693
3694 gVoiceClient->leaveChannel();
3695 }
3696}
3697
3698//
3699// Handle messages, and all message related stuff
3700//
3701
3702#define TIME_THROTTLE_MESSAGES
3703
3704#ifdef TIME_THROTTLE_MESSAGES
3705#define CHECK_MESSAGES_DEFAULT_MAX_TIME .020f // 50 ms = 50 fps (just for messages!)
3706static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3707#endif
3708
3709void LLAppViewer::idleNetwork()
3710{
3711 gObjectList.mNumNewObjects = 0;
3712 S32 total_decoded = 0;
3713
3714 if (!gSavedSettings.getBOOL("SpeedTest"))
3715 {
3716 LLFastTimer t(LLFastTimer::FTM_IDLE_NETWORK); // decode
3717
3718 // deal with any queued name requests and replies.
3719 gCacheName->processPending();
3720
3721 LLTimer check_message_timer;
3722 // Read all available packets from network
3723 stop_glerror();
3724 const S64 frame_count = gFrameCount; // U32->S64
3725 F32 total_time = 0.0f;
3726 while (gMessageSystem->checkAllMessages(frame_count, gServicePump))
3727 {
3728 if (gDoDisconnect)
3729 {
3730 // We're disconnecting, don't process any more messages from the server
3731 // We're usually disconnecting due to either network corruption or a
3732 // server going down, so this is OK.
3733 break;
3734 }
3735 stop_glerror();
3736
3737 total_decoded++;
3738 gPacketsIn++;
3739
3740 if (total_decoded > MESSAGE_MAX_PER_FRAME)
3741 {
3742 break;
3743 }
3744
3745#ifdef TIME_THROTTLE_MESSAGES
3746 // Prevent slow packets from completely destroying the frame rate.
3747 // This usually happens due to clumps of avatars taking huge amount
3748 // of network processing time (which needs to be fixed, but this is
3749 // a good limit anyway).
3750 total_time = check_message_timer.getElapsedTimeF32();
3751 if (total_time >= CheckMessagesMaxTime)
3752 break;
3753#endif
3754 }
3755 // Handle per-frame message system processing.
3756 gMessageSystem->processAcks();
3757
3758#ifdef TIME_THROTTLE_MESSAGES
3759 if (total_time >= CheckMessagesMaxTime)
3760 {
3761 // Increase CheckMessagesMaxTime so that we will eventually catch up
3762 CheckMessagesMaxTime *= 1.035f; // 3.5% ~= x2 in 20 frames, ~8x in 60 frames
3763 }
3764 else
3765 {
3766 // Reset CheckMessagesMaxTime to default value
3767 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3768 }
3769#endif
3770
3771
3772
3773 // we want to clear the control after sending out all necessary agent updates
3774 gAgent.resetControlFlags();
3775 stop_glerror();
3776
3777
3778 // Decode enqueued messages...
3779 S32 remaining_possible_decodes = MESSAGE_MAX_PER_FRAME - total_decoded;
3780
3781 if( remaining_possible_decodes <= 0 )
3782 {
3783 llinfos << "Maxed out number of messages per frame at " << MESSAGE_MAX_PER_FRAME << llendl;
3784 }
3785
3786 if (gPrintMessagesThisFrame)
3787 {
3788 llinfos << "Decoded " << total_decoded << " msgs this frame!" << llendl;
3789 gPrintMessagesThisFrame = FALSE;
3790 }
3791 }
3792
3793 gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
3794
3795 // Retransmit unacknowledged packets.
3796 gXferManager->retransmitUnackedPackets();
3797 gAssetStorage->checkForTimeouts();
3798
3799 gViewerThrottle.updateDynamicThrottle();
3800}
3801
3802void LLAppViewer::disconnectViewer()
3803{
3804 if (gDisconnected)
3805 {
3806 return;
3807 }
3808 //
3809 // Cleanup after quitting.
3810 //
3811 // Save snapshot for next time, if we made it through initialization
3812
3813 llinfos << "Disconnecting viewer!" << llendl;
3814
3815 // Dump our frame statistics
3816 gFrameStats.dump();
3817
3818 // Remember if we were flying
3819 gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() );
3820
3821 // Un-minimize all windows so they don't get saved minimized
3822 if (!gNoRender)
3823 {
3824 if (gFloaterView)
3825 {
3826 gFloaterView->restoreAll();
3827 }
3828 }
3829
3830 if (gSelectMgr)
3831 {
3832 gSelectMgr->deselectAll();
3833 }
3834
3835 if (!gNoRender)
3836 {
3837 // save inventory if appropriate
3838 gInventory.cache(gAgent.getInventoryRootID(), gAgent.getID());
3839 if(gInventoryLibraryRoot.notNull() && gInventoryLibraryOwner.notNull())
3840 {
3841 gInventory.cache(gInventoryLibraryRoot, gInventoryLibraryOwner);
3842 }
3843 }
3844
3845 saveNameCache();
3846
3847 // close inventory interface, close all windows
3848 LLInventoryView::cleanup();
3849
3850 // Also writes cached agent settings to gSavedSettings
3851 gAgent.cleanup();
3852
3853 gObjectList.destroy();
3854 delete gWorldp;
3855 gWorldp = NULL;
3856
3857 cleanup_xfer_manager();
3858 gDisconnected = TRUE;
3859}
3860
3861void LLAppViewer::forceErrorLLError()
3862{
3863 llerrs << "This is an llerror" << llendl;
3864}
3865
3866void LLAppViewer::forceErrorBreakpoint()
3867{
3868#ifdef LL_WINDOWS
3869 DebugBreak();
3870#endif
3871 return;
3872}
3873
3874void LLAppViewer::forceErrorBadMemoryAccess()
3875{
3876 S32* crash = NULL;
3877 *crash = 0xDEADBEEF;
3878 return;
3879}
3880
3881void LLAppViewer::forceErrorInifiniteLoop()
3882{
3883 while(true)
3884 {
3885 ;
3886 }
3887 return;
3888}
3889
3890void LLAppViewer::forceErrorSoftwareException()
3891{
3892 // *FIX: Any way to insure it won't be handled?
3893 throw;
3894}
diff --git a/linden/indra/newview/llappviewer.h b/linden/indra/newview/llappviewer.h
new file mode 100644
index 0000000..e97aead
--- /dev/null
+++ b/linden/indra/newview/llappviewer.h
@@ -0,0 +1,294 @@
1/**
2 * @file llappviewer.h
3 * @brief The LLAppViewer class declaration
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LL_LLAPPVIEWER_H
33#define LL_LLAPPVIEWER_H
34
35class LLTextureCache;
36class LLWorkerThread;
37class LLTextureFetch;
38
39class LLAppViewer : public LLApp
40{
41public:
42 LLAppViewer();
43 virtual ~LLAppViewer();
44
45 // *NOTE:Mani - Don't use this!
46 // Having
47 static LLAppViewer* instance() {return sInstance; }
48
49 //
50 // Main application logic
51 //
52 virtual bool init(); // Override to do application initialization
53 virtual bool cleanup(); // Override to do application cleanup
54 virtual bool mainLoop(); // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit.
55
56 // Application control
57 void forceQuit(); // Puts the viewer into 'shutting down without error' mode.
58 void requestQuit(); // Request a quit. A kinder, gentler quit.
59 void userQuit(); // The users asks to quit. Confirm, then requestQuit()
60 void earlyExit(const LLString& msg); // Display an error dialog and forcibly quit.
61 void forceExit(S32 arg); // exit() immediately (after some cleanup).
62 void abortQuit(); // Called to abort a quit request.
63
64 bool quitRequested() { return mQuitRequested; }
65 bool logoutRequestSent() { return mLogoutRequestSent; }
66
67 // *FIX: This is meant to stay only until the command line issues are hashed out with repect to LLApp::parseCommandLine
68 // This version stores the argc and argv for later usage, make sure the params passed in last as long as this class.
69 bool tempStoreCommandOptions(int argc, char** argv);
70
71 void closeDebug();
72
73 const LLOSInfo& getOSInfo() const { return mSysOSInfo; }
74
75 // Report true if under the control of a debugger. A null-op default.
76 virtual bool beingDebugged() { return false; }
77
78 S32 getCrashBehavior() const { return mCrashBehavior; }
79 void setCrashBehavior(S32 cb);
80 virtual void handleCrashReporting() = 0; // What to do with crash report?
81 static void handleViewerCrash(); // Hey! The viewer crashed. Do this.
82
83 // Thread accessors
84 static LLTextureCache* getTextureCache() { return sTextureCache; }
85 static LLWorkerThread* getImageDecodeThread() { return sImageDecodeThread; }
86 static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
87
88 const std::string& getSerialNumber() { return mSerialNumber; }
89
90 // *FIX:Mani purgeCache was made public for parse_args().
91 // If that beast is gone, make it private.
92 void purgeCache(); // Clear the local cache.
93 bool getPurgeCache() const { return mPurgeCache; }
94
95 const LLString& getSecondLifeTitle() const; // The Second Life title.
96 const LLString& getWindowTitle() const; // The window display name.
97
98 // Helpers for URIs
99 void addLoginURI(const std::string& uri);
100 void setHelperURI(const std::string& uri);
101 const std::vector<std::string>& getLoginURIs() const;
102 const std::string& getHelperURI() const;
103 void resetURIs() const;
104
105 void forceDisconnect(const LLString& msg); // Force disconnection, with a message to the user.
106 void badNetworkHandler(); // Cause a crash state due to bad network packet.
107
108 bool hasSavedFinalSnapshot() { return mSavedFinalSnapshot; }
109 void saveFinalSnapshot();
110
111 void loadNameCache();
112 void saveNameCache();
113
114 // LLAppViewer testing helpers.
115 // *NOTE: These will potentially crash the viewer. Only for debugging.
116 virtual void forceErrorLLError();
117 virtual void forceErrorBreakpoint();
118 virtual void forceErrorBadMemoryAccess();
119 virtual void forceErrorInifiniteLoop();
120 virtual void forceErrorSoftwareException();
121
122protected:
123 virtual bool initWindow(); // Initialize the viewer's window.
124 virtual bool initLogging(); // Initialize log files, logging system, return false on failure.
125 virtual bool initHardwareTest() { return true; } // A false result indicates the app should quit.
126
127 virtual std::string generateSerialNumber() = 0; // Platforms specific classes generate this.
128
129
130private:
131
132 bool initEarlyConfiguration(); // Initialize setting needed by crash reporting.
133 bool initThreads(); // Initialize viewer threads, return false on failure.
134 bool initConfiguration(); // Initialize settings from the command line/config file.
135
136 bool initCache(); // Initialize local client cache.
137
138 bool doConfigFromCommandLine(); // calls parse args.
139
140 void cleanupSavedSettings(); // Sets some config data to current or default values during cleanup.
141 void removeCacheFiles(const char *filemask); // Deletes cached files the match the given wildcard.
142
143 void writeSystemInfo(); // Write system info to "debug_info.log"
144
145 bool anotherInstanceRunning();
146 void initMarkerFile();
147 void removeMarkerFile();
148
149 void idle();
150 void idleShutdown();
151 void idleNetwork();
152
153 void sendLogoutRequest();
154 void disconnectViewer();
155
156 // *FIX: the app viewer class should be some sort of singleton, no?
157 // Perhaps its child class is the singleton and this should be an abstract base.
158 static LLAppViewer* sInstance;
159
160 bool mSecondInstance; // Is this a second instance of the app?
161
162 FILE *mMarkerFile; // A file created to indicate the app is running.
163 bool mLastExecFroze; // Set on init if the marker file was found.
164
165 LLOSInfo mSysOSInfo;
166 S32 mCrashBehavior;
167 bool mReportedCrash;
168
169 // Thread objects.
170 static LLTextureCache* sTextureCache;
171 static LLWorkerThread* sImageDecodeThread;
172 static LLTextureFetch* sTextureFetch;
173
174 S32 mNumSessions;
175
176 std::string mSerialNumber;
177 bool mPurgeCache;
178 bool mPurgeOnExit;
179
180 bool mSavedFinalSnapshot;
181
182 bool mQuitRequested; // User wants to quit, may have modified documents open.
183 bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
184};
185
186// consts from viewer.h
187const S32 AGENT_UPDATES_PER_SECOND = 10;
188
189// Globals with external linkage. From viewer.h
190// *NOTE:Mani - These will be removed as the Viewer App Cleanup project continues.
191//
192// "// llstartup" indicates that llstartup is the only client for this global.
193
194extern bool gVerifySSLCert; // parse_args setting used by llxmlrpctransaction.cpp
195extern BOOL gHandleKeysAsync; // gSavedSettings used by llviewerdisplay.cpp & llviewermenu.cpp
196extern BOOL gProbeHardware;
197extern LLString gDisabledMessage; // llstartup
198extern BOOL gHideLinks; // used by llpanellogin, lllfloaterbuycurrency, llstartup
199extern BOOL gInProductionGrid;
200extern LLSD gDebugInfo;
201
202extern BOOL gAllowIdleAFK;
203extern F32 gAFKTimeout;
204extern BOOL gShowObjectUpdates;
205
206extern BOOL gLogMessages; // llstartup
207extern std::string gChannelName;
208extern BOOL gUseAudio; // llstartup
209
210extern LLString gCmdLineFirstName; // llstartup
211extern LLString gCmdLineLastName;
212extern LLString gCmdLinePassword;
213
214extern BOOL gAutoLogin; // llstartup
215extern const char* DEFAULT_SETTINGS_FILE; // llstartup
216
217extern BOOL gRequestInventoryLibrary; // llstartup
218extern BOOL gGodConnect; // llstartup
219
220extern BOOL gAcceptTOS;
221extern BOOL gAcceptCriticalMessage;
222
223extern LLUUID gViewerDigest; // MD5 digest of the viewer's executable file.
224extern BOOL gLastExecFroze; // llstartup
225
226extern U32 gFrameCount;
227extern U32 gForegroundFrameCount;
228
229extern LLPumpIO* gServicePump;
230
231// Is the Pacific time zone (aka server time zone)
232// currently in daylight savings time?
233extern BOOL gPacificDaylightTime;
234
235extern U64 gFrameTime; // The timestamp of the most-recently-processed frame
236extern F32 gFrameTimeSeconds; // Loses msec precision after ~4.5 hours...
237extern F32 gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds
238extern F32 gFPSClamped; // Frames per second, smoothed, weighted toward last frame
239extern F32 gFrameDTClamped;
240extern U64 gStartTime;
241
242extern LLTimer gRenderStartTime;
243extern LLFrameTimer gForegroundTime;
244
245extern F32 gLogoutMaxTime;
246extern LLTimer gLogoutTimer;
247
248extern F32 gSimLastTime;
249extern F32 gSimFrames;
250
251extern LLUUID gInventoryLibraryOwner;
252extern LLUUID gInventoryLibraryRoot;
253
254extern BOOL gDisconnected;
255extern BOOL gDisableVoice;
256
257// Map scale in pixels per region
258extern F32 gMapScale;
259extern F32 gMiniMapScale;
260
261extern LLFrameTimer gRestoreGLTimer;
262extern BOOL gRestoreGL;
263extern BOOL gUseWireframe;
264
265extern F32 gMouseSensitivity;
266extern BOOL gInvertMouse;
267
268// VFS globals - gVFS is for general use
269// gStaticVFS is read-only and is shipped w/ the viewer
270// it has pre-cache data like the UI .TGAs
271extern LLVFS *gStaticVFS;
272
273extern LLMemoryInfo gSysMemory;
274
275extern bool gPreloadImages;
276extern bool gPreloadSounds;
277
278extern LLString gLastVersionChannel;
279
280extern LLVector3 gWindVec;
281extern LLVector3 gRelativeWindVec;
282extern U32 gPacketsIn;
283extern BOOL gPrintMessagesThisFrame;
284
285extern LLUUID gSunTextureID;
286extern LLUUID gMoonTextureID;
287
288extern BOOL gUseConsole;
289
290extern BOOL gRandomizeFramerate;
291extern BOOL gPeriodicSlowFrame;
292
293extern BOOL gQAMode;
294#endif // LL_LLAPPVIEWER_H
diff --git a/linden/indra/newview/llappviewerlinux.cpp b/linden/indra/newview/llappviewerlinux.cpp
new file mode 100644
index 0000000..1993fd0
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux.cpp
@@ -0,0 +1,414 @@
1/**
2 * @file llappviewerlinux.cpp
3 * @brief The LLAppViewerWin32 class definitions
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llviewerprecompiledheaders.h"
33
34#include "llmemtype.h"
35#include "llappviewerlinux.h"
36
37#include "llviewernetwork.h"
38#include "llmd5.h"
39
40 #if LL_LINUX
41 # include <dlfcn.h> // RTLD_LAZY
42 # include <execinfo.h> // backtrace - glibc only
43 # ifndef LL_ELFBIN
44 #define LL_ELFBIN 1
45 # endif // LL_ELFBIN
46 # if LL_ELFBIN
47 # include <cxxabi.h> // for symbol demangling
48 # include "ELFIO.h" // for better backtraces
49 # endif // LL_ELFBIN
50 #elif LL_SOLARIS
51 # include <sys/types.h>
52 # include <unistd.h>
53 # include <fcntl.h>
54 # include <ucontext.h>
55 #endif
56
57int main( int argc, char **argv )
58{
59 LLMemType mt1(LLMemType::MTYPE_STARTUP);
60
61#if LL_SOLARIS && defined(__sparc)
62 asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
63#endif
64
65 LLAppViewer* viewer_app_ptr = new LLAppViewerLinux();
66
67 viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
68
69 bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
70 if(!ok)
71 {
72 llwarns << "Unable to parse command line." << llendl;
73 return -1;
74 }
75
76 ok = viewer_app_ptr->init();
77 if(!ok)
78 {
79 llwarns << "Application init failed." << llendl;
80 return -1;
81 }
82
83 // Run the application main loop
84 if(!LLApp::isQuitting())
85 {
86 viewer_app_ptr->mainLoop();
87 }
88
89 if (!LLApp::isError())
90 {
91 //
92 // We don't want to do cleanup here if the error handler got called -
93 // the assumption is that the error handler is responsible for doing
94 // app cleanup if there was a problem.
95 //
96 viewer_app_ptr->cleanup();
97 }
98 delete viewer_app_ptr;
99 viewer_app_ptr = NULL;
100 return 0;
101}
102
103#ifdef LL_SOLARIS
104static inline BOOL do_basic_glibc_backtrace()
105{
106 BOOL success = FALSE;
107
108 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
109 llinfos << "Opening stack trace file " << strace_filename << llendl;
110 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w");
111 if (!StraceFile)
112 {
113 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
114 StraceFile = stderr;
115 }
116
117 printstack(fileno(StraceFile));
118
119 if (StraceFile != stderr)
120 fclose(StraceFile);
121
122 return success;
123}
124#else
125#define MAX_STACK_TRACE_DEPTH 40
126// This uses glibc's basic built-in stack-trace functions for a not very
127// amazing backtrace.
128static inline BOOL do_basic_glibc_backtrace()
129{
130 void *array[MAX_STACK_TRACE_DEPTH];
131 size_t size;
132 char **strings;
133 size_t i;
134 BOOL success = FALSE;
135
136 size = backtrace(array, MAX_STACK_TRACE_DEPTH);
137 strings = backtrace_symbols(array, size);
138
139 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
140 llinfos << "Opening stack trace file " << strace_filename << llendl;
141 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); // Flawfinder: ignore
142 if (!StraceFile)
143 {
144 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
145 StraceFile = stderr;
146 }
147
148 if (size)
149 {
150 for (i = 0; i < size; i++)
151 fputs((std::string(strings[i])+"\n").c_str(),
152 StraceFile);
153
154 success = TRUE;
155 }
156
157 if (StraceFile != stderr)
158 fclose(StraceFile);
159
160 free (strings);
161 return success;
162}
163
164#if LL_ELFBIN
165// This uses glibc's basic built-in stack-trace functions together with
166// ELFIO's ability to parse the .symtab ELF section for better symbol
167// extraction without exporting symbols (which'd cause subtle, fatal bugs).
168static inline BOOL do_elfio_glibc_backtrace()
169{
170 void *array[MAX_STACK_TRACE_DEPTH];
171 size_t btsize;
172 char **strings;
173 BOOL success = FALSE;
174
175 std::string appfilename = gDirUtilp->getExecutablePathAndName();
176
177 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
178 llinfos << "Opening stack trace file " << strace_filename << llendl;
179 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); // Flawfinder: ignore
180 if (!StraceFile)
181 {
182 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
183 StraceFile = stderr;
184 }
185
186 // get backtrace address list and basic symbol info
187 btsize = backtrace(array, MAX_STACK_TRACE_DEPTH);
188 strings = backtrace_symbols(array, btsize);
189
190 // create ELF reader for our app binary
191 IELFI* pReader;
192 const IELFISection* pSec = NULL;
193 IELFISymbolTable* pSymTbl = 0;
194 if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) ||
195 ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) ||
196 // find symbol table, create reader-object
197 NULL == (pSec = pReader->GetSection( ".symtab" )) ||
198 ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) )
199 {
200 // Failed to open our binary and read its symbol table somehow
201 llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl;
202 if (StraceFile != stderr)
203 fclose(StraceFile);
204 // note that we may be leaking some of the above ELFIO
205 // objects now, but it's expected that we'll be dead soon
206 // and we want to tread delicately until we get *some* kind
207 // of useful backtrace.
208 return do_basic_glibc_backtrace();
209 }
210
211 // iterate over trace and symtab, looking for plausible symbols
212 std::string name;
213 Elf32_Addr value;
214 Elf32_Word ssize;
215 unsigned char bind;
216 unsigned char type;
217 Elf32_Half section;
218 int nSymNo = pSymTbl->GetSymbolNum();
219 size_t btpos;
220 for (btpos = 0; btpos < btsize; ++btpos)
221 {
222 fprintf(StraceFile, "%d:\t", btpos);
223 int symidx;
224 for (symidx = 0; symidx < nSymNo; ++symidx)
225 {
226 if (ERR_ELFIO_NO_ERROR ==
227 pSymTbl->GetSymbol(symidx, name, value, ssize,
228 bind, type, section))
229 {
230 // check if trace address within symbol range
231 if (uintptr_t(array[btpos]) >= value &&
232 uintptr_t(array[btpos]) < value+ssize)
233 {
234 char *demangled_str = NULL;
235 int demangle_result = 1;
236 demangled_str =
237 abi::__cxa_demangle
238 (name.c_str(), NULL, NULL,
239 &demangle_result);
240 if (0 == demangle_result &&
241 NULL != demangled_str) {
242 fprintf(StraceFile,
243 "ELF(%s", demangled_str);
244 free(demangled_str);
245 }
246 else // failed demangle; print it raw
247 {
248 fprintf(StraceFile,
249 "ELF(%s", name.c_str());
250 }
251 // print offset from symbol start
252 fprintf(StraceFile,
253 "+0x%lx) [%p]\n",
254 uintptr_t(array[btpos]) -
255 value,
256 array[btpos]);
257 goto got_sym; // early escape
258 }
259 }
260 }
261 // Fallback:
262 // Didn't find a suitable symbol in the binary - it's probably
263 // a symbol in a DSO; use glibc's idea of what it should be.
264 fprintf(StraceFile, "%s\n", strings[btpos]);
265 got_sym:;
266 }
267
268 if (StraceFile != stderr)
269 fclose(StraceFile);
270
271 pSymTbl->Release();
272 pSec->Release();
273 pReader->Release();
274
275 free(strings);
276
277 llinfos << "Finished generating stack trace." << llendl;
278
279 success = TRUE;
280 return success;
281}
282#endif // LL_ELFBIN
283
284#endif // LL_SOLARIS
285
286
287LLAppViewerLinux::LLAppViewerLinux()
288{
289}
290
291LLAppViewerLinux::~LLAppViewerLinux()
292{
293}
294
295bool LLAppViewerLinux::init()
296{
297 return LLAppViewer::init();
298}
299
300void LLAppViewerLinux::handleCrashReporting()
301{
302
303 // Always generate the report, have the logger do the asking, and
304 // don't wait for the logger before exiting (-> total cleanup).
305 if (CRASH_BEHAVIOR_NEVER_SEND != LLAppViewer::instance()->getCrashBehavior())
306 {
307 // This backtrace writes into stack_trace.log
308# if LL_ELFBIN
309 do_elfio_glibc_backtrace(); // more useful backtrace
310# else
311 do_basic_glibc_backtrace(); // only slightly useful backtrace
312# endif // LL_ELFBIN
313 // launch the actual crash logger
314 char* ask_dialog = "-dialog";
315 if (CRASH_BEHAVIOR_ASK != LLAppViewer::instance()->getCrashBehavior())
316 ask_dialog = ""; // omit '-dialog' option
317 std::string cmd =gDirUtilp->getAppRODataDir();
318 cmd += gDirUtilp->getDirDelimiter();
319 cmd += "linux-crash-logger.bin";
320 char* const cmdargv[] =
321 {(char*)cmd.c_str(),
322 ask_dialog,
323 (char*)"-user",
324 (char*)gGridName,
325 (char*)"-name",
326 (char*)LLAppViewer::instance()->getSecondLifeTitle().c_str(),
327 NULL};
328 pid_t pid = fork();
329 if (pid == 0)
330 { // child
331 execv(cmd.c_str(), cmdargv); /* Flawfinder: ignore */
332 llwarns << "execv failure when trying to start " << cmd << llendl;
333 _exit(1); // avoid atexit()
334 }
335 else
336 {
337 if (pid > 0)
338 {
339 // DO NOT wait for child proc to die; we want
340 // the logger to outlive us while we quit to
341 // free up the screen/keyboard/etc.
342 ////int childExitStatus;
343 ////waitpid(pid, &childExitStatus, 0);
344 }
345 else
346 {
347 llwarns << "fork failure." << llendl;
348 }
349 }
350 }
351 // Sometimes signals don't seem to quit the viewer.
352 // Make sure we exit so as to not totally confuse the user.
353 exit(1);
354}
355
356bool LLAppViewerLinux::beingDebugged()
357{
358 static enum {unknown, no, yes} debugged = unknown;
359
360 if (debugged == unknown)
361 {
362 pid_t ppid = getppid();
363 char *name;
364 int ret;
365
366 ret = asprintf(&name, "/proc/%d/exe", ppid);
367 if (ret != -1)
368 {
369 char buf[1024];
370 ssize_t n;
371
372 n = readlink(name, buf, sizeof(buf) - 1);
373 if (n != -1)
374 {
375 char *base = strrchr(buf, '/');
376 buf[n + 1] = '\0';
377 if (base == NULL)
378 {
379 base = buf;
380 } else {
381 base += 1;
382 }
383
384 if (strcmp(base, "gdb") == 0)
385 {
386 debugged = yes;
387 }
388 }
389 free(name);
390 }
391 }
392
393 return debugged == yes;
394}
395
396bool LLAppViewerLinux::initLogging()
397{
398 // Remove the last stack trace, if any
399 std::string old_stack_file =
400 gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
401 LLFile::remove(old_stack_file.c_str());
402
403 return LLAppViewer::initLogging();
404}
405
406std::string LLAppViewerLinux::generateSerialNumber()
407{
408 char serial_md5[MD5HEX_STR_SIZE];
409 serial_md5[0] = 0;
410
411 // TODO
412
413 return serial_md5;
414}
diff --git a/linden/indra/newview/llappviewerlinux.h b/linden/indra/newview/llappviewerlinux.h
new file mode 100644
index 0000000..f38a64a
--- /dev/null
+++ b/linden/indra/newview/llappviewerlinux.h
@@ -0,0 +1,59 @@
1/**
2 * @file llappviewerlinux.h
3 * @brief The LLAppViewerLinux class declaration
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LL_LLAPPVIEWERLINUX_H
33#define LL_LLAPPVIEWERLINUX_H
34
35#ifndef LL_LLAPPVIEWER_H
36#include "llappviewer.h"
37#endif
38
39class LLAppViewerLinux : public LLAppViewer
40{
41public:
42 LLAppViewerLinux();
43 virtual ~LLAppViewerLinux();
44
45 //
46 // Main application logic
47 //
48 virtual bool init(); // Override to do application initialization
49 std::string generateSerialNumber();
50
51protected:
52 virtual bool beingDebugged();
53
54 virtual void handleCrashReporting();
55
56 virtual bool initLogging();
57};
58
59#endif // LL_LLAPPVIEWERLINUX_H
diff --git a/linden/indra/newview/llappviewermacosx.cpp b/linden/indra/newview/llappviewermacosx.cpp
new file mode 100644
index 0000000..e80491e
--- /dev/null
+++ b/linden/indra/newview/llappviewermacosx.cpp
@@ -0,0 +1,373 @@
1/**
2 * @file llappviewermacosx.cpp
3 * @brief The LLAppViewerWin32 class definitions
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llviewerprecompiledheaders.h"
33
34#if !defined LL_DARWIN
35 #error "Use only with Mac OS X"
36#endif
37
38#include "llappviewermacosx.h"
39#include "llmemtype.h"
40
41#include "llviewernetwork.h"
42#include "llmd5.h"
43#include "llurlsimstring.h"
44#include "llfloaterworldmap.h"
45#include "llurldispatcher.h"
46#include <Carbon/Carbon.h>
47
48
49int main( int argc, char **argv )
50{
51 LLMemType mt1(LLMemType::MTYPE_STARTUP);
52
53#if LL_SOLARIS && defined(__sparc)
54 asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
55#endif
56
57 // Set the working dir to <bundle>/Contents/Resources
58 (void) chdir(gDirUtilp->getAppRODataDir().c_str());
59
60 LLAppViewerMacOSX* viewer_app_ptr = new LLAppViewerMacOSX();
61
62 viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
63
64 bool ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
65 if(!ok)
66 {
67 llwarns << "Unable to parse command line." << llendl;
68 return -1;
69 }
70
71 ok = viewer_app_ptr->init();
72 if(!ok)
73 {
74 llwarns << "Application init failed." << llendl;
75 return -1;
76 }
77
78 // Run the application main loop
79 if(!LLApp::isQuitting())
80 {
81 viewer_app_ptr->mainLoop();
82 }
83
84 if (!LLApp::isError())
85 {
86 //
87 // We don't want to do cleanup here if the error handler got called -
88 // the assumption is that the error handler is responsible for doing
89 // app cleanup if there was a problem.
90 //
91 viewer_app_ptr->cleanup();
92 }
93 delete viewer_app_ptr;
94 viewer_app_ptr = NULL;
95 return 0;
96}
97
98LLAppViewerMacOSX::LLAppViewerMacOSX()
99{
100}
101
102LLAppViewerMacOSX::~LLAppViewerMacOSX()
103{
104}
105
106bool LLAppViewerMacOSX::init()
107{
108 return LLAppViewer::init();
109}
110
111void LLAppViewerMacOSX::handleCrashReporting()
112{
113 // Macintosh
114 LLString command_str;
115 command_str = "crashreporter.app/Contents/MacOS/crashreporter ";
116 command_str += "-user ";
117 command_str += gGridName;
118 command_str += " &"; // This backgrounds the command so system() doesn't block until the crashreporter exits.
119 system(command_str.c_str()); /* Flawfinder: ignore */
120
121 // Sometimes signals don't seem to quit the viewer.
122 // Make sure we exit so as to not totally confuse the user.
123 exit(1);
124}
125
126std::string LLAppViewerMacOSX::generateSerialNumber()
127{
128 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore
129 serial_md5[0] = 0;
130
131 // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html
132 CFStringRef serialNumber = NULL;
133 io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
134 IOServiceMatching("IOPlatformExpertDevice"));
135 if (platformExpert) {
136 serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert,
137 CFSTR(kIOPlatformSerialNumberKey),
138 kCFAllocatorDefault, 0);
139 IOObjectRelease(platformExpert);
140 }
141
142 if (serialNumber)
143 {
144 char buffer[MAX_STRING]; // Flawfinder: ignore
145 if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII))
146 {
147 LLMD5 md5( (unsigned char*)buffer );
148 md5.hex_digest(serial_md5);
149 }
150 CFRelease(serialNumber);
151 }
152
153 return serial_md5;
154}
155
156OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
157{
158 OSErr result = noErr;
159 DescType actualType;
160 char buffer[1024]; // Flawfinder: ignore
161 Size size;
162
163 result = AEGetParamPtr (
164 messagein,
165 keyDirectObject,
166 typeCString,
167 &actualType,
168 (Ptr)buffer,
169 sizeof(buffer),
170 &size);
171
172 if(result == noErr)
173 {
174 std::string url = buffer;
175 LLURLDispatcher::dispatch(url);
176 }
177
178 return(result);
179}
180
181OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
182{
183 OSErr result = noErr;
184
185 LLAppViewer::instance()->userQuit();
186
187 return(result);
188}
189
190OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata)
191{
192 OSStatus result = eventNotHandledErr;
193 OSStatus err;
194 UInt32 evtClass = GetEventClass(event);
195 UInt32 evtKind = GetEventKind(event);
196 WindowRef window = (WindowRef)userdata;
197
198 if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess))
199 {
200 HICommand cmd;
201 err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd);
202
203 if(err == noErr)
204 {
205 switch(cmd.commandID)
206 {
207 case kHICommandOK:
208 QuitAppModalLoopForWindow(window);
209 result = noErr;
210 break;
211
212 case kHICommandCancel:
213 QuitAppModalLoopForWindow(window);
214 result = userCanceledErr;
215 break;
216 }
217 }
218 }
219
220 return(result);
221}
222
223OSStatus DisplayReleaseNotes(void)
224{
225 OSStatus err;
226 IBNibRef nib = NULL;
227 WindowRef window = NULL;
228
229 err = CreateNibReference(CFSTR("SecondLife"), &nib);
230
231 if(err == noErr)
232 {
233 CreateWindowFromNib(nib, CFSTR("Release Notes"), &window);
234 }
235
236 if(err == noErr)
237 {
238 // Get the text view control
239 HIViewRef textView;
240 ControlID id;
241
242 id.signature = 'text';
243 id.id = 0;
244
245 LLString releaseNotesText;
246
247 _read_file_into_string(releaseNotesText, "releasenotes.txt"); // Flawfinder: ignore
248
249 err = HIViewFindByID(HIViewGetRoot(window), id, &textView);
250
251 if(err == noErr)
252 {
253 // Convert from the encoding used in the release notes.
254 CFStringRef str = CFStringCreateWithBytes(
255 NULL,
256 (const UInt8*)releaseNotesText.c_str(),
257 releaseNotesText.size(),
258 kCFStringEncodingWindowsLatin1, // This matches the way the Windows version displays the release notes.
259 FALSE);
260
261 if(str != NULL)
262 {
263 int size = CFStringGetLength(str);
264
265 if(size > 0)
266 {
267 UniChar *chars = new UniChar[size + 1];
268 CFStringGetCharacters(str, CFRangeMake(0, size), chars);
269
270 err = TXNSetData(HITextViewGetTXNObject(textView), kTXNUnicodeTextData, chars, size * sizeof(UniChar), kTXNStartOffset, kTXNStartOffset);
271
272 delete[] chars;
273 }
274
275 CFRelease(str);
276 }
277 else
278 {
279 // Creating the string failed. Probably an encoding problem. Display SOMETHING...
280 err = TXNSetData(HITextViewGetTXNObject(textView), kTXNTextData, releaseNotesText.c_str(), releaseNotesText.size(), kTXNStartOffset, kTXNStartOffset);
281 }
282 }
283
284 // Set the selection to the beginning of the text and scroll it into view.
285 if(err == noErr)
286 {
287 err = TXNSetSelection(HITextViewGetTXNObject(textView), kTXNStartOffset, kTXNStartOffset);
288 }
289
290 if(err == noErr)
291 {
292 // This function returns void.
293 TXNShowSelection(HITextViewGetTXNObject(textView), false);
294 }
295 }
296
297 if(err == noErr)
298 {
299 ShowWindow(window);
300 }
301
302 if(err == noErr)
303 {
304 // Set up an event handler for the window.
305 EventHandlerRef handler = NULL;
306 EventTypeSpec handlerEvents[] =
307 {
308 { kEventClassCommand, kEventCommandProcess }
309 };
310
311 InstallWindowEventHandler(
312 window,
313 NewEventHandlerUPP(simpleDialogHandler),
314 GetEventTypeCount (handlerEvents),
315 handlerEvents,
316 (void*)window,
317 &handler);
318 }
319
320 if(err == noErr)
321 {
322 RunAppModalLoopForWindow(window);
323 }
324
325 if(window != NULL)
326 {
327 DisposeWindow(window);
328 }
329
330 if(nib != NULL)
331 {
332 DisposeNibReference(nib);
333 }
334
335 return(err);
336}
337
338void init_apple_menu(const char* product)
339{
340 // Load up a proper menu bar.
341 {
342 OSStatus err;
343 IBNibRef nib = NULL;
344 // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
345 err = CreateNibReference(CFSTR("SecondLife"), &nib);
346
347 if(err == noErr)
348 {
349 // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
350 SetMenuBarFromNib(nib, CFSTR("MenuBar"));
351 }
352
353 if(nib != NULL)
354 {
355 DisposeNibReference(nib);
356 }
357 }
358
359 // Install a handler for 'gurl' AppleEvents. This is how secondlife:// URLs get passed to the viewer.
360
361 if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr)
362 {
363 // Couldn't install AppleEvent handler. This error shouldn't be fatal.
364 llinfos << "Couldn't install 'GURL' AppleEvent handler. Continuing..." << llendl;
365 }
366
367 // Install a handler for 'quit' AppleEvents. This makes quitting the application from the dock work.
368 if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr)
369 {
370 // Couldn't install AppleEvent handler. This error shouldn't be fatal.
371 llinfos << "Couldn't install Quit AppleEvent handler. Continuing..." << llendl;
372 }
373}
diff --git a/linden/indra/newview/llappviewermacosx.h b/linden/indra/newview/llappviewermacosx.h
new file mode 100644
index 0000000..2c61e5a
--- /dev/null
+++ b/linden/indra/newview/llappviewermacosx.h
@@ -0,0 +1,56 @@
1/**
2 * @file llappviewermacosx.h
3 * @brief The LLAppViewerMacOSX class declaration
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LL_LLAPPVIEWERMACOSX_H
33#define LL_LLAPPVIEWERMACOSX_H
34
35#ifndef LL_LLAPPVIEWER_H
36#include "llappviewer.h"
37#endif
38
39class LLAppViewerMacOSX : public LLAppViewer
40{
41public:
42 LLAppViewerMacOSX();
43 virtual ~LLAppViewerMacOSX();
44
45 //
46 // Main application logic
47 //
48 virtual bool init(); // Override to do application initialization
49
50
51protected:
52 virtual void handleCrashReporting();
53 std::string generateSerialNumber();
54};
55
56#endif // LL_LLAPPVIEWERMACOSX_H
diff --git a/linden/indra/newview/llappviewerwin32.cpp b/linden/indra/newview/llappviewerwin32.cpp
new file mode 100644
index 0000000..814c209
--- /dev/null
+++ b/linden/indra/newview/llappviewerwin32.cpp
@@ -0,0 +1,461 @@
1/**
2 * @file llappviewerwin32.cpp
3 * @brief The LLAppViewerWin32 class definitions
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llviewerprecompiledheaders.h"
33
34#include "llappviewerwin32.h"
35
36#include "llmemtype.h"
37
38#include "llwindowwin32.cpp" // *FIX: for setting gIconResource.
39#include "res/resource.h" // *FIX: for setting gIconResource.
40
41#include <fcntl.h> //_O_APPEND
42#include <io.h> //_open_osfhandle()
43#include <errorrep.h> // for AddERExcludedApplicationA()
44#include <process.h> // _spawnl()
45#include <tchar.h> // For TCHAR support
46
47#include "llviewercontrol.h"
48#include "lldxhardware.h"
49
50#include "llweb.h"
51#include "llsecondlifeurls.h"
52
53#include "llwindebug.h"
54
55#include "llviewernetwork.h"
56#include "llmd5.h"
57
58void fill_args(int& argc, char** argv, const S32 max_args, LPSTR cmd_line)
59{
60 char *token = NULL;
61 if( cmd_line[0] == '\"' )
62 {
63 // Exe name is enclosed in quotes
64 token = strtok( cmd_line, "\"" );
65 argv[argc++] = token;
66 token = strtok( NULL, " \t," );
67 }
68 else
69 {
70 // Exe name is not enclosed in quotes
71 token = strtok( cmd_line, " \t," );
72 }
73
74 while( (token != NULL) && (argc < max_args) )
75 {
76 argv[argc++] = token;
77 /* Get next token: */
78 if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore*/
79 {
80 token = strtok( NULL, "\"");
81 }
82 else
83 {
84 token = strtok( NULL, " \t," );
85 }
86 }
87}
88
89// *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
90LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
91{
92 // Translate the signals/exceptions into cross-platform stuff
93 // Windows implementation
94 llinfos << "Entering Windows Exception Handler..." << llendl;
95
96 // Make sure the user sees something to indicate that the app crashed.
97 LONG retval;
98
99 if (LLApp::isError())
100 {
101 llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
102 retval = EXCEPTION_EXECUTE_HANDLER;
103 return retval;
104 }
105
106 // Generate a minidump if we can.
107 // Before we wake the error thread...
108 // Which will start the crash reporting.
109 LLWinDebug::handleException(exception_infop);
110
111 // Flag status to error, so thread_error starts its work
112 LLApp::setError();
113
114 // Block in the exception handler until the app has stopped
115 // This is pretty sketchy, but appears to work just fine
116 while (!LLApp::isStopped())
117 {
118 ms_sleep(10);
119 }
120
121 //
122 // At this point, we always want to exit the app. There's no graceful
123 // recovery for an unhandled exception.
124 //
125 // Just kill the process.
126 retval = EXCEPTION_EXECUTE_HANDLER;
127 return retval;
128}
129
130int APIENTRY WinMain(HINSTANCE hInstance,
131 HINSTANCE hPrevInstance,
132 LPSTR lpCmdLine,
133 int nCmdShow)
134{
135 LLMemType mt1(LLMemType::MTYPE_STARTUP);
136
137 // *FIX: global
138 gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
139
140 // In Win32, we need to generate argc and argv ourselves...
141 // Note: GetCommandLine() returns a potentially return a LPTSTR
142 // which can resolve to a LPWSTR (unicode string).
143 // (That's why it's different from lpCmdLine which is a LPSTR.)
144 // We don't currently do unicode, so call the non-unicode version
145 // directly.
146 LPSTR cmd_line_including_exe_name = GetCommandLineA();
147
148 const S32 MAX_ARGS = 100;
149 int argc = 0;
150 char* argv[MAX_ARGS]; /* Flawfinder: ignore */
151
152 fill_args(argc, argv, MAX_ARGS, cmd_line_including_exe_name);
153
154 LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32();
155
156 // *FIX:Mani This method is poorly named, since the exception
157 // is now handled by LLApp.
158 bool ok = LLWinDebug::setupExceptionHandler();
159
160 // Actually here's the exception setup.
161 LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
162 prev_filter = SetUnhandledExceptionFilter(viewer_windows_exception_handler);
163 if (!prev_filter)
164 {
165 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with NULL!" << llendl;
166 ok = FALSE;
167 }
168 if (prev_filter != LLWinDebug::handleException)
169 {
170 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl;
171 ok = FALSE;
172 }
173
174 viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
175
176 ok = viewer_app_ptr->tempStoreCommandOptions(argc, argv);
177 if(!ok)
178 {
179 llwarns << "Unable to parse command line." << llendl;
180 return -1;
181 }
182
183 ok = viewer_app_ptr->init();
184 if(!ok)
185 {
186 llwarns << "Application init failed." << llendl;
187 return -1;
188 }
189
190 // Run the application main loop
191 if(!LLApp::isQuitting())
192 {
193 viewer_app_ptr->mainLoop();
194 }
195
196 if (!LLApp::isError())
197 {
198 //
199 // We don't want to do cleanup here if the error handler got called -
200 // the assumption is that the error handler is responsible for doing
201 // app cleanup if there was a problem.
202 //
203 viewer_app_ptr->cleanup();
204 }
205 delete viewer_app_ptr;
206 viewer_app_ptr = NULL;
207 return 0;
208}
209
210void LLAppViewerWin32::disableWinErrorReporting()
211{
212 const char win_xp_string[] = "Microsoft Windows XP";
213 BOOL is_win_xp = ( getOSInfo().getOSString().substr(0, strlen(win_xp_string) ) == win_xp_string ); /* Flawfinder: ignore*/
214 if( is_win_xp )
215 {
216 // Note: we need to use run-time dynamic linking, because load-time dynamic linking will fail
217 // on systems that don't have the library installed (all non-Windows XP systems)
218 HINSTANCE fault_rep_dll_handle = LoadLibrary(L"faultrep.dll"); /* Flawfinder: ignore */
219 if( fault_rep_dll_handle )
220 {
221 pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA");
222 if( pAddERExcludedApplicationA )
223 {
224
225 // Strip the path off the name
226 const char* executable_name = gDirUtilp->getExecutableFilename().c_str();
227
228 if( 0 == pAddERExcludedApplicationA( executable_name ) )
229 {
230 U32 error_code = GetLastError();
231 llinfos << "AddERExcludedApplication() failed with error code " << error_code << llendl;
232 }
233 else
234 {
235 llinfos << "AddERExcludedApplication() success for " << executable_name << llendl;
236 }
237 }
238 FreeLibrary( fault_rep_dll_handle );
239 }
240 }
241}
242
243const S32 MAX_CONSOLE_LINES = 500;
244
245void create_console()
246{
247 int h_con_handle;
248 long l_std_handle;
249
250 CONSOLE_SCREEN_BUFFER_INFO coninfo;
251 FILE *fp;
252
253 // allocate a console for this app
254 AllocConsole();
255
256 // set the screen buffer to be big enough to let us scroll text
257 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
258 coninfo.dwSize.Y = MAX_CONSOLE_LINES;
259 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
260
261 // redirect unbuffered STDOUT to the console
262 l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
263 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
264 fp = _fdopen( h_con_handle, "w" );
265 *stdout = *fp;
266 setvbuf( stdout, NULL, _IONBF, 0 );
267
268 // redirect unbuffered STDIN to the console
269 l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
270 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
271 fp = _fdopen( h_con_handle, "r" );
272 *stdin = *fp;
273 setvbuf( stdin, NULL, _IONBF, 0 );
274
275 // redirect unbuffered STDERR to the console
276 l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
277 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
278 fp = _fdopen( h_con_handle, "w" );
279 *stderr = *fp;
280 setvbuf( stderr, NULL, _IONBF, 0 );
281}
282
283LLAppViewerWin32::LLAppViewerWin32()
284{
285}
286
287LLAppViewerWin32::~LLAppViewerWin32()
288{
289}
290
291bool LLAppViewerWin32::init()
292{
293 // Platform specific initialization.
294
295 // Turn off Windows XP Error Reporting
296 // (Don't send our data to Microsoft--at least until we are Logo approved and have a way
297 // of getting the data back from them.)
298 //
299 llinfos << "Turning off Windows error reporting." << llendl;
300 disableWinErrorReporting();
301
302 return LLAppViewer::init();
303}
304
305bool LLAppViewerWin32::cleanup()
306{
307 bool result = LLAppViewer::cleanup();
308
309 gDXHardware.cleanup();
310
311 return result;
312}
313
314bool LLAppViewerWin32::initWindow()
315{
316 // pop up debug console if necessary
317 if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow"))
318 {
319 create_console();
320 }
321
322 return LLAppViewer::initWindow();
323}
324
325void write_debug_dx(const char* str)
326{
327 LLString value = gDebugInfo["DXInfo"].asString();
328 value += str;
329 gDebugInfo["DXInfo"] = value;
330}
331
332void write_debug_dx(const std::string& str)
333{
334 write_debug_dx(str.c_str());
335}
336
337bool LLAppViewerWin32::initHardwareTest()
338{
339 //
340 // Do driver verification and initialization based on DirectX
341 // hardware polling and driver versions
342 //
343 if (gProbeHardware)
344 {
345 BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup");
346
347 LLSplashScreen::update("Detecting hardware...");
348
349 llinfos << "Attempting to poll DirectX for hardware info" << llendl;
350 gDXHardware.setWriteDebugFunc(write_debug_dx);
351 BOOL probe_ok = gDXHardware.getInfo(vram_only);
352
353 if (!probe_ok
354 && gSavedSettings.getWarning("AboutDirectX9"))
355 {
356 llinfos << "DirectX probe failed, alerting user." << llendl;
357
358 // Warn them that runnin without DirectX 9 will
359 // not allow us to tell them about driver issues
360 std::ostringstream msg;
361 msg <<
362 LLAppViewer::instance()->getSecondLifeTitle() << " is unable to detect DirectX 9.0b or greater.\n"
363 "\n" <<
364 LLAppViewer::instance()->getSecondLifeTitle() << " uses DirectX to detect hardware and/or\n"
365 "outdated drivers that can cause stability problems,\n"
366 "poor performance and crashes. While you can run\n" <<
367 LLAppViewer::instance()->getSecondLifeTitle() << " without it, we highly recommend running\n"
368 "with DirectX 9.0b\n"
369 "\n"
370 "Do you wish to continue?\n";
371 S32 button = OSMessageBox(
372 msg.str().c_str(),
373 "Warning",
374 OSMB_YESNO);
375 if (OSBTN_NO== button)
376 {
377 llinfos << "User quitting after failed DirectX 9 detection" << llendl;
378 LLWeb::loadURLExternal(DIRECTX_9_URL);
379 return false;
380 }
381 gSavedSettings.setWarning("AboutDirectX9", FALSE);
382 }
383 llinfos << "Done polling DirectX for hardware info" << llendl;
384
385 // Only probe once after installation
386 gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE);
387
388 // Disable so debugger can work
389 std::ostringstream splash_msg;
390 splash_msg << "Loading " << LLAppViewer::instance()->getSecondLifeTitle() << "...";
391
392 LLSplashScreen::update(splash_msg.str().c_str());
393 }
394
395 if (!LLWinDebug::setupExceptionHandler())
396 {
397 llwarns << " Someone took over my exception handler (post hardware probe)!" << llendl;
398 }
399
400 gGLManager.mVRAM = gDXHardware.getVRAM();
401 llinfos << "Detected VRAM: " << gGLManager.mVRAM << llendl;
402
403 return true;
404}
405
406void LLAppViewerWin32::handleCrashReporting()
407{
408 // Windows only behaivor. Spawn win crash reporter.
409 std::string exe_path = gDirUtilp->getAppRODataDir();
410 exe_path += gDirUtilp->getDirDelimiter();
411 exe_path += "win_crash_logger.exe";
412
413 std::string arg_string = "-user ";
414 arg_string += gGridName;
415
416 switch(getCrashBehavior())
417 {
418 case CRASH_BEHAVIOR_ASK:
419 default:
420 arg_string += " -dialog ";
421 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
422 break;
423
424 case CRASH_BEHAVIOR_ALWAYS_SEND:
425 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
426 break;
427
428 case CRASH_BEHAVIOR_NEVER_SEND:
429 break;
430 }
431}
432
433std::string LLAppViewerWin32::generateSerialNumber()
434{
435 char serial_md5[MD5HEX_STR_SIZE]; // Flawfinder: ignore
436 serial_md5[0] = 0;
437
438 DWORD serial = 0;
439 DWORD flags = 0;
440 BOOL success = GetVolumeInformation(
441 L"C:\\",
442 NULL, // volume name buffer
443 0, // volume name buffer size
444 &serial, // volume serial
445 NULL, // max component length
446 &flags, // file system flags
447 NULL, // file system name buffer
448 0); // file system name buffer size
449 if (success)
450 {
451 LLMD5 md5;
452 md5.update( (unsigned char*)&serial, sizeof(DWORD));
453 md5.finalize();
454 md5.hex_digest(serial_md5);
455 }
456 else
457 {
458 llwarns << "GetVolumeInformation failed" << llendl;
459 }
460 return serial_md5;
461} \ No newline at end of file
diff --git a/linden/indra/newview/llappviewerwin32.h b/linden/indra/newview/llappviewerwin32.h
new file mode 100644
index 0000000..23e7337
--- /dev/null
+++ b/linden/indra/newview/llappviewerwin32.h
@@ -0,0 +1,63 @@
1/**
2 * @file llappviewerwin32.h
3 * @brief The LLAppViewerWin32 class declaration
4 *
5 * $LicenseInfo:firstyear=2007&license=viewergpl$
6 *
7 * Copyright (c) 2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LL_LLAPPVIEWERWIN32_H
33#define LL_LLAPPVIEWERWIN32_H
34
35#ifndef LL_LLAPPVIEWER_H
36#include "llappviewer.h"
37#endif
38
39class LLAppViewerWin32 : public LLAppViewer
40{
41public:
42 LLAppViewerWin32();
43 virtual ~LLAppViewerWin32();
44
45 //
46 // Main application logic
47 //
48 virtual bool init(); // Override to do application initialization
49 virtual bool cleanup();
50
51protected:
52 virtual bool initWindow(); // Initialize the viewer's window.
53 virtual bool initHardwareTest(); // Win32 uses DX9 to test hardware.
54 virtual void handleCrashReporting();
55
56 std::string generateSerialNumber();
57
58private:
59 void disableWinErrorReporting();
60
61};
62
63#endif // LL_LLAPPVIEWERWIN32_H
diff --git a/linden/indra/newview/llassetuploadresponders.cpp b/linden/indra/newview/llassetuploadresponders.cpp
index 866fa34..c3c892a 100644
--- a/linden/indra/newview/llassetuploadresponders.cpp
+++ b/linden/indra/newview/llassetuploadresponders.cpp
@@ -52,7 +52,6 @@
52#include "llviewerobjectlist.h" 52#include "llviewerobjectlist.h"
53#include "llviewermenufile.h" 53#include "llviewermenufile.h"
54#include "llviewerwindow.h" 54#include "llviewerwindow.h"
55#include "viewer.h"
56 55
57void dialog_refresh_all(); 56void dialog_refresh_all();
58 57
diff --git a/linden/indra/newview/llcallingcard.cpp b/linden/indra/newview/llcallingcard.cpp
index b80c2bb..6d0244e 100644
--- a/linden/indra/newview/llcallingcard.cpp
+++ b/linden/indra/newview/llcallingcard.cpp
@@ -466,7 +466,7 @@ void LLAvatarTracker::findAgent()
466 msg->nextBlockFast(_PREHASH_AgentBlock); 466 msg->nextBlockFast(_PREHASH_AgentBlock);
467 msg->addUUIDFast(_PREHASH_Hunter, gAgentID); 467 msg->addUUIDFast(_PREHASH_Hunter, gAgentID);
468 msg->addUUIDFast(_PREHASH_Prey, mTrackingData->mAvatarID); 468 msg->addUUIDFast(_PREHASH_Prey, mTrackingData->mAvatarID);
469 msg->addU32Fast(_PREHASH_SpaceIP, 0); // will get filled in by userserver 469 msg->addU32Fast(_PREHASH_SpaceIP, 0); // will get filled in by simulator
470 msg->nextBlockFast(_PREHASH_LocationBlock); 470 msg->nextBlockFast(_PREHASH_LocationBlock);
471 const F64 NO_LOCATION = 0.0; 471 const F64 NO_LOCATION = 0.0;
472 msg->addF64Fast(_PREHASH_GlobalX, NO_LOCATION); 472 msg->addF64Fast(_PREHASH_GlobalX, NO_LOCATION);
diff --git a/linden/indra/newview/llcameraview.cpp b/linden/indra/newview/llcameraview.cpp
index 6db0f20..405e4f1 100644
--- a/linden/indra/newview/llcameraview.cpp
+++ b/linden/indra/newview/llcameraview.cpp
@@ -42,7 +42,7 @@
42#include "lljoystickbutton.h" 42#include "lljoystickbutton.h"
43#include "llviewercontrol.h" 43#include "llviewercontrol.h"
44#include "llviewerwindow.h" 44#include "llviewerwindow.h"
45#include "viewer.h" 45#include "llappviewer.h"
46 46
47// Constants 47// Constants
48const char *CAMERA_TITLE = ""; 48const char *CAMERA_TITLE = "";
@@ -73,7 +73,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name)
73 "cam_rotate_in.tga" ); 73 "cam_rotate_in.tga" );
74 mRotate->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); 74 mRotate->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
75 mRotate->setHeldDownDelay(CAMERA_BUTTON_DELAY); 75 mRotate->setHeldDownDelay(CAMERA_BUTTON_DELAY);
76 mRotate->setToolTip( "Rotate Camera Around Focus" ); 76 mRotate->setToolTip( LLString("Rotate Camera Around Focus" )); // *TODO: Translate
77 mRotate->setSoundFlags(MOUSE_DOWN | MOUSE_UP); 77 mRotate->setSoundFlags(MOUSE_DOWN | MOUSE_UP);
78 addChild(mRotate); 78 addChild(mRotate);
79 79
@@ -88,7 +88,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name)
88 "cam_zoom_minus_in.tga"); 88 "cam_zoom_minus_in.tga");
89 mZoom->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); 89 mZoom->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
90 mZoom->setHeldDownDelay(CAMERA_BUTTON_DELAY); 90 mZoom->setHeldDownDelay(CAMERA_BUTTON_DELAY);
91 mZoom->setToolTip( "Zoom Camera Towards Focus" ); 91 mZoom->setToolTip( LLString("Zoom Camera Towards Focus" )); // *TODO: Translate
92 mZoom->setSoundFlags(MOUSE_DOWN | MOUSE_UP); 92 mZoom->setSoundFlags(MOUSE_DOWN | MOUSE_UP);
93 addChild(mZoom); 93 addChild(mZoom);
94 94
@@ -101,7 +101,7 @@ LLFloaterCamera::LLFloaterCamera(const std::string& name)
101 "cam_tracking_in.tga"); 101 "cam_tracking_in.tga");
102 mTrack->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT); 102 mTrack->setFollows(FOLLOWS_TOP | FOLLOWS_LEFT);
103 mTrack->setHeldDownDelay(CAMERA_BUTTON_DELAY); 103 mTrack->setHeldDownDelay(CAMERA_BUTTON_DELAY);
104 mTrack->setToolTip( "Move Camera Up and Down, Left and Right" ); 104 mTrack->setToolTip( LLString("Move Camera Up and Down, Left and Right" )); // *TODO: Translate
105 mTrack->setSoundFlags(MOUSE_DOWN | MOUSE_UP); 105 mTrack->setSoundFlags(MOUSE_DOWN | MOUSE_UP);
106 addChild(mTrack); 106 addChild(mTrack);
107} 107}
diff --git a/linden/indra/newview/llclassifiedinfo.cpp b/linden/indra/newview/llclassifiedinfo.cpp
index a49af23..28d5f50 100644
--- a/linden/indra/newview/llclassifiedinfo.cpp
+++ b/linden/indra/newview/llclassifiedinfo.cpp
@@ -32,7 +32,6 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33#include "llclassifiedinfo.h" 33#include "llclassifiedinfo.h"
34 34
35#include "viewer.h" // for gPacificDaylightTime
36#include "lluuid.h" 35#include "lluuid.h"
37 36
38LLClassifiedInfo::cat_map LLClassifiedInfo::sCategories; 37LLClassifiedInfo::cat_map LLClassifiedInfo::sCategories;
diff --git a/linden/indra/newview/llcommandhandler.cpp b/linden/indra/newview/llcommandhandler.cpp
index fd3aef9..95a30e8 100644
--- a/linden/indra/newview/llcommandhandler.cpp
+++ b/linden/indra/newview/llcommandhandler.cpp
@@ -46,7 +46,7 @@ class LLCommandHandlerRegistry
46public: 46public:
47 static LLCommandHandlerRegistry& instance(); 47 static LLCommandHandlerRegistry& instance();
48 void add(const char* cmd, LLCommandHandler* handler); 48 void add(const char* cmd, LLCommandHandler* handler);
49 bool dispatch(const std::string& cmd, const std::vector<std::string>& params); 49 bool dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap);
50 50
51private: 51private:
52 std::map<std::string, LLCommandHandler*> mMap; 52 std::map<std::string, LLCommandHandler*> mMap;
@@ -68,13 +68,14 @@ void LLCommandHandlerRegistry::add(const char* cmd, LLCommandHandler* handler)
68} 68}
69 69
70bool LLCommandHandlerRegistry::dispatch(const std::string& cmd, 70bool LLCommandHandlerRegistry::dispatch(const std::string& cmd,
71 const std::vector<std::string>& params) 71 const LLSD& params,
72 const LLSD& queryMap)
72{ 73{
73 std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd); 74 std::map<std::string, LLCommandHandler*>::iterator it = mMap.find(cmd);
74 if (it == mMap.end()) return false; 75 if (it == mMap.end()) return false;
75 LLCommandHandler* handler = it->second; 76 LLCommandHandler* handler = it->second;
76 if (!handler) return false; 77 if (!handler) return false;
77 return handler->handle(params); 78 return handler->handle(params, queryMap);
78} 79}
79 80
80//--------------------------------------------------------------------------- 81//---------------------------------------------------------------------------
@@ -97,7 +98,7 @@ LLCommandHandler::~LLCommandHandler()
97//--------------------------------------------------------------------------- 98//---------------------------------------------------------------------------
98 99
99// static 100// static
100bool LLCommandDispatcher::dispatch(const std::string& cmd, const std::vector<std::string>& params) 101bool LLCommandDispatcher::dispatch(const std::string& cmd, const LLSD& params, const LLSD& queryMap)
101{ 102{
102 return LLCommandHandlerRegistry::instance().dispatch(cmd, params); 103 return LLCommandHandlerRegistry::instance().dispatch(cmd, params, queryMap);
103} 104}
diff --git a/linden/indra/newview/llcommandhandler.h b/linden/indra/newview/llcommandhandler.h
index 50928e2..0cb9d12 100644
--- a/linden/indra/newview/llcommandhandler.h
+++ b/linden/indra/newview/llcommandhandler.h
@@ -44,7 +44,7 @@ public:
44 LLFooHandler() : LLCommandHandler("foo") { } 44 LLFooHandler() : LLCommandHandler("foo") { }
45 45
46 // Your code here 46 // Your code here
47 bool handle(const std::vector<std::string>& tokens) 47 bool handle(const LLSD& tokens, const LLSD& queryMap)
48 { 48 {
49 if (tokens.size() < 1) return false; 49 if (tokens.size() < 1) return false;
50 LLUUID id( tokens[0] ); 50 LLUUID id( tokens[0] );
@@ -65,7 +65,8 @@ public:
65 65
66 virtual ~LLCommandHandler(); 66 virtual ~LLCommandHandler();
67 67
68 virtual bool handle(const std::vector<std::string>& params) = 0; 68 virtual bool handle(const LLSD& params,
69 const LLSD& queryMap) = 0;
69 // Execute the command with a provided (possibly empty) 70 // Execute the command with a provided (possibly empty)
70 // list of parameters. 71 // list of parameters.
71 // Return true if you did something, false if the parameters 72 // Return true if you did something, false if the parameters
@@ -76,7 +77,9 @@ public:
76class LLCommandDispatcher 77class LLCommandDispatcher
77{ 78{
78public: 79public:
79 static bool dispatch(const std::string& cmd, const std::vector<std::string>& params); 80 static bool dispatch(const std::string& cmd,
81 const LLSD& params,
82 const LLSD& queryMap);
80 // Execute a command registered via the above mechanism, 83 // Execute a command registered via the above mechanism,
81 // passing string parameters. 84 // passing string parameters.
82 // Returns true if command was found and executed correctly. 85 // Returns true if command was found and executed correctly.
diff --git a/linden/indra/newview/llcompass.cpp b/linden/indra/newview/llcompass.cpp
index b9e1d0e..f6df741 100644
--- a/linden/indra/newview/llcompass.cpp
+++ b/linden/indra/newview/llcompass.cpp
@@ -43,7 +43,6 @@
43#include "llagent.h" 43#include "llagent.h"
44#include "llcompass.h" 44#include "llcompass.h"
45 45
46#include "viewer.h"
47#include "llviewerimage.h" 46#include "llviewerimage.h"
48#include "llviewerimagelist.h" 47#include "llviewerimagelist.h"
49#include "llviewercontrol.h" 48#include "llviewercontrol.h"
diff --git a/linden/indra/newview/llconsole.cpp b/linden/indra/newview/llconsole.cpp
index 51ee1f6..5b1e88e 100644
--- a/linden/indra/newview/llconsole.cpp
+++ b/linden/indra/newview/llconsole.cpp
@@ -47,7 +47,6 @@
47#include "llmath.h" 47#include "llmath.h"
48 48
49#include "llstartup.h" 49#include "llstartup.h"
50#include "viewer.h"
51 50
52// Used for LCD display 51// Used for LCD display
53extern void AddNewDebugConsoleToLCD(const LLWString &newLine); 52extern void AddNewDebugConsoleToLCD(const LLWString &newLine);
diff --git a/linden/indra/newview/llcontroldef.cpp b/linden/indra/newview/llcontroldef.cpp
index 929dfe4..66b5b92 100644
--- a/linden/indra/newview/llcontroldef.cpp
+++ b/linden/indra/newview/llcontroldef.cpp
@@ -58,6 +58,7 @@
58#include "llpanelgeneral.h" 58#include "llpanelgeneral.h"
59#include "llpanelinput.h" 59#include "llpanelinput.h"
60#include "llsky.h" 60#include "llsky.h"
61#include "llvieweraudio.h"
61#include "llviewerimagelist.h" 62#include "llviewerimagelist.h"
62#include "llviewerthrottle.h" 63#include "llviewerthrottle.h"
63#include "llviewerwindow.h" 64#include "llviewerwindow.h"
@@ -67,7 +68,6 @@
67#include "llvovolume.h" 68#include "llvovolume.h"
68#include "llworld.h" 69#include "llworld.h"
69#include "pipeline.h" 70#include "pipeline.h"
70#include "viewer.h"
71#include "llviewerjoystick.h" 71#include "llviewerjoystick.h"
72#include "llviewerparcelmgr.h" 72#include "llviewerparcelmgr.h"
73#include "llparcel.h" 73#include "llparcel.h"
@@ -683,7 +683,6 @@ void declare_settings()
683 gSavedSettings.declareF32("SelectionHighlightVAnim", 0.5f, "Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)"); 683 gSavedSettings.declareF32("SelectionHighlightVAnim", 0.5f, "Rate at which texture animates along V direction in selection highlight line (fraction of texture per second)");
684 684
685 gSavedSettings.declareBOOL("LogMessages", FALSE, "Log network traffic"); 685 gSavedSettings.declareBOOL("LogMessages", FALSE, "Log network traffic");
686 gSavedSettings.declareBOOL("LoggedIn", FALSE, "Login status at end of last session");
687 gSavedSettings.declareBOOL("MouseSun", FALSE, "", NO_PERSIST); 686 gSavedSettings.declareBOOL("MouseSun", FALSE, "", NO_PERSIST);
688 687
689 gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position"); 688 gSavedSettings.declareBOOL("ShowAxes", FALSE, "Render coordinate frame at your position");
@@ -1111,6 +1110,7 @@ void declare_settings()
1111 gSavedSettings.declareBOOL("LoginLastLocation", TRUE, "Login at same location you last logged out"); 1110 gSavedSettings.declareBOOL("LoginLastLocation", TRUE, "Login at same location you last logged out");
1112 gSavedSettings.declareBOOL("ShowStartLocation", FALSE, "Display starting location menu on login screen"); 1111 gSavedSettings.declareBOOL("ShowStartLocation", FALSE, "Display starting location menu on login screen");
1113 gSavedSettings.declareBOOL("FlyingAtExit", FALSE, "Was flying when last logged out, so fly when logging in"); 1112 gSavedSettings.declareBOOL("FlyingAtExit", FALSE, "Was flying when last logged out, so fly when logging in");
1113 gSavedSettings.declareBOOL("ForceShowGrid", FALSE, "Always show grid dropdown on login screen");
1114 1114
1115// gSavedSettings.declareString("AvatarTexture", "be20de2d-7812-4e0e-80f2-33aadf185a9f"); 1115// gSavedSettings.declareString("AvatarTexture", "be20de2d-7812-4e0e-80f2-33aadf185a9f");
1116 gSavedSettings.declareU32("RegionTextureSize", 256, "Terrain texture dimensions (power of 2)"); 1116 gSavedSettings.declareU32("RegionTextureSize", 256, "Terrain texture dimensions (power of 2)");
@@ -1243,7 +1243,7 @@ void declare_settings()
1243 // Secret debug stuff. 1243 // Secret debug stuff.
1244 gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "Turns on \"Debug\" menu"); 1244 gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "Turns on \"Debug\" menu");
1245 gSavedSettings.declareS32("ServerChoice", 0, "[DO NOT MODIFY] Controls which grid you connect to"); 1245 gSavedSettings.declareS32("ServerChoice", 0, "[DO NOT MODIFY] Controls which grid you connect to");
1246 gSavedSettings.declareString("CustomServer", "", "Specifies IP address or hostname of userserver to which you connect"); 1246 gSavedSettings.declareString("CustomServer", "", "Specifies IP address or hostname of grid to which you connect");
1247 gSavedSettings.declareBOOL("UseDebugLogin", FALSE, "Provides extra control over which grid to connect to"); 1247 gSavedSettings.declareBOOL("UseDebugLogin", FALSE, "Provides extra control over which grid to connect to");
1248 1248
1249 // First run is true on the first startup of a given installation. 1249 // First run is true on the first startup of a given installation.
@@ -1383,8 +1383,9 @@ void declare_settings()
1383 gSavedSettings.declareString("SearchURLQuery", 1383 gSavedSettings.declareString("SearchURLQuery",
1384 "http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&", 1384 "http://secondlife.com/app/search/search_proxy.php?q=[QUERY]&s=[COLLECTION]&",
1385 "URL to use for searches"); 1385 "URL to use for searches");
1386 gSavedSettings.declareString("SearchURLSuffix", 1386 // Version 2 added [SESSION], must invalidate old saved settings.
1387 "m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]", 1387 gSavedSettings.declareString("SearchURLSuffix2",
1388 "m=[MATURE]&t=[TEEN]&region=[REGION]&x=[X]&y=[Y]&z=[Z]&session=[SESSION]",
1388 "Parameters added to end of search queries"); 1389 "Parameters added to end of search queries");
1389 1390
1390 // Arrow keys move avatar while in chat? 1391 // Arrow keys move avatar while in chat?
diff --git a/linden/indra/newview/llcurrencyuimanager.cpp b/linden/indra/newview/llcurrencyuimanager.cpp
index 1e97df0..eeb970e 100644
--- a/linden/indra/newview/llcurrencyuimanager.cpp
+++ b/linden/indra/newview/llcurrencyuimanager.cpp
@@ -44,8 +44,7 @@
44#include "lllineeditor.h" 44#include "lllineeditor.h"
45#include "llviewchildren.h" 45#include "llviewchildren.h"
46#include "llxmlrpctransaction.h" 46#include "llxmlrpctransaction.h"
47#include "viewer.h" 47#include "llappviewer.h"
48
49 48
50 49
51const F64 CURRENCY_ESTIMATE_FREQUENCY = 2.0; 50const F64 CURRENCY_ESTIMATE_FREQUENCY = 2.0;
@@ -239,7 +238,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,
239 static std::string transactionURI; 238 static std::string transactionURI;
240 if (transactionURI.empty()) 239 if (transactionURI.empty())
241 { 240 {
242 transactionURI = getHelperURI() + "currency.php"; 241 transactionURI = LLAppViewer::instance()->getHelperURI() + "currency.php";
243 } 242 }
244 243
245 delete mTransaction; 244 delete mTransaction;
diff --git a/linden/indra/newview/lldirpicker.cpp b/linden/indra/newview/lldirpicker.cpp
index a63c687..3672939 100644
--- a/linden/indra/newview/lldirpicker.cpp
+++ b/linden/indra/newview/lldirpicker.cpp
@@ -32,7 +32,6 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34#include "lldirpicker.h" 34#include "lldirpicker.h"
35//#include "viewer.h"
36//#include "llviewermessage.h" 35//#include "llviewermessage.h"
37#include "llworld.h" 36#include "llworld.h"
38#include "llviewerwindow.h" 37#include "llviewerwindow.h"
diff --git a/linden/indra/newview/lldrawable.h b/linden/indra/newview/lldrawable.h
index c10c49c..52082ad 100644
--- a/linden/indra/newview/lldrawable.h
+++ b/linden/indra/newview/lldrawable.h
@@ -48,6 +48,7 @@
48#include "llstat.h" 48#include "llstat.h"
49#include "llviewerobject.h" 49#include "llviewerobject.h"
50#include "llrect.h" 50#include "llrect.h"
51#include "llappviewer.h" // for gFrameTimeSeconds
51 52
52class LLCamera; 53class LLCamera;
53class LLDrawPool; 54class LLDrawPool;
@@ -59,8 +60,6 @@ class LLSpatialPartition;
59class LLVOVolume; 60class LLVOVolume;
60class LLViewerImage; 61class LLViewerImage;
61 62
62extern F32 gFrameTimeSeconds;
63
64// Can have multiple silhouettes for each object 63// Can have multiple silhouettes for each object
65const U32 SILHOUETTE_HIGHLIGHT = 0; 64const U32 SILHOUETTE_HIGHLIGHT = 0;
66 65
diff --git a/linden/indra/newview/lldrawpoolavatar.cpp b/linden/indra/newview/lldrawpoolavatar.cpp
index 67a379d..9df9c11 100644
--- a/linden/indra/newview/lldrawpoolavatar.cpp
+++ b/linden/indra/newview/lldrawpoolavatar.cpp
@@ -45,13 +45,13 @@
45#include "noise.h" 45#include "noise.h"
46#include "pipeline.h" 46#include "pipeline.h"
47#include "llglslshader.h" 47#include "llglslshader.h"
48#include "llappviewer.h"
48 49
49static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; 50static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
50static U32 sBufferUsage = GL_STREAM_DRAW_ARB; 51static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
51static U32 sShaderLevel = 0; 52static U32 sShaderLevel = 0;
52static LLGLSLShader* sVertexProgram = NULL; 53static LLGLSLShader* sVertexProgram = NULL;
53 54
54extern F32 gFrameDTClamped;
55extern BOOL gUseGLPick; 55extern BOOL gUseGLPick;
56 56
57F32 CLOTHING_GRAVITY_EFFECT = 0.7f; 57F32 CLOTHING_GRAVITY_EFFECT = 0.7f;
diff --git a/linden/indra/newview/lldrawpoolwater.cpp b/linden/indra/newview/lldrawpoolwater.cpp
index 54a33f2..4a7760f 100644
--- a/linden/indra/newview/lldrawpoolwater.cpp
+++ b/linden/indra/newview/lldrawpoolwater.cpp
@@ -50,7 +50,6 @@
50#include "llvowater.h" 50#include "llvowater.h"
51#include "llworld.h" 51#include "llworld.h"
52#include "pipeline.h" 52#include "pipeline.h"
53#include "viewer.h" // gSunTextureID, gMoonTextureID
54#include "llglslshader.h" 53#include "llglslshader.h"
55 54
56const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); 55const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004");
diff --git a/linden/indra/newview/lleventinfo.cpp b/linden/indra/newview/lleventinfo.cpp
index 17b33f1..0e69891 100644
--- a/linden/indra/newview/lleventinfo.cpp
+++ b/linden/indra/newview/lleventinfo.cpp
@@ -32,7 +32,7 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33#include "lleventinfo.h" 33#include "lleventinfo.h"
34 34
35#include "viewer.h" // for gPacificDaylightTime 35#include "llappviewer.h" // for gPacificDaylightTime
36#include "lluuid.h" 36#include "lluuid.h"
37#include "message.h" 37#include "message.h"
38 38
diff --git a/linden/indra/newview/llfasttimerview.cpp b/linden/indra/newview/llfasttimerview.cpp
index 424f47e..ee9177c 100644
--- a/linden/indra/newview/llfasttimerview.cpp
+++ b/linden/indra/newview/llfasttimerview.cpp
@@ -40,7 +40,7 @@
40#include "llmath.h" 40#include "llmath.h"
41#include "llfontgl.h" 41#include "llfontgl.h"
42 42
43#include "viewer.h" 43#include "llappviewer.h"
44#include "llviewerimagelist.h" 44#include "llviewerimagelist.h"
45#include "llui.h" 45#include "llui.h"
46#include "llviewercontrol.h" 46#include "llviewercontrol.h"
diff --git a/linden/indra/newview/llfeaturemanager.cpp b/linden/indra/newview/llfeaturemanager.cpp
index 6b6eacd..1bcd1e1 100644
--- a/linden/indra/newview/llfeaturemanager.cpp
+++ b/linden/indra/newview/llfeaturemanager.cpp
@@ -58,8 +58,6 @@
58// 58//
59extern LLMemoryInfo gSysMemory; 59extern LLMemoryInfo gSysMemory;
60extern LLCPUInfo gSysCPU; 60extern LLCPUInfo gSysCPU;
61extern void write_debug(const char *str);
62extern void write_debug(const std::string& str);
63 61
64#if LL_DARWIN 62#if LL_DARWIN
65const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; 63const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
@@ -493,8 +491,6 @@ void LLFeatureManager::initGraphicsFeatureMasks()
493 } 491 }
494} 492}
495 493
496extern LLOSInfo gSysOS;
497
498void LLFeatureManager::applyRecommendedFeatures() 494void LLFeatureManager::applyRecommendedFeatures()
499{ 495{
500 // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt 496 // see featuretable.txt / featuretable_linux.txt / featuretable_mac.txt
diff --git a/linden/indra/newview/llfirstuse.cpp b/linden/indra/newview/llfirstuse.cpp
index 0782586..2772a13 100644
--- a/linden/indra/newview/llfirstuse.cpp
+++ b/linden/indra/newview/llfirstuse.cpp
@@ -41,7 +41,7 @@
41#include "llfloatervoicewizard.h" 41#include "llfloatervoicewizard.h"
42#include "llviewercontrol.h" 42#include "llviewercontrol.h"
43#include "llui.h" 43#include "llui.h"
44#include "viewer.h" 44#include "llappviewer.h"
45 45
46// static 46// static
47std::set<LLString> LLFirstUse::sConfigVariables; 47std::set<LLString> LLFirstUse::sConfigVariables;
diff --git a/linden/indra/newview/llfloaterabout.cpp b/linden/indra/newview/llfloaterabout.cpp
index 460b719..01e5290 100644
--- a/linden/indra/newview/llfloaterabout.cpp
+++ b/linden/indra/newview/llfloaterabout.cpp
@@ -47,7 +47,7 @@
47#include "llversionviewer.h" 47#include "llversionviewer.h"
48#include "llviewerbuild.h" 48#include "llviewerbuild.h"
49#include "llvieweruictrlfactory.h" 49#include "llvieweruictrlfactory.h"
50#include "viewer.h" // for gViewerDigest 50#include "llappviewer.h"
51 51
52#if LL_LIBXUL_ENABLED 52#if LL_LIBXUL_ENABLED
53#include "llmozlib.h" 53#include "llmozlib.h"
@@ -57,7 +57,6 @@
57 57
58extern LLCPUInfo gSysCPU; 58extern LLCPUInfo gSysCPU;
59extern LLMemoryInfo gSysMemory; 59extern LLMemoryInfo gSysMemory;
60extern LLOSInfo gSysOS;
61extern U32 gPacketsIn; 60extern U32 gPacketsIn;
62 61
63///---------------------------------------------------------------------------- 62///----------------------------------------------------------------------------
@@ -78,13 +77,13 @@ LLFloaterAbout::LLFloaterAbout()
78 77
79 // Support for changing product name. 78 // Support for changing product name.
80 LLString title("About "); 79 LLString title("About ");
81 title += gSecondLife; 80 title += LLAppViewer::instance()->getSecondLifeTitle();
82 setTitle(title); 81 setTitle(title);
83 82
84 LLString support; 83 LLString support;
85 84
86 // Version string 85 // Version string
87 LLString version = gSecondLife 86 LLString version = LLAppViewer::instance()->getSecondLifeTitle()
88 + llformat(" %d.%d.%d (%d) %s %s (%s)", 87 + llformat(" %d.%d.%d (%d) %s %s (%s)",
89 LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD, 88 LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD,
90 __DATE__, __TIME__, 89 __DATE__, __TIME__,
@@ -133,7 +132,7 @@ LLFloaterAbout::LLFloaterAbout()
133 support.append(mem_text); 132 support.append(mem_text);
134 133
135 support.append("OS Version: "); 134 support.append("OS Version: ");
136 support.append( gSysOS.getOSString().c_str() ); 135 support.append( LLAppViewer::instance()->getOSInfo().getOSString().c_str() );
137 support.append("\n"); 136 support.append("\n");
138 137
139 support.append("Graphics Card Vendor: "); 138 support.append("Graphics Card Vendor: ");
diff --git a/linden/indra/newview/llfloateranimpreview.cpp b/linden/indra/newview/llfloateranimpreview.cpp
index 71c2217..693ffe0 100644
--- a/linden/indra/newview/llfloateranimpreview.cpp
+++ b/linden/indra/newview/llfloateranimpreview.cpp
@@ -60,7 +60,6 @@
60#include "llviewermenufile.h" // upload_new_resource() 60#include "llviewermenufile.h" // upload_new_resource()
61#include "llvoavatar.h" 61#include "llvoavatar.h"
62#include "pipeline.h" 62#include "pipeline.h"
63#include "viewer.h"
64#include "llvieweruictrlfactory.h" 63#include "llvieweruictrlfactory.h"
65 64
66S32 LLFloaterAnimPreview::sUploadAmount = 10; 65S32 LLFloaterAnimPreview::sUploadAmount = 10;
diff --git a/linden/indra/newview/llfloaterauction.cpp b/linden/indra/newview/llfloaterauction.cpp
index bc00565..e044ead 100644
--- a/linden/indra/newview/llfloaterauction.cpp
+++ b/linden/indra/newview/llfloaterauction.cpp
@@ -50,7 +50,8 @@
50#include "llviewerregion.h" 50#include "llviewerregion.h"
51#include "llvieweruictrlfactory.h" 51#include "llvieweruictrlfactory.h"
52#include "llviewerwindow.h" 52#include "llviewerwindow.h"
53#include "viewer.h" 53#include "llviewerdisplay.h"
54#include "llviewercontrol.h"
54#include "llui.h" 55#include "llui.h"
55 56
56///---------------------------------------------------------------------------- 57///----------------------------------------------------------------------------
diff --git a/linden/indra/newview/llfloateravatarinfo.cpp b/linden/indra/newview/llfloateravatarinfo.cpp
index 58fe1ab..a7deb6d 100644
--- a/linden/indra/newview/llfloateravatarinfo.cpp
+++ b/linden/indra/newview/llfloateravatarinfo.cpp
@@ -80,7 +80,7 @@ class LLAgentHandler : public LLCommandHandler
80{ 80{
81public: 81public:
82 LLAgentHandler() : LLCommandHandler("agent") { } 82 LLAgentHandler() : LLCommandHandler("agent") { }
83 bool handle(const std::vector<std::string>& params) 83 bool handle(const LLSD& params, const LLSD& queryMap)
84 { 84 {
85 if (params.size() < 2) return false; 85 if (params.size() < 2) return false;
86 LLUUID agent_id; 86 LLUUID agent_id;
@@ -89,7 +89,7 @@ public:
89 return false; 89 return false;
90 } 90 }
91 91
92 if (params[1] == "about") 92 if (params[1].asString() == "about")
93 { 93 {
94 LLFloaterAvatarInfo::show(agent_id); 94 LLFloaterAvatarInfo::show(agent_id);
95 return true; 95 return true;
diff --git a/linden/indra/newview/llfloateravatarpicker.cpp b/linden/indra/newview/llfloateravatarpicker.cpp
index 50f7387..a2ea8c2 100644
--- a/linden/indra/newview/llfloateravatarpicker.cpp
+++ b/linden/indra/newview/llfloateravatarpicker.cpp
@@ -42,7 +42,7 @@
42#include "llscrolllistctrl.h" 42#include "llscrolllistctrl.h"
43#include "lltextbox.h" 43#include "lltextbox.h"
44#include "llvieweruictrlfactory.h" 44#include "llvieweruictrlfactory.h"
45#include "viewer.h" 45#include "llagent.h"
46 46
47const S32 MIN_WIDTH = 200; 47const S32 MIN_WIDTH = 200;
48const S32 MIN_HEIGHT = 340; 48const S32 MIN_HEIGHT = 340;
@@ -265,13 +265,13 @@ void LLFloaterAvatarPicker::find()
265 265
266 msg->newMessage("AvatarPickerRequest"); 266 msg->newMessage("AvatarPickerRequest");
267 msg->nextBlock("AgentData"); 267 msg->nextBlock("AgentData");
268 msg->addUUID("AgentID", agent_get_id()); 268 msg->addUUID("AgentID", gAgent.getID());
269 msg->addUUID("SessionID", agent_get_session_id()); 269 msg->addUUID("SessionID", gAgent.getSessionID());
270 msg->addUUID("QueryID", mQueryID); // not used right now 270 msg->addUUID("QueryID", mQueryID); // not used right now
271 msg->nextBlock("Data"); 271 msg->nextBlock("Data");
272 msg->addString("Name", text); 272 msg->addString("Name", text);
273 273
274 agent_send_reliable_message(); 274 gAgent.sendReliableMessage();
275 275
276 if (mListNames) 276 if (mListNames)
277 { 277 {
@@ -309,7 +309,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
309 msg->getUUID("AgentData", "QueryID", query_id); 309 msg->getUUID("AgentData", "QueryID", query_id);
310 310
311 // Not for us 311 // Not for us
312 if (agent_id != agent_get_id()) return; 312 if (agent_id != gAgent.getID()) return;
313 313
314 // Dialog already closed 314 // Dialog already closed
315 LLFloaterAvatarPicker *self = sInstance; 315 LLFloaterAvatarPicker *self = sInstance;
diff --git a/linden/indra/newview/llfloateravatartextures.cpp b/linden/indra/newview/llfloateravatartextures.cpp
index 904f47d..64dc968 100644
--- a/linden/indra/newview/llfloateravatartextures.cpp
+++ b/linden/indra/newview/llfloateravatartextures.cpp
@@ -110,7 +110,7 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
110 if (id == IMG_DEFAULT_AVATAR) 110 if (id == IMG_DEFAULT_AVATAR)
111 { 111 {
112 ctrl->setImageAssetID(LLUUID::null); 112 ctrl->setImageAssetID(LLUUID::null);
113 ctrl->setToolTip("IMG_DEFAULT_AVATAR"); 113 ctrl->setToolTip(LLString("IMG_DEFAULT_AVATAR"));
114 } 114 }
115 else 115 else
116 { 116 {
diff --git a/linden/indra/newview/llfloaterbump.cpp b/linden/indra/newview/llfloaterbump.cpp
index e891bbe..abae92a 100644
--- a/linden/indra/newview/llfloaterbump.cpp
+++ b/linden/indra/newview/llfloaterbump.cpp
@@ -37,7 +37,7 @@
37#include "llscrolllistctrl.h" 37#include "llscrolllistctrl.h"
38 38
39#include "llvieweruictrlfactory.h" 39#include "llvieweruictrlfactory.h"
40#include "viewer.h" // gPacificDaylightTime 40#include "llappviewer.h" // gPacificDaylightTime
41 41
42///---------------------------------------------------------------------------- 42///----------------------------------------------------------------------------
43/// Local function declarations, constants, enums, and typedefs 43/// Local function declarations, constants, enums, and typedefs
diff --git a/linden/indra/newview/llfloaterbuycurrency.cpp b/linden/indra/newview/llfloaterbuycurrency.cpp
index a7233c3..4b5bb35 100644
--- a/linden/indra/newview/llfloaterbuycurrency.cpp
+++ b/linden/indra/newview/llfloaterbuycurrency.cpp
@@ -43,7 +43,7 @@
43#include "llvieweruictrlfactory.h" 43#include "llvieweruictrlfactory.h"
44#include "llweb.h" 44#include "llweb.h"
45#include "llwindow.h" 45#include "llwindow.h"
46#include "viewer.h" 46#include "llappviewer.h"
47 47
48static const S32 STANDARD_BUY_AMOUNT = 1000; 48static const S32 STANDARD_BUY_AMOUNT = 1000;
49static const S32 MINIMUM_BALANCE_AMOUNT = 0; 49static const S32 MINIMUM_BALANCE_AMOUNT = 0;
diff --git a/linden/indra/newview/llfloaterbuyland.cpp b/linden/indra/newview/llfloaterbuyland.cpp
index 9ae634c..12722b6 100644
--- a/linden/indra/newview/llfloaterbuyland.cpp
+++ b/linden/indra/newview/llfloaterbuyland.cpp
@@ -62,7 +62,7 @@
62#include "llwindow.h" 62#include "llwindow.h"
63#include "llworld.h" 63#include "llworld.h"
64#include "llxmlrpctransaction.h" 64#include "llxmlrpctransaction.h"
65#include "viewer.h" 65#include "llappviewer.h"
66#include "roles_constants.h" 66#include "roles_constants.h"
67 67
68// NOTE: This is duplicated in lldatamoney.cpp ... 68// NOTE: This is duplicated in lldatamoney.cpp ...
@@ -847,7 +847,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type,
847 static std::string transaction_uri; 847 static std::string transaction_uri;
848 if (transaction_uri.empty()) 848 if (transaction_uri.empty())
849 { 849 {
850 transaction_uri = getHelperURI() + "landtool.php"; 850 transaction_uri = LLAppViewer::instance()->getHelperURI() + "landtool.php";
851 } 851 }
852 852
853 const char* method; 853 const char* method;
diff --git a/linden/indra/newview/llfloaterclassified.cpp b/linden/indra/newview/llfloaterclassified.cpp
index aa57c6f..cc5ee59 100644
--- a/linden/indra/newview/llfloaterclassified.cpp
+++ b/linden/indra/newview/llfloaterclassified.cpp
@@ -46,7 +46,7 @@ class LLClassifiedHandler : public LLCommandHandler
46{ 46{
47public: 47public:
48 LLClassifiedHandler() : LLCommandHandler("classified") { } 48 LLClassifiedHandler() : LLCommandHandler("classified") { }
49 bool handle(const std::vector<std::string>& tokens) 49 bool handle(const LLSD& tokens, const LLSD& queryMap)
50 { 50 {
51 if (tokens.size() < 2) 51 if (tokens.size() < 2)
52 { 52 {
@@ -58,7 +58,7 @@ public:
58 return false; 58 return false;
59 } 59 }
60 60
61 if (tokens[1] == "about") 61 if (tokens[1].asString() == "about")
62 { 62 {
63 LLFloaterClassifiedInfo::show(classified_id); 63 LLFloaterClassifiedInfo::show(classified_id);
64 return true; 64 return true;
diff --git a/linden/indra/newview/llfloatercolorpicker.cpp b/linden/indra/newview/llfloatercolorpicker.cpp
index 03e3a2e..324da68 100644
--- a/linden/indra/newview/llfloatercolorpicker.cpp
+++ b/linden/indra/newview/llfloatercolorpicker.cpp
@@ -46,7 +46,6 @@
46#include "v4coloru.h" 46#include "v4coloru.h"
47#include "llbutton.h" 47#include "llbutton.h"
48#include "llviewercontrol.h" 48#include "llviewercontrol.h"
49#include "viewer.h"
50#include "llvieweruictrlfactory.h" 49#include "llvieweruictrlfactory.h"
51#include "llviewerwindow.h" 50#include "llviewerwindow.h"
52#include "llgl.h" 51#include "llgl.h"
diff --git a/linden/indra/newview/llfloaterdirectory.cpp b/linden/indra/newview/llfloaterdirectory.cpp
index 1693532..f453794 100644
--- a/linden/indra/newview/llfloaterdirectory.cpp
+++ b/linden/indra/newview/llfloaterdirectory.cpp
@@ -65,6 +65,10 @@
65#include "llvieweruictrlfactory.h" 65#include "llvieweruictrlfactory.h"
66 66
67LLFloaterDirectory* LLFloaterDirectory::sInstance = NULL; 67LLFloaterDirectory* LLFloaterDirectory::sInstance = NULL;
68//static
69S32 LLFloaterDirectory::sOldSearchCount = 0; // debug
70S32 LLFloaterDirectory::sNewSearchCount = 0; // debug
71
68 72
69LLFloaterDirectory::LLFloaterDirectory(const std::string& name) 73LLFloaterDirectory::LLFloaterDirectory(const std::string& name)
70: LLFloater(name, "FloaterFindRect2", ""), 74: LLFloater(name, "FloaterFindRect2", ""),
diff --git a/linden/indra/newview/llfloaterdirectory.h b/linden/indra/newview/llfloaterdirectory.h
index 4b0d81e..b7193b3 100644
--- a/linden/indra/newview/llfloaterdirectory.h
+++ b/linden/indra/newview/llfloaterdirectory.h
@@ -33,6 +33,7 @@
33#define LL_LLFLOATERDIRECTORY_H 33#define LL_LLFLOATERDIRECTORY_H
34 34
35#include "llfloater.h" 35#include "llfloater.h"
36#include "lltabcontainer.h"
36 37
37class LLDirectoryCore; 38class LLDirectoryCore;
38class LLPanelDirBrowser; 39class LLPanelDirBrowser;
@@ -128,6 +129,9 @@ public:
128 LLPanelPlace* mPanelPlaceSmallp; 129 LLPanelPlace* mPanelPlaceSmallp;
129 LLPanelClassified* mPanelClassifiedp; 130 LLPanelClassified* mPanelClassifiedp;
130 131
132 static S32 sOldSearchCount; // debug
133 static S32 sNewSearchCount; // debug
134
131private: 135private:
132 bool mMinimizing; // HACK: see reshape() for details 136 bool mMinimizing; // HACK: see reshape() for details
133 static LLFloaterDirectory *sInstance; 137 static LLFloaterDirectory *sInstance;
diff --git a/linden/indra/newview/llfloaterevent.cpp b/linden/indra/newview/llfloaterevent.cpp
index d237fc9..9ef18cd 100644
--- a/linden/indra/newview/llfloaterevent.cpp
+++ b/linden/indra/newview/llfloaterevent.cpp
@@ -47,14 +47,14 @@ class LLEventHandler : public LLCommandHandler
47{ 47{
48public: 48public:
49 LLEventHandler() : LLCommandHandler("event") { } 49 LLEventHandler() : LLCommandHandler("event") { }
50 bool handle(const std::vector<std::string>& tokens) 50 bool handle(const LLSD& tokens, const LLSD& queryMap)
51 { 51 {
52 if (tokens.size() < 2) 52 if (tokens.size() < 2)
53 { 53 {
54 return false; 54 return false;
55 } 55 }
56 U32 event_id = atoi(tokens[0].c_str()); 56 U32 event_id = tokens[0].asInteger();
57 if (tokens[1] == "about") 57 if (tokens[1].asString() == "about")
58 { 58 {
59 LLFloaterEventInfo::show(event_id); 59 LLFloaterEventInfo::show(event_id);
60 return true; 60 return true;
diff --git a/linden/indra/newview/llfloaterfriends.cpp b/linden/indra/newview/llfloaterfriends.cpp
index 6f792e0..6f4945e 100644
--- a/linden/indra/newview/llfloaterfriends.cpp
+++ b/linden/indra/newview/llfloaterfriends.cpp
@@ -61,19 +61,43 @@
61//Maximum number of people you can select to do an operation on at once. 61//Maximum number of people you can select to do an operation on at once.
62#define MAX_FRIEND_SELECT 20 62#define MAX_FRIEND_SELECT 20
63#define RIGHTS_CHANGE_TIMEOUT 5.0 63#define RIGHTS_CHANGE_TIMEOUT 5.0
64#define OBSERVER_TIMEOUT 0.5
64 65
65// simple class to observe the calling cards. 66// simple class to observe the calling cards.
66class LLLocalFriendsObserver : public LLFriendObserver 67class LLLocalFriendsObserver : public LLFriendObserver, public LLEventTimer
67{ 68{
68public: 69public:
69 LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater) {} 70 LLLocalFriendsObserver(LLPanelFriends* floater) : mFloater(floater), LLEventTimer(OBSERVER_TIMEOUT)
70 virtual ~LLLocalFriendsObserver() { mFloater = NULL; } 71 {
72 mEventTimer.stop();
73 }
74 virtual ~LLLocalFriendsObserver()
75 {
76 mFloater = NULL;
77 }
71 virtual void changed(U32 mask) 78 virtual void changed(U32 mask)
72 { 79 {
73 mFloater->updateFriends(mask); 80 // events can arrive quickly in bulk - we need not process EVERY one of them -
81 // so we wait a short while to let others pile-in, and process them in aggregate.
82 mEventTimer.start();
83 mEventTimer.reset();
84
85 // save-up all the mask-bits which have come-in
86 mMask |= mask;
87 }
88 virtual BOOL tick()
89 {
90 mFloater->updateFriends(mMask);
91
92 mEventTimer.stop();
93 mMask = 0;
94
95 return FALSE;
74 } 96 }
97
75protected: 98protected:
76 LLPanelFriends* mFloater; 99 LLPanelFriends* mFloater;
100 U32 mMask;
77}; 101};
78 102
79LLPanelFriends::LLPanelFriends() : 103LLPanelFriends::LLPanelFriends() :
diff --git a/linden/indra/newview/llfloatergroupinfo.cpp b/linden/indra/newview/llfloatergroupinfo.cpp
index eb3b692..b274a51 100644
--- a/linden/indra/newview/llfloatergroupinfo.cpp
+++ b/linden/indra/newview/llfloatergroupinfo.cpp
@@ -56,7 +56,7 @@ class LLGroupHandler : public LLCommandHandler
56{ 56{
57public: 57public:
58 LLGroupHandler() : LLCommandHandler("group") { } 58 LLGroupHandler() : LLCommandHandler("group") { }
59 bool handle(const std::vector<std::string>& tokens) 59 bool handle(const LLSD& tokens, const LLSD& queryMap)
60 { 60 {
61 if (tokens.size() < 2) 61 if (tokens.size() < 2)
62 { 62 {
@@ -69,7 +69,7 @@ public:
69 return false; 69 return false;
70 } 70 }
71 71
72 if (tokens[1] == "about") 72 if (tokens[1].asString() == "about")
73 { 73 {
74 LLFloaterGroupInfo::showFromUUID(group_id); 74 LLFloaterGroupInfo::showFromUUID(group_id);
75 return true; 75 return true;
diff --git a/linden/indra/newview/llfloaterimagepreview.cpp b/linden/indra/newview/llfloaterimagepreview.cpp
index c24d435..53779b6 100644
--- a/linden/indra/newview/llfloaterimagepreview.cpp
+++ b/linden/indra/newview/llfloaterimagepreview.cpp
@@ -51,7 +51,6 @@
51#include "llviewerwindow.h" 51#include "llviewerwindow.h"
52#include "llvoavatar.h" 52#include "llvoavatar.h"
53#include "pipeline.h" 53#include "pipeline.h"
54#include "viewer.h"
55#include "llvieweruictrlfactory.h" 54#include "llvieweruictrlfactory.h"
56#include "llviewerimagelist.h" 55#include "llviewerimagelist.h"
57 56
diff --git a/linden/indra/newview/llfloaterimport.cpp b/linden/indra/newview/llfloaterimport.cpp
index 4923497..edb1edb 100644
--- a/linden/indra/newview/llfloaterimport.cpp
+++ b/linden/indra/newview/llfloaterimport.cpp
@@ -57,7 +57,6 @@
57#include "llviewerwindow.h" 57#include "llviewerwindow.h"
58#include "llvoavatar.h" 58#include "llvoavatar.h"
59#include "pipeline.h" 59#include "pipeline.h"
60#include "viewer.h"
61#include "llvieweruictrlfactory.h" 60#include "llvieweruictrlfactory.h"
62#include "llmd5.h" 61#include "llmd5.h"
63 62
diff --git a/linden/indra/newview/llfloaterlagmeter.cpp b/linden/indra/newview/llfloaterlagmeter.cpp
index 399d0b6..04a5cf6 100644
--- a/linden/indra/newview/llfloaterlagmeter.cpp
+++ b/linden/indra/newview/llfloaterlagmeter.cpp
@@ -37,7 +37,8 @@
37#include "llviewerstats.h" 37#include "llviewerstats.h"
38#include "llviewerimage.h" 38#include "llviewerimage.h"
39#include "llviewercontrol.h" 39#include "llviewercontrol.h"
40#include "viewer.h" 40#include "llappviewer.h"
41
41#include "lltexturefetch.h" 42#include "lltexturefetch.h"
42 43
43#include "llbutton.h" 44#include "llbutton.h"
@@ -189,7 +190,7 @@ void LLFloaterLagMeter::determineClient()
189 { 190 {
190 mClientCause->setText( childGetText("client_draw_distance_cause_msg") ); 191 mClientCause->setText( childGetText("client_draw_distance_cause_msg") );
191 } 192 }
192 else if(gTextureFetch->getNumRequests() > 2) 193 else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2)
193 { 194 {
194 mClientCause->setText( childGetText("client_texture_loading_cause_msg") ); 195 mClientCause->setText( childGetText("client_texture_loading_cause_msg") );
195 } 196 }
diff --git a/linden/indra/newview/llfloaterland.cpp b/linden/indra/newview/llfloaterland.cpp
index 283b3f4..543dd94 100644
--- a/linden/indra/newview/llfloaterland.cpp
+++ b/linden/indra/newview/llfloaterland.cpp
@@ -239,7 +239,6 @@ LLFloaterLand::LLFloaterLand()
239 factory_map["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this); 239 factory_map["land_options_panel"] = LLCallbackMap(createPanelLandOptions, this);
240 factory_map["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this); 240 factory_map["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this);
241 factory_map["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this); 241 factory_map["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this);
242 factory_map["land_ban_panel"] = LLCallbackMap(createPanelLandBan, this);
243 242
244 gUICtrlFactory->buildFloater(this, "floater_about_land.xml", &factory_map); 243 gUICtrlFactory->buildFloater(this, "floater_about_land.xml", &factory_map);
245 244
@@ -271,7 +270,6 @@ void LLFloaterLand::refresh()
271 mPanelOptions->refresh(); 270 mPanelOptions->refresh();
272 mPanelMedia->refresh(); 271 mPanelMedia->refresh();
273 mPanelAccess->refresh(); 272 mPanelAccess->refresh();
274 mPanelBan->refresh();
275} 273}
276 274
277 275
@@ -326,15 +324,6 @@ void* LLFloaterLand::createPanelLandAccess(void* data)
326 return self->mPanelAccess; 324 return self->mPanelAccess;
327} 325}
328 326
329// static
330void* LLFloaterLand::createPanelLandBan(void* data)
331{
332 LLFloaterLand* self = (LLFloaterLand*)data;
333 self->mPanelBan = new LLPanelLandBan(self->mParcel);
334 return self->mPanelBan;
335}
336
337
338//--------------------------------------------------------------------------- 327//---------------------------------------------------------------------------
339// LLPanelLandGeneral 328// LLPanelLandGeneral
340//--------------------------------------------------------------------------- 329//---------------------------------------------------------------------------
@@ -2558,35 +2547,27 @@ LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel)
2558 2547
2559BOOL LLPanelLandAccess::postBuild() 2548BOOL LLPanelLandAccess::postBuild()
2560{ 2549{
2561 2550 childSetCommitCallback("public_access", onCommitAny, this);
2562 2551 childSetCommitCallback("limit_payment", onCommitAny, this);
2563 mCheckGroup = LLUICtrlFactory::getCheckBoxByName(this, "GroupCheck"); 2552 childSetCommitCallback("limit_age_verified", onCommitAny, this);
2564 childSetCommitCallback("GroupCheck", onCommitAny, this); 2553 childSetCommitCallback("GroupCheck", onCommitAny, this);
2565
2566 mCheckAccess = LLUICtrlFactory::getCheckBoxByName(this, "AccessCheck");
2567 childSetCommitCallback("AccessCheck", onCommitAny, this);
2568
2569 mListAccess = LLUICtrlFactory::getNameListByName(this, "AccessList");
2570 mListAccess->sortByColumn(0, TRUE); // ascending
2571
2572 mBtnAddAccess = LLUICtrlFactory::getButtonByName(this, "Add...");
2573
2574 mBtnAddAccess->setClickedCallback(onClickAdd, this);
2575
2576 mBtnRemoveAccess = LLUICtrlFactory::getButtonByName(this, "Remove");
2577
2578 mBtnRemoveAccess->setClickedCallback(onClickRemove, this);
2579
2580 mCheckPass = LLUICtrlFactory::getCheckBoxByName(this, "PassCheck");
2581 childSetCommitCallback("PassCheck", onCommitAny, this); 2554 childSetCommitCallback("PassCheck", onCommitAny, this);
2582 2555 childSetCommitCallback("pass_combo", onCommitAny, this);
2583
2584 mSpinPrice = LLUICtrlFactory::getSpinnerByName(this, "PriceSpin");
2585 childSetCommitCallback("PriceSpin", onCommitAny, this); 2556 childSetCommitCallback("PriceSpin", onCommitAny, this);
2586
2587 mSpinHours = LLUICtrlFactory::getSpinnerByName(this, "HoursSpin");
2588 childSetCommitCallback("HoursSpin", onCommitAny, this); 2557 childSetCommitCallback("HoursSpin", onCommitAny, this);
2589 2558
2559 childSetAction("add_allowed", onClickAddAccess, this);
2560 childSetAction("remove_allowed", onClickRemoveAccess, this);
2561 childSetAction("add_banned", onClickAddBanned, this);
2562 childSetAction("remove_banned", onClickRemoveBanned, this);
2563
2564 mListAccess = LLUICtrlFactory::getNameListByName(this, "AccessList");
2565 if (mListAccess)
2566 mListAccess->sortByColumn(0, TRUE); // ascending
2567
2568 mListBanned = LLUICtrlFactory::getNameListByName(this, "BannedList");
2569 if (mListBanned)
2570 mListBanned->sortByColumn(0, TRUE); // ascending
2590 2571
2591 return TRUE; 2572 return TRUE;
2592} 2573}
@@ -2598,106 +2579,241 @@ LLPanelLandAccess::~LLPanelLandAccess()
2598 2579
2599void LLPanelLandAccess::refresh() 2580void LLPanelLandAccess::refresh()
2600{ 2581{
2601 mListAccess->deleteAllItems(); 2582 if (mListAccess)
2602 2583 mListAccess->deleteAllItems();
2584 if (mListBanned)
2585 mListBanned->deleteAllItems();
2586
2603 LLParcel *parcel = mParcel->getParcel(); 2587 LLParcel *parcel = mParcel->getParcel();
2604 2588
2589 // Display options
2605 if (parcel) 2590 if (parcel)
2606 { 2591 {
2607 // Display options 2592 BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
2608 BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); 2593 BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);
2609 mCheckGroup->set( use_group ); 2594 BOOL public_access = !use_access_list && !use_group;
2595
2596 childSetValue("public_access", public_access );
2597 childSetValue("GroupCheck", use_group );
2610 2598
2611 char group_name[MAX_STRING]; /*Flawfinder: ignore*/ 2599 char group_name[MAX_STRING]; /*Flawfinder: ignore*/
2612 gCacheName->getGroupName(parcel->getGroupID(), group_name); 2600 gCacheName->getGroupName(parcel->getGroupID(), group_name);
2613 mCheckGroup->setLabelArg( "[GROUP]", LLString(group_name) ); 2601 childSetLabelArg("GroupCheck", "[GROUP]", LLString(group_name) );
2614 2602
2615 S32 count = parcel->mAccessList.size(); 2603 // Allow list
2616
2617 BOOL use_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
2618 mCheckAccess->set( use_list );
2619 mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",count));
2620 mCheckAccess->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
2621
2622 access_map_const_iterator cit = parcel->mAccessList.begin();
2623 access_map_const_iterator end = parcel->mAccessList.end();
2624
2625 for (; cit != end; ++cit)
2626 { 2604 {
2627 const LLAccessEntry& entry = (*cit).second; 2605 S32 count = parcel->mAccessList.size();
2628 LLString suffix; 2606 childSetToolTipArg("AccessList", "[LISTED]", llformat("%d",count));
2629 if (entry.mTime != 0) 2607 childSetToolTipArg("AccessList", "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
2608
2609 // *TODO: Translate
2610 for (access_map_const_iterator cit = parcel->mAccessList.begin();
2611 cit != parcel->mAccessList.end(); ++cit)
2630 { 2612 {
2631 S32 now = time(NULL); 2613 const LLAccessEntry& entry = (*cit).second;
2632 S32 seconds = entry.mTime - now; 2614 LLString suffix;
2633 if (seconds < 0) seconds = 0; 2615 if (entry.mTime != 0)
2634 suffix.assign(" (");
2635 if (seconds >= 120)
2636 { 2616 {
2637 char buf[30]; /*Flawfinder: ignore*/ 2617 S32 now = time(NULL);
2638 snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */ 2618 S32 seconds = entry.mTime - now;
2639 suffix.append(buf); 2619 if (seconds < 0) seconds = 0;
2620 suffix.assign(" (");
2621 if (seconds >= 120)
2622 {
2623 std::string buf = llformat("%d minutes", (seconds/60));
2624 suffix.append(buf);
2625 }
2626 else if (seconds >= 60)
2627 {
2628 suffix.append("1 minute");
2629 }
2630 else
2631 {
2632 std::string buf = llformat("%d seconds", seconds);
2633 suffix.append(buf);
2634 }
2635 suffix.append(" remaining)");
2640 } 2636 }
2641 else if (seconds >= 60) 2637 if (mListAccess)
2642 { 2638 mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
2643 suffix.append("1 minute");
2644 }
2645 else
2646 {
2647 char buf[30]; /*Flawfinder: ignore*/
2648 snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */
2649 suffix.append(buf);
2650 }
2651 suffix.append(" remaining)");
2652 } 2639 }
2653 mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
2654 } 2640 }
2655 2641
2656 BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED); 2642 // Ban List
2657 2643 {
2658 BOOL enable_add = can_manage_allowed && (count < PARCEL_MAX_ACCESS_LIST); 2644 S32 count = parcel->mBanList.size();
2659 mBtnAddAccess->setEnabled(enable_add);
2660 2645
2661 BOOL enable_remove = can_manage_allowed && (count > 0); 2646 childSetToolTipArg("BannedList", "[LISTED]", llformat("%d",count));
2662 mBtnRemoveAccess->setEnabled(enable_remove); 2647 childSetToolTipArg("BannedList", "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
2663 2648
2664 // Can only sell passes when limiting the access. 2649 for (access_map_const_iterator cit = parcel->mBanList.begin();
2665 BOOL can_manage_passes = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_PASSES); 2650 cit != parcel->mBanList.end(); ++cit)
2666 mCheckPass->setEnabled( (use_group || use_list) && can_manage_passes ); 2651 {
2652 const LLAccessEntry& entry = (*cit).second;
2653 LLString suffix;
2654 if (entry.mTime != 0)
2655 {
2656 S32 now = time(NULL);
2657 S32 seconds = entry.mTime - now;
2658 if (seconds < 0) seconds = 0;
2659 suffix.assign(" (");
2660 if (seconds >= 120)
2661 {
2662 std::string buf = llformat("%d minutes", (seconds/60));
2663 suffix.append(buf);
2664 }
2665 else if (seconds >= 60)
2666 {
2667 suffix.append("1 minute");
2668 }
2669 else
2670 {
2671 std::string buf = llformat("%d seconds", seconds);
2672 suffix.append(buf);
2673 }
2674 suffix.append(" remaining)");
2675 }
2676 mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
2677 }
2678 }
2667 2679
2680 if(parcel->getRegionDenyAnonymousOverride())
2681 {
2682 childSetValue("limit_payment", TRUE);
2683 }
2684 else
2685 {
2686 childSetValue("limit_payment", (parcel->getParcelFlag(PF_DENY_ANONYMOUS)));
2687 }
2688 if(parcel->getRegionDenyAgeUnverifiedOverride())
2689 {
2690 childSetValue("limit_age_verified", TRUE);
2691 }
2692 else
2693 {
2694 childSetValue("limit_age_verified", (parcel->getParcelFlag(PF_DENY_AGEUNVERIFIED)));
2695 }
2696
2668 BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST); 2697 BOOL use_pass = parcel->getParcelFlag(PF_USE_PASS_LIST);
2669 mCheckPass->set( use_pass ); 2698 childSetValue("PassCheck", use_pass );
2670 2699 LLCtrlSelectionInterface* passcombo = childGetSelectionInterface("pass_combo");
2671 BOOL enable_pass = can_manage_passes && use_pass; 2700 if (passcombo)
2672 mSpinPrice->setEnabled( enable_pass ); 2701 {
2673 mSpinHours->setEnabled( enable_pass ); 2702 if (public_access || !use_pass || !use_group)
2674 2703 {
2704 passcombo->selectByValue("anyone");
2705 }
2706 }
2707
2675 S32 pass_price = parcel->getPassPrice(); 2708 S32 pass_price = parcel->getPassPrice();
2676 mSpinPrice->set( F32(pass_price) ); 2709 childSetValue( "PriceSpin", (F32)pass_price );
2677 2710
2678 F32 pass_hours = parcel->getPassHours(); 2711 F32 pass_hours = parcel->getPassHours();
2679 mSpinHours->set( pass_hours ); 2712 childSetValue( "HoursSpin", pass_hours );
2680
2681 mCheckGroup->setEnabled( can_manage_allowed );
2682 mCheckAccess->setEnabled( can_manage_allowed );
2683
2684 } 2713 }
2685 else 2714 else
2686 { 2715 {
2687 mCheckGroup->set(FALSE); 2716 childSetValue("public_access", FALSE);
2688 mCheckGroup->setLabelArg( "[GROUP]", LLString::null ); 2717 childSetValue("limit_payment", FALSE);
2689 mCheckAccess->set(FALSE); 2718 childSetValue("limit_age_verified", FALSE);
2690 mCheckAccess->setLabelArg( "[LISTED]", llformat("%d",0)); 2719 childSetValue("GroupCheck", FALSE);
2691 mBtnAddAccess->setEnabled(FALSE); 2720 childSetLabelArg("GroupCheck", "[GROUP]", LLString::null );
2692 mBtnRemoveAccess->setEnabled(FALSE); 2721 childSetValue("PassCheck", FALSE);
2693 mSpinPrice->set((F32)PARCEL_PASS_PRICE_DEFAULT); 2722 childSetValue("PriceSpin", (F32)PARCEL_PASS_PRICE_DEFAULT);
2694 mSpinPrice->setEnabled(FALSE); 2723 childSetValue( "HoursSpin", PARCEL_PASS_HOURS_DEFAULT );
2695 mSpinHours->set( PARCEL_PASS_HOURS_DEFAULT ); 2724 childSetToolTipArg("AccessList", "[LISTED]", llformat("%d",0));
2696 mSpinHours->setEnabled(FALSE); 2725 childSetToolTipArg("AccessList", "[MAX]", llformat("%d",0));
2697 mCheckGroup->setEnabled(FALSE); 2726 childSetToolTipArg("BannedList", "[LISTED]", llformat("%d",0));
2698 mCheckAccess->setEnabled(FALSE); 2727 childSetToolTipArg("BannedList", "[MAX]", llformat("%d",0));
2728 }
2729}
2730
2731void LLPanelLandAccess::refresh_ui()
2732{
2733 childSetEnabled("public_access", FALSE);
2734 childSetEnabled("limit_payment", FALSE);
2735 childSetEnabled("limit_age_verified", FALSE);
2736 childSetEnabled("GroupCheck", FALSE);
2737 childSetEnabled("PassCheck", FALSE);
2738 childSetEnabled("pass_combo", FALSE);
2739 childSetEnabled("PriceSpin", FALSE);
2740 childSetEnabled("HoursSpin", FALSE);
2741 childSetEnabled("AccessList", FALSE);
2742 childSetEnabled("BannedList", FALSE);
2743
2744 LLParcel *parcel = mParcel->getParcel();
2745 if (parcel)
2746 {
2747 BOOL can_manage_allowed = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_ALLOWED);
2748 BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED);
2749
2750 childSetEnabled("public_access", can_manage_allowed);
2751 BOOL public_access = childGetValue("public_access").asBoolean();
2752 if (public_access)
2753 {
2754 bool override = false;
2755 if(parcel->getRegionDenyAnonymousOverride())
2756 {
2757 override = true;
2758 childSetEnabled("limit_payment", FALSE);
2759 }
2760 else
2761 {
2762 childSetEnabled("limit_payment", can_manage_allowed);
2763 }
2764 if(parcel->getRegionDenyAgeUnverifiedOverride())
2765 {
2766 override = true;
2767 childSetEnabled("limit_age_verified", FALSE);
2768 }
2769 else
2770 {
2771 childSetEnabled("limit_age_verified", can_manage_allowed);
2772 }
2773 if (override)
2774 {
2775 childSetToolTip("Only Allow", getUIString("estate_override"));
2776 }
2777 else
2778 {
2779 childSetToolTip("Only Allow", LLString());
2780 }
2781 childSetEnabled("GroupCheck", FALSE);
2782 childSetEnabled("PassCheck", FALSE);
2783 childSetEnabled("pass_combo", FALSE);
2784 childSetEnabled("AccessList", FALSE);
2785 }
2786 else
2787 {
2788 childSetEnabled("limit_payment", FALSE);
2789 childSetEnabled("limit_age_verified", FALSE);
2790 char group_name[MAX_STRING]; /*Flawfinder: ignore*/
2791 if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
2792 {
2793 childSetEnabled("GroupCheck", can_manage_allowed);
2794 }
2795 BOOL group_access = childGetValue("GroupCheck").asBoolean();
2796 BOOL sell_passes = childGetValue("PassCheck").asBoolean();
2797 childSetEnabled("PassCheck", can_manage_allowed);
2798 if (sell_passes)
2799 {
2800 childSetEnabled("pass_combo", group_access && can_manage_allowed);
2801 childSetEnabled("PriceSpin", can_manage_allowed);
2802 childSetEnabled("HoursSpin", can_manage_allowed);
2803 }
2804 }
2805 childSetEnabled("AccessList", can_manage_allowed);
2806 S32 allowed_list_count = parcel->mAccessList.size();
2807 childSetEnabled("add_allowed", can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
2808 childSetEnabled("remove_allowed", can_manage_allowed && allowed_list_count > 0);
2809
2810 childSetEnabled("BannedList", can_manage_banned);
2811 S32 banned_list_count = parcel->mBanList.size();
2812 childSetEnabled("add_banned", can_manage_banned && banned_list_count < PARCEL_MAX_ACCESS_LIST);
2813 childSetEnabled("remove_banned", can_manage_banned && banned_list_count > 0);
2699 } 2814 }
2700} 2815}
2816
2701 2817
2702// public 2818// public
2703void LLPanelLandAccess::refreshNames() 2819void LLPanelLandAccess::refreshNames()
@@ -2709,23 +2825,19 @@ void LLPanelLandAccess::refreshNames()
2709 { 2825 {
2710 gCacheName->getGroupName(parcel->getGroupID(), group_name); 2826 gCacheName->getGroupName(parcel->getGroupID(), group_name);
2711 } 2827 }
2712 mCheckGroup->setLabelArg("[GROUP]", LLString(group_name)); 2828 childSetLabelArg("GroupCheck", "[GROUP]", LLString(group_name));
2713} 2829}
2714 2830
2715 2831
2716// virtual 2832// virtual
2717void LLPanelLandAccess::draw() 2833void LLPanelLandAccess::draw()
2718{ 2834{
2835 refresh_ui();
2719 refreshNames(); 2836 refreshNames();
2720 LLPanel::draw(); 2837 LLPanel::draw();
2721} 2838}
2722 2839
2723 2840
2724void LLPanelLandAccess::onAccessLevelChange(LLUICtrl*, void *userdata)
2725{
2726 LLPanelLandAccess::onCommitAny(NULL, userdata);
2727}
2728
2729// static 2841// static
2730void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) 2842void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
2731{ 2843{
@@ -2738,27 +2850,53 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
2738 } 2850 }
2739 2851
2740 // Extract data from UI 2852 // Extract data from UI
2741 BOOL use_access_group = self->mCheckGroup->get(); 2853 BOOL public_access = self->childGetValue("public_access").asBoolean();
2742 BOOL use_access_list = self->mCheckAccess->get(); 2854 BOOL limit_payment = FALSE, limit_age_verified = FALSE;
2743 BOOL use_pass_list = self->mCheckPass->get(); 2855 BOOL use_access_group = FALSE;
2744 2856 BOOL use_access_list = FALSE;
2745 2857 BOOL use_pass_list = FALSE;
2746 2858 if (public_access)
2747 // Must be limiting access to sell passes
2748 if (!use_access_group && !use_access_list)
2749 { 2859 {
2750 use_pass_list = FALSE; 2860 use_access_list = FALSE;
2861 limit_payment = self->childGetValue("limit_payment").asBoolean();
2862 limit_age_verified = self->childGetValue("limit_age_verified").asBoolean();
2863 }
2864 else
2865 {
2866 use_access_list = TRUE;
2867 use_access_group = self->childGetValue("GroupCheck").asBoolean();
2868 use_pass_list = self->childGetValue("PassCheck").asBoolean();
2869 if (use_access_group)
2870 {
2871 char group_name[MAX_STRING]; /*Flawfinder: ignore*/
2872 if (!gCacheName->getGroupName(parcel->getGroupID(), group_name))
2873 {
2874 use_access_group = FALSE;
2875 }
2876 if (use_pass_list)
2877 {
2878 LLCtrlSelectionInterface* passcombo = self->childGetSelectionInterface("pass_combo");
2879 if (passcombo)
2880 {
2881 if (passcombo->getSimpleSelectedValue().asString() == "group")
2882 {
2883 use_access_list = FALSE;
2884 }
2885 }
2886 }
2887 }
2751 } 2888 }
2752 2889
2753 S32 pass_price = llfloor(self->mSpinPrice->get()); 2890 S32 pass_price = llfloor((F32)self->childGetValue("PriceSpin").asReal());
2754 F32 pass_hours = self->mSpinHours->get(); 2891 F32 pass_hours = (F32)self->childGetValue("HoursSpin").asReal();
2755
2756 // Validate extracted data
2757 2892
2758 // Push data into current parcel 2893 // Push data into current parcel
2759 parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group); 2894 parcel->setParcelFlag(PF_USE_ACCESS_GROUP, use_access_group);
2760 parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list); 2895 parcel->setParcelFlag(PF_USE_ACCESS_LIST, use_access_list);
2761 parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list); 2896 parcel->setParcelFlag(PF_USE_PASS_LIST, use_pass_list);
2897 parcel->setParcelFlag(PF_USE_BAN_LIST, TRUE);
2898 parcel->setParcelFlag(PF_DENY_ANONYMOUS, limit_payment);
2899 parcel->setParcelFlag(PF_DENY_AGEUNVERIFIED, limit_age_verified);
2762 2900
2763 parcel->setPassPrice( pass_price ); 2901 parcel->setPassPrice( pass_price );
2764 parcel->setPassHours( pass_hours ); 2902 parcel->setPassHours( pass_hours );
@@ -2771,287 +2909,100 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
2771} 2909}
2772 2910
2773// static 2911// static
2774void LLPanelLandAccess::onClickAdd(void* data) 2912void LLPanelLandAccess::onClickAddAccess(void* data)
2775{ 2913{
2776 LLPanelLandAccess* panelp = (LLPanelLandAccess*)data; 2914 LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
2777 gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, data) ); 2915 if (panelp)
2778} 2916 {
2779 2917 gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBAccess, data) );
2780// static 2918 }
2781void LLPanelLandAccess::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
2782{
2783 LLPanelLandAccess* self = (LLPanelLandAccess*)userdata;
2784 if (names.empty() || ids.empty()) return;
2785 self->addAvatar(ids[0]);
2786}
2787
2788
2789void LLPanelLandAccess::addAvatar(LLUUID id)
2790{
2791 LLParcel* parcel = mParcel->getParcel();
2792 if (!parcel) return;
2793
2794 parcel->addToAccessList(id, 0);
2795
2796 gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS);
2797
2798 refresh();
2799} 2919}
2800 2920
2801
2802// static 2921// static
2803void LLPanelLandAccess::onClickRemove(void* data) 2922void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
2804{ 2923{
2805 LLPanelLandAccess* self = (LLPanelLandAccess*)data; 2924 LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata;
2806 if (!self) return; 2925 if (!names.empty() && !ids.empty())
2807
2808 LLScrollListItem* item = self->mListAccess->getFirstSelected();
2809 if (!item) return;
2810
2811 LLParcel* parcel = self->mParcel->getParcel();
2812 if (!parcel) return;
2813
2814 const LLUUID& agent_id = item->getUUID();
2815
2816 parcel->removeFromAccessList(agent_id);
2817
2818 gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS);
2819
2820 self->refresh();
2821}
2822
2823
2824
2825//---------------------------------------------------------------------------
2826// LLPanelLandBan
2827//---------------------------------------------------------------------------
2828LLPanelLandBan::LLPanelLandBan(LLParcelSelectionHandle& parcel)
2829: LLPanel("land_ban_panel"), mParcel(parcel)
2830{
2831
2832}
2833
2834
2835
2836BOOL LLPanelLandBan::postBuild()
2837{
2838
2839 mCheck = LLUICtrlFactory::getCheckBoxByName(this, "LandBanCheck");
2840 childSetCommitCallback("LandBanCheck", onCommitAny, this);
2841
2842 mList = LLUICtrlFactory::getNameListByName(this, "LandBanList");
2843 mList->sortByColumn(0, TRUE); // ascending
2844
2845 mBtnAdd = LLUICtrlFactory::getButtonByName(this, "Add...");
2846
2847 mBtnAdd->setClickedCallback(onClickAdd, this);
2848
2849 mBtnRemove = LLUICtrlFactory::getButtonByName(this, "Remove");
2850
2851 mBtnRemove->setClickedCallback(onClickRemove, this);
2852
2853 mCheckDenyAnonymous = LLUICtrlFactory::getCheckBoxByName(this, "DenyAnonymousCheck");
2854 childSetCommitCallback("DenyAnonymousCheck", onCommitAny, this);
2855
2856 mCheckDenyIdentified = LLUICtrlFactory::getCheckBoxByName(this, "DenyIdentifiedCheck");
2857 childSetCommitCallback("DenyIdentifiedCheck", onCommitAny, this);
2858
2859 mCheckDenyTransacted = LLUICtrlFactory::getCheckBoxByName(this, "DenyTransactedCheck");
2860 childSetCommitCallback("DenyTransactedCheck", onCommitAny, this);
2861
2862 return TRUE;
2863
2864}
2865
2866
2867LLPanelLandBan::~LLPanelLandBan()
2868{ }
2869
2870void LLPanelLandBan::refresh()
2871{
2872 mList->deleteAllItems();
2873
2874 LLParcel *parcel = mParcel->getParcel();
2875
2876 if (parcel)
2877 { 2926 {
2878 // Display options 2927 LLUUID id = ids[0];
2879 2928 LLParcel* parcel = panelp->mParcel->getParcel();
2880 S32 count = parcel->mBanList.size(); 2929 if (parcel)
2881
2882 BOOL use_ban = parcel->getParcelFlag(PF_USE_BAN_LIST);
2883 mCheck->set( use_ban );
2884 mCheck->setLabelArg( "[LISTED]", llformat("%d",count));
2885 mCheck->setLabelArg( "[MAX]", llformat("%d",PARCEL_MAX_ACCESS_LIST));
2886
2887 access_map_const_iterator cit = parcel->mBanList.begin();
2888 access_map_const_iterator end = parcel->mBanList.end();
2889 for ( ; cit != end; ++cit)
2890 {
2891 const LLAccessEntry& entry = (*cit).second;
2892 LLString suffix;
2893 if (entry.mTime != 0)
2894 {
2895 S32 now = time(NULL);
2896 S32 seconds = entry.mTime - now;
2897 if (seconds < 0) seconds = 0;
2898 suffix.assign(" (");
2899 if (seconds >= 120)
2900 {
2901 char buf[30]; /*Flawfinder: ignore*/
2902 snprintf(buf, sizeof(buf), "%d minutes", (seconds/60)); /* Flawfinder: ignore */
2903 suffix.append(buf);
2904 }
2905 else if (seconds >= 60)
2906 {
2907 suffix.append("1 minute");
2908 }
2909 else
2910 {
2911 char buf[30]; /*Flawfinder: ignore*/
2912 snprintf(buf, sizeof(buf), "%d seconds", seconds); /* Flawfinder: ignore */
2913 suffix.append(buf);
2914 }
2915 suffix.append(" remaining)");
2916 }
2917 mList->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix);
2918 }
2919
2920 BOOL can_manage_banned = LLViewerParcelMgr::isParcelModifiableByAgent(parcel, GP_LAND_MANAGE_BANNED);
2921 mCheck->setEnabled( can_manage_banned );
2922 mCheckDenyAnonymous->setEnabled( FALSE );
2923 mCheckDenyIdentified->setEnabled( FALSE );
2924 mCheckDenyTransacted->setEnabled( FALSE );
2925
2926 if(parcel->getRegionDenyAnonymousOverride())
2927 {
2928 mCheckDenyAnonymous->set(TRUE);
2929 }
2930 else if(can_manage_banned)
2931 {
2932 mCheckDenyAnonymous->setEnabled(TRUE);
2933 mCheckDenyAnonymous->set(parcel->getParcelFlag(PF_DENY_ANONYMOUS));
2934 }
2935 if(parcel->getRegionDenyIdentifiedOverride())
2936 {
2937 mCheckDenyIdentified->set(TRUE);
2938 }
2939 else if(can_manage_banned)
2940 {
2941 mCheckDenyIdentified->setEnabled(TRUE);
2942 mCheckDenyIdentified->set(parcel->getParcelFlag(PF_DENY_IDENTIFIED));
2943 }
2944 if(parcel->getRegionDenyTransactedOverride())
2945 {
2946 mCheckDenyTransacted->set(TRUE);
2947 }
2948 else if(can_manage_banned)
2949 { 2930 {
2950 mCheckDenyTransacted->setEnabled(TRUE); 2931 parcel->addToAccessList(id, 0);
2951 mCheckDenyTransacted->set(parcel->getParcelFlag(PF_DENY_TRANSACTED)); 2932 gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS);
2933 panelp->refresh();
2952 } 2934 }
2953
2954
2955 BOOL enable_add = can_manage_banned && (count < PARCEL_MAX_ACCESS_LIST);
2956 mBtnAdd->setEnabled(enable_add);
2957
2958 BOOL enable_remove = can_manage_banned && (count > 0);
2959 mBtnRemove->setEnabled(enable_remove);
2960 }
2961 else
2962 {
2963 mCheck->set(FALSE);
2964 mCheck->setLabelArg( "[LISTED]", llformat("%d",0));
2965 mCheck->setEnabled(FALSE);
2966 mBtnAdd->setEnabled(FALSE);
2967 mBtnRemove->setEnabled(FALSE);
2968 mCheckDenyAnonymous->set(FALSE);
2969 mCheckDenyAnonymous->setEnabled(FALSE);
2970 mCheckDenyIdentified->set(FALSE);
2971 mCheckDenyIdentified->setEnabled(FALSE);
2972 mCheckDenyTransacted->set(FALSE);
2973 mCheckDenyTransacted->setEnabled(FALSE);
2974 } 2935 }
2975} 2936}
2976 2937
2977// static 2938// static
2978void LLPanelLandBan::onCommitAny(LLUICtrl *ctrl, void *userdata) 2939void LLPanelLandAccess::onClickRemoveAccess(void* data)
2979{ 2940{
2980 LLPanelLandBan *self = (LLPanelLandBan*)userdata; 2941 LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
2981 2942 if (panelp && panelp->mListAccess)
2982 LLParcel* parcel = self->mParcel->getParcel();
2983 if (!parcel)
2984 { 2943 {
2985 return; 2944 LLParcel* parcel = panelp->mParcel->getParcel();
2945 if (parcel)
2946 {
2947 std::vector<LLScrollListItem*> names = panelp->mListAccess->getAllSelected();
2948 for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
2949 iter != names.end(); )
2950 {
2951 LLScrollListItem* item = *iter++;
2952 const LLUUID& agent_id = item->getUUID();
2953 parcel->removeFromAccessList(agent_id);
2954 }
2955 gParcelMgr->sendParcelAccessListUpdate(AL_ACCESS);
2956 panelp->refresh();
2957 }
2986 } 2958 }
2987
2988 // Extract data from UI
2989 BOOL use_ban_list = self->mCheck->get();
2990 BOOL deny_access_anonymous = self->mCheckDenyAnonymous->get();
2991 BOOL deny_access_identified = self->mCheckDenyIdentified->get();
2992 BOOL deny_access_transacted = self->mCheckDenyTransacted->get();
2993
2994 // Push data into current parcel
2995 parcel->setParcelFlag(PF_USE_BAN_LIST, use_ban_list);
2996 parcel->setParcelFlag(PF_DENY_ANONYMOUS, deny_access_anonymous);
2997 parcel->setParcelFlag(PF_DENY_IDENTIFIED, deny_access_identified);
2998 parcel->setParcelFlag(PF_DENY_TRANSACTED, deny_access_transacted);
2999
3000 // Send current parcel data upstream to server
3001 gParcelMgr->sendParcelPropertiesUpdate( parcel );
3002
3003 // Might have changed properties, so let's redraw!
3004 self->refresh();
3005} 2959}
3006 2960
3007// static 2961// static
3008void LLPanelLandBan::onClickAdd(void* data) 2962void LLPanelLandAccess::onClickAddBanned(void* data)
3009{ 2963{
3010 LLPanelLandBan* panelp = (LLPanelLandBan*)data; 2964 LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
3011 gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarID, data) ); 2965 gFloaterView->getParentFloater(panelp)->addDependentFloater(LLFloaterAvatarPicker::show(callbackAvatarCBBanned, data) );
3012} 2966}
3013 2967
3014// static 2968// static
3015void LLPanelLandBan::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata) 2969void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata)
3016{ 2970{
3017 LLPanelLandBan* self = (LLPanelLandBan*)userdata; 2971 LLPanelLandAccess* panelp = (LLPanelLandAccess*)userdata;
3018 if (names.empty() || ids.empty()) return; 2972 if (!names.empty() && !ids.empty())
3019 self->addAvatar(ids[0]); 2973 {
3020} 2974 LLUUID id = ids[0];
3021 2975 LLParcel* parcel = panelp->mParcel->getParcel();
3022 2976 if (parcel)
3023void LLPanelLandBan::addAvatar(LLUUID id) 2977 {
3024{ 2978 parcel->addToBanList(id, 0);
3025 LLParcel* parcel = mParcel->getParcel(); 2979 gParcelMgr->sendParcelAccessListUpdate(AL_BAN);
3026 if (!parcel) return; 2980 panelp->refresh();
3027 2981 }
3028 parcel->addToBanList(id, 0); 2982 }
3029
3030 gParcelMgr->sendParcelAccessListUpdate(AL_BAN);
3031
3032 refresh();
3033} 2983}
3034 2984
3035
3036// static 2985// static
3037void LLPanelLandBan::onClickRemove(void* data) 2986void LLPanelLandAccess::onClickRemoveBanned(void* data)
3038{ 2987{
3039 LLPanelLandBan* self = (LLPanelLandBan*)data; 2988 LLPanelLandAccess* panelp = (LLPanelLandAccess*)data;
3040 if (!self) return; 2989 if (panelp && panelp->mListBanned)
3041 2990 {
3042 LLScrollListItem* item = self->mList->getFirstSelected(); 2991 LLParcel* parcel = panelp->mParcel->getParcel();
3043 if (!item) return; 2992 if (parcel)
3044 2993 {
3045 LLParcel* parcel = self->mParcel->getParcel(); 2994 std::vector<LLScrollListItem*> names = panelp->mListBanned->getAllSelected();
3046 if (!parcel) return; 2995 for (std::vector<LLScrollListItem*>::iterator iter = names.begin();
3047 2996 iter != names.end(); )
3048 const LLUUID& agent_id = item->getUUID(); 2997 {
3049 2998 LLScrollListItem* item = *iter++;
3050 parcel->removeFromBanList(agent_id); 2999 const LLUUID& agent_id = item->getUUID();
3051 3000 parcel->removeFromBanList(agent_id);
3052 gParcelMgr->sendParcelAccessListUpdate(AL_BAN); 3001 }
3053 3002 gParcelMgr->sendParcelAccessListUpdate(AL_BAN);
3054 self->refresh(); 3003 panelp->refresh();
3004 }
3005 }
3055} 3006}
3056 3007
3057//--------------------------------------------------------------------------- 3008//---------------------------------------------------------------------------
diff --git a/linden/indra/newview/llfloaterland.h b/linden/indra/newview/llfloaterland.h
index d8b7ecf..9be813f 100644
--- a/linden/indra/newview/llfloaterland.h
+++ b/linden/indra/newview/llfloaterland.h
@@ -112,7 +112,6 @@ protected:
112 LLPanelLandOptions* mPanelOptions; 112 LLPanelLandOptions* mPanelOptions;
113 LLPanelLandMedia* mPanelMedia; 113 LLPanelLandMedia* mPanelMedia;
114 LLPanelLandAccess* mPanelAccess; 114 LLPanelLandAccess* mPanelAccess;
115 LLPanelLandBan* mPanelBan;
116 LLPanelLandCovenant* mPanelCovenant; 115 LLPanelLandCovenant* mPanelCovenant;
117 116
118 LLHandle<LLParcelSelection> mParcel; 117 LLHandle<LLParcelSelection> mParcel;
@@ -392,93 +391,28 @@ public:
392 LLPanelLandAccess(LLHandle<LLParcelSelection>& parcelp); 391 LLPanelLandAccess(LLHandle<LLParcelSelection>& parcelp);
393 virtual ~LLPanelLandAccess(); 392 virtual ~LLPanelLandAccess();
394 void refresh(); 393 void refresh();
394 void refresh_ui();
395 void refreshNames(); 395 void refreshNames();
396 virtual void draw(); 396 virtual void draw();
397 397
398 void addAvatar(LLUUID id);
399
400 static void onCommitAny(LLUICtrl* ctrl, void *userdata); 398 static void onCommitAny(LLUICtrl* ctrl, void *userdata);
401 static void onClickAdd(void*); 399 static void onClickAddAccess(void*);
402 static void onClickRemove(void*); 400 static void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
403 static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata); 401 static void onClickRemoveAccess(void*);
404 static void onAccessLevelChange(LLUICtrl* ctrl, void* userdata); 402 static void onClickAddBanned(void*);
403 static void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
404 static void onClickRemoveBanned(void*);
405 405
406 virtual BOOL postBuild(); 406 virtual BOOL postBuild();
407 407
408protected: 408protected:
409 LLTextBox* mLabelTitle;
410
411 LLCheckBoxCtrl* mCheckGroup;
412
413 LLCheckBoxCtrl* mCheckAccess;
414 LLNameListCtrl* mListAccess; 409 LLNameListCtrl* mListAccess;
415 LLButton* mBtnAddAccess; 410 LLNameListCtrl* mListBanned;
416 LLButton* mBtnRemoveAccess;
417
418 LLCheckBoxCtrl* mCheckPass;
419 LLSpinCtrl* mSpinPrice;
420 LLSpinCtrl* mSpinHours;
421
422 LLCheckBoxCtrl* mCheckIdentified;
423 LLCheckBoxCtrl* mCheckTransacted;
424 LLRadioGroup* mCheckStatusLevel;
425 411
426 LLHandle<LLParcelSelection>& mParcel; 412 LLHandle<LLParcelSelection>& mParcel;
427}; 413};
428 414
429 415
430class LLPanelLandBan
431: public LLPanel
432{
433public:
434 LLPanelLandBan(LLHandle<LLParcelSelection>& parcelp);
435 virtual ~LLPanelLandBan();
436 void refresh();
437
438 void addAvatar(LLUUID id);
439
440 static void onCommitAny(LLUICtrl* ctrl, void *userdata);
441 static void onClickAdd(void*);
442 static void onClickRemove(void*);
443 static void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
444
445 virtual BOOL postBuild();
446
447protected:
448 LLTextBox* mLabelTitle;
449
450 LLCheckBoxCtrl* mCheck;
451 LLNameListCtrl* mList;
452 LLButton* mBtnAdd;
453 LLButton* mBtnRemove;
454 LLCheckBoxCtrl* mCheckDenyAnonymous;
455 LLCheckBoxCtrl* mCheckDenyIdentified;
456 LLCheckBoxCtrl* mCheckDenyTransacted;
457
458 LLHandle<LLParcelSelection>& mParcel;
459};
460
461
462class LLPanelLandRenters
463: public LLPanel
464{
465public:
466 LLPanelLandRenters(LLHandle<LLParcelSelection>& parcelp);
467 virtual ~LLPanelLandRenters();
468 void refresh();
469
470 static void onClickAdd(void*);
471 static void onClickRemove(void*);
472
473protected:
474 LLCheckBoxCtrl* mCheckRenters;
475 LLNameListCtrl* mListRenters;
476 LLButton* mBtnAddRenter;
477 LLButton* mBtnRemoveRenter;
478
479 LLHandle<LLParcelSelection>& mParcel;
480};
481
482class LLPanelLandCovenant 416class LLPanelLandCovenant
483: public LLPanel 417: public LLPanel
484{ 418{
diff --git a/linden/indra/newview/llfloatermap.cpp b/linden/indra/newview/llfloatermap.cpp
index a158000..ef628be 100644
--- a/linden/indra/newview/llfloatermap.cpp
+++ b/linden/indra/newview/llfloatermap.cpp
@@ -63,7 +63,7 @@
63#include "llviewerparceloverlay.h" 63#include "llviewerparceloverlay.h"
64#include "llviewerregion.h" 64#include "llviewerregion.h"
65#include "llviewerstats.h" 65#include "llviewerstats.h"
66#include "viewer.h" 66#include "llurlsimstring.h"
67 67
68#include "llglheaders.h" 68#include "llglheaders.h"
69 69
@@ -178,7 +178,7 @@ void LLFloaterMap::onClose(bool app_quitting)
178 178
179BOOL LLFloaterMap::canClose() 179BOOL LLFloaterMap::canClose()
180{ 180{
181 return !gQuit; 181 return !LLApp::isExiting();
182} 182}
183 183
184 184
diff --git a/linden/indra/newview/llfloaternewim.cpp b/linden/indra/newview/llfloaternewim.cpp
index b21ad31..bd7107d 100644
--- a/linden/indra/newview/llfloaternewim.cpp
+++ b/linden/indra/newview/llfloaternewim.cpp
@@ -53,7 +53,6 @@
53#include "lltextbox.h" 53#include "lltextbox.h"
54 54
55extern LLAudioEngine* gAudiop; 55extern LLAudioEngine* gAudiop;
56extern BOOL gInitializationComplete;
57S32 COL_1_WIDTH = 200; 56S32 COL_1_WIDTH = 200;
58 57
59static LLString sOnlineDescriptor = "*"; 58static LLString sOnlineDescriptor = "*";
diff --git a/linden/indra/newview/llfloaterparcel.cpp b/linden/indra/newview/llfloaterparcel.cpp
index a63987a..8cb91a0 100644
--- a/linden/indra/newview/llfloaterparcel.cpp
+++ b/linden/indra/newview/llfloaterparcel.cpp
@@ -42,7 +42,7 @@ class LLParcelHandler : public LLCommandHandler
42{ 42{
43public: 43public:
44 LLParcelHandler() : LLCommandHandler("parcel") { } 44 LLParcelHandler() : LLCommandHandler("parcel") { }
45 bool handle(const std::vector<std::string>& params) 45 bool handle(const LLSD& params, const LLSD& queryMap)
46 { 46 {
47 if (params.size() < 2) 47 if (params.size() < 2)
48 { 48 {
@@ -53,7 +53,7 @@ public:
53 { 53 {
54 return false; 54 return false;
55 } 55 }
56 if (params[1] == "about") 56 if (params[1].asString() == "about")
57 { 57 {
58 LLFloaterParcelInfo::show(parcel_id); 58 LLFloaterParcelInfo::show(parcel_id);
59 return true; 59 return true;
diff --git a/linden/indra/newview/llfloaterpostcard.cpp b/linden/indra/newview/llfloaterpostcard.cpp
index cab9d37..a00f512 100644
--- a/linden/indra/newview/llfloaterpostcard.cpp
+++ b/linden/indra/newview/llfloaterpostcard.cpp
@@ -60,7 +60,6 @@
60#include "llimagej2c.h" 60#include "llimagej2c.h"
61#include "llvfile.h" 61#include "llvfile.h"
62#include "llvfs.h" 62#include "llvfs.h"
63#include "viewer.h"
64 63
65#include "llassetuploadresponders.h" 64#include "llassetuploadresponders.h"
66 65
diff --git a/linden/indra/newview/llfloaterpreference.cpp b/linden/indra/newview/llfloaterpreference.cpp
index 100ae0c..25a88e6 100644
--- a/linden/indra/newview/llfloaterpreference.cpp
+++ b/linden/indra/newview/llfloaterpreference.cpp
@@ -47,13 +47,16 @@
47#include "llspinctrl.h" 47#include "llspinctrl.h"
48#include "message.h" 48#include "message.h"
49 49
50#include "llcommandhandler.h"
50#include "llfloaterabout.h" 51#include "llfloaterabout.h"
52#include "llfloaterpreference.h"
51#include "llpanelnetwork.h" 53#include "llpanelnetwork.h"
52#include "llpanelaudioprefs.h" 54#include "llpanelaudioprefs.h"
53#include "llpaneldisplay.h" 55#include "llpaneldisplay.h"
54#include "llpaneldebug.h" 56#include "llpaneldebug.h"
55#include "llpanelgeneral.h" 57#include "llpanelgeneral.h"
56#include "llpanelinput.h" 58#include "llpanelinput.h"
59#include "llpanellogin.h"
57#include "llpanelLCD.h" 60#include "llpanelLCD.h"
58#include "llpanelmsgs.h" 61#include "llpanelmsgs.h"
59#include "llpanelweb.h" 62#include "llpanelweb.h"
@@ -71,6 +74,13 @@
71#include "llkeyboard.h" 74#include "llkeyboard.h"
72#include "llscrollcontainer.h" 75#include "llscrollcontainer.h"
73 76
77#if LL_WINDOWS
78// for Logitech LCD keyboards / speakers
79#ifndef LL_LOGITECH_LCD_H
80#include "lllogitechlcd.h"
81#endif
82extern llLCD *gLcdScreen;
83#endif
74 84
75const S32 PREF_BORDER = 4; 85const S32 PREF_BORDER = 4;
76const S32 PREF_PAD = 5; 86const S32 PREF_PAD = 5;
@@ -81,13 +91,20 @@ const S32 PREF_FLOATER_MIN_HEIGHT = 2 * SCROLLBAR_SIZE + 2 * LLPANEL_BORDER_WIDT
81 91
82LLFloaterPreference* LLFloaterPreference::sInstance = NULL; 92LLFloaterPreference* LLFloaterPreference::sInstance = NULL;
83 93
84#if LL_WINDOWS 94
85// for Logitech LCD keyboards / speakers 95class LLPreferencesHandler : public LLCommandHandler
86#ifndef LL_LOGITECH_LCD_H 96{
87#include "lllogitechlcd.h" 97public:
88#endif 98 LLPreferencesHandler() : LLCommandHandler("preferences") { }
89extern llLCD *gLcdScreen; 99 bool handle(const LLSD& tokens, const LLSD& queryMap)
90#endif 100 {
101 LLFloaterPreference::show(NULL);
102 return true;
103 }
104};
105
106LLPreferencesHandler gPreferencesHandler;
107
91 108
92// Must be done at run time, not compile time. JC 109// Must be done at run time, not compile time. JC
93S32 pref_min_width() 110S32 pref_min_width()
@@ -410,6 +427,8 @@ void LLFloaterPreference::show(void*)
410 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); 427 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
411 gAgent.sendReliableMessage(); 428 gAgent.sendReliableMessage();
412 } 429 }
430
431 LLPanelLogin::setAlwaysRefresh(true);
413} 432}
414 433
415 434
@@ -423,6 +442,9 @@ void LLFloaterPreference::onClickAbout(void*)
423// static 442// static
424void LLFloaterPreference::onBtnOK( void* userdata ) 443void LLFloaterPreference::onBtnOK( void* userdata )
425{ 444{
445 //refresh splash page if we're displaying it
446 LLPanelLogin::loadLoginPage();
447
426 LLFloaterPreference *fp =(LLFloaterPreference *)userdata; 448 LLFloaterPreference *fp =(LLFloaterPreference *)userdata;
427 // commit any outstanding text entry 449 // commit any outstanding text entry
428 if (fp->hasFocus()) 450 if (fp->hasFocus())
@@ -466,6 +488,16 @@ void LLFloaterPreference::onBtnApply( void* userdata )
466 } 488 }
467 } 489 }
468 fp->apply(); 490 fp->apply();
491
492 //refresh splash page if we're displaying it
493 LLPanelLogin::loadLoginPage();
494}
495
496
497void LLFloaterPreference::onClose(bool app_quitting)
498{
499 LLPanelLogin::setAlwaysRefresh(false);
500 LLFloater::onClose(app_quitting);
469} 501}
470 502
471 503
diff --git a/linden/indra/newview/llfloaterpreference.h b/linden/indra/newview/llfloaterpreference.h
index a4c43fc..bf55476 100644
--- a/linden/indra/newview/llfloaterpreference.h
+++ b/linden/indra/newview/llfloaterpreference.h
@@ -117,6 +117,7 @@ protected:
117 LLPreferenceCore *mPreferenceCore; 117 LLPreferenceCore *mPreferenceCore;
118 118
119 /*virtual*/ void draw(); 119 /*virtual*/ void draw();
120 /*virtual*/ void onClose(bool app_quitting);
120 121
121 LLButton* mAboutBtn; 122 LLButton* mAboutBtn;
122 LLButton *mOKBtn; 123 LLButton *mOKBtn;
diff --git a/linden/indra/newview/llfloaterregioninfo.cpp b/linden/indra/newview/llfloaterregioninfo.cpp
index 20f3192..3306142 100644
--- a/linden/indra/newview/llfloaterregioninfo.cpp
+++ b/linden/indra/newview/llfloaterregioninfo.cpp
@@ -408,6 +408,15 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region)
408 region)); 408 region));
409} 409}
410 410
411// public
412void LLFloaterRegionInfo::refresh()
413{
414 for(info_panels_t::iterator iter = mInfoPanels.begin();
415 iter != mInfoPanels.end(); ++iter)
416 {
417 (*iter)->refresh();
418 }
419}
411 420
412 421
413///---------------------------------------------------------------------------- 422///----------------------------------------------------------------------------
@@ -447,6 +456,7 @@ void LLPanelRegionInfo::onChangeAnything(LLUICtrl* ctrl, void* user_data)
447 if(panel) 456 if(panel)
448 { 457 {
449 panel->enableButton("apply_btn"); 458 panel->enableButton("apply_btn");
459 panel->refresh();
450 } 460 }
451} 461}
452 462
@@ -455,6 +465,7 @@ BOOL LLPanelRegionInfo::postBuild()
455{ 465{
456 childSetAction("apply_btn", onBtnSet, this); 466 childSetAction("apply_btn", onBtnSet, this);
457 childDisable("apply_btn"); 467 childDisable("apply_btn");
468 refresh();
458 return TRUE; 469 return TRUE;
459} 470}
460 471
@@ -716,6 +727,8 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
716 body["allow_land_resell"] = childGetValue("allow_land_resell_check"); 727 body["allow_land_resell"] = childGetValue("allow_land_resell_check");
717 body["agent_limit"] = childGetValue("agent_limit_spin"); 728 body["agent_limit"] = childGetValue("agent_limit_spin");
718 body["prim_bonus"] = childGetValue("object_bonus_spin"); 729 body["prim_bonus"] = childGetValue("object_bonus_spin");
730 // the combo box stores strings "Mature" and "PG", but we have to convert back to a number,
731 // because the sim doesn't know from strings for this stuff
719 body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str()); 732 body["sim_access"] = LLViewerRegion::stringToAccess(childGetValue("access_combo").asString().c_str());
720 body["restrict_pushobject"] = childGetValue("restrict_pushobject"); 733 body["restrict_pushobject"] = childGetValue("restrict_pushobject");
721 body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check"); 734 body["allow_parcel_changes"] = childGetValue("allow_parcel_changes_check");
@@ -1907,6 +1920,7 @@ bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
1907 BOOL owner = (region && (region->getOwner() == gAgent.getID())); 1920 BOOL owner = (region && (region->getOwner() == gAgent.getID()));
1908 BOOL manager = (region && region->isEstateManager()); 1921 BOOL manager = (region && region->isEstateManager());
1909 setCtrlsEnabled(god || owner || manager); 1922 setCtrlsEnabled(god || owner || manager);
1923
1910 childDisable("apply_btn"); 1924 childDisable("apply_btn");
1911 childSetEnabled("add_allowed_avatar_btn", god || owner || manager); 1925 childSetEnabled("add_allowed_avatar_btn", god || owner || manager);
1912 childSetEnabled("remove_allowed_avatar_btn", god || owner || manager); 1926 childSetEnabled("remove_allowed_avatar_btn", god || owner || manager);
@@ -1942,8 +1956,7 @@ bool LLPanelEstateInfo::refreshFromRegion(LLViewerRegion* region)
1942 1956
1943 sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings); 1957 sendEstateOwnerMessage(gMessageSystem, "getinfo", invoice, strings);
1944 1958
1945 1959 refresh();
1946
1947 1960
1948 return rv; 1961 return rv;
1949} 1962}
@@ -1974,9 +1987,8 @@ BOOL LLPanelEstateInfo::postBuild()
1974 initCtrl("use_global_time_check"); 1987 initCtrl("use_global_time_check");
1975 initCtrl("fixed_sun_check"); 1988 initCtrl("fixed_sun_check");
1976 initCtrl("allow_direct_teleport"); 1989 initCtrl("allow_direct_teleport");
1977 initCtrl("deny_anonymous"); 1990 initCtrl("limit_payment");
1978 initCtrl("deny_identified"); 1991 initCtrl("limit_age_verified");
1979 initCtrl("deny_transacted");
1980 initCtrl("voice_chat_check"); 1992 initCtrl("voice_chat_check");
1981 1993
1982 initHelpBtn("estate_manager_help", "HelpEstateEstateManager"); 1994 initHelpBtn("estate_manager_help", "HelpEstateEstateManager");
@@ -2043,6 +2055,19 @@ BOOL LLPanelEstateInfo::postBuild()
2043 return LLPanelRegionInfo::postBuild(); 2055 return LLPanelRegionInfo::postBuild();
2044} 2056}
2045 2057
2058void LLPanelEstateInfo::refresh()
2059{
2060 bool public_access = childGetValue("externally_visible_check").asBoolean();
2061 childSetEnabled("Only Allow", public_access);
2062 childSetEnabled("limit_payment", public_access);
2063 childSetEnabled("limit_age_verified", public_access);
2064 // if this is set to false, then the limit fields are meaningless and should be turned off
2065 if (public_access == false)
2066 {
2067 childSetValue("limit_payment", false);
2068 childSetValue("limit_age_verified", false);
2069 }
2070}
2046 2071
2047BOOL LLPanelEstateInfo::sendUpdate() 2072BOOL LLPanelEstateInfo::sendUpdate()
2048{ 2073{
@@ -2157,10 +2182,11 @@ void LLPanelEstateInfo::setEstateFlags(U32 flags)
2157 "voice_chat_check", 2182 "voice_chat_check",
2158 LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE)); 2183 LLSD(flags & REGION_FLAGS_ALLOW_VOICE ? TRUE : FALSE));
2159 childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) ); 2184 childSetValue("allow_direct_teleport", LLSD(flags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT ? TRUE : FALSE) );
2160 childSetValue("deny_anonymous", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) ); 2185 childSetValue("limit_payment", LLSD(flags & REGION_FLAGS_DENY_ANONYMOUS ? TRUE : FALSE) );
2161 childSetValue("deny_identified", LLSD(flags & REGION_FLAGS_DENY_IDENTIFIED ? TRUE : FALSE) ); 2186 childSetValue("limit_age_verified", LLSD(flags & REGION_FLAGS_DENY_AGEUNVERIFIED ? TRUE : FALSE) );
2162 childSetValue("deny_transacted", LLSD(flags & REGION_FLAGS_DENY_TRANSACTED ? TRUE : FALSE) );
2163 childSetVisible("abuse_email_text", flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER); 2187 childSetVisible("abuse_email_text", flags & REGION_FLAGS_ABUSE_EMAIL_TO_ESTATE_OWNER);
2188
2189 refresh();
2164} 2190}
2165 2191
2166U32 LLPanelEstateInfo::computeEstateFlags() 2192U32 LLPanelEstateInfo::computeEstateFlags()
@@ -2187,20 +2213,16 @@ U32 LLPanelEstateInfo::computeEstateFlags()
2187 flags |= REGION_FLAGS_SUN_FIXED; 2213 flags |= REGION_FLAGS_SUN_FIXED;
2188 } 2214 }
2189 2215
2190 if (childGetValue("deny_anonymous").asBoolean()) 2216 if (childGetValue("limit_payment").asBoolean())
2191 { 2217 {
2192 flags |= REGION_FLAGS_DENY_ANONYMOUS; 2218 flags |= REGION_FLAGS_DENY_ANONYMOUS;
2193 } 2219 }
2194 2220
2195 if (childGetValue("deny_identified").asBoolean()) 2221 if (childGetValue("limit_age_verified").asBoolean())
2196 { 2222 {
2197 flags |= REGION_FLAGS_DENY_IDENTIFIED; 2223 flags |= REGION_FLAGS_DENY_AGEUNVERIFIED;
2198 } 2224 }
2199 2225
2200 if (childGetValue("deny_transacted").asBoolean())
2201 {
2202 flags |= REGION_FLAGS_DENY_TRANSACTED;
2203 }
2204 2226
2205 return flags; 2227 return flags;
2206} 2228}
diff --git a/linden/indra/newview/llfloaterregioninfo.h b/linden/indra/newview/llfloaterregioninfo.h
index 656583b..abf4789 100644
--- a/linden/indra/newview/llfloaterregioninfo.h
+++ b/linden/indra/newview/llfloaterregioninfo.h
@@ -79,6 +79,9 @@ public:
79 static LLPanelEstateInfo* getPanelEstate(); 79 static LLPanelEstateInfo* getPanelEstate();
80 static LLPanelEstateCovenant* getPanelCovenant(); 80 static LLPanelEstateCovenant* getPanelCovenant();
81 81
82 // from LLPanel
83 virtual void refresh();
84
82protected: 85protected:
83 LLFloaterRegionInfo(const LLRect& rect); 86 LLFloaterRegionInfo(const LLRect& rect);
84 void refreshFromRegion(LLViewerRegion* region); 87 void refreshFromRegion(LLViewerRegion* region);
@@ -294,6 +297,7 @@ public:
294 // LLPanel 297 // LLPanel
295 virtual BOOL postBuild(); 298 virtual BOOL postBuild();
296 virtual void updateChild(LLUICtrl* child_ctrl); 299 virtual void updateChild(LLUICtrl* child_ctrl);
300 virtual void refresh();
297 301
298 U32 computeEstateFlags(); 302 U32 computeEstateFlags();
299 void setEstateFlags(U32 flags); 303 void setEstateFlags(U32 flags);
diff --git a/linden/indra/newview/llfloaterreleasemsg.cpp b/linden/indra/newview/llfloaterreleasemsg.cpp
index 87ff436..bb5bbd5 100644
--- a/linden/indra/newview/llfloaterreleasemsg.cpp
+++ b/linden/indra/newview/llfloaterreleasemsg.cpp
@@ -37,9 +37,10 @@
37#include "llfloaterreleasemsg.h" 37#include "llfloaterreleasemsg.h"
38#include "llagent.h" 38#include "llagent.h"
39#include "llviewerregion.h" 39#include "llviewerregion.h"
40#include "llappviewer.h"
40 41
41extern LLAgent gAgent; 42extern LLAgent gAgent;
42extern LLString gLastVersionChannel; 43
43 44
44LLFloaterReleaseMsg* LLFloaterReleaseMsg::sInstance = 0; 45LLFloaterReleaseMsg* LLFloaterReleaseMsg::sInstance = 0;
45 46
diff --git a/linden/indra/newview/llfloaterreporter.cpp b/linden/indra/newview/llfloaterreporter.cpp
index a7cd211..bd5438e 100644
--- a/linden/indra/newview/llfloaterreporter.cpp
+++ b/linden/indra/newview/llfloaterreporter.cpp
@@ -81,7 +81,7 @@
81#include "llselectmgr.h" 81#include "llselectmgr.h"
82#include "llviewerbuild.h" 82#include "llviewerbuild.h"
83#include "llvieweruictrlfactory.h" 83#include "llvieweruictrlfactory.h"
84#include "viewer.h" 84#include "llappviewer.h"
85 85
86#include "llassetuploadresponders.h" 86#include "llassetuploadresponders.h"
87 87
diff --git a/linden/indra/newview/llfloatersnapshot.cpp b/linden/indra/newview/llfloatersnapshot.cpp
index 3bc172c..71e94cc 100644
--- a/linden/indra/newview/llfloatersnapshot.cpp
+++ b/linden/indra/newview/llfloatersnapshot.cpp
@@ -51,7 +51,6 @@
51#include "llsliderctrl.h" 51#include "llsliderctrl.h"
52#include "llspinctrl.h" 52#include "llspinctrl.h"
53#include "llviewercontrol.h" 53#include "llviewercontrol.h"
54#include "viewer.h"
55#include "llvieweruictrlfactory.h" 54#include "llvieweruictrlfactory.h"
56#include "llviewerstats.h" 55#include "llviewerstats.h"
57#include "llviewercamera.h" 56#include "llviewercamera.h"
diff --git a/linden/indra/newview/llfloatertest.cpp b/linden/indra/newview/llfloatertest.cpp
index 5af34a8..2716306 100644
--- a/linden/indra/newview/llfloatertest.cpp
+++ b/linden/indra/newview/llfloatertest.cpp
@@ -147,7 +147,7 @@ LLFloaterTestImpl::LLFloaterTestImpl()
147 "monospaced, non-opaque text with tooltip, non-opaque non-opaque", 147 "monospaced, non-opaque text with tooltip, non-opaque non-opaque",
148 LLFontGL::sMonospace, 148 LLFontGL::sMonospace,
149 FALSE); // mouse_opaque 149 FALSE); // mouse_opaque
150 text->setToolTip("I'm a tooltip"); 150 text->setToolTip(LLString("I'm a tooltip"));
151 addChild(text); 151 addChild(text);
152 152
153 y -= VPAD + LINE; 153 y -= VPAD + LINE;
@@ -178,7 +178,7 @@ LLFloaterTestImpl::LLFloaterTestImpl()
178 LLString("File"), 178 LLString("File"),
179 LLFontGL::sSansSerif, 179 LLFontGL::sSansSerif,
180 TRUE); // mouse_opaque 180 TRUE); // mouse_opaque
181 text->setToolTip("This should be Unicode text"); 181 text->setToolTip(LLString("This should be Unicode text"));
182 panel->addChild(text); 182 panel->addChild(text);
183 183
184 y -= VPAD + LINE; 184 y -= VPAD + LINE;
diff --git a/linden/indra/newview/llfloatertools.cpp b/linden/indra/newview/llfloatertools.cpp
index 4f8ed08..22581c6 100644
--- a/linden/indra/newview/llfloatertools.cpp
+++ b/linden/indra/newview/llfloatertools.cpp
@@ -76,7 +76,6 @@
76#include "llviewerparcelmgr.h" 76#include "llviewerparcelmgr.h"
77#include "llviewerwindow.h" 77#include "llviewerwindow.h"
78#include "llviewercontrol.h" 78#include "llviewercontrol.h"
79#include "viewer.h"
80 79
81#include "llvieweruictrlfactory.h" 80#include "llvieweruictrlfactory.h"
82 81
@@ -752,7 +751,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
752BOOL LLFloaterTools::canClose() 751BOOL LLFloaterTools::canClose()
753{ 752{
754 // don't close when quitting, so camera will stay put 753 // don't close when quitting, so camera will stay put
755 return !gQuit; 754 return !LLApp::isExiting();
756} 755}
757 756
758// virtual 757// virtual
diff --git a/linden/indra/newview/llfloatertos.cpp b/linden/indra/newview/llfloatertos.cpp
index 9e86c92..20f9e1e 100644
--- a/linden/indra/newview/llfloatertos.cpp
+++ b/linden/indra/newview/llfloatertos.cpp
@@ -38,7 +38,7 @@
38#include "llvfile.h" 38#include "llvfile.h"
39#include "lltextbox.h" 39#include "lltextbox.h"
40#include "llviewertexteditor.h" 40#include "llviewertexteditor.h"
41#include "viewer.h" 41#include "llappviewer.h"
42#include "llstartup.h" 42#include "llstartup.h"
43#include "message.h" 43#include "message.h"
44#include "llagent.h" 44#include "llagent.h"
diff --git a/linden/indra/newview/llfloaterworldmap.cpp b/linden/indra/newview/llfloaterworldmap.cpp
index b411bb2..53b43ef 100644
--- a/linden/indra/newview/llfloaterworldmap.cpp
+++ b/linden/indra/newview/llfloaterworldmap.cpp
@@ -84,7 +84,7 @@
84#include "llworldmapview.h" 84#include "llworldmapview.h"
85#include "llurl.h" 85#include "llurl.h"
86#include "llvieweruictrlfactory.h" 86#include "llvieweruictrlfactory.h"
87#include "viewer.h" 87#include "llappviewer.h"
88#include "llmapimagetype.h" 88#include "llmapimagetype.h"
89#include "llweb.h" 89#include "llweb.h"
90 90
diff --git a/linden/indra/newview/llfolderview.cpp b/linden/indra/newview/llfolderview.cpp
index c6a2710..eb9addc 100644
--- a/linden/indra/newview/llfolderview.cpp
+++ b/linden/indra/newview/llfolderview.cpp
@@ -66,7 +66,7 @@
66// We need these because some of the code below relies on things like 66// We need these because some of the code below relies on things like
67// gAgent root folder. Remove them once the abstraction leak is fixed. 67// gAgent root folder. Remove them once the abstraction leak is fixed.
68#include "llagent.h" 68#include "llagent.h"
69#include "viewer.h" 69#include "llappviewer.h"
70 70
71///---------------------------------------------------------------------------- 71///----------------------------------------------------------------------------
72/// Local function declarations, constants, enums, and typedefs 72/// Local function declarations, constants, enums, and typedefs
diff --git a/linden/indra/newview/llframestatview.cpp b/linden/indra/newview/llframestatview.cpp
index aa6c609..1111e18 100644
--- a/linden/indra/newview/llframestatview.cpp
+++ b/linden/indra/newview/llframestatview.cpp
@@ -40,7 +40,6 @@
40#include "llmath.h" 40#include "llmath.h"
41#include "llfontgl.h" 41#include "llfontgl.h"
42 42
43#include "viewer.h"
44#include "llui.h" 43#include "llui.h"
45#include "llviewercontrol.h" 44#include "llviewercontrol.h"
46#include "llstat.h" 45#include "llstat.h"
diff --git a/linden/indra/newview/llgesturemgr.cpp b/linden/indra/newview/llgesturemgr.cpp
index 3e17ecf..537cadf 100644
--- a/linden/indra/newview/llgesturemgr.cpp
+++ b/linden/indra/newview/llgesturemgr.cpp
@@ -55,7 +55,6 @@
55#include "llviewermessage.h" 55#include "llviewermessage.h"
56#include "llvoavatar.h" 56#include "llvoavatar.h"
57#include "llviewerstats.h" 57#include "llviewerstats.h"
58#include "viewer.h"
59 58
60LLGestureManager gGestureManager; 59LLGestureManager gGestureManager;
61 60
diff --git a/linden/indra/newview/llglsandbox.cpp b/linden/indra/newview/llglsandbox.cpp
index da3f7aa..ba56d70 100644
--- a/linden/indra/newview/llglsandbox.cpp
+++ b/linden/indra/newview/llglsandbox.cpp
@@ -56,7 +56,6 @@
56#include "llviewerobjectlist.h" 56#include "llviewerobjectlist.h"
57#include "lltoolselectrect.h" 57#include "lltoolselectrect.h"
58#include "llviewerwindow.h" 58#include "llviewerwindow.h"
59#include "viewer.h"
60#include "llcompass.h" 59#include "llcompass.h"
61#include "llsurface.h" 60#include "llsurface.h"
62#include "llwind.h" 61#include "llwind.h"
diff --git a/linden/indra/newview/llgroupmgr.cpp b/linden/indra/newview/llgroupmgr.cpp
index d1116b6..c213d26 100644
--- a/linden/indra/newview/llgroupmgr.cpp
+++ b/linden/indra/newview/llgroupmgr.cpp
@@ -47,7 +47,6 @@
47#include "roles_constants.h" 47#include "roles_constants.h"
48#include "lltransactiontypes.h" 48#include "lltransactiontypes.h"
49#include "llstatusbar.h" 49#include "llstatusbar.h"
50#include "viewer.h"
51#include "lleconomy.h" 50#include "lleconomy.h"
52#include "llviewerwindow.h" 51#include "llviewerwindow.h"
53#include "llfloaterdirectory.h" 52#include "llfloaterdirectory.h"
@@ -806,8 +805,7 @@ void LLGroupMgr::processGroupMembersReply(LLMessageSystem* msg, void** data)
806 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 805 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
807 if (gAgent.getID() != agent_id) 806 if (gAgent.getID() != agent_id)
808 { 807 {
809 llwarns << "Got group properties reply for another agent!" 808 llwarns << "Got group properties reply for another agent!" << llendl;
810 << " Probably a userserver bug!" << llendl;
811 return; 809 return;
812 } 810 }
813 811
@@ -895,8 +893,7 @@ void LLGroupMgr::processGroupPropertiesReply(LLMessageSystem* msg, void** data)
895 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 893 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
896 if (gAgent.getID() != agent_id) 894 if (gAgent.getID() != agent_id)
897 { 895 {
898 llwarns << "Got group properties reply for another agent!" 896 llwarns << "Got group properties reply for another agent!" << llendl;
899 << " Probably a userserver bug!" << llendl;
900 return; 897 return;
901 } 898 }
902 899
@@ -963,8 +960,7 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
963 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 960 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
964 if (gAgent.getID() != agent_id) 961 if (gAgent.getID() != agent_id)
965 { 962 {
966 llwarns << "Got group properties reply for another agent!" 963 llwarns << "Got group properties reply for another agent!" << llendl;
967 << " Probably a userserver bug!" << llendl;
968 return; 964 return;
969 } 965 }
970 966
@@ -1031,8 +1027,7 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
1031 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 1027 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
1032 if (gAgent.getID() != agent_id) 1028 if (gAgent.getID() != agent_id)
1033 { 1029 {
1034 llwarns << "Got group properties reply for another agent!" 1030 llwarns << "Got group properties reply for another agent!" << llendl;
1035 << " Probably a userserver bug!" << llendl;
1036 return; 1031 return;
1037 } 1032 }
1038 1033
@@ -1142,8 +1137,7 @@ void LLGroupMgr::processGroupTitlesReply(LLMessageSystem* msg, void** data)
1142 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 1137 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
1143 if (gAgent.getID() != agent_id) 1138 if (gAgent.getID() != agent_id)
1144 { 1139 {
1145 llwarns << "Got group properties reply for another agent!" 1140 llwarns << "Got group properties reply for another agent!" << llendl;
1146 << " Probably a userserver bug!" << llendl;
1147 return; 1141 return;
1148 } 1142 }
1149 1143
diff --git a/linden/indra/newview/llgroupnotify.cpp b/linden/indra/newview/llgroupnotify.cpp
index 8a88165..6947aae 100644
--- a/linden/indra/newview/llgroupnotify.cpp
+++ b/linden/indra/newview/llgroupnotify.cpp
@@ -285,7 +285,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
285 onClickNext, 285 onClickNext,
286 this, 286 this,
287 LLFontGL::sSansSerif); 287 LLFontGL::sSansSerif);
288 btn->setToolTip("Next"); 288 btn->setToolTip(LLString("Next")); // *TODO: Translate
289 addChild(btn); 289 addChild(btn);
290 mNextBtn = btn; 290 mNextBtn = btn;
291 291
@@ -312,7 +312,7 @@ LLGroupNotifyBox::LLGroupNotifyBox(const char* subject,
312 BTN_HEIGHT); 312 BTN_HEIGHT);
313 313
314 btn = new LLButton("Group Notices", btn_rect, "", onClickGroupInfo, this); 314 btn = new LLButton("Group Notices", btn_rect, "", onClickGroupInfo, this);
315 btn->setToolTip("View past notices or opt-out of receiving these messages here."); 315 btn->setToolTip(LLString("View past notices or opt-out of receiving these messages here.")); // TODO: Translate
316 addChild(btn, -1); 316 addChild(btn, -1);
317 317
318 if (mHasInventory && mInventoryOffer) 318 if (mHasInventory && mInventoryOffer)
diff --git a/linden/indra/newview/llhudtext.cpp b/linden/indra/newview/llhudtext.cpp
index 1ebe813..1d68441 100644
--- a/linden/indra/newview/llhudtext.cpp
+++ b/linden/indra/newview/llhudtext.cpp
@@ -48,7 +48,6 @@
48#include "llviewerobject.h" 48#include "llviewerobject.h"
49#include "llvovolume.h" 49#include "llvovolume.h"
50#include "llviewerwindow.h" 50#include "llviewerwindow.h"
51#include "viewer.h"
52#include "llstatusbar.h" 51#include "llstatusbar.h"
53#include "llmenugl.h" 52#include "llmenugl.h"
54#include "pipeline.h" 53#include "pipeline.h"
diff --git a/linden/indra/newview/llimpanel.cpp b/linden/indra/newview/llimpanel.cpp
index b259b80..810d3a2 100644
--- a/linden/indra/newview/llimpanel.cpp
+++ b/linden/indra/newview/llimpanel.cpp
@@ -61,7 +61,7 @@
61#include "llviewertexteditor.h" 61#include "llviewertexteditor.h"
62#include "llviewermessage.h" 62#include "llviewermessage.h"
63#include "llviewerstats.h" 63#include "llviewerstats.h"
64#include "viewer.h" 64#include "llviewercontrol.h"
65#include "llvieweruictrlfactory.h" 65#include "llvieweruictrlfactory.h"
66#include "lllogchat.h" 66#include "lllogchat.h"
67#include "llfloaterhtml.h" 67#include "llfloaterhtml.h"
diff --git a/linden/indra/newview/llimview.cpp b/linden/indra/newview/llimview.cpp
index a6e2a13..9c37f1f 100644
--- a/linden/indra/newview/llimview.cpp
+++ b/linden/indra/newview/llimview.cpp
@@ -55,7 +55,7 @@
55#include "llimpanel.h" 55#include "llimpanel.h"
56#include "llresizebar.h" 56#include "llresizebar.h"
57#include "lltabcontainer.h" 57#include "lltabcontainer.h"
58#include "viewer.h" 58#include "llviewercontrol.h"
59#include "llfloater.h" 59#include "llfloater.h"
60#include "llmutelist.h" 60#include "llmutelist.h"
61#include "llresizehandle.h" 61#include "llresizehandle.h"
diff --git a/linden/indra/newview/llinventoryactions.cpp b/linden/indra/newview/llinventoryactions.cpp
index fba3ace..9adb3b9 100644
--- a/linden/indra/newview/llinventoryactions.cpp
+++ b/linden/indra/newview/llinventoryactions.cpp
@@ -78,7 +78,6 @@
78#include "llviewerwindow.h" 78#include "llviewerwindow.h"
79#include "llwearable.h" 79#include "llwearable.h"
80#include "llwearablelist.h" 80#include "llwearablelist.h"
81#include "viewer.h"
82#include "llviewermessage.h" 81#include "llviewermessage.h"
83#include "llviewerregion.h" 82#include "llviewerregion.h"
84#include "lltabcontainer.h" 83#include "lltabcontainer.h"
diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp
index f777e09..12617ef 100644
--- a/linden/indra/newview/llinventorybridge.cpp
+++ b/linden/indra/newview/llinventorybridge.cpp
@@ -78,7 +78,6 @@
78#include "llviewerwindow.h" 78#include "llviewerwindow.h"
79#include "llwearable.h" 79#include "llwearable.h"
80#include "llwearablelist.h" 80#include "llwearablelist.h"
81#include "viewer.h"
82#include "llviewermessage.h" 81#include "llviewermessage.h"
83#include "llviewerregion.h" 82#include "llviewerregion.h"
84#include "lltabcontainer.h" 83#include "lltabcontainer.h"
diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h
index 8c2eb2b..c61fa7f 100644
--- a/linden/indra/newview/llinventorybridge.h
+++ b/linden/indra/newview/llinventorybridge.h
@@ -383,6 +383,7 @@ class LLLandmarkBridge : public LLItemBridge
383{ 383{
384 friend class LLInvFVBridge; 384 friend class LLInvFVBridge;
385public: 385public:
386 static const LLString& prefix() { return sPrefix; }
386 virtual const LLString& getPrefix() { return sPrefix; } 387 virtual const LLString& getPrefix() { return sPrefix; }
387 virtual void performAction(LLFolderView* folder, LLInventoryModel* model, LLString action); 388 virtual void performAction(LLFolderView* folder, LLInventoryModel* model, LLString action);
388 virtual void buildContextMenu(LLMenuGL& menu, U32 flags); 389 virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
diff --git a/linden/indra/newview/llinventorymodel.cpp b/linden/indra/newview/llinventorymodel.cpp
index 4e54e78..ca65b87 100644
--- a/linden/indra/newview/llinventorymodel.cpp
+++ b/linden/indra/newview/llinventorymodel.cpp
@@ -47,7 +47,7 @@
47#include "llviewerinventory.h" 47#include "llviewerinventory.h"
48#include "llviewermessage.h" 48#include "llviewermessage.h"
49#include "llviewerwindow.h" 49#include "llviewerwindow.h"
50#include "viewer.h" 50#include "llappviewer.h"
51#include "lldbstrings.h" 51#include "lldbstrings.h"
52#include "llviewerstats.h" 52#include "llviewerstats.h"
53#include "llmutelist.h" 53#include "llmutelist.h"
diff --git a/linden/indra/newview/llinventoryview.cpp b/linden/indra/newview/llinventoryview.cpp
index 2ac46ab..96d947f 100644
--- a/linden/indra/newview/llinventoryview.cpp
+++ b/linden/indra/newview/llinventoryview.cpp
@@ -75,7 +75,7 @@
75#include "llviewerobjectlist.h" 75#include "llviewerobjectlist.h"
76#include "llviewerwindow.h" 76#include "llviewerwindow.h"
77#include "llwearablelist.h" 77#include "llwearablelist.h"
78#include "viewer.h" 78#include "llappviewer.h"
79#include "llviewermessage.h" 79#include "llviewermessage.h"
80#include "llviewerregion.h" 80#include "llviewerregion.h"
81#include "lltabcontainer.h" 81#include "lltabcontainer.h"
diff --git a/linden/indra/newview/lllcd.cpp b/linden/indra/newview/lllcd.cpp
index f6fec7d..f980ee4 100644
--- a/linden/indra/newview/lllcd.cpp
+++ b/linden/indra/newview/lllcd.cpp
@@ -31,11 +31,14 @@
31 31
32 32
33#include "llviewerprecompiledheaders.h" 33#include "llviewerprecompiledheaders.h"
34#include "lllcd.h"
35
34#include "llcontrol.h" 36#include "llcontrol.h"
35#include "llstatusbar.h" 37#include "llstatusbar.h"
36#include "llviewerregion.h" 38#include "llviewerregion.h"
37#include "llviewerstats.h" 39#include "llviewerstats.h"
38#include "llvieweruictrlfactory.h" 40#include "llvieweruictrlfactory.h"
41#include "llviewercontrol.h"
39 42
40#if LL_LCD_COMPILE 43#if LL_LCD_COMPILE
41 44
@@ -47,7 +50,8 @@ extern LLControlGroup gSavedSettings;
47// for Logitech LCD keyboards / speakers 50// for Logitech LCD keyboards / speakers
48#include "EZ_LCD.h" 51#include "EZ_LCD.h"
49#include "lllogitechlcd.h" 52#include "lllogitechlcd.h"
50#include "lllcd.h" 53
54llLCD *gLcdScreen = NULL; // Singleton-ish?
51 55
52// not happy about this, but there's no local class to put it in. 56// not happy about this, but there's no local class to put it in.
53LLPanel *bogus = NULL; 57LLPanel *bogus = NULL;
diff --git a/linden/indra/newview/lllcd.h b/linden/indra/newview/lllcd.h
index e6583c7..ae21da3 100644
--- a/linden/indra/newview/lllcd.h
+++ b/linden/indra/newview/lllcd.h
@@ -105,6 +105,9 @@ public:
105}; 105};
106 106
107class llLCD; 107class llLCD;
108
109// The following symbols are exported from lllcd.cpp
108extern llLCD *gLcdScreen; 110extern llLCD *gLcdScreen;
111extern void CreateLCDDebugWindows();
109 112
110//#endif 113//#endif
diff --git a/linden/indra/newview/lllogchat.cpp b/linden/indra/newview/lllogchat.cpp
index 8620446..d89ec79 100644
--- a/linden/indra/newview/lllogchat.cpp
+++ b/linden/indra/newview/lllogchat.cpp
@@ -32,7 +32,7 @@
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34#include "lllogchat.h" 34#include "lllogchat.h"
35#include "viewer.h" 35#include "llappviewer.h"
36 36
37const S32 LOG_RECALL_SIZE = 2048; 37const S32 LOG_RECALL_SIZE = 2048;
38 38
diff --git a/linden/indra/newview/llmanip.cpp b/linden/indra/newview/llmanip.cpp
index 953befc..44b919a 100644
--- a/linden/indra/newview/llmanip.cpp
+++ b/linden/indra/newview/llmanip.cpp
@@ -55,7 +55,6 @@
55#include "llvoavatar.h" 55#include "llvoavatar.h"
56#include "llworld.h" // for gWorldPointer 56#include "llworld.h" // for gWorldPointer
57#include "llresmgr.h" 57#include "llresmgr.h"
58#include "viewer.h" // for gFPS
59#include "pipeline.h" 58#include "pipeline.h"
60#include "llglheaders.h" 59#include "llglheaders.h"
61 60
diff --git a/linden/indra/newview/llmaniprotate.cpp b/linden/indra/newview/llmaniprotate.cpp
index fb3de3a..2e4f66c 100644
--- a/linden/indra/newview/llmaniprotate.cpp
+++ b/linden/indra/newview/llmaniprotate.cpp
@@ -60,7 +60,6 @@
60#include "llviewerwindow.h" 60#include "llviewerwindow.h"
61#include "llworld.h" 61#include "llworld.h"
62#include "pipeline.h" 62#include "pipeline.h"
63#include "viewer.h"
64#include "lldrawable.h" 63#include "lldrawable.h"
65#include "llglheaders.h" 64#include "llglheaders.h"
66 65
@@ -513,8 +512,6 @@ LLVector3 LLManipRotate::projectToSphere( F32 x, F32 y, BOOL* on_sphere )
513 return LLVector3( x, y, z ); 512 return LLVector3( x, y, z );
514} 513}
515 514
516extern U32 gFrameCount;
517
518// Freeform rotation 515// Freeform rotation
519void LLManipRotate::drag( S32 x, S32 y ) 516void LLManipRotate::drag( S32 x, S32 y )
520{ 517{
diff --git a/linden/indra/newview/llmaniptranslate.cpp b/linden/indra/newview/llmaniptranslate.cpp
index 1963b1a..36e3f9a 100644
--- a/linden/indra/newview/llmaniptranslate.cpp
+++ b/linden/indra/newview/llmaniptranslate.cpp
@@ -61,7 +61,6 @@
61#include "llviewerwindow.h" 61#include "llviewerwindow.h"
62#include "llvoavatar.h" 62#include "llvoavatar.h"
63#include "llworld.h" 63#include "llworld.h"
64#include "viewer.h"
65#include "llui.h" 64#include "llui.h"
66#include "pipeline.h" 65#include "pipeline.h"
67 66
diff --git a/linden/indra/newview/llmemoryview.cpp b/linden/indra/newview/llmemoryview.cpp
index 53582ac..a698c53 100644
--- a/linden/indra/newview/llmemoryview.cpp
+++ b/linden/indra/newview/llmemoryview.cpp
@@ -41,7 +41,6 @@
41#include "llfontgl.h" 41#include "llfontgl.h"
42#include "llmemtype.h" 42#include "llmemtype.h"
43 43
44#include "viewer.h"
45#include "llui.h" 44#include "llui.h"
46#include "llviewercontrol.h" 45#include "llviewercontrol.h"
47#include "llstat.h" 46#include "llstat.h"
diff --git a/linden/indra/newview/llmenucommands.cpp b/linden/indra/newview/llmenucommands.cpp
index 92c7832..68bbe53 100644
--- a/linden/indra/newview/llmenucommands.cpp
+++ b/linden/indra/newview/llmenucommands.cpp
@@ -67,7 +67,6 @@
67#include "llviewerwindow.h" 67#include "llviewerwindow.h"
68#include "llworld.h" 68#include "llworld.h"
69#include "llworldmap.h" 69#include "llworldmap.h"
70#include "viewer.h"
71#include "llfocusmgr.h" 70#include "llfocusmgr.h"
72 71
73void handle_track_avatar(const LLUUID& agent_id, const std::string& name) 72void handle_track_avatar(const LLUUID& agent_id, const std::string& name)
diff --git a/linden/indra/newview/llmorphview.cpp b/linden/indra/newview/llmorphview.cpp
index d69968d..81e6774 100644
--- a/linden/indra/newview/llmorphview.cpp
+++ b/linden/indra/newview/llmorphview.cpp
@@ -49,7 +49,6 @@
49#include "llvoavatar.h" 49#include "llvoavatar.h"
50#include "llviewerwindow.h" 50#include "llviewerwindow.h"
51#include "pipeline.h" 51#include "pipeline.h"
52#include "viewer.h"
53 52
54LLMorphView *gMorphView = NULL; 53LLMorphView *gMorphView = NULL;
55 54
diff --git a/linden/indra/newview/llmoveview.cpp b/linden/indra/newview/llmoveview.cpp
index e115f10..4f1d7bb 100644
--- a/linden/indra/newview/llmoveview.cpp
+++ b/linden/indra/newview/llmoveview.cpp
@@ -39,7 +39,7 @@
39// Viewer includes 39// Viewer includes
40#include "llagent.h" 40#include "llagent.h"
41#include "llcallbacklist.h" 41#include "llcallbacklist.h"
42#include "viewer.h" 42#include "llviewercontrol.h"
43#include "llfontgl.h" 43#include "llfontgl.h"
44#include "llbutton.h" 44#include "llbutton.h"
45#include "llviewerwindow.h" 45#include "llviewerwindow.h"
diff --git a/linden/indra/newview/llmutelist.cpp b/linden/indra/newview/llmutelist.cpp
index 118fd42..f36e282 100644
--- a/linden/indra/newview/llmutelist.cpp
+++ b/linden/indra/newview/llmutelist.cpp
@@ -61,7 +61,6 @@
61#include "llfloatermute.h" 61#include "llfloatermute.h"
62#include "llviewergenericmessage.h" // for gGenericDispatcher 62#include "llviewergenericmessage.h" // for gGenericDispatcher
63#include "llviewerwindow.h" 63#include "llviewerwindow.h"
64#include "viewer.h"
65#include "llworld.h" //for particle system banning 64#include "llworld.h" //for particle system banning
66 65
67LLMuteList* gMuteListp = NULL; 66LLMuteList* gMuteListp = NULL;
diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp
index edf2567..c312865 100644
--- a/linden/indra/newview/llnetmap.cpp
+++ b/linden/indra/newview/llnetmap.cpp
@@ -65,7 +65,7 @@
65#include "llvoavatar.h" 65#include "llvoavatar.h"
66#include "llworld.h" 66#include "llworld.h"
67#include "llworldmapview.h" // shared draw code 67#include "llworldmapview.h" // shared draw code
68#include "viewer.h" // Only for constants! 68#include "llappviewer.h" // Only for constants!
69 69
70#include "llglheaders.h" 70#include "llglheaders.h"
71 71
diff --git a/linden/indra/newview/llnotify.cpp b/linden/indra/newview/llnotify.cpp
index cd22343..0c259c0 100644
--- a/linden/indra/newview/llnotify.cpp
+++ b/linden/indra/newview/llnotify.cpp
@@ -152,7 +152,7 @@ LLNotifyBox* LLNotifyBox::findExistingNotify(LLPointer<LLNotifyBoxTemplate> noti
152 if(notify_template->mUnique) 152 if(notify_template->mUnique)
153 { 153 {
154 LLString message = notify_template->mMessage; 154 LLString message = notify_template->mMessage;
155 LLAlertDialog::format(message, args); 155 format(message, args);
156 unique_map_t::iterator found_it = sOpenUniqueNotifyBoxes.find(notify_template->mLabel + message); 156 unique_map_t::iterator found_it = sOpenUniqueNotifyBoxes.find(notify_template->mLabel + message);
157 if (found_it != sOpenUniqueNotifyBoxes.end()) 157 if (found_it != sOpenUniqueNotifyBoxes.end())
158 { 158 {
@@ -162,6 +162,7 @@ LLNotifyBox* LLNotifyBox::findExistingNotify(LLPointer<LLNotifyBoxTemplate> noti
162 return NULL; 162 return NULL;
163} 163}
164 164
165//static
165void LLNotifyBox::cleanup() 166void LLNotifyBox::cleanup()
166{ 167{
167 sDefaultTemplate = NULL; 168 sDefaultTemplate = NULL;
@@ -196,7 +197,7 @@ LLNotifyBox::LLNotifyBox(LLPointer<LLNotifyBoxTemplate> xml_template, const LLSt
196 // setup paramaters 197 // setup paramaters
197 198
198 mMessage = xml_template->mMessage; 199 mMessage = xml_template->mMessage;
199 LLAlertDialog::format(mMessage, args); 200 format(mMessage, args);
200 201
201 // use name + formatted text as unique key 202 // use name + formatted text as unique key
202 if (mUnique) 203 if (mUnique)
@@ -339,7 +340,7 @@ LLNotifyBox::LLNotifyBox(LLPointer<LLNotifyBoxTemplate> xml_template, const LLSt
339 onClickNext, 340 onClickNext,
340 this, 341 this,
341 sFont); 342 sFont);
342 btn->setToolTip("Next"); 343 btn->setToolTip(LLString("Next")); // *TODO: Translate
343 addChild(btn); 344 addChild(btn);
344 mNextBtn = btn; 345 mNextBtn = btn;
345 346
@@ -440,7 +441,7 @@ BOOL LLNotifyBox::handleRightMouseDown(S32 x, S32 y, MASK mask)
440{ 441{
441 if (!mIsTip && getVisible() && getEnabled() && pointInView(x,y)) 442 if (!mIsTip && getVisible() && getEnabled() && pointInView(x,y))
442 { 443 {
443 moveToBack(); 444 moveToBack(true);
444 return TRUE; 445 return TRUE;
445 } 446 }
446 447
@@ -554,6 +555,15 @@ void LLNotifyBox::close()
554 } 555 }
555} 556}
556 557
558void LLNotifyBox::format(LLString& msg, const LLString::format_map_t& args)
559{
560 // XUI:translate!
561 LLString::format_map_t targs = args;
562 targs["[SECOND_LIFE]"] = "Second Life";
563 LLString::format(msg, targs);
564}
565
566
557/*virtual*/ 567/*virtual*/
558BOOL LLNotifyBox::tick() 568BOOL LLNotifyBox::tick()
559{ 569{
@@ -575,7 +585,7 @@ void LLNotifyBox::setVisible(BOOL visible)
575 LLPanel::setVisible(visible); 585 LLPanel::setVisible(visible);
576} 586}
577 587
578void LLNotifyBox::moveToBack() 588void LLNotifyBox::moveToBack(bool getfocus)
579{ 589{
580 // Move this dialog to the back. 590 // Move this dialog to the back.
581 gNotifyBoxView->sendChildToBack(this); 591 gNotifyBoxView->sendChildToBack(this);
@@ -590,10 +600,13 @@ void LLNotifyBox::moveToBack()
590 if (front) 600 if (front)
591 { 601 {
592 gNotifyBoxView->showOnly(front); 602 gNotifyBoxView->showOnly(front);
593 // assuming that moveToBack is only called by clicking the next button, 603 if (getfocus)
594 // we give focus to the next next button 604 {
595 front->mNextBtn->setFocus(TRUE); 605 // if are called from a user interaction
596 gFocusMgr.triggerFocusFlash(); // TODO: it's ugly to call this here 606 // we give focus to the next next button
607 front->mNextBtn->setFocus(TRUE);
608 gFocusMgr.triggerFocusFlash(); // TODO: it's ugly to call this here
609 }
597 } 610 }
598 } 611 }
599 } 612 }
@@ -755,7 +768,7 @@ void LLNotifyBox::onClickButton(void* data)
755void LLNotifyBox::onClickNext(void* data) 768void LLNotifyBox::onClickNext(void* data)
756{ 769{
757 LLNotifyBox* self = static_cast<LLNotifyBox*>(data); 770 LLNotifyBox* self = static_cast<LLNotifyBox*>(data);
758 self->moveToBack(); 771 self->moveToBack(true);
759} 772}
760 773
761// static 774// static
@@ -795,7 +808,7 @@ const LLString LLNotifyBox::getTemplateMessage(const LLString& xml_desc, const L
795 if (iter != sNotifyTemplates.end()) 808 if (iter != sNotifyTemplates.end())
796 { 809 {
797 LLString message = iter->second->mMessage; 810 LLString message = iter->second->mMessage;
798 LLAlertDialog::format(message, args); 811 format(message, args);
799 return message; 812 return message;
800 } 813 }
801 else 814 else
diff --git a/linden/indra/newview/llnotify.h b/linden/indra/newview/llnotify.h
index 3d7bf6d..d717883 100644
--- a/linden/indra/newview/llnotify.h
+++ b/linden/indra/newview/llnotify.h
@@ -74,6 +74,7 @@ public:
74 void close(); 74 void close();
75 75
76 static void cleanup(); 76 static void cleanup();
77 static void format(LLString& msg, const LLString::format_map_t& args);
77 78
78protected: 79protected:
79 LLNotifyBox(LLPointer<LLNotifyBoxTemplate> notify_template, const LLString::format_map_t& args, 80 LLNotifyBox(LLPointer<LLNotifyBoxTemplate> notify_template, const LLString::format_map_t& args,
@@ -91,7 +92,7 @@ protected:
91 /*virtual*/ void draw(); 92 /*virtual*/ void draw();
92 /*virtual*/ BOOL tick(); 93 /*virtual*/ BOOL tick();
93 94
94 void moveToBack(); 95 void moveToBack(bool getfocus = false);
95 96
96 // Returns the rect, relative to gNotifyView, where this 97 // Returns the rect, relative to gNotifyView, where this
97 // notify box should be placed. 98 // notify box should be placed.
diff --git a/linden/indra/newview/lloverlaybar.cpp b/linden/indra/newview/lloverlaybar.cpp
index bcdb6c6..15c993e 100644
--- a/linden/indra/newview/lloverlaybar.cpp
+++ b/linden/indra/newview/lloverlaybar.cpp
@@ -57,7 +57,6 @@
57#include "llvoavatar.h" 57#include "llvoavatar.h"
58#include "llvoiceremotectrl.h" 58#include "llvoiceremotectrl.h"
59#include "llwebbrowserctrl.h" 59#include "llwebbrowserctrl.h"
60#include "viewer.h"
61 60
62// 61//
63// Globals 62// Globals
diff --git a/linden/indra/newview/llpanelLCD.cpp b/linden/indra/newview/llpanelLCD.cpp
index 960a321..63a1d6b 100644
--- a/linden/indra/newview/llpanelLCD.cpp
+++ b/linden/indra/newview/llpanelLCD.cpp
@@ -47,7 +47,7 @@
47#include "llresmgr.h" 47#include "llresmgr.h"
48#include "lltextbox.h" 48#include "lltextbox.h"
49#include "llui.h" 49#include "llui.h"
50#include "viewer.h" 50#include "llviewercontrol.h"
51 51
52//Ventrella 52//Ventrella
53#include "llagent.h" 53#include "llagent.h"
diff --git a/linden/indra/newview/llpanelaudioprefs.cpp b/linden/indra/newview/llpanelaudioprefs.cpp
index a4591dc..7edccc2 100644
--- a/linden/indra/newview/llpanelaudioprefs.cpp
+++ b/linden/indra/newview/llpanelaudioprefs.cpp
@@ -60,7 +60,7 @@
60#include "llviewerparcelmgr.h" 60#include "llviewerparcelmgr.h"
61#include "llvieweruictrlfactory.h" 61#include "llvieweruictrlfactory.h"
62#include "llviewerwindow.h" 62#include "llviewerwindow.h"
63#include "viewer.h" // do_disconnect 63#include "llviewercontrol.h"
64 64
65// 65//
66// Static functions 66// Static functions
diff --git a/linden/indra/newview/llpanelavatar.cpp b/linden/indra/newview/llpanelavatar.cpp
index dc2f14f..5b43497 100644
--- a/linden/indra/newview/llpanelavatar.cpp
+++ b/linden/indra/newview/llpanelavatar.cpp
@@ -69,6 +69,7 @@
69#include "lltooldraganddrop.h" 69#include "lltooldraganddrop.h"
70#include "lluiconstants.h" 70#include "lluiconstants.h"
71#include "llvoavatar.h" 71#include "llvoavatar.h"
72#include "llviewercontrol.h"
72#include "llviewermenu.h" // *FIX: for is_agent_friend() 73#include "llviewermenu.h" // *FIX: for is_agent_friend()
73#include "llviewergenericmessage.h" // send_generic_message 74#include "llviewergenericmessage.h" // send_generic_message
74#include "llviewerobjectlist.h" 75#include "llviewerobjectlist.h"
@@ -76,7 +77,6 @@
76#include "llviewborder.h" 77#include "llviewborder.h"
77#include "llweb.h" 78#include "llweb.h"
78#include "llinventorymodel.h" 79#include "llinventorymodel.h"
79#include "viewer.h" // for gUserServer
80#include "roles_constants.h" 80#include "roles_constants.h"
81 81
82#define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) ) 82#define kArraySize( _kArray ) ( sizeof( (_kArray) ) / sizeof( _kArray[0] ) )
@@ -1788,6 +1788,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
1788 //BOOL mature = FALSE; 1788 //BOOL mature = FALSE;
1789 BOOL identified = FALSE; 1789 BOOL identified = FALSE;
1790 BOOL transacted = FALSE; 1790 BOOL transacted = FALSE;
1791 BOOL age_verified = FALSE;
1791 BOOL online = FALSE; 1792 BOOL online = FALSE;
1792 char profile_url[DB_USER_PROFILE_URL_BUF_SIZE]; /*Flawfinder: ignore*/ 1793 char profile_url[DB_USER_PROFILE_URL_BUF_SIZE]; /*Flawfinder: ignore*/
1793 1794
@@ -1825,6 +1826,7 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
1825 1826
1826 identified = (flags & AVATAR_IDENTIFIED); 1827 identified = (flags & AVATAR_IDENTIFIED);
1827 transacted = (flags & AVATAR_TRANSACTED); 1828 transacted = (flags & AVATAR_TRANSACTED);
1829 age_verified = (flags & AVATAR_AGEVERIFIED);
1828 allow_publish = (flags & AVATAR_ALLOW_PUBLISH); 1830 allow_publish = (flags & AVATAR_ALLOW_PUBLISH);
1829 online = (flags & AVATAR_ONLINE); 1831 online = (flags & AVATAR_ONLINE);
1830 1832
@@ -1874,6 +1876,12 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
1874 payment_text = "NoPaymentInfoOnFile"; 1876 payment_text = "NoPaymentInfoOnFile";
1875 } 1877 }
1876 args["[PAYMENTINFO]"] = self->mPanelSecondLife->childGetValue(payment_text).asString(); 1878 args["[PAYMENTINFO]"] = self->mPanelSecondLife->childGetValue(payment_text).asString();
1879 LLString age_text = "NotAgeVerified";
1880 if(age_verified)
1881 {
1882 age_text = "AgeVerified";
1883 }
1884 args["[PAYMENTINFO]"] += self->mPanelSecondLife->childGetValue(age_text).asString();
1877 } 1885 }
1878 else 1886 else
1879 { 1887 {
diff --git a/linden/indra/newview/llpanelclassified.cpp b/linden/indra/newview/llpanelclassified.cpp
index e0f750f..04fb54b 100644
--- a/linden/indra/newview/llpanelclassified.cpp
+++ b/linden/indra/newview/llpanelclassified.cpp
@@ -66,7 +66,7 @@
66#include "llviewergenericmessage.h" // send_generic_message 66#include "llviewergenericmessage.h" // send_generic_message
67#include "llviewerregion.h" 67#include "llviewerregion.h"
68#include "llviewerwindow.h" // for window width, height 68#include "llviewerwindow.h" // for window width, height
69#include "viewer.h" // app_abort_quit() 69#include "llappviewer.h" // abortQuit()
70 70
71const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$ 71const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
72 72
@@ -322,7 +322,7 @@ void LLPanelClassified::saveCallback(S32 option, void* data)
322 322
323 case 2: // Cancel 323 case 2: // Cancel
324 default: 324 default:
325 app_abort_quit(); 325 LLAppViewer::instance()->abortQuit();
326 break; 326 break;
327 } 327 }
328} 328}
diff --git a/linden/indra/newview/llpanelcontents.cpp b/linden/indra/newview/llpanelcontents.cpp
index 50ff7bd..fa7cdfb 100644
--- a/linden/indra/newview/llpanelcontents.cpp
+++ b/linden/indra/newview/llpanelcontents.cpp
@@ -65,7 +65,6 @@
65#include "lltoolmgr.h" 65#include "lltoolmgr.h"
66#include "lltoolcomp.h" 66#include "lltoolcomp.h"
67#include "llpanelinventory.h" 67#include "llpanelinventory.h"
68#include "viewer.h"
69 68
70// 69//
71// Imported globals 70// Imported globals
diff --git a/linden/indra/newview/llpaneldirbrowser.cpp b/linden/indra/newview/llpaneldirbrowser.cpp
index 27fb3ac..65b1e59 100644
--- a/linden/indra/newview/llpaneldirbrowser.cpp
+++ b/linden/indra/newview/llpaneldirbrowser.cpp
@@ -1184,6 +1184,7 @@ void LLPanelDirBrowser::setupNewSearch()
1184 1184
1185 1185
1186// static 1186// static
1187// called from calssifieds, events, groups, land, people, and places
1187void LLPanelDirBrowser::onClickSearchCore(void* userdata) 1188void LLPanelDirBrowser::onClickSearchCore(void* userdata)
1188{ 1189{
1189 LLPanelDirBrowser* self = (LLPanelDirBrowser*)userdata; 1190 LLPanelDirBrowser* self = (LLPanelDirBrowser*)userdata;
@@ -1191,6 +1192,8 @@ void LLPanelDirBrowser::onClickSearchCore(void* userdata)
1191 1192
1192 self->resetSearchStart(); 1193 self->resetSearchStart();
1193 self->performQuery(); 1194 self->performQuery();
1195
1196 LLFloaterDirectory::sOldSearchCount++;
1194} 1197}
1195 1198
1196 1199
diff --git a/linden/indra/newview/llpaneldirevents.cpp b/linden/indra/newview/llpaneldirevents.cpp
index d8a4652..1dc4286 100644
--- a/linden/indra/newview/llpaneldirevents.cpp
+++ b/linden/indra/newview/llpaneldirevents.cpp
@@ -48,7 +48,7 @@
48#include "llresmgr.h" 48#include "llresmgr.h"
49#include "lluiconstants.h" 49#include "lluiconstants.h"
50#include "llpanelevent.h" 50#include "llpanelevent.h"
51#include "viewer.h" 51#include "llappviewer.h"
52 52
53BOOL gDisplayEventHack = FALSE; 53BOOL gDisplayEventHack = FALSE;
54 54
diff --git a/linden/indra/newview/llpaneldirfind.cpp b/linden/indra/newview/llpaneldirfind.cpp
index 3dd419f..640cbef 100644
--- a/linden/indra/newview/llpaneldirfind.cpp
+++ b/linden/indra/newview/llpaneldirfind.cpp
@@ -276,7 +276,7 @@ std::string LLPanelDirFindAll::getSearchURLSuffix(bool mature_in)
276 mature = false; 276 mature = false;
277 } 277 }
278 278
279 std::string url = gSavedSettings.getString("SearchURLSuffix"); 279 std::string url = gSavedSettings.getString("SearchURLSuffix2");
280 280
281 // if the mature checkbox is unchecked, modify query to remove 281 // if the mature checkbox is unchecked, modify query to remove
282 // terms with given phrase from the result set 282 // terms with given phrase from the result set
@@ -314,6 +314,11 @@ std::string LLPanelDirFindAll::getSearchURLSuffix(bool mature_in)
314 substring = "[Z]"; 314 substring = "[Z]";
315 url.replace(url.find(substring), substring.length(), z); 315 url.replace(url.find(substring), substring.length(), z);
316 316
317 LLUUID session_id = gAgent.getSessionID();
318 std::string session_string = session_id.getString();
319 substring = "[SESSION]";
320 url.replace(url.find(substring), substring.length(), session_string);
321
317 return url; 322 return url;
318} 323}
319 324
@@ -366,6 +371,8 @@ void LLPanelDirFindAll::onClickSearch(void* data)
366 LLPanelDirFindAll* self = ( LLPanelDirFindAll* )data; 371 LLPanelDirFindAll* self = ( LLPanelDirFindAll* )data;
367 LLString search_text = self->childGetText("search_editor"); 372 LLString search_text = self->childGetText("search_editor");
368 self->search(search_text); 373 self->search(search_text);
374
375 LLFloaterDirectory::sNewSearchCount++;
369} 376}
370 377
371void LLPanelDirFindAll::onNavigateBegin( const EventType& eventIn ) 378void LLPanelDirFindAll::onNavigateBegin( const EventType& eventIn )
diff --git a/linden/indra/newview/llpaneldisplay.cpp b/linden/indra/newview/llpaneldisplay.cpp
index 3b2edcc..0d0fc80 100644
--- a/linden/indra/newview/llpaneldisplay.cpp
+++ b/linden/indra/newview/llpaneldisplay.cpp
@@ -74,7 +74,7 @@
74 74
75//RN temporary includes for resolution switching 75//RN temporary includes for resolution switching
76#include "llglheaders.h" 76#include "llglheaders.h"
77#include "viewer.h" 77#include "llviewercontrol.h"
78#include "llsky.h" 78#include "llsky.h"
79 79
80const F32 MAX_USER_FAR_CLIP = 512.f; 80const F32 MAX_USER_FAR_CLIP = 512.f;
diff --git a/linden/indra/newview/llpanelgeneral.cpp b/linden/indra/newview/llpanelgeneral.cpp
index 9cdf919..007e2ff 100644
--- a/linden/indra/newview/llpanelgeneral.cpp
+++ b/linden/indra/newview/llpanelgeneral.cpp
@@ -46,6 +46,7 @@
46#include "llcolorswatch.h" 46#include "llcolorswatch.h"
47#include "llcombobox.h" 47#include "llcombobox.h"
48#include "llconsole.h" 48#include "llconsole.h"
49#include "lllineeditor.h"
49#include "llpanellogin.h" 50#include "llpanellogin.h"
50#include "llnetmap.h" 51#include "llnetmap.h"
51#include "llresmgr.h" 52#include "llresmgr.h"
@@ -54,8 +55,9 @@
54#include "llui.h" 55#include "llui.h"
55#include "llurlsimstring.h" 56#include "llurlsimstring.h"
56#include "llviewercontrol.h" 57#include "llviewercontrol.h"
57#include "viewer.h" // gCrashBehavior 58#include "llappviewer.h"
58 59#include "llurlsimstring.h"
60#include "llappviewer.h"
59// 61//
60// Imported globals 62// Imported globals
61// 63//
@@ -63,6 +65,7 @@
63void set_crash_behavior(LLUICtrl* ctrl, void* data); 65void set_crash_behavior(LLUICtrl* ctrl, void* data);
64void set_start_location(LLUICtrl* ctrl, void* data); 66void set_start_location(LLUICtrl* ctrl, void* data);
65 67
68
66// 69//
67// Globals 70// Globals
68// 71//
@@ -72,8 +75,7 @@ void set_start_location(LLUICtrl* ctrl, void* data);
72// 75//
73void set_crash_behavior(LLUICtrl* ctrl, void* data) 76void set_crash_behavior(LLUICtrl* ctrl, void* data)
74{ 77{
75 gCrashBehavior = ((LLComboBox*) ctrl)->getCurrentIndex(); 78 LLAppViewer::instance()->setCrashBehavior(((LLComboBox*) ctrl)->getCurrentIndex());
76 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior);
77} 79}
78 80
79void set_language(LLUICtrl* ctrl, void* data) 81void set_language(LLUICtrl* ctrl, void* data)
@@ -86,6 +88,11 @@ void LLPanelGeneral::set_start_location(LLUICtrl* ctrl, void* data)
86 LLURLSimString::setString(ctrl->getValue().asString()); 88 LLURLSimString::setString(ctrl->getValue().asString());
87} 89}
88 90
91void LLPanelGeneral::set_specific_start_location(LLLineEditor* line_editor, void* data)
92{
93 LLURLSimString::setString(line_editor->getValue().asString());
94}
95
89LLPanelGeneral::LLPanelGeneral() 96LLPanelGeneral::LLPanelGeneral()
90{ 97{
91 gUICtrlFactory->buildPanel(this, "panel_preferences_general.xml"); 98 gUICtrlFactory->buildPanel(this, "panel_preferences_general.xml");
@@ -137,6 +144,7 @@ BOOL LLPanelGeneral::postBuild()
137 combo->setCurrentByIndex( login_last ? 1 : 0 ); 144 combo->setCurrentByIndex( login_last ? 1 : 0 );
138 } 145 }
139 combo->setCommitCallback( &set_start_location ); 146 combo->setCommitCallback( &set_start_location );
147 combo->setTextEntryCallback( &set_specific_start_location );
140 } 148 }
141 149
142 // Show location on login screen 150 // Show location on login screen
@@ -145,7 +153,7 @@ BOOL LLPanelGeneral::postBuild()
145 combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); 153 combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox");
146 if (combo) 154 if (combo)
147 { 155 {
148 combo->setCurrentByIndex( gCrashBehavior ); 156 combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() );
149 combo->setCommitCallback( &set_crash_behavior ); 157 combo->setCommitCallback( &set_crash_behavior );
150 } 158 }
151 159
@@ -181,11 +189,11 @@ void LLPanelGeneral::refresh()
181 mLoginLocation = combo->getValue().asString(); 189 mLoginLocation = combo->getValue().asString();
182 } 190 }
183 191
184 mCrashBehavior = gCrashBehavior; 192 mCrashBehavior = LLAppViewer::instance()->getCrashBehavior();
185 combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox"); 193 combo = LLUICtrlFactory::getComboBoxByName(this, "crash_behavior_combobox");
186 if (combo) 194 if (combo)
187 { 195 {
188 combo->setCurrentByIndex( gCrashBehavior ); 196 combo->setCurrentByIndex( LLAppViewer::instance()->getCrashBehavior() );
189 } 197 }
190 198
191 mRenderName = gSavedSettings.getS32("RenderName"); 199 mRenderName = gSavedSettings.getS32("RenderName");
@@ -222,8 +230,7 @@ void LLPanelGeneral::cancel()
222 230
223 LLURLSimString::setString(mLoginLocation); 231 LLURLSimString::setString(mLoginLocation);
224 232
225 gCrashBehavior = mCrashBehavior; 233 LLAppViewer::instance()->setCrashBehavior(mCrashBehavior);
226 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior);
227 234
228 // make listener 235 // make listener
229 //gAFKTimeout = away_timeout; 236 //gAFKTimeout = away_timeout;
@@ -231,5 +238,5 @@ void LLPanelGeneral::cancel()
231 238
232void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data) 239void LLPanelGeneral::clickShowStartLocation(LLUICtrl*, void* user_data)
233{ 240{
234 LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible 241 LLPanelLogin::loadLoginPage();
235} 242}
diff --git a/linden/indra/newview/llpanelgeneral.h b/linden/indra/newview/llpanelgeneral.h
index 7c89d78..f3f29c5 100644
--- a/linden/indra/newview/llpanelgeneral.h
+++ b/linden/indra/newview/llpanelgeneral.h
@@ -55,6 +55,7 @@ public:
55 55
56 static void clickShowStartLocation(LLUICtrl*, void* user_data); 56 static void clickShowStartLocation(LLUICtrl*, void* user_data);
57 static void set_start_location(LLUICtrl* ctrl, void* data); 57 static void set_start_location(LLUICtrl* ctrl, void* data);
58 static void set_specific_start_location(LLLineEditor* line_editor, void* data);
58 59
59protected: 60protected:
60 S32 mRenderName; 61 S32 mRenderName;
diff --git a/linden/indra/newview/llpanelgroup.cpp b/linden/indra/newview/llpanelgroup.cpp
index 99744c9..76fbada 100644
--- a/linden/indra/newview/llpanelgroup.cpp
+++ b/linden/indra/newview/llpanelgroup.cpp
@@ -44,7 +44,7 @@
44#include "llviewermessage.h" 44#include "llviewermessage.h"
45#include "llvieweruictrlfactory.h" 45#include "llvieweruictrlfactory.h"
46#include "llviewerwindow.h" 46#include "llviewerwindow.h"
47#include "viewer.h" 47#include "llappviewer.h"
48 48
49// static 49// static
50void* LLPanelGroupTab::createTab(void* data) 50void* LLPanelGroupTab::createTab(void* data)
@@ -530,7 +530,7 @@ void LLPanelGroup::handleNotifyCallback(S32 option)
530 default: 530 default:
531 // Do nothing. The user is canceling the action. 531 // Do nothing. The user is canceling the action.
532 // If we were quitting, we didn't really mean it. 532 // If we were quitting, we didn't really mean it.
533 app_abort_quit(); 533 LLAppViewer::instance()->abortQuit();
534 break; 534 break;
535 } 535 }
536} 536}
diff --git a/linden/indra/newview/llpanelgrouplandmoney.cpp b/linden/indra/newview/llpanelgrouplandmoney.cpp
index 4c12aa2..0152990 100644
--- a/linden/indra/newview/llpanelgrouplandmoney.cpp
+++ b/linden/indra/newview/llpanelgrouplandmoney.cpp
@@ -1115,8 +1115,7 @@ void LLPanelGroupLandMoney::processGroupAccountDetailsReply(LLMessageSystem* msg
1115 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 1115 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
1116 if (gAgent.getID() != agent_id) 1116 if (gAgent.getID() != agent_id)
1117 { 1117 {
1118 llwarns << "Got group L$ history reply for another agent!" 1118 llwarns << "Got group L$ history reply for another agent!" << llendl;
1119 << " Probably a userserver bug!" << llendl;
1120 return; 1119 return;
1121 } 1120 }
1122 1121
@@ -1292,8 +1291,7 @@ void LLPanelGroupLandMoney::processGroupAccountTransactionsReply(LLMessageSystem
1292 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 1291 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
1293 if (gAgent.getID() != agent_id) 1292 if (gAgent.getID() != agent_id)
1294 { 1293 {
1295 llwarns << "Got group L$ history reply for another agent!" 1294 llwarns << "Got group L$ history reply for another agent!" << llendl;
1296 << " Probably a userserver bug!" << llendl;
1297 return; 1295 return;
1298 } 1296 }
1299 1297
@@ -1463,8 +1461,7 @@ void LLPanelGroupLandMoney::processGroupAccountSummaryReply(LLMessageSystem* msg
1463 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 1461 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
1464 if (gAgent.getID() != agent_id) 1462 if (gAgent.getID() != agent_id)
1465 { 1463 {
1466 llwarns << "Got group L$ history reply for another agent!" 1464 llwarns << "Got group L$ history reply for another agent!" << llendl;
1467 << " Probably a userserver bug!" << llendl;
1468 return; 1465 return;
1469 } 1466 }
1470 1467
diff --git a/linden/indra/newview/llpanelgroupvoting.cpp b/linden/indra/newview/llpanelgroupvoting.cpp
index b74bf9c..6007c88 100644
--- a/linden/indra/newview/llpanelgroupvoting.cpp
+++ b/linden/indra/newview/llpanelgroupvoting.cpp
@@ -752,8 +752,7 @@ void LLPanelGroupVoting::impl::processGroupActiveProposalItemReply(LLMessageSyst
752 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 752 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
753 if (gAgent.getID() != agent_id) 753 if (gAgent.getID() != agent_id)
754 { 754 {
755 llwarns << "Got active group proposals reply for another agent!" 755 llwarns << "Got active group proposals reply for another agent!" << llendl;
756 << " Probably a userserver bug!" << llendl;
757 return; 756 return;
758 } 757 }
759 758
@@ -913,8 +912,7 @@ void LLPanelGroupVoting::impl::processGroupVoteHistoryItemReply(LLMessageSystem
913 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); 912 msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
914 if (gAgent.getID() != agent_id) 913 if (gAgent.getID() != agent_id)
915 { 914 {
916 llwarns << "Got group voting history reply for another agent!" 915 llwarns << "Got group voting history reply for another agent!" << llendl;
917 << " Probably a userserver bug!" << llendl;
918 return; 916 return;
919 } 917 }
920 918
diff --git a/linden/indra/newview/llpanelinput.cpp b/linden/indra/newview/llpanelinput.cpp
index d3a140c..4e0e182 100644
--- a/linden/indra/newview/llpanelinput.cpp
+++ b/linden/indra/newview/llpanelinput.cpp
@@ -50,7 +50,8 @@
50#include "llsliderctrl.h" 50#include "llsliderctrl.h"
51#include "lltextbox.h" 51#include "lltextbox.h"
52#include "llui.h" 52#include "llui.h"
53#include "viewer.h" 53#include "llappviewer.h"
54#include "llviewercontrol.h"
54 55
55//Ventrella 56//Ventrella
56#include "llagent.h" 57#include "llagent.h"
@@ -61,9 +62,6 @@
61// Imported globals 62// Imported globals
62// 63//
63 64
64extern F32 gMouseSensitivity;
65extern BOOL gInvertMouse;
66
67// 65//
68// Globals 66// Globals
69// 67//
diff --git a/linden/indra/newview/llpanellogin.cpp b/linden/indra/newview/llpanellogin.cpp
index 292f5c3..3e64bba 100644
--- a/linden/indra/newview/llpanellogin.cpp
+++ b/linden/indra/newview/llpanellogin.cpp
@@ -44,13 +44,16 @@
44 44
45#include "llbutton.h" 45#include "llbutton.h"
46#include "llcheckboxctrl.h" 46#include "llcheckboxctrl.h"
47#include "llcommandhandler.h"
47#include "llcombobox.h" 48#include "llcombobox.h"
49#include "llcurl.h"
48#include "llviewercontrol.h" 50#include "llviewercontrol.h"
49#include "llfloaterabout.h" 51#include "llfloaterabout.h"
50#include "llfloatertest.h" 52#include "llfloatertest.h"
51#include "llfloaterpreference.h" 53#include "llfloaterpreference.h"
52#include "llfocusmgr.h" 54#include "llfocusmgr.h"
53#include "lllineeditor.h" 55#include "lllineeditor.h"
56#include "llstartup.h"
54#include "lltextbox.h" 57#include "lltextbox.h"
55#include "llui.h" 58#include "llui.h"
56#include "lluiconstants.h" 59#include "lluiconstants.h"
@@ -61,7 +64,8 @@
61#include "llviewernetwork.h" 64#include "llviewernetwork.h"
62#include "llviewerwindow.h" // to link into child list 65#include "llviewerwindow.h" // to link into child list
63#include "llnotify.h" 66#include "llnotify.h"
64#include "viewer.h" // for gHideLinks 67#include "llappviewer.h" // for gHideLinks
68#include "llurlsimstring.h"
65#include "llvieweruictrlfactory.h" 69#include "llvieweruictrlfactory.h"
66#include "llhttpclient.h" 70#include "llhttpclient.h"
67#include "llweb.h" 71#include "llweb.h"
@@ -72,11 +76,146 @@
72 76
73#include "llglheaders.h" 77#include "llglheaders.h"
74 78
79
80LLString load_password_from_disk(void);
81void save_password_to_disk(const char* hashed_password);
82
75const S32 BLACK_BORDER_HEIGHT = 160; 83const S32 BLACK_BORDER_HEIGHT = 160;
76const S32 MAX_PASSWORD = 16; 84const S32 MAX_PASSWORD = 16;
77 85
78LLPanelLogin *LLPanelLogin::sInstance = NULL; 86LLPanelLogin *LLPanelLogin::sInstance = NULL;
79BOOL LLPanelLogin::sCapslockDidNotification = FALSE; 87
88
89//parses the input url and returns true if afterwards
90//a web-login-key, firstname and lastname is set
91bool LLLoginHandler::parseDirectLogin(std::string url)
92{
93 LLURI uri(url);
94 parse(uri.queryMap());
95
96 if (mWebLoginKey.isNull() ||
97 mFirstName.empty() ||
98 mLastName.empty())
99 {
100 return false;
101 }
102 else
103 {
104 return true;
105 }
106}
107
108
109void LLLoginHandler::parse(const LLSD& queryMap)
110{
111 mWebLoginKey = queryMap["web_login_key"].asUUID();
112 mFirstName = queryMap["first_name"].asString();
113 mLastName = queryMap["last_name"].asString();
114
115 if (queryMap["grid"].asString() == "aditi")
116 {
117 gGridChoice = GRID_INFO_ADITI;
118 }
119 else if (queryMap["grid"].asString() == "agni")
120 {
121 gGridChoice = GRID_INFO_AGNI;
122 }
123 else if (queryMap["grid"].asString() == "siva")
124 {
125 gGridChoice = GRID_INFO_SIVA;
126 }
127 else if (queryMap["grid"].asString() == "durga")
128 {
129 gGridChoice = GRID_INFO_DURGA;
130 }
131 else if (queryMap["grid"].asString() == "shakti")
132 {
133 gGridChoice = GRID_INFO_SHAKTI;
134 }
135 else if (queryMap["grid"].asString() == "soma")
136 {
137 gGridChoice = GRID_INFO_SOMA;
138 }
139 else if (queryMap["grid"].asString() == "ganga")
140 {
141 gGridChoice = GRID_INFO_GANGA;
142 }
143 else if (queryMap["grid"].asString() == "vaak")
144 {
145 gGridChoice = GRID_INFO_VAAK;
146 }
147 else if (queryMap["grid"].asString() == "uma")
148 {
149 gGridChoice = GRID_INFO_UMA;
150 }
151
152 snprintf(gGridName, MAX_STRING, "%s", gGridInfo[gGridChoice].mName); /* Flawfinder: ignore */
153 LLAppViewer::instance()->resetURIs();
154
155 LLString startLocation = queryMap["location"].asString();
156
157 if (startLocation == "specify")
158 {
159 LLURLSimString::setString(queryMap["region"].asString());
160 }
161 else if (startLocation == "home")
162 {
163 gSavedSettings.setBOOL("LoginLastLocation", FALSE);
164 LLURLSimString::setString("");
165 }
166 else if (startLocation == "last")
167 {
168 gSavedSettings.setBOOL("LoginLastLocation", TRUE);
169 LLURLSimString::setString("");
170 }
171}
172
173bool LLLoginHandler::handle(const LLSD& tokens,
174 const LLSD& queryMap)
175{
176 parse(queryMap);
177
178 //if we haven't initialized stuff yet, this is
179 //coming in from the GURL handler, just parse
180 if (STATE_FIRST == LLStartUp::getStartupState())
181 {
182 return true;
183 }
184
185 LLString password = queryMap["password"].asString();
186
187 if (!password.empty())
188 {
189 gSavedSettings.setBOOL("RememberPassword", TRUE);
190
191 if (password.substr(0,3) != "$1$")
192 {
193 LLMD5 pass((unsigned char*)password.c_str());
194 char md5pass[33]; /* Flawfinder: ignore */
195 pass.hex_digest(md5pass);
196 password = md5pass;
197 save_password_to_disk(password.c_str());
198 }
199 }
200 else
201 {
202 save_password_to_disk(NULL);
203 gSavedSettings.setBOOL("RememberPassword", FALSE);
204 }
205
206
207 if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
208 {
209 if (mWebLoginKey.isNull()) {
210 LLPanelLogin::loadLoginPage();
211 } else {
212 LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
213 }
214 }
215 return true;
216}
217
218LLLoginHandler gLoginHandler;
80 219
81// helper class that trys to download a URL from a web site and calls a method 220// helper class that trys to download a URL from a web site and calls a method
82// on parent class indicating if the web server is working or not 221// on parent class indicating if the web server is working or not
@@ -155,112 +294,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
155 mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE); 294 mLogoImage = gImageList.getImage("startup_logo.tga", LLUUID::null, MIPMAP_FALSE, TRUE);
156 295
157 gUICtrlFactory->buildPanel(this, "panel_login.xml"); 296 gUICtrlFactory->buildPanel(this, "panel_login.xml");
158 setRect(rect); 297
298 //leave room for the login menu bar
299 setRect(LLRect(0, rect.getHeight()-18, rect.getWidth(), 0));
159 reshape(rect.getWidth(), rect.getHeight()); 300 reshape(rect.getWidth(), rect.getHeight());
160
161 childSetPrevalidate("first_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
162 childSetPrevalidate("last_name_edit", LLLineEditor::prevalidatePrintableNoSpace);
163
164 childSetCommitCallback("password_edit", mungePassword);
165 childSetKeystrokeCallback("password_edit", onPassKey, this);
166 childSetUserData("password_edit", this);
167
168 LLLineEditor* edit = LLUICtrlFactory::getLineEditorByName(this, "password_edit");
169 if (edit) edit->setDrawAsterixes(TRUE);
170
171 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(this, "start_location_combo");
172 if (combo)
173 {
174 combo->setAllowTextEntry(TRUE, 128, FALSE);
175
176 // The XML file loads the combo with the following labels:
177 // 0 - "My Home"
178 // 1 - "My Last Location"
179 // 2 - "<Type region name>"
180
181 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation");
182 LLString sim_string = LLURLSimString::sInstance.mSimString;
183 if (!sim_string.empty())
184 {
185 // Replace "<Type region name>" with this region name
186 combo->remove(2);
187 combo->add( sim_string );
188 combo->setTextEntry(sim_string);
189 combo->setCurrentByIndex( 2 );
190 }
191 else if (login_last)
192 {
193 combo->setCurrentByIndex( 1 );
194 }
195 else
196 {
197 combo->setCurrentByIndex( 0 );
198 }
199
200 combo->setCommitCallback( &LLPanelGeneral::set_start_location );
201 }
202 301
203 // Specific servers added later.
204 childSetVisible("server_combo", show_server);
205
206 childSetAction("new_account_btn", onClickNewAccount, this);
207 childSetVisible("new_account_btn", !gHideLinks);
208
209 childSetAction("connect_btn", onClickConnect, this);
210
211 setDefaultBtn("connect_btn");
212
213 childSetAction("preferences_btn", LLFloaterPreference::show, this);
214
215 childSetAction("quit_btn", onClickQuit, this);
216
217 LLTextBox* text = LLUICtrlFactory::getTextBoxByName(this, "version_text");
218 if (text)
219 {
220 LLString version = llformat("%d.%d.%d (%d)",
221 LL_VERSION_MAJOR,
222 LL_VERSION_MINOR,
223 LL_VERSION_PATCH,
224 LL_VIEWER_BUILD );
225 text->setText(version);
226 text->setClickedCallback(onClickVersion);
227 text->setCallbackUserData(this);
228
229 // HACK to move to the lower-right of the window
230 // replace/remove this logic when we have dynamic layouts
231 S32 right = getRect().mRight;
232 LLRect r = text->getRect();
233 const S32 PAD = 2;
234 r.setOriginAndSize( right - r.getWidth() - PAD, PAD,
235 r.getWidth(), r.getHeight() );
236 text->setRect(r);
237 }
238
239 LLTextBox* channel_text = LLUICtrlFactory::getTextBoxByName(this, "channel_text");
240 if (channel_text)
241 {
242 channel_text->setText(gChannelName);
243 channel_text->setClickedCallback(onClickVersion);
244 channel_text->setCallbackUserData(this);
245
246 // HACK to move to the right of the window, above the version string,
247 // replace/remove this logic when we have dynamic layouts
248 S32 right = getRect().mRight;
249 LLRect r = channel_text->getRect();
250 const S32 PAD = 2;
251 S32 version_string_top = r.mTop;
252 if(text)
253 {
254 version_string_top = text->getRect().mTop;
255 }
256 r.setOriginAndSize(
257 right - r.getWidth() - PAD,
258 version_string_top,
259 r.getWidth(),
260 r.getHeight());
261 channel_text->setRect(r);
262 }
263
264 // get the web browser control 302 // get the web browser control
265 #if LL_LIBXUL_ENABLED 303 #if LL_LIBXUL_ENABLED
266 LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html"); 304 LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(this, "login_html");
@@ -284,11 +322,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
284 322
285 // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through) 323 // force the size to be correct (XML doesn't seem to be sufficient to do this) (with some padding so the other login screen doesn't show through)
286 LLRect htmlRect = mRect; 324 LLRect htmlRect = mRect;
287 htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY() + 40, mRect.getWidth() + 6, mRect.getHeight() - 78 ); 325 htmlRect.setCenterAndSize( mRect.getCenterX() - 2, mRect.getCenterY(), mRect.getWidth() + 6, mRect.getHeight());
288 web_browser->setRect( htmlRect ); 326 web_browser->setRect( htmlRect );
289 web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE ); 327 web_browser->reshape( htmlRect.getWidth(), htmlRect.getHeight(), TRUE );
290 reshape( mRect.getWidth(), mRect.getHeight(), 1 ); 328 reshape( mRect.getWidth(), mRect.getHeight(), 1 );
291 329
292 // kick off a request to grab the url manually 330 // kick off a request to grab the url manually
293 gResponsePtr = LLIamHereLogin::build( this ); 331 gResponsePtr = LLIamHereLogin::build( this );
294 LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr ); 332 LLHTTPClient::get( childGetValue( "real_url" ).asString(), gResponsePtr );
@@ -298,7 +336,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
298 #endif 336 #endif
299 337
300 // Initialize visibility (and don't force visibility - use prefs) 338 // Initialize visibility (and don't force visibility - use prefs)
301 refreshLocation( false );
302} 339}
303 340
304void LLPanelLogin::setSiteIsAlive( bool alive ) 341void LLPanelLogin::setSiteIsAlive( bool alive )
@@ -310,9 +347,8 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
310 { 347 {
311 if ( web_browser ) 348 if ( web_browser )
312 { 349 {
313 // navigate to the "real" page 350 loadLoginPage();
314 web_browser->navigateTo( childGetValue( "real_url" ).asString() ); 351
315
316 // mark as available 352 // mark as available
317 mHtmlAvailable = TRUE; 353 mHtmlAvailable = TRUE;
318 }; 354 };
@@ -334,21 +370,6 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
334#endif 370#endif
335} 371}
336 372
337void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)
338{
339 LLPanelLogin* self = (LLPanelLogin*)user_data;
340 LLLineEditor* editor = (LLLineEditor*)caller;
341 std::string password = editor->getText();
342
343 // Re-md5 if we've changed at all
344 if (password != self->mIncomingPassword)
345 {
346 LLMD5 pass((unsigned char *)password.c_str());
347 char munged_password[MD5HEX_STR_SIZE];
348 pass.hex_digest(munged_password);
349 self->mMungedPassword = munged_password;
350 }
351}
352 373
353LLPanelLogin::~LLPanelLogin() 374LLPanelLogin::~LLPanelLogin()
354{ 375{
@@ -384,13 +405,6 @@ void LLPanelLogin::draw()
384 glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f); 405 glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * mRect.getWidth(), 0.f, 0.f);
385 glScalef(image_aspect / view_aspect, 1.f, 1.f); 406 glScalef(image_aspect / view_aspect, 1.f, 1.f);
386 } 407 }
387 // Don't maintain aspect ratio if screen wider than image. This results in the
388 // hand being partially cut off. JC
389 //else
390 //{
391 // glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * (F32)BLACK_BORDER_HEIGHT, 0.f);
392 // glScalef(1.f, view_aspect / image_aspect, 1.f);
393 //}
394 408
395 S32 width = mRect.getWidth(); 409 S32 width = mRect.getWidth();
396 S32 height = mRect.getHeight(); 410 S32 height = mRect.getHeight();
@@ -399,9 +413,6 @@ void LLPanelLogin::draw()
399 { 413 {
400 // draw a background box in black 414 // draw a background box in black
401 gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) ); 415 gl_rect_2d( 0, height - 264, width, 264, LLColor4( 0.0f, 0.0f, 0.0f, 1.f ) );
402
403 // draw the bottom part of the background image - just the blue background to the native client UI
404 gl_draw_scaled_image(0, -264, width + 8, mLogoImage->getHeight(), mLogoImage);
405 } 416 }
406 else 417 else
407 { 418 {
@@ -469,54 +480,14 @@ BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
469 480
470 return LLPanel::handleKeyHere(key, mask, called_from_parent); 481 return LLPanel::handleKeyHere(key, mask, called_from_parent);
471} 482}
472 483
473// virtual
474void LLPanelLogin::setFocus(BOOL b)
475{
476 if(b != hasFocus())
477 {
478 if(b)
479 {
480 LLPanelLogin::giveFocus();
481 }
482 else
483 {
484 LLPanel::setFocus(b);
485 }
486 }
487}
488 484
489// static 485// static
490void LLPanelLogin::giveFocus() 486void LLPanelLogin::giveFocus()
491{ 487{
492 if( sInstance )
493 {
494 // Grab focus and move cursor to first blank input field
495 std::string first = sInstance->childGetText("first_name_edit");
496 std::string pass = sInstance->childGetText("password_edit");
497
498 BOOL have_first = !first.empty();
499 BOOL have_pass = !pass.empty();
500
501 LLLineEditor* edit = NULL;
502 if (have_first && !have_pass)
503 {
504 // User saved his name but not his password. Move
505 // focus to password field.
506 edit = LLUICtrlFactory::getLineEditorByName(sInstance, "password_edit");
507 }
508 else
509 {
510 // User doesn't have a name, so start there.
511 edit = LLUICtrlFactory::getLineEditorByName(sInstance, "first_name_edit");
512 }
513 488
514 if (edit) 489 if (sInstance)
515 { 490 sInstance->setFocus(TRUE);
516 edit->setFocus(TRUE);
517 edit->selectAll();
518 }
519 }
520} 491}
521 492
522 493
@@ -528,266 +499,167 @@ void LLPanelLogin::show(const LLRect &rect,
528{ 499{
529 new LLPanelLogin(rect, show_server, callback, callback_data); 500 new LLPanelLogin(rect, show_server, callback, callback_data);
530 501
502 LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
503
504 if (!web_browser) return;
505
531 if( !gFocusMgr.getKeyboardFocus() ) 506 if( !gFocusMgr.getKeyboardFocus() )
532 { 507 {
533 // Grab focus and move cursor to first enabled control 508 // Grab focus and move cursor to first enabled control
534 sInstance->setFocus(TRUE); 509 web_browser->setFocus(TRUE);
535 } 510 }
536 511
537 // Make sure that focus always goes here (and use the latest sInstance that was just created) 512 // Make sure that focus always goes here (and use the latest sInstance that was just created)
538 gFocusMgr.setDefaultKeyboardFocus(sInstance); 513 gFocusMgr.setDefaultKeyboardFocus(web_browser);
539} 514}
540 515
516
541// static 517// static
542void LLPanelLogin::setFields(const std::string& firstname, const std::string& lastname, const std::string& password, 518void LLPanelLogin::close()
543 BOOL remember)
544{ 519{
545 if (!sInstance) 520 if (sInstance)
546 { 521 {
547 llwarns << "Attempted fillFields with no login view shown" << llendl; 522 gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance );
548 return; 523
549 } 524 gFocusMgr.setDefaultKeyboardFocus(NULL);
550
551 sInstance->childSetText("first_name_edit", firstname);
552 sInstance->childSetText("last_name_edit", lastname);
553 525
554 // Max "actual" password length is 16 characters. 526 delete sInstance;
555 // Hex digests are always 32 characters. 527 sInstance = NULL;
556 if (password.length() == 32)
557 {
558 // This is a MD5 hex digest of a password.
559 // We don't actually use the password input field,
560 // fill it with MAX_PASSWORD characters so we get a
561 // nice row of asterixes.
562 const std::string filler("123456789!123456");
563 sInstance->childSetText("password_edit", filler);
564 sInstance->mIncomingPassword = filler;
565 sInstance->mMungedPassword = password;
566 }
567 else
568 {
569 // this is a normal text password
570 sInstance->childSetText("password_edit", password);
571 sInstance->mIncomingPassword = password;
572 LLMD5 pass((unsigned char *)password.c_str());
573 char munged_password[MD5HEX_STR_SIZE];
574 pass.hex_digest(munged_password);
575 sInstance->mMungedPassword = munged_password;
576 } 528 }
577
578 sInstance->childSetValue("remember_check", remember);
579} 529}
580 530
581
582// static 531// static
583void LLPanelLogin::addServer(const char *server, S32 domain_name) 532void LLPanelLogin::setAlwaysRefresh(bool refresh)
584{ 533{
585 if (!sInstance) 534 if (LLStartUp::getStartupState() >= STATE_LOGIN_CLEANUP) return;
586 {
587 llwarns << "Attempted addServer with no login view shown" << llendl;
588 return;
589 }
590 535
591 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); 536 LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
592 if (combo) 537
538 if (web_browser)
593 { 539 {
594 combo->add(server, LLSD(domain_name) ); 540 web_browser->setAlwaysRefresh(refresh);
595 combo->setCurrentByIndex(0);
596 } 541 }
597} 542}
598 543
599// static
600void LLPanelLogin::getFields(LLString &firstname, LLString &lastname, LLString &password,
601 BOOL &remember)
602{
603 if (!sInstance)
604 {
605 llwarns << "Attempted getFields with no login view shown" << llendl;
606 return;
607 }
608 544
609 firstname = sInstance->childGetText("first_name_edit");
610 LLString::trim(firstname);
611 545
612 lastname = sInstance->childGetText("last_name_edit"); 546void LLPanelLogin::loadLoginPage()
613 LLString::trim(lastname); 547{
548 if (!sInstance) return;
614 549
615 password = sInstance->mMungedPassword; 550 LLURLSimString::sInstance.parse();
616 remember = sInstance->childGetValue("remember_check");
617}
618 551
552 LLWebBrowserCtrl* web_browser = LLUICtrlFactory::getWebBrowserCtrlByName(sInstance, "login_html");
619 553
620// static. Return TRUE if user made a choice from the popup 554 std::ostringstream oStr;
621BOOL LLPanelLogin::getServer(LLString &server, S32 &domain_name) 555
622{ 556 LLString location;
623 BOOL user_picked = FALSE; 557 LLString region;
624 if (!sInstance) 558 LLString password;
625 { 559
626 llwarns << "Attempted getServer with no login view shown" << llendl; 560 if (LLURLSimString::parse())
561 {
562 std::ostringstream oRegionStr;
563 location = "specify";
564 oRegionStr << LLURLSimString::sInstance.mSimName << "/" << LLURLSimString::sInstance.mX << "/"
565 << LLURLSimString::sInstance.mY << "/"
566 << LLURLSimString::sInstance.mZ;
567 region = oRegionStr.str();
627 } 568 }
628 else 569 else
629 { 570 {
630 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo"); 571 if (gSavedSettings.getBOOL("LoginLastLocation"))
631 if (combo)
632 { 572 {
633 LLSD combo_val = combo->getValue(); 573 location = "last";
634 if (LLSD::TypeInteger == combo_val.type()) 574 }
635 { 575 else
636 domain_name = combo->getValue().asInteger(); 576 {
637 577 location = "home";
638 if ((S32)USERSERVER_OTHER == domain_name)
639 {
640 server = gUserServerName;
641 }
642 }
643 else
644 {
645 // no valid selection, return other
646 domain_name = (S32)USERSERVER_OTHER;
647 server = combo_val.asString();
648 }
649 user_picked = combo->isDirty();
650 } 578 }
651 } 579 }
652 580
653 return user_picked; 581 LLString firstname, lastname;
654} 582
655 583 if (gCmdLineFirstName.empty())
656// static
657void LLPanelLogin::getLocation(LLString &location)
658{
659 if (!sInstance)
660 { 584 {
661 llwarns << "Attempted getLocation with no login view shown" << llendl; 585 firstname = gSavedSettings.getString("FirstName");
662 return;
663 } 586 }
664 587 else
665 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo");
666 if (combo)
667 { 588 {
668 location = combo->getValue().asString(); 589 firstname = gCmdLineFirstName;
669 } 590 }
670} 591
671 592 if (gCmdLineLastName.empty())
672// static
673void LLPanelLogin::refreshLocation( bool force_visible )
674{
675 if (!sInstance) return;
676
677 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "start_location_combo");
678 if (!combo) return;
679
680 LLString sim_string = LLURLSimString::sInstance.mSimString;
681 if (!sim_string.empty())
682 { 593 {
683 combo->setCurrentByIndex( 3 ); // BUG? Maybe 2? 594 lastname = gSavedSettings.getString("LastName");
684 combo->setTextEntry(sim_string);
685 } 595 }
686 else 596 else
687 { 597 {
688 BOOL login_last = gSavedSettings.getBOOL("LoginLastLocation"); 598 lastname = gCmdLineLastName;
689 combo->setCurrentByIndex( login_last ? 1 : 0 );
690 } 599 }
600
601 LLString version = llformat("%d.%d.%d (%d)",
602 LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD);
691 603
692 BOOL show_start = TRUE; 604 char* curl_region = curl_escape(region.c_str(), 0);
605 char* curl_channel = curl_escape(gChannelName.c_str(), 0);
606 char* curl_version = curl_escape(version.c_str(), 0);
693 607
694 if ( ! force_visible ) 608
695 show_start = gSavedSettings.getBOOL("ShowStartLocation"); 609 oStr << sInstance->childGetValue( "real_url" ).asString() << "&firstname=" << firstname <<
610 "&lastname=" << lastname << "&location=" << location << "&region=" << curl_region <<
611 "&grid=" << gGridInfo[gGridChoice].mLabel << "&channel=" << curl_channel <<
612 "&version=" << curl_version;
696 613
697 sInstance->childSetVisible("start_location_combo", show_start); 614
698 sInstance->childSetVisible("start_location_text", show_start); 615 curl_free(curl_region);
699} 616 curl_free(curl_channel);
617 curl_free(curl_version);
700 618
701// static 619 LLString language(gSavedSettings.getString("Language"));
702void LLPanelLogin::close() 620 if(language == "default")
703{
704 if (sInstance)
705 { 621 {
706 gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); 622 language = gSavedSettings.getString("SystemLanguage");
707
708 gFocusMgr.setDefaultKeyboardFocus(NULL);
709
710 delete sInstance;
711 sInstance = NULL;
712 } 623 }
713}
714
715 624
716//--------------------------------------------------------------------------- 625 oStr << "&lang=" << language;
717// Protected methods
718//---------------------------------------------------------------------------
719 626
720// static 627 if (!gCmdLinePassword.empty())
721void LLPanelLogin::onClickConnect(void *)
722{
723 if (sInstance && sInstance->mCallback)
724 { 628 {
725 // tell the responder we're not here anymore 629 oStr << "&password=" << gCmdLinePassword;
726 if ( gResponsePtr )
727 gResponsePtr->setParent( 0 );
728
729 // JC - Make sure the fields all get committed.
730 sInstance->setFocus(FALSE);
731
732 LLString first = sInstance->childGetText("first_name_edit");
733 LLString last = sInstance->childGetText("last_name_edit");
734 if (!first.empty() && !last.empty())
735 {
736 // has both first and last name typed
737
738 // store off custom server entry, if currently selected
739 LLComboBox* combo = LLUICtrlFactory::getComboBoxByName(sInstance, "server_combo");
740 if (combo)
741 {
742 S32 selected_server = combo->getValue();
743 if (selected_server == USERSERVER_NONE)
744 {
745 LLString custom_server = combo->getValue().asString();
746 gSavedSettings.setString("CustomServer", custom_server);
747 }
748 }
749 sInstance->mCallback(0, sInstance->mCallbackData);
750 }
751 else
752 {
753 // empty first or last name
754 // same as clicking new account
755 onClickNewAccount(NULL);
756 }
757 } 630 }
758} 631 else if (!(password = load_password_from_disk()).empty())
759
760
761// static
762void LLPanelLogin::newAccountAlertCallback(S32 option, void*)
763{
764 if (0 == option)
765 { 632 {
766 llinfos << "Going to account creation URL" << llendl; 633 oStr << "&password=$1$" << password;
767 LLWeb::loadURL( CREATE_ACCOUNT_URL );
768 } 634 }
769 else 635 if (gAutoLogin)
770 { 636 {
771 sInstance->setFocus(TRUE); 637 oStr << "&auto_login=TRUE";
772 } 638 }
773} 639 if (gSavedSettings.getBOOL("ShowStartLocation"))
774
775
776// static
777void LLPanelLogin::onClickNewAccount(void*)
778{
779 if (gHideLinks)
780 { 640 {
781 gViewerWindow->alertXml("MustHaveAccountToLogInNoLinks"); 641 oStr << "&show_start_location=TRUE";
782 } 642 }
783 else 643 if (gSavedSettings.getBOOL("RememberPassword"))
784 { 644 {
785 gViewerWindow->alertXml("MustHaveAccountToLogIn", 645 oStr << "&remember_password=TRUE";
786 LLPanelLogin::newAccountAlertCallback); 646 }
787 } 647#ifndef LL_RELEASE_FOR_DOWNLOAD
648 oStr << "&show_grid=TRUE";
649#else
650 if (gSavedSettings.getBOOL("ForceShowGrid"))
651 oStr << "&show_grid=TRUE";
652#endif
653
654 // navigate to the "real" page
655 web_browser->navigateTo( oStr.str() );
788} 656}
789 657
790 658
659//---------------------------------------------------------------------------
660// Protected methods
661//---------------------------------------------------------------------------
662
791// static 663// static
792void LLPanelLogin::onClickQuit(void*) 664void LLPanelLogin::onClickQuit(void*)
793{ 665{
@@ -807,13 +679,3 @@ void LLPanelLogin::onClickVersion(void*)
807{ 679{
808 LLFloaterAbout::show(NULL); 680 LLFloaterAbout::show(NULL);
809} 681}
810
811// static
812void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
813{
814 if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
815 {
816 LLNotifyBox::showXml("CapsKeyOn");
817 sCapslockDidNotification = TRUE;
818 }
819}
diff --git a/linden/indra/newview/llpanellogin.h b/linden/indra/newview/llpanellogin.h
index 94e746e..191e88c 100644
--- a/linden/indra/newview/llpanellogin.h
+++ b/linden/indra/newview/llpanellogin.h
@@ -33,7 +33,7 @@
33#define LL_LLPANELLOGIN_H 33#define LL_LLPANELLOGIN_H
34 34
35#include "llpanel.h" 35#include "llpanel.h"
36 36#include "llcommandhandler.h"
37#include "lldbstrings.h" 37#include "lldbstrings.h"
38#include "llmemory.h" 38#include "llmemory.h"
39#include "llviewerimage.h" 39#include "llviewerimage.h"
@@ -46,6 +46,22 @@ class LLCheckBoxCtrl;
46class LLButton; 46class LLButton;
47class LLComboBox; 47class LLComboBox;
48 48
49
50class LLLoginHandler : public LLCommandHandler
51{
52 public:
53 LLLoginHandler() : LLCommandHandler("login") { }
54 bool handle(const LLSD& tokens, const LLSD& queryMap);
55 bool parseDirectLogin(std::string url);
56 void parse(const LLSD& queryMap);
57
58 LLUUID mWebLoginKey;
59 LLString mFirstName;
60 LLString mLastName;
61};
62
63extern LLLoginHandler gLoginHandler;
64
49class LLPanelLogin 65class LLPanelLogin
50: public LLPanel 66: public LLPanel
51{ 67{
@@ -57,50 +73,30 @@ public:
57 73
58 virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent); 74 virtual BOOL handleKeyHere(KEY key, MASK mask, BOOL called_from_parent);
59 virtual void draw(); 75 virtual void draw();
60 virtual void setFocus( BOOL b );
61 76
62 static void show(const LLRect &rect, BOOL show_server, 77 static void show(const LLRect &rect, BOOL show_server,
63 void (*callback)(S32 option, void* user_data), 78 void (*callback)(S32 option, void* user_data),
64 void* callback_data); 79 void* callback_data);
65 80
66 static void setFields(const std::string& firstname, const std::string& lastname,
67 const std::string& password, BOOL remember);
68
69 static void addServer(const char *server, S32 domain_name);
70 static void refreshLocation( bool force_visible );
71
72 static void getFields(LLString &firstname, LLString &lastname,
73 LLString &password, BOOL &remember);
74
75 static BOOL getServer(LLString &server, S32& domain_name);
76 static void getLocation(LLString &location);
77
78 static void close(); 81 static void close();
79 82
80 void setSiteIsAlive( bool alive ); 83 void setSiteIsAlive( bool alive );
81 84
82 static void giveFocus(); 85 static void loadLoginPage();
83 static void mungePassword(LLUICtrl* caller, void* user_data); 86 static void giveFocus();
84 87 static void setAlwaysRefresh(bool refresh);
88
85private: 89private:
86 static void onClickConnect(void*);
87 static void onClickNewAccount(void*);
88 static void newAccountAlertCallback(S32 option, void*);
89 static void onClickQuit(void*); 90 static void onClickQuit(void*);
90 static void onClickVersion(void*); 91 static void onClickVersion(void*);
91 static void onPassKey(LLLineEditor* caller, void* user_data); 92
92
93private: 93private:
94 LLPointer<LLViewerImage> mLogoImage; 94 LLPointer<LLViewerImage> mLogoImage;
95 95
96 void (*mCallback)(S32 option, void *userdata); 96 void (*mCallback)(S32 option, void *userdata);
97 void* mCallbackData; 97 void* mCallbackData;
98 98
99 std::string mIncomingPassword;
100 std::string mMungedPassword;
101
102 static LLPanelLogin* sInstance; 99 static LLPanelLogin* sInstance;
103 static BOOL sCapslockDidNotification;
104 BOOL mHtmlAvailable; 100 BOOL mHtmlAvailable;
105}; 101};
106 102
diff --git a/linden/indra/newview/llpanelobject.cpp b/linden/indra/newview/llpanelobject.cpp
index cf50709..c3d949d 100644
--- a/linden/indra/newview/llpanelobject.cpp
+++ b/linden/indra/newview/llpanelobject.cpp
@@ -68,7 +68,7 @@
68#include "llvovolume.h" 68#include "llvovolume.h"
69#include "llworld.h" 69#include "llworld.h"
70#include "pipeline.h" 70#include "pipeline.h"
71#include "viewer.h" 71#include "llviewercontrol.h"
72#include "llvieweruictrlfactory.h" 72#include "llvieweruictrlfactory.h"
73#include "llfirstuse.h" 73#include "llfirstuse.h"
74 74
diff --git a/linden/indra/newview/llpanelvolume.cpp b/linden/indra/newview/llpanelvolume.cpp
index 69e0fde..c288c6a 100644
--- a/linden/indra/newview/llpanelvolume.cpp
+++ b/linden/indra/newview/llpanelvolume.cpp
@@ -72,7 +72,6 @@
72#include "llvovolume.h" 72#include "llvovolume.h"
73#include "llworld.h" 73#include "llworld.h"
74#include "pipeline.h" 74#include "pipeline.h"
75#include "viewer.h"
76 75
77#include "lldrawpool.h" 76#include "lldrawpool.h"
78#include "llvieweruictrlfactory.h" 77#include "llvieweruictrlfactory.h"
diff --git a/linden/indra/newview/llprefsvoice.cpp b/linden/indra/newview/llprefsvoice.cpp
index 59619d6..9ad7149 100644
--- a/linden/indra/newview/llprefsvoice.cpp
+++ b/linden/indra/newview/llprefsvoice.cpp
@@ -45,7 +45,7 @@
45#include "llfocusmgr.h" 45#include "llfocusmgr.h"
46#include "llfloatervoicewizard.h" 46#include "llfloatervoicewizard.h"
47 47
48#include "viewer.h" 48#include "llappviewer.h"
49 49
50#include "llvoiceclient.h" 50#include "llvoiceclient.h"
51 51
diff --git a/linden/indra/newview/llpreviewgesture.cpp b/linden/indra/newview/llpreviewgesture.cpp
index 720963c..051e328 100644
--- a/linden/indra/newview/llpreviewgesture.cpp
+++ b/linden/indra/newview/llpreviewgesture.cpp
@@ -65,7 +65,7 @@
65#include "llviewerregion.h" 65#include "llviewerregion.h"
66#include "llviewerstats.h" 66#include "llviewerstats.h"
67#include "llviewerwindow.h" // busycount 67#include "llviewerwindow.h" // busycount
68#include "viewer.h" // gVFS 68#include "llappviewer.h" // gVFS
69 69
70#include "llresmgr.h" 70#include "llresmgr.h"
71 71
@@ -342,7 +342,7 @@ void LLPreviewGesture::handleSaveChangesDialog(S32 option, void* data)
342 case 2: // "Cancel" 342 case 2: // "Cancel"
343 default: 343 default:
344 // If we were quitting, we didn't really mean it. 344 // If we were quitting, we didn't really mean it.
345 app_abort_quit(); 345 LLAppViewer::instance()->abortQuit();
346 break; 346 break;
347 } 347 }
348} 348}
diff --git a/linden/indra/newview/llpreviewlandmark.cpp b/linden/indra/newview/llpreviewlandmark.cpp
index 2d20fd5..461f7d4 100644
--- a/linden/indra/newview/llpreviewlandmark.cpp
+++ b/linden/indra/newview/llpreviewlandmark.cpp
@@ -56,7 +56,6 @@
56#include "llviewercontrol.h" 56#include "llviewercontrol.h"
57#include "llviewerregion.h" 57#include "llviewerregion.h"
58#include "llviewerstats.h" 58#include "llviewerstats.h"
59#include "viewer.h"
60#include "llvieweruictrlfactory.h" 59#include "llvieweruictrlfactory.h"
61 60
62 61
diff --git a/linden/indra/newview/llpreviewnotecard.cpp b/linden/indra/newview/llpreviewnotecard.cpp
index 620be8f..dc56494 100644
--- a/linden/indra/newview/llpreviewnotecard.cpp
+++ b/linden/indra/newview/llpreviewnotecard.cpp
@@ -55,7 +55,8 @@
55#include "lldir.h" 55#include "lldir.h"
56//#include "llfloaterchat.h" 56//#include "llfloaterchat.h"
57#include "llviewerstats.h" 57#include "llviewerstats.h"
58#include "viewer.h" // app_abort_quit() 58#include "llviewercontrol.h" // gSavedSettings
59#include "llappviewer.h" // app_abort_quit()
59#include "lllineeditor.h" 60#include "lllineeditor.h"
60#include "llvieweruictrlfactory.h" 61#include "llvieweruictrlfactory.h"
61 62
@@ -636,7 +637,7 @@ void LLPreviewNotecard::handleSaveChangesDialog(S32 option, void* userdata)
636 case 2: // "Cancel" 637 case 2: // "Cancel"
637 default: 638 default:
638 // If we were quitting, we didn't really mean it. 639 // If we were quitting, we didn't really mean it.
639 app_abort_quit(); 640 LLAppViewer::instance()->abortQuit();
640 break; 641 break;
641 } 642 }
642} 643}
diff --git a/linden/indra/newview/llpreviewscript.cpp b/linden/indra/newview/llpreviewscript.cpp
index 7eac589..6c37700 100644
--- a/linden/indra/newview/llpreviewscript.cpp
+++ b/linden/indra/newview/llpreviewscript.cpp
@@ -72,7 +72,6 @@
72#include "llscrolllistctrl.h" 72#include "llscrolllistctrl.h"
73#include "lltextbox.h" 73#include "lltextbox.h"
74#include "llslider.h" 74#include "llslider.h"
75#include "viewer.h"
76#include "lldir.h" 75#include "lldir.h"
77#include "llcombobox.h" 76#include "llcombobox.h"
78//#include "llfloaterchat.h" 77//#include "llfloaterchat.h"
@@ -83,7 +82,8 @@
83#include "llwebbrowserctrl.h" 82#include "llwebbrowserctrl.h"
84#include "lluictrlfactory.h" 83#include "lluictrlfactory.h"
85 84
86#include "viewer.h" 85#include "llviewercontrol.h"
86#include "llappviewer.h"
87 87
88#include "llpanelinventory.h" 88#include "llpanelinventory.h"
89 89
@@ -629,7 +629,7 @@ void LLScriptEdCore::handleSaveChangesDialog( S32 option, void* userdata )
629 case 2: // "Cancel" 629 case 2: // "Cancel"
630 default: 630 default:
631 // If we were quitting, we didn't really mean it. 631 // If we were quitting, we didn't really mean it.
632 app_abort_quit(); 632 LLAppViewer::instance()->abortQuit();
633 break; 633 break;
634 } 634 }
635} 635}
diff --git a/linden/indra/newview/llprogressview.cpp b/linden/indra/newview/llprogressview.cpp
index d855f75..cc9c3fa 100644
--- a/linden/indra/newview/llprogressview.cpp
+++ b/linden/indra/newview/llprogressview.cpp
@@ -49,7 +49,7 @@
49#include "llviewercontrol.h" 49#include "llviewercontrol.h"
50#include "llviewerimagelist.h" 50#include "llviewerimagelist.h"
51#include "llviewerwindow.h" 51#include "llviewerwindow.h"
52#include "viewer.h" 52#include "llappviewer.h"
53 53
54LLProgressView* LLProgressView::sInstance = NULL; 54LLProgressView* LLProgressView::sInstance = NULL;
55 55
@@ -127,7 +127,7 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask, BOOL called_from_parent)
127 // Suck up all keystokes except CTRL-Q. 127 // Suck up all keystokes except CTRL-Q.
128 if( ('Q' == key) && (MASK_CONTROL == mask) ) 128 if( ('Q' == key) && (MASK_CONTROL == mask) )
129 { 129 {
130 app_user_quit(); 130 LLAppViewer::instance()->userQuit();
131 } 131 }
132 return TRUE; 132 return TRUE;
133 } 133 }
@@ -228,7 +228,7 @@ void LLProgressView::draw()
228 F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); 228 F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
229 // background_color.mV[3] = background_color.mV[3]*alpha; 229 // background_color.mV[3] = background_color.mV[3]*alpha;
230 230
231 LLString top_line = gSecondLife; 231 LLString top_line = LLAppViewer::instance()->getSecondLifeTitle();
232 232
233 font->renderUTF8(top_line, 0, 233 font->renderUTF8(top_line, 0,
234 line_x, line_one_y, 234 line_x, line_one_y,
@@ -338,7 +338,7 @@ void LLProgressView::onCancelButtonClicked(void*)
338{ 338{
339 if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE) 339 if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
340 { 340 {
341 app_request_quit(); 341 LLAppViewer::instance()->requestQuit();
342 } 342 }
343 else 343 else
344 { 344 {
diff --git a/linden/indra/newview/llsky.cpp b/linden/indra/newview/llsky.cpp
index eadac8a..ee3890e 100644
--- a/linden/indra/newview/llsky.cpp
+++ b/linden/indra/newview/llsky.cpp
@@ -64,6 +64,7 @@ extern LLPipeline gPipeline;
64F32 azimuth_from_vector(const LLVector3 &v); 64F32 azimuth_from_vector(const LLVector3 &v);
65F32 elevation_from_vector(const LLVector3 &v); 65F32 elevation_from_vector(const LLVector3 &v);
66 66
67LLSky gSky;
67// ---------------- LLSky ---------------- 68// ---------------- LLSky ----------------
68 69
69////////////////////////////////////////////////////////////////////// 70//////////////////////////////////////////////////////////////////////
diff --git a/linden/indra/newview/llspatialpartition.cpp b/linden/indra/newview/llspatialpartition.cpp
index 6cd1ace..abb8d97 100644
--- a/linden/indra/newview/llspatialpartition.cpp
+++ b/linden/indra/newview/llspatialpartition.cpp
@@ -38,7 +38,7 @@
38#include "llvovolume.h" 38#include "llvovolume.h"
39#include "llviewercamera.h" 39#include "llviewercamera.h"
40#include "llface.h" 40#include "llface.h"
41#include "viewer.h" 41#include "llviewercontrol.h"
42#include "llagent.h" 42#include "llagent.h"
43#include "llviewerregion.h" 43#include "llviewerregion.h"
44#include "llcamera.h" 44#include "llcamera.h"
diff --git a/linden/indra/newview/llsprite.cpp b/linden/indra/newview/llsprite.cpp
index 332a5aa..827493d 100644
--- a/linden/indra/newview/llsprite.cpp
+++ b/linden/indra/newview/llsprite.cpp
@@ -48,7 +48,6 @@
48#include "llface.h" 48#include "llface.h"
49#include "llviewercamera.h" 49#include "llviewercamera.h"
50#include "llviewerimagelist.h" 50#include "llviewerimagelist.h"
51#include "viewer.h"
52 51
53LLVector3 LLSprite::sCameraUp(0.0f,0.0f,1.0f); 52LLVector3 LLSprite::sCameraUp(0.0f,0.0f,1.0f);
54LLVector3 LLSprite::sCameraRight(1.0f,0.0f,0.0f); 53LLVector3 LLSprite::sCameraRight(1.0f,0.0f,0.0f);
diff --git a/linden/indra/newview/llstartup.cpp b/linden/indra/newview/llstartup.cpp
index dad8046..6c37341 100644
--- a/linden/indra/newview/llstartup.cpp
+++ b/linden/indra/newview/llstartup.cpp
@@ -134,6 +134,7 @@
134#include "llurlsimstring.h" 134#include "llurlsimstring.h"
135#include "llurlwhitelist.h" 135#include "llurlwhitelist.h"
136#include "lluserauth.h" 136#include "lluserauth.h"
137#include "llvieweraudio.h"
137#include "llviewerassetstorage.h" 138#include "llviewerassetstorage.h"
138#include "llviewercamera.h" 139#include "llviewercamera.h"
139#include "llviewerdisplay.h" 140#include "llviewerdisplay.h"
@@ -155,12 +156,16 @@
155#include "llworldmap.h" 156#include "llworldmap.h"
156#include "llxfermanager.h" 157#include "llxfermanager.h"
157#include "pipeline.h" 158#include "pipeline.h"
158#include "viewer.h" 159#include "llappviewer.h"
159#include "llmediaengine.h" 160#include "llmediaengine.h"
160#include "llfasttimerview.h" 161#include "llfasttimerview.h"
161#include "llfloatermap.h" 162#include "llfloatermap.h"
162#include "llweb.h" 163#include "llweb.h"
163#include "llvoiceclient.h" 164#include "llvoiceclient.h"
165#include "llnamelistctrl.h"
166#include "llnamebox.h"
167#include "llnameeditor.h"
168#include "llurlsimstring.h"
164 169
165#if LL_LIBXUL_ENABLED 170#if LL_LIBXUL_ENABLED
166#include "llmozlib.h" 171#include "llmozlib.h"
@@ -186,13 +191,7 @@
186// 191//
187// exported globals 192// exported globals
188// 193//
189 194BOOL gAgentMovementCompleted = FALSE;
190// HACK: Allow server to change sun and moon IDs.
191// I can't figure out how to pass the appropriate
192// information into the LLVOSky constructor. JC
193LLUUID gSunTextureID = IMG_SUN;
194LLUUID gMoonTextureID = IMG_MOON;
195LLUUID gCloudTextureID = IMG_CLOUD_POOF;
196 195
197const char* SCREEN_HOME_FILENAME = "screen_home.bmp"; 196const char* SCREEN_HOME_FILENAME = "screen_home.bmp";
198const char* SCREEN_LAST_FILENAME = "screen_last.bmp"; 197const char* SCREEN_LAST_FILENAME = "screen_last.bmp";
@@ -202,7 +201,6 @@ const char* SCREEN_LAST_FILENAME = "screen_last.bmp";
202// 201//
203extern S32 gStartImageWidth; 202extern S32 gStartImageWidth;
204extern S32 gStartImageHeight; 203extern S32 gStartImageHeight;
205extern std::string gSerialNumber;
206 204
207// 205//
208// local globals 206// local globals
@@ -250,6 +248,17 @@ void init_start_screen(S32 location_id);
250void release_start_screen(); 248void release_start_screen();
251void reset_login(); 249void reset_login();
252 250
251void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data)
252{
253 LLNameListCtrl::refreshAll(id, firstname, lastname, is_group);
254 LLNameBox::refreshAll(id, firstname, lastname, is_group);
255 LLNameEditor::refreshAll(id, firstname, lastname, is_group);
256
257 // TODO: Actually be intelligent about the refresh.
258 // For now, just brute force refresh the dialogs.
259 dialog_refresh_all();
260}
261
253// 262//
254// exported functionality 263// exported functionality
255// 264//
@@ -288,9 +297,9 @@ public:
288 297
289void update_texture_fetch() 298void update_texture_fetch()
290{ 299{
291 gTextureCache->update(1); // unpauses the texture cache thread 300 LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
292 gImageDecodeThread->update(1); // unpauses the image thread 301 LLAppViewer::getImageDecodeThread()->update(1); // unpauses the image thread
293 gTextureFetch->update(1); // unpauses the texture fetch thread 302 LLAppViewer::getTextureFetch()->update(1); // unpauses the texture fetch thread
294 gImageList.updateImages(0.10f); 303 gImageList.updateImages(0.10f);
295} 304}
296 305
@@ -320,6 +329,7 @@ BOOL idle_startup()
320 static std::string auth_message; 329 static std::string auth_message;
321 static LLString firstname; 330 static LLString firstname;
322 static LLString lastname; 331 static LLString lastname;
332 static LLUUID web_login_key;
323 static LLString password; 333 static LLString password;
324 static std::vector<const char*> requested_options; 334 static std::vector<const char*> requested_options;
325 335
@@ -339,7 +349,6 @@ BOOL idle_startup()
339 static S32 location_which = START_LOCATION_ID_LAST; 349 static S32 location_which = START_LOCATION_ID_LAST;
340 350
341 static BOOL show_connect_box = TRUE; 351 static BOOL show_connect_box = TRUE;
342 static BOOL remember_password = TRUE;
343 352
344 static BOOL stipend_since_login = FALSE; 353 static BOOL stipend_since_login = FALSE;
345 354
@@ -372,7 +381,7 @@ BOOL idle_startup()
372 381
373 ///////////////////////////////////////////////// 382 /////////////////////////////////////////////////
374 // 383 //
375 // Initialize stuff that doesn't need data from userserver/simulators 384 // Initialize stuff that doesn't need data from simulators
376 // 385 //
377 386
378 if (gFeatureManagerp->isSafe()) 387 if (gFeatureManagerp->isSafe())
@@ -412,7 +421,7 @@ BOOL idle_startup()
412 // *TODO:translate (maybe - very unlikely error message) 421 // *TODO:translate (maybe - very unlikely error message)
413 // Note: alerts.xml may be invalid - if this gets translated it will need to be in the code 422 // Note: alerts.xml may be invalid - if this gets translated it will need to be in the code
414 LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com."; 423 LLString bad_xui_msg = "An error occured while updating Second Life. Please download the latest version from www.secondlife.com.";
415 app_early_exit(bad_xui_msg); 424 LLAppViewer::instance()->earlyExit(bad_xui_msg);
416 } 425 }
417 // 426 //
418 // Statistics stuff 427 // Statistics stuff
@@ -465,13 +474,13 @@ BOOL idle_startup()
465 std::string())) 474 std::string()))
466 { 475 {
467 std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode()); 476 std::string msg = llformat("Unable to start networking, error %d", gMessageSystem->getErrorCode());
468 app_early_exit(msg); 477 LLAppViewer::instance()->earlyExit(msg);
469 } 478 }
470 LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); 479 LLMessageConfig::initClass("viewer", gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
471 } 480 }
472 else 481 else
473 { 482 {
474 app_early_exit("Unable to initialize communications."); 483 LLAppViewer::instance()->earlyExit("Unable to initialize communications.");
475 } 484 }
476 485
477 if(gMessageSystem && gMessageSystem->isOK()) 486 if(gMessageSystem && gMessageSystem->isOK())
@@ -625,37 +634,42 @@ BOOL idle_startup()
625 // 634 //
626 // Log on to system 635 // Log on to system
627 // 636 //
628 if( !gCmdLineFirstName.empty() 637 if ((!gLoginHandler.mFirstName.empty() &&
638 !gLoginHandler.mLastName.empty() &&
639 !gLoginHandler.mWebLoginKey.isNull())
640 || gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand) )
641 {
642 firstname = gLoginHandler.mFirstName;
643 lastname = gLoginHandler.mLastName;
644 web_login_key = gLoginHandler.mWebLoginKey;
645
646 show_connect_box = FALSE;
647 }
648 else if( !gCmdLineFirstName.empty()
629 && !gCmdLineLastName.empty() 649 && !gCmdLineLastName.empty()
630 && !gCmdLinePassword.empty()) 650 && !gCmdLinePassword.empty())
631 { 651 {
632 firstname = gCmdLineFirstName; 652 firstname = gCmdLineFirstName;
633 lastname = gCmdLineLastName; 653 lastname = gCmdLineLastName;
634 654
635 LLMD5 pass((unsigned char*)gCmdLinePassword.c_str()); 655 show_connect_box = TRUE;
636 char md5pass[33]; /* Flawfinder: ignore */ 656 gAutoLogin = TRUE;
637 pass.hex_digest(md5pass);
638 password = md5pass;
639
640 remember_password = gSavedSettings.getBOOL("RememberPassword");
641 show_connect_box = FALSE;
642 } 657 }
643 else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin")) 658 else if (gAutoLogin || gSavedSettings.getBOOL("AutoLogin"))
644 { 659 {
645 firstname = gSavedSettings.getString("FirstName"); 660 firstname = gSavedSettings.getString("FirstName");
646 lastname = gSavedSettings.getString("LastName"); 661 lastname = gSavedSettings.getString("LastName");
647 password = load_password_from_disk(); 662 password = load_password_from_disk();
648 remember_password = TRUE; 663 gSavedSettings.setBOOL("RememberPassword", TRUE);
649 show_connect_box = FALSE; 664 show_connect_box = TRUE;
650 } 665 }
651 else 666 else
652 { 667 {
653 // if not automatically logging in, display login dialog 668 // if not automatically logging in, display login dialog
654 // until a valid userserver is selected 669 // a valid grid is selected
655 firstname = gSavedSettings.getString("FirstName"); 670 firstname = gSavedSettings.getString("FirstName");
656 lastname = gSavedSettings.getString("LastName"); 671 lastname = gSavedSettings.getString("LastName");
657 password = load_password_from_disk(); 672 password = load_password_from_disk();
658 remember_password = gSavedSettings.getBOOL("RememberPassword");
659 show_connect_box = TRUE; 673 show_connect_box = TRUE;
660 } 674 }
661 675
@@ -665,7 +679,8 @@ BOOL idle_startup()
665 } 679 }
666 680
667 if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) 681 if (STATE_LOGIN_SHOW == LLStartUp::getStartupState())
668 { 682 {
683
669 llinfos << "Initializing Window" << llendl; 684 llinfos << "Initializing Window" << llendl;
670 685
671 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); 686 gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW);
@@ -686,8 +701,6 @@ BOOL idle_startup()
686 // Show the login dialog 701 // Show the login dialog
687 login_show(); 702 login_show();
688 703
689 // connect dialog is already shown, so fill in the names
690 LLPanelLogin::setFields( firstname, lastname, password, remember_password );
691 LLPanelLogin::giveFocus(); 704 LLPanelLogin::giveFocus();
692 705
693 gSavedSettings.setBOOL("FirstRunThisInstall", FALSE); 706 gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
@@ -699,6 +712,32 @@ BOOL idle_startup()
699 // skip directly to message template verification 712 // skip directly to message template verification
700 LLStartUp::setStartupState( STATE_LOGIN_CLEANUP ); 713 LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
701 } 714 }
715
716 // Create selection manager
717 // Must be done before menus created, because many enabled callbacks
718 // require its existance.
719 gSelectMgr = new LLSelectMgr();
720 gParcelMgr = new LLViewerParcelMgr();
721 gHUDManager = new LLHUDManager();
722 gMuteListp = new LLMuteList();
723
724 // Initialize UI
725 if (!gNoRender)
726 {
727 // Initialize all our tools. Must be done after saved settings loaded.
728 if ( gToolMgr == NULL )
729 {
730 gToolMgr = new LLToolMgr();
731 gToolMgr->initTools();
732 }
733
734 // Quickly get something onscreen to look at.
735 gViewerWindow->initWorldUI();
736 }
737
738 gViewerWindow->setNormalControlsVisible( FALSE );
739 gLoginMenuBarView->setVisible( TRUE );
740 gLoginMenuBarView->setEnabled( TRUE );
702 741
703 timeout.reset(); 742 timeout.reset();
704 return do_normal_idle; 743 return do_normal_idle;
@@ -716,11 +755,16 @@ BOOL idle_startup()
716 755
717 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) 756 if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState())
718 { 757 {
758 //reset the values that could have come in from a slurl
759 if (!gLoginHandler.mWebLoginKey.isNull())
760 {
761 firstname = gLoginHandler.mFirstName;
762 lastname = gLoginHandler.mLastName;
763 web_login_key = gLoginHandler.mWebLoginKey;
764 }
765
719 if (show_connect_box) 766 if (show_connect_box)
720 { 767 {
721 // Load all the name information out of the login view
722 LLPanelLogin::getFields(firstname, lastname, password, remember_password);
723
724 // HACK: Try to make not jump on login 768 // HACK: Try to make not jump on login
725 gKeyboard->resetKeys(); 769 gKeyboard->resetKeys();
726 } 770 }
@@ -730,12 +774,11 @@ BOOL idle_startup()
730 gSavedSettings.setString("FirstName", firstname); 774 gSavedSettings.setString("FirstName", firstname);
731 gSavedSettings.setString("LastName", lastname); 775 gSavedSettings.setString("LastName", lastname);
732 776
777
778
779
733 llinfos << "Attempting login as: " << firstname << " " << lastname << llendl; 780 llinfos << "Attempting login as: " << firstname << " " << lastname << llendl;
734 write_debug("Attempting login as: "); 781 gDebugInfo["LoginName"] = firstname + " " + lastname;
735 write_debug(firstname);
736 write_debug(" ");
737 write_debug(lastname);
738 write_debug("\n");
739 } 782 }
740 783
741 // create necessary directories 784 // create necessary directories
@@ -780,28 +823,10 @@ BOOL idle_startup()
780 823
781 if (show_connect_box) 824 if (show_connect_box)
782 { 825 {
783 LLString server_label;
784 S32 domain_name_index;
785 BOOL user_picked_server = LLPanelLogin::getServer( server_label, domain_name_index );
786 gUserServerChoice = (EUserServerDomain) domain_name_index;
787 gSavedSettings.setS32("ServerChoice", gUserServerChoice);
788 if (gUserServerChoice == USERSERVER_OTHER)
789 {
790 snprintf(gUserServerName, MAX_STRING, "%s", server_label.c_str()); /* Flawfinder: ignore */
791 }
792
793 if ( user_picked_server )
794 { // User picked a grid from the popup, so clear the stored urls and they will be re-generated from gUserServerChoice
795 sAuthUris.clear();
796 resetURIs();
797 }
798
799 LLString location;
800 LLPanelLogin::getLocation( location );
801 LLURLSimString::setString( location );
802 LLPanelLogin::close(); 826 LLPanelLogin::close();
803 } 827 }
804 828
829
805 //For HTML parsing in text boxes. 830 //For HTML parsing in text boxes.
806 LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") ); 831 LLTextEditor::setLinkColor( gSavedSettings.getColor4("HTMLLinkColor") );
807 LLTextEditor::setURLCallbacks ( &LLWeb::loadURL, &LLURLDispatcher::dispatch, &LLURLDispatcher::dispatch ); 832 LLTextEditor::setURLCallbacks ( &LLWeb::loadURL, &LLURLDispatcher::dispatch, &LLURLDispatcher::dispatch );
@@ -871,6 +896,8 @@ BOOL idle_startup()
871 if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState()) 896 if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
872 { 897 {
873//#define LL_MINIMIAL_REQUESTED_OPTIONS 898//#define LL_MINIMIAL_REQUESTED_OPTIONS
899 gDebugInfo["GridUtilHost"] = gGridInfo[gGridChoice].mName;
900
874 lldebugs << "STATE_LOGIN_AUTH_INIT" << llendl; 901 lldebugs << "STATE_LOGIN_AUTH_INIT" << llendl;
875 if (!gUserAuthp) 902 if (!gUserAuthp)
876 { 903 {
@@ -906,14 +933,13 @@ BOOL idle_startup()
906 gSavedSettings.setBOOL("UseDebugMenus", TRUE); 933 gSavedSettings.setBOOL("UseDebugMenus", TRUE);
907 requested_options.push_back("god-connect"); 934 requested_options.push_back("god-connect");
908 } 935 }
909 if (sAuthUris.empty()) 936 LLAppViewer::instance()->getLoginURIs();
910 { 937 sAuthUris = LLAppViewer::instance()->getLoginURIs();
911 sAuthUris = getLoginURIs(); 938
912 }
913 sAuthUriNum = 0; 939 sAuthUriNum = 0;
914 auth_method = "login_to_simulator"; 940 auth_method = "login_to_simulator";
915 auth_desc = "Logging in. "; 941 auth_desc = "Logging in. ";
916 auth_desc += gSecondLife; 942 auth_desc += LLAppViewer::instance()->getSecondLifeTitle();
917 auth_desc += " may appear frozen. Please wait."; 943 auth_desc += " may appear frozen. Please wait.";
918 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE ); 944 LLStartUp::setStartupState( STATE_LOGIN_AUTHENTICATE );
919 } 945 }
@@ -931,11 +957,12 @@ BOOL idle_startup()
931 // a startup URL was specified 957 // a startup URL was specified
932 std::stringstream unescaped_start; 958 std::stringstream unescaped_start;
933 unescaped_start << "uri:" 959 unescaped_start << "uri:"
934 << LLURLSimString::sInstance.mSimName << "&" 960 << LLURLSimString::sInstance.mSimName << "&"
935 << LLURLSimString::sInstance.mX << "&" 961 << LLURLSimString::sInstance.mX << "&"
936 << LLURLSimString::sInstance.mY << "&" 962 << LLURLSimString::sInstance.mY << "&"
937 << LLURLSimString::sInstance.mZ; 963 << LLURLSimString::sInstance.mZ;
938 start << xml_escape_string(unescaped_start.str().c_str()); 964 start << xml_escape_string(unescaped_start.str().c_str());
965
939 } 966 }
940 else if (gSavedSettings.getBOOL("LoginLastLocation")) 967 else if (gSavedSettings.getBOOL("LoginLastLocation"))
941 { 968 {
@@ -951,13 +978,13 @@ BOOL idle_startup()
951 hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES ); 978 hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES );
952 hashed_mac.finalize(); 979 hashed_mac.finalize();
953 hashed_mac.hex_digest(hashed_mac_string); 980 hashed_mac.hex_digest(hashed_mac_string);
954 981
955 gUserAuthp->authenticate( 982 gUserAuthp->authenticate(
956 sAuthUris[sAuthUriNum].c_str(), 983 sAuthUris[sAuthUriNum].c_str(),
957 auth_method.c_str(), 984 auth_method.c_str(),
958 firstname.c_str(), 985 firstname.c_str(),
959 lastname.c_str(), 986 lastname.c_str(),
960 password.c_str(), 987 web_login_key,
961 start.str().c_str(), 988 start.str().c_str(),
962 gSkipOptionalUpdate, 989 gSkipOptionalUpdate,
963 gAcceptTOS, 990 gAcceptTOS,
@@ -966,7 +993,8 @@ BOOL idle_startup()
966 gLastExecFroze, 993 gLastExecFroze,
967 requested_options, 994 requested_options,
968 hashed_mac_string, 995 hashed_mac_string,
969 gSerialNumber); 996 LLAppViewer::instance()->getSerialNumber());
997
970 // reset globals 998 // reset globals
971 gAcceptTOS = FALSE; 999 gAcceptTOS = FALSE;
972 gAcceptCriticalMessage = FALSE; 1000 gAcceptCriticalMessage = FALSE;
@@ -977,6 +1005,10 @@ BOOL idle_startup()
977 if(STATE_LOGIN_NO_DATA_YET == LLStartUp::getStartupState()) 1005 if(STATE_LOGIN_NO_DATA_YET == LLStartUp::getStartupState())
978 { 1006 {
979 //lldebugs << "STATE_LOGIN_NO_DATA_YET" << llendl; 1007 //lldebugs << "STATE_LOGIN_NO_DATA_YET" << llendl;
1008 // If we get here we have gotten past the potential stall
1009 // in curl, so take "may appear frozen" out of progress bar. JC
1010 auth_desc = "Logging in...";
1011 set_startup_status(progress, auth_desc.c_str(), auth_message.c_str());
980 if (!gUserAuthp) 1012 if (!gUserAuthp)
981 { 1013 {
982 llerrs << "No userauth in STATE_LOGIN_NO_DATA_YET!" << llendl; 1014 llerrs << "No userauth in STATE_LOGIN_NO_DATA_YET!" << llendl;
@@ -1167,7 +1199,7 @@ BOOL idle_startup()
1167 default: 1199 default:
1168 if (sAuthUriNum >= (int) sAuthUris.size() - 1) 1200 if (sAuthUriNum >= (int) sAuthUris.size() - 1)
1169 { 1201 {
1170 emsg << "Unable to connect to " << gSecondLife << ".\n"; 1202 emsg << "Unable to connect to " << LLAppViewer::instance()->getSecondLifeTitle() << ".\n";
1171 emsg << gUserAuthp->errorMessage(); 1203 emsg << gUserAuthp->errorMessage();
1172 } else { 1204 } else {
1173 sAuthUriNum++; 1205 sAuthUriNum++;
@@ -1187,7 +1219,7 @@ BOOL idle_startup()
1187 { 1219 {
1188 delete gUserAuthp; 1220 delete gUserAuthp;
1189 gUserAuthp = NULL; 1221 gUserAuthp = NULL;
1190 app_force_quit(NULL); 1222 LLAppViewer::instance()->forceQuit();
1191 return FALSE; 1223 return FALSE;
1192 } 1224 }
1193 1225
@@ -1202,15 +1234,11 @@ BOOL idle_startup()
1202 const char* text; 1234 const char* text;
1203 text = gUserAuthp->getResponse("agent_id"); 1235 text = gUserAuthp->getResponse("agent_id");
1204 if(text) gAgentID.set(text); 1236 if(text) gAgentID.set(text);
1205 write_debug("AgentID: "); 1237 gDebugInfo["AgentID"] = text;
1206 write_debug(text);
1207 write_debug("\n");
1208 1238
1209 text = gUserAuthp->getResponse("session_id"); 1239 text = gUserAuthp->getResponse("session_id");
1210 if(text) gAgentSessionID.set(text); 1240 if(text) gAgentSessionID.set(text);
1211 write_debug("SessionID: "); 1241 gDebugInfo["SessionID"] = text;
1212 write_debug(text);
1213 write_debug("\n");
1214 1242
1215 text = gUserAuthp->getResponse("secure_session_id"); 1243 text = gUserAuthp->getResponse("secure_session_id");
1216 if(text) gAgent.mSecureSessionID.set(text); 1244 if(text) gAgent.mSecureSessionID.set(text);
@@ -1228,17 +1256,8 @@ BOOL idle_startup()
1228 if(text) lastname.assign(text); 1256 if(text) lastname.assign(text);
1229 gSavedSettings.setString("FirstName", firstname); 1257 gSavedSettings.setString("FirstName", firstname);
1230 gSavedSettings.setString("LastName", lastname); 1258 gSavedSettings.setString("LastName", lastname);
1231 if (remember_password) 1259
1232 {
1233 save_password_to_disk(password.c_str());
1234 }
1235 else
1236 {
1237 save_password_to_disk(NULL);
1238 }
1239 gSavedSettings.setBOOL("RememberPassword", remember_password);
1240 gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation")); 1260 gSavedSettings.setBOOL("LoginLastLocation", gSavedSettings.getBOOL("LoginLastLocation"));
1241 gSavedSettings.setBOOL("LoggedIn", TRUE);
1242 1261
1243 text = gUserAuthp->getResponse("agent_access"); 1262 text = gUserAuthp->getResponse("agent_access");
1244 if(text && (text[0] == 'M')) 1263 if(text && (text[0] == 'M'))
@@ -1463,14 +1482,6 @@ BOOL idle_startup()
1463 // type the name/password again if we crash. 1482 // type the name/password again if we crash.
1464 gSavedSettings.saveToFile(gSettingsFileName, TRUE); 1483 gSavedSettings.saveToFile(gSettingsFileName, TRUE);
1465 1484
1466 // Create selection manager
1467 // Must be done before menus created, because many enabled callbacks
1468 // require its existance.
1469 gSelectMgr = new LLSelectMgr();
1470 gParcelMgr = new LLViewerParcelMgr();
1471 gHUDManager = new LLHUDManager();
1472 gMuteListp = new LLMuteList();
1473
1474 // 1485 //
1475 // Initialize classes w/graphics stuff. 1486 // Initialize classes w/graphics stuff.
1476 // 1487 //
@@ -1539,21 +1550,14 @@ BOOL idle_startup()
1539 if ( gViewerWindow != NULL && gToolMgr != NULL ) 1550 if ( gViewerWindow != NULL && gToolMgr != NULL )
1540 { // This isn't the first logon attempt, so show the UI 1551 { // This isn't the first logon attempt, so show the UI
1541 gViewerWindow->setNormalControlsVisible( TRUE ); 1552 gViewerWindow->setNormalControlsVisible( TRUE );
1542 } 1553 }
1554 gLoginMenuBarView->setVisible( FALSE );
1555 gLoginMenuBarView->setEnabled( FALSE );
1556
1557 gFloaterMap->setVisible( gSavedSettings.getBOOL("ShowMiniMap") );
1543 1558
1544 // Initialize UI
1545 if (!gNoRender) 1559 if (!gNoRender)
1546 { 1560 {
1547 // Initialize all our tools. Must be done after saved settings loaded.
1548 if ( gToolMgr == NULL )
1549 {
1550 gToolMgr = new LLToolMgr();
1551 gToolMgr->initTools();
1552 }
1553
1554 // Quickly get something onscreen to look at.
1555 gViewerWindow->initWorldUI();
1556
1557 // Move the progress view in front of the UI 1561 // Move the progress view in front of the UI
1558 gViewerWindow->moveProgressViewToFront(); 1562 gViewerWindow->moveProgressViewToFront();
1559 1563
@@ -1587,7 +1591,7 @@ BOOL idle_startup()
1587 gCacheName->addObserver(callback_cache_name); 1591 gCacheName->addObserver(callback_cache_name);
1588 1592
1589 // Load stored cache if possible 1593 // Load stored cache if possible
1590 load_name_cache(); 1594 LLAppViewer::instance()->loadNameCache();
1591 } 1595 }
1592 1596
1593 // Data storage for map of world. 1597 // Data storage for map of world.
@@ -1985,22 +1989,8 @@ BOOL idle_startup()
1985 gAgent.sendReliableMessage(); 1989 gAgent.sendReliableMessage();
1986 1990
1987 // request all group information 1991 // request all group information
1988 // *FIX: This will not do the right thing if the message
1989 // gets there before the requestuserserverconnection
1990 // circuit is completed.
1991 gAgent.sendAgentDataUpdateRequest(); 1992 gAgent.sendAgentDataUpdateRequest();
1992 1993
1993
1994 // NOTE: removed as part of user-privacy
1995 // enhancements. this information should be available from
1996 // login. 2006-10-16 Phoenix.
1997 // get the users that have been granted modify powers
1998 //msg->newMessageFast(_PREHASH_RequestGrantedProxies);
1999 //msg->nextBlockFast(_PREHASH_AgentData);
2000 //msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
2001 //msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
2002 //gAgent.sendReliableMessage();
2003
2004 BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory"); 1994 BOOL shown_at_exit = gSavedSettings.getBOOL("ShowInventory");
2005 1995
2006 // Create the inventory views 1996 // Create the inventory views
@@ -2136,7 +2126,6 @@ BOOL idle_startup()
2136 //msg->setHandlerFuncFast(_PREHASH_AttachedSoundCutoffRadius, process_attached_sound_cutoff_radius); 2126 //msg->setHandlerFuncFast(_PREHASH_AttachedSoundCutoffRadius, process_attached_sound_cutoff_radius);
2137 2127
2138 llinfos << "Initialization complete" << llendl; 2128 llinfos << "Initialization complete" << llendl;
2139 gInitializationComplete = TRUE;
2140 2129
2141 gRenderStartTime.reset(); 2130 gRenderStartTime.reset();
2142 gForegroundTime.reset(); 2131 gForegroundTime.reset();
@@ -2169,17 +2158,17 @@ BOOL idle_startup()
2169 if (url_ok) 2158 if (url_ok)
2170 { 2159 {
2171 args["[TYPE]"] = "desired"; 2160 args["[TYPE]"] = "desired";
2172 args["[HELP]"] = " "; 2161 args["[HELP]"] = "";
2173 } 2162 }
2174 else if (gSavedSettings.getBOOL("LoginLastLocation")) 2163 else if (gSavedSettings.getBOOL("LoginLastLocation"))
2175 { 2164 {
2176 args["[TYPE]"] = "last"; 2165 args["[TYPE]"] = "last";
2177 args["[HELP]"] = " \n "; 2166 args["[HELP]"] = "";
2178 } 2167 }
2179 else 2168 else
2180 { 2169 {
2181 args["[TYPE]"] = "home"; 2170 args["[TYPE]"] = "home";
2182 args["[HELP]"] = " \nYou may want to set a new home location.\n "; 2171 args["[HELP]"] = "\nYou may want to set a new home location.";
2183 } 2172 }
2184 gViewerWindow->alertXml("AvatarMoved", args); 2173 gViewerWindow->alertXml("AvatarMoved", args);
2185 } 2174 }
@@ -2351,68 +2340,12 @@ void login_show()
2351 // UI textures have been previously loaded in doPreloadImages() 2340 // UI textures have been previously loaded in doPreloadImages()
2352 2341
2353 llinfos << "Setting Servers" << llendl; 2342 llinfos << "Setting Servers" << llendl;
2354
2355 if( USERSERVER_OTHER == gUserServerChoice )
2356 {
2357 LLPanelLogin::addServer( gUserServerName, USERSERVER_OTHER );
2358 }
2359 else
2360 {
2361 LLPanelLogin::addServer( gUserServerDomainName[gUserServerChoice].mLabel, gUserServerChoice );
2362 }
2363
2364 // Arg! We hate loops!
2365 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_DMZ].mLabel, USERSERVER_DMZ );
2366 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_LOCAL].mLabel, USERSERVER_LOCAL );
2367 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_AGNI].mLabel, USERSERVER_AGNI );
2368 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_ADITI].mLabel, USERSERVER_ADITI );
2369 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SIVA].mLabel, USERSERVER_SIVA );
2370 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_DURGA].mLabel, USERSERVER_DURGA );
2371 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SHAKTI].mLabel, USERSERVER_SHAKTI );
2372 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_GANGA].mLabel, USERSERVER_GANGA );
2373 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_UMA].mLabel, USERSERVER_UMA );
2374 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_SOMA].mLabel, USERSERVER_SOMA );
2375 LLPanelLogin::addServer( gUserServerDomainName[USERSERVER_VAAK].mLabel, USERSERVER_VAAK );
2376} 2343}
2377 2344
2378// Callback for when login screen is closed. Option 0 = connect, option 1 = quit. 2345// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
2379void login_callback(S32 option, void *userdata) 2346void login_callback(S32 option, void *userdata)
2380{ 2347{
2381 const S32 CONNECT_OPTION = 0;
2382 const S32 QUIT_OPTION = 1;
2383
2384 if (CONNECT_OPTION == option)
2385 {
2386 LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
2387 return;
2388 }
2389 else if (QUIT_OPTION == option)
2390 {
2391 // Make sure we don't save the password if the user is trying to clear it.
2392 LLString first, last, password;
2393 BOOL remember = TRUE;
2394 LLPanelLogin::getFields(first, last, password, remember);
2395 if (!remember)
2396 {
2397 // turn off the setting and write out to disk
2398 gSavedSettings.setBOOL("RememberPassword", FALSE);
2399 gSavedSettings.saveToFile(gSettingsFileName, TRUE);
2400
2401 // stomp the saved password on disk
2402 save_password_to_disk(NULL);
2403 }
2404 2348
2405 LLPanelLogin::close();
2406
2407 // Next iteration through main loop should shut down the app cleanly.
2408 gQuit = TRUE;
2409
2410 return;
2411 }
2412 else
2413 {
2414 llwarns << "Unknown login button clicked" << llendl;
2415 }
2416} 2349}
2417 2350
2418LLString load_password_from_disk() 2351LLString load_password_from_disk()
@@ -2660,7 +2593,7 @@ void update_dialog_callback(S32 option, void *userdata)
2660 // ...user doesn't want to do it 2593 // ...user doesn't want to do it
2661 if (mandatory) 2594 if (mandatory)
2662 { 2595 {
2663 app_force_quit(); 2596 LLAppViewer::instance()->forceQuit();
2664 // Bump them back to the login screen. 2597 // Bump them back to the login screen.
2665 //reset_login(); 2598 //reset_login();
2666 } 2599 }
@@ -2680,7 +2613,9 @@ void update_dialog_callback(S32 option, void *userdata)
2680#elif LL_LINUX 2613#elif LL_LINUX
2681 query_map["os"] = "lnx"; 2614 query_map["os"] = "lnx";
2682#endif 2615#endif
2683 query_map["userserver"] = gUserServerName; 2616 // *TODO change userserver to be grid on both viewer and sim, since
2617 // userserver no longer exists.
2618 query_map["userserver"] = gGridName;
2684 query_map["channel"] = gChannelName; 2619 query_map["channel"] = gChannelName;
2685 // *TODO constantize this guy 2620 // *TODO constantize this guy
2686 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); 2621 LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map);
@@ -2691,7 +2626,7 @@ void update_dialog_callback(S32 option, void *userdata)
2691 { 2626 {
2692 // We're hosed, bail 2627 // We're hosed, bail
2693 llwarns << "LLDir::getTempFilename() failed" << llendl; 2628 llwarns << "LLDir::getTempFilename() failed" << llendl;
2694 app_force_quit(NULL); 2629 LLAppViewer::instance()->forceQuit();
2695 return; 2630 return;
2696 } 2631 }
2697 2632
@@ -2709,7 +2644,7 @@ void update_dialog_callback(S32 option, void *userdata)
2709 if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE)) 2644 if (!CopyFileA(updater_source.c_str(), update_exe_path.c_str(), FALSE))
2710 { 2645 {
2711 llinfos << "Unable to copy the updater!" << llendl; 2646 llinfos << "Unable to copy the updater!" << llendl;
2712 app_force_quit(NULL); 2647 LLAppViewer::instance()->forceQuit();
2713 return; 2648 return;
2714 } 2649 }
2715 2650
@@ -2742,13 +2677,14 @@ void update_dialog_callback(S32 option, void *userdata)
2742 program_name = "SecondLife"; 2677 program_name = "SecondLife";
2743 } 2678 }
2744 2679
2745 params << " -silent -name \"" << gSecondLife << "\""; 2680 params << " -silent -name \"" << LLAppViewer::instance()->getSecondLifeTitle() << "\"";
2746 params << " -program \"" << program_name << "\""; 2681 params << " -program \"" << program_name << "\"";
2747 } 2682 }
2748 2683
2749 llinfos << "Calling updater: " << update_exe_path << " " << params.str() << llendl; 2684 llinfos << "Calling updater: " << update_exe_path << " " << params.str() << llendl;
2750 2685
2751 remove_marker_file(); // In case updater fails 2686 // *REMOVE:Mani The following call is handled through ~LLAppViewer.
2687 // remove_marker_file(); // In case updater fails
2752 2688
2753 // Use spawn() to run asynchronously 2689 // Use spawn() to run asynchronously
2754 int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL); 2690 int retval = _spawnl(_P_NOWAIT, update_exe_path.c_str(), update_exe_path.c_str(), params.str().c_str(), NULL);
@@ -2767,13 +2703,14 @@ void update_dialog_callback(S32 option, void *userdata)
2767 update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \""; 2703 update_exe_path += "/AutoUpdater.app/Contents/MacOS/AutoUpdater' -url \"";
2768 update_exe_path += update_url.asString(); 2704 update_exe_path += update_url.asString();
2769 update_exe_path += "\" -name \""; 2705 update_exe_path += "\" -name \"";
2770 update_exe_path += gSecondLife; 2706 update_exe_path += LLAppViewer::instance()->getSecondLifeTitle();
2771 update_exe_path += "\" &"; 2707 update_exe_path += "\" &";
2772 2708
2773 llinfos << "Calling updater: " << update_exe_path << llendl; 2709 llinfos << "Calling updater: " << update_exe_path << llendl;
2774
2775 remove_marker_file(); // In case updater fails
2776 2710
2711 // *REMOVE:Mani The following call is handled through ~LLAppViewer.
2712 // remove_marker_file(); // In case updater fails
2713
2777 // Run the auto-updater. 2714 // Run the auto-updater.
2778 system(update_exe_path.c_str()); /* Flawfinder: ignore */ 2715 system(update_exe_path.c_str()); /* Flawfinder: ignore */
2779 2716
@@ -2781,16 +2718,18 @@ void update_dialog_callback(S32 option, void *userdata)
2781 OSMessageBox("Automatic updating is not yet implemented for Linux.\n" 2718 OSMessageBox("Automatic updating is not yet implemented for Linux.\n"
2782 "Please download the latest version from www.secondlife.com.", 2719 "Please download the latest version from www.secondlife.com.",
2783 NULL, OSMB_OK); 2720 NULL, OSMB_OK);
2784 remove_marker_file(); 2721
2722 // *REMOVE:Mani The following call is handled through ~LLAppViewer.
2723 // remove_marker_file();
2785 2724
2786#endif 2725#endif
2787 app_force_quit(NULL); 2726 LLAppViewer::instance()->forceQuit();
2788} 2727}
2789 2728
2790void use_circuit_callback(void**, S32 result) 2729void use_circuit_callback(void**, S32 result)
2791{ 2730{
2792 // bail if we're quitting. 2731 // bail if we're quitting.
2793 if(gQuit) return; 2732 if(LLApp::isExiting()) return;
2794 if( !gUseCircuitCallbackCalled ) 2733 if( !gUseCircuitCallbackCalled )
2795 { 2734 {
2796 gUseCircuitCallbackCalled = true; 2735 gUseCircuitCallbackCalled = true;
@@ -3646,6 +3585,8 @@ void reset_login()
3646 if ( gViewerWindow ) 3585 if ( gViewerWindow )
3647 { // Hide menus and normal buttons 3586 { // Hide menus and normal buttons
3648 gViewerWindow->setNormalControlsVisible( FALSE ); 3587 gViewerWindow->setNormalControlsVisible( FALSE );
3588 gLoginMenuBarView->setVisible( TRUE );
3589 gLoginMenuBarView->setEnabled( TRUE );
3649 } 3590 }
3650 3591
3651 // Hide any other stuff 3592 // Hide any other stuff
@@ -3689,3 +3630,8 @@ bool LLStartUp::dispatchURL()
3689 } 3630 }
3690 return false; 3631 return false;
3691} 3632}
3633
3634void login_alert_done(S32 option, void* user_data)
3635{
3636 LLPanelLogin::giveFocus();
3637}
diff --git a/linden/indra/newview/llstartup.h b/linden/indra/newview/llstartup.h
index ad27b28..08f2f60 100644
--- a/linden/indra/newview/llstartup.h
+++ b/linden/indra/newview/llstartup.h
@@ -36,9 +36,9 @@
36 36
37// functions 37// functions
38BOOL idle_startup(); 38BOOL idle_startup();
39void cleanup_app();
40LLString load_password_from_disk(); 39LLString load_password_from_disk();
41void release_start_screen(); 40void release_start_screen();
41void login_alert_done(S32 option, void* user_data);
42 42
43// constants, variables, & enumerations 43// constants, variables, & enumerations
44extern const char* SCREEN_HOME_FILENAME; 44extern const char* SCREEN_HOME_FILENAME;
diff --git a/linden/indra/newview/llstatgraph.cpp b/linden/indra/newview/llstatgraph.cpp
index bd31077..25ff11c 100644
--- a/linden/indra/newview/llstatgraph.cpp
+++ b/linden/indra/newview/llstatgraph.cpp
@@ -95,10 +95,10 @@ void LLStatGraph::draw()
95 95
96 if (mUpdateTimer.getElapsedTimeF32() > 0.5f) 96 if (mUpdateTimer.getElapsedTimeF32() > 0.5f)
97 { 97 {
98 char format_str[256]; /* Flawfinder: ignore */ 98 std::string format_str;
99 char tmp_str[256]; /* Flawfinder: ignore */ 99 std::string tmp_str;
100 snprintf(format_str, sizeof(format_str), "%%s%%.%df%%s", mPrecision); /* Flawfinder: ignore */ 100 format_str = llformat("%%s%%.%df%%s", mPrecision);
101 snprintf(tmp_str, sizeof(tmp_str), format_str, mLabel.c_str(), mValue, mUnits.c_str()); /* Flawfinder: ignore */ 101 tmp_str = llformat(format_str.c_str(), mLabel.c_str(), mValue, mUnits.c_str());
102 setToolTip(tmp_str); 102 setToolTip(tmp_str);
103 103
104 mUpdateTimer.reset(); 104 mUpdateTimer.reset();
diff --git a/linden/indra/newview/llstatusbar.cpp b/linden/indra/newview/llstatusbar.cpp
index 8c50eca..856943d 100644
--- a/linden/indra/newview/llstatusbar.cpp
+++ b/linden/indra/newview/llstatusbar.cpp
@@ -78,7 +78,7 @@
78 78
79#include "lltoolmgr.h" 79#include "lltoolmgr.h"
80#include "llfocusmgr.h" 80#include "llfocusmgr.h"
81#include "viewer.h" 81#include "llappviewer.h"
82 82
83//#include "llfirstuse.h" 83//#include "llfirstuse.h"
84 84
@@ -256,7 +256,7 @@ void LLStatusBar::refresh()
256 << std::setfill('0') << std::setw(2) << internal_time->tm_mday << " " 256 << std::setfill('0') << std::setw(2) << internal_time->tm_mday << " "
257 << sMonths[internal_time->tm_mon] << " " 257 << sMonths[internal_time->tm_mon] << " "
258 << internal_time->tm_year + 1900; 258 << internal_time->tm_year + 1900;
259 mTextTime->setToolTip(date.str().c_str()); 259 mTextTime->setToolTip(date.str());
260 260
261 LLRect r; 261 LLRect r;
262 const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge(); 262 const S32 MENU_RIGHT = gMenuBarView->getRightmostMenuEdge();
diff --git a/linden/indra/newview/llsurface.cpp b/linden/indra/newview/llsurface.cpp
index e9643eb..e9aa9b0 100644
--- a/linden/indra/newview/llsurface.cpp
+++ b/linden/indra/newview/llsurface.cpp
@@ -41,7 +41,7 @@
41#include "llviewerobjectlist.h" 41#include "llviewerobjectlist.h"
42#include "llregionhandle.h" 42#include "llregionhandle.h"
43#include "llagent.h" 43#include "llagent.h"
44#include "viewer.h" 44#include "llappviewer.h"
45#include "llworld.h" 45#include "llworld.h"
46#include "llviewercontrol.h" 46#include "llviewercontrol.h"
47#include "llviewerimage.h" 47#include "llviewerimage.h"
@@ -67,8 +67,6 @@ S32 LLSurface::sTexelsUpdated = 0;
67F32 LLSurface::sTextureUpdateTime = 0.f; 67F32 LLSurface::sTextureUpdateTime = 0.f;
68LLStat LLSurface::sTexelsUpdatedPerSecStat; 68LLStat LLSurface::sTexelsUpdatedPerSecStat;
69 69
70extern void bad_network_handler();
71
72// ---------------- LLSurface:: Public Members --------------- 70// ---------------- LLSurface:: Public Members ---------------
73 71
74LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) : 72LLSurface::LLSurface(U32 type, LLViewerRegion *regionp) :
@@ -776,7 +774,7 @@ void LLSurface::decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL
776 << " quant_wbits " << (S32)ph.quant_wbits 774 << " quant_wbits " << (S32)ph.quant_wbits
777 << " patchids " << (S32)ph.patchids 775 << " patchids " << (S32)ph.patchids
778 << llendl; 776 << llendl;
779 bad_network_handler(); 777 LLAppViewer::instance()->badNetworkHandler();
780 return; 778 return;
781 } 779 }
782 780
diff --git a/linden/indra/newview/lltexlayer.cpp b/linden/indra/newview/lltexlayer.cpp
index 097682f..5330e8d 100644
--- a/linden/indra/newview/lltexlayer.cpp
+++ b/linden/indra/newview/lltexlayer.cpp
@@ -52,7 +52,6 @@
52#include "llxmltree.h" 52#include "llxmltree.h"
53#include "pipeline.h" 53#include "pipeline.h"
54#include "v4coloru.h" 54#include "v4coloru.h"
55#include "viewer.h"
56 55
57//#include "../tools/imdebug/imdebug.h" 56//#include "../tools/imdebug/imdebug.h"
58 57
diff --git a/linden/indra/newview/lltexturectrl.cpp b/linden/indra/newview/lltexturectrl.cpp
index b961053..706587a 100644
--- a/linden/indra/newview/lltexturectrl.cpp
+++ b/linden/indra/newview/lltexturectrl.cpp
@@ -1037,19 +1037,21 @@ void LLTextureCtrl::setVisible( BOOL visible )
1037 1037
1038void LLTextureCtrl::setEnabled( BOOL enabled ) 1038void LLTextureCtrl::setEnabled( BOOL enabled )
1039{ 1039{
1040 LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)LLFloater::getFloaterByHandle(mFloaterHandle);
1040 if( enabled ) 1041 if( enabled )
1041 { 1042 {
1042 setToolTip( "Click to choose a picture" ); 1043 LLString tooltip;
1044 if (floaterp) tooltip = floaterp->getUIString("choose_picture");
1045 setToolTip( tooltip );
1043 } 1046 }
1044 else 1047 else
1045 { 1048 {
1046 setToolTip( "" ); 1049 setToolTip( LLString() );
1047 // *TODO: would be better to keep floater open and show 1050 // *TODO: would be better to keep floater open and show
1048 // disabled state. 1051 // disabled state.
1049 closeFloater(); 1052 closeFloater();
1050 } 1053 }
1051 1054
1052 LLFloaterTexturePicker* floaterp = (LLFloaterTexturePicker*)LLFloater::getFloaterByHandle(mFloaterHandle);
1053 if( floaterp ) 1055 if( floaterp )
1054 { 1056 {
1055 floaterp->setActive(enabled); 1057 floaterp->setActive(enabled);
diff --git a/linden/indra/newview/lltexturefetch.cpp b/linden/indra/newview/lltexturefetch.cpp
index 7d5e6ab..9464146 100644
--- a/linden/indra/newview/lltexturefetch.cpp
+++ b/linden/indra/newview/lltexturefetch.cpp
@@ -46,7 +46,6 @@
46#include "llviewerimagelist.h" 46#include "llviewerimagelist.h"
47#include "llviewerimage.h" 47#include "llviewerimage.h"
48#include "llviewerregion.h" 48#include "llviewerregion.h"
49#include "viewer.h"
50 49
51////////////////////////////////////////////////////////////////////////////// 50//////////////////////////////////////////////////////////////////////////////
52 51
@@ -1295,11 +1294,21 @@ bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 pri
1295 return false; 1294 return false;
1296 } 1295 }
1297 } 1296 }
1298 // If the requester knows the dimentions of the image, 1297
1299 // this will calculate how much data we need without having to parse the header
1300 S32 desired_size; 1298 S32 desired_size;
1301 if (w*h*c > 0) 1299 if ((discard == 0) && worker && worker->mFileSize)
1300 {
1301 // if we want the entire image, and we know its size, then get it all
1302 // (calcDataSizeJ2C() below makes assumptions about how the image
1303 // was compressed - this code ensures that when we request the entire image,
1304 // we really do get it.)
1305 desired_size = worker->mFileSize;
1306 }
1307 else if (w*h*c > 0)
1302 { 1308 {
1309 // If the requester knows the dimentions of the image,
1310 // this will calculate how much data we need without having to parse the header
1311
1303 desired_size = LLImageJ2C::calcDataSizeJ2C(w, h, c, discard); 1312 desired_size = LLImageJ2C::calcDataSizeJ2C(w, h, c, discard);
1304 } 1313 }
1305 else 1314 else
diff --git a/linden/indra/newview/lltextureview.cpp b/linden/indra/newview/lltextureview.cpp
index 4df5444..06a4ea0 100644
--- a/linden/indra/newview/lltextureview.cpp
+++ b/linden/indra/newview/lltextureview.cpp
@@ -49,7 +49,7 @@
49#include "llviewerobject.h" 49#include "llviewerobject.h"
50#include "llviewerimage.h" 50#include "llviewerimage.h"
51#include "llviewerimagelist.h" 51#include "llviewerimagelist.h"
52#include "viewer.h" 52#include "llappviewer.h"
53 53
54extern F32 texmem_lower_bound_scale; 54extern F32 texmem_lower_bound_scale;
55 55
@@ -145,7 +145,7 @@ void LLTextureBar::draw()
145 } 145 }
146 146
147 LLColor4 color; 147 LLColor4 color;
148 if (mImagep->getID() == gTextureFetch->mDebugID) 148 if (mImagep->getID() == LLAppViewer::getTextureFetch()->mDebugID)
149 { 149 {
150 color = LLColor4::cyan2; 150 color = LLColor4::cyan2;
151 } 151 }
@@ -347,7 +347,7 @@ BOOL LLTextureBar::handleMouseDown(S32 x, S32 y, MASK mask)
347{ 347{
348 if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT) 348 if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == MASK_ALT)
349 { 349 {
350 gTextureFetch->mDebugID = mImagep->getID(); 350 LLAppViewer::getTextureFetch()->mDebugID = mImagep->getID();
351 return TRUE; 351 return TRUE;
352 } 352 }
353 return LLView::handleMouseDown(x,y,mask); 353 return LLView::handleMouseDown(x,y,mask);
@@ -469,9 +469,9 @@ void LLGLTexMemBar::draw()
469 469
470 text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d", 470 text = llformat("Textures: Count: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d(%d) RAW:%d",
471 gImageList.getNumImages(), 471 gImageList.getNumImages(),
472 gTextureFetch->getNumRequests(), gTextureFetch->getNumDeletes(), 472 LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
473 gTextureFetch->mPacketCount, gTextureFetch->mBadPacketCount, 473 LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
474 gTextureCache->getNumReads(), gTextureCache->getNumWrites(), 474 LLAppViewer::getTextureCache()->getNumReads(), LLAppViewer::getTextureCache()->getNumWrites(),
475 LLLFSThread::sLocal->getPending(), 475 LLLFSThread::sLocal->getPending(),
476 LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(), 476 LLImageWorker::sCount, LLImageWorker::getWorkerThread()->getNumDeletes(),
477 LLImageRaw::sRawImageCount); 477 LLImageRaw::sRawImageCount);
@@ -480,7 +480,7 @@ void LLGLTexMemBar::draw()
480 text_color, LLFontGL::LEFT, LLFontGL::TOP); 480 text_color, LLFontGL::LEFT, LLFontGL::TOP);
481 481
482 S32 dx1 = 0; 482 S32 dx1 = 0;
483 if (gTextureFetch->mDebugPause) 483 if (LLAppViewer::getTextureFetch()->mDebugPause)
484 { 484 {
485 LLFontGL::sMonospace->renderUTF8("!", 0, title_x1, line_height, 485 LLFontGL::sMonospace->renderUTF8("!", 0, title_x1, line_height,
486 text_color, LLFontGL::LEFT, LLFontGL::TOP); 486 text_color, LLFontGL::LEFT, LLFontGL::TOP);
@@ -781,7 +781,7 @@ BOOL LLTextureView::handleMouseDown(S32 x, S32 y, MASK mask)
781 } 781 }
782 if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT)) 782 if ((mask & (MASK_CONTROL|MASK_SHIFT|MASK_ALT)) == (MASK_CONTROL|MASK_SHIFT))
783 { 783 {
784 gTextureFetch->mDebugPause = !gTextureFetch->mDebugPause; 784 LLAppViewer::getTextureFetch()->mDebugPause = !LLAppViewer::getTextureFetch()->mDebugPause;
785 return TRUE; 785 return TRUE;
786 } 786 }
787 if (mask & MASK_SHIFT) 787 if (mask & MASK_SHIFT)
diff --git a/linden/indra/newview/lltoolbar.cpp b/linden/indra/newview/lltoolbar.cpp
index 71e8aec..e7a5445 100644
--- a/linden/indra/newview/lltoolbar.cpp
+++ b/linden/indra/newview/lltoolbar.cpp
@@ -59,7 +59,6 @@
59#include "llviewerparcelmgr.h" 59#include "llviewerparcelmgr.h"
60#include "llvieweruictrlfactory.h" 60#include "llvieweruictrlfactory.h"
61#include "llviewerwindow.h" 61#include "llviewerwindow.h"
62#include "viewer.h"
63#include "lltoolgrab.h" 62#include "lltoolgrab.h"
64 63
65#if LL_DARWIN 64#if LL_DARWIN
diff --git a/linden/indra/newview/lltoolbrush.cpp b/linden/indra/newview/lltoolbrush.cpp
index a56bf42..189996e 100644
--- a/linden/indra/newview/lltoolbrush.cpp
+++ b/linden/indra/newview/lltoolbrush.cpp
@@ -53,7 +53,7 @@
53#include "llviewerregion.h" 53#include "llviewerregion.h"
54#include "llviewerwindow.h" 54#include "llviewerwindow.h"
55#include "llworld.h" 55#include "llworld.h"
56#include "viewer.h" 56#include "llappviewer.h"
57#include "llparcel.h" 57#include "llparcel.h"
58 58
59#include "llglheaders.h" 59#include "llglheaders.h"
diff --git a/linden/indra/newview/lltooldraganddrop.cpp b/linden/indra/newview/lltooldraganddrop.cpp
index 1f607de..e6eca31 100644
--- a/linden/indra/newview/lltooldraganddrop.cpp
+++ b/linden/indra/newview/lltooldraganddrop.cpp
@@ -63,7 +63,6 @@
63#include "llvolume.h" 63#include "llvolume.h"
64#include "llworld.h" 64#include "llworld.h"
65#include "object_flags.h" 65#include "object_flags.h"
66#include "viewer.h"
67 66
68LLToolDragAndDrop *gToolDragAndDrop = NULL; 67LLToolDragAndDrop *gToolDragAndDrop = NULL;
69 68
diff --git a/linden/indra/newview/lltoolfocus.cpp b/linden/indra/newview/lltoolfocus.cpp
index 2ac2b33..43c8e1a 100644
--- a/linden/indra/newview/lltoolfocus.cpp
+++ b/linden/indra/newview/lltoolfocus.cpp
@@ -55,7 +55,6 @@
55#include "llviewercamera.h" 55#include "llviewercamera.h"
56#include "llviewerobject.h" 56#include "llviewerobject.h"
57#include "llviewerwindow.h" 57#include "llviewerwindow.h"
58#include "viewer.h"
59#include "llvoavatar.h" 58#include "llvoavatar.h"
60#include "llmorphview.h" 59#include "llmorphview.h"
61 60
diff --git a/linden/indra/newview/lltoolgrab.cpp b/linden/indra/newview/lltoolgrab.cpp
index 13977ee..3f19ed4 100644
--- a/linden/indra/newview/lltoolgrab.cpp
+++ b/linden/indra/newview/lltoolgrab.cpp
@@ -62,7 +62,6 @@
62#include "llviewerwindow.h" 62#include "llviewerwindow.h"
63#include "llvoavatar.h" 63#include "llvoavatar.h"
64#include "llworld.h" 64#include "llworld.h"
65#include "viewer.h"
66 65
67const S32 SLOP_DIST_SQ = 4; 66const S32 SLOP_DIST_SQ = 4;
68 67
diff --git a/linden/indra/newview/lltoolgun.cpp b/linden/indra/newview/lltoolgun.cpp
index c7e598e..ebe22fc 100644
--- a/linden/indra/newview/lltoolgun.cpp
+++ b/linden/indra/newview/lltoolgun.cpp
@@ -37,7 +37,6 @@
37#include "llagent.h" 37#include "llagent.h"
38#include "llviewercontrol.h" 38#include "llviewercontrol.h"
39#include "llsky.h" 39#include "llsky.h"
40#include "viewer.h"
41#include "llresmgr.h" 40#include "llresmgr.h"
42#include "llfontgl.h" 41#include "llfontgl.h"
43#include "llui.h" 42#include "llui.h"
diff --git a/linden/indra/newview/lltoolmgr.cpp b/linden/indra/newview/lltoolmgr.cpp
index ae74eba..0e46ece 100644
--- a/linden/indra/newview/lltoolmgr.cpp
+++ b/linden/indra/newview/lltoolmgr.cpp
@@ -428,6 +428,11 @@ void LLToolMgr::onAppFocusGained()
428 updateToolStatus(); 428 updateToolStatus();
429} 429}
430 430
431void LLToolMgr::clearSavedTool()
432{
433 mSavedTool = NULL;
434}
435
431///////////////////////////////////////////////////// 436/////////////////////////////////////////////////////
432// LLToolset 437// LLToolset
433 438
diff --git a/linden/indra/newview/lltoolmgr.h b/linden/indra/newview/lltoolmgr.h
index e0f554d..557208b 100644
--- a/linden/indra/newview/lltoolmgr.h
+++ b/linden/indra/newview/lltoolmgr.h
@@ -70,6 +70,8 @@ public:
70 void onAppFocusGained(); 70 void onAppFocusGained();
71 void onAppFocusLost(); 71 void onAppFocusLost();
72 72
73 void clearSavedTool();
74
73protected: 75protected:
74 friend class LLToolset; // to allow access to setCurrentTool(); 76 friend class LLToolset; // to allow access to setCurrentTool();
75 void setCurrentTool(LLTool* tool); 77 void setCurrentTool(LLTool* tool);
diff --git a/linden/indra/newview/lltoolmorph.cpp b/linden/indra/newview/lltoolmorph.cpp
index d3cd997..3a56a9f 100644
--- a/linden/indra/newview/lltoolmorph.cpp
+++ b/linden/indra/newview/lltoolmorph.cpp
@@ -62,7 +62,6 @@
62#include "llviewerwindow.h" 62#include "llviewerwindow.h"
63#include "llvoavatar.h" 63#include "llvoavatar.h"
64#include "pipeline.h" 64#include "pipeline.h"
65#include "viewer.h"
66 65
67//LLToolMorph *gToolMorph = NULL; 66//LLToolMorph *gToolMorph = NULL;
68 67
diff --git a/linden/indra/newview/lltoolobjpicker.cpp b/linden/indra/newview/lltoolobjpicker.cpp
index 8e8abfe..a8876da 100644
--- a/linden/indra/newview/lltoolobjpicker.cpp
+++ b/linden/indra/newview/lltoolobjpicker.cpp
@@ -38,7 +38,6 @@
38#include "llagent.h" 38#include "llagent.h"
39#include "llselectmgr.h" 39#include "llselectmgr.h"
40#include "llworld.h" 40#include "llworld.h"
41#include "viewer.h" // for gFPSClamped, pie menus
42#include "llviewercontrol.h" 41#include "llviewercontrol.h"
43#include "llmenugl.h" 42#include "llmenugl.h"
44#include "lltoolmgr.h" 43#include "lltoolmgr.h"
diff --git a/linden/indra/newview/lltoolpie.cpp b/linden/indra/newview/lltoolpie.cpp
index 166209d..fa8213d 100644
--- a/linden/indra/newview/lltoolpie.cpp
+++ b/linden/indra/newview/lltoolpie.cpp
@@ -85,6 +85,8 @@ LLToolPie::LLToolPie()
85 85
86BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask) 86BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
87{ 87{
88 if (!gCamera) return FALSE;
89
88 //left mouse down always picks transparent 90 //left mouse down always picks transparent
89 gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback, 91 gViewerWindow->hitObjectOrLandGlobalAsync(x, y, mask, leftMouseCallback,
90 TRUE, TRUE); 92 TRUE, TRUE);
diff --git a/linden/indra/newview/lltoolplacer.cpp b/linden/indra/newview/lltoolplacer.cpp
index ee5d08f..d26bdab 100644
--- a/linden/indra/newview/lltoolplacer.cpp
+++ b/linden/indra/newview/lltoolplacer.cpp
@@ -50,9 +50,22 @@
50#include "llviewerregion.h" 50#include "llviewerregion.h"
51#include "llviewerwindow.h" 51#include "llviewerwindow.h"
52#include "llworld.h" 52#include "llworld.h"
53#include "viewer.h"
54#include "llui.h" 53#include "llui.h"
55 54
55//Headers added for functions moved from viewer.cpp
56#include "llvograss.h"
57#include "llvotree.h"
58#include "llvolumemessage.h"
59#include "llhudmanager.h"
60#include "llagent.h"
61#include "audioengine.h"
62#include "llhudeffecttrail.h"
63#include "llviewerobjectlist.h"
64#include "llviewercamera.h"
65#include "llviewerstats.h"
66
67const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f);
68
56//static 69//static
57LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE; 70LLPCode LLToolPlacer::sObjectType = LL_PCODE_CUBE;
58 71
@@ -61,9 +74,366 @@ LLToolPlacer::LLToolPlacer()
61{ 74{
62} 75}
63 76
77BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face,
78 BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region )
79{
80 F32 max_dist_from_camera = gSavedSettings.getF32( "MaxSelectDistance" ) - 1.f;
81
82 // Viewer-side pick to find the right sim to create the object on.
83 // First find the surface the object will be created on.
84 gViewerWindow->hitObjectOrLandGlobalImmediate(x, y, NULL, FALSE);
85
86 // Note: use the frontmost non-flora version because (a) plants usually have lots of alpha and (b) pants' Havok
87 // representations (if any) are NOT the same as their viewer representation.
88 *hit_obj = gObjectList.findObject( gLastHitNonFloraObjectID );
89 *hit_face = gLastHitNonFloraObjectFace;
90 *b_hit_land = !(*hit_obj) && !gLastHitNonFloraPosGlobal.isExactlyZero();
91 LLVector3d land_pos_global = gLastHitNonFloraPosGlobal;
92
93 // Make sure there's a surface to place the new object on.
94 BOOL bypass_sim_raycast = FALSE;
95 LLVector3d surface_pos_global;
96 if (*b_hit_land)
97 {
98 surface_pos_global = land_pos_global;
99 bypass_sim_raycast = TRUE;
100 }
101 else
102 if (*hit_obj)
103 {
104 surface_pos_global = (*hit_obj)->getPositionGlobal();
105 }
106 else
107 {
108 return FALSE;
109 }
110
111 // Make sure the surface isn't too far away.
112 LLVector3d ray_start_global = gAgent.getCameraPositionGlobal();
113 F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared());
114 if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) )
115 {
116 return FALSE;
117 }
118
119 // Find the sim where the surface lives.
120 LLViewerRegion *regionp = gWorldp->getRegionFromPosGlobal(surface_pos_global);
121 if (!regionp)
122 {
123 llwarns << "Trying to add object outside of all known regions!" << llendl;
124 return FALSE;
125 }
126
127 // Find the simulator-side ray that will be used to place the object accurately
128 LLVector3d mouse_direction;
129 mouse_direction.setVec( gViewerWindow->mouseDirectionGlobal( x, y ) );
130
131 *region = regionp;
132 *ray_start_region = regionp->getPosRegionFromGlobal( ray_start_global );
133 F32 near_clip = gCamera->getNear() + 0.01f; // Include an epsilon to avoid rounding issues.
134 *ray_start_region += gCamera->getAtAxis() * near_clip;
135
136 if( bypass_sim_raycast )
137 {
138 // Hack to work around Havok's inability to ray cast onto height fields
139 *ray_end_region = regionp->getPosRegionFromGlobal( surface_pos_global ); // ray end is the viewer's intersection point
140 }
141 else
142 {
143 LLVector3d ray_end_global = ray_start_global + (1.f + max_dist_from_camera) * mouse_direction; // add an epsilon to the sim version of the ray to avoid rounding problems.
144 *ray_end_region = regionp->getPosRegionFromGlobal( ray_end_global );
145 }
146
147 return TRUE;
148}
149
150
151BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
152{
153 LLVector3 ray_start_region;
154 LLVector3 ray_end_region;
155 LLViewerRegion* regionp = NULL;
156 BOOL b_hit_land = FALSE;
157 S32 hit_face = -1;
158 LLViewerObject* hit_obj = NULL;
159 U8 state = 0;
160 BOOL success = raycastForNewObjPos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, &regionp );
161 if( !success )
162 {
163 return FALSE;
164 }
165
166 if( hit_obj && (hit_obj->isAvatar() || hit_obj->isAttachment()) )
167 {
168 // Can't create objects on avatars or attachments
169 return FALSE;
170 }
171
172 if (NULL == regionp)
173 {
174 llwarns << "regionp was NULL; aborting function." << llendl;
175 return FALSE;
176 }
177
178 if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)
179 {
180 LLFirstUse::useSandbox();
181 }
182
183 // Set params for new object based on its PCode.
184 LLQuaternion rotation;
185 LLVector3 scale = DEFAULT_OBJECT_SCALE;
186 U8 material = LL_MCODE_WOOD;
187 BOOL create_selected = FALSE;
188 LLVolumeParams volume_params;
189
190 switch (pcode)
191 {
192 case LL_PCODE_LEGACY_GRASS:
193 // Randomize size of grass patch
194 scale.setVec(10.f + ll_frand(20.f), 10.f + ll_frand(20.f), 1.f + ll_frand(2.f));
195 state = rand() % LLVOGrass::sMaxGrassSpecies;
196 break;
197
198
199 case LL_PCODE_LEGACY_TREE:
200 case LL_PCODE_TREE_NEW:
201 state = rand() % LLVOTree::sMaxTreeSpecies;
202 break;
203
204 case LL_PCODE_SPHERE:
205 case LL_PCODE_CONE:
206 case LL_PCODE_CUBE:
207 case LL_PCODE_CYLINDER:
208 case LL_PCODE_TORUS:
209 case LLViewerObject::LL_VO_SQUARE_TORUS:
210 case LLViewerObject::LL_VO_TRIANGLE_TORUS:
211 default:
212 create_selected = TRUE;
213 break;
214 }
215
216 // Play creation sound
217 if (gAudiop)
218 {
219 F32 volume = gSavedSettings.getF32("AudioLevelUI");
220 gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume);
221 }
222
223 gMessageSystem->newMessageFast(_PREHASH_ObjectAdd);
224 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
225 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
226 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
227 gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
228 gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
229 gMessageSystem->addU8Fast(_PREHASH_Material, material);
230
231 U32 flags = 0; // not selected
232 if (use_physics)
233 {
234 flags |= FLAGS_USE_PHYSICS;
235 }
236 if (create_selected)
237 {
238 flags |= FLAGS_CREATE_SELECTED;
239 }
240 gMessageSystem->addU32Fast(_PREHASH_AddFlags, flags );
241
242 LLPCode volume_pcode; // ...PCODE_VOLUME, or the original on error
243 switch (pcode)
244 {
245 case LL_PCODE_SPHERE:
246 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
247
248 volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
249 volume_params.setBeginAndEndS( 0.f, 1.f );
250 volume_params.setBeginAndEndT( 0.f, 1.f );
251 volume_params.setRatio ( 1, 1 );
252 volume_params.setShear ( 0, 0 );
253 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
254 volume_pcode = LL_PCODE_VOLUME;
255 break;
256
257 case LL_PCODE_TORUS:
258 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
259
260 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE );
261 volume_params.setBeginAndEndS( 0.f, 1.f );
262 volume_params.setBeginAndEndT( 0.f, 1.f );
263 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
264 volume_params.setShear ( 0, 0 );
265 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
266 volume_pcode = LL_PCODE_VOLUME;
267 break;
268
269 case LLViewerObject::LL_VO_SQUARE_TORUS:
270 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
271
272 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_CIRCLE );
273 volume_params.setBeginAndEndS( 0.f, 1.f );
274 volume_params.setBeginAndEndT( 0.f, 1.f );
275 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
276 volume_params.setShear ( 0, 0 );
277 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
278 volume_pcode = LL_PCODE_VOLUME;
279 break;
280
281 case LLViewerObject::LL_VO_TRIANGLE_TORUS:
282 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
283
284 volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_CIRCLE );
285 volume_params.setBeginAndEndS( 0.f, 1.f );
286 volume_params.setBeginAndEndT( 0.f, 1.f );
287 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
288 volume_params.setShear ( 0, 0 );
289 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
290 volume_pcode = LL_PCODE_VOLUME;
291 break;
292
293 case LL_PCODE_SPHERE_HEMI:
294 volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
295 //volume_params.setBeginAndEndS( 0.5f, 1.f );
296 volume_params.setBeginAndEndT( 0.f, 0.5f );
297 volume_params.setRatio ( 1, 1 );
298 volume_params.setShear ( 0, 0 );
299 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
300 volume_pcode = LL_PCODE_VOLUME;
301 break;
302
303 case LL_PCODE_CUBE:
304 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
305 volume_params.setBeginAndEndS( 0.f, 1.f );
306 volume_params.setBeginAndEndT( 0.f, 1.f );
307 volume_params.setRatio ( 1, 1 );
308 volume_params.setShear ( 0, 0 );
309 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
310 volume_pcode = LL_PCODE_VOLUME;
311 break;
312
313 case LL_PCODE_PRISM:
314 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
315 volume_params.setBeginAndEndS( 0.f, 1.f );
316 volume_params.setBeginAndEndT( 0.f, 1.f );
317 volume_params.setRatio ( 0, 1 );
318 volume_params.setShear ( -0.5f, 0 );
319 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
320 volume_pcode = LL_PCODE_VOLUME;
321 break;
322
323 case LL_PCODE_PYRAMID:
324 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
325 volume_params.setBeginAndEndS( 0.f, 1.f );
326 volume_params.setBeginAndEndT( 0.f, 1.f );
327 volume_params.setRatio ( 0, 0 );
328 volume_params.setShear ( 0, 0 );
329 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
330 volume_pcode = LL_PCODE_VOLUME;
331 break;
332
333 case LL_PCODE_TETRAHEDRON:
334 volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_LINE );
335 volume_params.setBeginAndEndS( 0.f, 1.f );
336 volume_params.setBeginAndEndT( 0.f, 1.f );
337 volume_params.setRatio ( 0, 0 );
338 volume_params.setShear ( 0, 0 );
339 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
340 volume_pcode = LL_PCODE_VOLUME;
341 break;
342
343 case LL_PCODE_CYLINDER:
344 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
345 volume_params.setBeginAndEndS( 0.f, 1.f );
346 volume_params.setBeginAndEndT( 0.f, 1.f );
347 volume_params.setRatio ( 1, 1 );
348 volume_params.setShear ( 0, 0 );
349 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
350 volume_pcode = LL_PCODE_VOLUME;
351 break;
352
353 case LL_PCODE_CYLINDER_HEMI:
354 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
355 volume_params.setBeginAndEndS( 0.25f, 0.75f );
356 volume_params.setBeginAndEndT( 0.f, 1.f );
357 volume_params.setRatio ( 1, 1 );
358 volume_params.setShear ( 0, 0 );
359 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
360 volume_pcode = LL_PCODE_VOLUME;
361 break;
362
363 case LL_PCODE_CONE:
364 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
365 volume_params.setBeginAndEndS( 0.f, 1.f );
366 volume_params.setBeginAndEndT( 0.f, 1.f );
367 volume_params.setRatio ( 0, 0 );
368 volume_params.setShear ( 0, 0 );
369 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
370 volume_pcode = LL_PCODE_VOLUME;
371 break;
372
373 case LL_PCODE_CONE_HEMI:
374 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
375 volume_params.setBeginAndEndS( 0.25f, 0.75f );
376 volume_params.setBeginAndEndT( 0.f, 1.f );
377 volume_params.setRatio ( 0, 0 );
378 volume_params.setShear ( 0, 0 );
379 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
380 volume_pcode = LL_PCODE_VOLUME;
381 break;
382
383 default:
384 LLVolumeMessage::packVolumeParams(0, gMessageSystem);
385 volume_pcode = pcode;
386 break;
387 }
388 gMessageSystem->addU8Fast(_PREHASH_PCode, volume_pcode);
389
390 gMessageSystem->addVector3Fast(_PREHASH_Scale, scale );
391 gMessageSystem->addQuatFast(_PREHASH_Rotation, rotation );
392 gMessageSystem->addVector3Fast(_PREHASH_RayStart, ray_start_region );
393 gMessageSystem->addVector3Fast(_PREHASH_RayEnd, ray_end_region );
394 gMessageSystem->addU8Fast(_PREHASH_BypassRaycast, (U8)b_hit_land );
395 gMessageSystem->addU8Fast(_PREHASH_RayEndIsIntersection, (U8)FALSE );
396 gMessageSystem->addU8Fast(_PREHASH_State, state);
397
398 // Limit raycast to a single object.
399 // Speeds up server raycast + avoid problems with server ray hitting objects
400 // that were clipped by the near plane or culled on the viewer.
401 LLUUID ray_target_id;
402 if( hit_obj )
403 {
404 ray_target_id = hit_obj->getID();
405 }
406 else
407 {
408 ray_target_id.setNull();
409 }
410 gMessageSystem->addUUIDFast(_PREHASH_RayTargetID, ray_target_id );
411
412 // Pack in name value pairs
413 gMessageSystem->sendReliable(regionp->getHost());
414
415 // Spawns a message, so must be after above send
416 if (create_selected)
417 {
418 gSelectMgr->deselectAll();
419 gViewerWindow->getWindow()->incBusyCount();
420 }
421
422 // VEFFECT: AddObject
423 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
424 effectp->setSourceObject((LLViewerObject*)gAgent.getAvatarObject());
425 effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region));
426 effectp->setDuration(LL_HUD_DUR_SHORT);
427 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
428
429 gViewerStats->incStat(LLViewerStats::ST_CREATE_COUNT);
430
431 return TRUE;
432}
433
64// Used by the placer tool to add copies of the current selection. 434// Used by the placer tool to add copies of the current selection.
65// Inspired by add_object(). JC 435// Inspired by add_object(). JC
66BOOL add_duplicate(S32 x, S32 y) 436BOOL LLToolPlacer::addDuplicate(S32 x, S32 y)
67{ 437{
68 LLVector3 ray_start_region; 438 LLVector3 ray_start_region;
69 LLVector3 ray_end_region; 439 LLVector3 ray_end_region;
@@ -71,7 +441,7 @@ BOOL add_duplicate(S32 x, S32 y)
71 BOOL b_hit_land = FALSE; 441 BOOL b_hit_land = FALSE;
72 S32 hit_face = -1; 442 S32 hit_face = -1;
73 LLViewerObject* hit_obj = NULL; 443 LLViewerObject* hit_obj = NULL;
74 BOOL success = raycast_for_new_obj_pos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, &regionp ); 444 BOOL success = raycastForNewObjPos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, &regionp );
75 if( !success ) 445 if( !success )
76 { 446 {
77 make_ui_sound("UISndInvalidOp"); 447 make_ui_sound("UISndInvalidOp");
@@ -123,11 +493,11 @@ BOOL LLToolPlacer::placeObject(S32 x, S32 y, MASK mask)
123 493
124 if (gSavedSettings.getBOOL("CreateToolCopySelection")) 494 if (gSavedSettings.getBOOL("CreateToolCopySelection"))
125 { 495 {
126 added = add_duplicate(x, y); 496 added = addDuplicate(x, y);
127 } 497 }
128 else 498 else
129 { 499 {
130 added = add_object( sObjectType, x, y, NO_PHYSICS ); 500 added = addObject( sObjectType, x, y, FALSE );
131 } 501 }
132 502
133 // ...and go back to the default tool 503 // ...and go back to the default tool
diff --git a/linden/indra/newview/lltoolplacer.h b/linden/indra/newview/lltoolplacer.h
index d6d21cb..b016470 100644
--- a/linden/indra/newview/lltoolplacer.h
+++ b/linden/indra/newview/lltoolplacer.h
@@ -37,6 +37,7 @@
37#include "lltool.h" 37#include "lltool.h"
38 38
39class LLButton; 39class LLButton;
40class LLViewerRegion;
40 41
41//////////////////////////////////////////////////// 42////////////////////////////////////////////////////
42// LLToolPlacer 43// LLToolPlacer
@@ -57,6 +58,12 @@ public:
57 58
58protected: 59protected:
59 static LLPCode sObjectType; 60 static LLPCode sObjectType;
61
62private:
63 BOOL addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics );
64 BOOL raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face,
65 BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region );
66 BOOL addDuplicate(S32 x, S32 y);
60}; 67};
61 68
62//////////////////////////////////////////////////// 69////////////////////////////////////////////////////
diff --git a/linden/indra/newview/lltoolselect.cpp b/linden/indra/newview/lltoolselect.cpp
index f77202f..37c8b00 100644
--- a/linden/indra/newview/lltoolselect.cpp
+++ b/linden/indra/newview/lltoolselect.cpp
@@ -49,7 +49,6 @@
49#include "llviewerwindow.h" 49#include "llviewerwindow.h"
50#include "llvoavatar.h" 50#include "llvoavatar.h"
51#include "llworld.h" 51#include "llworld.h"
52#include "viewer.h" // for gFPSClamped, pie menus
53 52
54// Globals 53// Globals
55LLToolSelect *gToolSelect = NULL; 54LLToolSelect *gToolSelect = NULL;
diff --git a/linden/indra/newview/lltoolselectland.cpp b/linden/indra/newview/lltoolselectland.cpp
index dae8288..bbbda58 100644
--- a/linden/indra/newview/lltoolselectland.cpp
+++ b/linden/indra/newview/lltoolselectland.cpp
@@ -45,7 +45,6 @@
45#include "lltoolview.h" 45#include "lltoolview.h"
46#include "llviewerparcelmgr.h" 46#include "llviewerparcelmgr.h"
47#include "llviewerwindow.h" 47#include "llviewerwindow.h"
48#include "viewer.h"
49 48
50// Globals 49// Globals
51LLToolSelectLand *gToolParcel = NULL; 50LLToolSelectLand *gToolParcel = NULL;
diff --git a/linden/indra/newview/lltoolselectrect.cpp b/linden/indra/newview/lltoolselectrect.cpp
index 505039d..dd1a01f 100644
--- a/linden/indra/newview/lltoolselectrect.cpp
+++ b/linden/indra/newview/lltoolselectrect.cpp
@@ -48,7 +48,6 @@
48#include "llviewerobjectlist.h" 48#include "llviewerobjectlist.h"
49#include "llviewerwindow.h" 49#include "llviewerwindow.h"
50#include "llviewercamera.h" 50#include "llviewercamera.h"
51#include "viewer.h"
52 51
53#include "llglheaders.h" 52#include "llglheaders.h"
54 53
diff --git a/linden/indra/newview/lltracker.cpp b/linden/indra/newview/lltracker.cpp
index a35d7b5..4bab922 100644
--- a/linden/indra/newview/lltracker.cpp
+++ b/linden/indra/newview/lltracker.cpp
@@ -45,7 +45,7 @@
45#include "v4color.h" 45#include "v4color.h"
46 46
47// viewer includes 47// viewer includes
48#include "viewer.h" 48#include "llappviewer.h"
49#include "lltracker.h" 49#include "lltracker.h"
50#include "llagent.h" 50#include "llagent.h"
51#include "llcallingcard.h" 51#include "llcallingcard.h"
@@ -62,6 +62,7 @@
62#include "llviewerinventory.h" 62#include "llviewerinventory.h"
63#include "llworld.h" 63#include "llworld.h"
64#include "llworldmapview.h" 64#include "llworldmapview.h"
65#include "llviewercontrol.h"
65 66
66const F32 DESTINATION_REACHED_RADIUS = 3.0f; 67const F32 DESTINATION_REACHED_RADIUS = 3.0f;
67const F32 DESTINATION_VISITED_RADIUS = 6.0f; 68const F32 DESTINATION_VISITED_RADIUS = 6.0f;
diff --git a/linden/indra/newview/llurldispatcher.cpp b/linden/indra/newview/llurldispatcher.cpp
index ad2ef62..51b9505 100644
--- a/linden/indra/newview/llurldispatcher.cpp
+++ b/linden/indra/newview/llurldispatcher.cpp
@@ -48,9 +48,6 @@
48// library includes 48// library includes
49#include "llsd.h" 49#include "llsd.h"
50 50
51// system includes
52#include <boost/tokenizer.hpp>
53
54const std::string SLURL_SL_HELP_PREFIX = "secondlife://app."; 51const std::string SLURL_SL_HELP_PREFIX = "secondlife://app.";
55const std::string SLURL_SL_PREFIX = "sl://"; 52const std::string SLURL_SL_PREFIX = "sl://";
56const std::string SLURL_SECONDLIFE_PREFIX = "secondlife://"; 53const std::string SLURL_SECONDLIFE_PREFIX = "secondlife://";
@@ -111,7 +108,7 @@ bool LLURLDispatcherImpl::isSLURL(const std::string& url)
111 108
112// static 109// static
113bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url) 110bool LLURLDispatcherImpl::isSLURLCommand(const std::string& url)
114{ 111{
115 if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN) 112 if (matchPrefix(url, SLURL_SL_PREFIX + SLURL_APP_TOKEN)
116 || matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN) 113 || matchPrefix(url, SLURL_SECONDLIFE_PREFIX + "/" + SLURL_APP_TOKEN)
117 || matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) ) 114 || matchPrefix(url, SLURL_SLURL_PREFIX + SLURL_APP_TOKEN) )
@@ -128,6 +125,14 @@ bool LLURLDispatcherImpl::dispatchCore(const std::string& url, bool right_mouse)
128 if (dispatchHelp(url, right_mouse)) return true; 125 if (dispatchHelp(url, right_mouse)) return true;
129 if (dispatchApp(url, right_mouse)) return true; 126 if (dispatchApp(url, right_mouse)) return true;
130 if (dispatchRegion(url, right_mouse)) return true; 127 if (dispatchRegion(url, right_mouse)) return true;
128
129 /*
130 // Inform the user we can't handle this
131 std::map<std::string, std::string> args;
132 args["[SLURL]"] = url;
133 gViewerWindow->alertXml("BadURL", args);
134 */
135
131 return false; 136 return false;
132} 137}
133 138
@@ -164,41 +169,14 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url, BOOL right_mouse)
164 { 169 {
165 return false; 170 return false;
166 } 171 }
167 std::string s = stripProtocol(url);
168
169 // At this point, "secondlife://app/foo/bar/baz/" should be left
170 // as: "app/foo/bar/baz/"
171 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
172 boost::char_separator<char> sep("/", "", boost::drop_empty_tokens);
173 tokenizer tokens(s, sep);
174 tokenizer::iterator it = tokens.begin();
175 tokenizer::iterator end = tokens.end();
176
177 // Build parameter list suitable for LLDispatcher dispatch
178 if (it == end) return false;
179 if (*it != "app") return false;
180 ++it;
181
182 if (it == end) return false;
183 std::string cmd = *it;
184 ++it;
185
186 std::vector<std::string> params;
187 for ( ; it != end; ++it)
188 {
189 params.push_back(*it);
190 }
191 172
192 bool handled = LLCommandDispatcher::dispatch(cmd, params); 173 LLURI uri(url);
193 if (handled) return true; 174 LLSD pathArray = uri.pathArray();
194 175 pathArray.erase(0); // erase "app"
195 // Inform the user we can't handle this 176 std::string cmd = pathArray.get(0);
196 std::map<std::string, std::string> args; 177 pathArray.erase(0); // erase "cmd"
197 args["[SLURL]"] = url; 178 bool handled = LLCommandDispatcher::dispatch(cmd, pathArray, uri.queryMap());
198 gViewerWindow->alertXml("BadURL", args); 179 return handled;
199 // This was a SLURL with a /app prefix, and we "handled" it by displaying an error dialog,
200 // so return true. It doesn't need to be parsed any further.
201 return true;
202} 180}
203 181
204// static 182// static
@@ -211,14 +189,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous
211 189
212 // Before we're logged in, need to update the startup screen 190 // Before we're logged in, need to update the startup screen
213 // to tell the user where they are going. 191 // to tell the user where they are going.
214 if (LLStartUp::getStartupState() < STATE_CLEANUP) 192 if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
215 { 193 {
216 // Parse it and stash in globals, it will be dispatched in 194 // Parse it and stash in globals, it will be dispatched in
217 // STATE_CLEANUP. 195 // STATE_CLEANUP.
218 LLURLSimString::setString(url); 196 LLURLSimString::setString(url);
219 // We're at the login screen, so make sure user can see 197 // We're at the login screen, so make sure user can see
220 // the login location box to know where they are going. 198 // the login location box to know where they are going.
221 LLPanelLogin::refreshLocation( true ); 199 LLPanelLogin::loadLoginPage();
222 return true; 200 return true;
223 } 201 }
224 202
@@ -314,7 +292,7 @@ class LLTeleportHandler : public LLCommandHandler
314{ 292{
315public: 293public:
316 LLTeleportHandler() : LLCommandHandler("teleport") { } 294 LLTeleportHandler() : LLCommandHandler("teleport") { }
317 bool handle(const std::vector<std::string>& tokens) 295 bool handle(const LLSD& tokens, const LLSD& queryMap)
318 { 296 {
319 // construct a "normal" SLURL, resolve the region to 297 // construct a "normal" SLURL, resolve the region to
320 // a global position, and teleport to it 298 // a global position, and teleport to it
@@ -325,9 +303,9 @@ public:
325 303
326 // build secondlife://De%20Haro/123/45/67 for use in callback 304 // build secondlife://De%20Haro/123/45/67 for use in callback
327 std::string url = SLURL_SECONDLIFE_PREFIX; 305 std::string url = SLURL_SECONDLIFE_PREFIX;
328 for (size_t i = 0; i < tokens.size(); ++i) 306 for (int i = 0; i < tokens.size(); ++i)
329 { 307 {
330 url += tokens[i] + "/"; 308 url += tokens[i].asString() + "/";
331 } 309 }
332 gWorldMap->sendNamedRegionRequest(region_name, 310 gWorldMap->sendNamedRegionRequest(region_name,
333 LLURLDispatcherImpl::regionHandleCallback, 311 LLURLDispatcherImpl::regionHandleCallback,
diff --git a/linden/indra/newview/llurlsimstring.cpp b/linden/indra/newview/llurlsimstring.cpp
index efa3c5a..147589c 100644
--- a/linden/indra/newview/llurlsimstring.cpp
+++ b/linden/indra/newview/llurlsimstring.cpp
@@ -69,7 +69,6 @@ void LLURLSimString::setString(const LLString& sim_string)
69 idx = (idx == LLString::npos) ? 0 : idx+2; 69 idx = (idx == LLString::npos) ? 0 : idx+2;
70 sInstance.mSimString = tstring.substr(idx); 70 sInstance.mSimString = tstring.substr(idx);
71 } 71 }
72 LLPanelLogin::refreshLocation( false ); // in case LLPanelLogin is visible
73} 72}
74 73
75// "/100" -> 100 74// "/100" -> 100
diff --git a/linden/indra/newview/lluserauth.cpp b/linden/indra/newview/lluserauth.cpp
index 0f4c108..4534e88 100644
--- a/linden/indra/newview/lluserauth.cpp
+++ b/linden/indra/newview/lluserauth.cpp
@@ -38,7 +38,7 @@
38 38
39#include "lldir.h" 39#include "lldir.h"
40#include "llversionviewer.h" 40#include "llversionviewer.h"
41#include "viewer.h" 41#include "llappviewer.h"
42#include "llviewerbuild.h" 42#include "llviewerbuild.h"
43#include "llviewercontrol.h" 43#include "llviewercontrol.h"
44#include "llxmlrpctransaction.h" 44#include "llxmlrpctransaction.h"
@@ -82,13 +82,13 @@ LLUserAuth::~LLUserAuth()
82 mTransaction = NULL; 82 mTransaction = NULL;
83} 83}
84 84
85// passwd is already MD5 hashed by the time we get to it. 85
86void LLUserAuth::authenticate( 86void LLUserAuth::authenticate(
87 const char* auth_uri, 87 const char* auth_uri,
88 const char* method, 88 const char* method,
89 const char* firstname, 89 const char* firstname,
90 const char* lastname, 90 const char* lastname,
91 const char* passwd, 91 LLUUID web_login_key,
92 const char* start, 92 const char* start,
93 BOOL skip_optional, 93 BOOL skip_optional,
94 BOOL accept_tos, 94 BOOL accept_tos,
@@ -99,8 +99,6 @@ void LLUserAuth::authenticate(
99 const std::string& hashed_mac, 99 const std::string& hashed_mac,
100 const std::string& hashed_volume_serial) 100 const std::string& hashed_volume_serial)
101{ 101{
102 std::string dpasswd("$1$");
103 dpasswd.append(passwd);
104 llinfos << "Authenticating: " << firstname << " " << lastname << ", " 102 llinfos << "Authenticating: " << firstname << " " << lastname << ", "
105 << /*dpasswd.c_str() <<*/ llendl; 103 << /*dpasswd.c_str() <<*/ llendl;
106 std::ostringstream option_str; 104 std::ostringstream option_str;
@@ -122,7 +120,7 @@ void LLUserAuth::authenticate(
122 XMLRPC_VALUE params = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct); 120 XMLRPC_VALUE params = XMLRPC_CreateVector(NULL, xmlrpc_vector_struct);
123 XMLRPC_VectorAppendString(params, "first", firstname, 0); 121 XMLRPC_VectorAppendString(params, "first", firstname, 0);
124 XMLRPC_VectorAppendString(params, "last", lastname, 0); 122 XMLRPC_VectorAppendString(params, "last", lastname, 0);
125 XMLRPC_VectorAppendString(params, "passwd", dpasswd.c_str(), 0); 123 XMLRPC_VectorAppendString(params, "web_login_key", web_login_key.getString().c_str(), 0);
126 XMLRPC_VectorAppendString(params, "start", start, 0); 124 XMLRPC_VectorAppendString(params, "start", start, 0);
127 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name 125 XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name
128 XMLRPC_VectorAppendString(params, "channel", gChannelName.c_str(), 0); 126 XMLRPC_VectorAppendString(params, "channel", gChannelName.c_str(), 0);
diff --git a/linden/indra/newview/lluserauth.h b/linden/indra/newview/lluserauth.h
index d6ee1da..4169a7e 100644
--- a/linden/indra/newview/lluserauth.h
+++ b/linden/indra/newview/lluserauth.h
@@ -35,6 +35,8 @@
35#include <string> 35#include <string>
36#include <vector> 36#include <vector>
37#include <map> 37#include <map>
38typedef struct _xmlrpc_value* XMLRPC_VALUE;
39// forward ecl of types from xlrpc.h
38 40
39class LLXMLRPCTransaction; 41class LLXMLRPCTransaction;
40 42
@@ -96,7 +98,7 @@ public:
96 const char* auth_method, 98 const char* auth_method,
97 const char* firstname, 99 const char* firstname,
98 const char* lastname, 100 const char* lastname,
99 const char* passwd, 101 LLUUID web_login_key,
100 const char* start, 102 const char* start,
101 BOOL skip_optional_update, 103 BOOL skip_optional_update,
102 BOOL accept_tos, 104 BOOL accept_tos,
diff --git a/linden/indra/newview/llvectorperfoptions.cpp b/linden/indra/newview/llvectorperfoptions.cpp
new file mode 100644
index 0000000..f8b8dd5
--- /dev/null
+++ b/linden/indra/newview/llvectorperfoptions.cpp
@@ -0,0 +1,121 @@
1/**
2 * @file llvectorperfoptions.cpp
3 * @brief Control of vector perfomance options.
4 *
5 * $LicenseInfo:firstyear=2001&license=internal$
6 *
7 * Copyright (c) 2001-2007, Linden Research, Inc.
8 *
9 * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
10 * this source code is governed by the Linden Lab Source Code Disclosure
11 * Agreement ("Agreement") previously entered between you and Linden
12 * Lab. By accessing, using, copying, modifying or distributing this
13 * software, you acknowledge that you have been informed of your
14 * obligations under the Agreement and agree to abide by those obligations.
15 *
16 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
17 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
18 * COMPLETENESS OR PERFORMANCE.
19 * $/LicenseInfo$
20 */
21
22#include "llviewerprecompiledheaders.h"
23
24#include "llvectorperfoptions.h"
25#include "llviewerjointmesh.h"
26#include "llviewercontrol.h"
27
28// Initially, we test the performance of the vectorization code, then
29// turn it off if it ends up being slower. JC
30BOOL gVectorizePerfTest = TRUE;
31BOOL gVectorizeEnable = FALSE;
32U32 gVectorizeProcessor = 0;
33BOOL gVectorizeSkin = FALSE;
34
35void update_vector_performances(void)
36{
37 char *vp;
38
39 switch(gVectorizeProcessor)
40 {
41 case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
42 case 1: vp = "SSE"; break;
43 default: vp = "COMPILER DEFAULT"; break;
44 }
45 llinfos << "Vectorization : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ;
46 llinfos << "Vector Processor : " << vp << llendl ;
47 llinfos << "Vectorized Skinning : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ;
48
49 if(gVectorizeEnable && gVectorizeSkin)
50 {
51 switch(gVectorizeProcessor)
52 {
53 case 2:
54 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2;
55 break;
56 case 1:
57 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE;
58 break;
59 default:
60 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized;
61 break;
62 }
63 }
64 else
65 {
66 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal;
67 }
68}
69
70
71class LLVectorizationEnableListener: public LLSimpleListener
72{
73 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
74 {
75 gVectorizeEnable = event->getValue().asBoolean();
76 update_vector_performances();
77 return true;
78 }
79};
80static LLVectorizationEnableListener vectorization_enable_listener;
81
82class LLVectorizeSkinListener: public LLSimpleListener
83{
84 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
85 {
86 gVectorizeSkin = event->getValue().asBoolean();
87 update_vector_performances();
88 return true;
89 }
90};
91static LLVectorizeSkinListener vectorize_skin_listener;
92
93class LLVectorProcessorListener: public LLSimpleListener
94{
95 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
96 {
97 gVectorizeProcessor = event->getValue().asInteger();
98 update_vector_performances();
99 return true;
100 }
101};
102static LLVectorProcessorListener vector_processor_listener;
103
104void LLVectorPerformanceOptions::initClass()
105{
106 gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
107 gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
108 gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
109 gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
110 update_vector_performances();
111
112 // these are currently static in this file, so they can't move to settings_setup_listeners
113 gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener);
114 gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener);
115 gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener);
116}
117
118void LLVectorPerformanceOptions::cleanupClass()
119{
120}
121
diff --git a/linden/indra/newview/llvectorperfoptions.h b/linden/indra/newview/llvectorperfoptions.h
new file mode 100644
index 0000000..2d9135c
--- /dev/null
+++ b/linden/indra/newview/llvectorperfoptions.h
@@ -0,0 +1,31 @@
1/**
2 * @file llvectorperfoptions.h
3 * @brief Control of vector performance options
4 *
5 * $LicenseInfo:firstyear=2001&license=internal$
6 *
7 * Copyright (c) 2001-2007, Linden Research, Inc.
8 *
9 * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
10 * this source code is governed by the Linden Lab Source Code Disclosure
11 * Agreement ("Agreement") previously entered between you and Linden
12 * Lab. By accessing, using, copying, modifying or distributing this
13 * software, you acknowledge that you have been informed of your
14 * obligations under the Agreement and agree to abide by those obligations.
15 *
16 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
17 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
18 * COMPLETENESS OR PERFORMANCE.
19 * $/LicenseInfo$
20 */
21
22#ifndef LL_VECTORPERFOPTIONS_H
23#define LL_VECTORPERFOPTIONS_H
24
25namespace LLVectorPerformanceOptions
26{
27 void initClass(); // Run after configuration files are read.
28 void cleanupClass();
29};
30
31#endif
diff --git a/linden/indra/newview/llvieweraudio.cpp b/linden/indra/newview/llvieweraudio.cpp
new file mode 100644
index 0000000..fc11915
--- /dev/null
+++ b/linden/indra/newview/llvieweraudio.cpp
@@ -0,0 +1,228 @@
1/**
2 * @file llvieweraudio.cpp
3 * @brief Audio functions moved from viewer.cpp
4 *
5 * $LicenseInfo:firstyear=2000&license=internal$
6 *
7 * Copyright (c) 2000-2007, Linden Research, Inc.
8 *
9 * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
10 * this source code is governed by the Linden Lab Source Code Disclosure
11 * Agreement ("Agreement") previously entered between you and Linden
12 * Lab. By accessing, using, copying, modifying or distributing this
13 * software, you acknowledge that you have been informed of your
14 * obligations under the Agreement and agree to abide by those obligations.
15 *
16 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
17 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
18 * COMPLETENESS OR PERFORMANCE.
19 * $/LicenseInfo$
20 */
21
22#include "llviewerprecompiledheaders.h"
23
24#include "llvieweraudio.h"
25#include "audioengine.h"
26#include "llviewercontrol.h"
27#include "llmediaengine.h"
28#include "llagent.h"
29#include "llappviewer.h"
30#include "llvoiceclient.h"
31#include "llviewerwindow.h"
32#include "llviewercamera.h"
33
34/////////////////////////////////////////////////////////
35
36void init_audio()
37{
38 if (!gAudiop)
39 {
40 llwarns << "Failed to create an appropriate Audio Engine" << llendl;
41 return;
42 }
43 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
44 LLVector3 lpos_global_f;
45
46 lpos_global_f.setVec(lpos_global);
47
48 gAudiop->setListener(lpos_global_f,
49 LLVector3::zero, // gCamera->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
50 gCamera->getUpAxis(),
51 gCamera->getAtAxis());
52
53// load up our initial set of sounds we'll want so they're in memory and ready to be played
54
55 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
56
57 if (!mute_audio && gPreloadSounds)
58 {
59 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
60 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
61 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
62 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
63 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
64 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
65 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
66 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
67 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
68 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
69 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
70 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
71 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
72 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
73 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
74 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
75 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
76 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
77 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
78 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
79 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
80 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
81 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
82 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
83 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
84 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
85 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
86 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
87 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
88 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
89 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
90 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
91 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
92 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
93 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
94 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
95 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
96 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
97 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
98 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
99 }
100
101 audio_update_volume(true);
102}
103
104void audio_update_volume(bool force_update)
105{
106 F32 master_volume = gSavedSettings.getF32("AudioLevelMaster");
107 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
108 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
109 {
110 mute_audio = TRUE;
111 }
112 F32 mute_volume = mute_audio ? 0.0f : 1.0f;
113
114 // Sound Effects
115 if (gAudiop)
116 {
117 gAudiop->setMasterGain ( master_volume );
118
119 gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
120 gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance"));
121 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
122#ifdef kAUDIO_ENABLE_WIND
123 gAudiop->enableWind(!mute_audio);
124#endif
125
126 gAudiop->setMuted(mute_audio);
127
128 if (force_update)
129 {
130 audio_update_wind(true);
131 }
132 }
133
134 // Streaming Music
135 if (gAudiop)
136 {
137 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
138 music_volume = mute_volume * master_volume * (music_volume*music_volume);
139 gAudiop->setInternetStreamGain ( music_volume );
140 }
141
142 // Streaming Media
143 if(LLMediaEngine::getInstance())
144 {
145 F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
146 media_volume = mute_volume * master_volume * (media_volume*media_volume);
147 LLMediaEngine::getInstance()->setVolume(media_volume);
148 }
149
150 // Voice
151 if (gVoiceClient)
152 {
153 F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice");
154 voice_volume = mute_volume * master_volume * voice_volume;
155 gVoiceClient->setVoiceVolume(voice_volume);
156 gVoiceClient->setMicGain(gSavedSettings.getF32("AudioLevelMic"));
157
158 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
159 {
160 gVoiceClient->setMuteMic(true);
161 }
162 else
163 {
164 gVoiceClient->setMuteMic(false);
165 }
166 }
167}
168
169void audio_update_listener()
170{
171 if (gAudiop)
172 {
173 // update listener position because agent has moved
174 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
175 LLVector3 lpos_global_f;
176 lpos_global_f.setVec(lpos_global);
177
178 gAudiop->setListener(lpos_global_f,
179 // gCameraVelocitySmoothed,
180 // LLVector3::zero,
181 gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity!
182 gCamera->getUpAxis(),
183 gCamera->getAtAxis());
184 }
185}
186
187void audio_update_wind(bool force_update)
188{
189#ifdef kAUDIO_ENABLE_WIND
190 //
191 // Extract height above water to modulate filter by whether above/below water
192 //
193 LLViewerRegion* region = gAgent.getRegion();
194 if (region)
195 {
196 static F32 last_camera_water_height = -1000.f;
197 LLVector3 camera_pos = gAgent.getCameraPositionAgent();
198 F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
199
200 //
201 // Don't update rolloff factor unless water surface has been crossed
202 //
203 if (force_update || (last_camera_water_height * camera_water_height) < 0.f)
204 {
205 if (camera_water_height < 0.f)
206 {
207 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
208 }
209 else
210 {
211 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
212 }
213 }
214 // this line rotates the wind vector to be listener (agent) relative
215 // unfortunately we have to pre-translate to undo the translation that
216 // occurs in the transform call
217 gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
218
219 // don't use the setter setMaxWindGain() because we don't
220 // want to screw up the fade-in on startup by setting actual source gain
221 // outside the fade-in.
222 gAudiop->mMaxWindGain = gSavedSettings.getF32("AudioLevelAmbient");
223
224 last_camera_water_height = camera_water_height;
225 gAudiop->updateWind(gRelativeWindVec, camera_water_height);
226 }
227#endif
228}
diff --git a/linden/indra/newview/llvieweraudio.h b/linden/indra/newview/llvieweraudio.h
new file mode 100644
index 0000000..c01da0e
--- /dev/null
+++ b/linden/indra/newview/llvieweraudio.h
@@ -0,0 +1,30 @@
1/**
2 * @file llvieweraudio.h
3 * @brief Audio functions originally in viewer.cpp
4 *
5 * $LicenseInfo:firstyear=2000&license=internal$
6 *
7 * Copyright (c) 2000-2007, Linden Research, Inc.
8 *
9 * The following source code is PROPRIETARY AND CONFIDENTIAL. Use of
10 * this source code is governed by the Linden Lab Source Code Disclosure
11 * Agreement ("Agreement") previously entered between you and Linden
12 * Lab. By accessing, using, copying, modifying or distributing this
13 * software, you acknowledge that you have been informed of your
14 * obligations under the Agreement and agree to abide by those obligations.
15 *
16 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
17 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
18 * COMPLETENESS OR PERFORMANCE.
19 * $/LicenseInfo$
20 */
21
22#ifndef LL_VIEWERAUDIO_H
23#define LL_VIEWERAUDIO_H
24
25void init_audio();
26void audio_update_volume(bool force_update = true);
27void audio_update_listener();
28void audio_update_wind(bool force_update = true);
29
30#endif //LL_VIEWER_H
diff --git a/linden/indra/newview/llviewercamera.h b/linden/indra/newview/llviewercamera.h
index a5b7b6f..5a655cb 100644
--- a/linden/indra/newview/llviewercamera.h
+++ b/linden/indra/newview/llviewercamera.h
@@ -47,6 +47,9 @@ const F32 OGL_TO_CFR_ROTATION[16] = { 0.f, 0.f, -1.f, 0.f, // -Z becomes X
47 0.f, 1.f, 0.f, 0.f, // Y becomes Z 47 0.f, 1.f, 0.f, 0.f, // Y becomes Z
48 0.f, 0.f, 0.f, 1.f }; 48 0.f, 0.f, 0.f, 1.f };
49 49
50const BOOL FOR_SELECTION = TRUE;
51const BOOL NOT_FOR_SELECTION = FALSE;
52
50class LLViewerCamera : public LLCamera 53class LLViewerCamera : public LLCamera
51{ 54{
52public: 55public:
diff --git a/linden/indra/newview/llviewercontrol.cpp b/linden/indra/newview/llviewercontrol.cpp
index 79ec70f..250b250 100644
--- a/linden/indra/newview/llviewercontrol.cpp
+++ b/linden/indra/newview/llviewercontrol.cpp
@@ -50,6 +50,10 @@
50#include "llspinctrl.h" 50#include "llspinctrl.h"
51#include "llcolorswatch.h" 51#include "llcolorswatch.h"
52 52
53#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
54BOOL gHackGodmode = FALSE;
55#endif
56
53LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL; 57LLFloaterSettingsDebug* LLFloaterSettingsDebug::sInstance = NULL;
54 58
55LLControlGroup gSavedSettings; // saved at end of session 59LLControlGroup gSavedSettings; // saved at end of session
diff --git a/linden/indra/newview/llviewercontrol.h b/linden/indra/newview/llviewercontrol.h
index 3151261..8a3191d 100644
--- a/linden/indra/newview/llviewercontrol.h
+++ b/linden/indra/newview/llviewercontrol.h
@@ -36,6 +36,13 @@
36#include "llfloater.h" 36#include "llfloater.h"
37#include "lltexteditor.h" 37#include "lltexteditor.h"
38 38
39// Enabled this definition to compile a 'hacked' viewer that
40// allows a hacked godmode to be toggled on and off.
41#define TOGGLE_HACKED_GODLIKE_VIEWER
42#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
43extern BOOL gHackGodmode;
44#endif
45
39class LLFloaterSettingsDebug : public LLFloater 46class LLFloaterSettingsDebug : public LLFloater
40{ 47{
41public: 48public:
diff --git a/linden/indra/newview/llviewerdisplay.cpp b/linden/indra/newview/llviewerdisplay.cpp
index 24b8105..6018431 100644
--- a/linden/indra/newview/llviewerdisplay.cpp
+++ b/linden/indra/newview/llviewerdisplay.cpp
@@ -62,7 +62,7 @@
62#include "llvograss.h" 62#include "llvograss.h"
63#include "llworld.h" 63#include "llworld.h"
64#include "pipeline.h" 64#include "pipeline.h"
65#include "viewer.h" 65#include "llappviewer.h"
66#include "llstartup.h" 66#include "llstartup.h"
67#include "llfasttimer.h" 67#include "llfasttimer.h"
68#include "llfloatertools.h" 68#include "llfloatertools.h"
@@ -72,14 +72,11 @@
72#include "llviewerregion.h" 72#include "llviewerregion.h"
73#include "lldrawpoolwater.h" 73#include "lldrawpoolwater.h"
74 74
75extern U32 gFrameCount;
76extern LLPointer<LLImageGL> gStartImageGL; 75extern LLPointer<LLImageGL> gStartImageGL;
77extern LLPointer<LLImageGL> gDisconnectedImagep;
78extern BOOL gLogoutRequestSent;
79extern LLTimer gLogoutTimer;
80extern BOOL gHaveSavedSnapshot;
81extern BOOL gDisplaySwapBuffers; 76extern BOOL gDisplaySwapBuffers;
82 77
78LLPointer<LLImageGL> gDisconnectedImagep = NULL;
79
83// used to toggle renderer back on after teleport 80// used to toggle renderer back on after teleport
84const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain 81const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain
85const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived. 82const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.
@@ -99,7 +96,7 @@ void render_ui_3d();
99void render_ui_2d(); 96void render_ui_2d();
100void render_disconnected_background(); 97void render_disconnected_background();
101 98
102void process_keystrokes_async(); // in viewer.cpp 99void process_keystrokes_async();
103 100
104void display_startup() 101void display_startup()
105{ 102{
@@ -331,7 +328,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
331 break; 328 break;
332 } 329 }
333 } 330 }
334 else if(gLogoutRequestSent) 331 else if(LLAppViewer::instance()->logoutRequestSent())
335 { 332 {
336 F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime; 333 F32 percent_done = gLogoutTimer.getElapsedTimeF32() * 100.f / gLogoutMaxTime;
337 if (percent_done > 100.f) 334 if (percent_done > 100.f)
@@ -339,7 +336,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
339 percent_done = 100.f; 336 percent_done = 100.f;
340 } 337 }
341 338
342 if( gQuit ) 339 if( LLApp::isExiting() )
343 { 340 {
344 percent_done = 100.f; 341 percent_done = 100.f;
345 } 342 }
@@ -358,7 +355,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
358 else 355 else
359 { 356 {
360 357
361 if( gQuit ) 358 if( LLApp::isExiting() )
362 { 359 {
363 percent_done = 100.f; 360 percent_done = 100.f;
364 } 361 }
@@ -554,7 +551,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield)
554 // glPopMatrix(); 551 // glPopMatrix();
555 //} 552 //}
556 553
557 if (!(gLogoutRequestSent && gHaveSavedSnapshot) 554 if (!(LLAppViewer::instance()->logoutRequestSent() && LLAppViewer::instance()->hasSavedFinalSnapshot())
558 && !gRestoreGL 555 && !gRestoreGL
559 && !gDisconnected) 556 && !gDisconnected)
560 { 557 {
@@ -745,6 +742,74 @@ void render_ui_and_swap()
745 } 742 }
746} 743}
747 744
745void renderCoordinateAxes()
746{
747 LLGLSNoTexture gls_no_texture;
748 glBegin(GL_LINES);
749 glColor3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red
750 glVertex3f(0.0f, 0.0f, 0.0f);
751 glVertex3f(2.0f, 0.0f, 0.0f);
752 glVertex3f(3.0f, 0.0f, 0.0f);
753 glVertex3f(5.0f, 0.0f, 0.0f);
754 glVertex3f(6.0f, 0.0f, 0.0f);
755 glVertex3f(8.0f, 0.0f, 0.0f);
756 // Make an X
757 glVertex3f(11.0f, 1.0f, 1.0f);
758 glVertex3f(11.0f, -1.0f, -1.0f);
759 glVertex3f(11.0f, 1.0f, -1.0f);
760 glVertex3f(11.0f, -1.0f, 1.0f);
761
762 glColor3f(0.0f, 1.0f, 0.0f); // j direction = Y-Axis = green
763 glVertex3f(0.0f, 0.0f, 0.0f);
764 glVertex3f(0.0f, 2.0f, 0.0f);
765 glVertex3f(0.0f, 3.0f, 0.0f);
766 glVertex3f(0.0f, 5.0f, 0.0f);
767 glVertex3f(0.0f, 6.0f, 0.0f);
768 glVertex3f(0.0f, 8.0f, 0.0f);
769 // Make a Y
770 glVertex3f(1.0f, 11.0f, 1.0f);
771 glVertex3f(0.0f, 11.0f, 0.0f);
772 glVertex3f(-1.0f, 11.0f, 1.0f);
773 glVertex3f(0.0f, 11.0f, 0.0f);
774 glVertex3f(0.0f, 11.0f, 0.0f);
775 glVertex3f(0.0f, 11.0f, -1.0f);
776
777 glColor3f(0.0f, 0.0f, 1.0f); // Z-Axis = blue
778 glVertex3f(0.0f, 0.0f, 0.0f);
779 glVertex3f(0.0f, 0.0f, 2.0f);
780 glVertex3f(0.0f, 0.0f, 3.0f);
781 glVertex3f(0.0f, 0.0f, 5.0f);
782 glVertex3f(0.0f, 0.0f, 6.0f);
783 glVertex3f(0.0f, 0.0f, 8.0f);
784 // Make a Z
785 glVertex3f(-1.0f, 1.0f, 11.0f);
786 glVertex3f(1.0f, 1.0f, 11.0f);
787 glVertex3f(1.0f, 1.0f, 11.0f);
788 glVertex3f(-1.0f, -1.0f, 11.0f);
789 glVertex3f(-1.0f, -1.0f, 11.0f);
790 glVertex3f(1.0f, -1.0f, 11.0f);
791 glEnd();
792}
793
794
795void draw_axes()
796{
797 LLGLSUIDefault gls_ui;
798 LLGLSNoTexture gls_no_texture;
799 // A vertical white line at origin
800 LLVector3 v = gAgent.getPositionAgent();
801 glBegin(GL_LINES);
802 glColor3f(1.0f, 1.0f, 1.0f);
803 glVertex3f(0.0f, 0.0f, 0.0f);
804 glVertex3f(0.0f, 0.0f, 40.0f);
805 glEnd();
806 // Some coordinate axes
807 glPushMatrix();
808 glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
809 renderCoordinateAxes();
810 glPopMatrix();
811}
812
748void render_ui_3d() 813void render_ui_3d()
749{ 814{
750 LLGLSPipeline gls_pipeline; 815 LLGLSPipeline gls_pipeline;
@@ -841,73 +906,6 @@ void render_ui_2d()
841 LLFontGL::sCurOrigin.set(0, 0); 906 LLFontGL::sCurOrigin.set(0, 0);
842} 907}
843 908
844void renderCoordinateAxes()
845{
846 LLGLSNoTexture gls_no_texture;
847 glBegin(GL_LINES);
848 glColor3f(1.0f, 0.0f, 0.0f); // i direction = X-Axis = red
849 glVertex3f(0.0f, 0.0f, 0.0f);
850 glVertex3f(2.0f, 0.0f, 0.0f);
851 glVertex3f(3.0f, 0.0f, 0.0f);
852 glVertex3f(5.0f, 0.0f, 0.0f);
853 glVertex3f(6.0f, 0.0f, 0.0f);
854 glVertex3f(8.0f, 0.0f, 0.0f);
855 // Make an X
856 glVertex3f(11.0f, 1.0f, 1.0f);
857 glVertex3f(11.0f, -1.0f, -1.0f);
858 glVertex3f(11.0f, 1.0f, -1.0f);
859 glVertex3f(11.0f, -1.0f, 1.0f);
860
861 glColor3f(0.0f, 1.0f, 0.0f); // j direction = Y-Axis = green
862 glVertex3f(0.0f, 0.0f, 0.0f);
863 glVertex3f(0.0f, 2.0f, 0.0f);
864 glVertex3f(0.0f, 3.0f, 0.0f);
865 glVertex3f(0.0f, 5.0f, 0.0f);
866 glVertex3f(0.0f, 6.0f, 0.0f);
867 glVertex3f(0.0f, 8.0f, 0.0f);
868 // Make a Y
869 glVertex3f(1.0f, 11.0f, 1.0f);
870 glVertex3f(0.0f, 11.0f, 0.0f);
871 glVertex3f(-1.0f, 11.0f, 1.0f);
872 glVertex3f(0.0f, 11.0f, 0.0f);
873 glVertex3f(0.0f, 11.0f, 0.0f);
874 glVertex3f(0.0f, 11.0f, -1.0f);
875
876 glColor3f(0.0f, 0.0f, 1.0f); // Z-Axis = blue
877 glVertex3f(0.0f, 0.0f, 0.0f);
878 glVertex3f(0.0f, 0.0f, 2.0f);
879 glVertex3f(0.0f, 0.0f, 3.0f);
880 glVertex3f(0.0f, 0.0f, 5.0f);
881 glVertex3f(0.0f, 0.0f, 6.0f);
882 glVertex3f(0.0f, 0.0f, 8.0f);
883 // Make a Z
884 glVertex3f(-1.0f, 1.0f, 11.0f);
885 glVertex3f(1.0f, 1.0f, 11.0f);
886 glVertex3f(1.0f, 1.0f, 11.0f);
887 glVertex3f(-1.0f, -1.0f, 11.0f);
888 glVertex3f(-1.0f, -1.0f, 11.0f);
889 glVertex3f(1.0f, -1.0f, 11.0f);
890 glEnd();
891}
892
893void draw_axes()
894{
895 LLGLSUIDefault gls_ui;
896 LLGLSNoTexture gls_no_texture;
897 // A vertical white line at origin
898 LLVector3 v = gAgent.getPositionAgent();
899 glBegin(GL_LINES);
900 glColor3f(1.0f, 1.0f, 1.0f);
901 glVertex3f(0.0f, 0.0f, 0.0f);
902 glVertex3f(0.0f, 0.0f, 40.0f);
903 glEnd();
904 // Some coordinate axes
905 glPushMatrix();
906 glTranslatef( v.mV[VX], v.mV[VY], v.mV[VZ] );
907 renderCoordinateAxes();
908 glPopMatrix();
909}
910
911 909
912void render_disconnected_background() 910void render_disconnected_background()
913{ 911{
@@ -984,3 +982,48 @@ void render_disconnected_background()
984 glPopMatrix(); 982 glPopMatrix();
985 } 983 }
986} 984}
985
986void display_cleanup()
987{
988 gDisconnectedImagep = NULL;
989}
990
991void process_keystrokes_async()
992{
993#if LL_WINDOWS
994 MSG msg;
995 // look through all input messages, leaving them in the event queue
996 while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE | PM_NOYIELD))
997 {
998 // on first mouse message, break out
999 if (msg.message >= WM_MOUSEFIRST &&
1000 msg.message <= WM_MOUSELAST ||
1001 msg.message == WM_QUIT)
1002 {
1003 break;
1004 }
1005
1006 // this is a message we want to handle now, so remove it from the event queue
1007 PeekMessage(&msg, NULL, msg.message, msg.message, PM_REMOVE | PM_NOYIELD);
1008 // if (msg.message == WM_KEYDOWN)
1009 // {
1010 // llinfos << "Process async key down " << (U32)msg.wParam << llendl;
1011 // }
1012 TranslateMessage(&msg);
1013 DispatchMessage(&msg);
1014 }
1015
1016 // Scan keyboard for movement keys. Command keys and typing
1017 // are handled by windows callbacks. Don't do this until we're
1018 // done initializing. JC
1019 if (gViewerWindow->mWindow->getVisible()
1020 && gViewerWindow->getActive()
1021 && !gViewerWindow->mWindow->getMinimized()
1022 && LLStartUp::getStartupState() == STATE_STARTED
1023 && !gViewerWindow->getShowProgress()
1024 && !gFocusMgr.focusLocked())
1025 {
1026 gKeyboard->scanKeyboard();
1027 }
1028#endif
1029}
diff --git a/linden/indra/newview/llviewerdisplay.h b/linden/indra/newview/llviewerdisplay.h
index b42c6e9..2bf784c 100644
--- a/linden/indra/newview/llviewerdisplay.h
+++ b/linden/indra/newview/llviewerdisplay.h
@@ -33,8 +33,13 @@
33#define LL_LLVIEWERDISPLAY_H 33#define LL_LLVIEWERDISPLAY_H
34 34
35void display_startup(); 35void display_startup();
36void display_cleanup();
36 37
37extern BOOL gDisplaySwapBuffers; 38void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0);
38 39
40extern BOOL gDisplaySwapBuffers;
41extern BOOL gTeleportDisplay;
42extern LLFrameTimer gTeleportDisplayTimer;
43extern BOOL gForceRenderLandFence;
39 44
40#endif // LL_LLVIEWERDISPLAY_H 45#endif // LL_LLVIEWERDISPLAY_H
diff --git a/linden/indra/newview/llviewerimage.cpp b/linden/indra/newview/llviewerimage.cpp
index 240ffa5..d67bec1 100644
--- a/linden/indra/newview/llviewerimage.cpp
+++ b/linden/indra/newview/llviewerimage.cpp
@@ -57,8 +57,7 @@
57#include "llviewerimagelist.h" 57#include "llviewerimagelist.h"
58#include "llviewercontrol.h" 58#include "llviewercontrol.h"
59#include "pipeline.h" 59#include "pipeline.h"
60#include "viewer.h" 60#include "llappviewer.h"
61
62/////////////////////////////////////////////////////////////////////////////// 61///////////////////////////////////////////////////////////////////////////////
63 62
64// statics 63// statics
@@ -294,7 +293,7 @@ LLViewerImage::~LLViewerImage()
294{ 293{
295 if (mHasFetcher) 294 if (mHasFetcher)
296 { 295 {
297 gTextureFetch->deleteRequest(getID(), true); 296 LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);
298 } 297 }
299 // Explicitly call LLViewerImage::cleanup since we're in a destructor and cleanup is virtual 298 // Explicitly call LLViewerImage::cleanup since we're in a destructor and cleanup is virtual
300 LLViewerImage::cleanup(); 299 LLViewerImage::cleanup();
@@ -557,9 +556,9 @@ void LLViewerImage::processTextureStats()
557F32 LLViewerImage::calcDecodePriority() 556F32 LLViewerImage::calcDecodePriority()
558{ 557{
559#ifndef LL_RELEASE_FOR_DOWNLOAD 558#ifndef LL_RELEASE_FOR_DOWNLOAD
560 if (mID == gTextureFetch->mDebugID) 559 if (mID == LLAppViewer::getTextureFetch()->mDebugID)
561 { 560 {
562 gTextureFetch->mDebugCount++; // for setting breakpoints 561 LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints
563 } 562 }
564#endif 563#endif
565 564
@@ -695,9 +694,9 @@ bool LLViewerImage::updateFetch()
695 mRequestDeltaTime = 999999.f; 694 mRequestDeltaTime = 999999.f;
696 695
697#ifndef LL_RELEASE_FOR_DOWNLOAD 696#ifndef LL_RELEASE_FOR_DOWNLOAD
698 if (mID == gTextureFetch->mDebugID) 697 if (mID == LLAppViewer::getTextureFetch()->mDebugID)
699 { 698 {
700 gTextureFetch->mDebugCount++; // for setting breakpoints 699 LLAppViewer::getTextureFetch()->mDebugCount++; // for setting breakpoints
701 } 700 }
702#endif 701#endif
703 702
@@ -735,14 +734,14 @@ bool LLViewerImage::updateFetch()
735 { 734 {
736 // Sets mRawDiscardLevel, mRawImage, mAuxRawImage 735 // Sets mRawDiscardLevel, mRawImage, mAuxRawImage
737 S32 fetch_discard = current_discard; 736 S32 fetch_discard = current_discard;
738 bool finished = gTextureFetch->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage); 737 bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage);
739 if (finished) 738 if (finished)
740 { 739 {
741 mIsFetching = FALSE; 740 mIsFetching = FALSE;
742 } 741 }
743 else 742 else
744 { 743 {
745 mFetchState = gTextureFetch->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, 744 mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
746 mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); 745 mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
747 } 746 }
748 747
@@ -803,7 +802,7 @@ bool LLViewerImage::updateFetch()
803 } 802 }
804 else if (mDecodePriority >= 0.f) 803 else if (mDecodePriority >= 0.f)
805 { 804 {
806 gTextureFetch->updateRequestPriority(mID, mDecodePriority); 805 LLAppViewer::getTextureFetch()->updateRequestPriority(mID, mDecodePriority);
807 } 806 }
808 } 807 }
809 808
@@ -859,14 +858,14 @@ bool LLViewerImage::updateFetch()
859 desired_discard = llmax(desired_discard, current_discard-2); 858 desired_discard = llmax(desired_discard, current_discard-2);
860 } 859 }
861 } 860 }
862 if (gTextureFetch->createRequest(getID(),getTargetHost(), decode_priority, 861 if (LLAppViewer::getTextureFetch()->createRequest(getID(),getTargetHost(), decode_priority,
863 w, h, c, desired_discard, 862 w, h, c, desired_discard,
864 needsAux())) 863 needsAux()))
865 { 864 {
866 mHasFetcher = TRUE; 865 mHasFetcher = TRUE;
867 mIsFetching = TRUE; 866 mIsFetching = TRUE;
868 mRequestedDiscardLevel = desired_discard; 867 mRequestedDiscardLevel = desired_discard;
869 mFetchState = gTextureFetch->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority, 868 mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
870 mFetchPriority, mFetchDeltaTime, mRequestDeltaTime); 869 mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
871 } 870 }
872 // if createRequest() failed, we're finishing up a request for this UUID, 871 // if createRequest() failed, we're finishing up a request for this UUID,
@@ -879,7 +878,7 @@ bool LLViewerImage::updateFetch()
879 if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME) 878 if (mLastPacketTimer.getElapsedTimeF32() > FETCH_IDLE_TIME)
880 { 879 {
881// llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl; 880// llinfos << "Deleting request: " << getID() << " Discard: " << current_discard << " <= min:" << mMinDiscardLevel << " or priority == 0: " << decode_priority << llendl;
882 gTextureFetch->deleteRequest(getID(), true); 881 LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);
883 mHasFetcher = FALSE; 882 mHasFetcher = FALSE;
884 } 883 }
885 } 884 }
@@ -893,7 +892,7 @@ void LLViewerImage::setIsMissingAsset()
893{ 892{
894 if (mHasFetcher) 893 if (mHasFetcher)
895 { 894 {
896 gTextureFetch->deleteRequest(getID(), true); 895 LLAppViewer::getTextureFetch()->deleteRequest(getID(), true);
897 mHasFetcher = FALSE; 896 mHasFetcher = FALSE;
898 mIsFetching = FALSE; 897 mIsFetching = FALSE;
899 mFetchState = 0; 898 mFetchState = 0;
diff --git a/linden/indra/newview/llviewerimagelist.cpp b/linden/indra/newview/llviewerimagelist.cpp
index a31ed86..43ac967 100644
--- a/linden/indra/newview/llviewerimagelist.cpp
+++ b/linden/indra/newview/llviewerimagelist.cpp
@@ -58,7 +58,7 @@
58#include "llviewerimage.h" 58#include "llviewerimage.h"
59#include "llviewerregion.h" 59#include "llviewerregion.h"
60#include "pipeline.h" 60#include "pipeline.h"
61#include "viewer.h" 61#include "llappviewer.h"
62 62
63//////////////////////////////////////////////////////////////////////////// 63////////////////////////////////////////////////////////////////////////////
64 64
@@ -327,7 +327,7 @@ static std::string get_texture_list_name()
327 327
328void LLViewerImageList::doPrefetchImages() 328void LLViewerImageList::doPrefetchImages()
329{ 329{
330 if (gPurgeCache) 330 if (LLAppViewer::instance()->getPurgeCache())
331 { 331 {
332 // cache was purged, no point 332 // cache was purged, no point
333 return; 333 return;
@@ -1028,9 +1028,9 @@ void LLViewerImageList::decodeAllImages(F32 max_time)
1028 S32 fetch_pending = 0; 1028 S32 fetch_pending = 0;
1029 while (1) 1029 while (1)
1030 { 1030 {
1031 gTextureCache->update(1); // unpauses the texture cache thread 1031 LLAppViewer::instance()->getTextureCache()->update(1); // unpauses the texture cache thread
1032 gImageDecodeThread->update(1); // unpauses the image thread 1032 LLAppViewer::instance()->getImageDecodeThread()->update(1); // unpauses the image thread
1033 fetch_pending = gTextureFetch->update(1); // unpauses the texture fetch thread 1033 fetch_pending = LLAppViewer::instance()->getTextureFetch()->update(1); // unpauses the texture fetch thread
1034 if (fetch_pending == 0 || timer.getElapsedTimeF32() > max_time) 1034 if (fetch_pending == 0 || timer.getElapsedTimeF32() > max_time)
1035 { 1035 {
1036 break; 1036 break;
@@ -1324,7 +1324,7 @@ void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_dat
1324 return; 1324 return;
1325 } 1325 }
1326 image->mLastPacketTimer.reset(); 1326 image->mLastPacketTimer.reset();
1327 bool res = gTextureFetch->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data); 1327 bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);
1328 if (!res) 1328 if (!res)
1329 { 1329 {
1330 delete[] data; 1330 delete[] data;
@@ -1388,7 +1388,7 @@ void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_dat
1388 return; 1388 return;
1389 } 1389 }
1390 image->mLastPacketTimer.reset(); 1390 image->mLastPacketTimer.reset();
1391 bool res = gTextureFetch->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data); 1391 bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data);
1392 if (!res) 1392 if (!res)
1393 { 1393 {
1394 delete[] data; 1394 delete[] data;
diff --git a/linden/indra/newview/llviewerinventory.cpp b/linden/indra/newview/llviewerinventory.cpp
index b436465..43e8589 100644
--- a/linden/indra/newview/llviewerinventory.cpp
+++ b/linden/indra/newview/llviewerinventory.cpp
@@ -41,7 +41,6 @@
41#include "llinventorymodel.h" 41#include "llinventorymodel.h"
42#include "llnotify.h" 42#include "llnotify.h"
43#include "llimview.h" 43#include "llimview.h"
44#include "viewer.h"
45#include "llgesturemgr.h" 44#include "llgesturemgr.h"
46 45
47#include "llinventoryview.h" 46#include "llinventoryview.h"
diff --git a/linden/indra/newview/llviewerjoystick.cpp b/linden/indra/newview/llviewerjoystick.cpp
index c3c504f..27e71c2 100644
--- a/linden/indra/newview/llviewerjoystick.cpp
+++ b/linden/indra/newview/llviewerjoystick.cpp
@@ -34,7 +34,7 @@
34#include "llviewerwindow.h" 34#include "llviewerwindow.h"
35#include "llviewercamera.h" 35#include "llviewercamera.h"
36#include "llviewerjoystick.h" 36#include "llviewerjoystick.h"
37#include "viewer.h" 37#include "llappviewer.h"
38#include "llkeyboard.h" 38#include "llkeyboard.h"
39 39
40static LLQuaternion sFlycamRotation; 40static LLQuaternion sFlycamRotation;
diff --git a/linden/indra/newview/llviewermenu.cpp b/linden/indra/newview/llviewermenu.cpp
index 8faa72c..a6fb7fa 100644
--- a/linden/indra/newview/llviewermenu.cpp
+++ b/linden/indra/newview/llviewermenu.cpp
@@ -191,7 +191,7 @@
191#include "llworldmap.h" 191#include "llworldmap.h"
192#include "object_flags.h" 192#include "object_flags.h"
193#include "pipeline.h" 193#include "pipeline.h"
194#include "viewer.h" 194#include "llappviewer.h"
195#include "roles_constants.h" 195#include "roles_constants.h"
196#include "llviewerjoystick.h" 196#include "llviewerjoystick.h"
197 197
@@ -218,8 +218,6 @@ LLVOAvatar* find_avatar_from_object( const LLUUID& object_id );
218 218
219void handle_test_load_url(void*); 219void handle_test_load_url(void*);
220 220
221extern void disconnect_viewer(void *);
222
223// 221//
224// Evil hackish imported globals 222// Evil hackish imported globals
225// 223//
@@ -227,8 +225,6 @@ extern BOOL gRenderLightGlows;
227extern BOOL gRenderAvatar; 225extern BOOL gRenderAvatar;
228extern BOOL gHideSelectedObjects; 226extern BOOL gHideSelectedObjects;
229extern BOOL gShowOverlayTitle; 227extern BOOL gShowOverlayTitle;
230extern BOOL gRandomizeFramerate;
231extern BOOL gPeriodicSlowFrame;
232extern BOOL gOcclusionCull; 228extern BOOL gOcclusionCull;
233extern BOOL gAllowSelectAvatar; 229extern BOOL gAllowSelectAvatar;
234 230
@@ -239,6 +235,7 @@ extern BOOL gAllowSelectAvatar;
239LLMenuBarGL *gMenuBarView = NULL; 235LLMenuBarGL *gMenuBarView = NULL;
240LLViewerMenuHolderGL *gMenuHolder = NULL; 236LLViewerMenuHolderGL *gMenuHolder = NULL;
241LLMenuGL *gPopupMenuView = NULL; 237LLMenuGL *gPopupMenuView = NULL;
238LLMenuBarGL *gLoginMenuBarView = NULL;
242 239
243// Pie menus 240// Pie menus
244LLPieMenu *gPieSelf = NULL; 241LLPieMenu *gPieSelf = NULL;
@@ -408,11 +405,16 @@ void handle_claim_public_land(void*);
408void handle_god_request_havok(void *); 405void handle_god_request_havok(void *);
409void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new avatar geometry 406void handle_god_request_avatar_geometry(void *); // Hack for easy testing of new avatar geometry
410void reload_personal_settings_overrides(void *); 407void reload_personal_settings_overrides(void *);
411void force_breakpoint(void *);
412void reload_vertex_shader(void *); 408void reload_vertex_shader(void *);
413void slow_mo_animations(void *); 409void slow_mo_animations(void *);
414void handle_disconnect_viewer(void *); 410void handle_disconnect_viewer(void *);
415 411
412void force_error_breakpoint(void *);
413void force_error_llerror(void *);
414void force_error_bad_memory_access(void *);
415void force_error_infinite_loop(void *);
416void force_error_software_exception(void *);
417
416void handle_stopall(void*); 418void handle_stopall(void*);
417//void handle_hinge(void*); 419//void handle_hinge(void*);
418//void handle_ptop(void*); 420//void handle_ptop(void*);
@@ -422,6 +424,7 @@ void handle_stopall(void*);
422BOOL enable_dehinge(void*); 424BOOL enable_dehinge(void*);
423void handle_force_delete(void*); 425void handle_force_delete(void*);
424void print_object_info(void*); 426void print_object_info(void*);
427void print_agent_nvpairs(void*);
425void show_debug_menus(); 428void show_debug_menus();
426void toggle_debug_menus(void*); 429void toggle_debug_menus(void*);
427void toggle_map( void* user_data ); 430void toggle_map( void* user_data );
@@ -446,7 +449,6 @@ void handle_force_unlock(void*);
446void handle_selected_texture_info(void*); 449void handle_selected_texture_info(void*);
447void handle_dump_image_list(void*); 450void handle_dump_image_list(void*);
448 451
449void handle_fullscreen_debug(void*);
450void handle_crash(void*); 452void handle_crash(void*);
451void handle_dump_followcam(void*); 453void handle_dump_followcam(void*);
452void handle_toggle_flycam(void*); 454void handle_toggle_flycam(void*);
@@ -749,6 +751,15 @@ void init_menus()
749 // Debug menu visiblity 751 // Debug menu visiblity
750 // 752 //
751 show_debug_menus(); 753 show_debug_menus();
754
755 gLoginMenuBarView = (LLMenuBarGL*)gUICtrlFactory->buildMenu("menu_login.xml", gMenuHolder);
756 LLRect menuBarRect = gLoginMenuBarView->getRect();
757 gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft, menuBarRect.mBottom));
758
759 gLoginMenuBarView->setBackgroundColor( color );
760
761 gMenuHolder->addChild(gLoginMenuBarView);
762
752} 763}
753 764
754void init_landmark_menu(LLMenuGL* menu) 765void init_landmark_menu(LLMenuGL* menu)
@@ -1061,16 +1072,18 @@ void init_client_menu(LLMenuGL* menu)
1061 &menu_check_control, 1072 &menu_check_control,
1062 (void*)"ShowConsoleWindow")); 1073 (void*)"ShowConsoleWindow"));
1063 1074
1064#ifndef LL_RELEASE_FOR_DOWNLOAD 1075 if(gQAMode && !gInProductionGrid)
1065 { 1076 {
1066 LLMenuGL* sub = NULL; 1077 LLMenuGL* sub = NULL;
1067 sub = new LLMenuGL("Debugging"); 1078 sub = new LLMenuGL("Debugging");
1068 sub->append(new LLMenuItemCallGL("Force Breakpoint", &force_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT)); 1079 sub->append(new LLMenuItemCallGL("Force Breakpoint", &force_error_breakpoint, NULL, NULL, 'B', MASK_CONTROL | MASK_ALT));
1069 sub->append(new LLMenuItemCallGL("LLError And Crash", &handle_crash)); 1080 sub->append(new LLMenuItemCallGL("Force LLError And Crash", &force_error_llerror));
1081 sub->append(new LLMenuItemCallGL("Force Bad Memory Access", &force_error_bad_memory_access));
1082 sub->append(new LLMenuItemCallGL("Force Infinite Loop", &force_error_infinite_loop));
1083 // *NOTE:Mani this isn't handled yet... sub->append(new LLMenuItemCallGL("Force Software Exception", &force_error_unhandled_exception));
1070 sub->createJumpKeys(); 1084 sub->createJumpKeys();
1071 menu->appendMenu(sub); 1085 menu->appendMenu(sub);
1072 } 1086 }
1073#endif
1074 1087
1075 // TomY Temporary menu item so we can test this floater 1088 // TomY Temporary menu item so we can test this floater
1076 menu->append(new LLMenuItemCheckGL("Clothing...", 1089 menu->append(new LLMenuItemCheckGL("Clothing...",
@@ -2372,7 +2385,6 @@ void callback_leave_group(S32 option, void *userdata)
2372 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); 2385 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
2373 msg->nextBlockFast(_PREHASH_GroupData); 2386 msg->nextBlockFast(_PREHASH_GroupData);
2374 msg->addUUIDFast(_PREHASH_GroupID, gAgent.mGroupID ); 2387 msg->addUUIDFast(_PREHASH_GroupID, gAgent.mGroupID );
2375 //msg->sendReliable( gUserServer );
2376 gAgent.sendReliableMessage(); 2388 gAgent.sendReliableMessage();
2377 } 2389 }
2378} 2390}
@@ -4689,6 +4701,24 @@ void print_object_info(void*)
4689 gSelectMgr->selectionDump(); 4701 gSelectMgr->selectionDump();
4690} 4702}
4691 4703
4704void print_agent_nvpairs(void*)
4705{
4706 LLViewerObject *objectp;
4707
4708 llinfos << "Agent Name Value Pairs" << llendl;
4709
4710 objectp = gObjectList.findObject(gAgentID);
4711 if (objectp)
4712 {
4713 objectp->printNameValuePairs();
4714 }
4715 else
4716 {
4717 llinfos << "Can't find agent object" << llendl;
4718 }
4719
4720 llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl;
4721}
4692 4722
4693void show_debug_menus() 4723void show_debug_menus()
4694{ 4724{
@@ -5174,18 +5204,6 @@ void handle_force_unlock(void*)
5174 gSelectMgr->getSelection()->applyToObjects(&func); 5204 gSelectMgr->getSelection()->applyToObjects(&func);
5175} 5205}
5176 5206
5177// Fullscreen debug stuff
5178void handle_fullscreen_debug(void*)
5179{
5180 llinfos << "Width " << gViewerWindow->getWindowWidth() << " Height " << gViewerWindow->getWindowHeight() << llendl;
5181 llinfos << "mouse_x_from_center(100) " << mouse_x_from_center(100) << " y " << mouse_y_from_center(100) << llendl;
5182}
5183
5184void handle_crash(void*)
5185{
5186 llerrs << "This is an llerror" << llendl;
5187}
5188
5189class LLWorldForceSun : public view_listener_t 5207class LLWorldForceSun : public view_listener_t
5190{ 5208{
5191 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 5209 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -6811,13 +6829,6 @@ void reload_personal_settings_overrides(void *)
6811 gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml")); 6829 gSavedSettings.loadFromFile(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,"overrides.xml"));
6812} 6830}
6813 6831
6814void force_breakpoint(void *)
6815{
6816#if LL_WINDOWS // Forcing a breakpoint
6817 DebugBreak();
6818#endif
6819}
6820
6821void reload_vertex_shader(void *) 6832void reload_vertex_shader(void *)
6822{ 6833{
6823 //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP 6834 //THIS WOULD BE AN AWESOME PLACE TO RELOAD SHADERS... just a thought - DaveP
@@ -6994,9 +7005,33 @@ void handle_disconnect_viewer(void *)
6994 7005
6995 snprintf(message, sizeof(message), "Testing viewer disconnect"); /* Flawfinder: ignore */ 7006 snprintf(message, sizeof(message), "Testing viewer disconnect"); /* Flawfinder: ignore */
6996 7007
6997 do_disconnect(message); 7008 LLAppViewer::instance()->forceDisconnect(message);
6998} 7009}
6999 7010
7011void force_error_breakpoint(void *)
7012{
7013 LLAppViewer::instance()->forceErrorBreakpoint();
7014}
7015
7016void force_error_llerror(void *)
7017{
7018 LLAppViewer::instance()->forceErrorLLError();
7019}
7020
7021void force_error_bad_memory_access(void *)
7022{
7023 LLAppViewer::instance()->forceErrorBadMemoryAccess();
7024}
7025
7026void force_error_infinite_loop(void *)
7027{
7028 LLAppViewer::instance()->forceErrorInifiniteLoop();
7029}
7030
7031void force_error_software_exception(void *)
7032{
7033 LLAppViewer::instance()->forceErrorSoftwareException();
7034}
7000 7035
7001class LLToolsUseSelectionForGrid : public view_listener_t 7036class LLToolsUseSelectionForGrid : public view_listener_t
7002{ 7037{
diff --git a/linden/indra/newview/llviewermenu.h b/linden/indra/newview/llviewermenu.h
index 55fab86..6814c31 100644
--- a/linden/indra/newview/llviewermenu.h
+++ b/linden/indra/newview/llviewermenu.h
@@ -141,6 +141,7 @@ extern LLMenuBarGL* gMenuBarView;
141//extern LLView* gMenuBarHolder; 141//extern LLView* gMenuBarHolder;
142extern LLMenuGL* gPopupMenuView; 142extern LLMenuGL* gPopupMenuView;
143extern LLViewerMenuHolderGL* gMenuHolder; 143extern LLViewerMenuHolderGL* gMenuHolder;
144extern LLMenuBarGL* gLoginMenuBarView;
144 145
145// Pie menus 146// Pie menus
146extern LLPieMenu *gPieSelf; 147extern LLPieMenu *gPieSelf;
diff --git a/linden/indra/newview/llviewermenufile.cpp b/linden/indra/newview/llviewermenufile.cpp
index 97b11fd..13ff55c 100644
--- a/linden/indra/newview/llviewermenufile.cpp
+++ b/linden/indra/newview/llviewermenufile.cpp
@@ -52,7 +52,8 @@
52#include "llviewerregion.h" 52#include "llviewerregion.h"
53#include "llviewerstats.h" 53#include "llviewerstats.h"
54#include "llviewerwindow.h" 54#include "llviewerwindow.h"
55#include "viewer.h" // app_request_quit() 55#include "llappviewer.h"
56
56 57
57// linden libraries 58// linden libraries
58#include "llassetuploadresponders.h" 59#include "llassetuploadresponders.h"
@@ -347,6 +348,16 @@ class LLFileCloseWindow : public view_listener_t
347 } 348 }
348}; 349};
349 350
351class LLFileEnableCloseAllWindows : public view_listener_t
352{
353 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
354 {
355 bool open_children = gFloaterView->allChildrenClosed();
356 gMenuHolder->findControl(userdata["control"].asString())->setValue(!open_children);
357 return true;
358 }
359};
360
350class LLFileCloseAllWindows : public view_listener_t 361class LLFileCloseAllWindows : public view_listener_t
351{ 362{
352 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 363 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
@@ -439,7 +450,7 @@ class LLFileQuit : public view_listener_t
439{ 450{
440 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) 451 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
441 { 452 {
442 app_user_quit(); 453 LLAppViewer::instance()->userQuit();
443 return true; 454 return true;
444 } 455 }
445}; 456};
@@ -1035,6 +1046,7 @@ void init_menu_file()
1035 (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow"); 1046 (new LLFileCloseWindow())->registerListener(gMenuHolder, "File.CloseWindow");
1036 (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows"); 1047 (new LLFileCloseAllWindows())->registerListener(gMenuHolder, "File.CloseAllWindows");
1037 (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow"); 1048 (new LLFileEnableCloseWindow())->registerListener(gMenuHolder, "File.EnableCloseWindow");
1049 (new LLFileEnableCloseAllWindows())->registerListener(gMenuHolder, "File.EnableCloseAllWindows");
1038 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); 1050 (new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture");
1039 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); 1051 (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
1040 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); 1052 (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
diff --git a/linden/indra/newview/llviewermessage.cpp b/linden/indra/newview/llviewermessage.cpp
index c337044..2011275 100644
--- a/linden/indra/newview/llviewermessage.cpp
+++ b/linden/indra/newview/llviewermessage.cpp
@@ -129,8 +129,9 @@
129#include "llweb.h" 129#include "llweb.h"
130#include "llworld.h" 130#include "llworld.h"
131#include "pipeline.h" 131#include "pipeline.h"
132#include "viewer.h" 132#include "llappviewer.h"
133#include "llfloaterworldmap.h" 133#include "llfloaterworldmap.h"
134#include "llviewerdisplay.h"
134#include "llkeythrottle.h" 135#include "llkeythrottle.h"
135 136
136#include <boost/tokenizer.hpp> 137#include <boost/tokenizer.hpp>
@@ -153,8 +154,6 @@ static const F32 LLREQUEST_PERMISSION_THROTTLE_INTERVAL = 10.0f; // seconds
153 154
154extern BOOL gDebugClicks; 155extern BOOL gDebugClicks;
155 156
156extern void bad_network_handler();
157
158// function prototypes 157// function prototypes
159void open_offer(const std::vector<LLUUID>& items, const std::string& from_name); 158void open_offer(const std::vector<LLUUID>& items, const std::string& from_name);
160void friendship_offer_callback(S32 option, void* user_data); 159void friendship_offer_callback(S32 option, void* user_data);
@@ -209,8 +208,8 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_
209 LLMessageSystem* msg = gMessageSystem; 208 LLMessageSystem* msg = gMessageSystem;
210 msg->newMessageFast(_PREHASH_MoneyTransferRequest); 209 msg->newMessageFast(_PREHASH_MoneyTransferRequest);
211 msg->nextBlockFast(_PREHASH_AgentData); 210 msg->nextBlockFast(_PREHASH_AgentData);
212 msg->addUUIDFast(_PREHASH_AgentID, agent_get_id()); 211 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
213 msg->addUUIDFast(_PREHASH_SessionID, agent_get_session_id()); 212 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
214 msg->nextBlockFast(_PREHASH_MoneyData); 213 msg->nextBlockFast(_PREHASH_MoneyData);
215 msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() ); 214 msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID() );
216 msg->addUUIDFast(_PREHASH_DestID, uuid); 215 msg->addUUIDFast(_PREHASH_DestID, uuid);
@@ -248,7 +247,7 @@ void process_logout_reply(LLMessageSystem* msg, void**)
248 msg->getUUID("AgentData", "AgentID", agent_id); 247 msg->getUUID("AgentData", "AgentID", agent_id);
249 LLUUID session_id; 248 LLUUID session_id;
250 msg->getUUID("AgentData", "SessionID", session_id); 249 msg->getUUID("AgentData", "SessionID", session_id);
251 if((agent_id != agent_get_id()) || (session_id != agent_get_session_id())) 250 if((agent_id != gAgent.getID()) || (session_id != gAgent.getSessionID()))
252 { 251 {
253 llwarns << "Bogus Logout Reply" << llendl; 252 llwarns << "Bogus Logout Reply" << llendl;
254 } 253 }
@@ -285,7 +284,7 @@ void process_logout_reply(LLMessageSystem* msg, void**)
285 gInventory.accountForUpdate(parents); 284 gInventory.accountForUpdate(parents);
286 gInventory.notifyObservers(); 285 gInventory.notifyObservers();
287 } 286 }
288 app_force_quit(NULL); 287 LLAppViewer::instance()->forceQuit();
289} 288}
290 289
291void process_layer_data(LLMessageSystem *mesgsys, void **user_data) 290void process_layer_data(LLMessageSystem *mesgsys, void **user_data)
@@ -789,7 +788,7 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
789 // Use the name of the last item giver, who is probably the person 788 // Use the name of the last item giver, who is probably the person
790 // spamming you. JC 789 // spamming you. JC
791 std::ostringstream message; 790 std::ostringstream message;
792 message << gSecondLife; 791 message << LLAppViewer::instance()->getSecondLifeTitle();
793 if (!from_name.empty()) 792 if (!from_name.empty())
794 { 793 {
795 message << ": Items coming in too fast from " << from_name; 794 message << ": Items coming in too fast from " << from_name;
@@ -2715,7 +2714,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
2715 << x << ":" << y 2714 << x << ":" << y
2716 << " current pos " << gAgent.getPositionGlobal() 2715 << " current pos " << gAgent.getPositionGlobal()
2717 << llendl; 2716 << llendl;
2718 do_disconnect("You were sent to an invalid region."); 2717 LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region.");
2719 return; 2718 return;
2720 2719
2721 } 2720 }
@@ -2895,7 +2894,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
2895 } 2894 }
2896 2895
2897 // We have already requested to log out. Don't send agent updates. 2896 // We have already requested to log out. Don't send agent updates.
2898 if(gLogoutRequestSent) 2897 if(LLAppViewer::instance()->logoutRequestSent())
2899 { 2898 {
2900 return; 2899 return;
2901 } 2900 }
@@ -3242,10 +3241,13 @@ void process_time_synch(LLMessageSystem *mesgsys, void **user_data)
3242 F32 phase; 3241 F32 phase;
3243 U64 space_time_usec; 3242 U64 space_time_usec;
3244 3243
3244 U32 seconds_per_day;
3245 U32 seconds_per_year;
3246
3245 // "SimulatorViewerTimeMessage" 3247 // "SimulatorViewerTimeMessage"
3246 mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec); 3248 mesgsys->getU64Fast(_PREHASH_TimeInfo, _PREHASH_UsecSinceStart, space_time_usec);
3247 mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, gSecondsPerDay); 3249 mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerDay, seconds_per_day);
3248 mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, gSecondsPerYear); 3250 mesgsys->getU32Fast(_PREHASH_TimeInfo, _PREHASH_SecPerYear, seconds_per_year);
3249 3251
3250 // This should eventually be moved to an "UpdateHeavenlyBodies" message 3252 // This should eventually be moved to an "UpdateHeavenlyBodies" message
3251 mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase); 3253 mesgsys->getF32Fast(_PREHASH_TimeInfo, _PREHASH_SunPhase, phase);
@@ -3930,7 +3932,7 @@ void process_kick_user(LLMessageSystem *msg, void** /*user_data*/)
3930 3932
3931 msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, 2048, message); 3933 msg->getStringFast(_PREHASH_UserInfo, _PREHASH_Reason, 2048, message);
3932 3934
3933 do_disconnect(message); 3935 LLAppViewer::instance()->forceDisconnect(message);
3934} 3936}
3935 3937
3936 3938
@@ -4069,18 +4071,18 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data)
4069 process_alert_core(buffer, modal); 4071 process_alert_core(buffer, modal);
4070} 4072}
4071 4073
4072void process_alert_core(const char* buffer, BOOL modal) 4074void process_alert_core(const std::string& message, BOOL modal)
4073{ 4075{
4074 // make sure the cursor is back to the usual default since the 4076 // make sure the cursor is back to the usual default since the
4075 // alert is probably due to some kind of error. 4077 // alert is probably due to some kind of error.
4076 gViewerWindow->getWindow()->resetBusyCount(); 4078 gViewerWindow->getWindow()->resetBusyCount();
4077 4079
4078 // HACK -- handle callbacks for specific alerts 4080 // HACK -- handle callbacks for specific alerts
4079 if( !strcmp( buffer, "You died and have been teleported to your home location" ) ) 4081 if ( message == "You died and have been teleported to your home location")
4080 { 4082 {
4081 gViewerStats->incStat(LLViewerStats::ST_KILLED_COUNT); 4083 gViewerStats->incStat(LLViewerStats::ST_KILLED_COUNT);
4082 } 4084 }
4083 else if( !strcmp( buffer, "Home position set." ) ) 4085 else if( message == "Home position set." )
4084 { 4086 {
4085 // save the home location image to disk 4087 // save the home location image to disk
4086 LLString snap_filename = gDirUtilp->getLindenUserDir(); 4088 LLString snap_filename = gDirUtilp->getLindenUserDir();
@@ -4089,19 +4091,26 @@ void process_alert_core(const char* buffer, BOOL modal)
4089 gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE); 4091 gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, FALSE);
4090 } 4092 }
4091 4093
4092 const char ALERT_PREFIX[] = "ALERT: "; 4094 const std::string ALERT_PREFIX("ALERT: ");
4093 const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1; 4095 const std::string NOTIFY_PREFIX("NOTIFY: ");
4094 if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN)) 4096 if (message.find(ALERT_PREFIX) == 0)
4095 { 4097 {
4096 // Allow the server to spawn a named alert so that server alerts can be 4098 // Allow the server to spawn a named alert so that server alerts can be
4097 // translated out of English. JC 4099 // translated out of English.
4098 std::string alert_name(buffer + ALERT_PREFIX_LEN); 4100 std::string alert_name(message.substr(ALERT_PREFIX.length()));
4099 LLAlertDialog::showXml(alert_name); 4101 LLAlertDialog::showXml(alert_name);
4100 } 4102 }
4101 else if (buffer[0] == '/') 4103 else if (message.find(NOTIFY_PREFIX) == 0)
4104 {
4105 // Allow the server to spawn a named notification so that server notifications can be
4106 // translated out of English.
4107 std::string notify_name(message.substr(NOTIFY_PREFIX.length()));
4108 LLNotifyBox::showXml(notify_name);
4109 }
4110 else if (message[0] == '/')
4102 { 4111 {
4103 // System message is important, show in upper-right box not tip 4112 // System message is important, show in upper-right box not tip
4104 LLString text(buffer+1); 4113 LLString text(message.substr(1));
4105 LLString::format_map_t args; 4114 LLString::format_map_t args;
4106 if (text.substr(0,17) == "RESTART_X_MINUTES") 4115 if (text.substr(0,17) == "RESTART_X_MINUTES")
4107 { 4116 {
@@ -4128,14 +4137,14 @@ void process_alert_core(const char* buffer, BOOL modal)
4128 { 4137 {
4129 // *TODO:translate 4138 // *TODO:translate
4130 LLString::format_map_t args; 4139 LLString::format_map_t args;
4131 args["[ERROR_MESSAGE]"] = buffer; 4140 args["[ERROR_MESSAGE]"] = message;
4132 gViewerWindow->alertXml("ErrorMessage", args); 4141 gViewerWindow->alertXml("ErrorMessage", args);
4133 } 4142 }
4134 else 4143 else
4135 { 4144 {
4136 // *TODO:translate 4145 // *TODO:translate
4137 LLString::format_map_t args; 4146 LLString::format_map_t args;
4138 args["[MESSAGE]"] = buffer; 4147 args["[MESSAGE]"] = message;
4139 LLNotifyBox::showXml("SystemMessageTip", args); 4148 LLNotifyBox::showXml("SystemMessageTip", args);
4140 } 4149 }
4141} 4150}
@@ -5365,7 +5374,7 @@ void invalid_message_callback(LLMessageSystem* msg,
5365 void*, 5374 void*,
5366 EMessageException exception) 5375 EMessageException exception)
5367{ 5376{
5368 bad_network_handler(); 5377 LLAppViewer::instance()->badNetworkHandler();
5369} 5378}
5370 5379
5371// Please do not add more message handlers here. This file is huge. 5380// Please do not add more message handlers here. This file is huge.
diff --git a/linden/indra/newview/llviewermessage.h b/linden/indra/newview/llviewermessage.h
index 2cbd163..2c5005c 100644
--- a/linden/indra/newview/llviewermessage.h
+++ b/linden/indra/newview/llviewermessage.h
@@ -110,7 +110,7 @@ void process_adjust_balance(LLMessageSystem* msg_system, void**);
110 110
111void process_alert_message(LLMessageSystem* msg, void**); 111void process_alert_message(LLMessageSystem* msg, void**);
112void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data); 112void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data);
113void process_alert_core(const char* buffer, BOOL modal); 113void process_alert_core(const std::string& message, BOOL modal);
114 114
115// "Mean" or player-vs-player abuse 115// "Mean" or player-vs-player abuse
116void handle_show_mean_events(void *); 116void handle_show_mean_events(void *);
diff --git a/linden/indra/newview/llviewernetwork.cpp b/linden/indra/newview/llviewernetwork.cpp
index 046f1f6..caa61d6 100644
--- a/linden/indra/newview/llviewernetwork.cpp
+++ b/linden/indra/newview/llviewernetwork.cpp
@@ -34,47 +34,47 @@
34 34
35#include "llviewernetwork.h" 35#include "llviewernetwork.h"
36 36
37LLUserServerData gUserServerDomainName[USERSERVER_COUNT] = 37LLGridData gGridInfo[GRID_INFO_COUNT] =
38{ 38{
39 { "None", "", "", ""}, 39 { "None", "", "", ""},
40 { "Aditi", 40 { "Aditi",
41 "userserver.aditi.lindenlab.com", 41 "util.aditi.lindenlab.com",
42 "https://login.aditi.lindenlab.com/cgi-bin/login.cgi", 42 "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
43 "http://aditi-secondlife.webdev.lindenlab.com/helpers/" }, 43 "http://aditi-secondlife.webdev.lindenlab.com/helpers/" },
44 { "Agni", 44 { "Agni",
45 "userserver.agni.lindenlab.com", 45 "util.agni.lindenlab.com",
46 "https://login.agni.lindenlab.com/cgi-bin/login.cgi", 46 "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
47 "https://secondlife.com/helpers/" }, 47 "https://secondlife.com/helpers/" },
48 { "DMZ", 48 { "DMZ",
49 "userserver.dmz.lindenlab.com", 49 "util.dmz.lindenlab.com",
50 "https://login.dmz.lindenlab.com/cgi-bin/login.cgi", 50 "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
51 "http://dmz-secondlife.webdev.lindenlab.com/helpers/" }, 51 "http://dmz-secondlife.webdev.lindenlab.com/helpers/" },
52 { "Siva", 52 { "Siva",
53 "userserver.siva.lindenlab.com", 53 "util.siva.lindenlab.com",
54 "https://login.siva.lindenlab.com/cgi-bin/login.cgi", 54 "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
55 "http://siva-secondlife.webdev.lindenlab.com/helpers/" }, 55 "http://siva-secondlife.webdev.lindenlab.com/helpers/" },
56 { "Durga", 56 { "Durga",
57 "userserver.durga.lindenlab.com", 57 "util.durga.lindenlab.com",
58 "https://login.durga.lindenlab.com/cgi-bin/login.cgi", 58 "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
59 "http://durga-secondlife.webdev.lindenlab.com/helpers/" }, 59 "http://durga-secondlife.webdev.lindenlab.com/helpers/" },
60 { "Shakti", 60 { "Shakti",
61 "userserver.shakti.lindenlab.com", 61 "util.shakti.lindenlab.com",
62 "https://login.shakti.lindenlab.com/cgi-bin/login.cgi", 62 "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
63 "http://shakti-secondlife.webdev.lindenlab.com/helpers/" }, 63 "http://shakti-secondlife.webdev.lindenlab.com/helpers/" },
64 { "Soma", 64 { "Soma",
65 "userserver.soma.lindenlab.com", 65 "util.soma.lindenlab.com",
66 "https://login.soma.lindenlab.com/cgi-bin/login.cgi", 66 "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
67 "http://soma-secondlife.webdev.lindenlab.com/helpers/" }, 67 "http://soma-secondlife.webdev.lindenlab.com/helpers/" },
68 { "Ganga", 68 { "Ganga",
69 "userserver.ganga.lindenlab.com", 69 "util.ganga.lindenlab.com",
70 "https://login.ganga.lindenlab.com/cgi-bin/login.cgi", 70 "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
71 "http://ganga-secondlife.webdev.lindenlab.com/helpers/" }, 71 "http://ganga-secondlife.webdev.lindenlab.com/helpers/" },
72 { "Vaak", 72 { "Vaak",
73 "userserver.vaak.lindenlab.com", 73 "util.vaak.lindenlab.com",
74 "https://login.vaak.lindenlab.com/cgi-bin/login.cgi", 74 "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
75 "http://vaak-secondlife.webdev.lindenlab.com/helpers/" }, 75 "http://vaak-secondlife.webdev.lindenlab.com/helpers/" },
76 { "Uma", 76 { "Uma",
77 "userserver.uma.lindenlab.com", 77 "util.uma.lindenlab.com",
78 "https://login.uma.lindenlab.com/cgi-bin/login.cgi", 78 "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
79 "http://uma-secondlife.webdev.lindenlab.com/helpers/" }, 79 "http://uma-secondlife.webdev.lindenlab.com/helpers/" },
80 { "Local", 80 { "Local",
@@ -89,10 +89,8 @@ LLUserServerData gUserServerDomainName[USERSERVER_COUNT] =
89 89
90// Use this to figure out which domain name and login URI to use. 90// Use this to figure out which domain name and login URI to use.
91 91
92EUserServerDomain gUserServerChoice = USERSERVER_NONE; 92EGridInfo gGridChoice = GRID_INFO_NONE;
93char gUserServerName[MAX_STRING]; /* Flawfinder: ignore */ 93char gGridName[MAX_STRING]; /* Flawfinder: ignore */
94
95LLHost gUserServer;
96 94
97F32 gPacketDropPercentage = 0.f; 95F32 gPacketDropPercentage = 0.f;
98F32 gInBandwidth = 0.f; 96F32 gInBandwidth = 0.f;
diff --git a/linden/indra/newview/llviewernetwork.h b/linden/indra/newview/llviewernetwork.h
index 1f73fe2..118897a 100644
--- a/linden/indra/newview/llviewernetwork.h
+++ b/linden/indra/newview/llviewernetwork.h
@@ -35,26 +35,26 @@
35 35
36class LLHost; 36class LLHost;
37 37
38enum EUserServerDomain 38enum EGridInfo
39{ 39{
40 USERSERVER_NONE, 40 GRID_INFO_NONE,
41 USERSERVER_ADITI, 41 GRID_INFO_ADITI,
42 USERSERVER_AGNI, 42 GRID_INFO_AGNI,
43 USERSERVER_DMZ, 43 GRID_INFO_DMZ,
44 USERSERVER_SIVA, 44 GRID_INFO_SIVA,
45 USERSERVER_DURGA, 45 GRID_INFO_DURGA,
46 USERSERVER_SHAKTI, 46 GRID_INFO_SHAKTI,
47 USERSERVER_SOMA, 47 GRID_INFO_SOMA,
48 USERSERVER_GANGA, 48 GRID_INFO_GANGA,
49 USERSERVER_VAAK, 49 GRID_INFO_VAAK,
50 USERSERVER_UMA, 50 GRID_INFO_UMA,
51 USERSERVER_LOCAL, 51 GRID_INFO_LOCAL,
52 USERSERVER_OTHER, // IP address set via -user or other command line option 52 GRID_INFO_OTHER, // IP address set via -user or other command line option
53 USERSERVER_COUNT 53 GRID_INFO_COUNT
54}; 54};
55 55
56 56
57struct LLUserServerData 57struct LLGridData
58{ 58{
59 const char* mLabel; 59 const char* mLabel;
60 const char* mName; 60 const char* mName;
@@ -65,9 +65,9 @@ struct LLUserServerData
65extern F32 gPacketDropPercentage; 65extern F32 gPacketDropPercentage;
66extern F32 gInBandwidth; 66extern F32 gInBandwidth;
67extern F32 gOutBandwidth; 67extern F32 gOutBandwidth;
68extern EUserServerDomain gUserServerChoice; 68extern EGridInfo gGridChoice;
69extern LLUserServerData gUserServerDomainName[]; 69extern LLGridData gGridInfo[];
70extern char gUserServerName[MAX_STRING]; /* Flawfinder: ignore */ 70extern char gGridName[MAX_STRING]; /* Flawfinder: ignore */
71 71
72const S32 MAC_ADDRESS_BYTES = 6; 72const S32 MAC_ADDRESS_BYTES = 6;
73extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */ 73extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
diff --git a/linden/indra/newview/llviewerobject.cpp b/linden/indra/newview/llviewerobject.cpp
index 0c9ca01..4c6f279 100644
--- a/linden/indra/newview/llviewerobject.cpp
+++ b/linden/indra/newview/llviewerobject.cpp
@@ -95,13 +95,12 @@
95#include "llworld.h" 95#include "llworld.h"
96#include "llui.h" 96#include "llui.h"
97#include "pipeline.h" 97#include "pipeline.h"
98#include "viewer.h" 98#include "llappviewer.h"
99 99
100//#define DEBUG_UPDATE_TYPE 100//#define DEBUG_UPDATE_TYPE
101 101
102extern BOOL gVelocityInterpolate; 102BOOL gVelocityInterpolate = TRUE;
103extern BOOL gPingInterpolate; 103BOOL gPingInterpolate = TRUE;
104extern U32 gFrameCount;
105 104
106U32 LLViewerObject::sNumZombieObjects = 0; 105U32 LLViewerObject::sNumZombieObjects = 0;
107S32 LLViewerObject::sNumObjects = 0; 106S32 LLViewerObject::sNumObjects = 0;
diff --git a/linden/indra/newview/llviewerobject.h b/linden/indra/newview/llviewerobject.h
index 9ce417d..b30bf7e 100644
--- a/linden/indra/newview/llviewerobject.h
+++ b/linden/indra/newview/llviewerobject.h
@@ -692,4 +692,7 @@ public:
692 virtual void updateDrawable(BOOL force_damped); 692 virtual void updateDrawable(BOOL force_damped);
693}; 693};
694 694
695extern BOOL gVelocityInterpolate;
696extern BOOL gPingInterpolate;
697
695#endif 698#endif
diff --git a/linden/indra/newview/llviewerobjectlist.cpp b/linden/indra/newview/llviewerobjectlist.cpp
index 967f018..38efb5d 100644
--- a/linden/indra/newview/llviewerobjectlist.cpp
+++ b/linden/indra/newview/llviewerobjectlist.cpp
@@ -42,7 +42,6 @@
42#include "llvoavatar.h" 42#include "llvoavatar.h"
43#include "llviewerobject.h" 43#include "llviewerobject.h"
44#include "llviewerwindow.h" 44#include "llviewerwindow.h"
45#include "viewer.h"
46#include "llnetmap.h" 45#include "llnetmap.h"
47#include "llagent.h" 46#include "llagent.h"
48#include "pipeline.h" 47#include "pipeline.h"
@@ -71,11 +70,9 @@
71#endif 70#endif
72#include "object_flags.h" 71#include "object_flags.h"
73 72
74extern BOOL gVelocityInterpolate; 73#include "llappviewer.h"
75extern BOOL gPingInterpolate; 74
76extern F32 gMinObjectDistance; 75extern F32 gMinObjectDistance;
77extern U32 gFrameCount;
78extern LLTimer gRenderStartTime;
79extern BOOL gAnimateTextures; 76extern BOOL gAnimateTextures;
80 77
81void dialog_refresh_all(); 78void dialog_refresh_all();
diff --git a/linden/indra/newview/llviewerparcelmgr.cpp b/linden/indra/newview/llviewerparcelmgr.cpp
index d5fc9fa..f0d6fd1 100644
--- a/linden/indra/newview/llviewerparcelmgr.cpp
+++ b/linden/indra/newview/llviewerparcelmgr.cpp
@@ -1398,8 +1398,9 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1398 F32 parcel_prim_bonus = 1.f; 1398 F32 parcel_prim_bonus = 1.f;
1399 BOOL region_push_override = false; 1399 BOOL region_push_override = false;
1400 BOOL region_deny_anonymous_override = false; 1400 BOOL region_deny_anonymous_override = false;
1401 BOOL region_deny_identified_override = false; 1401 BOOL region_deny_identified_override = false; // Deprecated
1402 BOOL region_deny_transacted_override = false; 1402 BOOL region_deny_transacted_override = false; // Deprecated
1403 BOOL region_deny_age_unverified_override = false;
1403 1404
1404 S32 other_clean_time = 0; 1405 S32 other_clean_time = 0;
1405 1406
@@ -1474,8 +1475,9 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1474 msg->getF32Fast(_PREHASH_ParcelData, _PREHASH_ParcelPrimBonus, parcel_prim_bonus ); 1475 msg->getF32Fast(_PREHASH_ParcelData, _PREHASH_ParcelPrimBonus, parcel_prim_bonus );
1475 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionPushOverride, region_push_override ); 1476 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionPushOverride, region_push_override );
1476 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyAnonymous, region_deny_anonymous_override ); 1477 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyAnonymous, region_deny_anonymous_override );
1477 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyIdentified, region_deny_identified_override ); 1478 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyIdentified, region_deny_identified_override ); // Deprecated
1478 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyTransacted, region_deny_transacted_override ); 1479 msg->getBOOLFast(_PREHASH_ParcelData, _PREHASH_RegionDenyTransacted, region_deny_transacted_override ); // Deprecated
1480 msg->getBOOLFast(_PREHASH_AgeVerificationBlock, _PREHASH_RegionDenyAgeUnverified, region_deny_age_unverified_override );
1479 1481
1480 msg->getS32("ParcelData", "OtherCleanTime", other_clean_time ); 1482 msg->getS32("ParcelData", "OtherCleanTime", other_clean_time );
1481 1483
@@ -1505,8 +1507,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
1505 parcel->setCleanOtherTime(other_clean_time); 1507 parcel->setCleanOtherTime(other_clean_time);
1506 parcel->setRegionPushOverride(region_push_override); 1508 parcel->setRegionPushOverride(region_push_override);
1507 parcel->setRegionDenyAnonymousOverride(region_deny_anonymous_override); 1509 parcel->setRegionDenyAnonymousOverride(region_deny_anonymous_override);
1508 parcel->setRegionDenyIdentifiedOverride(region_deny_identified_override); 1510 parcel->setRegionDenyAgeUnverifiedOverride(region_deny_age_unverified_override);
1509 parcel->setRegionDenyTransactedOverride(region_deny_transacted_override);
1510 parcel->unpackMessage(msg); 1511 parcel->unpackMessage(msg);
1511 1512
1512 if (parcel == gParcelMgr->mAgentParcel) 1513 if (parcel == gParcelMgr->mAgentParcel)
diff --git a/linden/indra/newview/llviewerregion.cpp b/linden/indra/newview/llviewerregion.cpp
index 643df1e..0022212 100644
--- a/linden/indra/newview/llviewerregion.cpp
+++ b/linden/indra/newview/llviewerregion.cpp
@@ -63,7 +63,6 @@
63#include "llvocache.h" 63#include "llvocache.h"
64#include "llvoclouds.h" 64#include "llvoclouds.h"
65#include "llworld.h" 65#include "llworld.h"
66#include "viewer.h"
67 66
68// Viewer object cache version, change if object update 67// Viewer object cache version, change if object update
69// format changes. JC 68// format changes. JC
@@ -969,28 +968,16 @@ void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
969 } 968 }
970} 969}
971 970
972LLString LLViewerRegion::getInfoString() 971void LLViewerRegion::getInfo(LLSD& info)
973{ 972{
974 char tmp_buf[256]; /* Flawfinder: ignore */ 973 info["Region"]["Host"] = getHost().getIPandPort();
975 LLString info; 974 info["Region"]["Name"] = getName();
976
977 info = "Region: ";
978 getHost().getString(tmp_buf, 256);
979 info += tmp_buf;
980 info += ":";
981 info += getName();
982 info += "\n";
983
984 U32 x, y; 975 U32 x, y;
985 from_region_handle(getHandle(), &x, &y); 976 from_region_handle(getHandle(), &x, &y);
986 snprintf(tmp_buf, sizeof(tmp_buf), "%d:%d", x, y); /* Flawfinder: ignore */ 977 info["Region"]["Handle"]["x"] = (LLSD::Integer)x;
987 info += "Handle:"; 978 info["Region"]["Handle"]["y"] = (LLSD::Integer)y;
988 info += tmp_buf;
989 info += "\n";
990 return info;
991} 979}
992 980
993
994void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp) 981void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp)
995{ 982{
996 U32 local_id = objectp->getLocalID(); 983 U32 local_id = objectp->getLocalID();
diff --git a/linden/indra/newview/llviewerregion.h b/linden/indra/newview/llviewerregion.h
index 013a96f..a0953e5 100644
--- a/linden/indra/newview/llviewerregion.h
+++ b/linden/indra/newview/llviewerregion.h
@@ -223,7 +223,7 @@ public:
223 223
224 F32 getLandHeightRegion(const LLVector3& region_pos); 224 F32 getLandHeightRegion(const LLVector3& region_pos);
225 225
226 LLString getInfoString(); 226 void getInfo(LLSD& info);
227 227
228 // handle a full update message 228 // handle a full update message
229 void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp); 229 void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp);
diff --git a/linden/indra/newview/llviewerstats.cpp b/linden/indra/newview/llviewerstats.cpp
index 96f52a1..2b278c7 100644
--- a/linden/indra/newview/llviewerstats.cpp
+++ b/linden/indra/newview/llviewerstats.cpp
@@ -37,10 +37,29 @@
37#include "message.h" 37#include "message.h"
38#include "lltimer.h" 38#include "lltimer.h"
39 39
40LLViewerStats *gViewerStats = NULL; 40#include "llappviewer.h"
41
42#include "pipeline.h"
43#include "llviewerobjectlist.h"
44#include "llviewerimagelist.h"
45#include "lltexlayer.h"
46#include "llsurface.h"
47#include "llvlmanager.h"
48#include "llagent.h"
49#include "llviewercontrol.h"
50#include "llfloaterdirectory.h"
51#include "llfloatertools.h"
52#include "lldebugview.h"
53#include "llfasttimerview.h"
54#include "llviewerregion.h"
55#include "llfloaterhtmlhelp.h"
56#include "llworld.h"
57#include "llfeaturemanager.h"
58#if LL_WINDOWS && LL_LCD_COMPILE
59 #include "lllcd.h"
60#endif
41 61
42extern U32 gFrameCount; 62LLViewerStats *gViewerStats = NULL;
43extern LLTimer gRenderStartTime;
44 63
45class StatAttributes 64class StatAttributes
46{ 65{
@@ -323,3 +342,427 @@ const char *LLViewerStats::statTypeToText(EStatType type)
323 return "Unknown statistic"; 342 return "Unknown statistic";
324 } 343 }
325} 344}
345
346// *NOTE:Mani The following methods used to exist in viewer.cpp
347// Moving them here, but not merging them into LLViewerStats yet.
348void reset_statistics()
349{
350 gPipeline.resetFrameStats(); // Reset per-frame statistics.
351 if (LLSurface::sTextureUpdateTime)
352 {
353 LLSurface::sTexelsUpdatedPerSecStat.addValue(0.001f*(LLSurface::sTexelsUpdated / LLSurface::sTextureUpdateTime));
354 LLSurface::sTexelsUpdated = 0;
355 LLSurface::sTextureUpdateTime = 0.f;
356 }
357}
358
359
360void output_statistics(void*)
361{
362 llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl;
363 llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl;
364 llinfos << "Num images: " << gImageList.getNumImages() << llendl;
365 llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemory << llendl;
366 llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemory << llendl;
367 llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl;
368 llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl;
369 llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl;
370 llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl;
371
372 llinfos << "Memory Usage:" << llendl;
373 llinfos << "--------------------------------" << llendl;
374 llinfos << "Pipeline:" << llendl;
375 llinfos << llendl;
376
377#if LL_SMARTHEAP
378 llinfos << "--------------------------------" << llendl;
379 {
380 llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl;
381
382 U32 total_pool_size = 0;
383 U32 total_used_size = 0;
384 MEM_POOL_INFO pool_info;
385 MEM_POOL_STATUS pool_status;
386 U32 pool_num = 0;
387 for(pool_status = MemPoolFirst( &pool_info, 1 );
388 pool_status != MEM_POOL_END;
389 pool_status = MemPoolNext( &pool_info, 1 ) )
390 {
391 llinfos << "Pool #" << pool_num << llendl;
392 if( MEM_POOL_OK != pool_status )
393 {
394 llwarns << "Pool not ok" << llendl;
395 continue;
396 }
397
398 llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS
399 << " pageSize " << pool_info.pageSize
400 << llendl;
401
402 U32 pool_count = MemPoolCount(pool_info.pool);
403 llinfos << "Blocks " << pool_count << llendl;
404
405 U32 pool_size = MemPoolSize( pool_info.pool );
406 if( pool_size == MEM_ERROR_RET )
407 {
408 llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl;
409 }
410 else
411 {
412 llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl;
413 }
414
415 total_pool_size += pool_size;
416
417 if( !MemPoolLock( pool_info.pool ) )
418 {
419 llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl;
420 continue;
421 }
422
423 U32 used_size = 0;
424 MEM_POOL_ENTRY entry;
425 entry.entry = NULL;
426 while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK )
427 {
428 if( entry.isInUse )
429 {
430 used_size += entry.size;
431 }
432 }
433
434 MemPoolUnlock( pool_info.pool );
435
436 llinfos << "MemPool Used " << used_size/1024 << "K" << llendl;
437 total_used_size += used_size;
438 pool_num++;
439 }
440
441 llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl;
442 llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl;
443
444 }
445#endif
446
447 llinfos << "--------------------------------" << llendl;
448 llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;
449 gTexStaticImageList.dumpByteCount();
450 LLVOAvatar::dumpScratchTextureByteCount();
451 LLTexLayerSetBuffer::dumpTotalByteCount();
452 LLVOAvatar::dumpTotalLocalTextureByteCount();
453 LLTexLayerParamAlpha::dumpCacheByteCount();
454 LLVOAvatar::dumpBakedStatus();
455
456 llinfos << llendl;
457
458 llinfos << "Object counts:" << llendl;
459 S32 i;
460 S32 obj_counts[256];
461// S32 app_angles[256];
462 for (i = 0; i < 256; i++)
463 {
464 obj_counts[i] = 0;
465 }
466 for (i = 0; i < gObjectList.getNumObjects(); i++)
467 {
468 LLViewerObject *objectp = gObjectList.getObject(i);
469 if (objectp)
470 {
471 obj_counts[objectp->getPCode()]++;
472 }
473 }
474 for (i = 0; i < 256; i++)
475 {
476 if (obj_counts[i])
477 {
478 llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl;
479 }
480 }
481}
482
483
484U32 gTotalLandIn = 0, gTotalLandOut = 0;
485U32 gTotalWaterIn = 0, gTotalWaterOut = 0;
486
487F32 gAveLandCompression = 0.f, gAveWaterCompression = 0.f;
488F32 gBestLandCompression = 1.f, gBestWaterCompression = 1.f;
489F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f;
490
491
492
493U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0;
494U32 gObjectBits = 0;
495F32 gAvgSimPing = 0.f;
496
497
498extern U32 gVisCompared;
499extern U32 gVisTested;
500
501std::map<S32,LLFrameTimer> gDebugTimers;
502
503void update_statistics(U32 frame_count)
504{
505 gTotalWorldBytes += gVLManager.getTotalBytes();
506 gTotalObjectBytes += gObjectBits / 8;
507 gTotalTextureBytes += LLViewerImageList::sTextureBits / 8;
508
509 // make sure we have a valid time delta for this frame
510 if (gFrameIntervalSeconds > 0.f)
511 {
512 if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
513 {
514 gViewerStats->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds);
515 }
516 else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
517 {
518 gViewerStats->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds);
519 }
520 else if (gFloaterTools && gFloaterTools->getVisible())
521 {
522 gViewerStats->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds);
523 }
524 }
525 gViewerStats->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
526 gViewerStats->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gSavedSettings.getS32("RenderLightingDetail"));
527 gViewerStats->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
528 gViewerStats->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
529#if 0 // 1.9.2
530 gViewerStats->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject"));
531 gViewerStats->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar"));
532 gViewerStats->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment"));
533#endif
534 gViewerStats->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_FRAME));
535 F64 idle_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IDLE);
536 F64 network_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_NETWORK);
537 gViewerStats->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
538 gViewerStats->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
539 gViewerStats->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IMAGE_UPDATE));
540 gViewerStats->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_REBUILD));
541 gViewerStats->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_RENDER_GEOMETRY));
542
543 LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
544 if (cdp)
545 {
546 gViewerStats->mSimPingStat.addValue(cdp->getPingDelay());
547 gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1);
548 gSimPingCount++;
549 }
550 else
551 {
552 gViewerStats->mSimPingStat.addValue(10000);
553 }
554
555 gViewerStats->mFPSStat.addValue(1);
556 F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
557 gViewerStats->mLayersKBitStat.addValue(layer_bits/1024.f);
558 gViewerStats->mObjectKBitStat.addValue(gObjectBits/1024.f);
559 gViewerStats->mTextureKBitStat.addValue(LLViewerImageList::sTextureBits/1024.f);
560 gViewerStats->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
561 gViewerStats->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
562 gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
563
564 static S32 tex_bits_idle_count = 0;
565 if (LLViewerImageList::sTextureBits == 0)
566 {
567 if (++tex_bits_idle_count >= 30)
568 gDebugTimers[0].pause();
569 }
570 else
571 {
572 tex_bits_idle_count = 0;
573 gDebugTimers[0].unpause();
574 }
575
576 gViewerStats->mTexturePacketsStat.addValue(LLViewerImageList::sTexturePackets);
577
578 // log when the LibXUL (aka Mozilla) widget is used and opened so we can monitor framerate changes
579 #if LL_LIBXUL_ENABLED
580 {
581 BOOL result = gViewerHtmlHelp.getFloaterOpened();
582 gViewerStats->setStat(LLViewerStats::ST_LIBXUL_WIDGET_USED, (F64)result);
583 }
584 #endif
585
586 {
587 static F32 visible_avatar_frames = 0.f;
588 static F32 avg_visible_avatars = 0;
589 F32 visible_avatars = (F32)LLVOAvatar::sNumVisibleAvatars;
590 if (visible_avatars > 0.f)
591 {
592 visible_avatar_frames = 1.f;
593 avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames;
594 }
595 gViewerStats->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
596 }
597 gWorldp->updateNetStats();
598 gWorldp->requestCacheMisses();
599
600 // Reset all of these values.
601 gVLManager.resetBitCounts();
602 gObjectBits = 0;
603// gDecodedBits = 0;
604
605 LLViewerImageList::sTextureBits = 0;
606 LLViewerImageList::sTexturePackets = 0;
607
608#if LL_WINDOWS && LL_LCD_COMPILE
609 bool LCDenabled = gLcdScreen->Enabled();
610 gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, LCDenabled);
611#else
612 gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, false);
613#endif
614}
615
616class ViewerStatsResponder : public LLHTTPClient::Responder
617{
618public:
619 ViewerStatsResponder() { }
620
621 void error(U32 statusNum, const std::string& reason)
622 {
623 llinfos << "ViewerStatsResponder::error " << statusNum << " "
624 << reason << llendl;
625 }
626
627 void result(const LLSD& content)
628 {
629 llinfos << "ViewerStatsResponder::result" << llendl;
630 }
631};
632
633/*
634 * The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats.
635 *
636 * There's also a compatibility shim for the old fixed-format sim
637 * stats in newsim/llagentinfo.cpp:processViewerStats.
638 *
639 * If you move stats around here, make the corresponding changes in
640 * those locations, too.
641 */
642void send_stats()
643{
644 // IW 9/23/02 I elected not to move this into LLViewerStats
645 // because it depends on too many viewer.cpp globals.
646 // Someday we may want to merge all our stats into a central place
647 // but that day is not today.
648
649 // Only send stats if the agent is connected to a region.
650 if (!gAgent.getRegion() || gNoRender)
651 {
652 return;
653 }
654
655 LLSD body;
656 std::string url = gAgent.getRegion()->getCapability("ViewerStats");
657
658 if (url.empty()) {
659 llwarns << "Could not get ViewerStats capability" << llendl;
660 return;
661 }
662
663 body["session_id"] = gAgentSessionID;
664
665 LLSD &agent = body["agent"];
666
667 time_t ltime;
668 time(&ltime);
669 F32 run_time = F32(LLFrameTimer::getElapsedSeconds());
670
671 agent["start_time"] = ltime - run_time;
672
673 // The first stat set must have a 0 run time if it doesn't actually
674 // contain useful data in terms of FPS, etc. We use half the
675 // SEND_STATS_PERIOD seconds as the point at which these statistics become
676 // valid. Data warehouse uses a 0 value here to easily discard these
677 // records with non-useful FPS values etc.
678 if (run_time < (SEND_STATS_PERIOD / 2))
679 {
680 agent["run_time"] = 0.0f;
681 }
682 else
683 {
684 agent["run_time"] = run_time;
685 }
686
687 // send fps only for time app spends in foreground
688 agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32();
689 agent["version"] = gCurrentVersion;
690 LLString language(gSavedSettings.getString("Language"));
691 if(language == "default") language = gSavedSettings.getString("SystemLanguage");
692 agent["language"] = language;
693
694 agent["sim_fps"] = ((F32) gFrameCount - gSimFrames) /
695 (F32) (gRenderStartTime.getElapsedTimeF32() - gSimLastTime);
696
697 gSimLastTime = gRenderStartTime.getElapsedTimeF32();
698 gSimFrames = (F32) gFrameCount;
699
700 agent["agents_in_view"] = LLVOAvatar::sNumVisibleAvatars;
701 agent["ping"] = gAvgSimPing;
702 agent["meters_traveled"] = gAgent.getDistanceTraveled();
703 agent["regions_visited"] = gAgent.getRegionsVisited();
704 agent["mem_use"] = getCurrentRSS() / 1024.0;
705
706 LLSD &system = body["system"];
707
708 system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB();
709 system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
710 system["cpu"] = gSysCPU.getCPUString();
711
712 std::string gpu_desc = llformat(
713 "%-6s Class %d ",
714 gGLManager.mGLVendorShort.substr(0,6).c_str(),
715 gFeatureManagerp->getGPUClass())
716 + gFeatureManagerp->getGPUString();
717
718 system["gpu"] = gpu_desc;
719 system["gpu_class"] = gFeatureManagerp->getGPUClass();
720 system["gpu_vendor"] = gGLManager.mGLVendorShort;
721 system["gpu_version"] = gGLManager.mDriverVersionVendorString;
722
723 LLSD &download = body["downloads"];
724
725 download["world_kbytes"] = gTotalWorldBytes / 1024.0;
726 download["object_kbytes"] = gTotalObjectBytes / 1024.0;
727 download["texture_kbytes"] = gTotalTextureBytes / 1024.0;
728
729 LLSD &in = body["stats"]["net"]["in"];
730
731 in["kbytes"] = gMessageSystem->mTotalBytesIn / 1024.0;
732 in["packets"] = (S32) gMessageSystem->mPacketsIn;
733 in["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsIn;
734 in["savings"] = (gMessageSystem->mUncompressedBytesIn -
735 gMessageSystem->mCompressedBytesIn) / 1024.0;
736
737 LLSD &out = body["stats"]["net"]["out"];
738
739 out["kbytes"] = gMessageSystem->mTotalBytesOut / 1024.0;
740 out["packets"] = (S32) gMessageSystem->mPacketsOut;
741 out["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsOut;
742 out["savings"] = (gMessageSystem->mUncompressedBytesOut -
743 gMessageSystem->mCompressedBytesOut) / 1024.0;
744
745 LLSD &fail = body["stats"]["failures"];
746
747 fail["send_packet"] = (S32) gMessageSystem->mSendPacketFailureCount;
748 fail["dropped"] = (S32) gMessageSystem->mDroppedPackets;
749 fail["resent"] = (S32) gMessageSystem->mResentPackets;
750 fail["failed_resends"] = (S32) gMessageSystem->mFailedResendPackets;
751 fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets;
752 fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;
753
754 // Misc stats, two strings and two ints
755 // These are not expecticed to persist across multiple releases
756 // Comment any changes with your name and the expected release revision
757 // If the current revision is recent, ping the previous author before overriding
758 LLSD &misc = body["stats"]["misc"];
759
760 // misc["string_1"] =
761 // misc["string_2"] =
762 misc["int_1"] = LLFloaterDirectory::sOldSearchCount; // Steve: 1.18.6
763 misc["int_2"] = LLFloaterDirectory::sNewSearchCount; // Steve: 1.18.6
764
765 gViewerStats->addToMessage(body);
766
767 LLHTTPClient::post(url, body, new ViewerStatsResponder());
768}
diff --git a/linden/indra/newview/llviewerstats.h b/linden/indra/newview/llviewerstats.h
index 3c959a5..0ce4e79 100644
--- a/linden/indra/newview/llviewerstats.h
+++ b/linden/indra/newview/llviewerstats.h
@@ -94,7 +94,6 @@ public:
94 94
95 95
96 LLStat mSimPingStat; 96 LLStat mSimPingStat;
97 LLStat mUserserverPingStat;
98 97
99 void resetStats(); 98 void resetStats();
100public: 99public:
@@ -188,4 +187,13 @@ private:
188 187
189extern LLViewerStats *gViewerStats; 188extern LLViewerStats *gViewerStats;
190 189
190static const F32 SEND_STATS_PERIOD = 300.0f;
191
192// The following are from (older?) statistics code found in appviewer.
193void reset_statistics();
194void output_statistics(void*);
195void update_statistics(U32 frame_count);
196void send_stats();
197
198extern std::map<S32,LLFrameTimer> gDebugTimers;
191#endif // LL_LLVIEWERSTATS_H 199#endif // LL_LLVIEWERSTATS_H
diff --git a/linden/indra/newview/llviewertexteditor.cpp b/linden/indra/newview/llviewertexteditor.cpp
index 1e75e42..e89f3f9 100644
--- a/linden/indra/newview/llviewertexteditor.cpp
+++ b/linden/indra/newview/llviewertexteditor.cpp
@@ -37,6 +37,7 @@
37#include "llinventory.h" 37#include "llinventory.h"
38#include "llinventorymodel.h" 38#include "llinventorymodel.h"
39#include "llinventoryview.h" 39#include "llinventoryview.h"
40#include "llinventorybridge.h" // for landmark prefix string
40 41
41#include "llviewertexteditor.h" 42#include "llviewertexteditor.h"
42 43
@@ -58,7 +59,7 @@
58#include "llmemorystream.h" 59#include "llmemorystream.h"
59#include "llmenugl.h" 60#include "llmenugl.h"
60 61
61extern BOOL gPacificDaylightTime; 62#include "llappviewer.h" // for gPacificDaylightTime
62 63
63///---------------------------------------------------------------------------- 64///----------------------------------------------------------------------------
64/// Class LLEmbeddedNotecardOpener 65/// Class LLEmbeddedNotecardOpener
@@ -1399,7 +1400,9 @@ void LLViewerTextEditor::openEmbeddedSound( LLInventoryItem* item )
1399 1400
1400void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item ) 1401void LLViewerTextEditor::openEmbeddedLandmark( LLInventoryItem* item )
1401{ 1402{
1402 open_landmark((LLViewerInventoryItem*)item, " preview landmark", FALSE, item->getUUID(), TRUE); 1403 LLString title =
1404 LLString(" ") + LLLandmarkBridge::prefix() + item->getName();
1405 open_landmark((LLViewerInventoryItem*)item, title, FALSE, item->getUUID(), TRUE);
1403} 1406}
1404 1407
1405void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, BOOL saved ) 1408void LLViewerTextEditor::openEmbeddedNotecard( LLInventoryItem* item, BOOL saved )
diff --git a/linden/indra/newview/llviewerwindow.cpp b/linden/indra/newview/llviewerwindow.cpp
index 7aaf9c0..d8f182c 100644
--- a/linden/indra/newview/llviewerwindow.cpp
+++ b/linden/indra/newview/llviewerwindow.cpp
@@ -31,6 +31,7 @@
31 31
32#include "llviewerprecompiledheaders.h" 32#include "llviewerprecompiledheaders.h"
33 33
34#include "llpanellogin.h"
34#include "llviewerwindow.h" 35#include "llviewerwindow.h"
35 36
36// system library includes 37// system library includes
@@ -105,6 +106,7 @@
105#include "llfloatermap.h" 106#include "llfloatermap.h"
106#include "llfloatermute.h" 107#include "llfloatermute.h"
107#include "llfloaternamedesc.h" 108#include "llfloaternamedesc.h"
109#include "llfloaterpreference.h"
108#include "llfloatersnapshot.h" 110#include "llfloatersnapshot.h"
109#include "llfloatertools.h" 111#include "llfloatertools.h"
110#include "llfloaterworldmap.h" 112#include "llfloaterworldmap.h"
@@ -161,6 +163,7 @@
161#include "llvieweruictrlfactory.h" 163#include "llvieweruictrlfactory.h"
162#include "lluploaddialog.h" 164#include "lluploaddialog.h"
163#include "llurldispatcher.h" // SLURL from other app instance 165#include "llurldispatcher.h" // SLURL from other app instance
166#include "llvieweraudio.h"
164#include "llviewercamera.h" 167#include "llviewercamera.h"
165#include "llviewergesture.h" 168#include "llviewergesture.h"
166#include "llviewerimagelist.h" 169#include "llviewerimagelist.h"
@@ -178,7 +181,9 @@
178#include "llworldmapview.h" 181#include "llworldmapview.h"
179#include "moviemaker.h" 182#include "moviemaker.h"
180#include "pipeline.h" 183#include "pipeline.h"
181#include "viewer.h" 184#include "llappviewer.h"
185#include "llurlsimstring.h"
186#include "llviewerdisplay.h"
182 187
183#if LL_WINDOWS 188#if LL_WINDOWS
184#include "llwindebug.h" 189#include "llwindebug.h"
@@ -240,6 +245,12 @@ BOOL gbCapturing = FALSE;
240MovieMaker gMovieMaker; 245MovieMaker gMovieMaker;
241#endif 246#endif
242 247
248// HUD display lines in lower right
249BOOL gDisplayWindInfo = FALSE;
250BOOL gDisplayCameraPos = FALSE;
251BOOL gDisplayNearestWater = FALSE;
252BOOL gDisplayFOV = FALSE;
253
243S32 CHAT_BAR_HEIGHT = 28; 254S32 CHAT_BAR_HEIGHT = 28;
244S32 OVERLAY_BAR_HEIGHT = 20; 255S32 OVERLAY_BAR_HEIGHT = 20;
245 256
@@ -1192,14 +1203,14 @@ BOOL LLViewerWindow::handleCloseRequest(LLWindow *window)
1192{ 1203{
1193 // User has indicated they want to close, but we may need to ask 1204 // User has indicated they want to close, but we may need to ask
1194 // about modified documents. 1205 // about modified documents.
1195 app_user_quit(); 1206 LLAppViewer::instance()->userQuit();
1196 // Don't quit immediately 1207 // Don't quit immediately
1197 return FALSE; 1208 return FALSE;
1198} 1209}
1199 1210
1200void LLViewerWindow::handleQuit(LLWindow *window) 1211void LLViewerWindow::handleQuit(LLWindow *window)
1201{ 1212{
1202 app_force_quit(NULL); 1213 LLAppViewer::instance()->forceQuit();
1203} 1214}
1204 1215
1205void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height) 1216void LLViewerWindow::handleResize(LLWindow *window, S32 width, S32 height)
@@ -1212,6 +1223,8 @@ void LLViewerWindow::handleFocus(LLWindow *window)
1212{ 1223{
1213 gFocusMgr.setAppHasFocus(TRUE); 1224 gFocusMgr.setAppHasFocus(TRUE);
1214 LLModalDialog::onAppFocusGained(); 1225 LLModalDialog::onAppFocusGained();
1226
1227 gAgent.onAppFocusGained();
1215 if (gToolMgr) 1228 if (gToolMgr)
1216 { 1229 {
1217 gToolMgr->onAppFocusGained(); 1230 gToolMgr->onAppFocusGained();
@@ -1315,7 +1328,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
1315 gAgent.clearAFK(); 1328 gAgent.clearAFK();
1316 if (mWindow->getFullscreen() && !mIgnoreActivate) 1329 if (mWindow->getFullscreen() && !mIgnoreActivate)
1317 { 1330 {
1318 if (!gQuit) 1331 if (!LLApp::isExiting() )
1319 { 1332 {
1320 if (LLStartUp::getStartupState() >= STATE_STARTED) 1333 if (LLStartUp::getStartupState() >= STATE_STARTED)
1321 { 1334 {
@@ -1505,7 +1518,7 @@ LLViewerWindow::LLViewerWindow(
1505 llwarns << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" 1518 llwarns << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings"
1506 << llendl; 1519 << llendl;
1507#endif 1520#endif
1508 app_force_exit(1); 1521 LLAppViewer::instance()->forceExit(1);
1509 } 1522 }
1510 1523
1511 // Get the real window rect the window was created with (since there are various OS-dependent reasons why 1524 // Get the real window rect the window was created with (since there are various OS-dependent reasons why
@@ -1892,7 +1905,6 @@ void LLViewerWindow::initWorldUI()
1892 // TODO: Move instance management into class 1905 // TODO: Move instance management into class
1893 gFloaterMap = new LLFloaterMap("Map"); 1906 gFloaterMap = new LLFloaterMap("Map");
1894 gFloaterMap->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT); 1907 gFloaterMap->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
1895 gFloaterMap->setVisible( gSavedSettings.getBOOL("ShowMiniMap") );
1896 1908
1897 // keep onscreen 1909 // keep onscreen
1898 gFloaterView->adjustToFitScreen(gFloaterMap, FALSE); 1910 gFloaterView->adjustToFitScreen(gFloaterMap, FALSE);
@@ -2107,7 +2119,7 @@ void LLViewerWindow::reshape(S32 width, S32 height)
2107 // reshape messages. We don't care about these, and we 2119 // reshape messages. We don't care about these, and we
2108 // don't want to send messages because the message system 2120 // don't want to send messages because the message system
2109 // may have been destructed. 2121 // may have been destructed.
2110 if (!gQuit) 2122 if (!LLApp::isExiting())
2111 { 2123 {
2112 if (gNoRender) 2124 if (gNoRender)
2113 { 2125 {
@@ -2193,13 +2205,22 @@ void LLViewerWindow::reshape(S32 width, S32 height)
2193void LLViewerWindow::setNormalControlsVisible( BOOL visible ) 2205void LLViewerWindow::setNormalControlsVisible( BOOL visible )
2194{ 2206{
2195 if ( gBottomPanel ) 2207 if ( gBottomPanel )
2208 {
2196 gBottomPanel->setVisible( visible ); 2209 gBottomPanel->setVisible( visible );
2210 gBottomPanel->setEnabled( visible );
2211 }
2197 2212
2198 if ( gMenuBarView ) 2213 if ( gMenuBarView )
2214 {
2199 gMenuBarView->setVisible( visible ); 2215 gMenuBarView->setVisible( visible );
2200 2216 gMenuBarView->setEnabled( visible );
2217 }
2218
2201 if ( gStatusBar ) 2219 if ( gStatusBar )
2202 gStatusBar->setVisible( visible ); 2220 {
2221 gStatusBar->setVisible( visible );
2222 gStatusBar->setEnabled( visible );
2223 }
2203} 2224}
2204 2225
2205 2226
@@ -2408,6 +2429,18 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
2408 toggle_debug_menus(NULL); 2429 toggle_debug_menus(NULL);
2409 } 2430 }
2410 2431
2432 // Explicit hack for debug menu.
2433 if ((mask == (MASK_SHIFT | MASK_CONTROL)) &&
2434 ('G' == key || 'g' == key))
2435 {
2436 if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
2437 {
2438 BOOL visible = ! gSavedSettings.getBOOL("ForceShowGrid");
2439 gSavedSettings.setBOOL("ForceShowGrid", visible);
2440 LLPanelLogin::loadLoginPage();
2441 }
2442 }
2443
2411 // Example "bug" for bug reporter web page 2444 // Example "bug" for bug reporter web page
2412 if ((MASK_SHIFT & mask) 2445 if ((MASK_SHIFT & mask)
2413 && (MASK_ALT & mask) 2446 && (MASK_ALT & mask)
@@ -2439,6 +2472,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
2439 { 2472 {
2440 return TRUE; 2473 return TRUE;
2441 } 2474 }
2475 // let menus handle navigation keys
2476 if (gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE))
2477 {
2478 return TRUE;
2479 }
2442 2480
2443 // Traverses up the hierarchy 2481 // Traverses up the hierarchy
2444 LLUICtrl* keyboard_focus = gFocusMgr.getKeyboardFocus(); 2482 LLUICtrl* keyboard_focus = gFocusMgr.getKeyboardFocus();
@@ -2544,6 +2582,12 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
2544 { 2582 {
2545 return TRUE; 2583 return TRUE;
2546 } 2584 }
2585
2586 // give menus a chance to handle keys
2587 if (gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))
2588 {
2589 return TRUE;
2590 }
2547 2591
2548 // don't pass keys on to world when something in ui has focus 2592 // don't pass keys on to world when something in ui has focus
2549 return gFocusMgr.childHasKeyboardFocus(mRootView) 2593 return gFocusMgr.childHasKeyboardFocus(mRootView)
@@ -2831,7 +2875,7 @@ BOOL LLViewerWindow::handlePerFrameHover()
2831 // *NOTE: sometimes tools handle the mouse as a captor, so this 2875 // *NOTE: sometimes tools handle the mouse as a captor, so this
2832 // logic is a little confusing 2876 // logic is a little confusing
2833 LLTool *tool = NULL; 2877 LLTool *tool = NULL;
2834 if (gToolMgr && gHoverView) 2878 if (gToolMgr && gHoverView && gCamera)
2835 { 2879 {
2836 tool = gToolMgr->getCurrentTool(); 2880 tool = gToolMgr->getCurrentTool();
2837 2881
@@ -2904,8 +2948,8 @@ BOOL LLViewerWindow::handlePerFrameHover()
2904 mToolTip->setVisible( TRUE ); 2948 mToolTip->setVisible( TRUE );
2905 } 2949 }
2906 } 2950 }
2907 2951
2908 if (tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime")) 2952 if (tool && tool != gToolNull && tool != gToolInspect && tool != gToolDragAndDrop && !gSavedSettings.getBOOL("FreezeTime"))
2909 { 2953 {
2910 LLMouseHandler *captor = gFocusMgr.getMouseCapture(); 2954 LLMouseHandler *captor = gFocusMgr.getMouseCapture();
2911 // With the null, inspect, or drag and drop tool, don't muck 2955 // With the null, inspect, or drag and drop tool, don't muck
@@ -4715,9 +4759,9 @@ void LLViewerWindow::stopGL(BOOL save_state)
4715 llinfos << "Shutting down GL..." << llendl; 4759 llinfos << "Shutting down GL..." << llendl;
4716 4760
4717 // Pause texture decode threads (will get unpaused during main loop) 4761 // Pause texture decode threads (will get unpaused during main loop)
4718 gTextureCache->pause(); 4762 LLAppViewer::getTextureCache()->pause();
4719 gImageDecodeThread->pause(); 4763 LLAppViewer::getImageDecodeThread()->pause();
4720 gTextureFetch->pause(); 4764 LLAppViewer::getTextureFetch()->pause();
4721 4765
4722 gSky.destroyGL(); 4766 gSky.destroyGL();
4723 stop_glerror(); 4767 stop_glerror();
diff --git a/linden/indra/newview/llviewerwindow.h b/linden/indra/newview/llviewerwindow.h
index fcd1597..faab518 100644
--- a/linden/indra/newview/llviewerwindow.h
+++ b/linden/indra/newview/llviewerwindow.h
@@ -416,4 +416,10 @@ extern BOOL gPickTransparent;
416 416
417extern BOOL gDebugFastUIRender; 417extern BOOL gDebugFastUIRender;
418extern S32 CHAT_BAR_HEIGHT; 418extern S32 CHAT_BAR_HEIGHT;
419
420extern BOOL gDisplayCameraPos;
421extern BOOL gDisplayWindInfo;
422extern BOOL gDisplayNearestWater;
423extern BOOL gDisplayFOV;
424
419#endif 425#endif
diff --git a/linden/indra/newview/llvoavatar.cpp b/linden/indra/newview/llvoavatar.cpp
index 4905ff8..7a225c8 100644
--- a/linden/indra/newview/llvoavatar.cpp
+++ b/linden/indra/newview/llvoavatar.cpp
@@ -114,7 +114,7 @@
114#include "llworld.h" 114#include "llworld.h"
115#include "pipeline.h" 115#include "pipeline.h"
116#include "llglslshader.h" 116#include "llglslshader.h"
117#include "viewer.h" 117#include "llappviewer.h"
118#include "lscript_byteformat.h" 118#include "lscript_byteformat.h"
119 119
120//#include "vtune/vtuneapi.h" 120//#include "vtune/vtuneapi.h"
@@ -1622,7 +1622,6 @@ BOOL LLVOAvatar::buildSkeleton(LLVOAvatarSkeletonInfo *info)
1622// LLVOAvatar::buildCharacter() 1622// LLVOAvatar::buildCharacter()
1623// Deferred initialization and rebuild of the avatar. 1623// Deferred initialization and rebuild of the avatar.
1624//----------------------------------------------------------------------------- 1624//-----------------------------------------------------------------------------
1625extern BOOL gPrintMessagesThisFrame;
1626void LLVOAvatar::buildCharacter() 1625void LLVOAvatar::buildCharacter()
1627{ 1626{
1628 LLMemType mt(LLMemType::MTYPE_AVATAR); 1627 LLMemType mt(LLMemType::MTYPE_AVATAR);
@@ -7439,7 +7438,7 @@ void LLVOAvatar::onCustomizeEnd()
7439 7438
7440 avatar->updateMeshTextures(); 7439 avatar->updateMeshTextures();
7441 7440
7442 if( !gQuit ) 7441 if( !LLApp::isExiting())
7443 { 7442 {
7444 avatar->requestLayerSetUploads(); 7443 avatar->requestLayerSetUploads();
7445 } 7444 }
diff --git a/linden/indra/newview/llvoclouds.cpp b/linden/indra/newview/llvoclouds.cpp
index 07cfcea..7a2ba60 100644
--- a/linden/indra/newview/llvoclouds.cpp
+++ b/linden/indra/newview/llvoclouds.cpp
@@ -49,7 +49,9 @@
49#include "llvosky.h" 49#include "llvosky.h"
50#include "llworld.h" 50#include "llworld.h"
51#include "pipeline.h" 51#include "pipeline.h"
52#include "viewer.h" 52
53LLUUID gCloudTextureID = IMG_CLOUD_POOF;
54
53 55
54LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) 56LLVOClouds::LLVOClouds(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
55: LLAlphaObject(id, LL_VO_CLOUDS, regionp) 57: LLAlphaObject(id, LL_VO_CLOUDS, regionp)
diff --git a/linden/indra/newview/llvoiceclient.cpp b/linden/indra/newview/llvoiceclient.cpp
index f6f7ce7..cf6b13e 100644
--- a/linden/indra/newview/llvoiceclient.cpp
+++ b/linden/indra/newview/llvoiceclient.cpp
@@ -42,12 +42,12 @@
42#include "expat/expat.h" 42#include "expat/expat.h"
43#include "llcallbacklist.h" 43#include "llcallbacklist.h"
44#include "llviewerregion.h" 44#include "llviewerregion.h"
45#include "llviewernetwork.h" // for gUserServerChoice 45#include "llviewernetwork.h" // for gGridChoice
46#include "llfloateractivespeakers.h" // for LLSpeakerMgr 46#include "llfloateractivespeakers.h" // for LLSpeakerMgr
47#include "llbase64.h" 47#include "llbase64.h"
48#include "llviewercontrol.h" 48#include "llviewercontrol.h"
49#include "llkeyboard.h" 49#include "llkeyboard.h"
50#include "viewer.h" // for gDisconnected, gDisableVoice 50#include "llappviewer.h" // for gDisconnected, gDisableVoice
51#include "llmutelist.h" // to check for muted avatars 51#include "llmutelist.h" // to check for muted avatars
52#include "llagent.h" 52#include "llagent.h"
53#include "llcachename.h" 53#include "llcachename.h"
@@ -1052,10 +1052,10 @@ void LLVoiceClient::userAuthorized(const std::string& firstName, const std::stri
1052 1052
1053 llinfos << "name \"" << mAccountDisplayName << "\" , ID " << agentID << llendl; 1053 llinfos << "name \"" << mAccountDisplayName << "\" , ID " << agentID << llendl;
1054 1054
1055 std::string userserver = gUserServerName; 1055 std::string gridname = gGridName;
1056 LLString::toLower(userserver); 1056 LLString::toLower(gridname);
1057 if((gUserServerChoice == USERSERVER_AGNI) || 1057 if((gGridChoice == GRID_INFO_AGNI) ||
1058 ((gUserServerChoice == USERSERVER_OTHER) && (userserver.find("agni") != std::string::npos))) 1058 ((gGridChoice == GRID_INFO_OTHER) && (gridname.find("agni") != std::string::npos)))
1059 { 1059 {
1060 sConnectingToAgni = true; 1060 sConnectingToAgni = true;
1061 } 1061 }
diff --git a/linden/indra/newview/llvosky.cpp b/linden/indra/newview/llvosky.cpp
index d3c24a6..b8d994d 100644
--- a/linden/indra/newview/llvosky.cpp
+++ b/linden/indra/newview/llvosky.cpp
@@ -53,7 +53,6 @@
53#include "llviewerregion.h" 53#include "llviewerregion.h"
54#include "llworld.h" 54#include "llworld.h"
55#include "pipeline.h" 55#include "pipeline.h"
56#include "viewer.h" // for gSunTextureID
57 56
58const S32 NUM_TILES_X = 8; 57const S32 NUM_TILES_X = 8;
59const S32 NUM_TILES_Y = 4; 58const S32 NUM_TILES_Y = 4;
@@ -72,6 +71,10 @@ const LLVector2 TEX01 = LLVector2(0.f, 1.f);
72const LLVector2 TEX10 = LLVector2(1.f, 0.f); 71const LLVector2 TEX10 = LLVector2(1.f, 0.f);
73const LLVector2 TEX11 = LLVector2(1.f, 1.f); 72const LLVector2 TEX11 = LLVector2(1.f, 1.f);
74 73
74// Exported globals
75LLUUID gSunTextureID = IMG_SUN;
76LLUUID gMoonTextureID = IMG_MOON;
77
75//static 78//static
76LLColor3 LLHaze::sAirScaSeaLevel; 79LLColor3 LLHaze::sAirScaSeaLevel;
77 80
diff --git a/linden/indra/newview/llvosky.h b/linden/indra/newview/llvosky.h
index 4020114..f3bceb0 100644
--- a/linden/indra/newview/llvosky.h
+++ b/linden/indra/newview/llvosky.h
@@ -69,6 +69,12 @@ const F32 fsigma = (6.f + 3.f * sigma) / (6.f-7.f*sigma);
69const F64 Ndens = 2.55e25; 69const F64 Ndens = 2.55e25;
70const F64 Ndens2 = Ndens*Ndens; 70const F64 Ndens2 = Ndens*Ndens;
71 71
72// HACK: Allow server to change sun and moon IDs.
73// I can't figure out how to pass the appropriate
74// information into the LLVOSky constructor. JC
75extern LLUUID gSunTextureID;
76extern LLUUID gMoonTextureID;
77
72 78
73LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2) 79LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2)
74{ 80{
diff --git a/linden/indra/newview/llwearable.cpp b/linden/indra/newview/llwearable.cpp
index 4222e84..b4e7910 100644
--- a/linden/indra/newview/llwearable.cpp
+++ b/linden/indra/newview/llwearable.cpp
@@ -48,9 +48,6 @@
48#include "llvoavatar.h" 48#include "llvoavatar.h"
49#include "llwearable.h" 49#include "llwearable.h"
50 50
51//#include "viewer.h"
52//#include "llvfs.h"
53
54// static 51// static
55S32 LLWearable::sCurrentDefinitionVersion = 1; 52S32 LLWearable::sCurrentDefinitionVersion = 1;
56 53
diff --git a/linden/indra/newview/llweb.cpp b/linden/indra/newview/llweb.cpp
index 7ee4869..eac24ce 100644
--- a/linden/indra/newview/llweb.cpp
+++ b/linden/indra/newview/llweb.cpp
@@ -40,14 +40,20 @@
40#include "llviewercontrol.h" 40#include "llviewercontrol.h"
41 41
42// static 42// static
43void LLWeb::loadURL(std::string url) 43void LLWeb::initClass()
44{
45 LLAlertDialog::setURLLoader(&sAlertURLLoader);
46}
47
48// static
49void LLWeb::loadURL(const std::string& url)
44{ 50{
45 loadURLExternal(url); 51 loadURLExternal(url);
46} 52}
47 53
48 54
49// static 55// static
50void LLWeb::loadURLExternal(std::string url) 56void LLWeb::loadURLExternal(const std::string& url)
51{ 57{
52 std::string escaped_url = escapeURL(url); 58 std::string escaped_url = escapeURL(url);
53#if LL_LIBXUL_ENABLED 59#if LL_LIBXUL_ENABLED
@@ -57,7 +63,7 @@ void LLWeb::loadURLExternal(std::string url)
57 63
58 64
59// static 65// static
60std::string LLWeb::escapeURL(std::string url) 66std::string LLWeb::escapeURL(const std::string& url)
61{ 67{
62 // The CURL curl_escape() function escapes colons, slashes, 68 // The CURL curl_escape() function escapes colons, slashes,
63 // and all characters but A-Z and 0-9. Do a cheesy mini-escape. 69 // and all characters but A-Z and 0-9. Do a cheesy mini-escape.
@@ -81,3 +87,12 @@ std::string LLWeb::escapeURL(std::string url)
81 } 87 }
82 return escaped_url; 88 return escaped_url;
83} 89}
90
91// virtual
92void LLWeb::URLLoader::load(const std::string& url)
93{
94 loadURL(url);
95}
96
97// static
98LLWeb::URLLoader LLWeb::sAlertURLLoader;
diff --git a/linden/indra/newview/llweb.h b/linden/indra/newview/llweb.h
index b339f2d..318410b 100644
--- a/linden/indra/newview/llweb.h
+++ b/linden/indra/newview/llweb.h
@@ -34,21 +34,31 @@
34#define LL_LLWEB_H 34#define LL_LLWEB_H
35 35
36#include <string> 36#include <string>
37#include "llalertdialog.h"
37 38
38class LLWeb 39class LLWeb
39{ 40{
40public: 41public:
42 static void initClass();
43
41 // Loads unescaped url in either internal web browser or external 44 // Loads unescaped url in either internal web browser or external
42 // browser, depending on user settings. 45 // browser, depending on user settings.
43 static void loadURL(std::string url); 46 static void loadURL(const std::string& url);
44 47
45 static void loadURL(const char* url) { loadURL( std::string(url) ); } 48 static void loadURL(const char* url) { loadURL( std::string(url) ); }
46 49
47 // Loads unescaped url in external browser. 50 // Loads unescaped url in external browser.
48 static void loadURLExternal(std::string url); 51 static void loadURLExternal(const std::string& url);
49 52
50 // Returns escaped (eg, " " to "%20") url 53 // Returns escaped (eg, " " to "%20") url
51 static std::string escapeURL(std::string url); 54 static std::string escapeURL(const std::string& url);
55
56 class URLLoader : public LLAlertDialog::URLLoader
57 {
58 virtual void load(const std::string& url);
59 };
60
61 static URLLoader sAlertURLLoader;
52}; 62};
53 63
54#endif 64#endif
diff --git a/linden/indra/newview/llwebbrowserctrl.cpp b/linden/indra/newview/llwebbrowserctrl.cpp
index 7fedc4c..afd27bf 100644
--- a/linden/indra/newview/llwebbrowserctrl.cpp
+++ b/linden/indra/newview/llwebbrowserctrl.cpp
@@ -42,7 +42,7 @@
42#include "llviewerwindow.h" 42#include "llviewerwindow.h"
43#include "llfloaterhtml.h" 43#include "llfloaterhtml.h"
44#include "llweb.h" 44#include "llweb.h"
45#include "viewer.h" 45#include "llurlsimstring.h"
46 46
47// linden library includes 47// linden library includes
48#include "llfocusmgr.h" 48#include "llfocusmgr.h"
@@ -544,6 +544,15 @@ void LLWebBrowserCtrl::onStatusTextChange( const EventType& eventIn )
544// virtual 544// virtual
545void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn ) 545void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn )
546{ 546{
547 const LLURI url(eventIn.getStringValue());
548 LLSD queryMap(url.queryMap());
549 std::string redirect_http_hack = queryMap["redirect-http-hack"].asString();
550 if (!redirect_http_hack.empty())
551 {
552 LLURLDispatcher::dispatch(redirect_http_hack);
553 return;
554 }
555
547 // chain this event on to observers of an instance of LLWebBrowserCtrl 556 // chain this event on to observers of an instance of LLWebBrowserCtrl
548 LLWebBrowserCtrlEvent event( eventIn.getStringValue() ); 557 LLWebBrowserCtrlEvent event( eventIn.getStringValue() );
549 mEventEmitter.update( &LLWebBrowserCtrlObserver::onLocationChange, event ); 558 mEventEmitter.update( &LLWebBrowserCtrlObserver::onLocationChange, event );
@@ -554,7 +563,6 @@ void LLWebBrowserCtrl::onLocationChange( const EventType& eventIn )
554void LLWebBrowserCtrl::onClickLinkHref( const EventType& eventIn ) 563void LLWebBrowserCtrl::onClickLinkHref( const EventType& eventIn )
555{ 564{
556 const std::string protocol( "http://" ); 565 const std::string protocol( "http://" );
557
558 if( mOpenLinksInExternalBrowser ) 566 if( mOpenLinksInExternalBrowser )
559 { 567 {
560 if ( eventIn.getStringValue().length() ) 568 if ( eventIn.getStringValue().length() )
diff --git a/linden/indra/newview/llwind.cpp b/linden/indra/newview/llwind.cpp
index b04299b..96a985f 100644
--- a/linden/indra/newview/llwind.cpp
+++ b/linden/indra/newview/llwind.cpp
@@ -48,7 +48,6 @@
48// viewer 48// viewer
49#include "noise.h" 49#include "noise.h"
50#include "v4color.h" 50#include "v4color.h"
51#include "viewer.h"
52#include "llagent.h" 51#include "llagent.h"
53#include "llworld.h" 52#include "llworld.h"
54 53
diff --git a/linden/indra/newview/llwindebug.cpp b/linden/indra/newview/llwindebug.cpp
index b65262c..d0129c8 100644
--- a/linden/indra/newview/llwindebug.cpp
+++ b/linden/indra/newview/llwindebug.cpp
@@ -33,16 +33,69 @@
33 33
34#ifdef LL_WINDOWS 34#ifdef LL_WINDOWS
35 35
36#include <tchar.h>
37#include <tlhelp32.h>
38#include "llappviewer.h"
36#include "llwindebug.h" 39#include "llwindebug.h"
37#include "llviewercontrol.h" 40#include "llviewercontrol.h"
38#include "lldir.h" 41#include "lldir.h"
42#include "llsd.h"
43#include "llsdserialize.h"
44
45#pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union
46#pragma warning(disable: 4100) //unreferenced formal parameter
47
48/*
49LLSD Block for Windows Dump Information
50<llsd>
51 <map>
52 <key>Platform</key>
53 <string></string>
54 <key>Process</key>
55 <string></string>
56 <key>Module</key>
57 <string></string>
58 <key>DateModified</key>
59 <string></string>
60 <key>ExceptionCode</key>
61 <string></string>
62 <key>ExceptionRead/WriteAddress</key>
63 <string></string>
64 <key>Instruction</key>
65 <string></string>
66 <key>Registers</key>
67 <map>
68 <!-- Continued for all registers -->
69 <key>EIP</key>
70 <string>...</string>
71 <!-- ... -->
72 </map>
73 <key>Call Stack</key>
74 <array>
75 <!-- One map per stack frame -->
76 <map>
77 <key>ModuleName</key>
78 <string></string>
79 <key>ModuleBaseAddress</key>
80 <string></string>
81 <key>ModuleOffsetAddress</key>
82 <string></string>
83 <key>Parameters</key>
84 <array>
85 <string></string>
86 </array>
87 </map>
88 <!-- ... -->
89 </array>
90 </map>
91</llsd>
92
93*/
39 94
40// From viewer.h 95// From viewer.h
41extern BOOL gInProductionGrid; 96extern BOOL gInProductionGrid;
42 97
43extern void (*gCrashCallback)(void); 98extern void (*gCrashCallback)(void);
44extern void write_debug(const char *str);
45extern void write_debug(const std::string &str);
46 99
47// based on dbghelp.h 100// based on dbghelp.h
48typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, 101typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
@@ -53,6 +106,248 @@ typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hF
53 106
54MINIDUMPWRITEDUMP f_mdwp = NULL; 107MINIDUMPWRITEDUMP f_mdwp = NULL;
55 108
109#undef UNICODE
110
111HMODULE hDbgHelp;
112
113// Tool Help functions.
114typedef HANDLE (WINAPI * CREATE_TOOL_HELP32_SNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);
115typedef BOOL (WINAPI * MODULE32_FIRST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
116typedef BOOL (WINAPI * MODULE32_NEST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
117
118CREATE_TOOL_HELP32_SNAPSHOT CreateToolhelp32Snapshot_;
119MODULE32_FIRST Module32First_;
120MODULE32_NEST Module32Next_;
121
122#define DUMP_SIZE_MAX 8000 //max size of our dump
123#define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls
124#define NL L"\r\n" //new line
125
126//Windows Call Stack Construction idea from
127//http://www.codeproject.com/tools/minidump.asp
128
129//****************************************************************************************
130BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr)
131//****************************************************************************************
132// Find module by Ret_Addr (address in the module).
133// Return Module_Name (full path) and Module_Addr (start address).
134// Return TRUE if found.
135{
136 MODULEENTRY32 M = {sizeof(M)};
137 HANDLE hSnapshot;
138
139 bool found = false;
140
141 if (CreateToolhelp32Snapshot_)
142 {
143 hSnapshot = CreateToolhelp32Snapshot_(TH32CS_SNAPMODULE, 0);
144
145 if ((hSnapshot != INVALID_HANDLE_VALUE) &&
146 Module32First_(hSnapshot, &M))
147 {
148 do
149 {
150 if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize)
151 {
152 lstrcpyn(Module_Name, M.szExePath, MAX_PATH);
153 Module_Addr = M.modBaseAddr;
154 found = true;
155 break;
156 }
157 } while (Module32Next_(hSnapshot, &M));
158 }
159
160 CloseHandle(hSnapshot);
161 }
162
163 return found;
164} //Get_Module_By_Ret_Addr
165
166//******************************************************************
167void WINAPI Get_Call_Stack(PEXCEPTION_POINTERS pException, LLSD& info)
168//******************************************************************
169// Fill Str with call stack info.
170// pException can be either GetExceptionInformation() or NULL.
171// If pException = NULL - get current call stack.
172{
173 LPWSTR Module_Name = new WCHAR[MAX_PATH];
174 PBYTE Module_Addr = 0;
175
176 typedef struct STACK
177 {
178 STACK * Ebp;
179 PBYTE Ret_Addr;
180 DWORD Param[0];
181 } STACK, * PSTACK;
182
183 STACK Stack = {0, 0};
184 PSTACK Ebp;
185
186 if (pException) //fake frame for exception address
187 {
188 Stack.Ebp = (PSTACK)pException->ContextRecord->Ebp;
189 Stack.Ret_Addr = (PBYTE)pException->ExceptionRecord->ExceptionAddress;
190 Ebp = &Stack;
191 }
192 else
193 {
194 Ebp = (PSTACK)&pException - 1; //frame addr of Get_Call_Stack()
195
196 // Skip frame of Get_Call_Stack().
197 if (!IsBadReadPtr(Ebp, sizeof(PSTACK)))
198 Ebp = Ebp->Ebp; //caller ebp
199 }
200
201 // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX.
202 // Break trace on wrong stack frame.
203 for (int Ret_Addr_I = 0, i = 0;
204 (Ret_Addr_I < CALL_TRACE_MAX) && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr));
205 Ret_Addr_I++, Ebp = Ebp->Ebp, ++i)
206 {
207 // If module with Ebp->Ret_Addr found.
208
209 if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr))
210 {
211 // Save module's address and full path.
212 info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name);
213 info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr;
214 info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr);
215
216 LLSD params;
217 // Save 5 params of the call. We don't know the real number of params.
218 if (pException && !Ret_Addr_I) //fake frame for exception address
219 params[0] = "Exception Offset";
220 else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD)))
221 {
222 for(int j = 0; j < 5; ++j)
223 {
224 params[j] = (int)Ebp->Param[j];
225 }
226 }
227 info["CallStack"][i]["Parameters"] = params;
228 }
229 info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr;
230 }
231} //Get_Call_Stack
232
233//***********************************
234void WINAPI Get_Version_Str(LLSD& info)
235//***********************************
236// Fill Str with Windows version.
237{
238 OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)}; //EX for NT 5.0 and later
239
240 if (!GetVersionEx((POSVERSIONINFO)&V))
241 {
242 ZeroMemory(&V, sizeof(V));
243 V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
244 GetVersionEx((POSVERSIONINFO)&V);
245 }
246
247 if (V.dwPlatformId != VER_PLATFORM_WIN32_NT)
248 V.dwBuildNumber = LOWORD(V.dwBuildNumber); //for 9x HIWORD(dwBuildNumber) = 0x04xx
249
250 info["Platform"] = llformat("Windows: %d.%d.%d, SP %d.%d, Product Type %d", //SP - service pack, Product Type - VER_NT_WORKSTATION,...
251 V.dwMajorVersion, V.dwMinorVersion, V.dwBuildNumber, V.wServicePackMajor, V.wServicePackMinor, V.wProductType);
252} //Get_Version_Str
253
254//*************************************************************
255LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
256//*************************************************************
257// Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str.
258{
259 LLSD info;
260 LPWSTR Str;
261 int Str_Len;
262 int i;
263 LPWSTR Module_Name = new WCHAR[MAX_PATH];
264 PBYTE Module_Addr;
265 HANDLE hFile;
266 FILETIME Last_Write_Time;
267 FILETIME Local_File_Time;
268 SYSTEMTIME T;
269
270 Str = new WCHAR[DUMP_SIZE_MAX];
271 Str_Len = 0;
272 if (!Str)
273 return NULL;
274
275 Get_Version_Str(info);
276
277 GetModuleFileName(NULL, Str, MAX_PATH);
278 info["Process"] = ll_convert_wide_to_string(Str);
279
280 // If exception occurred.
281 if (pException)
282 {
283 EXCEPTION_RECORD & E = *pException->ExceptionRecord;
284 CONTEXT & C = *pException->ContextRecord;
285
286 // If module with E.ExceptionAddress found - save its path and date.
287 if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr))
288 {
289 info["Module"] = ll_convert_wide_to_string(Module_Name);
290
291 if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
292 FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
293 {
294 if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time))
295 {
296 FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time);
297 FileTimeToSystemTime(&Local_File_Time, &T);
298
299 info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear);
300 }
301 CloseHandle(hFile);
302 }
303 }
304 else
305 {
306 info["ExceptionAddr"] = (int)E.ExceptionAddress;
307 }
308
309 info["ExceptionCode"] = (int)E.ExceptionCode;
310
311 /*
312 //TODO: Fix this
313 if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
314 {
315 // Access violation type - Write/Read.
316 LLSD exception_info;
317 exception_info["Type"] = E.ExceptionInformation[0] ? "Write" : "Read";
318 exception_info["Address"] = llformat("%08x", E.ExceptionInformation[1]);
319 info["Exception Information"] = exception_info;
320 }
321 */
322
323
324 // Save instruction that caused exception.
325 LLString str;
326 for (i = 0; i < 16; i++)
327 str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]);
328 info["Instruction"] = str;
329
330 LLSD registers;
331 registers["EAX"] = (int)C.Eax;
332 registers["EBX"] = (int)C.Ebx;
333 registers["ECX"] = (int)C.Ecx;
334 registers["EDX"] = (int)C.Edx;
335 registers["ESI"] = (int)C.Esi;
336 registers["EDI"] = (int)C.Edi;
337 registers["ESP"] = (int)C.Esp;
338 registers["EBP"] = (int)C.Ebp;
339 registers["EIP"] = (int)C.Eip;
340 registers["EFlags"] = (int)C.EFlags;
341 info["Registers"] = registers;
342 } //if (pException)
343
344 // Save call stack info.
345 Get_Call_Stack(pException, info);
346
347 return info;
348} //Get_Exception_Info
349
350#define UNICODE
56 351
57 352
58class LLMemoryReserve { 353class LLMemoryReserve {
@@ -96,7 +391,6 @@ static LLMemoryReserve gEmergencyMemoryReserve;
96// static 391// static
97BOOL LLWinDebug::setupExceptionHandler() 392BOOL LLWinDebug::setupExceptionHandler()
98{ 393{
99#ifdef LL_RELEASE_FOR_DOWNLOAD
100 394
101 static BOOL s_first_run = TRUE; 395 static BOOL s_first_run = TRUE;
102 // Load the dbghelp dll now, instead of waiting for the crash. 396 // Load the dbghelp dll now, instead of waiting for the crash.
@@ -123,7 +417,7 @@ BOOL LLWinDebug::setupExceptionHandler()
123 msg += local_dll_name; 417 msg += local_dll_name;
124 msg += "!\n"; 418 msg += "!\n";
125 419
126 write_debug(msg.c_str()); 420 //write_debug(msg.c_str());
127 421
128 ok = FALSE; 422 ok = FALSE;
129 } 423 }
@@ -133,7 +427,7 @@ BOOL LLWinDebug::setupExceptionHandler()
133 427
134 if (!f_mdwp) 428 if (!f_mdwp)
135 { 429 {
136 write_debug("No MiniDumpWriteDump!\n"); 430 //write_debug("No MiniDumpWriteDump!\n");
137 FreeLibrary(hDll); 431 FreeLibrary(hDll);
138 hDll = NULL; 432 hDll = NULL;
139 ok = FALSE; 433 ok = FALSE;
@@ -146,6 +440,13 @@ BOOL LLWinDebug::setupExceptionHandler()
146 LPTOP_LEVEL_EXCEPTION_FILTER prev_filter; 440 LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
147 prev_filter = SetUnhandledExceptionFilter(LLWinDebug::handleException); 441 prev_filter = SetUnhandledExceptionFilter(LLWinDebug::handleException);
148 442
443 // Try to get Tool Help library functions.
444 HMODULE hKernel32;
445 hKernel32 = GetModuleHandle(_T("KERNEL32"));
446 CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
447 Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32FirstW");
448 Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32NextW");
449
149 if (s_first_run) 450 if (s_first_run)
150 { 451 {
151 // We're fine, this is the first run. 452 // We're fine, this is the first run.
@@ -162,56 +463,16 @@ BOOL LLWinDebug::setupExceptionHandler()
162 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl; 463 llwarns << "Our exception handler (" << (void *)LLWinDebug::handleException << ") replaced with " << prev_filter << "!" << llendl;
163 ok = FALSE; 464 ok = FALSE;
164 } 465 }
466
165 return ok; 467 return ok;
166#else
167 // Internal builds don't mess with exception handling. 468 // Internal builds don't mess with exception handling.
168 return TRUE; 469 //return TRUE;
169#endif
170}
171
172void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename)
173{
174 if(f_mdwp == NULL)
175 {
176 write_debug("No way to generate a minidump, no MiniDumpWriteDump function!\n");
177 }
178 else if(gDirUtilp == NULL)
179 {
180 write_debug("No way to generate a minidump, no gDirUtilp!\n");
181 }
182 else
183 {
184 std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
185 filename);
186
187 HANDLE hFile = CreateFileA(dump_path.c_str(),
188 GENERIC_WRITE,
189 FILE_SHARE_WRITE,
190 NULL,
191 CREATE_ALWAYS,
192 FILE_ATTRIBUTE_NORMAL,
193 NULL);
194
195 if (hFile != INVALID_HANDLE_VALUE)
196 {
197 // Write the dump, ignoring the return value
198 f_mdwp(GetCurrentProcess(),
199 GetCurrentProcessId(),
200 hFile,
201 type,
202 ExInfop,
203 NULL,
204 NULL);
205
206 CloseHandle(hFile);
207 }
208
209 }
210} 470}
211
212// static 471// static
213LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop) 472LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop)
214{ 473{
474 // *NOTE:Mani - This method is no longer the initial exception handler.
475 // It is called from viewer_windows_exception_handler() and other places.
215 476
216 // 477 //
217 // Let go of a bunch of reserved memory to give library calls etc 478 // Let go of a bunch of reserved memory to give library calls etc
@@ -220,50 +481,34 @@ LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop)
220 // 481 //
221 gEmergencyMemoryReserve.release(); 482 gEmergencyMemoryReserve.release();
222 483
223 BOOL userWantsMaxiDump =
224 (stricmp(gSavedSettings.getString("LastName").c_str(), "linden") == 0)
225 || (stricmp(gSavedSettings.getString("LastName").c_str(), "tester") == 0);
226
227 BOOL alsoSaveMaxiDump = userWantsMaxiDump && !gInProductionGrid;
228
229 /* Calculate alsoSaveMaxiDump here */
230
231 if (exception_infop) 484 if (exception_infop)
232 { 485 {
233 _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
234 486
235 ExInfo.ThreadId = ::GetCurrentThreadId(); 487 std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
236 ExInfo.ExceptionPointers = exception_infop; 488 "SecondLifeException");
237 ExInfo.ClientPointers = NULL;
238 489
239 writeDumpToFile(MiniDumpNormal, &ExInfo, "SecondLife.dmp"); 490 std::string log_path = dump_path + ".log";
240 491
241 if(alsoSaveMaxiDump) 492 LLSD info;
242 writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLifePlus.dmp"); 493 info = Get_Exception_Info(exception_infop);
494 if (info)
495 {
496 std::ofstream out_file(log_path.c_str());
497 LLSDSerialize::toPrettyXML(info, out_file);
498 out_file.close();
499 }
243 } 500 }
244 else 501 else
245 { 502 {
246 writeDumpToFile(MiniDumpNormal, NULL, "SecondLife.dmp");
247
248 if(alsoSaveMaxiDump)
249 writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), NULL, "SecondLifePlus.dmp");
250 }
251
252 if (!exception_infop)
253 {
254 // We're calling this due to a network error, not due to an actual exception. 503 // We're calling this due to a network error, not due to an actual exception.
255 // It doesn't realy matter what we return. 504 // It doesn't realy matter what we return.
256 return EXCEPTION_CONTINUE_SEARCH; 505 return EXCEPTION_CONTINUE_SEARCH;
257 } 506 }
258 507
259 // 508 //handle viewer crash must be called here since
260 // Call the newview crash callback, which will spawn the crash 509 //we don't return handling of the application
261 // reporter. It may or may not spawn a dialog. 510 //back to the process.
262 // 511 LLAppViewer::handleViewerCrash();
263 if (gCrashCallback)
264 {
265 gCrashCallback();
266 }
267 512
268 // 513 //
269 // At this point, we always want to exit the app. There's no graceful 514 // At this point, we always want to exit the app. There's no graceful
@@ -276,4 +521,3 @@ LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop)
276} 521}
277 522
278#endif 523#endif
279
diff --git a/linden/indra/newview/llwindebug.h b/linden/indra/newview/llwindebug.h
index bb1f11d..e420138 100644
--- a/linden/indra/newview/llwindebug.h
+++ b/linden/indra/newview/llwindebug.h
@@ -41,7 +41,7 @@ public:
41 static BOOL setupExceptionHandler(); 41 static BOOL setupExceptionHandler();
42 42
43 static LONG WINAPI handleException(struct _EXCEPTION_POINTERS *pExceptionInfo); 43 static LONG WINAPI handleException(struct _EXCEPTION_POINTERS *pExceptionInfo);
44 static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename); 44 //static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const char *filename);
45}; 45};
46 46
47#endif // LL_LLWINDEBUG_H 47#endif // LL_LLWINDEBUG_H
diff --git a/linden/indra/newview/llworld.cpp b/linden/indra/newview/llworld.cpp
index dd3223c..e761235 100644
--- a/linden/indra/newview/llworld.cpp
+++ b/linden/indra/newview/llworld.cpp
@@ -56,7 +56,7 @@
56#include "llvowater.h" 56#include "llvowater.h"
57#include "message.h" 57#include "message.h"
58#include "pipeline.h" 58#include "pipeline.h"
59#include "viewer.h" // for do_disconnect() 59#include "llappviewer.h" // for do_disconnect()
60 60
61// 61//
62// Globals 62// Globals
@@ -248,7 +248,7 @@ void LLWorld::removeRegion(const LLHost &host)
248 llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl; 248 llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl;
249 249
250 llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl; 250 llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl;
251 do_disconnect("You have been disconnected from the region you were in."); 251 LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in.");
252 return; 252 return;
253 } 253 }
254 254
@@ -972,16 +972,16 @@ void LLWorld::requestCacheMisses()
972 } 972 }
973} 973}
974 974
975LLString LLWorld::getInfoString() 975void LLWorld::getInfo(LLSD& info)
976{ 976{
977 LLString info_string("World Info:\n"); 977 LLSD region_info;
978 for (region_list_t::iterator iter = mRegionList.begin(); 978 for (region_list_t::iterator iter = mRegionList.begin();
979 iter != mRegionList.end(); ++iter) 979 iter != mRegionList.end(); ++iter)
980 { 980 {
981 LLViewerRegion* regionp = *iter; 981 LLViewerRegion* regionp = *iter;
982 info_string += regionp->getInfoString(); 982 regionp->getInfo(region_info);
983 info["World"].append(region_info);
983 } 984 }
984 return info_string;
985} 985}
986 986
987void LLWorld::disconnectRegions() 987void LLWorld::disconnectRegions()
diff --git a/linden/indra/newview/llworld.h b/linden/indra/newview/llworld.h
index 91685cd..e634459 100644
--- a/linden/indra/newview/llworld.h
+++ b/linden/indra/newview/llworld.h
@@ -142,7 +142,7 @@ public:
142 void setSpaceTimeUSec(const U64 space_time_usec); 142 void setSpaceTimeUSec(const U64 space_time_usec);
143 U64 getSpaceTimeUSec() const; 143 U64 getSpaceTimeUSec() const;
144 144
145 LLString getInfoString(); 145 void getInfo(LLSD& info);
146 146
147public: 147public:
148 typedef std::list<LLViewerRegion*> region_list_t; 148 typedef std::list<LLViewerRegion*> region_list_t;
diff --git a/linden/indra/newview/llworldmap.cpp b/linden/indra/newview/llworldmap.cpp
index 6ba10ea..50c9cee 100644
--- a/linden/indra/newview/llworldmap.cpp
+++ b/linden/indra/newview/llworldmap.cpp
@@ -36,7 +36,7 @@
36#include "llregionhandle.h" 36#include "llregionhandle.h"
37#include "message.h" 37#include "message.h"
38 38
39#include "viewer.h" // for gPacificDaylightTime 39#include "llappviewer.h" // for gPacificDaylightTime
40#include "llagent.h" 40#include "llagent.h"
41#include "llmapresponders.h" 41#include "llmapresponders.h"
42#include "llviewercontrol.h" 42#include "llviewercontrol.h"
diff --git a/linden/indra/newview/llworldmapview.cpp b/linden/indra/newview/llworldmapview.cpp
index dc68910..dac6938 100644
--- a/linden/indra/newview/llworldmapview.cpp
+++ b/linden/indra/newview/llworldmapview.cpp
@@ -61,7 +61,7 @@
61#include "llviewerwindow.h" 61#include "llviewerwindow.h"
62#include "llworld.h" 62#include "llworld.h"
63#include "llworldmap.h" 63#include "llworldmap.h"
64#include "viewer.h" // Only for constants! 64#include "llappviewer.h" // Only for constants!
65 65
66#include "llglheaders.h" 66#include "llglheaders.h"
67 67
diff --git a/linden/indra/newview/llxmlrpctransaction.cpp b/linden/indra/newview/llxmlrpctransaction.cpp
index 905e35c..3df2073 100644
--- a/linden/indra/newview/llxmlrpctransaction.cpp
+++ b/linden/indra/newview/llxmlrpctransaction.cpp
@@ -39,7 +39,7 @@
39#include <curl/curl.h> 39#include <curl/curl.h>
40#include <xmlrpc-epi/xmlrpc.h> 40#include <xmlrpc-epi/xmlrpc.h>
41 41
42#include "viewer.h" 42#include "llappviewer.h"
43 43
44LLXMLRPCValue LLXMLRPCValue::operator[](const char* id) const 44LLXMLRPCValue LLXMLRPCValue::operator[](const char* id) const
45{ 45{
diff --git a/linden/indra/newview/macutil_Prefix.h b/linden/indra/newview/macutil_Prefix.h
index f8050c8..145a01c 100644
--- a/linden/indra/newview/macutil_Prefix.h
+++ b/linden/indra/newview/macutil_Prefix.h
@@ -39,3 +39,6 @@
39 39
40#include <Carbon/Carbon.h> 40#include <Carbon/Carbon.h>
41 41
42#undef check
43#undef verify
44#undef require
diff --git a/linden/indra/newview/macview.xcodeproj/default.pbxuser b/linden/indra/newview/macview.xcodeproj/default.pbxuser
new file mode 100644
index 0000000..62e730f
--- /dev/null
+++ b/linden/indra/newview/macview.xcodeproj/default.pbxuser
@@ -0,0 +1,183 @@
1// !$*UTF8*$!
2{
3 20286C28FDCF999611CA2CEA /* Project object */ = {
4 activeBuildConfigurationName = Development;
5 activeExecutable = E3C7DAB60CFF871100AD076D /* newview */;
6 activeTarget = 5503B89E05446B1F003D051F /* newview */;
7 breakpointsGroup = E3C7DAE10CFF885000AD076D /* XCBreakpointsBucket */;
8 codeSenseManager = E3C7DAC70CFF874400AD076D /* Code sense */;
9 executables = (
10 E3C7DAB40CFF871100AD076D /* AutoUpdater */,
11 E3C7DAB50CFF871100AD076D /* crashreporter */,
12 E3C7DAB60CFF871100AD076D /* newview */,
13 );
14 perUserDictionary = {
15 PBXConfiguration.PBXFileTableDataSource3.PBXFileTableDataSource = {
16 PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
17 PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
18 PBXFileTableDataSourceColumnWidthsKey = (
19 20,
20 243,
21 20,
22 48,
23 43,
24 43,
25 20,
26 );
27 PBXFileTableDataSourceColumnsKey = (
28 PBXFileDataSource_FiletypeID,
29 PBXFileDataSource_Filename_ColumnID,
30 PBXFileDataSource_Built_ColumnID,
31 PBXFileDataSource_ObjectSize_ColumnID,
32 PBXFileDataSource_Errors_ColumnID,
33 PBXFileDataSource_Warnings_ColumnID,
34 PBXFileDataSource_Target_ColumnID,
35 );
36 };
37 PBXConfiguration.PBXTargetDataSource.PBXTargetDataSource = {
38 PBXFileTableDataSourceColumnSortingDirectionKey = "-1";
39 PBXFileTableDataSourceColumnSortingKey = PBXFileDataSource_Filename_ColumnID;
40 PBXFileTableDataSourceColumnWidthsKey = (
41 20,
42 200,
43 131,
44 20,
45 48.1626,
46 43,
47 43,
48 );
49 PBXFileTableDataSourceColumnsKey = (
50 PBXFileDataSource_FiletypeID,
51 PBXFileDataSource_Filename_ColumnID,
52 PBXTargetDataSource_PrimaryAttribute,
53 PBXFileDataSource_Built_ColumnID,
54 PBXFileDataSource_ObjectSize_ColumnID,
55 PBXFileDataSource_Errors_ColumnID,
56 PBXFileDataSource_Warnings_ColumnID,
57 );
58 };
59 PBXPerProjectTemplateStateSaveDate = 218073202;
60 PBXWorkspaceStateSaveDate = 218073202;
61 };
62 sourceControlManager = E3C7DAC60CFF874400AD076D /* Source Control */;
63 userBuildSettings = {
64 };
65 };
66 5503B89E05446B1F003D051F /* newview */ = {
67 activeExec = 0;
68 executables = (
69 E3C7DAB60CFF871100AD076D /* newview */,
70 );
71 };
72 9932ED1E056C1F0900554101 /* crashreporter */ = {
73 activeExec = 0;
74 executables = (
75 E3C7DAB50CFF871100AD076D /* crashreporter */,
76 );
77 };
78 9967E9080B37533F0087BD1B /* fmodwrapper */ = {
79 activeExec = 0;
80 };
81 99CDED4905E70BAB0000F8AA /* llcommon */ = {
82 activeExec = 0;
83 };
84 99D5703205BDEFD7004DE704 /* AutoUpdater */ = {
85 activeExec = 0;
86 executables = (
87 E3C7DAB40CFF871100AD076D /* AutoUpdater */,
88 );
89 };
90 D64593550B3B4D7D00FAB68F /* llkdu */ = {
91 activeExec = 0;
92 };
93 E3C7DAB40CFF871100AD076D /* AutoUpdater */ = {
94 isa = PBXExecutable;
95 activeArgIndex = 2147483647;
96 activeArgIndices = (
97 );
98 argumentStrings = (
99 );
100 autoAttachOnCrash = 1;
101 configStateDict = {
102 };
103 customDataFormattersEnabled = 1;
104 debuggerPlugin = GDBDebugging;
105 disassemblyDisplayState = 0;
106 enableDebugStr = 1;
107 environmentEntries = (
108 );
109 executableSystemSymbolLevel = 0;
110 executableUserSymbolLevel = 0;
111 libgmallocEnabled = 0;
112 name = AutoUpdater;
113 sourceDirectories = (
114 );
115 };
116 E3C7DAB50CFF871100AD076D /* crashreporter */ = {
117 isa = PBXExecutable;
118 activeArgIndex = 2147483647;
119 activeArgIndices = (
120 );
121 argumentStrings = (
122 );
123 autoAttachOnCrash = 1;
124 configStateDict = {
125 };
126 customDataFormattersEnabled = 1;
127 debuggerPlugin = GDBDebugging;
128 disassemblyDisplayState = 0;
129 enableDebugStr = 1;
130 environmentEntries = (
131 );
132 executableSystemSymbolLevel = 0;
133 executableUserSymbolLevel = 0;
134 libgmallocEnabled = 0;
135 name = crashreporter;
136 sourceDirectories = (
137 );
138 };
139 E3C7DAB60CFF871100AD076D /* newview */ = {
140 isa = PBXExecutable;
141 activeArgIndex = 2147483647;
142 activeArgIndices = (
143 );
144 argumentStrings = (
145 );
146 autoAttachOnCrash = 1;
147 configStateDict = {
148 };
149 customDataFormattersEnabled = 1;
150 debuggerPlugin = GDBDebugging;
151 disassemblyDisplayState = 0;
152 enableDebugStr = 1;
153 environmentEntries = (
154 );
155 executableSystemSymbolLevel = 0;
156 executableUserSymbolLevel = 0;
157 libgmallocEnabled = 0;
158 name = newview;
159 sourceDirectories = (
160 );
161 };
162 E3C7DAC60CFF874400AD076D /* Source Control */ = {
163 isa = PBXSourceControlManager;
164 fallbackIsa = XCSourceControlManager;
165 isSCMEnabled = 0;
166 scmConfiguration = {
167 };
168 scmType = "";
169 };
170 E3C7DAC70CFF874400AD076D /* Code sense */ = {
171 isa = PBXCodeSenseManager;
172 indexTemplatePath = "";
173 };
174 E3C7DAE10CFF885000AD076D /* XCBreakpointsBucket */ = {
175 isa = XCBreakpointsBucket;
176 name = "Project Breakpoints";
177 objects = (
178 );
179 };
180 FD53B40509BDF9F600BFE3BC /* third party libs */ = {
181 activeExec = 0;
182 };
183}
diff --git a/linden/indra/newview/macview.xcodeproj/project.pbxproj b/linden/indra/newview/macview.xcodeproj/project.pbxproj
index c3a4b0a..2d54757 100644
--- a/linden/indra/newview/macview.xcodeproj/project.pbxproj
+++ b/linden/indra/newview/macview.xcodeproj/project.pbxproj
@@ -37,7 +37,6 @@
37 1A47B8E00860FDF100F73746 /* llpanelweb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A47B8DE0860FDF100F73746 /* llpanelweb.cpp */; }; 37 1A47B8E00860FDF100F73746 /* llpanelweb.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A47B8DE0860FDF100F73746 /* llpanelweb.cpp */; };
38 1A5104450ABF5B5A00520F6D /* llnotecard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104440ABF5B5A00520F6D /* llnotecard.cpp */; }; 38 1A5104450ABF5B5A00520F6D /* llnotecard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104440ABF5B5A00520F6D /* llnotecard.cpp */; };
39 1A5104570ABF60A800520F6D /* llviewerassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104560ABF60A800520F6D /* llviewerassetstorage.cpp */; }; 39 1A5104570ABF60A800520F6D /* llviewerassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5104560ABF60A800520F6D /* llviewerassetstorage.cpp */; };
40 1A57CD2C0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */; };
41 1A5B3B550A70147000A90391 /* llfloaterbump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */; }; 40 1A5B3B550A70147000A90391 /* llfloaterbump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */; };
42 1A61A7F00A5ED446009FE3D2 /* llfloateravatarpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */; }; 41 1A61A7F00A5ED446009FE3D2 /* llfloateravatarpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */; };
43 1A758C920A436FCA00589675 /* llagentdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C910A436FCA00589675 /* llagentdata.cpp */; }; 42 1A758C920A436FCA00589675 /* llagentdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A758C910A436FCA00589675 /* llagentdata.cpp */; };
@@ -292,7 +291,6 @@
292 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52AD8051F61DF00A80050 /* llmenucommands.cpp */; }; 291 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52AD8051F61DF00A80050 /* llmenucommands.cpp */; };
293 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADA051F61DF00A80050 /* llhudeffectpointat.cpp */; }; 292 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADA051F61DF00A80050 /* llhudeffectpointat.cpp */; };
294 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADB051F61DF00A80050 /* llhudeffectlookat.cpp */; }; 293 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26F52ADB051F61DF00A80050 /* llhudeffectlookat.cpp */; };
295 5503BCDA05446B20003D051F /* viewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26E79A760520BEC400A80050 /* viewer.cpp */; };
296 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306405221AB700A80050 /* llnameeditor.cpp */; }; 294 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306405221AB700A80050 /* llnameeditor.cpp */; };
297 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306805221DF400A80050 /* llnamebox.cpp */; }; 295 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2617306805221DF400A80050 /* llnamebox.cpp */; };
298 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 263E02FE05239C9A00A80050 /* llfeaturemanager.cpp */; }; 296 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 263E02FE05239C9A00A80050 /* llfeaturemanager.cpp */; };
@@ -589,10 +587,124 @@
589 AAEAAF270A8104D8005F0707 /* llscrollingpanellist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEAAF250A8104D8005F0707 /* llscrollingpanellist.cpp */; }; 587 AAEAAF270A8104D8005F0707 /* llscrollingpanellist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEAAF250A8104D8005F0707 /* llscrollingpanellist.cpp */; };
590 AAF5FFD20B13F71900D28A84 /* lltexturecache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */; }; 588 AAF5FFD20B13F71900D28A84 /* lltexturecache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAF5FFD00B13F71900D28A84 /* lltexturecache.cpp */; };
591 C16C08500B4AE6C7009AD67F /* llfloaterinspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */; }; 589 C16C08500B4AE6C7009AD67F /* llfloaterinspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */; };
590 C1E4A5760CC020FC005FB0A6 /* llcrashloggermac.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */; };
591 C1E4A5790CC0210F005FB0A6 /* llcrashlogger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */; };
592 C1E4A57B0CC02160005FB0A6 /* lldate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558220A06BB5F00DE9AE5 /* lldate.cpp */; };
593 C1E4A57C0CC02160005FB0A6 /* llthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9159DDD607662E7900F15AA1 /* llthread.cpp */; };
594 C1E4A57D0CC02160005FB0A6 /* u64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 616C4A8F0752C3D1006C2C65 /* u64.cpp */; };
595 C1E4A57E0CC02160005FB0A6 /* llerror.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192212F074A9B57005E1F34 /* llerror.cpp */; };
596 C1E4A57F0CC02160005FB0A6 /* llstreamtools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0633E5D309E3421500712406 /* llstreamtools.cpp */; };
597 C1E4A5800CC02160005FB0A6 /* llapp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3336D0ABB5379004351DE /* llapp.cpp */; };
598 C1E4A5810CC02160005FB0A6 /* llfasttimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922135074A9B57005E1F34 /* llfasttimer.cpp */; };
599 C1E4A5820CC02160005FB0A6 /* llfixedbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922137074A9B57005E1F34 /* llfixedbuffer.cpp */; };
600 C1E4A5830CC02160005FB0A6 /* llstat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192214B074A9B57005E1F34 /* llstat.cpp */; };
601 C1E4A5840CC02160005FB0A6 /* llmemory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192213E074A9B57005E1F34 /* llmemory.cpp */; };
602 C1E4A5850CC02160005FB0A6 /* llsd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 918B123A07B19605008CD6CD /* llsd.cpp */; };
603 C1E4A5860CC02160005FB0A6 /* llcommon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E43519092D6535003AE728 /* llcommon.cpp */; };
604 C1E4A5870CC02160005FB0A6 /* llares.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8849626B0C7B3E8A00A777FB /* llares.cpp */; };
605 C1E4A5880CC02160005FB0A6 /* llbase32.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */; };
606 C1E4A5890CC02160005FB0A6 /* llbase64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A02016D0B7A85DE00D5C589 /* llbase64.cpp */; };
607 C1E4A58A0CC02160005FB0A6 /* llmortician.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E4350B092D644F003AE728 /* llmortician.cpp */; };
608 C1E4A58B0CC02160005FB0A6 /* llprocessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922143074A9B57005E1F34 /* llprocessor.cpp */; };
609 C1E4A58C0CC02160005FB0A6 /* llformat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA9C40DF0B54B4BA00DD6F44 /* llformat.cpp */; };
610 C1E4A58D0CC02160005FB0A6 /* llsecondlifeurls.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AE41CB08F4842F00141675 /* llsecondlifeurls.cpp */; };
611 C1E4A58E0CC02160005FB0A6 /* llstringtable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922151074A9B58005E1F34 /* llstringtable.cpp */; };
612 C1E4A58F0CC02160005FB0A6 /* llsdutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 913ADF0D0A250C750055AB21 /* llsdutil.cpp */; };
613 C1E4A5900CC02160005FB0A6 /* llstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192214F074A9B58005E1F34 /* llstring.cpp */; };
614 C1E4A5910CC02160005FB0A6 /* lluri.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558280A06BB5F00DE9AE5 /* lluri.cpp */; };
615 C1E4A5920CC02160005FB0A6 /* llevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3AF6BC80A544C71005B5E2C /* llevent.cpp */; };
616 C1E4A5930CC02160005FB0A6 /* llapr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 915862D8075D2CE400F6A924 /* llapr.cpp */; };
617 C1E4A5940CC02160005FB0A6 /* llworkerthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99321B12081DD26000678159 /* llworkerthread.cpp */; };
618 C1E4A5960CC02160005FB0A6 /* llerrorthread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B2863B00ABF637200A05D7C /* llerrorthread.cpp */; };
619 C1E4A5970CC02160005FB0A6 /* llsdserialize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558260A06BB5F00DE9AE5 /* llsdserialize.cpp */; };
620 C1E4A5980CC02160005FB0A6 /* llrun.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E333730ABB79AC004351DE /* llrun.cpp */; };
621 C1E4A59A0CC02160005FB0A6 /* llframetimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922139074A9B57005E1F34 /* llframetimer.cpp */; };
622 C1E4A59B0CC02160005FB0A6 /* llmemorystream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3E09C75B3A00AA1849 /* llmemorystream.cpp */; };
623 C1E4A59C0CC02160005FB0A6 /* metaproperty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C6E0A37203E006E8A2D /* metaproperty.cpp */; };
624 C1E4A59D0CC02160005FB0A6 /* llfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0633E5D009E341F500712406 /* llfile.cpp */; };
625 C1E4A59E0CC02160005FB0A6 /* llcriticaldamp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922127074A9B57005E1F34 /* llcriticaldamp.cpp */; };
626 C1E4A59F0CC02160005FB0A6 /* llsdserialize_xml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD1558240A06BB5F00DE9AE5 /* llsdserialize_xml.cpp */; };
627 C1E4A5A00CC02160005FB0A6 /* metaclass.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C6B0A37203E006E8A2D /* metaclass.cpp */; };
628 C1E4A5A10CC02160005FB0A6 /* reflective.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDA39C710A37203E006E8A2D /* reflective.cpp */; };
629 C1E4A5A20CC02160005FB0A6 /* llsys.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922153074A9B58005E1F34 /* llsys.cpp */; };
630 C1E4A5A30CC02160005FB0A6 /* llassettype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99E4326B092D5996003AE728 /* llassettype.cpp */; };
631 C1E4A5A40CC02160005FB0A6 /* lltimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 616C4A8E0752C3D1006C2C65 /* lltimer.cpp */; };
632 C1E4A5A50CC02160005FB0A6 /* timing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922161074A9B58005E1F34 /* timing.cpp */; };
633 C1E4A5A60CC02160005FB0A6 /* llliveappconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A97C4540B8BCF9C00331A24 /* llliveappconfig.cpp */; };
634 C1E4A5A70CC0216F005FB0A6 /* llnullcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221DF074A9B59005E1F34 /* llnullcipher.cpp */; };
635 C1E4A5A80CC0216F005FB0A6 /* llurlrequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B39350F0AD6F9F400F57245 /* llurlrequest.cpp */; };
636 C1E4A5AA0CC0216F005FB0A6 /* lltransfersourceasset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F0074A9B59005E1F34 /* lltransfersourceasset.cpp */; };
637 C1E4A5AB0CC0216F005FB0A6 /* llhost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221D3074A9B59005E1F34 /* llhost.cpp */; };
638 C1E4A5AC0CC0216F005FB0A6 /* llmessageconfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9C659A850BAB0B6E00D2EB60 /* llmessageconfig.cpp */; };
639 C1E4A5AD0CC0216F005FB0A6 /* partsyspacket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922211074A9B59005E1F34 /* partsyspacket.cpp */; };
640 C1E4A5AE0CC0216F005FB0A6 /* lltemplatemessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA690B4BF897003323BA /* lltemplatemessagebuilder.cpp */; };
641 C1E4A5AF0CC0216F005FB0A6 /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922208074A9B59005E1F34 /* message.cpp */; };
642 C1E4A5B00CC0216F005FB0A6 /* llbufferstream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3A09C75B0500AA1849 /* llbufferstream.cpp */; };
643 C1E4A5B10CC0216F005FB0A6 /* llhttpnode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FDCB54F40AFBC5060033B433 /* llhttpnode.cpp */; };
644 C1E4A5B20CC0216F005FB0A6 /* lltransfersourcefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F2074A9B59005E1F34 /* lltransfersourcefile.cpp */; };
645 C1E4A5B30CC0216F005FB0A6 /* llchainio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD835B800AD1CB6700038B74 /* llchainio.cpp */; };
646 C1E4A5B40CC0216F005FB0A6 /* llhttpclient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9B39350B0AD6F96900F57245 /* llhttpclient.cpp */; };
647 C1E4A5B50CC0216F005FB0A6 /* llxfer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FB074A9B59005E1F34 /* llxfer.cpp */; };
648 C1E4A5B60CC0216F005FB0A6 /* network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220F074A9B59005E1F34 /* network.cpp */; };
649 C1E4A5B70CC0216F005FB0A6 /* llpacketring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E3074A9B59005E1F34 /* llpacketring.cpp */; };
650 C1E4A5B80CC0216F005FB0A6 /* llxfer_vfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922201074A9B59005E1F34 /* llxfer_vfile.cpp */; };
651 C1E4A5B90CC0216F005FB0A6 /* llsdmessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14190B978815003F64DE /* llsdmessagereader.cpp */; };
652 C1E4A5BA0CC0216F005FB0A6 /* llxfermanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922203074A9B59005E1F34 /* llxfermanager.cpp */; };
653 C1E4A5BB0CC0216F005FB0A6 /* llmessagethrottle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A241CB8E07B3E383001A39E3 /* llmessagethrottle.cpp */; };
654 C1E4A5BC0CC0216F005FB0A6 /* llsdmessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14170B978815003F64DE /* llsdmessagebuilder.cpp */; };
655 C1E4A5BD0CC0216F005FB0A6 /* message_string_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220C074A9B59005E1F34 /* message_string_table.cpp */; };
656 C1E4A5BE0CC0216F005FB0A6 /* message_prehash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220A074A9B59005E1F34 /* message_prehash.cpp */; };
657 C1E4A5BF0CC0216F005FB0A6 /* llmessagetemplate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA6A0B4BF898003323BA /* llmessagetemplate.cpp */; };
658 C1E4A5C00CC0216F005FB0A6 /* llxfer_file.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FD074A9B59005E1F34 /* llxfer_file.cpp */; };
659 C1E4A5C10CC0216F005FB0A6 /* llmime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91469E790B4486C10009E8F9 /* llmime.cpp */; };
660 C1E4A5C20CC0216F005FB0A6 /* llmessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3834D6010B73ABC1002B61C8 /* llmessagereader.cpp */; };
661 C1E4A5C30CC0216F005FB0A6 /* patch_idct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922217074A9B59005E1F34 /* patch_idct.cpp */; };
662 C1E4A5C40CC0216F005FB0A6 /* lliosocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99374E460B5C603E008DB4BE /* lliosocket.cpp */; };
663 C1E4A5C50CC0216F005FB0A6 /* llcachename.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221BB074A9B59005E1F34 /* llcachename.cpp */; };
664 C1E4A5C60CC0216F005FB0A6 /* llblowfishcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A02017E0B7A861200D5C589 /* llblowfishcipher.cpp */; };
665 C1E4A5C70CC0216F005FB0A6 /* llpacketbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E1074A9B59005E1F34 /* llpacketbuffer.cpp */; };
666 C1E4A5C80CC0216F005FB0A6 /* llmessagetemplateparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9CC280FE0BE79737006D8BDC /* llmessagetemplateparser.cpp */; };
667 C1E4A5C90CC0216F005FB0A6 /* llbuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A3809C75B0500AA1849 /* llbuffer.cpp */; };
668 C1E4A5CA0CC0216F005FB0A6 /* llcurl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA348DF80B0EAB31002C3015 /* llcurl.cpp */; };
669 C1E4A5CB0CC0216F005FB0A6 /* llxorcipher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922205074A9B59005E1F34 /* llxorcipher.cpp */; };
670 C1E4A5CC0CC0216F005FB0A6 /* llnamevalue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221DD074A9B59005E1F34 /* llnamevalue.cpp */; };
671 C1E4A5CD0CC0216F005FB0A6 /* lliobuffer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190430E08327117002396D4 /* lliobuffer.cpp */; };
672 C1E4A5CE0CC0216F005FB0A6 /* llpartdata.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221E5074A9B59005E1F34 /* llpartdata.cpp */; };
673 C1E4A5CF0CC0216F005FB0A6 /* llfiltersd2xmlrpc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190430C08327117002396D4 /* llfiltersd2xmlrpc.cpp */; };
674 C1E4A5D00CC0216F005FB0A6 /* net.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192220D074A9B59005E1F34 /* net.cpp */; };
675 C1E4A5D10CC0216F005FB0A6 /* llxfer_mem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221FF074A9B59005E1F34 /* llxfer_mem.cpp */; };
676 C1E4A5D20CC0216F005FB0A6 /* llthrottle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221EC074A9B59005E1F34 /* llthrottle.cpp */; };
677 C1E4A5D30CC0216F005FB0A6 /* lllogtextmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A241CB8C07B3E383001A39E3 /* lllogtextmessage.cpp */; };
678 C1E4A5D40CC0216F005FB0A6 /* llinstantmessage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AE41CF08F4845400141675 /* llinstantmessage.cpp */; };
679 C1E4A5D50CC0216F005FB0A6 /* llmessagebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 38D0FA6B0B4BF898003323BA /* llmessagebuilder.cpp */; };
680 C1E4A5D60CC0216F005FB0A6 /* lldatapacker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221C5074A9B59005E1F34 /* lldatapacker.cpp */; };
681 C1E4A5D70CC0216F005FB0A6 /* patch_code.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922213074A9B59005E1F34 /* patch_code.cpp */; };
682 C1E4A5D80CC0216F005FB0A6 /* llservice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431408327117002396D4 /* llservice.cpp */; };
683 C1E4A5D90CC0216F005FB0A6 /* llclassifiedflags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99FBB071087365E90048A5CC /* llclassifiedflags.cpp */; };
684 C1E4A5DA0CC0216F005FB0A6 /* patch_dct.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922215074A9B59005E1F34 /* patch_dct.cpp */; };
685 C1E4A5DB0CC0216F005FB0A6 /* lltransfertargetvfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F6074A9B59005E1F34 /* lltransfertargetvfile.cpp */; };
686 C1E4A5DC0CC0216F005FB0A6 /* lltemplatemessagereader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3834D6030B73ABC1002B61C8 /* lltemplatemessagereader.cpp */; };
687 C1E4A5DD0CC0216F005FB0A6 /* llassetstorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221B9074A9B59005E1F34 /* llassetstorage.cpp */; };
688 C1E4A5DE0CC0216F005FB0A6 /* lldispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221D0074A9B59005E1F34 /* lldispatcher.cpp */; };
689 C1E4A5DF0CC0216F005FB0A6 /* llpacketack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9117EAA10BF24A6100845BD2 /* llpacketack.cpp */; };
690 C1E4A5E00CC0216F005FB0A6 /* llcircuit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221BE074A9B59005E1F34 /* llcircuit.cpp */; };
691 C1E4A5E10CC0216F005FB0A6 /* llhttpsender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DA4B14140B978815003F64DE /* llhttpsender.cpp */; };
692 C1E4A5E20CC0216F005FB0A6 /* llpumpio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431208327117002396D4 /* llpumpio.cpp */; };
693 C1E4A5E30CC0216F005FB0A6 /* lltransfertargetfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F4074A9B59005E1F34 /* lltransfertargetfile.cpp */; };
694 C1E4A5E40CC0216F005FB0A6 /* lluseroperation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221F8074A9B59005E1F34 /* lluseroperation.cpp */; };
695 C1E4A5E50CC0216F005FB0A6 /* lliopipe.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9190431008327117002396D4 /* lliopipe.cpp */; };
696 C1E4A5E60CC0216F005FB0A6 /* llioutil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FD6C9A4609C75BCD00AA1849 /* llioutil.cpp */; };
697 C1E4A5E70CC0216F005FB0A6 /* lltransfermanager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 619221EE074A9B59005E1F34 /* lltransfermanager.cpp */; };
698 C1E4A5F70CC0226A005FB0A6 /* llxmltree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6192227B074A9B5A005E1F34 /* llxmltree.cpp */; };
699 C1E4A5F80CC0226A005FB0A6 /* llxmlnode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EBAAFE160858EBA400B9269A /* llxmlnode.cpp */; };
700 C1E4A5F90CC0226A005FB0A6 /* llcontrol.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AA0E2A5F0A2FDAEE0066250A /* llcontrol.cpp */; };
701 C1E4A5FA0CC0226A005FB0A6 /* llxmlparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 61922279074A9B5A005E1F34 /* llxmlparser.cpp */; };
702 C1E4A5FE0CC02365005FB0A6 /* libxmlrpc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8765809BEA39700AF6316 /* libxmlrpc.a */; };
592 C1F5D0A50B138AEB00827F1D /* lluserrelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */; }; 703 C1F5D0A50B138AEB00827F1D /* lluserrelations.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */; };
593 C64F673F0AFBED80009732B5 /* lllogchat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F673D0AFBED80009732B5 /* lllogchat.cpp */; }; 704 C64F673F0AFBED80009732B5 /* lllogchat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F673D0AFBED80009732B5 /* lllogchat.cpp */; };
594 C64F67420AFBED91009732B5 /* lldirpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F67400AFBED91009732B5 /* lldirpicker.cpp */; }; 705 C64F67420AFBED91009732B5 /* lldirpicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C64F67400AFBED91009732B5 /* lldirpicker.cpp */; };
595 D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */; }; 706 D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */; };
707 D2768CE50CEA38940000BD66 /* llfloaterlagmeter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */; };
596 D62830DB0B4DC76300F8830F /* llimagej2coj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D62830D80B4DC76300F8830F /* llimagej2coj.cpp */; }; 708 D62830DB0B4DC76300F8830F /* llimagej2coj.cpp in Sources */ = {isa = PBXBuildFile; fileRef = D62830D80B4DC76300F8830F /* llimagej2coj.cpp */; };
597 D645940C0B3B6D9000FAB68F /* libapr-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8764E09BEA39600AF6316 /* libapr-1.a */; }; 709 D645940C0B3B6D9000FAB68F /* libapr-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FDE8764E09BEA39600AF6316 /* libapr-1.a */; };
598 D645940D0B3B6D9A00FAB68F /* libaprutil-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD6C9A5209C773A000AA1849 /* libaprutil-1.a */; }; 710 D645940D0B3B6D9A00FAB68F /* libaprutil-1.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD6C9A5209C773A000AA1849 /* libaprutil-1.a */; };
@@ -715,6 +827,10 @@
715 FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138730CD80BAE00F32EE3 /* llfloaterclassified.cpp */; }; 827 FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138730CD80BAE00F32EE3 /* llfloaterclassified.cpp */; };
716 FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138750CD80BAE00F32EE3 /* llfloaterevent.cpp */; }; 828 FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138750CD80BAE00F32EE3 /* llfloaterevent.cpp */; };
717 FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */; }; 829 FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */; };
830 FE679A3D0CDFF5AC00959041 /* llappviewer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A350CDFF5AC00959041 /* llappviewer.cpp */; };
831 FE679A3E0CDFF5AC00959041 /* llappviewermacosx.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */; };
832 FE679A3F0CDFF5AC00959041 /* llvectorperfoptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */; };
833 FE679A400CDFF5AC00959041 /* llvieweraudio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */; };
718/* End PBXBuildFile section */ 834/* End PBXBuildFile section */
719 835
720/* Begin PBXBuildRule section */ 836/* Begin PBXBuildRule section */
@@ -874,8 +990,6 @@
874 1A5104580ABF60BF00520F6D /* llviewerassetstorage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewerassetstorage.h; sourceTree = "<group>"; }; 990 1A5104580ABF60BF00520F6D /* llviewerassetstorage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llviewerassetstorage.h; sourceTree = "<group>"; };
875 1A57B92C09F8303A004D8B1A /* lllslconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lllslconstants.h; sourceTree = "<group>"; }; 991 1A57B92C09F8303A004D8B1A /* lllslconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lllslconstants.h; sourceTree = "<group>"; };
876 1A57B92D09F8303A004D8B1A /* llagentconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentconstants.h; sourceTree = "<group>"; }; 992 1A57B92D09F8303A004D8B1A /* llagentconstants.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentconstants.h; sourceTree = "<group>"; };
877 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlagmeter.cpp; sourceTree = "<group>"; };
878 1A57CD2D0C9EFEA400B6EB24 /* llfloaterlagmeter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlagmeter.h; sourceTree = "<group>"; };
879 1A5B3B530A70146900A90391 /* llfloaterbump.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterbump.h; sourceTree = "<group>"; }; 993 1A5B3B530A70146900A90391 /* llfloaterbump.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterbump.h; sourceTree = "<group>"; };
880 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterbump.cpp; sourceTree = "<group>"; }; 994 1A5B3B540A70147000A90391 /* llfloaterbump.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterbump.cpp; sourceTree = "<group>"; };
881 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateravatarpicker.cpp; sourceTree = "<group>"; }; 995 1A61A7EF0A5ED446009FE3D2 /* llfloateravatarpicker.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloateravatarpicker.cpp; sourceTree = "<group>"; };
@@ -909,7 +1023,6 @@
909 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llbase32.cpp; sourceTree = "<group>"; }; 1023 1A9897E80B98E2F4005C45D7 /* llbase32.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llbase32.cpp; sourceTree = "<group>"; };
910 1A9EC236083EA0100023D510 /* llfloatereditui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloatereditui.cpp; sourceTree = "<group>"; }; 1024 1A9EC236083EA0100023D510 /* llfloatereditui.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloatereditui.cpp; sourceTree = "<group>"; };
911 1A9EC23A083EA01F0023D510 /* llfloatereditui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloatereditui.h; sourceTree = "<group>"; }; 1025 1A9EC23A083EA01F0023D510 /* llfloatereditui.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloatereditui.h; sourceTree = "<group>"; };
912 1AB0DADC0A52E8A0001CACEB /* message_template.msg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = message_template.msg; path = ../../scripts/messages/message_template.msg; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; };
913 1AA2EE9C0CBBE2790017E185 /* llfloaterlandmark.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlandmark.h; sourceTree = "<group>"; }; 1026 1AA2EE9C0CBBE2790017E185 /* llfloaterlandmark.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterlandmark.h; sourceTree = "<group>"; };
914 1AA2EE9D0CBBE2790017E185 /* llfloaterlandmark.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlandmark.cpp; sourceTree = "<group>"; }; 1027 1AA2EE9D0CBBE2790017E185 /* llfloaterlandmark.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlandmark.cpp; sourceTree = "<group>"; };
915 1AA2EE9F0CBBE28C0017E185 /* llclassifiedstatsresponder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llclassifiedstatsresponder.h; sourceTree = "<group>"; }; 1028 1AA2EE9F0CBBE28C0017E185 /* llclassifiedstatsresponder.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llclassifiedstatsresponder.h; sourceTree = "<group>"; };
@@ -918,6 +1031,7 @@
918 1AA2EEA30CBBE2BF0017E185 /* llfloaterurldisplay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterurldisplay.cpp; sourceTree = "<group>"; }; 1031 1AA2EEA30CBBE2BF0017E185 /* llfloaterurldisplay.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterurldisplay.cpp; sourceTree = "<group>"; };
919 1AA2EEA50CBBE2D40017E185 /* llremoteparcelrequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llremoteparcelrequest.h; sourceTree = "<group>"; }; 1032 1AA2EEA50CBBE2D40017E185 /* llremoteparcelrequest.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llremoteparcelrequest.h; sourceTree = "<group>"; };
920 1AA2EEA60CBBE2D40017E185 /* llremoteparcelrequest.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llremoteparcelrequest.cpp; sourceTree = "<group>"; }; 1033 1AA2EEA60CBBE2D40017E185 /* llremoteparcelrequest.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llremoteparcelrequest.cpp; sourceTree = "<group>"; };
1034 1AB0DADC0A52E8A0001CACEB /* message_template.msg */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; name = message_template.msg; path = ../../scripts/messages/message_template.msg; sourceTree = SOURCE_ROOT; };
921 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlsimstring.h; sourceTree = "<group>"; }; 1035 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurlsimstring.h; sourceTree = "<group>"; };
922 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurldispatcher.h; sourceTree = "<group>"; }; 1036 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llurldispatcher.h; sourceTree = "<group>"; };
923 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlsimstring.cpp; sourceTree = "<group>"; }; 1037 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llurlsimstring.cpp; sourceTree = "<group>"; };
@@ -949,7 +1063,6 @@
949 26C5F3E605DB1E3C00994065 /* llfloaterpostcard.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterpostcard.cpp; sourceTree = "<group>"; }; 1063 26C5F3E605DB1E3C00994065 /* llfloaterpostcard.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterpostcard.cpp; sourceTree = "<group>"; };
950 26E79A3D0520B56600A80050 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; }; 1064 26E79A3D0520B56600A80050 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = /System/Library/Frameworks/OpenGL.framework; sourceTree = "<absolute>"; };
951 26E79A630520BC6D00A80050 /* libSystem.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libSystem.dylib; path = /usr/lib/libSystem.B.dylib; sourceTree = "<absolute>"; }; 1065 26E79A630520BC6D00A80050 /* libSystem.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libSystem.dylib; path = /usr/lib/libSystem.B.dylib; sourceTree = "<absolute>"; };
952 26E79A760520BEC400A80050 /* viewer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = viewer.cpp; sourceTree = SOURCE_ROOT; };
953 26E79A7A0520ED1200A80050 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; }; 1066 26E79A7A0520ED1200A80050 /* AGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AGL.framework; path = /System/Library/Frameworks/AGL.framework; sourceTree = "<absolute>"; };
954 26F529A1051F61DF00A80050 /* llgenepool.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llgenepool.cpp; sourceTree = SOURCE_ROOT; }; 1067 26F529A1051F61DF00A80050 /* llgenepool.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llgenepool.cpp; sourceTree = SOURCE_ROOT; };
955 26F529A2051F61DF00A80050 /* llviewercamera.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewercamera.cpp; sourceTree = SOURCE_ROOT; }; 1068 26F529A2051F61DF00A80050 /* llviewercamera.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llviewercamera.cpp; sourceTree = SOURCE_ROOT; };
@@ -1665,7 +1778,6 @@
1665 996209680B864D0E00392531 /* SLVoiceAgent.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = SLVoiceAgent.app; path = "vivox-runtime/universal-darwin/SLVoiceAgent.app"; sourceTree = SOURCE_ROOT; }; 1778 996209680B864D0E00392531 /* SLVoiceAgent.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; name = SLVoiceAgent.app; path = "vivox-runtime/universal-darwin/SLVoiceAgent.app"; sourceTree = SOURCE_ROOT; };
1666 9967E9090B37533F0087BD1B /* libfmodwrapper.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libfmodwrapper.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; 1779 9967E9090B37533F0087BD1B /* libfmodwrapper.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libfmodwrapper.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
1667 9967E9520B37564D0087BD1B /* fmodwrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fmodwrapper.cpp; sourceTree = "<group>"; }; 1780 9967E9520B37564D0087BD1B /* fmodwrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fmodwrapper.cpp; sourceTree = "<group>"; };
1668 997B4BD006015820001B0407 /* viewer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = viewer.h; sourceTree = SOURCE_ROOT; };
1669 997B4BD106015820001B0407 /* VertexCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VertexCache.h; sourceTree = SOURCE_ROOT; }; 1781 997B4BD106015820001B0407 /* VertexCache.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = VertexCache.h; sourceTree = SOURCE_ROOT; };
1670 997B4BD406015820001B0407 /* randgauss.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = randgauss.h; sourceTree = SOURCE_ROOT; }; 1782 997B4BD406015820001B0407 /* randgauss.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = randgauss.h; sourceTree = SOURCE_ROOT; };
1671 997B4BD506015820001B0407 /* pipeline.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = pipeline.h; sourceTree = SOURCE_ROOT; }; 1783 997B4BD506015820001B0407 /* pipeline.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = pipeline.h; sourceTree = SOURCE_ROOT; };
@@ -1898,12 +2010,10 @@
1898 997B4D1306015823001B0407 /* llcallbacklist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcallbacklist.h; sourceTree = SOURCE_ROOT; }; 2010 997B4D1306015823001B0407 /* llcallbacklist.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcallbacklist.h; sourceTree = SOURCE_ROOT; };
1899 997B4D1606015823001B0407 /* llbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbox.h; sourceTree = SOURCE_ROOT; }; 2011 997B4D1606015823001B0407 /* llbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbox.h; sourceTree = SOURCE_ROOT; };
1900 997B4D1806015823001B0407 /* llbbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbbox.h; sourceTree = SOURCE_ROOT; }; 2012 997B4D1806015823001B0407 /* llbbox.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llbbox.h; sourceTree = SOURCE_ROOT; };
1901 997B4D1C06015823001B0407 /* llaudiostatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llaudiostatus.h; sourceTree = SOURCE_ROOT; };
1902 997B4D1E06015823001B0407 /* llappearance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappearance.h; sourceTree = SOURCE_ROOT; }; 2013 997B4D1E06015823001B0407 /* llappearance.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappearance.h; sourceTree = SOURCE_ROOT; };
1903 997B4D2206015823001B0407 /* llagentpilot.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentpilot.h; sourceTree = SOURCE_ROOT; }; 2014 997B4D2206015823001B0407 /* llagentpilot.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagentpilot.h; sourceTree = SOURCE_ROOT; };
1904 997B4D2306015823001B0407 /* llagent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagent.h; sourceTree = SOURCE_ROOT; }; 2015 997B4D2306015823001B0407 /* llagent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llagent.h; sourceTree = SOURCE_ROOT; };
1905 997B4D2406015823001B0407 /* head.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = head.h; sourceTree = SOURCE_ROOT; }; 2016 997B4D2406015823001B0407 /* head.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = head.h; sourceTree = SOURCE_ROOT; };
1906 997B4D2506015823001B0407 /* llasynchostbyname.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llasynchostbyname.h; sourceTree = SOURCE_ROOT; };
1907 9985A08E0AC1FE3600579AFB /* llwindowmacosx-objc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "llwindowmacosx-objc.h"; sourceTree = "<group>"; }; 2017 9985A08E0AC1FE3600579AFB /* llwindowmacosx-objc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "llwindowmacosx-objc.h"; sourceTree = "<group>"; };
1908 9985A08F0AC1FE3600579AFB /* llwindowmacosx-objc.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = "llwindowmacosx-objc.mm"; sourceTree = "<group>"; }; 2018 9985A08F0AC1FE3600579AFB /* llwindowmacosx-objc.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = "llwindowmacosx-objc.mm"; sourceTree = "<group>"; };
1909 9985A1270AC1FE4E00579AFB /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = ../../../../../../../../System/Library/Frameworks/AppKit.framework; sourceTree = "<group>"; }; 2019 9985A1270AC1FE4E00579AFB /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = ../../../../../../../../System/Library/Frameworks/AppKit.framework; sourceTree = "<group>"; };
@@ -2032,6 +2142,10 @@
2032 ABD8702D0B3C68630007C63B /* llvoavatar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvoavatar.h; sourceTree = "<group>"; }; 2142 ABD8702D0B3C68630007C63B /* llvoavatar.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvoavatar.h; sourceTree = "<group>"; };
2033 C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterinspect.cpp; sourceTree = "<group>"; }; 2143 C16C084E0B4AE6C7009AD67F /* llfloaterinspect.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterinspect.cpp; sourceTree = "<group>"; };
2034 C16C084F0B4AE6C7009AD67F /* llfloaterinspect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterinspect.h; sourceTree = "<group>"; }; 2144 C16C084F0B4AE6C7009AD67F /* llfloaterinspect.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterinspect.h; sourceTree = "<group>"; };
2145 C1B2AF890CD679EB004CD4EF /* llcrashloggermac.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llcrashloggermac.h; sourceTree = "<group>"; };
2146 C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llcrashloggermac.cpp; sourceTree = "<group>"; };
2147 C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = llcrashlogger.cpp; path = ../llcrashlogger/llcrashlogger.cpp; sourceTree = SOURCE_ROOT; };
2148 C1E4A5780CC0210F005FB0A6 /* llcrashlogger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = llcrashlogger.h; path = ../llcrashlogger/llcrashlogger.h; sourceTree = SOURCE_ROOT; };
2035 C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lluserrelations.cpp; sourceTree = "<group>"; }; 2149 C1F5D0A30B138AEB00827F1D /* lluserrelations.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lluserrelations.cpp; sourceTree = "<group>"; };
2036 C1F5D0A40B138AEB00827F1D /* lluserrelations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lluserrelations.h; sourceTree = "<group>"; }; 2150 C1F5D0A40B138AEB00827F1D /* lluserrelations.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = lluserrelations.h; sourceTree = "<group>"; };
2037 C64F673D0AFBED80009732B5 /* lllogchat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lllogchat.cpp; sourceTree = "<group>"; }; 2151 C64F673D0AFBED80009732B5 /* lllogchat.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = lllogchat.cpp; sourceTree = "<group>"; };
@@ -2041,6 +2155,8 @@
2041 CB162DB40C6CCCFE00BF83BB /* llextendedstatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llextendedstatus.h; sourceTree = "<group>"; }; 2155 CB162DB40C6CCCFE00BF83BB /* llextendedstatus.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llextendedstatus.h; sourceTree = "<group>"; };
2042 D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterreleasemsg.cpp; sourceTree = "<group>"; }; 2156 D23289B30C453A3600304FEF /* llfloaterreleasemsg.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterreleasemsg.cpp; sourceTree = "<group>"; };
2043 D23289B40C453A3600304FEF /* llfloaterreleasemsg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterreleasemsg.h; sourceTree = "<group>"; }; 2157 D23289B40C453A3600304FEF /* llfloaterreleasemsg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterreleasemsg.h; sourceTree = "<group>"; };
2158 D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterlagmeter.cpp; sourceTree = "<group>"; };
2159 D2768CE40CEA38940000BD66 /* llfloaterlagmeter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = llfloaterlagmeter.h; sourceTree = "<group>"; };
2044 D62830D80B4DC76300F8830F /* llimagej2coj.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llimagej2coj.cpp; sourceTree = "<group>"; }; 2160 D62830D80B4DC76300F8830F /* llimagej2coj.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llimagej2coj.cpp; sourceTree = "<group>"; };
2045 D62830D90B4DC76300F8830F /* llimagej2coj.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llimagej2coj.h; sourceTree = "<group>"; }; 2161 D62830D90B4DC76300F8830F /* llimagej2coj.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llimagej2coj.h; sourceTree = "<group>"; };
2046 D628315B0B4F3FA100F8830F /* llfont.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfont.cpp; sourceTree = "<group>"; }; 2162 D628315B0B4F3FA100F8830F /* llfont.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfont.cpp; sourceTree = "<group>"; };
@@ -2234,6 +2350,14 @@
2234 FE5138760CD80BAE00F32EE3 /* llfloaterevent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterevent.h; sourceTree = "<group>"; }; 2350 FE5138760CD80BAE00F32EE3 /* llfloaterevent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterevent.h; sourceTree = "<group>"; };
2235 FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterparcel.cpp; sourceTree = "<group>"; }; 2351 FE5138770CD80BAE00F32EE3 /* llfloaterparcel.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llfloaterparcel.cpp; sourceTree = "<group>"; };
2236 FE5138780CD80BAE00F32EE3 /* llfloaterparcel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterparcel.h; sourceTree = "<group>"; }; 2352 FE5138780CD80BAE00F32EE3 /* llfloaterparcel.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llfloaterparcel.h; sourceTree = "<group>"; };
2353 FE679A350CDFF5AC00959041 /* llappviewer.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llappviewer.cpp; sourceTree = "<group>"; };
2354 FE679A360CDFF5AC00959041 /* llappviewer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappviewer.h; sourceTree = "<group>"; };
2355 FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llappviewermacosx.cpp; sourceTree = "<group>"; };
2356 FE679A380CDFF5AC00959041 /* llappviewermacosx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llappviewermacosx.h; sourceTree = "<group>"; };
2357 FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llvectorperfoptions.cpp; sourceTree = "<group>"; };
2358 FE679A3A0CDFF5AC00959041 /* llvectorperfoptions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvectorperfoptions.h; sourceTree = "<group>"; };
2359 FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = llvieweraudio.cpp; sourceTree = "<group>"; };
2360 FE679A3C0CDFF5AC00959041 /* llvieweraudio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = llvieweraudio.h; sourceTree = "<group>"; };
2237/* End PBXFileReference section */ 2361/* End PBXFileReference section */
2238 2362
2239/* Begin PBXFrameworksBuildPhase section */ 2363/* Begin PBXFrameworksBuildPhase section */
@@ -2278,6 +2402,7 @@
2278 buildActionMask = 2147483647; 2402 buildActionMask = 2147483647;
2279 files = ( 2403 files = (
2280 61923C89074ACA70005E1F34 /* libllcommon.a in Frameworks */, 2404 61923C89074ACA70005E1F34 /* libllcommon.a in Frameworks */,
2405 C1E4A5FE0CC02365005FB0A6 /* libxmlrpc.a in Frameworks */,
2281 FDE8765A09BEA3BC00AF6316 /* libapr-1.a in Frameworks */, 2406 FDE8765A09BEA3BC00AF6316 /* libapr-1.a in Frameworks */,
2282 FDAA36AA09B916BD00FBF1CA /* Carbon.framework in Frameworks */, 2407 FDAA36AA09B916BD00FBF1CA /* Carbon.framework in Frameworks */,
2283 FDAA36B909B919AD00FBF1CA /* libssl.dylib in Frameworks */, 2408 FDAA36B909B919AD00FBF1CA /* libssl.dylib in Frameworks */,
@@ -2419,6 +2544,16 @@
2419 26F529A0051F61CD00A80050 /* newview */ = { 2544 26F529A0051F61CD00A80050 /* newview */ = {
2420 isa = PBXGroup; 2545 isa = PBXGroup;
2421 children = ( 2546 children = (
2547 D2768CE30CEA38940000BD66 /* llfloaterlagmeter.cpp */,
2548 D2768CE40CEA38940000BD66 /* llfloaterlagmeter.h */,
2549 FE679A350CDFF5AC00959041 /* llappviewer.cpp */,
2550 FE679A360CDFF5AC00959041 /* llappviewer.h */,
2551 FE679A370CDFF5AC00959041 /* llappviewermacosx.cpp */,
2552 FE679A380CDFF5AC00959041 /* llappviewermacosx.h */,
2553 FE679A390CDFF5AC00959041 /* llvectorperfoptions.cpp */,
2554 FE679A3A0CDFF5AC00959041 /* llvectorperfoptions.h */,
2555 FE679A3B0CDFF5AC00959041 /* llvieweraudio.cpp */,
2556 FE679A3C0CDFF5AC00959041 /* llvieweraudio.h */,
2422 FE51386F0CD80BAE00F32EE3 /* llclassifiedinfo.h */, 2557 FE51386F0CD80BAE00F32EE3 /* llclassifiedinfo.h */,
2423 FE5138700CD80BAE00F32EE3 /* lldebugmessagebox.cpp */, 2558 FE5138700CD80BAE00F32EE3 /* lldebugmessagebox.cpp */,
2424 FE5138710CD80BAE00F32EE3 /* lldebugmessagebox.h */, 2559 FE5138710CD80BAE00F32EE3 /* lldebugmessagebox.h */,
@@ -2439,7 +2574,6 @@
2439 1AD394120CAB001B004BA76A /* llcommandhandler.cpp */, 2574 1AD394120CAB001B004BA76A /* llcommandhandler.cpp */,
2440 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */, 2575 1AD3940E0CAB000F004BA76A /* llurlsimstring.cpp */,
2441 1AD3940F0CAB000F004BA76A /* llurldispatcher.cpp */, 2576 1AD3940F0CAB000F004BA76A /* llurldispatcher.cpp */,
2442 1A57CD2B0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp */,
2443 79256EA10C57D6A4000AAFA4 /* llfloatervoicewizard.cpp */, 2577 79256EA10C57D6A4000AAFA4 /* llfloatervoicewizard.cpp */,
2444 79256EA20C57D6A4000AAFA4 /* llfloatervoicewizard.h */, 2578 79256EA20C57D6A4000AAFA4 /* llfloatervoicewizard.h */,
2445 AA11834E0C1DF9C400FDE5BA /* llpanelaudiovolume.cpp */, 2579 AA11834E0C1DF9C400FDE5BA /* llpanelaudiovolume.cpp */,
@@ -2839,7 +2973,6 @@
2839 26F529BE051F61DF00A80050 /* moviemaker.cpp */, 2973 26F529BE051F61DF00A80050 /* moviemaker.cpp */,
2840 26F529BD051F61DF00A80050 /* noise.cpp */, 2974 26F529BD051F61DF00A80050 /* noise.cpp */,
2841 26F529BA051F61DF00A80050 /* pipeline.cpp */, 2975 26F529BA051F61DF00A80050 /* pipeline.cpp */,
2842 26E79A760520BEC400A80050 /* viewer.cpp */,
2843 D8CA570D0BAF74FC0093D6D4 /* llvoicevisualizer.h */, 2976 D8CA570D0BAF74FC0093D6D4 /* llvoicevisualizer.h */,
2844 D8CA570E0BAF74FC0093D6D4 /* llvoicevisualizer.cpp */, 2977 D8CA570E0BAF74FC0093D6D4 /* llvoicevisualizer.cpp */,
2845 ); 2978 );
@@ -3479,6 +3612,10 @@
3479 61923C96074AD8B7005E1F34 /* mac_crash_logger */ = { 3612 61923C96074AD8B7005E1F34 /* mac_crash_logger */ = {
3480 isa = PBXGroup; 3613 isa = PBXGroup;
3481 children = ( 3614 children = (
3615 C1B2AF890CD679EB004CD4EF /* llcrashloggermac.h */,
3616 C1E4A5770CC0210F005FB0A6 /* llcrashlogger.cpp */,
3617 C1E4A5780CC0210F005FB0A6 /* llcrashlogger.h */,
3618 C1E4A5750CC020FC005FB0A6 /* llcrashloggermac.cpp */,
3482 61923C97074AD8B7005E1F34 /* mac_crash_logger.cpp */, 3619 61923C97074AD8B7005E1F34 /* mac_crash_logger.cpp */,
3483 ); 3620 );
3484 name = mac_crash_logger; 3621 name = mac_crash_logger;
@@ -3636,15 +3773,12 @@
3636 1AD394140CAB0023004BA76A /* llcommandhandler.h */, 3773 1AD394140CAB0023004BA76A /* llcommandhandler.h */,
3637 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */, 3774 1AD3940C0CAB0003004BA76A /* llurlsimstring.h */,
3638 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */, 3775 1AD3940D0CAB0003004BA76A /* llurldispatcher.h */,
3639 1A57CD2D0C9EFEA400B6EB24 /* llfloaterlagmeter.h */,
3640 997B4CF006015822001B0407 /* audiosettings.h */, 3776 997B4CF006015822001B0407 /* audiosettings.h */,
3641 997B4D2406015823001B0407 /* head.h */, 3777 997B4D2406015823001B0407 /* head.h */,
3642 997B4D2306015823001B0407 /* llagent.h */, 3778 997B4D2306015823001B0407 /* llagent.h */,
3643 1A758C990A43700400589675 /* llagentdata.h */, 3779 1A758C990A43700400589675 /* llagentdata.h */,
3644 997B4D2206015823001B0407 /* llagentpilot.h */, 3780 997B4D2206015823001B0407 /* llagentpilot.h */,
3645 997B4D1E06015823001B0407 /* llappearance.h */, 3781 997B4D1E06015823001B0407 /* llappearance.h */,
3646 997B4D2506015823001B0407 /* llasynchostbyname.h */,
3647 997B4D1C06015823001B0407 /* llaudiostatus.h */,
3648 997B4D1806015823001B0407 /* llbbox.h */, 3782 997B4D1806015823001B0407 /* llbbox.h */,
3649 997B4D1606015823001B0407 /* llbox.h */, 3783 997B4D1606015823001B0407 /* llbox.h */,
3650 997B4D1306015823001B0407 /* llcallbacklist.h */, 3784 997B4D1306015823001B0407 /* llcallbacklist.h */,
@@ -3919,7 +4053,6 @@
3919 997B4BD506015820001B0407 /* pipeline.h */, 4053 997B4BD506015820001B0407 /* pipeline.h */,
3920 997B4BD406015820001B0407 /* randgauss.h */, 4054 997B4BD406015820001B0407 /* randgauss.h */,
3921 997B4BD106015820001B0407 /* VertexCache.h */, 4055 997B4BD106015820001B0407 /* VertexCache.h */,
3922 997B4BD006015820001B0407 /* viewer.h */,
3923 ); 4056 );
3924 name = "newview headers"; 4057 name = "newview headers";
3925 sourceTree = "<group>"; 4058 sourceTree = "<group>";
@@ -4129,6 +4262,7 @@
4129 20286C28FDCF999611CA2CEA /* Project object */ = { 4262 20286C28FDCF999611CA2CEA /* Project object */ = {
4130 isa = PBXProject; 4263 isa = PBXProject;
4131 buildConfigurationList = 999484580883114300EFC621 /* Build configuration list for PBXProject "macview" */; 4264 buildConfigurationList = 999484580883114300EFC621 /* Build configuration list for PBXProject "macview" */;
4265 compatibilityVersion = "Xcode 2.4";
4132 hasScannedForEncodings = 1; 4266 hasScannedForEncodings = 1;
4133 knownRegions = ( 4267 knownRegions = (
4134 English, 4268 English,
@@ -4139,6 +4273,7 @@
4139 ); 4273 );
4140 mainGroup = 20286C29FDCF999611CA2CEA /* «PROJECTNAME» */; 4274 mainGroup = 20286C29FDCF999611CA2CEA /* «PROJECTNAME» */;
4141 projectDirPath = ""; 4275 projectDirPath = "";
4276 projectRoot = "";
4142 targets = ( 4277 targets = (
4143 FD53B40509BDF9F600BFE3BC /* third party libs */, 4278 FD53B40509BDF9F600BFE3BC /* third party libs */,
4144 99CDED4905E70BAB0000F8AA /* llcommon */, 4279 99CDED4905E70BAB0000F8AA /* llcommon */,
@@ -4437,7 +4572,6 @@
4437 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */, 4572 5503BC4E05446B20003D051F /* llmenucommands.cpp in Sources */,
4438 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */, 4573 5503BC4F05446B20003D051F /* llhudeffectpointat.cpp in Sources */,
4439 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */, 4574 5503BC5005446B20003D051F /* llhudeffectlookat.cpp in Sources */,
4440 5503BCDA05446B20003D051F /* viewer.cpp in Sources */,
4441 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */, 4575 5503BCDC05446B20003D051F /* llnameeditor.cpp in Sources */,
4442 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */, 4576 5503BCDD05446B20003D051F /* llnamebox.cpp in Sources */,
4443 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */, 4577 5503BCEB05446B20003D051F /* llfeaturemanager.cpp in Sources */,
@@ -4684,7 +4818,6 @@
4684 79256EA30C57D6A5000AAFA4 /* llfloatervoicewizard.cpp in Sources */, 4818 79256EA30C57D6A5000AAFA4 /* llfloatervoicewizard.cpp in Sources */,
4685 D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */, 4819 D23289B50C453A3600304FEF /* llfloaterreleasemsg.cpp in Sources */,
4686 8849626C0C7B3E8A00A777FB /* llares.cpp in Sources */, 4820 8849626C0C7B3E8A00A777FB /* llares.cpp in Sources */,
4687 1A57CD2C0C9EFE9900B6EB24 /* llfloaterlagmeter.cpp in Sources */,
4688 1AD394100CAB000F004BA76A /* llurlsimstring.cpp in Sources */, 4821 1AD394100CAB000F004BA76A /* llurlsimstring.cpp in Sources */,
4689 1AD394110CAB000F004BA76A /* llurldispatcher.cpp in Sources */, 4822 1AD394110CAB000F004BA76A /* llurldispatcher.cpp in Sources */,
4690 1AD394130CAB001B004BA76A /* llcommandhandler.cpp in Sources */, 4823 1AD394130CAB001B004BA76A /* llcommandhandler.cpp in Sources */,
@@ -4696,6 +4829,11 @@
4696 FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */, 4829 FE51387B0CD80BAE00F32EE3 /* llfloaterclassified.cpp in Sources */,
4697 FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */, 4830 FE51387C0CD80BAE00F32EE3 /* llfloaterevent.cpp in Sources */,
4698 FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */, 4831 FE51387D0CD80BAE00F32EE3 /* llfloaterparcel.cpp in Sources */,
4832 FE679A3D0CDFF5AC00959041 /* llappviewer.cpp in Sources */,
4833 FE679A3E0CDFF5AC00959041 /* llappviewermacosx.cpp in Sources */,
4834 FE679A3F0CDFF5AC00959041 /* llvectorperfoptions.cpp in Sources */,
4835 FE679A400CDFF5AC00959041 /* llvieweraudio.cpp in Sources */,
4836 D2768CE50CEA38940000BD66 /* llfloaterlagmeter.cpp in Sources */,
4699 ); 4837 );
4700 runOnlyForDeploymentPostprocessing = 0; 4838 runOnlyForDeploymentPostprocessing = 0;
4701 }; 4839 };
@@ -4703,7 +4841,119 @@
4703 isa = PBXSourcesBuildPhase; 4841 isa = PBXSourcesBuildPhase;
4704 buildActionMask = 2147483647; 4842 buildActionMask = 2147483647;
4705 files = ( 4843 files = (
4844 C1E4A5F70CC0226A005FB0A6 /* llxmltree.cpp in Sources */,
4845 C1E4A5F80CC0226A005FB0A6 /* llxmlnode.cpp in Sources */,
4846 C1E4A5F90CC0226A005FB0A6 /* llcontrol.cpp in Sources */,
4847 C1E4A5FA0CC0226A005FB0A6 /* llxmlparser.cpp in Sources */,
4848 C1E4A57B0CC02160005FB0A6 /* lldate.cpp in Sources */,
4849 C1E4A57C0CC02160005FB0A6 /* llthread.cpp in Sources */,
4850 C1E4A57D0CC02160005FB0A6 /* u64.cpp in Sources */,
4851 C1E4A57E0CC02160005FB0A6 /* llerror.cpp in Sources */,
4852 C1E4A57F0CC02160005FB0A6 /* llstreamtools.cpp in Sources */,
4853 C1E4A5800CC02160005FB0A6 /* llapp.cpp in Sources */,
4854 C1E4A5810CC02160005FB0A6 /* llfasttimer.cpp in Sources */,
4855 C1E4A5820CC02160005FB0A6 /* llfixedbuffer.cpp in Sources */,
4856 C1E4A5830CC02160005FB0A6 /* llstat.cpp in Sources */,
4857 C1E4A5840CC02160005FB0A6 /* llmemory.cpp in Sources */,
4858 C1E4A5850CC02160005FB0A6 /* llsd.cpp in Sources */,
4859 C1E4A5860CC02160005FB0A6 /* llcommon.cpp in Sources */,
4860 C1E4A5870CC02160005FB0A6 /* llares.cpp in Sources */,
4861 C1E4A5880CC02160005FB0A6 /* llbase32.cpp in Sources */,
4862 C1E4A5890CC02160005FB0A6 /* llbase64.cpp in Sources */,
4863 C1E4A58A0CC02160005FB0A6 /* llmortician.cpp in Sources */,
4864 C1E4A58B0CC02160005FB0A6 /* llprocessor.cpp in Sources */,
4865 C1E4A58C0CC02160005FB0A6 /* llformat.cpp in Sources */,
4866 C1E4A58D0CC02160005FB0A6 /* llsecondlifeurls.cpp in Sources */,
4867 C1E4A58E0CC02160005FB0A6 /* llstringtable.cpp in Sources */,
4868 C1E4A58F0CC02160005FB0A6 /* llsdutil.cpp in Sources */,
4869 C1E4A5900CC02160005FB0A6 /* llstring.cpp in Sources */,
4870 C1E4A5910CC02160005FB0A6 /* lluri.cpp in Sources */,
4871 C1E4A5930CC02160005FB0A6 /* llapr.cpp in Sources */,
4872 C1E4A5940CC02160005FB0A6 /* llworkerthread.cpp in Sources */,
4873 C1E4A5960CC02160005FB0A6 /* llerrorthread.cpp in Sources */,
4874 C1E4A5970CC02160005FB0A6 /* llsdserialize.cpp in Sources */,
4875 C1E4A5980CC02160005FB0A6 /* llrun.cpp in Sources */,
4876 C1E4A59A0CC02160005FB0A6 /* llframetimer.cpp in Sources */,
4877 C1E4A59B0CC02160005FB0A6 /* llmemorystream.cpp in Sources */,
4878 C1E4A59C0CC02160005FB0A6 /* metaproperty.cpp in Sources */,
4879 C1E4A59D0CC02160005FB0A6 /* llfile.cpp in Sources */,
4880 C1E4A59E0CC02160005FB0A6 /* llcriticaldamp.cpp in Sources */,
4881 C1E4A59F0CC02160005FB0A6 /* llsdserialize_xml.cpp in Sources */,
4882 C1E4A5A00CC02160005FB0A6 /* metaclass.cpp in Sources */,
4883 C1E4A5A10CC02160005FB0A6 /* reflective.cpp in Sources */,
4884 C1E4A5A20CC02160005FB0A6 /* llsys.cpp in Sources */,
4885 C1E4A5A30CC02160005FB0A6 /* llassettype.cpp in Sources */,
4886 C1E4A5A40CC02160005FB0A6 /* lltimer.cpp in Sources */,
4887 C1E4A5A50CC02160005FB0A6 /* timing.cpp in Sources */,
4888 C1E4A5A60CC02160005FB0A6 /* llliveappconfig.cpp in Sources */,
4889 C1E4A5A70CC0216F005FB0A6 /* llnullcipher.cpp in Sources */,
4890 C1E4A5A80CC0216F005FB0A6 /* llurlrequest.cpp in Sources */,
4891 C1E4A5AA0CC0216F005FB0A6 /* lltransfersourceasset.cpp in Sources */,
4892 C1E4A5AB0CC0216F005FB0A6 /* llhost.cpp in Sources */,
4893 C1E4A5AC0CC0216F005FB0A6 /* llmessageconfig.cpp in Sources */,
4894 C1E4A5AD0CC0216F005FB0A6 /* partsyspacket.cpp in Sources */,
4895 C1E4A5AE0CC0216F005FB0A6 /* lltemplatemessagebuilder.cpp in Sources */,
4896 C1E4A5AF0CC0216F005FB0A6 /* message.cpp in Sources */,
4897 C1E4A5B00CC0216F005FB0A6 /* llbufferstream.cpp in Sources */,
4898 C1E4A5B10CC0216F005FB0A6 /* llhttpnode.cpp in Sources */,
4899 C1E4A5B20CC0216F005FB0A6 /* lltransfersourcefile.cpp in Sources */,
4900 C1E4A5B30CC0216F005FB0A6 /* llchainio.cpp in Sources */,
4901 C1E4A5B40CC0216F005FB0A6 /* llhttpclient.cpp in Sources */,
4902 C1E4A5B50CC0216F005FB0A6 /* llxfer.cpp in Sources */,
4903 C1E4A5B60CC0216F005FB0A6 /* network.cpp in Sources */,
4904 C1E4A5B70CC0216F005FB0A6 /* llpacketring.cpp in Sources */,
4905 C1E4A5B80CC0216F005FB0A6 /* llxfer_vfile.cpp in Sources */,
4906 C1E4A5B90CC0216F005FB0A6 /* llsdmessagereader.cpp in Sources */,
4907 C1E4A5BA0CC0216F005FB0A6 /* llxfermanager.cpp in Sources */,
4908 C1E4A5BB0CC0216F005FB0A6 /* llmessagethrottle.cpp in Sources */,
4909 C1E4A5BC0CC0216F005FB0A6 /* llsdmessagebuilder.cpp in Sources */,
4910 C1E4A5BD0CC0216F005FB0A6 /* message_string_table.cpp in Sources */,
4911 C1E4A5BE0CC0216F005FB0A6 /* message_prehash.cpp in Sources */,
4912 C1E4A5BF0CC0216F005FB0A6 /* llmessagetemplate.cpp in Sources */,
4913 C1E4A5C00CC0216F005FB0A6 /* llxfer_file.cpp in Sources */,
4914 C1E4A5C10CC0216F005FB0A6 /* llmime.cpp in Sources */,
4915 C1E4A5C20CC0216F005FB0A6 /* llmessagereader.cpp in Sources */,
4916 C1E4A5C30CC0216F005FB0A6 /* patch_idct.cpp in Sources */,
4917 C1E4A5C40CC0216F005FB0A6 /* lliosocket.cpp in Sources */,
4918 C1E4A5C50CC0216F005FB0A6 /* llcachename.cpp in Sources */,
4919 C1E4A5C60CC0216F005FB0A6 /* llblowfishcipher.cpp in Sources */,
4920 C1E4A5C70CC0216F005FB0A6 /* llpacketbuffer.cpp in Sources */,
4921 C1E4A5C80CC0216F005FB0A6 /* llmessagetemplateparser.cpp in Sources */,
4922 C1E4A5C90CC0216F005FB0A6 /* llbuffer.cpp in Sources */,
4923 C1E4A5CA0CC0216F005FB0A6 /* llcurl.cpp in Sources */,
4924 C1E4A5CB0CC0216F005FB0A6 /* llxorcipher.cpp in Sources */,
4925 C1E4A5CC0CC0216F005FB0A6 /* llnamevalue.cpp in Sources */,
4926 C1E4A5CD0CC0216F005FB0A6 /* lliobuffer.cpp in Sources */,
4927 C1E4A5CE0CC0216F005FB0A6 /* llpartdata.cpp in Sources */,
4928 C1E4A5CF0CC0216F005FB0A6 /* llfiltersd2xmlrpc.cpp in Sources */,
4929 C1E4A5D00CC0216F005FB0A6 /* net.cpp in Sources */,
4930 C1E4A5D10CC0216F005FB0A6 /* llxfer_mem.cpp in Sources */,
4931 C1E4A5D20CC0216F005FB0A6 /* llthrottle.cpp in Sources */,
4932 C1E4A5D30CC0216F005FB0A6 /* lllogtextmessage.cpp in Sources */,
4933 C1E4A5920CC02160005FB0A6 /* llevent.cpp in Sources */,
4934 C1E4A5D40CC0216F005FB0A6 /* llinstantmessage.cpp in Sources */,
4935 C1E4A5D50CC0216F005FB0A6 /* llmessagebuilder.cpp in Sources */,
4936 C1E4A5D60CC0216F005FB0A6 /* lldatapacker.cpp in Sources */,
4937 C1E4A5D70CC0216F005FB0A6 /* patch_code.cpp in Sources */,
4938 C1E4A5D80CC0216F005FB0A6 /* llservice.cpp in Sources */,
4939 C1E4A5D90CC0216F005FB0A6 /* llclassifiedflags.cpp in Sources */,
4940 C1E4A5DA0CC0216F005FB0A6 /* patch_dct.cpp in Sources */,
4941 C1E4A5DB0CC0216F005FB0A6 /* lltransfertargetvfile.cpp in Sources */,
4942 C1E4A5DC0CC0216F005FB0A6 /* lltemplatemessagereader.cpp in Sources */,
4943 C1E4A5DD0CC0216F005FB0A6 /* llassetstorage.cpp in Sources */,
4944 C1E4A5DE0CC0216F005FB0A6 /* lldispatcher.cpp in Sources */,
4945 C1E4A5DF0CC0216F005FB0A6 /* llpacketack.cpp in Sources */,
4946 C1E4A5E00CC0216F005FB0A6 /* llcircuit.cpp in Sources */,
4947 C1E4A5E10CC0216F005FB0A6 /* llhttpsender.cpp in Sources */,
4948 C1E4A5E20CC0216F005FB0A6 /* llpumpio.cpp in Sources */,
4949 C1E4A5E30CC0216F005FB0A6 /* lltransfertargetfile.cpp in Sources */,
4950 C1E4A5E40CC0216F005FB0A6 /* lluseroperation.cpp in Sources */,
4951 C1E4A5E50CC0216F005FB0A6 /* lliopipe.cpp in Sources */,
4952 C1E4A5E60CC0216F005FB0A6 /* llioutil.cpp in Sources */,
4953 C1E4A5E70CC0216F005FB0A6 /* lltransfermanager.cpp in Sources */,
4706 61923C9E074AD920005E1F34 /* mac_crash_logger.cpp in Sources */, 4954 61923C9E074AD920005E1F34 /* mac_crash_logger.cpp in Sources */,
4955 C1E4A5760CC020FC005FB0A6 /* llcrashloggermac.cpp in Sources */,
4956 C1E4A5790CC0210F005FB0A6 /* llcrashlogger.cpp in Sources */,
4707 ); 4957 );
4708 runOnlyForDeploymentPostprocessing = 0; 4958 runOnlyForDeploymentPostprocessing = 0;
4709 }; 4959 };
@@ -4994,12 +5244,10 @@
4994 isa = XCBuildConfiguration; 5244 isa = XCBuildConfiguration;
4995 buildSettings = { 5245 buildSettings = {
4996 GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 5246 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
4997 GCC_PRECOMPILE_PREFIX_HEADER = YES;
4998 GCC_PREFIX_HEADER = macutil_Prefix.h;
4999 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5247 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5000 INFOPLIST_FILE = "AutoUpdater-Info.plist"; 5248 INFOPLIST_FILE = "AutoUpdater-Info.plist";
5001 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5249 LIBRARY_SEARCH_PATHS = "$(inherited)";
5002 OTHER_LDFLAGS = ""; 5250 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5003 PRODUCT_NAME = AutoUpdater; 5251 PRODUCT_NAME = AutoUpdater;
5004 }; 5252 };
5005 name = Universal; 5253 name = Universal;
@@ -5011,8 +5259,15 @@
5011 GCC_PRECOMPILE_PREFIX_HEADER = YES; 5259 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5012 GCC_PREFIX_HEADER = macutil_Prefix.h; 5260 GCC_PREFIX_HEADER = macutil_Prefix.h;
5013 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5261 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5262 HEADER_SEARCH_PATHS = (
5263 "../../libraries/$(arch)-darwin/include",
5264 ../../libraries/include,
5265 ../llcommon,
5266 ../llcrashlogger,
5267 );
5014 INFOPLIST_FILE = "crashreporter-Info.plist"; 5268 INFOPLIST_FILE = "crashreporter-Info.plist";
5015 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5269 LIBRARY_SEARCH_PATHS = "$(inherited)";
5270 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5016 PRODUCT_NAME = crashreporter; 5271 PRODUCT_NAME = crashreporter;
5017 }; 5272 };
5018 name = Universal; 5273 name = Universal;
@@ -5022,8 +5277,10 @@
5022 buildSettings = { 5277 buildSettings = {
5023 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; 5278 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)";
5024 DEPLOYMENT_POSTPROCESSING = YES; 5279 DEPLOYMENT_POSTPROCESSING = YES;
5280 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
5025 GCC_PRECOMPILE_PREFIX_HEADER = YES; 5281 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5026 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; 5282 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h;
5283 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5027 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; 5284 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)";
5028 INFOPLIST_FILE = "Info-SecondLife.plist"; 5285 INFOPLIST_FILE = "Info-SecondLife.plist";
5029 INSTALL_PATH = Applications; 5286 INSTALL_PATH = Applications;
@@ -5032,11 +5289,13 @@
5032 "$(SRCROOT)/../../libraries/universal-darwin/lib_release", 5289 "$(SRCROOT)/../../libraries/universal-darwin/lib_release",
5033 "$(LIBRARY_SEARCH_PATHS_QUOTED_1)", 5290 "$(LIBRARY_SEARCH_PATHS_QUOTED_1)",
5034 ); 5291 );
5292 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5035 PRODUCT_NAME = "Second Life"; 5293 PRODUCT_NAME = "Second Life";
5036 SEPARATE_STRIP = YES; 5294 SEPARATE_STRIP = YES;
5037 SHARED_PRECOMPS_DIR = "$(BUILD_DIR)/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders"; 5295 SHARED_PRECOMPS_DIR = "$(BUILD_DIR)/Caches/com.apple.Xcode.$(UID)/SharedPrecompiledHeaders";
5038 STRIP_STYLE = debugging; 5296 STRIP_STYLE = debugging;
5039 WRAPPER_EXTENSION = app; 5297 WRAPPER_EXTENSION = app;
5298 ZERO_LINK = NO;
5040 }; 5299 };
5041 name = Universal; 5300 name = Universal;
5042 }; 5301 };
@@ -5047,6 +5306,7 @@
5047 i386, 5306 i386,
5048 ppc, 5307 ppc,
5049 ); 5308 );
5309 DEAD_CODE_STRIPPING = YES;
5050 DEBUG_INFORMATION_FORMAT = dwarf; 5310 DEBUG_INFORMATION_FORMAT = dwarf;
5051 GCC_ALTIVEC_EXTENSIONS = YES; 5311 GCC_ALTIVEC_EXTENSIONS = YES;
5052 GCC_OPTIMIZATION_LEVEL = 3; 5312 GCC_OPTIMIZATION_LEVEL = 3;
@@ -5091,6 +5351,7 @@
5091 "-Wno-reorder", 5351 "-Wno-reorder",
5092 ); 5352 );
5093 PREBINDING = NO; 5353 PREBINDING = NO;
5354 PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
5094 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; 5355 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
5095 USER_HEADER_SEARCH_PATHS = ""; 5356 USER_HEADER_SEARCH_PATHS = "";
5096 WARNING_CFLAGS = ( 5357 WARNING_CFLAGS = (
@@ -5118,6 +5379,7 @@
5118 INSTALL_PATH = "@executable_path/../Resources/"; 5379 INSTALL_PATH = "@executable_path/../Resources/";
5119 KEEP_PRIVATE_EXTERNS = NO; 5380 KEEP_PRIVATE_EXTERNS = NO;
5120 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5381 LIBRARY_SEARCH_PATHS = "$(inherited)";
5382 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5121 PREBINDING = NO; 5383 PREBINDING = NO;
5122 PRELINK_LIBS = ""; 5384 PRELINK_LIBS = "";
5123 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; 5385 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO;
@@ -5141,6 +5403,7 @@
5141 INSTALL_PATH = "@executable_path/../Resources/"; 5403 INSTALL_PATH = "@executable_path/../Resources/";
5142 KEEP_PRIVATE_EXTERNS = NO; 5404 KEEP_PRIVATE_EXTERNS = NO;
5143 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5405 LIBRARY_SEARCH_PATHS = "$(inherited)";
5406 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5144 PREBINDING = NO; 5407 PREBINDING = NO;
5145 PRELINK_LIBS = ""; 5408 PRELINK_LIBS = "";
5146 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; 5409 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO;
@@ -5162,7 +5425,7 @@
5162 INSTALL_PATH = "@executable_path/../Resources/"; 5425 INSTALL_PATH = "@executable_path/../Resources/";
5163 KEEP_PRIVATE_EXTERNS = NO; 5426 KEEP_PRIVATE_EXTERNS = NO;
5164 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5427 LIBRARY_SEARCH_PATHS = "$(inherited)";
5165 OTHER_LDFLAGS = ""; 5428 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5166 PREBINDING = NO; 5429 PREBINDING = NO;
5167 PRELINK_LIBS = ""; 5430 PRELINK_LIBS = "";
5168 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO; 5431 PRESERVE_DEAD_CODE_INITS_AND_TERMS = NO;
@@ -5197,7 +5460,9 @@
5197 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5460 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5198 INFOPLIST_FILE = "crashreporter-Info.plist"; 5461 INFOPLIST_FILE = "crashreporter-Info.plist";
5199 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5462 LIBRARY_SEARCH_PATHS = "$(inherited)";
5463 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5200 PRODUCT_NAME = crashreporter; 5464 PRODUCT_NAME = crashreporter;
5465 ZERO_LINK = NO;
5201 }; 5466 };
5202 name = Development; 5467 name = Development;
5203 }; 5468 };
@@ -5210,6 +5475,7 @@
5210 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5475 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5211 INFOPLIST_FILE = "crashreporter-Info.plist"; 5476 INFOPLIST_FILE = "crashreporter-Info.plist";
5212 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5477 LIBRARY_SEARCH_PATHS = "$(inherited)";
5478 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5213 PRODUCT_NAME = crashreporter; 5479 PRODUCT_NAME = crashreporter;
5214 }; 5480 };
5215 name = Deployment; 5481 name = Deployment;
@@ -5218,12 +5484,10 @@
5218 isa = XCBuildConfiguration; 5484 isa = XCBuildConfiguration;
5219 buildSettings = { 5485 buildSettings = {
5220 GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 5486 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
5221 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5222 GCC_PREFIX_HEADER = macutil_Prefix.h;
5223 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5487 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5224 INFOPLIST_FILE = "AutoUpdater-Info.plist"; 5488 INFOPLIST_FILE = "AutoUpdater-Info.plist";
5225 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5489 LIBRARY_SEARCH_PATHS = "$(inherited)";
5226 OTHER_LDFLAGS = ""; 5490 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5227 PRODUCT_NAME = AutoUpdater; 5491 PRODUCT_NAME = AutoUpdater;
5228 }; 5492 };
5229 name = Development; 5493 name = Development;
@@ -5232,12 +5496,10 @@
5232 isa = XCBuildConfiguration; 5496 isa = XCBuildConfiguration;
5233 buildSettings = { 5497 buildSettings = {
5234 GCC_INLINES_ARE_PRIVATE_EXTERN = NO; 5498 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
5235 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5236 GCC_PREFIX_HEADER = macutil_Prefix.h;
5237 GCC_SYMBOLS_PRIVATE_EXTERN = NO; 5499 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5238 INFOPLIST_FILE = "AutoUpdater-Info.plist"; 5500 INFOPLIST_FILE = "AutoUpdater-Info.plist";
5239 LIBRARY_SEARCH_PATHS = "$(inherited)"; 5501 LIBRARY_SEARCH_PATHS = "$(inherited)";
5240 OTHER_LDFLAGS = ""; 5502 OTHER_LDFLAGS = "-Wl,-search_paths_first";
5241 PRODUCT_NAME = AutoUpdater; 5503 PRODUCT_NAME = AutoUpdater;
5242 }; 5504 };
5243 name = Deployment; 5505 name = Deployment;
@@ -5246,9 +5508,11 @@
5246 isa = XCBuildConfiguration; 5508 isa = XCBuildConfiguration;
5247 buildSettings = { 5509 buildSettings = {
5248 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; 5510 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)";
5511 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
5249 GCC_OPTIMIZATION_LEVEL = 0; 5512 GCC_OPTIMIZATION_LEVEL = 0;
5250 GCC_PRECOMPILE_PREFIX_HEADER = YES; 5513 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5251 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; 5514 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h;
5515 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5252 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; 5516 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)";
5253 INFOPLIST_FILE = "Info-SecondLife.plist"; 5517 INFOPLIST_FILE = "Info-SecondLife.plist";
5254 INSTALL_PATH = "$(HOME)/Applications"; 5518 INSTALL_PATH = "$(HOME)/Applications";
@@ -5271,7 +5535,7 @@
5271 "-Winvalid-pch", 5535 "-Winvalid-pch",
5272 ); 5536 );
5273 WRAPPER_EXTENSION = app; 5537 WRAPPER_EXTENSION = app;
5274 ZERO_LINK = YES; 5538 ZERO_LINK = NO;
5275 }; 5539 };
5276 name = Development; 5540 name = Development;
5277 }; 5541 };
@@ -5279,8 +5543,10 @@
5279 isa = XCBuildConfiguration; 5543 isa = XCBuildConfiguration;
5280 buildSettings = { 5544 buildSettings = {
5281 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)"; 5545 CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)";
5546 GCC_INLINES_ARE_PRIVATE_EXTERN = NO;
5282 GCC_PRECOMPILE_PREFIX_HEADER = YES; 5547 GCC_PRECOMPILE_PREFIX_HEADER = YES;
5283 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h; 5548 GCC_PREFIX_HEADER = llviewerprecompiledheaders.h;
5549 GCC_SYMBOLS_PRIVATE_EXTERN = NO;
5284 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)"; 5550 HEADER_SEARCH_PATHS = "$(HEADER_SEARCH_PATHS)";
5285 INFOPLIST_FILE = "Info-SecondLife.plist"; 5551 INFOPLIST_FILE = "Info-SecondLife.plist";
5286 INSTALL_PATH = "$(HOME)/Applications"; 5552 INSTALL_PATH = "$(HOME)/Applications";
@@ -5305,6 +5571,7 @@
5305 999484590883114300EFC621 /* Development */ = { 5571 999484590883114300EFC621 /* Development */ = {
5306 isa = XCBuildConfiguration; 5572 isa = XCBuildConfiguration;
5307 buildSettings = { 5573 buildSettings = {
5574 DEAD_CODE_STRIPPING = YES;
5308 DEBUG_INFORMATION_FORMAT = dwarf; 5575 DEBUG_INFORMATION_FORMAT = dwarf;
5309 GCC_ALTIVEC_EXTENSIONS = YES; 5576 GCC_ALTIVEC_EXTENSIONS = YES;
5310 GCC_OPTIMIZATION_LEVEL = 0; 5577 GCC_OPTIMIZATION_LEVEL = 0;
@@ -5341,6 +5608,8 @@
5341 "-DLL_DEBUG=1", 5608 "-DLL_DEBUG=1",
5342 "-D_DEBUG", 5609 "-D_DEBUG",
5343 "-fconstant-cfstrings", 5610 "-fconstant-cfstrings",
5611 "-gfull",
5612 "-mlong-branch",
5344 ); 5613 );
5345 OTHER_CPLUSPLUSFLAGS = ( 5614 OTHER_CPLUSPLUSFLAGS = (
5346 "$(OTHER_CFLAGS)", 5615 "$(OTHER_CFLAGS)",
@@ -5348,6 +5617,7 @@
5348 "-Wno-reorder", 5617 "-Wno-reorder",
5349 ); 5618 );
5350 PREBINDING = NO; 5619 PREBINDING = NO;
5620 PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
5351 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; 5621 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
5352 USER_HEADER_SEARCH_PATHS = ""; 5622 USER_HEADER_SEARCH_PATHS = "";
5353 WARNING_CFLAGS = ( 5623 WARNING_CFLAGS = (
@@ -5355,13 +5625,14 @@
5355 "-Wno-sign-compare", 5625 "-Wno-sign-compare",
5356 "-Wno-switch", 5626 "-Wno-switch",
5357 ); 5627 );
5358 ZERO_LINK = YES; 5628 ZERO_LINK = NO;
5359 }; 5629 };
5360 name = Development; 5630 name = Development;
5361 }; 5631 };
5362 9994845A0883114300EFC621 /* Deployment */ = { 5632 9994845A0883114300EFC621 /* Deployment */ = {
5363 isa = XCBuildConfiguration; 5633 isa = XCBuildConfiguration;
5364 buildSettings = { 5634 buildSettings = {
5635 DEAD_CODE_STRIPPING = YES;
5365 DEBUG_INFORMATION_FORMAT = dwarf; 5636 DEBUG_INFORMATION_FORMAT = dwarf;
5366 GCC_ALTIVEC_EXTENSIONS = YES; 5637 GCC_ALTIVEC_EXTENSIONS = YES;
5367 GCC_OPTIMIZATION_LEVEL = 3; 5638 GCC_OPTIMIZATION_LEVEL = 3;
@@ -5406,6 +5677,7 @@
5406 "-Wno-reorder", 5677 "-Wno-reorder",
5407 ); 5678 );
5408 PREBINDING = NO; 5679 PREBINDING = NO;
5680 PRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;
5409 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; 5681 SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
5410 USER_HEADER_SEARCH_PATHS = ""; 5682 USER_HEADER_SEARCH_PATHS = "";
5411 WARNING_CFLAGS = ( 5683 WARNING_CFLAGS = (
diff --git a/linden/indra/newview/macview_Prefix.h b/linden/indra/newview/macview_Prefix.h
index c7dd351..4d982f1 100644
--- a/linden/indra/newview/macview_Prefix.h
+++ b/linden/indra/newview/macview_Prefix.h
@@ -107,7 +107,6 @@
107#include "llvosky.h" 107#include "llvosky.h"
108#include "llworld.h" 108#include "llworld.h"
109#include "pipeline.h" 109#include "pipeline.h"
110#include "viewer.h"
111 110
112/////////////////// From llfloater.cpp 111/////////////////// From llfloater.cpp
113#include "llbutton.h" 112#include "llbutton.h"
diff --git a/linden/indra/newview/newview.vcproj b/linden/indra/newview/newview.vcproj
index 075fdcb..941c6c0 100644
--- a/linden/indra/newview/newview.vcproj
+++ b/linden/indra/newview/newview.vcproj
@@ -104,11 +104,14 @@
104 Name="VCLinkerTool" 104 Name="VCLinkerTool"
105 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" 105 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib"
106 OutputFile="$(ConfigurationName)/newview.exe" 106 OutputFile="$(ConfigurationName)/newview.exe"
107 LinkIncremental="2" 107 LinkIncremental="1"
108 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;" 108 AdditionalLibraryDirectories="&quot;../lib_$(ConfigurationName)/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
109 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" 109 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib"
110 GenerateDebugInformation="TRUE" 110 GenerateDebugInformation="TRUE"
111 ProgramDatabaseFile="$(TargetName).pdb" 111 ProgramDatabaseFile="$(TargetName).pdb"
112 GenerateMapFile="TRUE"
113 MapFileName="$(TargetName).map"
114 MapLines="TRUE"
112 SubSystem="2" 115 SubSystem="2"
113 OptimizeReferences="1" 116 OptimizeReferences="1"
114 EnableCOMDATFolding="1" 117 EnableCOMDATFolding="1"
@@ -166,11 +169,15 @@
166 Name="VCLinkerTool" 169 Name="VCLinkerTool"
167 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib" 170 AdditionalDependencies="advapi32.lib apr-1.lib aprutil-1.lib areslib.lib comdlg32.lib dinput8.lib dsound.lib dxerr8.lib dxguid.lib fmodvc.lib freetype.lib gdi32.lib glu32.lib jpeglib_6b.lib kernel32.lib libboost_regex-vc71-mt-s.lib libcurl.lib libeay32.lib libexpatMT.lib OpenJPEG.lib llaudio.lib llmedia.lib llcharacter.lib llcommon.lib llimage.lib llimagej2coj.lib llinventory.lib llmath.lib llmessage.lib llmozlib.lib llprimitive.lib llrender.lib llui.lib llvfs.lib llwindow.lib llxml.lib lscript_library.lib mswsock.lib netapi32.lib odbc32.lib odbccp32.lib ogg_static_mt.lib ole32.lib oleaut32.lib opengl32.lib png12.lib psapi.lib qtmlclient.lib shell32.lib ssleay32.lib user32.lib Vfw32.lib vorbis_static_mt.lib vorbisenc_static_mt.lib vorbisfile_static_mt.lib winmm.lib winspool.lib ws2_32.lib xmlrpcepi.lib zlib.lib dnsapi.lib EZ_LCD_Wrapper.lib lgLcd.lib"
168 OutputFile="$(ConfigurationName)/SecondLife.exe" 171 OutputFile="$(ConfigurationName)/SecondLife.exe"
169 LinkIncremental="0" 172 LinkIncremental="1"
170 AdditionalLibraryDirectories="&quot;../lib_release/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;" 173 AdditionalLibraryDirectories="&quot;../lib_release/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
171 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" 174 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib"
172 GenerateDebugInformation="TRUE" 175 GenerateDebugInformation="TRUE"
173 ProgramDatabaseFile="$(TargetName).pdb" 176 ProgramDatabaseFile="$(TargetName).pdb"
177 GenerateMapFile="TRUE"
178 MapFileName="$(TargetName).map"
179 MapExports="FALSE"
180 MapLines="TRUE"
174 SubSystem="2" 181 SubSystem="2"
175 OptimizeReferences="2" 182 OptimizeReferences="2"
176 EnableCOMDATFolding="2" 183 EnableCOMDATFolding="2"
@@ -289,6 +296,12 @@
289 RelativePath=".\llanimalcontrols.cpp"> 296 RelativePath=".\llanimalcontrols.cpp">
290 </File> 297 </File>
291 <File 298 <File
299 RelativePath=".\llappviewer.cpp">
300 </File>
301 <File
302 RelativePath=".\llappviewerwin32.cpp">
303 </File>
304 <File
292 RelativePath=".\llassetuploadresponders.cpp"> 305 RelativePath=".\llassetuploadresponders.cpp">
293 </File> 306 </File>
294 <File 307 <File
@@ -1114,6 +1127,9 @@
1114 RelativePath=".\lluserauth.cpp"> 1127 RelativePath=".\lluserauth.cpp">
1115 </File> 1128 </File>
1116 <File 1129 <File
1130 RelativePath=".\llvectorperfoptions.cpp">
1131 </File>
1132 <File
1117 RelativePath=".\llvelocitybar.cpp"> 1133 RelativePath=".\llvelocitybar.cpp">
1118 </File> 1134 </File>
1119 <File 1135 <File
@@ -1126,6 +1142,9 @@
1126 RelativePath=".\llviewerassetstorage.h"> 1142 RelativePath=".\llviewerassetstorage.h">
1127 </File> 1143 </File>
1128 <File 1144 <File
1145 RelativePath=".\llvieweraudio.cpp">
1146 </File>
1147 <File
1129 RelativePath=".\llviewercamera.cpp"> 1148 RelativePath=".\llviewercamera.cpp">
1130 </File> 1149 </File>
1131 <File 1150 <File
@@ -1385,9 +1404,6 @@
1385 <File 1404 <File
1386 RelativePath=".\pipeline.cpp"> 1405 RelativePath=".\pipeline.cpp">
1387 </File> 1406 </File>
1388 <File
1389 RelativePath=".\viewer.cpp">
1390 </File>
1391 </Filter> 1407 </Filter>
1392 <Filter 1408 <Filter
1393 Name="Header Files" 1409 Name="Header Files"
@@ -1418,6 +1434,12 @@
1418 RelativePath=".\llappearance.h"> 1434 RelativePath=".\llappearance.h">
1419 </File> 1435 </File>
1420 <File 1436 <File
1437 RelativePath=".\llappviewer.h">
1438 </File>
1439 <File
1440 RelativePath=".\llappviewerwin32.h">
1441 </File>
1442 <File
1421 RelativePath=".\llassetuploadresponders.h"> 1443 RelativePath=".\llassetuploadresponders.h">
1422 </File> 1444 </File>
1423 <File 1445 <File
@@ -2264,12 +2286,18 @@
2264 RelativePath=".\lluvscreen.h"> 2286 RelativePath=".\lluvscreen.h">
2265 </File> 2287 </File>
2266 <File 2288 <File
2289 RelativePath=".\llvectorperfoptions.h">
2290 </File>
2291 <File
2267 RelativePath=".\llvelocitybar.h"> 2292 RelativePath=".\llvelocitybar.h">
2268 </File> 2293 </File>
2269 <File 2294 <File
2270 RelativePath=".\llviewchildren.h"> 2295 RelativePath=".\llviewchildren.h">
2271 </File> 2296 </File>
2272 <File 2297 <File
2298 RelativePath=".\llvieweraudio.h">
2299 </File>
2300 <File
2273 RelativePath=".\llviewerbuild.h"> 2301 RelativePath=".\llviewerbuild.h">
2274 </File> 2302 </File>
2275 <File 2303 <File
@@ -2477,9 +2505,6 @@
2477 RelativePath=".\VertexCache.h"> 2505 RelativePath=".\VertexCache.h">
2478 </File> 2506 </File>
2479 <File 2507 <File
2480 RelativePath=".\viewer.h">
2481 </File>
2482 <File
2483 RelativePath=".\VorbisFramework.h"> 2508 RelativePath=".\VorbisFramework.h">
2484 </File> 2509 </File>
2485 </Filter> 2510 </Filter>
diff --git a/linden/indra/newview/newview_vc8.vcproj b/linden/indra/newview/newview_vc8.vcproj
index 6b669d9..362462f 100644
--- a/linden/indra/newview/newview_vc8.vcproj
+++ b/linden/indra/newview/newview_vc8.vcproj
@@ -76,6 +76,8 @@
76 IgnoreDefaultLibraryNames="msvcrtd;libcd;libcmt" 76 IgnoreDefaultLibraryNames="msvcrtd;libcd;libcmt"
77 GenerateDebugInformation="true" 77 GenerateDebugInformation="true"
78 ProgramDatabaseFile="$(TargetName).pdb" 78 ProgramDatabaseFile="$(TargetName).pdb"
79 GenerateMapFile="true"
80 MapFileName="newview.map"
79 SubSystem="2" 81 SubSystem="2"
80 OptimizeReferences="1" 82 OptimizeReferences="1"
81 EnableCOMDATFolding="1" 83 EnableCOMDATFolding="1"
@@ -169,6 +171,8 @@
169 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" 171 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib"
170 GenerateDebugInformation="true" 172 GenerateDebugInformation="true"
171 ProgramDatabaseFile="$(TargetName).pdb" 173 ProgramDatabaseFile="$(TargetName).pdb"
174 GenerateMapFile="true"
175 MapFileName="newview.map"
172 SubSystem="2" 176 SubSystem="2"
173 OptimizeReferences="1" 177 OptimizeReferences="1"
174 EnableCOMDATFolding="1" 178 EnableCOMDATFolding="1"
@@ -330,6 +334,7 @@
330 ForceConformanceInForLoopScope="true" 334 ForceConformanceInForLoopScope="true"
331 UsePrecompiledHeader="2" 335 UsePrecompiledHeader="2"
332 PrecompiledHeaderThrough="llviewerprecompiledheaders.h" 336 PrecompiledHeaderThrough="llviewerprecompiledheaders.h"
337 AssemblerOutput="0"
333 WarningLevel="3" 338 WarningLevel="3"
334 WarnAsError="true" 339 WarnAsError="true"
335 Detect64BitPortabilityProblems="false" 340 Detect64BitPortabilityProblems="false"
@@ -353,7 +358,7 @@
353 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib" 358 IgnoreDefaultLibraryNames="msvcrt.lib;libc.lib"
354 GenerateDebugInformation="true" 359 GenerateDebugInformation="true"
355 ProgramDatabaseFile="$(TargetName).pdb" 360 ProgramDatabaseFile="$(TargetName).pdb"
356 GenerateMapFile="false" 361 GenerateMapFile="true"
357 MapFileName="newview.map" 362 MapFileName="newview.map"
358 SubSystem="2" 363 SubSystem="2"
359 OptimizeReferences="1" 364 OptimizeReferences="1"
@@ -417,6 +422,14 @@
417 > 422 >
418 </File> 423 </File>
419 <File 424 <File
425 RelativePath=".\llappviewer.cpp"
426 >
427 </File>
428 <File
429 RelativePath=".\llappviewerwin32.cpp"
430 >
431 </File>
432 <File
420 RelativePath=".\llassetuploadresponders.cpp" 433 RelativePath=".\llassetuploadresponders.cpp"
421 > 434 >
422 </File> 435 </File>
@@ -1505,6 +1518,10 @@
1505 > 1518 >
1506 </File> 1519 </File>
1507 <File 1520 <File
1521 RelativePath=".\llvectorperfoptions.cpp"
1522 >
1523 </File>
1524 <File
1508 RelativePath=".\llvelocitybar.cpp" 1525 RelativePath=".\llvelocitybar.cpp"
1509 > 1526 >
1510 </File> 1527 </File>
@@ -1521,6 +1538,10 @@
1521 > 1538 >
1522 </File> 1539 </File>
1523 <File 1540 <File
1541 RelativePath=".\llvieweraudio.cpp"
1542 >
1543 </File>
1544 <File
1524 RelativePath=".\llviewercamera.cpp" 1545 RelativePath=".\llviewercamera.cpp"
1525 > 1546 >
1526 </File> 1547 </File>
@@ -1872,10 +1893,6 @@
1872 RelativePath=".\pipeline.cpp" 1893 RelativePath=".\pipeline.cpp"
1873 > 1894 >
1874 </File> 1895 </File>
1875 <File
1876 RelativePath=".\viewer.cpp"
1877 >
1878 </File>
1879 </Filter> 1896 </Filter>
1880 <Filter 1897 <Filter
1881 Name="Header Files" 1898 Name="Header Files"
@@ -1911,6 +1928,14 @@
1911 > 1928 >
1912 </File> 1929 </File>
1913 <File 1930 <File
1931 RelativePath=".\llappviewer.h"
1932 >
1933 </File>
1934 <File
1935 RelativePath=".\llappviewerwin32.h"
1936 >
1937 </File>
1938 <File
1914 RelativePath=".\llassetuploadresponders.h" 1939 RelativePath=".\llassetuploadresponders.h"
1915 > 1940 >
1916 </File> 1941 </File>
@@ -3027,6 +3052,10 @@
3027 > 3052 >
3028 </File> 3053 </File>
3029 <File 3054 <File
3055 RelativePath=".\llvectorperfoptions.h"
3056 >
3057 </File>
3058 <File
3030 RelativePath=".\llvelocitybar.h" 3059 RelativePath=".\llvelocitybar.h"
3031 > 3060 >
3032 </File> 3061 </File>
@@ -3035,6 +3064,10 @@
3035 > 3064 >
3036 </File> 3065 </File>
3037 <File 3066 <File
3067 RelativePath=".\llvieweraudio.h"
3068 >
3069 </File>
3070 <File
3038 RelativePath=".\llviewerbuild.h" 3071 RelativePath=".\llviewerbuild.h"
3039 > 3072 >
3040 </File> 3073 </File>
diff --git a/linden/indra/newview/pipeline.cpp b/linden/indra/newview/pipeline.cpp
index 758455d..e9faccb 100644
--- a/linden/indra/newview/pipeline.cpp
+++ b/linden/indra/newview/pipeline.cpp
@@ -91,11 +91,11 @@
91#include "llvotree.h" 91#include "llvotree.h"
92#include "llvopartgroup.h" 92#include "llvopartgroup.h"
93#include "llworld.h" 93#include "llworld.h"
94#include "viewer.h"
95#include "llcubemap.h" 94#include "llcubemap.h"
96#include "lldebugmessagebox.h" 95#include "lldebugmessagebox.h"
97#include "llglslshader.h" 96#include "llglslshader.h"
98#include "llviewerjoystick.h" 97#include "llviewerjoystick.h"
98#include "llviewerdisplay.h"
99 99
100#ifdef _DEBUG 100#ifdef _DEBUG
101// Debug indices is disabled for now for debug performance - djs 4/24/02 101// Debug indices is disabled for now for debug performance - djs 4/24/02
@@ -135,6 +135,8 @@ S32 gTrivialAccepts = 0;
135 135
136BOOL gRenderForSelect = FALSE; 136BOOL gRenderForSelect = FALSE;
137 137
138LLPipeline gPipeline;
139
138//---------------------------------------- 140//----------------------------------------
139 141
140void stamp(F32 x, F32 y, F32 xs, F32 ys) 142void stamp(F32 x, F32 y, F32 xs, F32 ys)
@@ -383,22 +385,14 @@ void LLPipeline::releaseGLBuffers()
383 385
384 if (mCubeFrameBuffer) 386 if (mCubeFrameBuffer)
385 { 387 {
386#if !defined(__sparc)
387 glDeleteFramebuffersEXT(1, &mCubeFrameBuffer); 388 glDeleteFramebuffersEXT(1, &mCubeFrameBuffer);
388 glDeleteRenderbuffersEXT(1, &mCubeDepth); 389 glDeleteRenderbuffersEXT(1, &mCubeDepth);
389#else
390#error Can we generalize this without a CPU architecture test?
391#endif
392 mCubeDepth = mCubeFrameBuffer = 0; 390 mCubeDepth = mCubeFrameBuffer = 0;
393 } 391 }
394 392
395 if (mFramebuffer[0]) 393 if (mFramebuffer[0])
396 { 394 {
397#if !defined(__sparc)
398 glDeleteFramebuffersEXT(2, mFramebuffer); 395 glDeleteFramebuffersEXT(2, mFramebuffer);
399#else
400#error Can we generalize this without a CPU architecture test?
401#endif
402 mFramebuffer[0] = mFramebuffer[1] = 0; 396 mFramebuffer[0] = mFramebuffer[1] = 0;
403 } 397 }
404} 398}
@@ -3776,12 +3770,8 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
3776 BOOL reattach = FALSE; 3770 BOOL reattach = FALSE;
3777 if (mCubeFrameBuffer == 0) 3771 if (mCubeFrameBuffer == 0)
3778 { 3772 {
3779#if !defined(__sparc)
3780 glGenFramebuffersEXT(1, &mCubeFrameBuffer); 3773 glGenFramebuffersEXT(1, &mCubeFrameBuffer);
3781 glGenRenderbuffersEXT(1, &mCubeDepth); 3774 glGenRenderbuffersEXT(1, &mCubeDepth);
3782#else
3783#error Can we generalize this without a CPU architecture test?
3784#endif
3785 reattach = TRUE; 3775 reattach = TRUE;
3786 } 3776 }
3787 3777
@@ -3852,7 +3842,6 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
3852 3842
3853 if (reattach) 3843 if (reattach)
3854 { 3844 {
3855#if !defined(__sparc)
3856 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mCubeDepth); 3845 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mCubeDepth);
3857 GLint res_x, res_y; 3846 GLint res_x, res_y;
3858 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &res_x); 3847 glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT, GL_RENDERBUFFER_WIDTH_EXT, &res_x);
@@ -3864,22 +3853,15 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
3864 } 3853 }
3865 3854
3866 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); 3855 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
3867#else
3868#error Can we generalize this without a CPU architecture test?
3869#endif
3870 } 3856 }
3871 3857
3872 for (S32 i = 0; i < 6; i++) 3858 for (S32 i = 0; i < 6; i++)
3873 { 3859 {
3874#if !defined(__sparc)
3875 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer); 3860 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mCubeFrameBuffer);
3876 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 3861 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
3877 cube_face[i], cube_map->getGLName(), 0); 3862 cube_face[i], cube_map->getGLName(), 0);
3878 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, 3863 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
3879 GL_RENDERBUFFER_EXT, mCubeDepth); 3864 GL_RENDERBUFFER_EXT, mCubeDepth);
3880#else
3881#error Can we generalize this without a CPU architecture test?
3882#endif
3883 glMatrixMode(GL_PROJECTION); 3865 glMatrixMode(GL_PROJECTION);
3884 glLoadIdentity(); 3866 glLoadIdentity();
3885 gluPerspective(90.f, 1.f, 0.1f, 1024.f); 3867 gluPerspective(90.f, 1.f, 0.1f, 1024.f);
@@ -3899,11 +3881,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
3899 gPipeline.renderGeom(cube_cam); 3881 gPipeline.renderGeom(cube_cam);
3900 } 3882 }
3901 3883
3902#if !defined(__sparc)
3903 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 3884 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
3904#else
3905#error Can we generalize this without a CPU architecture test?
3906#endif
3907 3885
3908 cube_cam.setOrigin(origin); 3886 cube_cam.setOrigin(origin);
3909 gPipeline.resetDrawOrders(); 3887 gPipeline.resetDrawOrders();
@@ -4112,14 +4090,10 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
4112 LLGLDisable blend(GL_BLEND); 4090 LLGLDisable blend(GL_BLEND);
4113 LLGLDisable cull(GL_CULL_FACE); 4091 LLGLDisable cull(GL_CULL_FACE);
4114 4092
4115#if !defined(__sparc)
4116 if (mFramebuffer[0] == 0) 4093 if (mFramebuffer[0] == 0)
4117 { 4094 {
4118 glGenFramebuffersEXT(2, mFramebuffer); 4095 glGenFramebuffersEXT(2, mFramebuffer);
4119 } 4096 }
4120#else
4121#error Can we generalize this without a CPU architecture test?
4122#endif
4123 4097
4124 GLint viewport[4]; 4098 GLint viewport[4];
4125 glGetIntegerv(GL_VIEWPORT, viewport); 4099 glGetIntegerv(GL_VIEWPORT, viewport);
@@ -4142,15 +4116,11 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
4142 4116
4143 for (S32 i = 0; i < kernel; i++) 4117 for (S32 i = 0; i < kernel; i++)
4144 { 4118 {
4145#if !defined(__sparc)
4146 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebuffer[i%2]); 4119 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFramebuffer[i%2]);
4147 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, 4120 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
4148 GL_COLOR_ATTACHMENT0_EXT, 4121 GL_COLOR_ATTACHMENT0_EXT,
4149 GL_TEXTURE_2D, 4122 GL_TEXTURE_2D,
4150 i%2 == 0 ? buffer : dest, 0); 4123 i%2 == 0 ? buffer : dest, 0);
4151#else
4152#error Can we generalize this without a CPU architecture test?
4153#endif
4154 4124
4155 glBindTexture(GL_TEXTURE_2D, i == 0 ? source : 4125 glBindTexture(GL_TEXTURE_2D, i == 0 ? source :
4156 i%2==0 ? dest : 4126 i%2==0 ? dest :
@@ -4177,11 +4147,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
4177 4147
4178 } 4148 }
4179 4149
4180#if !defined(__sparc)
4181 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 4150 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
4182#else
4183#error Can we generalize this without a CPU architecture test?
4184#endif
4185 gGlowProgram.unbind(); 4151 gGlowProgram.unbind();
4186 4152
4187 glViewport(viewport[0], viewport[1], viewport[2], viewport[3]); 4153 glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
diff --git a/linden/indra/newview/releasenotes.txt b/linden/indra/newview/releasenotes.txt
index 72288b8..6c581c5 100644
--- a/linden/indra/newview/releasenotes.txt
+++ b/linden/indra/newview/releasenotes.txt
@@ -1,3 +1,32 @@
1Release Notes for Second Life 1.18.6(0) December 5, 2007
2=====================================
3Changes:
4* Age Verification:
5** The user interface for parcel and estate access has been clarified and improved.
6** Added the ability to restrict access to parcels and estates to age verified adults. See an upcoming blog post for more details
7** Removed the ability to *ban* access to Residents who have provided payment info or who have used payment info. We continue to support the ability to *allow* access to only those who have provided payment info.
8* Login/Authentication
9** We changed the way viewers login to Second Life to support future anti-fraud efforts
10** The changes are largely internal
11** Apart from some minor cosmetic differences, the behavior of the login screen is unchanged
12** For more information, read our public Wiki article found here: http://wiki.secondlife.com/wiki/Viewer_Authentication
13* Crash Reporter
14** The crash reporting mechanism has been improved. Following a crash, more useful information will be sent and reports should now take less than 10 seconds.
15
16Fixes:
17* VWR-1627: Classified metrics are reset to 0 when the ad is updated
18* VWR-1162: Land for sale includes L$1 parcels that are not actually for sale
19* VWR-1125: Clicking Title Bar While Mouselook'd Repositions SL
20* VWR-2483: the macviewer.xcodeprj file doesn't create stripped binaries on Deployment or Universal
21* VWR-2404: lossless texture compression on small textures not lossless
22* VWR-2046: Focus is sent to menu/money/notification window
23* Land owners can no longer delete objects belonging to others (but can still return objects)
24* Positioning fixes for Japanese IME for fields where only ASCII is allowed
25* Ctrl-Shift-W now works even if no windows have focus
26* Fixed issue where avatar is stuck falling in place after login
27* HTML login screen now functional again on Linux
28* Floater sizing behavior corrected when viewer window is made very small
29
1Release Notes for Second Life 1.18.5(3) November 29, 2007 30Release Notes for Second Life 1.18.5(3) November 29, 2007
2===================================== 31=====================================
3New features: 32New features:
diff --git a/linden/indra/newview/res/newViewRes.rc b/linden/indra/newview/res/newViewRes.rc
index a3dfa72..05081a9 100644
--- a/linden/indra/newview/res/newViewRes.rc
+++ b/linden/indra/newview/res/newViewRes.rc
@@ -228,8 +228,8 @@ TOOLPIPETTE CURSOR "toolpipette.cur"
228// 228//
229 229
230VS_VERSION_INFO VERSIONINFO 230VS_VERSION_INFO VERSIONINFO
231 FILEVERSION 1,18,5,3 231 FILEVERSION 1,18,6,0
232 PRODUCTVERSION 1,18,5,3 232 PRODUCTVERSION 1,18,6,0
233 FILEFLAGSMASK 0x3fL 233 FILEFLAGSMASK 0x3fL
234#ifdef _DEBUG 234#ifdef _DEBUG
235 FILEFLAGS 0x1L 235 FILEFLAGS 0x1L
@@ -246,12 +246,12 @@ BEGIN
246 BEGIN 246 BEGIN
247 VALUE "CompanyName", "Linden Lab" 247 VALUE "CompanyName", "Linden Lab"
248 VALUE "FileDescription", "Second Life" 248 VALUE "FileDescription", "Second Life"
249 VALUE "FileVersion", "1.18.5.3" 249 VALUE "FileVersion", "1.18.6.0"
250 VALUE "InternalName", "Second Life" 250 VALUE "InternalName", "Second Life"
251 VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc." 251 VALUE "LegalCopyright", "Copyright © 2001-2007, Linden Research, Inc."
252 VALUE "OriginalFilename", "SecondLife.exe" 252 VALUE "OriginalFilename", "SecondLife.exe"
253 VALUE "ProductName", "Second Life" 253 VALUE "ProductName", "Second Life"
254 VALUE "ProductVersion", "1.18.5.3" 254 VALUE "ProductVersion", "1.18.6.0"
255 END 255 END
256 END 256 END
257 BLOCK "VarFileInfo" 257 BLOCK "VarFileInfo"
diff --git a/linden/indra/newview/skins/xui/de/LCD_text.xml b/linden/indra/newview/skins/xui/de/LCD_text.xml
new file mode 100644
index 0000000..a20d9f4
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/LCD_text.xml
@@ -0,0 +1,75 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login">
3 <text name="DebugInfo">
4 Debug-Info
5 </text>
6 <text name="FPS">
7 FPS
8 </text>
9 <text name="SimFPS">
10 SimFPS
11 </text>
12 <text name="Pin">
13 P-Ein
14 </text>
15 <text name="Pout">
16 P-Aus
17 </text>
18 <text name="PLoss">
19 P-Verlust
20 </text>
21 <text name="Ping">
22 Ping
23 </text>
24 <text name="AccountDetails">
25 Kontodaten
26 </text>
27 <text name="LBal">
28 L$-Stand
29 </text>
30 <text name="Time">
31 Zeit
32 </text>
33 <text name="LocationDetails1">
34 Standortdetails 1
35 </text>
36 <text name="LocationDetails2">
37 Standortdetails 2
38 </text>
39 <text name="Region">
40 Region
41 </text>
42 <text name="Parcel">
43 Parzelle
44 </text>
45 <text name="Pos">
46 Pos
47 </text>
48 <text name="Sqm">
49 qm
50 </text>
51 <text name="Owner">
52 Eigentümer
53 </text>
54 <text name="Type">
55 Typ
56 </text>
57 <text name="Yes">
58 Ja
59 </text>
60 <text name="No">
61 Nein
62 </text>
63 <text name="Forsale">
64 Zum Verkauf
65 </text>
66 <text name="Traffic">
67 Traffic
68 </text>
69 <text name="Last3ChatLines">
70 Letzte 3 Chat-Zeilen
71 </text>
72 <text name="Last3IMLines">
73 Letzte 3 IM-Zeilen
74 </text>
75</panel>
diff --git a/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml
new file mode 100644
index 0000000..f983bde
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/floater_landmark_ctrl.xml
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="landmarkpicker" title="Organisieren: Landmarken">
3 <check_box label="Ordner anzeigen" name="show_folders_check" />
4 <button label="Neu" label_selected="Neu" name="New" />
5 <button label="Umbenennen" label_selected="Umbenennen" name="Rename" />
6 <button label="Neuer Ordner" label_selected="Neuer Ordner" name="NewFolder" />
7 <button label="Bearbeiten" label_selected="Bearbeiten" name="Edit" />
8 <button label="Löschen" label_selected="Löschen" name="Delete" />
9 <button label="Schließen" label_selected="Schließen" name="Close" />
10</floater>
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_classified.xml b/linden/indra/newview/skins/xui/de/floater_preview_classified.xml
new file mode 100644
index 0000000..c820fbf
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/floater_preview_classified.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="classified_preview" />
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_event.xml b/linden/indra/newview/skins/xui/de/floater_preview_event.xml
new file mode 100644
index 0000000..732e1fe
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/floater_preview_event.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="event_preview" />
diff --git a/linden/indra/newview/skins/xui/de/floater_preview_url.xml b/linden/indra/newview/skins/xui/de/floater_preview_url.xml
new file mode 100644
index 0000000..fd6486c
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/floater_preview_url.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="url_preview" />
diff --git a/linden/indra/newview/skins/xui/de/menu_slurl.xml b/linden/indra/newview/skins/xui/de/menu_slurl.xml
new file mode 100644
index 0000000..13b91b5
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/menu_slurl.xml
@@ -0,0 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<menu name="Popup">
3 <menu_item_call label="URL-Info" name="about_url" />
4 <menu_item_call label="Zu URL teleportieren" name="teleport_to_url" />
5 <menu_item_call label="Auf Karte" name="show_on_map" />
6</menu>
diff --git a/linden/indra/newview/skins/xui/de/need_to_long.xml b/linden/indra/newview/skins/xui/de/need_to_long.xml
new file mode 100644
index 0000000..f794784
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/need_to_long.xml
@@ -0,0 +1,85 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T01:00:51Z</Created>
11 <LastSaved>2007-11-21T01:00:51Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-4710</WindowTopX>
18 <WindowTopY>-105</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_long2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="409.5">
65 <Cell><Data ss:Type="String">floater_about.xml</Data></Cell>
66 <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
69 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life wird Ihnen präsentiert von Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa und vielen anderen.&#10;&#10;Im Gedenken an Jesse Malthus. Du wirst allen in Erinnerung bleiben, die deine Stimme hören durften.&#10;&#10;Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.&#10;&#10;Alle Rechte vorbehalten. Details siehe licenses.txt.&#10;&#10;Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf. G.722.1 Anhang C)&#10;&#10;&#10;Mr. Watson - kommen Sie bitte her - ich möchte Sie sehen.</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life wird Ihnen präsentiert von Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa und vielen anderen.&#10;&#10;Im Gedenken an Jesse Malthus. Du wirst allen in Erinnerung bleiben, die deine Stimme hören durften.&#10;&#10;Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly und Mark Adler.&#10;&#10;Alle Rechte vorbehalten. Details siehe licenses.txt.&#10;&#10;Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf. G.722.1 Anhang C)&#10;&#10;&#10;Mr. Watson – kommen Sie bitte her – ich möchte Sie sehen.</Data></Cell>
71 </Row>
72 </Table>
73 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
74 <Selected/>
75 <Panes>
76 <Pane>
77 <Number>3</Number>
78 <ActiveRow>2</ActiveRow>
79 </Pane>
80 </Panes>
81 <ProtectObjects>False</ProtectObjects>
82 <ProtectScenarios>False</ProtectScenarios>
83 </WorksheetOptions>
84 </Worksheet>
85</Workbook>
diff --git a/linden/indra/newview/skins/xui/de/need_to_translate.xml b/linden/indra/newview/skins/xui/de/need_to_translate.xml
new file mode 100644
index 0000000..c47be1d
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/need_to_translate.xml
@@ -0,0 +1,1056 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:46:40Z</Created>
11 <LastSaved>2007-11-21T00:46:40Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>120</WindowTopX>
18 <WindowTopY>90</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 </Styles>
39 <Worksheet ss:Name="need_to_translate2">
40 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="154" x:FullColumns="1"
41 x:FullRows="1">
42 <Column ss:Width="63.75"/>
43 <Column ss:Width="70.5"/>
44 <Column ss:Width="88.5"/>
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="69.75"/>
47 <Column ss:Width="90.75"/>
48 <Column ss:Width="97.5"/>
49 <Row>
50 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
51 </Row>
52 <Row>
53 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
54 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
55 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
60 </Row>
61 <Row>
62 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
63 <Cell><Data ss:Type="String">//skipnexttime</Data></Cell>
64 <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell>
65 <Cell ss:Index="7"><Data ss:Type="String">Nicht mehr anzeigen</Data></Cell>
66 </Row>
67 <Row>
68 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
69 <Cell><Data ss:Type="String">//alwayschoose</Data></Cell>
70 <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell>
71 <Cell ss:Index="7"><Data ss:Type="String">Diese Option immer auswählen</Data></Cell>
72 </Row>
73 <Row>
74 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
75 <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell>
76 <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell>
77 <Cell ss:Index="7"><Data ss:Type="String">Möchten Sie sich wirklich teleportieren?</Data></Cell>
78 </Row>
79 <Row>
80 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
81 <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell>
82 <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell>
83 <Cell ss:Index="7"><Data ss:Type="String">Beim Teleportieren von einer Landmarke im Inventar</Data></Cell>
84 </Row>
85 <Row>
86 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
87 <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell>
88 <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell>
89 <Cell ss:Index="7"><Data ss:Type="String">Teleportieren</Data></Cell>
90 </Row>
91 <Row>
92 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
93 <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell>
94 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
95 <Cell ss:Index="7"><Data ss:Type="String">Abbrechen</Data></Cell>
96 </Row>
97 <Row>
98 <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell>
99 <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell>
100 <Cell><Data ss:Type="String">label</Data></Cell>
101 </Row>
102 <Row>
103 <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell>
104 <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell>
105 <Cell><Data ss:Type="String">title</Data></Cell>
106 <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell>
107 <Cell ss:Index="7"><Data ss:Type="String">Unterhalten</Data></Cell>
108 </Row>
109 <Row>
110 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
111 <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell>
112 <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell>
113 <Cell ss:Index="7"><Data ss:Type="String">Verbindung mit In-Welt-Voice-Chat...</Data></Cell>
114 </Row>
115 <Row>
116 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
117 <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell>
118 <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell>
119 <Cell ss:Index="7"><Data ss:Type="String">Verbunden</Data></Cell>
120 </Row>
121 <Row>
122 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
123 <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell>
124 <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell>
125 <Cell ss:Index="7"><Data ss:Type="String">Verbindung mit In-Welt-Voice-Chat getrennt</Data></Cell>
126 </Row>
127 <Row>
128 <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell>
129 <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell>
130 <Cell><Data ss:Type="String">title</Data></Cell>
131 <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell>
132 <Cell ss:Index="7"><Data ss:Type="String">Geräte-Einstellungen für Voice-Chat</Data></Cell>
133 </Row>
134 <Row>
135 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
136 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell>
137 <Cell><Data ss:Type="String">label</Data></Cell>
138 <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell>
139 <Cell ss:Index="7"><Data ss:Type="String">Alle</Data></Cell>
140 </Row>
141 <Row>
142 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
143 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell>
144 <Cell><Data ss:Type="String">label</Data></Cell>
145 <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell>
146 <Cell ss:Index="7"><Data ss:Type="String">Zurück</Data></Cell>
147 </Row>
148 <Row>
149 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
150 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell>
151 <Cell><Data ss:Type="String">label</Data></Cell>
152 <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell>
153 <Cell ss:Index="7"><Data ss:Type="String">Weiter</Data></Cell>
154 </Row>
155 <Row>
156 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
157 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
158 <Cell><Data ss:Type="String">label</Data></Cell>
159 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
160 <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
165 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
166 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
167 <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell>
168 </Row>
169 <Row>
170 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
171 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell>
172 <Cell><Data ss:Type="String">label</Data></Cell>
173 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
174 <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell>
175 </Row>
176 <Row>
177 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
178 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell>
179 <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell>
180 <Cell ss:Index="7"><Data ss:Type="String">Alle Kategorien</Data></Cell>
181 </Row>
182 <Row>
183 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
184 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell>
185 <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell>
186 <Cell ss:Index="7"><Data ss:Type="String">Anzeigen</Data></Cell>
187 </Row>
188 <Row>
189 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
190 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell>
191 <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell>
192 <Cell ss:Index="7"><Data ss:Type="String">Events</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell>
197 <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell>
198 <Cell ss:Index="7"><Data ss:Type="String">Gruppen</Data></Cell>
199 </Row>
200 <Row>
201 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
202 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell>
203 <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell>
204 <Cell ss:Index="7"><Data ss:Type="String">Leute</Data></Cell>
205 </Row>
206 <Row>
207 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
208 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell>
209 <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell>
210 <Cell ss:Index="7"><Data ss:Type="String">Orte</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell>
215 <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell>
216 <Cell ss:Index="7"><Data ss:Type="String">Wiki</Data></Cell>
217 </Row>
218 <Row>
219 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
220 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell>
221 <Cell><Data ss:Type="String">label</Data></Cell>
222 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
223 <Cell ss:Index="7"><Data ss:Type="String">Ab-18-Inhalte einschließen</Data></Cell>
224 </Row>
225 <Row>
226 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
227 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell>
228 <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell>
229 <Cell ss:Index="7"><Data ss:Type="String">Wird geladen...</Data></Cell>
230 </Row>
231 <Row>
232 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
233 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell>
234 <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell>
235 <Cell ss:Index="7"><Data ss:Type="String">Fertig</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell>
242 <Cell ss:Index="7"><Data ss:Type="String">Alle (alt)</Data></Cell>
243 </Row>
244 <Row>
245 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
246 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
247 <Cell><Data ss:Type="String">label</Data></Cell>
248 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
249 <Cell ss:Index="7"><Data ss:Type="String">&lt; Vorherige/s</Data></Cell>
250 </Row>
251 <Row>
252 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
253 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
254 <Cell><Data ss:Type="String">label_selected</Data></Cell>
255 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
256 <Cell ss:Index="7"><Data ss:Type="String">&lt; Vorherige/s</Data></Cell>
257 </Row>
258 <Row>
259 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
260 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
261 <Cell><Data ss:Type="String">label</Data></Cell>
262 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
263 <Cell ss:Index="7"><Data ss:Type="String">Weiter &gt;</Data></Cell>
264 </Row>
265 <Row>
266 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
267 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
268 <Cell><Data ss:Type="String">label_selected</Data></Cell>
269 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
270 <Cell ss:Index="7"><Data ss:Type="String">Weiter &gt;</Data></Cell>
271 </Row>
272 <Row>
273 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
274 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell>
275 <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell>
276 <Cell ss:Index="7"><Data ss:Type="String">Suchen:</Data></Cell>
277 </Row>
278 <Row>
279 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
280 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
281 <Cell><Data ss:Type="String">label</Data></Cell>
282 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
283 <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell>
284 </Row>
285 <Row>
286 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
287 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
288 <Cell><Data ss:Type="String">label_selected</Data></Cell>
289 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
290 <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell>
291 </Row>
292 <Row>
293 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
294 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell>
295 <Cell><Data ss:Type="String">label</Data></Cell>
296 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
297 <Cell ss:Index="7"><Data ss:Type="String">Ab-18-Inhalte einschließen</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell>
302 <Cell><Data ss:Type="String">label</Data></Cell>
303 </Row>
304 <Row>
305 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
306 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell>
307 <Cell><Data ss:Type="String">label</Data></Cell>
308 <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell>
309 <Cell ss:Index="7"><Data ss:Type="String">Name</Data></Cell>
310 </Row>
311 <Row>
312 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
313 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell>
314 <Cell><Data ss:Type="String">label</Data></Cell>
315 <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell>
316 <Cell ss:Index="7"><Data ss:Type="String">Preis</Data></Cell>
317 </Row>
318 <Row>
319 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
320 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell>
321 <Cell><Data ss:Type="String">label</Data></Cell>
322 <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell>
323 <Cell ss:Index="7"><Data ss:Type="String">Zeit (PT)</Data></Cell>
324 </Row>
325 <Row>
326 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
327 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell>
328 <Cell><Data ss:Type="String">label</Data></Cell>
329 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
330 <Cell ss:Index="7"><Data ss:Type="String">Zeit</Data></Cell>
331 </Row>
332 <Row>
333 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
334 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell>
335 <Cell><Data ss:Type="String">label</Data></Cell>
336 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
337 <Cell ss:Index="7"><Data ss:Type="String">Traffic</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell>
342 <Cell><Data ss:Type="String">label</Data></Cell>
343 <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell>
344 <Cell ss:Index="7"><Data ss:Type="String">Gebiet</Data></Cell>
345 </Row>
346 <Row>
347 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
348 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell>
349 <Cell><Data ss:Type="String">label</Data></Cell>
350 <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell>
351 <Cell ss:Index="7"><Data ss:Type="String">L$/qm</Data></Cell>
352 </Row>
353 <Row>
354 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
355 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell>
356 <Cell><Data ss:Type="String">label</Data></Cell>
357 <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell>
358 <Cell ss:Index="7"><Data ss:Type="String">Online</Data></Cell>
359 </Row>
360 <Row>
361 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
362 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell>
363 <Cell><Data ss:Type="String">label</Data></Cell>
364 <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell>
365 <Cell ss:Index="7"><Data ss:Type="String">Mitglieder</Data></Cell>
366 </Row>
367 <Row>
368 <Cell><Data ss:Type="String">floater_im.xml</Data></Cell>
369 <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell>
370 <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell>
371 <Cell ss:Index="7"><Data ss:Type="String">Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen.</Data></Cell>
372 </Row>
373 <Row>
374 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
375 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
376 <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell>
377 <Cell ss:Index="7"><Data ss:Type="String">Anruf...</Data></Cell>
378 </Row>
379 <Row>
380 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
381 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
382 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
383 <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell>
384 </Row>
385 <Row>
386 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
387 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
388 <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell>
389 <Cell ss:Index="7"><Data ss:Type="String">Anruf beendet</Data></Cell>
390 </Row>
391 <Row>
392 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
393 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
394 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
395 <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat wird beigetreten...</Data></Cell>
396 </Row>
397 <Row>
398 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
399 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
400 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
401 <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell>
402 </Row>
403 <Row>
404 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
405 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
406 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
407 <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat verlassen</Data></Cell>
408 </Row>
409 <Row>
410 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
411 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
412 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
413 <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat wird beigetreten...</Data></Cell>
414 </Row>
415 <Row>
416 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
417 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
418 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
419 <Cell ss:Index="7"><Data ss:Type="String">Verbunden. Klicken Sie auf Anruf beenden, um die Verbindung zu trennen</Data></Cell>
420 </Row>
421 <Row>
422 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
423 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
424 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
425 <Cell ss:Index="7"><Data ss:Type="String">Voice-Chat verlassen</Data></Cell>
426 </Row>
427 <Row>
428 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
429 <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell>
430 <Cell><Data ss:Type="String">title</Data></Cell>
431 <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell>
432 <Cell ss:Index="7"><Data ss:Type="String">Organisieren: Landmarken</Data></Cell>
433 </Row>
434 <Row>
435 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
436 <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell>
437 <Cell><Data ss:Type="String">label</Data></Cell>
438 <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell>
439 <Cell ss:Index="7"><Data ss:Type="String">Ordner anzeigen</Data></Cell>
440 </Row>
441 <Row>
442 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
443 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
444 <Cell><Data ss:Type="String">label</Data></Cell>
445 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
446 <Cell ss:Index="7"><Data ss:Type="String">Neu</Data></Cell>
447 </Row>
448 <Row>
449 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
450 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
451 <Cell><Data ss:Type="String">label_selected</Data></Cell>
452 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
453 <Cell ss:Index="7"><Data ss:Type="String">Neu</Data></Cell>
454 </Row>
455 <Row>
456 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
457 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
458 <Cell><Data ss:Type="String">label</Data></Cell>
459 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
460 <Cell ss:Index="7"><Data ss:Type="String">Umbenennen</Data></Cell>
461 </Row>
462 <Row>
463 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
464 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
465 <Cell><Data ss:Type="String">label_selected</Data></Cell>
466 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
467 <Cell ss:Index="7"><Data ss:Type="String">Umbenennen</Data></Cell>
468 </Row>
469 <Row>
470 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
471 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
472 <Cell><Data ss:Type="String">label</Data></Cell>
473 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
474 <Cell ss:Index="7"><Data ss:Type="String">Neuer Ordner</Data></Cell>
475 </Row>
476 <Row>
477 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
478 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
479 <Cell><Data ss:Type="String">label_selected</Data></Cell>
480 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
481 <Cell ss:Index="7"><Data ss:Type="String">Neuer Ordner</Data></Cell>
482 </Row>
483 <Row>
484 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
485 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
486 <Cell><Data ss:Type="String">label</Data></Cell>
487 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
488 <Cell ss:Index="7"><Data ss:Type="String">Bearbeiten</Data></Cell>
489 </Row>
490 <Row>
491 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
492 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
493 <Cell><Data ss:Type="String">label_selected</Data></Cell>
494 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
495 <Cell ss:Index="7"><Data ss:Type="String">Bearbeiten</Data></Cell>
496 </Row>
497 <Row>
498 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
499 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
500 <Cell><Data ss:Type="String">label</Data></Cell>
501 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
502 <Cell ss:Index="7"><Data ss:Type="String">Löschen</Data></Cell>
503 </Row>
504 <Row>
505 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
506 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
507 <Cell><Data ss:Type="String">label_selected</Data></Cell>
508 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
509 <Cell ss:Index="7"><Data ss:Type="String">Löschen</Data></Cell>
510 </Row>
511 <Row>
512 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
513 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
514 <Cell><Data ss:Type="String">label</Data></Cell>
515 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
516 <Cell ss:Index="7"><Data ss:Type="String">Schließen</Data></Cell>
517 </Row>
518 <Row>
519 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
520 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
521 <Cell><Data ss:Type="String">label_selected</Data></Cell>
522 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
523 <Cell ss:Index="7"><Data ss:Type="String">Schließen</Data></Cell>
524 </Row>
525 <Row>
526 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
527 <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell>
528 <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
529 <Cell ss:Index="7"><Data ss:Type="String">[AREA] qm</Data></Cell>
530 </Row>
531 <Row>
532 <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell>
533 <Cell><Data ss:Type="String">/classified_preview</Data></Cell>
534 <Cell><Data ss:Type="String">title</Data></Cell>
535 <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell>
536 <Cell ss:Index="7"><Data ss:Type="String">Vertrauliche Informationen</Data></Cell>
537 </Row>
538 <Row>
539 <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell>
540 <Cell><Data ss:Type="String">/event_preview</Data></Cell>
541 <Cell><Data ss:Type="String">title</Data></Cell>
542 <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell>
543 <Cell ss:Index="7"><Data ss:Type="String">Event-Informationen</Data></Cell>
544 </Row>
545 <Row>
546 <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell>
547 <Cell><Data ss:Type="String">/url_preview</Data></Cell>
548 <Cell><Data ss:Type="String">title</Data></Cell>
549 <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell>
550 <Cell ss:Index="7"><Data ss:Type="String">Ortsinformationen</Data></Cell>
551 </Row>
552 <Row>
553 <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell>
554 <Cell><Data ss:Type="String">/modal container</Data></Cell>
555 <Cell><Data ss:Type="String">title</Data></Cell>
556 </Row>
557 <Row>
558 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
559 <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell>
560 <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell>
561 <Cell ss:Index="7"><Data ss:Type="String">Debug-Info</Data></Cell>
562 </Row>
563 <Row>
564 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
565 <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell>
566 <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell>
567 <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell>
568 </Row>
569 <Row>
570 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
571 <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell>
572 <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell>
573 <Cell ss:Index="7"><Data ss:Type="String">SimFPS</Data></Cell>
574 </Row>
575 <Row>
576 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
577 <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell>
578 <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell>
579 <Cell ss:Index="7"><Data ss:Type="String">P-Ein</Data></Cell>
580 </Row>
581 <Row>
582 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
583 <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell>
584 <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell>
585 <Cell ss:Index="7"><Data ss:Type="String">P-Aus</Data></Cell>
586 </Row>
587 <Row>
588 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
589 <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell>
590 <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell>
591 <Cell ss:Index="7"><Data ss:Type="String">P-Verlust</Data></Cell>
592 </Row>
593 <Row>
594 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
595 <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell>
596 <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell>
597 <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell>
598 </Row>
599 <Row>
600 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
601 <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell>
602 <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell>
603 <Cell ss:Index="7"><Data ss:Type="String">Kontodaten</Data></Cell>
604 </Row>
605 <Row>
606 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
607 <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell>
608 <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell>
609 <Cell ss:Index="7"><Data ss:Type="String">L$-Stand</Data></Cell>
610 </Row>
611 <Row>
612 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
613 <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell>
614 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
615 <Cell ss:Index="7"><Data ss:Type="String">Zeit</Data></Cell>
616 </Row>
617 <Row>
618 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
619 <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell>
620 <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell>
621 <Cell ss:Index="7"><Data ss:Type="String">Standortdetails 1</Data></Cell>
622 </Row>
623 <Row>
624 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
625 <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell>
626 <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell>
627 <Cell ss:Index="7"><Data ss:Type="String">Standortdetails 2</Data></Cell>
628 </Row>
629 <Row>
630 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
631 <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell>
632 <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell>
633 <Cell ss:Index="7"><Data ss:Type="String">Region</Data></Cell>
634 </Row>
635 <Row>
636 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
637 <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell>
638 <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell>
639 <Cell ss:Index="7"><Data ss:Type="String">Parzelle</Data></Cell>
640 </Row>
641 <Row>
642 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
643 <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell>
644 <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell>
645 <Cell ss:Index="7"><Data ss:Type="String">Pos</Data></Cell>
646 </Row>
647 <Row>
648 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
649 <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell>
650 <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell>
651 <Cell ss:Index="7"><Data ss:Type="String">qm</Data></Cell>
652 </Row>
653 <Row>
654 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
655 <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell>
656 <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell>
657 <Cell ss:Index="7"><Data ss:Type="String">Eigentümer</Data></Cell>
658 </Row>
659 <Row>
660 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
661 <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell>
662 <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell>
663 <Cell ss:Index="7"><Data ss:Type="String">Typ</Data></Cell>
664 </Row>
665 <Row>
666 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
667 <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell>
668 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
669 <Cell ss:Index="7"><Data ss:Type="String">Ja</Data></Cell>
670 </Row>
671 <Row>
672 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
673 <Cell><Data ss:Type="String">/panel_login/No</Data></Cell>
674 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
675 <Cell ss:Index="7"><Data ss:Type="String">Nein</Data></Cell>
676 </Row>
677 <Row>
678 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
679 <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell>
680 <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell>
681 <Cell ss:Index="7"><Data ss:Type="String">Zum Verkauf</Data></Cell>
682 </Row>
683 <Row>
684 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
685 <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell>
686 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
687 <Cell ss:Index="7"><Data ss:Type="String">Traffic</Data></Cell>
688 </Row>
689 <Row>
690 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
691 <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell>
692 <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell>
693 <Cell ss:Index="7"><Data ss:Type="String">Letzte 3 Chat-Zeilen</Data></Cell>
694 </Row>
695 <Row>
696 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
697 <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell>
698 <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell>
699 <Cell ss:Index="7"><Data ss:Type="String">Letzte 3 IM-Zeilen</Data></Cell>
700 </Row>
701 <Row>
702 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
703 <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell>
704 <Cell><Data ss:Type="String">label</Data></Cell>
705 <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell>
706 <Cell ss:Index="7"><Data ss:Type="String">URL-Info</Data></Cell>
707 </Row>
708 <Row>
709 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
710 <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell>
711 <Cell><Data ss:Type="String">label</Data></Cell>
712 <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell>
713 <Cell ss:Index="7"><Data ss:Type="String">Zu URL teleportieren</Data></Cell>
714 </Row>
715 <Row>
716 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
717 <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell>
718 <Cell><Data ss:Type="String">label</Data></Cell>
719 <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell>
720 <Cell ss:Index="7"><Data ss:Type="String">Auf Karte</Data></Cell>
721 </Row>
722 <Row>
723 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
724 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell>
725 <Cell><Data ss:Type="String">label</Data></Cell>
726 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell>
727 <Cell ss:Index="7"><Data ss:Type="String">Fehlermeldungen</Data></Cell>
728 </Row>
729 <Row>
730 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
731 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell>
732 <Cell><Data ss:Type="String">label</Data></Cell>
733 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell>
734 <Cell ss:Index="7"><Data ss:Type="String">Allgemeiner Probleme-Tracker...</Data></Cell>
735 </Row>
736 <Row>
737 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
738 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell>
739 <Cell><Data ss:Type="String">label</Data></Cell>
740 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell>
741 <Cell ss:Index="7"><Data ss:Type="String">Hilfe zum Allgemeinen Probleme-Tracker...</Data></Cell>
742 </Row>
743 <Row>
744 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
745 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
746 <Cell><Data ss:Type="String">label</Data></Cell>
747 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
748 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
749 </Row>
750 <Row>
751 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
752 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell>
753 <Cell><Data ss:Type="String">label</Data></Cell>
754 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell>
755 <Cell ss:Index="7"><Data ss:Type="String">Fehlermeldungs-1x1...</Data></Cell>
756 </Row>
757 <Row>
758 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
759 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell>
760 <Cell><Data ss:Type="String">label</Data></Cell>
761 <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell>
762 <Cell ss:Index="7"><Data ss:Type="String">Sicherheitsfragen...</Data></Cell>
763 </Row>
764 <Row>
765 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
766 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell>
767 <Cell><Data ss:Type="String">label</Data></Cell>
768 <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell>
769 <Cell ss:Index="7"><Data ss:Type="String">QA-Wiki...</Data></Cell>
770 </Row>
771 <Row>
772 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
773 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
774 <Cell><Data ss:Type="String">label</Data></Cell>
775 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
776 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
777 </Row>
778 <Row>
779 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
780 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell>
781 <Cell><Data ss:Type="String">label</Data></Cell>
782 <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell>
783 <Cell ss:Index="7"><Data ss:Type="String">Fehler melden...</Data></Cell>
784 </Row>
785 <Row>
786 <Cell><Data ss:Type="String">notify.xml</Data></Cell>
787 <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell>
788 <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell>
789 <Cell ss:Index="7"><Data ss:Type="String">Verbindung zu [VOICE_CHANNEL_NAME] nicht möglich. Bitte versuchen Sie es später. Sie werden nun wieder mit dem Umgebungs-Voice-Chat verbunden.</Data></Cell>
790 </Row>
791 <Row>
792 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
793 <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell>
794 <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell>
795 <Cell ss:Index="7"><Data ss:Type="String">Aktualisieren</Data></Cell>
796 </Row>
797 <Row>
798 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
799 <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell>
800 <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell>
801 <Cell ss:Index="7"><Data ss:Type="String">Veröffentlichen...</Data></Cell>
802 </Row>
803 <Row>
804 <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell>
805 <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell>
806 <Cell><Data ss:Type="String">label</Data></Cell>
807 </Row>
808 <Row>
809 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
810 <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell>
811 <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell>
812 <Cell ss:Index="7"><Data ss:Type="String">Die allgemeine Gruppeninfo wurde geändert.</Data></Cell>
813 </Row>
814 <Row>
815 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
816 <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell>
817 <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell>
818 <Cell ss:Index="7"><Data ss:Type="String">Ihr Landbeitrag kann nicht festgelegt werden.</Data></Cell>
819 </Row>
820 <Row>
821 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
822 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
823 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
824 <Cell ss:Index="7"><Data ss:Type="String">Ohne Serverupdate sind keine Ortsinformationen verfügbar.</Data></Cell>
825 </Row>
826 <Row>
827 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
828 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
829 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
830 <Cell ss:Index="7"><Data ss:Type="String">Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.</Data></Cell>
831 </Row>
832 <Row>
833 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
834 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
835 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
836 <Cell ss:Index="7"><Data ss:Type="String">Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.</Data></Cell>
837 </Row>
838 <Row>
839 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
840 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
841 <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
842 <Cell ss:Index="7"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
843 </Row>
844 <Row>
845 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
846 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
847 <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
848 <Cell ss:Index="7"><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell>
849 </Row>
850 <Row>
851 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
852 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
853 <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
854 <Cell ss:Index="7"><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$</Data></Cell>
855 </Row>
856 <Row>
857 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
858 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
859 <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
860 <Cell ss:Index="7"><Data ss:Type="String">Auktions-ID [ID].</Data></Cell>
861 </Row>
862 <Row>
863 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
864 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
865 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
866 <Cell ss:Index="7"><Data ss:Type="String">Ohne Serverupdate sind keine Ortsinformationen verfügbar.</Data></Cell>
867 </Row>
868 <Row>
869 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
870 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
871 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
872 <Cell ss:Index="7"><Data ss:Type="String">Zur Zeit gibt es keine Informationen zu diesem Standort. Bitte versuchen Sie es später.</Data></Cell>
873 </Row>
874 <Row>
875 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
876 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
877 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
878 <Cell ss:Index="7"><Data ss:Type="String">Die Informationen über diesen Standort sind zugriffsbeschränkt. Bitte wenden Sie sich bezüglich Ihrer Berechtigungen an den Eigentümer der Parzelle.</Data></Cell>
879 </Row>
880 <Row>
881 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
882 <Cell><Data ss:Type="String">/LCD Options</Data></Cell>
883 <Cell><Data ss:Type="String">label</Data></Cell>
884 <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell>
885 <Cell ss:Index="7"><Data ss:Type="String">Logitech-LCD</Data></Cell>
886 </Row>
887 <Row>
888 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
889 <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell>
890 <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell>
891 <Cell ss:Index="7"><Data ss:Type="String">LCD-Ziel:</Data></Cell>
892 </Row>
893 <Row>
894 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
895 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
896 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
897 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell>
898 <Cell ss:Index="7"><Data ss:Type="String">Zeigt die Auswahl auf dem LCD der Logitech G15-Tastatur an</Data></Cell>
899 </Row>
900 <Row>
901 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
902 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
903 <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell>
904 <Cell ss:Index="7"><Data ss:Type="String">Logitech G15 Gaming-Tastatur</Data></Cell>
905 </Row>
906 <Row>
907 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
908 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
909 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
910 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell>
911 <Cell ss:Index="7"><Data ss:Type="String">Zeigt die Auswahl auf dem LCD der Logitech Z10-Lautsprecher an</Data></Cell>
912 </Row>
913 <Row>
914 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
915 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
916 <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell>
917 <Cell ss:Index="7"><Data ss:Type="String">Logitech Z10-Lautsprecher</Data></Cell>
918 </Row>
919 <Row>
920 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
921 <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell>
922 <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell>
923 <Cell ss:Index="7"><Data ss:Type="String">LCD-Anzeigeoptionen:</Data></Cell>
924 </Row>
925 <Row>
926 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
927 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
928 <Cell><Data ss:Type="String">label</Data></Cell>
929 <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell>
930 <Cell ss:Index="7"><Data ss:Type="String">Chat anzeigen</Data></Cell>
931 </Row>
932 <Row>
933 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
934 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
935 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
936 <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell>
937 <Cell ss:Index="7"><Data ss:Type="String">Letzte Chat-Zeile auf dem LCD anzeigen</Data></Cell>
938 </Row>
939 <Row>
940 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
941 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
942 <Cell><Data ss:Type="String">label</Data></Cell>
943 <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell>
944 <Cell ss:Index="7"><Data ss:Type="String">IMs anzeigen</Data></Cell>
945 </Row>
946 <Row>
947 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
948 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
949 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
950 <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell>
951 <Cell ss:Index="7"><Data ss:Type="String">Letzte IM auf dem LCD anzeigen</Data></Cell>
952 </Row>
953 <Row>
954 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
955 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
956 <Cell><Data ss:Type="String">label</Data></Cell>
957 <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell>
958 <Cell ss:Index="7"><Data ss:Type="String">Standortinformationen anzeigen</Data></Cell>
959 </Row>
960 <Row>
961 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
962 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
963 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
964 <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell>
965 <Cell ss:Index="7"><Data ss:Type="String">Informationen zum aktuellen Standort auf dem LCD anzeigen</Data></Cell>
966 </Row>
967 <Row>
968 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
969 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
970 <Cell><Data ss:Type="String">label</Data></Cell>
971 <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell>
972 <Cell ss:Index="7"><Data ss:Type="String">Kontodaten anzeigen</Data></Cell>
973 </Row>
974 <Row>
975 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
976 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
977 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
978 <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell>
979 <Cell ss:Index="7"><Data ss:Type="String">Aktuelle Informationen zum Konto auf dem LCD anzeigen</Data></Cell>
980 </Row>
981 <Row>
982 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
983 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
984 <Cell><Data ss:Type="String">label</Data></Cell>
985 <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell>
986 <Cell ss:Index="7"><Data ss:Type="String">Netzwerkinformationen anzeigen</Data></Cell>
987 </Row>
988 <Row>
989 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
990 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
991 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
992 <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell>
993 <Cell ss:Index="7"><Data ss:Type="String">Debug-Informationen auf dem LCD anzeigen</Data></Cell>
994 </Row>
995 <Row>
996 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
997 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
998 <Cell><Data ss:Type="String">label</Data></Cell>
999 <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell>
1000 <Cell ss:Index="7"><Data ss:Type="String">Debug-Info von Konsole anzeigen</Data></Cell>
1001 </Row>
1002 <Row>
1003 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
1004 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
1005 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1006 <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell>
1007 <Cell ss:Index="7"><Data ss:Type="String">Debug-Informationen von der Konsole auf dem LCD anzeigen</Data></Cell>
1008 </Row>
1009 <Row>
1010 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1011 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1012 <Cell><Data ss:Type="String">label</Data></Cell>
1013 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
1014 <Cell ss:Index="7"><Data ss:Type="String">Suchen</Data></Cell>
1015 </Row>
1016 <Row>
1017 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1018 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1019 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1020 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1021 <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell>
1022 </Row>
1023 <Row>
1024 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1025 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1026 <Cell><Data ss:Type="String">label</Data></Cell>
1027 </Row>
1028 <Row>
1029 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1030 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1031 <Cell><Data ss:Type="String">label_selected</Data></Cell>
1032 </Row>
1033 <Row>
1034 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1035 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1036 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1037 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1038 <Cell ss:Index="7"><Data ss:Type="String">Second Life durchsuchen</Data></Cell>
1039 </Row>
1040 </Table>
1041 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
1042 <Selected/>
1043 <TopRowVisible>123</TopRowVisible>
1044 <Panes>
1045 <Pane>
1046 <Number>3</Number>
1047 <ActiveRow>2</ActiveRow>
1048 <ActiveCol>4</ActiveCol>
1049 <RangeSelection>R3C5:R154C5</RangeSelection>
1050 </Pane>
1051 </Panes>
1052 <ProtectObjects>False</ProtectObjects>
1053 <ProtectScenarios>False</ProtectScenarios>
1054 </WorksheetOptions>
1055 </Worksheet>
1056</Workbook>
diff --git a/linden/indra/newview/skins/xui/de/need_to_update.xml b/linden/indra/newview/skins/xui/de/need_to_update.xml
new file mode 100644
index 0000000..38def15
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/need_to_update.xml
@@ -0,0 +1,420 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:47:10Z</Created>
11 <LastSaved>2007-11-21T00:47:10Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>9975</WindowHeight>
16 <WindowWidth>22635</WindowWidth>
17 <WindowTopX>360</WindowTopX>
18 <WindowTopY>345</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_update2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="153">
65 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
66 <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the &quot;Publish in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting &quot;Show in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
69 <Cell><Data ss:Type="String">In Suche veröffentlichen</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">&quot;In Suche anzeigen&quot; zeigt Folgendes an:&#10; - Ihr Profil in den Suchergebnissen&#10; - einen Link auf Ihr Profil in den öffentlichen Gruppenseiten</Data></Cell>
71 </Row>
72 <Row>
73 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
74 <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell>
75 <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell>
76 <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell>
77 <Cell><Data ss:Type="String">Fehler beim Erstellen des Fotos!</Data></Cell>
78 <Cell><Data ss:Type="String">Fehler beim Erstellen des Fotos!</Data></Cell>
79 </Row>
80 <Row ss:Height="409.5">
81 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
82 <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell>
83 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Search directory and on www.secondlife.com for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
84 <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Find directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
85 <Cell ss:StyleID="s23"><Data ss:Type="String">Anzeigen erscheinen eine Woche lang im Abschnitt 'Anzeigen' des Suchverzeichnisses.&#10; &#10;Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum Verzeichnis hinzuzufügen.&#10; &#10;Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken.&#10;Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.</Data></Cell>
86 <Cell ss:StyleID="s23"><Data ss:Type="String">Anzeigen erscheinen eine Woche lang auf der Registerkarte 'Anzeigen'&#10;im Suchverzeichnis.&#10; &#10;Füllen Sie Ihre Anzeige aus und klicken Sie auf 'Veröffentlichen...', um sie zum&#10;Verzeichnis hinzuzufügen.&#10; &#10;Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf 'Veröffentlichen' klicken.&#10;Wenn Sie mehr bezahlen oder ein Benutzer nach Ihren Suchbegriffen sucht,&#10;erscheint Ihre Anzeige weiter oben in der Liste.</Data></Cell>
87 </Row>
88 <Row ss:Height="178.5">
89 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
90 <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell>
91 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10; estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
92 <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10;estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
93 <Cell ss:StyleID="s23"><Data ss:Type="String">Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu&#10; erlauben, ohne auf der Zugangsliste zu stehen.&#10; &#10;Standard: ein</Data></Cell>
94 <Cell ss:StyleID="s23"><Data ss:Type="String">Aktivieren Sie diese Option, um Einwohnern den Zugang zu diesem Grundstück zu&#10;erlauben, ohne auf der Zugangsliste zu stehen.&#10; &#10;Standard: ein</Data></Cell>
95 </Row>
96 <Row ss:Height="204">
97 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
98 <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell>
99 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10; listed here and any groups below. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
100 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10;listed here and any groups below. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
101 <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier &#10; aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist &#10; nur verfügbar, wenn 'Vom Festland aus sichtbar' &#10; deaktiviert ist.</Data></Cell>
102 <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier &#10;aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist &#10;nur verfügbar, wenn 'Vom Festland aus sichtbar' &#10;deaktiviert ist.</Data></Cell>
103 </Row>
104 <Row ss:Height="204">
105 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
106 <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell>
107 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10; listed here and any Residents above. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
108 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10;listed here and any Residents above. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
109 <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier &#10; aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist &#10; nur verfügbar, wenn 'Vom Festland aus sichtbar' &#10; deaktiviert ist.</Data></Cell>
110 <Cell ss:StyleID="s23"><Data ss:Type="String">Der Zugang zu diesem Grundstück wird auf die hier &#10;aufgeführten Einwohner und Gruppen beschränkt. Diese Einstellung ist &#10;nur verfügbar, wenn 'Vom Festland aus sichtbar' &#10;deaktiviert ist.</Data></Cell>
111 </Row>
112 <Row ss:Height="204">
113 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
114 <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell>
115 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10; channels in which residents may hear and talk with others&#10; nearby.&#10;&#10; Default: off</Data></Cell>
116 <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10;channels in which residents may hear and talk with others&#10;nearby.&#10;&#10;Default: off</Data></Cell>
117 <Cell ss:StyleID="s23"><Data ss:Type="String">Die Parzellen auf diesem Grundstück können über eigene Voice-&#10; Channel verfügen, die es Einwohnern ermöglichen, sich mit&#10; anderen Personen in der Nähe zu unterhalten.&#10;&#10; Standard: aus</Data></Cell>
118 <Cell ss:StyleID="s23"><Data ss:Type="String">Die Parzellen auf diesem Grundstück können über eigene Voice-&#10;Channel verfügen, die es Einwohnern ermöglichen, sich mit&#10;anderen Personen in der Nähe zu unterhalten.&#10;&#10;Standard: aus</Data></Cell>
119 </Row>
120 <Row ss:Height="331.5">
121 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
122 <Cell><Data ss:Type="String">//BadURL/message</Data></Cell>
123 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10; &#10; [SLURL]&#10; &#10; Most links are similar to this:&#10; &#10; secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about&#10; &#10; Please check the spelling and try again.</Data></Cell>
124 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10;&#10;[SLURL]&#10;&#10;Most links are similar to this:&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;Please check the spelling and try again.</Data></Cell>
125 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life kann den folgenden Link nicht verarbeiten:&#10; [SLURL] &#10; Die meisten Links ähneln dem Folgenden: secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about &#10;&#10;Bitte überprüfen Sie die Schreibweise und versuchen Sie es erneut.</Data></Cell>
126 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life kann den folgenden Link nicht verarbeiten:&#10;&#10;[SLURL]&#10;&#10;Die meisten Links ähneln dem Folgenden:&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;Überprüfen Sie die Schreibweise und versuchen Sie es erneut.</Data></Cell>
127 </Row>
128 <Row>
129 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
130 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell>
131 <Cell><Data ss:Type="String">label</Data></Cell>
132 <Cell><Data ss:Type="String">Show in Search &gt; Places (L$30/week) under</Data></Cell>
133 <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell>
134 <Cell><Data ss:Type="String">In Suchen &gt; Orte (30 L$/Woche) zeigen unter</Data></Cell>
135 <Cell><Data ss:Type="String">Ort in Suche anzeigen (30 L$/Woche) unter</Data></Cell>
136 </Row>
137 <Row ss:Height="25.5">
138 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
139 <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell>
140 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media&#10;texture:</Data></Cell>
141 <Cell ss:StyleID="s23"><Data ss:Type="String">Sound&#10;Settings:</Data></Cell>
142 <Cell ss:StyleID="s23"><Data ss:Type="String">Sound-&#10;Einstellungen:</Data></Cell>
143 <Cell ss:StyleID="s23"><Data ss:Type="String">Sound-&#10;Einstellungen:</Data></Cell>
144 </Row>
145 <Row>
146 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
147 <Cell><Data ss:Type="String">/directory</Data></Cell>
148 <Cell><Data ss:Type="String">title</Data></Cell>
149 <Cell><Data ss:Type="String">Search</Data></Cell>
150 <Cell><Data ss:Type="String">Search Second Life</Data></Cell>
151 <Cell><Data ss:Type="String">Suchen</Data></Cell>
152 <Cell><Data ss:Type="String">Second Life durchsuchen</Data></Cell>
153 </Row>
154 <Row>
155 <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell>
156 <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell>
157 <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell>
158 <Cell><Data ss:Type="String">Ready</Data></Cell>
159 <Cell><Data ss:Type="String">Fertig</Data></Cell>
160 <Cell><Data ss:Type="String">Bereit</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell>
165 <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell>
166 <Cell><Data ss:Type="Number">300</Data></Cell>
167 <Cell><Data ss:Type="Number">250</Data></Cell>
168 <Cell><Data ss:Type="Number">300</Data></Cell>
169 </Row>
170 <Row>
171 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
172 <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell>
173 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
174 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
175 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
176 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
177 </Row>
178 <Row>
179 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
180 <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell>
181 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
182 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
183 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
184 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
185 </Row>
186 <Row>
187 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
188 <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell>
189 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
190 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
191 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
192 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell>
197 <Cell><Data ss:Type="String">label</Data></Cell>
198 <Cell><Data ss:Type="String">Show in Search</Data></Cell>
199 <Cell><Data ss:Type="String">Show in search</Data></Cell>
200 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
201 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
202 </Row>
203 <Row>
204 <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell>
205 <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell>
206 <Cell><Data ss:Type="String">label</Data></Cell>
207 <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell>
208 <Cell><Data ss:Type="String">About Landmark</Data></Cell>
209 <Cell><Data ss:Type="String">Zu Landmarke teleportieren</Data></Cell>
210 <Cell><Data ss:Type="String">Landmarken-Info</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
215 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
216 <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell>
217 <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell>
218 <Cell><Data ss:Type="String">Eingabegerät (Mikro):</Data></Cell>
219 </Row>
220 <Row>
221 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
222 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
223 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
224 <Cell><Data ss:Type="String">Input Level</Data></Cell>
225 <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell>
226 <Cell><Data ss:Type="String">Eingangslautstärke</Data></Cell>
227 </Row>
228 <Row>
229 <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell>
230 <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell>
231 <Cell><Data ss:Type="String">label</Data></Cell>
232 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
233 <Cell><Data ss:Type="String">Show in search</Data></Cell>
234 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
235 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
242 <Cell><Data ss:Type="String">Show in search</Data></Cell>
243 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
244 <Cell><Data ss:Type="String">In Suche anzeigen</Data></Cell>
245 </Row>
246 <Row>
247 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
248 <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell>
249 <Cell><Data ss:Type="String">label</Data></Cell>
250 <Cell><Data ss:Type="String">Mature Group</Data></Cell>
251 <Cell><Data ss:Type="String">Mature group</Data></Cell>
252 <Cell><Data ss:Type="String">Ab-18-Gruppe</Data></Cell>
253 <Cell><Data ss:Type="String">Ab-18-Gruppe</Data></Cell>
254 </Row>
255 <Row>
256 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
257 <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell>
258 <Cell><Data ss:Type="String">label</Data></Cell>
259 <Cell><Data ss:Type="String">Open Enrollment</Data></Cell>
260 <Cell><Data ss:Type="String">Open enrollment</Data></Cell>
261 <Cell><Data ss:Type="String">Registrierung offen</Data></Cell>
262 <Cell><Data ss:Type="String">Registrierung offen</Data></Cell>
263 </Row>
264 <Row>
265 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
266 <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell>
267 <Cell><Data ss:Type="String">label</Data></Cell>
268 <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell>
269 <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell>
270 <Cell><Data ss:Type="String">Beitrittsgebühr: L$</Data></Cell>
271 <Cell><Data ss:Type="String">Beitrittsgebühr: L$</Data></Cell>
272 </Row>
273 <Row>
274 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
275 <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell>
276 <Cell><Data ss:Type="String">label</Data></Cell>
277 <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell>
278 <Cell><Data ss:Type="String">Receive group notices</Data></Cell>
279 <Cell><Data ss:Type="String">Gruppenmitteilungen erhalten</Data></Cell>
280 <Cell><Data ss:Type="String">Gruppenmitteilungen erhalten</Data></Cell>
281 </Row>
282 <Row>
283 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
284 <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell>
285 <Cell><Data ss:Type="String">label</Data></Cell>
286 <Cell><Data ss:Type="String">List Group in Profile</Data></Cell>
287 <Cell><Data ss:Type="String">List group in my profile</Data></Cell>
288 <Cell><Data ss:Type="String">Gruppe in Profil anzeigen</Data></Cell>
289 <Cell><Data ss:Type="String">Gruppe in meinem Profil anzeigen</Data></Cell>
290 </Row>
291 <Row>
292 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
293 <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell>
294 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
295 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
296 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
297 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell>
302 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
303 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
304 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
305 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
306 </Row>
307 <Row>
308 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
309 <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell>
310 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
311 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
312 <Cell><Data ss:Type="String">0 Quadratmeter</Data></Cell>
313 <Cell><Data ss:Type="String">[AREA] qm</Data></Cell>
314 </Row>
315 <Row>
316 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
317 <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell>
318 <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell>
319 <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell>
320 <Cell><Data ss:Type="String">(max. [AMOUNT])</Data></Cell>
321 <Cell><Data ss:Type="String">Quadratmeter (max. [AMOUNT])</Data></Cell>
322 </Row>
323 <Row>
324 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
325 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
326 <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell>
327 <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
328 <Cell><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell>
329 <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
330 </Row>
331 <Row>
332 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
333 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
334 <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
335 <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
336 <Cell><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell>
337 <Cell><Data ss:Type="String">Gebiet: [AREA] qm</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
342 <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell>
343 <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
344 <Cell><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$.</Data></Cell>
345 <Cell><Data ss:Type="String">Steht zum Verkauf für [PRICE] L$</Data></Cell>
346 </Row>
347 <Row>
348 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
349 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
350 <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
351 <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell>
352 <Cell><Data ss:Type="String">Auktions-ID [ID].</Data></Cell>
353 <Cell><Data ss:Type="String">Auktions-ID [ID].</Data></Cell>
354 </Row>
355 <Row>
356 <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell>
357 <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell>
358 <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell>
359 <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell>
360 <Cell><Data ss:Type="String">Audio-Einstellungen:</Data></Cell>
361 <Cell><Data ss:Type="String">Audio-Einstellungen:</Data></Cell>
362 </Row>
363 <Row>
364 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
365 <Cell><Data ss:Type="String">/im/text_box3</Data></Cell>
366 <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell>
367 <Cell><Data ss:Type="String">Logging Options:</Data></Cell>
368 <Cell><Data ss:Type="String">Protokolloptionen:</Data></Cell>
369 <Cell><Data ss:Type="String">Protokolloptionen:</Data></Cell>
370 </Row>
371 <Row>
372 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
373 <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell>
374 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
375 <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
376 <Cell><Data ss:Type="String">Voice-Chat von Kameraposition aus hören.</Data></Cell>
377 <Cell><Data ss:Type="String">Voice-Chat von Kameraposition aus hören.</Data></Cell>
378 </Row>
379 <Row>
380 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
381 <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell>
382 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
383 <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
384 <Cell><Data ss:Type="String">Voice-Chat von Avatarposition aus hören.</Data></Cell>
385 <Cell><Data ss:Type="String">Voice-Chat von Avatarposition aus hören.</Data></Cell>
386 </Row>
387 <Row>
388 <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell>
389 <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell>
390 <Cell><Data ss:Type="String">label</Data></Cell>
391 <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell>
392 <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell>
393 <Cell><Data ss:Type="String">Parzellensuche unterbinden</Data></Cell>
394 <Cell><Data ss:Type="String">Landanzeige in Suche blockieren</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell>
399 <Cell><Data ss:Type="String">label</Data></Cell>
400 <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell>
401 <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell>
402 <Cell><Data ss:Type="String">Viewer im &amp;apos;Zum-Sprechen-drücken&amp;apos;-Modus starten</Data></Cell>
403 <Cell><Data ss:Type="String">Viewer im 'Zum-Sprechen-drücken'-Modus starten</Data></Cell>
404 </Row>
405 </Table>
406 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
407 <Selected/>
408 <Panes>
409 <Pane>
410 <Number>3</Number>
411 <ActiveRow>2</ActiveRow>
412 <ActiveCol>4</ActiveCol>
413 <RangeSelection>R3C5:R43C5</RangeSelection>
414 </Pane>
415 </Panes>
416 <ProtectObjects>False</ProtectObjects>
417 <ProtectScenarios>False</ProtectScenarios>
418 </WorksheetOptions>
419 </Worksheet>
420</Workbook>
diff --git a/linden/indra/newview/skins/xui/de/panel_login.xml b/linden/indra/newview/skins/xui/de/panel_login.xml
index afda3d5..34779a6 100644
--- a/linden/indra/newview/skins/xui/de/panel_login.xml
+++ b/linden/indra/newview/skins/xui/de/panel_login.xml
@@ -1,44 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/de/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 Vorname:
8 </text>
9 <text name="last_name_text">
10 Nachname:
11 </text>
12 <text name="password_text">
13 Kennwort:
14 </text>
15 <text name="start_location_text">
16 Startposition:
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 Mein Heimatort
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 Mein letzter Standort
24 </combo_item>
25 <combo_item name="Typeregionname">
26 &lt;Region eingeben&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="Kennwort merken" name="remember_check" />
30 <text name="full_screen_text">
31 Die Anzeige schaltet bei Anmeldung auf Vollbild um.
32 </text>
33 <button label="Neues Konto..." label_selected="Neues Konto..." name="new_account_btn" />
34 <button label="Einstellungen..." label_selected="Einstellungen..."
35 name="preferences_btn" />
36 <button label="Verbinden" label_selected="Verbinden" name="connect_btn" />
37 <button label="Beenden" label_selected="Beenden" name="quit_btn" />
38 <text name="version_text">
39 1.23.4 (5)
40 </text>
41 <text name="channel_text">
42 [Viewer Channel Name]
43 </text> 5 </text>
44</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml
new file mode 100644
index 0000000..6438fe6
--- /dev/null
+++ b/linden/indra/newview/skins/xui/de/panel_preferences_LCD.xml
@@ -0,0 +1,30 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel label="Logitech-LCD" name="LCD Options">
3 <text name="LCD Destination:">
4 LCD-Ziel:
5 </text>
6 <radio_group name="LCDDestination">
7 <radio_item name="DestinationG15"
8 tool_tip="Zeigt die Auswahl auf dem LCD der Logitech G15-Tastatur an">
9 Logitech G15 Gaming-Tastatur
10 </radio_item>
11 <radio_item name="DestinationZ10"
12 tool_tip="Zeigt die Auswahl auf dem LCD der Logitech Z10-Lautsprecher an">
13 Logitech Z10-Lautsprecher
14 </radio_item>
15 </radio_group>
16 <text name="LCD Display Options">
17 LCD-Anzeigeoptionen:
18 </text>
19 <check_box label="Chat anzeigen" name="DisplayChat"
20 tool_tip="Letzte Chat-Zeile auf dem LCD anzeigen" />
21 <check_box label="IMs anzeigen" name="DisplayIM" tool_tip="Letzte IM auf dem LCD anzeigen" />
22 <check_box label="Standortinformationen anzeigen" name="DisplayRegion"
23 tool_tip="Informationen zum aktuellen Standort auf dem LCD anzeigen" />
24 <check_box label="Kontodaten anzeigen" name="DisplayLinden"
25 tool_tip="Aktuelle Informationen zum Konto auf dem LCD anzeigen" />
26 <check_box label="Netzwerkinformationen anzeigen" name="DisplayDebug"
27 tool_tip="Debug-Informationen auf dem LCD anzeigen" />
28 <check_box label="Debug-Info von Konsole anzeigen" name="DisplayDebugConsole"
29 tool_tip="Debug-Informationen von der Konsole auf dem LCD anzeigen" />
30</panel>
diff --git a/linden/indra/newview/skins/xui/en-us/alerts.xml b/linden/indra/newview/skins/xui/en-us/alerts.xml
index 192fcdb..fdb84b9 100644
--- a/linden/indra/newview/skins/xui/en-us/alerts.xml
+++ b/linden/indra/newview/skins/xui/en-us/alerts.xml
@@ -51,6 +51,7 @@
51 <message name="message"> 51 <message name="message">
52 Unable to connect to [SECOND_LIFE]. 52 Unable to connect to [SECOND_LIFE].
53The system may be down. 53The system may be down.
54
54Please try again in a few minutes, or click Help 55Please try again in a few minutes, or click Help
55for advice and a link to the system status web page. 56for advice and a link to the system status web page.
56 </message> 57 </message>
@@ -115,7 +116,6 @@ Enter a brief description of the group&apos;s purpose.
115 <alert modal="true" name="CharacterSnapshotSaved"> 116 <alert modal="true" name="CharacterSnapshotSaved">
116 <message name="message"> 117 <message name="message">
117 A snapshot of your character has been saved. 118 A snapshot of your character has been saved.
118
119Visit the Webpage Studio exhibit to see it. 119Visit the Webpage Studio exhibit to see it.
120 </message> 120 </message>
121 </alert> 121 </alert>
@@ -201,7 +201,6 @@ Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]?
201 <alert modal="true" name="CreateGroupCanAfford"> 201 <alert modal="true" name="CreateGroupCanAfford">
202 <message name="message"> 202 <message name="message">
203 Creating a group costs L$[COST]. 203 Creating a group costs L$[COST].
204
205To maintain the group for more than three days, 204To maintain the group for more than three days,
206you must reach a total of two or more members. 205you must reach a total of two or more members.
207 206
@@ -307,8 +306,8 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
307 Selecting the &quot;Publish on the Web&quot; option allows us to publish 306 Selecting the &quot;Publish on the Web&quot; option allows us to publish
308the group name, insignia, charter, titles, and founder on the 307the group name, insignia, charter, titles, and founder on the
309[SECOND_LIFE] website. You are responsible for indicating if any 308[SECOND_LIFE] website. You are responsible for indicating if any
310of the above content is considered Mature according to the 309of the above content is considered inappropriate for a minor
311Community Standards. 310according to the Community Standards.
312 </message> 311 </message>
313 </alert> 312 </alert>
314 <alert modal="true" name="ClickPublishHelpLand"> 313 <alert modal="true" name="ClickPublishHelpLand">
@@ -331,8 +330,8 @@ region that forbids this.
331 Selecting the &quot;Publish on the Web&quot; option allows us to publish 330 Selecting the &quot;Publish on the Web&quot; option allows us to publish
332the photographer&apos;s [SECOND_LIFE] name, subject line, location, message and 331the photographer&apos;s [SECOND_LIFE] name, subject line, location, message and
333snapshot on the [SECOND_LIFE] website. You are responsible for indicating if any 332snapshot on the [SECOND_LIFE] website. You are responsible for indicating if any
334of the above content for each snapshot is considered Mature according to the 333of the above content for each snapshot is considered inappropriate for a minor
335Community Standards. 334according to the Community Standards.
336 </message> 335 </message>
337 </alert> 336 </alert>
338 <alert modal="true" name="ClickPublishHelpAvatar"> 337 <alert modal="true" name="ClickPublishHelpAvatar">
@@ -474,7 +473,6 @@ Please select an individual to sell to if selling for L$0.
474 <message name="message"> 473 <message name="message">
475 The selected [LAND_SIZE] m2 land is being set for sale. 474 The selected [LAND_SIZE] m2 land is being set for sale.
476Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME]. 475Your selling price will be L$[SALE_PRICE] and will be authorized for sale to [NAME].
477
478 </message> 476 </message>
479 <option name="Continue"> 477 <option name="Continue">
480 OK 478 OK
@@ -692,7 +690,6 @@ The outfit folder contains no clothing, body parts, or attachments.
692 <alert modal="true" name="MustHaveAccountToLogIn"> 690 <alert modal="true" name="MustHaveAccountToLogIn">
693 <message name="message"> 691 <message name="message">
694 You must have an account to connect to [SECOND_LIFE]. 692 You must have an account to connect to [SECOND_LIFE].
695
696Go to www.secondlife.com to create an account? 693Go to www.secondlife.com to create an account?
697 </message> 694 </message>
698 <option name="OK"> 695 <option name="OK">
@@ -706,10 +703,8 @@ Go to www.secondlife.com to create an account?
706 <message name="message"> 703 <message name="message">
707 Classified ads appear in the &apos;Classified&apos; section of the 704 Classified ads appear in the &apos;Classified&apos; section of the
708Search directory and on www.secondlife.com for one week. 705Search directory and on www.secondlife.com for one week.
709
710Fill out your ad, then click &apos;Publish...&apos; to add it to the 706Fill out your ad, then click &apos;Publish...&apos; to add it to the
711directory. 707directory.
712
713You&apos;ll be asked for a price to pay when clicking Publish. 708You&apos;ll be asked for a price to pay when clicking Publish.
714Paying more makes your ad appear higher in the list, and 709Paying more makes your ad appear higher in the list, and
715also appear higher when people search for keywords. 710also appear higher when people search for keywords.
@@ -766,8 +761,8 @@ There is no reimbursement for fees paid.
766 Some of the display changes that you have made 761 Some of the display changes that you have made
767require [SECOND_LIFE] to shut down immediately, 762require [SECOND_LIFE] to shut down immediately,
768which will cause you to lose any work in progress. 763which will cause you to lose any work in progress.
769 764
770Apply those changes and quit 765Apply those changes and quit?
771 </message> 766 </message>
772 <option name="ApplyandQuit"> 767 <option name="ApplyandQuit">
773 Apply and Quit 768 Apply and Quit
@@ -1007,7 +1002,6 @@ Could not request domain name: [HOST]
1007 Unable to find the server domain name. 1002 Unable to find the server domain name.
1008This could be the result of a lost network connection 1003This could be the result of a lost network connection
1009or a server problem. 1004or a server problem.
1010
1011Please try again in a few minutes, or click Help 1005Please try again in a few minutes, or click Help
1012for advice and a link to the system status web page. 1006for advice and a link to the system status web page.
1013 </message> 1007 </message>
@@ -1028,6 +1022,7 @@ Unable to connect to [SERVER]
1028 <message name="message"> 1022 <message name="message">
1029 Unable to connect to [SECOND_LIFE]. 1023 Unable to connect to [SECOND_LIFE].
1030DNS could not resolve the host name. 1024DNS could not resolve the host name.
1025
1031Please verify that you can connect to the www.secondlife.com 1026Please verify that you can connect to the www.secondlife.com
1032web site. If you can, but continue to receive this error, 1027web site. If you can, but continue to receive this error,
1033please go to www.secondlife.com/support and report this problem. 1028please go to www.secondlife.com/support and report this problem.
@@ -1037,8 +1032,8 @@ please go to www.secondlife.com/support and report this problem.
1037 <message name="message"> 1032 <message name="message">
1038 Unable to establish a secure connection to the login server. 1033 Unable to establish a secure connection to the login server.
1039Often this means that your computer&apos;s clock is set incorrectly. 1034Often this means that your computer&apos;s clock is set incorrectly.
1035
1040Please ensure the time and date are set correctly. 1036Please ensure the time and date are set correctly.
1041
1042If you continue to receive this error, please go 1037If you continue to receive this error, please go
1043to www.secondlife.com/support 1038to www.secondlife.com/support
1044and report the problem. 1039and report the problem.
@@ -1048,6 +1043,7 @@ and report the problem.
1048 <message name="message"> 1043 <message name="message">
1049 Unable to connect to [SECOND_LIFE]. 1044 Unable to connect to [SECOND_LIFE].
1050The login server couldn&apos;t verify itself via SSL. 1045The login server couldn&apos;t verify itself via SSL.
1046
1051If you continue to receive this error, please go 1047If you continue to receive this error, please go
1052to www.secondlife.com/support 1048to www.secondlife.com/support
1053and report the problem. 1049and report the problem.
@@ -1057,6 +1053,7 @@ and report the problem.
1057 <message name="message"> 1053 <message name="message">
1058 Unable to connect to [SECOND_LIFE]. 1054 Unable to connect to [SECOND_LIFE].
1059Despite our best efforts, something unexpected has gone wrong. 1055Despite our best efforts, something unexpected has gone wrong.
1056
1060Please go to www.secondlife.com/support 1057Please go to www.secondlife.com/support
1061and report the problem. If possible, include your SecondLife.log 1058and report the problem. If possible, include your SecondLife.log
1062file from: C:\Documents and Settings\(name)\Application Data\SecondLife\logs 1059file from: C:\Documents and Settings\(name)\Application Data\SecondLife\logs
@@ -1067,6 +1064,7 @@ Thank you.
1067 <message name="message"> 1064 <message name="message">
1068 Unable to connect to [SECOND_LIFE]. 1065 Unable to connect to [SECOND_LIFE].
1069Despite our best efforts, something unexpected has gone wrong. 1066Despite our best efforts, something unexpected has gone wrong.
1067
1070Please go to www.secondlife.com/support 1068Please go to www.secondlife.com/support
1071and report the problem. If possible, include your SecondLife.log 1069and report the problem. If possible, include your SecondLife.log
1072file from: ~/Library/Application Support/SecondLife/logs 1070file from: ~/Library/Application Support/SecondLife/logs
@@ -1076,15 +1074,16 @@ Thank you.
1076 <alert modal="true" name="CannotResolveLoginToken"> 1074 <alert modal="true" name="CannotResolveLoginToken">
1077 <message name="message"> 1075 <message name="message">
1078 There was a problem resolving your login 1076 There was a problem resolving your login
1079authentication token. Please try logging in 1077authentication token. Please try logging in again.
1080again. If you continue to receive this error, 1078
1079If you continue to receive this error,
1081please go to www.secondlife.com/support. 1080please go to www.secondlife.com/support.
1082 </message> 1081 </message>
1083 </alert> 1082 </alert>
1084 <alert modal="true" name="CannotConnectNoMessage"> 1083 <alert modal="true" name="CannotConnectNoMessage">
1085 <message name="message"> 1084 <message name="message">
1086 Unknown problem trying to connect. 1085 Unknown problem trying to connect.
1087 1086
1088Please try again in a few minutes, or click Help 1087Please try again in a few minutes, or click Help
1089for advice and a link to the system status web page. 1088for advice and a link to the system status web page.
1090 </message> 1089 </message>
@@ -1117,10 +1116,9 @@ for advice and a link to the system status web page.
1117 <alert modal="true" name="FirstRunDialog"> 1116 <alert modal="true" name="FirstRunDialog">
1118 <message name="message"> 1117 <message name="message">
1119 [SECOND_LIFE] installation is complete. 1118 [SECOND_LIFE] installation is complete.
1120 1119
1121If this is your first time using [SECOND_LIFE], you will need to create 1120If this is your first time using [SECOND_LIFE], you will need to create
1122an account before you can log on. 1121an account before you can log on.
1123
1124Return to www.secondlife.com to create a new account? 1122Return to www.secondlife.com to create a new account?
1125 </message> 1123 </message>
1126 <option name="NewAccount..."> 1124 <option name="NewAccount...">
@@ -1141,6 +1139,7 @@ will see you correctly.
1141 <message name="message"> 1139 <message name="message">
1142 Unable to connect to server. 1140 Unable to connect to server.
1143Could not resolve domain name: [DOMAIN] 1141Could not resolve domain name: [DOMAIN]
1142
1144Please check your network connection. 1143Please check your network connection.
1145 </message> 1144 </message>
1146 </alert> 1145 </alert>
@@ -1162,9 +1161,8 @@ for advice and a link to the system status web page.
1162 <alert modal="true" name="WelcomeToSecondLife"> 1161 <alert modal="true" name="WelcomeToSecondLife">
1163 <message name="message"> 1162 <message name="message">
1164 Welcome to [SECOND_LIFE]! 1163 Welcome to [SECOND_LIFE]!
1165 1164
1166Use arrow keys to walk. 1165Use arrow keys to walk.
1167
1168Please choose the male or female avatar. 1166Please choose the male or female avatar.
1169You can change your mind later. 1167You can change your mind later.
1170 </message> 1168 </message>
@@ -1177,10 +1175,9 @@ You can change your mind later.
1177 </alert> 1175 </alert>
1178 <alert modal="true" name="WelcomeToSecondLifeSimple"> 1176 <alert modal="true" name="WelcomeToSecondLifeSimple">
1179 <message name="message"> 1177 <message name="message">
1180 Welcome to [SECOND_LIFE]! 1178 Welcome to [SECOND_LIFE]!
1181 1179
1182Use arrow keys to walk. 1180Use arrow keys to walk.
1183
1184Please choose the male or female avatar. 1181Please choose the male or female avatar.
1185 </message> 1182 </message>
1186 <option name="Male"> 1183 <option name="Male">
@@ -1316,8 +1313,7 @@ Are you sure you want to take these itmes?
1316 <alert modal="true" name="PromptGoToCurrencyPage"> 1313 <alert modal="true" name="PromptGoToCurrencyPage">
1317 <message name="message"> 1314 <message name="message">
1318 [EXTRA] 1315 [EXTRA]
1319 1316
1320
1321Go to [URL] for information on purchasing currency? 1317Go to [URL] for information on purchasing currency?
1322 </message> 1318 </message>
1323 <option name="GotoPage"> 1319 <option name="GotoPage">
@@ -1342,20 +1338,24 @@ select more than one object.
1342 <alert modal="true" name="CannotLinkModify"> 1338 <alert modal="true" name="CannotLinkModify">
1343 <message name="message"> 1339 <message name="message">
1344 Unable to link because you don&apos;t have modify permission 1340 Unable to link because you don&apos;t have modify permission
1345on all the objects. Make sure none are locked, and that 1341on all the objects.
1346you own all of them. 1342
1343Please make sure none are locked, and that you own all of them.
1347 </message> 1344 </message>
1348 </alert> 1345 </alert>
1349 <alert modal="true" name="CannotLinkDifferentOwners"> 1346 <alert modal="true" name="CannotLinkDifferentOwners">
1350 <message name="message"> 1347 <message name="message">
1351 Unable to link because not all of the objects have the 1348 Unable to link because not all of the objects have the
1352same owner. Make sure you own all of the selected objects. 1349same owner.
1350
1351Please make sure you own all of the selected objects.
1353 </message> 1352 </message>
1354 </alert> 1353 </alert>
1355 <alert modal="true" name="NoFileExtension"> 1354 <alert modal="true" name="NoFileExtension">
1356 <message name="message"> 1355 <message name="message">
1357 No file extension for the file: &apos;[FILE]&apos; 1356 No file extension for the file: &apos;[FILE]&apos;
1358Please make sure the file has a correct file extension 1357
1358Please make sure the file has a correct file extension.
1359 </message> 1359 </message>
1360 </alert> 1360 </alert>
1361 <alert modal="true" name="InvalidFileExtension"> 1361 <alert modal="true" name="InvalidFileExtension">
@@ -1488,6 +1488,7 @@ Select an object with a script.
1488 <alert modal="true" name="CannotRecompileSelectObjectsNoPermission"> 1488 <alert modal="true" name="CannotRecompileSelectObjectsNoPermission">
1489 <message name="message"> 1489 <message name="message">
1490 Not able to perform &apos;recompilation&apos;. 1490 Not able to perform &apos;recompilation&apos;.
1491
1491Select objects with scripts that you 1492Select objects with scripts that you
1492have permission to modify. 1493have permission to modify.
1493 </message> 1494 </message>
@@ -1495,12 +1496,14 @@ have permission to modify.
1495 <alert modal="true" name="CannotResetSelectObjectsNoScripts"> 1496 <alert modal="true" name="CannotResetSelectObjectsNoScripts">
1496 <message name="message"> 1497 <message name="message">
1497 Not able to perform &apos;reset&apos;. 1498 Not able to perform &apos;reset&apos;.
1499
1498Select objects with scripts. 1500Select objects with scripts.
1499 </message> 1501 </message>
1500 </alert> 1502 </alert>
1501 <alert modal="true" name="CannotResetSelectObjectsNoPermission"> 1503 <alert modal="true" name="CannotResetSelectObjectsNoPermission">
1502 <message name="message"> 1504 <message name="message">
1503 Not able to perform &apos;reset&apos;. 1505 Not able to perform &apos;reset&apos;.
1506
1504Select objects with scripts that you 1507Select objects with scripts that you
1505have permission to modify. 1508have permission to modify.
1506 </message> 1509 </message>
@@ -1508,12 +1511,14 @@ have permission to modify.
1508 <alert modal="true" name="CannotSetRunningSelectObjectsNoScripts"> 1511 <alert modal="true" name="CannotSetRunningSelectObjectsNoScripts">
1509 <message name="message"> 1512 <message name="message">
1510 Not able to set any scripts to &apos;running&apos;. 1513 Not able to set any scripts to &apos;running&apos;.
1514
1511Select objects with scripts. 1515Select objects with scripts.
1512 </message> 1516 </message>
1513 </alert> 1517 </alert>
1514 <alert modal="true" name="CannotSetRunningSelectObjectsNoPermission"> 1518 <alert modal="true" name="CannotSetRunningSelectObjectsNoPermission">
1515 <message name="message"> 1519 <message name="message">
1516 Not able to set any scripts to &apos;running&apos;. 1520 Not able to set any scripts to &apos;running&apos;.
1521
1517Select objects with scripts that you 1522Select objects with scripts that you
1518have permission to modify. 1523have permission to modify.
1519 </message> 1524 </message>
@@ -1521,12 +1526,14 @@ have permission to modify.
1521 <alert modal="true" name="CannotSetRunningNotSelectObjectsNoScripts"> 1526 <alert modal="true" name="CannotSetRunningNotSelectObjectsNoScripts">
1522 <message name="message"> 1527 <message name="message">
1523 Unable to set any scripts to &apos;not running&apos;. 1528 Unable to set any scripts to &apos;not running&apos;.
1529
1524Select objects with scripts. 1530Select objects with scripts.
1525 </message> 1531 </message>
1526 </alert> 1532 </alert>
1527 <alert modal="true" name="CannotSetRunningNotSelectObjectsNoPermission"> 1533 <alert modal="true" name="CannotSetRunningNotSelectObjectsNoPermission">
1528 <message name="message"> 1534 <message name="message">
1529 Unable to set any scripts to &apos;not running&apos;. 1535 Unable to set any scripts to &apos;not running&apos;.
1536
1530Select objects with scripts that you 1537Select objects with scripts that you
1531have permission to modify. 1538have permission to modify.
1532 </message> 1539 </message>
@@ -1661,6 +1668,7 @@ No parcel selected.
1661 <alert modal="true" name="CannotBuyLandMultipleRegions"> 1668 <alert modal="true" name="CannotBuyLandMultipleRegions">
1662 <message name="message"> 1669 <message name="message">
1663 Unable to buy land because selection spans multiple regions. 1670 Unable to buy land because selection spans multiple regions.
1671
1664Please select a smaller area and try again. 1672Please select a smaller area and try again.
1665 </message> 1673 </message>
1666 </alert> 1674 </alert>
@@ -1668,6 +1676,7 @@ Please select a smaller area and try again.
1668 <message name="message"> 1676 <message name="message">
1669 Unable to buy land: 1677 Unable to buy land:
1670Multiple parcels selected. 1678Multiple parcels selected.
1679
1671Try selecting a single parcel. 1680Try selecting a single parcel.
1672 </message> 1681 </message>
1673 </alert> 1682 </alert>
@@ -1675,6 +1684,7 @@ Try selecting a single parcel.
1675 <message name="message"> 1684 <message name="message">
1676 Unable to deed land: 1685 Unable to deed land:
1677Multiple parcels selected. 1686Multiple parcels selected.
1687
1678Try selecting a single parcel. 1688Try selecting a single parcel.
1679 </message> 1689 </message>
1680 </alert> 1690 </alert>
@@ -1686,10 +1696,9 @@ Try selecting a single parcel.
1686 <alert modal="true" name="ParcelCanPlayMusic"> 1696 <alert modal="true" name="ParcelCanPlayMusic">
1687 <message name="message"> 1697 <message name="message">
1688 This location can play streaming music. 1698 This location can play streaming music.
1689
1690Music requires a 768 kbps or faster 1699Music requires a 768 kbps or faster
1691Internet connection. 1700Internet connection.
1692 1701
1693Play music when available? 1702Play music when available?
1694 </message> 1703 </message>
1695 <option name="PlayMusic"> 1704 <option name="PlayMusic">
@@ -1702,12 +1711,10 @@ Play music when available?
1702 <alert modal="true" name="ParcelCanPlayMedia"> 1711 <alert modal="true" name="ParcelCanPlayMedia">
1703 <message name="message"> 1712 <message name="message">
1704 This location can play streaming video. 1713 This location can play streaming video.
1705
1706Streaming video requires a 768 kbps or 1714Streaming video requires a 768 kbps or
1707faster Internet connection. 1715faster Internet connection.
1708 1716
1709Play streaming video when available? 1717Play streaming video when available?
1710
1711(You can change this option later under 1718(You can change this option later under
1712Preferences &gt; Audio &amp; Video.) 1719Preferences &gt; Audio &amp; Video.)
1713 </message> 1720 </message>
@@ -1722,6 +1729,7 @@ Preferences &gt; Audio &amp; Video.)
1722 <message name="message"> 1729 <message name="message">
1723 Unable to buy land: 1730 Unable to buy land:
1724Waiting for server to report cost. 1731Waiting for server to report cost.
1732
1725Please try again. 1733Please try again.
1726 </message> 1734 </message>
1727 </alert> 1735 </alert>
@@ -1729,6 +1737,7 @@ Please try again.
1729 <message name="message"> 1737 <message name="message">
1730 Unable to deed land: 1738 Unable to deed land:
1731Waiting for server to report ownership. 1739Waiting for server to report ownership.
1740
1732Please try again. 1741Please try again.
1733 </message> 1742 </message>
1734 </alert> 1743 </alert>
@@ -1749,6 +1758,7 @@ by another Resident.
1749 <message name="message"> 1758 <message name="message">
1750 Unable to buy land: 1759 Unable to buy land:
1751Cannot find the region this land is in. 1760Cannot find the region this land is in.
1761
1752Please use Tools -&gt; Report Bug to report this. 1762Please use Tools -&gt; Report Bug to report this.
1753 </message> 1763 </message>
1754 </alert> 1764 </alert>
@@ -1768,6 +1778,7 @@ The region [REGION] does not allow transfer of land.
1768 <message name="message"> 1778 <message name="message">
1769 Unable to buy land for the group: 1779 Unable to buy land for the group:
1770You are not an officer in your current group. 1780You are not an officer in your current group.
1781
1771Please activate another group using Edit -&gt; Groups... 1782Please activate another group using Edit -&gt; Groups...
1772 </message> 1783 </message>
1773 </alert> 1784 </alert>
@@ -1787,6 +1798,7 @@ No parcel selected.
1787 <message name="message"> 1798 <message name="message">
1788 Unable to abandon land: 1799 Unable to abandon land:
1789Waiting for server to update parcel information. 1800Waiting for server to update parcel information.
1801
1790Try again in a few seconds. 1802Try again in a few seconds.
1791 </message> 1803 </message>
1792 </alert> 1804 </alert>
@@ -1794,6 +1806,7 @@ Try again in a few seconds.
1794 <message name="message"> 1806 <message name="message">
1795 Unable to abandon land: 1807 Unable to abandon land:
1796You do not own all the parcels selected. 1808You do not own all the parcels selected.
1809
1797Please select a single parcel. 1810Please select a single parcel.
1798 </message> 1811 </message>
1799 </alert> 1812 </alert>
@@ -1808,6 +1821,7 @@ Parcels you own appear in green.
1808 <message name="message"> 1821 <message name="message">
1809 Unable to abandon land: 1822 Unable to abandon land:
1810Cannot find the region this land is in. 1823Cannot find the region this land is in.
1824
1811Please use Tools -&gt; Report Bug to report this. 1825Please use Tools -&gt; Report Bug to report this.
1812 </message> 1826 </message>
1813 </alert> 1827 </alert>
@@ -1821,6 +1835,7 @@ The region [REGION] does not allow transfer of land.
1821 <message name="message"> 1835 <message name="message">
1822 Unable to abandon land: 1836 Unable to abandon land:
1823You must select an entire parcel to release it. 1837You must select an entire parcel to release it.
1838
1824Select an entire parcel, or divide your parcel first. 1839Select an entire parcel, or divide your parcel first.
1825 </message> 1840 </message>
1826 </alert> 1841 </alert>
@@ -1829,7 +1844,7 @@ Select an entire parcel, or divide your parcel first.
1829 You are about to release [AREA] m2 of land. 1844 You are about to release [AREA] m2 of land.
1830Releasing this parcel will remove it from your land 1845Releasing this parcel will remove it from your land
1831holdings, but will not grant any L$. 1846holdings, but will not grant any L$.
1832 1847
1833Release this land? 1848Release this land?
1834 </message> 1849 </message>
1835 <option name="Release"> 1850 <option name="Release">
@@ -1842,12 +1857,14 @@ Release this land?
1842 <alert modal="true" name="CannotDivideLandNothingSelected"> 1857 <alert modal="true" name="CannotDivideLandNothingSelected">
1843 <message name="message"> 1858 <message name="message">
1844 Unable to divide land: 1859 Unable to divide land:
1860
1845No parcels selected. 1861No parcels selected.
1846 </message> 1862 </message>
1847 </alert> 1863 </alert>
1848 <alert modal="true" name="CannotDivideLandPartialSelection"> 1864 <alert modal="true" name="CannotDivideLandPartialSelection">
1849 <message name="message"> 1865 <message name="message">
1850 Unable to divide land: 1866 Unable to divide land:
1867
1851You have an entire parcel selected. 1868You have an entire parcel selected.
1852Try selecting a part of the parcel. 1869Try selecting a part of the parcel.
1853 </message> 1870 </message>
@@ -1871,6 +1888,7 @@ Divide land?
1871 <message name="message"> 1888 <message name="message">
1872 Unable to divide land: 1889 Unable to divide land:
1873Cannot find the region this land is in. 1890Cannot find the region this land is in.
1891
1874Please use Tools -&gt; Report Bug to report this. 1892Please use Tools -&gt; Report Bug to report this.
1875 </message> 1893 </message>
1876 </alert> 1894 </alert>
@@ -1878,6 +1896,7 @@ Please use Tools -&gt; Report Bug to report this.
1878 <message name="message"> 1896 <message name="message">
1879 Unable to join land: 1897 Unable to join land:
1880Cannot find the region this land is in. 1898Cannot find the region this land is in.
1899
1881Please use Tools -&gt; Report Bug to report this. 1900Please use Tools -&gt; Report Bug to report this.
1882 </message> 1901 </message>
1883 </alert> 1902 </alert>
@@ -1891,6 +1910,7 @@ No parcels selected.
1891 <message name="message"> 1910 <message name="message">
1892 Unable to join land: 1911 Unable to join land:
1893You only have one parcel selected. 1912You only have one parcel selected.
1913
1894Select land across both parcels. 1914Select land across both parcels.
1895 </message> 1915 </message>
1896 </alert> 1916 </alert>
@@ -1898,6 +1918,7 @@ Select land across both parcels.
1898 <message name="message"> 1918 <message name="message">
1899 Unable to join land: 1919 Unable to join land:
1900You must select more than one parcel. 1920You must select more than one parcel.
1921
1901Select land across both parcels. 1922Select land across both parcels.
1902 </message> 1923 </message>
1903 </alert> 1924 </alert>
@@ -1905,9 +1926,8 @@ Select land across both parcels.
1905 <message name="message"> 1926 <message name="message">
1906 Joining this land will create one large parcel 1927 Joining this land will create one large parcel
1907out of all parcels intersecting the selected rectangle. 1928out of all parcels intersecting the selected rectangle.
1908
1909You will need to reset the name and options of the 1929You will need to reset the name and options of the
1910new parcel. 1930new parcel.
1911 1931
1912Join land? 1932Join land?
1913 </message> 1933 </message>
@@ -1978,7 +1998,9 @@ save the wearable again.
1978 Unable to save [NAME] to central asset store. 1998 Unable to save [NAME] to central asset store.
1979This is usually a temporary failure. Please 1999This is usually a temporary failure. Please
1980customize and save the wearable again in a 2000customize and save the wearable again in a
1981few minutes. If this problem persists, please 2001few minutes.
2002
2003If this problem persists, please
1982click on the &apos;Tools | Report Bug&apos; pull down menu 2004click on the &apos;Tools | Report Bug&apos; pull down menu
1983and provide details about your network setup. 2005and provide details about your network setup.
1984 </message> 2006 </message>
@@ -1987,8 +2009,9 @@ and provide details about your network setup.
1987 <message name="message"> 2009 <message name="message">
1988 [MESSAGE] 2010 [MESSAGE]
1989 2011
1990We are unable to recover from this problem. Please 2012We are unable to recover from this problem.
1991uninstall and reinstall before trying again. If this 2013
2014Please uninstall and reinstall before trying again. If this
1992problem persists, check the Tech Support FAQ at: 2015problem persists, check the Tech Support FAQ at:
1993www.secondlife.com/support. 2016www.secondlife.com/support.
1994 </message> 2017 </message>
@@ -1999,9 +2022,8 @@ www.secondlife.com/support.
1999 <alert modal="true" name="YouHaveBeenLoggedOut"> 2022 <alert modal="true" name="YouHaveBeenLoggedOut">
2000 <message name="message"> 2023 <message name="message">
2001 You have been logged out of [SECOND_LIFE]: 2024 You have been logged out of [SECOND_LIFE]:
2002
2003[MESSAGE] 2025[MESSAGE]
2004 2026
2005Click Continue to look at existing IM and chat. 2027Click Continue to look at existing IM and chat.
2006You will not be able to perform any other operations. 2028You will not be able to perform any other operations.
2007Click Quit to exit [SECOND_LIFE] immediately. 2029Click Quit to exit [SECOND_LIFE] immediately.
@@ -2024,7 +2046,7 @@ You do not have permission to buy land for your active group.
2024 Friends can give permissions to 2046 Friends can give permissions to
2025track each other on the map and 2047track each other on the map and
2026receive online status updates. 2048receive online status updates.
2027 2049
2028Offer friendship to [NAME]? 2050Offer friendship to [NAME]?
2029 </message> 2051 </message>
2030 <option name="Offer"> 2052 <option name="Offer">
@@ -2059,9 +2081,7 @@ Offer friendship to [NAME]?
2059 <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser"> 2081 <alert modal="true" name="GodDeleteAllScriptedPublicObjectsByUser">
2060 <message name="message"> 2082 <message name="message">
2061 Are you sure you want to delete all scripted objects owned by 2083 Are you sure you want to delete all scripted objects owned by
2062
2063** [AVATAR_NAME] ** 2084** [AVATAR_NAME] **
2064
2065on all others land in this sim? 2085on all others land in this sim?
2066 </message> 2086 </message>
2067 <option name="DELETE!!"> 2087 <option name="DELETE!!">
@@ -2074,9 +2094,7 @@ on all others land in this sim?
2074 <alert modal="true" name="GodDeleteAllScriptedObjectsByUser"> 2094 <alert modal="true" name="GodDeleteAllScriptedObjectsByUser">
2075 <message name="message"> 2095 <message name="message">
2076 Are you sure you want to DELETE ALL scripted objects owned by 2096 Are you sure you want to DELETE ALL scripted objects owned by
2077
2078** [AVATAR_NAME] ** 2097** [AVATAR_NAME] **
2079
2080on ALL LAND in this sim? 2098on ALL LAND in this sim?
2081 </message> 2099 </message>
2082 <option name="!!DELETEALL!!"> 2100 <option name="!!DELETEALL!!">
@@ -2090,9 +2108,7 @@ on ALL LAND in this sim?
2090 <message name="message"> 2108 <message name="message">
2091 Are you sure you want to DELETE ALL objects (scripted or not) 2109 Are you sure you want to DELETE ALL objects (scripted or not)
2092owned by 2110owned by
2093
2094** [AVATAR_NAME] ** 2111** [AVATAR_NAME] **
2095
2096on ALL LAND in this sim? 2112on ALL LAND in this sim?
2097 </message> 2113 </message>
2098 <option name="!!DELETEALL!!"> 2114 <option name="!!DELETEALL!!">
@@ -2266,6 +2282,7 @@ If you continue, next owner permissions will be
2266applied and possibly restrict your 2282applied and possibly restrict your
2267ability to modify or copy them. 2283ability to modify or copy them.
2268However, you can take the current selection. 2284However, you can take the current selection.
2285
2269Are you sure you want to take these items? 2286Are you sure you want to take these items?
2270 </message> 2287 </message>
2271 <option name="Yes"> 2288 <option name="Yes">
@@ -2278,6 +2295,7 @@ Are you sure you want to take these items?
2278 <alert modal="true" name="CantBuyLandAcrossMultipleRegions"> 2295 <alert modal="true" name="CantBuyLandAcrossMultipleRegions">
2279 <message name="message"> 2296 <message name="message">
2280 Unable to buy land because selection spans multiple regions. 2297 Unable to buy land because selection spans multiple regions.
2298
2281Please select a smaller area and try again. 2299Please select a smaller area and try again.
2282 </message> 2300 </message>
2283 </alert> 2301 </alert>
@@ -2285,11 +2303,10 @@ Please select a smaller area and try again.
2285 <message name="message"> 2303 <message name="message">
2286 By deeding this parcel, the group will be required 2304 By deeding this parcel, the group will be required
2287to have and maintain sufficient land use credits. 2305to have and maintain sufficient land use credits.
2288
2289The purchase price of the land is not refunded to 2306The purchase price of the land is not refunded to
2290the owner. If a deeded parcel is sold, the sale 2307the owner. If a deeded parcel is sold, the sale
2291price will be divided evenly among group members. 2308price will be divided evenly among group members.
2292 2309
2293Deed this [AREA] m2 of land to the group 2310Deed this [AREA] m2 of land to the group
2294&apos;[GROUP_NAME]&apos;? 2311&apos;[GROUP_NAME]&apos;?
2295 </message> 2312 </message>
@@ -2304,10 +2321,8 @@ Deed this [AREA] m2 of land to the group
2304 <message name="message"> 2321 <message name="message">
2305 By deeding this parcel, the group will be required 2322 By deeding this parcel, the group will be required
2306to have and maintain sufficient land use credits. 2323to have and maintain sufficient land use credits.
2307
2308The deed will include a simultaneous land 2324The deed will include a simultaneous land
2309contribution to the group from &apos;[FIRST_NAME] [LAST_NAME]&apos;. 2325contribution to the group from &apos;[FIRST_NAME] [LAST_NAME]&apos;.
2310
2311The purchase price of the land is not refunded to 2326The purchase price of the land is not refunded to
2312the owner. If a deeded parcel is sold, the sale 2327the owner. If a deeded parcel is sold, the sale
2313price will be divided evenly among group members. 2328price will be divided evenly among group members.
@@ -2345,7 +2360,7 @@ Could not request domain name: [HOST_NAME]
2345 Unable to find the server domain name. 2360 Unable to find the server domain name.
2346This could be the result of a lost network connection 2361This could be the result of a lost network connection
2347or a server problem. 2362or a server problem.
2348 2363
2349Please try again in a few minutes, or click Help 2364Please try again in a few minutes, or click Help
2350for advice and a link to the system status web page. 2365for advice and a link to the system status web page.
2351 </message> 2366 </message>
@@ -2366,6 +2381,7 @@ Unable to connect to [IP_ADDRESS]
2366 <message name="message"> 2381 <message name="message">
2367 Unable to connect to [SECOND_LIFE] 2382 Unable to connect to [SECOND_LIFE]
2368The system may be down. 2383The system may be down.
2384
2369Please try again in a few minutes, or click Help 2385Please try again in a few minutes, or click Help
2370for advice and a link to the system status web page. 2386for advice and a link to the system status web page.
2371 </message> 2387 </message>
@@ -2383,8 +2399,7 @@ for advice and a link to the system status web page.
2383 </alert> 2399 </alert>
2384 <alert modal="true" name="AvatarMoved"> 2400 <alert modal="true" name="AvatarMoved">
2385 <message name="message"> 2401 <message name="message">
2386 Your [TYPE] location is not currently available. 2402 Your [TYPE] location is not currently available. [HELP]
2387[HELP]
2388You have been moved into a nearby region. 2403You have been moved into a nearby region.
2389 </message> 2404 </message>
2390 </alert> 2405 </alert>
@@ -2398,10 +2413,9 @@ will see you correctly.
2398 <alert modal="true" name="FirstRun"> 2413 <alert modal="true" name="FirstRun">
2399 <message name="message"> 2414 <message name="message">
2400 [SECOND_LIFE] installation is complete. 2415 [SECOND_LIFE] installation is complete.
2401 2416
2402If this is your first time using [SECOND_LIFE], you will need to create 2417If this is your first time using [SECOND_LIFE], you will need to create
2403an account before you can log on. 2418an account before you can log on.
2404
2405Return to www.secondlife.com to create a new account? 2419Return to www.secondlife.com to create a new account?
2406 </message> 2420 </message>
2407 <option name="NewAccount..."> 2421 <option name="NewAccount...">
@@ -2415,6 +2429,7 @@ Return to www.secondlife.com to create a new account?
2415 <message name="message"> 2429 <message name="message">
2416 Unable to connect to server. 2430 Unable to connect to server.
2417Could not resolve domain name: [HOST_NAME] 2431Could not resolve domain name: [HOST_NAME]
2432
2418Please check your network connection. 2433Please check your network connection.
2419 </message> 2434 </message>
2420 </alert> 2435 </alert>
@@ -2422,7 +2437,7 @@ Please check your network connection.
2422 <message name="message"> 2437 <message name="message">
2423 Unable to connect. Login packet never received by 2438 Unable to connect. Login packet never received by
2424login server. 2439login server.
2425 2440
2426Please try again in a few minutes, or click Help 2441Please try again in a few minutes, or click Help
2427for advice and a link to the system status web page. 2442for advice and a link to the system status web page.
2428 </message> 2443 </message>
@@ -2436,9 +2451,8 @@ for advice and a link to the system status web page.
2436 <alert modal="true" name="WelcomeNoClothes"> 2451 <alert modal="true" name="WelcomeNoClothes">
2437 <message name="message"> 2452 <message name="message">
2438 Your character will appear in a moment. 2453 Your character will appear in a moment.
2439 2454
2440Use arrow keys to walk. 2455Use arrow keys to walk.
2441
2442Press the F1 key at any time for help or 2456Press the F1 key at any time for help or
2443to learn more about [SECOND_LIFE]. 2457to learn more about [SECOND_LIFE].
2444 </message> 2458 </message>
@@ -2446,12 +2460,10 @@ to learn more about [SECOND_LIFE].
2446 <alert modal="true" name="WelcomeChooseSex" nodefault="true"> 2460 <alert modal="true" name="WelcomeChooseSex" nodefault="true">
2447 <message name="message"> 2461 <message name="message">
2448 Your character will appear in a moment. 2462 Your character will appear in a moment.
2449 2463
2450Use arrow keys to walk. 2464Use arrow keys to walk.
2451
2452Press the F1 key at any time for help or 2465Press the F1 key at any time for help or
2453to learn more about [SECOND_LIFE]. 2466to learn more about [SECOND_LIFE].
2454
2455Please choose the male or female avatar. 2467Please choose the male or female avatar.
2456You can change your mind later. 2468You can change your mind later.
2457 </message> 2469 </message>
@@ -2480,9 +2492,7 @@ You can change your mind later.
2480 <alert modal="true" name="FlushMapVisibilityCaches"> 2492 <alert modal="true" name="FlushMapVisibilityCaches">
2481 <message name="message"> 2493 <message name="message">
2482 This will flush the map caches on this region. 2494 This will flush the map caches on this region.
2483
2484This is really only useful for debugging. 2495This is really only useful for debugging.
2485
2486(In production, wait 5 minutes, then everyone&apos;s map will 2496(In production, wait 5 minutes, then everyone&apos;s map will
2487update after they relog.) 2497update after they relog.)
2488 </message> 2498 </message>
@@ -2545,9 +2555,8 @@ on ALL LAND in this region?
2545 <alert modal="true" name="InvalidTerrainBitDepth"> 2555 <alert modal="true" name="InvalidTerrainBitDepth">
2546 <message name="message"> 2556 <message name="message">
2547 Couldn&apos;t set region textures: 2557 Couldn&apos;t set region textures:
2548
2549Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH]. 2558Terrain texture [TEXTURE_NUM] has an invalid bit depth of [TEXTURE_BIT_DEPTH].
2550 2559
2551Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image 2560Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image
2552then click &quot;Apply&quot; again. 2561then click &quot;Apply&quot; again.
2553 </message> 2562 </message>
@@ -2555,9 +2564,8 @@ then click &quot;Apply&quot; again.
2555 <alert modal="true" name="InvalidTerrainSize"> 2564 <alert modal="true" name="InvalidTerrainSize">
2556 <message name="message"> 2565 <message name="message">
2557 Couldn&apos;t set region textures: 2566 Couldn&apos;t set region textures:
2558
2559Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]. 2567Terrain texture [TEXTURE_NUM] is too large at [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
2560 2568
2561Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image 2569Replace texture [TEXTURE_NUM] with a 24-bit 512x512 or smaller image
2562then click &quot;Apply&quot; again. 2570then click &quot;Apply&quot; again.
2563 </message> 2571 </message>
@@ -2639,7 +2647,6 @@ Please set the object for sale and try again.
2639 <message name="message"> 2647 <message name="message">
2640 A new version of [SECOND_LIFE] is available. 2648 A new version of [SECOND_LIFE] is available.
2641[MESSAGE] 2649[MESSAGE]
2642
2643You must download this update to use [SECOND_LIFE]. 2650You must download this update to use [SECOND_LIFE].
2644 </message> 2651 </message>
2645 <option name="Download"> 2652 <option name="Download">
@@ -2653,7 +2660,6 @@ You must download this update to use [SECOND_LIFE].
2653 <message name="message"> 2660 <message name="message">
2654 An updated version of [SECOND_LIFE] is available. 2661 An updated version of [SECOND_LIFE] is available.
2655[MESSAGE] 2662[MESSAGE]
2656
2657This update is not required, but we suggest you install it to improve performance and stability. 2663This update is not required, but we suggest you install it to improve performance and stability.
2658 </message> 2664 </message>
2659 <option name="Download"> 2665 <option name="Download">
@@ -2667,7 +2673,6 @@ This update is not required, but we suggest you install it to improve performanc
2667 <message name="message"> 2673 <message name="message">
2668 An updated version of [SECOND_LIFE] is available. 2674 An updated version of [SECOND_LIFE] is available.
2669[MESSAGE] 2675[MESSAGE]
2670
2671This update is not required, but we suggest you install it to improve performance and stability. 2676This update is not required, but we suggest you install it to improve performance and stability.
2672 </message> 2677 </message>
2673 <option name="Download"> 2678 <option name="Download">
@@ -2681,9 +2686,8 @@ This update is not required, but we suggest you install it to improve performanc
2681 <message name="message"> 2686 <message name="message">
2682 A new version of [SECOND_LIFE] is available. 2687 A new version of [SECOND_LIFE] is available.
2683[MESSAGE] 2688[MESSAGE]
2684
2685You must download this update to use [SECOND_LIFE]. 2689You must download this update to use [SECOND_LIFE].
2686 2690
2687Download to your Applications folder? 2691Download to your Applications folder?
2688 </message> 2692 </message>
2689 <option name="Download"> 2693 <option name="Download">
@@ -2697,7 +2701,6 @@ Download to your Applications folder?
2697 <message name="message"> 2701 <message name="message">
2698 An updated version of [SECOND_LIFE] is available. 2702 An updated version of [SECOND_LIFE] is available.
2699[MESSAGE] 2703[MESSAGE]
2700
2701This update is not required, but we suggest you install it to improve performance and stability. 2704This update is not required, but we suggest you install it to improve performance and stability.
2702 2705
2703Download to your Applications folder? 2706Download to your Applications folder?
@@ -2713,7 +2716,6 @@ Download to your Applications folder?
2713 <message name="message"> 2716 <message name="message">
2714 An updated version of [SECOND_LIFE] is available. 2717 An updated version of [SECOND_LIFE] is available.
2715[MESSAGE] 2718[MESSAGE]
2716
2717This update is not required, but we suggest you install it to improve performance and stability. 2719This update is not required, but we suggest you install it to improve performance and stability.
2718 2720
2719Download to your Applications folder? 2721Download to your Applications folder?
@@ -2744,10 +2746,8 @@ Download to your Applications folder?
2744 <message name="message"> 2746 <message name="message">
2745 Classified ads appear in the &apos;Classified&apos; section of the 2747 Classified ads appear in the &apos;Classified&apos; section of the
2746Find directory for one week. 2748Find directory for one week.
2747
2748Fill out your ad, then click &apos;Publish...&apos; to add it to the 2749Fill out your ad, then click &apos;Publish...&apos; to add it to the
2749directory. 2750directory.
2750
2751You&apos;ll be asked for a price to pay when clicking Publish. 2751You&apos;ll be asked for a price to pay when clicking Publish.
2752Paying more makes your ad appear higher in the list, and 2752Paying more makes your ad appear higher in the list, and
2753also appear higher when people search for keywords. 2753also appear higher when people search for keywords.
@@ -2935,7 +2935,7 @@ also appear higher when people search for keywords.
2935 Are you sure you want to return the selected 2935 Are you sure you want to return the selected
2936objects to their owners? Transferable deeded 2936objects to their owners? Transferable deeded
2937objects will be returned to their previous owners. 2937objects will be returned to their previous owners.
2938 2938
2939*WARNING* No-transfer deeded objects will be deleted! 2939*WARNING* No-transfer deeded objects will be deleted!
2940 </message> 2940 </message>
2941 <ignore name="ignore"> 2941 <ignore name="ignore">
@@ -3264,7 +3264,7 @@ sent to everyone currently in your estate.
3264 <message name="message"> 3264 <message name="message">
3265 You are about to change a Linden owned estate (mainland, 3265 You are about to change a Linden owned estate (mainland,
3266teen grid, orientation, etc.). 3266teen grid, orientation, etc.).
3267 3267
3268This is EXTREMELY DANGEROUS because it can fundamentally 3268This is EXTREMELY DANGEROUS because it can fundamentally
3269affect the user experience. On the mainland, it will change 3269affect the user experience. On the mainland, it will change
3270thousands of regions and make the spaceserver hiccup. 3270thousands of regions and make the spaceserver hiccup.
@@ -3282,11 +3282,10 @@ Proceed?
3282 <message name="message"> 3282 <message name="message">
3283 You are about to change the access list for a Linden owned 3283 You are about to change the access list for a Linden owned
3284estate (mainland, teen grid, orientation, etc.). 3284estate (mainland, teen grid, orientation, etc.).
3285 3285
3286This is DANGEROUS and should only be done to invoke the 3286This is DANGEROUS and should only be done to invoke the
3287hack allowing objects/L$ to be transfered in/out of 3287hack allowing objects/L$ to be transfered in/out of
3288a grid. 3288a grid.
3289
3290It will change thousands of regions and make the 3289It will change thousands of regions and make the
3291spaceserver hiccup. 3290spaceserver hiccup.
3292 </message> 3291 </message>
@@ -3485,7 +3484,7 @@ spaceserver hiccup.
3485 <alert name="PublishClassified"> 3484 <alert name="PublishClassified">
3486 <message name="message"> 3485 <message name="message">
3487 Remember: Classified ad fees are non-refundable. 3486 Remember: Classified ad fees are non-refundable.
3488 3487
3489Publish this classified now for L$[AMOUNT]? 3488Publish this classified now for L$[AMOUNT]?
3490 </message> 3489 </message>
3491 <option name="Publish"> 3490 <option name="Publish">
@@ -3523,7 +3522,7 @@ sent to everyone in this region.
3523 <message name="message"> 3522 <message name="message">
3524 If this box is checked, land owners will not be able to terraform 3523 If this box is checked, land owners will not be able to terraform
3525their land regardless of the per-parcel &apos;Edit Terrain&apos; setting. 3524their land regardless of the per-parcel &apos;Edit Terrain&apos; setting.
3526 3525
3527Default: off 3526Default: off
3528 </message> 3527 </message>
3529 </alert> 3528 </alert>
@@ -3614,7 +3613,6 @@ Default: Off
3614 </alert> 3613 </alert>
3615 <alert modal="true" name="HelpParcelSearch" title="Do Not Show In Search"> 3614 <alert modal="true" name="HelpParcelSearch" title="Do Not Show In Search">
3616 <message name="message"> 3615 <message name="message">
3617
3618Checking this box will show: 3616Checking this box will show:
3619- this parcel in search results 3617- this parcel in search results
3620- this parcel's public objects 3618- this parcel's public objects
@@ -3623,7 +3621,6 @@ Checking this box will show:
3623 <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity"> 3621 <alert modal="true" name="RegionMaturityChange" title="Changed Region Maturity">
3624 <message name="message"> 3622 <message name="message">
3625 The maturity rating for this region has been updated. 3623 The maturity rating for this region has been updated.
3626
3627It may take some time for the change to be 3624It may take some time for the change to be
3628reflected on the map. 3625reflected on the map.
3629 </message> 3626 </message>
@@ -4043,7 +4040,6 @@ They will be copied to your inventory.
4043 <alert modal="true" name="ConfirmPurchase" nodefault="true"> 4040 <alert modal="true" name="ConfirmPurchase" nodefault="true">
4044 <message name="message"> 4041 <message name="message">
4045 This transaction will: 4042 This transaction will:
4046
4047[ACTION] 4043[ACTION]
4048 4044
4049Are you sure you want to proceed with this purchase? 4045Are you sure you want to proceed with this purchase?
@@ -4058,7 +4054,6 @@ Are you sure you want to proceed with this purchase?
4058 <alert modal="true" name="ConfirmPurchasePassword" nodefault="true"> 4054 <alert modal="true" name="ConfirmPurchasePassword" nodefault="true">
4059 <message name="message"> 4055 <message name="message">
4060 This transaction will: 4056 This transaction will:
4061
4062[ACTION] 4057[ACTION]
4063 4058
4064Are you sure you want to proceed with this purchase? 4059Are you sure you want to proceed with this purchase?
@@ -4104,7 +4099,6 @@ Move the inventory item(s)?
4104 <message name="message"> 4099 <message name="message">
4105 You have selected &apos;no copy&apos; inventory items. These items 4100 You have selected &apos;no copy&apos; inventory items. These items
4106will be moved to your inventory, not copied. 4101will be moved to your inventory, not copied.
4107
4108Because this object is scripted, moving these items 4102Because this object is scripted, moving these items
4109to your inventory may cause the script to malfunction. 4103to your inventory may cause the script to malfunction.
4110 4104
@@ -4232,42 +4226,36 @@ Note: Incomplete reports will not be investigated
4232 <alert modal="true" name="HelpReportAbuseSelectCategory"> 4226 <alert modal="true" name="HelpReportAbuseSelectCategory">
4233 <message name="message"> 4227 <message name="message">
4234 Please select a category for this abuse report. 4228 Please select a category for this abuse report.
4235
4236Selecting a category helps us file and process abuse reports. 4229Selecting a category helps us file and process abuse reports.
4237 </message> 4230 </message>
4238 </alert> 4231 </alert>
4239 <alert modal="true" name="HelpReportBugSelectCategory"> 4232 <alert modal="true" name="HelpReportBugSelectCategory">
4240 <message name="message"> 4233 <message name="message">
4241 Please select a category for this bug. 4234 Please select a category for this bug.
4242
4243Selecting a category helps us file and process bug reports. 4235Selecting a category helps us file and process bug reports.
4244 </message> 4236 </message>
4245 </alert> 4237 </alert>
4246 <alert modal="true" name="HelpReportAbuseAbuserNameEmpty"> 4238 <alert modal="true" name="HelpReportAbuseAbuserNameEmpty">
4247 <message name="message"> 4239 <message name="message">
4248 Please enter the name of the abuser. 4240 Please enter the name of the abuser.
4249
4250Entering an accurate value helps us file and process abuse reports. 4241Entering an accurate value helps us file and process abuse reports.
4251 </message> 4242 </message>
4252 </alert> 4243 </alert>
4253 <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty"> 4244 <alert modal="true" name="HelpReportAbuseAbuserLocationEmpty">
4254 <message name="message"> 4245 <message name="message">
4255 Please enter the location where the abuse took place. 4246 Please enter the location where the abuse took place.
4256
4257Entering an accurate value helps us file and process abuse reports. 4247Entering an accurate value helps us file and process abuse reports.
4258 </message> 4248 </message>
4259 </alert> 4249 </alert>
4260 <alert modal="true" name="HelpReportAbuseSummaryEmpty"> 4250 <alert modal="true" name="HelpReportAbuseSummaryEmpty">
4261 <message name="message"> 4251 <message name="message">
4262 Please enter a summary of the abuse that took place. 4252 Please enter a summary of the abuse that took place.
4263
4264Entering an accurate summary helps us file and process abuse reports. 4253Entering an accurate summary helps us file and process abuse reports.
4265 </message> 4254 </message>
4266 </alert> 4255 </alert>
4267 <alert modal="true" name="HelpReportBugSummaryEmpty"> 4256 <alert modal="true" name="HelpReportBugSummaryEmpty">
4268 <message name="message"> 4257 <message name="message">
4269 Please enter a summary of the bug. 4258 Please enter a summary of the bug.
4270
4271Entering an accurate summary helps us file and process bug reports. 4259Entering an accurate summary helps us file and process bug reports.
4272 </message> 4260 </message>
4273 </alert> 4261 </alert>
@@ -4276,7 +4264,6 @@ Entering an accurate summary helps us file and process bug reports.
4276 Please enter a detailed description of the abuse that took place. 4264 Please enter a detailed description of the abuse that took place.
4277Be as specific as you can, including names and the details of the 4265Be as specific as you can, including names and the details of the
4278incident you are reporting. 4266incident you are reporting.
4279
4280Entering an accurate description helps us file and process abuse reports. 4267Entering an accurate description helps us file and process abuse reports.
4281 </message> 4268 </message>
4282 </alert> 4269 </alert>
@@ -4285,7 +4272,6 @@ Entering an accurate description helps us file and process abuse reports.
4285 Please enter a detailed description of the bug. 4272 Please enter a detailed description of the bug.
4286Be as specific as you can, including steps to reproduce the bug 4273Be as specific as you can, including steps to reproduce the bug
4287if possible. 4274if possible.
4288
4289Entering an accurate description helps us file and process bug reports. 4275Entering an accurate description helps us file and process bug reports.
4290 </message> 4276 </message>
4291 </alert> 4277 </alert>
@@ -4295,7 +4281,7 @@ Entering an accurate description helps us file and process bug reports.
4295 4281
4296Reports about copyright infringement can only be submitted 4282Reports about copyright infringement can only be submitted
4297as described at http://secondlife.com/corporate/dmca.php. 4283as described at http://secondlife.com/corporate/dmca.php.
4298 4284
4299Reports concerning copyright infringement will automatically 4285Reports concerning copyright infringement will automatically
4300be discarded if they are submitted through the &apos;Abuse Report&apos; 4286be discarded if they are submitted through the &apos;Abuse Report&apos;
4301feature. If your report does not relate to copyright infringement, 4287feature. If your report does not relate to copyright infringement,
@@ -4403,9 +4389,8 @@ the contents of your Lost And Found folder?
4403 <alert modal="true" name="CopySLURL"> 4389 <alert modal="true" name="CopySLURL">
4404 <message name="message"> 4390 <message name="message">
4405 The following SLURL has been copied to your clipboard: 4391 The following SLURL has been copied to your clipboard:
4406
4407 [SLURL] 4392 [SLURL]
4408 4393
4409 Put it in a web page to give others easy access to this location or 4394 Put it in a web page to give others easy access to this location or
4410 try it out yourself by pasting it into the address bar of your web browser. 4395 try it out yourself by pasting it into the address bar of your web browser.
4411 </message> 4396 </message>
@@ -4481,9 +4466,7 @@ the contents of your Lost And Found folder?
4481 <alert modal="true" name="BadURL"> 4466 <alert modal="true" name="BadURL">
4482 <message name="message"> 4467 <message name="message">
4483Second Life doesn't know how to handle the link: 4468Second Life doesn't know how to handle the link:
4484 4469 [SLURL]
4485[SLURL]
4486
4487Most links are similar to this: 4470Most links are similar to this:
4488 4471
4489secondlife:///app/agent/0e346d8b-4433-4d66-a6b0- 4472secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-
@@ -4492,4 +4475,40 @@ fd37083abc4c/about
4492Please check the spelling and try again. 4475Please check the spelling and try again.
4493 </message> 4476 </message>
4494 </alert> 4477 </alert>
4478 <alert modal="true" name="NotAgeVerified">
4479 <message name="message">
4480 You need to be age-verified in order to access this parcel.
4481Would you like to visit the Second Life website to verify your age?
4482
4483[_URL]
4484 </message>
4485 <ignore name="ignore">
4486 Warn about lack of age verification
4487 </ignore>
4488 <option name="Yes">
4489 Yes
4490 </option>
4491 <option name="No">
4492 No
4493 </option>
4494 <url option="0">https://secondlife.com/account/verification.php</url>
4495 </alert>
4496 <alert modal="true" name="Cannot enter parcel: no payment info on file">
4497 <message name="message">
4498 This parcel requires that you have payment information on file before you can access it.
4499Would you like to visit the Second Life website to set this up?
4500
4501[_URL]
4502 </message>
4503 <ignore name="ignore">
4504 Warn about lack of payment info
4505 </ignore>
4506 <option name="Yes">
4507 Yes
4508 </option>
4509 <option name="No">
4510 No
4511 </option>
4512 <url option="0">https://secondlife.com/account/</url>
4513 </alert>
4495</alerts> 4514</alerts>
diff --git a/linden/indra/newview/skins/xui/en-us/floater_about_land.xml b/linden/indra/newview/skins/xui/en-us/floater_about_land.xml
index eb5448f..37a4e8e 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_about_land.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_about_land.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater bottom="-554" can_close="true" can_drag_on_left="false" can_minimize="true" 2<floater bottom="-554" can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="true" can_tear_off="true" enabled="true" height="385" 3 can_resize="true" can_tear_off="false" enabled="true" height="385"
4 hidden="false" left="367" min_height="385" min_width="460" 4 hidden="false" left="367" min_height="385" min_width="460"
5 mouse_opaque="true" name="floaterland" rect_control="FloaterLandRect5" 5 mouse_opaque="true" name="floaterland" rect_control="FloaterLandRect5"
6 title="About Land" width="460"> 6 title="About Land" width="460">
@@ -755,49 +755,111 @@ Settings:
755 <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" 755 <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom"
756 height="333" hidden="false" label="Access" left="1" mouse_opaque="true" 756 height="333" hidden="false" label="Access" left="1" mouse_opaque="true"
757 name="land_access_panel" width="458"> 757 name="land_access_panel" width="458">
758 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 758 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
759 bottom="-20" drop_shadow_visible="true" enabled="true" follows="left|top" 759 bottom="-24" drop_shadow_visible="true" enabled="true" follows="left|top"
760 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false" 760 font="SansSerif" h_pad="0" halign="left" height="20" hidden="false"
761 left="4" mouse_opaque="true" name="Limit access to this parcel to:" 761 left="8" mouse_opaque="true" name="Limit access to this parcel to:"
762 v_pad="0" width="278"> 762 v_pad="0" width="278">
763 Limit access to this parcel to: 763 Access To This Parcel
764 </text> 764 </text>
765 <check_box bottom="-40" enabled="true" follows="left|top" font="SansSerifSmall" 765
766 height="16" hidden="false" initial_value="false" label="Group: [GROUP]" 766 <check_box bottom="-45" enabled="true" follows="top|left" font="SansSerifSmall"
767 left="4" mouse_opaque="true" name="GroupCheck" radio_style="false" 767 height="16" hidden="false" initial_value="false" label="Allow Public Access"
768 left="8" mouse_opaque="true" name="public_access" radio_style="false"
768 width="278" /> 769 width="278" />
769 <check_box bottom="-60" enabled="true" follows="left|top" font="SansSerifSmall" 770 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
771 bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="top|left"
772 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false"
773 left_delta="20" mouse_opaque="true" name="Only Allow"
774 v_pad="0" width="278">
775 Restrict Access To:
776 </text>
777 <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall"
778 height="16" hidden="false" initial_value="false" label="Residents who have given payment info to Linden Lab"
779 left_delta="0" mouse_opaque="true" name="limit_payment" radio_style="false" width="278"
780 tool_tip="Ban unidentified residents." />
781 <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall"
782 height="16" hidden="false" initial_value="false" label="Age-verified adults"
783 left_delta="0" mouse_opaque="true" name="limit_age_verified" radio_style="false" width="278"
784 tool_tip="Ban residents who have not verified their age. See support.secondlife.com for more information." />
785 <string name="estate_override">One ore more of these options is set at the estate level</string>
786
787 <check_box bottom_delta="-20" enabled="true" follows="left|top" font="SansSerifSmall"
788 height="16" hidden="false" initial_value="false" label="Allow Group Access: [GROUP]"
789 left="8" mouse_opaque="true" name="GroupCheck" radio_style="false" width="278"
790 tool_tip="Set group in the General tab." />
791
792 <check_box bottom_delta="-20" enabled="false" follows="left|top" font="SansSerifSmall"
770 height="16" hidden="false" initial_value="false" 793 height="16" hidden="false" initial_value="false"
771 label="Avatars: ([LISTED] listed, [MAX] max)" left="4" mouse_opaque="true" 794 label="Sell passes to:" left="8"
772 name="AccessCheck" radio_style="false" width="278" /> 795 mouse_opaque="true" name="PassCheck" radio_style="false" width="120"
773 <name_list allow_calling_card_drop="false" background_visible="true" bottom="-234" 796 tool_tip="Allows temporary access to this parcel"/>
774 column_padding="0" draw_border="true" draw_heading="true" heading_font="SansSerifSmall" heading_height="14" 797 <combo_box allow_text_entry="false" bottom_delta="0" enabled="true" follows="left|top"
775 enabled="true" follows="left|top|right|bottom" height="170" 798 height="16" hidden="false" left_delta="120" max_chars="20" mouse_opaque="true"
776 hidden="false" left="28" mouse_opaque="true" multi_select="false" 799 name="pass_combo" width="100">
777 name="AccessList" width="400"> 800 <combo_item name="Anyone" value="anyone">
778 <column label="Allowed Residents" name="name" relwidth="1.0" /> 801 Anyone
802 </combo_item>
803 <combo_item name="Group" value="group">
804 Group
805 </combo_item>
806 </combo_box>
807 <spinner bottom_delta="-20" enabled="false" follows="left|top" height="16" hidden="false"
808 increment="1" initial_val="10" label="Price in L$:" label_width="120"
809 left="28" max_val="500" min_val="1" mouse_opaque="true" name="PriceSpin"
810 width="180" />
811 <spinner bottom_delta="-20" enabled="false" follows="left|top" height="16" hidden="false"
812 increment="0.25" initial_val="1" label="Hours of access:" label_width="120"
813 left_delta="0" max_val="24" min_val="0.01" mouse_opaque="true" name="HoursSpin"
814 width="180" />
815
816
817 <text bottom="-220" enabled="true" follows="left|right|top" font="SansSerifSmall"
818 height="16" hidden="false" initial_value="false"
819 label="Always Allow" left="20" mouse_opaque="true"
820 name="AccessCheck" radio_style="false" width="195">
821 Allowed Residents
822 </text>
823 <name_list allow_calling_card_drop="false" background_visible="true" bottom="-320"
824 column_padding="0" draw_border="true" draw_heading="false" heading_font="SansSerifSmall" heading_height="14"
825 enabled="true" follows="left|top" height="100"
826 hidden="false" left="20" mouse_opaque="true" multi_select="true"
827 name="AccessList" width="195"
828 tool_tip="([LISTED] listed, [MAX] max)">
779 </name_list> 829 </name_list>
780 <button bottom="-264" enabled="true" follows="left|bottom" font="SansSerifSmall" 830 <button bottom_delta="-20" enabled="true" follows="left|top" font="SansSerifSmall"
781 halign="center" height="16" hidden="false" label="Add..." 831 halign="center" height="16" hidden="false" label="Add..."
782 label_selected="Add..." left="28" mouse_opaque="true" name="Add..." 832 label_selected="Add..." left_delta="5" mouse_opaque="true" name="add_allowed"
783 scale_image="true" width="88" /> 833 scale_image="true" width="80" />
784 <button bottom="-264" enabled="false" follows="left|bottom" font="SansSerifSmall" 834 <button bottom_delta="0" enabled="true" follows="left|top" font="SansSerifSmall"
785 halign="center" height="16" hidden="false" label="Remove" 835 halign="center" height="16" hidden="false" label="Remove"
786 label_selected="Remove" left="124" mouse_opaque="true" name="Remove" 836 label_selected="Remove" left_delta="100" mouse_opaque="true" name="remove_allowed"
787 scale_image="true" width="88" /> 837 scale_image="true" width="80" />
788 <check_box bottom="-284" enabled="false" follows="left|bottom" font="SansSerifSmall" 838
839 <text bottom="-220" enabled="true" follows="left|right|top" font="SansSerifSmall"
789 height="16" hidden="false" initial_value="false" 840 height="16" hidden="false" initial_value="false"
790 label="Sell passes allowing temporary access:" left="28" 841 label="Ban" left="240" mouse_opaque="true"
791 mouse_opaque="true" name="PassCheck" radio_style="false" width="254" /> 842 name="AccessCheck" radio_style="false" width="195">
792 <spinner bottom="-304" enabled="false" follows="left|bottom" height="16" hidden="false" 843 Banned Residents
793 increment="1" initial_val="10" label="Price in L$:" label_width="128" 844 </text>
794 left="76" max_val="500" min_val="1" mouse_opaque="true" name="PriceSpin" 845 <name_list allow_calling_card_drop="false" background_visible="true" bottom="-320"
795 width="206" /> 846 column_padding="0" draw_border="true" draw_heading="false" heading_font="SansSerifSmall" heading_height="14"
796 <spinner bottom="-324" enabled="false" follows="left|bottom" height="16" hidden="false" 847 enabled="true" follows="left|right|top|bottom" height="100"
797 increment="0.25" initial_val="1" label="Hours of access:" label_width="128" 848 hidden="false" left_delta="0" mouse_opaque="true" multi_select="true"
798 left="76" max_val="24" min_val="0.01" mouse_opaque="true" name="HoursSpin" 849 name="BannedList" width="195"
799 width="206" /> 850 tool_tip="([LISTED] listed, [MAX] max)">
851 </name_list>
852 <button bottom_delta="-20" enabled="true" follows="right|bottom" font="SansSerifSmall"
853 halign="center" height="16" hidden="false" label="Add..."
854 label_selected="Add..." left_delta="5" mouse_opaque="true" name="add_banned"
855 scale_image="true" width="80" />
856 <button bottom_delta="0" enabled="false" follows="right|bottom" font="SansSerifSmall"
857 halign="center" height="16" hidden="false" label="Remove"
858 label_selected="Remove" left_delta="100" mouse_opaque="true" name="remove_banned"
859 scale_image="true" width="80" />
860
800 </panel> 861 </panel>
862<!--
801 <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom" 863 <panel border="false" bottom="-349" enabled="true" follows="left|top|right|bottom"
802 height="333" hidden="false" label="Ban" left="1" mouse_opaque="true" 864 height="333" hidden="false" label="Ban" left="1" mouse_opaque="true"
803 name="land_ban_panel" width="458"> 865 name="land_ban_panel" width="458">
@@ -840,5 +902,6 @@ Settings:
840 label="Deny Payment Info Used" left="28" mouse_opaque="true" 902 label="Deny Payment Info Used" left="28" mouse_opaque="true"
841 name="DenyTransactedCheck" radio_style="false" width="254" /> 903 name="DenyTransactedCheck" radio_style="false" width="254" />
842 </panel> 904 </panel>
905 -->
843 </tab_container> 906 </tab_container>
844</floater> 907</floater>
diff --git a/linden/indra/newview/skins/xui/en-us/floater_directory.xml b/linden/indra/newview/skins/xui/en-us/floater_directory.xml
index a012625..0d2063d 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_directory.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_directory.xml
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater can_close="true" can_drag_on_left="false" can_minimize="true" 2<floater can_close="true" can_drag_on_left="false" can_minimize="true"
3 can_resize="false" height="570" min_height="570" min_width="780" 3 can_resize="true" height="570" min_height="570" min_width="780"
4 name="directory" rect_control="FloaterFindRect2" 4 name="directory" rect_control="FloaterFindRect2"
5 title="Search Second Life" width="780"> 5 title="Search Second Life" width="780">
6 <tab_container bottom="-570" follows="left|top|right|bottom" height="550" left="0" 6 <tab_container bottom="-570" follows="left|top|right|bottom" height="550" left="0"
@@ -324,7 +324,7 @@
324 name="incpictures" width="200" /> 324 name="incpictures" width="200" />
325 <check_box bottom_delta="-16" control_name="ShowMatureSims" follows="left|top" 325 <check_box bottom_delta="-16" control_name="ShowMatureSims" follows="left|top"
326 font="SansSerifSmall" height="16" initial_value="false" 326 font="SansSerifSmall" height="16" initial_value="false"
327 label="Include parcels with Mature Content" left="24" mouse_opaque="true" 327 label="Include parcels with Restricted Content" left="24" mouse_opaque="true"
328 name="incmature" width="204" /> 328 name="incmature" width="204" />
329 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 329 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
330 bottom="-38" drop_shadow_visible="true" follows="right|top" 330 bottom="-38" drop_shadow_visible="true" follows="right|top"
diff --git a/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml b/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml
index de2c40b..f9b0f28 100644
--- a/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml
+++ b/linden/indra/newview/skins/xui/en-us/floater_texture_ctrl.xml
@@ -3,6 +3,7 @@
3 can_resize="true" can_tear_off="true" enabled="true" height="290" 3 can_resize="true" can_tear_off="true" enabled="true" height="290"
4 hidden="false" left="478" min_height="290" min_width="410" 4 hidden="false" left="478" min_height="290" min_width="410"
5 mouse_opaque="true" name="texture picker" title="Pick: Texture" width="410"> 5 mouse_opaque="true" name="texture picker" title="Pick: Texture" width="410">
6 <string name="choose_picture">"Click to choose a picture"</string>
6 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 7 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
7 bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top" 8 bottom="-110" drop_shadow_visible="true" enabled="true" follows="left|top"
8 font="SansSerifSmall" h_pad="0" halign="center" height="14" hidden="false" 9 font="SansSerifSmall" h_pad="0" halign="center" height="14" hidden="false"
diff --git a/linden/indra/newview/skins/xui/en-us/menu_login.xml b/linden/indra/newview/skins/xui/en-us/menu_login.xml
new file mode 100644
index 0000000..6533f90
--- /dev/null
+++ b/linden/indra/newview/skins/xui/en-us/menu_login.xml
@@ -0,0 +1,37 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<menu_bar bottom="-18" drop_shadow="false" enabled="true"
3 follows="left|top|right" height="18" hidden="false" left="0"
4 mouse_opaque="true" name="Login Menu" opaque="true" tear_off="false"
5 width="802">
6 <menu bottom="273" drop_shadow="true" enabled="true" height="263"
7 hidden="false" label="File" left="0" mouse_opaque="false" name="File"
8 opaque="true" tear_off="true" create_jump_keys="true" width="243">
9 <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Quit" left="0"
10 mouse_opaque="true" name="Quit" shortcut="control|Q" width="243">
11 <on_click function="File.Quit" userdata="" />
12 </menu_item_call>
13 </menu>
14 <menu bottom="97" drop_shadow="true" enabled="true" height="439"
15 hidden="false" label="Edit" left="38" mouse_opaque="false" name="Edit"
16 opaque="true" tear_off="true" create_jump_keys="true" width="153">
17 <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Preferences..."
18 left="0" mouse_opaque="true" name="Preferences..." shortcut="control|P"
19 width="153">
20 <on_click function="ShowFloater" userdata="preferences" />
21 </menu_item_call>
22 </menu>
23 <menu bottom="219" drop_shadow="true" enabled="true" height="317"
24 hidden="false" label="Help" left="80" mouse_opaque="false" name="Help"
25 opaque="true" tear_off="true" create_jump_keys="true" width="166">
26 <menu_item_call bottom="-29" enabled="true" height="19" hidden="false" label="Second Life Help"
27 left="0" mouse_opaque="true" name="Second Life Help" shortcut="F1"
28 width="166">
29 <on_click function="ShowFloater" userdata="help f1" />
30 </menu_item_call>
31 <menu_item_call bottom="-48" enabled="true" height="19" hidden="false"
32 label="About Second Life..." left="0" mouse_opaque="true"
33 name="About Second Life..." width="166">
34 <on_click function="ShowFloater" userdata="about" />
35 </menu_item_call>
36 </menu>
37</menu_bar>
diff --git a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
index 3b289d4..8643c7e 100644
--- a/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
+++ b/linden/indra/newview/skins/xui/en-us/menu_viewer.xml
@@ -43,7 +43,7 @@
43 left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W" 43 left="0" mouse_opaque="true" name="Close All Windows" shortcut="control|shift|W"
44 width="243"> 44 width="243">
45 <on_click function="File.CloseAllWindows" userdata="" /> 45 <on_click function="File.CloseAllWindows" userdata="" />
46 <on_enable function="File.EnableCloseWindow" userdata="" /> 46 <on_enable function="File.EnableCloseAllWindows" userdata="" />
47 </menu_item_call> 47 </menu_item_call>
48 <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------" 48 <menu_item_separator bottom="-121" enabled="true" height="8" hidden="false" label="-----------"
49 left="0" mouse_opaque="true" name="separator2" width="243" /> 49 left="0" mouse_opaque="true" name="separator2" width="243" />
diff --git a/linden/indra/newview/skins/xui/en-us/notify.xml b/linden/indra/newview/skins/xui/en-us/notify.xml
index ad9e049..cbd2789 100644
--- a/linden/indra/newview/skins/xui/en-us/notify.xml
+++ b/linden/indra/newview/skins/xui/en-us/notify.xml
@@ -970,4 +970,24 @@ Click Accept to join the call or Decline to decline the invitation. Click Mute t
970 We are creating a voice channel for you. This may take up to one minute. 970 We are creating a voice channel for you. This may take up to one minute.
971 </message> 971 </message>
972 </notify> 972 </notify>
973 <notify name="VoiceLoginRetry" tip="true" unique="true" duration="10">
974 <message name="message">
975 We are creating a voice channel for you. This may take up to one minute.
976 </message>
977 </notify>
978 <notify name="Cannot enter parcel: not a group member" tip="true">
979 <message name="message">
980 Cannot enter parcel, you are not a member of the appropriate group.
981 </message>
982 </notify>
983 <notify name="Cannot enter parcel: banned" tip="true">
984 <message name="message">
985 Cannot enter parcel, you have been banned.
986 </message>
987 </notify>
988 <notify name="Cannot enter parcel: not on access list" tip="true">
989 <message name="message">
990 Cannot enter parcel, you are not on the access list.
991 </message>
992 </notify>
973</notifications> 993</notifications>
diff --git a/linden/indra/newview/skins/xui/en-us/panel_avatar.xml b/linden/indra/newview/skins/xui/en-us/panel_avatar.xml
index fa64706..c5c42b4 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_avatar.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_avatar.xml
@@ -28,6 +28,12 @@
28 <text hidden="true" name="NoPaymentInfoOnFile"> 28 <text hidden="true" name="NoPaymentInfoOnFile">
29 No Payment Info On File 29 No Payment Info On File
30 </text> 30 </text>
31 <text hidden="true" name="AgeVerified">
32 , Age-verified
33 </text>
34 <text hidden="true" name="NotAgeVerified">
35 , Not Age-verified
36 </text>
31 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 37 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
32 bottom="-24" drop_shadow_visible="true" follows="left|top" 38 bottom="-24" drop_shadow_visible="true" follows="left|top"
33 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4" 39 font="SansSerifSmall" h_pad="0" halign="right" height="16" left="4"
diff --git a/linden/indra/newview/skins/xui/en-us/panel_login.xml b/linden/indra/newview/skins/xui/en-us/panel_login.xml
index 6652a63..062eba1 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_login.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_login.xml
@@ -6,95 +6,9 @@
6 start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" 6 start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E"
7 top="-1" /> 7 top="-1" />
8 <text hidden="true" name="real_url"> 8 <text hidden="true" name="real_url">
9 http://secondlife.com/app/login/ 9 https://secondlife.com/app/login/en/?show_login_form=True
10 </text> 10 </text>
11 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" 11 <text hidden="true" name="forgot_password_url">
12 bottom="54" drop_shadow_visible="true" follows="left|bottom" 12 http://secondlife.com/account/request.php
13 font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
14 left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120">
15 First Name:
16 </text>
17 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
18 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
19 height="20" hidden="false" left="32" max_length="31" mouse_opaque="true"
20 name="first_name_edit" select_all_on_focus_received="true" width="120" />
21 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
22 bottom="54" drop_shadow_visible="true" follows="left|bottom"
23 font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
24 left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120">
25 Last Name:
26 </text>
27 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
28 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
29 height="20" hidden="false" left="164" max_length="31" mouse_opaque="true"
30 name="last_name_edit" select_all_on_focus_received="true" width="120" />
31 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
32 bottom="54" drop_shadow_visible="true" follows="left|bottom"
33 font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
34 left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120">
35 Password:
36 </text>
37 <line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24"
38 follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true"
39 height="20" hidden="false" left="296" max_length="16" mouse_opaque="true"
40 name="password_edit" select_all_on_focus_received="true" width="120" />
41 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
42 bottom="10" drop_shadow_visible="true" follows="left|bottom"
43 font="SansSerif" h_pad="0" halign="left" height="16" hidden="false"
44 left="32" mouse_opaque="true" name="start_location_text" v_pad="0"
45 width="85">
46 Start Location:
47 </text>
48 <combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18"
49 hidden="false" left_delta="97" max_chars="128" mouse_opaque="true"
50 name="start_location_combo" width="140">
51 <combo_item name="MyHome" value="My Home">
52 My Home
53 </combo_item>
54 <combo_item name="MyLastLocation" value="My Last Location">
55 My Last Location
56 </combo_item>
57 <combo_item name="Typeregionname" value="&lt;Type region name&gt;">
58 &lt;Type region name&gt;
59 </combo_item>
60 </combo_box>
61 <check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16"
62 hidden="false" initial_value="false" label="Remember password"
63 left_delta="167" mouse_opaque="true" name="remember_check" width="138" />
64 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
65 bottom="74" drop_shadow_visible="true" follows="left|bottom"
66 font="SansSerifSmall" h_pad="0" halign="left" height="20" hidden="false"
67 left="32" mouse_opaque="true" name="full_screen_text" v_pad="0" width="300">
68 Viewer will display full screen when logged in.
69 </text>
70 <button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24"
71 hidden="false" label="New Account..." label_selected="New Account..."
72 left="440" mouse_opaque="true" name="new_account_btn" scale_image="TRUE"
73 width="120" />
74 <button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24"
75 hidden="false" label="Preferences..." label_selected="Preferences..."
76 left="572" mouse_opaque="true" name="preferences_btn" scale_image="TRUE"
77 width="120" />
78 <combo_box allow_text_entry="true" bottom="48" follows="left|bottom" height="18"
79 hidden="false" left_delta="128" max_chars="20" mouse_opaque="true"
80 name="server_combo" width="120" />
81 <button bottom_delta="-28" follows="left|bottom" font="SansSerif" halign="center"
82 height="24" hidden="false" label="Connect" label_selected="Connect"
83 left="440" mouse_opaque="true" name="connect_btn" scale_image="TRUE"
84 width="120" />
85 <button bottom_delta="0" follows="left|bottom" font="SansSerif" halign="center"
86 height="24" hidden="false" label="Quit" label_selected="Quit" left="572"
87 mouse_opaque="true" name="quit_btn" scale_image="TRUE" width="120" />
88 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
89 bottom="2" drop_shadow_visible="true" follows="right|bottom"
90 font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false"
91 left="698" mouse_opaque="true" name="version_text" v_pad="0" width="100">
92 1.23.4 (5)
93 </text>
94 <text bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
95 bottom="14" drop_shadow_visible="true" follows="right|bottom"
96 font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false"
97 left="698" mouse_opaque="true" name="channel_text" v_pad="0" width="300">
98 [Viewer Channel Name]
99 </text> 13 </text>
100</panel> 14</panel>
diff --git a/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml b/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml
index 13d5f81..4a75032 100644
--- a/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml
+++ b/linden/indra/newview/skins/xui/en-us/panel_region_estate.xml
@@ -24,9 +24,9 @@ regions in the estate.
24 (unknown) 24 (unknown)
25 </text> 25 </text>
26 26
27 <view_border bevel_style="in" border="true" border_thickness="1" bottom_delta="-280" follows="top|left" 27 <view_border bevel_style="in" border="true" border_thickness="1" bottom_delta="-265" follows="top|left"
28 height="275" left="6" width="250" /> 28 height="260" left="6" width="250" />
29 <check_box bottom_delta="252" follows="left|top" height="20" label="Use Global Time" 29 <check_box bottom_delta="235" follows="left|top" height="20" label="Use Global Time"
30 left="12" name="use_global_time_check" width="200" /> 30 left="12" name="use_global_time_check" width="200" />
31 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" 31 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
32 right="250" name="use_global_time_help" width="18" /> 32 right="250" name="use_global_time_help" width="18" />
@@ -39,61 +39,42 @@ regions in the estate.
39 <slider bottom_delta="-25" follows="left|top" height="20" increment="0.001" 39 <slider bottom_delta="-25" follows="left|top" height="20" increment="0.001"
40 label="Phase" left="12" max_val="30" min_val="6" name="sun_hour_slider" 40 label="Phase" left="12" max_val="30" min_val="6" name="sun_hour_slider"
41 show_text="false" width="200" /> 41 show_text="false" width="200" />
42 <check_box bottom_delta="-26" follows="left|top" height="20" label="Public Access" 42 <check_box bottom_delta="-26" follows="left|top" height="20" label="Allow Public Access"
43 left="12" name="externally_visible_check" width="200" /> 43 left="12" name="externally_visible_check" width="200" />
44 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" 44 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
45 right="250" name="externally_visible_help" width="18" /> 45 right="250" name="externally_visible_help" width="18" />
46 <text type="string" length="1" bg_visible="false" border_drop_shadow_visible="false" border_visible="false"
47 bottom_delta="-20" drop_shadow_visible="true" enabled="true" follows="top|left"
48 font="SansSerifSmall" h_pad="0" halign="left" height="16" hidden="false"
49 left="32" mouse_opaque="true" name="Only Allow"
50 v_pad="0" width="278">
51 Restrict Access To:
52 </text>
53 <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall"
54 height="16" hidden="false" initial_value="false" label="Residents with payment info on file"
55 left_delta="0" mouse_opaque="true" name="limit_payment" radio_style="false" width="278"
56 tool_tip="Ban unidentified residents."/>
57 <check_box bottom_delta="-20" enabled="true" follows="top|left" font="SansSerifSmall"
58 height="16" hidden="false" initial_value="false" label="Age-verified adults"
59 left_delta="0" mouse_opaque="true" name="limit_age_verified" radio_style="false" width="278"
60 tool_tip="Ban residents who have not verified their age. See support.secondlife.com for more information."/>
61
46 <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Voice Chat" 62 <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Voice Chat"
47 left="12" name="voice_chat_check" width="200" /> 63 left="12" name="voice_chat_check" width="200" />
48 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" 64 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
49 right="250" name="voice_chat_help" width="18" /> 65 right="250" name="voice_chat_help" width="18" />
50 66
51 <!--
52 <check_box name="mainland_visible_check"
53 label="Mainland Visible From Here"
54 left="15"
55 bottom_delta="-20"
56 width="80"
57 height="20"
58 follows="left|top"
59 />
60 <button name="mainland_visible_help"
61 label="?"
62 left="185"
63 bottom_delta="0"
64 width="18"
65 height="18"
66 follows="left|top"
67 font="SansSerifSmall"
68 />
69 -->
70 <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Direct Teleport" left="12" name="allow_direct_teleport" width="80" /> 67 <check_box bottom_delta="-20" follows="left|top" height="20" label="Allow Direct Teleport" left="12" name="allow_direct_teleport" width="80" />
71 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?" 68 <button bottom_delta="0" follows="left|top" font="SansSerifSmall" height="18" label="?"
72 right="250" name="allow_direct_teleport_help" width="18" /> 69 right="250" name="allow_direct_teleport_help" width="18" />
73 <text bottom_delta="-28" follows="left|top" font="SansSerifSmall" height="20" 70 <button bottom_delta="-30" enabled="false" follows="left|top" height="20" label="Apply"
74 left="12" name="region_text_lbl" width="210">
75 Deny Access on Payment Status:
76 </text>
77 <check_box bottom_delta="-16" follows="left|top" height="20"
78 label="Deny No Payment Info On File" left="12" name="deny_anonymous"
79 width="80" />
80 <check_box bottom_delta="-18" follows="left|top" height="20"
81 label="Deny Payment Info On File" left="12" name="deny_identified"
82 width="80" />
83 <check_box bottom_delta="-18" follows="left|top" height="20"
84 label="Deny Payment Info Used" left="12" name="deny_transacted" width="80" />
85 <text bottom_delta="-23" follows="left|top" height="20"
86 left="15" name="abuse_email_text" width="100" visible="false">
87 [Abuse E-mail Beta]
88 </text>
89 <button bottom_delta="-8" enabled="false" follows="left|top" height="20" label="Apply"
90 right="250" name="apply_btn" width="90" /> 71 right="250" name="apply_btn" width="90" />
91 72
92 73
93 <button bottom="-468" enabled="true" follows="left|top" height="20" 74 <button bottom="-468" enabled="true" follows="left|top" height="20"
94 label="Kick User from Estate..." left="8" 75 label="Kick User from Estate..." left="8"
95 name="kick_user_from_estate_btn" width="250" /> 76 name="kick_user_from_estate_btn" width="250" />
96<button bottom_delta="23" follows="left|top" height="20" 77 <button bottom_delta="23" follows="left|top" height="20"
97 label="Send Message To Estate..." left="8" name="message_estate_btn" 78 label="Send Message To Estate..." left="8" name="message_estate_btn"
98 width="250" /> 79 width="250" />
99 80
diff --git a/linden/indra/newview/skins/xui/en-us/teleport_strings.xml b/linden/indra/newview/skins/xui/en-us/teleport_strings.xml
index 80b5cc4..feac150 100644
--- a/linden/indra/newview/skins/xui/en-us/teleport_strings.xml
+++ b/linden/indra/newview/skins/xui/en-us/teleport_strings.xml
@@ -3,53 +3,53 @@
3 <message_set name="errors"> 3 <message_set name="errors">
4 <message name="invalid_tport"> 4 <message name="invalid_tport">
5 Problem encountered processing your teleport request. You may 5 Problem encountered processing your teleport request. You may
6 need to log back in before you can teleport. If you continue 6need to log back in before you can teleport. If you continue
7 to get this message, please check the Tech Support FAQ at: 7to get this message, please check the Tech Support FAQ at:
8 www.secondlife.com/support 8www.secondlife.com/support
9 </message> 9 </message>
10 <message name="invalid_region_handoff"> 10 <message name="invalid_region_handoff">
11 Problem encountered processing your region crossing. You may 11 Problem encountered processing your region crossing. You may
12 need to log back in before you can cross regions. If you continue 12need to log back in before you can cross regions. If you continue
13 to get this message, please check the Tech Support FAQ at: 13to get this message, please check the Tech Support FAQ at:
14 www.secondlife.com/support. 14www.secondlife.com/support.
15 </message> 15 </message>
16 <message name="blocked_tport"> 16 <message name="blocked_tport">
17 Sorry, teleport is currently blocked. Try again in a moment. 17 Sorry, teleport is currently blocked. Try again in a moment.
18 If you still cannot teleport, please log out and log back in to 18If you still cannot teleport, please log out and log back in to
19 resolve the problem. 19resolve the problem.
20 </message> 20 </message>
21 <message name="nolandmark_tport"> 21 <message name="nolandmark_tport">
22 Sorry, but system was unable to locate landmark destination. 22 Sorry, but system was unable to locate landmark destination.
23 </message> 23 </message>
24 <message name="timeout_tport"> 24 <message name="timeout_tport">
25 Sorry, but system was unable to complete the teleport connection. 25 Sorry, but system was unable to complete the teleport connection.
26 Try again in a moment. 26Try again in a moment.
27 </message> 27 </message>
28 <message name="noaccess_tport"> 28 <message name="noaccess_tport">
29 Sorry, you do not have access to that teleport destination. 29 Sorry, you do not have access to that teleport destination.
30 </message> 30 </message>
31 <message name="missing_attach_tport"> 31 <message name="missing_attach_tport">
32 Your attachments have not arrived yet. Try waiting for a few 32 Your attachments have not arrived yet. Try waiting for a few
33 more seconds or log out and back in again before attempting 33more seconds or log out and back in again before attempting
34 to teleport. 34to teleport.
35 </message> 35 </message>
36 <message name="too_many_uploads_tport"> 36 <message name="too_many_uploads_tport">
37 The asset queue in this region is currently clogged so your teleport 37 The asset queue in this region is currently clogged so your teleport
38 request will not be able to succeed in a timely manner. Please try again 38request will not be able to succeed in a timely manner. Please try again
39 in a few minutes or go to a less busy area. 39in a few minutes or go to a less busy area.
40 </message> 40 </message>
41 <message name="expired_tport"> 41 <message name="expired_tport">
42 Sorry, but the system was unable to complete your teleport request 42 Sorry, but the system was unable to complete your teleport request
43 in a timely fashion. Please try again in a few minutes. 43in a timely fashion. Please try again in a few minutes.
44 </message> 44 </message>
45 <message name="expired_region_handoff"> 45 <message name="expired_region_handoff">
46 Sorry, but the system was unable to complete your region crossing 46 Sorry, but the system was unable to complete your region crossing
47 in a timely fashion. Please try again in a few minutes. 47in a timely fashion. Please try again in a few minutes.
48 </message> 48 </message>
49 <message name="no_host"> 49 <message name="no_host">
50 Unable to find teleport destination. The destination may be 50 Unable to find teleport destination. The destination may be
51 temporarily unavailable or no longer exists. Please try again 51temporarily unavailable or no longer exists. Please try again
52 in a few minutes. 52in a few minutes.
53 </message> 53 </message>
54 <message name="no_inventory_host"> 54 <message name="no_inventory_host">
55 The inventory system is currently unavailable. 55 The inventory system is currently unavailable.
diff --git a/linden/indra/newview/skins/xui/es/panel_login.xml b/linden/indra/newview/skins/xui/es/panel_login.xml
index d2e60bd..d1d949b 100644
--- a/linden/indra/newview/skins/xui/es/panel_login.xml
+++ b/linden/indra/newview/skins/xui/es/panel_login.xml
@@ -1,40 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/es/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 Nombre de pila:
8 </text>
9 <text name="last_name_text">
10 Apellido:
11 </text>
12 <text name="password_text">
13 Contraseña:
14 </text>
15 <text name="start_location_text">
16 Local de inicio:
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 Mi casa
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 Mi última posición
24 </combo_item>
25 <combo_item name="&lt;Typeregionname&gt;">
26 &lt;Teclee un nombre de región&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="Recordar contraseña" name="remember_check" />
30 <text name="full_screen_text">
31 Exhibirá en pantalla completa cuando la sesión sea iniciada.
32 </text>
33 <button label="Nueva Cuenta..." label_selected="Nueva Cuenta..." name="new_account_btn" />
34 <button label="Preferencias..." label_selected="Preferencias..." name="preferences_btn" />
35 <button label="Conectar" label_selected="Conectar" name="connect_btn" />
36 <button label="Salir" label_selected="Salir" name="quit_btn" />
37 <text name="version_text">
38 1.23.4 (5)
39 </text> 5 </text>
40</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/fr/panel_login.xml b/linden/indra/newview/skins/xui/fr/panel_login.xml
index c8d237b..40d9268 100644
--- a/linden/indra/newview/skins/xui/fr/panel_login.xml
+++ b/linden/indra/newview/skins/xui/fr/panel_login.xml
@@ -1,42 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/fr/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 Prénom :
8 </text>
9 <text name="last_name_text">
10 Nom :
11 </text>
12 <text name="password_text">
13 Mot de passe :
14 </text>
15 <text name="start_location_text">
16 Lieu d&apos;arrivée :
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 Mon domicile
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 Dernier lieu visité
24 </combo_item>
25 <combo_item name="&lt;Typeregionname&gt;">
26 &lt;Choisir région&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="Mémoriser" name="remember_check" />
30 <text name="full_screen_text">
31 Le plein écran sera activé après identification.
32 </text>
33 <button label="Nouveau Compte..." label_selected="Nouveau Compte..."
34 name="new_account_btn" />
35 <button label="Se connecter" label_selected="Se connecter" name="connect_btn" />
36 <button label="Préférences..." label_selected="Préférences..."
37 name="preferences_btn" />
38 <button label="Quitter" label_selected="Quitter" name="quit_btn" />
39 <text name="version_text">
40 1.23.4 (5)
41 </text> 5 </text>
42</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/ja/LCD_text.xml b/linden/indra/newview/skins/xui/ja/LCD_text.xml
new file mode 100644
index 0000000..534f303
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/LCD_text.xml
@@ -0,0 +1,75 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login">
3 <text name="DebugInfo">
4 デãƒãƒƒã‚°æƒ…å ±
5 </text>
6 <text name="FPS">
7 FPS
8 </text>
9 <text name="SimFPS">
10 シムFPS
11 </text>
12 <text name="Pin">
13 å—ä¿¡
14 </text>
15 <text name="Pout">
16 é€ä¿¡
17 </text>
18 <text name="PLoss">
19 パケットロス
20 </text>
21 <text name="Ping">
22 Ping
23 </text>
24 <text name="AccountDetails">
25 アカウントã®è©³ç´°
26 </text>
27 <text name="LBal">
28 L$残高
29 </text>
30 <text name="Time">
31 時間
32 </text>
33 <text name="LocationDetails1">
34 所在地ã®è©³ç´° 1
35 </text>
36 <text name="LocationDetails2">
37 所在地ã®è©³ç´° 2
38 </text>
39 <text name="Region">
40 地域
41 </text>
42 <text name="Parcel">
43 区画
44 </text>
45 <text name="Pos">
46 ポジショï¾
47 </text>
48 <text name="Sqm">
49 平方ã
50 </text>
51 <text name="Owner">
52 所有者
53 </text>
54 <text name="Type">
55 タイプ
56 </text>
57 <text name="Yes">
58 ã¯ã„
59 </text>
60 <text name="No">
61 ã„ã„ãˆ
62 </text>
63 <text name="Forsale">
64 売出中
65 </text>
66 <text name="Traffic">
67 交通é‡
68 </text>
69 <text name="Last3ChatLines">
70 ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆå…ˆ3ä»¶
71 </text>
72 <text name="Last3IMLines">
73 ç›´è¿‘ã®IMå…ˆ3ä»¶
74 </text>
75</panel>
diff --git a/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml
new file mode 100644
index 0000000..46107e7
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/floater_landmark_ctrl.xml
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="landmarkpicker" title="æ•´ç†ï¼šãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
3 <check_box label="フォルダーを表示" name="show_folders_check" />
4 <button label="æ–°è¦" label_selected="æ–°è¦" name="New" />
5 <button label="åå‰ã‚’ã¤ã‘ãªãŠã™" label_selected="åå‰ã‚’ã¤ã‘ãªãŠã™"
6 name="Rename" />
7 <button label="æ–°ã—ã„フォルダー" label_selected="æ–°ã—ã„フォルダー"
8 name="NewFolder" />
9 <button label="編集" label_selected="編集" name="Edit" />
10 <button label="削除" label_selected="削除" name="Delete" />
11 <button label="é–‰ã˜ã‚‹" label_selected="é–‰ã˜ã‚‹" name="Close" />
12</floater>
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml b/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml
new file mode 100644
index 0000000..c820fbf
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/floater_preview_classified.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="classified_preview" />
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_event.xml b/linden/indra/newview/skins/xui/ja/floater_preview_event.xml
new file mode 100644
index 0000000..732e1fe
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/floater_preview_event.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="event_preview" />
diff --git a/linden/indra/newview/skins/xui/ja/floater_preview_url.xml b/linden/indra/newview/skins/xui/ja/floater_preview_url.xml
new file mode 100644
index 0000000..fd6486c
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/floater_preview_url.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="url_preview" />
diff --git a/linden/indra/newview/skins/xui/ja/menu_slurl.xml b/linden/indra/newview/skins/xui/ja/menu_slurl.xml
new file mode 100644
index 0000000..5007773
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/menu_slurl.xml
@@ -0,0 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<menu name="Popup">
3 <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url" />
4 <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url" />
5 <menu_item_call label="地図上ã«è¡¨ç¤º" name="show_on_map" />
6</menu>
diff --git a/linden/indra/newview/skins/xui/ja/need_to_long.xml b/linden/indra/newview/skins/xui/ja/need_to_long.xml
new file mode 100644
index 0000000..8cb33a9
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/need_to_long.xml
@@ -0,0 +1,85 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:59:53Z</Created>
11 <LastSaved>2007-11-21T00:59:53Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-1020</WindowTopX>
18 <WindowTopY>2280</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_long2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="409.5">
65 <Cell><Data ss:Type="String">floater_about.xml</Data></Cell>
66 <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
69 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ã¯ã€Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚&#10;&#10;ã¾ãŸã€Jesse Malthus を記念ã—ã¦ä¸€è¨€ã€‚ã‚ãªãŸã®å£°ã¨ä¸€ç·’ã«ä»•事をã—ãŸå…¨ã¦ã®äººãŒã€ã‚ãªãŸã®ç´ æ™´ã‚‰ã—ã•を忘れるã“ã¨ã¯ãªã„ã§ã—ょã†ã€‚&#10;&#10;ã“れãŒã€ç¾åœ¨ã®æœ€é«˜ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€æ”¯æ´ã—ã¦ãã‚ŒãŸæ¬¡ã®å±…ä½è€…ã®æ–¹ã€…ã«åŽšãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved.詳細㯠licenses.txt ã‚’ã”覧ãã ã•ã„。&#10;&#10;Voice chat Audio coding:Polycom(R) Siren14(TM) (ITU-T Rec.G.722.1 Annex C)&#10;&#10;&#10;ワトソンã•ã‚“ &#45;- ãœã²æ¥ã¦ãã ã•ㄠ– 会ã„ãŸã„よ。</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ã¯ã€Philipã€Andrewã€Tessaã€Coryã€Frankã€Jamesã€Dougã€Hunterã€Richardã€Johnã€Ericã€Aviã€AaronBã€AaronYã€Ianã€Peterã€Markã€Robinã€Stephenã€Tracyã€Ryanã€Albertoã€Haneyã€Tanyaã€JimJã€Danã€Benã€Stephanieã€Timã€Evanã€Catherineã€Colinã€Chrisã€Reubenã€Charityã€Jeskaã€Jamesã€JonHenryã€Kellyã€Callumã€Charã€Danielã€DavidFã€Donã€Jeffã€Laurenã€Leeã€Michaelã€Ramziã€Vektorã€Steveã€TomYã€Tessã€Konaã€Brentã€Clarissaã€PeterPã€Jesseã€Annetteã€Cynã€Blueã€Ginsuã€Jonathanã€Karenã€Adamã€Novaã€Deanaã€Lizzieã€Patsyã€DavidKã€Isaacã€Pathfinderã€Monroeã€Jillã€Bennyã€Altruimaã€Rheyaã€Jenniferã€Jackã€DavePã€Bradã€Mickã€Babbageã€Elisabethã€Brianã€Bethã€Dataã€Ethanã€Wendyã€Nicoleã€Skyã€Jeffreyã€Zeroã€Coffeeã€Teslaã€Kennyã€Makikoã€Nigelã€Teepleã€Lucyã€Miaã€Deeã€Guyã€Harryã€Lianaã€Brankaã€Jimboã€Auraã€Vasudaã€SarahDã€bethanyeã€Torleyã€Runitaiã€MikeSã€PaulMã€Miloã€Hermiaã€JoeMã€Melanieã€Rejeanã€DSmithã€SMillerã€Susanã€Joseã€DongYunã€Justinã€Andreyã€Syrahã€Donovanã€Henrikã€Noraã€Lexieã€ACã€Donnaã€ChrisCã€Alexã€Leylaã€Kyleã€Mathewã€Devinã€Joshuaã€DanCã€Jessicaã€Harmonyã€Claudiaã€Tramelã€Glennã€Betsyã€Fritzã€Junã€Adamã€Cassandraã€Kenã€RyanWã€Spikeã€Tofuã€Varasã€Andyã€Lukeã€RobLaã€Chiyoã€JohnZã€Dustinã€Georgeã€Delã€PeterPã€Migyeongã€Matthewã€RMullaneã€CChampionã€JTurbinã€JamesCã€Violaã€Lightfootã€Jacquiã€Sturmã€Adrianã€Buttercupã€Alfredã€Sunilã€Alfredã€Noelã€Irfanã€Jillã€Yoolã€Janeã€Yukiã€Yozã€Matthewã€Arthurã€Jenniferã€Karlã€Brianã€Benã€Janineã€Christopherã€Madhaviã€Everettã€Anthonyã€Joonã€Jakeã€seanã€Adreanneã€Stephanyã€KellyJoã€Jeremyã€Pramodã€Joshuaã€Seanã€Christopherã€Amyã€Cerenã€Katherineã€jonã€Sudheendraã€Jamesã€Stephanã€Kariã€Karticã€Toddã€Thomasã€Jokiã€Rebeccaã€Belindaã€Bertã€Rogerã€Bridieã€Kristiã€Brianã€Mariaã€Johnã€Aricã€Nathanelã€Melindaã€Darrellã€Jenniferã€Sandyã€Gregã€Robã€Bradã€Chrisã€Ericã€Palmerã€Asiã€Katjaã€Lisaã€Mindaã€Jenã€Aaronã€Bryanã€Markã€Jonathanã€Jamieã€Laurelã€Williamã€Matthewã€Steveã€Davidã€Remyã€Jamesã€Timã€Leeã€Brianã€Ashleiã€Samã€Mikeã€Ethanã€Austinã€Wandaã€Paulã€Brianã€Rachelã€Valentynã€Emma Williamsã€Autumã€Stevenã€Laleyã€Charlesã€Jessicaã€Sueã€Gillianã€CGã€Kipã€Kristenã€Shamiranã€Blakeã€Brettã€Ericaã€Kentã€Joelã€Plexusã€Twilightã€Joppa ã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚&#10;&#10;åœ¨ã‚Šã—æ—¥ã® Jesse Malthus ã‚’å²ã‚“ã§ä¸€è¨€ã€‚ã‚ãªãŸã¨å‡ºä¼šã£ãŸå…¨ã¦ã®äººãŒã€ã‚ãªãŸã®ç´ æ™´ã‚‰ã—ã•を忘れるã“ã¨ã¯ãªã„ã§ã—ょã†ã€‚&#10;&#10;ç¾åœ¨ã®æœ€é«˜ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã‚ã‚‹ã“ã¨ã‚’ä¿è¨¼ã™ã‚‹ãŸã‚ã«ã€æ”¯æ´ã—ã¦ãれãŸä½äººã®ã¿ãªã•ã‚“ã«åŽšãæ„Ÿè¬ã„ãŸã—ã¾ã™ã€‚Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved.詳細㯠licenses.txt ã‚’ã”覧ãã ã•ã„。&#10;&#10;Voice chat Audio coding:Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;ワトソンå›ã€ã¡ã‚‡ã£ã¨æ¥ã¦ãれãŸã¾ãˆã€‚</Data></Cell>
71 </Row>
72 </Table>
73 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
74 <Selected/>
75 <Panes>
76 <Pane>
77 <Number>3</Number>
78 <ActiveRow>2</ActiveRow>
79 </Pane>
80 </Panes>
81 <ProtectObjects>False</ProtectObjects>
82 <ProtectScenarios>False</ProtectScenarios>
83 </WorksheetOptions>
84 </Worksheet>
85</Workbook>
diff --git a/linden/indra/newview/skins/xui/ja/need_to_translate.xml b/linden/indra/newview/skins/xui/ja/need_to_translate.xml
new file mode 100644
index 0000000..75eceb5
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/need_to_translate.xml
@@ -0,0 +1,1059 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:54:56Z</Created>
11 <LastSaved>2007-11-21T00:54:56Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-1380</WindowTopX>
18 <WindowTopY>330</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 </Styles>
39 <Worksheet ss:Name="need_to_translate2">
40 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="155" x:FullColumns="1"
41 x:FullRows="1">
42 <Column ss:Width="63.75"/>
43 <Column ss:Width="70.5"/>
44 <Column ss:Width="88.5"/>
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="69.75"/>
47 <Column ss:Width="90.75"/>
48 <Column ss:Width="97.5"/>
49 <Row>
50 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
51 </Row>
52 <Row>
53 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
54 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
55 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
60 </Row>
61 <Row>
62 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
63 <Cell><Data ss:Type="String">//skipnexttime</Data></Cell>
64 <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell>
65 <Cell ss:Index="7"><Data ss:Type="String">今後ã¯è¡¨ç¤ºã—ãªã„</Data></Cell>
66 </Row>
67 <Row>
68 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
69 <Cell><Data ss:Type="String">//alwayschoose</Data></Cell>
70 <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell>
71 <Cell ss:Index="7"><Data ss:Type="String">常ã«ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠž</Data></Cell>
72 </Row>
73 <Row>
74 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
75 <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell>
76 <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell>
77 <Cell ss:Index="7"><Data ss:Type="String">本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹?</Data></Cell>
78 </Row>
79 <Row>
80 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
81 <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell>
82 <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell>
83 <Cell ss:Index="7"><Data ss:Type="String">æŒã¡ç‰©ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹æ™‚</Data></Cell>
84 </Row>
85 <Row>
86 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
87 <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell>
88 <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell>
89 <Cell ss:Index="7"><Data ss:Type="String">テレãƒãƒ¼ãƒˆ</Data></Cell>
90 </Row>
91 <Row>
92 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
93 <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell>
94 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
95 <Cell ss:Index="7"><Data ss:Type="String">キャンセル</Data></Cell>
96 </Row>
97 <Row>
98 <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell>
99 <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell>
100 <Cell><Data ss:Type="String">label</Data></Cell>
101 </Row>
102 <Row>
103 <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell>
104 <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell>
105 <Cell><Data ss:Type="String">title</Data></Cell>
106 <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell>
107 <Cell ss:Index="7"><Data ss:Type="String">コミュニケーション</Data></Cell>
108 </Row>
109 <Row>
110 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
111 <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell>
112 <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell>
113 <Cell ss:Index="7"><Data ss:Type="String">インワールドボイスãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ï¼Žï¼Žï¼Ž</Data></Cell>
114 </Row>
115 <Row>
116 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
117 <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell>
118 <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell>
119 <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸ</Data></Cell>
120 </Row>
121 <Row>
122 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
123 <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell>
124 <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell>
125 <Cell ss:Index="7"><Data ss:Type="String">インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•れã¾ã—ãŸ</Data></Cell>
126 </Row>
127 <Row>
128 <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell>
129 <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell>
130 <Cell><Data ss:Type="String">title</Data></Cell>
131 <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell>
132 <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨­å®š</Data></Cell>
133 </Row>
134 <Row>
135 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
136 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell>
137 <Cell><Data ss:Type="String">label</Data></Cell>
138 <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell>
139 <Cell ss:Index="7"><Data ss:Type="String">å…¨ã¦</Data></Cell>
140 </Row>
141 <Row>
142 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
143 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell>
144 <Cell><Data ss:Type="String">label</Data></Cell>
145 <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell>
146 <Cell ss:Index="7"><Data ss:Type="String">戻る</Data></Cell>
147 </Row>
148 <Row>
149 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
150 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell>
151 <Cell><Data ss:Type="String">label</Data></Cell>
152 <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell>
153 <Cell ss:Index="7"><Data ss:Type="String">進む</Data></Cell>
154 </Row>
155 <Row>
156 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
157 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
158 <Cell><Data ss:Type="String">label</Data></Cell>
159 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
160 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
165 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
166 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
167 <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell>
168 </Row>
169 <Row>
170 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
171 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell>
172 <Cell><Data ss:Type="String">label</Data></Cell>
173 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
174 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
175 </Row>
176 <Row>
177 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
178 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell>
179 <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell>
180 <Cell ss:Index="7"><Data ss:Type="String">全カテゴリー</Data></Cell>
181 </Row>
182 <Row>
183 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
184 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell>
185 <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell>
186 <Cell ss:Index="7"><Data ss:Type="String">クラシファイド広告</Data></Cell>
187 </Row>
188 <Row>
189 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
190 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell>
191 <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell>
192 <Cell ss:Index="7"><Data ss:Type="String">イベント</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell>
197 <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell>
198 <Cell ss:Index="7"><Data ss:Type="String">グループ</Data></Cell>
199 </Row>
200 <Row>
201 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
202 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell>
203 <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell>
204 <Cell ss:Index="7"><Data ss:Type="String">人々</Data></Cell>
205 </Row>
206 <Row>
207 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
208 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell>
209 <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell>
210 <Cell ss:Index="7"><Data ss:Type="String">場所</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell>
215 <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell>
216 <Cell ss:Index="7"><Data ss:Type="String">Wiki</Data></Cell>
217 </Row>
218 <Row>
219 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
220 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell>
221 <Cell><Data ss:Type="String">label</Data></Cell>
222 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
223 <Cell ss:Index="7"><Data ss:Type="String">æˆäººå‘ã‘コンテンツをå«ã‚€</Data></Cell>
224 </Row>
225 <Row>
226 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
227 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell>
228 <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell>
229 <Cell ss:Index="7"><Data ss:Type="String">ローディング中...</Data></Cell>
230 </Row>
231 <Row>
232 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
233 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell>
234 <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell>
235 <Cell ss:Index="7"><Data ss:Type="String">完了</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell>
242 <Cell ss:Index="7"><Data ss:Type="String">å…¨(æ—§)</Data></Cell>
243 </Row>
244 <Row>
245 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
246 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
247 <Cell><Data ss:Type="String">label</Data></Cell>
248 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
249 <Cell ss:Index="7"><Data ss:Type="String"><戻る</Data></Cell>
250 </Row>
251 <Row>
252 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
253 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
254 <Cell><Data ss:Type="String">label_selected</Data></Cell>
255 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
256 <Cell ss:Index="7"><Data ss:Type="String"><戻る</Data></Cell>
257 </Row>
258 <Row>
259 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
260 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
261 <Cell><Data ss:Type="String">label</Data></Cell>
262 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
263 <Cell ss:Index="7"><Data ss:Type="String">次ã¸ï¼ž</Data></Cell>
264 </Row>
265 <Row>
266 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
267 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
268 <Cell><Data ss:Type="String">label_selected</Data></Cell>
269 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
270 <Cell ss:Index="7"><Data ss:Type="String">次ã¸ï¼ž</Data></Cell>
271 </Row>
272 <Row>
273 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
274 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell>
275 <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell>
276 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
277 </Row>
278 <Row>
279 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
280 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
281 <Cell><Data ss:Type="String">label</Data></Cell>
282 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
283 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
284 </Row>
285 <Row>
286 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
287 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
288 <Cell><Data ss:Type="String">label_selected</Data></Cell>
289 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
290 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
291 </Row>
292 <Row>
293 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
294 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell>
295 <Cell><Data ss:Type="String">label</Data></Cell>
296 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
297 <Cell ss:Index="7"><Data ss:Type="String">æˆäººå‘ã‘コンテンツをå«ã‚€</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell>
302 <Cell><Data ss:Type="String">label</Data></Cell>
303 </Row>
304 <Row>
305 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
306 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell>
307 <Cell><Data ss:Type="String">label</Data></Cell>
308 <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell>
309 <Cell ss:Index="7"><Data ss:Type="String">åå‰</Data></Cell>
310 </Row>
311 <Row>
312 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
313 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell>
314 <Cell><Data ss:Type="String">label</Data></Cell>
315 <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell>
316 <Cell ss:Index="7"><Data ss:Type="String">価格</Data></Cell>
317 </Row>
318 <Row>
319 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
320 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell>
321 <Cell><Data ss:Type="String">label</Data></Cell>
322 <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell>
323 <Cell ss:Index="7"><Data ss:Type="String">時間(太平洋時間)</Data></Cell>
324 </Row>
325 <Row>
326 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
327 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell>
328 <Cell><Data ss:Type="String">label</Data></Cell>
329 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
330 <Cell ss:Index="7"><Data ss:Type="String">時間</Data></Cell>
331 </Row>
332 <Row>
333 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
334 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell>
335 <Cell><Data ss:Type="String">label</Data></Cell>
336 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
337 <Cell ss:Index="7"><Data ss:Type="String">交通é‡</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell>
342 <Cell><Data ss:Type="String">label</Data></Cell>
343 <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell>
344 <Cell ss:Index="7"><Data ss:Type="String">é¢ç©</Data></Cell>
345 </Row>
346 <Row>
347 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
348 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell>
349 <Cell><Data ss:Type="String">label</Data></Cell>
350 <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell>
351 <Cell ss:Index="7"><Data ss:Type="String">L$ï¼å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«</Data></Cell>
352 </Row>
353 <Row>
354 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
355 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell>
356 <Cell><Data ss:Type="String">label</Data></Cell>
357 <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell>
358 <Cell ss:Index="7"><Data ss:Type="String">オンライン</Data></Cell>
359 </Row>
360 <Row>
361 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
362 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell>
363 <Cell><Data ss:Type="String">label</Data></Cell>
364 <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell>
365 <Cell ss:Index="7"><Data ss:Type="String">メンãƒãƒ¼</Data></Cell>
366 </Row>
367 <Row>
368 <Cell><Data ss:Type="String">floater_groups.xml</Data></Cell>
369 <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell>
370 <Cell><Data ss:Type="String">label</Data></Cell>
371 </Row>
372 <Row>
373 <Cell><Data ss:Type="String">floater_im.xml</Data></Cell>
374 <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell>
375 <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell>
376 <Cell ss:Index="7"><Data ss:Type="String">ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。</Data></Cell>
377 </Row>
378 <Row>
379 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
380 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
381 <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell>
382 <Cell ss:Index="7"><Data ss:Type="String">ã‹ã‘ã¦ã„ã¾ã™Âc</Data></Cell>
383 </Row>
384 <Row>
385 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
386 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
387 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
388 <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell>
389 </Row>
390 <Row>
391 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
392 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
393 <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell>
394 <Cell ss:Index="7"><Data ss:Type="String">通話ãŒçµ‚了ã—ã¾ã—ãŸ</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
399 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
400 <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ï¼Žï¼Žï¼Ž</Data></Cell>
401 </Row>
402 <Row>
403 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
404 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
405 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
406 <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell>
407 </Row>
408 <Row>
409 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
410 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
411 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
412 <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã‹ã‚‰é€€å¸­ã—ã¾ã—ãŸ</Data></Cell>
413 </Row>
414 <Row>
415 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
416 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
417 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
418 <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã™ï¼Žï¼Žï¼Ž</Data></Cell>
419 </Row>
420 <Row>
421 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
422 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
423 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
424 <Cell ss:Index="7"><Data ss:Type="String">接続ã—ã¾ã—ãŸã€é€šè©±ã‚’終了ã™ã‚‹å ´åˆã¯ã€Œé€šè©±ã®çµ‚了ã€ã‚’クリックã—ã¦ãã ã•ã„。</Data></Cell>
425 </Row>
426 <Row>
427 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
428 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
429 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
430 <Cell ss:Index="7"><Data ss:Type="String">ボイスãƒãƒ£ãƒƒãƒˆã‹ã‚‰é€€å¸­ã—ã¾ã—ãŸ</Data></Cell>
431 </Row>
432 <Row>
433 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
434 <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell>
435 <Cell><Data ss:Type="String">title</Data></Cell>
436 <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell>
437 <Cell ss:Index="7"><Data ss:Type="String">æ•´ç†ï¼šãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯</Data></Cell>
438 </Row>
439 <Row>
440 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
441 <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell>
442 <Cell><Data ss:Type="String">label</Data></Cell>
443 <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell>
444 <Cell ss:Index="7"><Data ss:Type="String">フォルダーを表示</Data></Cell>
445 </Row>
446 <Row>
447 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
448 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
449 <Cell><Data ss:Type="String">label</Data></Cell>
450 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
451 <Cell ss:Index="7"><Data ss:Type="String">æ–°è¦</Data></Cell>
452 </Row>
453 <Row>
454 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
455 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
456 <Cell><Data ss:Type="String">label_selected</Data></Cell>
457 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
458 <Cell ss:Index="7"><Data ss:Type="String">æ–°è¦</Data></Cell>
459 </Row>
460 <Row>
461 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
462 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
463 <Cell><Data ss:Type="String">label</Data></Cell>
464 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
465 <Cell ss:Index="7"><Data ss:Type="String">åå‰ã‚’ã¤ã‘ãªãŠã™</Data></Cell>
466 </Row>
467 <Row>
468 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
469 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
470 <Cell><Data ss:Type="String">label_selected</Data></Cell>
471 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
472 <Cell ss:Index="7"><Data ss:Type="String">åå‰ã‚’ã¤ã‘ãªãŠã™</Data></Cell>
473 </Row>
474 <Row>
475 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
476 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
477 <Cell><Data ss:Type="String">label</Data></Cell>
478 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
479 <Cell ss:Index="7"><Data ss:Type="String">æ–°ã—ã„フォルダー</Data></Cell>
480 </Row>
481 <Row>
482 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
483 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
484 <Cell><Data ss:Type="String">label_selected</Data></Cell>
485 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
486 <Cell ss:Index="7"><Data ss:Type="String">æ–°ã—ã„フォルダー</Data></Cell>
487 </Row>
488 <Row>
489 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
490 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
491 <Cell><Data ss:Type="String">label</Data></Cell>
492 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
493 <Cell ss:Index="7"><Data ss:Type="String">編集</Data></Cell>
494 </Row>
495 <Row>
496 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
497 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
498 <Cell><Data ss:Type="String">label_selected</Data></Cell>
499 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
500 <Cell ss:Index="7"><Data ss:Type="String">編集</Data></Cell>
501 </Row>
502 <Row>
503 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
504 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
505 <Cell><Data ss:Type="String">label</Data></Cell>
506 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
507 <Cell ss:Index="7"><Data ss:Type="String">削除</Data></Cell>
508 </Row>
509 <Row>
510 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
511 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
512 <Cell><Data ss:Type="String">label_selected</Data></Cell>
513 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
514 <Cell ss:Index="7"><Data ss:Type="String">削除</Data></Cell>
515 </Row>
516 <Row>
517 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
518 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
519 <Cell><Data ss:Type="String">label</Data></Cell>
520 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
521 <Cell ss:Index="7"><Data ss:Type="String">é–‰ã˜ã‚‹</Data></Cell>
522 </Row>
523 <Row>
524 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
525 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
526 <Cell><Data ss:Type="String">label_selected</Data></Cell>
527 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
528 <Cell ss:Index="7"><Data ss:Type="String">é–‰ã˜ã‚‹</Data></Cell>
529 </Row>
530 <Row>
531 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
532 <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell>
533 <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
534 <Cell ss:Index="7"><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
535 </Row>
536 <Row>
537 <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell>
538 <Cell><Data ss:Type="String">/classified_preview</Data></Cell>
539 <Cell><Data ss:Type="String">title</Data></Cell>
540 <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell>
541 <Cell ss:Index="7"><Data ss:Type="String">クラシファイド広告情報</Data></Cell>
542 </Row>
543 <Row>
544 <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell>
545 <Cell><Data ss:Type="String">/event_preview</Data></Cell>
546 <Cell><Data ss:Type="String">title</Data></Cell>
547 <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell>
548 <Cell ss:Index="7"><Data ss:Type="String">イベント情報</Data></Cell>
549 </Row>
550 <Row>
551 <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell>
552 <Cell><Data ss:Type="String">/url_preview</Data></Cell>
553 <Cell><Data ss:Type="String">title</Data></Cell>
554 <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell>
555 <Cell ss:Index="7"><Data ss:Type="String">å ´æ‰€ã®æƒ…å ±</Data></Cell>
556 </Row>
557 <Row>
558 <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell>
559 <Cell><Data ss:Type="String">/modal container</Data></Cell>
560 <Cell><Data ss:Type="String">title</Data></Cell>
561 </Row>
562 <Row>
563 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
564 <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell>
565 <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell>
566 <Cell ss:Index="7"><Data ss:Type="String">デãƒãƒƒã‚°æƒ…å ±</Data></Cell>
567 </Row>
568 <Row>
569 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
570 <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell>
571 <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell>
572 <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell>
573 </Row>
574 <Row>
575 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
576 <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell>
577 <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell>
578 <Cell ss:Index="7"><Data ss:Type="String">シムFPS</Data></Cell>
579 </Row>
580 <Row>
581 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
582 <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell>
583 <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell>
584 <Cell ss:Index="7"><Data ss:Type="String">å—ä¿¡</Data></Cell>
585 </Row>
586 <Row>
587 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
588 <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell>
589 <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell>
590 <Cell ss:Index="7"><Data ss:Type="String">é€ä¿¡</Data></Cell>
591 </Row>
592 <Row>
593 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
594 <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell>
595 <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell>
596 <Cell ss:Index="7"><Data ss:Type="String">パケットロス</Data></Cell>
597 </Row>
598 <Row>
599 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
600 <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell>
601 <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell>
602 <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell>
603 </Row>
604 <Row>
605 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
606 <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell>
607 <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell>
608 <Cell ss:Index="7"><Data ss:Type="String">アカウントã®è©³ç´°</Data></Cell>
609 </Row>
610 <Row>
611 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
612 <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell>
613 <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell>
614 <Cell ss:Index="7"><Data ss:Type="String">L$残高</Data></Cell>
615 </Row>
616 <Row>
617 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
618 <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell>
619 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
620 <Cell ss:Index="7"><Data ss:Type="String">時間</Data></Cell>
621 </Row>
622 <Row>
623 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
624 <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell>
625 <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell>
626 <Cell ss:Index="7"><Data ss:Type="String">所在地ã®è©³ç´° 1</Data></Cell>
627 </Row>
628 <Row>
629 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
630 <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell>
631 <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell>
632 <Cell ss:Index="7"><Data ss:Type="String">所在地ã®è©³ç´° 2</Data></Cell>
633 </Row>
634 <Row>
635 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
636 <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell>
637 <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell>
638 <Cell ss:Index="7"><Data ss:Type="String">地域</Data></Cell>
639 </Row>
640 <Row>
641 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
642 <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell>
643 <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell>
644 <Cell ss:Index="7"><Data ss:Type="String">区画</Data></Cell>
645 </Row>
646 <Row>
647 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
648 <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell>
649 <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell>
650 <Cell ss:Index="7"><Data ss:Type="String">ポジショï¾</Data></Cell>
651 </Row>
652 <Row>
653 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
654 <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell>
655 <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell>
656 <Cell ss:Index="7"><Data ss:Type="String">平方ã</Data></Cell>
657 </Row>
658 <Row>
659 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
660 <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell>
661 <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell>
662 <Cell ss:Index="7"><Data ss:Type="String">所有者</Data></Cell>
663 </Row>
664 <Row>
665 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
666 <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell>
667 <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell>
668 <Cell ss:Index="7"><Data ss:Type="String">タイプ</Data></Cell>
669 </Row>
670 <Row>
671 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
672 <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell>
673 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
674 <Cell ss:Index="7"><Data ss:Type="String">ã¯ã„</Data></Cell>
675 </Row>
676 <Row>
677 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
678 <Cell><Data ss:Type="String">/panel_login/No</Data></Cell>
679 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
680 <Cell ss:Index="7"><Data ss:Type="String">ã„ã„ãˆ</Data></Cell>
681 </Row>
682 <Row>
683 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
684 <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell>
685 <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell>
686 <Cell ss:Index="7"><Data ss:Type="String">売出中</Data></Cell>
687 </Row>
688 <Row>
689 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
690 <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell>
691 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
692 <Cell ss:Index="7"><Data ss:Type="String">交通é‡</Data></Cell>
693 </Row>
694 <Row>
695 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
696 <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell>
697 <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell>
698 <Cell ss:Index="7"><Data ss:Type="String">ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆå…ˆ3ä»¶</Data></Cell>
699 </Row>
700 <Row>
701 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
702 <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell>
703 <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell>
704 <Cell ss:Index="7"><Data ss:Type="String">ç›´è¿‘ã®IMå…ˆ3ä»¶</Data></Cell>
705 </Row>
706 <Row>
707 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
708 <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell>
709 <Cell><Data ss:Type="String">label</Data></Cell>
710 <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell>
711 <Cell ss:Index="7"><Data ss:Type="String">URLã«ã¤ã„ã¦</Data></Cell>
712 </Row>
713 <Row>
714 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
715 <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell>
716 <Cell><Data ss:Type="String">label</Data></Cell>
717 <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell>
718 <Cell ss:Index="7"><Data ss:Type="String">URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹</Data></Cell>
719 </Row>
720 <Row>
721 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
722 <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell>
723 <Cell><Data ss:Type="String">label</Data></Cell>
724 <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell>
725 <Cell ss:Index="7"><Data ss:Type="String">地図上ã«è¡¨ç¤º</Data></Cell>
726 </Row>
727 <Row>
728 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
729 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell>
730 <Cell><Data ss:Type="String">label</Data></Cell>
731 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell>
732 <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š</Data></Cell>
733 </Row>
734 <Row>
735 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
736 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell>
737 <Cell><Data ss:Type="String">label</Data></Cell>
738 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell>
739 <Cell ss:Index="7"><Data ss:Type="String">パブリックå•題トラッカー...</Data></Cell>
740 </Row>
741 <Row>
742 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
743 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell>
744 <Cell><Data ss:Type="String">label</Data></Cell>
745 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell>
746 <Cell ss:Index="7"><Data ss:Type="String">パブリックå•題トラッカー ヘルプ...</Data></Cell>
747 </Row>
748 <Row>
749 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
750 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
751 <Cell><Data ss:Type="String">label</Data></Cell>
752 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
753 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
754 </Row>
755 <Row>
756 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
757 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell>
758 <Cell><Data ss:Type="String">label</Data></Cell>
759 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell>
760 <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š 101...</Data></Cell>
761 </Row>
762 <Row>
763 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
764 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell>
765 <Cell><Data ss:Type="String">label</Data></Cell>
766 <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell>
767 <Cell ss:Index="7"><Data ss:Type="String">セキュリティå•題...</Data></Cell>
768 </Row>
769 <Row>
770 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
771 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell>
772 <Cell><Data ss:Type="String">label</Data></Cell>
773 <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell>
774 <Cell ss:Index="7"><Data ss:Type="String">QA Wiki...</Data></Cell>
775 </Row>
776 <Row>
777 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
778 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
779 <Cell><Data ss:Type="String">label</Data></Cell>
780 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
781 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
782 </Row>
783 <Row>
784 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
785 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell>
786 <Cell><Data ss:Type="String">label</Data></Cell>
787 <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell>
788 <Cell ss:Index="7"><Data ss:Type="String">ãƒã‚°ã®å ±å‘Š...</Data></Cell>
789 </Row>
790 <Row>
791 <Cell><Data ss:Type="String">notify.xml</Data></Cell>
792 <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell>
793 <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell>
794 <Cell ss:Index="7"><Data ss:Type="String">[VOICE_CHANNEL_NAME]ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。空間ボイスãƒãƒ£ãƒƒãƒˆã«å†æŽ¥ç¶šã•れã¾ã™ã€‚</Data></Cell>
795 </Row>
796 <Row>
797 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
798 <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell>
799 <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell>
800 <Cell ss:Index="7"><Data ss:Type="String">アップデート</Data></Cell>
801 </Row>
802 <Row>
803 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
804 <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell>
805 <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell>
806 <Cell ss:Index="7"><Data ss:Type="String">公開...</Data></Cell>
807 </Row>
808 <Row>
809 <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell>
810 <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell>
811 <Cell><Data ss:Type="String">label</Data></Cell>
812 </Row>
813 <Row>
814 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
815 <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell>
816 <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell>
817 <Cell ss:Index="7"><Data ss:Type="String">グループ設定ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚</Data></Cell>
818 </Row>
819 <Row>
820 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
821 <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell>
822 <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell>
823 <Cell ss:Index="7"><Data ss:Type="String">土地ã®å‡ºè³‡è¨­å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚</Data></Cell>
824 </Row>
825 <Row>
826 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
827 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
828 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
829 <Cell ss:Index="7"><Data ss:Type="String">土地情報ã®ã”利用ã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚</Data></Cell>
830 </Row>
831 <Row>
832 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
833 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
834 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
835 <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。</Data></Cell>
836 </Row>
837 <Row>
838 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
839 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
840 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
841 <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚利用ã§ãã¾ã›ã‚“。区画所有者ã®è¨±å¯ãŒã‚ã‚‹ã‹ã©ã†ã‹ã”確èªãã ã•ã„。</Data></Cell>
842 </Row>
843 <Row>
844 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
845 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
846 <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
847 <Cell ss:Index="7"><Data ss:Type="String">交通é‡ï¼š [TRAFFIC]</Data></Cell>
848 </Row>
849 <Row>
850 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
851 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
852 <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
853 <Cell ss:Index="7"><Data ss:Type="String">é¢ç©ï¼šï¼»AREA]平方メートル</Data></Cell>
854 </Row>
855 <Row>
856 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
857 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
858 <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
859 <Cell ss:Index="7"><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—中</Data></Cell>
860 </Row>
861 <Row>
862 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
863 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
864 <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
865 <Cell ss:Index="7"><Data ss:Type="String">オークションID [ID]。</Data></Cell>
866 </Row>
867 <Row>
868 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
869 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
870 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
871 <Cell ss:Index="7"><Data ss:Type="String">土地情報ã®ã”利用ã«ã¯ã€ã‚µãƒ¼ãƒãƒ¼ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚</Data></Cell>
872 </Row>
873 <Row>
874 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
875 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
876 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
877 <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ãŒç¾åœ¨ã”利用ã§ãã¾ã›ã‚“。時間をãŠã„ã¦ã€å†åº¦ã€è©¦ã¿ã¦ãã ã•ã„。</Data></Cell>
878 </Row>
879 <Row>
880 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
881 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
882 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
883 <Cell ss:Index="7"><Data ss:Type="String">ç¾åœ¨ã®æ‰€åœ¨åœ°ã«ã¤ã„ã¦ã®æƒ…å ±ã¯ã€ã‚¢ã‚¯ã‚»ã‚¹åˆ¶é™ã®ãŸã‚ã”利用ã§ãã¾ã›ã‚“。区画所有者ã®è¨±å¯ãŒã‚ã‚‹ã‹ã©ã†ã‹ã”確èªãã ã•ã„。</Data></Cell>
884 </Row>
885 <Row>
886 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
887 <Cell><Data ss:Type="String">/LCD Options</Data></Cell>
888 <Cell><Data ss:Type="String">label</Data></Cell>
889 <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell>
890 <Cell ss:Index="7"><Data ss:Type="String">ロジクールLCD</Data></Cell>
891 </Row>
892 <Row>
893 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
894 <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell>
895 <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell>
896 <Cell ss:Index="7"><Data ss:Type="String">LCD出力先:</Data></Cell>
897 </Row>
898 <Row>
899 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
900 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
901 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
902 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell>
903 <Cell ss:Index="7"><Data ss:Type="String">é¸æŠžã—ãŸãƒ•ォームをロジクールG15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º</Data></Cell>
904 </Row>
905 <Row>
906 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
907 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
908 <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell>
909 <Cell ss:Index="7"><Data ss:Type="String">ロジクール G15 Gaming Keyboard</Data></Cell>
910 </Row>
911 <Row>
912 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
913 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
914 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
915 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell>
916 <Cell ss:Index="7"><Data ss:Type="String">é¸æŠžã—ãŸãƒ•ォームをロジクールG15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º</Data></Cell>
917 </Row>
918 <Row>
919 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
920 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
921 <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell>
922 <Cell ss:Index="7"><Data ss:Type="String">ロジクールZ10スピーカー</Data></Cell>
923 </Row>
924 <Row>
925 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
926 <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell>
927 <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell>
928 <Cell ss:Index="7"><Data ss:Type="String">LCD表示オプション</Data></Cell>
929 </Row>
930 <Row>
931 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
932 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
933 <Cell><Data ss:Type="String">label</Data></Cell>
934 <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell>
935 <Cell ss:Index="7"><Data ss:Type="String">ãƒãƒ£ãƒƒãƒˆã‚’表示</Data></Cell>
936 </Row>
937 <Row>
938 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
939 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
940 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
941 <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell>
942 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆã‚’表示</Data></Cell>
943 </Row>
944 <Row>
945 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
946 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
947 <Cell><Data ss:Type="String">label</Data></Cell>
948 <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell>
949 <Cell ss:Index="7"><Data ss:Type="String">IMを表示</Data></Cell>
950 </Row>
951 <Row>
952 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
953 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
954 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
955 <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell>
956 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç›´è¿‘ã®IMを表示</Data></Cell>
957 </Row>
958 <Row>
959 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
960 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
961 <Cell><Data ss:Type="String">label</Data></Cell>
962 <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell>
963 <Cell ss:Index="7"><Data ss:Type="String">土地情報を表示</Data></Cell>
964 </Row>
965 <Row>
966 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
967 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
968 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
969 <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell>
970 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç¾åœ¨ã®æ‰€åœ¨åœ°ã®æƒ…報を表示</Data></Cell>
971 </Row>
972 <Row>
973 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
974 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
975 <Cell><Data ss:Type="String">label</Data></Cell>
976 <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell>
977 <Cell ss:Index="7"><Data ss:Type="String">アカウント情報を表示</Data></Cell>
978 </Row>
979 <Row>
980 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
981 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
982 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
983 <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell>
984 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ç¾åœ¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…報を表示</Data></Cell>
985 </Row>
986 <Row>
987 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
988 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
989 <Cell><Data ss:Type="String">label</Data></Cell>
990 <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell>
991 <Cell ss:Index="7"><Data ss:Type="String">ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³æƒ…報を表示</Data></Cell>
992 </Row>
993 <Row>
994 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
995 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
996 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
997 <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell>
998 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ãƒ‡ãƒãƒƒã‚°æƒ…報を表示</Data></Cell>
999 </Row>
1000 <Row>
1001 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
1002 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
1003 <Cell><Data ss:Type="String">label</Data></Cell>
1004 <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell>
1005 <Cell ss:Index="7"><Data ss:Type="String">コンソールã‹ã‚‰ã®ãƒ‡ãƒãƒƒã‚°æƒ…報を表示</Data></Cell>
1006 </Row>
1007 <Row>
1008 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
1009 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
1010 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1011 <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell>
1012 <Cell ss:Index="7"><Data ss:Type="String">LCDウィンドウã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®ãƒ‡ãƒãƒƒã‚°æƒ…報を表示</Data></Cell>
1013 </Row>
1014 <Row>
1015 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1016 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1017 <Cell><Data ss:Type="String">label</Data></Cell>
1018 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
1019 <Cell ss:Index="7"><Data ss:Type="String">検索</Data></Cell>
1020 </Row>
1021 <Row>
1022 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1023 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1024 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1025 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1026 <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell>
1027 </Row>
1028 <Row>
1029 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1030 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1031 <Cell><Data ss:Type="String">label</Data></Cell>
1032 </Row>
1033 <Row>
1034 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1035 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1036 <Cell><Data ss:Type="String">label_selected</Data></Cell>
1037 </Row>
1038 <Row>
1039 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1040 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1041 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1042 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1043 <Cell ss:Index="7"><Data ss:Type="String">Second Lifeを検索</Data></Cell>
1044 </Row>
1045 </Table>
1046 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
1047 <Selected/>
1048 <Panes>
1049 <Pane>
1050 <Number>3</Number>
1051 <ActiveRow>8</ActiveRow>
1052 <ActiveCol>6</ActiveCol>
1053 </Pane>
1054 </Panes>
1055 <ProtectObjects>False</ProtectObjects>
1056 <ProtectScenarios>False</ProtectScenarios>
1057 </WorksheetOptions>
1058 </Worksheet>
1059</Workbook>
diff --git a/linden/indra/newview/skins/xui/ja/need_to_update.xml b/linden/indra/newview/skins/xui/ja/need_to_update.xml
new file mode 100644
index 0000000..93e784f
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/need_to_update.xml
@@ -0,0 +1,419 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:50:48Z</Created>
11 <LastSaved>2007-11-21T00:50:48Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-3720</WindowTopX>
18 <WindowTopY>2220</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_update2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="153">
65 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
66 <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the &quot;Publish in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting &quot;Show in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
69 <Cell ss:StyleID="s23"><Data ss:Type="String">「検索ã§å…¬é–‹ã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤º:&#10; - æ¤œç´¢çµæžœã«ãŠã‘る自分ã®ãƒ—ロフィール&#10; - パブリックグループページã«ãŠã‘る自分ã®ãƒ—ロフィールã¸ã®ãƒªãƒ³ã‚¯</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">「検索ã«è¡¨ç¤ºã€ã‚’é¸æŠžã™ã‚‹ã¨è¡¨ç¤º:&#10; - æ¤œç´¢çµæžœã«ãŠã‘る自分ã®ãƒ—ロフィール&#10; - パブリックグループページã«ãŠã‘る自分ã®ãƒ—ロフィールã¸ã®ãƒªãƒ³ã‚¯</Data></Cell>
71 </Row>
72 <Row>
73 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
74 <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell>
75 <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell>
76 <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell>
77 <Cell><Data ss:Type="String">スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼</Data></Cell>
78 <Cell><Data ss:Type="String">スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼</Data></Cell>
79 </Row>
80 <Row ss:Height="409.5">
81 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
82 <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell>
83 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Search directory and on www.secondlife.com for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
84 <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Find directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
85 <Cell ss:StyleID="s23"><Data ss:Type="String">クラシファイド広告ã¯ã€æ¤œç´¢ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚¯ãƒ©ã‚·ãƒ•ァイドセクションã«1週間掲示ã•れã¾ã™ã€‚&#10; &#10;広告を記入後ã€ã€Žç™ºè¡Œã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¾ã™ã€‚&#10; &#10;発行ã™ã‚‹éš›ã«ã€æ”¯æ‰•ã„金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚&#10;支払ã„金é¡ã‚’多ãã™ã‚Œã°ã€ã‚ãªãŸã®åºƒå‘Šã¯ä¸Šä½ã«ãƒªã‚¹ãƒˆã•れã¾ã™ã€‚ã¾ãŸã€ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢ã®çµæžœã§ã‚‚上ä½ã«ãƒªã‚¹ãƒˆã•れるよã†ã«ãªã‚Šã¾ã™ã€‚</Data></Cell>
86 <Cell ss:StyleID="s23"><Data ss:Type="String">検索ディレクトリã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイドã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ã€&#10;クラシファイド広告ãŒ1週間掲載ã•れã¾ã™ã€‚&#10; &#10;広告を記入後ã€ã€Œç™ºè¡Œã€ã‚’クリックã—ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«&#10;追加ã—ã¾ã™ã€‚&#10; &#10;「発行ã€ã‚’クリックã™ã‚‹ã¨ã€æ”¯æ‰•金é¡ã‚’å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚&#10;å¤šãæ‰•ã†ã»ã©ã‚¯ãƒ©ã‚·ãƒ•ァイドリストã¨ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰æ¤œç´¢&#10;ã®ä¸Šä½ã«è¡¨ç¤ºã•れã¾ã™ã€‚</Data></Cell>
87 </Row>
88 <Row ss:Height="178.5">
89 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
90 <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell>
91 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10; estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
92 <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10;estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
93 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä»–ã®ä¸å‹•産ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ãªãã¦ã‚‚ã€ã“ã®ä¸å‹•産ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’&#10; 設定ã—ã¾ã™ã€‚&#10; &#10;デフォルト:オン</Data></Cell>
94 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã¯ã€ä»–ã®ä¸å‹•産ã«ã„ã‚‹ä½äººãŒã€ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã«ç™»éŒ²ã•れã¦ã„ãªãã¦ã‚‚ã€ã“ã®ä¸å‹•産ã«ç«‹ã¡å…¥ã‚‹ã“ã¨ãŒã§ãã‚‹ã‹ã©ã†ã‹ã‚’&#10;設定ã—ã¾ã™ã€‚&#10; &#10;デフォルト:オン</Data></Cell>
95 </Row>
96 <Row ss:Height="204">
97 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
98 <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell>
99 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10; listed here and any groups below. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
100 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10;listed here and any groups below. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
101 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„ã‚‹ä½äººã¨&#10; 下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€&#10; 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€&#10; 利用ã§ãã¾ã™ã€‚</Data></Cell>
102 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„ã‚‹ä½äººã¨&#10;下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€&#10;「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€&#10;利用ã§ãã¾ã™ã€‚</Data></Cell>
103 </Row>
104 <Row ss:Height="204">
105 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
106 <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell>
107 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10; listed here and any Residents above. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
108 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10;listed here and any Residents above. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
109 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„るグループã¨&#10; 下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸä½äººã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€&#10; 「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€&#10; 利用ã§ãã¾ã™ã€‚</Data></Cell>
110 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ã“ã“ã«ç™»éŒ²ã•れã¦ã„るグループã¨&#10;下記ã§ç‰¹åˆ¥ã«ç™»éŒ²ã•れãŸä½äººã®ã¿ã«è¨±å¯ã•れã¾ã™ã€‚ã“ã®è¨­å®šã¯ã€&#10;「メインランドã‹ã‚‰ã“ã“ãŒè¦‹ãˆã‚‹ã€ãŒãƒã‚§ãƒƒã‚¯ã•れã¦ã„ãªã„å ´åˆã®ã¿ã€&#10;利用ã§ãã¾ã™ã€‚</Data></Cell>
111 </Row>
112 <Row ss:Height="191.25">
113 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
114 <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell>
115 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10; channels in which residents may hear and talk with others&#10; nearby.&#10;&#10; Default: off</Data></Cell>
116 <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10;channels in which residents may hear and talk with others&#10;nearby.&#10;&#10;Default: off</Data></Cell>
117 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹&#10; 独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒ&#10; ã§ãã¾ã™ã€‚&#10;&#10; デフォルト:オフ</Data></Cell>
118 <Cell ss:StyleID="s23"><Data ss:Type="String">ã“ã®ä¸å‹•産ã®åŒºç”»ã¯ã€ä½äººãŒè¿‘所ã®äººã¨å¯¾è©±ã§ãã‚‹&#10;独自ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’æŒã¤ã“ã¨ãŒ&#10;ã§ãã¾ã™ã€‚&#10;&#10;デフォルト:オフ</Data></Cell>
119 </Row>
120 <Row ss:Height="331.5">
121 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
122 <Cell><Data ss:Type="String">//BadURL/message</Data></Cell>
123 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10; &#10; [SLURL]&#10; &#10; Most links are similar to this:&#10; &#10; secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about&#10; &#10; Please check the spelling and try again.</Data></Cell>
124 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10;&#10;[SLURL]&#10;&#10;Most links are similar to this:&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;Please check the spelling and try again.</Data></Cell>
125 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ãŒãƒªãƒ³ã‚¯ã‚’処ç†ã§ãã¾ã›ã‚“。&#10; &#10; [SLURL]&#10; &#10; ã»ã¨ã‚“ã©ã®ãƒªãƒ³ã‚¯ã¯ã€æ¬¡ã®ã‚ˆã†ãªå½¢å¼ã§ã™ã€‚&#10; &#10; secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about&#10; &#10; ã¤ã¥ã‚Šã‚’ãƒã‚§ãƒƒã‚¯ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</Data></Cell>
126 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life ãŒãƒªãƒ³ã‚¯ã‚’処ç†ã§ãã¾ã›ã‚“。&#10;&#10;[SLURL]&#10;&#10;ã»ã¨ã‚“ã©ã®ãƒªãƒ³ã‚¯ã¯ã€æ¬¡ã®ã‚ˆã†ãªå½¢å¼ã§ã™ã€‚&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;ã¤ã¥ã‚Šã‚’ãƒã‚§ãƒƒã‚¯ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。</Data></Cell>
127 </Row>
128 <Row>
129 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
130 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell>
131 <Cell><Data ss:Type="String">label</Data></Cell>
132 <Cell><Data ss:Type="String">Show in Search &gt; Places (L$30/week) under</Data></Cell>
133 <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell>
134 <Cell><Data ss:Type="String">「検索ã€ï¼žã€Œå ´æ‰€ã€ã«è¡¨ç¤ºï¼ˆL$30/週)</Data></Cell>
135 <Cell><Data ss:Type="String">検索ã«è¡¨ç¤ºï¼žï¼ˆé€±L$30)以下ã®å ´æ‰€</Data></Cell>
136 </Row>
137 <Row ss:Height="25.5">
138 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
139 <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell>
140 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media&#10;texture:</Data></Cell>
141 <Cell ss:StyleID="s23"><Data ss:Type="String">Sound&#10;Settings:</Data></Cell>
142 <Cell><Data ss:Type="String">サウンドã®è¨­å®š:</Data></Cell>
143 <Cell ss:StyleID="s23"><Data ss:Type="String">サウンド&#10;設定:</Data></Cell>
144 </Row>
145 <Row>
146 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
147 <Cell><Data ss:Type="String">/directory</Data></Cell>
148 <Cell><Data ss:Type="String">title</Data></Cell>
149 <Cell><Data ss:Type="String">Search</Data></Cell>
150 <Cell><Data ss:Type="String">Search Second Life</Data></Cell>
151 <Cell><Data ss:Type="String">検索</Data></Cell>
152 <Cell><Data ss:Type="String">Second Lifeを検索</Data></Cell>
153 </Row>
154 <Row>
155 <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell>
156 <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell>
157 <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell>
158 <Cell><Data ss:Type="String">Ready</Data></Cell>
159 <Cell><Data ss:Type="String">完了</Data></Cell>
160 <Cell><Data ss:Type="String">準備完了</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell>
165 <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell>
166 <Cell><Data ss:Type="Number">300</Data></Cell>
167 <Cell><Data ss:Type="Number">250</Data></Cell>
168 <Cell><Data ss:Type="Number">300</Data></Cell>
169 </Row>
170 <Row>
171 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
172 <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell>
173 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
174 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
175 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
176 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
177 </Row>
178 <Row>
179 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
180 <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell>
181 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
182 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
183 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
184 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
185 </Row>
186 <Row>
187 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
188 <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell>
189 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
190 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
191 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
192 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell>
197 <Cell><Data ss:Type="String">label</Data></Cell>
198 <Cell><Data ss:Type="String">Show in Search</Data></Cell>
199 <Cell><Data ss:Type="String">Show in search</Data></Cell>
200 <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell>
201 <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell>
202 </Row>
203 <Row>
204 <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell>
205 <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell>
206 <Cell><Data ss:Type="String">label</Data></Cell>
207 <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell>
208 <Cell><Data ss:Type="String">About Landmark</Data></Cell>
209 <Cell><Data ss:Type="String">ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ</Data></Cell>
210 <Cell><Data ss:Type="String">ランドマーク情報</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
215 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
216 <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell>
217 <Cell><Data ss:Type="String">入力レベル</Data></Cell>
218 <Cell><Data ss:Type="String">入力機器 (マイクロフォン):</Data></Cell>
219 </Row>
220 <Row>
221 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
222 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
223 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
224 <Cell><Data ss:Type="String">Input Level</Data></Cell>
225 <Cell><Data ss:Type="String">入力レベル</Data></Cell>
226 <Cell><Data ss:Type="String">入力レベル</Data></Cell>
227 </Row>
228 <Row>
229 <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell>
230 <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell>
231 <Cell><Data ss:Type="String">label</Data></Cell>
232 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
233 <Cell><Data ss:Type="String">Show in search</Data></Cell>
234 <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell>
235 <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
242 <Cell><Data ss:Type="String">Show in search</Data></Cell>
243 <Cell><Data ss:Type="String">検索ã§è¡¨ç¤º</Data></Cell>
244 <Cell><Data ss:Type="String">検索ã«è¡¨ç¤º</Data></Cell>
245 </Row>
246 <Row>
247 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
248 <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell>
249 <Cell><Data ss:Type="String">label</Data></Cell>
250 <Cell><Data ss:Type="String">Mature Group</Data></Cell>
251 <Cell><Data ss:Type="String">Mature group</Data></Cell>
252 <Cell><Data ss:Type="String">æˆäººå‘グループ</Data></Cell>
253 <Cell><Data ss:Type="String">æˆäººå‘ã‘グループ</Data></Cell>
254 </Row>
255 <Row>
256 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
257 <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell>
258 <Cell><Data ss:Type="String">label</Data></Cell>
259 <Cell><Data ss:Type="String">Open Enrollment</Data></Cell>
260 <Cell><Data ss:Type="String">Open enrollment</Data></Cell>
261 <Cell><Data ss:Type="String">会員募集</Data></Cell>
262 <Cell><Data ss:Type="String">会員募集</Data></Cell>
263 </Row>
264 <Row>
265 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
266 <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell>
267 <Cell><Data ss:Type="String">label</Data></Cell>
268 <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell>
269 <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell>
270 <Cell><Data ss:Type="String">入会費:L$</Data></Cell>
271 <Cell><Data ss:Type="String">入会費:L$</Data></Cell>
272 </Row>
273 <Row>
274 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
275 <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell>
276 <Cell><Data ss:Type="String">label</Data></Cell>
277 <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell>
278 <Cell><Data ss:Type="String">Receive group notices</Data></Cell>
279 <Cell><Data ss:Type="String">グループ通知をå—ä¿¡</Data></Cell>
280 <Cell><Data ss:Type="String">グループ通知をå—ä¿¡</Data></Cell>
281 </Row>
282 <Row>
283 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
284 <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell>
285 <Cell><Data ss:Type="String">label</Data></Cell>
286 <Cell><Data ss:Type="String">List Group in Profile</Data></Cell>
287 <Cell><Data ss:Type="String">List group in my profile</Data></Cell>
288 <Cell><Data ss:Type="String">プロフィールã«ã‚°ãƒ«ãƒ¼ãƒ—をリスト</Data></Cell>
289 <Cell><Data ss:Type="String">プロフィールã«ã‚°ãƒ«ãƒ¼ãƒ—をリスト</Data></Cell>
290 </Row>
291 <Row>
292 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
293 <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell>
294 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
295 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
296 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
297 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell>
302 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
303 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
304 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
305 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
306 </Row>
307 <Row>
308 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
309 <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell>
310 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
311 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
312 <Cell><Data ss:Type="String">0平方メートル</Data></Cell>
313 <Cell><Data ss:Type="String">[AREA]平方メートル</Data></Cell>
314 </Row>
315 <Row>
316 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
317 <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell>
318 <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell>
319 <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell>
320 <Cell><Data ss:Type="String">([AMOUNT]最大)</Data></Cell>
321 <Cell><Data ss:Type="String">平方メートル ([AMOUNT]最大)</Data></Cell>
322 </Row>
323 <Row>
324 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
325 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
326 <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell>
327 <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
328 <Cell><Data ss:Type="String">交通é‡ï¼š [TRAFFIC].</Data></Cell>
329 <Cell><Data ss:Type="String">交通é‡ï¼š [TRAFFIC]</Data></Cell>
330 </Row>
331 <Row>
332 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
333 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
334 <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
335 <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
336 <Cell><Data ss:Type="String">エリア:[AREA]平方メートル</Data></Cell>
337 <Cell><Data ss:Type="String">é¢ç©ï¼šï¼»AREA]平方メートル</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
342 <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell>
343 <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
344 <Cell><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—中。</Data></Cell>
345 <Cell><Data ss:Type="String">L$[PRICE]ã§å£²ã‚Šå‡ºã—中。</Data></Cell>
346 </Row>
347 <Row>
348 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
349 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
350 <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
351 <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell>
352 <Cell><Data ss:Type="String">オークションID [ID]。</Data></Cell>
353 <Cell><Data ss:Type="String">オークションID [ID]。</Data></Cell>
354 </Row>
355 <Row>
356 <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell>
357 <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell>
358 <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell>
359 <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell>
360 <Cell><Data ss:Type="String">オーディオ環境設定:</Data></Cell>
361 <Cell><Data ss:Type="String">オーディオ環境設定:</Data></Cell>
362 </Row>
363 <Row>
364 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
365 <Cell><Data ss:Type="String">/im/text_box3</Data></Cell>
366 <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell>
367 <Cell><Data ss:Type="String">Logging Options:</Data></Cell>
368 <Cell><Data ss:Type="String">ログインオプション:</Data></Cell>
369 <Cell><Data ss:Type="String">ログインオプション:</Data></Cell>
370 </Row>
371 <Row>
372 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
373 <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell>
374 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
375 <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
376 <Cell><Data ss:Type="String">カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell>
377 <Cell><Data ss:Type="String">カメラã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell>
378 </Row>
379 <Row>
380 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
381 <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell>
382 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
383 <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
384 <Cell><Data ss:Type="String">ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell>
385 <Cell><Data ss:Type="String">ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‹ã‚‰ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’èžã。</Data></Cell>
386 </Row>
387 <Row>
388 <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell>
389 <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell>
390 <Cell><Data ss:Type="String">label</Data></Cell>
391 <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell>
392 <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell>
393 <Cell><Data ss:Type="String">åŒºç”»ã®æ¤œç´¢ã‚’ブロック</Data></Cell>
394 <Cell><Data ss:Type="String">åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell>
399 <Cell><Data ss:Type="String">label</Data></Cell>
400 <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell>
401 <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell>
402 <Cell><Data ss:Type="String">プッシュ・トゥ・トークモードã§ãƒ“ュアーを起動</Data></Cell>
403 <Cell><Data ss:Type="String">プッシュ・トゥ・トークモードã§ãƒ“ュアーを起動</Data></Cell>
404 </Row>
405 </Table>
406 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
407 <Selected/>
408 <Panes>
409 <Pane>
410 <Number>3</Number>
411 <ActiveRow>2</ActiveRow>
412 <ActiveCol>7</ActiveCol>
413 </Pane>
414 </Panes>
415 <ProtectObjects>False</ProtectObjects>
416 <ProtectScenarios>False</ProtectScenarios>
417 </WorksheetOptions>
418 </Worksheet>
419</Workbook>
diff --git a/linden/indra/newview/skins/xui/ja/panel_login.xml b/linden/indra/newview/skins/xui/ja/panel_login.xml
index 6be17a1..e8ac742 100644
--- a/linden/indra/newview/skins/xui/ja/panel_login.xml
+++ b/linden/indra/newview/skins/xui/ja/panel_login.xml
@@ -1,44 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/pt/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 ファーストãƒãƒ¼ãƒ ï¼š
8 </text>
9 <text name="last_name_text">
10 ラストãƒãƒ¼ãƒ ï¼š
11 </text>
12 <text name="password_text">
13 パスワード:
14 </text>
15 <text name="start_location_text">
16 開始ロケーション:
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 自宅(ホーム)
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 最後ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³
24 </combo_item>
25 <combo_item name="Typeregionname">
26 &lt;地域ã®åå‰å…¥åŠ›&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="パスワードを記憶" name="remember_check" />
30 <text name="full_screen_text">
31 ログイン時ã«ã¯ãƒ•ルスクリーン表示ã«ãªã‚Šã¾ã™
32 </text>
33 <button label="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..." label_selected="æ–°è¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆ..."
34 name="new_account_btn" />
35 <button label="環境設定..." label_selected="環境設定..." name="preferences_btn" />
36 <button label="接続" label_selected="接続" name="connect_btn" />
37 <button label="終了" label_selected="終了" name="quit_btn" />
38 <text name="version_text">
39 1.23.4 (5)
40 </text>
41 <text name="channel_text">
42 [Viewer Channel Name]
43 </text> 5 </text>
44</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml
new file mode 100644
index 0000000..899de6d
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ja/panel_preferences_LCD.xml
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel label="ロジクールLCD" name="LCD Options">
3 <text name="LCD Destination:">
4 LCD出力先:
5 </text>
6 <radio_group name="LCDDestination">
7 <radio_item name="DestinationG15"
8 tool_tip="é¸æŠžã—ãŸãƒ•ォームをロジクールG15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º">
9 ロジクール G15 Gaming Keyboard
10 </radio_item>
11 <radio_item name="DestinationZ10"
12 tool_tip="é¸æŠžã—ãŸãƒ•ォームをロジクールG15 Keyboardã®LCDç”»é¢è¡¨ç¤ºç”¨ã«è¡¨ç¤º">
13 ロジクールZ10スピーカー
14 </radio_item>
15 </radio_group>
16 <text name="LCD Display Options">
17 LCD表示オプション
18 </text>
19 <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’表示" name="DisplayChat"
20 tool_tip="LCDウィンドウã«ç›´è¿‘ã®ãƒãƒ£ãƒƒãƒˆã‚’表示" />
21 <check_box label="IMを表示" name="DisplayIM"
22 tool_tip="LCDウィンドウã«ç›´è¿‘ã®IMを表示" />
23 <check_box label="土地情報を表示" name="DisplayRegion"
24 tool_tip="LCDウィンドウã«ç¾åœ¨ã®æ‰€åœ¨åœ°ã®æƒ…報を表示" />
25 <check_box label="アカウント情報を表示" name="DisplayLinden"
26 tool_tip="LCDウィンドウã«ç¾åœ¨ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆæƒ…報を表示" />
27 <check_box label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³æƒ…報を表示"
28 name="DisplayDebug"
29 tool_tip="LCDウィンドウã«ãƒ‡ãƒãƒƒã‚°æƒ…報を表示" />
30 <check_box label="コンソールã‹ã‚‰ã®ãƒ‡ãƒãƒƒã‚°æƒ…報を表示"
31 name="DisplayDebugConsole"
32 tool_tip="LCDウィンドウã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã®ãƒ‡ãƒãƒƒã‚°æƒ…報を表示" />
33</panel>
diff --git a/linden/indra/newview/skins/xui/ko/LCD_text.xml b/linden/indra/newview/skins/xui/ko/LCD_text.xml
new file mode 100644
index 0000000..0ebfae7
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/LCD_text.xml
@@ -0,0 +1,75 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login">
3 <text name="DebugInfo">
4 디버그 정보
5 </text>
6 <text name="FPS">
7 FPS
8 </text>
9 <text name="SimFPS">
10 SimFPS
11 </text>
12 <text name="Pin">
13 패킷 입력
14 </text>
15 <text name="Pout">
16 패킷 출력
17 </text>
18 <text name="PLoss">
19 패킷 ì†ì‹¤
20 </text>
21 <text name="Ping">
22 Ping
23 </text>
24 <text name="AccountDetails">
25 계정 세부사항
26 </text>
27 <text name="LBal">
28 L$ 잔고
29 </text>
30 <text name="Time">
31 시간
32 </text>
33 <text name="LocationDetails1">
34 위치 세부사항 1
35 </text>
36 <text name="LocationDetails2">
37 위치 세부사항 2
38 </text>
39 <text name="Region">
40 지역
41 </text>
42 <text name="Parcel">
43 구íš
44 </text>
45 <text name="Pos">
46 Pos
47 </text>
48 <text name="Sqm">
49 Sqm
50 </text>
51 <text name="Owner">
52 소유ìž
53 </text>
54 <text name="Type">
55 유형
56 </text>
57 <text name="Yes">
58 예
59 </text>
60 <text name="No">
61 아니오
62 </text>
63 <text name="Forsale">
64 매물
65 </text>
66 <text name="Traffic">
67 통행량
68 </text>
69 <text name="Last3ChatLines">
70 마지막 3개 채팅 행
71 </text>
72 <text name="Last3IMLines">
73 마지막 3개 메신저 행
74 </text>
75</panel>
diff --git a/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml b/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml
new file mode 100644
index 0000000..dd72ea4
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/floater_landmark_ctrl.xml
@@ -0,0 +1,10 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="landmarkpicker" title="구성: ëžœë“œë§ˆí¬ ë§Œë“¤ê¸°">
3 <check_box label="í´ë” 표시" name="show_folders_check" />
4 <button label="신규" label_selected="신규" name="New" />
5 <button label="ì´ë¦„ 변경" label_selected="ì´ë¦„ 변경" name="Rename" />
6 <button label="새 í´ë”" label_selected="새 í´ë”" name="NewFolder" />
7 <button label="편집" label_selected="편집" name="Edit" />
8 <button label="삭제" label_selected="삭제" name="Delete" />
9 <button label="닫기" label_selected="닫기" name="Close" />
10</floater>
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml b/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml
new file mode 100644
index 0000000..c820fbf
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/floater_preview_classified.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="classified_preview" />
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_event.xml b/linden/indra/newview/skins/xui/ko/floater_preview_event.xml
new file mode 100644
index 0000000..732e1fe
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/floater_preview_event.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="event_preview" />
diff --git a/linden/indra/newview/skins/xui/ko/floater_preview_url.xml b/linden/indra/newview/skins/xui/ko/floater_preview_url.xml
new file mode 100644
index 0000000..fd6486c
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/floater_preview_url.xml
@@ -0,0 +1,2 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<floater name="url_preview" />
diff --git a/linden/indra/newview/skins/xui/ko/menu_slurl.xml b/linden/indra/newview/skins/xui/ko/menu_slurl.xml
new file mode 100644
index 0000000..a52474b
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/menu_slurl.xml
@@ -0,0 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<menu name="Popup">
3 <menu_item_call label="URL ì •ë³´" name="about_url" />
4 <menu_item_call label="URL로 텔레í¬íЏ" name="teleport_to_url" />
5 <menu_item_call label="ì§€ë„ì— í‘œì‹œ" name="show_on_map" />
6</menu>
diff --git a/linden/indra/newview/skins/xui/ko/need_to_long.xml b/linden/indra/newview/skins/xui/ko/need_to_long.xml
new file mode 100644
index 0000000..cc21886
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/need_to_long.xml
@@ -0,0 +1,85 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T01:01:28Z</Created>
11 <LastSaved>2007-11-21T01:01:28Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-10950</WindowTopX>
18 <WindowTopY>2070</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_long2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="3" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="409.5">
65 <Cell><Data ss:Type="String">floater_about.xml</Data></Cell>
66 <Cell><Data ss:Type="String">/floater_about/credits_editor</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life is brought to you by Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa and many others.&#10;&#10;In Memory of Jesse Malthus, you will be fondly remembered by all who heard your voice.&#10;&#10;Thank you to the following residents for helping to ensure that this is the best version yet: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;All rights reserved. See licenses.txt for details.&#10;&#10;Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;Mr. Watson &#45;- come here &#45;- I want to see you.</Data></Cell>
69 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life 제작ìžë“¤: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다.&#10;&#10;Jesse Malthus를 기억하며... ê·¸ì˜ ëª©ì†Œë¦¬ë¥¼ ë“¤ì—ˆë˜ ëª¨ë“  ì‚¬ëžŒë“¤ì— ì˜í•´ 그는 다정스럽게 ê¸°ì–µë  ê²ƒìž…ë‹ˆë‹¤.&#10;&#10;현재 ë²„ì „ì´ ìµœê³  ë²„ì „ì´ ë  ìˆ˜ 있ë„ë¡ ë„와주신 주민들께 ê°ì‚¬ 드립니다: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard 등.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;저작권 보유ë¨. ìžì„¸í•œ ë‚´ìš©ì€ licenses.txt를 참조하십시오.&#10;&#10;ìŒì„± 채팅 오디오 코딩: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;와트슨씨. ì´ë¦¬ 오세요. ë³´ê³  ì‹¶êµ°ìš”.</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life 제작ìžë“¤: Philip, Andrew, Tessa, Cory, Frank, James, Doug, Hunter, Richard, John, Eric, Avi, AaronB, AaronY, Ian, Peter, Mark, Robin, Stephen, Tracy, Ryan, Alberto, Haney, Tanya, JimJ, Dan, Ben, Stephanie, Tim, Evan, Catherine, Colin, Chris, Reuben, Charity, Jeska, James, JonHenry, Kelly, Callum, Char, Daniel, DavidF, Don, Jeff, Lauren, Lee, Michael, Ramzi, Vektor, Steve, TomY, Tess, Kona, Brent, Clarissa, PeterP, Jesse, Annette, Cyn, Blue, Ginsu, Jonathan, Karen, Adam, Nova, Deana, Lizzie, Patsy, DavidK, Isaac, Pathfinder, Monroe, Jill, Benny, Altruima, Rheya, Jennifer, Jack, DaveP, Brad, Mick, Babbage, Elisabeth, Brian, Beth, Data, Ethan, Wendy, Nicole, Sky, Jeffrey, Zero, Coffee, Tesla, Kenny, Makiko, Nigel, Teeple, Lucy, Mia, Dee, Guy, Harry, Liana, Branka, Jimbo, Aura, Vasuda, SarahD, bethanye, Torley, Runitai, MikeS, PaulM, Milo, Hermia, JoeM, Melanie, Rejean, DSmith, SMiller, Susan, Jose, DongYun, Justin, Andrey, Syrah, Donovan, Henrik, Nora, Lexie, AC, Donna, ChrisC, Alex, Leyla, Kyle, Mathew, Devin, Joshua, DanC, Jessica, Harmony, Claudia, Tramel, Glenn, Betsy, Fritz, Jun, Adam, Cassandra, Ken, RyanW, Spike, Tofu, Varas, Andy, Luke, RobLa, Chiyo, JohnZ, Dustin, George, Del, PeterP, Migyeong, Matthew, RMullane, CChampion, JTurbin, JamesC, Viola, Lightfoot, Jacqui, Sturm, Adrian, Buttercup, Alfred, Sunil, Alfred, Noel, Irfan, Jill, Yool, Jane, Yuki, Yoz, Matthew, Arthur, Jennifer, Karl, Brian, Ben, Janine, Christopher, Madhavi, Everett, Anthony, Joon, Jake, sean, Adreanne, Stephany, KellyJo, Jeremy, Pramod, Joshua, Sean, Christopher, Amy, Ceren, Katherine, jon, Sudheendra, James, Stephan, Kari, Kartic, Todd, Thomas, Joki, Rebecca, Belinda, Bert, Roger, Bridie, Kristi, Brian, Maria, John, Aric, Nathanel, Melinda, Darrell, Jennifer, Sandy, Greg, Rob, Brad, Chris, Eric, Palmer, Asi, Katja, Lisa, Minda, Jen, Aaron, Bryan, Mark, Jonathan, Jamie, Laurel, William, Matthew, Steve, David, Remy, James, Tim, Lee, Brian, Ashlei, Sam, Mike, Ethan, Austin, Wanda, Paul, Brian, Rachel, Valentyn, Emma Williams, Autum, Steven, Laley, Charles, Jessica, Sue, Gillian, CG, Kip, Kristen, Shamiran, Blake, Brett, Erica, Kent, Joel, Plexus, Twilight, Joppa, ê·¸ ì™¸ì— ë§Žì€ ë¶„ë“¤ì´ ìˆ˜ê³ í•´ 주셨습니다.&#10;&#10;Jesse Malthus를 기억하며... ê·¸ì˜ ëª©ì†Œë¦¬ë¥¼ ë“¤ì—ˆë˜ ëª¨ë“  ì‚¬ëžŒë“¤ì— ì˜í•´ 그는 다정스럽게 ê¸°ì–µë  ê²ƒìž…ë‹ˆë‹¤.&#10;&#10;현재 ë²„ì „ì´ ìµœê³  ë²„ì „ì´ ë  ìˆ˜ 있ë„ë¡ ë„와주신 주민들께 ê°ì‚¬ 드립니다: Aces Spade, Adrian Buckler, Adrienne LeShelle, Amanda Ascot, AnnaQuay Heart, Aquamina Khalifa, Arienne Anatine, Aston Hildyard, Ayami Kamachi, Badinage Odets, Biffy Berjis, Bigfox Pye, BigJohn Jade, BigRick Byrd, Brettus Tripsa, Brock Fitzgerald, Broker Allen, Browse by Name, Chiria Celt, Christopher Prudhomme, dale Cao, dale Lynch, Dante Tucker, DaQbet Kish, Dargon Pacer, Darius Antonelli, Deira Llanfair, DeviantBone Xi, Dore Dorado, Englishwob Etchegaray, Enya Masala, Eric Renneville, Fairfax Michinaga, FireFox Bancroft, FOXI Cortes, Frederick Earp, Geo Meek, Gotthilf Fischer, Hallo Loon, Hawk Carter, Hazel Kyrgyz, Hecter Barbosa, Hex Link, Ice Pak, Ideasu Mukerji, Itoku Kamachi, Jared Halleck, Jaykob Carter, Jennifer Drumheller, JensMartin Tomsen, JIAB Boa, Jim Gustafson, JimmyJet Fossett, Joseph Rustamova, Jt Volos, Karilyn Kidomen, Kaysha Sion, Keaton Nacon, Kevin Susenko, Khashai Steinbeck, Kira Cuddihy, Kit Massiel, Kojo Dixon, KUieTSToRm Lightcloud, Kwai Kyong, Kyrtis Daehlie, LazyGunGuy Bartlett, Lewcas Zapedzki, Lioc Cioc, LLIB Utu, Lou Liebknecht, Luca Draken, Maci Homewood, Major Sewell, Mari Todriya, MarieElize Noel, matt27 Churchill, Maverick Miasma, maydaysos Young, Mediaho Ball, Mikayla Gillespie, Mike Faulkland, Modfire Milland, MollyBrown Foxley, Mosley Jewell, Nuahs Zapedzki, Nyx Divine, Panther Farber, Paul Bumi, Preciousse Moody, PrincessNina Prefect, Prio Serpentine, Rainbow Drake, Randall Rall, Randy Kazan, Reinhart Mokeev, Rhyph Somme, Rico Roizman, Ruge Dryke, Ryan Orbit, Safira Rosher, Samantha Bainbridge, Sammy Foxley, Sash Furst, Saturn Ariantho, Sienna Summers, Skye Enoch, Sofie Kanno, Solar Legion, Sonic Oki, Sunra Saenz, Taina Heart, Taryn Sprawl, tenerife Wei, TomDragon Nilsson, Trebla Reve, Trouble Carnell, user1cat Orbit, Vance Merlin, Veritas Variscan, Web Page, Wi3g3ht3s Ihnen, WinDrftr DeFarge, Yuu Nakamichi, Zac Delec, Zed Fairweather, Zimmo Hallard 등.&#10;&#10;APR Copyright (C) 2000-2004 The Apache Software Foundation&#10;cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)&#10;expat Copyright (C) 1998, 1999, 2000 Thai Open Source Software Center Ltd.&#10;FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).&#10;GL Copyright (C) 1999-2004 Brian Paul.&#10;Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.&#10;jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)&#10;jpeglib Copyright (C) 1991-1998, Thomas G. Lane.&#10;ogg/vorbis Copyright (C) 2001, Xiphophorus&#10;OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.&#10;SDL Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga&#10;SSLeay Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)&#10;xmlrpc-epi Copyright (C) 2000 Epinions, Inc.&#10;zlib Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler.&#10;&#10;저작권 보유ë¨. ìžì„¸í•œ ë‚´ìš©ì€ licenses.txt를 참조하십시오.&#10;&#10;ìŒì„± 채팅 오디오 코딩: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)&#10;&#10;&#10;와트슨씨, ì´ë¦¬ 오세요. ë³´ê³  ì‹¶êµ°ìš”.</Data></Cell>
71 </Row>
72 </Table>
73 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
74 <Selected/>
75 <Panes>
76 <Pane>
77 <Number>3</Number>
78 <ActiveRow>2</ActiveRow>
79 </Pane>
80 </Panes>
81 <ProtectObjects>False</ProtectObjects>
82 <ProtectScenarios>False</ProtectScenarios>
83 </WorksheetOptions>
84 </Worksheet>
85</Workbook>
diff --git a/linden/indra/newview/skins/xui/ko/need_to_translate.xml b/linden/indra/newview/skins/xui/ko/need_to_translate.xml
new file mode 100644
index 0000000..2038925
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/need_to_translate.xml
@@ -0,0 +1,1060 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:53:13Z</Created>
11 <LastSaved>2007-11-21T01:15:04Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>120</WindowTopX>
18 <WindowTopY>90</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 </Styles>
39 <Worksheet ss:Name="need_to_translate2">
40 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="155" x:FullColumns="1"
41 x:FullRows="1">
42 <Column ss:Width="63.75"/>
43 <Column ss:Width="70.5"/>
44 <Column ss:Width="88.5"/>
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="69.75"/>
47 <Column ss:Width="90.75"/>
48 <Column ss:Width="97.5"/>
49 <Row>
50 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
51 </Row>
52 <Row>
53 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
54 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
55 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
60 </Row>
61 <Row>
62 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
63 <Cell><Data ss:Type="String">//skipnexttime</Data></Cell>
64 <Cell ss:Index="5"><Data ss:Type="String">Don't show me this again</Data></Cell>
65 <Cell ss:Index="7"><Data ss:Type="String">ì´ ë©”ì‹œì§€ë¥¼ 다시 표시 안 함</Data></Cell>
66 </Row>
67 <Row>
68 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
69 <Cell><Data ss:Type="String">//alwayschoose</Data></Cell>
70 <Cell ss:Index="5"><Data ss:Type="String">Always choose this option</Data></Cell>
71 <Cell ss:Index="7"><Data ss:Type="String">í•­ìƒ ì´ ì˜µì…˜ ì„ íƒ</Data></Cell>
72 </Row>
73 <Row>
74 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
75 <Cell><Data ss:Type="String">//TeleportFromLandmark/message</Data></Cell>
76 <Cell ss:Index="5"><Data ss:Type="String">Are you sure you want to teleport?</Data></Cell>
77 <Cell ss:Index="7"><Data ss:Type="String">텔리í¬íŠ¸í•˜ì‹œê² ìŠµë‹ˆê¹Œ?</Data></Cell>
78 </Row>
79 <Row>
80 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
81 <Cell><Data ss:Type="String">//TeleportFromLandmark/ignore</Data></Cell>
82 <Cell ss:Index="5"><Data ss:Type="String">When teleporting from a landmark in inventory</Data></Cell>
83 <Cell ss:Index="7"><Data ss:Type="String">ì¸ë²¤í† ë¦¬ì˜ 랜드마í¬ì—서 텔리í¬íŠ¸í•˜ëŠ” 경우</Data></Cell>
84 </Row>
85 <Row>
86 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
87 <Cell><Data ss:Type="String">//TeleportFromLandmark/Teleport</Data></Cell>
88 <Cell ss:Index="5"><Data ss:Type="String">Teleport</Data></Cell>
89 <Cell ss:Index="7"><Data ss:Type="String">텔리í¬íЏ</Data></Cell>
90 </Row>
91 <Row>
92 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
93 <Cell><Data ss:Type="String">//TeleportFromLandmark/Cancel</Data></Cell>
94 <Cell ss:Index="5"><Data ss:Type="String">Cancel</Data></Cell>
95 <Cell ss:Index="7"><Data ss:Type="String">취소</Data></Cell>
96 </Row>
97 <Row>
98 <Cell><Data ss:Type="String">floater_active_speakers.xml</Data></Cell>
99 <Cell><Data ss:Type="String">/active_speakers/active_speakers_panel/speakers_list/speaking_status</Data></Cell>
100 <Cell><Data ss:Type="String">label</Data></Cell>
101 </Row>
102 <Row>
103 <Cell><Data ss:Type="String">floater_chatterbox.xml</Data></Cell>
104 <Cell><Data ss:Type="String">/floater_chatterbox</Data></Cell>
105 <Cell><Data ss:Type="String">title</Data></Cell>
106 <Cell ss:Index="5"><Data ss:Type="String">Communicate</Data></Cell>
107 <Cell ss:Index="7"><Data ss:Type="String">커뮤니케ì´íЏ</Data></Cell>
108 </Row>
109 <Row>
110 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
111 <Cell><Data ss:Type="String">/chat floater/ringing</Data></Cell>
112 <Cell ss:Index="5"><Data ss:Type="String">Connecting to in-world Voice Chat...</Data></Cell>
113 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì— ì—°ê²°í•˜ëŠ” 중...</Data></Cell>
114 </Row>
115 <Row>
116 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
117 <Cell><Data ss:Type="String">/chat floater/connected</Data></Cell>
118 <Cell ss:Index="5"><Data ss:Type="String">Connected</Data></Cell>
119 <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë¨</Data></Cell>
120 </Row>
121 <Row>
122 <Cell><Data ss:Type="String">floater_chat_history.xml</Data></Cell>
123 <Cell><Data ss:Type="String">/chat floater/hang_up</Data></Cell>
124 <Cell ss:Index="5"><Data ss:Type="String">Disconnected from in-world Voice Chat</Data></Cell>
125 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 ì—°ê²° ëŠê¹€</Data></Cell>
126 </Row>
127 <Row>
128 <Cell><Data ss:Type="String">floater_device_settings.xml</Data></Cell>
129 <Cell><Data ss:Type="String">/floater_device_settings</Data></Cell>
130 <Cell><Data ss:Type="String">title</Data></Cell>
131 <Cell ss:Index="5"><Data ss:Type="String">Voice Chat Device Settings</Data></Cell>
132 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 장치 설정</Data></Cell>
133 </Row>
134 <Row>
135 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
136 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel</Data></Cell>
137 <Cell><Data ss:Type="String">label</Data></Cell>
138 <Cell ss:Index="5"><Data ss:Type="String">All</Data></Cell>
139 <Cell ss:Index="7"><Data ss:Type="String">ì „ì²´</Data></Cell>
140 </Row>
141 <Row>
142 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
143 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/back_btn</Data></Cell>
144 <Cell><Data ss:Type="String">label</Data></Cell>
145 <Cell ss:Index="5"><Data ss:Type="String">Back</Data></Cell>
146 <Cell ss:Index="7"><Data ss:Type="String">뒤로</Data></Cell>
147 </Row>
148 <Row>
149 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
150 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/forward_btn</Data></Cell>
151 <Cell><Data ss:Type="String">label</Data></Cell>
152 <Cell ss:Index="5"><Data ss:Type="String">Forward</Data></Cell>
153 <Cell ss:Index="7"><Data ss:Type="String">앞으로</Data></Cell>
154 </Row>
155 <Row>
156 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
157 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
158 <Cell><Data ss:Type="String">label</Data></Cell>
159 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
160 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_editor</Data></Cell>
165 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
166 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
167 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
168 </Row>
169 <Row>
170 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
171 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/search_btn</Data></Cell>
172 <Cell><Data ss:Type="String">label</Data></Cell>
173 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
174 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
175 </Row>
176 <Row>
177 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
178 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/AnyCategory</Data></Cell>
179 <Cell ss:Index="5"><Data ss:Type="String">Any Category</Data></Cell>
180 <Cell ss:Index="7"><Data ss:Type="String">모든 카테고리</Data></Cell>
181 </Row>
182 <Row>
183 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
184 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Classifieds</Data></Cell>
185 <Cell ss:Index="5"><Data ss:Type="String">Classifieds</Data></Cell>
186 <Cell ss:Index="7"><Data ss:Type="String">ê´‘ê³ </Data></Cell>
187 </Row>
188 <Row>
189 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
190 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Events</Data></Cell>
191 <Cell ss:Index="5"><Data ss:Type="String">Events</Data></Cell>
192 <Cell ss:Index="7"><Data ss:Type="String">ì´ë²¤íЏ</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Groups</Data></Cell>
197 <Cell ss:Index="5"><Data ss:Type="String">Groups</Data></Cell>
198 <Cell ss:Index="7"><Data ss:Type="String">그룹</Data></Cell>
199 </Row>
200 <Row>
201 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
202 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/People</Data></Cell>
203 <Cell ss:Index="5"><Data ss:Type="String">People</Data></Cell>
204 <Cell ss:Index="7"><Data ss:Type="String">사람</Data></Cell>
205 </Row>
206 <Row>
207 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
208 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Places</Data></Cell>
209 <Cell ss:Index="5"><Data ss:Type="String">Places</Data></Cell>
210 <Cell ss:Index="7"><Data ss:Type="String">장소</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/Category/Wiki</Data></Cell>
215 <Cell ss:Index="5"><Data ss:Type="String">Wiki</Data></Cell>
216 <Cell ss:Index="7"><Data ss:Type="String">위키</Data></Cell>
217 </Row>
218 <Row>
219 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
220 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/mature_check</Data></Cell>
221 <Cell><Data ss:Type="String">label</Data></Cell>
222 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
223 <Cell ss:Index="7"><Data ss:Type="String">성ì¸ìš© 컨í…츠 í¬í•¨</Data></Cell>
224 </Row>
225 <Row>
226 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
227 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/loading_text</Data></Cell>
228 <Cell ss:Index="5"><Data ss:Type="String">Loading...</Data></Cell>
229 <Cell ss:Index="7"><Data ss:Type="String">로딩 중...</Data></Cell>
230 </Row>
231 <Row>
232 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
233 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_panel/done_text</Data></Cell>
234 <Cell ss:Index="5"><Data ss:Type="String">Done</Data></Cell>
235 <Cell ss:Index="7"><Data ss:Type="String">완료</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell ss:Index="5"><Data ss:Type="String">All (old)</Data></Cell>
242 <Cell ss:Index="7"><Data ss:Type="String">전체(구)</Data></Cell>
243 </Row>
244 <Row>
245 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
246 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
247 <Cell><Data ss:Type="String">label</Data></Cell>
248 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
249 <Cell ss:Index="7"><Data ss:Type="String">&lt; ì´ì „</Data></Cell>
250 </Row>
251 <Row>
252 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
253 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/&lt; Prev</Data></Cell>
254 <Cell><Data ss:Type="String">label_selected</Data></Cell>
255 <Cell ss:Index="5"><Data ss:Type="String">&lt; Prev</Data></Cell>
256 <Cell ss:Index="7"><Data ss:Type="String">&lt; ì´ì „</Data></Cell>
257 </Row>
258 <Row>
259 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
260 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
261 <Cell><Data ss:Type="String">label</Data></Cell>
262 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
263 <Cell ss:Index="7"><Data ss:Type="String">ë‹¤ìŒ &gt;</Data></Cell>
264 </Row>
265 <Row>
266 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
267 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Next &gt;</Data></Cell>
268 <Cell><Data ss:Type="String">label_selected</Data></Cell>
269 <Cell ss:Index="5"><Data ss:Type="String">Next &gt;</Data></Cell>
270 <Cell ss:Index="7"><Data ss:Type="String">ë‹¤ìŒ &gt;</Data></Cell>
271 </Row>
272 <Row>
273 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
274 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/find</Data></Cell>
275 <Cell ss:Index="5"><Data ss:Type="String">Find:</Data></Cell>
276 <Cell ss:Index="7"><Data ss:Type="String">찾기:</Data></Cell>
277 </Row>
278 <Row>
279 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
280 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
281 <Cell><Data ss:Type="String">label</Data></Cell>
282 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
283 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
284 </Row>
285 <Row>
286 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
287 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/Search</Data></Cell>
288 <Cell><Data ss:Type="String">label_selected</Data></Cell>
289 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
290 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
291 </Row>
292 <Row>
293 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
294 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/incmature</Data></Cell>
295 <Cell><Data ss:Type="String">label</Data></Cell>
296 <Cell ss:Index="5"><Data ss:Type="String">Include Mature content</Data></Cell>
297 <Cell ss:Index="7"><Data ss:Type="String">성ì¸ìš© 컨í…츠 í¬í•¨</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/icon</Data></Cell>
302 <Cell><Data ss:Type="String">label</Data></Cell>
303 </Row>
304 <Row>
305 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
306 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/name</Data></Cell>
307 <Cell><Data ss:Type="String">label</Data></Cell>
308 <Cell ss:Index="5"><Data ss:Type="String">Name</Data></Cell>
309 <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„</Data></Cell>
310 </Row>
311 <Row>
312 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
313 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/price</Data></Cell>
314 <Cell><Data ss:Type="String">label</Data></Cell>
315 <Cell ss:Index="5"><Data ss:Type="String">Price</Data></Cell>
316 <Cell ss:Index="7"><Data ss:Type="String">가격</Data></Cell>
317 </Row>
318 <Row>
319 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
320 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/date</Data></Cell>
321 <Cell><Data ss:Type="String">label</Data></Cell>
322 <Cell ss:Index="5"><Data ss:Type="String">Time (PT)</Data></Cell>
323 <Cell ss:Index="7"><Data ss:Type="String">시간(태í‰ì–‘시)</Data></Cell>
324 </Row>
325 <Row>
326 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
327 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/time</Data></Cell>
328 <Cell><Data ss:Type="String">label</Data></Cell>
329 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
330 <Cell ss:Index="7"><Data ss:Type="String">시간</Data></Cell>
331 </Row>
332 <Row>
333 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
334 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/dwell</Data></Cell>
335 <Cell><Data ss:Type="String">label</Data></Cell>
336 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
337 <Cell ss:Index="7"><Data ss:Type="String">통행량</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/area</Data></Cell>
342 <Cell><Data ss:Type="String">label</Data></Cell>
343 <Cell ss:Index="5"><Data ss:Type="String">Area</Data></Cell>
344 <Cell ss:Index="7"><Data ss:Type="String">ë©´ì </Data></Cell>
345 </Row>
346 <Row>
347 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
348 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/per_meter</Data></Cell>
349 <Cell><Data ss:Type="String">label</Data></Cell>
350 <Cell ss:Index="5"><Data ss:Type="String">L$/sq.m</Data></Cell>
351 <Cell ss:Index="7"><Data ss:Type="String">L$/sq.m</Data></Cell>
352 </Row>
353 <Row>
354 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
355 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/online</Data></Cell>
356 <Cell><Data ss:Type="String">label</Data></Cell>
357 <Cell ss:Index="5"><Data ss:Type="String">Online</Data></Cell>
358 <Cell ss:Index="7"><Data ss:Type="String">온ë¼ì¸</Data></Cell>
359 </Row>
360 <Row>
361 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
362 <Cell><Data ss:Type="String">/directory/Directory Tabs/find_all_old_panel/results/members</Data></Cell>
363 <Cell><Data ss:Type="String">label</Data></Cell>
364 <Cell ss:Index="5"><Data ss:Type="String">Members</Data></Cell>
365 <Cell ss:Index="7"><Data ss:Type="String">회ì›</Data></Cell>
366 </Row>
367 <Row>
368 <Cell><Data ss:Type="String">floater_groups.xml</Data></Cell>
369 <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell>
370 <Cell><Data ss:Type="String">label</Data></Cell>
371 </Row>
372 <Row>
373 <Cell><Data ss:Type="String">floater_im.xml</Data></Cell>
374 <Cell><Data ss:Type="String">/im_floater/invite_message</Data></Cell>
375 <Cell ss:Index="5"><Data ss:Type="String">Click the [BUTTON NAME] button to accept/connect to this voice chat.</Data></Cell>
376 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì„ ìˆ˜ë½/연결하려면 [BUTTON NAME] ë²„íŠ¼ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.</Data></Cell>
377 </Row>
378 <Row>
379 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
380 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
381 <Cell ss:Index="5"><Data ss:Type="String">Calling...</Data></Cell>
382 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅 ì—°ê²° 중...</Data></Cell>
383 </Row>
384 <Row>
385 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
386 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
387 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
388 <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.</Data></Cell>
389 </Row>
390 <Row>
391 <Cell><Data ss:Type="String">floater_instant_message.xml</Data></Cell>
392 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
393 <Cell ss:Index="5"><Data ss:Type="String">Call ended</Data></Cell>
394 <Cell ss:Index="7"><Data ss:Type="String">통화 종료</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
399 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
400 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± ì±„íŒ…ì— ì°¸ê°€ 중...</Data></Cell>
401 </Row>
402 <Row>
403 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
404 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
405 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
406 <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.</Data></Cell>
407 </Row>
408 <Row>
409 <Cell><Data ss:Type="String">floater_instant_message_ad_hoc.xml</Data></Cell>
410 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
411 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
412 <Cell ss:Index="7"><Data ss:Type="String">ìŒì„± 채팅ì—서 나왔습니다.</Data></Cell>
413 </Row>
414 <Row>
415 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
416 <Cell><Data ss:Type="String">/im_floater/ringing</Data></Cell>
417 <Cell ss:Index="5"><Data ss:Type="String">Joining Voice Chat...</Data></Cell>
418 <Cell ss:Index="7"><Data ss:Type="String">그룹 ìŒì„± ì±„íŒ…ì— ì°¸ê°€ 중...</Data></Cell>
419 </Row>
420 <Row>
421 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
422 <Cell><Data ss:Type="String">/im_floater/connected</Data></Cell>
423 <Cell ss:Index="5"><Data ss:Type="String">Connected, click End Call to hang up</Data></Cell>
424 <Cell ss:Index="7"><Data ss:Type="String">ì—°ê²°ë˜ì—ˆìŠµë‹ˆë‹¤. ì—°ê²°ì„ ëŠìœ¼ë ¤ë©´ 통화 종료 ë²„íŠ¼ì„ í´ë¦­í•˜ì‹­ì‹œì˜¤.</Data></Cell>
425 </Row>
426 <Row>
427 <Cell><Data ss:Type="String">floater_instant_message_group.xml</Data></Cell>
428 <Cell><Data ss:Type="String">/im_floater/hang_up</Data></Cell>
429 <Cell ss:Index="5"><Data ss:Type="String">Left Voice Chat</Data></Cell>
430 <Cell ss:Index="7"><Data ss:Type="String">그룹 ìŒì„± 채팅ì—서 나왔습니다.</Data></Cell>
431 </Row>
432 <Row>
433 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
434 <Cell><Data ss:Type="String">/landmarkpicker</Data></Cell>
435 <Cell><Data ss:Type="String">title</Data></Cell>
436 <Cell ss:Index="5"><Data ss:Type="String">Organize: Landmarks</Data></Cell>
437 <Cell ss:Index="7"><Data ss:Type="String">구성: ëžœë“œë§ˆí¬ ë§Œë“¤ê¸°</Data></Cell>
438 </Row>
439 <Row>
440 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
441 <Cell><Data ss:Type="String">/landmarkpicker/show_folders_check</Data></Cell>
442 <Cell><Data ss:Type="String">label</Data></Cell>
443 <Cell ss:Index="5"><Data ss:Type="String">Show Folders</Data></Cell>
444 <Cell ss:Index="7"><Data ss:Type="String">í´ë” 표시</Data></Cell>
445 </Row>
446 <Row>
447 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
448 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
449 <Cell><Data ss:Type="String">label</Data></Cell>
450 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
451 <Cell ss:Index="7"><Data ss:Type="String">신규</Data></Cell>
452 </Row>
453 <Row>
454 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
455 <Cell><Data ss:Type="String">/landmarkpicker/New</Data></Cell>
456 <Cell><Data ss:Type="String">label_selected</Data></Cell>
457 <Cell ss:Index="5"><Data ss:Type="String">New</Data></Cell>
458 <Cell ss:Index="7"><Data ss:Type="String">신규</Data></Cell>
459 </Row>
460 <Row>
461 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
462 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
463 <Cell><Data ss:Type="String">label</Data></Cell>
464 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
465 <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„ 변경</Data></Cell>
466 </Row>
467 <Row>
468 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
469 <Cell><Data ss:Type="String">/landmarkpicker/Rename</Data></Cell>
470 <Cell><Data ss:Type="String">label_selected</Data></Cell>
471 <Cell ss:Index="5"><Data ss:Type="String">Rename</Data></Cell>
472 <Cell ss:Index="7"><Data ss:Type="String">ì´ë¦„ 변경</Data></Cell>
473 </Row>
474 <Row>
475 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
476 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
477 <Cell><Data ss:Type="String">label</Data></Cell>
478 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
479 <Cell ss:Index="7"><Data ss:Type="String">새 í´ë”</Data></Cell>
480 </Row>
481 <Row>
482 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
483 <Cell><Data ss:Type="String">/landmarkpicker/NewFolder</Data></Cell>
484 <Cell><Data ss:Type="String">label_selected</Data></Cell>
485 <Cell ss:Index="5"><Data ss:Type="String">New Folder</Data></Cell>
486 <Cell ss:Index="7"><Data ss:Type="String">새 í´ë”</Data></Cell>
487 </Row>
488 <Row>
489 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
490 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
491 <Cell><Data ss:Type="String">label</Data></Cell>
492 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
493 <Cell ss:Index="7"><Data ss:Type="String">편집</Data></Cell>
494 </Row>
495 <Row>
496 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
497 <Cell><Data ss:Type="String">/landmarkpicker/Edit</Data></Cell>
498 <Cell><Data ss:Type="String">label_selected</Data></Cell>
499 <Cell ss:Index="5"><Data ss:Type="String">Edit</Data></Cell>
500 <Cell ss:Index="7"><Data ss:Type="String">편집</Data></Cell>
501 </Row>
502 <Row>
503 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
504 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
505 <Cell><Data ss:Type="String">label</Data></Cell>
506 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
507 <Cell ss:Index="7"><Data ss:Type="String">삭제</Data></Cell>
508 </Row>
509 <Row>
510 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
511 <Cell><Data ss:Type="String">/landmarkpicker/Delete</Data></Cell>
512 <Cell><Data ss:Type="String">label_selected</Data></Cell>
513 <Cell ss:Index="5"><Data ss:Type="String">Delete</Data></Cell>
514 <Cell ss:Index="7"><Data ss:Type="String">삭제</Data></Cell>
515 </Row>
516 <Row>
517 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
518 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
519 <Cell><Data ss:Type="String">label</Data></Cell>
520 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
521 <Cell ss:Index="7"><Data ss:Type="String">닫기</Data></Cell>
522 </Row>
523 <Row>
524 <Cell><Data ss:Type="String">floater_landmark_ctrl.xml</Data></Cell>
525 <Cell><Data ss:Type="String">/landmarkpicker/Close</Data></Cell>
526 <Cell><Data ss:Type="String">label_selected</Data></Cell>
527 <Cell ss:Index="5"><Data ss:Type="String">Close</Data></Cell>
528 <Cell ss:Index="7"><Data ss:Type="String">닫기</Data></Cell>
529 </Row>
530 <Row>
531 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
532 <Cell><Data ss:Type="String">/land holdings floater/area_string</Data></Cell>
533 <Cell ss:Index="5"><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
534 <Cell ss:Index="7"><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
535 </Row>
536 <Row>
537 <Cell><Data ss:Type="String">floater_preview_classified.xml</Data></Cell>
538 <Cell><Data ss:Type="String">/classified_preview</Data></Cell>
539 <Cell><Data ss:Type="String">title</Data></Cell>
540 <Cell ss:Index="5"><Data ss:Type="String">Classified Information</Data></Cell>
541 <Cell ss:Index="7"><Data ss:Type="String">ê´‘ê³  ì •ë³´</Data></Cell>
542 </Row>
543 <Row>
544 <Cell><Data ss:Type="String">floater_preview_event.xml</Data></Cell>
545 <Cell><Data ss:Type="String">/event_preview</Data></Cell>
546 <Cell><Data ss:Type="String">title</Data></Cell>
547 <Cell ss:Index="5"><Data ss:Type="String">Event Information</Data></Cell>
548 <Cell ss:Index="7"><Data ss:Type="String">ì´ë²¤íЏ ì •ë³´</Data></Cell>
549 </Row>
550 <Row>
551 <Cell><Data ss:Type="String">floater_preview_url.xml</Data></Cell>
552 <Cell><Data ss:Type="String">/url_preview</Data></Cell>
553 <Cell><Data ss:Type="String">title</Data></Cell>
554 <Cell ss:Index="5"><Data ss:Type="String">Place Information</Data></Cell>
555 <Cell ss:Index="7"><Data ss:Type="String">장소 정보</Data></Cell>
556 </Row>
557 <Row>
558 <Cell><Data ss:Type="String">floater_select_key.xml</Data></Cell>
559 <Cell><Data ss:Type="String">/modal container</Data></Cell>
560 <Cell><Data ss:Type="String">title</Data></Cell>
561 </Row>
562 <Row>
563 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
564 <Cell><Data ss:Type="String">/panel_login/DebugInfo</Data></Cell>
565 <Cell ss:Index="5"><Data ss:Type="String">Debug Info</Data></Cell>
566 <Cell ss:Index="7"><Data ss:Type="String">디버그 정보</Data></Cell>
567 </Row>
568 <Row>
569 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
570 <Cell><Data ss:Type="String">/panel_login/FPS</Data></Cell>
571 <Cell ss:Index="5"><Data ss:Type="String">FPS</Data></Cell>
572 <Cell ss:Index="7"><Data ss:Type="String">FPS</Data></Cell>
573 </Row>
574 <Row>
575 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
576 <Cell><Data ss:Type="String">/panel_login/SimFPS</Data></Cell>
577 <Cell ss:Index="5"><Data ss:Type="String">SimFPS</Data></Cell>
578 <Cell ss:Index="7"><Data ss:Type="String">SimFPS</Data></Cell>
579 </Row>
580 <Row>
581 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
582 <Cell><Data ss:Type="String">/panel_login/Pin</Data></Cell>
583 <Cell ss:Index="5"><Data ss:Type="String">P-In</Data></Cell>
584 <Cell ss:Index="7"><Data ss:Type="String">패킷 입력</Data></Cell>
585 </Row>
586 <Row>
587 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
588 <Cell><Data ss:Type="String">/panel_login/Pout</Data></Cell>
589 <Cell ss:Index="5"><Data ss:Type="String">P-Out</Data></Cell>
590 <Cell ss:Index="7"><Data ss:Type="String">패킷 출력</Data></Cell>
591 </Row>
592 <Row>
593 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
594 <Cell><Data ss:Type="String">/panel_login/PLoss</Data></Cell>
595 <Cell ss:Index="5"><Data ss:Type="String">P-Loss</Data></Cell>
596 <Cell ss:Index="7"><Data ss:Type="String">패킷 ì†ì‹¤</Data></Cell>
597 </Row>
598 <Row>
599 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
600 <Cell><Data ss:Type="String">/panel_login/Ping</Data></Cell>
601 <Cell ss:Index="5"><Data ss:Type="String">Ping</Data></Cell>
602 <Cell ss:Index="7"><Data ss:Type="String">Ping</Data></Cell>
603 </Row>
604 <Row>
605 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
606 <Cell><Data ss:Type="String">/panel_login/AccountDetails</Data></Cell>
607 <Cell ss:Index="5"><Data ss:Type="String">Account Details</Data></Cell>
608 <Cell ss:Index="7"><Data ss:Type="String">계정 세부사항</Data></Cell>
609 </Row>
610 <Row>
611 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
612 <Cell><Data ss:Type="String">/panel_login/LBal</Data></Cell>
613 <Cell ss:Index="5"><Data ss:Type="String">L$ bal</Data></Cell>
614 <Cell ss:Index="7"><Data ss:Type="String">L$ 잔고</Data></Cell>
615 </Row>
616 <Row>
617 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
618 <Cell><Data ss:Type="String">/panel_login/Time</Data></Cell>
619 <Cell ss:Index="5"><Data ss:Type="String">Time</Data></Cell>
620 <Cell ss:Index="7"><Data ss:Type="String">시간</Data></Cell>
621 </Row>
622 <Row>
623 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
624 <Cell><Data ss:Type="String">/panel_login/LocationDetails1</Data></Cell>
625 <Cell ss:Index="5"><Data ss:Type="String">Location Details 1</Data></Cell>
626 <Cell ss:Index="7"><Data ss:Type="String">위치 세부사항 1</Data></Cell>
627 </Row>
628 <Row>
629 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
630 <Cell><Data ss:Type="String">/panel_login/LocationDetails2</Data></Cell>
631 <Cell ss:Index="5"><Data ss:Type="String">Location Details 2</Data></Cell>
632 <Cell ss:Index="7"><Data ss:Type="String">위치 세부사항 2</Data></Cell>
633 </Row>
634 <Row>
635 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
636 <Cell><Data ss:Type="String">/panel_login/Region</Data></Cell>
637 <Cell ss:Index="5"><Data ss:Type="String">Region</Data></Cell>
638 <Cell ss:Index="7"><Data ss:Type="String">지역</Data></Cell>
639 </Row>
640 <Row>
641 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
642 <Cell><Data ss:Type="String">/panel_login/Parcel</Data></Cell>
643 <Cell ss:Index="5"><Data ss:Type="String">Parcel</Data></Cell>
644 <Cell ss:Index="7"><Data ss:Type="String">구íš</Data></Cell>
645 </Row>
646 <Row>
647 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
648 <Cell><Data ss:Type="String">/panel_login/Pos</Data></Cell>
649 <Cell ss:Index="5"><Data ss:Type="String">Pos</Data></Cell>
650 <Cell ss:Index="7"><Data ss:Type="String">Pos</Data></Cell>
651 </Row>
652 <Row>
653 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
654 <Cell><Data ss:Type="String">/panel_login/Sqm</Data></Cell>
655 <Cell ss:Index="5"><Data ss:Type="String">Sqm</Data></Cell>
656 <Cell ss:Index="7"><Data ss:Type="String">Sqm</Data></Cell>
657 </Row>
658 <Row>
659 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
660 <Cell><Data ss:Type="String">/panel_login/Owner</Data></Cell>
661 <Cell ss:Index="5"><Data ss:Type="String">Owner</Data></Cell>
662 <Cell ss:Index="7"><Data ss:Type="String">소유ìž</Data></Cell>
663 </Row>
664 <Row>
665 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
666 <Cell><Data ss:Type="String">/panel_login/Type</Data></Cell>
667 <Cell ss:Index="5"><Data ss:Type="String">Type</Data></Cell>
668 <Cell ss:Index="7"><Data ss:Type="String">유형</Data></Cell>
669 </Row>
670 <Row>
671 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
672 <Cell><Data ss:Type="String">/panel_login/Yes</Data></Cell>
673 <Cell ss:Index="5"><Data ss:Type="String">Yes</Data></Cell>
674 <Cell ss:Index="7"><Data ss:Type="String">예</Data></Cell>
675 </Row>
676 <Row>
677 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
678 <Cell><Data ss:Type="String">/panel_login/No</Data></Cell>
679 <Cell ss:Index="5"><Data ss:Type="String">No</Data></Cell>
680 <Cell ss:Index="7"><Data ss:Type="String">아니오</Data></Cell>
681 </Row>
682 <Row>
683 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
684 <Cell><Data ss:Type="String">/panel_login/Forsale</Data></Cell>
685 <Cell ss:Index="5"><Data ss:Type="String">ForSale</Data></Cell>
686 <Cell ss:Index="7"><Data ss:Type="String">매물</Data></Cell>
687 </Row>
688 <Row>
689 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
690 <Cell><Data ss:Type="String">/panel_login/Traffic</Data></Cell>
691 <Cell ss:Index="5"><Data ss:Type="String">Traffic</Data></Cell>
692 <Cell ss:Index="7"><Data ss:Type="String">통행량</Data></Cell>
693 </Row>
694 <Row>
695 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
696 <Cell><Data ss:Type="String">/panel_login/Last3ChatLines</Data></Cell>
697 <Cell ss:Index="5"><Data ss:Type="String">Last 3 Chat Lines</Data></Cell>
698 <Cell ss:Index="7"><Data ss:Type="String">마지막 3개 채팅 행</Data></Cell>
699 </Row>
700 <Row>
701 <Cell><Data ss:Type="String">LCD_text.xml</Data></Cell>
702 <Cell><Data ss:Type="String">/panel_login/Last3IMLines</Data></Cell>
703 <Cell ss:Index="5"><Data ss:Type="String">Last 3 IM Lines</Data></Cell>
704 <Cell ss:Index="7"><Data ss:Type="String">마지막 3개 메신저 행</Data></Cell>
705 </Row>
706 <Row>
707 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
708 <Cell><Data ss:Type="String">/Popup/about_url</Data></Cell>
709 <Cell><Data ss:Type="String">label</Data></Cell>
710 <Cell ss:Index="5"><Data ss:Type="String">About URL</Data></Cell>
711 <Cell ss:Index="7"><Data ss:Type="String">URL ì •ë³´</Data></Cell>
712 </Row>
713 <Row>
714 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
715 <Cell><Data ss:Type="String">/Popup/teleport_to_url</Data></Cell>
716 <Cell><Data ss:Type="String">label</Data></Cell>
717 <Cell ss:Index="5"><Data ss:Type="String">Teleport to URL</Data></Cell>
718 <Cell ss:Index="7"><Data ss:Type="String">URL로 텔레í¬íЏ</Data></Cell>
719 </Row>
720 <Row>
721 <Cell><Data ss:Type="String">menu_slurl.xml</Data></Cell>
722 <Cell><Data ss:Type="String">/Popup/show_on_map</Data></Cell>
723 <Cell><Data ss:Type="String">label</Data></Cell>
724 <Cell ss:Index="5"><Data ss:Type="String">Show on Map</Data></Cell>
725 <Cell ss:Index="7"><Data ss:Type="String">ì§€ë„ì— í‘œì‹œ</Data></Cell>
726 </Row>
727 <Row>
728 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
729 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting</Data></Cell>
730 <Cell><Data ss:Type="String">label</Data></Cell>
731 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting</Data></Cell>
732 <Cell ss:Index="7"><Data ss:Type="String">버그 신고</Data></Cell>
733 </Row>
734 <Row>
735 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
736 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Public Issue Tracker...</Data></Cell>
737 <Cell><Data ss:Type="String">label</Data></Cell>
738 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker...</Data></Cell>
739 <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ 문제 ì¶”ì í•˜ê¸°</Data></Cell>
740 </Row>
741 <Row>
742 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
743 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Publc Issue Tracker Help...</Data></Cell>
744 <Cell><Data ss:Type="String">label</Data></Cell>
745 <Cell ss:Index="5"><Data ss:Type="String">Public Issue Tracker Help...</Data></Cell>
746 <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ 문제 ì¶”ì í•˜ê¸° ë„움ë§</Data></Cell>
747 </Row>
748 <Row>
749 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
750 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
751 <Cell><Data ss:Type="String">label</Data></Cell>
752 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
753 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
754 </Row>
755 <Row>
756 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
757 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Bug Reporing 101...</Data></Cell>
758 <Cell><Data ss:Type="String">label</Data></Cell>
759 <Cell ss:Index="5"><Data ss:Type="String">Bug Reporting 101...</Data></Cell>
760 <Cell ss:Index="7"><Data ss:Type="String">버그 보고 101</Data></Cell>
761 </Row>
762 <Row>
763 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
764 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Security Issues...</Data></Cell>
765 <Cell><Data ss:Type="String">label</Data></Cell>
766 <Cell ss:Index="5"><Data ss:Type="String">Security Issues...</Data></Cell>
767 <Cell ss:Index="7"><Data ss:Type="String">보안 문제</Data></Cell>
768 </Row>
769 <Row>
770 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
771 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/QA Wiki...</Data></Cell>
772 <Cell><Data ss:Type="String">label</Data></Cell>
773 <Cell ss:Index="5"><Data ss:Type="String">QA Wiki...</Data></Cell>
774 <Cell ss:Index="7"><Data ss:Type="String">QA 위키</Data></Cell>
775 </Row>
776 <Row>
777 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
778 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/separator7</Data></Cell>
779 <Cell><Data ss:Type="String">label</Data></Cell>
780 <Cell ss:Index="5"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
781 <Cell ss:Index="7"><Data ss:Type="String">&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;&#45;-</Data></Cell>
782 </Row>
783 <Row>
784 <Cell><Data ss:Type="String">menu_viewer.xml</Data></Cell>
785 <Cell><Data ss:Type="String">/Main Menu/Tools/Bug Reporting/Report Bug...</Data></Cell>
786 <Cell><Data ss:Type="String">label</Data></Cell>
787 <Cell ss:Index="5"><Data ss:Type="String">Report Bug...</Data></Cell>
788 <Cell ss:Index="7"><Data ss:Type="String">버그 신고</Data></Cell>
789 </Row>
790 <Row>
791 <Cell><Data ss:Type="String">notify.xml</Data></Cell>
792 <Cell><Data ss:Type="String">//VoiceChannelJoinFailed/message</Data></Cell>
793 <Cell ss:Index="5"><Data ss:Type="String">Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.</Data></Cell>
794 <Cell ss:Index="7"><Data ss:Type="String">[VOICE_CHANNEL_NAME]ì— ì—°ê²°í•˜ì§€ 못했습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하십시오. ì´ì œ ê³µê°„ì´ ì¡´ìž¬í•˜ëŠ” ìŒì„± 채팅으로 다시 ì—°ê²°ë©ë‹ˆë‹¤.</Data></Cell>
795 </Row>
796 <Row>
797 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
798 <Cell><Data ss:Type="String">/Classified/update_txt</Data></Cell>
799 <Cell ss:Index="5"><Data ss:Type="String">Update</Data></Cell>
800 <Cell ss:Index="7"><Data ss:Type="String">ì—…ë°ì´íЏ</Data></Cell>
801 </Row>
802 <Row>
803 <Cell><Data ss:Type="String">panel_avatar_classified.xml</Data></Cell>
804 <Cell><Data ss:Type="String">/Classified/publish_txt</Data></Cell>
805 <Cell ss:Index="5"><Data ss:Type="String">Publish...</Data></Cell>
806 <Cell ss:Index="7"><Data ss:Type="String">게시하기¡¦</Data></Cell>
807 </Row>
808 <Row>
809 <Cell><Data ss:Type="String">panel_groups.xml</Data></Cell>
810 <Cell><Data ss:Type="String">/groups/group list/name</Data></Cell>
811 <Cell><Data ss:Type="String">label</Data></Cell>
812 </Row>
813 <Row>
814 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
815 <Cell><Data ss:Type="String">/general_tab/group_info_unchanged</Data></Cell>
816 <Cell ss:Index="5"><Data ss:Type="String">General group information has changed.</Data></Cell>
817 <Cell ss:Index="7"><Data ss:Type="String">ì¼ë°˜ 그룹 ì •ë³´ê°€ 변경ë˜ì—ˆìŠµë‹ˆë‹¤.</Data></Cell>
818 </Row>
819 <Row>
820 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
821 <Cell><Data ss:Type="String">/land_money_tab/land_contrib_error</Data></Cell>
822 <Cell ss:Index="5"><Data ss:Type="String">Unable to set your land contribution.</Data></Cell>
823 <Cell ss:Index="7"><Data ss:Type="String">ê·€í•˜ì˜ í† ì§€ 기부를 설정할 수 없습니다.</Data></Cell>
824 </Row>
825 <Row>
826 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
827 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
828 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
829 <Cell ss:Index="7"><Data ss:Type="String">서버를 ì—…ë°ì´íŠ¸í•˜ì§€ 않으면 토지소개를 ë³¼ 수 없습니다.</Data></Cell>
830 </Row>
831 <Row>
832 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
833 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
834 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
835 <Cell ss:Index="7"><Data ss:Type="String">현재 ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하십시오.</Data></Cell>
836 </Row>
837 <Row>
838 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
839 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
840 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
841 <Cell ss:Index="7"><Data ss:Type="String">ì ‘ê·¼ 제한으로 ì¸í•´ ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. êµ¬íš ì†Œìœ ìžì—게 ê¶Œí•œì„ í™•ì¸í•˜ì‹­ì‹œì˜¤.</Data></Cell>
842 </Row>
843 <Row>
844 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
845 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
846 <Cell ss:Index="5"><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
847 <Cell ss:Index="7"><Data ss:Type="String">통행량: [TRAFFIC]</Data></Cell>
848 </Row>
849 <Row>
850 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
851 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
852 <Cell ss:Index="5"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
853 <Cell ss:Index="7"><Data ss:Type="String">ë©´ì : [AREA]제곱미터</Data></Cell>
854 </Row>
855 <Row>
856 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
857 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
858 <Cell ss:Index="5"><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
859 <Cell ss:Index="7"><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell>
860 </Row>
861 <Row>
862 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
863 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
864 <Cell ss:Index="5"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
865 <Cell ss:Index="7"><Data ss:Type="String">경매 ID [ID].</Data></Cell>
866 </Row>
867 <Row>
868 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
869 <Cell><Data ss:Type="String">/Place/server_update_text</Data></Cell>
870 <Cell ss:Index="5"><Data ss:Type="String">Place information not available without server update.</Data></Cell>
871 <Cell ss:Index="7"><Data ss:Type="String">서버를 ì—…ë°ì´íŠ¸í•˜ì§€ 않으면 지역 소개를 ë³¼ 수 없습니다.</Data></Cell>
872 </Row>
873 <Row>
874 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
875 <Cell><Data ss:Type="String">/Place/server_error_text</Data></Cell>
876 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable at this time, please try again later.</Data></Cell>
877 <Cell ss:Index="7"><Data ss:Type="String">현재 ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. ë‚˜ì¤‘ì— ë‹¤ì‹œ 시ë„하십시오.</Data></Cell>
878 </Row>
879 <Row>
880 <Cell><Data ss:Type="String">panel_place_small.xml</Data></Cell>
881 <Cell><Data ss:Type="String">/Place/server_forbidden_text</Data></Cell>
882 <Cell ss:Index="5"><Data ss:Type="String">Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.</Data></Cell>
883 <Cell ss:Index="7"><Data ss:Type="String">ì ‘ê·¼ 제한으로 ì¸í•´ ì´ í† ì§€ì— ëŒ€í•œ 소개를 ë³¼ 수 없습니다. êµ¬íš ì†Œìœ ìžì—게 ê¶Œí•œì„ í™•ì¸í•˜ì‹­ì‹œì˜¤.</Data></Cell>
884 </Row>
885 <Row>
886 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
887 <Cell><Data ss:Type="String">/LCD Options</Data></Cell>
888 <Cell><Data ss:Type="String">label</Data></Cell>
889 <Cell ss:Index="5"><Data ss:Type="String">Logitech LCD</Data></Cell>
890 <Cell ss:Index="7"><Data ss:Type="String">Logitech LCD</Data></Cell>
891 </Row>
892 <Row>
893 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
894 <Cell><Data ss:Type="String">/LCD Options/LCD Destination:</Data></Cell>
895 <Cell ss:Index="5"><Data ss:Type="String">LCD Destination:</Data></Cell>
896 <Cell ss:Index="7"><Data ss:Type="String">LCD 대ìƒ:</Data></Cell>
897 </Row>
898 <Row>
899 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
900 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
901 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
902 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech G15 Keyboard LCD</Data></Cell>
903 <Cell ss:Index="7"><Data ss:Type="String">ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech G15 키보드 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.</Data></Cell>
904 </Row>
905 <Row>
906 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
907 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationG15</Data></Cell>
908 <Cell ss:Index="5"><Data ss:Type="String">Logitech G15 Gaming Keyboard</Data></Cell>
909 <Cell ss:Index="7"><Data ss:Type="String">Logitech G15 게임 키보드</Data></Cell>
910 </Row>
911 <Row>
912 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
913 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
914 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
915 <Cell ss:Index="5"><Data ss:Type="String">Display forms selected appear on Logitech Z10 Speaker LCD</Data></Cell>
916 <Cell ss:Index="7"><Data ss:Type="String">ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech Z10 스피커 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.</Data></Cell>
917 </Row>
918 <Row>
919 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
920 <Cell><Data ss:Type="String">/LCD Options/LCDDestination/DestinationZ10</Data></Cell>
921 <Cell ss:Index="5"><Data ss:Type="String">Logitech Z10 Speakers</Data></Cell>
922 <Cell ss:Index="7"><Data ss:Type="String">Logitech Z10 스피커</Data></Cell>
923 </Row>
924 <Row>
925 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
926 <Cell><Data ss:Type="String">/LCD Options/LCD Display Options</Data></Cell>
927 <Cell ss:Index="5"><Data ss:Type="String">LCD Display Options:</Data></Cell>
928 <Cell ss:Index="7"><Data ss:Type="String">LCD ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜:</Data></Cell>
929 </Row>
930 <Row>
931 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
932 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
933 <Cell><Data ss:Type="String">label</Data></Cell>
934 <Cell ss:Index="5"><Data ss:Type="String">Display Chat</Data></Cell>
935 <Cell ss:Index="7"><Data ss:Type="String">채팅 표시</Data></Cell>
936 </Row>
937 <Row>
938 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
939 <Cell><Data ss:Type="String">/LCD Options/DisplayChat</Data></Cell>
940 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
941 <Cell ss:Index="5"><Data ss:Type="String">Display Last Chat line in LCD Window</Data></Cell>
942 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë§ˆì§€ë§‰ 채팅 í–‰ 표시</Data></Cell>
943 </Row>
944 <Row>
945 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
946 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
947 <Cell><Data ss:Type="String">label</Data></Cell>
948 <Cell ss:Index="5"><Data ss:Type="String">Display IM's</Data></Cell>
949 <Cell ss:Index="7"><Data ss:Type="String">메신저 표시</Data></Cell>
950 </Row>
951 <Row>
952 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
953 <Cell><Data ss:Type="String">/LCD Options/DisplayIM</Data></Cell>
954 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
955 <Cell ss:Index="5"><Data ss:Type="String">Display Last IM in LCD Window</Data></Cell>
956 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë§ˆì§€ë§‰ 메신저 표시</Data></Cell>
957 </Row>
958 <Row>
959 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
960 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
961 <Cell><Data ss:Type="String">label</Data></Cell>
962 <Cell ss:Index="5"><Data ss:Type="String">Show Location Information</Data></Cell>
963 <Cell ss:Index="7"><Data ss:Type="String">위치 정보 표시</Data></Cell>
964 </Row>
965 <Row>
966 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
967 <Cell><Data ss:Type="String">/LCD Options/DisplayRegion</Data></Cell>
968 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
969 <Cell ss:Index="5"><Data ss:Type="String">Display current location information in LCD Window</Data></Cell>
970 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— í˜„ìž¬ 위치 ì •ë³´ 표시</Data></Cell>
971 </Row>
972 <Row>
973 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
974 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
975 <Cell><Data ss:Type="String">label</Data></Cell>
976 <Cell ss:Index="5"><Data ss:Type="String">Show Account Information</Data></Cell>
977 <Cell ss:Index="7"><Data ss:Type="String">계정 정보 표시</Data></Cell>
978 </Row>
979 <Row>
980 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
981 <Cell><Data ss:Type="String">/LCD Options/DisplayLinden</Data></Cell>
982 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
983 <Cell ss:Index="5"><Data ss:Type="String">Display current account information in LCD Window</Data></Cell>
984 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— í˜„ìž¬ 계정 ì •ë³´ 표시</Data></Cell>
985 </Row>
986 <Row>
987 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
988 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
989 <Cell><Data ss:Type="String">label</Data></Cell>
990 <Cell ss:Index="5"><Data ss:Type="String">Display Network Comms Info</Data></Cell>
991 <Cell ss:Index="7"><Data ss:Type="String">ë„¤íŠ¸ì›Œí¬ í†µì‹  ì •ë³´ 표시</Data></Cell>
992 </Row>
993 <Row>
994 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
995 <Cell><Data ss:Type="String">/LCD Options/DisplayDebug</Data></Cell>
996 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
997 <Cell ss:Index="5"><Data ss:Type="String">Display debug information in LCD Window</Data></Cell>
998 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ë””ë²„ê·¸ ì •ë³´ 표시</Data></Cell>
999 </Row>
1000 <Row>
1001 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
1002 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
1003 <Cell><Data ss:Type="String">label</Data></Cell>
1004 <Cell ss:Index="5"><Data ss:Type="String">Display Debug Info from Console</Data></Cell>
1005 <Cell ss:Index="7"><Data ss:Type="String">ì½˜ì†”ì˜ ë””ë²„ê·¸ ì •ë³´ 표시</Data></Cell>
1006 </Row>
1007 <Row>
1008 <Cell><Data ss:Type="String">panel_preferences_LCD.xml</Data></Cell>
1009 <Cell><Data ss:Type="String">/LCD Options/DisplayDebugConsole</Data></Cell>
1010 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1011 <Cell ss:Index="5"><Data ss:Type="String">Display console debug information in LCD Window</Data></Cell>
1012 <Cell ss:Index="7"><Data ss:Type="String">LCD ì°½ì— ì½˜ì†” 디버그 ì •ë³´ 표시</Data></Cell>
1013 </Row>
1014 <Row>
1015 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1016 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1017 <Cell><Data ss:Type="String">label</Data></Cell>
1018 <Cell ss:Index="5"><Data ss:Type="String">Search</Data></Cell>
1019 <Cell ss:Index="7"><Data ss:Type="String">검색</Data></Cell>
1020 </Row>
1021 <Row>
1022 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1023 <Cell><Data ss:Type="String">/status/search_editor</Data></Cell>
1024 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1025 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1026 <Cell ss:Index="7"><Data ss:Type="String">Second Life 검색</Data></Cell>
1027 </Row>
1028 <Row>
1029 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1030 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1031 <Cell><Data ss:Type="String">label</Data></Cell>
1032 </Row>
1033 <Row>
1034 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1035 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1036 <Cell><Data ss:Type="String">label_selected</Data></Cell>
1037 </Row>
1038 <Row>
1039 <Cell><Data ss:Type="String">panel_status_bar.xml</Data></Cell>
1040 <Cell><Data ss:Type="String">/status/search_btn</Data></Cell>
1041 <Cell><Data ss:Type="String">tool_tip</Data></Cell>
1042 <Cell ss:Index="5"><Data ss:Type="String">Search Second Life</Data></Cell>
1043 <Cell ss:Index="7"><Data ss:Type="String">Second Life 검색</Data></Cell>
1044 </Row>
1045 </Table>
1046 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
1047 <Selected/>
1048 <TopRowVisible>18</TopRowVisible>
1049 <Panes>
1050 <Pane>
1051 <Number>3</Number>
1052 <ActiveRow>10</ActiveRow>
1053 <ActiveCol>2</ActiveCol>
1054 </Pane>
1055 </Panes>
1056 <ProtectObjects>False</ProtectObjects>
1057 <ProtectScenarios>False</ProtectScenarios>
1058 </WorksheetOptions>
1059 </Worksheet>
1060</Workbook>
diff --git a/linden/indra/newview/skins/xui/ko/need_to_update.xml b/linden/indra/newview/skins/xui/ko/need_to_update.xml
new file mode 100644
index 0000000..f4f06dd
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/need_to_update.xml
@@ -0,0 +1,420 @@
1<?xml version="1.0"?>
2<?mso-application progid="Excel.Sheet"?>
3<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
4 xmlns:o="urn:schemas-microsoft-com:office:office"
5 xmlns:x="urn:schemas-microsoft-com:office:excel"
6 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
7 xmlns:html="http://www.w3.org/TR/REC-html40">
8 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
9 <LastAuthor>Leyla Farazha</LastAuthor>
10 <Created>2007-11-21T00:54:19Z</Created>
11 <LastSaved>2007-11-21T01:15:31Z</LastSaved>
12 <Version>11.6568</Version>
13 </DocumentProperties>
14 <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
15 <WindowHeight>10230</WindowHeight>
16 <WindowWidth>22875</WindowWidth>
17 <WindowTopX>-2880</WindowTopX>
18 <WindowTopY>2355</WindowTopY>
19 <ProtectStructure>False</ProtectStructure>
20 <ProtectWindows>False</ProtectWindows>
21 </ExcelWorkbook>
22 <Styles>
23 <Style ss:ID="Default" ss:Name="Normal">
24 <Alignment ss:Vertical="Bottom"/>
25 <Borders/>
26 <Font/>
27 <Interior/>
28 <NumberFormat/>
29 <Protection/>
30 </Style>
31 <Style ss:ID="s21">
32 <Font ss:Bold="1"/>
33 </Style>
34 <Style ss:ID="s22">
35 <Font ss:Bold="1"/>
36 <Interior ss:Color="#C0C0C0" ss:Pattern="Solid"/>
37 </Style>
38 <Style ss:ID="s23">
39 <Alignment ss:Vertical="Bottom" ss:WrapText="1"/>
40 </Style>
41 </Styles>
42 <Worksheet ss:Name="need_to_update2">
43 <Table ss:ExpandedColumnCount="7" ss:ExpandedRowCount="43" x:FullColumns="1"
44 x:FullRows="1">
45 <Column ss:Width="63.75"/>
46 <Column ss:Width="70.5"/>
47 <Column ss:Width="88.5"/>
48 <Column ss:Width="63.75"/>
49 <Column ss:Width="69.75"/>
50 <Column ss:Width="90.75"/>
51 <Column ss:Width="97.5"/>
52 <Row>
53 <Cell ss:StyleID="s21"><Data ss:Type="String">/strings</Data></Cell>
54 </Row>
55 <Row>
56 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/a_file</Data></Cell>
57 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/b_path</Data></Cell>
58 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/c_attribute</Data></Cell>
59 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/d_old</Data></Cell>
60 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/e_new</Data></Cell>
61 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_old_trans</Data></Cell>
62 <Cell ss:StyleID="s22"><Data ss:Type="String">/string/f_translation</Data></Cell>
63 </Row>
64 <Row ss:Height="153">
65 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
66 <Cell><Data ss:Type="String">//ClickPublishHelpAvatar/message</Data></Cell>
67 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Selecting the &quot;Publish in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
68 <Cell ss:StyleID="s23"><Data ss:Type="String">Selecting &quot;Show in Search&quot; will show:&#10; - my profile in search results&#10; - a link to my profile in public group pages</Data></Cell>
69 <Cell ss:StyleID="s23"><Data ss:Type="String">ì›¹ì— ê²Œì‹œ ì˜µì…˜ì„ ì„ íƒí•˜ë©´ &#10;[SECOND_LIFE] &#10; 웹 사ì´íŠ¸ì— ë‚´ ì´ë¦„, ì´ë¯¸ì§€ ë° 'ìžê¸° 소개' í…스트를 게시할 수 있습니다.</Data></Cell>
70 <Cell ss:StyleID="s23"><Data ss:Type="String">&quot;검색 보기&quot; ì˜µì…˜ì„ ì„ íƒí•˜ë©´&#10; 웹 사ì´íЏì—서 ë‚´ ì´ë¦„, ì´ë¯¸ì§€&#10; ë° 'ìžê¸° 소개' í…스트를 ë³¼ 수 있습니다.</Data></Cell>
71 </Row>
72 <Row>
73 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
74 <Cell><Data ss:Type="String">//ErrorEncodingSnapshot/message</Data></Cell>
75 <Cell ss:Index="4"><Data ss:Type="String">Error encoding snapshot.</Data></Cell>
76 <Cell><Data ss:Type="String">Error encoding snapshot!</Data></Cell>
77 <Cell><Data ss:Type="String">스냅샷 ì¸ì½”딩 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.</Data></Cell>
78 <Cell><Data ss:Type="String">스냅샷 ì¸ì½”딩 중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤.</Data></Cell>
79 </Row>
80 <Row ss:Height="409.5">
81 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
82 <Cell><Data ss:Type="String">//AddClassified/message</Data></Cell>
83 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Search directory and on www.secondlife.com for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
84 <Cell ss:StyleID="s23"><Data ss:Type="String">Classified ads appear in the 'Classified' section of the&#10;Find directory for one week.&#10; &#10;Fill out your ad, then click 'Publish...' to add it to the&#10;directory.&#10; &#10;You'll be asked for a price to pay when clicking Publish.&#10;Paying more makes your ad appear higher in the list, and&#10;also appear higher when people search for keywords.</Data></Cell>
85 <Cell ss:StyleID="s23"><Data ss:Type="String">ë¶„ë¥˜ëœ ê´‘ê³ ê°€ 1ì£¼ì¼ ë™ì•ˆ 찾기 ë””ë ‰í† ë¦¬ì˜ 'ê´‘ê³ ' ì„¹ì…˜ì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.&#10; &#10;광고를 작성한 후 '게시하기'를 í´ë¦­í•˜ì—¬ ë””ë ‰í† ë¦¬ì— ì¶”ê°€í•©ë‹ˆë‹¤.&#10; &#10;게시하기를 í´ë¦­í•˜ë©´ 요금 결제를 묻는 메시지가 나타납니다.&#10;ë” ë†’ì€ ê°€ê²©ì„ ì§€ë¶ˆí• ìˆ˜ë¡ ëª©ë¡ì—서 ë” ë†’ì€ ìœ„ì¹˜ì— ê²Œìž¬ë˜ê³  키워드 검색 시 ê²°ê³¼ì— ë” ìš°ì„ ì ìœ¼ë¡œ 표시ë©ë‹ˆë‹¤.</Data></Cell>
86 <Cell ss:StyleID="s23"><Data ss:Type="String">ë¶„ë¥˜ëœ ê´‘ê³ ê°€ 1ì£¼ì¼ ë™ì•ˆ ë””ë ‰í† ë¦¬ì˜ 'ê´‘ê³ ' 섹션ì—&#10;나타납니다.&#10; &#10;광고를 작성한 후 '게시하기'를 í´ë¦­í•˜ì—¬ 디렉토리ì—&#10;추가합니다.&#10; &#10;게시하기를 í´ë¦­í•˜ë©´ 요금 결제를 묻는 메시지가 나타납니다.&#10;ë” ë†’ì€ ê°€ê²©ì„ ì§€ë¶ˆí• ìˆ˜ë¡ ëª©ë¡ì—서 ë” ë†’ì€ ìœ„ì¹˜ì— ê²Œìž¬ë˜ê³ &#10;키워드 검색 시 ê²°ê³¼ì— ë” ìš°ì„ ì ìœ¼ë¡œ 표시ë©ë‹ˆë‹¤.</Data></Cell>
87 </Row>
88 <Row ss:Height="178.5">
89 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
90 <Cell><Data ss:Type="String">//HelpEstateExternallyVisible/message</Data></Cell>
91 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10; estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
92 <Cell ss:StyleID="s23"><Data ss:Type="String">This checkbox sets whether Residents who are on other estates can enter this&#10;estate without being on an access list.&#10; &#10;Default: on</Data></Cell>
93 <Cell ss:StyleID="s23"><Data ss:Type="String">다른 사유지 ë‚´ì— ìžˆëŠ” 주민들ì´&#10; ì ‘ê·¼ 권한 ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ìžˆì§€ ì•Šì•„ë„ ì´ ì‚¬ìœ ì§€ì— ë“¤ì–´ê°ˆ 수 있는지 여부를 설정합니다.&#10; &#10;기본 설정: 켜ì§</Data></Cell>
94 <Cell ss:StyleID="s23"><Data ss:Type="String">다른 사유지 ë‚´ì— ìžˆëŠ” 주민들ì´&#10;ì ‘ê·¼ 권한 ë¦¬ìŠ¤íŠ¸ì— ì˜¬ë¼ìžˆì§€ ì•Šì•„ë„ ì´ ì‚¬ìœ ì§€ì— ë“¤ì–´ê°ˆ 수 있는지 여부를 설정합니다.&#10; &#10;기본 설정: 켜ì§</Data></Cell>
95 </Row>
96 <Row ss:Height="204">
97 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
98 <Cell><Data ss:Type="String">//HelpEstateAllowResident/message</Data></Cell>
99 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10; listed here and any groups below. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
100 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to Residents &#10;listed here and any groups below. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
101 <Cell ss:StyleID="s23"><Data ss:Type="String">사유지 ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ì— 있는 주민들과 아래 목ë¡ì— 그룹들로 제한ë©ë‹ˆë‹¤.&#10; &#10;(사유지를 ë©”ì¸ëžœë“œì—서 확ì¸í•  수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë  ìˆ˜ 없고, ì´ëŸ¬í•œ 제어는 비활성화 ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨).</Data></Cell>
102 <Cell ss:StyleID="s23"><Data ss:Type="String">사유지 ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ì— 있는 &#10;주민들과 아래 목ë¡ì— 그룹들로 제한ë©ë‹ˆë‹¤. (사유지를 ë©”ì¸ëžœë“œì—서 확ì¸í•  수 있는 경우, &#10;ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë  ìˆ˜ 없고, ì´ëŸ¬í•œ 제어는 비활성화ë©ë‹ˆë‹¤. &#10;'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨)</Data></Cell>
103 </Row>
104 <Row ss:Height="204">
105 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
106 <Cell><Data ss:Type="String">//HelpEstateAllowGroup/message</Data></Cell>
107 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10; listed here and any Residents above. This setting is &#10; only available when Visible from Mainland is &#10; unchecked.</Data></Cell>
108 <Cell ss:StyleID="s23"><Data ss:Type="String">Access to this estate will be limited to groups &#10;listed here and any Residents above. This setting is &#10;only available when Visible from Mainland is &#10;unchecked.</Data></Cell>
109 <Cell ss:StyleID="s23"><Data ss:Type="String">사유지 ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ìƒì˜ 그룹들과 ìœ„ì— íŠ¹ë³„ížˆ í—ˆë½ëœ 주민들로 제한ë©ë‹ˆë‹¤. &#10; &#10;(사유지를 ë©”ì¸ëžœë“œì—서 확ì¸í•  수 있는 경우, ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë  ìˆ˜ 없고, ì´ëŸ¬í•œ 제어는 비활성화 ë©ë‹ˆë‹¤. 'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨).</Data></Cell>
110 <Cell ss:StyleID="s23"><Data ss:Type="String">사유지 ì‚¬ìš©ê¶Œí•œì€ ëª©ë¡ìƒì˜ 그룹들과 &#10;ìœ„ì— íŠ¹ë³„ížˆ í—ˆë½ëœ 주민들로 제한ë©ë‹ˆë‹¤. (사유지를 ë©”ì¸ëžœë“œì—서 확ì¸í•  수 있는 경우, &#10;ì‚¬ìš©ê¶Œí•œì€ ì£¼ë¯¼ ë˜ëŠ” 목ë¡ìƒì˜ 그룹으로 ì œí•œë  ìˆ˜ 없고, ì´ëŸ¬í•œ 제어는 비활성화ë©ë‹ˆë‹¤. &#10;'ì ‘ê·¼ ê±°ë¶€' 목ë¡ë§Œ 사용ë¨)</Data></Cell>
111 </Row>
112 <Row ss:Height="191.25">
113 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
114 <Cell><Data ss:Type="String">//HelpEstateVoiceChat/message</Data></Cell>
115 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10; channels in which residents may hear and talk with others&#10; nearby.&#10;&#10; Default: off</Data></Cell>
116 <Cell ss:StyleID="s23"><Data ss:Type="String">Parcels in this estate are allowed to have their own voice&#10;channels in which residents may hear and talk with others&#10;nearby.&#10;&#10;Default: off</Data></Cell>
117 <Cell ss:StyleID="s23"><Data ss:Type="String">ì´ ì‚¬ìœ ì§€ì˜ êµ¬íšì€ ì£¼ë¯¼ë“¤ì´ ë¶€ê·¼ì— ìžˆëŠ” 다른 사람들과 대화할 수 있는&#10; ìŒì„± 대화를 할수 있게&#10; 설정합니다.&#10;&#10; 기본 설정: 꺼ì§</Data></Cell>
118 <Cell ss:StyleID="s23"><Data ss:Type="String">ì´ ì‚¬ìœ ì§€ì˜ êµ¬íšì€ ì£¼ë¯¼ë“¤ì´ ë¶€ê·¼ì— ìžˆëŠ” 다른 사람들과 대화할 수 있는&#10;ìŒì„± 대화를 í•  수 있게&#10;설정합니다.&#10;&#10;기본 설정: 꺼ì§</Data></Cell>
119 </Row>
120 <Row ss:Height="331.5">
121 <Cell><Data ss:Type="String">alerts.xml</Data></Cell>
122 <Cell><Data ss:Type="String">//BadURL/message</Data></Cell>
123 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10; &#10; [SLURL]&#10; &#10; Most links are similar to this:&#10; &#10; secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about&#10; &#10; Please check the spelling and try again.</Data></Cell>
124 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Life doesn't know how to handle the link:&#10;&#10;[SLURL]&#10;&#10;Most links are similar to this:&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;Please check the spelling and try again.</Data></Cell>
125 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Lifeì—서 ë§í¬ë¡œ ì—°ê²°ë˜ì§€ 않습니다:&#10; &#10; [SLURL]&#10; &#10; ëŒ€ë¶€ë¶„ì˜ ë§í¬ 형ì‹ì€ 다ìŒê³¼ 유사합니다:&#10; &#10; secondlife://app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about&#10; &#10; ë§žì¶¤ë²•ì„ í™•ì¸í•˜ê³  다시 시ë„하십시오.</Data></Cell>
126 <Cell ss:StyleID="s23"><Data ss:Type="String">Second Lifeì—서 ë§í¬ë¡œ ì—°ê²°ë˜ì§€ 않습니다:&#10;&#10;[SLURL]&#10;&#10;ëŒ€ë¶€ë¶„ì˜ ë§í¬ 형ì‹ì€ 다ìŒê³¼ 유사합니다:&#10;&#10;secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-&#10;fd37083abc4c/about&#10;&#10;ë§žì¶¤ë²•ì„ í™•ì¸í•˜ê³  다시 시ë„하십시오.</Data></Cell>
127 </Row>
128 <Row>
129 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
130 <Cell><Data ss:Type="String">/floaterland/landtab/land_options_panel/ShowDirectoryCheck</Data></Cell>
131 <Cell><Data ss:Type="String">label</Data></Cell>
132 <Cell><Data ss:Type="String">Show in Search &gt; Places (L$30/week) under</Data></Cell>
133 <Cell><Data ss:Type="String">Show Place in Search (L$30/week) under</Data></Cell>
134 <Cell><Data ss:Type="String">검색 &gt; 장소(L$30/주)ì— ë³´ì´ê¸°</Data></Cell>
135 <Cell><Data ss:Type="String">장소 검색(L$30/주) 표시 위치</Data></Cell>
136 </Row>
137 <Row ss:Height="25.5">
138 <Cell><Data ss:Type="String">floater_about_land.xml</Data></Cell>
139 <Cell><Data ss:Type="String">/floaterland/landtab/land_media_panel/Media texture:</Data></Cell>
140 <Cell ss:Index="4" ss:StyleID="s23"><Data ss:Type="String">Media&#10;texture:</Data></Cell>
141 <Cell ss:StyleID="s23"><Data ss:Type="String">Sound&#10;Settings:</Data></Cell>
142 <Cell ss:StyleID="s23"><Data ss:Type="String">사운드&#10;설정:</Data></Cell>
143 <Cell ss:StyleID="s23"><Data ss:Type="String">사운드&#10;설정:</Data></Cell>
144 </Row>
145 <Row>
146 <Cell><Data ss:Type="String">floater_directory.xml</Data></Cell>
147 <Cell><Data ss:Type="String">/directory</Data></Cell>
148 <Cell><Data ss:Type="String">title</Data></Cell>
149 <Cell><Data ss:Type="String">Search</Data></Cell>
150 <Cell><Data ss:Type="String">Search Second Life</Data></Cell>
151 <Cell><Data ss:Type="String">검색</Data></Cell>
152 <Cell><Data ss:Type="String">Second Life 검색</Data></Cell>
153 </Row>
154 <Row>
155 <Cell><Data ss:Type="String">floater_html_help.xml</Data></Cell>
156 <Cell><Data ss:Type="String">/htmlhelp/status_text</Data></Cell>
157 <Cell ss:Index="4"><Data ss:Type="String">Done</Data></Cell>
158 <Cell><Data ss:Type="String">Ready</Data></Cell>
159 <Cell><Data ss:Type="String">완료</Data></Cell>
160 <Cell><Data ss:Type="String">준비</Data></Cell>
161 </Row>
162 <Row>
163 <Cell><Data ss:Type="String">floater_lagmeter.xml</Data></Cell>
164 <Cell><Data ss:Type="String">/floater_lagmeter/network_ping_warning_ms</Data></Cell>
165 <Cell ss:Index="4"><Data ss:Type="Number">250</Data></Cell>
166 <Cell><Data ss:Type="Number">300</Data></Cell>
167 <Cell><Data ss:Type="Number">250</Data></Cell>
168 <Cell><Data ss:Type="Number">300</Data></Cell>
169 </Row>
170 <Row>
171 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
172 <Cell><Data ss:Type="String">/land holdings floater/allowed_text</Data></Cell>
173 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
174 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
175 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
176 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
177 </Row>
178 <Row>
179 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
180 <Cell><Data ss:Type="String">/land holdings floater/current_text</Data></Cell>
181 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
182 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
183 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
184 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
185 </Row>
186 <Row>
187 <Cell><Data ss:Type="String">floater_land_holdings.xml</Data></Cell>
188 <Cell><Data ss:Type="String">/land holdings floater/available_text</Data></Cell>
189 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
190 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
191 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
192 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
193 </Row>
194 <Row>
195 <Cell><Data ss:Type="String">floater_tools.xml</Data></Cell>
196 <Cell><Data ss:Type="String">/toolbox floater/Object Info Tabs/General/search_check</Data></Cell>
197 <Cell><Data ss:Type="String">label</Data></Cell>
198 <Cell><Data ss:Type="String">Show in Search</Data></Cell>
199 <Cell><Data ss:Type="String">Show in search</Data></Cell>
200 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
201 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
202 </Row>
203 <Row>
204 <Cell><Data ss:Type="String">menu_inventory.xml</Data></Cell>
205 <Cell><Data ss:Type="String">/Popup/Teleport To Landmark</Data></Cell>
206 <Cell><Data ss:Type="String">label</Data></Cell>
207 <Cell><Data ss:Type="String">Teleport To Landmark</Data></Cell>
208 <Cell><Data ss:Type="String">About Landmark</Data></Cell>
209 <Cell><Data ss:Type="String">랜드마í¬ë¡œ 텔리í¬íЏ</Data></Cell>
210 <Cell><Data ss:Type="String">ëžœë“œë§ˆí¬ ì •ë³´</Data></Cell>
211 </Row>
212 <Row>
213 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
214 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
215 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
216 <Cell><Data ss:Type="String">Input device (microphone):</Data></Cell>
217 <Cell><Data ss:Type="String">입력 레벨</Data></Cell>
218 <Cell><Data ss:Type="String">ìž…ë ¥ 장치(마ì´í¬):</Data></Cell>
219 </Row>
220 <Row>
221 <Cell><Data ss:Type="String">panel_audio_device.xml</Data></Cell>
222 <Cell><Data ss:Type="String">/device_settings/Input device (microphone):</Data></Cell>
223 <Cell ss:Index="4"><Data ss:Type="String">Audio Devices</Data></Cell>
224 <Cell><Data ss:Type="String">Input Level</Data></Cell>
225 <Cell><Data ss:Type="String">입력 레벨</Data></Cell>
226 <Cell><Data ss:Type="String">입력 레벨</Data></Cell>
227 </Row>
228 <Row>
229 <Cell><Data ss:Type="String">panel_avatar.xml</Data></Cell>
230 <Cell><Data ss:Type="String">/Panel Avatar/tab/2nd Life/allow_publish</Data></Cell>
231 <Cell><Data ss:Type="String">label</Data></Cell>
232 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
233 <Cell><Data ss:Type="String">Show in search</Data></Cell>
234 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
235 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
236 </Row>
237 <Row>
238 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
239 <Cell><Data ss:Type="String">/general_tab/preferences_container/show_in_group_list</Data></Cell>
240 <Cell><Data ss:Type="String">label</Data></Cell>
241 <Cell><Data ss:Type="String">Show In Search</Data></Cell>
242 <Cell><Data ss:Type="String">Show in search</Data></Cell>
243 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
244 <Cell><Data ss:Type="String">검색 보기</Data></Cell>
245 </Row>
246 <Row>
247 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
248 <Cell><Data ss:Type="String">/general_tab/preferences_container/mature</Data></Cell>
249 <Cell><Data ss:Type="String">label</Data></Cell>
250 <Cell><Data ss:Type="String">Mature Group</Data></Cell>
251 <Cell><Data ss:Type="String">Mature group</Data></Cell>
252 <Cell><Data ss:Type="String">ì„±ì¸ ê·¸ë£¹</Data></Cell>
253 <Cell><Data ss:Type="String">ì„±ì¸ ê·¸ë£¹</Data></Cell>
254 </Row>
255 <Row>
256 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
257 <Cell><Data ss:Type="String">/general_tab/preferences_container/open_enrollement</Data></Cell>
258 <Cell><Data ss:Type="String">label</Data></Cell>
259 <Cell><Data ss:Type="String">Open Enrollment</Data></Cell>
260 <Cell><Data ss:Type="String">Open enrollment</Data></Cell>
261 <Cell><Data ss:Type="String">ìžìœ  가입</Data></Cell>
262 <Cell><Data ss:Type="String">ìžìœ  가입</Data></Cell>
263 </Row>
264 <Row>
265 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
266 <Cell><Data ss:Type="String">/general_tab/preferences_container/check_enrollment_fee</Data></Cell>
267 <Cell><Data ss:Type="String">label</Data></Cell>
268 <Cell><Data ss:Type="String">Enrollment Fee: L$</Data></Cell>
269 <Cell><Data ss:Type="String">Enrollment fee: L$</Data></Cell>
270 <Cell><Data ss:Type="String">가입비: L$</Data></Cell>
271 <Cell><Data ss:Type="String">가입비: L$</Data></Cell>
272 </Row>
273 <Row>
274 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
275 <Cell><Data ss:Type="String">/general_tab/preferences_container/receive_notices</Data></Cell>
276 <Cell><Data ss:Type="String">label</Data></Cell>
277 <Cell><Data ss:Type="String">Receive Group Notices</Data></Cell>
278 <Cell><Data ss:Type="String">Receive group notices</Data></Cell>
279 <Cell><Data ss:Type="String">그룹 공지 수령</Data></Cell>
280 <Cell><Data ss:Type="String">그룹 공지 수령</Data></Cell>
281 </Row>
282 <Row>
283 <Cell><Data ss:Type="String">panel_group_general.xml</Data></Cell>
284 <Cell><Data ss:Type="String">/general_tab/preferences_container/list_groups_in_profile</Data></Cell>
285 <Cell><Data ss:Type="String">label</Data></Cell>
286 <Cell><Data ss:Type="String">List Group in Profile</Data></Cell>
287 <Cell><Data ss:Type="String">List group in my profile</Data></Cell>
288 <Cell><Data ss:Type="String">í”„ë¡œí•„ì— ê·¸ë£¹ í¬í•¨í•˜ê¸°</Data></Cell>
289 <Cell><Data ss:Type="String">í”„ë¡œí•„ì— ê·¸ë£¹ í¬í•¨í•˜ê¸°</Data></Cell>
290 </Row>
291 <Row>
292 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
293 <Cell><Data ss:Type="String">/land_money_tab/total_contributed_land_value</Data></Cell>
294 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
295 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
296 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
297 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
298 </Row>
299 <Row>
300 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
301 <Cell><Data ss:Type="String">/land_money_tab/total_land_in_use_value</Data></Cell>
302 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
303 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
304 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
305 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
306 </Row>
307 <Row>
308 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
309 <Cell><Data ss:Type="String">/land_money_tab/land_available_value</Data></Cell>
310 <Cell ss:Index="4"><Data ss:Type="String">0 sq. meters</Data></Cell>
311 <Cell><Data ss:Type="String">[AREA] sq. meters</Data></Cell>
312 <Cell><Data ss:Type="String">0제곱미터</Data></Cell>
313 <Cell><Data ss:Type="String">[AREA]제곱미터</Data></Cell>
314 </Row>
315 <Row>
316 <Cell><Data ss:Type="String">panel_group_land_money.xml</Data></Cell>
317 <Cell><Data ss:Type="String">/land_money_tab/your_contribution_max_value</Data></Cell>
318 <Cell ss:Index="4"><Data ss:Type="String">([AMOUNT] max)</Data></Cell>
319 <Cell><Data ss:Type="String">sq. meters ([AMOUNT] max)</Data></Cell>
320 <Cell><Data ss:Type="String">(최대 [AMOUNT])</Data></Cell>
321 <Cell><Data ss:Type="String">제곱미터(최대 [AMOUNT])</Data></Cell>
322 </Row>
323 <Row>
324 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
325 <Cell><Data ss:Type="String">/Place/traffic_text</Data></Cell>
326 <Cell ss:Index="4"><Data ss:Type="String">Traffic: [TRAFFIC].</Data></Cell>
327 <Cell><Data ss:Type="String">Traffic: [TRAFFIC]</Data></Cell>
328 <Cell><Data ss:Type="String">통행량: [TRAFFIC].</Data></Cell>
329 <Cell><Data ss:Type="String">통행량: [TRAFFIC]</Data></Cell>
330 </Row>
331 <Row>
332 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
333 <Cell><Data ss:Type="String">/Place/area_text</Data></Cell>
334 <Cell ss:Index="4"><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
335 <Cell><Data ss:Type="String">Area: [AREA] sq. m.</Data></Cell>
336 <Cell><Data ss:Type="String">ë©´ì : [AREA]sq. m.</Data></Cell>
337 <Cell><Data ss:Type="String">ë©´ì : [AREA]제곱미터</Data></Cell>
338 </Row>
339 <Row>
340 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
341 <Cell><Data ss:Type="String">/Place/forsale_text</Data></Cell>
342 <Cell ss:Index="4"><Data ss:Type="String">For Sale for L$ [PRICE].</Data></Cell>
343 <Cell><Data ss:Type="String">For Sale for L$ [PRICE]</Data></Cell>
344 <Cell><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell>
345 <Cell><Data ss:Type="String">L$ [PRICE]ì— íŒë§¤.</Data></Cell>
346 </Row>
347 <Row>
348 <Cell><Data ss:Type="String">panel_place.xml</Data></Cell>
349 <Cell><Data ss:Type="String">/Place/auction_text</Data></Cell>
350 <Cell ss:Index="4"><Data ss:Type="String">Auction ID [ID].</Data></Cell>
351 <Cell><Data ss:Type="String">Auction ID [ID].</Data></Cell>
352 <Cell><Data ss:Type="String">경매 ID [ID].</Data></Cell>
353 <Cell><Data ss:Type="String">경매 ID [ID].</Data></Cell>
354 </Row>
355 <Row>
356 <Cell><Data ss:Type="String">panel_preferences_audio.xml</Data></Cell>
357 <Cell><Data ss:Type="String">/Media panel/doppler_effect_text</Data></Cell>
358 <Cell ss:Index="4"><Data ss:Type="String">Streaming Preferences:</Data></Cell>
359 <Cell><Data ss:Type="String">Audio Preferences:</Data></Cell>
360 <Cell><Data ss:Type="String">오디오 환경 설정:</Data></Cell>
361 <Cell><Data ss:Type="String">오디오 환경 설정:</Data></Cell>
362 </Row>
363 <Row>
364 <Cell><Data ss:Type="String">panel_preferences_im.xml</Data></Cell>
365 <Cell><Data ss:Type="String">/im/text_box3</Data></Cell>
366 <Cell ss:Index="4"><Data ss:Type="String">Busy Mode Response:</Data></Cell>
367 <Cell><Data ss:Type="String">Logging Options:</Data></Cell>
368 <Cell><Data ss:Type="String">ë¡œê·¸ì¸ ì˜µì…˜:</Data></Cell>
369 <Cell><Data ss:Type="String">ë¡œê·¸ì¸ ì˜µì…˜:</Data></Cell>
370 </Row>
371 <Row>
372 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
373 <Cell><Data ss:Type="String">/chat/ear_location/0</Data></Cell>
374 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
375 <Cell><Data ss:Type="String">Hear Voice Chat from camera position.</Data></Cell>
376 <Cell><Data ss:Type="String">ì¹´ë©”ë¼ ìœ„ì¹˜ì—서 ìŒì„± 채팅 ì²­ì·¨</Data></Cell>
377 <Cell><Data ss:Type="String">ì¹´ë©”ë¼ ìœ„ì¹˜ì—서 ìŒì„± 채팅 ì²­ì·¨</Data></Cell>
378 </Row>
379 <Row>
380 <Cell><Data ss:Type="String">panel_preferences_voice.xml</Data></Cell>
381 <Cell><Data ss:Type="String">/chat/ear_location/1</Data></Cell>
382 <Cell ss:Index="4"><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
383 <Cell><Data ss:Type="String">Hear Voice Chat from avatar position.</Data></Cell>
384 <Cell><Data ss:Type="String">아바타 위치ì—서 ìŒì„± 채팅 ì²­ì·¨</Data></Cell>
385 <Cell><Data ss:Type="String">아바타 위치ì—서 ìŒì„± 채팅 ì²­ì·¨</Data></Cell>
386 </Row>
387 <Row>
388 <Cell><Data ss:Type="String">panel_region_general.xml</Data></Cell>
389 <Cell><Data ss:Type="String">/General/block_parcel_search_check</Data></Cell>
390 <Cell><Data ss:Type="String">label</Data></Cell>
391 <Cell><Data ss:Type="String">Block Parcel Search</Data></Cell>
392 <Cell><Data ss:Type="String">Block Land Show in Search</Data></Cell>
393 <Cell><Data ss:Type="String">êµ¬íš ê²€ìƒ‰ 차단</Data></Cell>
394 <Cell><Data ss:Type="String">토지 검색 차단</Data></Cell>
395 </Row>
396 <Row>
397 <Cell><Data ss:Type="String">panel_voice_options.xml</Data></Cell>
398 <Cell><Data ss:Type="String">/content_panel/push_to_talk_check</Data></Cell>
399 <Cell><Data ss:Type="String">label</Data></Cell>
400 <Cell><Data ss:Type="String">Only allow Friends to initiate Voice Calls with me</Data></Cell>
401 <Cell><Data ss:Type="String">Start Viewer in Push-to-Talk mode</Data></Cell>
402 <Cell><Data ss:Type="String">Push-to-Talk 모드로 세컨드ë¼ì´í”„ 시작</Data></Cell>
403 <Cell><Data ss:Type="String">Push-to-Talk 모드로 세컨드ë¼ì´í”„ 시작</Data></Cell>
404 </Row>
405 </Table>
406 <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
407 <Selected/>
408 <Panes>
409 <Pane>
410 <Number>3</Number>
411 <ActiveRow>2</ActiveRow>
412 <ActiveCol>4</ActiveCol>
413 <RangeSelection>R3C5:R43C5</RangeSelection>
414 </Pane>
415 </Panes>
416 <ProtectObjects>False</ProtectObjects>
417 <ProtectScenarios>False</ProtectScenarios>
418 </WorksheetOptions>
419 </Worksheet>
420</Workbook>
diff --git a/linden/indra/newview/skins/xui/ko/panel_login.xml b/linden/indra/newview/skins/xui/ko/panel_login.xml
index 5ce6895..dbac837 100644
--- a/linden/indra/newview/skins/xui/ko/panel_login.xml
+++ b/linden/indra/newview/skins/xui/ko/panel_login.xml
@@ -1,43 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/ko/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 ì´ë¦„:
8 </text>
9 <text name="last_name_text">
10 성
11 </text>
12 <text name="password_text">
13 비밀번호:
14 </text>
15 <text name="start_location_text">
16 시작 위치:
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 홈
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 최종 방문지
24 </combo_item>
25 <combo_item name="Typeregionname">
26 &lt;지역명 입력&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="비밀번호 기억" name="remember_check" />
30 <text name="full_screen_text">
31 로그ì¸í•  때 ë·°ì–´ì— ì „ì²´ í™”ë©´ì´ í‘œì‹œë©ë‹ˆë‹¤.
32 </text>
33 <button label="신규 계정" label_selected="신규 계정" name="new_account_btn" />
34 <button label="환경 설정" label_selected="환경 설정" name="preferences_btn" />
35 <button label="ì—°ê²°" label_selected="ì—°ê²°" name="connect_btn" />
36 <button label="종료" label_selected="종료" name="quit_btn" />
37 <text name="version_text">
38 1.23.4 (5)
39 </text>
40 <text name="channel_text">
41 [Viewer Channel Name]
42 </text> 5 </text>
43</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml b/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml
new file mode 100644
index 0000000..6ee1536
--- /dev/null
+++ b/linden/indra/newview/skins/xui/ko/panel_preferences_LCD.xml
@@ -0,0 +1,31 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel label="Logitech LCD" name="LCD Options">
3 <text name="LCD Destination:">
4 LCD 대ìƒ:
5 </text>
6 <radio_group name="LCDDestination">
7 <radio_item name="DestinationG15"
8 tool_tip="ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech G15 키보드 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.">
9 Logitech G15 게임 키보드
10 </radio_item>
11 <radio_item name="DestinationZ10"
12 tool_tip="ì„ íƒí•œ ë””ìŠ¤í”Œë ˆì´ í˜•ì‹ì´ Logitech Z10 스피커 LCDì— ë‚˜íƒ€ë‚©ë‹ˆë‹¤.">
13 Logitech Z10 스피커
14 </radio_item>
15 </radio_group>
16 <text name="LCD Display Options">
17 LCD ë””ìŠ¤í”Œë ˆì´ ì˜µì…˜:
18 </text>
19 <check_box label="채팅 표시" name="DisplayChat"
20 tool_tip="LCD ì°½ì— ë§ˆì§€ë§‰ 채팅 í–‰ 표시" />
21 <check_box label="메신저 표시" name="DisplayIM"
22 tool_tip="LCD ì°½ì— ë§ˆì§€ë§‰ 메신저 표시" />
23 <check_box label="위치 정보 표시" name="DisplayRegion"
24 tool_tip="LCD ì°½ì— í˜„ìž¬ 위치 ì •ë³´ 표시" />
25 <check_box label="계정 정보 표시" name="DisplayLinden"
26 tool_tip="LCD ì°½ì— í˜„ìž¬ 계정 ì •ë³´ 표시" />
27 <check_box label="ë„¤íŠ¸ì›Œí¬ í†µì‹  ì •ë³´ 표시" name="DisplayDebug"
28 tool_tip="LCD ì°½ì— ë””ë²„ê·¸ ì •ë³´ 표시" />
29 <check_box label="ì½˜ì†”ì˜ ë””ë²„ê·¸ ì •ë³´ 표시" name="DisplayDebugConsole"
30 tool_tip="LCD ì°½ì— ì½˜ì†” 디버그 ì •ë³´ 표시" />
31</panel>
diff --git a/linden/indra/newview/skins/xui/pt/panel_login.xml b/linden/indra/newview/skins/xui/pt/panel_login.xml
index f2703df..9cee6c9 100644
--- a/linden/indra/newview/skins/xui/pt/panel_login.xml
+++ b/linden/indra/newview/skins/xui/pt/panel_login.xml
@@ -1,23 +1,6 @@
1<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel bottom="0" follows="left|top|right|bottom" height="600" hidden="false" left="0" mouse_opaque="true" name="panel_login" width="800"><web_browser border_visible="false" bottom="0" follows="top|left|bottom|right" left="0" name="login_html" right="-1" start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody bgcolor=%22#000000%22 text=%22ffffff%22%3E%3Ch1%3E%3Ctt%3Eloading...%3C/tt%3E%3C/h1%3E %3C/body%3E %3C/html%3E" top="-1" /> 2<panel name="panel_login">
3<text hidden="true" name="real_url">http://www.secondlifebrasil.com.br/client/capa.aspx?v=1_17_0_12</text> 3 <text name="real_url">
4<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="20" hidden="false" left="32" mouse_opaque="true" name="first_name_text" v_pad="0" width="120">Primeiro nome:</text> 4 https://secondlife.com/app/login/pt/?show_login_form=True
5<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="32" max_length="31" mouse_opaque="true" name="first_name_edit" select_all_on_focus_received="true" width="120" /> 5 </text>
6<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="164" mouse_opaque="true" name="last_name_text" v_pad="0" width="120">Sobrenome:</text>
7<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="164" max_length="31" mouse_opaque="true" name="last_name_edit" select_all_on_focus_received="true" width="120" />
8<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="54" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="296" mouse_opaque="true" name="password_text" v_pad="0" width="120">Senha:</text>
9<line_editor bevel_style="in" border_style="line" border_thickness="1" bottom_delta="-24" follows="left|bottom" font="SansSerif" handle_edit_keys_directly="true" height="20" hidden="false" left="296" max_length="16" mouse_opaque="true" name="password_edit" select_all_on_focus_received="true" width="120" />
10<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="10" drop_shadow_visible="true" follows="left|bottom" font="SansSerif" h_pad="0" halign="left" height="16" hidden="false" left="32" mouse_opaque="true" name="start_location_text" v_pad="0" width="85">Localização inicial:</text>
11<combo_box allow_text_entry="true" bottom="8" follows="left|bottom" height="18" hidden="false" left_delta="97" max_chars="128" mouse_opaque="true" name="start_location_combo" width="140"><combo_item name="MyHome" value="My Home">Minha casa</combo_item>
12<combo_item name="MyLastLocation" value="My Last Location">Minha última localização</combo_item>
13<combo_item name="Typeregionname" value="&lt;Type region name&gt;">&lt; Digite o nome da região; </combo_item>
14</combo_box>
15<check_box bottom="10" follows="left|bottom" font="SansSerifSmall" height="16" hidden="false" initial_value="false" label="Lembrar senha" left_delta="167" mouse_opaque="true" name="remember_check" width="138" />
16<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="74" drop_shadow_visible="true" follows="left|bottom" font="SansSerifSmall" h_pad="0" halign="left" height="20" hidden="false" left="32" mouse_opaque="true" name="full_screen_text" v_pad="0" width="252">O visor indicará a tela cheia quando entrar. </text>
17
18<button bottom="46" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Preferências..." label_selected="Preferências..." left="572" mouse_opaque="true" name="preferences_btn" scale_image="TRUE" width="120" />
19<combo_box allow_text_entry="true" bottom="48" follows="left|bottom" height="18" hidden="false" left_delta="128" max_chars="20" mouse_opaque="true" name="server_combo" width="120" />
20<button bottom_delta="-28" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Conectar" label_selected="Conectar" left="440" mouse_opaque="true" name="connect_btn" scale_image="TRUE" width="120" />
21<button bottom_delta="0" follows="left|bottom" font="SansSerif" halign="center" height="24" hidden="false" label="Sair" label_selected="Sair" left="572" mouse_opaque="true" name="quit_btn" scale_image="TRUE" width="120" />
22<text bg_visible="false" border_drop_shadow_visible="false" border_visible="false" bottom="2" drop_shadow_visible="true" follows="right|bottom" font="SansSerifSmall" h_pad="0" halign="right" height="12" hidden="false" left="698" mouse_opaque="true" name="version_text" v_pad="0" width="100">1.23.4 (5)</text>
23</panel> 6</panel>
diff --git a/linden/indra/newview/skins/xui/zh/panel_login.xml b/linden/indra/newview/skins/xui/zh/panel_login.xml
index 5e78b00..a4652ac 100644
--- a/linden/indra/newview/skins/xui/zh/panel_login.xml
+++ b/linden/indra/newview/skins/xui/zh/panel_login.xml
@@ -1,40 +1,6 @@
1<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 1<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
2<panel name="panel_login"> 2<panel name="panel_login">
3 <text name="real_url"> 3 <text name="real_url">
4 http://secondlife.com/app/login/ 4 https://secondlife.com/app/login/zh/?show_login_form=True
5 </text>
6 <text name="first_name_text">
7 å§“:
8 </text>
9 <text name="last_name_text">
10 å:
11 </text>
12 <text name="password_text">
13 密ç :
14 </text>
15 <text name="start_location_text">
16 开始定ä½:
17 </text>
18 <combo_box name="start_location_combo">
19 <combo_item name="MyHome">
20 我的家
21 </combo_item>
22 <combo_item name="MyLastLocation">
23 我的上个ä½ç½®
24 </combo_item>
25 <combo_item name="&lt;Typeregionname&gt;">
26 &lt;输入地域å&gt;
27 </combo_item>
28 </combo_box>
29 <check_box label="è®°ä½å¯†ç " name="remember_check" />
30 <text name="full_screen_text">
31 ç™»é™†åŽæ˜¾ç¤ºå™¨ä¼šé‡‡ç”¨å…¨å±æ˜¾ç¤ºã€‚
32 </text>
33 <button label="æ–°å¸æˆ·..." label_selected="æ–°å¸æˆ·..." name="new_account_btn" />
34 <button label="连接" label_selected="连接" name="connect_btn" />
35 <button label="傿•°é€‰æ‹©..." label_selected="傿•°é€‰æ‹©..." name="preferences_btn" />
36 <button label="退出" label_selected="退出" name="quit_btn" />
37 <text name="version_text">
38 1.23.4 (5)
39 </text> 5 </text>
40</panel> 6</panel>
diff --git a/linden/indra/newview/viewer.cpp b/linden/indra/newview/viewer.cpp
deleted file mode 100644
index 3b24371..0000000
--- a/linden/indra/newview/viewer.cpp
+++ /dev/null
@@ -1,6368 +0,0 @@
1/**
2 * @file viewer.cpp
3 * @brief A window into the virtual world.
4 *
5 * $LicenseInfo:firstyear=2000&license=viewergpl$
6 *
7 * Copyright (c) 2000-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#include "llviewerprecompiledheaders.h"
33
34#include "viewer.h"
35
36#include "llparcel.h"
37#include "llviewerparcelmgr.h"
38#include "llviewerjoystick.h"
39
40// System library headers
41#include <errno.h>
42#include <stdexcept>
43#if LL_WINDOWS
44# include <share.h>
45#else
46# include <sys/file.h>
47# include <signal.h>
48#endif
49#include <sys/stat.h>
50#include <memory>
51#include <boost/tokenizer.hpp>
52
53#if LL_WINDOWS
54#include <fcntl.h> //_O_APPEND
55#include <io.h> //_open_osfhandle()
56#include <errorrep.h> // for AddERExcludedApplicationA()
57#include <process.h> // _spawnl()
58#include <tchar.h> // For TCHAR support
59
60#if LL_WINDOWS && _MSC_VER < 1400
61//#define LL_USE_SMARTHEAP 0
62#else
63#define LL_USE_SMARTHEAP 0
64#endif
65
66#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
67#include "smrtheap/smrtheap.h"
68#endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
69
70#elif LL_DARWIN || LL_LINUX || LL_SOLARIS
71
72 # include <sys/socket.h>
73// # include <sys/stat.h> // mkdir()
74 # include <netinet/in.h>
75 # include <arpa/inet.h> // inet_ntoa()
76
77 #if LL_LINUX
78 # include <dlfcn.h> // RTLD_LAZY
79 # include <execinfo.h> // backtrace - glibc only
80 # ifndef LL_ELFBIN
81 #define LL_ELFBIN 1
82 # endif // LL_ELFBIN
83 # if LL_ELFBIN
84 # include <cxxabi.h> // for symbol demangling
85 # include "ELFIO.h" // for better backtraces
86 # endif // LL_ELFBIN
87 #elif LL_SOLARIS
88 # include <sys/types.h>
89 # include <unistd.h>
90 # include <fcntl.h>
91 # include <ucontext.h>
92 #endif
93
94 #if LL_DARWIN
95 #include <Carbon/Carbon.h>
96 // Apple sucks! AssertMacros.h defines these COMMONLY used names.
97 #ifdef check
98 #undef check
99 #endif
100 #ifdef verify
101 #undef verify
102 #endif // verify
103 #ifdef require
104 #undef require
105 #endif
106 #endif
107#endif // !LL_WINDOWS
108
109// Support for sending crash reports from the viewer?
110//#define LL_SEND_CRASH_REPORTS 0
111
112
113//
114// Linden library headers
115//
116
117#include "audioengine.h"
118#include "llcommon.h"
119#include "llapr.h"
120#include "llares.h"
121#include "llcachename.h"
122#include "llcurl.h"
123#include "llcriticaldamp.h"
124#include "lldir.h"
125#include "lleconomy.h"
126#include "llerrorcontrol.h"
127#include "llhttpnode.h"
128#include "llflexibleobject.h"
129#include "llfasttimer.h"
130#include "llfocusmgr.h"
131#include "llgroupmgr.h"
132#include "llimage.h"
133#include "llimageworker.h"
134#include "lllfsthread.h"
135#include "llmemtype.h"
136#include "llmd5.h"
137#include "llsecondlifeurls.h"
138#include "llversionviewer.h"
139#include "llvfile.h"
140#include "llvfs.h"
141#include "llwindow.h" // for shell_open
142#include "llworkerthread.h"
143#include "llvfsthread.h"
144#include "llxfermanager.h"
145#include "message.h"
146#include "llvoavatar.h"
147#include "llglslshader.h"
148
149//
150// Viewer headers
151//
152
153#include "llagent.h"
154#include "llagentpilot.h"
155#include "llbutton.h" // For constants
156#include "llcallbacklist.h"
157#include "llchatbar.h"
158//#include "llcombobox.h" // For constants
159#include "llconsole.h"
160#include "llcontainerview.h"
161#include "lldebugview.h"
162#include "lldrawpoolbump.h"
163#include "lldrawpoolterrain.h"
164#include "lleventnotifier.h"
165#include "llfasttimerview.h"
166#include "llfeaturemanager.h"
167#include "llfirstuse.h"
168#include "llfloateractivespeakers.h"
169#include "llfloatertools.h"
170#include "llfloaterworldmap.h"
171#include "llfloaterhtmlhelp.h"
172#include "llfloatersaveavatar.h"
173#include "llfloatersnapshot.h"
174#include "llfolderview.h"
175#include "llframestats.h"
176#include "llgesturemgr.h"
177#include "llhoverview.h"
178#include "llhudeffecttrail.h"
179#include "llhudmanager.h"
180#include "llhttpclient.h"
181#include "llimview.h"
182#include "llimpanel.h"
183#include "llinventorymodel.h"
184#include "llinventoryview.h"
185#include "llkeyboard.h"
186#include "llkeyframemotion.h"
187#include "llpanellogin.h"
188#include "llmutelist.h"
189#include "llmenugl.h"
190#include "llnamelistctrl.h"
191#include "llnamebox.h"
192#include "llnameeditor.h"
193#include "llpumpio.h"
194#include "llnotify.h"
195#include "llselectmgr.h"
196#include "llsky.h"
197#include "llsrv.h"
198#include "llstartup.h"
199#include "llstatusbar.h"
200#include "llsurface.h"
201#include "lltexlayer.h"
202#include "lltexturecache.h"
203#include "lltexturefetch.h"
204#include "lltoolbar.h"
205#include "lltoolmgr.h"
206#include "lltracker.h"
207#include "llurldispatcher.h"
208#include "llurlsimstring.h"
209#include "llurlwhitelist.h"
210#include "llv4math.h" // LL_VECTORIZE
211#include "llviewerbuild.h"
212#include "llviewercamera.h"
213#include "llviewercontrol.h"
214#include "llviewerjointmesh.h"
215#include "llviewerimagelist.h"
216#include "llviewerkeyboard.h"
217#include "llviewermenu.h"
218#include "llviewermessage.h"
219#include "llviewernetwork.h"
220#include "llviewerobjectlist.h"
221#include "llviewerparcelmgr.h"
222#include "llviewerregion.h"
223#include "llviewerstats.h"
224#include "llviewerthrottle.h"
225#include "llvieweruictrlfactory.h"
226#include "llviewerwindow.h"
227#include "llvlmanager.h"
228#include "llvoavatar.h"
229#include "llvograss.h"
230#include "llvotree.h"
231#include "llvovolume.h" // To set a static member.
232#include "llvowater.h"
233#include "llvolume.h"
234#include "llvolumemgr.h"
235#include "llvolumemessage.h"
236#include "llweb.h"
237#include "llworld.h"
238#include "llworldmap.h"
239#include "llworldmapview.h"
240#include "pipeline.h"
241#include "llface.h"
242#include "audiosettings.h"
243#include "res/resource.h"
244#include "llvoiceclient.h"
245
246#if LL_WINDOWS
247#include "llwindebug.h"
248#include "lldxhardware.h"
249#include "llwindowwin32.h"
250
251// for Logitech LCD keyboards / speakers
252#ifndef LL_LOGITECH_LCD_H
253#include "lllogitechlcd.h"
254#endif
255extern void CreateLCDDebugWindows();
256
257#endif // LL_WINDOWS
258
259#if LL_QUICKTIME_ENABLED
260#if LL_DARWIN
261#include <QuickTime/QuickTime.h>
262#else
263// quicktime specific includes
264#include "MacTypes.h"
265#include "QTML.h"
266#include "Movies.h"
267#include "FixMath.h"
268#endif
269#endif
270
271#if LL_GSTREAMER_ENABLED
272// ugh, do this instead of pulling in the gstreamer headers which indirectly
273// clash with expat in the monster that is viewer.cpp ... sigh.
274void UnloadGStreamer();
275#endif // LL_GSTREAMER_ENABLED
276
277#include "llmediaengine.h"
278
279#if LL_LIBXUL_ENABLED
280#include "llmozlib.h"
281#endif // LL_LIBXUL_ENABLED
282
283/////////////////////////////////////////////////////////////////////////////////
284// Support for crash handling.
285/////////////////////////////////////////////////////////////////////////////////
286
287void errorCallback(const std::string &error_string);
288S32 gCrashBehavior = CRASH_BEHAVIOR_ASK;
289void (*gCrashCallback)(void) = NULL;
290BOOL gReportedCrash = FALSE;
291
292bool gVerifySSLCert = true;
293
294BOOL gHandleKeysAsync = FALSE;
295
296// Use DirectX 9 to probe for hardware
297BOOL gProbeHardware = TRUE;
298std::string gSerialNumber;
299
300/////////////////////////////////////////////////////////////////////////////////
301// Application constants
302/////////////////////////////////////////////////////////////////////////////////
303
304BOOL gAgentMovementCompleted = FALSE;
305BOOL gHaveSavedSnapshot = FALSE;
306
307S32 gYieldMS = 0;
308BOOL gYieldTime = FALSE;
309
310const U32 COLLISION_LIST_DEPTH = 300; // only looks at the first so many collisionable objects
311const S32 MAX_CONSOLE_LINES = 500;
312const S32 NUM_SESSIONS_BEFORE_SHOW_PROFILE = 5;
313const F32 DEFAULT_AFK_TIMEOUT = 5.f * 60.f; // time with no input before user flagged as Away From Keyboard
314
315const char *VFS_DATA_FILE_BASE = "data.db2.x.";
316const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
317
318F32 gSimLastTime;
319F32 gSimFrames;
320
321//#define RENDER_CLOUD_DENSITY // uncomment to look at cloud density
322
323/////////////////////////////////////////////////////////////////////////////////
324// Globals
325/////////////////////////////////////////////////////////////////////////////////
326
327//
328// Core Application globals
329//
330#if LL_WINDOWS
331llLCD *gLcdScreen = NULL;
332#endif
333
334LLString gSecondLife;
335LLString gWindowTitle;
336static char sWindowClass[] = "Second Life";
337LLString gDisabledMessage;
338BOOL gHideLinks = FALSE;
339
340// This is whether or not we are connect to a production grid.
341BOOL gInProductionGrid = FALSE;
342
343//#define APPLE_PREVIEW // Define this if you're doing a preview build on the Mac
344#if LL_RELEASE_FOR_DOWNLOAD
345// Default userserver for production builds is agni
346#ifndef APPLE_PREVIEW
347static EUserServerDomain UserServerDefaultChoice = USERSERVER_AGNI;
348#else
349static EUserServerDomain UserServerDefaultChoice = USERSERVER_ADITI;
350#endif
351#else
352// Default userserver for development builds is dmz
353static EUserServerDomain UserServerDefaultChoice = USERSERVER_DMZ;
354#endif
355
356#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
357BOOL gHackGodmode = FALSE;
358#endif
359
360std::vector<std::string> gLoginURIs;
361static std::string gHelperURI;
362
363LLAgent gAgent;
364LLPipeline gPipeline;
365
366// Set true when the viewer has been disconnected from the server, for example,
367// by the user being kicked.
368BOOL gDoDisconnect = FALSE;
369BOOL gDisconnected = FALSE;
370
371// Tells us to clean up the cache directory in the case of network corruption
372BOOL gPurgeOnExit = FALSE;
373BOOL gPurgeCache = FALSE;
374
375// Allow multiple viewers in ReleaseForDownload
376#if LL_RELEASE_FOR_DOWNLOAD
377BOOL gMultipleViewersOK = FALSE;
378#else
379BOOL gMultipleViewersOK = TRUE;
380#endif
381BOOL gSecondInstance = FALSE;
382BOOL gDisableVoice = FALSE;
383
384LLString gArgs;
385
386// Setting this true will cause the app to exit cleanly at the end of the frame.
387BOOL gQuit = FALSE;
388// Set when user has indicated desire to quit, but may have modified documents open
389BOOL gQuitRequested = FALSE;
390LLString gLaunchFileOnQuit;
391BOOL gDoneLogout = FALSE;
392
393BOOL gInitializationComplete = FALSE; // used in windows handlers to determine if OK to call idle()
394BOOL gAutoLogin = FALSE;
395LLString gOldSettingsFileName;
396BOOL gPrintMessagesThisFrame = FALSE;
397const char* DEFAULT_SETTINGS_FILE = "settings.xml";
398const char* LEGACY_DEFAULT_SETTINGS_FILE = "settings.ini";
399BOOL gUseWireframe = FALSE;
400LLUUID gViewerDigest; // MD5 digest of the viewer's executable file.
401LLPumpIO* gServicePump = NULL;
402S32 gNumSessions = 0;
403
404BOOL gAllowIdleAFK = TRUE;
405F32 gAFKTimeout = DEFAULT_AFK_TIMEOUT;
406F32 gMouseSensitivity = 3.f;
407BOOL gInvertMouse = FALSE;
408BOOL gLogoutRequestSent = FALSE;
409LLTimer gLogoutTimer;
410BOOL gShowObjectUpdates = FALSE;
411
412const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg.
413F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
414
415// Map scale in pixels per region
416F32 gMapScale = 128.f;
417F32 gMiniMapScale = 128.f;
418
419// Sky object, globals
420LLSky gSky;
421
422// HUD display lines in lower right
423BOOL gDisplayWindInfo = FALSE;
424BOOL gDisplayCameraPos = FALSE;
425BOOL gDisplayNearestWater = FALSE;
426BOOL gDoNearestWaterSearch = FALSE;
427BOOL gDisplayFOV = FALSE;
428
429// used to restore texture state after a mode switch
430LLFrameTimer gRestoreGLTimer;
431BOOL gRestoreGL = FALSE;
432
433
434// VFS globals - see viewer.h
435LLVFS* gStaticVFS = NULL;
436
437// Threads
438LLTextureCache* gTextureCache = NULL;
439LLWorkerThread* gImageDecodeThread = NULL;
440LLTextureFetch* gTextureFetch = NULL;
441
442// Debugging
443FILE *gDebugFile = NULL; // File pointer used by the function which writes debug data.
444BOOL gRandomizeFramerate = FALSE;
445BOOL gPeriodicSlowFrame = FALSE;
446std::map<S32,LLFrameTimer> gDebugTimers;
447
448//LLVector3 gCameraVelocitySmoothed;
449//
450// Timing/Performance/statistics globals
451//
452
453// Frame timing
454U64 gFrameTime = 0;
455F32 gFrameTimeSeconds = 0.f;
456F32 gFrameIntervalSeconds = 0.f;
457U32 gFrameCount = 0;
458U32 gForegroundFrameCount = 0; // number of frames that app window was in foreground
459U64 gStartTime = 0; // gStartTime is "private", used only to calculate gFrameTimeSeconds
460U64 gSpaceTime = 0; // gSpaceTime is the time, according to the spaceserver.
461
462// Timing Globals
463LLTimer gRenderStartTime;
464LLFrameTimer gForegroundTime;
465F32 gQuitAfterSeconds = 0.f;
466BOOL gRotateRight = FALSE;
467
468// Is the Pacific time zone (aka server time zone)
469// current in daylight savings time?
470BOOL gPacificDaylightTime = FALSE;
471
472//
473// Simulator/SpaceServer configuration information
474//
475U32 gSecondsPerDay = 0;
476U32 gSecondsPerYear = 0;
477
478LLString gLastVersionChannel;
479
480//
481// Region/Object globals
482//
483
484
485LLVector3 gWindVec(3.0, 3.0, 0.0);
486LLVector3 gRelativeWindVec(0.0, 0.0, 0.0);
487
488//
489// Globals for controls...
490//
491
492BOOL gVelocityInterpolate = TRUE; // (These are written once/frame with the data from gSavedSettings)
493BOOL gPingInterpolate = TRUE;
494
495//
496// System info
497//
498
499LLMemoryInfo gSysMemory;
500LLOSInfo gSysOS;
501
502// file globals
503static const char USAGE[] = "\n"
504"usage:\tviewer [options]\n"
505"options:\n"
506" -login <first> <last> <password> log in as a user\n"
507" -autologin log in as last saved user\n"
508" -loginuri <URI> login server and CGI script to use\n"
509" -helperuri <URI> helper web CGI prefix to use\n"
510" -settings <filename> specify the filename of a\n"
511" configuration file\n"
512" default is settings.xml\n"
513" -setdefault <variable> <value> specify the value of a particular\n"
514" configuration variable which can be\n"
515" overridden by settings.xml\n"
516" -set <variable> <value> specify the value of a particular\n"
517" configuration variable that\n"
518" overrides all other settings\n"
519" -user <user_server_ip> specify userserver in dotted quad\n"
520#if !LL_RELEASE_FOR_DOWNLOAD
521" -sim <simulator_ip> specify the simulator ip address\n"
522#endif
523" -god log in as god if you have god access\n"
524" -purge delete files in cache\n"
525" -safe reset preferences, run in safe mode\n"
526" -noutc logs in local time, not UTC\n"
527" -nothread run vfs in single thread\n"
528" -noinvlib Do not request inventory library\n"
529" -multiple allow multiple viewers\n"
530" -nomultiple block multiple viewers\n"
531" -novoice disable voice\n"
532" -ignorepixeldepth ignore pixel depth settings\n"
533" -cooperative [ms] yield some idle time to local host\n"
534" -skin ui/branding skin folder to use\n"
535#if LL_WINDOWS
536" -noprobe disable hardware probe\n"
537#endif
538" -noquicktime disable QuickTime movies, speeds startup\n"
539" -nopreload don't preload UI images or sounds, speeds startup\n"
540// these seem to be unused
541//" -noenv turn off environmental effects\n"
542//" -proxy <proxy_ip> specify the proxy ip address\n"
543"\n";
544
545
546// Variables used for passing data out of main
547BOOL gGodConnect = FALSE;
548BOOL gUseConsole = TRUE;
549BOOL gUseAudio = TRUE;
550BOOL gUseFMOD = TRUE;
551BOOL gLogMessages = FALSE;
552BOOL gRequestInventoryLibrary = TRUE;
553BOOL gAcceptTOS = FALSE;
554BOOL gAcceptCriticalMessage = FALSE;
555// this is the channel the viewer uses to check for updates/login
556std::string gChannelName = LL_CHANNEL;
557
558LLUUID gInventoryLibraryOwner;
559LLUUID gInventoryLibraryRoot;
560bool gPreloadImages = true;
561bool gPreloadSounds = true;
562
563LLString gCmdLineFirstName;
564LLString gCmdLineLastName;
565LLString gCmdLinePassword;
566std::map<std::string, std::string> gCommandLineSettings;
567std::map<std::string, std::string> gCommandLineForcedSettings;
568BOOL gLastExecFroze = FALSE;
569BOOL gIgnorePixelDepth = FALSE;
570
571
572LLPointer<LLImageGL> gDisconnectedImagep = NULL;
573
574
575/*
576class LLFirstInventoryLoadObserver : public LLInventoryObserver
577{
578 // Called when the inventory is first loaded.
579 // Must be allocated on the heap so that the inventory model can destroy it
580 // in case the app ends before the inventory finishes loading.
581public:
582 virtual void changed(U32 mask);
583 void observe(LLInventoryModel* model);
584protected:
585 LLInventoryModel* mInventory;
586};
587*/
588
589///////////////////////
590//
591// Forward declarations
592//
593
594//
595// Application initialization and cleanup
596//
597void init_marker_file();
598void init_crash_handler();
599void init_logging();
600void create_console();
601void write_system_info();
602int parse_args(int argc, char **argv);
603void saved_settings_to_globals();
604BOOL init_cache();
605void purge_cache();
606void cleanup_app();
607void disconnect_viewer(void *); // Don't use directly - use do_disconnect()
608
609//
610// Debugging, logging, and error reporting
611//
612void write_debug(const char *str); // Write a string to the debug log
613void write_debug(const std::string& str);
614void close_debug(); // Close the debug log
615void catch_signals();
616void viewer_crash_callback();
617void remove_marker_file();
618#if !LL_WINDOWS
619void release_signals();
620#endif
621
622void bad_network_handler();
623
624#if LL_WINDOWS
625void disable_win_error_reporting();
626#endif
627std::string get_serial_number();
628bool send_url_to_other_instance(const std::string& url);
629BOOL another_instance_running();
630void main_loop();
631
632//
633// Callbacks
634//
635// Callbacks and other stuff that's not directly used in main
636//
637void uuid_table_request_file_callback(void **user_data, S32 result, LLExtStat ext_status);
638void send_stats();
639
640//
641// Apple specific stuff
642//
643#if LL_DARWIN
644void init_apple_menu(const char* product);
645OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
646OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn);
647OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata);
648OSStatus DisplayReleaseNotes(void);
649#endif // LL_DARWIN
650
651void ui_audio_callback(const LLUUID& uuid)
652{
653 if (gAudiop)
654 {
655 F32 volume = gSavedSettings.getF32("AudioLevelUI");
656 gAudiop->triggerSound(uuid, gAgent.getID(), volume);
657 }
658}
659
660#if LL_WINDOWS
661BOOL CALLBACK login_dialog_func(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lparam)
662{
663 char buffer[MAX_STRING]; /* Flawfinder: ignore */
664 switch(msg)
665 {
666 case WM_INITDIALOG:
667 {
668 LLString first_name = gCmdLineFirstName;
669 LLString last_name = gCmdLineLastName;
670 LLString password = gCmdLinePassword;
671
672 if (!first_name.empty())
673 {
674 SetDlgItemTextA( hwnd, IDC_EDIT_FIRSTNAME, first_name.c_str());
675 }
676 if (!last_name.empty())
677 {
678 SetDlgItemTextA( hwnd, IDC_EDIT_LASTNAME, last_name.c_str());
679 }
680 if (!password.empty())
681 {
682 SetDlgItemTextA( hwnd, IDC_EDIT_PASSWORD, password.c_str());
683 }
684
685 first_name = gSavedSettings.getString("FirstName");
686 last_name = gSavedSettings.getString("LastName");
687 password = load_password_from_disk();
688
689 if (!first_name.empty())
690 {
691 SetDlgItemTextA( hwnd, IDC_EDIT_FIRSTNAME, first_name.c_str());
692 }
693 if (!last_name.empty())
694 {
695 SetDlgItemTextA( hwnd, IDC_EDIT_LASTNAME, last_name.c_str());
696 }
697 if (!password.empty())
698 {
699 SetDlgItemTextA( hwnd, IDC_EDIT_PASSWORD, password.c_str());
700 }
701
702 // Focus on password if other fields are full
703 if (first_name.empty())
704 {
705 SetFocus(GetDlgItem(hwnd, IDC_EDIT_FIRSTNAME));
706 }
707 else if (last_name.empty())
708 {
709 SetFocus(GetDlgItem(hwnd, IDC_EDIT_LASTNAME));
710 }
711 else if (password.empty())
712 {
713 SetFocus(GetDlgItem(hwnd, IDC_EDIT_PASSWORD));
714 }
715 else
716 {
717 SetFocus(GetDlgItem(hwnd, IDC_EDIT_FIRSTNAME));
718 }
719
720 BOOL remember_password = gSavedSettings.getBOOL("RememberPassword");
721 if (remember_password)
722 {
723 CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, BST_CHECKED);
724 }
725 else
726 {
727 CheckDlgButton(hwnd, IDC_REMEMBER_PASSWORD, BST_UNCHECKED);
728 }
729 return TRUE;
730 }
731
732 case WM_COMMAND:
733 switch(LOWORD(wParam))
734 {
735 case IDOK:
736 {
737 // copy login name and password into buffer
738 if (GetDlgItemTextA(hwnd, IDC_EDIT_FIRSTNAME, buffer, MAX_STRING))
739 {
740 gCmdLineFirstName = buffer;
741 }
742 if (GetDlgItemTextA(hwnd, IDC_EDIT_LASTNAME, buffer, MAX_STRING))
743 {
744 gCmdLineLastName = buffer;
745 }
746 if (GetDlgItemTextA(hwnd, IDC_EDIT_PASSWORD, buffer, MAX_STRING))
747 {
748 gCmdLinePassword = buffer;
749 }
750 BOOL remember_password = (IsDlgButtonChecked(hwnd, IDC_REMEMBER_PASSWORD) == BST_CHECKED);
751 gSavedSettings.setBOOL("RememberPassword", remember_password);
752 EndDialog(hwnd, 0); // return success
753 return TRUE; // handled
754 }
755 }
756 // If we get here, we didn't handle it
757 return FALSE;
758
759 case WM_CLOSE:
760 case WM_DESTROY:
761 EndDialog(hwnd, 666); // assume user wants normal login screen
762 return TRUE; // handled
763
764 default:
765 return FALSE;
766 }
767}
768#endif
769
770#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
771
772MEM_BOOL MEM_CALLBACK second_mem_error_handler(MEM_ERROR_INFO *errorInfo);
773
774MEM_BOOL MEM_CALLBACK first_mem_error_handler(MEM_ERROR_INFO *errorInfo)
775{
776 MemSetErrorHandler(second_mem_error_handler);
777
778 // Really should free up reserved memory here and warn users
779 // with dialog they have precious little time left in Second
780 // Life!
781
782 llerrs << "Memory allocation failed; aborting." << llendl;
783 // llerrs << "Memory allocation failed; reserve memory released." << llendl;
784
785 // NOTREACHED better not be, but see second_mem_error_handler
786 // Could do that freeing up reserved memory thing here and
787 // return 1;
788 return 0;
789}
790
791MEM_BOOL MEM_CALLBACK second_mem_error_handler(MEM_ERROR_INFO *errorInfo)
792{
793 // Just in case "llerrs" and "llendl" cause another out-of-memory.
794 LLError::crashAndLoop("");
795 // NOTREACHED better not be!
796 return 0;
797}
798
799#endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
800
801
802#if LL_WINDOWS
803int APIENTRY WinMain(HINSTANCE hInstance,
804 HINSTANCE hPrevInstance,
805 LPSTR lpCmdLine,
806 int nCmdShow)
807#else
808int main( int argc, char **argv )
809#endif
810{
811 LLMemType mt1(LLMemType::MTYPE_STARTUP);
812
813#if LL_SOLARIS && defined(__sparc)
814 asm ("ta\t6"); // NOTE: Make sure memory alignment is enforced on SPARC
815#endif
816
817#if LL_DARWIN
818 // Set the working dir to <bundle>/Contents/Resources
819 (void) chdir(gDirUtilp->getAppRODataDir().c_str());
820#endif
821
822#if 1
823 // This will eventually be done in LLApp
824 LLCommon::initClass();
825 // This should eventually be done in LLAppViewer
826# if MEM_TRACK_MEM
827 static const bool enable_threads = false;
828# else
829 static const bool enable_threads = true;
830# endif
831 LLVFSThread::initClass(enable_threads && true);
832 LLLFSThread::initClass(enable_threads && true);
833 // Image decoding
834 gImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
835 gTextureCache = new LLTextureCache(enable_threads && true);
836 gTextureFetch = new LLTextureFetch(gTextureCache, enable_threads && false);
837 LLImageWorker::initClass(gImageDecodeThread);
838 LLImageJ2C::openDSO();
839#endif
840
841#if LL_WINDOWS
842 // In Win32, we need to generate argc and argv ourselves...
843 // Note: GetCommandLine() returns a potentially return a LPTSTR
844 // which can resolve to a LPWSTR (unicode string).
845 // (That's why it's different from lpCmdLine which is a LPSTR.)
846 // We don't currently do unicode, so call the non-unicode version
847 // directly.
848 LPSTR cmd_line_including_exe_name = GetCommandLineA();
849
850 gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
851
852 const S32 MAX_ARGS = 100;
853 int argc = 0;
854 char* argv[MAX_ARGS]; /* Flawfinder: ignore */
855
856 char *token = NULL;
857 if( cmd_line_including_exe_name[0] == '\"' )
858 {
859 // Exe name is enclosed in quotes
860 token = strtok( cmd_line_including_exe_name, "\"" );
861 argv[argc++] = token;
862 token = strtok( NULL, " \t," );
863 }
864 else
865 {
866 // Exe name is not enclosed in quotes
867 token = strtok( cmd_line_including_exe_name, " \t," );
868 }
869
870 while( (token != NULL) && (argc < MAX_ARGS) )
871 {
872 argv[argc++] = token;
873 /* Get next token: */
874 if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore*/
875 {
876 token = strtok( NULL, "\"");
877 }
878 else
879 {
880 token = strtok( NULL, " \t," );
881 }
882 }
883#endif
884
885 // HACK! We REALLY want to know what grid they were trying to connect to if they
886 // crashed hard.
887 // So we walk through the command line args ONLY looking for the
888 // userserver arguments first. And we don't do ANYTHING but set
889 // the gUserServerName (which gets passed to the crash reporter).
890 // We're assuming that they're trying to log into the same grid as last
891 // time, which seems fairly reasonable.
892 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[UserServerDefaultChoice].mName); /* Flawfinder: ignore */
893 S32 j;
894 for (j = 1; j < argc; j++)
895 {
896 if (!strcmp(argv[j], "--aditi"))
897 {
898 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_ADITI].mName); /* Flawfinder: ignore */
899 }
900 else if (!strcmp(argv[j], "--agni"))
901 {
902 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_AGNI].mName); /* Flawfinder: ignore */
903 }
904 else if (!strcmp(argv[j], "--dmz"))
905 {
906 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_DMZ].mName); /* Flawfinder: ignore */
907 }
908 else if (!strcmp(argv[j], "--siva"))
909 {
910 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_SIVA].mName); /* Flawfinder: ignore */
911 }
912 else if (!strcmp(argv[j], "--shakti"))
913 {
914 sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_SHAKTI].mName);
915 }
916 else if (!strcmp(argv[j], "--durga"))
917 {
918 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_DURGA].mName); /* Flawfinder: ignore */
919 }
920 else if (!strcmp(argv[j], "--soma"))
921 {
922 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_SOMA].mName); /* Flawfinder: ignore */
923 }
924 else if (!strcmp(argv[j], "--ganga"))
925 {
926 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[USERSERVER_GANGA].mName); /* Flawfinder: ignore */
927 }
928 else if (!strcmp(argv[j], "--vaak"))
929 {
930 sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_VAAK].mName);
931 }
932 else if (!strcmp(argv[j], "--uma"))
933 {
934 sprintf(gUserServerName,"%s", gUserServerDomainName[USERSERVER_UMA].mName);
935 }
936 else if (!strcmp(argv[j], "-user") && (++j < argc))
937 {
938 if (!strcmp(argv[j], "-"))
939 {
940 snprintf(gUserServerName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); /* Flawfinder: ignore */
941 }
942 else
943 {
944 snprintf(gUserServerName, MAX_STRING, "%s", argv[j]); /* Flawfinder: ignore */
945 }
946 }
947 else if (!strcmp(argv[j], "-multiple"))
948 {
949 // Hack to detect -multiple so we can disable the marker file check (which will always fail)
950 gMultipleViewersOK = TRUE;
951 }
952 else if (!strcmp(argv[j], "-novoice"))
953 {
954 // May need to know this early also
955 gDisableVoice = TRUE;
956 }
957 }
958
959 //
960 // Start of the application
961 //
962 // IMPORTANT! Do NOT put anything that will write
963 // into the log files during normal startup until AFTER
964 // we run the "program crashed last time" error handler below.
965 //
966
967 // Need to do this initialization before we do anything else, since anything
968 // that touches files should really go through the lldir API
969 gDirUtilp->initAppDirs("SecondLife");
970
971 //
972 // Set up logging defaults for the viewer
973 //
974 LLError::initForApplication(
975 gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, ""));
976 LLError::setFatalFunction(errorCallback);
977
978
979#if LL_RELEASE_FOR_DOWNLOAD && LL_SEND_CRASH_REPORTS
980 //
981 // Crash log if we hard crashed.
982 // Initialize crash logging
983 //
984 init_crash_handler();
985#endif
986 // Set up SecondLife.log
987 init_logging();
988
989 //
990 // OK to write stuff to logs now, we've now crash reported if necessary
991 //
992
993 // Set up some defaults...
994 gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, DEFAULT_SETTINGS_FILE);
995 gOldSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, LEGACY_DEFAULT_SETTINGS_FILE);
996
997 /////////////////////////////////////////
998 //
999 // Process command line arguments
1000 //
1001 S32 args_result = 0;
1002
1003#if LL_DARWIN
1004 {
1005 // On the Mac, read in arguments.txt (if it exists) and process it for additional arguments.
1006 std::string args;
1007 if(_read_file_into_string(args, "arguments.txt"))
1008 {
1009 // The arguments file exists.
1010 // It should consist of command line arguments separated by newlines.
1011 // Split it into individual arguments and build a fake argv[] to pass to parse_args.
1012 std::vector<std::string> arglist;
1013
1014 arglist.push_back("newview");
1015
1016 llinfos << "Reading additional command line arguments from arguments.txt..." << llendl;
1017
1018 typedef boost::tokenizer<boost::escaped_list_separator<char> > tokenizer;
1019 boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'");
1020 tokenizer tokens(args, sep);
1021 tokenizer::iterator token_iter;
1022
1023 for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
1024 {
1025 llinfos << "argument: '" << (token_iter->c_str()) << "'" << llendl;
1026
1027 arglist.push_back(*token_iter);
1028 }
1029
1030 char **fakeargv = new char*[arglist.size()];
1031 int i;
1032 for(i=0; i < arglist.size(); i++)
1033 fakeargv[i] = const_cast<char*>(arglist[i].c_str());
1034
1035 args_result = parse_args(arglist.size(), fakeargv);
1036 delete[] fakeargv;
1037 }
1038
1039 // Get the user's preferred language string based on the Mac OS localization mechanism.
1040 // To add a new localization:
1041 // go to the "Resources" section of the project
1042 // get info on "language.txt"
1043 // in the "General" tab, click the "Add Localization" button
1044 // create a new localization for the language you're adding
1045 // set the contents of the new localization of the file to the string corresponding to our localization
1046 // (i.e. "en-us", "ja", etc. Use the existing ones as a guide.)
1047 CFURLRef url = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("language"), CFSTR("txt"), NULL);
1048 char path[MAX_PATH];
1049 if(CFURLGetFileSystemRepresentation(url, false, (UInt8 *)path, sizeof(path)))
1050 {
1051 std::string lang;
1052 if(_read_file_into_string(lang, path))
1053 {
1054 gCommandLineForcedSettings["SystemLanguage"] = lang;
1055 }
1056 }
1057 CFRelease(url);
1058 }
1059#endif
1060
1061 //
1062 // Parse the command line arguments
1063 //
1064 args_result |= parse_args(argc, argv);
1065 if (args_result)
1066 {
1067 remove_marker_file();
1068 return args_result;
1069 }
1070
1071 if (!strcmp(gUserServerName, gUserServerDomainName[USERSERVER_AGNI].mName))
1072 {
1073 gInProductionGrid = TRUE;
1074 }
1075
1076 // *TODO:translate
1077 gSecondLife = "Second Life";
1078
1079 // Read skin/branding settings if specified.
1080 if (! gDirUtilp->getSkinDir().empty() )
1081 {
1082 std::string skin_def_file = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "skin.xml");
1083 LLXmlTree skin_def_tree;
1084
1085 if (!skin_def_tree.parseFile(skin_def_file))
1086 {
1087 llerrs << "Failed to parse skin definition." << llendl;
1088 }
1089
1090 LLXmlTreeNode* rootp = skin_def_tree.getRoot();
1091 LLXmlTreeNode* disabled_message_node = rootp->getChildByName("disabled_message");
1092 if (disabled_message_node)
1093 {
1094 gDisabledMessage = disabled_message_node->getContents();
1095 }
1096
1097 static LLStdStringHandle hide_links_string = LLXmlTree::addAttributeString("hide_links");
1098 rootp->getFastAttributeBOOL(hide_links_string, gHideLinks);
1099
1100 // Legacy string. This flag really meant we didn't want to expose references to "Second Life".
1101 // Just set gHideLinks instead.
1102 static LLStdStringHandle silent_string = LLXmlTree::addAttributeString("silent_update");
1103 BOOL silent_update;
1104 rootp->getFastAttributeBOOL(silent_string, silent_update);
1105 gHideLinks = (gHideLinks || silent_update);
1106 }
1107
1108#if LL_DARWIN
1109 // Initialize apple menubar and various callbacks
1110 init_apple_menu(gSecondLife.c_str());
1111
1112#if __ppc__
1113 // If the CPU doesn't have Altivec (i.e. it's not at least a G4), don't go any further.
1114 // Only test PowerPC - all Intel Macs have SSE.
1115 if(!gSysCPU.hasAltivec())
1116 {
1117 std::ostringstream msg;
1118 msg << gSecondLife << " requires a processor with AltiVec (G4 or later).";
1119 OSMessageBox(
1120 msg.str().c_str(),
1121 NULL,
1122 OSMB_OK);
1123 remove_marker_file();
1124 return 1;
1125 }
1126#endif
1127
1128#endif // LL_DARWIN
1129
1130 // Display splash screen. Must be after above check for previous
1131 // crash as this dialog is always frontmost.
1132 std::ostringstream splash_msg;
1133 // *TODO:translate
1134 splash_msg << "Loading " << gSecondLife << "...";
1135 LLSplashScreen::show();
1136 LLSplashScreen::update(splash_msg.str().c_str());
1137
1138 LLVolumeMgr::initClass();
1139
1140 // Initialize the feature manager
1141 // The feature manager is responsible for determining what features
1142 // are turned on/off in the app.
1143 gFeatureManagerp = new LLFeatureManager;
1144
1145 gStartTime = totalTime();
1146
1147
1148 ////////////////////////////////////////
1149 //
1150 // Process ini files
1151 //
1152
1153 // declare all possible setting variables
1154 declare_settings();
1155
1156#if !LL_RELEASE_FOR_DOWNLOAD
1157// only write the defaults for non-release builds!
1158 gSavedSettings.saveToFile(gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings_default.xml").c_str(), FALSE);
1159#endif
1160
1161 //
1162 // Set the name of the window
1163 //
1164#if LL_RELEASE_FOR_DOWNLOAD
1165 gWindowTitle = gSecondLife;
1166#elif LL_DEBUG
1167 gWindowTitle = gSecondLife + LLString(" [DEBUG] ") + gArgs;
1168#else
1169 gWindowTitle = gSecondLife + LLString(" ") + gArgs;
1170#endif
1171 LLString::truncate(gWindowTitle, 255);
1172
1173 if (!gMultipleViewersOK)
1174 {
1175 //
1176 // Check for another instance of the app running
1177 //
1178
1179 // RN: if we received a URL, hand it off to the existing instance
1180 // don't call another_instance_running() when doing URL handoff, as
1181 // it relies on checking a marker file which will not work when running
1182 // out of different directories
1183 std::string slurl;
1184 if (!LLStartUp::sSLURLCommand.empty())
1185 {
1186 slurl = LLStartUp::sSLURLCommand;
1187 }
1188 else if (LLURLSimString::parse())
1189 {
1190 slurl = LLURLSimString::getURL();
1191 }
1192 if (!slurl.empty())
1193 {
1194 if (send_url_to_other_instance(slurl))
1195 {
1196 // successfully handed off URL to existing instance, exit
1197 return 1;
1198 }
1199 }
1200
1201 gSecondInstance = another_instance_running();
1202
1203 if (gSecondInstance)
1204 {
1205 std::ostringstream msg;
1206 msg <<
1207 gSecondLife << " is already running.\n"
1208 "\n"
1209 "Check your task bar for a minimized copy of the program.\n"
1210 "If this message persists, restart your computer.",
1211 OSMessageBox(
1212 msg.str().c_str(),
1213 NULL,
1214 OSMB_OK);
1215 return 1;
1216 }
1217
1218 init_marker_file();
1219
1220#if LL_SEND_CRASH_REPORTS
1221 if (gLastExecFroze)
1222 {
1223 llinfos << "Last execution froze, requesting to send crash report." << llendl;
1224 //
1225 // Pop up a freeze or crash warning dialog
1226 //
1227 std::ostringstream msg;
1228 msg << gSecondLife
1229 << " appears to have frozen or crashed on the previous run.\n"
1230 << "Would you like to send a crash report?";
1231 std::string alert;
1232 alert = gSecondLife;
1233 alert += " Alert";
1234 S32 choice = OSMessageBox(msg.str().c_str(),
1235 alert.c_str(),
1236 OSMB_YESNO);
1237 if (OSBTN_YES == choice)
1238 {
1239 llinfos << "Sending crash report." << llendl;
1240
1241 remove_marker_file();
1242#if LL_WINDOWS
1243 std::string exe_path = gDirUtilp->getAppRODataDir();
1244 exe_path += gDirUtilp->getDirDelimiter();
1245 exe_path += "win_crash_logger.exe";
1246
1247 std::string arg_string = "-previous -user ";
1248 arg_string += gUserServerName;
1249 arg_string += " -name \"";
1250 arg_string += gSecondLife;
1251 arg_string += "\"";
1252 // Spawn crash logger.
1253 // NEEDS to wait until completion, otherwise log files will get smashed.
1254 _spawnl(_P_WAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
1255#elif LL_DARWIN
1256 std::string command_str;
1257 command_str = "crashreporter.app/Contents/MacOS/crashreporter ";
1258 command_str += "-previous -user ";
1259 command_str += gUserServerName;
1260 // XXX -- We need to exit fullscreen mode for this to work.
1261 // XXX -- system() also doesn't wait for completion. Hmm...
1262 system(command_str.c_str()); /* Flawfinder: Ignore */
1263#elif LL_LINUX || LL_SOLARIS
1264 std::string cmd =gDirUtilp->getAppRODataDir();
1265 cmd += gDirUtilp->getDirDelimiter();
1266#if LL_LINUX
1267 cmd += "linux-crash-logger.bin";
1268#else // LL_SOLARIS
1269 cmd += "bin/solaris-crash-logger";
1270#endif
1271 char* const cmdargv[] =
1272 {(char*)cmd.c_str(),
1273 (char*)"-previous",
1274 (char*)"-user",
1275 (char*)gUserServerName,
1276 (char*)"-name",
1277 (char*)gSecondLife.c_str(),
1278 NULL};
1279 fflush(NULL);
1280 pid_t pid = fork();
1281 if (pid == 0)
1282 { // child
1283 execv(cmd.c_str(), cmdargv); /* Flawfinder: Ignore */
1284 llwarns << "execv failure when trying to start " << cmd << llendl;
1285 _exit(1); // avoid atexit()
1286 } else {
1287 if (pid > 0)
1288 {
1289 // wait for child proc to die
1290 int childExitStatus;
1291 waitpid(pid, &childExitStatus, 0);
1292 } else {
1293 llwarns << "fork failure." << llendl;
1294 }
1295 }
1296#endif
1297 }
1298 else
1299 {
1300 llinfos << "Not sending crash report." << llendl;
1301 }
1302 }
1303#endif // #if LL_SEND_CRASH_REPORTS
1304 }
1305 else
1306 {
1307 gSecondInstance = another_instance_running();
1308
1309 if (gSecondInstance)
1310 {
1311 gDisableVoice = TRUE;
1312 }
1313
1314 init_marker_file();
1315 }
1316
1317 //
1318 // Write system information into the debug log (CPU, OS, etc.)
1319 //
1320 write_system_info();
1321
1322#if LL_WINDOWS
1323 //
1324 // Turn off Windows XP Error Reporting
1325 // (Don't send our data to Microsoft--at least until we are Logo approved and have a way
1326 // of getting the data back from them.)
1327 //
1328 llinfos << "Turning off Windows error reporting." << llendl;
1329 disable_win_error_reporting();
1330#endif // LL_WINDOWS
1331
1332 // Build a string representing the current version number.
1333 gCurrentVersion = llformat("%s %d.%d.%d.%d", gChannelName.c_str(), LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VERSION_BUILD );
1334
1335 //
1336 // Various introspection concerning the libs we're using
1337 //
1338 llinfos << "J2C Engine is: " << LLImageJ2C::getEngineInfo() << llendl;
1339
1340 //
1341 // Load the feature tables
1342 //
1343 llinfos << "Loading feature tables." << llendl;
1344
1345 gFeatureManagerp->loadFeatureTables();
1346 gFeatureManagerp->initCPUFeatureMasks();
1347
1348 // Merge with the command line overrides
1349 gSavedSettings.applyOverrides(gCommandLineSettings);
1350
1351 // Need to do this before calling parseAlerts
1352 gUICtrlFactory = new LLViewerUICtrlFactory();
1353
1354 // Pre-load alerts.xml to define the warnings settings (always loads from skins/xui/en-us/)
1355 // Do this *before* loading the settings file
1356 LLAlertDialog::parseAlerts("alerts.xml", &gSavedSettings, TRUE);
1357
1358 // Overwrite default settings with user settings
1359 llinfos << "Loading configuration file " << gSettingsFileName << llendl;
1360 if (0 == gSavedSettings.loadFromFile(gSettingsFileName))
1361 {
1362 llinfos << "Failed to load settings from " << gSettingsFileName << llendl;
1363 llinfos << "Loading legacy settings from " << gOldSettingsFileName << llendl;
1364 gSavedSettings.loadFromFileLegacy(gOldSettingsFileName);
1365 }
1366
1367 // need to do this here - need to have initialized global settings first
1368 LLString nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
1369 if ( nextLoginLocation.length() )
1370 {
1371 LLURLSimString::setString( nextLoginLocation.c_str() );
1372 };
1373
1374 // Merge with the command line overrides
1375 gSavedSettings.applyOverrides(gCommandLineForcedSettings);
1376
1377 gLastRunVersion = gSavedSettings.getString("LastRunVersion");
1378
1379 fixup_settings();
1380
1381 // Get the single value from the crash settings file, if it exists
1382 std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
1383 gCrashSettings.loadFromFile(crash_settings_filename.c_str());
1384
1385 /////////////////////////////////////////////////
1386 // OS-specific login dialogs
1387 /////////////////////////////////////////////////
1388#if LL_WINDOWS
1389 /*
1390 // Display initial login screen, comes up quickly. JC
1391 {
1392 LLSplashScreen::hide();
1393
1394 INT_PTR result = DialogBox(hInstance, L"CONNECTBOX", NULL, login_dialog_func);
1395 if (result < 0)
1396 {
1397 llwarns << "Connect dialog box failed, returned " << result << llendl;
1398 return 1;
1399 }
1400 // success, result contains which button user clicked
1401 llinfos << "Connect dialog box clicked " << result << llendl;
1402
1403 LLSplashScreen::show();
1404 }
1405 */
1406#endif
1407
1408 // track number of times that app has run
1409 gNumSessions = gSavedSettings.getS32("NumSessions");
1410 gNumSessions++;
1411 gSavedSettings.setS32("NumSessions", gNumSessions);
1412
1413 gSavedSettings.setString("HelpLastVisitedURL",gSavedSettings.getString("HelpHomeURL"));
1414
1415 if (gSavedSettings.getBOOL("VerboseLogs"))
1416 {
1417 LLError::setPrintLocation(true);
1418 }
1419
1420#if !LL_RELEASE_FOR_DOWNLOAD
1421 if (gUserServerChoice == USERSERVER_NONE)
1422 {
1423 // Development version: load last server choice by default (overridden by cmd line args)
1424
1425 S32 server = gSavedSettings.getS32("ServerChoice");
1426 if (server != 0)
1427 gUserServerChoice = (EUserServerDomain)llclamp(server, 0, (S32)USERSERVER_COUNT - 1);
1428 if (server == USERSERVER_OTHER)
1429 {
1430 LLString custom_server = gSavedSettings.getString("CustomServer");
1431 if (custom_server.empty())
1432 {
1433 snprintf(gUserServerName, MAX_STRING, "none"); /* Flawfinder: ignore */
1434 }
1435 else
1436 {
1437 snprintf(gUserServerName, MAX_STRING, "%s", custom_server.c_str()); /* Flawfinder: ignore */
1438 }
1439 }
1440 }
1441#endif
1442
1443 if (gUserServerChoice == USERSERVER_NONE)
1444 {
1445 gUserServerChoice = UserServerDefaultChoice;
1446 }
1447
1448 // Load art UUID information, don't require these strings to be declared in code.
1449 LLString viewer_art_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"viewerart.xml");
1450 llinfos << "Loading art table from " << viewer_art_filename << llendl;
1451 gViewerArt.loadFromFile(viewer_art_filename.c_str(), FALSE);
1452 LLString textures_filename = gDirUtilp->getExpandedFilename(LL_PATH_SKINS, "textures", "textures.xml");
1453 llinfos << "Loading art table from " << textures_filename << llendl;
1454 gViewerArt.loadFromFile(textures_filename.c_str(), FALSE);
1455
1456 LLString colors_base_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors_base.xml");
1457 llinfos << "Loading base colors from " << colors_base_filename << llendl;
1458 gColors.loadFromFile(colors_base_filename.c_str(), FALSE, TYPE_COL4U);
1459
1460 // Load overrides from user colors file
1461 LLString user_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.xml");
1462 llinfos << "Loading user colors from " << user_colors_filename << llendl;
1463 if (gColors.loadFromFile(user_colors_filename.c_str(), FALSE, TYPE_COL4U) == 0)
1464 {
1465 llinfos << "Failed to load user colors from " << user_colors_filename << llendl;
1466 LLString user_legacy_colors_filename = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "colors.ini");
1467 llinfos << "Loading legacy colors from " << user_legacy_colors_filename << llendl;
1468 gColors.loadFromFileLegacy(user_legacy_colors_filename.c_str(), FALSE, TYPE_COL4U);
1469 }
1470
1471 // Widget construction depends on LLUI being initialized
1472 LLUI::initClass(&gSavedSettings,
1473 &gColors,
1474 &gViewerArt,
1475 &gImageList,
1476 ui_audio_callback,
1477 &LLUI::sGLScaleFactor);
1478
1479 gUICtrlFactory->setupPaths(); // update paths with correct language set
1480
1481 /////////////////////////////////////////////////
1482 //
1483 // Load settings files
1484 //
1485 //
1486 LLGroupMgr::parseRoleActions("role_actions.xml");
1487
1488 LLAgent::parseTeleportMessages("teleport_strings.xml");
1489
1490 // Move certain saved settings into global variables for speed
1491 saved_settings_to_globals();
1492
1493 // 1.6.10: Default crash reporting to on, because this dialog doesn't
1494 // make any sense for a new user.
1495 /*
1496 if (!gSavedSettings.getBOOL("AskedAboutCrashReports"))
1497 {
1498 // NOTE: Be sure to use gSecondLife if this becomes uncommented.
1499 S32 retval = OSMessageBox(
1500 "Welcome! You have successfully installed Second Life.\n"
1501 "\n"
1502 "Should performance issues or crashes occur, Second Life\n"
1503 "can automatically send technical data about your computer\n"
1504 "to Linden Lab to diagnose and correct the problem.\n"
1505 "This information is used solely to address technical issues\n"
1506 "and is kept strictly confidential.\n"
1507 "You can change this setting under Preferences / General.\n"
1508 "Automatically send technical data if problems occur?",
1509 "Second Life",
1510 OSMB_YESNO);
1511 if (OSBTN_YES == retval)
1512 {
1513 gAutoReportCrashes = TRUE;
1514 }
1515 else
1516 {
1517 gAutoReportCrashes = FALSE;
1518 }
1519
1520 // Setting will be saved automatically at shutdown.
1521 gSavedSettings.setBOOL("AskedAboutCrashReports", TRUE);
1522 }
1523 */
1524
1525 // Find partition serial number (Windows) or hardware serial (Mac)
1526 gSerialNumber = get_serial_number();
1527
1528#if LL_WINDOWS
1529 //
1530 // Do driver verification and initialization based on DirectX
1531 // hardware polling and driver versions
1532 //
1533 if (gProbeHardware)
1534 {
1535 BOOL vram_only = !gSavedSettings.getBOOL("ProbeHardwareOnStartup");
1536
1537 LLSplashScreen::update("Detecting hardware...");
1538
1539 llinfos << "Attempting to poll DirectX for hardware info" << llendl;
1540 gDXHardware.setWriteDebugFunc(write_debug);
1541 BOOL probe_ok = gDXHardware.getInfo(vram_only);
1542
1543 if (!probe_ok
1544 && gSavedSettings.getWarning("AboutDirectX9"))
1545 {
1546 llinfos << "DirectX probe failed, alerting user." << llendl;
1547
1548 // Warn them that runnin without DirectX 9 will
1549 // not allow us to tell them about driver issues
1550 std::ostringstream msg;
1551 msg <<
1552 gSecondLife << " is unable to detect DirectX 9.0b or greater.\n"
1553 "\n" <<
1554 gSecondLife << " uses DirectX to detect hardware and/or\n"
1555 "outdated drivers that can cause stability problems,\n"
1556 "poor performance and crashes. While you can run\n" <<
1557 gSecondLife << " without it, we highly recommend running\n"
1558 "with DirectX 9.0b\n"
1559 "\n"
1560 "Do you wish to continue?\n";
1561 S32 button = OSMessageBox(
1562 msg.str().c_str(),
1563 "Warning",
1564 OSMB_YESNO);
1565 if (OSBTN_NO== button)
1566 {
1567 llinfos << "User quitting after failed DirectX 9 detection" << llendl;
1568 LLWeb::loadURLExternal(DIRECTX_9_URL);
1569 return 0;
1570 }
1571 gSavedSettings.setWarning("AboutDirectX9", FALSE);
1572 }
1573 llinfos << "Done polling DirectX for hardware info" << llendl;
1574
1575 // Only probe once after installation
1576 gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE);
1577
1578 // Disable so debugger can work
1579 LLSplashScreen::update(splash_msg.str().c_str());
1580 }
1581
1582 if (!LLWinDebug::setupExceptionHandler())
1583 {
1584 llwarns << " Someone took over my exception handler (post hardware probe)!" << llendl;
1585 }
1586
1587 gGLManager.mVRAM = gDXHardware.getVRAM();
1588 llinfos << "Detected VRAM: " << gGLManager.mVRAM << llendl;
1589#endif
1590
1591 // Always fetch the Ethernet MAC address, needed both for login
1592 // and password load.
1593 LLUUID::getNodeID(gMACAddress);
1594
1595 // Prepare for out-of-memory situations, during which we will crash on
1596 // purpose and save a dump.
1597#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
1598 MemSetErrorHandler(first_mem_error_handler);
1599#endif // LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
1600
1601 gViewerStats = new LLViewerStats();
1602
1603 //
1604 // Initialize the VFS, and gracefully handle initialization errors
1605 //
1606
1607 if (!init_cache())
1608 {
1609 std::ostringstream msg;
1610 msg <<
1611 gSecondLife << " is unable to access a file that it needs.\n"
1612 "\n"
1613 "This can be because you somehow have multiple copies running, "
1614 "or your system incorrectly thinks a file is open. "
1615 "If this message persists, restart your computer and try again. "
1616 "If it continues to persist, you may need to completely uninstall " <<
1617 gSecondLife << " and reinstall it.";
1618 OSMessageBox(
1619 msg.str().c_str(),
1620 NULL,
1621 OSMB_OK);
1622 return 1;
1623 }
1624
1625#if LL_DARWIN
1626 // Display the release notes for the current version
1627 if(!gHideLinks && gCurrentVersion != gLastRunVersion)
1628 {
1629 // Current version and last run version don't match exactly. Display the release notes.
1630 DisplayReleaseNotes();
1631 }
1632#endif
1633
1634 //
1635 // Initialize the window
1636 //
1637
1638 // pop up debug console if necessary
1639#if LL_WINDOWS
1640 if (gUseConsole && gSavedSettings.getBOOL("ShowConsoleWindow"))
1641 {
1642 create_console();
1643 }
1644#endif
1645
1646 llinfos << "Initializing window..." << llendl;
1647
1648 // store setting in a global for easy access and modification
1649 gNoRender = gSavedSettings.getBOOL("DisableRendering");
1650
1651 // Hide the splash screen
1652 LLSplashScreen::hide();
1653
1654 // HACK: Need a non-const char * for stupid window name (propagated deep down)
1655 char window_title_str[256]; /* Flawfinder: ignore */
1656 strncpy(window_title_str, gWindowTitle.c_str(), sizeof(window_title_str) - 1); /* Flawfinder: ignore */
1657 window_title_str[sizeof(window_title_str) - 1] = '\0';
1658
1659 // always start windowed
1660 gViewerWindow = new LLViewerWindow(window_title_str, sWindowClass,
1661 gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
1662 gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
1663 FALSE, gIgnorePixelDepth);
1664
1665 if (gSavedSettings.getBOOL("FullScreen"))
1666 {
1667 gViewerWindow->toggleFullscreen(FALSE);
1668 // request to go full screen... which will be delayed until login
1669 }
1670
1671 if (gSavedSettings.getBOOL("WindowMaximized"))
1672 {
1673 gViewerWindow->mWindow->maximize();
1674 gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
1675 }
1676
1677 LLUI::sWindow = gViewerWindow->getWindow();
1678
1679 LLAlertDialog::parseAlerts("alerts.xml");
1680 LLNotifyBox::parseNotify("notify.xml");
1681
1682 LLMediaEngine::initClass();
1683
1684 //
1685 // Clean up the feature manager lookup table - settings were updated
1686 // in the LLViewerWindow constructor
1687 //
1688 gFeatureManagerp->cleanupFeatureTables();
1689
1690 // Show watch cursor
1691 gViewerWindow->setCursor(UI_CURSOR_WAIT);
1692
1693
1694#if LL_WINDOWS && LL_LCD_COMPILE
1695 // start up an LCD window on a logitech keyboard, if there is one
1696 gLcdScreen = new llLCD(hInstance);
1697 CreateLCDDebugWindows();
1698#endif
1699
1700 // Finish view initialization
1701 gViewerWindow->initBase();
1702
1703 // show viewer window
1704 gViewerWindow->mWindow->show();
1705
1706 write_debug(gGLManager.getGLInfoString());
1707 llinfos << gGLManager.getGLInfoString() << llendl;
1708
1709 //load key settings
1710 bind_keyboard_functions();
1711
1712 // Load Default bindings
1713 if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini").c_str()))
1714 {
1715 llerrs << "Unable to open keys.ini" << llendl;
1716 }
1717 // Load Custom bindings (override defaults)
1718 gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini").c_str());
1719
1720 // Calculate the digest for the executable (takes < 90ms on a fast machine).
1721 FILE* app_file = LLFile::fopen( gDirUtilp->getExecutablePathAndName().c_str(), "rb" ); /* Flawfinder: ignore */
1722 if( app_file )
1723 {
1724 LLMD5 app_md5;
1725 app_md5.update( app_file ); // Automatically closes the file
1726 app_md5.finalize();
1727 app_md5.raw_digest( gViewerDigest.mData );
1728 }
1729 llinfos << "Viewer Digest: " << gViewerDigest << llendl;
1730
1731 // If we don't have the right GL requirements, exit.
1732 // BUG: This should just be changed to a generic GL "Not good enough" flag
1733 if (!gGLManager.mHasMultitexture && !gNoRender)
1734 {
1735 std::ostringstream msg;
1736 msg <<
1737 "You do not appear to have the proper hardware requirements "
1738 "for " << gSecondLife << ". " << gSecondLife << " requires an OpenGL graphics "
1739 "card that has multitexture support. If this is the case, "
1740 "you may want to make sure that you have the latest drivers for "
1741 "your graphics card, and service packs and patches for your "
1742 "operating system.\n"
1743 "If you continue to have problems, please go to: "
1744 "www.secondlife.com/support ";
1745 OSMessageBox(
1746 msg.str().c_str(),
1747 NULL,
1748 OSMB_OK);
1749 return 0;
1750 }
1751
1752 // Save the current version to the prefs file
1753 gSavedSettings.setString("LastRunVersion", gCurrentVersion);
1754
1755 gSimLastTime = gRenderStartTime.getElapsedTimeF32();
1756 gSimFrames = (F32)gFrameCount;
1757
1758 //-------------------------------------------
1759 // Run main loop until time to quit
1760 //-------------------------------------------
1761 main_loop();
1762
1763 cleanup_app();
1764
1765 // If we're exiting to launch an URL, do that here so the screen
1766 // is at the right resolution before we launch IE.
1767 if (!gLaunchFileOnQuit.empty())
1768 {
1769#if LL_WINDOWS
1770 // Indicate an application is starting.
1771 SetCursor(LoadCursor(NULL, IDC_WAIT));
1772#endif
1773
1774 // HACK: Attempt to wait until the screen res. switch is complete.
1775 ms_sleep(1000);
1776
1777 LLWeb::loadURLExternal( gLaunchFileOnQuit );
1778 }
1779
1780 llinfos << "Goodbye" << llendflush;
1781 return 0;
1782}
1783
1784bool send_url_to_other_instance(const std::string& url)
1785{
1786#if LL_WINDOWS
1787 wchar_t window_class[256]; /* Flawfinder: ignore */ // Assume max length < 255 chars.
1788 mbstowcs(window_class, sWindowClass, 255);
1789 window_class[255] = 0;
1790 // Use the class instead of the window name.
1791 HWND other_window = FindWindow(window_class, NULL);
1792 if (other_window != NULL)
1793 {
1794 lldebugs << "Found other window with the name '" << gWindowTitle << "'" << llendl;
1795 COPYDATASTRUCT cds;
1796 const S32 SLURL_MESSAGE_TYPE = 0;
1797 cds.dwData = SLURL_MESSAGE_TYPE;
1798 cds.cbData = url.length() + 1;
1799 cds.lpData = (void*)url.c_str();
1800
1801 LRESULT msg_result = SendMessage(other_window, WM_COPYDATA, NULL, (LPARAM)&cds);
1802 lldebugs << "SendMessage(WM_COPYDATA) to other window '"
1803 << gWindowTitle << "' returned " << msg_result << llendl;
1804 return true;
1805 }
1806#endif
1807 return false;
1808}
1809
1810BOOL another_instance_running()
1811{
1812 // We create a marker file when the program starts and remove the file when it finishes.
1813 // If the file is currently locked, that means another process is already running.
1814
1815 std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
1816 llinfos << "Checking marker file for lock..." << llendl;
1817
1818 // If file doesn't exist, we create it
1819 // If file does exist, try to get writing privilages
1820 FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); /* Flawfinder: ignore */
1821 if (fMarker != NULL)
1822 {
1823 // File exists, try opening with write permissions
1824 fclose(fMarker);
1825 fMarker = LLFile::fopen(marker_file.c_str(), "wb"); /* Flawfinder: ignore */
1826 if (fMarker == NULL)
1827 {
1828 llinfos << "Marker file is locked." << llendl;
1829 return TRUE;
1830 }
1831#if LL_DARWIN
1832 // Try to lock it. On Mac, this is the only way to test if it's actually locked.
1833 if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
1834 {
1835 // Lock failed - somebody else has it.
1836 fclose(fMarker);
1837 llinfos << "Marker file is locked." << llendl;
1838 return TRUE;
1839 }
1840#endif
1841 fclose(fMarker);
1842 }
1843 llinfos << "Marker file isn't locked." << llendl;
1844 return FALSE;
1845}
1846
1847
1848void check_for_events()
1849{
1850 LLFastTimer t2(LLFastTimer::FTM_MESSAGES);
1851#if LL_WINDOWS
1852 if (!LLWinDebug::setupExceptionHandler())
1853 {
1854 llwarns << " Someone took over my exception handler (post messagehandling)!" << llendl;
1855 }
1856#endif
1857
1858 gViewerWindow->mWindow->gatherInput();
1859}
1860
1861#include "moviemaker.h"
1862extern BOOL gbCapturing;
1863
1864#if !LL_SOLARIS
1865extern MovieMaker gMovieMaker;
1866#endif
1867
1868void main_loop()
1869{
1870 // Create IO Pump to use for HTTP Requests.
1871 gServicePump = new LLPumpIO(gAPRPoolp);
1872 LLHTTPClient::setPump(*gServicePump);
1873 LLHTTPClient::setCABundle(gDirUtilp->getCAFile());
1874
1875 // initialize voice stuff here
1876 gLocalSpeakerMgr = new LLLocalSpeakerMgr();
1877 gActiveChannelSpeakerMgr = new LLActiveSpeakerMgr();
1878
1879 LLVoiceChannel::initClass();
1880 LLVoiceClient::init(gServicePump);
1881
1882 LLMemType mt1(LLMemType::MTYPE_MAIN);
1883 LLTimer frameTimer,idleTimer;
1884 LLTimer debugTime;
1885
1886 // Handle messages
1887 while (!gQuit)
1888 {
1889 LLFastTimer::reset(); // Should be outside of any timer instances
1890 {
1891 LLFastTimer t(LLFastTimer::FTM_FRAME);
1892
1893 check_for_events();
1894
1895#if 1 && !RELEASE_FOR_DOWNLOAD
1896 // once per second debug info
1897 if (debugTime.getElapsedTimeF32() > 1.f)
1898 {
1899 debugTime.reset();
1900 }
1901#endif
1902 if (!gQuit)
1903 {
1904 // Scan keyboard for movement keys. Command keys and typing
1905 // are handled by windows callbacks. Don't do this until we're
1906 // done initializing. JC
1907 if (gViewerWindow->mWindow->getVisible()
1908 && gViewerWindow->getActive()
1909 && !gViewerWindow->mWindow->getMinimized()
1910 && LLStartUp::getStartupState() == STATE_STARTED
1911 && !gViewerWindow->getShowProgress()
1912 && !gFocusMgr.focusLocked())
1913 {
1914 gKeyboard->scanKeyboard();
1915 LLViewerJoystick::scanJoystick();
1916 }
1917
1918 // Update state based on messages, user input, object idle.
1919 {
1920 LLFastTimer t3(LLFastTimer::FTM_IDLE);
1921 idle();
1922 LLCurl::process();
1923 gAres->process();
1924 // this pump is necessary to make the login screen show up
1925 gServicePump->pump();
1926 gServicePump->callback();
1927 }
1928
1929 if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED))
1930 {
1931 save_final_snapshot(NULL);
1932 disconnect_viewer(NULL);
1933 }
1934
1935 // Render scene.
1936 if (!gQuit)
1937 {
1938 display();
1939
1940 LLFloaterSnapshot::update(); // take snapshots
1941
1942#if !LL_SOLARIS
1943 if (gbCapturing)
1944 {
1945 gMovieMaker.Snap();
1946 }
1947#endif
1948#if LL_WINDOWS && LL_LCD_COMPILE
1949 // update LCD Screen
1950 gLcdScreen->UpdateDisplay();
1951#endif
1952 }
1953 }
1954
1955 // Sleep and run background threads
1956 {
1957 LLFastTimer t2(LLFastTimer::FTM_SLEEP);
1958 bool run_multiple_threads = gSavedSettings.getBOOL("RunMultipleThreads");
1959
1960 // yield some time to the os based on command line option
1961 if(gYieldTime)
1962 {
1963 ms_sleep(gYieldMS);
1964 }
1965
1966 // yield cooperatively when not running as foreground window
1967 if ( gNoRender
1968 || !gViewerWindow->mWindow->getVisible()
1969 || !gFocusMgr.getAppHasFocus())
1970 {
1971 // Sleep if we're not rendering, or the window is minimized.
1972 S32 milliseconds_to_sleep = llclamp(gSavedSettings.getS32("BackgroundYieldTime"), 0, 1000);
1973 // don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads
1974 // of equal priority on Windows
1975 if (milliseconds_to_sleep > 0)
1976 {
1977 ms_sleep(milliseconds_to_sleep);
1978 // also pause worker threads during this wait period
1979 gTextureCache->pause();
1980 gImageDecodeThread->pause();
1981 }
1982 }
1983
1984 if (gRandomizeFramerate)
1985 {
1986 ms_sleep(rand() % 200);
1987 }
1988
1989 if (gPeriodicSlowFrame
1990 && (gFrameCount % 10 == 0))
1991 {
1992 llinfos << "Periodic slow frame - sleeping 500 ms" << llendl;
1993 ms_sleep(500);
1994 }
1995
1996
1997 const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps
1998 const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms
1999 const F64 max_idle_time = run_multiple_threads ? min_idle_time : .005; // 5 ms
2000 idleTimer.reset();
2001 while(1)
2002 {
2003 S32 work_pending = 0;
2004 S32 io_pending = 0;
2005 work_pending += gTextureCache->update(1); // unpauses the texture cache thread
2006 work_pending += gImageDecodeThread->update(1); // unpauses the image thread
2007 work_pending += gTextureFetch->update(1); // unpauses the texture fetch thread
2008 io_pending += LLVFSThread::updateClass(1);
2009 io_pending += LLLFSThread::updateClass(1);
2010 if (io_pending > 1000)
2011 {
2012 ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up
2013 }
2014
2015 F64 frame_time = frameTimer.getElapsedTimeF64();
2016 F64 idle_time = idleTimer.getElapsedTimeF64();
2017 if (frame_time >= min_frame_time &&
2018 idle_time >= min_idle_time &&
2019 (!work_pending || idle_time >= max_idle_time))
2020 {
2021 break;
2022 }
2023 }
2024 frameTimer.reset();
2025
2026 // Prevent the worker threads from running while rendering.
2027 // if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client...
2028 if (run_multiple_threads == FALSE)
2029 {
2030 gTextureCache->pause();
2031 gImageDecodeThread->pause();
2032 // gTextureFetch->pause(); // Don't pause the fetch (IO) thread
2033 }
2034 //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering.
2035 //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering.
2036 }
2037
2038 }
2039 }
2040
2041 // Save snapshot for next time, if we made it through initialization
2042 if (STATE_STARTED == LLStartUp::getStartupState())
2043 {
2044 save_final_snapshot(NULL);
2045 }
2046
2047 delete gServicePump;
2048
2049 llinfos << "Exiting main_loop" << llendflush;
2050}
2051
2052
2053void process_keystrokes_async()
2054{
2055#if LL_WINDOWS
2056 MSG msg;
2057 // look through all input messages, leaving them in the event queue
2058 while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE | PM_NOYIELD))
2059 {
2060 // on first mouse message, break out
2061 if (msg.message >= WM_MOUSEFIRST &&
2062 msg.message <= WM_MOUSELAST ||
2063 msg.message == WM_QUIT)
2064 {
2065 break;
2066 }
2067
2068 // this is a message we want to handle now, so remove it from the event queue
2069 PeekMessage(&msg, NULL, msg.message, msg.message, PM_REMOVE | PM_NOYIELD);
2070 // if (msg.message == WM_KEYDOWN)
2071 // {
2072 // llinfos << "Process async key down " << (U32)msg.wParam << llendl;
2073 // }
2074 TranslateMessage(&msg);
2075 DispatchMessage(&msg);
2076 }
2077
2078 // Scan keyboard for movement keys. Command keys and typing
2079 // are handled by windows callbacks. Don't do this until we're
2080 // done initializing. JC
2081 if (gViewerWindow->mWindow->getVisible()
2082 && gViewerWindow->getActive()
2083 && !gViewerWindow->mWindow->getMinimized()
2084 && LLStartUp::getStartupState() == STATE_STARTED
2085 && !gViewerWindow->getShowProgress()
2086 && !gFocusMgr.focusLocked())
2087 {
2088 gKeyboard->scanKeyboard();
2089 }
2090#endif
2091}
2092
2093////////////////////////////////////////////////
2094//
2095// Functions
2096//
2097
2098FILE *gMarkerFile = NULL;
2099
2100void remove_marker_file()
2101{
2102 llinfos << "remove_marker_file()" << llendl;
2103 if (gMarkerFile != NULL)
2104 {
2105 fclose(gMarkerFile);
2106 gMarkerFile = NULL;
2107 }
2108 if( gDirUtilp )
2109 {
2110 LLString marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
2111 ll_apr_file_remove( marker_file );
2112 }
2113}
2114
2115void init_marker_file()
2116{
2117#if LL_SOLARIS
2118 struct flock fl;
2119 fl.l_whence = SEEK_SET;
2120 fl.l_start = 0;
2121 fl.l_len = 1;
2122#endif
2123 // We create a marker file when the program starts and remove the file when it finishes.
2124 // If the file is currently locked, that means another process is already running.
2125 // If the file exists and isn't locked, we crashed on the last run.
2126
2127 std::string marker_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.exec_marker");
2128 llinfos << "Checking marker file for lock..." << llendl;
2129
2130 FILE* fMarker = LLFile::fopen(marker_file.c_str(), "rb"); /* Flawfinder: ignore */
2131 if (fMarker != NULL)
2132 {
2133 // File exists, try opening with write permissions
2134 fclose(fMarker);
2135 fMarker = LLFile::fopen(marker_file.c_str(), "wb"); /* Flawfinder: ignore */
2136 if (fMarker == NULL)
2137 {
2138 // Another instance is running. Skip the rest of these operations.
2139 llinfos << "Marker file is locked." << llendl;
2140 return;
2141 }
2142#if LL_DARWIN
2143 // Try to lock it. On Mac, this is the only way to test if it's actually locked.
2144 if (flock(fileno(fMarker), LOCK_EX | LOCK_NB) == -1)
2145 {
2146 // Lock failed - somebody else has it.
2147 fclose(fMarker);
2148 llinfos << "Marker file is locked." << llendl;
2149 return;
2150 }
2151#endif
2152
2153 // No other instances; we'll lock this file now & delete on quit.
2154 fclose(fMarker);
2155 gLastExecFroze = TRUE;
2156 llinfos << "Exec marker found: program froze on previous execution" << llendl;
2157 }
2158
2159 // Create the marker file for this execution & lock it
2160// FILE *fp_executing_marker;
2161#if LL_WINDOWS
2162 gMarkerFile = LLFile::_fsopen(marker_file.c_str(), "w", _SH_DENYWR);
2163#else
2164 gMarkerFile = LLFile::fopen(marker_file.c_str(), "w"); /* Flawfinder: ignore */
2165 if (gMarkerFile)
2166 {
2167 int fd = fileno(gMarkerFile);
2168 // Attempt to lock
2169#if LL_SOLARIS
2170 fl.l_type = F_WRLCK;
2171 if (fcntl(fd, F_SETLK, &fl) == -1)
2172#else
2173 if (flock(fd, LOCK_EX | LOCK_NB) == -1)
2174#endif
2175 {
2176 llinfos << "Failed to lock file." << llendl;
2177 }
2178 }
2179#endif
2180 if (gMarkerFile)
2181 {
2182 llinfos << "Marker file created." << llendl;
2183 }
2184 else
2185 {
2186 llinfos << "Failed to create marker file." << llendl;
2187 }
2188
2189#if LL_WINDOWS
2190 // Clean up SecondLife.dmp files, to avoid confusion
2191 llinfos << "Removing SecondLife.dmp" << llendl;
2192 std::string dmp_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife.dmp");
2193 LLFile::remove(dmp_filename.c_str());
2194#endif
2195
2196 // This is to keep the crash reporter from constantly sending stale message logs
2197 // We wipe the message file now.
2198 llinfos << "Removing message.log" << llendl;
2199 std::string message_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "message.log");
2200 LLFile::remove(message_filename.c_str());
2201
2202 llinfos << "Exiting init_marker_file()." << llendl;
2203}
2204
2205void init_crash_handler()
2206{
2207 //////////////////////////////////////////
2208 //
2209 // Set up error handling and logging for LL_RELEASE_FOR_DOWNLOAD
2210 //
2211
2212 // Signal handling (or Win32 exception handling
2213 catch_signals();
2214
2215 // Set the crash callback for the viewer
2216 gCrashCallback = viewer_crash_callback;
2217}
2218
2219void init_logging()
2220{
2221 // Remove the last ".old" log file.
2222 std::string old_log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
2223 "SecondLife.old");
2224 LLFile::remove(old_log_file.c_str());
2225
2226#if LL_LINUX || LL_SOLARIS
2227 // Remove the last stack trace, if any
2228 std::string old_stack_file =
2229 gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
2230 LLFile::remove(old_stack_file.c_str());
2231#endif // LL_LINUX || LL_SOLARIS
2232
2233 // Rename current log file to ".old"
2234 std::string log_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
2235 "SecondLife.log");
2236 LLFile::rename(log_file.c_str(), old_log_file.c_str());
2237
2238 // Set the log file to SecondLife.log
2239
2240 LLError::logToFile(log_file);
2241}
2242
2243void write_system_info()
2244{
2245 write_debug("SL Log: ");
2246 write_debug(LLError::logFileName());
2247 write_debug("\n");
2248
2249 std::string tmp_str = gSecondLife
2250 + llformat(" version %d.%d.%d build %d",
2251 LL_VERSION_MAJOR, LL_VERSION_MINOR, LL_VERSION_PATCH, LL_VIEWER_BUILD);
2252 write_debug(tmp_str.c_str());
2253 write_debug("\n");
2254 write_debug(gSysCPU.getCPUString());
2255 write_debug("\n");
2256
2257 tmp_str = llformat("RAM: %u KB\n", gSysMemory.getPhysicalMemoryKB());
2258 write_debug(tmp_str.c_str());
2259 write_debug("OS: ");
2260 write_debug(gSysOS.getOSString().c_str());
2261 write_debug("\n");
2262
2263 // Dump some debugging info
2264 llinfos << gSecondLife << " version "
2265 << LL_VERSION_MAJOR << "."
2266 << LL_VERSION_MINOR << "."
2267 << LL_VERSION_PATCH
2268 << llendl;
2269
2270 // Dump the local time and time zone
2271 time_t now;
2272 time(&now);
2273 char tbuffer[256]; /* Flawfinder: ignore */
2274 strftime(tbuffer, 256, "%Y-%m-%dT%H:%M:%S %Z", localtime(&now));
2275 llinfos << "Local time: " << tbuffer << llendl;
2276
2277 // query some system information
2278 llinfos << "CPU info:\n" << gSysCPU << llendl;
2279 llinfos << "Memory info:\n" << gSysMemory << llendl;
2280 llinfos << "OS info: " << gSysOS << llendl;
2281}
2282
2283#if LL_WINDOWS
2284void disable_win_error_reporting()
2285{
2286 const char win_xp_string[] = "Microsoft Windows XP";
2287 BOOL is_win_xp = ( gSysOS.getOSString().substr(0, strlen(win_xp_string) ) == win_xp_string ); /* Flawfinder: ignore*/
2288 if( is_win_xp )
2289 {
2290 // Note: we need to use run-time dynamic linking, because load-time dynamic linking will fail
2291 // on systems that don't have the library installed (all non-Windows XP systems)
2292 HINSTANCE fault_rep_dll_handle = LoadLibrary(L"faultrep.dll"); /* Flawfinder: ignore */
2293 if( fault_rep_dll_handle )
2294 {
2295 pfn_ADDEREXCLUDEDAPPLICATIONA pAddERExcludedApplicationA = (pfn_ADDEREXCLUDEDAPPLICATIONA) GetProcAddress(fault_rep_dll_handle, "AddERExcludedApplicationA");
2296 if( pAddERExcludedApplicationA )
2297 {
2298
2299 // Strip the path off the name
2300 const char* executable_name = gDirUtilp->getExecutableFilename().c_str();
2301
2302 if( 0 == pAddERExcludedApplicationA( executable_name ) )
2303 {
2304 U32 error_code = GetLastError();
2305 llinfos << "AddERExcludedApplication() failed with error code " << error_code << llendl;
2306 }
2307 else
2308 {
2309 llinfos << "AddERExcludedApplication() success for " << executable_name << llendl;
2310 }
2311 }
2312 FreeLibrary( fault_rep_dll_handle );
2313 }
2314 }
2315}
2316#endif // LL_WINDOWS
2317
2318// On Windows, get the C:\ volume serial number.
2319// On Mac, return the hardware serial number.
2320std::string get_serial_number()
2321{
2322 char serial_md5[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */
2323 serial_md5[0] = 0;
2324
2325#if LL_WINDOWS
2326 DWORD serial = 0;
2327 DWORD flags = 0;
2328 BOOL success = GetVolumeInformation(
2329 L"C:\\",
2330 NULL, // volume name buffer
2331 0, // volume name buffer size
2332 &serial, // volume serial
2333 NULL, // max component length
2334 &flags, // file system flags
2335 NULL, // file system name buffer
2336 0); // file system name buffer size
2337 if (success)
2338 {
2339 LLMD5 md5;
2340 md5.update( (unsigned char*)&serial, sizeof(DWORD));
2341 md5.finalize();
2342 md5.hex_digest(serial_md5);
2343 }
2344 else
2345 {
2346 llwarns << "GetVolumeInformation failed" << llendl;
2347 }
2348 return serial_md5;
2349
2350#elif LL_DARWIN
2351 // JC: Sample code from http://developer.apple.com/technotes/tn/tn1103.html
2352 CFStringRef serialNumber = NULL;
2353 io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,
2354 IOServiceMatching("IOPlatformExpertDevice"));
2355 if (platformExpert) {
2356 serialNumber = (CFStringRef) IORegistryEntryCreateCFProperty(platformExpert,
2357 CFSTR(kIOPlatformSerialNumberKey),
2358 kCFAllocatorDefault, 0);
2359 IOObjectRelease(platformExpert);
2360 }
2361
2362 if (serialNumber)
2363 {
2364 char buffer[MAX_STRING]; /* Flawfinder: ignore */
2365 if (CFStringGetCString(serialNumber, buffer, MAX_STRING, kCFStringEncodingASCII))
2366 {
2367 LLMD5 md5( (unsigned char*)buffer );
2368 md5.hex_digest(serial_md5);
2369 }
2370 CFRelease(serialNumber);
2371 }
2372
2373 return serial_md5;
2374
2375#elif LL_LINUX || LL_SOLARIS
2376 // TODO
2377 return serial_md5;
2378
2379#endif
2380}
2381
2382#if LL_LINUX
2383#define MAX_STACK_TRACE_DEPTH 40
2384// This uses glibc's basic built-in stack-trace functions for a not very
2385// amazing backtrace.
2386static inline BOOL do_basic_glibc_backtrace()
2387{
2388 void *array[MAX_STACK_TRACE_DEPTH];
2389 size_t size;
2390 char **strings;
2391 size_t i;
2392 BOOL success = FALSE;
2393
2394 size = backtrace(array, MAX_STACK_TRACE_DEPTH);
2395 strings = backtrace_symbols(array, size);
2396
2397 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
2398 llinfos << "Opening stack trace file " << strace_filename << llendl;
2399 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); /* Flawfinder: ignore */
2400 if (!StraceFile)
2401 {
2402 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
2403 StraceFile = stderr;
2404 }
2405
2406 if (size)
2407 {
2408 for (i = 0; i < size; i++)
2409 fputs((std::string(strings[i])+"\n").c_str(),
2410 StraceFile);
2411
2412 success = TRUE;
2413 }
2414
2415 if (StraceFile != stderr)
2416 fclose(StraceFile);
2417
2418 free (strings);
2419 return success;
2420}
2421
2422#if LL_ELFBIN
2423// This uses glibc's basic built-in stack-trace functions together with
2424// ELFIO's ability to parse the .symtab ELF section for better symbol
2425// extraction without exporting symbols (which'd cause subtle, fatal bugs).
2426static inline BOOL do_elfio_glibc_backtrace()
2427{
2428 void *array[MAX_STACK_TRACE_DEPTH];
2429 size_t btsize;
2430 char **strings;
2431 BOOL success = FALSE;
2432
2433 std::string appfilename = gDirUtilp->getExecutablePathAndName();
2434
2435 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
2436 llinfos << "Opening stack trace file " << strace_filename << llendl;
2437 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w"); /* Flawfinder: ignore */
2438 if (!StraceFile)
2439 {
2440 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
2441 StraceFile = stderr;
2442 }
2443
2444 // get backtrace address list and basic symbol info
2445 btsize = backtrace(array, MAX_STACK_TRACE_DEPTH);
2446 strings = backtrace_symbols(array, btsize);
2447
2448 // create ELF reader for our app binary
2449 IELFI* pReader;
2450 const IELFISection* pSec = NULL;
2451 IELFISymbolTable* pSymTbl = 0;
2452 if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) ||
2453 ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) ||
2454 // find symbol table, create reader-object
2455 NULL == (pSec = pReader->GetSection( ".symtab" )) ||
2456 ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) )
2457 {
2458 // Failed to open our binary and read its symbol table somehow
2459 llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl;
2460 if (StraceFile != stderr)
2461 fclose(StraceFile);
2462 // note that we may be leaking some of the above ELFIO
2463 // objects now, but it's expected that we'll be dead soon
2464 // and we want to tread delicately until we get *some* kind
2465 // of useful backtrace.
2466 return do_basic_glibc_backtrace();
2467 }
2468
2469 // iterate over trace and symtab, looking for plausible symbols
2470 std::string name;
2471 Elf32_Addr value;
2472 Elf32_Word ssize;
2473 unsigned char bind;
2474 unsigned char type;
2475 Elf32_Half section;
2476 int nSymNo = pSymTbl->GetSymbolNum();
2477 size_t btpos;
2478 for (btpos = 0; btpos < btsize; ++btpos)
2479 {
2480 fprintf(StraceFile, "%d:\t", btpos);
2481 int symidx;
2482 for (symidx = 0; symidx < nSymNo; ++symidx)
2483 {
2484 if (ERR_ELFIO_NO_ERROR ==
2485 pSymTbl->GetSymbol(symidx, name, value, ssize,
2486 bind, type, section))
2487 {
2488 // check if trace address within symbol range
2489 if (uintptr_t(array[btpos]) >= value &&
2490 uintptr_t(array[btpos]) < value+ssize)
2491 {
2492 char *demangled_str = NULL;
2493 int demangle_result = 1;
2494 demangled_str =
2495 abi::__cxa_demangle
2496 (name.c_str(), NULL, NULL,
2497 &demangle_result);
2498 if (0 == demangle_result &&
2499 NULL != demangled_str) {
2500 fprintf(StraceFile,
2501 "ELF(%s", demangled_str);
2502 free(demangled_str);
2503 }
2504 else // failed demangle; print it raw
2505 {
2506 fprintf(StraceFile,
2507 "ELF(%s", name.c_str());
2508 }
2509 // print offset from symbol start
2510 fprintf(StraceFile,
2511 "+0x%lx) [%p]\n",
2512 uintptr_t(array[btpos]) -
2513 value,
2514 array[btpos]);
2515 goto got_sym; // early escape
2516 }
2517 }
2518 }
2519 // Fallback:
2520 // Didn't find a suitable symbol in the binary - it's probably
2521 // a symbol in a DSO; use glibc's idea of what it should be.
2522 fprintf(StraceFile, "%s\n", strings[btpos]);
2523 got_sym:;
2524 }
2525
2526 if (StraceFile != stderr)
2527 fclose(StraceFile);
2528
2529 pSymTbl->Release();
2530 pSec->Release();
2531 pReader->Release();
2532
2533 free(strings);
2534
2535 llinfos << "Finished generating stack trace." << llendl;
2536
2537 success = TRUE;
2538 return success;
2539}
2540#endif // LL_ELFBIN
2541#endif // LL_LINUX
2542
2543/* Report whether we're being run under the control of a debugger. */
2544static inline bool being_debugged()
2545{
2546 static enum {unknown, no, yes} debugged = unknown;
2547
2548 if (debugged == unknown)
2549 {
2550#if LL_LINUX
2551 pid_t ppid = getppid();
2552 char *name;
2553 int ret;
2554
2555 ret = asprintf(&name, "/proc/%d/exe", ppid);
2556 if (ret != -1)
2557 {
2558 char buf[1024];
2559 ssize_t n;
2560
2561 n = readlink(name, buf, sizeof(buf) - 1);
2562 if (n != -1)
2563 {
2564 char *base = strrchr(buf, '/');
2565 buf[n + 1] = '\0';
2566 if (base == NULL)
2567 {
2568 base = buf;
2569 } else {
2570 base += 1;
2571 }
2572
2573 if (strcmp(base, "gdb") == 0)
2574 {
2575 debugged = yes;
2576 }
2577 }
2578 free(name);
2579 }
2580#endif // LL_LINUX
2581 }
2582
2583 return debugged == yes;
2584}
2585
2586#ifdef LL_SOLARIS
2587static inline BOOL do_basic_glibc_backtrace()
2588{
2589 BOOL success = FALSE;
2590
2591 std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
2592 llinfos << "Opening stack trace file " << strace_filename << llendl;
2593 FILE* StraceFile = LLFile::fopen(strace_filename.c_str(), "w");
2594 if (!StraceFile)
2595 {
2596 llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
2597 StraceFile = stderr;
2598 }
2599
2600 printstack(fileno(StraceFile));
2601
2602 if (StraceFile != stderr)
2603 fclose(StraceFile);
2604
2605 return success;
2606}
2607#endif // LL_SOLARIS
2608
2609void viewer_crash_callback()
2610{
2611 // This will drop us into the debugger.
2612 if (being_debugged())
2613 {
2614 abort();
2615 }
2616
2617 // Returns whether a dialog was shown.
2618 // Only do the logic in here once
2619 if (gReportedCrash)
2620 {
2621 return;
2622 }
2623 gReportedCrash = TRUE;
2624
2625 BOOL do_crash_report = FALSE;
2626
2627 do_crash_report = TRUE;
2628
2629 write_debug("Viewer exe: ");
2630 write_debug(gDirUtilp->getExecutablePathAndName().c_str());
2631 write_debug("\n");
2632 write_debug("Cur path: ");
2633 write_debug(gDirUtilp->getCurPath().c_str());
2634 write_debug("\n\n");
2635
2636 if (gMessageSystem && gDirUtilp)
2637 {
2638 std::string filename;
2639 filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "stats.log");
2640 llofstream file(filename.c_str(), llofstream::binary);
2641 if(file.good())
2642 {
2643 gMessageSystem->summarizeLogs(file);
2644 }
2645 }
2646
2647 if (gMessageSystem)
2648 {
2649 write_debug(gMessageSystem->getCircuitInfoString());
2650 gMessageSystem->stopLogging();
2651 }
2652 write_debug("\n");
2653 if (gWorldp)
2654 {
2655 write_debug(gWorldp->getInfoString());
2656 }
2657
2658 // Close the debug file
2659 close_debug();
2660 LLError::logToFile("");
2661
2662 // Close the SecondLife.log
2663
2664 remove_marker_file();
2665
2666#if LL_WINDOWS
2667 // Windows
2668 std::string exe_path = gDirUtilp->getAppRODataDir();
2669 exe_path += gDirUtilp->getDirDelimiter();
2670 exe_path += "win_crash_logger.exe";
2671
2672 std::string arg_string = "-user ";
2673 arg_string += gUserServerName;
2674
2675 switch(gCrashBehavior)
2676 {
2677 case CRASH_BEHAVIOR_ASK:
2678 default:
2679 arg_string += " -dialog ";
2680 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
2681 break;
2682
2683 case CRASH_BEHAVIOR_ALWAYS_SEND:
2684 _spawnl(_P_NOWAIT, exe_path.c_str(), exe_path.c_str(), arg_string.c_str(), NULL);
2685 break;
2686
2687 case CRASH_BEHAVIOR_NEVER_SEND:
2688 break;
2689 }
2690
2691#elif LL_DARWIN
2692 // Macintosh
2693 LLString command_str;
2694 command_str = "crashreporter.app/Contents/MacOS/crashreporter ";
2695 command_str += "-user ";
2696 command_str += gUserServerName;
2697 command_str += " &"; // This backgrounds the command so system() doesn't block until the crashreporter exits.
2698 system(command_str.c_str()); /* Flawfinder: ignore */
2699
2700 // Sometimes signals don't seem to quit the viewer.
2701 // Make sure we exit so as to not totally confuse the user.
2702 exit(1);
2703#elif LL_LINUX || LL_SOLARIS
2704 // Always generate the report, have the logger do the asking, and
2705 // don't wait for the logger before exiting (-> total cleanup).
2706 if (CRASH_BEHAVIOR_NEVER_SEND != gCrashBehavior)
2707 {
2708 // This backtrace writes into stack_trace.log
2709# if LL_ELFBIN
2710 do_elfio_glibc_backtrace(); // more useful backtrace
2711# else
2712 do_basic_glibc_backtrace(); // only slightly useful backtrace
2713# endif // LL_ELFBIN
2714 // launch the actual crash logger
2715 char* ask_dialog = "-dialog";
2716 if (CRASH_BEHAVIOR_ASK != gCrashBehavior)
2717 ask_dialog = ""; // omit '-dialog' option
2718 std::string cmd =gDirUtilp->getAppRODataDir();
2719 cmd += gDirUtilp->getDirDelimiter();
2720 cmd += "linux-crash-logger.bin";
2721 char* const cmdargv[] =
2722 {(char*)cmd.c_str(),
2723 ask_dialog,
2724 (char*)"-user",
2725 (char*)gUserServerName,
2726 (char*)"-name",
2727 (char*)gSecondLife.c_str(),
2728 NULL};
2729 fflush(NULL);
2730 pid_t pid = fork();
2731 if (pid == 0)
2732 { // child
2733 execv(cmd.c_str(), cmdargv); /* Flawfinder: ignore */
2734 llwarns << "execv failure when trying to start " << cmd << llendl;
2735 _exit(1); // avoid atexit()
2736 } else {
2737 if (pid > 0)
2738 {
2739 // DO NOT wait for child proc to die; we want
2740 // the logger to outlive us while we quit to
2741 // free up the screen/keyboard/etc.
2742 ////int childExitStatus;
2743 ////waitpid(pid, &childExitStatus, 0);
2744 } else {
2745 llwarns << "fork failure." << llendl;
2746 }
2747 }
2748 }
2749 // Sometimes signals don't seem to quit the viewer.
2750 // Make sure we exit so as to not totally confuse the user.
2751 exit(1);
2752#else
2753 #error do something with your platform.
2754#endif // LL_DARWIN
2755
2756 return;
2757}
2758
2759
2760
2761BOOL init_cache()
2762{
2763 gPurgeCache = FALSE;
2764 // Purge cache if user requested it
2765 if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
2766 gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
2767 {
2768 gSavedSettings.setBOOL("PurgeCacheOnNextStartup", FALSE);
2769 gPurgeCache = TRUE;
2770 }
2771 // Purge cache if it belongs to an old version
2772 else
2773 {
2774 static const S32 cache_version = 5;
2775 if (gSavedSettings.getS32("LocalCacheVersion") != cache_version)
2776 {
2777 gPurgeCache = TRUE;
2778 gSavedSettings.setS32("LocalCacheVersion", cache_version);
2779 }
2780 }
2781
2782 // Setup and verify the cache location
2783 LLString cache_location = gSavedSettings.getString("CacheLocation");
2784 LLString new_cache_location = gSavedSettings.getString("NewCacheLocation");
2785 if (new_cache_location != cache_location)
2786 {
2787 gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
2788 purge_cache(); // purge old cache
2789 gSavedSettings.setString("CacheLocation", new_cache_location);
2790 }
2791
2792 if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")))
2793 {
2794 llwarns << "Unable to set cache location" << llendl;
2795 gSavedSettings.setString("CacheLocation", "");
2796 }
2797
2798 if (gPurgeCache)
2799 {
2800 LLSplashScreen::update("Clearing cache...");
2801 purge_cache();
2802 }
2803
2804 LLSplashScreen::update("Initializing Texture Cache...");
2805
2806 // Init the texture cache
2807 // Allocate 80% of the cache size for textures
2808 BOOL read_only = gSecondInstance ? TRUE : FALSE;
2809 const S32 MB = 1024*1024;
2810 S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
2811 const S64 MAX_CACHE_SIZE = 1024*MB;
2812 cache_size = llmin(cache_size, MAX_CACHE_SIZE);
2813 S64 texture_cache_size = ((cache_size * 8)/10);
2814 S64 extra = gTextureCache->initCache(LL_PATH_CACHE, texture_cache_size, read_only);
2815 texture_cache_size -= extra;
2816
2817 LLSplashScreen::update("Initializing VFS...");
2818
2819 // Init the VFS
2820 S64 vfs_size = cache_size - texture_cache_size;
2821 const S64 MAX_VFS_SIZE = 1024 * MB; // 1 GB
2822 vfs_size = llmin(vfs_size, MAX_VFS_SIZE);
2823 vfs_size = (vfs_size / MB) * MB; // make sure it is MB aligned
2824 U32 vfs_size_u32 = (U32)vfs_size;
2825 U32 old_vfs_size = gSavedSettings.getU32("VFSOldSize") * MB;
2826 bool resize_vfs = (vfs_size_u32 != old_vfs_size);
2827 if (resize_vfs)
2828 {
2829 gSavedSettings.setU32("VFSOldSize", vfs_size_u32/MB);
2830 }
2831 llinfos << "VFS CACHE SIZE: " << vfs_size/(1024*1024) << " MB" << llendl;
2832
2833 // This has to happen BEFORE starting the vfs
2834 //time_t ltime;
2835 srand(time(NULL)); /* Flawfinder: ignore */
2836 U32 old_salt = gSavedSettings.getU32("VFSSalt");
2837 U32 new_salt;
2838 char old_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2839 char old_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2840 char new_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2841 char new_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2842 char static_vfs_index_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2843 char static_vfs_data_file[LL_MAX_PATH]; /* Flawfinder: ignore */
2844
2845 if (gMultipleViewersOK)
2846 {
2847 // don't mess with renaming the VFS in this case
2848 new_salt = old_salt;
2849 }
2850 else
2851 {
2852 do
2853 {
2854 new_salt = rand();
2855 } while( new_salt == old_salt );
2856 }
2857
2858 snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */
2859 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(),
2860 old_salt);
2861
2862 // make sure this file exists
2863 llstat s;
2864 S32 stat_result = LLFile::stat(old_vfs_data_file, &s);
2865 if (stat_result)
2866 {
2867 // doesn't exist, look for a data file
2868 std::string mask;
2869 mask = gDirUtilp->getDirDelimiter();
2870 mask += VFS_DATA_FILE_BASE;
2871 mask += "*";
2872
2873 std::string dir;
2874 dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
2875
2876 std::string found_file;
2877 if (gDirUtilp->getNextFileInDir(dir, mask, found_file, FALSE))
2878 {
2879 snprintf(old_vfs_data_file, LL_MAX_PATH, "%s%s%s", dir.c_str(), gDirUtilp->getDirDelimiter().c_str(), found_file.c_str()); /* Flawfinder: ignore */
2880
2881 S32 start_pos;
2882 S32 length = strlen(found_file.c_str()); /* Flawfinder: ignore*/
2883 for (start_pos = length - 1; start_pos >= 0; start_pos--)
2884 {
2885 if (found_file[start_pos] == '.')
2886 {
2887 start_pos++;
2888 break;
2889 }
2890 }
2891 if (start_pos > 0)
2892 {
2893 sscanf(found_file.c_str() + start_pos, "%d", &old_salt);
2894 }
2895 llinfos << "Default vfs data file not present, found " << old_vfs_data_file << llendl;
2896 llinfos << "Old salt: " << old_salt << llendl;
2897 }
2898 }
2899
2900 snprintf(old_vfs_index_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */
2901 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_INDEX_FILE_BASE).c_str(),
2902 old_salt);
2903
2904 stat_result = LLFile::stat(old_vfs_index_file, &s);
2905 if (stat_result)
2906 {
2907 // We've got a bad/missing index file, nukem!
2908 llwarns << "Bad or missing vfx index file " << old_vfs_index_file << llendl;
2909 llwarns << "Removing old vfs data file " << old_vfs_data_file << llendl;
2910 LLFile::remove(old_vfs_data_file);
2911 LLFile::remove(old_vfs_index_file);
2912
2913 // Just in case, nuke any other old cache files in the directory.
2914 std::string dir;
2915 dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"");
2916
2917 std::string mask;
2918 mask = gDirUtilp->getDirDelimiter();
2919 mask += VFS_DATA_FILE_BASE;
2920 mask += "*";
2921
2922 gDirUtilp->deleteFilesInDir(dir, mask);
2923
2924 mask = gDirUtilp->getDirDelimiter();
2925 mask += VFS_INDEX_FILE_BASE;
2926 mask += "*";
2927
2928 gDirUtilp->deleteFilesInDir(dir, mask);
2929 }
2930
2931 snprintf(new_vfs_data_file, LL_MAX_PATH, "%s%u", /* Flawfinder: ignore */
2932 gDirUtilp->getExpandedFilename(LL_PATH_CACHE,VFS_DATA_FILE_BASE).c_str(),
2933 new_salt);
2934
2935 snprintf(new_vfs_index_file, LL_MAX_PATH, "%s%u", gDirUtilp->getExpandedFilename(LL_PATH_CACHE, VFS_INDEX_FILE_BASE).c_str(), /* Flawfinder: ignore */
2936 new_salt);
2937
2938
2939 strncpy(static_vfs_data_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_data.db2").c_str(), LL_MAX_PATH -1); /* Flawfinder: ignore */
2940 static_vfs_data_file[LL_MAX_PATH -1] = '\0';
2941 strncpy(static_vfs_index_file, gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"static_index.db2").c_str(), LL_MAX_PATH -1); /* Flawfinder: ignore */
2942 static_vfs_index_file[LL_MAX_PATH -1] = '\0';
2943
2944 if (resize_vfs)
2945 {
2946 llinfos << "Removing old vfs and re-sizing" << llendl;
2947
2948 LLFile::remove(old_vfs_data_file);
2949 LLFile::remove(old_vfs_index_file);
2950 }
2951 else if (old_salt != new_salt)
2952 {
2953 // move the vfs files to a new name before opening
2954 llinfos << "Renaming " << old_vfs_data_file << " to " << new_vfs_data_file << llendl;
2955 llinfos << "Renaming " << old_vfs_index_file << " to " << new_vfs_index_file << llendl;
2956 LLFile::rename(old_vfs_data_file, new_vfs_data_file);
2957 LLFile::rename(old_vfs_index_file, new_vfs_index_file);
2958 }
2959
2960 // Startup the VFS...
2961 gSavedSettings.setU32("VFSSalt", new_salt);
2962
2963 // Don't remove VFS after viewer crashes. If user has corrupt data, they can reinstall. JC
2964 gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, FALSE, vfs_size_u32, FALSE);
2965 if( VFSVALID_BAD_CORRUPT == gVFS->getValidState() )
2966 {
2967 // Try again with fresh files
2968 // (The constructor deletes corrupt files when it finds them.)
2969 llwarns << "VFS corrupt, deleted. Making new VFS." << llendl;
2970 delete gVFS;
2971 gVFS = new LLVFS(new_vfs_index_file, new_vfs_data_file, FALSE, vfs_size_u32, FALSE);
2972 }
2973
2974 gStaticVFS = new LLVFS(static_vfs_index_file, static_vfs_data_file, TRUE, 0, FALSE);
2975
2976 BOOL success = gVFS->isValid() && gStaticVFS->isValid();
2977 if( !success )
2978 {
2979 return FALSE;
2980 }
2981 else
2982 {
2983 LLVFile::initClass();
2984 return TRUE;
2985 }
2986}
2987
2988#if LL_DARWIN
2989
2990OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
2991{
2992 OSErr result = noErr;
2993 DescType actualType;
2994 char buffer[1024]; /* Flawfinder: ignore */
2995 Size size;
2996
2997 result = AEGetParamPtr (
2998 messagein,
2999 keyDirectObject,
3000 typeCString,
3001 &actualType,
3002 (Ptr)buffer,
3003 sizeof(buffer),
3004 &size);
3005
3006 if(result == noErr)
3007 {
3008 std::string url = buffer;
3009 LLURLDispatcher::dispatch(url);
3010 }
3011
3012 return(result);
3013}
3014
3015OSErr AEQuitHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn)
3016{
3017 OSErr result = noErr;
3018
3019 app_user_quit();
3020
3021 return(result);
3022}
3023
3024OSStatus simpleDialogHandler(EventHandlerCallRef handler, EventRef event, void *userdata)
3025{
3026 OSStatus result = eventNotHandledErr;
3027 OSStatus err;
3028 UInt32 evtClass = GetEventClass(event);
3029 UInt32 evtKind = GetEventKind(event);
3030 WindowRef window = (WindowRef)userdata;
3031
3032 if((evtClass == kEventClassCommand) && (evtKind == kEventCommandProcess))
3033 {
3034 HICommand cmd;
3035 err = GetEventParameter(event, kEventParamDirectObject, typeHICommand, NULL, sizeof(cmd), NULL, &cmd);
3036
3037 if(err == noErr)
3038 {
3039 switch(cmd.commandID)
3040 {
3041 case kHICommandOK:
3042 QuitAppModalLoopForWindow(window);
3043 result = noErr;
3044 break;
3045
3046 case kHICommandCancel:
3047 QuitAppModalLoopForWindow(window);
3048 result = userCanceledErr;
3049 break;
3050 }
3051 }
3052 }
3053
3054 return(result);
3055}
3056
3057OSStatus DisplayReleaseNotes(void)
3058{
3059 OSStatus err;
3060 IBNibRef nib = NULL;
3061 WindowRef window = NULL;
3062
3063 err = CreateNibReference(CFSTR("SecondLife"), &nib);
3064
3065 if(err == noErr)
3066 {
3067 CreateWindowFromNib(nib, CFSTR("Release Notes"), &window);
3068 }
3069
3070 if(err == noErr)
3071 {
3072 // Get the text view control
3073 HIViewRef textView;
3074 ControlID id;
3075
3076 id.signature = 'text';
3077 id.id = 0;
3078
3079 std::string releaseNotesText;
3080 _read_file_into_string(releaseNotesText, "releasenotes.txt");
3081
3082 err = HIViewFindByID(HIViewGetRoot(window), id, &textView);
3083
3084 if(err == noErr)
3085 {
3086 // Convert from the encoding used in the release notes.
3087 CFStringRef str = CFStringCreateWithBytes(
3088 NULL,
3089 (const UInt8*)releaseNotesText.c_str(),
3090 releaseNotesText.size(),
3091 kCFStringEncodingWindowsLatin1, // This matches the way the Windows version displays the release notes.
3092 FALSE);
3093
3094 if(str != NULL)
3095 {
3096 int size = CFStringGetLength(str);
3097
3098 if(size > 0)
3099 {
3100 UniChar *chars = new UniChar[size + 1];
3101 CFStringGetCharacters(str, CFRangeMake(0, size), chars);
3102
3103 err = TXNSetData(HITextViewGetTXNObject(textView), kTXNUnicodeTextData, chars, size * sizeof(UniChar), kTXNStartOffset, kTXNStartOffset);
3104
3105 delete[] chars;
3106 }
3107
3108 CFRelease(str);
3109 }
3110 else
3111 {
3112 // Creating the string failed. Probably an encoding problem. Display SOMETHING...
3113 err = TXNSetData(HITextViewGetTXNObject(textView), kTXNTextData, releaseNotesText.c_str(), releaseNotesText.size(), kTXNStartOffset, kTXNStartOffset);
3114 }
3115 }
3116
3117 // Set the selection to the beginning of the text and scroll it into view.
3118 if(err == noErr)
3119 {
3120 err = TXNSetSelection(HITextViewGetTXNObject(textView), kTXNStartOffset, kTXNStartOffset);
3121 }
3122
3123 if(err == noErr)
3124 {
3125 // This function returns void.
3126 TXNShowSelection(HITextViewGetTXNObject(textView), false);
3127 }
3128 }
3129
3130 if(err == noErr)
3131 {
3132 ShowWindow(window);
3133 }
3134
3135 if(err == noErr)
3136 {
3137 // Set up an event handler for the window.
3138 EventHandlerRef handler = NULL;
3139 EventTypeSpec handlerEvents[] =
3140 {
3141 { kEventClassCommand, kEventCommandProcess }
3142 };
3143
3144 InstallWindowEventHandler(
3145 window,
3146 NewEventHandlerUPP(simpleDialogHandler),
3147 GetEventTypeCount (handlerEvents),
3148 handlerEvents,
3149 (void*)window,
3150 &handler);
3151 }
3152
3153 if(err == noErr)
3154 {
3155 RunAppModalLoopForWindow(window);
3156 }
3157
3158 if(window != NULL)
3159 {
3160 DisposeWindow(window);
3161 }
3162
3163 if(nib != NULL)
3164 {
3165 DisposeNibReference(nib);
3166 }
3167
3168 return(err);
3169}
3170
3171void init_apple_menu(const char* product)
3172{
3173 // Load up a proper menu bar.
3174 {
3175 OSStatus err;
3176 IBNibRef nib = NULL;
3177 // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
3178 err = CreateNibReference(CFSTR("SecondLife"), &nib);
3179
3180 if(err == noErr)
3181 {
3182 // NOTE: DO NOT translate or brand this string. It's an internal name in the .nib file, and MUST match exactly.
3183 SetMenuBarFromNib(nib, CFSTR("MenuBar"));
3184 }
3185
3186 if(nib != NULL)
3187 {
3188 DisposeNibReference(nib);
3189 }
3190 }
3191
3192 // Install a handler for 'gurl' AppleEvents. This is how secondlife:// URLs get passed to the viewer.
3193
3194 if(AEInstallEventHandler('GURL', 'GURL', NewAEEventHandlerUPP(AEGURLHandler),0, false) != noErr)
3195 {
3196 // Couldn't install AppleEvent handler. This error shouldn't be fatal.
3197 llinfos << "Couldn't install 'GURL' AppleEvent handler. Continuing..." << llendl;
3198 }
3199
3200 // Install a handler for 'quit' AppleEvents. This makes quitting the application from the dock work.
3201 if(AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP(AEQuitHandler),0, false) != noErr)
3202 {
3203 // Couldn't install AppleEvent handler. This error shouldn't be fatal.
3204 llinfos << "Couldn't install Quit AppleEvent handler. Continuing..." << llendl;
3205 }
3206}
3207#endif
3208
3209void user_logout()
3210{
3211 if (!gDoneLogout)
3212 {
3213 LLMessageSystem* msg = gMessageSystem;
3214 if (msg)
3215 {
3216 gSavedSettings.setBOOL("LoggedIn", FALSE);
3217 }
3218 gDoneLogout = TRUE;
3219 }
3220}
3221
3222
3223// This routine may get called more than once during the shutdown process.
3224// This can happen because we need to get the screenshot before the window
3225// is destroyed.
3226void save_final_snapshot(void*)
3227{
3228 if (!gHaveSavedSnapshot && !gNoRender)
3229 {
3230 gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal());
3231 gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal());
3232 gViewerWindow->setCursor(UI_CURSOR_WAIT);
3233 gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch
3234 gSavedSettings.setBOOL("ShowParcelOwners", FALSE);
3235 idle();
3236
3237 LLString snap_filename = gDirUtilp->getLindenUserDir();
3238 snap_filename += gDirUtilp->getDirDelimiter();
3239 snap_filename += SCREEN_LAST_FILENAME;
3240 gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidth(), gViewerWindow->getWindowHeight(), FALSE, TRUE);
3241 gHaveSavedSnapshot = TRUE;
3242 }
3243}
3244
3245// If you pass a path+file or URL in as a
3246// Note: This may get called multiple times during shutdown.
3247void app_force_quit(const char* launch_file_on_quit)
3248{
3249 // Don't actually DO anything complicated here, because
3250 // it's called from signal handlers for the Mac on SIGTERM.
3251 // It calls this with NULL.
3252 if (launch_file_on_quit)
3253 {
3254 gLaunchFileOnQuit.assign( (const char*)launch_file_on_quit );
3255 }
3256
3257 gQuit = TRUE;
3258}
3259
3260static void finish_quit(S32 option, void *userdata)
3261{
3262 if (option == 0)
3263 {
3264 app_request_quit();
3265 }
3266}
3267
3268void app_user_quit()
3269{
3270 gViewerWindow->alertXml("ConfirmQuit", finish_quit, NULL);
3271}
3272
3273
3274// Don't quit instantly. Instead, request to be logged off.
3275// Called from control-Q handler, Windows(tm) close-window message (WM_CLOSE), and Mac Quit AppleEvent handler.
3276void app_request_quit()
3277{
3278 llinfos << "app_request_quit" << llendl;
3279
3280 LLViewerRegion* region = gAgent.getRegion();
3281
3282 if( (LLStartUp::getStartupState() < STATE_STARTED) || !region )
3283 {
3284 // Quit immediately
3285 app_force_quit(NULL);
3286 return;
3287 }
3288
3289 if (gHUDManager)
3290 {
3291 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral*)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
3292 effectp->setPositionGlobal(gAgent.getPositionGlobal());
3293 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
3294 gHUDManager->sendEffects();
3295 }
3296
3297 // Attempt to close all floaters that might be
3298 // editing things.
3299 if (gFloaterView)
3300 {
3301 // application is quitting
3302 gFloaterView->closeAllChildren(true);
3303 }
3304
3305 send_stats();
3306
3307 gLogoutTimer.reset();
3308 gQuitRequested = TRUE;
3309}
3310
3311
3312// User didn't really want to quit, for example, clicked "Cancel"
3313// in a floater save dialog.
3314void app_abort_quit()
3315{
3316 llinfos << "app_abort_quit()" << llendl;
3317 gQuitRequested = FALSE;
3318}
3319
3320void idle_shutdown()
3321{
3322 // Wait for all modal alerts to get resolved
3323 if (LLModalDialog::activeCount() > 0)
3324 {
3325 return;
3326 }
3327
3328 // close IM interface
3329 if(gIMMgr)
3330 {
3331 gIMMgr->disconnectAllSessions();
3332 }
3333
3334 // Wait for all floaters to get resolved
3335 if (gFloaterView
3336 && !gFloaterView->allChildrenClosed())
3337 {
3338 return;
3339 }
3340
3341 static bool saved_snapshot = false;
3342 if (!saved_snapshot)
3343 {
3344 saved_snapshot = true;
3345 save_final_snapshot(NULL);
3346 return;
3347 }
3348
3349 const F32 SHUTDOWN_UPLOAD_SAVE_TIME = 5.f;
3350
3351 S32 pending_uploads = gAssetStorage->getNumPendingUploads();
3352 if (pending_uploads > 0
3353 && gLogoutTimer.getElapsedTimeF32() < SHUTDOWN_UPLOAD_SAVE_TIME
3354 && !gLogoutRequestSent)
3355 {
3356 static S32 total_uploads = 0;
3357 // Sometimes total upload count can change during logout.
3358 total_uploads = llmax(total_uploads, pending_uploads);
3359 gViewerWindow->setShowProgress(TRUE);
3360 S32 finished_uploads = total_uploads - pending_uploads;
3361 F32 percent = 100.f * finished_uploads / total_uploads;
3362 gViewerWindow->setProgressPercent(percent);
3363 char buffer[MAX_STRING]; /* Flawfinder: ignore */
3364 snprintf(buffer, MAX_STRING, "Saving final data..."); /* Flawfinder: ignore */
3365 gViewerWindow->setProgressString(buffer);
3366 return;
3367 }
3368
3369 // All floaters are closed. Tell server we want to quit.
3370 if( !gLogoutRequestSent )
3371 {
3372 send_logout_request();
3373
3374 // Wait for a LogoutReply message
3375 gViewerWindow->setShowProgress(TRUE);
3376 gViewerWindow->setProgressPercent(100.f);
3377 gViewerWindow->setProgressString("Logging out...");
3378 return;
3379 }
3380
3381 // Make sure that we quit if we haven't received a reply from the server.
3382 if( gLogoutRequestSent
3383 && gLogoutTimer.getElapsedTimeF32() > gLogoutMaxTime )
3384 {
3385 app_force_quit(NULL);
3386 return;
3387 }
3388}
3389
3390
3391U32 gTotalLandIn = 0, gTotalLandOut = 0;
3392U32 gTotalWaterIn = 0, gTotalWaterOut = 0;
3393
3394F32 gAveLandCompression = 0.f, gAveWaterCompression = 0.f;
3395F32 gBestLandCompression = 1.f, gBestWaterCompression = 1.f;
3396F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f;
3397
3398F32 gFPSClamped = 10.f; // Pretend we start at target rate.
3399F32 gFrameDTClamped = 0.f; // Time between adjacent checks to network for packets
3400F32 gFrameDT = 0.f;
3401
3402//S32 gDecodedBits = 0;
3403U32 gPacketsIn = 0;
3404
3405U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0;
3406U32 gObjectBits = 0;
3407F32 gAvgSimPing = 0.f;
3408
3409
3410extern U32 gVisCompared;
3411extern U32 gVisTested;
3412
3413
3414void update_statistics(U32 frame_count)
3415{
3416 gTotalWorldBytes += gVLManager.getTotalBytes();
3417 gTotalObjectBytes += gObjectBits / 8;
3418 gTotalTextureBytes += LLViewerImageList::sTextureBits / 8;
3419
3420 // make sure we have a valid time delta for this frame
3421 if (gFrameIntervalSeconds > 0.f)
3422 {
3423 if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
3424 {
3425 gViewerStats->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds);
3426 }
3427 else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
3428 {
3429 gViewerStats->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds);
3430 }
3431 else if (gFloaterTools && gFloaterTools->getVisible())
3432 {
3433 gViewerStats->incStat(LLViewerStats::ST_TOOLBOX_SECONDS, gFrameIntervalSeconds);
3434 }
3435 }
3436 gViewerStats->setStat(LLViewerStats::ST_ENABLE_VBO, (F64)gSavedSettings.getBOOL("RenderVBOEnable"));
3437 gViewerStats->setStat(LLViewerStats::ST_LIGHTING_DETAIL, (F64)gSavedSettings.getS32("RenderLightingDetail"));
3438 gViewerStats->setStat(LLViewerStats::ST_DRAW_DIST, (F64)gSavedSettings.getF32("RenderFarClip"));
3439 gViewerStats->setStat(LLViewerStats::ST_CHAT_BUBBLES, (F64)gSavedSettings.getBOOL("UseChatBubbles"));
3440#if 0 // 1.9.2
3441 gViewerStats->setStat(LLViewerStats::ST_SHADER_OBJECTS, (F64)gSavedSettings.getS32("VertexShaderLevelObject"));
3442 gViewerStats->setStat(LLViewerStats::ST_SHADER_AVATAR, (F64)gSavedSettings.getBOOL("VertexShaderLevelAvatar"));
3443 gViewerStats->setStat(LLViewerStats::ST_SHADER_ENVIRONMENT, (F64)gSavedSettings.getBOOL("VertexShaderLevelEnvironment"));
3444#endif
3445 gViewerStats->setStat(LLViewerStats::ST_FRAME_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_FRAME));
3446 F64 idle_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IDLE);
3447 F64 network_secs = gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_NETWORK);
3448 gViewerStats->setStat(LLViewerStats::ST_UPDATE_SECS, idle_secs - network_secs);
3449 gViewerStats->setStat(LLViewerStats::ST_NETWORK_SECS, network_secs);
3450 gViewerStats->setStat(LLViewerStats::ST_IMAGE_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_IMAGE_UPDATE));
3451 gViewerStats->setStat(LLViewerStats::ST_REBUILD_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_REBUILD));
3452 gViewerStats->setStat(LLViewerStats::ST_RENDER_SECS, gDebugView->mFastTimerView->getTime(LLFastTimer::FTM_RENDER_GEOMETRY));
3453
3454 LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(gAgent.getRegion()->getHost());
3455 if (cdp)
3456 {
3457 gViewerStats->mSimPingStat.addValue(cdp->getPingDelay());
3458 gAvgSimPing = ((gAvgSimPing * (F32)gSimPingCount) + (F32)(cdp->getPingDelay())) / ((F32)gSimPingCount + 1);
3459 gSimPingCount++;
3460 }
3461 else
3462 {
3463 gViewerStats->mSimPingStat.addValue(10000);
3464 }
3465
3466 if (gFocusMgr.getAppHasFocus())
3467 {
3468 gViewerStats->mFPSStat.addValue(1);
3469 }
3470 F32 layer_bits = (F32)(gVLManager.getLandBits() + gVLManager.getWindBits() + gVLManager.getCloudBits());
3471 gViewerStats->mLayersKBitStat.addValue(layer_bits/1024.f);
3472 gViewerStats->mObjectKBitStat.addValue(gObjectBits/1024.f);
3473 gViewerStats->mTextureKBitStat.addValue(LLViewerImageList::sTextureBits/1024.f);
3474 gViewerStats->mVFSPendingOperations.addValue(LLVFile::getVFSThread()->getPending());
3475 gViewerStats->mAssetKBitStat.addValue(gTransferManager.getTransferBitsIn(LLTCT_ASSET)/1024.f);
3476 gTransferManager.resetTransferBitsIn(LLTCT_ASSET);
3477
3478 static S32 tex_bits_idle_count = 0;
3479 if (LLViewerImageList::sTextureBits == 0)
3480 {
3481 if (++tex_bits_idle_count >= 30)
3482 gDebugTimers[0].pause();
3483 }
3484 else
3485 {
3486 tex_bits_idle_count = 0;
3487 gDebugTimers[0].unpause();
3488 }
3489
3490 gViewerStats->mTexturePacketsStat.addValue(LLViewerImageList::sTexturePackets);
3491
3492 gViewerStats->mUserserverPingStat.addValue(0); // userserver doesn't exist, therefore ping time is always awesome
3493
3494 // log when the LibXUL (aka Mozilla) widget is used and opened so we can monitor framerate changes
3495 #if LL_LIBXUL_ENABLED
3496 {
3497 BOOL result = gViewerHtmlHelp.getFloaterOpened();
3498 gViewerStats->setStat(LLViewerStats::ST_LIBXUL_WIDGET_USED, (F64)result);
3499 }
3500 #endif
3501
3502 {
3503 static F32 visible_avatar_frames = 0.f;
3504 static F32 avg_visible_avatars = 0;
3505 F32 visible_avatars = (F32)LLVOAvatar::sNumVisibleAvatars;
3506 if (visible_avatars > 0.f)
3507 {
3508 visible_avatar_frames = 1.f;
3509 avg_visible_avatars = (avg_visible_avatars * (F32)(visible_avatar_frames - 1.f) + visible_avatars) / visible_avatar_frames;
3510 }
3511 gViewerStats->setStat(LLViewerStats::ST_VISIBLE_AVATARS, (F64)avg_visible_avatars);
3512 }
3513 gWorldp->updateNetStats();
3514 gWorldp->requestCacheMisses();
3515
3516 // Reset all of these values.
3517 gVLManager.resetBitCounts();
3518 gObjectBits = 0;
3519// gDecodedBits = 0;
3520
3521 LLViewerImageList::sTextureBits = 0;
3522 LLViewerImageList::sTexturePackets = 0;
3523
3524#if LL_WINDOWS && LL_LCD_COMPILE
3525 bool LCDenabled = gLcdScreen->Enabled();
3526 gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, LCDenabled);
3527#else
3528 gViewerStats->setStat(LLViewerStats::ST_LOGITECH_LCD, false);
3529#endif
3530
3531}
3532
3533//
3534// Handle messages, and all message related stuff
3535//
3536
3537#define TIME_THROTTLE_MESSAGES
3538
3539#ifdef TIME_THROTTLE_MESSAGES
3540#define CHECK_MESSAGES_DEFAULT_MAX_TIME .020f // 50 ms = 50 fps (just for messages!)
3541static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3542#endif
3543
3544void idle_network()
3545{
3546 gObjectList.mNumNewObjects = 0;
3547 S32 total_decoded = 0;
3548
3549 if (!gSavedSettings.getBOOL("SpeedTest"))
3550 {
3551 LLFastTimer t(LLFastTimer::FTM_IDLE_NETWORK); // decode
3552
3553 // deal with any queued name requests and replies.
3554 gCacheName->processPending();
3555
3556 LLTimer check_message_timer;
3557 // Read all available packets from network
3558 stop_glerror();
3559 const S64 frame_count = gFrameCount; // U32->S64
3560 F32 total_time = 0.0f;
3561 while (gMessageSystem->checkAllMessages(frame_count, gServicePump))
3562 {
3563 if (gDoDisconnect)
3564 {
3565 // We're disconnecting, don't process any more messages from the server
3566 // We're usually disconnecting due to either network corruption or a
3567 // server going down, so this is OK.
3568 break;
3569 }
3570 stop_glerror();
3571
3572 total_decoded++;
3573 gPacketsIn++;
3574
3575 if (total_decoded > MESSAGE_MAX_PER_FRAME)
3576 {
3577 break;
3578 }
3579
3580#ifdef TIME_THROTTLE_MESSAGES
3581 // Prevent slow packets from completely destroying the frame rate.
3582 // This usually happens due to clumps of avatars taking huge amount
3583 // of network processing time (which needs to be fixed, but this is
3584 // a good limit anyway).
3585 total_time = check_message_timer.getElapsedTimeF32();
3586 if (total_time >= CheckMessagesMaxTime)
3587 break;
3588#endif
3589 }
3590 // Handle per-frame message system processing.
3591 gMessageSystem->processAcks();
3592
3593#ifdef TIME_THROTTLE_MESSAGES
3594 if (total_time >= CheckMessagesMaxTime)
3595 {
3596 // Increase CheckMessagesMaxTime so that we will eventually catch up
3597 CheckMessagesMaxTime *= 1.035f; // 3.5% ~= x2 in 20 frames, ~8x in 60 frames
3598 }
3599 else
3600 {
3601 // Reset CheckMessagesMaxTime to default value
3602 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
3603 }
3604#endif
3605
3606
3607
3608 // we want to clear the control after sending out all necessary agent updates
3609 gAgent.resetControlFlags();
3610 stop_glerror();
3611
3612
3613 // Decode enqueued messages...
3614 S32 remaining_possible_decodes = MESSAGE_MAX_PER_FRAME - total_decoded;
3615
3616 if( remaining_possible_decodes <= 0 )
3617 {
3618 llinfos << "Maxed out number of messages per frame at " << MESSAGE_MAX_PER_FRAME << llendl;
3619 }
3620
3621 if (gPrintMessagesThisFrame)
3622 {
3623 llinfos << "Decoded " << total_decoded << " msgs this frame!" << llendl;
3624 gPrintMessagesThisFrame = FALSE;
3625 }
3626 }
3627
3628 gObjectList.mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
3629
3630 // Retransmit unacknowledged packets.
3631 gXferManager->retransmitUnackedPackets();
3632 gAssetStorage->checkForTimeouts();
3633
3634 gViewerThrottle.updateDynamicThrottle();
3635}
3636
3637void idle_afk_check()
3638{
3639 // check idle timers
3640 if (gAllowIdleAFK && (gAwayTriggerTimer.getElapsedTimeF32() > gAFKTimeout))
3641 {
3642 gAgent.setAFK();
3643 }
3644}
3645void request_initial_instant_messages()
3646{
3647 static BOOL requested = FALSE;
3648 if (!requested
3649 && gMuteListp
3650 && gMuteListp->isLoaded()
3651 && gAgent.getAvatarObject())
3652 {
3653 // Auto-accepted inventory items may require the avatar object
3654 // to build a correct name. Likewise, inventory offers from
3655 // muted avatars require the mute list to properly mute.
3656 LLMessageSystem* msg = gMessageSystem;
3657 msg->newMessageFast(_PREHASH_RetrieveInstantMessages);
3658 msg->nextBlockFast(_PREHASH_AgentData);
3659 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
3660 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
3661 gAgent.sendReliableMessage();
3662 requested = TRUE;
3663 }
3664}
3665
3666///////////////////////////////////////////////////////
3667// idle()
3668//
3669// Called every time the window is not doing anything.
3670// Receive packets, update statistics, and schedule a redisplay.
3671///////////////////////////////////////////////////////
3672
3673void idle()
3674{
3675 // Update frame timers
3676 static LLTimer idle_timer;
3677
3678 LLControlBase::updateAllListeners();
3679
3680 LLFrameTimer::updateFrameTime();
3681 LLEventTimer::updateClass();
3682 LLCriticalDamp::updateInterpolants();
3683 LLMortician::updateClass();
3684 F32 dt_raw = idle_timer.getElapsedTimeAndResetF32();
3685
3686 // Cap out-of-control frame times
3687 // Too low because in menus, swapping, debugger, etc.
3688 // Too high because idle called with no objects in view, etc.
3689 const F32 MIN_FRAME_RATE = 1.f;
3690 const F32 MAX_FRAME_RATE = 200.f;
3691
3692 F32 frame_rate_clamped = 1.f / dt_raw;
3693 frame_rate_clamped = llclamp(frame_rate_clamped, MIN_FRAME_RATE, MAX_FRAME_RATE);
3694 gFrameDTClamped = 1.f / frame_rate_clamped;
3695
3696 // Global frame timer
3697 // Smoothly weight toward current frame
3698 gFPSClamped = (frame_rate_clamped + (4.f * gFPSClamped)) / 5.f;
3699
3700 if (gQuitAfterSeconds > 0.f)
3701 {
3702 if (gRenderStartTime.getElapsedTimeF32() > gQuitAfterSeconds)
3703 {
3704 app_force_quit(NULL);
3705 }
3706 }
3707
3708 // Must wait until both have avatar object and mute list, so poll
3709 // here.
3710 request_initial_instant_messages();
3711
3712 ///////////////////////////////////
3713 //
3714 // Special case idle if still starting up
3715 //
3716
3717 if (LLStartUp::getStartupState() < STATE_STARTED)
3718 {
3719 // Skip rest if idle startup returns false (essentially, no world yet)
3720 if (!idle_startup())
3721 {
3722 return;
3723 }
3724 }
3725
3726
3727 F32 yaw = 0.f; // radians
3728
3729 if (!gDisconnected)
3730 {
3731 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3732
3733 // Update spaceserver timeinfo
3734 gWorldp->setSpaceTimeUSec(gWorldp->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC));
3735
3736
3737 //////////////////////////////////////
3738 //
3739 // Update simulator agent state
3740 //
3741
3742 if (gRotateRight)
3743 {
3744 gAgent.moveYaw(-1.f);
3745 }
3746
3747 // Handle automatic walking towards points
3748 gAgentPilot.updateTarget();
3749 gAgent.autoPilot(&yaw);
3750
3751 static LLFrameTimer agent_update_timer;
3752 static U32 last_control_flags;
3753
3754 // When appropriate, update agent location to the simulator.
3755 F32 agent_update_time = agent_update_timer.getElapsedTimeF32();
3756 BOOL flags_changed = gAgent.controlFlagsDirty() || (last_control_flags != gAgent.getControlFlags());
3757
3758 if (flags_changed || (agent_update_time > (1.0f / (F32) AGENT_UPDATES_PER_SECOND)))
3759 {
3760 // Send avatar and camera info
3761 last_control_flags = gAgent.getControlFlags();
3762 send_agent_update(TRUE);
3763 agent_update_timer.reset();
3764 }
3765 }
3766
3767 //////////////////////////////////////
3768 //
3769 // Manage statistics
3770 //
3771 //
3772
3773 {
3774 static LLFrameTimer viewer_stats_timer;
3775 reset_statistics();
3776
3777 // Update session stats every large chunk of time
3778 // *FIX: (???) SAMANTHA
3779
3780 if (viewer_stats_timer.getElapsedTimeF32() >= 300.f && !gDisconnected)
3781 {
3782 llinfos << "Transmitting sessions stats" << llendl;
3783 send_stats();
3784 viewer_stats_timer.reset();
3785 }
3786
3787 // Print the object debugging stats
3788 static LLFrameTimer object_debug_timer;
3789 if (object_debug_timer.getElapsedTimeF32() > 5.f)
3790 {
3791 object_debug_timer.reset();
3792 if (gObjectList.mNumDeadObjectUpdates)
3793 {
3794 llinfos << "Dead object updates: " << gObjectList.mNumDeadObjectUpdates << llendl;
3795 gObjectList.mNumDeadObjectUpdates = 0;
3796 }
3797 if (gObjectList.mNumUnknownKills)
3798 {
3799 llinfos << "Kills on unknown objects: " << gObjectList.mNumUnknownKills << llendl;
3800 gObjectList.mNumUnknownKills = 0;
3801 }
3802 if (gObjectList.mNumUnknownUpdates)
3803 {
3804 llinfos << "Unknown object updates: " << gObjectList.mNumUnknownUpdates << llendl;
3805 gObjectList.mNumUnknownUpdates = 0;
3806 }
3807 }
3808 gFrameStats.addFrameData();
3809 }
3810
3811 if (!gDisconnected)
3812 {
3813 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3814
3815 ////////////////////////////////////////////////
3816 //
3817 // Network processing
3818 //
3819 // NOTE: Starting at this point, we may still have pointers to "dead" objects
3820 // floating throughout the various object lists.
3821 //
3822
3823 gFrameStats.start(LLFrameStats::IDLE_NETWORK);
3824 idle_network();
3825 stop_glerror();
3826
3827 gFrameStats.start(LLFrameStats::AGENT_MISC);
3828
3829 // Check for away from keyboard, kick idle agents.
3830 idle_afk_check();
3831
3832 // Update statistics for this frame
3833 update_statistics(gFrameCount);
3834
3835 gViewerWindow->updateDebugText();
3836 }
3837
3838 ////////////////////////////////////////
3839 //
3840 // Handle the regular UI idle callbacks as well as
3841 // hover callbacks
3842 //
3843
3844 {
3845// LLFastTimer t(LLFastTimer::FTM_IDLE_CB);
3846
3847 // Do event notifications if necessary. Yes, we may want to move this elsewhere.
3848 gEventNotifier.update();
3849
3850 gIdleCallbacks.callFunctions();
3851 }
3852
3853 if (gDisconnected)
3854 {
3855 return;
3856 }
3857
3858 gViewerWindow->handlePerFrameHover();
3859
3860 ///////////////////////////////////////
3861 // Agent and camera movement
3862 //
3863 LLCoordGL current_mouse = gViewerWindow->getCurrentMouse();
3864
3865// BOOL was_in_prelude = gAgent.inPrelude();
3866
3867 {
3868 //LLFastTimer t(LLFastTimer::FTM_TEMP1);
3869
3870 // After agent and camera moved, figure out if we need to
3871 // deselect objects.
3872 gSelectMgr->deselectAllIfTooFar();
3873 gSelectMgr->update(); // once per frame updat
3874 }
3875
3876 {
3877 LLFastTimer t(LLFastTimer::FTM_RESET_DRAWORDER);
3878
3879 //////////////////////////////////////////////
3880 //
3881 // Clear draw orders
3882 //
3883 // Should actually be done after render, but handlePerFrameHover actually does a "render"
3884 // to do its selection.
3885 //
3886
3887 gPipeline.resetDrawOrders();
3888 }
3889 {
3890 // Handle pending gesture processing
3891 gGestureManager.update();
3892
3893 gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY);
3894 }
3895
3896 {
3897 LLFastTimer t(LLFastTimer::FTM_OBJECTLIST_UPDATE); // Actually "object update"
3898 gFrameStats.start(LLFrameStats::OBJECT_UPDATE);
3899
3900 if (!(gLogoutRequestSent && gHaveSavedSnapshot))
3901 {
3902 gObjectList.update(gAgent, *gWorldp);
3903 }
3904 }
3905
3906 {
3907 LLFastTimer t(LLFastTimer::FTM_UPDATE_SKY);
3908 gSky.updateSky();
3909 }
3910
3911 //////////////////////////////////////
3912 //
3913 // Deletes objects...
3914 // Has to be done after doing idleUpdates (which can kill objects)
3915 //
3916
3917 {
3918 LLFastTimer t(LLFastTimer::FTM_CLEANUP);
3919 gFrameStats.start(LLFrameStats::CLEAN_DEAD);
3920 gObjectList.cleanDeadObjects();
3921 LLDrawable::cleanupDeadDrawables();
3922 }
3923
3924 //
3925 // After this point, in theory we should never see a dead object
3926 // in the various object/drawable lists.
3927 //
3928
3929 //////////////////////////////////////
3930 //
3931 // Update/send HUD effects
3932 //
3933 // At this point, HUD effects may clean up some references to
3934 // dead objects.
3935 //
3936
3937 {
3938 //LLFastTimer t(LLFastTimer::FTM_TEMP3);
3939
3940 gFrameStats.start(LLFrameStats::UPDATE_EFFECTS);
3941 gSelectMgr->updateEffects();
3942 gHUDManager->cleanupEffects();
3943 gHUDManager->sendEffects();
3944 }
3945
3946 stop_glerror();
3947
3948 ////////////////////////////////////////
3949 //
3950 // Unpack layer data that we've received
3951 //
3952
3953 {
3954 LLFastTimer t(LLFastTimer::FTM_NETWORK);
3955 gVLManager.unpackData();
3956 }
3957
3958 /////////////////////////
3959 //
3960 // Update surfaces, and surface textures as well.
3961 //
3962
3963 gWorldp->updateVisibilities();
3964 {
3965 const F32 max_region_update_time = .001f; // 1ms
3966 LLFastTimer t(LLFastTimer::FTM_REGION_UPDATE);
3967 gWorldp->updateRegions(max_region_update_time);
3968 }
3969
3970 /////////////////////////
3971 //
3972 // Update weather effects
3973 //
3974
3975 if (!gNoRender)
3976 {
3977 gWorldp->updateClouds(gFrameDTClamped);
3978 gSky.propagateHeavenlyBodies(gFrameDTClamped); // moves sun, moon, and planets
3979
3980 // Update wind vector
3981 LLVector3 wind_position_region;
3982 static LLVector3 average_wind;
3983
3984 LLViewerRegion *regionp;
3985 regionp = gWorldp->resolveRegionGlobal(wind_position_region, gAgent.getPositionGlobal()); // puts agent's local coords into wind_position
3986 if (regionp)
3987 {
3988 gWindVec = regionp->mWind.getVelocity(wind_position_region);
3989
3990 // Compute average wind and use to drive motion of water
3991
3992 average_wind = regionp->mWind.getAverage();
3993 F32 cloud_density = regionp->mCloudLayer.getDensityRegion(wind_position_region);
3994
3995 gSky.setCloudDensityAtAgent(cloud_density);
3996 gSky.setWind(average_wind);
3997 //LLVOWater::setWind(average_wind);
3998 }
3999 else
4000 {
4001 gWindVec.setVec(0.0f, 0.0f, 0.0f);
4002 }
4003 }
4004 stop_glerror();
4005
4006 //////////////////////////////////////
4007 //
4008 // Update images, using the image stats generated during object update/culling
4009 //
4010 // Can put objects onto the retextured list.
4011 //
4012 gFrameStats.start(LLFrameStats::IMAGE_UPDATE);
4013
4014 LLFastTimer t(LLFastTimer::FTM_IMAGE_UPDATE);
4015
4016 LLViewerImage::updateClass(gCamera->getVelocityStat()->getMean(),
4017 gCamera->getAngularVelocityStat()->getMean());
4018
4019 gBumpImageList.updateImages(); // must be called before gImageList version so that it's textures are thrown out first.
4020
4021 const F32 max_image_decode_time = 0.005f; // 5 ms decode time
4022 gImageList.updateImages(max_image_decode_time);
4023 stop_glerror();
4024
4025 //////////////////////////////////////
4026 //
4027 // Sort and cull in the new renderer are moved to pipeline.cpp
4028 // Here, particles are updated and drawables are moved.
4029 //
4030
4031 if (!gNoRender)
4032 {
4033 gFrameStats.start(LLFrameStats::UPDATE_MOVE);
4034 gPipeline.updateMove();
4035
4036 gFrameStats.start(LLFrameStats::UPDATE_PARTICLES);
4037 gWorldp->updateParticles();
4038 }
4039 stop_glerror();
4040
4041 if (!LLViewerJoystick::sOverrideCamera)
4042 {
4043 gAgent.updateCamera();
4044 }
4045 else
4046 {
4047 LLViewerJoystick::updateCamera();
4048 }
4049
4050 // objects and camera should be in sync, do LOD calculations now
4051 {
4052 LLFastTimer t(LLFastTimer::FTM_LOD_UPDATE);
4053 gObjectList.updateApparentAngles(gAgent);
4054 }
4055
4056 {
4057 gFrameStats.start(LLFrameStats::AUDIO);
4058 LLFastTimer t(LLFastTimer::FTM_AUDIO_UPDATE);
4059
4060 if (gAudiop)
4061 {
4062 audio_update_volume(false);
4063 audio_update_listener();
4064 audio_update_wind(false);
4065
4066 // this line actually commits the changes we've made to source positions, etc.
4067 const F32 max_audio_decode_time = 0.002f; // 2 ms decode time
4068 gAudiop->idle(max_audio_decode_time);
4069 }
4070 }
4071
4072 // Handle shutdown process, for example,
4073 // wait for floaters to close, send quit message,
4074 // forcibly quit if it has taken too long
4075 if (gQuitRequested)
4076 {
4077 idle_shutdown();
4078 }
4079
4080 stop_glerror();
4081}
4082
4083
4084F32 mouse_x_from_center(S32 x)
4085{
4086 return ((F32) x / (F32) gViewerWindow->getWindowWidth() ) - 0.5f;
4087}
4088
4089
4090F32 mouse_y_from_center(S32 y)
4091{
4092 return ((F32) y / (F32) gViewerWindow->getWindowHeight() ) - 0.5f;
4093}
4094
4095
4096/////////////////////////////////////////////////////////
4097
4098void init_audio()
4099{
4100 if (!gAudiop)
4101 {
4102 llwarns << "Failed to create an appropriate Audio Engine" << llendl;
4103 return;
4104 }
4105 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
4106 LLVector3 lpos_global_f;
4107
4108 lpos_global_f.setVec(lpos_global);
4109
4110 gAudiop->setListener(lpos_global_f,
4111 LLVector3::zero, // gCamera->getVelocity(), // !!! BUG need to replace this with smoothed velocity!
4112 gCamera->getUpAxis(),
4113 gCamera->getAtAxis());
4114
4115// load up our initial set of sounds we'll want so they're in memory and ready to be played
4116
4117 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
4118
4119 if (!mute_audio && gPreloadSounds)
4120 {
4121 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndAlert")));
4122 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndBadKeystroke")));
4123 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndChatFromObject")));
4124 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClick")));
4125 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndClickRelease")));
4126 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionF")));
4127 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndHealthReductionM")));
4128 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingChat")));
4129 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndIncomingIM")));
4130 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvApplyToObject")));
4131 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInvalidOp")));
4132 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndInventoryCopyToInv")));
4133 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeDown")));
4134 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndMoneyChangeUp")));
4135 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCopyToInv")));
4136 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectCreate")));
4137 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectDelete")));
4138 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezIn")));
4139 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndObjectRezOut")));
4140 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuAppear")));
4141 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuHide")));
4142 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight0")));
4143 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight1")));
4144 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight2")));
4145 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight3")));
4146 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight4")));
4147 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight5")));
4148 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight6")));
4149 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndPieMenuSliceHighlight7")));
4150 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndSnapshot")));
4151 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartAutopilot")));
4152 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartFollowpilot")));
4153 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStartIM")));
4154 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndStopAutopilot")));
4155 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTeleportOut")));
4156 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureApplyToObject")));
4157 //gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTextureCopyToInv")));
4158 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping")));
4159 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose")));
4160 gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen")));
4161 }
4162
4163 audio_update_volume(true);
4164}
4165
4166void audio_update_volume(bool force_update)
4167{
4168 F32 master_volume = gSavedSettings.getF32("AudioLevelMaster");
4169 BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
4170 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
4171 {
4172 mute_audio = TRUE;
4173 }
4174 F32 mute_volume = mute_audio ? 0.0f : 1.0f;
4175
4176 // Sound Effects
4177 if (gAudiop)
4178 {
4179 gAudiop->setMasterGain ( master_volume );
4180
4181 gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler"));
4182 gAudiop->setDistanceFactor(gSavedSettings.getF32("AudioLevelDistance"));
4183 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
4184#ifdef kAUDIO_ENABLE_WIND
4185 gAudiop->enableWind(!mute_audio);
4186#endif
4187
4188 gAudiop->setMuted(mute_audio);
4189
4190 if (force_update)
4191 {
4192 audio_update_wind(true);
4193 }
4194 }
4195
4196 // Streaming Music
4197 if (gAudiop)
4198 {
4199 F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
4200 music_volume = mute_volume * master_volume * (music_volume*music_volume);
4201 gAudiop->setInternetStreamGain ( music_volume );
4202 }
4203
4204 // Streaming Media
4205 if(LLMediaEngine::getInstance())
4206 {
4207 F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
4208 media_volume = mute_volume * master_volume * (media_volume*media_volume);
4209 LLMediaEngine::getInstance()->setVolume(media_volume);
4210 }
4211
4212 // Voice
4213 if (gVoiceClient)
4214 {
4215 F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice");
4216 voice_volume = mute_volume * master_volume * voice_volume;
4217 gVoiceClient->setVoiceVolume(voice_volume);
4218 gVoiceClient->setMicGain(gSavedSettings.getF32("AudioLevelMic"));
4219
4220 if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
4221 {
4222 gVoiceClient->setMuteMic(true);
4223 }
4224 else
4225 {
4226 gVoiceClient->setMuteMic(false);
4227 }
4228 }
4229}
4230
4231void audio_update_listener()
4232{
4233 if (gAudiop)
4234 {
4235 // update listener position because agent has moved
4236 LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
4237 LLVector3 lpos_global_f;
4238 lpos_global_f.setVec(lpos_global);
4239
4240 gAudiop->setListener(lpos_global_f,
4241 // gCameraVelocitySmoothed,
4242 // LLVector3::zero,
4243 gAgent.getVelocity(), // !!! *TODO: need to replace this with smoothed velocity!
4244 gCamera->getUpAxis(),
4245 gCamera->getAtAxis());
4246 }
4247}
4248
4249void audio_update_wind(bool force_update)
4250{
4251#ifdef kAUDIO_ENABLE_WIND
4252 //
4253 // Extract height above water to modulate filter by whether above/below water
4254 //
4255 LLViewerRegion* region = gAgent.getRegion();
4256 if (region)
4257 {
4258 static F32 last_camera_water_height = -1000.f;
4259 LLVector3 camera_pos = gAgent.getCameraPositionAgent();
4260 F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
4261
4262 //
4263 // Don't update rolloff factor unless water surface has been crossed
4264 //
4265 if (force_update || (last_camera_water_height * camera_water_height) < 0.f)
4266 {
4267 if (camera_water_height < 0.f)
4268 {
4269 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff") * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
4270 }
4271 else
4272 {
4273 gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
4274 }
4275 }
4276 // this line rotates the wind vector to be listener (agent) relative
4277 // unfortunately we have to pre-translate to undo the translation that
4278 // occurs in the transform call
4279 gRelativeWindVec = gAgent.getFrameAgent().rotateToLocal(gWindVec - gAgent.getVelocity());
4280
4281 // don't use the setter setMaxWindGain() because we don't
4282 // want to screw up the fade-in on startup by setting actual source gain
4283 // outside the fade-in.
4284 gAudiop->mMaxWindGain = gSavedSettings.getF32("AudioLevelAmbient");
4285
4286 last_camera_water_height = camera_water_height;
4287 gAudiop->updateWind(gRelativeWindVec, camera_water_height);
4288 }
4289#endif
4290}
4291
4292
4293/////////////////////////////////////////////////////////
4294
4295BOOL raycast_for_new_obj_pos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face,
4296 BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region )
4297{
4298 F32 max_dist_from_camera = gSavedSettings.getF32( "MaxSelectDistance" ) - 1.f;
4299
4300 // Viewer-side pick to find the right sim to create the object on.
4301 // First find the surface the object will be created on.
4302 gViewerWindow->hitObjectOrLandGlobalImmediate(x, y, NULL, FALSE);
4303
4304 // Note: use the frontmost non-flora version because (a) plants usually have lots of alpha and (b) pants' Havok
4305 // representations (if any) are NOT the same as their viewer representation.
4306 *hit_obj = gObjectList.findObject( gLastHitNonFloraObjectID );
4307 *hit_face = gLastHitNonFloraObjectFace;
4308 *b_hit_land = !(*hit_obj) && !gLastHitNonFloraPosGlobal.isExactlyZero();
4309 LLVector3d land_pos_global = gLastHitNonFloraPosGlobal;
4310
4311 // Make sure there's a surface to place the new object on.
4312 BOOL bypass_sim_raycast = FALSE;
4313 LLVector3d surface_pos_global;
4314 if (*b_hit_land)
4315 {
4316 surface_pos_global = land_pos_global;
4317 bypass_sim_raycast = TRUE;
4318 }
4319 else
4320 if (*hit_obj)
4321 {
4322 surface_pos_global = (*hit_obj)->getPositionGlobal();
4323 }
4324 else
4325 {
4326 return FALSE;
4327 }
4328
4329 // Make sure the surface isn't too far away.
4330 LLVector3d ray_start_global = gAgent.getCameraPositionGlobal();
4331 F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared());
4332 if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) )
4333 {
4334 return FALSE;
4335 }
4336
4337 // Find the sim where the surface lives.
4338 LLViewerRegion *regionp = gWorldp->getRegionFromPosGlobal(surface_pos_global);
4339 if (!regionp)
4340 {
4341 llwarns << "Trying to add object outside of all known regions!" << llendl;
4342 return FALSE;
4343 }
4344
4345 // Find the simulator-side ray that will be used to place the object accurately
4346 LLVector3d mouse_direction;
4347 mouse_direction.setVec( gViewerWindow->mouseDirectionGlobal( x, y ) );
4348
4349 *region = regionp;
4350 *ray_start_region = regionp->getPosRegionFromGlobal( ray_start_global );
4351 F32 near_clip = gCamera->getNear() + 0.01f; // Include an epsilon to avoid rounding issues.
4352 *ray_start_region += gCamera->getAtAxis() * near_clip;
4353
4354 if( bypass_sim_raycast )
4355 {
4356 // Hack to work around Havok's inability to ray cast onto height fields
4357 *ray_end_region = regionp->getPosRegionFromGlobal( surface_pos_global ); // ray end is the viewer's intersection point
4358 }
4359 else
4360 {
4361 LLVector3d ray_end_global = ray_start_global + (1.f + max_dist_from_camera) * mouse_direction; // add an epsilon to the sim version of the ray to avoid rounding problems.
4362 *ray_end_region = regionp->getPosRegionFromGlobal( ray_end_global );
4363 }
4364
4365 return TRUE;
4366}
4367
4368const LLVector3 DEFAULT_OBJECT_SCALE(0.5f, 0.5f, 0.5f);
4369
4370BOOL add_object( LLPCode pcode, S32 x, S32 y, U8 use_physics )
4371{
4372 LLVector3 ray_start_region;
4373 LLVector3 ray_end_region;
4374 LLViewerRegion* regionp = NULL;
4375 BOOL b_hit_land = FALSE;
4376 S32 hit_face = -1;
4377 LLViewerObject* hit_obj = NULL;
4378 U8 state = 0;
4379 BOOL success = raycast_for_new_obj_pos( x, y, &hit_obj, &hit_face, &b_hit_land, &ray_start_region, &ray_end_region, &regionp );
4380 if( !success )
4381 {
4382 return FALSE;
4383 }
4384
4385 if( hit_obj && (hit_obj->isAvatar() || hit_obj->isAttachment()) )
4386 {
4387 // Can't create objects on avatars or attachments
4388 return FALSE;
4389 }
4390
4391 if (NULL == regionp)
4392 {
4393 llwarns << "regionp was NULL; aborting function." << llendl;
4394 return FALSE;
4395 }
4396
4397 if (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX)
4398 {
4399 LLFirstUse::useSandbox();
4400 }
4401
4402 // Set params for new object based on its PCode.
4403 LLQuaternion rotation;
4404 LLVector3 scale = DEFAULT_OBJECT_SCALE;
4405 U8 material = LL_MCODE_WOOD;
4406 BOOL create_selected = FALSE;
4407 LLVolumeParams volume_params;
4408
4409 switch (pcode)
4410 {
4411 case LL_PCODE_LEGACY_GRASS:
4412 // Randomize size of grass patch
4413 scale.setVec(10.f + ll_frand(20.f), 10.f + ll_frand(20.f), 1.f + ll_frand(2.f));
4414 state = rand() % LLVOGrass::sMaxGrassSpecies;
4415 break;
4416
4417
4418 case LL_PCODE_LEGACY_TREE:
4419 case LL_PCODE_TREE_NEW:
4420 state = rand() % LLVOTree::sMaxTreeSpecies;
4421 break;
4422
4423 case LL_PCODE_SPHERE:
4424 case LL_PCODE_CONE:
4425 case LL_PCODE_CUBE:
4426 case LL_PCODE_CYLINDER:
4427 case LL_PCODE_TORUS:
4428 case LLViewerObject::LL_VO_SQUARE_TORUS:
4429 case LLViewerObject::LL_VO_TRIANGLE_TORUS:
4430 default:
4431 create_selected = TRUE;
4432 break;
4433 }
4434
4435 // Play creation sound
4436 if (gAudiop)
4437 {
4438 F32 volume = gSavedSettings.getF32("AudioLevelUI");
4439 gAudiop->triggerSound( LLUUID(gSavedSettings.getString("UISndObjectCreate")), gAgent.getID(), volume);
4440 }
4441
4442 gMessageSystem->newMessageFast(_PREHASH_ObjectAdd);
4443 gMessageSystem->nextBlockFast(_PREHASH_AgentData);
4444 gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
4445 gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
4446 gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
4447 gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
4448 gMessageSystem->addU8Fast(_PREHASH_Material, material);
4449
4450 U32 flags = 0; // not selected
4451 if (use_physics)
4452 {
4453 flags |= FLAGS_USE_PHYSICS;
4454 }
4455 if (create_selected)
4456 {
4457 flags |= FLAGS_CREATE_SELECTED;
4458 }
4459 gMessageSystem->addU32Fast(_PREHASH_AddFlags, flags );
4460
4461 LLPCode volume_pcode; // ...PCODE_VOLUME, or the original on error
4462 switch (pcode)
4463 {
4464 case LL_PCODE_SPHERE:
4465 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
4466
4467 volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
4468 volume_params.setBeginAndEndS( 0.f, 1.f );
4469 volume_params.setBeginAndEndT( 0.f, 1.f );
4470 volume_params.setRatio ( 1, 1 );
4471 volume_params.setShear ( 0, 0 );
4472 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4473 volume_pcode = LL_PCODE_VOLUME;
4474 break;
4475
4476 case LL_PCODE_TORUS:
4477 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
4478
4479 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_CIRCLE );
4480 volume_params.setBeginAndEndS( 0.f, 1.f );
4481 volume_params.setBeginAndEndT( 0.f, 1.f );
4482 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
4483 volume_params.setShear ( 0, 0 );
4484 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4485 volume_pcode = LL_PCODE_VOLUME;
4486 break;
4487
4488 case LLViewerObject::LL_VO_SQUARE_TORUS:
4489 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
4490
4491 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_CIRCLE );
4492 volume_params.setBeginAndEndS( 0.f, 1.f );
4493 volume_params.setBeginAndEndT( 0.f, 1.f );
4494 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
4495 volume_params.setShear ( 0, 0 );
4496 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4497 volume_pcode = LL_PCODE_VOLUME;
4498 break;
4499
4500 case LLViewerObject::LL_VO_TRIANGLE_TORUS:
4501 rotation.setQuat(90.f * DEG_TO_RAD, LLVector3::y_axis);
4502
4503 volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_CIRCLE );
4504 volume_params.setBeginAndEndS( 0.f, 1.f );
4505 volume_params.setBeginAndEndT( 0.f, 1.f );
4506 volume_params.setRatio ( 1.f, 0.25f ); // "top size"
4507 volume_params.setShear ( 0, 0 );
4508 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4509 volume_pcode = LL_PCODE_VOLUME;
4510 break;
4511
4512 case LL_PCODE_SPHERE_HEMI:
4513 volume_params.setType( LL_PCODE_PROFILE_CIRCLE_HALF, LL_PCODE_PATH_CIRCLE );
4514 //volume_params.setBeginAndEndS( 0.5f, 1.f );
4515 volume_params.setBeginAndEndT( 0.f, 0.5f );
4516 volume_params.setRatio ( 1, 1 );
4517 volume_params.setShear ( 0, 0 );
4518 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4519 volume_pcode = LL_PCODE_VOLUME;
4520 break;
4521
4522 case LL_PCODE_CUBE:
4523 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
4524 volume_params.setBeginAndEndS( 0.f, 1.f );
4525 volume_params.setBeginAndEndT( 0.f, 1.f );
4526 volume_params.setRatio ( 1, 1 );
4527 volume_params.setShear ( 0, 0 );
4528 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4529 volume_pcode = LL_PCODE_VOLUME;
4530 break;
4531
4532 case LL_PCODE_PRISM:
4533 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
4534 volume_params.setBeginAndEndS( 0.f, 1.f );
4535 volume_params.setBeginAndEndT( 0.f, 1.f );
4536 volume_params.setRatio ( 0, 1 );
4537 volume_params.setShear ( -0.5f, 0 );
4538 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4539 volume_pcode = LL_PCODE_VOLUME;
4540 break;
4541
4542 case LL_PCODE_PYRAMID:
4543 volume_params.setType( LL_PCODE_PROFILE_SQUARE, LL_PCODE_PATH_LINE );
4544 volume_params.setBeginAndEndS( 0.f, 1.f );
4545 volume_params.setBeginAndEndT( 0.f, 1.f );
4546 volume_params.setRatio ( 0, 0 );
4547 volume_params.setShear ( 0, 0 );
4548 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4549 volume_pcode = LL_PCODE_VOLUME;
4550 break;
4551
4552 case LL_PCODE_TETRAHEDRON:
4553 volume_params.setType( LL_PCODE_PROFILE_EQUALTRI, LL_PCODE_PATH_LINE );
4554 volume_params.setBeginAndEndS( 0.f, 1.f );
4555 volume_params.setBeginAndEndT( 0.f, 1.f );
4556 volume_params.setRatio ( 0, 0 );
4557 volume_params.setShear ( 0, 0 );
4558 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4559 volume_pcode = LL_PCODE_VOLUME;
4560 break;
4561
4562 case LL_PCODE_CYLINDER:
4563 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
4564 volume_params.setBeginAndEndS( 0.f, 1.f );
4565 volume_params.setBeginAndEndT( 0.f, 1.f );
4566 volume_params.setRatio ( 1, 1 );
4567 volume_params.setShear ( 0, 0 );
4568 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4569 volume_pcode = LL_PCODE_VOLUME;
4570 break;
4571
4572 case LL_PCODE_CYLINDER_HEMI:
4573 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
4574 volume_params.setBeginAndEndS( 0.25f, 0.75f );
4575 volume_params.setBeginAndEndT( 0.f, 1.f );
4576 volume_params.setRatio ( 1, 1 );
4577 volume_params.setShear ( 0, 0 );
4578 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4579 volume_pcode = LL_PCODE_VOLUME;
4580 break;
4581
4582 case LL_PCODE_CONE:
4583 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
4584 volume_params.setBeginAndEndS( 0.f, 1.f );
4585 volume_params.setBeginAndEndT( 0.f, 1.f );
4586 volume_params.setRatio ( 0, 0 );
4587 volume_params.setShear ( 0, 0 );
4588 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4589 volume_pcode = LL_PCODE_VOLUME;
4590 break;
4591
4592 case LL_PCODE_CONE_HEMI:
4593 volume_params.setType( LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE );
4594 volume_params.setBeginAndEndS( 0.25f, 0.75f );
4595 volume_params.setBeginAndEndT( 0.f, 1.f );
4596 volume_params.setRatio ( 0, 0 );
4597 volume_params.setShear ( 0, 0 );
4598 LLVolumeMessage::packVolumeParams(&volume_params, gMessageSystem);
4599 volume_pcode = LL_PCODE_VOLUME;
4600 break;
4601
4602 default:
4603 LLVolumeMessage::packVolumeParams(0, gMessageSystem);
4604 volume_pcode = pcode;
4605 break;
4606 }
4607 gMessageSystem->addU8Fast(_PREHASH_PCode, volume_pcode);
4608
4609 gMessageSystem->addVector3Fast(_PREHASH_Scale, scale );
4610 gMessageSystem->addQuatFast(_PREHASH_Rotation, rotation );
4611 gMessageSystem->addVector3Fast(_PREHASH_RayStart, ray_start_region );
4612 gMessageSystem->addVector3Fast(_PREHASH_RayEnd, ray_end_region );
4613 gMessageSystem->addU8Fast(_PREHASH_BypassRaycast, (U8)b_hit_land );
4614 gMessageSystem->addU8Fast(_PREHASH_RayEndIsIntersection, (U8)FALSE );
4615 gMessageSystem->addU8Fast(_PREHASH_State, state);
4616
4617 // Limit raycast to a single object.
4618 // Speeds up server raycast + avoid problems with server ray hitting objects
4619 // that were clipped by the near plane or culled on the viewer.
4620 LLUUID ray_target_id;
4621 if( hit_obj )
4622 {
4623 ray_target_id = hit_obj->getID();
4624 }
4625 else
4626 {
4627 ray_target_id.setNull();
4628 }
4629 gMessageSystem->addUUIDFast(_PREHASH_RayTargetID, ray_target_id );
4630
4631 // Pack in name value pairs
4632 gMessageSystem->sendReliable(regionp->getHost());
4633
4634 // Spawns a message, so must be after above send
4635 if (create_selected)
4636 {
4637 gSelectMgr->deselectAll();
4638 gViewerWindow->getWindow()->incBusyCount();
4639 }
4640
4641 // VEFFECT: AddObject
4642 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
4643 effectp->setSourceObject(gAgent.getAvatarObject());
4644 effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region));
4645 effectp->setDuration(LL_HUD_DUR_SHORT);
4646 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
4647
4648 gViewerStats->incStat(LLViewerStats::ST_CREATE_COUNT);
4649
4650 return TRUE;
4651}
4652
4653
4654
4655#if LL_WINDOWS
4656void create_console()
4657{
4658 int h_con_handle;
4659 long l_std_handle;
4660
4661 CONSOLE_SCREEN_BUFFER_INFO coninfo;
4662 FILE *fp;
4663
4664 // allocate a console for this app
4665 AllocConsole();
4666
4667 // set the screen buffer to be big enough to let us scroll text
4668 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
4669 coninfo.dwSize.Y = MAX_CONSOLE_LINES;
4670 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize);
4671
4672 // redirect unbuffered STDOUT to the console
4673 l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
4674 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
4675 fp = _fdopen( h_con_handle, "w" );
4676 *stdout = *fp;
4677 setvbuf( stdout, NULL, _IONBF, 0 );
4678
4679 // redirect unbuffered STDIN to the console
4680 l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE);
4681 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
4682 fp = _fdopen( h_con_handle, "r" );
4683 *stdin = *fp;
4684 setvbuf( stdin, NULL, _IONBF, 0 );
4685
4686 // redirect unbuffered STDERR to the console
4687 l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE);
4688 h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT);
4689 fp = _fdopen( h_con_handle, "w" );
4690 *stderr = *fp;
4691 setvbuf( stderr, NULL, _IONBF, 0 );
4692}
4693#endif
4694
4695
4696
4697//-------------------------------------------------------------------
4698//-------------------------------------------------------------------
4699// Vector Performance Options
4700//-------------------------------------------------------------------
4701//-------------------------------------------------------------------
4702
4703// Initially, we test the performance of the vectorization code, then
4704// turn it off if it ends up being slower. JC
4705BOOL gVectorizePerfTest = TRUE;
4706BOOL gVectorizeEnable = FALSE;
4707U32 gVectorizeProcessor = 0;
4708BOOL gVectorizeSkin = FALSE;
4709
4710void update_vector_performances(void)
4711{
4712 char *vp;
4713
4714 switch(gVectorizeProcessor)
4715 {
4716 case 2: vp = "SSE2"; break; // *TODO: replace the magic #s
4717 case 1: vp = "SSE"; break;
4718 default: vp = "COMPILER DEFAULT"; break;
4719 }
4720 llinfos << "Vectorization : " << ( gVectorizeEnable ? "ENABLED" : "DISABLED" ) << llendl ;
4721 llinfos << "Vector Processor : " << vp << llendl ;
4722 llinfos << "Vectorized Skinning : " << ( gVectorizeSkin ? "ENABLED" : "DISABLED" ) << llendl ;
4723
4724 if(gVectorizeEnable && gVectorizeSkin)
4725 {
4726 switch(gVectorizeProcessor)
4727 {
4728 case 2:
4729 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE2;
4730 break;
4731 case 1:
4732 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometrySSE;
4733 break;
4734 default:
4735 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryVectorized;
4736 break;
4737 }
4738 }
4739 else
4740 {
4741 LLViewerJointMesh::sUpdateGeometryFunc = &LLViewerJointMesh::updateGeometryOriginal;
4742 }
4743}
4744
4745
4746class LLVectorizationEnableListener: public LLSimpleListener
4747{
4748 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4749 {
4750 gVectorizeEnable = event->getValue().asBoolean();
4751 update_vector_performances();
4752 return true;
4753 }
4754};
4755static LLVectorizationEnableListener vectorization_enable_listener;
4756
4757class LLVectorizeSkinListener: public LLSimpleListener
4758{
4759 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4760 {
4761 gVectorizeSkin = event->getValue().asBoolean();
4762 update_vector_performances();
4763 return true;
4764 }
4765};
4766static LLVectorizeSkinListener vectorize_skin_listener;
4767
4768class LLVectorProcessorListener: public LLSimpleListener
4769{
4770 bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
4771 {
4772 gVectorizeProcessor = event->getValue().asInteger();
4773 update_vector_performances();
4774 return true;
4775 }
4776};
4777static LLVectorProcessorListener vector_processor_listener;
4778
4779// Use these strictly for things that are constructed at startup,
4780// or for things that are performance critical. JC
4781void saved_settings_to_globals()
4782{
4783 LLBUTTON_H_PAD = gSavedSettings.getS32("ButtonHPad");
4784 LLBUTTON_V_PAD = gSavedSettings.getS32("ButtonVPad");
4785 BTN_HEIGHT_SMALL = gSavedSettings.getS32("ButtonHeightSmall");
4786 BTN_HEIGHT = gSavedSettings.getS32("ButtonHeight");
4787
4788 MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight");
4789 MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth");
4790 STATUS_BAR_HEIGHT = gSavedSettings.getS32("StatusBarHeight");
4791
4792 LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2;
4793 LLCOMBOBOX_WIDTH = 128;
4794
4795 LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize"));
4796
4797 LLVOSky::sNighttimeBrightness = gSavedSettings.getF32("RenderNightBrightness");
4798
4799 LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic");
4800 LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor");
4801 LLVOVolume::sDistanceFactor = 1.f-LLVOVolume::sLODFactor * 0.1f;
4802 LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
4803 LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
4804 LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
4805 LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");
4806 LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
4807 // clamp auto-open time to some minimum usable value
4808 LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
4809 LLToolBar::sInventoryAutoOpenTime = gSavedSettings.getF32("InventoryAutoOpenDelay");
4810 LLSelectMgr::sRectSelectInclusive = gSavedSettings.getBOOL("RectangleSelectInclusive");
4811 LLSelectMgr::sRenderHiddenSelections = gSavedSettings.getBOOL("RenderHiddenSelections");
4812 LLSelectMgr::sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
4813
4814 gFrameStats.setTrackStats(gSavedSettings.getBOOL("StatsSessionTrackFrameStats"));
4815 gAgentPilot.mNumRuns = gSavedSettings.getS32("StatsNumRuns");
4816 gAgentPilot.mQuitAfterRuns = gSavedSettings.getBOOL("StatsQuitAfterRuns");
4817 gAgent.mHideGroupTitle = gSavedSettings.getBOOL("RenderHideGroupTitle");
4818
4819 gDebugWindowProc = gSavedSettings.getBOOL("DebugWindowProc");
4820 gAllowIdleAFK = gSavedSettings.getBOOL("AllowIdleAFK");
4821 gAFKTimeout = gSavedSettings.getF32("AFKTimeout");
4822 gMouseSensitivity = gSavedSettings.getF32("MouseSensitivity");
4823 gInvertMouse = gSavedSettings.getBOOL("InvertMouse");
4824 gShowObjectUpdates = gSavedSettings.getBOOL("ShowObjectUpdates");
4825 gMapScale = gSavedSettings.getF32("MapScale");
4826 gMiniMapScale = gSavedSettings.getF32("MiniMapScale");
4827 gHandleKeysAsync = gSavedSettings.getBOOL("AsyncKeyboard");
4828 LLHoverView::sShowHoverTips = gSavedSettings.getBOOL("ShowHoverTips");
4829
4830#if LL_VECTORIZE
4831 if (gSysCPU.hasAltivec())
4832 {
4833 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
4834 gSavedSettings.setU32("VectorizeProcessor", 0 );
4835 }
4836 else
4837 if (gSysCPU.hasSSE2())
4838 {
4839 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
4840 gSavedSettings.setU32("VectorizeProcessor", 2 );
4841 }
4842 else
4843 if (gSysCPU.hasSSE())
4844 {
4845 gSavedSettings.setBOOL("VectorizeEnable", TRUE );
4846 gSavedSettings.setU32("VectorizeProcessor", 1 );
4847 }
4848 else
4849 {
4850 // Don't bother testing or running if CPU doesn't support it. JC
4851 gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
4852 gSavedSettings.setBOOL("VectorizeEnable", FALSE );
4853 gSavedSettings.setU32("VectorizeProcessor", 0 );
4854 gSavedSettings.setBOOL("VectorizeSkin", FALSE);
4855 }
4856#else
4857 // This build target doesn't support SSE, don't test/run.
4858 gSavedSettings.setBOOL("VectorizePerfTest", FALSE );
4859 gSavedSettings.setBOOL("VectorizeEnable", FALSE );
4860 gSavedSettings.setU32("VectorizeProcessor", 0 );
4861 gSavedSettings.setBOOL("VectorizeSkin", FALSE);
4862#endif
4863
4864 gVectorizePerfTest = gSavedSettings.getBOOL("VectorizePerfTest");
4865 gVectorizeEnable = gSavedSettings.getBOOL("VectorizeEnable");
4866 gVectorizeProcessor = gSavedSettings.getU32("VectorizeProcessor");
4867 gVectorizeSkin = gSavedSettings.getBOOL("VectorizeSkin");
4868 update_vector_performances();
4869
4870 // Into a global in case we corrupt the list on crash.
4871 gCrashBehavior = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
4872
4873 // propagate push to talk preference to current status
4874 gSavedSettings.setBOOL("PTTCurrentlyEnabled", gSavedSettings.getBOOL("EnablePushToTalk"));
4875
4876 settings_setup_listeners();
4877
4878 // these are currently static in this file, so they can't move to settings_setup_listeners
4879 gSavedSettings.getControl("VectorizeEnable")->addListener(&vectorization_enable_listener);
4880 gSavedSettings.getControl("VectorizeProcessor")->addListener(&vector_processor_listener);
4881 gSavedSettings.getControl("VectorizeSkin")->addListener(&vectorize_skin_listener);
4882
4883 // gAgent.init() also loads from saved settings.
4884}
4885
4886void cleanup_saved_settings()
4887{
4888 gSavedSettings.setBOOL("MouseSun", FALSE);
4889
4890 gSavedSettings.setBOOL("FlyBtnState", FALSE);
4891
4892 gSavedSettings.setBOOL("FirstPersonBtnState", FALSE);
4893 gSavedSettings.setBOOL("ThirdPersonBtnState", TRUE);
4894 gSavedSettings.setBOOL("BuildBtnState", FALSE);
4895
4896 gSavedSettings.setBOOL("UseEnergy", TRUE); // force toggle to turn off, since sends message to simulator
4897
4898 gSavedSettings.setBOOL("DebugWindowProc", gDebugWindowProc);
4899
4900 gSavedSettings.setBOOL("AllowIdleAFK", gAllowIdleAFK);
4901 gSavedSettings.setBOOL("ShowObjectUpdates", gShowObjectUpdates);
4902
4903 if (!gNoRender)
4904 {
4905 if (gDebugView)
4906 {
4907 gSavedSettings.setBOOL("ShowDebugConsole", gDebugView->mDebugConsolep->getVisible());
4908 gSavedSettings.setBOOL("ShowDebugStats", gDebugView->mStatViewp->getVisible());
4909 }
4910 }
4911
4912 // save window position if not fullscreen
4913 // as we don't track it in callbacks
4914 BOOL fullscreen = gViewerWindow->mWindow->getFullscreen();
4915 BOOL maximized = gViewerWindow->mWindow->getMaximized();
4916 if (!fullscreen && !maximized)
4917 {
4918 LLCoordScreen window_pos;
4919
4920 if (gViewerWindow->mWindow->getPosition(&window_pos))
4921 {
4922 gSavedSettings.setS32("WindowX", window_pos.mX);
4923 gSavedSettings.setS32("WindowY", window_pos.mY);
4924 }
4925 }
4926
4927 gSavedSettings.setF32("MapScale", gMapScale );
4928 gSavedSettings.setF32("MiniMapScale", gMiniMapScale );
4929 gSavedSettings.setBOOL("AsyncKeyboard", gHandleKeysAsync);
4930 gSavedSettings.setBOOL("ShowHoverTips", LLHoverView::sShowHoverTips);
4931
4932 // Some things are cached in LLAgent.
4933 if (gAgent.mInitialized)
4934 {
4935 gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance);
4936 }
4937
4938 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, gCrashBehavior);
4939}
4940
4941
4942void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data)
4943{
4944 LLNameListCtrl::refreshAll(id, firstname, lastname, is_group);
4945 LLNameBox::refreshAll(id, firstname, lastname, is_group);
4946 LLNameEditor::refreshAll(id, firstname, lastname, is_group);
4947
4948 // TODO: Actually be intelligent about the refresh.
4949 // For now, just brute force refresh the dialogs.
4950 dialog_refresh_all();
4951}
4952
4953
4954void write_debug(const std::string& str)
4955{
4956 write_debug(str.c_str());
4957}
4958
4959void write_debug(const char *str)
4960{
4961 if (!gDebugFile)
4962 {
4963 std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log");
4964 llinfos << "Opening debug file " << debug_filename << llendl;
4965 gDebugFile = LLFile::fopen(debug_filename.c_str(), "w"); /* Flawfinder: ignore */
4966 if (!gDebugFile)
4967 {
4968 llinfos << "Opening debug file " << debug_filename << " failed. Using stderr." << llendl;
4969 gDebugFile = stderr;
4970 }
4971 }
4972 fputs(str, gDebugFile);
4973 fflush(gDebugFile);
4974}
4975
4976void close_debug()
4977{
4978 if (gDebugFile)
4979 {
4980 fclose(gDebugFile);
4981 }
4982 gDebugFile = NULL;
4983}
4984
4985void print_agent_nvpairs(void*)
4986{
4987 LLViewerObject *objectp;
4988
4989 llinfos << "Agent Name Value Pairs" << llendl;
4990
4991 objectp = gObjectList.findObject(gAgentID);
4992 if (objectp)
4993 {
4994 objectp->printNameValuePairs();
4995 }
4996 else
4997 {
4998 llinfos << "Can't find agent object" << llendl;
4999 }
5000
5001 llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl;
5002}
5003
5004
5005void reset_statistics()
5006{
5007 gPipeline.resetFrameStats(); // Reset per-frame statistics.
5008 if (LLSurface::sTextureUpdateTime)
5009 {
5010 LLSurface::sTexelsUpdatedPerSecStat.addValue(0.001f*(LLSurface::sTexelsUpdated / LLSurface::sTextureUpdateTime));
5011 LLSurface::sTexelsUpdated = 0;
5012 LLSurface::sTextureUpdateTime = 0.f;
5013 }
5014}
5015
5016
5017void output_statistics(void*)
5018{
5019 llinfos << "Number of orphans: " << gObjectList.getOrphanCount() << llendl;
5020 llinfos << "Number of dead objects: " << gObjectList.mNumDeadObjects << llendl;
5021 llinfos << "Num images: " << gImageList.getNumImages() << llendl;
5022 llinfos << "Texture usage: " << LLImageGL::sGlobalTextureMemory << llendl;
5023 llinfos << "Texture working set: " << LLImageGL::sBoundTextureMemory << llendl;
5024 llinfos << "Raw usage: " << LLImageRaw::sGlobalRawMemory << llendl;
5025 llinfos << "Formatted usage: " << LLImageFormatted::sGlobalFormattedMemory << llendl;
5026 llinfos << "Zombie Viewer Objects: " << LLViewerObject::getNumZombieObjects() << llendl;
5027 llinfos << "Number of lights: " << gPipeline.getLightCount() << llendl;
5028
5029 llinfos << "Memory Usage:" << llendl;
5030 llinfos << "--------------------------------" << llendl;
5031 llinfos << "Pipeline:" << llendl;
5032 llinfos << llendl;
5033
5034#if LL_SMARTHEAP
5035 llinfos << "--------------------------------" << llendl;
5036 {
5037 llinfos << "sizeof(LLVOVolume) = " << sizeof(LLVOVolume) << llendl;
5038
5039 U32 total_pool_size = 0;
5040 U32 total_used_size = 0;
5041 MEM_POOL_INFO pool_info;
5042 MEM_POOL_STATUS pool_status;
5043 U32 pool_num = 0;
5044 for(pool_status = MemPoolFirst( &pool_info, 1 );
5045 pool_status != MEM_POOL_END;
5046 pool_status = MemPoolNext( &pool_info, 1 ) )
5047 {
5048 llinfos << "Pool #" << pool_num << llendl;
5049 if( MEM_POOL_OK != pool_status )
5050 {
5051 llwarns << "Pool not ok" << llendl;
5052 continue;
5053 }
5054
5055 llinfos << "Pool blockSizeFS " << pool_info.blockSizeFS
5056 << " pageSize " << pool_info.pageSize
5057 << llendl;
5058
5059 U32 pool_count = MemPoolCount(pool_info.pool);
5060 llinfos << "Blocks " << pool_count << llendl;
5061
5062 U32 pool_size = MemPoolSize( pool_info.pool );
5063 if( pool_size == MEM_ERROR_RET )
5064 {
5065 llinfos << "MemPoolSize() failed (" << pool_num << ")" << llendl;
5066 }
5067 else
5068 {
5069 llinfos << "MemPool Size " << pool_size / 1024 << "K" << llendl;
5070 }
5071
5072 total_pool_size += pool_size;
5073
5074 if( !MemPoolLock( pool_info.pool ) )
5075 {
5076 llinfos << "MemPoolLock failed (" << pool_num << ") " << llendl;
5077 continue;
5078 }
5079
5080 U32 used_size = 0;
5081 MEM_POOL_ENTRY entry;
5082 entry.entry = NULL;
5083 while( MemPoolWalk( pool_info.pool, &entry ) == MEM_POOL_OK )
5084 {
5085 if( entry.isInUse )
5086 {
5087 used_size += entry.size;
5088 }
5089 }
5090
5091 MemPoolUnlock( pool_info.pool );
5092
5093 llinfos << "MemPool Used " << used_size/1024 << "K" << llendl;
5094 total_used_size += used_size;
5095 pool_num++;
5096 }
5097
5098 llinfos << "Total Pool Size " << total_pool_size/1024 << "K" << llendl;
5099 llinfos << "Total Used Size " << total_used_size/1024 << "K" << llendl;
5100
5101 }
5102#endif
5103
5104 llinfos << "--------------------------------" << llendl;
5105 llinfos << "Avatar Memory (partly overlaps with above stats):" << llendl;
5106 gTexStaticImageList.dumpByteCount();
5107 LLVOAvatar::dumpScratchTextureByteCount();
5108 LLTexLayerSetBuffer::dumpTotalByteCount();
5109 LLVOAvatar::dumpTotalLocalTextureByteCount();
5110 LLTexLayerParamAlpha::dumpCacheByteCount();
5111 LLVOAvatar::dumpBakedStatus();
5112
5113 llinfos << llendl;
5114
5115 llinfos << "Object counts:" << llendl;
5116 S32 i;
5117 S32 obj_counts[256];
5118// S32 app_angles[256];
5119 for (i = 0; i < 256; i++)
5120 {
5121 obj_counts[i] = 0;
5122 }
5123 for (i = 0; i < gObjectList.getNumObjects(); i++)
5124 {
5125 LLViewerObject *objectp = gObjectList.getObject(i);
5126 if (objectp)
5127 {
5128 obj_counts[objectp->getPCode()]++;
5129 }
5130 }
5131 for (i = 0; i < 256; i++)
5132 {
5133 if (obj_counts[i])
5134 {
5135 llinfos << LLPrimitive::pCodeToString(i) << ":" << obj_counts[i] << llendl;
5136 }
5137 }
5138
5139 /*
5140 llinfos << "Object size distribution" << llendl;
5141 llinfos << "------------------------" << llendl;
5142 for (i = 0; i < 256; i++)
5143 {
5144 obj_counts[i] = 0;
5145 //app_angles[i] = 0;
5146 }
5147 for (i = 0; i < gObjectList.getNumObjects(); i++)
5148 {
5149 LLViewerObject *objectp = gObjectList.getObject(i);
5150 S32 size = llmin(255, (S32)objectp->getRadius()/2);
5151 obj_counts[size]++;
5152 }
5153 for (i = 0; i < 256; i++)
5154 {
5155 if (obj_counts[i])
5156 {
5157 llinfos << i*2 << ":" << (i+1)*2 << " - " << obj_counts[i] << llendl;
5158 }
5159 }
5160 */
5161
5162 /*
5163
5164 llinfos << llendl;
5165 llinfos << "Lighting statistics" << llendl;
5166 llinfos << "-------------------" << llendl;
5167 S32 light_bins[256];
5168 S32 light_counts[256];
5169 for (i = 0; i < 256; i++)
5170 {
5171 light_bins[i] = 0;
5172 light_counts[i] = 0;
5173 }
5174 for (i = 0; i < gPipeline.mLightSet.count(); i++)
5175 {
5176 LLDrawable *drawablep = gPipeline.mLightSet[i];
5177 F32 light_range = drawablep->getMetric() * LIGHT_RANGE_FACTOR;
5178 S32 light_bin = light_range / 4;
5179 S32 count_bin = llmin(drawablep->mLightSet.getLength() / 25, 255);
5180
5181 if (count_bin > 20)
5182 {
5183 llinfos << drawablep->getVObj()->getPCodeString() << ":" << count_bin*25 << llendl;
5184 drawablep->getVObj()->dump();
5185 }
5186 //llinfos << i << ": " << light_range << llendl;
5187 light_bins[light_bin]++;
5188 light_counts[count_bin]++;
5189 }
5190 for (i = 0; i < 256; i++)
5191 {
5192 if (light_bins[i])
5193 {
5194 llinfos << i*4 << ":" << (i+1)*4 << " - " << light_bins[i] << llendl;
5195 }
5196 }
5197 llinfos << llendl;
5198 llinfos << "LightSet counts" << llendl;
5199 for (i = 0; i < 256; i++)
5200 {
5201 if (light_counts[i])
5202 {
5203 llinfos << i*25 << ":" << (i+1)*25 << " - " << light_counts[i] << llendl;
5204 }
5205 }
5206 */
5207}
5208
5209class ViewerStatsResponder : public LLHTTPClient::Responder
5210{
5211public:
5212 ViewerStatsResponder() { }
5213
5214 void error(U32 statusNum, const std::string& reason)
5215 {
5216 llinfos << "ViewerStatsResponder::error " << statusNum << " "
5217 << reason << llendl;
5218 }
5219
5220 void result(const LLSD& content)
5221 {
5222 llinfos << "ViewerStatsResponder::result" << llendl;
5223 }
5224};
5225
5226/*
5227 * The sim-side LLSD is in newsim/llagentinfo.cpp:forwardViewerStats.
5228 *
5229 * There's also a compatibility shim for the old fixed-format sim
5230 * stats in newsim/llagentinfo.cpp:processViewerStats.
5231 *
5232 * If you move stats around here, make the corresponding changes in
5233 * those locations, too.
5234 */
5235void send_stats()
5236{
5237 // IW 9/23/02 I elected not to move this into LLViewerStats
5238 // because it depends on too many viewer.cpp globals.
5239 // Someday we may want to merge all our stats into a central place
5240 // but that day is not today.
5241
5242 // Only send stats if the agent is connected to a region.
5243 if (!gAgent.getRegion() || gNoRender)
5244 {
5245 return;
5246 }
5247
5248 LLSD body;
5249 std::string url = gAgent.getRegion()->getCapability("ViewerStats");
5250
5251 if (url.empty()) {
5252 llwarns << "Could not get ViewerStats capability" << llendl;
5253 return;
5254 }
5255
5256 body["session_id"] = gAgentSessionID;
5257
5258 LLSD &agent = body["agent"];
5259
5260 time_t ltime;
5261 time(&ltime);
5262 F32 run_time = F32(LLFrameTimer::getElapsedSeconds());
5263
5264 agent["start_time"] = ltime - run_time;
5265 agent["run_time"] = run_time;
5266 // send fps only for time app spends in foreground
5267 agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32();
5268 agent["version"] = gCurrentVersion;
5269 agent["language"] = gSavedSettings.getString("Language");
5270
5271 agent["sim_fps"] = ((F32) gFrameCount - gSimFrames) /
5272 (F32) (gRenderStartTime.getElapsedTimeF32() - gSimLastTime);
5273
5274 gSimLastTime = gRenderStartTime.getElapsedTimeF32();
5275 gSimFrames = (F32) gFrameCount;
5276
5277 agent["agents_in_view"] = LLVOAvatar::sNumVisibleAvatars;
5278 agent["ping"] = gAvgSimPing;
5279 agent["meters_traveled"] = gAgent.getDistanceTraveled();
5280 agent["regions_visited"] = gAgent.getRegionsVisited();
5281 agent["mem_use"] = getCurrentRSS() / 1024.0;
5282
5283 LLSD &system = body["system"];
5284
5285 system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB();
5286 system["os"] = gSysOS.getOSString();
5287 system["cpu"] = gSysCPU.getCPUString();
5288
5289 std::string gpu_desc = llformat(
5290 "%-6s Class %d ",
5291 gGLManager.mGLVendorShort.substr(0,6).c_str(),
5292 gFeatureManagerp->getGPUClass())
5293 + gFeatureManagerp->getGPUString();
5294
5295 system["gpu"] = gpu_desc;
5296 system["gpu_class"] = gFeatureManagerp->getGPUClass();
5297 system["gpu_vendor"] = gGLManager.mGLVendorShort;
5298 system["gpu_version"] = gGLManager.mDriverVersionVendorString;
5299
5300 LLSD &download = body["downloads"];
5301
5302 download["world_kbytes"] = gTotalWorldBytes / 1024.0;
5303 download["object_kbytes"] = gTotalObjectBytes / 1024.0;
5304 download["texture_kbytes"] = gTotalTextureBytes / 1024.0;
5305
5306 LLSD &in = body["stats"]["net"]["in"];
5307
5308 in["kbytes"] = gMessageSystem->mTotalBytesIn / 1024.0;
5309 in["packets"] = (S32) gMessageSystem->mPacketsIn;
5310 in["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsIn;
5311 in["savings"] = (gMessageSystem->mUncompressedBytesIn -
5312 gMessageSystem->mCompressedBytesIn) / 1024.0;
5313
5314 LLSD &out = body["stats"]["net"]["out"];
5315
5316 out["kbytes"] = gMessageSystem->mTotalBytesOut / 1024.0;
5317 out["packets"] = (S32) gMessageSystem->mPacketsOut;
5318 out["compressed_packets"] = (S32) gMessageSystem->mCompressedPacketsOut;
5319 out["savings"] = (gMessageSystem->mUncompressedBytesOut -
5320 gMessageSystem->mCompressedBytesOut) / 1024.0;
5321
5322 LLSD &fail = body["stats"]["failures"];
5323
5324 fail["send_packet"] = (S32) gMessageSystem->mSendPacketFailureCount;
5325 fail["dropped"] = (S32) gMessageSystem->mDroppedPackets;
5326 fail["resent"] = (S32) gMessageSystem->mResentPackets;
5327 fail["failed_resends"] = (S32) gMessageSystem->mFailedResendPackets;
5328 fail["off_circuit"] = (S32) gMessageSystem->mOffCircuitPackets;
5329 fail["invalid"] = (S32) gMessageSystem->mInvalidOnCircuitPackets;
5330
5331 gViewerStats->addToMessage(body);
5332
5333 LLHTTPClient::post(url, body, new ViewerStatsResponder());
5334}
5335
5336#if !LL_WINDOWS
5337// catch the first signal and send logout messages logout
5338void signal_handlers(S32 s)
5339{
5340 release_signals();
5341
5342 // Check for graceful exit conditions
5343 if(SIGTERM == s)
5344 {
5345 // Raise the flag telling the system to shut down
5346 app_force_quit(NULL);
5347 return;
5348 }
5349
5350# if LL_LINUX || LL_SOLARIS
5351 // Really useful to know what KIND of crash we got.
5352 // Might want this on OSX too!
5353 llwarns << "*** Caught signal " << s << llendl;
5354# endif
5355
5356 if (gCrashCallback)
5357 {
5358 gCrashCallback();
5359 }
5360}
5361#endif
5362
5363// Assign signal handler to be called in case we crash.
5364void catch_signals()
5365{
5366#if LL_WINDOWS
5367 // Win32 signal handling uses a Microsoft API instead of signal handlers
5368 LLWinDebug::setupExceptionHandler();
5369 return;
5370#else
5371 // This happens before log file output is properly set up, so this would go to the system log.
5372// llinfos << "Assigning signal handlers!" << llendl;
5373
5374 // Handle the signals that default to causing a core image to be created, as per the man page on signal(2).
5375 signal(SIGILL, signal_handlers);
5376 signal(SIGTRAP, signal_handlers);
5377 if (being_debugged())
5378 {
5379 // If we're being run under the control of a debugger, give
5380 // ourselves a way to bail into the debugger.
5381 signal(SIGABRT, SIG_DFL);
5382 } else {
5383 signal(SIGABRT, signal_handlers);
5384 }
5385 signal(SIGFPE, signal_handlers);
5386 signal(SIGBUS, signal_handlers);
5387 signal(SIGSEGV, signal_handlers);
5388 signal(SIGSYS, signal_handlers);
5389
5390 // SIGEMT is an 'emulator trap' which is not defined on linux.
5391#if !LL_LINUX && !LL_SOLARIS
5392 signal(SIGEMT, signal_handlers);
5393#endif
5394
5395 // This one is treated specially in the signal handler.
5396 signal(SIGTERM, signal_handlers);
5397
5398#endif // LL_WINDOWS
5399}
5400
5401#if !LL_WINDOWS
5402void release_signals()
5403{
5404 signal(SIGTERM, SIG_DFL);
5405 signal(SIGABRT, SIG_DFL);
5406 signal(SIGILL, SIG_DFL);
5407 signal(SIGFPE, SIG_DFL);
5408 signal(SIGSEGV, SIG_DFL);
5409
5410#ifdef SIGBUS
5411 signal(SIGBUS, SIG_DFL);
5412#endif
5413
5414#ifdef SIGSYS
5415 signal(SIGSYS, SIG_DFL);
5416#endif
5417}
5418#endif // !LL_WINDOWS
5419
5420void purge_cache()
5421{
5422 llinfos << "Purging Texture Cache..." << llendl;
5423 gTextureCache->purgeCache(LL_PATH_CACHE);
5424 llinfos << "Purging Cache..." << llendl;
5425 std::string mask = gDirUtilp->getDirDelimiter() + "*.*";
5426 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask);
5427}
5428
5429int parse_args(int argc, char **argv)
5430{
5431 // Sometimes IP addresses passed in on the command line have leading
5432 // or trailing white space. Use LLString to clean that up.
5433 LLString ip_string;
5434 S32 j;
5435
5436 for (j = 1; j < argc; j++)
5437 {
5438 gArgs += argv[j];
5439 gArgs += " ";
5440
5441 if ((!strcmp(argv[j], "-port")) && (++j < argc))
5442 {
5443 sscanf(argv[j], "%u", &(gAgent.mViewerPort));
5444 }
5445 else if ((!strcmp(argv[j], "-drop")) && (++j < argc))
5446 {
5447 sscanf(argv[j], "%f", &gPacketDropPercentage);
5448 }
5449 else if ((!strcmp(argv[j], "-inbw")) && (++j < argc))
5450 {
5451 sscanf(argv[j], "%f", &gInBandwidth);
5452 }
5453 else if ((!strcmp(argv[j], "-outbw")) && (++j < argc))
5454 {
5455 sscanf(argv[j], "%f", &gOutBandwidth);
5456 }
5457 else if (!strcmp(argv[j], "--aditi"))
5458 {
5459 gUserServerChoice = USERSERVER_ADITI;
5460 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5461 }
5462 else if (!strcmp(argv[j], "--agni"))
5463 {
5464 gUserServerChoice = USERSERVER_AGNI;
5465 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5466 }
5467 else if (!strcmp(argv[j], "--dmz"))
5468 {
5469 gUserServerChoice = USERSERVER_DMZ;
5470 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5471 }
5472 else if (!strcmp(argv[j], "--siva"))
5473 {
5474 gUserServerChoice = USERSERVER_SIVA;
5475 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5476 }
5477 else if (!strcmp(argv[j], "--shakti"))
5478 {
5479 gUserServerChoice = USERSERVER_SHAKTI;
5480 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5481 }
5482 else if (!strcmp(argv[j], "--durga"))
5483 {
5484 gUserServerChoice = USERSERVER_DURGA;
5485 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5486 }
5487 else if (!strcmp(argv[j], "--soma"))
5488 {
5489 gUserServerChoice = USERSERVER_SOMA;
5490 snprintf(gUserServerName, MAX_STRING, "%s", gUserServerDomainName[gUserServerChoice].mName); /* Flawfinder: ignore */
5491 }
5492 else if (!strcmp(argv[j], "--ganga"))
5493 {
5494 gUserServerChoice = USERSERVER_GANGA;
5495 sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName);
5496 }
5497 else if (!strcmp(argv[j], "--vaak"))
5498 {
5499 gUserServerChoice = USERSERVER_VAAK;
5500 sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName);
5501 }
5502 else if (!strcmp(argv[j], "--uma"))
5503 {
5504 gUserServerChoice = USERSERVER_UMA;
5505 sprintf(gUserServerName,"%s", gUserServerDomainName[gUserServerChoice].mName);
5506 }
5507 else if (!strcmp(argv[j], "-user") && (++j < argc))
5508 {
5509 if (!strcmp(argv[j], "-"))
5510 {
5511 gUserServerChoice = USERSERVER_LOCAL;
5512 snprintf(gUserServerName, MAX_STRING, "%s", LOOPBACK_ADDRESS_STRING); /* Flawfinder: ignore */
5513 }
5514 else
5515 {
5516 gUserServerChoice = USERSERVER_OTHER;
5517 ip_string.assign( argv[j] );
5518 LLString::trim(ip_string);
5519 snprintf(gUserServerName, MAX_STRING, "%s", ip_string.c_str()); /* Flawfinder: ignore */
5520 }
5521 }
5522 else if (!strcmp(argv[j], "-loginuri") && (++j < argc))
5523 {
5524 gLoginURIs.push_back(utf8str_trim(argv[j]));
5525 }
5526 else if (!strcmp(argv[j], "-helperuri") && (++j < argc))
5527 {
5528 gHelperURI = argv[j];
5529 gHelperURI = utf8str_trim(gHelperURI);
5530 }
5531 else if (!strcmp(argv[j], "-debugviews"))
5532 {
5533 LLView::sDebugRects = TRUE;
5534 }
5535 else if (!strcmp(argv[j], "-skin") && (++j < argc))
5536 {
5537 std::string folder(argv[j]);
5538 gDirUtilp->setSkinFolder(folder);
5539 }
5540 else if (!strcmp(argv[j], "-autologin") || !strcmp(argv[j], "--autologin")) // keep --autologin for compatibility
5541 {
5542 gAutoLogin = TRUE;
5543 }
5544 else if (!strcmp(argv[j], "-quitafter") && (++j < argc))
5545 {
5546 gQuitAfterSeconds = (F32)atof(argv[j]);
5547 }
5548 else if (!strcmp(argv[j], "-rotate"))
5549 {
5550 gRotateRight = TRUE;
5551 }
5552// else if (!strcmp(argv[j], "-noenv"))
5553// {
5554 //turn OFF environmental effects for slow machines/video cards
5555// gRequestParaboloidMap = FALSE;
5556// }
5557 else if (!strcmp(argv[j], "-noaudio"))
5558 {
5559 gUseAudio = FALSE;
5560 }
5561 else if (!strcmp(argv[j], "-nosound")) // tends to be popular cmdline on Linux.
5562 {
5563 gUseAudio = FALSE;
5564 }
5565 else if (!strcmp(argv[j], "-nofmod"))
5566 {
5567 gUseFMOD = FALSE;
5568 }
5569 else if (!strcmp(argv[j], "-noprobe"))
5570 {
5571 gProbeHardware = FALSE;
5572 }
5573 else if (!strcmp(argv[j], "-noquicktime"))
5574 {
5575 // Developers can log in faster if they don't load all the
5576 // quicktime dlls.
5577 gUseQuickTime = false;
5578 }
5579 else if (!strcmp(argv[j], "-nopreload"))
5580 {
5581 // Developers can log in faster if they don't decode sounds
5582 // or images on startup, ~5 seconds faster.
5583 gPreloadSounds = false;
5584 gPreloadImages = false;
5585 }
5586 else if (!strcmp(argv[j], "-purge"))
5587 {
5588 purge_cache();
5589 }
5590 else if(!strcmp(argv[j], "-noinvlib"))
5591 {
5592 gRequestInventoryLibrary = FALSE;
5593 }
5594 else if (!strcmp(argv[j], "-log"))
5595 {
5596 gLogMessages = TRUE;
5597 continue;
5598 }
5599 else if (!strcmp(argv[j], "-logfile") && (++j < argc))
5600 {
5601 // *NOTE: This buffer size is hard coded into scanf() below.
5602 char logfile[256]; /* Flawfinder: ignore */
5603 sscanf(argv[j], "%255s", logfile); /* Flawfinder: ignore */
5604 llinfos << "Setting log file to " << logfile << llendl;
5605 LLFile::remove(logfile);
5606 LLError::logToFile(logfile);
5607 }
5608 else if (!strcmp(argv[j], "-settings") && (++j < argc))
5609 {
5610 gSettingsFileName = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, argv[j]);
5611 }
5612 else if (!strcmp(argv[j], "-setdefault") && (j + 2 < argc))
5613 {
5614 std::string control_name;
5615 std::string control_value;
5616
5617 j++;
5618 if (argv[j]) control_name = std::string(argv[j]);
5619
5620 j++;
5621 if (argv[j]) control_value = std::string(argv[j]);
5622
5623 // grab control name and value
5624 if (!control_name.empty())
5625 {
5626 gCommandLineSettings[control_name] = control_value;
5627 }
5628 }
5629 else if (!strcmp(argv[j], "-set") && (j + 2 < argc))
5630 {
5631 std::string control_name;
5632 std::string control_value;
5633
5634 j++;
5635 if (argv[j]) control_name = std::string(argv[j]);
5636
5637 j++;
5638 if (argv[j]) control_value = std::string(argv[j]);
5639
5640 // grab control name and value
5641 if (!control_name.empty())
5642 {
5643 gCommandLineForcedSettings[control_name] = control_value;
5644 }
5645 }
5646 else if (!strcmp(argv[j], "-login"))
5647 {
5648 if (j + 3 < argc)
5649 {
5650 j++;
5651 gCmdLineFirstName = argv[j];
5652 j++;
5653 gCmdLineLastName = argv[j];
5654 j++;
5655 gCmdLinePassword = argv[j];
5656 }
5657 else
5658 {
5659 // only works if -login is last parameter on command line
5660 llerrs << "Not enough parameters to -login. Did you mean -loginuri?" << llendl;
5661 }
5662 }
5663 else if (!strcmp(argv[j], "-god"))
5664 {
5665 gGodConnect = TRUE;
5666 }
5667 else if (!strcmp(argv[j], "-noconsole"))
5668 {
5669 gUseConsole = FALSE;
5670 }
5671 else if (!strcmp(argv[j], "-safe"))
5672 {
5673 llinfos << "Setting viewer feature table to run in safe mode, resetting prefs" << llendl;
5674 gFeatureManagerp->setSafe(TRUE);
5675 }
5676 else if (!strcmp(argv[j], "-multiple"))
5677 {
5678 gMultipleViewersOK = TRUE;
5679 }
5680 else if (!strcmp(argv[j], "-nomultiple"))
5681 {
5682 gMultipleViewersOK = FALSE;
5683 }
5684 else if (!strcmp(argv[j], "-novoice"))
5685 {
5686 gDisableVoice = TRUE;
5687 }
5688 else if (!strcmp(argv[j], "-nothread"))
5689 {
5690 LLVFile::ALLOW_ASYNC = FALSE;
5691 llinfos << "Running VFS in nothread mode" << llendl;
5692 }
5693 // some programs don't respect the command line options in protocol handlers (I'm looking at you, Opera)
5694 // so this allows us to parse the URL straight off the command line without a "-url" paramater
5695 else if (LLURLDispatcher::isSLURL(argv[j])
5696 || !strcmp(argv[j], "-url") && (++j < argc))
5697 {
5698 std::string slurl = argv[j];
5699 if (LLURLDispatcher::isSLURLCommand(slurl))
5700 {
5701 LLStartUp::sSLURLCommand = slurl;
5702 }
5703 else
5704 {
5705 LLURLSimString::setString(slurl);
5706 }
5707 // *NOTE: After setting the url, bail. What can happen is
5708 // that someone can use IE (or potentially other browsers)
5709 // and do the rough equivalent of command injection and
5710 // steal passwords. Phoenix. SL-55321
5711 gArgs += argv[j];
5712 return 0;
5713 }
5714 else if (!strcmp(argv[j], "-ignorepixeldepth"))
5715 {
5716 gIgnorePixelDepth = TRUE;
5717 }
5718 else if (!strcmp(argv[j], "-cooperative"))
5719 {
5720 S32 ms_to_yield = 0;
5721 if(++j < argc)
5722 {
5723 S32 rv = sscanf(argv[j], "%d", &ms_to_yield);
5724 if(0 == rv)
5725 {
5726 --j;
5727 }
5728 }
5729 else
5730 {
5731 --j;
5732 }
5733 gYieldMS = ms_to_yield;
5734 gYieldTime = TRUE;
5735 }
5736 else if (!strncmp(argv[j], "-lang", 5))
5737 {
5738 j++;
5739 if (argv[j])
5740 gSavedSettings.setString("Language", std::string(argv[j]));
5741 }
5742 else if (!strcmp(argv[j], "-no-verify-ssl-cert"))
5743 {
5744 gVerifySSLCert = false;
5745 }
5746 else if ( (!strcmp(argv[j], "--channel") || !strcmp(argv[j], "-channel")) && (++j < argc))
5747 {
5748 gChannelName = argv[j];
5749 }
5750#if LL_DARWIN
5751 else if (!strncmp(argv[j], "-psn_", 5))
5752 {
5753 // this is the Finder passing the process session number
5754 // we ignore this
5755 }
5756#endif
5757 else
5758 {
5759
5760 // DBC - Mac OS X passes some stuff by default on the command line (e.g. psn).
5761 // Second Life URLs are passed this way as well?
5762 llwarns << "Possible unknown keyword " << argv[j] << llendl;
5763
5764 // print usage information
5765 llinfos << USAGE << llendl;
5766 // return 1;
5767 }
5768 }
5769 return 0;
5770}
5771
5772//============================================================================
5773
5774void load_name_cache()
5775{
5776 if (!gCacheName) return;
5777
5778 std::string name_cache;
5779 name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache");
5780 FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "r"); /* Flawfinder: ignore*/
5781 if (name_cache_fp)
5782 {
5783 gCacheName->importFile(name_cache_fp);
5784 fclose(name_cache_fp);
5785 }
5786}
5787
5788void save_name_cache()
5789{
5790 if (!gCacheName) return;
5791
5792 std::string name_cache;
5793 name_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "name.cache");
5794 FILE* name_cache_fp = LLFile::fopen(name_cache.c_str(), "w"); /* Flawfinder: ignore*/
5795 if (name_cache_fp)
5796 {
5797 gCacheName->exportFile(name_cache_fp);
5798 fclose(name_cache_fp);
5799 }
5800}
5801
5802
5803void login_alert_done(S32 option, void* user_data)
5804{
5805 LLPanelLogin::giveFocus();
5806}
5807
5808void disconnect_viewer(void *)
5809{
5810 if (gDisconnected)
5811 {
5812 return;
5813 }
5814 //
5815 // Cleanup after quitting.
5816 //
5817 // Save snapshot for next time, if we made it through initialization
5818
5819 llinfos << "Disconnecting viewer!" << llendl;
5820
5821 // Dump our frame statistics
5822 gFrameStats.dump();
5823
5824
5825 // Signal handlers may need resources that we're destroying here, so don't use them.
5826#if !LL_WINDOWS
5827 release_signals();
5828#endif
5829
5830 // Remember if we were flying
5831 gSavedSettings.setBOOL("FlyingAtExit", gAgent.getFlying() );
5832
5833 // Un-minimize all windows so they don't get saved minimized
5834 if (!gNoRender)
5835 {
5836 if (gFloaterView)
5837 {
5838 gFloaterView->restoreAll();
5839 }
5840 }
5841
5842 if (gSelectMgr)
5843 {
5844 gSelectMgr->deselectAll();
5845 }
5846
5847 if (!gNoRender)
5848 {
5849 // save inventory if appropriate
5850 gInventory.cache(gAgent.getInventoryRootID(), gAgent.getID());
5851 if(gInventoryLibraryRoot.notNull() && gInventoryLibraryOwner.notNull())
5852 {
5853 gInventory.cache(gInventoryLibraryRoot, gInventoryLibraryOwner);
5854 }
5855 }
5856
5857 save_name_cache();
5858
5859 // close inventory interface, close all windows
5860 LLInventoryView::cleanup();
5861
5862 // Log out of userserver
5863 user_logout();
5864
5865 // Delete stuff that would result in net connections
5866
5867 // Also writes cached agent settings to gSavedSettings
5868 gAgent.cleanup();
5869
5870 gObjectList.destroy();
5871 delete gWorldp;
5872 gWorldp = NULL;
5873
5874 cleanup_xfer_manager();
5875 gDisconnected = TRUE;
5876}
5877
5878// helper function for cleanup_app
5879void remove_cache_files(const char* file_mask)
5880{
5881 char mask[LL_MAX_PATH]; /* Flawfinder: ignore */
5882 snprintf(mask, LL_MAX_PATH, "%s%s", gDirUtilp->getDirDelimiter().c_str(), file_mask); /* Flawfinder: ignore */
5883 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").c_str(), mask);
5884}
5885
5886
5887
5888
5889void finish_early_exit(S32 option, void* userdata)
5890{
5891 app_force_quit(NULL);
5892}
5893
5894void app_early_exit(const LLString& mesg)
5895{
5896 llwarns << "app_early_exit: " << mesg << llendl;
5897 gDoDisconnect = TRUE;
5898// LLStringBase<char>::format_map_t args;
5899// args["[MESSAGE]"] = mesg;
5900// gViewerWindow->alertXml("AppEarlyExit", args, finish_early_exit);
5901 LLAlertDialog::showCritical(mesg, finish_early_exit, NULL);
5902}
5903
5904// Used for drones, etc
5905void app_force_exit(S32 arg)
5906{
5907 remove_marker_file();
5908 exit(arg);
5909}
5910
5911// Callback from a dialog indicating user was logged out.
5912void finish_disconnect(S32 option, void* userdata)
5913{
5914 if (1 == option)
5915 {
5916 app_force_quit(NULL);
5917 }
5918}
5919
5920// Callback from an early disconnect dialog, force an exit
5921void finish_forced_disconnect(S32 /* option */, void* /* userdata */)
5922{
5923 app_force_quit(NULL);
5924}
5925
5926void send_logout_request()
5927{
5928 if(!gLogoutRequestSent)
5929 {
5930 LLMessageSystem* msg = gMessageSystem;
5931 msg->newMessageFast(_PREHASH_LogoutRequest);
5932 msg->nextBlockFast(_PREHASH_AgentData);
5933 msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
5934 msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
5935 gAgent.sendReliableMessage();
5936
5937 gLogoutTimer.reset();
5938 gLogoutMaxTime = LOGOUT_REQUEST_TIME;
5939 gLogoutRequestSent = TRUE;
5940
5941 gVoiceClient->leaveChannel();
5942 }
5943}
5944
5945void do_disconnect(const LLString& mesg)
5946{
5947 if (gDoDisconnect)
5948 {
5949 // Already popped up one of these dialogs, don't
5950 // do this again.
5951 return;
5952 }
5953
5954 // Translate the message if possible
5955 LLString big_reason = LLAgent::sTeleportErrorMessages[mesg];
5956 if ( big_reason.size() == 0 )
5957 {
5958 big_reason = mesg;
5959 }
5960
5961 LLStringBase<char>::format_map_t args;
5962 gDoDisconnect = TRUE;
5963
5964 if (LLStartUp::getStartupState() < STATE_STARTED)
5965 {
5966 // Tell users what happened
5967 args["[ERROR_MESSAGE]"] = big_reason;
5968 gViewerWindow->alertXml("ErrorMessage", args, finish_forced_disconnect);
5969 }
5970 else
5971 {
5972 args["[MESSAGE]"] = big_reason;
5973 gViewerWindow->alertXml("YouHaveBeenLoggedOut", args, finish_disconnect );
5974 }
5975}
5976
5977const LLUUID& agent_get_id()
5978{
5979 return gAgent.getID();
5980}
5981
5982const LLUUID& agent_get_session_id()
5983{
5984 return gAgent.getSessionID();
5985}
5986
5987void agent_send_reliable_message()
5988{
5989 gAgent.sendReliableMessage();
5990}
5991
5992void bad_network_handler()
5993{
5994 // Dump the packet
5995 gMessageSystem->dumpPacketToLog();
5996
5997 // Flush all of our caches on exit in the case of disconnect due to
5998 // invalid packets.
5999
6000 gPurgeOnExit = TRUE;
6001
6002#if LL_WINDOWS
6003 LLWinDebug::handleException(NULL);
6004#else
6005 // Call the crash callback
6006 if (gCrashCallback)
6007 {
6008 gCrashCallback();
6009 }
6010#endif
6011
6012 std::ostringstream message;
6013 message <<
6014 "The viewer has detected mangled network data indicative\n"
6015 "of a bad upstream network connection or an incomplete\n"
6016 "local installation of " << gSecondLife << ". \n"
6017 " \n"
6018 "Try uninstalling and reinstalling to see if this resolves \n"
6019 "the issue. \n"
6020 " \n"
6021 "If the problem continues, see the Tech Support FAQ at: \n"
6022 "www.secondlife.com/support";
6023 do_disconnect(message.str());
6024}
6025
6026
6027// dump current avatar to .cal file
6028void save_avatar(void*)
6029{
6030 LLFloaterSaveAvatar::show();
6031}
6032
6033void cleanup_app()
6034{
6035 //flag all elements as needing to be destroyed immediately
6036 // to ensure shutdown order
6037 LLMortician::setZealous(TRUE);
6038
6039 LLVoiceClient::terminate();
6040
6041 disconnect_viewer(NULL);
6042
6043 llinfos << "Viewer disconnected" << llendflush;
6044
6045 gDisconnectedImagep = NULL;
6046 release_start_screen(); // just in case
6047
6048 LLError::logToFixedBuffer(NULL);
6049
6050 llinfos << "Cleaning Up" << llendflush;
6051
6052 LLKeyframeDataCache::clear();
6053
6054 // Must clean up texture references before viewer window is destroyed.
6055 LLHUDObject::cleanupHUDObjects();
6056 llinfos << "HUD Objects cleaned up" << llendflush;
6057
6058 // End TransferManager before deleting systems it depends on (Audio, VFS, AssetStorage)
6059#if 0 // this seems to get us stuck in an infinite loop...
6060 gTransferManager.cleanup();
6061#endif
6062
6063 // Clean up map data storage
6064 delete gWorldMap;
6065 gWorldMap = NULL;
6066
6067 delete gHUDManager;
6068 gHUDManager = NULL;
6069
6070 delete gToolMgr;
6071 gToolMgr = NULL;
6072
6073 delete gAssetStorage;
6074 gAssetStorage = NULL;
6075
6076 LLPolyMesh::freeAllMeshes();
6077
6078 delete gCacheName;
6079 gCacheName = NULL;
6080
6081 delete gGlobalEconomy;
6082 gGlobalEconomy = NULL;
6083
6084 delete gLocalSpeakerMgr;
6085 gLocalSpeakerMgr = NULL;
6086
6087 LLNotifyBox::cleanup();
6088
6089 llinfos << "Global stuff deleted" << llendflush;
6090
6091#if !LL_RELEASE_FOR_DOWNLOAD
6092 if (gAudiop)
6093 {
6094 gAudiop->shutdown();
6095 }
6096#else
6097 // This hack exists because fmod likes to occasionally hang forever
6098 // when shutting down for no apparent reason.
6099 llwarns << "Hack, skipping audio engine cleanup" << llendflush;
6100#endif
6101
6102
6103 // moved to main application shutdown for now because it's non-trivial and only needs to be done once
6104 // (even though it goes against the media framework design)
6105
6106 LLMediaEngine::cleanupClass();
6107
6108#if LL_QUICKTIME_ENABLED
6109 if (gQuickTimeInitialized)
6110 {
6111 // clean up media stuff
6112 llinfos << "Cleaning up QuickTime" << llendl;
6113 ExitMovies ();
6114 #if LL_WINDOWS
6115 // Only necessary/available on Windows.
6116 TerminateQTML ();
6117 #endif
6118 }
6119 llinfos << "Quicktime cleaned up" << llendflush;
6120#endif
6121
6122#if LL_GSTREAMER_ENABLED
6123 llinfos << "Cleaning up GStreamer" << llendl;
6124 UnloadGStreamer();
6125 llinfos << "GStreamer cleaned up" << llendflush;
6126#endif
6127
6128 llinfos << "Cleaning up feature manager" << llendflush;
6129 delete gFeatureManagerp;
6130 gFeatureManagerp = NULL;
6131
6132 // Patch up settings for next time
6133 // Must do this before we delete the viewer window,
6134 // such that we can suck rectangle information out of
6135 // it.
6136 cleanup_saved_settings();
6137 llinfos << "Settings patched up" << llendflush;
6138
6139 delete gAudiop;
6140 gAudiop = NULL;
6141
6142 // delete some of the files left around in the cache.
6143 remove_cache_files("*.wav");
6144 remove_cache_files("*.tmp");
6145 remove_cache_files("*.lso");
6146 remove_cache_files("*.out");
6147 remove_cache_files("*.dsf");
6148 remove_cache_files("*.bodypart");
6149 remove_cache_files("*.clothing");
6150
6151 llinfos << "Cache files removed" << llendflush;
6152
6153
6154 cleanup_menus();
6155
6156 // Wait for any pending VFS IO
6157 while (1)
6158 {
6159 S32 pending = LLVFSThread::updateClass(0);
6160 pending += LLLFSThread::updateClass(0);
6161 if (!pending)
6162 {
6163 break;
6164 }
6165 llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
6166 ms_sleep(100);
6167 }
6168 llinfos << "Shutting down." << llendflush;
6169
6170 // Destroy Windows(R) window, and make sure we're not fullscreen
6171 // This may generate window reshape and activation events.
6172 // Therefore must do this before destroying the message system.
6173 delete gViewerWindow;
6174 gViewerWindow = NULL;
6175 llinfos << "ViewerWindow deleted" << llendflush;
6176
6177 // viewer UI relies on keyboard so keep it aound until viewer UI isa gone
6178 delete gKeyboard;
6179 gKeyboard = NULL;
6180
6181 // Clean up selection managers after UI is destroyed, as UI
6182 // may be observing them.
6183 LLSelectMgr::cleanupGlobals();
6184
6185 LLViewerObject::cleanupVOClasses();
6186
6187 LLTracker::cleanupInstance();
6188
6189#if LL_LIBXUL_ENABLED
6190 // this must be done after floater cleanup (delete gViewerWindow) since
6191 // floaters potentially need the manager to destroy their contents.
6192 LLMozLib::getInstance()->reset();
6193#endif
6194
6195#if LL_WINDOWS
6196 gDXHardware.cleanup();
6197#endif // LL_WINDOWS
6198
6199#if LL_WINDOWS && LL_LCD_COMPILE
6200 // shut down the LCD window on a logitech keyboard, if there is one
6201 delete gLcdScreen;
6202#endif
6203
6204 if (!gVolumeMgr->cleanup())
6205 {
6206 llwarns << "Remaining references in the volume manager!" << llendflush;
6207 }
6208
6209 LLViewerParcelMgr::cleanupGlobals();
6210
6211 delete gViewerStats;
6212 gViewerStats = NULL;
6213
6214 end_messaging_system();
6215
6216 LLFollowCamMgr::cleanupClass();
6217 LLVolumeMgr::cleanupClass();
6218 LLWorldMapView::cleanupClass();
6219 LLUI::cleanupClass();
6220
6221 //
6222 // Shut down the VFS's AFTER the decode manager cleans up (since it cleans up vfiles).
6223 // Also after viewerwindow is deleted, since it may have image pointers (which have vfiles)
6224 // Also after shutting down the messaging system since it has VFS dependencies
6225 //
6226 LLVFile::cleanupClass();
6227 llinfos << "VFS cleaned up" << llendflush;
6228
6229 // Store the time of our current logoff
6230 gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
6231
6232 // Must do this after all panels have been deleted because panels that have persistent rects
6233 // save their rects on delete.
6234 gSavedSettings.saveToFile(gSettingsFileName, TRUE);
6235 if (!gPerAccountSettingsFileName.empty())
6236 {
6237 gSavedPerAccountSettings.saveToFile(gPerAccountSettingsFileName, TRUE);
6238 }
6239 llinfos << "Saved settings" << llendflush;
6240
6241 std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
6242 // save all settings, even if equals defaults
6243 gCrashSettings.saveToFile(crash_settings_filename.c_str(), FALSE);
6244
6245 delete gUICtrlFactory;
6246 gUICtrlFactory = NULL;
6247
6248 gSavedSettings.cleanup();
6249 gViewerArt.cleanup();
6250 gColors.cleanup();
6251 gCrashSettings.cleanup();
6252
6253 if (gMuteListp)
6254 {
6255 // save mute list
6256 gMuteListp->cache(gAgent.getID());
6257
6258 delete gMuteListp;
6259 gMuteListp = NULL;
6260 }
6261
6262 if (gPurgeOnExit)
6263 {
6264 llinfos << "Purging all cache files on exit" << llendflush;
6265 char mask[LL_MAX_PATH]; /* Flawfinder: ignore */
6266 snprintf(mask, LL_MAX_PATH, "%s*.*", gDirUtilp->getDirDelimiter().c_str()); /* Flawfinder: ignore */
6267 gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"").c_str(),mask);
6268 }
6269
6270 remove_marker_file(); // Any crashes from here on we'll just have to ignore
6271
6272 close_debug();
6273
6274 // Let threads finish
6275 LLTimer idleTimer;
6276 idleTimer.reset();
6277 const F64 max_idle_time = 5.f; // 5 seconds
6278 while(1)
6279 {
6280 S32 pending = 0;
6281 pending += gTextureCache->update(1); // unpauses the worker thread
6282 pending += gImageDecodeThread->update(1); // unpauses the image thread
6283 pending += gTextureFetch->update(1); // unpauses the texture fetch thread
6284 pending += LLVFSThread::updateClass(0);
6285 pending += LLLFSThread::updateClass(0);
6286 F64 idle_time = idleTimer.getElapsedTimeF64();
6287 if (!pending || idle_time >= max_idle_time)
6288 {
6289 llwarns << "Quitting with pending background tasks." << llendl;
6290 break;
6291 }
6292 }
6293
6294 // Delete workers first
6295 // shotdown all worker threads before deleting them in case of co-dependencies
6296 gTextureCache->shutdown();
6297 gTextureFetch->shutdown();
6298 gImageDecodeThread->shutdown();
6299 delete gTextureCache;
6300 delete gTextureFetch;
6301 delete gImageDecodeThread;
6302
6303 gImageList.shutdown(); // shutdown again in case a callback added something
6304
6305 // This should eventually be done in LLAppViewer
6306 LLImageJ2C::closeDSO();
6307 LLImageFormatted::cleanupClass();
6308 LLVFSThread::cleanupClass();
6309 LLLFSThread::cleanupClass();
6310
6311 llinfos << "VFS Thread finished" << llendflush;
6312
6313#ifndef LL_RELEASE_FOR_DOWNLOAD
6314 llinfos << "Auditing VFS" << llendl;
6315 gVFS->audit();
6316#endif
6317
6318 // For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
6319 // (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
6320 delete gStaticVFS;
6321 gStaticVFS = NULL;
6322 delete gVFS;
6323 gVFS = NULL;
6324
6325 LLCurl::cleanup();
6326
6327 // This will eventually be done in LLApp
6328 LLCommon::cleanupClass();
6329
6330 end_messaging_system();
6331}
6332
6333// Clear URIs when picking a new server
6334void resetURIs()
6335{
6336 gLoginURIs.clear();
6337 gHelperURI.clear();
6338}
6339
6340const std::vector<std::string>& getLoginURIs()
6341{
6342 if (gLoginURIs.empty())
6343 {
6344 // not specified on the command line, use value from table
6345 gLoginURIs = LLSRV::rewriteURI(gUserServerDomainName[gUserServerChoice].mLoginURI);
6346 }
6347 return gLoginURIs;
6348}
6349
6350const std::string& getHelperURI()
6351{
6352 if (gHelperURI.empty())
6353 {
6354 // not specified on the command line, use value from table
6355 gHelperURI = gUserServerDomainName[gUserServerChoice].mHelperURI;
6356 }
6357 return gHelperURI;
6358}
6359
6360void errorCallback(const std::string &error_string)
6361{
6362#ifndef LL_RELEASE_FOR_DOWNLOAD
6363 OSMessageBox(error_string.c_str(), "Fatal Error", OSMB_OK);
6364#endif
6365 LLError::crashAndLoop(error_string);
6366}
6367// JC - Please don't put code here. Find the right file, perhaps
6368// llviewermessage.cpp, and put it there. Thanks!
diff --git a/linden/indra/newview/viewer.h b/linden/indra/newview/viewer.h
deleted file mode 100644
index afd62a7..0000000
--- a/linden/indra/newview/viewer.h
+++ /dev/null
@@ -1,325 +0,0 @@
1/**
2 * @file viewer.h
3 * @brief Main file for viewer.
4 *
5 * $LicenseInfo:firstyear=2000&license=viewergpl$
6 *
7 * Copyright (c) 2000-2007, Linden Research, Inc.
8 *
9 * Second Life Viewer Source Code
10 * The source code in this file ("Source Code") is provided by Linden Lab
11 * to you under the terms of the GNU General Public License, version 2.0
12 * ("GPL"), unless you have obtained a separate licensing agreement
13 * ("Other License"), formally executed by you and Linden Lab. Terms of
14 * the GPL can be found in doc/GPL-license.txt in this distribution, or
15 * online at http://secondlife.com/developers/opensource/gplv2
16 *
17 * There are special exceptions to the terms and conditions of the GPL as
18 * it is applied to this Source Code. View the full text of the exception
19 * in the file doc/FLOSS-exception.txt in this software distribution, or
20 * online at http://secondlife.com/developers/opensource/flossexception
21 *
22 * By copying, modifying or distributing this software, you acknowledge
23 * that you have read and understood your obligations described above,
24 * and agree to abide by those obligations.
25 *
26 * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27 * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28 * COMPLETENESS OR PERFORMANCE.
29 * $/LicenseInfo$
30 */
31
32#ifndef LL_VIEWER_H
33#define LL_VIEWER_H
34
35// DO NOT ADD DEPENDENCIES HERE
36// Almost every file in the viewer depends on this file.
37// If you need to add a shared class, put it in its own
38// little file. JC
39
40// *TODO: remove this, viewer.h doesn't need it, but there
41// are lots of .cpp files that depend on this recursive
42// dependency.
43#include "llviewercontrol.h"
44
45// Enabled this definition to compile a 'hacked' viewer that
46// allows a hacked godmode to be toggled on and off.
47#define TOGGLE_HACKED_GODLIKE_VIEWER
48#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
49extern BOOL gHackGodmode;
50#endif
51
52
53//
54// Forward Declarations
55//
56class LLAudioEngine;
57class LLFrameTimer;
58class LLMessageSystem;
59class LLHost;
60class LLPieMenu;
61class LLWorkerThread;
62class LLTextureFetch;
63class LLTextureCache;
64class LLPumpIO;
65class LLHTTPNode;
66class LLTimer;
67class LLUUID;
68class LLVector3;
69class LLVector3d;
70class LLViewerObject;
71class LLViewerRegion;
72class LLVFS;
73
74//
75// Global Variables
76//
77
78extern LLString gSecondLife;
79
80extern S32 gNumSessions;
81extern BOOL gNoRender;
82extern LLMemoryInfo gSysMemory;
83extern BOOL gLogMessages;
84extern BOOL gUseAudio;
85extern bool gPreloadImages;
86extern BOOL gGodConnect;
87extern LLString gCmdLineFirstName;
88extern LLString gCmdLineLastName;
89extern LLString gCmdLinePassword;
90extern BOOL gAutoLogin;
91extern U32 gFrameCount;
92extern U32 gForegroundFrameCount;
93extern BOOL gRequestInventoryLibrary;
94extern BOOL gAcceptTOS;
95extern BOOL gAcceptCriticalMessage;
96extern std::string gChannelName;
97extern LLUUID gInventoryLibraryOwner;
98extern LLUUID gInventoryLibraryRoot;
99extern BOOL gLastExecFroze;
100extern F32 gLogoutMaxTime;
101extern LLTimer gRenderStartTime;
102extern LLFrameTimer gForegroundTime;
103extern LLTimer gLogoutTimer;
104extern BOOL gInProductionGrid;
105extern S32 gCrashBehavior;
106extern bool gVerifySSLCert;
107extern const char* DEFAULT_SETTINGS_FILE;
108
109// TODO: Eliminate most of these, move into a globals structure.
110extern const U32 PATCH_SIZE;
111extern const LLVector3 DEFAULT_OBJECT_SCALE;
112extern BOOL gDisconnected;
113extern BOOL gDisableVoice;
114extern BOOL gQuit; // We're done, quit after processing this message.
115extern BOOL gQuitRequested; // User wants to quit, may have modified documents open.
116extern BOOL gLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
117extern BOOL gInitializationComplete; // OK to call display() and idle()
118extern BOOL gUseWireframe;
119extern BOOL gPurgeCache; // Cache was purged on startup
120extern U32 gSecondsPerDay;
121extern U32 gSecondsPerYear;
122// Is the Pacific time zone (aka server time zone)
123// currently in daylight savings time?
124extern BOOL gPacificDaylightTime;
125
126extern LLString gLastVersionChannel;
127
128extern LLVector3 gWindVec;
129extern LLVector3 gRelativeWindVec;
130
131extern U64 gFrameTime; // The timestamp of the most-recently-processed frame
132extern F32 gFrameTimeSeconds; // Loses msec precision after ~4.5 hours...
133extern F32 gFrameIntervalSeconds; // Elapsed time between current and previous gFrameTimeSeconds
134extern F32 gFPSClamped; // Frames per second, smoothed, weighted toward last frame
135extern F32 gFrameDTClamped;
136extern U64 gStartTime;
137
138extern LLFrameTimer gRestoreGLTimer;
139extern BOOL gRestoreGL;
140
141extern BOOL gDisplayCameraPos;
142extern BOOL gDisplayWindInfo;
143extern BOOL gDisplayNearestWater;
144extern BOOL gDisplayFOV;
145extern BOOL gForceRenderLandFence;
146
147extern BOOL gAllowIdleAFK;
148extern F32 gAFKTimeout;
149extern BOOL gShowObjectUpdates;
150
151extern BOOL gTeleportDisplay;
152extern LLFrameTimer gTeleportDisplayTimer;
153
154extern std::map<S32,LLFrameTimer> gDebugTimers;
155
156// VFS globals - gVFS is for general use
157// gStaticVFS is read-only and is shipped w/ the viewer
158// it has pre-cache data like the UI .TGAs
159extern LLVFS *gStaticVFS;
160
161extern LLUUID gViewerDigest; // MD5 digest of the viewer's executable file.
162
163extern LLWorkerThread* gImageDecodeThread;
164extern LLTextureFetch* gTextureFetch;
165extern LLTextureCache* gTextureCache;
166
167extern LLPumpIO* gServicePump;
168
169extern LLUUID gSunTextureID;
170extern LLUUID gMoonTextureID;
171
172extern BOOL gHandleKeysAsync;
173
174// Map scale in pixels per region
175extern F32 gMapScale;
176extern F32 gMiniMapScale;
177
178extern F32 gMouseSensitivity;
179extern BOOL gInvertMouse;
180
181//
182// Defines and constants
183//
184
185const S32 AGENT_UPDATES_PER_SECOND = 10;
186
187// Global because multiple functions need to identify the window
188// by its name.
189extern LLString gWindowTitle;
190extern LLString gDisabledMessage;
191extern BOOL gHideLinks;
192
193#define REGIONS_PER_LANDSCAPE_EDGE 3
194#define NUMBER_OF_REGIONS (REGIONS_PER_LANDSCAPE_EDGE \
195 * REGIONS_PER_LANDSCAPE_EDGE)
196#define CENTER_REGION ((REGIONS_PER_LANDSCAPE_EDGE / 2) \
197 * REGIONS_PER_LANDSCAPE_EDGE \
198 + REGIONS_PER_LANDSCAPE_EDGE / 2)
199
200
201// translates constant EAST, NORTH, WEST, etc. to x,y offsets
202// eg, EAST = +1, 0
203// eg, SOUTHWEST = -1, -1
204const S32 MAP_REGION_TO_X[NUMBER_OF_REGIONS - 1] =
205{
206 1, // east
207 0, // north
208 -1, // west
209 0, // south
210 1, // northeast
211 -1, // northwest
212 -1, // southwest
213 1 // southeast
214};
215const S32 MAP_REGION_TO_Y[NUMBER_OF_REGIONS - 1] =
216{
217 0, // east
218 1, // north
219 0, // west
220 -1, // south
221 1, // northeast
222 1, // northwest
223 -1, // southwest
224 -1 // southeast
225};
226
227const BOOL FOR_SELECTION = TRUE;
228const BOOL NOT_FOR_SELECTION = FALSE;
229
230const U8 YES_PHYSICS = 1;
231const U8 NO_PHYSICS = 0;
232
233//
234// Prototypes
235//
236void display(BOOL rebuild = TRUE, F32 zoom_factor = 1.f, int subfield = 0);
237void draw_axes();
238
239void fire_shot(const U8 shot_type, const U8 use_physics );
240void add_object(LLPCode pcode,
241 U8 use_physics,
242 const LLVector3d &object_pos_global,
243 const LLQuaternion &rotation,
244 const LLVector3 &scale,
245 const LLVector3 &velocity,
246 const LLVector3 &angular_velocity);
247
248BOOL add_object(LLPCode pcode, S32 screen_x, S32 screen_y, U8 use_physics);
249
250void idle();
251void idle_network();
252void init_audio();
253void init_textures();
254void init_landscape();
255void keyboard(char key);
256void keyboard_windows(char key);
257void kill_all_trees();
258void move_sun();
259BOOL raycast_for_new_obj_pos( S32 x, S32 y, LLViewerObject** hit_obj, S32* hit_face, BOOL* b_hit_land, LLVector3* ray_start_region, LLVector3* ray_end_region, LLViewerRegion** region );
260
261void audio_update_volume(bool force_update = true);
262void audio_update_listener();
263void audio_update_wind(bool force_update = true);
264
265// Saves the final snapshot, but only once.
266void save_final_snapshot(void*);
267
268// Call when user is requesting application to quit, ask for confirmation.
269void app_user_quit();
270
271// Call when user is requesting application to quit.
272void app_request_quit();
273
274// Call when user aborts the quit, for example, canceling a required save of
275// dirty document.
276void app_abort_quit();
277
278// Call if you need to quit immediately. You can optionally
279// spawn a web page or open another application.
280void app_force_quit(const char* launch_file_on_quit = NULL);
281
282// Display an error dialog and forcibly quit.
283void app_early_exit(const LLString& message);
284
285// exit() immediately (after some cleanup)
286void app_force_exit(S32 arg);
287
288void do_disconnect(const LLString& message);
289void send_logout_request();
290void save_avatar(void*);
291
292void set_view(S32 which);
293
294void user_logout();
295
296F32 mouse_x_from_center(S32 x);
297F32 mouse_y_from_center(S32 x);
298
299void print_agent_nvpairs(void*);
300void reload_viewer(void);
301void reset_statistics();
302void output_statistics(void*);
303void write_debug(const char *str);
304void write_debug(const std::string& str);
305void login_alert_done(S32 option, void* user_data);
306void callback_cache_name(const LLUUID& id, const char* firstname, const char* lastname, BOOL is_group, void* data);
307void load_name_cache();
308void remove_marker_file();
309
310// Avoid including llagent.h everywhere. This returns gAgent.getID().
311const LLUUID& agent_get_id();
312const LLUUID& agent_get_session_id();
313void agent_send_reliable_message();
314
315// Helpers for URIs
316const std::vector<std::string>& getLoginURIs();
317const std::string& getHelperURI();
318void resetURIs();
319
320#if LL_WINDOWS
321class llLCD;
322extern llLCD *gLcdScreen;
323#endif
324
325#endif
diff --git a/linden/indra/newview/viewer_manifest.py b/linden/indra/newview/viewer_manifest.py
index 83e28b7..6ec2e1f 100755
--- a/linden/indra/newview/viewer_manifest.py
+++ b/linden/indra/newview/viewer_manifest.py
@@ -450,6 +450,8 @@ class LinuxManifest(ViewerManifest):
450 if self.prefix("linux_tools", ""): 450 if self.prefix("linux_tools", ""):
451 self.path("client-readme.txt","README-linux.txt") 451 self.path("client-readme.txt","README-linux.txt")
452 self.path("wrapper.sh","secondlife") 452 self.path("wrapper.sh","secondlife")
453 self.path("handle_secondlifeprotocol.sh")
454 self.path("register_secondlifeprotocol.sh")
453 self.path("unicode.ttf","unicode.ttf") 455 self.path("unicode.ttf","unicode.ttf")
454 self.end_prefix("linux_tools") 456 self.end_prefix("linux_tools")
455 457
diff --git a/linden/indra/test/lluri_tut.cpp b/linden/indra/test/lluri_tut.cpp
index 8ff1921..c23825b 100644
--- a/linden/indra/test/lluri_tut.cpp
+++ b/linden/indra/test/lluri_tut.cpp
@@ -264,5 +264,44 @@ namespace tut
264 "datasever:12345", "/agent/11111111-2222-3333-4444-5566778899aa/logininfo"); 264 "datasever:12345", "/agent/11111111-2222-3333-4444-5566778899aa/logininfo");
265 } 265 }
266#endif // LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS 266#endif // LL_ENABLE_JANKY_DEPRECATED_WEB_SERVICE_CALLS
267
268
269 template<> template<>
270 void URITestObject::test<15>()
271 {
272 LLURI u("secondlife:///app/login?first_name=Testert4&last_name=Tester&web_login_key=test");
273 // if secondlife is the scheme, LLURI should parse /app/login as path, with no authority
274 ensure_equals("scheme", u.scheme(), "secondlife");
275 ensure_equals("authority", u.authority(), "");
276 ensure_equals("path", u.path(), "/app/login");
277 ensure_equals("pathmap", u.pathArray()[0].asString(), "app");
278 ensure_equals("pathmap", u.pathArray()[1].asString(), "login");
279 ensure_equals("query", u.query(), "first_name=Testert4&last_name=Tester&web_login_key=test");
280 ensure_equals("query map element", u.queryMap()["last_name"].asString(), "Tester");
281
282 u = LLURI("secondlife://Da Boom/128/128/128");
283 // if secondlife is the scheme, LLURI should parse /128/128/128 as path, with Da Boom as authority
284 ensure_equals("scheme", u.scheme(), "secondlife");
285 ensure_equals("authority", u.authority(), "Da Boom");
286 ensure_equals("path", u.path(), "/128/128/128");
287 ensure_equals("pathmap", u.pathArray()[0].asString(), "128");
288 ensure_equals("pathmap", u.pathArray()[1].asString(), "128");
289 ensure_equals("pathmap", u.pathArray()[2].asString(), "128");
290 ensure_equals("query", u.query(), "");
291 }
292
293 template<> template<>
294 void URITestObject::test<16>()
295 {
296 // Parse about: schemes
297 LLURI u("about:blank?redirect-http-hack=secondlife%3A%2F%2F%2Fapp%2Flogin%3Ffirst_name%3DCallum%26last_name%3DLinden%26location%3Dspecify%26grid%3Dvaak%26region%3D%2FMorris%2F128%2F128%26web_login_key%3Defaa4795-c2aa-4c58-8966-763c27931e78");
298 ensure_equals("scheme", u.scheme(), "about");
299 ensure_equals("authority", u.authority(), "");
300 ensure_equals("path", u.path(), "blank");
301 ensure_equals("pathmap", u.pathArray()[0].asString(), "blank");
302 ensure_equals("query", u.query(), "redirect-http-hack=secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak&region=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78");
303 ensure_equals("query map element", u.queryMap()["redirect-http-hack"].asString(), "secondlife:///app/login?first_name=Callum&last_name=Linden&location=specify&grid=vaak&region=/Morris/128/128&web_login_key=efaa4795-c2aa-4c58-8966-763c27931e78");
304 }
267} 305}
268 306
307
diff --git a/linden/indra/test/test.vcproj b/linden/indra/test/test.vcproj
index 7e84533..6e74417 100644
--- a/linden/indra/test/test.vcproj
+++ b/linden/indra/test/test.vcproj
@@ -194,6 +194,12 @@
194 RelativePath=".\io.cpp"> 194 RelativePath=".\io.cpp">
195 </File> 195 </File>
196 <File 196 <File
197 RelativePath=".\llapp_tut.cpp">
198 </File>
199 <File
200 RelativePath=".\llbase64_tut.cpp">
201 </File>
202 <File
197 RelativePath=".\llbuffer_tut.cpp"> 203 RelativePath=".\llbuffer_tut.cpp">
198 </File> 204 </File>
199 205
diff --git a/linden/indra/test/test_vc8.vcproj b/linden/indra/test/test_vc8.vcproj
index b491eea..cb023b3 100644
--- a/linden/indra/test/test_vc8.vcproj
+++ b/linden/indra/test/test_vc8.vcproj
@@ -321,10 +321,6 @@
321 > 321 >
322 </File> 322 </File>
323 <File 323 <File
324 RelativePath=".\lldatapacker_tut.cpp"
325 >
326 </File>
327 <File
328 RelativePath=".\llerror_tut.cpp" 324 RelativePath=".\llerror_tut.cpp"
329 > 325 >
330 </File> 326 </File>
@@ -353,10 +349,6 @@
353 > 349 >
354 </File> 350 </File>
355 <File 351 <File
356 RelativePath=".\llpartdata_tut.cpp"
357 >
358 </File>
359 <File
360 RelativePath=".\llpipeutil.cpp" 352 RelativePath=".\llpipeutil.cpp"
361 > 353 >
362 </File> 354 </File>
@@ -385,10 +377,6 @@
385 > 377 >
386 </File> 378 </File>
387 <File 379 <File
388 RelativePath=".\llstring_tut.cpp"
389 >
390 </File>
391 <File
392 RelativePath=".\lltiming_tut.cpp" 380 RelativePath=".\lltiming_tut.cpp"
393 > 381 >
394 </File> 382 </File>
@@ -409,10 +397,6 @@
409 > 397 >
410 </File> 398 </File>
411 <File 399 <File
412 RelativePath=".\m3math_tut.cpp"
413 >
414 </File>
415 <File
416 RelativePath=".\math.cpp" 400 RelativePath=".\math.cpp"
417 > 401 >
418 </File> 402 </File>
diff --git a/linden/indra/win_crash_logger/StdAfx.h b/linden/indra/win_crash_logger/StdAfx.h
index 6f046f9..3d43115 100644
--- a/linden/indra/win_crash_logger/StdAfx.h
+++ b/linden/indra/win_crash_logger/StdAfx.h
@@ -51,7 +51,6 @@
51#include <stdlib.h> 51#include <stdlib.h>
52#include <malloc.h> 52#include <malloc.h>
53#include <memory.h> 53#include <memory.h>
54#include <tchar.h>
55 54
56// Local Header Files 55// Local Header Files
57 56
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.cpp b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp
new file mode 100644
index 0000000..5a25c17
--- /dev/null
+++ b/linden/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -0,0 +1,378 @@
1/**
2* @file llcrashloggerwindows.cpp
3* @brief Windows crash logger implementation
4*
5* $LicenseInfo:firstyear=2003&license=viewergpl$
6*
7* Copyright (c) 2003-2007, Linden Research, Inc.
8*
9* Second Life Viewer Source Code
10* The source code in this file ("Source Code") is provided by Linden Lab
11* to you under the terms of the GNU General Public License, version 2.0
12* ("GPL"), unless you have obtained a separate licensing agreement
13* ("Other License"), formally executed by you and Linden Lab. Terms of
14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15* online at http://secondlife.com/developers/opensource/gplv2
16*
17* There are special exceptions to the terms and conditions of the GPL as
18* it is applied to this Source Code. View the full text of the exception
19* in the file doc/FLOSS-exception.txt in this software distribution, or
20* online at http://secondlife.com/developers/opensource/flossexception
21*
22* By copying, modifying or distributing this software, you acknowledge
23* that you have read and understood your obligations described above,
24* and agree to abide by those obligations.
25*
26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28* COMPLETENESS OR PERFORMANCE.
29* $/LicenseInfo$
30*/
31
32#include "stdafx.h"
33#include "resource.h"
34#include "llcrashloggerwindows.h"
35
36#include <sstream>
37
38#include "boost/tokenizer.hpp"
39
40#include "dbghelp.h"
41#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
42#include "llerror.h"
43#include "llfile.h"
44#include "lltimer.h"
45#include "llstring.h"
46#include "lldxhardware.h"
47#include "lldir.h"
48#include "llsdserialize.h"
49
50#define MAX_LOADSTRING 100
51#define MAX_STRING 2048
52const char* const SETTINGS_FILE_HEADER = "version";
53const S32 SETTINGS_FILE_VERSION = 101;
54
55// Windows Message Handlers
56
57// Global Variables:
58HINSTANCE hInst= NULL; // current instance
59TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
60TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
61
62LLString gProductName;
63HWND gHwndReport = NULL; // Send/Don't Send dialog
64HWND gHwndProgress = NULL; // Progress window
65HCURSOR gCursorArrow = NULL;
66HCURSOR gCursorWait = NULL;
67BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog?
68std::stringstream gDXInfo;
69bool gSendLogs = false;
70
71
72//Conversion from char* to wchar*
73//Replacement for ATL macros, doesn't allocate memory
74//For more info see: http://www.codeguru.com/forum/showthread.php?t=337247
75void ConvertLPCSTRToLPWSTR (const char* pCstring, WCHAR* outStr)
76{
77 if (pCstring != NULL)
78 {
79 int nInputStrLen = strlen (pCstring);
80 // Double NULL Termination
81 int nOutputStrLen = MultiByteToWideChar(CP_ACP, 0, pCstring, nInputStrLen, NULL, 0) + 2;
82 if (outStr)
83 {
84 memset (outStr, 0x00, sizeof (WCHAR)*nOutputStrLen);
85 MultiByteToWideChar (CP_ACP, 0, pCstring, nInputStrLen, outStr, nInputStrLen);
86 }
87 }
88}
89
90void write_debug(const char *str)
91{
92 gDXInfo << str; /* Flawfinder: ignore */
93}
94
95void write_debug(std::string& str)
96{
97 write_debug(str.c_str());
98}
99
100void show_progress(const char* message)
101{
102 std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message));
103 if (gHwndProgress)
104 {
105 SendDlgItemMessage(gHwndProgress, // handle to destination window
106 IDC_LOG,
107 WM_SETTEXT, // message to send
108 FALSE, // undo option
109 (LPARAM)msg.c_str());
110 }
111}
112
113void update_messages()
114{
115 MSG msg;
116 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
117 {
118 if (msg.message == WM_QUIT)
119 {
120 exit(0);
121 }
122 TranslateMessage(&msg);
123 DispatchMessage(&msg);
124 }
125}
126
127void sleep_and_pump_messages( U32 seconds )
128{
129 const U32 CYCLES_PER_SECOND = 10;
130 U32 cycles = seconds * CYCLES_PER_SECOND;
131 while( cycles-- )
132 {
133 update_messages();
134 ms_sleep(1000 / CYCLES_PER_SECOND);
135 }
136}
137
138// Include product name in the window caption.
139void LLCrashLoggerWindows::ProcessCaption(HWND hWnd)
140{
141 TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */
142 TCHAR header[MAX_STRING];
143 std::string final;
144 GetWindowText(hWnd, templateText, sizeof(templateText));
145 final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str());
146 ConvertLPCSTRToLPWSTR(final.c_str(), header);
147 SetWindowText(hWnd, header);
148}
149
150
151// Include product name in the diaog item text.
152void LLCrashLoggerWindows::ProcessDlgItemText(HWND hWnd, int nIDDlgItem)
153{
154 TCHAR templateText[MAX_STRING]; /* Flawfinder: ignore */
155 TCHAR header[MAX_STRING];
156 std::string final;
157 GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText));
158 final = llformat(ll_convert_wide_to_string(templateText).c_str(), gProductName.c_str());
159 ConvertLPCSTRToLPWSTR(final.c_str(), header);
160 SetDlgItemText(hWnd, nIDDlgItem, header);
161}
162
163bool handle_button_click(WORD button_id)
164{
165 // Is this something other than Send or Don't Send?
166 if (button_id != IDOK
167 && button_id != IDCANCEL)
168 {
169 return false;
170 }
171
172 // See if "do this next time" is checked and save state
173 S32 crash_behavior = CRASH_BEHAVIOR_ASK;
174 LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_GETCHECK, 0, 0);
175 if (result == BST_CHECKED)
176 {
177 if (button_id == IDOK)
178 {
179 crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND;
180 }
181 else if (button_id == IDCANCEL)
182 {
183 crash_behavior = CRASH_BEHAVIOR_NEVER_SEND;
184 }
185 ((LLCrashLoggerWindows*)LLCrashLogger::instance())->saveCrashBehaviorSetting(crash_behavior);
186 }
187
188 // We're done with this dialog.
189 gFirstDialog = FALSE;
190
191 // Send the crash report if requested
192 if (button_id == IDOK)
193 {
194 gSendLogs = TRUE;
195 WCHAR wbuffer[20000];
196 GetDlgItemText(gHwndReport, // handle to dialog box
197 IDC_EDIT1, // control identifier
198 wbuffer, // pointer to buffer for text
199 20000 // maximum size of string
200 );
201 LLString user_text(ll_convert_wide_to_string(wbuffer));
202 // Activate and show the window.
203 ShowWindow(gHwndProgress, SW_SHOW);
204 // Try doing this second to make the progress window go frontmost.
205 ShowWindow(gHwndReport, SW_HIDE);
206 ((LLCrashLoggerWindows*)LLCrashLogger::instance())->setUserText(user_text);
207 ((LLCrashLoggerWindows*)LLCrashLogger::instance())->sendCrashLogs();
208 }
209 // Quit the app
210 LLApp::setQuitting();
211 return true;
212}
213
214
215LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
216{
217 switch( message )
218 {
219 case WM_CREATE:
220 return 0;
221
222 case WM_COMMAND:
223 if( gFirstDialog )
224 {
225 WORD button_id = LOWORD(wParam);
226 bool handled = handle_button_click(button_id);
227 if (handled)
228 {
229 return 0;
230 }
231 }
232 break;
233
234 case WM_DESTROY:
235 // Closing the window cancels
236 LLApp::setQuitting();
237 PostQuitMessage(0);
238 return 0;
239 }
240
241 return DefWindowProc(hwnd, message, wParam, lParam);
242}
243
244
245LLCrashLoggerWindows::LLCrashLoggerWindows(void)
246{
247}
248
249LLCrashLoggerWindows::~LLCrashLoggerWindows(void)
250{
251}
252
253bool LLCrashLoggerWindows::init(void)
254{
255 bool ok = LLCrashLogger::init();
256 if(!ok) return false;
257
258 /*
259 mbstowcs(gProductName, mProductName.c_str(), sizeof(gProductName)/sizeof(gProductName[0]));
260 gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0;
261 swprintf(gProductName, L"Second Life");
262 */
263
264 llinfos << "Loading dialogs" << llendl;
265
266 // Initialize global strings
267 LoadString(mhInst, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
268 LoadString(mhInst, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING);
269
270 gCursorArrow = LoadCursor(NULL, IDC_ARROW);
271 gCursorWait = LoadCursor(NULL, IDC_WAIT);
272
273 // Register a window class that will be used by our dialogs
274 WNDCLASS wndclass;
275 wndclass.style = CS_HREDRAW | CS_VREDRAW;
276 wndclass.lpfnWndProc = WndProc;
277 wndclass.cbClsExtra = 0;
278 wndclass.cbWndExtra = DLGWINDOWEXTRA; // Required, since this is used for dialogs!
279 wndclass.hInstance = mhInst;
280 wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) );
281 wndclass.hCursor = gCursorArrow;
282 wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
283 wndclass.lpszMenuName = NULL;
284 wndclass.lpszClassName = szWindowClass;
285 RegisterClass( &wndclass );
286
287 return true;
288}
289
290void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
291{
292 updateApplication("Gathering hardware information. App may appear frozen.");
293 // DX hardware probe blocks, so we can't cancel during it
294 //Generate our dx_info.log file
295 SetCursor(gCursorWait);
296 // At this point we're responsive enough the user could click the close button
297 SetCursor(gCursorArrow);
298 mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo();
299 mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLifeException.log");
300}
301
302bool LLCrashLoggerWindows::mainLoop()
303{
304
305 // Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
306 // win_crash_logger.rc has been edited by hand.
307 // Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass)
308 gProductName = mProductName;
309
310 gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL);
311 ProcessCaption(gHwndProgress);
312 ShowWindow(gHwndProgress, SW_HIDE );
313
314 if (mCrashBehavior == CRASH_BEHAVIOR_ALWAYS_SEND)
315 {
316 ShowWindow(gHwndProgress, SW_SHOW );
317 sendCrashLogs();
318 }
319 else if (mCrashBehavior == CRASH_BEHAVIOR_ASK)
320 {
321 gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PREVREPORTBOX), 0, NULL);
322
323 // Include the product name in the caption and various dialog items.
324 ProcessCaption(gHwndReport);
325 ProcessDlgItemText(gHwndReport, IDC_STATIC_MSG);
326
327 // Update the header to include whether or not we crashed on the last run.
328 std::string headerStr;
329 TCHAR header[MAX_STRING];
330 if (mCrashInPreviousExec)
331 {
332 headerStr = llformat("%s appears to have crashed or frozen the last time it ran.", mProductName.c_str());
333 }
334 else
335 {
336 headerStr = llformat("%s appears to have crashed.", mProductName.c_str());
337 }
338 ConvertLPCSTRToLPWSTR(headerStr.c_str(), header);
339 SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header);
340 ShowWindow(gHwndReport, SW_SHOW );
341
342 MSG msg;
343 while (!LLApp::isQuitting() && GetMessage(&msg, NULL, 0, 0))
344 {
345 TranslateMessage(&msg);
346 DispatchMessage(&msg);
347 }
348 return msg.wParam;
349 }
350 else
351 {
352 llwarns << "Unknown crash behavior " << mCrashBehavior << llendl;
353 return 1;
354 }
355 return 0;
356}
357
358void LLCrashLoggerWindows::updateApplication(LLString message)
359{
360 LLCrashLogger::updateApplication();
361 if(message != "") show_progress(message.c_str());
362 update_messages();
363}
364
365bool LLCrashLoggerWindows::cleanup()
366{
367 if(gSendLogs)
368 {
369 if(mSentCrashLogs) show_progress("Done");
370 else show_progress("Could not connect to servers, logs not sent");
371 sleep_and_pump_messages(3);
372 }
373 PostQuitMessage(0);
374 return true;
375}
376
377
378
diff --git a/linden/indra/win_crash_logger/llcrashloggerwindows.h b/linden/indra/win_crash_logger/llcrashloggerwindows.h
new file mode 100644
index 0000000..1f5a216
--- /dev/null
+++ b/linden/indra/win_crash_logger/llcrashloggerwindows.h
@@ -0,0 +1,59 @@
1/**
2* @file llcrashloggerwindows.h
3* @brief Windows crash logger definition
4*
5* $LicenseInfo:firstyear=2003&license=viewergpl$
6*
7* Copyright (c) 2003-2007, Linden Research, Inc.
8*
9* Second Life Viewer Source Code
10* The source code in this file ("Source Code") is provided by Linden Lab
11* to you under the terms of the GNU General Public License, version 2.0
12* ("GPL"), unless you have obtained a separate licensing agreement
13* ("Other License"), formally executed by you and Linden Lab. Terms of
14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15* online at http://secondlife.com/developers/opensource/gplv2
16*
17* There are special exceptions to the terms and conditions of the GPL as
18* it is applied to this Source Code. View the full text of the exception
19* in the file doc/FLOSS-exception.txt in this software distribution, or
20* online at http://secondlife.com/developers/opensource/flossexception
21*
22* By copying, modifying or distributing this software, you acknowledge
23* that you have read and understood your obligations described above,
24* and agree to abide by those obligations.
25*
26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28* COMPLETENESS OR PERFORMANCE.
29* $/LicenseInfo$
30*/
31
32#ifndef LLCRASHLOGGERWINDOWS_H
33#define LLCRASHLOGGERWINDOWS_H
34
35#include "linden_common.h"
36#include "llcrashlogger.h"
37#include "windows.h"
38#include "llstring.h"
39
40class LLCrashLoggerWindows : public LLCrashLogger
41{
42public:
43 LLCrashLoggerWindows(void);
44 ~LLCrashLoggerWindows(void);
45 virtual bool init();
46 virtual bool mainLoop();
47 virtual void updateApplication(LLString message = "");
48 virtual bool cleanup();
49 virtual void gatherPlatformSpecificFiles();
50 //void annotateCallStack();
51 void setHandle(HINSTANCE hInst) { mhInst = hInst; }
52private:
53 void ProcessDlgItemText(HWND hWnd, int nIDDlgItem);
54 void ProcessCaption(HWND hWnd);
55 HINSTANCE mhInst;
56
57};
58
59#endif
diff --git a/linden/indra/win_crash_logger/resource.h b/linden/indra/win_crash_logger/resource.h
index ee6bf3d..f1ef850 100644
--- a/linden/indra/win_crash_logger/resource.h
+++ b/linden/indra/win_crash_logger/resource.h
@@ -1,3 +1,34 @@
1/**
2* @file resource.h
3* @brief Windows crash logger windows resources
4*
5* $LicenseInfo:firstyear=2003&license=viewergpl$
6*
7* Copyright (c) 2003-2007, Linden Research, Inc.
8*
9* Second Life Viewer Source Code
10* The source code in this file ("Source Code") is provided by Linden Lab
11* to you under the terms of the GNU General Public License, version 2.0
12* ("GPL"), unless you have obtained a separate licensing agreement
13* ("Other License"), formally executed by you and Linden Lab. Terms of
14* the GPL can be found in doc/GPL-license.txt in this distribution, or
15* online at http://secondlife.com/developers/opensource/gplv2
16*
17* There are special exceptions to the terms and conditions of the GPL as
18* it is applied to this Source Code. View the full text of the exception
19* in the file doc/FLOSS-exception.txt in this software distribution, or
20* online at http://secondlife.com/developers/opensource/flossexception
21*
22* By copying, modifying or distributing this software, you acknowledge
23* that you have read and understood your obligations described above,
24* and agree to abide by those obligations.
25*
26* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
27* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
28* COMPLETENESS OR PERFORMANCE.
29* $/LicenseInfo$
30*/
31
1//{{NO_DEPENDENCIES}} 32//{{NO_DEPENDENCIES}}
2// Microsoft Visual C++ generated include file. 33// Microsoft Visual C++ generated include file.
3// Used by win_crash_logger.rc 34// Used by win_crash_logger.rc
@@ -22,6 +53,7 @@
22#define IDC_STATIC_HEADER 1007 53#define IDC_STATIC_HEADER 1007
23#define IDC_STATIC_WHATINFO 1008 54#define IDC_STATIC_WHATINFO 1008
24#define IDC_STATIC_MOTIVATION 1009 55#define IDC_STATIC_MOTIVATION 1009
56#define IDC_STATIC_MSG 1010
25#define IDC_STATIC -1 57#define IDC_STATIC -1
26 58
27// Next default values for new objects 59// Next default values for new objects
@@ -30,7 +62,7 @@
30#ifndef APSTUDIO_READONLY_SYMBOLS 62#ifndef APSTUDIO_READONLY_SYMBOLS
31#define _APS_NEXT_RESOURCE_VALUE 131 63#define _APS_NEXT_RESOURCE_VALUE 131
32#define _APS_NEXT_COMMAND_VALUE 32771 64#define _APS_NEXT_COMMAND_VALUE 32771
33#define _APS_NEXT_CONTROL_VALUE 1010 65#define _APS_NEXT_CONTROL_VALUE 1011
34#define _APS_NEXT_SYMED_VALUE 110 66#define _APS_NEXT_SYMED_VALUE 110
35#endif 67#endif
36#endif 68#endif
diff --git a/linden/indra/win_crash_logger/win_crash_logger.cpp b/linden/indra/win_crash_logger/win_crash_logger.cpp
index 2669407..c6b4ff1 100644
--- a/linden/indra/win_crash_logger/win_crash_logger.cpp
+++ b/linden/indra/win_crash_logger/win_crash_logger.cpp
@@ -35,98 +35,22 @@
35// Must be first include, precompiled headers. 35// Must be first include, precompiled headers.
36#include "stdafx.h" 36#include "stdafx.h"
37 37
38#include "linden_common.h" 38#include <stdlib.h>
39#include "llcontrol.h"
40#include "resource.h"
41 39
42#include <direct.h> 40#include "llcrashloggerwindows.h"
43#include <sys/types.h>
44#include <sys/stat.h>
45#include <wininet.h>
46 41
47#include "indra_constants.h" // CRASH_BEHAVIOR_ASK, CRASH_SETTING_NAME
48#include "llerror.h"
49#include "lltimer.h"
50#include "lldir.h"
51 42
52#include "llstring.h"
53#include "lldxhardware.h"
54
55LLControlGroup gCrashSettings; // saved at end of session
56
57// Constants
58#define MAX_LOADSTRING 100
59const char* const SETTINGS_FILE_HEADER = "version";
60const S32 SETTINGS_FILE_VERSION = 101;
61
62// Functions
63LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
64bool handle_button_click(WORD button_id);
65S32 load_crash_behavior_setting();
66bool save_crash_behavior_setting(S32 crash_behavior);
67void send_crash_report();
68void write_debug(const char *str);
69void write_debug(std::string& str);
70
71// Global Variables:
72HINSTANCE hInst= NULL; // current instance
73TCHAR szTitle[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
74TCHAR szWindowClass[MAX_LOADSTRING]; /* Flawfinder: ignore */ // The title bar text
75
76LLString gUserText; // User's description of the problem
77time_t gStartTime = 0;
78HWND gHwndReport = NULL; // Send/Don't Send dialog
79HWND gHwndProgress = NULL; // Progress window
80HCURSOR gCursorArrow = NULL;
81HCURSOR gCursorWait = NULL;
82BOOL gFirstDialog = TRUE; // Are we currently handling the Send/Don't Send dialog?
83BOOL gCrashInPreviousExec = FALSE;
84FILE *gDebugFile = NULL;
85LLString gUserserver;
86WCHAR gProductName[512];
87 43
88// 44//
89// Implementation 45// Implementation
90// 46//
91 47
92// Include product name in the window caption.
93void ProcessCaption(HWND hWnd)
94{
95 TCHAR templateText[1024]; /* Flawfinder: ignore */
96 TCHAR finalText[2048]; /* Flawfinder: ignore */
97 GetWindowText(hWnd, templateText, sizeof(templateText));
98 swprintf(finalText, templateText, gProductName); /* Flawfinder: ignore */
99 SetWindowText(hWnd, finalText);
100}
101
102
103// Include product name in the diaog item text.
104void ProcessDlgItemText(HWND hWnd, int nIDDlgItem)
105{
106 TCHAR templateText[1024]; /* Flawfinder: ignore */
107 TCHAR finalText[2048]; /* Flawfinder: ignore */
108 GetDlgItemText(hWnd, nIDDlgItem, templateText, sizeof(templateText));
109 swprintf(finalText, templateText, gProductName); /* Flawfinder: ignore */
110 SetDlgItemText(hWnd, nIDDlgItem, finalText);
111}
112
113int APIENTRY WinMain(HINSTANCE hInstance, 48int APIENTRY WinMain(HINSTANCE hInstance,
114 HINSTANCE hPrevInstance, 49 HINSTANCE hPrevInstance,
115 LPSTR lpCmdLine, 50 LPSTR lpCmdLine,
116 int nCmdShow) 51 int nCmdShow)
117{ 52{
118 llinfos << "Starting crash reporter" << llendl; 53 llinfos << "Starting crash reporter" << llendl;
119 // We assume that all the logs we're looking for reside on the current drive
120 gDirUtilp->initAppDirs("SecondLife");
121
122 // Default to the product name "Second Life" (this is overridden by the -name argument)
123 swprintf(gProductName, L"Second Life"); /* Flawfinder: ignore */
124
125 gCrashSettings.declareS32(CRASH_BEHAVIOR_SETTING, CRASH_BEHAVIOR_ASK, "Controls behavior when viewer crashes "
126 "(0 = ask before sending crash report, 1 = always send crash report, 2 = never send crash report)");
127
128 llinfos << "Loading crash behavior setting" << llendl;
129 S32 crash_behavior = load_crash_behavior_setting();
130 54
131 // In Win32, we need to generate argc and argv ourselves... 55 // In Win32, we need to generate argc and argv ourselves...
132 // Note: GetCommandLine() returns a potentially return a LPTSTR 56 // Note: GetCommandLine() returns a potentially return a LPTSTR
@@ -139,7 +63,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
139 63
140 const S32 MAX_ARGS = 100; 64 const S32 MAX_ARGS = 100;
141 int argc = 0; 65 int argc = 0;
142 char *argv[MAX_ARGS]; /* Flawfinder: ignore */ 66 char *argv[MAX_ARGS];
143 67
144 char *token = NULL; 68 char *token = NULL;
145 if( cmd_line_including_exe_name[0] == '\"' ) 69 if( cmd_line_including_exe_name[0] == '\"' )
@@ -159,7 +83,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
159 { 83 {
160 argv[argc++] = token; 84 argv[argc++] = token;
161 /* Get next token: */ 85 /* Get next token: */
162 if (*(token + strlen(token) + 1) == '\"') /* Flawfinder: ignore */ 86 if (*(token + strlen(token) + 1) == '\"')
163 { 87 {
164 token = strtok( NULL, "\""); 88 token = strtok( NULL, "\"");
165 } 89 }
@@ -169,784 +93,32 @@ int APIENTRY WinMain(HINSTANCE hInstance,
169 } 93 }
170 } 94 }
171 95
172 S32 i; 96 LLCrashLoggerWindows app;
173 for (i=0; i<argc; i++) 97 bool ok = app.parseCommandOptions(argc, argv);
174 { 98 if(!ok)
175 if(!strcmp(argv[i], "-previous"))
176 {
177 llinfos << "Previous execution did not remove SecondLife.exec_marker" << llendl;
178 gCrashInPreviousExec = TRUE;
179 }
180
181 if(!strcmp(argv[i], "-dialog"))
182 {
183 llinfos << "Show the user dialog" << llendl;
184 crash_behavior = CRASH_BEHAVIOR_ASK;
185 }
186
187 if(!strcmp(argv[i], "-user"))
188 {
189 if ((i + 1) < argc)
190 {
191 i++;
192 gUserserver = argv[i];
193 llinfos << "Got userserver " << gUserserver << llendl;
194 }
195 }
196
197 if(!strcmp(argv[i], "-name"))
198 {
199 if ((i + 1) < argc)
200 {
201 i++;
202
203 mbstowcs(gProductName, argv[i], sizeof(gProductName)/sizeof(gProductName[0]));
204 gProductName[ sizeof(gProductName)/sizeof(gProductName[0]) - 1 ] = 0;
205 llinfos << "Got product name " << argv[i] << llendl;
206 }
207 }
208 }
209
210 // If user doesn't want to send, bail out
211 if (crash_behavior == CRASH_BEHAVIOR_NEVER_SEND)
212 {
213 llinfos << "Crash behavior is never_send, quitting" << llendl;
214 return 0;
215 }
216
217 // Get the current time
218 time(&gStartTime);
219
220 llinfos << "Loading dialogs" << llendl;
221
222 // Store instance handle in our global variable
223 hInst = hInstance;
224
225 // Initialize global strings
226 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
227 LoadString(hInstance, IDC_WIN_CRASH_LOGGER, szWindowClass, MAX_LOADSTRING);
228
229 gCursorArrow = LoadCursor(NULL, IDC_ARROW);
230 gCursorWait = LoadCursor(NULL, IDC_WAIT);
231
232 // Register a window class that will be used by our dialogs
233 WNDCLASS wndclass;
234 wndclass.style = CS_HREDRAW | CS_VREDRAW;
235 wndclass.lpfnWndProc = WndProc;
236 wndclass.cbClsExtra = 0;
237 wndclass.cbWndExtra = DLGWINDOWEXTRA; // Required, since this is used for dialogs!
238 wndclass.hInstance = hInst;
239 wndclass.hIcon = LoadIcon(hInst, MAKEINTRESOURCE( IDI_WIN_CRASH_LOGGER ) );
240 wndclass.hCursor = gCursorArrow;
241 wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
242 wndclass.lpszMenuName = NULL;
243 wndclass.lpszClassName = szWindowClass;
244 RegisterClass( &wndclass );
245
246 // Note: parent hwnd is 0 (the desktop). No dlg proc. See Petzold (5th ed) HexCalc example, Chapter 11, p529
247 // win_crash_logger.rc has been edited by hand.
248 // Dialogs defined with CLASS "WIN_CRASH_LOGGER" (must be same as szWindowClass)
249
250 gHwndProgress = CreateDialog(hInst, MAKEINTRESOURCE(IDD_PROGRESS), 0, NULL);
251 ProcessCaption(gHwndProgress);
252 ShowWindow(gHwndProgress, SW_HIDE );
253
254 if (crash_behavior == CRASH_BEHAVIOR_ALWAYS_SEND)
255 {
256 ShowWindow(gHwndProgress, SW_SHOW );
257 send_crash_report();
258 return 0;
259 }
260
261 if (crash_behavior == CRASH_BEHAVIOR_ASK)
262 {
263 gHwndReport = CreateDialog(hInst, MAKEINTRESOURCE(IDD_REPORT), 0, NULL);
264
265 // Include the product name in the caption and various dialog items.
266 ProcessCaption(gHwndReport);
267 ProcessDlgItemText(gHwndReport, IDC_STATIC_WHATINFO);
268 ProcessDlgItemText(gHwndReport, IDC_STATIC_MOTIVATION);
269
270 // Update the header to include whether or not we crashed on the last run.
271 WCHAR header[2048];
272 if (gCrashInPreviousExec)
273 {
274 swprintf(header, L"%s appears to have crashed or frozen the last time it ran.", gProductName); /* Flawfinder: ignore */
275 }
276 else
277 {
278 swprintf(header, L"%s appears to have crashed.", gProductName); /* Flawfinder: ignore */
279 }
280 SetDlgItemText(gHwndReport, IDC_STATIC_HEADER, header);
281 ShowWindow(gHwndReport, SW_SHOW );
282
283 MSG msg;
284 while (GetMessage(&msg, NULL, 0, 0))
285 {
286 TranslateMessage(&msg);
287 DispatchMessage(&msg);
288 }
289 return msg.wParam;
290 }
291 else
292 {
293 llwarns << "Unknown crash behavior " << crash_behavior << llendl;
294 return 1;
295 }
296}
297
298
299LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
300{
301 switch( message )
302 {
303 case WM_CREATE:
304 return 0;
305
306 case WM_COMMAND:
307 if( gFirstDialog )
308 {
309 WORD button_id = LOWORD(wParam);
310 bool handled = handle_button_click(button_id);
311 if (handled)
312 {
313 return 0;
314 }
315 }
316 break;
317
318 case WM_DESTROY:
319 // Closing the window cancels
320 PostQuitMessage(0);
321 return 0;
322 }
323
324 return DefWindowProc(hwnd, message, wParam, lParam);
325}
326
327
328bool handle_button_click(WORD button_id)
329{
330 // Is this something other than Send or Don't Send?
331 if (button_id != IDOK
332 && button_id != IDCANCEL)
333 {
334 return false;
335 }
336
337 // See if "do this next time" is checked and save state
338 S32 crash_behavior = CRASH_BEHAVIOR_ASK;
339 LRESULT result = SendDlgItemMessage(gHwndReport, IDC_CHECK_AUTO, BM_GETCHECK, 0, 0);
340 if (result == BST_CHECKED)
341 {
342 if (button_id == IDOK)
343 {
344 crash_behavior = CRASH_BEHAVIOR_ALWAYS_SEND;
345 }
346 else if (button_id == IDCANCEL)
347 {
348 crash_behavior = CRASH_BEHAVIOR_NEVER_SEND;
349 }
350 }
351 bool success = save_crash_behavior_setting(crash_behavior);
352 if (!success)
353 {
354 llwarns << "Failed to save crash settings" << llendl;
355 }
356
357 // We're done with this dialog.
358 gFirstDialog = FALSE;
359
360 // Send the crash report if requested
361 if (button_id == IDOK)
362 {
363 // Don't let users type anything. They believe the reports
364 // get read by humans, and get angry when we don't respond. JC
365 //WCHAR wbuffer[20000];
366 //GetDlgItemText(gHwndReport, // handle to dialog box
367 // IDC_EDIT1, // control identifier
368 // wbuffer, // pointer to buffer for text
369 // 20000 // maximum size of string
370 // );
371 //gUserText = wstring_to_utf8str(utf16str_to_wstring(wbuffer)).c_str();
372 //llinfos << gUserText << llendl;
373
374 // Activate and show the window.
375 ShowWindow(gHwndProgress, SW_SHOW);
376 // Try doing this second to make the progress window go frontmost.
377 ShowWindow(gHwndReport, SW_HIDE);
378
379 send_crash_report();
380 }
381
382 // Quit the app
383 PostQuitMessage(0);
384
385 return true;
386}
387
388
389class LLFileEncoder
390{
391public:
392 LLFileEncoder(const char *formname, const char *filename);
393 ~LLFileEncoder();
394
395 BOOL isValid() const { return mIsValid; }
396 LLString encodeURL(const S32 max_length = 0);
397public:
398 BOOL mIsValid;
399 LLString mFilename;
400 LLString mFormname;
401 S32 mBufLength;
402 U8 *mBuf;
403};
404
405LLString encode_string(const char *formname, const LLString &str);
406
407void update_messages()
408{
409 MSG msg;
410 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
411 {
412 if (msg.message == WM_QUIT)
413 {
414 exit(0);
415 }
416 TranslateMessage(&msg);
417 DispatchMessage(&msg);
418 }
419}
420
421void sleep_and_pump_messages( U32 seconds )
422{
423 const U32 CYCLES_PER_SECOND = 10;
424 U32 cycles = seconds * CYCLES_PER_SECOND;
425 while( cycles-- )
426 { 99 {
427 update_messages(); 100 llwarns << "Unable to parse command line." << llendl;
428 ms_sleep(1000 / CYCLES_PER_SECOND);
429 }
430}
431
432
433void show_progress(const char* message)
434{
435 std::wstring msg = wstring_to_utf16str(utf8str_to_wstring(message));
436 if (gHwndProgress)
437 {
438 SendDlgItemMessage(gHwndProgress, // handle to destination window
439 IDC_LOG,
440 WM_SETTEXT, // message to send
441 FALSE, // undo option
442 (LPARAM)msg.c_str());
443 }
444}
445
446
447void send_crash_report()
448{
449 update_messages();
450 show_progress("Starting up...");
451 update_messages();
452
453 const S32 SL_MAX_SIZE = 100000; // Maximum size of the Second Life log file.
454
455 update_messages();
456
457 // Lots of silly variable, replicated for each log file.
458 std::string db_file_name; // debug.log
459 std::string sl_file_name; // SecondLife.log
460 std::string md_file_name; // minidump (SecondLife.dmp) file name
461 std::string st_file_name; // stats.log file
462 std::string si_file_name; // settings.ini file
463 std::string ml_file_name; // message.log file
464
465 LLFileEncoder *db_filep = NULL;
466 LLFileEncoder *sl_filep = NULL;
467 LLFileEncoder *st_filep = NULL;
468 LLFileEncoder *md_filep = NULL;
469 LLFileEncoder *si_filep = NULL;
470 LLFileEncoder *ml_filep = NULL;
471
472 // DX hardware probe blocks, so we can't cancel during it
473 SetCursor(gCursorWait);
474
475 // Need to do hardware detection before we grab the files, otherwise we don't send the debug log updates
476 // to the server (including the list of hardware).
477 update_messages();
478 show_progress("Detecting hardware, please wait...");
479 update_messages();
480 gDXHardware.setWriteDebugFunc(write_debug);
481 gDXHardware.getInfo(FALSE);
482 update_messages();
483 gDXHardware.dumpDevices();
484 update_messages();
485 fclose(gDebugFile);
486 gDebugFile = NULL;
487
488 // At this point we're responsive enough the user could click the close button
489 SetCursor(gCursorArrow);
490
491 ///////////////////////////////////
492 //
493 // We do the parsing for the debug_info file first, as that will
494 // give us the location of the SecondLife.log file.
495 //
496
497 // Figure out the filename of the debug log
498 db_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log");
499 db_filep = new LLFileEncoder("DB", db_file_name.c_str());
500
501 // Get the filename of the SecondLife.log file
502 // *NOTE: This buffer size is hard coded into scanf() below.
503 char tmp_sl_name[256]; /* Flawfinder: ignore */
504 tmp_sl_name[0] = '\0';
505
506 update_messages();
507 show_progress("Looking for files...");
508 update_messages();
509
510 // Look for it in the debug_info.log file
511 if (db_filep->isValid())
512 {
513 sscanf(
514 (const char*)db_filep->mBuf,
515 "SL Log: %255[^\r\n]",
516 tmp_sl_name);
517 }
518 else
519 {
520 delete db_filep;
521 db_filep = NULL;
522 }
523
524 if (gCrashInPreviousExec)
525 {
526 // If we froze, the crash log this time around isn't useful. Use the
527 // old one.
528 sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.old");
529 }
530 else if (tmp_sl_name[0])
531 {
532 // If debug_info.log gives us a valid log filename, use that.
533 sl_file_name = tmp_sl_name;
534 llinfos << "Using log file from debug log " << sl_file_name << llendl;
535 }
536 else
537 {
538 // Figure out the filename of the default second life log
539 sl_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.log");
540 }
541
542 // Now we get the SecondLife.log file if it's there
543 sl_filep = new LLFileEncoder("SL", sl_file_name.c_str());
544 if (!sl_filep->isValid())
545 {
546 delete sl_filep;
547 sl_filep = NULL;
548 }
549
550 update_messages();
551 show_progress("Looking for stats file...");
552 update_messages();
553
554 st_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log");
555 st_filep = new LLFileEncoder("ST", st_file_name.c_str());
556 if (!st_filep->isValid())
557 {
558 delete st_filep;
559 st_filep = NULL;
560 }
561
562 si_file_name = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.ini");
563 si_filep = new LLFileEncoder("SI", si_file_name.c_str());
564 if (!si_filep->isValid())
565 {
566 delete si_filep;
567 si_filep = NULL;
568 }
569
570 // Now we get the minidump
571 md_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLife.dmp");
572 md_filep = new LLFileEncoder("MD", md_file_name.c_str());
573 if (!md_filep->isValid())
574 {
575 delete md_filep;
576 md_filep = NULL;
577 }
578
579 // Now we get the message log
580 ml_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"message.log");
581 ml_filep = new LLFileEncoder("ML", ml_file_name.c_str());
582 if (!ml_filep->isValid())
583 {
584 delete ml_filep;
585 ml_filep = NULL;
586 }
587
588 LLString post_data;
589 LLString tmp_url_buf;
590
591 // Append the userserver
592 tmp_url_buf = encode_string("USER", gUserserver);
593 post_data += tmp_url_buf;
594 llinfos << "PostData:" << post_data << llendl;
595
596 if (gCrashInPreviousExec)
597 {
598 post_data.append(1, '&');
599 tmp_url_buf = encode_string("EF", "Y");
600 post_data += tmp_url_buf;
601 }
602
603 update_messages();
604 show_progress("Encoding data");
605 update_messages();
606 if (db_filep)
607 {
608 post_data.append(1, '&');
609 tmp_url_buf = db_filep->encodeURL();
610 post_data += tmp_url_buf;
611 llinfos << "Sending DB log file" << llendl;
612 }
613 else
614 {
615 llinfos << "Not sending DB log file" << llendl;
616 }
617 show_progress("Encoding data.");
618 update_messages();
619
620 if (sl_filep)
621 {
622 post_data.append(1, '&');
623 tmp_url_buf = sl_filep->encodeURL(SL_MAX_SIZE);
624 post_data += tmp_url_buf;
625 llinfos << "Sending SL log file" << llendl;
626 }
627 else
628 {
629 llinfos << "Not sending SL log file" << llendl;
630 }
631 show_progress("Encoding data..");
632 update_messages();
633
634 if (st_filep)
635 {
636 post_data.append(1, '&');
637 tmp_url_buf = st_filep->encodeURL(SL_MAX_SIZE);
638 post_data += tmp_url_buf;
639 llinfos << "Sending stats log file" << llendl;
640 }
641 else
642 {
643 llinfos << "Not sending stats log file" << llendl;
644 }
645 show_progress("Encoding data...");
646 update_messages();
647
648 if (md_filep)
649 {
650 post_data.append(1, '&');
651 tmp_url_buf = md_filep->encodeURL();
652 post_data += tmp_url_buf;
653 llinfos << "Sending minidump log file" << llendl;
654 }
655 else
656 {
657 llinfos << "Not sending minidump log file" << llendl;
658 }
659 show_progress("Encoding data....");
660 update_messages();
661
662 if (si_filep)
663 {
664 post_data.append(1, '&');
665 tmp_url_buf = si_filep->encodeURL();
666 post_data += tmp_url_buf;
667 llinfos << "Sending settings log file" << llendl;
668 }
669 else
670 {
671 llinfos << "Not sending settings.ini file" << llendl;
672 }
673 show_progress("Encoding data....");
674 update_messages();
675
676 if (ml_filep)
677 {
678 post_data.append(1, '&');
679 tmp_url_buf = ml_filep->encodeURL(SL_MAX_SIZE);
680 post_data += tmp_url_buf;
681 llinfos << "Sending message log file" << llendl;
682 }
683 else
684 {
685 llinfos << "Not sending message.log file" << llendl;
686 }
687 show_progress("Encoding data....");
688 update_messages();
689
690 if (gUserText.size())
691 {
692 post_data.append(1, '&');
693 tmp_url_buf = encode_string("UN", gUserText);
694 post_data += tmp_url_buf;
695 }
696
697 delete db_filep;
698 db_filep = NULL;
699 delete sl_filep;
700 sl_filep = NULL;
701 delete md_filep;
702 md_filep = NULL;
703
704 // Post data to web server
705 const S32 BUFSIZE = 65536;
706 HINTERNET hinet, hsession, hrequest;
707 char data[BUFSIZE]; /* Flawfinder: ignore */
708 unsigned long bytes_read;
709
710 llinfos << "Connecting to crash report server" << llendl;
711 update_messages();
712 show_progress("Connecting to server...");
713 update_messages();
714
715 // Init wininet subsystem
716 hinet = InternetOpen(L"LindenCrashReporter", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
717 if (hinet == NULL)
718 {
719 llinfos << "Couldn't open connection" << llendl;
720 sleep_and_pump_messages( 5 );
721// return FALSE;
722 }
723
724 hsession = InternetConnect(hinet,
725 L"secondlife.com",
726 INTERNET_DEFAULT_HTTP_PORT,
727 NULL,
728 NULL,
729 INTERNET_SERVICE_HTTP,
730 NULL,
731 NULL);
732
733 if (!hsession)
734 {
735 llinfos << "Couldn't talk to crash report server" << llendl;
736 }
737
738 hrequest = HttpOpenRequest(hsession, L"POST", L"/cgi-bin/viewer_crash_reporter2", NULL, L"", NULL, 0, 0);
739 if (!hrequest)
740 {
741 llinfos << "Couldn't open crash report URL!" << llendl;
742 } 101 }
743 102
744 llinfos << "Transmitting data" << llendl; 103 app.setHandle(hInstance);
745 llinfos << "Bytes: " << (post_data.size()) << llendl; 104 ok = app.init();
746 105 if(!ok)
747 update_messages();
748 show_progress("Transmitting data...");
749 update_messages();
750
751 BOOL ok = HttpSendRequest(hrequest, NULL, 0, (void *)(post_data.c_str()), post_data.size());
752 if (!ok)
753 {
754 llinfos << "Error posting data!" << llendl;
755 sleep_and_pump_messages( 5 );
756 }
757
758 llinfos << "Response from crash report server:" << llendl;
759 do
760 {
761 if (InternetReadFile(hrequest, data, BUFSIZE, &bytes_read))
762 {
763 if (bytes_read == 0)
764 {
765 // If InternetFileRead returns TRUE AND bytes_read == 0
766 // we've successfully downloaded the entire file
767 break;
768 }
769 else
770 {
771 data[bytes_read] = 0;
772 llinfos << data << llendl;
773 }
774 }
775 else
776 {
777 llinfos << "Couldn't read file!" << llendl;
778 sleep_and_pump_messages( 5 );
779// return FALSE;
780 }
781 } while(TRUE);
782
783 InternetCloseHandle(hrequest);
784 InternetCloseHandle(hsession);
785 InternetCloseHandle(hinet);
786 update_messages();
787 show_progress("Done.");
788 sleep_and_pump_messages( 3 );
789// return TRUE;
790}
791
792LLFileEncoder::LLFileEncoder(const char *form_name, const char *filename)
793{
794 mFormname = form_name;
795 mFilename = filename;
796 mIsValid = FALSE;
797 mBuf = NULL;
798
799 int res;
800
801 llstat stat_data;
802 res = LLFile::stat(mFilename.c_str(), &stat_data);
803 if (res)
804 {
805 llwarns << "File " << mFilename << " is missing!" << llendl;
806 return;
807 }
808
809 FILE *fp = NULL;
810 S32 buf_size = 0;
811 S32 count = 0;
812 while (count < 5)
813 {
814 buf_size = stat_data.st_size;
815 fp = LLFile::fopen(mFilename.c_str(), "rb"); /* Flawfinder: ignore */
816 if (!fp)
817 {
818 llwarns << "Can't open file " << mFilename << ", wait for a second" << llendl;
819 // Couldn't open the file, wait a bit and try again
820 count++;
821 ms_sleep(1000);
822 }
823 else
824 {
825 break;
826 }
827 }
828 if (!fp)
829 {
830 return;
831 }
832 U8 *buf = new U8[buf_size + 1];
833 fread(buf, 1, buf_size, fp);
834 fclose(fp);
835
836 mBuf = buf;
837 mBufLength = buf_size;
838
839 mIsValid = TRUE;
840}
841
842LLFileEncoder::~LLFileEncoder()
843{
844 if (mBuf)
845 {
846 delete mBuf;
847 mBuf = NULL;
848 }
849}
850
851LLString LLFileEncoder::encodeURL(const S32 max_length)
852{
853 LLString result = mFormname;
854 result.append(1, '=');
855
856 S32 i = 0;
857
858 if (max_length)
859 {
860 if (mBufLength > max_length)
861 {
862 i = mBufLength - max_length;
863 }
864 }
865
866 S32 url_buf_size = 3*mBufLength + 1;
867 char *url_buf = new char[url_buf_size];
868
869 S32 cur_pos = 0;
870 for (; i < mBufLength; i++)
871 { 106 {
872 S32 byte_val = mBuf[i]; 107 llwarns << "Unable to initialize application." << llendl;
873 sprintf(url_buf + cur_pos, "%%%02x", byte_val); 108 return -1;
874 cur_pos += 3;
875 } 109 }
876 url_buf[i*3] = 0;
877 110
878 result.append(url_buf); 111 // Run the application main loop
879 delete[] url_buf; 112 if(!LLApp::isQuitting()) app.mainLoop();
880 return result;
881}
882
883LLString encode_string(const char *formname, const LLString &str)
884{
885 LLString result = formname;
886 result.append(1, '=');
887 // Not using LLString because of bad performance issues
888 S32 buf_size = str.size();
889 S32 url_buf_size = 3*str.size() + 1;
890 char *url_buf = new char[url_buf_size];
891 113
892 S32 cur_pos = 0; 114 if (!app.isError())
893 S32 i;
894 for (i = 0; i < buf_size; i++)
895 { 115 {
896 sprintf(url_buf + cur_pos, "%%%02x", str[i]); 116 //
897 cur_pos += 3; 117 // We don't want to do cleanup here if the error handler got called -
118 // the assumption is that the error handler is responsible for doing
119 // app cleanup if there was a problem.
120 //
121 app.cleanup();
898 } 122 }
899 url_buf[i*3] = 0; 123 return 0;
900
901 result.append(url_buf);
902 delete[] url_buf;
903 return result;
904}
905
906void write_debug(const char *str)
907{
908 if (!gDebugFile)
909 {
910 std::string debug_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"debug_info.log");
911 llinfos << "Opening debug file " << debug_filename << llendl;
912 gDebugFile = LLFile::fopen(debug_filename.c_str(), "a+"); /* Flawfinder: ignore */
913 if (!gDebugFile)
914 {
915 fprintf(stderr, "Couldn't open %s: debug log to stderr instead.\n", debug_filename.c_str());
916 gDebugFile = stderr;
917 }
918 }
919 fprintf(gDebugFile, str); /* Flawfinder: ignore */
920 fflush(gDebugFile);
921}
922
923void write_debug(std::string& str)
924{
925 write_debug(str.c_str());
926}
927
928S32 load_crash_behavior_setting()
929{
930 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
931
932 gCrashSettings.loadFromFile(filename);
933
934 S32 value = gCrashSettings.getS32(CRASH_BEHAVIOR_SETTING);
935
936 if (value < CRASH_BEHAVIOR_ASK || CRASH_BEHAVIOR_NEVER_SEND < value) return CRASH_BEHAVIOR_ASK;
937
938 return value;
939}
940
941bool save_crash_behavior_setting(S32 crash_behavior)
942{
943 if (crash_behavior < CRASH_BEHAVIOR_ASK) return false;
944 if (crash_behavior > CRASH_BEHAVIOR_NEVER_SEND) return false;
945
946 gCrashSettings.setS32(CRASH_BEHAVIOR_SETTING, crash_behavior);
947 std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
948
949 gCrashSettings.saveToFile(filename, FALSE);
950
951 return true;
952} 124}
diff --git a/linden/indra/win_crash_logger/win_crash_logger.rc b/linden/indra/win_crash_logger/win_crash_logger.rc
index 2c46859..2819722 100644
--- a/linden/indra/win_crash_logger/win_crash_logger.rc
+++ b/linden/indra/win_crash_logger/win_crash_logger.rc
@@ -56,13 +56,13 @@ END
56// Dialog 56// Dialog
57// 57//
58 58
59IDD_PROGRESS DIALOG 100, 100, 186, 33 59IDD_PROGRESS DIALOGEX 100, 100, 234, 33
60STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU 60STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU
61CAPTION "%s Crash Logger" 61CAPTION "%s Crash Logger"
62CLASS "WIN_CRASH_LOGGER" 62CLASS "WIN_CRASH_LOGGER"
63FONT 8, "MS Sans Serif" 63FONT 8, "MS Sans Serif", 0, 0, 0x0
64BEGIN 64BEGIN
65 LTEXT "Static",IDC_LOG,7,7,172,8 65 LTEXT "Static",IDC_LOG,7,7,220,8
66END 66END
67 67
68IDD_REPORT DIALOGEX 100, 100, 297, 125 68IDD_REPORT DIALOGEX 100, 100, 297, 125
@@ -73,48 +73,33 @@ FONT 8, "MS Sans Serif", 0, 0, 0x0
73BEGIN 73BEGIN
74 DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP 74 DEFPUSHBUTTON "Send",IDOK,198,104,45,15,WS_GROUP
75 PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP 75 PUSHBUTTON "Don't Send",IDCANCEL,247,104,45,15,WS_GROUP
76 LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288, 76 LTEXT "%s appears to have crashed.",IDC_STATIC_HEADER,4,4,288,14
77 14 77 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
78 LTEXT "This crash reporter collects information about your computer's hardware, operating system, and some %s logs, which are used for debugging purposes only.", 78 CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13
79 IDC_STATIC_WHATINFO,4,23,288,19,NOT WS_GROUP 79 LTEXT "Sending crash reports is the best way to help us improve the quality of %s.",IDC_STATIC_MOTIVATION,4,43,288,8
80 CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button", 80 LTEXT "If you continue to experience this problem, please try:",IDC_STATIC,4,57,251,8
81 BS_AUTOCHECKBOX | WS_TABSTOP,4,106,89,13 81 LTEXT "- Contacting support by visiting http://www.secondlife.com/support",IDC_STATIC,4,67,231,8
82 LTEXT "Sending crash reports is the best way to help us improve the quality of %s.",
83 IDC_STATIC_MOTIVATION,4,38,288,8
84 LTEXT "If you continue to experience this problem, please try:",
85 IDC_STATIC,4,57,251,8
86 LTEXT "- Contacting support by visiting http://www.secondlife.com/support",
87 IDC_STATIC,4,67,231,8
88END 82END
89 83
90IDD_PREVREPORTBOX DIALOG 100, 100, 232, 213 84IDD_PREVREPORTBOX DIALOGEX 100, 100, 232, 213
91STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU 85STYLE DS_SETFONT | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU
92CAPTION "%s Crash Logger" 86CAPTION "%s Crash Logger"
93CLASS "WIN_CRASH_LOGGER" 87CLASS "WIN_CRASH_LOGGER"
94FONT 8, "MS Sans Serif" 88FONT 8, "MS Sans Serif", 0, 0, 0x0
95BEGIN 89BEGIN
96 DEFPUSHBUTTON "OK",IDOK,131,193,45,15,WS_GROUP 90 DEFPUSHBUTTON "Send Report",IDOK,131,193,45,15,WS_GROUP
97 EDITTEXT IDC_EDIT1,4,102,223,89,ES_MULTILINE | ES_WANTRETURN | 91 EDITTEXT IDC_EDIT1,3,100,223,89,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL
98 WS_VSCROLL 92 PUSHBUTTON "Don't Send",IDCANCEL,181,193,45,15,WS_GROUP
99 PUSHBUTTON "Cancel",IDCANCEL,181,193,45,15,WS_GROUP 93 LTEXT "%s appears to have crashed or frozen the last time it ran.",IDC_STATIC_HEADER,4,4,214,8
100 LTEXT "%s appears to have crashed or frozen the last time it ran.", 94 LTEXT "This crash reporter collects information about your computer's",IDC_STATIC,4,17,201,8
101 IDC_STATIC,4,4,214,8 95 LTEXT "hardware configuration, operating system, and some %s",IDC_STATIC_MSG,4,25,212,8
102 LTEXT "This crash reporter collects information about your computer's", 96 LTEXT "logs, all of which are used for debugging purposes only.",IDC_STATIC,4,33,210,8
103 IDC_STATIC,4,17,201,8 97 LTEXT "In the space below, please briefly describe what you were doing",IDC_STATIC,3,48,208,8
104 LTEXT "hardware configuration, operating system, and some %s", 98 LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3,56,204,8
105 IDC_STATIC,4,25,212,8 99 LTEXT "If you don't wish to send Linden Lab a crash report, press Don't Send.",IDC_STATIC,3,90,223,8
106 LTEXT "logs, all of which are used for debugging purposes only.", 100 LTEXT "This report is NOT read by customer support. If you have billing or",IDC_STATIC,3,68,208,8
107 IDC_STATIC,4,33,210,8 101 LTEXT "other questions, please go to: www.secondlife.com/support",IDC_STATIC,3,76,206,8
108 LTEXT "In the space below, please briefly describe what you were doing", 102 CONTROL "Remember this choice",IDC_CHECK_AUTO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,3,193,89,13
109 IDC_STATIC,3,48,208,8
110 LTEXT "or trying to do just prior to the crash.",IDC_STATIC,3,
111 56,204,8
112 LTEXT "If you don't wish to send Linden Lab a crash report, press Cancel.",
113 IDC_STATIC,3,90,214,8
114 LTEXT "This report is NOT read by customer support. If you have billing or",
115 IDC_STATIC,3,68,208,8
116 LTEXT "other questions, please go to: www.secondlife.com/support",
117 IDC_STATIC,3,76,206,8
118END 103END
119 104
120 105
@@ -158,7 +143,7 @@ BEGIN
158 IDD_PROGRESS, DIALOG 143 IDD_PROGRESS, DIALOG
159 BEGIN 144 BEGIN
160 LEFTMARGIN, 7 145 LEFTMARGIN, 7
161 RIGHTMARGIN, 179 146 RIGHTMARGIN, 227
162 TOPMARGIN, 7 147 TOPMARGIN, 7
163 BOTTOMMARGIN, 26 148 BOTTOMMARGIN, 26
164 END 149 END
diff --git a/linden/indra/win_crash_logger/win_crash_logger.vcproj b/linden/indra/win_crash_logger/win_crash_logger.vcproj
index f250427..f077b05 100644
--- a/linden/indra/win_crash_logger/win_crash_logger.vcproj
+++ b/linden/indra/win_crash_logger/win_crash_logger.vcproj
@@ -72,7 +72,7 @@
72 CharacterSet="1"> 72 CharacterSet="1">
73 <Tool 73 <Tool
74 Name="VCCLCompilerTool" 74 Name="VCCLCompilerTool"
75 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 75 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;;..\llcrashlogger"
76 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" 76 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE"
77 RuntimeLibrary="0" 77 RuntimeLibrary="0"
78 StructMemberAlignment="0" 78 StructMemberAlignment="0"
@@ -85,7 +85,7 @@
85 Name="VCCustomBuildTool"/> 85 Name="VCCustomBuildTool"/>
86 <Tool 86 <Tool
87 Name="VCLinkerTool" 87 Name="VCLinkerTool"
88 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" 88 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib shell32.lib user32.lib wininet.lib winspool.lib libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib psapi.lib"
89 OutputFile="win_crash_logger.exe" 89 OutputFile="win_crash_logger.exe"
90 LinkIncremental="1" 90 LinkIncremental="1"
91 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" 91 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release"
@@ -123,7 +123,7 @@
123 CharacterSet="1"> 123 CharacterSet="1">
124 <Tool 124 <Tool
125 Name="VCCLCompilerTool" 125 Name="VCCLCompilerTool"
126 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 126 AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;"
127 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE" 127 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;LL_RELEASE"
128 RuntimeLibrary="0" 128 RuntimeLibrary="0"
129 StructMemberAlignment="0" 129 StructMemberAlignment="0"
@@ -136,10 +136,10 @@
136 Name="VCCustomBuildTool"/> 136 Name="VCCustomBuildTool"/>
137 <Tool 137 <Tool
138 Name="VCLinkerTool" 138 Name="VCLinkerTool"
139 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" 139 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib netapi32.lib ole32.lib oleaut32.lib shell32.lib user32.lib wininet.lib winspool.lib libcurl.lib ssleay32.lib libeay32.lib zlib.lib winmm.lib psapi.lib"
140 OutputFile="win_crash_logger.exe" 140 OutputFile="win_crash_logger.exe"
141 LinkIncremental="1" 141 LinkIncremental="1"
142 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" 142 AdditionalLibraryDirectories="&quot;../lib_releasenoopt/i686-win32&quot;;&quot;../../libraries/i686-win32/lib_release&quot;"
143 GenerateDebugInformation="TRUE" 143 GenerateDebugInformation="TRUE"
144 SubSystem="2" 144 SubSystem="2"
145 OptimizeReferences="2" 145 OptimizeReferences="2"
@@ -175,6 +175,12 @@
175 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx" 175 Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
176 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"> 176 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
177 <File 177 <File
178 RelativePath="..\llcrashlogger\llcrashlogger.cpp">
179 </File>
180 <File
181 RelativePath=".\llcrashloggerwindows.cpp">
182 </File>
183 <File
178 RelativePath=".\StdAfx.cpp"> 184 RelativePath=".\StdAfx.cpp">
179 </File> 185 </File>
180 <File 186 <File
@@ -186,6 +192,12 @@
186 Filter="h;hpp;hxx;hm;inl;inc;xsd" 192 Filter="h;hpp;hxx;hm;inl;inc;xsd"
187 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"> 193 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
188 <File 194 <File
195 RelativePath="..\llcrashlogger\llcrashlogger.h">
196 </File>
197 <File
198 RelativePath=".\llcrashloggerwindows.h">
199 </File>
200 <File
189 RelativePath=".\resource.h"> 201 RelativePath=".\resource.h">
190 </File> 202 </File>
191 <File 203 <File
diff --git a/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj b/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj
index da8ce22..66ec157 100644
--- a/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj
+++ b/linden/indra/win_crash_logger/win_crash_logger_vc8.vcproj
@@ -41,7 +41,7 @@
41 <Tool 41 <Tool
42 Name="VCCLCompilerTool" 42 Name="VCCLCompilerTool"
43 Optimization="0" 43 Optimization="0"
44 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 44 AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;"
45 PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG" 45 PreprocessorDefinitions="WIN32;_DEBUG;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_DEBUG"
46 MinimalRebuild="true" 46 MinimalRebuild="true"
47 BasicRuntimeChecks="3" 47 BasicRuntimeChecks="3"
@@ -65,7 +65,7 @@
65 /> 65 />
66 <Tool 66 <Tool
67 Name="VCLinkerTool" 67 Name="VCLinkerTool"
68 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" 68 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib"
69 OutputFile="win_crash_logger.exe" 69 OutputFile="win_crash_logger.exe"
70 LinkIncremental="1" 70 LinkIncremental="1"
71 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_debug" 71 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_debug"
@@ -124,7 +124,7 @@
124 /> 124 />
125 <Tool 125 <Tool
126 Name="VCCLCompilerTool" 126 Name="VCCLCompilerTool"
127 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 127 AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;"
128 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" 128 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE"
129 RuntimeLibrary="0" 129 RuntimeLibrary="0"
130 StructMemberAlignment="0" 130 StructMemberAlignment="0"
@@ -146,7 +146,7 @@
146 /> 146 />
147 <Tool 147 <Tool
148 Name="VCLinkerTool" 148 Name="VCLinkerTool"
149 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" 149 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib"
150 OutputFile="win_crash_logger.exe" 150 OutputFile="win_crash_logger.exe"
151 LinkIncremental="1" 151 LinkIncremental="1"
152 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" 152 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release"
@@ -206,7 +206,8 @@
206 /> 206 />
207 <Tool 207 <Tool
208 Name="VCCLCompilerTool" 208 Name="VCCLCompilerTool"
209 AdditionalIncludeDirectories="..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;" 209 Optimization="0"
210 AdditionalIncludeDirectories="..\llcrashlogger;..\llcommon;..\llmath;..\llvfs;..\llaudio;..\llmedia;..\llimage;..\llscene;..\llxml;..\llmessage;..\llprimitive;..\llrender;..\llwindow;..\llcharacter;..\llinventory;..\llui;..\lscript;&quot;..\..\libraries\i686-win32\include&quot;;..\..\libraries\include\;&quot;..\..\libraries\i686-win32\include\quicktime&quot;"
210 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE" 211 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;LL_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_USE_32BIT_TIME_T;LL_RELEASE"
211 RuntimeLibrary="0" 212 RuntimeLibrary="0"
212 StructMemberAlignment="0" 213 StructMemberAlignment="0"
@@ -228,7 +229,7 @@
228 /> 229 />
229 <Tool 230 <Tool
230 Name="VCLinkerTool" 231 Name="VCLinkerTool"
231 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib" 232 AdditionalDependencies="apr-1.lib aprutil-1.lib ws2_32.lib advapi32.lib comdlg32.lib dxguid.lib gdi32.lib kernel32.lib libexpatMT.lib llcommon.lib llmath.lib llwindow.lib llvfs.lib llmessage.lib llxml.lib netapi32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib user32.lib wininet.lib winspool.lib winmm.lib ssleay32.lib zlib.lib libcurl.lib libeay32.lib oldnames.lib"
232 OutputFile="win_crash_logger.exe" 233 OutputFile="win_crash_logger.exe"
233 LinkIncremental="1" 234 LinkIncremental="1"
234 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release" 235 AdditionalLibraryDirectories="../lib_$(ConfigurationName)/i686-win32;../../libraries/i686-win32/lib_release"
@@ -273,6 +274,14 @@
273 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" 274 UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
274 > 275 >
275 <File 276 <File
277 RelativePath="..\llcrashlogger\llcrashlogger.cpp"
278 >
279 </File>
280 <File
281 RelativePath=".\llcrashloggerwindows.cpp"
282 >
283 </File>
284 <File
276 RelativePath=".\StdAfx.cpp" 285 RelativePath=".\StdAfx.cpp"
277 > 286 >
278 </File> 287 </File>
@@ -287,6 +296,14 @@
287 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" 296 UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
288 > 297 >
289 <File 298 <File
299 RelativePath="..\llcrashlogger\llcrashlogger.h"
300 >
301 </File>
302 <File
303 RelativePath=".\llcrashloggerwindows.h"
304 >
305 </File>
306 <File
290 RelativePath=".\resource.h" 307 RelativePath=".\resource.h"
291 > 308 >
292 </File> 309 </File>
diff --git a/linden/scripts/messages/message_template.msg b/linden/scripts/messages/message_template.msg
index 7aabb78..938a30a 100644
--- a/linden/scripts/messages/message_template.msg
+++ b/linden/scripts/messages/message_template.msg
@@ -3038,7 +3038,7 @@ version 2.0
3038// and where someone you are tracking is located. They are -1 if not 3038// and where someone you are tracking is located. They are -1 if not
3039// applicable. 3039// applicable.
3040{ 3040{
3041 CoarseLocationUpdate Medium 6 Trusted Unencoded UDPDeprecated 3041 CoarseLocationUpdate Medium 6 Trusted Unencoded
3042 { 3042 {
3043 Location Variable 3043 Location Variable
3044 { X U8 } 3044 { X U8 }
@@ -3050,6 +3050,10 @@ version 2.0
3050 { You S16 } 3050 { You S16 }
3051 { Prey S16 } 3051 { Prey S16 }
3052 } 3052 }
3053 {
3054 AgentData Variable
3055 { AgentID LLUUID }
3056 }
3053} 3057}
3054 3058
3055// ImageData - sent to viewer to transmit information about an image 3059// ImageData - sent to viewer to transmit information about an image
@@ -4349,6 +4353,10 @@ version 2.0
4349 { RegionDenyIdentified BOOL } 4353 { RegionDenyIdentified BOOL }
4350 { RegionDenyTransacted BOOL } 4354 { RegionDenyTransacted BOOL }
4351 } 4355 }
4356 {
4357 AgeVerificationBlock Single
4358 { RegionDenyAgeUnverified BOOL }
4359 }
4352} 4360}
4353 4361
4354// ParcelPropertiesUpdate 4362// ParcelPropertiesUpdate
@@ -5271,7 +5279,7 @@ version 2.0
5271 5279
5272// ScriptRunningReply - response from simulator to message above 5280// ScriptRunningReply - response from simulator to message above
5273{ 5281{
5274 ScriptRunningReply Low 244 NotTrusted Unencoded 5282 ScriptRunningReply Low 244 NotTrusted Unencoded UDPDeprecated
5275 { 5283 {
5276 Script Single 5284 Script Single
5277 { ObjectID LLUUID } 5285 { ObjectID LLUUID }